pax_global_header00006660000000000000000000000064146566647310014534gustar00rootroot0000000000000052 comment=db1b7af6cc2d3533719989ba9a9b569592e4de13 mitogen-0.3.9/000077500000000000000000000000001465666473100132075ustar00rootroot00000000000000mitogen-0.3.9/.ci/000077500000000000000000000000001465666473100136605ustar00rootroot00000000000000mitogen-0.3.9/.ci/README.md000066400000000000000000000033411465666473100151400ustar00rootroot00000000000000 # `.ci` This directory contains scripts for Continuous Integration platforms. Currently Azure Pipelines, but they will also happily run on any Debian-like machine. The scripts are usually split into `_install` and `_test` steps. The `_install` step will damage your machine, the `_test` step will just run the tests the way CI runs them. There is a common library, `ci_lib.py`, which just centralized a bunch of random macros and also environment parsing. Some of the scripts allow you to pass extra flags through to the component under test, e.g. `../../.ci/ansible_tests.py -vvv` will run with verbose. Hack these scripts until your heart is content. There is no pride to be found here, just necessity. ### `ci_lib.run_batches()` There are some weird looking functions to extract more paralellism from the build. The above function takes lists of strings, arranging for the strings in each list to run in order, but for the lists to run in parallel. That's great for doing `setup.py install` while pulling a Docker container, for example. ### Environment Variables * `TARGET_COUNT`: number of targets for `debops_` run. Defaults to 2. * `DISTRO`: the `mitogen_` tests need a target Docker container distro. This name comes from the Docker Hub `mitogen` user, i.e. `mitogen/$DISTRO-test` * `DISTROS`: the `ansible_` tests can run against multiple targets simultaneously, which speeds things up. This is a space-separated list of DISTRO names, but additionally, supports: * `debian-py3`: when generating Ansible inventory file, set `ansible_python_interpreter` to `python3`, i.e. run a test where the target interpreter is Python 3. * `debian*16`: generate 16 Docker containers running Debian. Also works with -py3. mitogen-0.3.9/.ci/ansible_install.py000077500000000000000000000003671465666473100174060ustar00rootroot00000000000000#!/usr/bin/env python import ci_lib batches = [ [ 'if [ "${TF_BUILD:-false}" = "True" ]; then aws ecr-public get-login-password | docker login --username AWS --password-stdin public.ecr.aws; fi', ] ] ci_lib.run_batches(batches) mitogen-0.3.9/.ci/ansible_tests.py000077500000000000000000000055331465666473100171020ustar00rootroot00000000000000#!/usr/bin/env python # Run tests/ansible/all.yml under Ansible and Ansible-Mitogen import collections import glob import os import signal import sys import textwrap import ci_lib TESTS_DIR = os.path.join(ci_lib.GIT_ROOT, 'tests/ansible') HOSTS_DIR = os.path.join(ci_lib.TMP, 'hosts') def pause_if_interactive(): if os.path.exists('/tmp/interactive'): while True: signal.pause() interesting = ci_lib.get_interesting_procs() with ci_lib.Fold('unit_tests'): os.environ['SKIP_MITOGEN'] = '1' ci_lib.run('./run_tests -v') ci_lib.check_stray_processes(interesting) with ci_lib.Fold('docker_setup'): containers = ci_lib.make_containers() ci_lib.start_containers(containers) with ci_lib.Fold('job_setup'): os.chdir(TESTS_DIR) os.chmod('../data/docker/mitogen__has_sudo_pubkey.key', int('0600', 7)) ci_lib.run("mkdir %s", HOSTS_DIR) for path in glob.glob(TESTS_DIR + '/hosts/*'): if not path.endswith('default.hosts'): ci_lib.run("ln -s %s %s", path, HOSTS_DIR) distros = collections.defaultdict(list) families = collections.defaultdict(list) for container in containers: distros[container['distro']].append(container['name']) families[container['family']].append(container['name']) inventory_path = os.path.join(HOSTS_DIR, 'target') with open(inventory_path, 'w') as fp: fp.write('[test-targets]\n') fp.writelines( "%(name)s " "ansible_host=%(hostname)s " "ansible_port=%(port)s " "ansible_python_interpreter=%(python_path)s " "ansible_user=mitogen__has_sudo_nopw " "ansible_password=has_sudo_nopw_password" "\n" % container for container in containers ) for distro, hostnames in sorted(distros.items(), key=lambda t: t[0]): fp.write('\n[%s]\n' % distro) fp.writelines('%s\n' % name for name in hostnames) for family, hostnames in sorted(families.items(), key=lambda t: t[0]): fp.write('\n[%s]\n' % family) fp.writelines('%s\n' % name for name in hostnames) fp.write(textwrap.dedent( ''' [linux:children] test-targets [linux_containers:children] test-targets ''' )) ci_lib.dump_file(inventory_path) if not ci_lib.exists_in_path('sshpass'): ci_lib.run("sudo apt-get update") ci_lib.run("sudo apt-get install -y sshpass") with ci_lib.Fold('ansible'): playbook = os.environ.get('PLAYBOOK', 'all.yml') try: ci_lib.run('./run_ansible_playbook.py %s -i "%s" %s', playbook, HOSTS_DIR, ' '.join(sys.argv[1:])) except: pause_if_interactive() raise ci_lib.check_stray_processes(interesting, containers) pause_if_interactive() mitogen-0.3.9/.ci/azure-pipelines-steps.yml000066400000000000000000000071261465666473100206610ustar00rootroot00000000000000# Each step entry runs a task (Azure Pipelines analog of an Ansible module). # https://learn.microsoft.com/en-us/azure/devops/pipelines/tasks/reference/?view=azure-pipelines&viewFallbackFrom=azure-devops#tool # `{script: ...}` is shorthand for `{task: CmdLine@, inputs: {script: ...}}`. # The shell is bash. # https://learn.microsoft.com/en-us/azure/devops/pipelines/yaml-schema/steps-script?view=azure-pipelines # https://learn.microsoft.com/en-us/azure/devops/pipelines/tasks/reference/cmd-line-v2?view=azure-pipelines steps: - task: UsePythonVersion@0 displayName: Install python inputs: githubToken: '$(GITHUB_PYVER_TOKEN)' versionSpec: '$(python.version)' condition: ne(variables['python.version'], '') - script: | set -o errexit set -o nounset set -o pipefail sudo apt-get update sudo apt-get install -y python2-dev python3-pip virtualenv displayName: Install build deps condition: and(eq(variables['python.version'], ''), eq(variables['Agent.OS'], 'Linux')) - script: | set -o errexit set -o nounset set -o pipefail # macOS builders lack a realpath command type python && python -c"import os.path;print(os.path.realpath('$(type -p python)'))" && python --version type python2 && python2 -c"import os.path;print(os.path.realpath('$(type -p python2)'))" && python2 --version type python3 && python3 -c"import os.path;print(os.path.realpath('$(type -p python3)'))" && python3 --version echo if [ -e /usr/bin/python ]; then echo "/usr/bin/python: sys.executable: $(/usr/bin/python -c 'import sys; print(sys.executable)')" fi if [ -e /usr/bin/python2 ]; then echo "/usr/bin/python2: sys.executable: $(/usr/bin/python2 -c 'import sys; print(sys.executable)')" fi if [ -e /usr/bin/python2.7 ]; then echo "/usr/bin/python2.7: sys.executable: $(/usr/bin/python2.7 -c 'import sys; print(sys.executable)')" fi displayName: Show python versions - script: | set -o errexit set -o nounset set -o pipefail # Tox environment name (e.g. py312-mode_mitogen) -> Python executable name (e.g. python3.12) PYTHON=$(python -c 'import re; print(re.sub(r"^py([23])([0-9]{1,2}).*", r"python\1.\2", "$(tox.env)"))') if [[ -z $PYTHON ]]; then echo 1>&2 "Python interpreter could not be determined" exit 1 fi if [[ $PYTHON == "python2.7" && $(uname) == "Darwin" ]]; then "$PYTHON" -m ensurepip --user --altinstall --no-default-pip "$PYTHON" -m pip install --user -r "tests/requirements-tox.txt" elif [[ $PYTHON == "python2.7" ]]; then curl "https://bootstrap.pypa.io/pip/2.7/get-pip.py" --output "get-pip.py" "$PYTHON" get-pip.py --user --no-python-version-warning # Avoid Python 2.x pip masking system pip rm -f ~/.local/bin/{easy_install,pip,wheel} "$PYTHON" -m pip install --user -r "tests/requirements-tox.txt" else "$PYTHON" -m pip install -r "tests/requirements-tox.txt" fi displayName: Install tooling - script: | set -o errexit set -o nounset set -o pipefail # Tox environment name (e.g. py312-mode_mitogen) -> Python executable name (e.g. python3.12) PYTHON=$(python -c 'import re; print(re.sub(r"^py([23])([0-9]{1,2}).*", r"python\1.\2", "$(tox.env)"))') if [[ -z $PYTHON ]]; then echo 1>&2 "Python interpreter could not be determined" exit 1 fi "$PYTHON" -m tox -e "$(tox.env)" displayName: "Run tests" env: AWS_ACCESS_KEY_ID: $(AWS_ACCESS_KEY_ID) AWS_SECRET_ACCESS_KEY: $(AWS_SECRET_ACCESS_KEY) AWS_DEFAULT_REGION: $(AWS_DEFAULT_REGION) mitogen-0.3.9/.ci/azure-pipelines.yml000066400000000000000000000120221465666473100175140ustar00rootroot00000000000000# Python package # Create and test a Python package on multiple Python versions. # Add steps that analyze code, save the dist with the build record, publish to a PyPI-compatible index, and more: # https://docs.microsoft.com/azure/devops/pipelines/languages/python # User defined variables are also injected as environment variables # https://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables#environment-variables #variables: #ANSIBLE_VERBOSITY: 3 trigger: branches: include: - "*" exclude: - docs-master jobs: - job: mac12 # vanilla Ansible is really slow timeoutInMinutes: 120 steps: - template: azure-pipelines-steps.yml pool: # https://github.com/actions/runner-images/blob/main/images/macos/macos-12-Readme.md vmImage: macOS-12 strategy: matrix: Mito_312: tox.env: py312-mode_mitogen Loc_312_9: tox.env: py312-mode_localhost-ansible9 Van_312_9: tox.env: py312-mode_localhost-ansible9-strategy_linear Loc_312_10: tox.env: py312-mode_localhost-ansible10 Van_312_10: tox.env: py312-mode_localhost-ansible10-strategy_linear - job: Linux pool: # https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2004-Readme.md vmImage: ubuntu-20.04 steps: - template: azure-pipelines-steps.yml strategy: matrix: Mito_27_centos6: tox.env: py27-mode_mitogen-distro_centos6 Mito_27_centos7: tox.env: py27-mode_mitogen-distro_centos7 Mito_27_centos8: tox.env: py27-mode_mitogen-distro_centos8 Mito_27_debian9: tox.env: py27-mode_mitogen-distro_debian9 Mito_27_debian10: tox.env: py27-mode_mitogen-distro_debian10 Mito_27_debian11: tox.env: py27-mode_mitogen-distro_debian11 Mito_27_ubuntu1604: tox.env: py27-mode_mitogen-distro_ubuntu1604 Mito_27_ubuntu1804: tox.env: py27-mode_mitogen-distro_ubuntu1804 Mito_27_ubuntu2004: tox.env: py27-mode_mitogen-distro_ubuntu2004 Mito_36_centos6: python.version: '3.6' tox.env: py36-mode_mitogen-distro_centos6 Mito_36_centos7: python.version: '3.6' tox.env: py36-mode_mitogen-distro_centos7 Mito_36_centos8: python.version: '3.6' tox.env: py36-mode_mitogen-distro_centos8 Mito_36_debian9: python.version: '3.6' tox.env: py36-mode_mitogen-distro_debian9 Mito_36_debian10: python.version: '3.6' tox.env: py36-mode_mitogen-distro_debian10 Mito_36_debian11: python.version: '3.6' tox.env: py36-mode_mitogen-distro_debian11 Mito_36_ubuntu1604: python.version: '3.6' tox.env: py36-mode_mitogen-distro_ubuntu1604 Mito_36_ubuntu1804: python.version: '3.6' tox.env: py36-mode_mitogen-distro_ubuntu1804 Mito_36_ubuntu2004: python.version: '3.6' tox.env: py36-mode_mitogen-distro_ubuntu2004 Mito_312_centos6: python.version: '3.12' tox.env: py312-mode_mitogen-distro_centos6 Mito_312_centos7: python.version: '3.12' tox.env: py312-mode_mitogen-distro_centos7 Mito_312_centos8: python.version: '3.12' tox.env: py312-mode_mitogen-distro_centos8 Mito_312_debian9: python.version: '3.12' tox.env: py312-mode_mitogen-distro_debian9 Mito_312_debian10: python.version: '3.12' tox.env: py312-mode_mitogen-distro_debian10 Mito_312_debian11: python.version: '3.12' tox.env: py312-mode_mitogen-distro_debian11 Mito_312_ubuntu1604: python.version: '3.12' tox.env: py312-mode_mitogen-distro_ubuntu1604 Mito_312_ubuntu1804: python.version: '3.12' tox.env: py312-mode_mitogen-distro_ubuntu1804 Mito_312_ubuntu2004: python.version: '3.12' tox.env: py312-mode_mitogen-distro_ubuntu2004 Ans_27_210: tox.env: py27-mode_ansible-ansible2.10 Ans_27_4: tox.env: py27-mode_ansible-ansible4 Ans_36_210: python.version: '3.6' tox.env: py36-mode_ansible-ansible2.10 Ans_36_4: python.version: '3.6' tox.env: py36-mode_ansible-ansible4 Ans_311_210: python.version: '3.11' tox.env: py311-mode_ansible-ansible2.10 Ans_311_3: python.version: '3.11' tox.env: py311-mode_ansible-ansible3 Ans_311_4: python.version: '3.11' tox.env: py311-mode_ansible-ansible4 Ans_311_5: python.version: '3.11' tox.env: py311-mode_ansible-ansible5 Ans_312_6: python.version: '3.12' tox.env: py312-mode_ansible-ansible6 Ans_312_7: python.version: '3.12' tox.env: py312-mode_ansible-ansible7 Ans_312_8: python.version: '3.12' tox.env: py312-mode_ansible-ansible8 Ans_312_9: python.version: '3.12' tox.env: py312-mode_ansible-ansible9 Ans_312_10: python.version: '3.12' tox.env: py312-mode_ansible-ansible10 mitogen-0.3.9/.ci/ci_lib.py000066400000000000000000000246221465666473100154610ustar00rootroot00000000000000from __future__ import absolute_import from __future__ import print_function import atexit import errno import os import re import shlex import shutil import sys import tempfile if sys.version_info < (3, 0): import subprocess32 as subprocess else: import subprocess try: import urlparse except ImportError: import urllib.parse as urlparse os.chdir( os.path.join( os.path.dirname(__file__), '..' ) ) _print = print def print(*args, **kwargs): file = kwargs.get('file', sys.stdout) flush = kwargs.pop('flush', False) _print(*args, **kwargs) if flush: file.flush() def _have_cmd(args): try: subprocess.run( args, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, ) except OSError as exc: if exc.errno == errno.ENOENT: return False raise except subprocess.CallProcessError: return False return True def have_apt(): return _have_cmd(['apt', '--help']) def have_brew(): return _have_cmd(['brew', 'help']) def have_docker(): return _have_cmd(['docker', 'info']) def _argv(s, *args): """Interpolate a command line using *args, return an argv style list. >>> _argv('git commit -m "Use frobnicate 2.0 (fixes #%d)"', 1234) ['git', commit', '-m', 'Use frobnicate 2.0 (fixes #1234)'] """ if args: s %= args return shlex.split(s) def run(s, *args, **kwargs): """ Run a command, with arguments >>> rc = run('echo "%s %s"', 'foo', 'bar') Running: ['echo', 'foo bar'] foo bar Finished running: ['echo', 'foo bar'] >>> rc 0 """ argv = _argv(s, *args) print('Running: %s' % (argv,), flush=True) try: ret = subprocess.check_call(argv, **kwargs) print('Finished running: %s' % (argv,), flush=True) except Exception: print('Exception occurred while running: %s' % (argv,), file=sys.stderr, flush=True) raise return ret def combine(batch): """ >>> combine(['ls -l', 'echo foo']) 'set -x; ( ls -l; ) && ( echo foo; )' """ return 'set -x; ' + (' && '.join( '( %s; )' % (cmd,) for cmd in batch )) def throttle(batch, pause=1): """ Add pauses between commands in a batch >>> throttle(['echo foo', 'echo bar', 'echo baz']) ['echo foo', 'sleep 1', 'echo bar', 'sleep 1', 'echo baz'] """ def _with_pause(batch, pause): for cmd in batch: yield cmd yield 'sleep %i' % (pause,) return list(_with_pause(batch, pause))[:-1] def run_batches(batches): """ Run shell commands grouped into batches, showing an execution trace. Raise AssertionError if any command has exits with a non-zero status. >>> run_batches([['echo foo', 'true']]) + echo foo foo + true >>> run_batches([['true', 'echo foo'], ['false']]) + true + echo foo foo + false Traceback (most recent call last): File "...", line ..., in File "...", line ..., in run_batches AssertionError """ procs = [ subprocess.Popen(combine(batch), shell=True) for batch in batches ] assert [proc.wait() for proc in procs] == [0] * len(procs) def get_output(s, *args, **kwargs): """ Print and run command line s, %-interopolated using *args. Return stdout. >>> s = get_output('echo "%s %s"', 'foo', 'bar') Running: ['echo', 'foo bar'] >>> s 'foo bar\n' """ argv = _argv(s, *args) print('Running: %s' % (argv,), flush=True) return subprocess.check_output(argv, **kwargs) def exists_in_path(progname): """ Return True if progname exists in $PATH. >>> exists_in_path('echo') True >>> exists_in_path('kwyjibo') # Only found in North American cartoons False """ return any(os.path.exists(os.path.join(dirname, progname)) for dirname in os.environ['PATH'].split(os.pathsep)) class TempDir(object): def __init__(self): self.path = tempfile.mkdtemp(prefix='mitogen_ci_lib') atexit.register(self.destroy) def destroy(self, rmtree=shutil.rmtree): rmtree(self.path) class Fold(object): def __init__(self, name): pass def __enter__(self): pass def __exit__(self, _1, _2, _3): pass GIT_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) # Used only when MODE=mitogen DISTRO = os.environ.get('DISTRO', 'debian9') # Used only when MODE=ansible DISTROS = os.environ.get('DISTROS', 'centos6 centos8 debian9 debian11 ubuntu1604 ubuntu2004').split() TARGET_COUNT = int(os.environ.get('TARGET_COUNT', '2')) BASE_PORT = 2200 TMP = TempDir().path # We copy this out of the way to avoid random stuff modifying perms in the Git # tree (like git pull). src_key_file = os.path.join(GIT_ROOT, 'tests/data/docker/mitogen__has_sudo_pubkey.key') key_file = os.path.join(TMP, 'mitogen__has_sudo_pubkey.key') shutil.copyfile(src_key_file, key_file) os.chmod(key_file, int('0600', 8)) os.environ['PYTHONDONTWRITEBYTECODE'] = 'x' os.environ['PYTHONPATH'] = '%s:%s' % ( os.environ.get('PYTHONPATH', ''), GIT_ROOT ) def get_docker_hostname(): """Return the hostname where the docker daemon is running. """ url = os.environ.get('DOCKER_HOST') if url in (None, 'http+docker://localunixsocket'): return 'localhost' parsed = urlparse.urlparse(url) return parsed.netloc.partition(':')[0] def make_containers(name_prefix='', port_offset=0): """ >>> import pprint >>> BASE_PORT=2200; DISTROS=['debian11', 'centos6'] >>> pprint.pprint(make_containers()) [{'distro': 'debian11', 'family': 'debian', 'hostname': 'localhost', 'image': 'public.ecr.aws/n5z0e8q9/debian11-test', 'name': 'target-debian11-1', 'port': 2201, 'python_path': '/usr/bin/python'}, {'distro': 'centos6', 'family': 'centos', 'hostname': 'localhost', 'image': 'public.ecr.aws/n5z0e8q9/centos6-test', 'name': 'target-centos6-2', 'port': 2202, 'python_path': '/usr/bin/python'}] """ docker_hostname = get_docker_hostname() distro_pattern = re.compile(r''' (?P(?P[a-z]+)[0-9]+) (?:-(?Ppy3))? (?:\*(?P[0-9]+))? ''', re.VERBOSE, ) i = 1 lst = [] for distro in DISTROS: d = distro_pattern.match(distro).groupdict(default=None) distro = d['distro'] family = d['family'] image = 'public.ecr.aws/n5z0e8q9/%s-test' % (distro,) if d['py'] == 'py3': python_path = '/usr/bin/python3' else: python_path = '/usr/bin/python' if d['count']: count = int(count) else: count = 1 for x in range(count): lst.append({ "distro": distro, "family": family, "image": image, "name": name_prefix + ("target-%s-%s" % (distro, i)), "hostname": docker_hostname, "port": BASE_PORT + i + port_offset, "python_path": python_path, }) i += 1 return lst # ssh removed from here because 'linear' strategy relies on processes that hang # around after the Ansible run completes INTERESTING_COMMS = ('python', 'sudo', 'su', 'doas') def proc_is_docker(pid): try: fp = open('/proc/%s/cgroup' % (pid,), 'r') except IOError: return False try: return 'docker' in fp.read() finally: fp.close() def get_interesting_procs(container_name=None): """ Return a list of (pid, line) tuples for processes considered interesting. """ args = ['ps', 'ax', '-oppid=', '-opid=', '-ocomm=', '-ocommand='] if container_name is not None: args = ['docker', 'exec', container_name] + args out = [] for line in subprocess.check_output(args).decode().splitlines(): ppid, pid, comm, rest = line.split(None, 3) if ( ( any(comm.startswith(s) for s in INTERESTING_COMMS) or 'mitogen:' in rest ) and ( 'WALinuxAgent' not in rest ) and ( container_name is not None or (not proc_is_docker(pid)) ) ): out.append((int(pid), line)) return sorted(out) def start_containers(containers): """Run docker containers in the background, with sshd on specified ports. >>> containers = start_containers([ ... {'distro': 'debian', 'hostname': 'localhost', ... 'name': 'target-debian-1', 'port': 2201, ... 'python_path': '/usr/bin/python'}, ... ]) """ if os.environ.get('KEEP'): return run_batches([ [ "docker rm -f %(name)s || true" % container, "docker run " "--rm " # "--cpuset-cpus 0,1 " "--detach " "--privileged " "--cap-add=SYS_PTRACE " "--publish 0.0.0.0:%(port)s:22/tcp " "--hostname=%(name)s " "--name=%(name)s " "%(image)s" % container ] for container in containers ]) for container in containers: container['interesting'] = get_interesting_procs(container['name']) return containers def verify_procs(hostname, old, new): oldpids = set(pid for pid, _ in old) if any(pid not in oldpids for pid, _ in new): print('%r had stray processes running:' % (hostname,), file=sys.stderr, flush=True) for pid, line in new: if pid not in oldpids: print('New process:', line, flush=True) return False return True def check_stray_processes(old, containers=None): ok = True new = get_interesting_procs() if old is not None: ok &= verify_procs('test host machine', old, new) for container in containers or (): ok &= verify_procs( container['name'], container['interesting'], get_interesting_procs(container['name']) ) assert ok, 'stray processes were found' def dump_file(path): print('--- %s ---' % (path,), flush=True) with open(path, 'r') as fp: print(fp.read().rstrip(), flush=True) print('---', flush=True) # SSH passes these through to the container when run interactively, causing # stdout to get messed up with libc warnings. os.environ.pop('LANG', None) os.environ.pop('LC_ALL', None) mitogen-0.3.9/.ci/debops_common_install.py000077500000000000000000000007511465666473100206120ustar00rootroot00000000000000#!/usr/bin/env python import ci_lib # Naturally DebOps only supports Debian. ci_lib.DISTROS = ['debian'] ci_lib.run_batches([ [ 'python -m pip --no-python-version-warning --disable-pip-version-check "debops[ansible]==2.1.2"', ], [ 'if [ "${TF_BUILD:-false}" = "True" ]; then aws ecr-public get-login-password | docker login --username AWS --password-stdin public.ecr.aws; fi', ], ]) ci_lib.run('ansible-galaxy collection install debops.debops:==2.1.2') mitogen-0.3.9/.ci/debops_common_tests.py000077500000000000000000000042401465666473100203030ustar00rootroot00000000000000#!/usr/bin/env python import os import sys import ci_lib # DebOps only supports Debian. ci_lib.DISTROS = ['debian'] * ci_lib.TARGET_COUNT project_dir = os.path.join(ci_lib.TMP, 'project') vars_path = 'ansible/inventory/group_vars/debops_all_hosts.yml' inventory_path = 'ansible/inventory/hosts' docker_hostname = ci_lib.get_docker_hostname() with ci_lib.Fold('docker_setup'): containers = ci_lib.make_containers(port_offset=500, name_prefix='debops-') ci_lib.start_containers(containers) with ci_lib.Fold('job_setup'): ci_lib.run('debops-init %s', project_dir) os.chdir(project_dir) ansible_strategy_plugin = "{}/ansible_mitogen/plugins/strategy".format(ci_lib.GIT_ROOT) with open('.debops.cfg', 'w') as fp: fp.write( "[ansible defaults]\n" "strategy_plugins = {}\n" "strategy = mitogen_linear\n" .format(ansible_strategy_plugin) ) with open(vars_path, 'w') as fp: fp.write( "ansible_python_interpreter: /usr/bin/python2.7\n" "\n" "ansible_user: mitogen__has_sudo_pubkey\n" "ansible_become_pass: has_sudo_pubkey_password\n" "ansible_ssh_private_key_file: %s\n" "\n" # Speed up slow DH generation. "dhparam__bits: ['128', '64']\n" % (ci_lib.key_file,) ) with open(inventory_path, 'a') as fp: fp.writelines( '%(name)s ' 'ansible_host=%(hostname)s ' 'ansible_port=%(port)d ' 'ansible_python_interpreter=%(python_path)s ' '\n' % container for container in containers ) ci_lib.dump_file('ansible/inventory/hosts') # Now we have real host key checking, we need to turn it off os.environ['ANSIBLE_HOST_KEY_CHECKING'] = 'False' interesting = ci_lib.get_interesting_procs() with ci_lib.Fold('first_run'): ci_lib.run('debops common %s', ' '.join(sys.argv[1:])) ci_lib.check_stray_processes(interesting, containers) with ci_lib.Fold('second_run'): ci_lib.run('debops common %s', ' '.join(sys.argv[1:])) ci_lib.check_stray_processes(interesting, containers) mitogen-0.3.9/.ci/localhost_ansible_install.py000077500000000000000000000001211465666473100214420ustar00rootroot00000000000000#!/usr/bin/env python import ci_lib batches = [ ] ci_lib.run_batches(batches) mitogen-0.3.9/.ci/localhost_ansible_tests.py000077500000000000000000000072611465666473100211520ustar00rootroot00000000000000#!/usr/bin/env python # Run tests/ansible/all.yml under Ansible and Ansible-Mitogen from __future__ import print_function import getpass import io import os import subprocess import sys import ci_lib TESTS_DIR = os.path.join(ci_lib.GIT_ROOT, 'tests/ansible') IMAGE_PREP_DIR = os.path.join(ci_lib.GIT_ROOT, 'tests/image_prep') HOSTS_DIR = os.path.join(TESTS_DIR, 'hosts') KEY_PATH = os.path.join(TESTS_DIR, '../data/docker/mitogen__has_sudo_pubkey.key') with ci_lib.Fold('unit_tests'): os.environ['SKIP_MITOGEN'] = '1' ci_lib.run('./run_tests -v') with ci_lib.Fold('job_setup'): os.chmod(KEY_PATH, int('0600', 8)) # NOTE: sshpass v1.06 causes errors so pegging to 1.05 -> "msg": "Error when changing password","out": "passwd: DS error: eDSAuthFailed\n", # there's a checksum error with "brew install http://git.io/sshpass.rb" though, so installing manually if not ci_lib.exists_in_path('sshpass'): subprocess.check_call( "curl -O -L https://sourceforge.net/projects/sshpass/files/sshpass/1.05/sshpass-1.05.tar.gz && \ tar xvf sshpass-1.05.tar.gz && \ cd sshpass-1.05 && \ ./configure && \ sudo make install", shell=True, ) with ci_lib.Fold('machine_prep'): # generate a new ssh key for localhost ssh if not os.path.exists(os.path.expanduser("~/.ssh/id_rsa")): subprocess.check_call("ssh-keygen -P '' -m pem -f ~/.ssh/id_rsa", shell=True) subprocess.check_call("cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys", shell=True) os.chmod(os.path.expanduser('~/.ssh'), int('0700', 8)) os.chmod(os.path.expanduser('~/.ssh/authorized_keys'), int('0600', 8)) # also generate it for the sudo user if os.system("sudo [ -f ~root/.ssh/id_rsa ]") != 0: subprocess.check_call("sudo ssh-keygen -P '' -m pem -f ~root/.ssh/id_rsa", shell=True) subprocess.check_call("sudo cat ~root/.ssh/id_rsa.pub | sudo tee -a ~root/.ssh/authorized_keys", shell=True) subprocess.check_call('sudo chmod 700 ~root/.ssh', shell=True) subprocess.check_call('sudo chmod 600 ~root/.ssh/authorized_keys', shell=True) if os.path.expanduser('~mitogen__user1') == '~mitogen__user1': os.chdir(IMAGE_PREP_DIR) ci_lib.run("ansible-playbook -c local -i localhost, _user_accounts.yml") # FIXME Don't hardcode https://github.com/mitogen-hq/mitogen/issues/1022 # and os.environ['USER'] is not populated on Azure macOS runners. os.chdir(HOSTS_DIR) with io.open('default.hosts', 'r+', encoding='utf-8') as f: user = getpass.getuser() content = f.read() content = content.replace("{{ lookup('pipe', 'whoami') }}", user) f.seek(0) f.write(content) f.truncate() ci_lib.dump_file('default.hosts') cmd = ';'.join([ 'from __future__ import print_function', 'import os, sys', 'print(sys.executable, os.path.realpath(sys.executable))', ]) for interpreter in ['/usr/bin/python', '/usr/bin/python2', '/usr/bin/python2.7']: print(interpreter) try: subprocess.call([interpreter, '-c', cmd]) except OSError as exc: print(exc) print(interpreter, 'with PYTHON_LAUNCHED_FROM_WRAPPER=1') environ = os.environ.copy() environ['PYTHON_LAUNCHED_FROM_WRAPPER'] = '1' try: subprocess.call([interpreter, '-c', cmd], env=environ) except OSError as exc: print(exc) with ci_lib.Fold('ansible'): os.chdir(TESTS_DIR) playbook = os.environ.get('PLAYBOOK', 'all.yml') ci_lib.run('./run_ansible_playbook.py %s %s', playbook, ' '.join(sys.argv[1:])) mitogen-0.3.9/.ci/mitogen_install.py000077500000000000000000000004421465666473100174250ustar00rootroot00000000000000#!/usr/bin/env python import ci_lib batches = [ ] if ci_lib.have_docker(): batches.append([ 'if [ "${TF_BUILD:-false}" = "True" ]; then aws ecr-public get-login-password | docker login --username AWS --password-stdin public.ecr.aws; fi', ]) ci_lib.run_batches(batches) mitogen-0.3.9/.ci/mitogen_py24_install.py000077500000000000000000000005531465666473100203060ustar00rootroot00000000000000#!/usr/bin/env python import ci_lib batches = [ [ 'if [ "${TF_BUILD:-false}" = "True" ]; then aws ecr-public get-login-password | docker login --username AWS --password-stdin public.ecr.aws; fi', ], [ 'curl https://dw.github.io/mitogen/binaries/ubuntu-python-2.4.6.tar.bz2 | sudo tar -C / -jxv', ] ] ci_lib.run_batches(batches) mitogen-0.3.9/.ci/mitogen_py24_tests.py000077500000000000000000000004641465666473100200030ustar00rootroot00000000000000#!/usr/bin/env python # Mitogen tests for Python 2.4. import os import ci_lib os.environ.update({ 'NOCOVERAGE': '1', 'UNIT2': '/usr/local/python2.4.6/bin/unit2', 'MITOGEN_TEST_DISTRO': ci_lib.DISTRO, 'MITOGEN_LOG_LEVEL': 'debug', 'SKIP_ANSIBLE': '1', }) ci_lib.run('./run_tests -v') mitogen-0.3.9/.ci/mitogen_tests.py000077500000000000000000000006031465666473100171200ustar00rootroot00000000000000#!/usr/bin/env python # Run the Mitogen tests. import os import ci_lib os.environ.update({ 'MITOGEN_TEST_DISTRO': ci_lib.DISTRO, 'MITOGEN_LOG_LEVEL': 'debug', 'SKIP_ANSIBLE': '1', }) if not ci_lib.have_docker(): os.environ['SKIP_DOCKER_TESTS'] = '1' interesting = ci_lib.get_interesting_procs() ci_lib.run('./run_tests -v') ci_lib.check_stray_processes(interesting) mitogen-0.3.9/.ci/soak/000077500000000000000000000000001465666473100146155ustar00rootroot00000000000000mitogen-0.3.9/.ci/soak/debops_common.sh000077500000000000000000000003721465666473100200020ustar00rootroot00000000000000#!/bin/bash export NOCOVERAGE=1 # Make Docker containers once. /usr/bin/time -v ./.ci/debops_common_tests.py "$@" || break export KEEP=1 i=0 while : do i=$((i + 1)) /usr/bin/time -v ./.ci/debops_common_tests.py "$@" || break done echo $i mitogen-0.3.9/.ci/soak/mitogen.sh000077500000000000000000000003771465666473100166250ustar00rootroot00000000000000#!/bin/bash export NOCOVERAGE=1 export DISTROS="debian*4" # Make Docker containers once. /usr/bin/time -v ./.ci/ansible_tests.py "$@" export KEEP=1 i=0 while : do i=$((i + 1)) /usr/bin/time -v ./.ci/ansible_tests.py "$@" || break done echo $i mitogen-0.3.9/.ci/soak/mitogen_py24.sh000077500000000000000000000002171465666473100174740ustar00rootroot00000000000000#!/bin/bash export NOCOVERAGE=1 i=0 while : do i=$((i + 1)) /usr/bin/time -v ./.ci/mitogen_py24_tests.py "$@" || break done echo $i mitogen-0.3.9/.github/000077500000000000000000000000001465666473100145475ustar00rootroot00000000000000mitogen-0.3.9/.github/ISSUE_TEMPLATE/000077500000000000000000000000001465666473100167325ustar00rootroot00000000000000mitogen-0.3.9/.github/ISSUE_TEMPLATE/bug-0.2.md000066400000000000000000000027021465666473100203270ustar00rootroot00000000000000--- name: Mitogen 0.2.x bug report about: Report a bug in Mitogen 0.2.x (for Ansible 2.5, 2.6, 2.7, 2.8, or 2.9) title: '' labels: affects-0.2, bug assignees: '' --- Please drag-drop large logs as text file attachments. Feel free to write an issue in your preferred format, however if in doubt, use the following checklist as a guide for what to include. * Which version of Ansible are you running? * Is your version of Ansible patched in any way? * Are you running with any custom modules, or `module_utils` loaded? * Have you tried the latest master version from Git? * Do you have some idea of what the underlying problem may be? https://mitogen.networkgenomics.com/ansible_detailed.html#common-problems has instructions to help figure out the likely cause and how to gather relevant logs. * Mention your host and target OS and versions * Mention your host and target Python versions * If reporting a performance issue, mention the number of targets and a rough description of your workload (lots of copies, lots of tiny file edits, etc.) * If reporting a crash or hang in Ansible, please rerun with -vvv and include 200 lines of output around the point of the error, along with a full copy of any traceback or error text in the log. Beware "-vvv" may include secret data! Edit as necessary before posting. * If reporting any kind of problem with Ansible, please include the Ansible version along with output of "ansible-config dump --only-changed". mitogen-0.3.9/.github/ISSUE_TEMPLATE/bug-0.3.md000066400000000000000000000026561465666473100203400ustar00rootroot00000000000000--- name: Mitogen 0.3.x bug report about: Report a bug in Mitogen 0.3.x (for Ansible 2.10.x) title: '' labels: affects-0.3, bug assignees: '' --- Please drag-drop large logs as text file attachments. Feel free to write an issue in your preferred format, however if in doubt, use the following checklist as a guide for what to include. * Which version of Ansible are you running? * Is your version of Ansible patched in any way? * Are you running with any custom modules, or `module_utils` loaded? * Have you tried the latest master version from Git? * Do you have some idea of what the underlying problem may be? https://mitogen.networkgenomics.com/ansible_detailed.html#common-problems has instructions to help figure out the likely cause and how to gather relevant logs. * Mention your host and target OS and versions * Mention your host and target Python versions * If reporting a performance issue, mention the number of targets and a rough description of your workload (lots of copies, lots of tiny file edits, etc.) * If reporting a crash or hang in Ansible, please rerun with -vvv and include 200 lines of output around the point of the error, along with a full copy of any traceback or error text in the log. Beware "-vvv" may include secret data! Edit as necessary before posting. * If reporting any kind of problem with Ansible, please include the Ansible version along with output of "ansible-config dump --only-changed". mitogen-0.3.9/.github/PULL_REQUEST_TEMPLATE.md000066400000000000000000000011221465666473100203440ustar00rootroot00000000000000 Thanks for creating a PR! Here's a quick checklist to pay attention to: * Please add an entry to docs/changelog.rst as appropriate. * Has some new parameter been added or semantics modified somehow? Please ensure relevant documentation is updated in docs/ansible.rst and docs/api.rst. * If it's for new functionality, is there at least a basic test in either tests/ or tests/ansible/ covering it? * If it's for a new connection method, please try to stub out the implementation as in tests/data/stubs/, so that construction can be tested without having a working configuration. mitogen-0.3.9/.gitignore000066400000000000000000000002651465666473100152020ustar00rootroot00000000000000.coverage .tox .venv venvs/** **/.DS_Store *.pyc *.pyd *.pyo *.retry MANIFEST build/ dist/ extra/ tests/ansible/.*.pid docs/_build/ htmlcov/ *.egg-info __pycache__/ extra **/.*.pid mitogen-0.3.9/.lgtm.yml000066400000000000000000000005341465666473100147550ustar00rootroot00000000000000path_classifiers: library: - "mitogen/compat" - "ansible_mitogen/compat" queries: # Mitogen 2.4 compatibility trips this query everywhere, so just disable it - exclude: py/unreachable-statement - exclude: py/should-use-with # mitogen.core.b() trips this query everywhere, so just disable it - exclude: py/import-and-import-from mitogen-0.3.9/LICENSE000066400000000000000000000026711465666473100142220ustar00rootroot00000000000000Copyright 2021, the Mitogen authors Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. mitogen-0.3.9/MANIFEST.in000066400000000000000000000000201465666473100147350ustar00rootroot00000000000000include LICENSE mitogen-0.3.9/README.md000066400000000000000000000007571465666473100144770ustar00rootroot00000000000000# Mitogen Please see the documentation. ![](https://i.imgur.com/eBM6LhJ.gif) [![Total alerts](https://img.shields.io/lgtm/alerts/g/mitogen-hq/mitogen.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/mitogen-hq/mitogen/alerts/) [![Build Status](https://dev.azure.com/mitogen-hq/mitogen/_apis/build/status/mitogen-hq.mitogen?branchName=master)](https://dev.azure.com/mitogen-hq/mitogen/_build/latest?definitionId=1&branchName=master) mitogen-0.3.9/ansible_mitogen/000077500000000000000000000000001465666473100163465ustar00rootroot00000000000000mitogen-0.3.9/ansible_mitogen/__init__.py000066400000000000000000000000001465666473100204450ustar00rootroot00000000000000mitogen-0.3.9/ansible_mitogen/affinity.py000066400000000000000000000237241465666473100205410ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. """ As Mitogen separates asynchronous IO out to a broker thread, communication necessarily involves context switching and waking that thread. When application threads and the broker share a CPU, this can be almost invisibly fast - around 25 microseconds for a full A->B->A round-trip. However when threads are scheduled on different CPUs, round-trip delays regularly vary wildly, and easily into milliseconds. Many contributing factors exist, not least scenarios like: 1. A is preempted immediately after waking B, but before releasing the GIL. 2. B wakes from IO wait only to immediately enter futex wait. 3. A may wait 10ms or more for another timeslice, as the scheduler on its CPU runs threads unrelated to its transaction (i.e. not B), wake only to release its GIL, before entering IO sleep waiting for a reply from B, which cannot exist yet. 4. B wakes, acquires GIL, performs work, and sends reply to A, causing it to wake. B is preempted before releasing GIL. 5. A wakes from IO wait only to immediately enter futex wait. 6. B may wait 10ms or more for another timeslice, wake only to release its GIL, before sleeping again. 7. A wakes, acquires GIL, finally receives reply. Per above if we are unlucky, on an even moderately busy machine it is possible to lose milliseconds just in scheduling delay, and the effect is compounded when pairs of threads in process A are communicating with pairs of threads in process B using the same scheme, such as when Ansible WorkerProcess is communicating with ContextService in the connection multiplexer. In the worst case it could involve 4 threads working in lockstep spread across 4 busy CPUs. Since multithreading in Python is essentially useless except for waiting on IO due to the presence of the GIL, at least in Ansible there is no good reason for threads in the same process to run on distinct CPUs - they always operate in lockstep due to the GIL, and are thus vulnerable to issues like above. Linux lacks any natural API to describe what we want, it only permits individual threads to be constrained to run on specific CPUs, and for that constraint to be inherited by new threads and forks of the constrained thread. This module therefore implements a CPU pinning policy for Ansible processes, providing methods that should be called early in any new process, either to rebalance which CPU it is pinned to, or in the case of subprocesses, to remove the pinning entirely. It is likely to require ongoing tweaking, since pinning necessarily involves preventing the scheduler from making load balancing decisions. """ from __future__ import absolute_import, division, print_function __metaclass__ = type import ctypes import logging import mmap import multiprocessing import os import struct import mitogen.core import mitogen.parent LOG = logging.getLogger(__name__) try: _libc = ctypes.CDLL(None, use_errno=True) _strerror = _libc.strerror _strerror.restype = ctypes.c_char_p _sem_init = _libc.sem_init _sem_wait = _libc.sem_wait _sem_post = _libc.sem_post _sched_setaffinity = _libc.sched_setaffinity except (OSError, AttributeError): _libc = None _strerror = None _sem_init = None _sem_wait = None _sem_post = None _sched_setaffinity = None class sem_t(ctypes.Structure): """ Wrap sem_t to allow storing a lock in shared memory. """ _fields_ = [ ('data', ctypes.c_uint8 * 128), ] def init(self): if _sem_init(self.data, 1, 1): raise Exception(_strerror(ctypes.get_errno())) def acquire(self): if _sem_wait(self.data): raise Exception(_strerror(ctypes.get_errno())) def release(self): if _sem_post(self.data): raise Exception(_strerror(ctypes.get_errno())) class State(ctypes.Structure): """ Contents of shared memory segment. This allows :meth:`Manager.assign` to be called from any child, since affinity assignment must happen from within the context of the new child process. """ _fields_ = [ ('lock', sem_t), ('counter', ctypes.c_uint8), ] class Policy(object): """ Process affinity policy. """ def assign_controller(self): """ Assign the Ansible top-level policy to this process. """ def assign_muxprocess(self, index): """ Assign the MuxProcess policy to this process. """ def assign_worker(self): """ Assign the WorkerProcess policy to this process. """ def assign_subprocess(self): """ Assign the helper subprocess policy to this process. """ class FixedPolicy(Policy): """ :class:`Policy` for machines where the only control method available is fixed CPU placement. The scheme here was tested on an otherwise idle 16 thread machine. - The connection multiplexer is pinned to CPU 0. - The Ansible top-level (strategy) is pinned to CPU 1. - WorkerProcesses are pinned sequentually to 2..N, wrapping around when no more CPUs exist. - Children such as SSH may be scheduled on any CPU except 0/1. If the machine has less than 4 cores available, the top-level and workers are pinned between CPU 2..N, i.e. no CPU is reserved for the top-level process. This could at least be improved by having workers pinned to independent cores, before reusing the second hyperthread of an existing core. A hook is installed that causes :meth:`reset` to run in the child of any process created with :func:`mitogen.parent.popen`, ensuring CPU-intensive children like SSH are not forced to share the same core as the (otherwise potentially very busy) parent. """ def __init__(self, cpu_count=None): #: For tests. self.cpu_count = cpu_count or multiprocessing.cpu_count() self.mem = mmap.mmap(-1, 4096) self.state = State.from_buffer(self.mem) self.state.lock.init() if self.cpu_count < 2: # uniprocessor self._reserve_mux = False self._reserve_controller = False self._reserve_mask = 0 self._reserve_shift = 0 elif self.cpu_count < 4: # small SMP self._reserve_mux = True self._reserve_controller = False self._reserve_mask = 1 self._reserve_shift = 1 else: # big SMP self._reserve_mux = True self._reserve_controller = True self._reserve_mask = 3 self._reserve_shift = 2 def _set_affinity(self, descr, mask): if descr: LOG.debug('CPU mask for %s: %#08x', descr, mask) mitogen.parent._preexec_hook = self._clear self._set_cpu_mask(mask) def _balance(self, descr): self.state.lock.acquire() try: n = self.state.counter self.state.counter += 1 finally: self.state.lock.release() self._set_cpu(descr, self._reserve_shift + ( (n % (self.cpu_count - self._reserve_shift)) )) def _set_cpu(self, descr, cpu): self._set_affinity(descr, 1 << (cpu % self.cpu_count)) def _clear(self): all_cpus = (1 << self.cpu_count) - 1 self._set_affinity(None, all_cpus & ~self._reserve_mask) def assign_controller(self): if self._reserve_controller: self._set_cpu('Ansible top-level process', 1) else: self._balance('Ansible top-level process') def assign_muxprocess(self, index): self._set_cpu('MuxProcess %d' % (index,), index) def assign_worker(self): self._balance('WorkerProcess') def assign_subprocess(self): self._clear() class LinuxPolicy(FixedPolicy): def _mask_to_bytes(self, mask): """ Convert the (type long) mask to a cpu_set_t. """ chunks = [] shiftmask = (2 ** 64) - 1 for x in range(16): chunks.append(struct.pack('>= 64 return mitogen.core.b('').join(chunks) def _get_thread_ids(self): try: ents = os.listdir('/proc/self/task') except OSError: LOG.debug('cannot fetch thread IDs for current process') return [os.getpid()] return [int(s) for s in ents if s.isdigit()] def _set_cpu_mask(self, mask): s = self._mask_to_bytes(mask) for tid in self._get_thread_ids(): _sched_setaffinity(tid, len(s), s) if _sched_setaffinity is not None: policy = LinuxPolicy() else: policy = Policy() mitogen-0.3.9/ansible_mitogen/compat/000077500000000000000000000000001465666473100176315ustar00rootroot00000000000000mitogen-0.3.9/ansible_mitogen/compat/__init__.py000066400000000000000000000000001465666473100217300ustar00rootroot00000000000000mitogen-0.3.9/ansible_mitogen/connection.py000066400000000000000000001154741465666473100210730ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. from __future__ import absolute_import, division, print_function from __future__ import unicode_literals __metaclass__ = type import errno import logging import os import pprint import stat import sys import time import ansible.constants as C import ansible.errors import ansible.plugins.connection import mitogen.core import ansible_mitogen.mixins import ansible_mitogen.parsing import ansible_mitogen.process import ansible_mitogen.services import ansible_mitogen.target import ansible_mitogen.transport_config import ansible_mitogen.utils.unsafe LOG = logging.getLogger(__name__) task_vars_msg = ( 'could not recover task_vars. This means some connection ' 'settings may erroneously be reset to their defaults. ' 'Please report a bug if you encounter this message.' ) def get_remote_name(spec): """ Return the value to use for the "remote_name" parameter. """ if spec.mitogen_mask_remote_name(): return 'ansible' return None def optional_int(value): """ Convert `value` to an integer if it is not :data:`None`, otherwise return :data:`None`. """ try: return int(value) except (TypeError, ValueError): return None def convert_bool(obj): if isinstance(obj, bool): return obj if str(obj).lower() in ('no', 'false', '0'): return False if str(obj).lower() not in ('yes', 'true', '1'): raise ansible.errors.AnsibleConnectionFailure( 'expected yes/no/true/false/0/1, got %r' % (obj,) ) return True def default(value, default): """ Return `default` is `value` is :data:`None`, otherwise return `value`. """ if value is None: return default return value def _connect_local(spec): """ Return ContextService arguments for a local connection. """ return { 'method': 'local', 'kwargs': { 'python_path': spec.python_path(), } } def _connect_ssh(spec): """ Return ContextService arguments for an SSH connection. """ if spec.host_key_checking(): check_host_keys = 'enforce' else: check_host_keys = 'ignore' # #334: tilde-expand private_key_file to avoid implementation difference # between Python and OpenSSH. private_key_file = spec.private_key_file() if private_key_file is not None: private_key_file = os.path.expanduser(private_key_file) return { 'method': 'ssh', 'kwargs': { 'check_host_keys': check_host_keys, 'hostname': spec.remote_addr(), 'username': spec.remote_user(), 'compression': convert_bool( default(spec.mitogen_ssh_compression(), True) ), 'password': spec.password(), 'port': spec.port(), 'python_path': spec.python_path(), 'identity_file': private_key_file, 'identities_only': False, 'ssh_path': spec.ssh_executable(), 'connect_timeout': spec.ansible_ssh_timeout(), 'ssh_args': spec.ssh_args(), 'ssh_debug_level': spec.mitogen_ssh_debug_level(), 'remote_name': get_remote_name(spec), 'keepalive_count': ( spec.mitogen_ssh_keepalive_count() or 10 ), 'keepalive_interval': ( spec.mitogen_ssh_keepalive_interval() or 30 ), } } def _connect_buildah(spec): """ Return ContextService arguments for a Buildah connection. """ return { 'method': 'buildah', 'kwargs': { 'username': spec.remote_user(), 'container': spec.remote_addr(), 'python_path': spec.python_path(), 'connect_timeout': spec.ansible_ssh_timeout() or spec.timeout(), 'remote_name': get_remote_name(spec), } } def _connect_docker(spec): """ Return ContextService arguments for a Docker connection. """ return { 'method': 'docker', 'kwargs': { 'username': spec.remote_user(), 'container': spec.remote_addr(), 'python_path': spec.python_path(rediscover_python=True), 'connect_timeout': spec.ansible_ssh_timeout() or spec.timeout(), 'remote_name': get_remote_name(spec), } } def _connect_kubectl(spec): """ Return ContextService arguments for a Kubernetes connection. """ return { 'method': 'kubectl', 'kwargs': { 'pod': spec.remote_addr(), 'python_path': spec.python_path(), 'connect_timeout': spec.ansible_ssh_timeout() or spec.timeout(), 'kubectl_path': spec.mitogen_kubectl_path(), 'kubectl_args': spec.extra_args(), 'remote_name': get_remote_name(spec), } } def _connect_jail(spec): """ Return ContextService arguments for a FreeBSD jail connection. """ return { 'method': 'jail', 'kwargs': { 'username': spec.remote_user(), 'container': spec.remote_addr(), 'python_path': spec.python_path(), 'connect_timeout': spec.ansible_ssh_timeout() or spec.timeout(), 'remote_name': get_remote_name(spec), } } def _connect_lxc(spec): """ Return ContextService arguments for an LXC Classic container connection. """ return { 'method': 'lxc', 'kwargs': { 'container': spec.remote_addr(), 'python_path': spec.python_path(), 'lxc_attach_path': spec.mitogen_lxc_attach_path(), 'connect_timeout': spec.ansible_ssh_timeout() or spec.timeout(), 'remote_name': get_remote_name(spec), } } def _connect_lxd(spec): """ Return ContextService arguments for an LXD container connection. """ return { 'method': 'lxd', 'kwargs': { 'container': spec.remote_addr(), 'python_path': spec.python_path(), 'lxc_path': spec.mitogen_lxc_path(), 'connect_timeout': spec.ansible_ssh_timeout() or spec.timeout(), 'remote_name': get_remote_name(spec), } } def _connect_machinectl(spec): """ Return ContextService arguments for a machinectl connection. """ return _connect_setns(spec, kind='machinectl') def _connect_podman(spec): """ Return ContextService arguments for a Docker connection. """ return { 'method': 'podman', 'kwargs': { 'username': spec.remote_user(), 'container': spec.remote_addr(), 'python_path': spec.python_path(rediscover_python=True), 'connect_timeout': spec.ansible_ssh_timeout() or spec.timeout(), 'remote_name': get_remote_name(spec), } } def _connect_setns(spec, kind=None): """ Return ContextService arguments for a mitogen_setns connection. """ return { 'method': 'setns', 'kwargs': { 'container': spec.remote_addr(), 'username': spec.remote_user(), 'python_path': spec.python_path(), 'kind': kind or spec.mitogen_kind(), 'docker_path': spec.mitogen_docker_path(), 'lxc_path': spec.mitogen_lxc_path(), 'lxc_info_path': spec.mitogen_lxc_info_path(), 'machinectl_path': spec.mitogen_machinectl_path(), } } def _connect_su(spec): """ Return ContextService arguments for su as a become method. """ return { 'method': 'su', 'enable_lru': True, 'kwargs': { 'username': spec.become_user(), 'password': spec.become_pass(), 'python_path': spec.python_path(), 'su_path': spec.become_exe(), 'connect_timeout': spec.timeout(), 'remote_name': get_remote_name(spec), } } def _connect_sudo(spec): """ Return ContextService arguments for sudo as a become method. """ return { 'method': 'sudo', 'enable_lru': True, 'kwargs': { 'username': spec.become_user(), 'password': spec.become_pass(), 'python_path': spec.python_path(), 'sudo_path': spec.become_exe(), 'connect_timeout': spec.timeout(), 'sudo_args': spec.sudo_args(), 'remote_name': get_remote_name(spec), } } def _connect_doas(spec): """ Return ContextService arguments for doas as a become method. """ return { 'method': 'doas', 'enable_lru': True, 'kwargs': { 'username': spec.become_user(), 'password': spec.become_pass(), 'python_path': spec.python_path(), 'doas_path': spec.become_exe(), 'connect_timeout': spec.timeout(), 'remote_name': get_remote_name(spec), } } def _connect_mitogen_su(spec): """ Return ContextService arguments for su as a first class connection. """ return { 'method': 'su', 'kwargs': { 'username': spec.remote_user(), 'password': spec.password(), 'python_path': spec.python_path(), 'su_path': spec.become_exe(), 'connect_timeout': spec.timeout(), 'remote_name': get_remote_name(spec), } } def _connect_mitogen_sudo(spec): """ Return ContextService arguments for sudo as a first class connection. """ return { 'method': 'sudo', 'kwargs': { 'username': spec.remote_user(), 'password': spec.password(), 'python_path': spec.python_path(), 'sudo_path': spec.become_exe(), 'connect_timeout': spec.timeout(), 'sudo_args': spec.sudo_args(), 'remote_name': get_remote_name(spec), } } def _connect_mitogen_doas(spec): """ Return ContextService arguments for doas as a first class connection. """ return { 'method': 'doas', 'kwargs': { 'username': spec.remote_user(), 'password': spec.password(), 'python_path': spec.python_path(), 'doas_path': spec.ansible_doas_exe(), 'connect_timeout': spec.timeout(), 'remote_name': get_remote_name(spec), } } #: Mapping of connection method names to functions invoked as `func(spec)` #: generating ContextService keyword arguments matching a connection #: specification. CONNECTION_METHOD = { 'buildah': _connect_buildah, 'docker': _connect_docker, 'kubectl': _connect_kubectl, 'jail': _connect_jail, 'local': _connect_local, 'lxc': _connect_lxc, 'lxd': _connect_lxd, 'machinectl': _connect_machinectl, 'podman': _connect_podman, 'setns': _connect_setns, 'ssh': _connect_ssh, 'smart': _connect_ssh, # issue #548. 'su': _connect_su, 'sudo': _connect_sudo, 'doas': _connect_doas, 'mitogen_su': _connect_mitogen_su, 'mitogen_sudo': _connect_mitogen_sudo, 'mitogen_doas': _connect_mitogen_doas, } class CallChain(mitogen.parent.CallChain): """ Extend :class:`mitogen.parent.CallChain` to additionally cause the associated :class:`Connection` to be reset if a ChannelError occurs. This only catches failures that occur while a call is pending, it is a stop-gap until a more general method is available to notice connection in every situation. """ call_aborted_msg = ( 'Mitogen was disconnected from the remote environment while a call ' 'was in-progress. If you feel this is in error, please file a bug. ' 'Original error was: %s' ) def __init__(self, connection, context, pipelined=False): super(CallChain, self).__init__(context, pipelined) #: The connection to reset on CallError. self._connection = connection def _rethrow(self, recv): try: return recv.get().unpickle() except mitogen.core.ChannelError as e: self._connection.reset() raise ansible.errors.AnsibleConnectionFailure( self.call_aborted_msg % (e,) ) def call(self, func, *args, **kwargs): """ Like :meth:`mitogen.parent.CallChain.call`, but log timings. """ t0 = time.time() try: recv = self.call_async(func, *args, **kwargs) return self._rethrow(recv) finally: LOG.debug('Call took %d ms: %r', 1000 * (time.time() - t0), mitogen.parent.CallSpec(func, args, kwargs)) class Connection(ansible.plugins.connection.ConnectionBase): #: The :class:`ansible_mitogen.process.Binding` representing the connection #: multiplexer this connection's target is assigned to. :data:`None` when #: disconnected. binding = None #: mitogen.parent.Context for the target account on the target, possibly #: reached via become. context = None #: Context for the login account on the target. This is always the login #: account, even when become=True. login_context = None #: Only sudo, su, and doas are supported for now. # Ansible ConnectionBase attribute, removed in Ansible >= 2.8 become_methods = ['sudo', 'su', 'doas'] #: Dict containing init_child() return value as recorded at startup by #: ContextService. Contains: #: #: fork_context: Context connected to the fork parent : process in the #: target account. #: home_dir: Target context's home directory. #: good_temp_dir: A writeable directory where new temporary directories #: can be created. init_child_result = None #: A :class:`mitogen.parent.CallChain` for calls made to the target #: account, to ensure subsequent calls fail with the original exception if #: pipelined directory creation or file transfer fails. chain = None # # Note: any of the attributes below may be :data:`None` if the connection # plugin was constructed directly by a non-cooperative action, such as in # the case of the synchronize module. # #: Set to task_vars by on_action_run(). _task_vars = None #: Set by on_action_run() delegate_to_hostname = None #: Set to '_loader.get_basedir()' by on_action_run(). Used by mitogen_local #: to change the working directory to that of the current playbook, #: matching vanilla Ansible behaviour. loader_basedir = None # set by `_get_task_vars()` for interpreter discovery _action = None def on_action_run(self, task_vars, delegate_to_hostname, loader_basedir): """ Invoked by ActionModuleMixin to indicate a new task is about to start executing. We use the opportunity to grab relevant bits from the task-specific data. :param dict task_vars: Task variable dictionary. :param str delegate_to_hostname: :data:`None`, or the template-expanded inventory hostname this task is being delegated to. A similar variable exists on PlayContext when ``delegate_to:`` is active, however it is unexpanded. :param str loader_basedir: Loader base directory; see :attr:`loader_basedir`. """ self._task_vars = task_vars self.delegate_to_hostname = delegate_to_hostname self.loader_basedir = loader_basedir self._put_connection() def _get_task_vars(self): """ More information is needed than normally provided to an Ansible connection. For proxied connections, intermediary configuration must be inferred, and for any connection the configured Python interpreter must be known. There is no clean way to access this information that would not deviate from the running Ansible version. The least invasive method known is to reuse the running task's task_vars dict. This method walks the stack to find task_vars of the Action plugin's run(), or if no Action is present, from Strategy's _execute_meta(), as in the case of 'meta: reset_connection'. The stack is walked in addition to subclassing Action.run()/on_action_run(), as it is possible for new connections to be constructed in addition to the preconstructed connection passed into any running action. """ if self._task_vars is not None: # check for if self._action has already been set or not # there are some cases where the ansible executor passes in task_vars # so we don't walk the stack to find them # TODO: is there a better way to get the ActionModuleMixin object? # ansible python discovery needs it to run discover_interpreter() if not isinstance(self._action, ansible_mitogen.mixins.ActionModuleMixin): f = sys._getframe() while f: if f.f_code.co_name == 'run': f_self = f.f_locals.get('self') if isinstance(f_self, ansible_mitogen.mixins.ActionModuleMixin): self._action = f_self break elif f.f_code.co_name == '_execute_meta': break f = f.f_back return self._task_vars f = sys._getframe() while f: if f.f_code.co_name == 'run': f_locals = f.f_locals f_self = f_locals.get('self') if isinstance(f_self, ansible_mitogen.mixins.ActionModuleMixin): # backref for python interpreter discovery, should be safe because _get_task_vars # is always called before running interpreter discovery self._action = f_self task_vars = f_locals.get('task_vars') if task_vars: LOG.debug('recovered task_vars from Action') return task_vars elif f.f_code.co_name == '_execute_meta': f_all_vars = f.f_locals.get('all_vars') if isinstance(f_all_vars, dict): LOG.debug('recovered task_vars from meta:') return f_all_vars f = f.f_back raise ansible.errors.AnsibleConnectionFailure(task_vars_msg) def get_host_vars(self, inventory_hostname): """ Fetch the HostVars for a host. :returns: Variables dictionary or :data:`None`. :raises ansible.errors.AnsibleConnectionFailure: Task vars unavailable. """ task_vars = self._get_task_vars() hostvars = task_vars.get('hostvars') if hostvars: return hostvars.get(inventory_hostname) raise ansible.errors.AnsibleConnectionFailure(task_vars_msg) def get_task_var(self, key, default=None): """ Fetch the value of a task variable related to connection configuration, or, if delegate_to is active, fetch the same variable via HostVars for the delegated-to machine. When running with delegate_to, Ansible tasks have variables associated with the original machine, not the delegated-to machine, therefore it does not make sense to extract connection-related configuration for the delegated-to machine from them. """ def _fetch_task_var(task_vars, key): """ Special helper func in case vars can be templated """ SPECIAL_TASK_VARS = [ 'ansible_python_interpreter' ] if key in task_vars: val = task_vars[key] if '{' in str(val) and key in SPECIAL_TASK_VARS: # template every time rather than storing in a cache # in case a different template value is used in a different task val = self.templar.template( val, preserve_trailing_newlines=True, escape_backslashes=False ) return val task_vars = self._get_task_vars() if self.delegate_to_hostname is None: return _fetch_task_var(task_vars, key) else: delegated_vars = task_vars['ansible_delegated_vars'] if self.delegate_to_hostname in delegated_vars: task_vars = delegated_vars[self.delegate_to_hostname] return _fetch_task_var(task_vars, key) return default @property def homedir(self): self._connect() return self.init_child_result['home_dir'] def get_binding(self): """ Return the :class:`ansible_mitogen.process.Binding` representing the process that hosts the physical connection and services (context establishment, file transfer, ..) for our desired target. """ assert self.binding is not None return self.binding @property def connected(self): """ Ansible connection plugin property. Used by ansible-connection command. """ return self.context is not None def _spec_from_via(self, proxied_inventory_name, via_spec): """ Produce a dict connection specifiction given a string `via_spec`, of the form `[[become_method:]become_user@]inventory_hostname`. """ become_user, _, inventory_name = via_spec.rpartition('@') become_method, _, become_user = become_user.rpartition(':') # must use __contains__ to avoid a TypeError for a missing host on # Ansible 2.3. via_vars = self.get_host_vars(inventory_name) if via_vars is None: raise ansible.errors.AnsibleConnectionFailure( self.unknown_via_msg % ( via_spec, proxied_inventory_name, ) ) return ansible_mitogen.transport_config.MitogenViaSpec( inventory_name=inventory_name, play_context=self._play_context, host_vars=dict(via_vars), # TODO: make it lazy task_vars=self._get_task_vars(), # needed for interpreter discovery in parse_python_path action=self._action, become_method=become_method or None, become_user=become_user or None, ) unknown_via_msg = 'mitogen_via=%s of %s specifies an unknown hostname' via_cycle_msg = 'mitogen_via=%s of %s creates a cycle (%s)' def _stack_from_spec(self, spec, stack=(), seen_names=()): """ Return a tuple of ContextService parameter dictionaries corresponding to the connection described by `spec`, and any connection referenced by its `mitogen_via` or `become` fields. Each element is a dict of the form:: { # Optional. If present and `True`, this hop is elegible for # interpreter recycling. "enable_lru": True, # mitogen.master.Router method name. "method": "ssh", # mitogen.master.Router method kwargs. "kwargs": { "hostname": "..." } } :param ansible_mitogen.transport_config.Spec spec: Connection specification. :param tuple stack: Stack elements from parent call (used for recursion). :param tuple seen_names: Inventory hostnames from parent call (cycle detection). :returns: Tuple `(stack, seen_names)`. """ if spec.inventory_name() in seen_names: raise ansible.errors.AnsibleConnectionFailure( self.via_cycle_msg % ( spec.mitogen_via(), spec.inventory_name(), ' -> '.join(reversed( seen_names + (spec.inventory_name(),) )), ) ) if spec.mitogen_via(): stack = self._stack_from_spec( self._spec_from_via(spec.inventory_name(), spec.mitogen_via()), stack=stack, seen_names=seen_names + (spec.inventory_name(),), ) stack += (CONNECTION_METHOD[spec.transport()](spec),) if spec.become() and ((spec.become_user() != spec.remote_user()) or C.BECOME_ALLOW_SAME_USER): stack += (CONNECTION_METHOD[spec.become_method()](spec),) return stack def _build_stack(self): """ Construct a list of dictionaries representing the connection configuration between the controller and the target. This is additionally used by the integration tests "mitogen_get_stack" action to fetch the would-be connection configuration. """ spec = ansible_mitogen.transport_config.PlayContextSpec( connection=self, play_context=self._play_context, transport=self.transport, inventory_name=self.get_task_var('inventory_hostname'), ) stack = self._stack_from_spec(spec) return spec.inventory_name(), stack def _connect_stack(self, stack): """ Pass `stack` to ContextService, requesting a copy of the context object representing the last tuple element. If no connection exists yet, ContextService will recursively establish it before returning it or throwing an error. See :meth:`ansible_mitogen.services.ContextService.get` docstring for description of the returned dictionary. """ try: dct = mitogen.service.call( call_context=self.binding.get_service_context(), service_name='ansible_mitogen.services.ContextService', method_name='get', stack=ansible_mitogen.utils.unsafe.cast(list(stack)), ) except mitogen.core.CallError: LOG.warning('Connection failed; stack configuration was:\n%s', pprint.pformat(stack)) raise if dct['msg']: if dct['method_name'] in self.become_methods: raise ansible.errors.AnsibleModuleError(dct['msg']) raise ansible.errors.AnsibleConnectionFailure(dct['msg']) self.context = dct['context'] self.chain = CallChain(self, self.context, pipelined=True) if self._play_context.become: self.login_context = dct['via'] else: self.login_context = self.context self.init_child_result = dct['init_child_result'] def get_good_temp_dir(self): """ Return the 'good temporary directory' as discovered by :func:`ansible_mitogen.target.init_child` immediately after ContextService constructed the target context. """ self._connect() return self.init_child_result['good_temp_dir'] def _connect(self): """ Establish a connection to the master process's UNIX listener socket, constructing a mitogen.master.Router to communicate with the master, and a mitogen.parent.Context to represent it. Depending on the original transport we should emulate, trigger one of the _connect_*() service calls defined above to cause the master process to establish the real connection on our behalf, or return a reference to the existing one. Ansible connection plugin method. """ # In some Ansible connection plugins this method returns self. # However nothing I've found uses it, it's not even assigned. if self.connected: return inventory_name, stack = self._build_stack() worker_model = ansible_mitogen.process.get_worker_model() self.binding = worker_model.get_binding( ansible_mitogen.utils.unsafe.cast(inventory_name) ) self._connect_stack(stack) def _put_connection(self): """ Forget everything we know about the connected context. This function cannot be called _reset() since that name is used as a public API by Ansible 2.4 wait_for_connection plug-in. """ if not self.context: return self.chain.reset() mitogen.service.call( call_context=self.binding.get_service_context(), service_name='ansible_mitogen.services.ContextService', method_name='put', context=self.context ) self.context = None self.login_context = None self.init_child_result = None self.chain = None def close(self): """ Arrange for the mitogen.master.Router running in the worker to gracefully shut down, and wait for shutdown to complete. Safe to call multiple times. Ansible connection plugin method. """ self._put_connection() if self.binding: self.binding.close() self.binding = None reset_compat_msg = ( 'Mitogen only supports "reset_connection" on Ansible 2.5.6 or later' ) def reset(self): """ Explicitly terminate the connection to the remote host. This discards any local state we hold for the connection, returns the Connection to the 'disconnected' state, and informs ContextService the connection is bad somehow, and should be shut down and discarded. Ansible connection plugin method. """ if self._play_context.remote_addr is None: # <2.5.6 incorrectly populate PlayContext for reset_connection # https://github.com/ansible/ansible/issues/27520 raise ansible.errors.AnsibleConnectionFailure( self.reset_compat_msg ) # Strategy's _execute_meta doesn't have an action obj but we'll need one for # running interpreter_discovery # will create a new temporary action obj for this purpose self._action = ansible_mitogen.mixins.ActionModuleMixin( task=0, connection=self, play_context=self._play_context, loader=0, templar=0, shared_loader_obj=0 ) # Clear out state in case we were ever connected. self.close() inventory_name, stack = self._build_stack() if self._play_context.become: stack = stack[:-1] worker_model = ansible_mitogen.process.get_worker_model() binding = worker_model.get_binding(inventory_name) try: mitogen.service.call( call_context=binding.get_service_context(), service_name='ansible_mitogen.services.ContextService', method_name='reset', stack=ansible_mitogen.utils.unsafe.cast(list(stack)), ) finally: binding.close() # Compatibility with Ansible 2.4 wait_for_connection plug-in. _reset = reset def get_chain(self, use_login=False, use_fork=False): """ Return the :class:`mitogen.parent.CallChain` to use for executing function calls. :param bool use_login: If :data:`True`, always return the chain for the login account rather than any active become user. :param bool use_fork: If :data:`True`, return the chain for the fork parent. :returns mitogen.parent.CallChain: """ self._connect() if use_login: return self.login_context.default_call_chain # See FORK_SUPPORTED comments in target.py. if use_fork and self.init_child_result['fork_context'] is not None: return self.init_child_result['fork_context'].default_call_chain return self.chain def spawn_isolated_child(self): """ Fork or launch a new child off the target context. :returns: mitogen.core.Context of the new child. """ return self.get_chain(use_fork=True).call( ansible_mitogen.target.spawn_isolated_child ) def get_extra_args(self): """ Overridden by connections/mitogen_kubectl.py to a list of additional arguments for the command. """ # TODO: maybe use this for SSH too. return [] def get_default_cwd(self): """ Overridden by connections/mitogen_local.py to emulate behaviour of CWD being fixed to that of ActionBase._loader.get_basedir(). """ return None def get_default_env(self): """ Overridden by connections/mitogen_local.py to emulate behaviour of WorkProcess environment inherited from WorkerProcess. """ return None def exec_command(self, cmd, in_data='', sudoable=True, mitogen_chdir=None): """ Implement exec_command() by calling the corresponding ansible_mitogen.target function in the target. :param str cmd: Shell command to execute. :param bytes in_data: Data to supply on ``stdin`` of the process. :returns: (return code, stdout bytes, stderr bytes) Ansible connection plugin method. """ emulate_tty = (not in_data and sudoable) rc, stdout, stderr = self.get_chain().call( ansible_mitogen.target.exec_command, cmd=ansible_mitogen.utils.unsafe.cast(cmd), in_data=ansible_mitogen.utils.unsafe.cast(in_data), chdir=mitogen_chdir or self.get_default_cwd(), emulate_tty=emulate_tty, ) stderr += b'Shared connection to %s closed.%s' % ( self._play_context.remote_addr.encode(), (b'\r\n' if emulate_tty else b'\n'), ) return rc, stdout, stderr def fetch_file(self, in_path, out_path): """ Implement fetch_file() by calling the corresponding ansible_mitogen.target function in the target. :param str in_path: Remote filesystem path to read. :param str out_path: Local filesystem path to write. Ansible connection plugin method. """ self._connect() ansible_mitogen.target.transfer_file( context=self.context, # in_path may be AnsibleUnicode in_path=ansible_mitogen.utils.unsafe.cast(in_path), out_path=out_path ) def put_data(self, out_path, data, mode=None, utimes=None): """ Implement put_file() by caling the corresponding ansible_mitogen.target function in the target, transferring small files inline. This is pipelined and will return immediately; failed transfers are reported as exceptions in subsequent functon calls. :param str out_path: Remote filesystem path to write. :param byte data: File contents to put. """ self.get_chain().call_no_reply( ansible_mitogen.target.write_path, ansible_mitogen.utils.unsafe.cast(out_path), mitogen.core.Blob(data), mode=mode, utimes=utimes, ) #: Maximum size of a small file before switching to streaming #: transfer. This should really be the same as #: mitogen.services.FileService.IO_SIZE, however the message format has #: slightly more overhead, so just randomly subtract 4KiB. SMALL_FILE_LIMIT = mitogen.core.CHUNK_SIZE - 4096 def _throw_io_error(self, e, path): if e.args[0] == errno.ENOENT: s = 'file or module does not exist: ' + path raise ansible.errors.AnsibleFileNotFound(s) def put_file(self, in_path, out_path): """ Implement put_file() by streamily transferring the file via FileService. :param str in_path: Local filesystem path to read. :param str out_path: Remote filesystem path to write. Ansible connection plugin method. """ try: st = os.stat(in_path) except OSError as e: self._throw_io_error(e, in_path) raise if not stat.S_ISREG(st.st_mode): raise IOError('%r is not a regular file.' % (in_path,)) # If the file is sufficiently small, just ship it in the argument list # rather than introducing an extra RTT for the child to request it from # FileService. if st.st_size <= self.SMALL_FILE_LIMIT: try: fp = open(in_path, 'rb') try: s = fp.read(self.SMALL_FILE_LIMIT + 1) finally: fp.close() except OSError as e: self._throw_io_error(e, in_path) raise # Ensure did not grow during read. if len(s) == st.st_size: return self.put_data(out_path, s, mode=st.st_mode, utimes=(st.st_atime, st.st_mtime)) self._connect() mitogen.service.call( call_context=self.binding.get_service_context(), service_name='mitogen.service.FileService', method_name='register', path=ansible_mitogen.utils.unsafe.cast(in_path) ) # For now this must remain synchronous, as the action plug-in may have # passed us a temporary file to transfer. A future FileService could # maintain an LRU list of open file descriptors to keep the temporary # file alive, but that requires more work. self.get_chain().call( ansible_mitogen.target.transfer_file, context=self.binding.get_child_service_context(), in_path=in_path, out_path=out_path ) mitogen-0.3.9/ansible_mitogen/loaders.py000066400000000000000000000074131465666473100203560ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. """ Stable names for PluginLoader instances across Ansible versions. """ from __future__ import absolute_import, division, print_function __metaclass__ = type import ansible.errors import ansible_mitogen.utils __all__ = [ 'action_loader', 'become_loader', 'connection_loader', 'module_loader', 'module_utils_loader', 'shell_loader', 'strategy_loader', ] ANSIBLE_VERSION_MIN = (2, 10) ANSIBLE_VERSION_MAX = (2, 17) NEW_VERSION_MSG = ( "Your Ansible version (%s) is too recent. The most recent version\n" "supported by Mitogen for Ansible is %s.x. Please check the Mitogen\n" "release notes to see if a new version is available, otherwise\n" "subscribe to the corresponding GitHub issue to be notified when\n" "support becomes available.\n" "\n" " https://mitogen.rtfd.io/en/latest/changelog.html\n" " https://github.com/mitogen-hq/mitogen/issues/\n" ) OLD_VERSION_MSG = ( "Your version of Ansible (%s) is too old. The oldest version supported by " "Mitogen for Ansible is %s." ) def assert_supported_release(): """ Throw AnsibleError with a descriptive message in case of being loaded into an unsupported Ansible release. """ v = ansible_mitogen.utils.ansible_version if v[:2] < ANSIBLE_VERSION_MIN: raise ansible.errors.AnsibleError( OLD_VERSION_MSG % (v, ANSIBLE_VERSION_MIN) ) if v[:2] > ANSIBLE_VERSION_MAX: raise ansible.errors.AnsibleError( NEW_VERSION_MSG % (v, ANSIBLE_VERSION_MAX) ) # this is the first file our strategy plugins import, so we need to check this here # in prior Ansible versions, connection_loader.get_with_context didn't exist, so if a user # is trying to load an old Ansible version, we'll fail and error gracefully assert_supported_release() from ansible.plugins.loader import action_loader from ansible.plugins.loader import become_loader from ansible.plugins.loader import connection_loader from ansible.plugins.loader import module_loader from ansible.plugins.loader import module_utils_loader from ansible.plugins.loader import shell_loader from ansible.plugins.loader import strategy_loader # These are original, unwrapped implementations action_loader__get = action_loader.get connection_loader__get = connection_loader.get_with_context mitogen-0.3.9/ansible_mitogen/logging.py000066400000000000000000000114741465666473100203550ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. from __future__ import absolute_import, division, print_function __metaclass__ = type import logging import os import mitogen.core import mitogen.utils try: from __main__ import display except ImportError: import ansible.utils.display display = ansible.utils.display.Display() #: The process name set via :func:`set_process_name`. _process_name = None #: The PID of the process that last called :func:`set_process_name`, so its #: value can be ignored in unknown fork children. _process_pid = None def set_process_name(name): """ Set a name to adorn log messages with. """ global _process_name _process_name = name global _process_pid _process_pid = os.getpid() class Handler(logging.Handler): """ Use Mitogen's log format, but send the result to a Display method. """ def __init__(self, normal_method): logging.Handler.__init__(self) self.formatter = mitogen.utils.log_get_formatter() self.normal_method = normal_method #: Set of target loggers that produce warnings and errors that spam the #: console needlessly. Their log level is forced to INFO. A better strategy #: may simply be to bury all target logs in DEBUG output, but not by #: overriding their log level as done here. NOISY_LOGGERS = frozenset([ 'dnf', # issue #272; warns when a package is already installed. 'boto', # issue #541; normal boto retry logic can cause ERROR logs. ]) def emit(self, record): mitogen_name = getattr(record, 'mitogen_name', '') if mitogen_name == 'stderr': record.levelno = logging.ERROR if mitogen_name in self.NOISY_LOGGERS and record.levelno >= logging.WARNING: record.levelno = logging.DEBUG if _process_pid == os.getpid(): process_name = _process_name else: process_name = '?' s = '[%-4s %d] %s' % (process_name, os.getpid(), self.format(record)) if record.levelno >= logging.ERROR: display.error(s, wrap_text=False) elif record.levelno >= logging.WARNING: display.warning(s, formatted=True) else: self.normal_method(s) def setup(): """ Install handlers for Mitogen loggers to redirect them into the Ansible display framework. Ansible installs its own logging framework handlers when C.DEFAULT_LOG_PATH is set, therefore disable propagation for our handlers. """ l_mitogen = logging.getLogger('mitogen') l_mitogen_io = logging.getLogger('mitogen.io') l_ansible_mitogen = logging.getLogger('ansible_mitogen') l_operon = logging.getLogger('operon') for logger in l_mitogen, l_mitogen_io, l_ansible_mitogen, l_operon: logger.handlers = [Handler(display.vvv)] logger.propagate = False if display.verbosity > 2: l_ansible_mitogen.setLevel(logging.DEBUG) l_mitogen.setLevel(logging.DEBUG) else: # Mitogen copies the active log level into new children, allowing them # to filter tiny messages before they hit the network, and therefore # before they wake the IO loop. Explicitly setting INFO saves ~4% # running against just the local machine. l_mitogen.setLevel(logging.ERROR) l_ansible_mitogen.setLevel(logging.ERROR) if display.verbosity > 3: l_mitogen_io.setLevel(logging.DEBUG) mitogen-0.3.9/ansible_mitogen/mixins.py000066400000000000000000000526531465666473100202420ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. from __future__ import absolute_import, division, print_function __metaclass__ = type import logging import os import pwd import random import traceback try: from shlex import quote as shlex_quote except ImportError: from pipes import quote as shlex_quote from ansible.module_utils._text import to_bytes from ansible.parsing.utils.jsonify import jsonify import ansible import ansible.constants import ansible.plugins import ansible.plugins.action import mitogen.core import mitogen.select import ansible_mitogen.connection import ansible_mitogen.planner import ansible_mitogen.target import ansible_mitogen.utils import ansible_mitogen.utils.unsafe from ansible.module_utils._text import to_text try: from ansible.utils.unsafe_proxy import wrap_var except ImportError: from ansible.vars.unsafe_proxy import wrap_var try: # ansible 2.8 moved remove_internal_keys to the clean module from ansible.vars.clean import remove_internal_keys except ImportError: try: from ansible.vars.manager import remove_internal_keys except ImportError: # ansible 2.3.3 has remove_internal_keys as a protected func on the action class # we'll fallback to calling self._remove_internal_keys in this case remove_internal_keys = lambda a: "Not found" LOG = logging.getLogger(__name__) class ActionModuleMixin(ansible.plugins.action.ActionBase): """ The Mitogen-patched PluginLoader dynamically mixes this into every action class that Ansible attempts to load. It exists to override all the assumptions built into the base action class that should really belong in some middle layer, or at least in the connection layer. Functionality is defined here for: * Capturing the final set of task variables and giving Connection a chance to update its idea of the correct execution environment, before any attempt is made to call a Connection method. While it's not expected for the interpreter to change on a per-task basis, Ansible permits this, and so it must be supported. * Overriding lots of methods that try to call out to shell for mundane reasons, such as copying files around, changing file permissions, creating temporary directories and suchlike. * Short-circuiting any use of Ansiballz or related code for executing a module remotely using shell commands and SSH. * Short-circuiting most of the logic in dealing with the fact that Ansible always runs become: tasks across at least the SSH user account and the destination user account, and handling the security permission issues that crop up due to this. Mitogen always runs a task completely within the target user account, so it's not a problem for us. """ def __init__(self, task, connection, *args, **kwargs): """ Verify the received connection is really a Mitogen connection. If not, transmute this instance back into the original unadorned base class. This allows running the Mitogen strategy in mixed-target playbooks, where some targets use SSH while others use WinRM or some fancier UNIX connection plug-in. That's because when the Mitogen strategy is active, ActionModuleMixin is unconditionally mixed into any action module that is instantiated, and there is no direct way for the monkey-patch to know what kind of connection will be used upfront. """ super(ActionModuleMixin, self).__init__(task, connection, *args, **kwargs) if not isinstance(connection, ansible_mitogen.connection.Connection): _, self.__class__ = type(self).__bases__ # required for python interpreter discovery connection.templar = self._templar self._finding_python_interpreter = False self._rediscovered_python = False # redeclaring interpreter discovery vars here in case running ansible < 2.8.0 self._discovered_interpreter_key = None self._discovered_interpreter = False self._discovery_deprecation_warnings = [] self._discovery_warnings = [] def run(self, tmp=None, task_vars=None): """ Override run() to notify Connection of task-specific data, so it has a chance to know e.g. the Python interpreter in use. """ self._connection.on_action_run( task_vars=task_vars, delegate_to_hostname=self._task.delegate_to, loader_basedir=self._loader.get_basedir(), ) return super(ActionModuleMixin, self).run(tmp, task_vars) COMMAND_RESULT = { 'rc': 0, 'stdout': '', 'stdout_lines': [], 'stderr': '' } def fake_shell(self, func, stdout=False): """ Execute a function and decorate its return value in the style of _low_level_execute_command(). This produces a return value that looks like some shell command was run, when really func() was implemented entirely in Python. If the function raises :py:class:`mitogen.core.CallError`, this will be translated into a failed shell command with a non-zero exit status. :param func: Function invoked as `func()`. :returns: See :py:attr:`COMMAND_RESULT`. """ dct = self.COMMAND_RESULT.copy() try: rc = func() if stdout: dct['stdout'] = repr(rc) except mitogen.core.CallError: LOG.exception('While emulating a shell command') dct['rc'] = 1 dct['stderr'] = traceback.format_exc() return dct def _remote_file_exists(self, path): """ Determine if `path` exists by directly invoking os.path.exists() in the target user account. """ LOG.debug('_remote_file_exists(%r)', path) return self._connection.get_chain().call( ansible_mitogen.target.file_exists, ansible_mitogen.utils.unsafe.cast(path) ) def _configure_module(self, module_name, module_args, task_vars=None): """ Mitogen does not use the Ansiballz framework. This call should never happen when ActionMixin is active, so crash if it does. """ assert False, "_configure_module() should never be called." def _is_pipelining_enabled(self, module_style, wrap_async=False): """ Mitogen does not use SSH pipelining. This call should never happen when ActionMixin is active, so crash if it does. """ assert False, "_is_pipelining_enabled() should never be called." def _generate_tmp_path(self): return os.path.join( self._connection.get_good_temp_dir(), 'ansible_mitogen_action_%016x' % ( random.getrandbits(8*8), ) ) def _make_tmp_path(self, remote_user=None): """ Create a temporary subdirectory as a child of the temporary directory managed by the remote interpreter. """ LOG.debug('_make_tmp_path(remote_user=%r)', remote_user) path = self._generate_tmp_path() LOG.debug('Temporary directory: %r', path) self._connection.get_chain().call_no_reply(os.mkdir, path) self._connection._shell.tmpdir = path return path def _remove_tmp_path(self, tmp_path): """ Replace the base implementation's invocation of rm -rf, replacing it with a pipelined call to :func:`ansible_mitogen.target.prune_tree`. """ LOG.debug('_remove_tmp_path(%r)', tmp_path) if tmp_path is None and ansible_mitogen.utils.ansible_version[:2] >= (2, 6): tmp_path = self._connection._shell.tmpdir # 06f73ad578d if tmp_path is not None: self._connection.get_chain().call_no_reply( ansible_mitogen.target.prune_tree, tmp_path, ) self._connection._shell.tmpdir = None def _transfer_data(self, remote_path, data): """ Used by the base _execute_module(), and in <2.4 also by the template action module, and probably others. """ if isinstance(data, dict): data = jsonify(data) if not isinstance(data, bytes): data = to_bytes(data, errors='surrogate_or_strict') LOG.debug('_transfer_data(%r, %s ..%d bytes)', remote_path, type(data), len(data)) self._connection.put_data(remote_path, data) return remote_path #: Actions listed here cause :func:`_fixup_perms2` to avoid a needless #: roundtrip, as they modify file modes separately afterwards. This is due #: to the method prototype having a default of `execute=True`. FIXUP_PERMS_RED_HERRING = set(['copy']) def _fixup_perms2(self, remote_paths, remote_user=None, execute=True): """ Mitogen always executes ActionBase helper methods in the context of the target user account, so it is never necessary to modify permissions except to ensure the execute bit is set if requested. """ LOG.debug('_fixup_perms2(%r, remote_user=%r, execute=%r)', remote_paths, remote_user, execute) if execute and self._task.action not in self.FIXUP_PERMS_RED_HERRING: return self._remote_chmod(remote_paths, mode='u+x') return self.COMMAND_RESULT.copy() def _remote_chmod(self, paths, mode, sudoable=False): """ Issue an asynchronous set_file_mode() call for every path in `paths`, then format the resulting return value list with fake_shell(). """ LOG.debug('_remote_chmod(%r, mode=%r, sudoable=%r)', paths, mode, sudoable) return self.fake_shell(lambda: mitogen.select.Select.all( self._connection.get_chain().call_async( ansible_mitogen.target.set_file_mode, path, mode ) for path in paths )) def _remote_chown(self, paths, user, sudoable=False): """ Issue an asynchronous os.chown() call for every path in `paths`, then format the resulting return value list with fake_shell(). """ LOG.debug('_remote_chown(%r, user=%r, sudoable=%r)', paths, user, sudoable) ent = self._connection.get_chain().call(pwd.getpwnam, user) return self.fake_shell(lambda: mitogen.select.Select.all( self._connection.get_chain().call_async( os.chown, path, ent.pw_uid, ent.pw_gid ) for path in paths )) def _remote_expand_user(self, path, sudoable=True): """ Replace the base implementation's attempt to emulate os.path.expanduser() with an actual call to os.path.expanduser(). :param bool sudoable: If :data:`True`, indicate unqualified tilde ("~" with no username) should be evaluated in the context of the login account, not any become_user. """ LOG.debug('_remote_expand_user(%r, sudoable=%r)', path, sudoable) if not path.startswith('~'): # /home/foo -> /home/foo return path if sudoable or not self._play_context.become: if path == '~': # ~ -> /home/dmw return self._connection.homedir if path.startswith('~/'): # ~/.ansible -> /home/dmw/.ansible return os.path.join(self._connection.homedir, path[2:]) # ~root/.ansible -> /root/.ansible return self._connection.get_chain(use_login=(not sudoable)).call( os.path.expanduser, ansible_mitogen.utils.unsafe.cast(path), ) def get_task_timeout_secs(self): """ Return the task "async:" value, portable across 2.4-2.5. """ try: return self._task.async_val except AttributeError: return getattr(self._task, 'async') def _set_temp_file_args(self, module_args, wrap_async): # Ansible>2.5 module_utils reuses the action's temporary directory if # one exists. Older versions error if this key is present. if ansible_mitogen.utils.ansible_version[:2] >= (2, 5): if wrap_async: # Sharing is not possible with async tasks, as in that case, # the directory must outlive the action plug-in. module_args['_ansible_tmpdir'] = None else: module_args['_ansible_tmpdir'] = self._connection._shell.tmpdir # If _ansible_tmpdir is unset, Ansible>2.6 module_utils will use # _ansible_remote_tmp as the location to create the module's temporary # directory. Older versions error if this key is present. if ansible_mitogen.utils.ansible_version[:2] >= (2, 6): module_args['_ansible_remote_tmp'] = ( self._connection.get_good_temp_dir() ) def _execute_module(self, module_name=None, module_args=None, tmp=None, task_vars=None, persist_files=False, delete_remote_tmp=True, wrap_async=False, ignore_unknown_opts=False, ): """ Collect up a module's execution environment then use it to invoke target.run_module() or helpers.run_module_async() in the target context. """ if module_name is None: module_name = self._task.action if module_args is None: module_args = self._task.args if task_vars is None: task_vars = {} if ansible_mitogen.utils.ansible_version[:2] >= (2, 17): self._update_module_args( module_name, module_args, task_vars, ignore_unknown_opts=ignore_unknown_opts, ) else: self._update_module_args(module_name, module_args, task_vars) env = {} self._compute_environment_string(env) self._set_temp_file_args(module_args, wrap_async) # there's a case where if a task shuts down the node and then immediately calls # wait_for_connection, the `ping` test from Ansible won't pass because we lost connection # clearing out context forces a reconnect # see https://github.com/dw/mitogen/issues/655 and Ansible's `wait_for_connection` module for more info if module_name == 'ansible.legacy.ping' and type(self).__name__ == 'wait_for_connection': self._connection.context = None self._connection._connect() result = ansible_mitogen.planner.invoke( ansible_mitogen.planner.Invocation( action=self, connection=self._connection, module_name=ansible_mitogen.utils.unsafe.cast(mitogen.core.to_text(module_name)), module_args=ansible_mitogen.utils.unsafe.cast(module_args), task_vars=task_vars, templar=self._templar, env=ansible_mitogen.utils.unsafe.cast(env), wrap_async=wrap_async, timeout_secs=self.get_task_timeout_secs(), ) ) if tmp and delete_remote_tmp and ansible_mitogen.utils.ansible_version[:2] < (2, 5): # Built-in actions expected tmpdir to be cleaned up automatically # on _execute_module(). self._remove_tmp_path(tmp) # prevents things like discovered_interpreter_* or ansible_discovered_interpreter_* from being set # handle ansible 2.3.3 that has remove_internal_keys in a different place check = remove_internal_keys(result) if check == 'Not found': self._remove_internal_keys(result) # taken from _execute_module of ansible 2.8.6 # propagate interpreter discovery results back to the controller if self._discovered_interpreter_key: if result.get('ansible_facts') is None: result['ansible_facts'] = {} # only cache discovered_interpreter if we're not running a rediscovery # rediscovery happens in places like docker connections that could have different # python interpreters than the main host if not self._rediscovered_python: result['ansible_facts'][self._discovered_interpreter_key] = self._discovered_interpreter if self._discovery_warnings: if result.get('warnings') is None: result['warnings'] = [] result['warnings'].extend(self._discovery_warnings) if self._discovery_deprecation_warnings: if result.get('deprecations') is None: result['deprecations'] = [] result['deprecations'].extend(self._discovery_deprecation_warnings) return wrap_var(result) def _postprocess_response(self, result): """ Apply fixups mimicking ActionBase._execute_module(); this is copied verbatim from action/__init__.py, the guts of _parse_returned_data are garbage and should be removed or reimplemented once tests exist. :param dict result: Dictionary with format:: { "rc": int, "stdout": "stdout data", "stderr": "stderr data" } """ data = self._parse_returned_data(result) # Cutpasted from the base implementation. if 'stdout' in data and 'stdout_lines' not in data: data['stdout_lines'] = (data['stdout'] or u'').splitlines() if 'stderr' in data and 'stderr_lines' not in data: data['stderr_lines'] = (data['stderr'] or u'').splitlines() return data def _low_level_execute_command(self, cmd, sudoable=True, in_data=None, executable=None, encoding_errors='surrogate_then_replace', chdir=None): """ Override the base implementation by simply calling target.exec_command() in the target context. """ LOG.debug('_low_level_execute_command(%r, in_data=%r, exe=%r, dir=%r)', cmd, type(in_data), executable, chdir) if executable is None: # executable defaults to False executable = self._play_context.executable if executable: cmd = executable + ' -c ' + shlex_quote(cmd) # TODO: HACK: if finding python interpreter then we need to keep # calling exec_command until we run into the right python we'll use # chicken-and-egg issue, mitogen needs a python to run low_level_execute_command # which is required by Ansible's discover_interpreter function if self._finding_python_interpreter: possible_pythons = [ '/usr/bin/python', 'python3', 'python3.7', 'python3.6', 'python3.5', 'python2.7', 'python2.6', '/usr/libexec/platform-python', '/usr/bin/python3', 'python' ] else: # not used, just adding a filler value possible_pythons = ['python'] def _run_cmd(): return self._connection.exec_command( cmd=cmd, in_data=in_data, sudoable=sudoable, mitogen_chdir=chdir, ) for possible_python in possible_pythons: try: self._possible_python_interpreter = possible_python rc, stdout, stderr = _run_cmd() # TODO: what exception is thrown? except: # we've reached the last python attempted and failed # TODO: could use enumerate(), need to check which version of python first had it though if possible_python == 'python': raise else: continue stdout_text = to_text(stdout, errors=encoding_errors) return { 'rc': rc, 'stdout': stdout_text, 'stdout_lines': stdout_text.splitlines(), 'stderr': stderr, } mitogen-0.3.9/ansible_mitogen/module_finder.py000066400000000000000000000225641465666473100215450ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. from __future__ import absolute_import, division, print_function from __future__ import unicode_literals __metaclass__ = type import collections import logging import os import re import sys try: # Python >= 3.4, PEP 451 ModuleSpec API import importlib.machinery import importlib.util except ImportError: # Python < 3.4, PEP 302 Import Hooks import imp import mitogen.master LOG = logging.getLogger(__name__) PREFIX = 'ansible.module_utils.' # Analog of `importlib.machinery.ModuleSpec` or `pkgutil.ModuleInfo`. # name Unqualified name of the module. # path Filesystem path of the module. # kind One of the constants in `imp`, as returned in `imp.find_module()` # parent `ansible_mitogen.module_finder.Module` of parent package (if any). Module = collections.namedtuple('Module', 'name path kind parent') def get_fullname(module): """ Reconstruct a Module's canonical path by recursing through its parents. """ bits = [str(module.name)] while module.parent: bits.append(str(module.parent.name)) module = module.parent return '.'.join(reversed(bits)) def get_code(module): """ Compile and return a Module's code object. """ fp = open(module.path, 'rb') try: return compile(fp.read(), str(module.name), 'exec') finally: fp.close() def is_pkg(module): """ Return :data:`True` if a Module represents a package. """ return module.kind == imp.PKG_DIRECTORY def find(name, path=(), parent=None): """ Return a Module instance describing the first matching module found on the search path. :param str name: Module name. :param list path: List of directory names to search for the module. :param Module parent: Optional module parent. """ assert isinstance(path, tuple) head, _, tail = name.partition('.') try: tup = imp.find_module(head, list(path)) except ImportError: return parent fp, modpath, (suffix, mode, kind) = tup if fp: fp.close() if parent and modpath == parent.path: # 'from timeout import timeout', where 'timeout' is a function but also # the name of the module being imported. return None if kind == imp.PKG_DIRECTORY: modpath = os.path.join(modpath, '__init__.py') module = Module(head, modpath, kind, parent) # TODO: this code is entirely wrong on Python 3.x, but works well enough # for Ansible. We need a new find_child() that only looks in the package # directory, never falling back to the parent search path. if tail and kind == imp.PKG_DIRECTORY: return find_relative(module, tail, path) return module def find_relative(parent, name, path=()): if parent.kind == imp.PKG_DIRECTORY: path = (os.path.dirname(parent.path),) + path return find(name, path, parent=parent) def scan_fromlist(code): """Return an iterator of (level, name) for explicit imports in a code object. Not all names identify a module. `from os import name, path` generates `(0, 'os.name'), (0, 'os.path')`, but `os.name` is usually a string. >>> src = 'import a; import b.c; from d.e import f; from g import h, i\\n' >>> code = compile(src, '', 'exec') >>> list(scan_fromlist(code)) [(0, 'a'), (0, 'b.c'), (0, 'd.e.f'), (0, 'g.h'), (0, 'g.i')] """ for level, modname_s, fromlist in mitogen.master.scan_code_imports(code): for name in fromlist: yield level, str('%s.%s' % (modname_s, name)) if not fromlist: yield level, modname_s def walk_imports(code, prefix=None): """Return an iterator of names for implicit parent imports & explicit imports in a code object. If a prefix is provided, then only children of that prefix are included. Not all names identify a module. `from os import name, path` generates `'os', 'os.name', 'os.path'`, but `os.name` is usually a string. >>> source = 'import a; import b; import b.c; from b.d import e, f\\n' >>> code = compile(source, '', 'exec') >>> list(walk_imports(code)) ['a', 'b', 'b', 'b.c', 'b', 'b.d', 'b.d.e', 'b.d.f'] >>> list(walk_imports(code, prefix='b')) ['b.c', 'b.d', 'b.d.e', 'b.d.f'] """ if prefix is None: prefix = '' pattern = re.compile(r'(^|\.)(\w+)') start = len(prefix) for _, name, fromlist in mitogen.master.scan_code_imports(code): if not name.startswith(prefix): continue for match in pattern.finditer(name, start): yield name[:match.end()] for leaf in fromlist: yield str('%s.%s' % (name, leaf)) def scan(module_name, module_path, search_path): # type: (str, str, list[str]) -> list[(str, str, bool)] """Return a list of (name, path, is_package) for ansible.module_utils imports used by an Ansible module. """ log = LOG.getChild('scan') log.debug('%r, %r, %r', module_name, module_path, search_path) if sys.version_info >= (3, 4): result = _scan_importlib_find_spec( module_name, module_path, search_path, ) log.debug('_scan_importlib_find_spec %r', result) else: result = _scan_imp_find_module(module_name, module_path, search_path) log.debug('_scan_imp_find_module %r', result) return result def _scan_importlib_find_spec(module_name, module_path, search_path): # type: (str, str, list[str]) -> list[(str, str, bool)] module = importlib.machinery.ModuleSpec( module_name, loader=None, origin=module_path, ) prefix = importlib.machinery.ModuleSpec( PREFIX.rstrip('.'), loader=None, ) prefix.submodule_search_locations = search_path queue = collections.deque([module]) specs = {prefix.name: prefix} while queue: spec = queue.popleft() if spec.origin is None: continue try: with open(spec.origin, 'rb') as f: code = compile(f.read(), spec.name, 'exec') except Exception as exc: raise ValueError((exc, module, spec, specs)) for name in walk_imports(code, prefix.name): if name in specs: continue parent_name = name.rpartition('.')[0] parent = specs[parent_name] if parent is None or not parent.submodule_search_locations: specs[name] = None continue child = importlib.util._find_spec( name, parent.submodule_search_locations, ) if child is None or child.origin is None: specs[name] = None continue specs[name] = child queue.append(child) del specs[prefix.name] return sorted( (spec.name, spec.origin, spec.submodule_search_locations is not None) for spec in specs.values() if spec is not None ) def _scan_imp_find_module(module_name, module_path, search_path): # type: (str, str, list[str]) -> list[(str, str, bool)] module = Module(module_name, module_path, imp.PY_SOURCE, None) stack = [module] seen = set() while stack: module = stack.pop(0) for level, fromname in scan_fromlist(get_code(module)): if not fromname.startswith(PREFIX): continue imported = find(fromname[len(PREFIX):], search_path) if imported is None or imported in seen: continue seen.add(imported) stack.append(imported) parent = imported.parent while parent: fullname = get_fullname(parent) module = Module(fullname, parent.path, parent.kind, None) if module not in seen: seen.add(module) stack.append(module) parent = parent.parent return sorted( (PREFIX + get_fullname(module), module.path, is_pkg(module)) for module in seen ) mitogen-0.3.9/ansible_mitogen/parsing.py000066400000000000000000000060621465666473100203670ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. from __future__ import absolute_import, division, print_function from __future__ import unicode_literals __metaclass__ = type import mitogen.core def parse_script_interpreter(source): """ Parse the script interpreter portion of a UNIX hashbang using the rules Linux uses. :param str source: String like "/usr/bin/env python". :returns: Tuple of `(interpreter, arg)`, where `intepreter` is the script interpreter and `arg` is its sole argument if present, otherwise :py:data:`None`. """ # Find terminating newline. Assume last byte of binprm_buf if absent. nl = source.find(b'\n', 0, 128) if nl == -1: nl = min(128, len(source)) # Split once on the first run of whitespace. If no whitespace exists, # bits just contains the interpreter filename. bits = source[0:nl].strip().split(None, 1) if len(bits) == 1: return mitogen.core.to_text(bits[0]), None return mitogen.core.to_text(bits[0]), mitogen.core.to_text(bits[1]) def parse_hashbang(source): """ Parse a UNIX "hashbang line" using the syntax supported by Linux. :param str source: String like "#!/usr/bin/env python". :returns: Tuple of `(interpreter, arg)`, where `intepreter` is the script interpreter and `arg` is its sole argument if present, otherwise :py:data:`None`. """ # Linux requires first 2 bytes with no whitespace, pretty sure it's the # same everywhere. See binfmt_script.c. if not source.startswith(b'#!'): return None, None return parse_script_interpreter(source[2:]) mitogen-0.3.9/ansible_mitogen/planner.py000066400000000000000000000542661465666473100203740ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. """ Classes to detect each case from [0] and prepare arguments necessary for the corresponding Runner class within the target, including preloading requisite files/modules known missing. [0] "Ansible Module Architecture", developing_program_flow_modules.html """ from __future__ import absolute_import, division, print_function from __future__ import unicode_literals __metaclass__ = type import json import logging import os import random import re import ansible.collections.list import ansible.errors import ansible.executor.module_common import mitogen.core import mitogen.select import ansible_mitogen.loaders import ansible_mitogen.parsing import ansible_mitogen.target import ansible_mitogen.utils.unsafe LOG = logging.getLogger(__name__) NO_METHOD_MSG = 'Mitogen: no invocation method found for: ' NO_INTERPRETER_MSG = 'module (%s) is missing interpreter line' # NOTE: Ansible 2.10 no longer has a `.` at the end of NO_MODULE_MSG error NO_MODULE_MSG = 'The module %s was not found in configured module paths' _planner_by_path = {} class Invocation(object): """ Collect up a module's execution environment then use it to invoke target.run_module() or helpers.run_module_async() in the target context. """ def __init__(self, action, connection, module_name, module_args, task_vars, templar, env, wrap_async, timeout_secs): #: ActionBase instance invoking the module. Required to access some #: output postprocessing methods that don't belong in ActionBase at #: all. self.action = action #: Ansible connection to use to contact the target. Must be an #: ansible_mitogen connection. self.connection = connection #: Name of the module ('command', 'shell', etc.) to execute. self.module_name = module_name #: Final module arguments. self.module_args = module_args #: Task variables, needed to extract ansible_*_interpreter. self.task_vars = task_vars #: Templar, needed to extract ansible_*_interpreter. self.templar = templar #: Final module environment. self.env = env #: Boolean, if :py:data:`True`, launch the module asynchronously. self.wrap_async = wrap_async #: Integer, if >0, limit the time an asynchronous job may run for. self.timeout_secs = timeout_secs #: Initially ``None``, but set by :func:`invoke`. The path on the #: master to the module's implementation file. self.module_path = None #: Initially ``None``, but set by :func:`invoke`. The raw source or #: binary contents of the module. self._module_source = None #: Initially ``{}``, but set by :func:`invoke`. Optional source to send #: to :func:`propagate_paths_and_modules` to fix Python3.5 relative import errors self._overridden_sources = {} #: Initially ``set()``, but set by :func:`invoke`. Optional source paths to send #: to :func:`propagate_paths_and_modules` to handle loading source dependencies from #: places outside of the main source path, such as collections self._extra_sys_paths = set() def get_module_source(self): if self._module_source is None: self._module_source = read_file(self.module_path) return self._module_source def __repr__(self): return 'Invocation(module_name=%s)' % (self.module_name,) class Planner(object): """ A Planner receives a module name and the contents of its implementation file, indicates whether or not it understands how to run the module, and exports a method to run the module. """ def __init__(self, invocation): self._inv = invocation @classmethod def detect(cls, path, source): """ Return true if the supplied `invocation` matches the module type implemented by this planner. """ raise NotImplementedError() def should_fork(self): """ Asynchronous tasks must always be forked. """ return self._inv.wrap_async def get_push_files(self): """ Return a list of files that should be propagated to the target context using PushFileService. The default implementation pushes nothing. """ return [] def get_module_deps(self): """ Return a list of the Python module names imported by the module. """ return [] def get_kwargs(self, **kwargs): """ If :meth:`detect` returned :data:`True`, plan for the module's execution, including granting access to or delivering any files to it that are known to be absent, and finally return a dict:: { # Name of the class from runners.py that implements the # target-side execution of this module type. "runner_name": "...", # Remaining keys are passed to the constructor of the class # named by `runner_name`. } """ binding = self._inv.connection.get_binding() new = dict((mitogen.core.UnicodeType(k), kwargs[k]) for k in kwargs) new.setdefault('good_temp_dir', self._inv.connection.get_good_temp_dir()) new.setdefault('cwd', self._inv.connection.get_default_cwd()) new.setdefault('extra_env', self._inv.connection.get_default_env()) new.setdefault('emulate_tty', True) new.setdefault('service_context', binding.get_child_service_context()) return new def __repr__(self): return '%s()' % (type(self).__name__,) class BinaryPlanner(Planner): """ Binary modules take their arguments and will return data to Ansible in the same way as want JSON modules. """ runner_name = 'BinaryRunner' @classmethod def detect(cls, path, source): return ansible.executor.module_common._is_binary(source) def get_push_files(self): return [mitogen.core.to_text(self._inv.module_path)] def get_kwargs(self, **kwargs): return super(BinaryPlanner, self).get_kwargs( runner_name=self.runner_name, module=self._inv.module_name, path=self._inv.module_path, json_args=json.dumps(self._inv.module_args), env=self._inv.env, **kwargs ) class ScriptPlanner(BinaryPlanner): """ Common functionality for script module planners -- handle interpreter detection and rewrite. """ def _rewrite_interpreter(self, path): """ Given the interpreter path (from the script's hashbang line), return the desired interpreter path. This tries, in order 1. Look up & render the `ansible_*_interpreter` variable, if set 2. Look up the `discovered_interpreter_*` fact, if present 3. The unmodified path from the hashbang line. :param str path: Absolute path to original interpreter (e.g. '/usr/bin/python'). :returns: Shell fragment prefix used to execute the script via "/bin/sh -c". While `ansible_*_interpreter` documentation suggests shell isn't involved here, the vanilla implementation uses it and that use is exploited in common playbooks. """ interpreter_name = os.path.basename(path).strip() key = u'ansible_%s_interpreter' % interpreter_name try: template = self._inv.task_vars[key] except KeyError: pass else: configured_interpreter = self._inv.templar.template(template) return ansible_mitogen.utils.unsafe.cast(configured_interpreter) key = u'discovered_interpreter_%s' % interpreter_name try: discovered_interpreter = self._inv.task_vars['ansible_facts'][key] except KeyError: pass else: return ansible_mitogen.utils.unsafe.cast(discovered_interpreter) return path def _get_interpreter(self): path, arg = ansible_mitogen.parsing.parse_hashbang( self._inv.get_module_source() ) if path is None: raise ansible.errors.AnsibleError(NO_INTERPRETER_MSG % ( self._inv.module_name, )) fragment = self._rewrite_interpreter(path) if arg: fragment += ' ' + arg is_python = path.startswith('python') return fragment, is_python def get_kwargs(self, **kwargs): interpreter_fragment, is_python = self._get_interpreter() return super(ScriptPlanner, self).get_kwargs( interpreter_fragment=interpreter_fragment, is_python=is_python, **kwargs ) class JsonArgsPlanner(ScriptPlanner): """ Script that has its interpreter directive and the task arguments substituted into its source as a JSON string. """ runner_name = 'JsonArgsRunner' @classmethod def detect(cls, path, source): return ansible.executor.module_common.REPLACER_JSONARGS in source class WantJsonPlanner(ScriptPlanner): """ If a module has the string WANT_JSON in it anywhere, Ansible treats it as a non-native module that accepts a filename as its only command line parameter. The filename is for a temporary file containing a JSON string containing the module's parameters. The module needs to open the file, read and parse the parameters, operate on the data, and print its return data as a JSON encoded dictionary to stdout before exiting. These types of modules are self-contained entities. As of Ansible 2.1, Ansible only modifies them to change a shebang line if present. """ runner_name = 'WantJsonRunner' @classmethod def detect(cls, path, source): return b'WANT_JSON' in source class NewStylePlanner(ScriptPlanner): """ The Ansiballz framework differs from module replacer in that it uses real Python imports of things in ansible/module_utils instead of merely preprocessing the module. """ runner_name = 'NewStyleRunner' MARKER = re.compile(br'from ansible(?:_collections|\.module_utils)\.') @classmethod def detect(cls, path, source): return cls.MARKER.search(source) is not None def _get_interpreter(self): return None, None def get_push_files(self): return super(NewStylePlanner, self).get_push_files() + [ mitogen.core.to_text(path) for fullname, path, is_pkg in self.get_module_map()['custom'] ] def get_module_deps(self): return self.get_module_map()['builtin'] #: Module names appearing in this set always require forking, usually due #: to some terminal leakage that cannot be worked around in any sane #: manner. ALWAYS_FORK_MODULES = frozenset([ 'dnf', # issue #280; py-dnf/hawkey need therapy 'firewalld', # issue #570: ansible module_utils caches dbus conn 'ansible.legacy.dnf', # issue #776 'ansible.builtin.dnf', # issue #832 ]) def should_fork(self): """ In addition to asynchronous tasks, new-style modules should be forked if: * the user specifies mitogen_task_isolation=fork, or * the new-style module has a custom module search path, or * the module is known to leak like a sieve. """ return ( super(NewStylePlanner, self).should_fork() or (self._inv.task_vars.get('mitogen_task_isolation') == 'fork') or (self._inv.module_name in self.ALWAYS_FORK_MODULES) or (len(self.get_module_map()['custom']) > 0) ) def get_search_path(self): return tuple( path for path in ansible_mitogen.loaders.module_utils_loader._get_paths( subdirs=False ) ) _module_map = None def get_module_map(self): if self._module_map is None: binding = self._inv.connection.get_binding() self._module_map = mitogen.service.call( call_context=binding.get_service_context(), service_name='ansible_mitogen.services.ModuleDepService', method_name='scan', module_name='ansible_module_%s' % (self._inv.module_name,), module_path=self._inv.module_path, search_path=self.get_search_path(), builtin_path=ansible.executor.module_common._MODULE_UTILS_PATH, context=self._inv.connection.context, ) return self._module_map def get_kwargs(self): return super(NewStylePlanner, self).get_kwargs( module_map=self.get_module_map(), py_module_name=py_modname_from_path( self._inv.module_name, self._inv.module_path, ), ) class ReplacerPlanner(NewStylePlanner): """ The Module Replacer framework is the original framework implementing new-style modules. It is essentially a preprocessor (like the C Preprocessor for those familiar with that programming language). It does straight substitutions of specific substring patterns in the module file. There are two types of substitutions. * Replacements that only happen in the module file. These are public replacement strings that modules can utilize to get helpful boilerplate or access to arguments. "from ansible.module_utils.MOD_LIB_NAME import *" is replaced with the contents of the ansible/module_utils/MOD_LIB_NAME.py. These should only be used with new-style Python modules. "#<>" is equivalent to "from ansible.module_utils.basic import *" and should also only apply to new-style Python modules. "# POWERSHELL_COMMON" substitutes the contents of "ansible/module_utils/powershell.ps1". It should only be used with new-style Powershell modules. """ runner_name = 'ReplacerRunner' @classmethod def detect(cls, path, source): return ansible.executor.module_common.REPLACER in source class OldStylePlanner(ScriptPlanner): runner_name = 'OldStyleRunner' @classmethod def detect(cls, path, source): # Everything else. return True _planners = [ BinaryPlanner, # ReplacerPlanner, NewStylePlanner, JsonArgsPlanner, WantJsonPlanner, OldStylePlanner, ] def py_modname_from_path(name, path): """ Fetch the logical name of a new-style module as it might appear in :data:`sys.modules` of the target's Python interpreter. * Since Ansible 2.9, modules appearing within a package have the original package hierarchy approximated on the target, enabling relative imports to function correctly. For example, "ansible.modules.system.setup". """ try: return ansible.executor.module_common._get_ansible_module_fqn(path) except AttributeError: pass except ValueError: pass return 'ansible.modules.' + name def read_file(path): fd = os.open(path, os.O_RDONLY) try: bits = [] chunk = True while True: chunk = os.read(fd, 65536) if not chunk: break bits.append(chunk) finally: os.close(fd) return mitogen.core.b('').join(bits) def _propagate_deps(invocation, planner, context): binding = invocation.connection.get_binding() mitogen.service.call( call_context=binding.get_service_context(), service_name='mitogen.service.PushFileService', method_name='propagate_paths_and_modules', context=context, paths=planner.get_push_files(), # modules=planner.get_module_deps(), TODO overridden_sources=invocation._overridden_sources, # needs to be a list because can't unpickle() a set() extra_sys_paths=list(invocation._extra_sys_paths), ) def _invoke_async_task(invocation, planner): job_id = '%016x' % random.randint(0, 2**64) context = invocation.connection.spawn_isolated_child() _propagate_deps(invocation, planner, context) with mitogen.core.Receiver(context.router) as started_recv: call_recv = context.call_async( ansible_mitogen.target.run_module_async, job_id=job_id, timeout_secs=invocation.timeout_secs, started_sender=started_recv.to_sender(), kwargs=planner.get_kwargs(), ) # Wait for run_module_async() to crash, or for AsyncRunner to indicate # the job file has been written. for msg in mitogen.select.Select([started_recv, call_recv]): if msg.receiver is call_recv: # It can only be an exception. raise msg.unpickle() break return { 'stdout': json.dumps({ # modules/utilities/logic/async_wrapper.py::_run_module(). 'changed': True, 'started': 1, 'finished': 0, 'ansible_job_id': job_id, }) } def _invoke_isolated_task(invocation, planner): context = invocation.connection.spawn_isolated_child() _propagate_deps(invocation, planner, context) try: return context.call( ansible_mitogen.target.run_module, kwargs=planner.get_kwargs(), ) finally: context.shutdown() def _get_planner(invocation, source): for klass in _planners: if klass.detect(invocation.module_path, source): LOG.debug( '%r accepted %r (filename %r)', klass, invocation.module_name, invocation.module_path, ) return klass LOG.debug('%r rejected %r', klass, invocation.module_name) raise ansible.errors.AnsibleError(NO_METHOD_MSG + repr(invocation)) def _fix_py35(invocation, module_source): """ super edge case with a relative import error in Python 3.5.1-3.5.3 in Ansible's setup module when using Mitogen https://github.com/dw/mitogen/issues/672#issuecomment-636408833 We replace a relative import in the setup module with the actual full file path This works in vanilla Ansible but not in Mitogen otherwise """ if invocation.module_name in {'ansible.builtin.setup', 'ansible.legacy.setup', 'setup'} and \ invocation.module_path not in invocation._overridden_sources: # in-memory replacement of setup module's relative import # would check for just python3.5 and run this then but we don't know the # target python at this time yet # NOTE: another ansible 2.10-specific fix: `from ..module_utils` used to be `from ...module_utils` module_source = module_source.replace( b"from ..module_utils.basic import AnsibleModule", b"from ansible.module_utils.basic import AnsibleModule" ) invocation._overridden_sources[invocation.module_path] = module_source def _load_collections(invocation): """ Special loader that ensures that `ansible_collections` exist as a module path for import Goes through all collection path possibilities and stores paths to installed collections Stores them on the current invocation to later be passed to the master service """ for collection_path in ansible.collections.list.list_collection_dirs(): invocation._extra_sys_paths.add(collection_path.decode('utf-8')) def invoke(invocation): """ Find a Planner subclass corresponding to `invocation` and use it to invoke the module. :param Invocation invocation: :returns: Module return dict. :raises ansible.errors.AnsibleError: Unrecognized/unsupported module type. """ path = ansible_mitogen.loaders.module_loader.find_plugin( invocation.module_name, '', ) if path is None: raise ansible.errors.AnsibleError(NO_MODULE_MSG % ( invocation.module_name, )) invocation.module_path = mitogen.core.to_text(path) if invocation.module_path not in _planner_by_path: if 'ansible_collections' in invocation.module_path: _load_collections(invocation) module_source = invocation.get_module_source() _fix_py35(invocation, module_source) _planner_by_path[invocation.module_path] = _get_planner( invocation, module_source ) planner = _planner_by_path[invocation.module_path](invocation) if invocation.wrap_async: response = _invoke_async_task(invocation, planner) elif planner.should_fork(): response = _invoke_isolated_task(invocation, planner) else: _propagate_deps(invocation, planner, invocation.connection.context) response = invocation.connection.get_chain().call( ansible_mitogen.target.run_module, kwargs=planner.get_kwargs(), ) return invocation.action._postprocess_response(response) mitogen-0.3.9/ansible_mitogen/plugins/000077500000000000000000000000001465666473100200275ustar00rootroot00000000000000mitogen-0.3.9/ansible_mitogen/plugins/__init__.py000066400000000000000000000000001465666473100221260ustar00rootroot00000000000000mitogen-0.3.9/ansible_mitogen/plugins/action/000077500000000000000000000000001465666473100213045ustar00rootroot00000000000000mitogen-0.3.9/ansible_mitogen/plugins/action/__init__.py000066400000000000000000000000001465666473100234030ustar00rootroot00000000000000mitogen-0.3.9/ansible_mitogen/plugins/action/mitogen_fetch.py000066400000000000000000000231601465666473100244730ustar00rootroot00000000000000# (c) 2012-2014, Michael DeHaan # # This file is part of Ansible # # Ansible is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Ansible is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Ansible. If not, see . from __future__ import (absolute_import, division, print_function) __metaclass__ = type import os import base64 from ansible.errors import AnsibleError, AnsibleActionFail, AnsibleActionSkip from ansible.module_utils.common.text.converters import to_bytes, to_text from ansible.module_utils.six import string_types from ansible.module_utils.parsing.convert_bool import boolean from ansible.plugins.action import ActionBase from ansible.utils.display import Display from ansible.utils.hashing import checksum, checksum_s, md5, secure_hash from ansible.utils.path import makedirs_safe, is_subpath display = Display() class ActionModule(ActionBase): def run(self, tmp=None, task_vars=None): ''' handler for fetch operations ''' if task_vars is None: task_vars = dict() result = super(ActionModule, self).run(tmp, task_vars) del tmp # tmp no longer has any effect try: if self._play_context.check_mode: raise AnsibleActionSkip('check mode not (yet) supported for this module') source = self._task.args.get('src', None) original_dest = dest = self._task.args.get('dest', None) flat = boolean(self._task.args.get('flat'), strict=False) fail_on_missing = boolean(self._task.args.get('fail_on_missing', True), strict=False) validate_checksum = boolean(self._task.args.get('validate_checksum', True), strict=False) msg = '' # validate source and dest are strings FIXME: use basic.py and module specs if not isinstance(source, string_types): msg = "Invalid type supplied for source option, it must be a string" if not isinstance(dest, string_types): msg = "Invalid type supplied for dest option, it must be a string" if source is None or dest is None: msg = "src and dest are required" if msg: raise AnsibleActionFail(msg) source = self._connection._shell.join_path(source) source = self._remote_expand_user(source) remote_stat = {} remote_checksum = None if True: # Get checksum for the remote file even using become. Mitogen doesn't need slurp. # Follow symlinks because fetch always follows symlinks try: remote_stat = self._execute_remote_stat(source, all_vars=task_vars, follow=True) except AnsibleError as ae: result['changed'] = False result['file'] = source if fail_on_missing: result['failed'] = True result['msg'] = to_text(ae) else: result['msg'] = "%s, ignored" % to_text(ae, errors='surrogate_or_replace') return result remote_checksum = remote_stat.get('checksum') if remote_stat.get('exists'): if remote_stat.get('isdir'): result['failed'] = True result['changed'] = False result['msg'] = "remote file is a directory, fetch cannot work on directories" # Historically, these don't fail because you may want to transfer # a log file that possibly MAY exist but keep going to fetch other # log files. Today, this is better achieved by adding # ignore_errors or failed_when to the task. Control the behaviour # via fail_when_missing if not fail_on_missing: result['msg'] += ", not transferring, ignored" del result['changed'] del result['failed'] return result # use slurp if permissions are lacking or privilege escalation is needed remote_data = None if remote_checksum in (None, '1', ''): slurpres = self._execute_module(module_name='ansible.legacy.slurp', module_args=dict(src=source), task_vars=task_vars) if slurpres.get('failed'): if not fail_on_missing: result['file'] = source result['changed'] = False else: result.update(slurpres) if 'not found' in slurpres.get('msg', ''): result['msg'] = "the remote file does not exist, not transferring, ignored" elif slurpres.get('msg', '').startswith('source is a directory'): result['msg'] = "remote file is a directory, fetch cannot work on directories" return result else: if slurpres['encoding'] == 'base64': remote_data = base64.b64decode(slurpres['content']) if remote_data is not None: remote_checksum = checksum_s(remote_data) # calculate the destination name if os.path.sep not in self._connection._shell.join_path('a', ''): source = self._connection._shell._unquote(source) source_local = source.replace('\\', '/') else: source_local = source # ensure we only use file name, avoid relative paths if not is_subpath(dest, original_dest): # TODO: ? dest = os.path.expanduser(dest.replace(('../',''))) raise AnsibleActionFail("Detected directory traversal, expected to be contained in '%s' but got '%s'" % (original_dest, dest)) if flat: if os.path.isdir(to_bytes(dest, errors='surrogate_or_strict')) and not dest.endswith(os.sep): raise AnsibleActionFail("dest is an existing directory, use a trailing slash if you want to fetch src into that directory") if dest.endswith(os.sep): # if the path ends with "/", we'll use the source filename as the # destination filename base = os.path.basename(source_local) dest = os.path.join(dest, base) if not dest.startswith("/"): # if dest does not start with "/", we'll assume a relative path dest = self._loader.path_dwim(dest) else: # files are saved in dest dir, with a subdir for each host, then the filename if 'inventory_hostname' in task_vars: target_name = task_vars['inventory_hostname'] else: target_name = self._play_context.remote_addr dest = "%s/%s/%s" % (self._loader.path_dwim(dest), target_name, source_local) dest = os.path.normpath(dest) # calculate checksum for the local file local_checksum = checksum(dest) if remote_checksum != local_checksum: # create the containing directories, if needed makedirs_safe(os.path.dirname(dest)) # fetch the file and check for changes if remote_data is None: self._connection.fetch_file(source, dest) else: try: f = open(to_bytes(dest, errors='surrogate_or_strict'), 'wb') f.write(remote_data) f.close() except (IOError, OSError) as e: raise AnsibleActionFail("Failed to fetch the file: %s" % e) new_checksum = secure_hash(dest) # For backwards compatibility. We'll return None on FIPS enabled systems try: new_md5 = md5(dest) except ValueError: new_md5 = None if validate_checksum and new_checksum != remote_checksum: result.update(dict(failed=True, md5sum=new_md5, msg="checksum mismatch", file=source, dest=dest, remote_md5sum=None, checksum=new_checksum, remote_checksum=remote_checksum)) else: result.update({'changed': True, 'md5sum': new_md5, 'dest': dest, 'remote_md5sum': None, 'checksum': new_checksum, 'remote_checksum': remote_checksum}) else: # For backwards compatibility. We'll return None on FIPS enabled systems try: local_md5 = md5(dest) except ValueError: local_md5 = None result.update(dict(changed=False, md5sum=local_md5, file=source, dest=dest, checksum=local_checksum)) finally: self._remove_tmp_path(self._connection._shell.tmpdir) return result mitogen-0.3.9/ansible_mitogen/plugins/action/mitogen_get_stack.py000066400000000000000000000046201465666473100253460ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. """ Fetch the connection configuration stack that would be used to connect to a target, without actually connecting to it. """ from __future__ import absolute_import, division, print_function from __future__ import unicode_literals __metaclass__ = type import ansible_mitogen.connection from ansible.plugins.action import ActionBase class ActionModule(ActionBase): def run(self, tmp=None, task_vars=None): if not isinstance(self._connection, ansible_mitogen.connection.Connection): return { 'skipped': True, } _, stack = self._connection._build_stack() return { 'changed': True, 'result': stack, '_ansible_verbose_always': True, # for ansible < 2.8, we'll default to /usr/bin/python like before 'discovered_interpreter': self._connection._action._discovered_interpreter } mitogen-0.3.9/ansible_mitogen/plugins/connection/000077500000000000000000000000001465666473100221665ustar00rootroot00000000000000mitogen-0.3.9/ansible_mitogen/plugins/connection/__init__.py000066400000000000000000000000001465666473100242650ustar00rootroot00000000000000mitogen-0.3.9/ansible_mitogen/plugins/connection/mitogen_buildah.py000066400000000000000000000036101465666473100256720ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. from __future__ import absolute_import, division, print_function __metaclass__ = type import os.path import sys try: import ansible_mitogen except ImportError: base_dir = os.path.dirname(__file__) sys.path.insert(0, os.path.abspath(os.path.join(base_dir, '../../..'))) del base_dir import ansible_mitogen.connection class Connection(ansible_mitogen.connection.Connection): transport = 'buildah' mitogen-0.3.9/ansible_mitogen/plugins/connection/mitogen_doas.py000066400000000000000000000036301465666473100252120ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. from __future__ import absolute_import, division, print_function __metaclass__ = type import os.path import sys try: import ansible_mitogen.connection except ImportError: base_dir = os.path.dirname(__file__) sys.path.insert(0, os.path.abspath(os.path.join(base_dir, '../../..'))) del base_dir import ansible_mitogen.connection class Connection(ansible_mitogen.connection.Connection): transport = 'mitogen_doas' mitogen-0.3.9/ansible_mitogen/plugins/connection/mitogen_docker.py000066400000000000000000000040501465666473100255300ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. from __future__ import absolute_import, division, print_function __metaclass__ = type import os.path import sys try: import ansible_mitogen except ImportError: base_dir = os.path.dirname(__file__) sys.path.insert(0, os.path.abspath(os.path.join(base_dir, '../../..'))) del base_dir import ansible_mitogen.connection class Connection(ansible_mitogen.connection.Connection): transport = 'docker' @property def docker_cmd(self): """ Ansible 2.3 synchronize module wants to know how we run Docker. """ return 'docker' mitogen-0.3.9/ansible_mitogen/plugins/connection/mitogen_jail.py000066400000000000000000000036051465666473100252050ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. from __future__ import absolute_import, division, print_function __metaclass__ = type import os.path import sys try: import ansible_mitogen except ImportError: base_dir = os.path.dirname(__file__) sys.path.insert(0, os.path.abspath(os.path.join(base_dir, '../../..'))) del base_dir import ansible_mitogen.connection class Connection(ansible_mitogen.connection.Connection): transport = 'jail' mitogen-0.3.9/ansible_mitogen/plugins/connection/mitogen_kubectl.py000066400000000000000000000060571465666473100257230ustar00rootroot00000000000000# coding: utf-8 # Copyright 2018, Yannig Perré # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. from __future__ import absolute_import, division, print_function __metaclass__ = type import os.path import sys import ansible.errors try: import ansible_mitogen except ImportError: base_dir = os.path.dirname(__file__) sys.path.insert(0, os.path.abspath(os.path.join(base_dir, '../../..'))) del base_dir import ansible_mitogen.connection import ansible_mitogen.loaders _get_result = ansible_mitogen.loaders.connection_loader__get( 'kubectl', class_only=True, ) class Connection(ansible_mitogen.connection.Connection): transport = 'kubectl' not_supported_msg = ( 'The "mitogen_kubectl" plug-in requires a version of Ansible ' 'that ships with the "kubectl" connection plug-in.' ) def __init__(self, *args, **kwargs): if not _get_result: raise ansible.errors.AnsibleConnectionFailure(self.not_supported_msg) super(Connection, self).__init__(*args, **kwargs) def get_extra_args(self): try: # Ansible < 2.10, _get_result is the connection class connection_options = _get_result.connection_options except AttributeError: # Ansible >= 2.10, _get_result is a get_with_context_result connection_options = _get_result.object.connection_options parameters = [] for key in connection_options: task_var_name = 'ansible_%s' % key task_var = self.get_task_var(task_var_name) if task_var is not None: parameters += [connection_options[key], task_var] return parameters mitogen-0.3.9/ansible_mitogen/plugins/connection/mitogen_local.py000066400000000000000000000060761465666473100253650ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. from __future__ import absolute_import, division, print_function __metaclass__ = type import os.path import sys try: import ansible_mitogen.connection except ImportError: base_dir = os.path.dirname(__file__) sys.path.insert(0, os.path.abspath(os.path.join(base_dir, '../../..'))) del base_dir import ansible_mitogen.connection import ansible_mitogen.process if sys.version_info > (3,): viewkeys = dict.keys elif sys.version_info > (2, 7): viewkeys = dict.viewkeys else: viewkeys = lambda dct: set(dct) def dict_diff(old, new): """ Return a dict representing the differences between the dicts `old` and `new`. Deleted keys appear as a key with the value :data:`None`, added and changed keys appear as a key with the new value. """ old_keys = viewkeys(old) new_keys = viewkeys(dict(new)) out = {} for key in new_keys - old_keys: out[key] = new[key] for key in old_keys - new_keys: out[key] = None for key in old_keys & new_keys: if old[key] != new[key]: out[key] = new[key] return out class Connection(ansible_mitogen.connection.Connection): transport = 'local' def get_default_cwd(self): # https://github.com/ansible/ansible/issues/14489 return self.loader_basedir def get_default_env(self): """ Vanilla Ansible local commands execute with an environment inherited from WorkerProcess, we must emulate that. """ return dict_diff( old=ansible_mitogen.process.MuxProcess.cls_original_env, new=os.environ, ) mitogen-0.3.9/ansible_mitogen/plugins/connection/mitogen_lxc.py000066400000000000000000000036041465666473100250530ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. from __future__ import absolute_import, division, print_function __metaclass__ = type import os.path import sys try: import ansible_mitogen except ImportError: base_dir = os.path.dirname(__file__) sys.path.insert(0, os.path.abspath(os.path.join(base_dir, '../../..'))) del base_dir import ansible_mitogen.connection class Connection(ansible_mitogen.connection.Connection): transport = 'lxc' mitogen-0.3.9/ansible_mitogen/plugins/connection/mitogen_lxd.py000066400000000000000000000036041465666473100250540ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. from __future__ import absolute_import, division, print_function __metaclass__ = type import os.path import sys try: import ansible_mitogen except ImportError: base_dir = os.path.dirname(__file__) sys.path.insert(0, os.path.abspath(os.path.join(base_dir, '../../..'))) del base_dir import ansible_mitogen.connection class Connection(ansible_mitogen.connection.Connection): transport = 'lxd' mitogen-0.3.9/ansible_mitogen/plugins/connection/mitogen_machinectl.py000066400000000000000000000036261465666473100264000ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. from __future__ import absolute_import, division, print_function __metaclass__ = type import os.path import sys try: import ansible_mitogen.connection except ImportError: base_dir = os.path.dirname(__file__) sys.path.insert(0, os.path.abspath(os.path.join(base_dir, '../../..'))) del base_dir import ansible_mitogen.connection class Connection(ansible_mitogen.connection.Connection): transport = 'machinectl' mitogen-0.3.9/ansible_mitogen/plugins/connection/mitogen_podman.py000066400000000000000000000036171465666473100255470ustar00rootroot00000000000000# Copyright 2022, Mitogen contributers # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. from __future__ import absolute_import, division, print_function __metaclass__ = type import os.path import sys try: import ansible_mitogen except ImportError: base_dir = os.path.dirname(__file__) sys.path.insert(0, os.path.abspath(os.path.join(base_dir, '../../..'))) del base_dir import ansible_mitogen.connection class Connection(ansible_mitogen.connection.Connection): transport = 'podman' mitogen-0.3.9/ansible_mitogen/plugins/connection/mitogen_setns.py000066400000000000000000000036211465666473100254200ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. from __future__ import absolute_import, division, print_function __metaclass__ = type import os.path import sys try: import ansible_mitogen.connection except ImportError: base_dir = os.path.dirname(__file__) sys.path.insert(0, os.path.abspath(os.path.join(base_dir, '../../..'))) del base_dir import ansible_mitogen.connection class Connection(ansible_mitogen.connection.Connection): transport = 'setns' mitogen-0.3.9/ansible_mitogen/plugins/connection/mitogen_ssh.py000066400000000000000000000063451465666473100250670ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. from __future__ import absolute_import, division, print_function __metaclass__ = type import os.path import sys DOCUMENTATION = """ author: David Wilson connection: mitogen_ssh short_description: Connect over SSH via Mitogen description: - This connects using an OpenSSH client controlled by the Mitogen for Ansible extension. It accepts every option the vanilla ssh plugin accepts. version_added: "2.5" options: ssh_args: type: str vars: - name: ssh_args - name: ansible_ssh_args - name: ansible_mitogen_ssh_args ssh_common_args: type: str vars: - name: ssh_args - name: ansible_ssh_common_args - name: ansible_mitogen_ssh_common_args ssh_extra_args: type: str vars: - name: ssh_args - name: ansible_ssh_extra_args - name: ansible_mitogen_ssh_extra_args """ try: import ansible_mitogen except ImportError: base_dir = os.path.dirname(__file__) sys.path.insert(0, os.path.abspath(os.path.join(base_dir, '../../..'))) del base_dir import ansible_mitogen.connection import ansible_mitogen.loaders class Connection(ansible_mitogen.connection.Connection): transport = 'ssh' vanilla_class = ansible_mitogen.loaders.connection_loader__get( 'ssh', class_only=True, ) @staticmethod def _create_control_path(*args, **kwargs): """Forward _create_control_path() to the implementation in ssh.py.""" # https://github.com/dw/mitogen/issues/342 return Connection.vanilla_class._create_control_path(*args, **kwargs) mitogen-0.3.9/ansible_mitogen/plugins/connection/mitogen_su.py000066400000000000000000000036261465666473100247200ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. from __future__ import absolute_import, division, print_function __metaclass__ = type import os.path import sys try: import ansible_mitogen.connection except ImportError: base_dir = os.path.dirname(__file__) sys.path.insert(0, os.path.abspath(os.path.join(base_dir, '../../..'))) del base_dir import ansible_mitogen.connection class Connection(ansible_mitogen.connection.Connection): transport = 'mitogen_su' mitogen-0.3.9/ansible_mitogen/plugins/connection/mitogen_sudo.py000066400000000000000000000036301465666473100252360ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. from __future__ import absolute_import, division, print_function __metaclass__ = type import os.path import sys try: import ansible_mitogen.connection except ImportError: base_dir = os.path.dirname(__file__) sys.path.insert(0, os.path.abspath(os.path.join(base_dir, '../../..'))) del base_dir import ansible_mitogen.connection class Connection(ansible_mitogen.connection.Connection): transport = 'mitogen_sudo' mitogen-0.3.9/ansible_mitogen/plugins/strategy/000077500000000000000000000000001465666473100216715ustar00rootroot00000000000000mitogen-0.3.9/ansible_mitogen/plugins/strategy/__init__.py000066400000000000000000000000001465666473100237700ustar00rootroot00000000000000mitogen-0.3.9/ansible_mitogen/plugins/strategy/mitogen.py000066400000000000000000000053651465666473100237160ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. from __future__ import absolute_import, division, print_function __metaclass__ = type import os.path import sys # # This is not the real Strategy implementation module, it simply exists as a # proxy to the real module, which is loaded using Python's regular import # mechanism, to prevent Ansible's PluginLoader from making up a fake name that # results in ansible_mitogen plugin modules being loaded twice: once by # PluginLoader with a name like "ansible.plugins.strategy.mitogen", which is # stuffed into sys.modules even though attempting to import it will trigger an # ImportError, and once under its canonical name, "ansible_mitogen.strategy". # # Therefore we have a proxy module that imports it under the real name, and # sets up the duff PluginLoader-imported module to just contain objects from # the real module, so duplicate types don't exist in memory, and things like # debuggers and isinstance() work predictably. # BASE_DIR = os.path.abspath( os.path.join(os.path.dirname(__file__), '../../..') ) if BASE_DIR not in sys.path: sys.path.insert(0, BASE_DIR) import ansible_mitogen.strategy import ansible.plugins.strategy.linear class StrategyModule(ansible_mitogen.strategy.StrategyMixin, ansible.plugins.strategy.linear.StrategyModule): pass mitogen-0.3.9/ansible_mitogen/plugins/strategy/mitogen_free.py000066400000000000000000000053731465666473100247160ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. from __future__ import absolute_import, division, print_function __metaclass__ = type import os.path import sys # # This is not the real Strategy implementation module, it simply exists as a # proxy to the real module, which is loaded using Python's regular import # mechanism, to prevent Ansible's PluginLoader from making up a fake name that # results in ansible_mitogen plugin modules being loaded twice: once by # PluginLoader with a name like "ansible.plugins.strategy.mitogen", which is # stuffed into sys.modules even though attempting to import it will trigger an # ImportError, and once under its canonical name, "ansible_mitogen.strategy". # # Therefore we have a proxy module that imports it under the real name, and # sets up the duff PluginLoader-imported module to just contain objects from # the real module, so duplicate types don't exist in memory, and things like # debuggers and isinstance() work predictably. # BASE_DIR = os.path.abspath( os.path.join(os.path.dirname(__file__), '../../..') ) if BASE_DIR not in sys.path: sys.path.insert(0, BASE_DIR) import ansible_mitogen.loaders import ansible_mitogen.strategy Base = ansible_mitogen.loaders.strategy_loader.get('free', class_only=True) class StrategyModule(ansible_mitogen.strategy.StrategyMixin, Base): pass mitogen-0.3.9/ansible_mitogen/plugins/strategy/mitogen_host_pinned.py000066400000000000000000000055771465666473100263150ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. from __future__ import absolute_import, division, print_function __metaclass__ = type import os.path import sys # # This is not the real Strategy implementation module, it simply exists as a # proxy to the real module, which is loaded using Python's regular import # mechanism, to prevent Ansible's PluginLoader from making up a fake name that # results in ansible_mitogen plugin modules being loaded twice: once by # PluginLoader with a name like "ansible.plugins.strategy.mitogen", which is # stuffed into sys.modules even though attempting to import it will trigger an # ImportError, and once under its canonical name, "ansible_mitogen.strategy". # # Therefore we have a proxy module that imports it under the real name, and # sets up the duff PluginLoader-imported module to just contain objects from # the real module, so duplicate types don't exist in memory, and things like # debuggers and isinstance() work predictably. # BASE_DIR = os.path.abspath( os.path.join(os.path.dirname(__file__), '../../..') ) if BASE_DIR not in sys.path: sys.path.insert(0, BASE_DIR) import ansible_mitogen.loaders import ansible_mitogen.strategy Base = ansible_mitogen.loaders.strategy_loader.get('host_pinned', class_only=True) if Base is None: raise ImportError( 'The host_pinned strategy is only available in Ansible 2.7 or newer.' ) class StrategyModule(ansible_mitogen.strategy.StrategyMixin, Base): pass mitogen-0.3.9/ansible_mitogen/plugins/strategy/mitogen_linear.py000066400000000000000000000053751465666473100252510ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. from __future__ import absolute_import, division, print_function __metaclass__ = type import os.path import sys # # This is not the real Strategy implementation module, it simply exists as a # proxy to the real module, which is loaded using Python's regular import # mechanism, to prevent Ansible's PluginLoader from making up a fake name that # results in ansible_mitogen plugin modules being loaded twice: once by # PluginLoader with a name like "ansible.plugins.strategy.mitogen", which is # stuffed into sys.modules even though attempting to import it will trigger an # ImportError, and once under its canonical name, "ansible_mitogen.strategy". # # Therefore we have a proxy module that imports it under the real name, and # sets up the duff PluginLoader-imported module to just contain objects from # the real module, so duplicate types don't exist in memory, and things like # debuggers and isinstance() work predictably. # BASE_DIR = os.path.abspath( os.path.join(os.path.dirname(__file__), '../../..') ) if BASE_DIR not in sys.path: sys.path.insert(0, BASE_DIR) import ansible_mitogen.loaders import ansible_mitogen.strategy Base = ansible_mitogen.loaders.strategy_loader.get('linear', class_only=True) class StrategyModule(ansible_mitogen.strategy.StrategyMixin, Base): pass mitogen-0.3.9/ansible_mitogen/process.py000066400000000000000000000605431465666473100204060ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. from __future__ import absolute_import, division, print_function __metaclass__ = type import atexit import logging import multiprocessing import os import resource import socket import signal import sys try: import faulthandler except ImportError: faulthandler = None try: import setproctitle except ImportError: setproctitle = None import mitogen import mitogen.core import mitogen.debug import mitogen.fork import mitogen.master import mitogen.parent import mitogen.service import mitogen.unix import mitogen.utils import ansible import ansible.constants as C import ansible.errors import ansible_mitogen.logging import ansible_mitogen.services from mitogen.core import b import ansible_mitogen.affinity LOG = logging.getLogger(__name__) ANSIBLE_PKG_OVERRIDE = ( u"__version__ = %r\n" u"__author__ = %r\n" ) MAX_MESSAGE_SIZE = 4096 * 1048576 worker_model_msg = ( 'Mitogen connection types may only be instantiated when one of the ' '"mitogen_*" or "operon_*" strategies are active.' ) shutting_down_msg = ( 'The task worker cannot connect. Ansible may be shutting down, or ' 'the maximum open files limit may have been exceeded. If this occurs ' 'midway through a run, please retry after increasing the open file ' 'limit (ulimit -n). Original error: %s' ) #: The worker model as configured by the currently running strategy. This is #: managed via :func:`get_worker_model` / :func:`set_worker_model` functions by #: :class:`StrategyMixin`. _worker_model = None #: A copy of the sole :class:`ClassicWorkerModel` that ever exists during a #: classic run, as return by :func:`get_classic_worker_model`. _classic_worker_model = None def set_worker_model(model): """ To remove process model-wiring from :class:`ansible_mitogen.connection.Connection`, it is necessary to track some idea of the configured execution environment outside the connection plug-in. That is what :func:`set_worker_model` and :func:`get_worker_model` are for. """ global _worker_model assert model is None or _worker_model is None _worker_model = model def get_worker_model(): """ Return the :class:`WorkerModel` currently configured by the running strategy. """ if _worker_model is None: raise ansible.errors.AnsibleConnectionFailure(worker_model_msg) return _worker_model def get_classic_worker_model(**kwargs): """ Return the single :class:`ClassicWorkerModel` instance, constructing it if necessary. """ global _classic_worker_model assert _classic_worker_model is None or (not kwargs), \ "ClassicWorkerModel kwargs supplied but model already constructed" if _classic_worker_model is None: _classic_worker_model = ClassicWorkerModel(**kwargs) return _classic_worker_model def getenv_int(key, default=0): """ Get an integer-valued environment variable `key`, if it exists and parses as an integer, otherwise return `default`. """ try: return int(os.environ.get(key, str(default))) except ValueError: return default def save_pid(name): """ When debugging and profiling, it is very annoying to poke through the process list to discover the currently running Ansible and MuxProcess IDs, especially when trying to catch an issue during early startup. So here, if a magic environment variable set, stash them in hidden files in the CWD:: alias muxpid="cat .ansible-mux.pid" alias anspid="cat .ansible-controller.pid" gdb -p $(muxpid) perf top -p $(anspid) """ if os.environ.get('MITOGEN_SAVE_PIDS'): with open('.ansible-%s.pid' % (name,), 'w') as fp: fp.write(str(os.getpid())) def setup_pool(pool): """ Configure a connection multiplexer's :class:`mitogen.service.Pool` with services accessed by clients and WorkerProcesses. """ pool.add(mitogen.service.FileService(router=pool.router)) pool.add(mitogen.service.PushFileService(router=pool.router)) pool.add(ansible_mitogen.services.ContextService(router=pool.router)) pool.add(ansible_mitogen.services.ModuleDepService(pool.router)) LOG.debug('Service pool configured: size=%d', pool.size) def _setup_responder(responder): """ Configure :class:`mitogen.master.ModuleResponder` to only permit certain packages, and to generate custom responses for certain modules. """ responder.whitelist_prefix('ansible') responder.whitelist_prefix('ansible_mitogen') # Ansible 2.3 is compatible with Python 2.4 targets, however # ansible/__init__.py is not. Instead, executor/module_common.py writes # out a 2.4-compatible namespace package for unknown reasons. So we # copy it here. responder.add_source_override( fullname='ansible', path=ansible.__file__, source=(ANSIBLE_PKG_OVERRIDE % ( ansible.__version__, ansible.__author__, )).encode(), is_pkg=True, ) def increase_open_file_limit(): """ #549: in order to reduce the possibility of hitting an open files limit, increase :data:`resource.RLIMIT_NOFILE` from its soft limit to its hard limit, if they differ. It is common that a low soft limit is configured by default, where the hard limit is much higher. """ soft, hard = resource.getrlimit(resource.RLIMIT_NOFILE) if hard == resource.RLIM_INFINITY: hard_s = '(infinity)' # cap in case of O(RLIMIT_NOFILE) algorithm in some subprocess. hard = 524288 else: hard_s = str(hard) LOG.debug('inherited open file limits: soft=%d hard=%s', soft, hard_s) if soft >= hard: LOG.debug('max open files already set to hard limit: %d', hard) return # OS X is limited by kern.maxfilesperproc sysctl, rather than the # advertised unlimited hard RLIMIT_NOFILE. Just hard-wire known defaults # for that sysctl, to avoid the mess of querying it. for value in (hard, 10240): try: resource.setrlimit(resource.RLIMIT_NOFILE, (value, hard)) LOG.debug('raised soft open file limit from %d to %d', soft, value) break except ValueError as e: LOG.debug('could not raise soft open file limit from %d to %d: %s', soft, value, e) def common_setup(enable_affinity=True, _init_logging=True): save_pid('controller') ansible_mitogen.logging.set_process_name('top') if _init_logging: ansible_mitogen.logging.setup() if enable_affinity: ansible_mitogen.affinity.policy.assign_controller() mitogen.utils.setup_gil() if faulthandler is not None: faulthandler.enable() MuxProcess.profiling = getenv_int('MITOGEN_PROFILING') > 0 if MuxProcess.profiling: mitogen.core.enable_profiling() MuxProcess.cls_original_env = dict(os.environ) increase_open_file_limit() def get_cpu_count(default=None): """ Get the multiplexer CPU count from the MITOGEN_CPU_COUNT environment variable, returning `default` if one isn't set, or is out of range. :param int default: Default CPU, or :data:`None` to use all available CPUs. """ max_cpus = multiprocessing.cpu_count() if default is None: default = max_cpus cpu_count = getenv_int('MITOGEN_CPU_COUNT', default=default) if cpu_count < 1 or cpu_count > max_cpus: cpu_count = default return cpu_count class Broker(mitogen.master.Broker): """ WorkerProcess maintains fewer file descriptors, therefore does not need the exuberant syscall expense of EpollPoller, so override it and restore the poll() poller. """ poller_class = mitogen.parent.POLLER_LIGHTWEIGHT class Binding(object): """ Represent a bound connection for a particular inventory hostname. When operating in sharded mode, the actual MuxProcess implementing a connection varies according to the target machine. Depending on the particular implementation, this class represents a binding to the correct MuxProcess. """ def get_child_service_context(self): """ Return the :class:`mitogen.core.Context` to which children should direct requests for services such as FileService, or :data:`None` for the local process. This can be different from :meth:`get_service_context` where MuxProcess and WorkerProcess are combined, and it is discovered a task is delegated after being assigned to its initial worker for the original un-delegated hostname. In that case, connection management and expensive services like file transfer must be implemented by the MuxProcess connected to the target, rather than routed to the MuxProcess responsible for executing the task. """ raise NotImplementedError() def get_service_context(self): """ Return the :class:`mitogen.core.Context` to which this process should direct ContextService requests, or :data:`None` for the local process. """ raise NotImplementedError() def close(self): """ Finalize any associated resources. """ raise NotImplementedError() class WorkerModel(object): """ Interface used by StrategyMixin to manage various Mitogen services, by default running in one or more connection multiplexer subprocesses spawned off the top-level Ansible process. """ def on_strategy_start(self): """ Called prior to strategy start in the top-level process. Responsible for preparing any worker/connection multiplexer state. """ raise NotImplementedError() def on_strategy_complete(self): """ Called after strategy completion in the top-level process. Must place Ansible back in a "compatible" state where any other strategy plug-in may execute. """ raise NotImplementedError() def get_binding(self, inventory_name): """ Return a :class:`Binding` to access Mitogen services for `inventory_name`. Usually called from worker processes, but may also be called from top-level process to handle "meta: reset_connection". """ raise NotImplementedError() class ClassicBinding(Binding): """ Only one connection may be active at a time in a classic worker, so its binding just provides forwarders back to :class:`ClassicWorkerModel`. """ def __init__(self, model): self.model = model def get_service_context(self): """ See Binding.get_service_context(). """ return self.model.parent def get_child_service_context(self): """ See Binding.get_child_service_context(). """ return self.model.parent def close(self): """ See Binding.close(). """ self.model.on_binding_close() class ClassicWorkerModel(WorkerModel): #: In the top-level process, this references one end of a socketpair(), #: whose other end child MuxProcesses block reading from to determine when #: the master process dies. When the top-level exits abnormally, or #: normally but where :func:`_on_process_exit` has been called, this socket #: will be closed, causing all the children to wake. parent_sock = None #: In the mux process, this is the other end of :attr:`cls_parent_sock`. #: The main thread blocks on a read from it until :attr:`cls_parent_sock` #: is closed. child_sock = None #: mitogen.master.Router for this worker. router = None #: mitogen.master.Broker for this worker. broker = None #: Name of multiplexer process socket we are currently connected to. listener_path = None #: mitogen.parent.Context representing the parent Context, which is the #: connection multiplexer process when running in classic mode, or the #: top-level process when running a new-style mode. parent = None def __init__(self, _init_logging=True): """ Arrange for classic model multiplexers to be started. The parent choses UNIX socket paths each child will use prior to fork, creates a socketpair used essentially as a semaphore, then blocks waiting for the child to indicate the UNIX socket is ready for use. :param bool _init_logging: For testing, if :data:`False`, don't initialize logging. """ # #573: The process ID that installed the :mod:`atexit` handler. If # some unknown Ansible plug-in forks the Ansible top-level process and # later performs a graceful Python exit, it may try to wait for child # PIDs it never owned, causing a crash. We want to avoid that. self._pid = os.getpid() common_setup(_init_logging=_init_logging) self.parent_sock, self.child_sock = socket.socketpair() mitogen.core.set_cloexec(self.parent_sock.fileno()) mitogen.core.set_cloexec(self.child_sock.fileno()) self._muxes = [ MuxProcess(self, index) for index in range(get_cpu_count(default=1)) ] for mux in self._muxes: mux.start() atexit.register(self._on_process_exit) self.child_sock.close() self.child_sock = None def _listener_for_name(self, name): """ Given an inventory hostname, return the UNIX listener that should communicate with it. This is a simple hash of the inventory name. """ mux = self._muxes[abs(hash(name)) % len(self._muxes)] LOG.debug('will use multiplexer %d (%s) to connect to "%s"', mux.index, mux.path, name) return mux.path def _reconnect(self, path): if self.router is not None: # Router can just be overwritten, but the previous parent # connection must explicitly be removed from the broker first. self.router.disconnect(self.parent) self.parent = None self.router = None try: self.router, self.parent = mitogen.unix.connect( path=path, broker=self.broker, ) except mitogen.unix.ConnectError as e: # This is not AnsibleConnectionFailure since we want to break # with_items loops. raise ansible.errors.AnsibleError(shutting_down_msg % (e,)) self.router.max_message_size = MAX_MESSAGE_SIZE self.listener_path = path def _on_process_exit(self): """ This is an :mod:`atexit` handler installed in the top-level process. Shut the write end of `sock`, causing the receive side of the socket in every :class:`MuxProcess` to return 0-byte reads, and causing their main threads to wake and initiate shutdown. After shutting the socket down, wait on each child to finish exiting. This is done using :mod:`atexit` since Ansible lacks any better hook to run code during exit, and unless some synchronization exists with MuxProcess, debug logs may appear on the user's terminal *after* the prompt has been printed. """ if self._pid != os.getpid(): return try: self.parent_sock.shutdown(socket.SHUT_WR) except socket.error: # Already closed. This is possible when tests are running. LOG.debug('_on_process_exit: ignoring duplicate call') return mitogen.core.io_op(self.parent_sock.recv, 1) self.parent_sock.close() for mux in self._muxes: _, status = os.waitpid(mux.pid, 0) status = mitogen.fork._convert_exit_status(status) LOG.debug('multiplexer %d PID %d %s', mux.index, mux.pid, mitogen.parent.returncode_to_str(status)) def _test_reset(self): """ Used to clean up in unit tests. """ self.on_binding_close() self._on_process_exit() set_worker_model(None) global _classic_worker_model _classic_worker_model = None def on_strategy_start(self): """ See WorkerModel.on_strategy_start(). """ def on_strategy_complete(self): """ See WorkerModel.on_strategy_complete(). """ def get_binding(self, inventory_name): """ See WorkerModel.get_binding(). """ if self.broker is None: self.broker = Broker() path = self._listener_for_name(inventory_name) if path != self.listener_path: self._reconnect(path) return ClassicBinding(self) def on_binding_close(self): if not self.broker: return self.broker.shutdown() self.broker.join() self.router = None self.broker = None self.parent = None self.listener_path = None # #420: Ansible executes "meta" actions in the top-level process, # meaning "reset_connection" will cause :class:`mitogen.core.Latch` FDs # to be cached and erroneously shared by children on subsequent # WorkerProcess forks. To handle that, call on_fork() to ensure any # shared state is discarded. # #490: only attempt to clean up when it's known that some resources # exist to cleanup, otherwise later __del__ double-call to close() due # to GC at random moment may obliterate an unrelated Connection's # related resources. mitogen.fork.on_fork() class MuxProcess(object): """ Implement a subprocess forked from the Ansible top-level, as a safe place to contain the Mitogen IO multiplexer thread, keeping its use of the logging package (and the logging package's heavy use of locks) far away from os.fork(), which is used continuously by the multiprocessing package in the top-level process. The problem with running the multiplexer in that process is that should the multiplexer thread be in the process of emitting a log entry (and holding its lock) at the point of fork, in the child, the first attempt to log any log entry using the same handler will deadlock the child, as in the memory image the child received, the lock will always be marked held. See https://bugs.python.org/issue6721 for a thorough description of the class of problems this worker is intended to avoid. """ #: A copy of :data:`os.environ` at the time the multiplexer process was #: started. It's used by mitogen_local.py to find changes made to the #: top-level environment (e.g. vars plugins -- issue #297) that must be #: applied to locally executed commands and modules. cls_original_env = None def __init__(self, model, index): #: :class:`ClassicWorkerModel` instance we were created by. self.model = model #: MuxProcess CPU index. self.index = index #: Individual path of this process. self.path = mitogen.unix.make_socket_path() def start(self): self.pid = os.fork() if self.pid: # Wait for child to boot before continuing. mitogen.core.io_op(self.model.parent_sock.recv, 1) return ansible_mitogen.logging.set_process_name('mux:' + str(self.index)) if setproctitle: setproctitle.setproctitle('mitogen mux:%s (%s)' % ( self.index, os.path.basename(self.path), )) self.model.parent_sock.close() self.model.parent_sock = None try: try: self.worker_main() except Exception: LOG.exception('worker_main() crashed') finally: sys.exit() def worker_main(self): """ The main function of the mux process: setup the Mitogen broker thread and ansible_mitogen services, then sleep waiting for the socket connected to the parent to be closed (indicating the parent has died). """ save_pid('mux') # #623: MuxProcess ignores SIGINT because it wants to live until every # Ansible worker process has been cleaned up by # TaskQueueManager.cleanup(), otherwise harmles yet scary warnings # about being unable connect to MuxProess could be printed. signal.signal(signal.SIGINT, signal.SIG_IGN) ansible_mitogen.logging.set_process_name('mux') ansible_mitogen.affinity.policy.assign_muxprocess(self.index) self._setup_master() self._setup_services() try: # Let the parent know our listening socket is ready. mitogen.core.io_op(self.model.child_sock.send, b('1')) # Block until the socket is closed, which happens on parent exit. mitogen.core.io_op(self.model.child_sock.recv, 1) finally: self.broker.shutdown() self.broker.join() # Test frameworks living somewhere higher on the stack of the # original parent process may try to catch sys.exit(), so do a C # level exit instead. os._exit(0) def _enable_router_debug(self): if 'MITOGEN_ROUTER_DEBUG' in os.environ: self.router.enable_debug() def _enable_stack_dumps(self): secs = getenv_int('MITOGEN_DUMP_THREAD_STACKS', default=0) if secs: mitogen.debug.dump_to_logger(secs=secs) def _setup_master(self): """ Construct a Router, Broker, and mitogen.unix listener """ self.broker = mitogen.master.Broker(install_watcher=False) self.router = mitogen.master.Router( broker=self.broker, max_message_size=MAX_MESSAGE_SIZE, ) _setup_responder(self.router.responder) mitogen.core.listen(self.broker, 'shutdown', self._on_broker_shutdown) mitogen.core.listen(self.broker, 'exit', self._on_broker_exit) self.listener = mitogen.unix.Listener.build_stream( router=self.router, path=self.path, backlog=C.DEFAULT_FORKS, ) self._enable_router_debug() self._enable_stack_dumps() def _setup_services(self): """ Construct a ContextService and a thread to service requests for it arriving from worker processes. """ self.pool = mitogen.service.Pool( router=self.router, size=getenv_int('MITOGEN_POOL_SIZE', default=32), ) setup_pool(self.pool) def _on_broker_shutdown(self): """ Respond to broker shutdown by shutting down the pool. Do not join on it yet, since that would block the broker thread which then cannot clean up pending handlers and connections, which is required for the threads to exit gracefully. """ self.pool.stop(join=False) def _on_broker_exit(self): """ Respond to the broker thread about to exit by finally joining on the pool. This is safe since pools only block in connection attempts, and connection attempts fail with CancelledError when broker shutdown begins. """ self.pool.join() mitogen-0.3.9/ansible_mitogen/runner.py000066400000000000000000001120141465666473100202300ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # !mitogen: minify_safe """ These classes implement execution for each style of Ansible module. They are instantiated in the target context by way of target.py::run_module(). Each class in here has a corresponding Planner class in planners.py that knows how to build arguments for it, preseed related data, etc. """ from __future__ import absolute_import, division, print_function __metaclass__ = type import atexit import json import os import re import shlex import shutil import sys import tempfile import traceback import types import mitogen.core import ansible_mitogen.target # TODO: circular import from mitogen.core import b from mitogen.core import bytes_partition from mitogen.core import str_rpartition from mitogen.core import to_text try: import ctypes except ImportError: # Python 2.4 ctypes = None try: # Python >= 3.4, PEP 451 ModuleSpec API import importlib.machinery import importlib.util except ImportError: # Python < 3.4, PEP 302 Import Hooks import imp try: # Cannot use cStringIO as it does not support Unicode. from StringIO import StringIO except ImportError: from io import StringIO try: from shlex import quote as shlex_quote except ImportError: from pipes import quote as shlex_quote # Absolute imports for <2.5. logging = __import__('logging') # Prevent accidental import of an Ansible module from hanging on stdin read. import ansible.module_utils.basic ansible.module_utils.basic._ANSIBLE_ARGS = '{}' # For tasks that modify /etc/resolv.conf, non-Debian derivative glibcs cache # resolv.conf at startup and never implicitly reload it. Cope with that via an # explicit call to res_init() on each task invocation. BSD-alikes export it # directly, Linux #defines it as "__res_init". libc__res_init = None if ctypes: libc = ctypes.CDLL(None) for symbol in 'res_init', '__res_init': try: libc__res_init = getattr(libc, symbol) except AttributeError: pass iteritems = getattr(dict, 'iteritems', dict.items) LOG = logging.getLogger(__name__) def shlex_split_b(s): """ Use shlex.split() to split characters in some single-byte encoding, without knowing what that encoding is. The input is bytes, the output is a list of bytes. """ assert isinstance(s, mitogen.core.BytesType) if mitogen.core.PY3: return [ t.encode('latin1') for t in shlex.split(s.decode('latin1'), comments=True) ] return [t for t in shlex.split(s, comments=True)] class TempFileWatcher(object): """ Since Ansible 2.7.0, lineinfile leaks file descriptors returned by :func:`tempfile.mkstemp` (ansible/ansible#57327). Handle this and all similar cases by recording descriptors produced by mkstemp during module execution, and cleaning up any leaked descriptors on completion. """ def __init__(self): self._real_mkstemp = tempfile.mkstemp # (fd, st.st_dev, st.st_ino) self._fd_dev_inode = [] tempfile.mkstemp = self._wrap_mkstemp def _wrap_mkstemp(self, *args, **kwargs): fd, path = self._real_mkstemp(*args, **kwargs) st = os.fstat(fd) self._fd_dev_inode.append((fd, st.st_dev, st.st_ino)) return fd, path def revert(self): tempfile.mkstemp = self._real_mkstemp for tup in self._fd_dev_inode: self._revert_one(*tup) def _revert_one(self, fd, st_dev, st_ino): try: st = os.fstat(fd) except OSError: # FD no longer exists. return if not (st.st_dev == st_dev and st.st_ino == st_ino): # FD reused. return LOG.info("a tempfile.mkstemp() FD was leaked during the last task") os.close(fd) class EnvironmentFileWatcher(object): """ Usually Ansible edits to /etc/environment and ~/.pam_environment are reflected in subsequent tasks if become:true or SSH multiplexing is disabled, due to sudo and/or SSH reinvoking pam_env. Rather than emulate existing semantics, do our best to ensure edits are always reflected. This can't perfectly replicate the existing behaviour, but it can safely update and remove keys that appear to originate in `path`, and that do not conflict with any existing environment key inherited from elsewhere. A more robust future approach may simply be to arrange for the persistent interpreter to restart when a change is detected. """ # We know nothing about the character set of /etc/environment or the # process environment. environ = getattr(os, 'environb', os.environ) def __init__(self, path): self.path = os.path.expanduser(path) #: Inode data at time of last check. self._st = self._stat() #: List of inherited keys appearing to originated from this file. self._keys = [ key for key, value in self._load() if value == self.environ.get(key) ] LOG.debug('%r installed; existing keys: %r', self, self._keys) def __repr__(self): return 'EnvironmentFileWatcher(%r)' % (self.path,) def _stat(self): try: return os.stat(self.path) except OSError: return None def _load(self): try: fp = open(self.path, 'rb') try: return list(self._parse(fp)) finally: fp.close() except IOError: return [] def _parse(self, fp): """ linux-pam-1.3.1/modules/pam_env/pam_env.c#L207 """ for line in fp: # ' #export foo=some var ' -> ['#export', 'foo=some var '] bits = shlex_split_b(line) if (not bits) or bits[0].startswith(b('#')): continue if bits[0] == b('export'): bits.pop(0) key, sep, value = bytes_partition(b(' ').join(bits), b('=')) if key and sep: yield key, value def _on_file_changed(self): LOG.debug('%r: file changed, reloading', self) for key, value in self._load(): if key in self.environ: LOG.debug('%r: existing key %r=%r exists, not setting %r', self, key, self.environ[key], value) else: LOG.debug('%r: setting key %r to %r', self, key, value) self._keys.append(key) self.environ[key] = value def _remove_existing(self): """ When a change is detected, remove keys that existed in the old file. """ for key in self._keys: if key in self.environ: LOG.debug('%r: removing old key %r', self, key) del self.environ[key] self._keys = [] def check(self): """ Compare the :func:`os.stat` for the pam_env style environmnt file `path` with the previous result `old_st`, which may be :data:`None` if the previous stat attempt failed. Reload its contents if the file has changed or appeared since last attempt. :returns: New :func:`os.stat` result. The new call to :func:`reload_env` should pass it as the value of `old_st`. """ st = self._stat() if self._st == st: return self._st = st self._remove_existing() if st is None: LOG.debug('%r: file has disappeared', self) else: self._on_file_changed() _pam_env_watcher = EnvironmentFileWatcher('~/.pam_environment') _etc_env_watcher = EnvironmentFileWatcher('/etc/environment') def utf8(s): """ Coerce an object to bytes if it is Unicode. """ if isinstance(s, mitogen.core.UnicodeType): s = s.encode('utf-8') return s def reopen_readonly(fp): """ Replace the file descriptor belonging to the file object `fp` with one open on the same file (`fp.name`), but opened with :py:data:`os.O_RDONLY`. This enables temporary files to be executed on Linux, which usually throws ``ETXTBUSY`` if any writeable handle exists pointing to a file passed to `execve()`. """ fd = os.open(fp.name, os.O_RDONLY) os.dup2(fd, fp.fileno()) os.close(fd) class Runner(object): """ Ansible module runner. After instantiation (with kwargs supplied by the corresponding Planner), `.run()` is invoked, upon which `setup()`, `_run()`, and `revert()` are invoked, with the return value of `_run()` returned by `run()`. Subclasses may override `_run`()` and extend `setup()` and `revert()`. :param str module: Name of the module to execute, e.g. "shell" :param mitogen.core.Context service_context: Context to which we should direct FileService calls. For now, always the connection multiplexer process on the controller. :param str json_args: Ansible module arguments. A mixture of user and internal keys created by :meth:`ansible.plugins.action.ActionBase._execute_module`. This is passed as a string rather than a dict in order to mimic the implicit bytes/str conversion behaviour of a 2.x controller running against a 3.x target. :param str good_temp_dir: The writeable temporary directory for this user account reported by :func:`ansible_mitogen.target.init_child` passed via the controller. This is specified explicitly to remain compatible with Ansible<2.5, and for forked tasks where init_child never runs. :param dict env: Additional environment variables to set during the run. Keys with :data:`None` are unset if present. :param str cwd: If not :data:`None`, change to this directory before executing. :param mitogen.core.ExternalContext econtext: When `detach` is :data:`True`, a reference to the ExternalContext the runner is executing in. :param bool detach: When :data:`True`, indicate the runner should detach the context from its parent after setup has completed successfully. """ def __init__(self, module, service_context, json_args, good_temp_dir, extra_env=None, cwd=None, env=None, econtext=None, detach=False): self.module = module self.service_context = service_context self.econtext = econtext self.detach = detach self.args = json.loads(mitogen.core.to_text(json_args)) self.good_temp_dir = good_temp_dir self.extra_env = extra_env self.env = env self.cwd = cwd #: If not :data:`None`, :meth:`get_temp_dir` had to create a temporary #: directory for this run, because we're in an asynchronous task, or #: because the originating action did not create a directory. self._temp_dir = None def get_temp_dir(self): path = self.args.get('_ansible_tmpdir') if path is not None: return path if self._temp_dir is None: self._temp_dir = tempfile.mkdtemp( prefix='ansible_mitogen_runner_', dir=self.good_temp_dir, ) return self._temp_dir def revert_temp_dir(self): if self._temp_dir is not None: ansible_mitogen.target.prune_tree(self._temp_dir) self._temp_dir = None def setup(self): """ Prepare for running a module, including fetching necessary dependencies from the parent, as :meth:`run` may detach prior to beginning execution. The base implementation simply prepares the environment. """ self._setup_cwd() self._setup_environ() def _setup_cwd(self): """ For situations like sudo to a non-privileged account, CWD could be $HOME of the old account, which could have mode go=, which means it is impossible to restore the old directory, so don't even try. """ if self.cwd: os.chdir(self.cwd) def _setup_environ(self): """ Apply changes from /etc/environment files before creating a TemporaryEnvironment to snapshot environment state prior to module run. """ _pam_env_watcher.check() _etc_env_watcher.check() env = dict(self.extra_env or {}) if self.env: env.update(self.env) self._env = TemporaryEnvironment(env) def _revert_cwd(self): """ #591: make a best-effort attempt to return to :attr:`good_temp_dir`. """ try: os.chdir(self.good_temp_dir) except OSError: LOG.debug('%r: could not restore CWD to %r', self, self.good_temp_dir) def revert(self): """ Revert any changes made to the process after running a module. The base implementation simply restores the original environment. """ self._revert_cwd() self._env.revert() self.revert_temp_dir() def _run(self): """ The _run() method is expected to return a dictionary in the form of ActionBase._low_level_execute_command() output, i.e. having:: { "rc": int, "stdout": "stdout data", "stderr": "stderr data" } """ raise NotImplementedError() def run(self): """ Set up the process environment in preparation for running an Ansible module. This monkey-patches the Ansible libraries in various places to prevent it from trying to kill the process on completion, and to prevent it from reading sys.stdin. :returns: Module result dictionary. """ self.setup() if self.detach: self.econtext.detach() try: return self._run() finally: self.revert() class AtExitWrapper(object): """ issue #397, #454: Newer Ansibles use :func:`atexit.register` to trigger tmpdir cleanup when AnsibleModule.tmpdir is responsible for creating its own temporary directory, however with Mitogen processes are preserved across tasks, meaning cleanup must happen earlier. Patch :func:`atexit.register`, catching :func:`shutil.rmtree` calls so they can be executed on task completion, rather than on process shutdown. """ # Wrapped in a dict to avoid instance method decoration. original = { 'register': atexit.register } def __init__(self): assert atexit.register == self.original['register'], \ "AtExitWrapper installed twice." atexit.register = self._atexit__register self.deferred = [] def revert(self): """ Restore the original :func:`atexit.register`. """ assert atexit.register == self._atexit__register, \ "AtExitWrapper not installed." atexit.register = self.original['register'] def run_callbacks(self): while self.deferred: func, targs, kwargs = self.deferred.pop() try: func(*targs, **kwargs) except Exception: LOG.exception('While running atexit callbacks') def _atexit__register(self, func, *targs, **kwargs): """ Intercept :func:`atexit.register` calls, diverting any to :func:`shutil.rmtree` into a private list. """ if func == shutil.rmtree: self.deferred.append((func, targs, kwargs)) return self.original['register'](func, *targs, **kwargs) class ModuleUtilsImporter(object): """ :param list module_utils: List of `(fullname, path, is_pkg)` tuples. """ def __init__(self, context, module_utils): self._context = context self._by_fullname = dict( (fullname, (path, is_pkg)) for fullname, path, is_pkg in module_utils ) self._loaded = set() sys.meta_path.insert(0, self) def revert(self): sys.meta_path.remove(self) for fullname in self._loaded: sys.modules.pop(fullname, None) def find_module(self, fullname, path=None): """ Return a loader for the module with fullname, if we will load it. Implements importlib.abc.MetaPathFinder.find_module(). Deprecrated in Python 3.4+, replaced by find_spec(). Raises ImportWarning in Python 3.10+. Removed in Python 3.12. """ if fullname in self._by_fullname: return self def find_spec(self, fullname, path, target=None): """ Return a `ModuleSpec` for module with `fullname` if we will load it. Otherwise return `None`. Implements importlib.abc.MetaPathFinder.find_spec(). Python 3.4+. """ if fullname.endswith('.'): return None try: module_path, is_package = self._by_fullname[fullname] except KeyError: LOG.debug('Skipping %s: not present', fullname) return None LOG.debug('Handling %s', fullname) origin = 'master:%s' % (module_path,) return importlib.machinery.ModuleSpec( fullname, loader=self, origin=origin, is_package=is_package, ) def create_module(self, spec): """ Return a module object for the given ModuleSpec. Implements PEP-451 importlib.abc.Loader API introduced in Python 3.4. Unlike Loader.load_module() this shouldn't populate sys.modules or set module attributes. Both are done by Python. """ module = types.ModuleType(spec.name) # FIXME create_module() shouldn't initialise module attributes module.__file__ = spec.origin return module def exec_module(self, module): """ Execute the module to initialise it. Don't return anything. Implements PEP-451 importlib.abc.Loader API, introduced in Python 3.4. """ spec = module.__spec__ path, _ = self._by_fullname[spec.name] source = ansible_mitogen.target.get_small_file(self._context, path) code = compile(source, path, 'exec', 0, 1) exec(code, module.__dict__) self._loaded.add(spec.name) def load_module(self, fullname): """ Return the loaded module specified by fullname. Implements PEP 302 importlib.abc.Loader.load_module(). Deprecated in Python 3.4+, replaced by create_module() & exec_module(). """ path, is_pkg = self._by_fullname[fullname] source = ansible_mitogen.target.get_small_file(self._context, path) code = compile(source, path, 'exec', 0, 1) mod = sys.modules.setdefault(fullname, imp.new_module(fullname)) mod.__file__ = "master:%s" % (path,) mod.__loader__ = self if is_pkg: mod.__path__ = [] mod.__package__ = str(fullname) else: mod.__package__ = str(str_rpartition(to_text(fullname), '.')[0]) exec(code, mod.__dict__) self._loaded.add(fullname) return mod class TemporaryEnvironment(object): """ Apply environment changes from `env` until :meth:`revert` is called. Values in the dict may be :data:`None` to indicate the relevant key should be deleted. """ def __init__(self, env=None): self.original = dict(os.environ) self.env = env or {} for key, value in iteritems(self.env): key = mitogen.core.to_text(key) value = mitogen.core.to_text(value) if value is None: os.environ.pop(key, None) else: os.environ[key] = str(value) def revert(self): """ Revert changes made by the module to the process environment. This must always run, as some modules (e.g. git.py) set variables like GIT_SSH that must be cleared out between runs. """ os.environ.clear() os.environ.update(self.original) class TemporaryArgv(object): def __init__(self, argv): self.original = sys.argv[:] sys.argv[:] = map(str, argv) def revert(self): sys.argv[:] = self.original class NewStyleStdio(object): """ Patch ansible.module_utils.basic argument globals. """ def __init__(self, args, temp_dir): self.temp_dir = temp_dir self.original_stdout = sys.stdout self.original_stderr = sys.stderr self.original_stdin = sys.stdin sys.stdout = StringIO() sys.stderr = StringIO() encoded = json.dumps({'ANSIBLE_MODULE_ARGS': args}) ansible.module_utils.basic._ANSIBLE_ARGS = utf8(encoded) sys.stdin = StringIO(mitogen.core.to_text(encoded)) self.original_get_path = getattr(ansible.module_utils.basic, 'get_module_path', None) ansible.module_utils.basic.get_module_path = self._get_path def _get_path(self): return self.temp_dir def revert(self): ansible.module_utils.basic.get_module_path = self.original_get_path sys.stdout = self.original_stdout sys.stderr = self.original_stderr sys.stdin = self.original_stdin ansible.module_utils.basic._ANSIBLE_ARGS = '{}' class ProgramRunner(Runner): """ Base class for runners that run external programs. :param str path: Absolute path to the program file on the master, as it can be retrieved via :class:`mitogen.service.FileService`. :param bool emulate_tty: If :data:`True`, execute the program with `stdout` and `stderr` merged into a single pipe, emulating Ansible behaviour when an SSH TTY is in use. """ def __init__(self, path, emulate_tty=None, **kwargs): super(ProgramRunner, self).__init__(**kwargs) self.emulate_tty = emulate_tty self.path = path def setup(self): super(ProgramRunner, self).setup() self._setup_program() def _get_program_filename(self): """ Return the filename used for program on disk. Ansible uses the original filename for non-Ansiballz runs, and "ansible_module_+filename for Ansiballz runs. """ return os.path.basename(self.path) program_fp = None def _setup_program(self): """ Create a temporary file containing the program code. The code is fetched via :meth:`_get_program`. """ filename = self._get_program_filename() path = os.path.join(self.get_temp_dir(), filename) self.program_fp = open(path, 'wb') self.program_fp.write(self._get_program()) self.program_fp.flush() os.chmod(self.program_fp.name, int('0700', 8)) reopen_readonly(self.program_fp) def _get_program(self): """ Fetch the module binary from the master if necessary. """ return ansible_mitogen.target.get_small_file( context=self.service_context, path=self.path, ) def _get_program_args(self): """ Return any arguments to pass to the program. """ return [] def revert(self): """ Delete the temporary program file. """ if self.program_fp: self.program_fp.close() super(ProgramRunner, self).revert() def _get_argv(self): """ Return the final argument vector used to execute the program. """ return [ self.args.get('_ansible_shell_executable', '/bin/sh'), '-c', self._get_shell_fragment(), ] def _get_shell_fragment(self): return "%s %s" % ( shlex_quote(self.program_fp.name), ' '.join(map(shlex_quote, self._get_program_args())), ) def _run(self): try: rc, stdout, stderr = ansible_mitogen.target.exec_args( args=self._get_argv(), emulate_tty=self.emulate_tty, ) except Exception: LOG.exception('While running %s', self._get_argv()) e = sys.exc_info()[1] return { u'rc': 1, u'stdout': u'', u'stderr': u'%s: %s' % (type(e), e), } return { u'rc': rc, u'stdout': mitogen.core.to_text(stdout), u'stderr': mitogen.core.to_text(stderr), } class ArgsFileRunner(Runner): def setup(self): super(ArgsFileRunner, self).setup() self._setup_args() def _setup_args(self): """ Create a temporary file containing the module's arguments. The arguments are formatted via :meth:`_get_args`. """ self.args_fp = tempfile.NamedTemporaryFile( prefix='ansible_mitogen', suffix='-args', dir=self.get_temp_dir(), ) self.args_fp.write(utf8(self._get_args_contents())) self.args_fp.flush() reopen_readonly(self.program_fp) def _get_args_contents(self): """ Return the module arguments formatted as JSON. """ return json.dumps(self.args) def _get_program_args(self): return [self.args_fp.name] def revert(self): """ Delete the temporary argument file. """ self.args_fp.close() super(ArgsFileRunner, self).revert() class BinaryRunner(ArgsFileRunner, ProgramRunner): pass class ScriptRunner(ProgramRunner): def __init__(self, interpreter_fragment, is_python, **kwargs): super(ScriptRunner, self).__init__(**kwargs) self.interpreter_fragment = interpreter_fragment self.is_python = is_python b_ENCODING_STRING = b('# -*- coding: utf-8 -*-') def _get_program(self): return self._rewrite_source( super(ScriptRunner, self)._get_program() ) def _get_argv(self): return [ self.args.get('_ansible_shell_executable', '/bin/sh'), '-c', self._get_shell_fragment(), ] def _get_shell_fragment(self): """ Scripts are eligible for having their hashbang line rewritten, and to be executed via /bin/sh using the ansible_*_interpreter value used as a shell fragment prefixing to the invocation. """ return "%s %s %s" % ( self.interpreter_fragment, shlex_quote(self.program_fp.name), ' '.join(map(shlex_quote, self._get_program_args())), ) def _rewrite_source(self, s): """ Mutate the source according to the per-task parameters. """ # While Ansible rewrites the #! using ansible_*_interpreter, it is # never actually used to execute the script, instead it is a shell # fragment consumed by shell/__init__.py::build_module_command(). new = [b('#!') + utf8(self.interpreter_fragment)] if self.is_python: new.append(self.b_ENCODING_STRING) _, _, rest = bytes_partition(s, b('\n')) new.append(rest) return b('\n').join(new) class NewStyleRunner(ScriptRunner): """ Execute a new-style Ansible module, where Module Replacer-related tricks aren't required. """ #: path => new-style module bytecode. _code_by_path = {} def __init__(self, module_map, py_module_name, **kwargs): super(NewStyleRunner, self).__init__(**kwargs) self.module_map = module_map self.py_module_name = py_module_name def _setup_imports(self): """ Ensure the local importer and PushFileService has everything for the Ansible module before setup() completes, but before detach() is called in an asynchronous task. The master automatically streams modules towards us concurrent to the runner invocation, however there is no public API to synchronize on the completion of those preloads. Instead simply reuse the importer's synchronization mechanism by importing everything the module will need prior to detaching. """ # I think "custom" means "found in custom module_utils search path", # e.g. playbook relative dir, ~/.ansible/..., Ansible collection. for fullname, _, _ in self.module_map['custom']: mitogen.core.import_module(fullname) # I think "builtin" means "part of ansible/ansible-base/ansible-core", # as opposed to Python builtin modules such as sys. for fullname in self.module_map['builtin']: try: mitogen.core.import_module(fullname) except ImportError as exc: # #590: Ansible 2.8 module_utils.distro is a package that # replaces itself in sys.modules with a non-package during # import. Prior to replacement, it is a real package containing # a '_distro' submodule which is used on 2.x. Given a 2.x # controller and 3.x target, the import hook never needs to run # again before this replacement occurs, and 'distro' is # replaced with a module from the stdlib. In this case as this # loop progresses to the next entry and attempts to preload # 'distro._distro', the import mechanism will fail. So here we # silently ignore any failure for it. if fullname == 'ansible.module_utils.distro._distro': continue # ansible.module_utils.compat.selinux raises ImportError if it # can't load libselinux.so. The importer would usually catch # this & skip selinux operations. We don't care about selinux, # we're using import to get a copy of the module. if (fullname == 'ansible.module_utils.compat.selinux' and exc.msg == 'unable to load libselinux.so'): continue raise def _setup_excepthook(self): """ Starting with Ansible 2.6, some modules (file.py) install a sys.excepthook and never clean it up. So we must preserve the original excepthook and restore it after the run completes. """ self.original_excepthook = sys.excepthook def setup(self): super(NewStyleRunner, self).setup() self._stdio = NewStyleStdio(self.args, self.get_temp_dir()) # It is possible that not supplying the script filename will break some # module, but this has never been a bug report. Instead act like an # interpreter that had its script piped on stdin. self._argv = TemporaryArgv(['']) self._temp_watcher = TempFileWatcher() self._importer = ModuleUtilsImporter( context=self.service_context, module_utils=self.module_map['custom'], ) self._setup_imports() self._setup_excepthook() self.atexit_wrapper = AtExitWrapper() if libc__res_init: libc__res_init() def _revert_excepthook(self): sys.excepthook = self.original_excepthook def revert(self): self.atexit_wrapper.revert() self._temp_watcher.revert() self._argv.revert() self._stdio.revert() self._revert_excepthook() super(NewStyleRunner, self).revert() def _get_program_filename(self): """ See ProgramRunner._get_program_filename(). """ return 'ansible_module_' + os.path.basename(self.path) def _setup_args(self): pass # issue #555: in old times it was considered good form to reload sys and # change the default encoding. This hack was removed from Ansible long ago, # but not before permeating into many third party modules. PREHISTORIC_HACK_RE = re.compile( b(r'reload\s*\(\s*sys\s*\)\s*' r'sys\s*\.\s*setdefaultencoding\([^)]+\)') ) def _setup_program(self): source = ansible_mitogen.target.get_small_file( context=self.service_context, path=self.path, ) self.source = self.PREHISTORIC_HACK_RE.sub(b(''), source) def _get_code(self): try: return self._code_by_path[self.path] except KeyError: return self._code_by_path.setdefault(self.path, compile( # Py2.4 doesn't support kwargs. self.source, # source "master:" + self.path, # filename 'exec', # mode 0, # flags True, # dont_inherit )) if mitogen.core.PY3: main_module_name = '__main__' else: main_module_name = b('__main__') def _handle_magic_exception(self, mod, exc): """ Beginning with Ansible >2.6, some modules (file.py) install a sys.excepthook which is a closure over AnsibleModule, redirecting the magical exception to AnsibleModule.fail_json(). For extra special needs bonus points, the class is not defined in module_utils, but is defined in the module itself, meaning there is no type for isinstance() that outlasts the invocation. """ klass = getattr(mod, 'AnsibleModuleError', None) if klass and isinstance(exc, klass): mod.module.fail_json(**exc.results) def _run_code(self, code, mod): try: if mitogen.core.PY3: exec(code, vars(mod)) else: exec('exec code in vars(mod)') except Exception: self._handle_magic_exception(mod, sys.exc_info()[1]) raise def _get_module_package(self): """ Since Ansible 2.9 __package__ must be set in accordance with an approximation of the original package hierarchy, so that relative imports function correctly. """ pkg, sep, modname = str_rpartition(self.py_module_name, '.') if not sep: return None if mitogen.core.PY3: return pkg return pkg.encode() def _run(self): mod = types.ModuleType(self.main_module_name) mod.__package__ = self._get_module_package() # Some Ansible modules use __file__ to find the Ansiballz temporary # directory. We must provide some temporary path in __file__, but we # don't want to pointlessly write the module to disk when it never # actually needs to exist. So just pass the filename as it would exist. mod.__file__ = os.path.join( self.get_temp_dir(), 'ansible_module_' + os.path.basename(self.path), ) code = self._get_code() rc = 2 try: try: self._run_code(code, mod) except SystemExit: exc = sys.exc_info()[1] rc = exc.args[0] except Exception: # This writes to stderr by default. traceback.print_exc() rc = 1 finally: self.atexit_wrapper.run_callbacks() return { u'rc': rc, u'stdout': mitogen.core.to_text(sys.stdout.getvalue()), u'stderr': mitogen.core.to_text(sys.stderr.getvalue()), } class JsonArgsRunner(ScriptRunner): JSON_ARGS = b('<>') def _get_args_contents(self): return json.dumps(self.args).encode() def _rewrite_source(self, s): return ( super(JsonArgsRunner, self)._rewrite_source(s) .replace(self.JSON_ARGS, self._get_args_contents()) ) class WantJsonRunner(ArgsFileRunner, ScriptRunner): pass class OldStyleRunner(ArgsFileRunner, ScriptRunner): def _get_args_contents(self): """ Mimic the argument formatting behaviour of ActionBase._execute_module(). """ return ' '.join( '%s=%s' % (key, shlex_quote(str(self.args[key]))) for key in self.args ) + ' ' # Bug-for-bug :( mitogen-0.3.9/ansible_mitogen/services.py000066400000000000000000000503051465666473100205460ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # !mitogen: minify_safe """ Classes in this file define Mitogen 'services' that run (initially) within the connection multiplexer process that is forked off the top-level controller process. Once a worker process connects to a multiplexer process (Connection._connect()), it communicates with these services to establish new connections, grant access to files by children, and register for notification when a child has completed a job. """ from __future__ import absolute_import, division, print_function from __future__ import unicode_literals __metaclass__ = type import logging import os import sys import threading import ansible.constants import mitogen.core import mitogen.service import ansible_mitogen.loaders import ansible_mitogen.module_finder import ansible_mitogen.target import ansible_mitogen.utils.unsafe LOG = logging.getLogger(__name__) # Force load of plugin to ensure ConfigManager has definitions loaded. Done # during module import to ensure a single-threaded environment; PluginLoader # is not thread-safe. ansible_mitogen.loaders.shell_loader.get('sh') if sys.version_info[0] == 3: def reraise(tp, value, tb): if value is None: value = tp() if value.__traceback__ is not tb: raise value.with_traceback(tb) raise value else: exec( "def reraise(tp, value, tb=None):\n" " raise tp, value, tb\n" ) def _get_candidate_temp_dirs(): try: # >=2.5 options = ansible.constants.config.get_plugin_options('shell', 'sh') remote_tmp = options.get('remote_tmp') or ansible.constants.DEFAULT_REMOTE_TMP system_tmpdirs = options.get('system_tmpdirs', ('/var/tmp', '/tmp')) except AttributeError: # 2.3 remote_tmp = ansible.constants.DEFAULT_REMOTE_TMP system_tmpdirs = ('/var/tmp', '/tmp') return ansible_mitogen.utils.unsafe.cast([remote_tmp] + list(system_tmpdirs)) def key_from_dict(**kwargs): """ Return a unique string representation of a dict as quickly as possible. Used to generated deduplication keys from a request. """ out = [] stack = [kwargs] while stack: obj = stack.pop() if isinstance(obj, dict): stack.extend(sorted(obj.items())) elif isinstance(obj, (list, tuple)): stack.extend(obj) else: out.append(str(obj)) return ''.join(out) class Error(Exception): pass class ContextService(mitogen.service.Service): """ Used by workers to fetch the single Context instance corresponding to a connection configuration, creating the matching connection if it does not exist. For connection methods and their parameters, see: https://mitogen.readthedocs.io/en/latest/api.html#context-factories This concentrates connections in the top-level process, which may become a bottleneck. The bottleneck can be removed using per-CPU connection processes and arranging for the worker to select one according to a hash of the connection parameters (sharding). """ max_interpreters = int(os.getenv('MITOGEN_MAX_INTERPRETERS', '20')) def __init__(self, *args, **kwargs): super(ContextService, self).__init__(*args, **kwargs) self._lock = threading.Lock() #: Records the :meth:`get` result dict for successful calls, returned #: for identical subsequent calls. Keyed by :meth:`key_from_dict`. self._response_by_key = {} #: List of :class:`mitogen.core.Latch` awaiting the result for a #: particular key. self._latches_by_key = {} #: Mapping of :class:`mitogen.core.Context` -> reference count. Each #: call to :meth:`get` increases this by one. Calls to :meth:`put` #: decrease it by one. self._refs_by_context = {} #: List of contexts in creation order by via= parameter. When #: :attr:`max_interpreters` is reached, the most recently used context #: is destroyed to make room for any additional context. self._lru_by_via = {} #: :func:`key_from_dict` result by Context. self._key_by_context = {} #: Mapping of Context -> parent Context self._via_by_context = {} @mitogen.service.expose(mitogen.service.AllowParents()) @mitogen.service.arg_spec({ 'stack': list, }) def reset(self, stack): """ Return a reference, forcing close and discard of the underlying connection. Used for 'meta: reset_connection' or when some other error is detected. :returns: :data:`True` if a connection was found to discard, otherwise :data:`False`. """ LOG.debug('%r.reset(%r)', self, stack) # this could happen if we have a `shutdown -r` shell command # and then a `wait_for_connection` right afterwards # in this case, we have no stack to disconnect from if not stack: return False l = mitogen.core.Latch() context = None with self._lock: for i, spec in enumerate(stack): key = key_from_dict(via=context, **spec) response = self._response_by_key.get(key) if response is None: LOG.debug('%r: could not find connection to shut down; ' 'failed at hop %d', self, i) return False context = response['context'] mitogen.core.listen(context, 'disconnect', l.put) self._shutdown_unlocked(context) # The timeout below is to turn a hang into a crash in case there is any # possible race between 'disconnect' signal subscription, and the child # abruptly disconnecting. l.get(timeout=30.0) return True @mitogen.service.expose(mitogen.service.AllowParents()) @mitogen.service.arg_spec({ 'context': mitogen.core.Context }) def put(self, context): """ Return a reference, making it eligable for recycling once its reference count reaches zero. """ LOG.debug('decrementing reference count for %r', context) self._lock.acquire() try: if self._refs_by_context.get(context, 0) == 0: LOG.warning('%r.put(%r): refcount was 0. shutdown_all called?', self, context) return self._refs_by_context[context] -= 1 finally: self._lock.release() def _produce_response(self, key, response): """ Reply to every waiting request matching a configuration key with a response dictionary, deleting the list of waiters when done. :param str key: Result of :meth:`key_from_dict` :param dict response: Response dictionary :returns: Number of waiters that were replied to. """ self._lock.acquire() try: latches = self._latches_by_key.pop(key) count = len(latches) for latch in latches: latch.put(response) finally: self._lock.release() return count def _forget_context_unlocked(self, context): key = self._key_by_context.get(context) if key is None: LOG.debug('%r: attempt to forget unknown %r', self, context) return self._response_by_key.pop(key, None) self._latches_by_key.pop(key, None) self._key_by_context.pop(context, None) self._refs_by_context.pop(context, None) self._via_by_context.pop(context, None) self._lru_by_via.pop(context, None) def _shutdown_unlocked(self, context, lru=None, new_context=None): """ Arrange for `context` to be shut down, and optionally add `new_context` to the LRU list while holding the lock. """ LOG.info('%r._shutdown_unlocked(): shutting down %r', self, context) context.shutdown() via = self._via_by_context.get(context) if via: lru = self._lru_by_via.get(via) if lru: if context in lru: lru.remove(context) if new_context: lru.append(new_context) self._forget_context_unlocked(context) def _update_lru_unlocked(self, new_context, spec, via): """ Update the LRU ("MRU"?) list associated with the connection described by `kwargs`, destroying the most recently created context if the list is full. Finally add `new_context` to the list. """ self._via_by_context[new_context] = via lru = self._lru_by_via.setdefault(via, []) if len(lru) < self.max_interpreters: lru.append(new_context) return for context in reversed(lru): if self._refs_by_context[context] == 0: break else: LOG.warning('via=%r reached maximum number of interpreters, ' 'but they are all marked as in-use.', via) return self._shutdown_unlocked(context, lru=lru, new_context=new_context) def _update_lru(self, new_context, spec, via): self._lock.acquire() try: self._update_lru_unlocked(new_context, spec, via) finally: self._lock.release() @mitogen.service.expose(mitogen.service.AllowParents()) def dump(self): """ For testing, return a list of dicts describing every currently connected context. """ return [ { 'context_name': context.name, 'via': getattr(self._via_by_context.get(context), 'name', None), 'refs': self._refs_by_context.get(context), } for context, key in sorted(self._key_by_context.items(), key=lambda c_k: c_k[0].context_id) ] @mitogen.service.expose(mitogen.service.AllowParents()) def shutdown_all(self): """ For testing use, arrange for all connections to be shut down. """ self._lock.acquire() try: for context in list(self._key_by_context): self._shutdown_unlocked(context) finally: self._lock.release() def _on_context_disconnect(self, context): """ Respond to Context disconnect event by deleting any record of the no longer reachable context. This method runs in the Broker thread and must not to block. """ self._lock.acquire() try: LOG.info('%r: Forgetting %r due to stream disconnect', self, context) self._forget_context_unlocked(context) finally: self._lock.release() ALWAYS_PRELOAD = ( 'ansible.module_utils.basic', 'ansible.module_utils.json_utils', 'ansible.release', 'ansible_mitogen.runner', 'ansible_mitogen.target', 'mitogen.fork', 'mitogen.service', ) def _send_module_forwards(self, context): if hasattr(self.router.responder, 'forward_modules'): self.router.responder.forward_modules(context, self.ALWAYS_PRELOAD) _candidate_temp_dirs = None def _get_candidate_temp_dirs(self): """ Return a list of locations to try to create the single temporary directory used by the run. This simply caches the (expensive) plugin load of :func:`_get_candidate_temp_dirs`. """ if self._candidate_temp_dirs is None: self._candidate_temp_dirs = _get_candidate_temp_dirs() return self._candidate_temp_dirs def _connect(self, key, spec, via=None): """ Actual connect implementation. Arranges for the Mitogen connection to be created and enqueues an asynchronous call to start the forked task parent in the remote context. :param key: Deduplication key representing the connection configuration. :param spec: Connection specification. :returns: Dict like:: { 'context': mitogen.core.Context or None, 'via': mitogen.core.Context or None, 'init_child_result': { 'fork_context': mitogen.core.Context, 'home_dir': str or None, }, 'msg': str or None } Where `context` is a reference to the newly constructed context, `init_child_result` is the result of executing :func:`ansible_mitogen.target.init_child` in that context, `msg` is an error message and the remaining fields are :data:`None`, or `msg` is :data:`None` and the remaining fields are set. """ try: method = getattr(self.router, spec['method']) except AttributeError: raise Error('unsupported method: %(method)s' % spec) context = method(via=via, unidirectional=True, **spec['kwargs']) if via and spec.get('enable_lru'): self._update_lru(context, spec, via) # Forget the context when its disconnect event fires. mitogen.core.listen(context, 'disconnect', lambda: self._on_context_disconnect(context)) self._send_module_forwards(context) init_child_result = context.call( ansible_mitogen.target.init_child, log_level=LOG.getEffectiveLevel(), candidate_temp_dirs=self._get_candidate_temp_dirs(), ) if os.environ.get('MITOGEN_DUMP_THREAD_STACKS'): from mitogen import debug context.call(debug.dump_to_logger) self._key_by_context[context] = key self._refs_by_context[context] = 0 return { 'context': context, 'via': via, 'init_child_result': init_child_result, 'msg': None, } def _wait_or_start(self, spec, via=None): latch = mitogen.core.Latch() key = key_from_dict(via=via, **spec) self._lock.acquire() try: response = self._response_by_key.get(key) if response is not None: self._refs_by_context[response['context']] += 1 latch.put(response) return latch latches = self._latches_by_key.setdefault(key, []) first = len(latches) == 0 latches.append(latch) finally: self._lock.release() if first: # I'm the first requestee, so I will create the connection. try: response = self._connect(key, spec, via=via) count = self._produce_response(key, response) # Only record the response for non-error results. self._response_by_key[key] = response # Set the reference count to the number of waiters. self._refs_by_context[response['context']] += count except Exception: self._produce_response(key, sys.exc_info()) return latch disconnect_msg = ( 'Channel was disconnected while connection attempt was in progress; ' 'this may be caused by an abnormal Ansible exit, or due to an ' 'unreliable target.' ) @mitogen.service.expose(mitogen.service.AllowParents()) @mitogen.service.arg_spec({ 'stack': list }) def get(self, stack): """ Return a Context referring to an established connection with the given configuration, establishing new connections as necessary. :param list stack: Connection descriptions. Each element is a dict containing 'method' and 'kwargs' keys describing the Router method and arguments. Subsequent elements are proxied via the previous. :returns dict: * context: mitogen.parent.Context or None. * init_child_result: Result of :func:`init_child`. * msg: StreamError exception text or None. * method_name: string failing method name. """ via = None for spec in stack: try: result = self._wait_or_start(spec, via=via).get() if isinstance(result, tuple): # exc_info() reraise(*result) via = result['context'] except mitogen.core.ChannelError: return { 'context': None, 'init_child_result': None, 'method_name': spec['method'], 'msg': self.disconnect_msg, } except mitogen.core.StreamError as e: return { 'context': None, 'init_child_result': None, 'method_name': spec['method'], 'msg': str(e), } return result class ModuleDepService(mitogen.service.Service): """ Scan a new-style module and produce a cached mapping of module_utils names to their resolved filesystem paths. """ invoker_class = mitogen.service.SerializedInvoker def __init__(self, *args, **kwargs): super(ModuleDepService, self).__init__(*args, **kwargs) self._cache = {} def _get_builtin_names(self, builtin_path, resolved): return [ mitogen.core.to_text(fullname) for fullname, path, is_pkg in resolved if os.path.abspath(path).startswith(builtin_path) ] def _get_custom_tups(self, builtin_path, resolved): return [ (mitogen.core.to_text(fullname), mitogen.core.to_text(path), is_pkg) for fullname, path, is_pkg in resolved if not os.path.abspath(path).startswith(builtin_path) ] @mitogen.service.expose(policy=mitogen.service.AllowParents()) @mitogen.service.arg_spec({ 'module_name': mitogen.core.UnicodeType, 'module_path': mitogen.core.FsPathTypes, 'search_path': tuple, 'builtin_path': mitogen.core.FsPathTypes, 'context': mitogen.core.Context, }) def scan(self, module_name, module_path, search_path, builtin_path, context): key = (module_name, search_path) if key not in self._cache: resolved = ansible_mitogen.module_finder.scan( module_name=module_name, module_path=module_path, search_path=tuple(search_path) + (builtin_path,), ) builtin_path = os.path.abspath(builtin_path) builtin = self._get_builtin_names(builtin_path, resolved) custom = self._get_custom_tups(builtin_path, resolved) self._cache[key] = { 'builtin': builtin, 'custom': custom, } return self._cache[key] mitogen-0.3.9/ansible_mitogen/strategy.py000066400000000000000000000305031465666473100205630ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. from __future__ import absolute_import, division, print_function __metaclass__ = type import os import signal import threading try: import setproctitle except ImportError: setproctitle = None import mitogen.core import ansible_mitogen.affinity import ansible_mitogen.loaders import ansible_mitogen.mixins import ansible_mitogen.process import ansible.executor.process.worker import ansible.utils.sentinel def _patch_awx_callback(): """ issue #400: AWX loads a display callback that suffers from thread-safety issues. Detect the presence of older AWX versions and patch the bug. """ # AWX uses sitecustomize.py to force-load this package. If it exists, we're # running under AWX. try: import awx_display_callback.events except ImportError: return if hasattr(awx_display_callback.events.EventContext(), '_local'): # Patched version. return def patch_add_local(self, **kwargs): tls = vars(self._local) ctx = tls.setdefault('_ctx', {}) ctx.update(kwargs) awx_display_callback.events.EventContext._local = threading.local() awx_display_callback.events.EventContext.add_local = patch_add_local _patch_awx_callback() def wrap_action_loader__get(name, *args, **kwargs): """ While the mitogen strategy is active, trap action_loader.get() calls, augmenting any fetched class with ActionModuleMixin, which replaces various helper methods inherited from ActionBase with implementations that avoid the use of shell fragments wherever possible. This is used instead of static subclassing as it generalizes to third party action plugins outside the Ansible tree. """ get_kwargs = {'class_only': True} if name in ('fetch',): name = 'mitogen_' + name get_kwargs['collection_list'] = kwargs.pop('collection_list', None) klass = ansible_mitogen.loaders.action_loader__get(name, **get_kwargs) if klass: bases = (ansible_mitogen.mixins.ActionModuleMixin, klass) adorned_klass = type(str(name), bases, {}) if kwargs.get('class_only'): return adorned_klass return adorned_klass(*args, **kwargs) REDIRECTED_CONNECTION_PLUGINS = ( 'buildah', 'docker', 'kubectl', 'jail', 'local', 'lxc', 'lxd', 'machinectl', 'podman', 'setns', 'ssh', ) def wrap_connection_loader__get(name, *args, **kwargs): """ While a Mitogen strategy is active, rewrite connection_loader.get() calls for some transports into requests for a compatible Mitogen transport. """ if name in REDIRECTED_CONNECTION_PLUGINS: name = 'mitogen_' + name return ansible_mitogen.loaders.connection_loader__get(name, *args, **kwargs) def wrap_worker__run(self): """ While a Mitogen strategy is active, trap WorkerProcess.run() calls and use the opportunity to set the worker's name in the process list and log output, activate profiling if requested, and bind the worker to a specific CPU. """ if setproctitle: setproctitle.setproctitle('worker:%s task:%s' % ( self._host.name, self._task.action, )) # Ignore parent's attempts to murder us when we still need to write # profiling output. if mitogen.core._profile_hook.__name__ != '_profile_hook': signal.signal(signal.SIGTERM, signal.SIG_IGN) ansible_mitogen.logging.set_process_name('task') ansible_mitogen.affinity.policy.assign_worker() return mitogen.core._profile_hook('WorkerProcess', lambda: worker__run(self) ) class AnsibleWrappers(object): """ Manage add/removal of various Ansible runtime hooks. """ def _add_plugin_paths(self): """ Add the Mitogen plug-in directories to the ModuleLoader path, avoiding the need for manual configuration. """ base_dir = os.path.join(os.path.dirname(__file__), 'plugins') ansible_mitogen.loaders.connection_loader.add_directory( os.path.join(base_dir, 'connection') ) ansible_mitogen.loaders.action_loader.add_directory( os.path.join(base_dir, 'action') ) def _install_wrappers(self): """ Install our PluginLoader monkey patches and update global variables with references to the real functions. """ ansible_mitogen.loaders.action_loader.get = wrap_action_loader__get ansible_mitogen.loaders.connection_loader.get_with_context = wrap_connection_loader__get global worker__run worker__run = ansible.executor.process.worker.WorkerProcess.run ansible.executor.process.worker.WorkerProcess.run = wrap_worker__run def _remove_wrappers(self): """ Uninstall the PluginLoader monkey patches. """ ansible_mitogen.loaders.action_loader.get = ( ansible_mitogen.loaders.action_loader__get ) ansible_mitogen.loaders.connection_loader.get_with_context = ( ansible_mitogen.loaders.connection_loader__get ) ansible.executor.process.worker.WorkerProcess.run = worker__run def install(self): self._add_plugin_paths() self._install_wrappers() def remove(self): self._remove_wrappers() class StrategyMixin(object): """ This mix-in enhances any built-in strategy by arranging for an appropriate WorkerModel instance to be constructed as necessary, or for the existing one to be reused. The WorkerModel in turn arranges for a connection multiplexer to be started somewhere (by default in an external process), and for WorkerProcesses to grow support for using those top-level services to communicate with remote hosts. Mitogen: A private Broker IO multiplexer thread is created to dispatch IO between the local Router and any connected streams, including streams connected to Ansible WorkerProcesses, and SSH commands implementing connections to remote machines. A Router is created that implements message dispatch to any locally registered handlers, and message routing for remote streams. Router is the junction point through which WorkerProceses and remote SSH contexts can communicate. Router additionally adds message handlers for a variety of base services, review the Standard Handles section of the How It Works guide in the documentation. A ContextService is installed as a message handler in the connection mutliplexer subprocess and run on a private thread. It is responsible for accepting requests to establish new SSH connections from worker processes, and ensuring precisely one connection exists and is reused for subsequent playbook steps. The service presently runs in a single thread, so to begin with, new SSH connections are serialized. Finally a mitogen.unix listener is created through which WorkerProcess can establish a connection back into the connection multiplexer, in order to avail of ContextService. A UNIX listener socket is necessary as there is no more sane mechanism to arrange for IPC between the Router in the connection multiplexer, and the corresponding Router in the worker process. Ansible: PluginLoader monkey patches are installed to catch attempts to create connection and action plug-ins. For connection plug-ins, if the desired method is "local" or "ssh", it is redirected to one of the "mitogen_*" connection plug-ins. That plug-in implements communication via a UNIX socket connection to the connection multiplexer process, and uses ContextService running there to establish a persistent connection to the target. For action plug-ins, the original class is looked up as usual, but a new subclass is created dynamically in order to mix-in ansible_mitogen.target.ActionModuleMixin, which overrides many of the methods usually inherited from ActionBase in order to replace them with pure-Python equivalents that avoid the use of shell. In particular, _execute_module() is overridden with an implementation that uses ansible_mitogen.target.run_module() executed in the target Context. run_module() implements module execution by importing the module as if it were a normal Python module, and capturing its output in the remote process. Since the Mitogen module loader is active in the remote process, all the heavy lifting of transferring the action module and its dependencies are automatically handled by Mitogen. """ def _queue_task(self, host, task, task_vars, play_context): """ Many PluginLoader caches are defective as they are only populated in the ephemeral WorkerProcess. Touch each plug-in path before forking to ensure all workers receive a hot cache. """ ansible_mitogen.loaders.module_loader.find_plugin( name=task.action, mod_type='', ) ansible_mitogen.loaders.action_loader.get( name=task.action, class_only=True, ) if play_context.connection is not ansible.utils.sentinel.Sentinel: # 2.8 appears to defer computing this until inside the worker. # TODO: figure out where it has moved. ansible_mitogen.loaders.connection_loader.get( name=play_context.connection, class_only=True, ) return super(StrategyMixin, self)._queue_task( host=host, task=task, task_vars=task_vars, play_context=play_context, ) def _get_worker_model(self): """ In classic mode a single :class:`WorkerModel` exists, which manages references and configuration of the associated connection multiplexer process. """ return ansible_mitogen.process.get_classic_worker_model() def run(self, iterator, play_context, result=0): """ Wrap :meth:`run` to ensure requisite infrastructure and modifications are configured for the duration of the call. """ wrappers = AnsibleWrappers() self._worker_model = self._get_worker_model() ansible_mitogen.process.set_worker_model(self._worker_model) try: self._worker_model.on_strategy_start() try: wrappers.install() try: run = super(StrategyMixin, self).run return mitogen.core._profile_hook('Strategy', lambda: run(iterator, play_context) ) finally: wrappers.remove() finally: self._worker_model.on_strategy_complete() finally: ansible_mitogen.process.set_worker_model(None) mitogen-0.3.9/ansible_mitogen/target.py000066400000000000000000000610031465666473100202060ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # !mitogen: minify_safe """ Helper functions intended to be executed on the target. These are entrypoints for file transfer, module execution and sundry bits like changing file modes. """ from __future__ import absolute_import, division, print_function __metaclass__ = type import errno import grp import json import operator import os import pwd import re import signal import stat import subprocess import sys import tempfile import traceback import types # Absolute imports for <2.5. logging = __import__('logging') import mitogen.core import mitogen.parent import mitogen.service from mitogen.core import b try: reduce except NameError: # Python 3.x. from functools import reduce try: BaseException except NameError: # Python 2.4 BaseException = Exception # Ansible since PR #41749 inserts "import __main__" into # ansible.module_utils.basic. Mitogen's importer will refuse such an import, so # we must setup a fake "__main__" before that module is ever imported. The # str() is to cast Unicode to bytes on Python 2.6. if not sys.modules.get(str('__main__')): sys.modules[str('__main__')] = types.ModuleType(str('__main__')) import ansible.module_utils.json_utils import ansible_mitogen.runner LOG = logging.getLogger(__name__) MAKE_TEMP_FAILED_MSG = ( u"Unable to find a useable temporary directory. This likely means no\n" u"system-supplied TMP directory can be written to, or all directories\n" u"were mounted on 'noexec' filesystems.\n" u"\n" u"The following paths were tried:\n" u" %(paths)s\n" u"\n" u"Please check '-vvv' output for a log of individual path errors." ) # Python 2.4/2.5 cannot support fork+threads whatsoever, it doesn't even fix up # interpreter state. So 2.4/2.5 interpreters start .local() contexts for # isolation instead. Since we don't have any crazy memory sharing problems to # avoid, there is no virginal fork parent either. The child is started directly # from the login/become process. In future this will be default everywhere, # fork is brainwrong from the stone age. FORK_SUPPORTED = sys.version_info >= (2, 6) #: Initialized to an econtext.parent.Context pointing at a pristine fork of #: the target Python interpreter before it executes any code or imports. _fork_parent = None #: Set by :func:`init_child` to the name of a writeable and executable #: temporary directory accessible by the active user account. good_temp_dir = None def subprocess__Popen__close_fds(self, but): """ issue #362, #435: subprocess.Popen(close_fds=True) aka. AnsibleModule.run_command() loops the entire FD space on Python<3.2. CentOS>5 ships with 1,048,576 FDs by default, resulting in huge (>500ms) latency starting children. Therefore replace Popen._close_fds on Linux with a version that is O(fds) rather than O(_SC_OPEN_MAX). """ try: names = os.listdir(u'/proc/self/fd') except OSError: # May fail if acting on a container that does not have /proc mounted. self._original_close_fds(but) return for name in names: if not name.isdigit(): continue fd = int(name, 10) if fd > 2 and fd != but: try: os.close(fd) except OSError: pass if ( sys.platform.startswith(u'linux') and sys.version_info < (3,) and hasattr(subprocess.Popen, u'_close_fds') and not mitogen.is_master ): subprocess.Popen._original_close_fds = subprocess.Popen._close_fds subprocess.Popen._close_fds = subprocess__Popen__close_fds def get_small_file(context, path): """ Basic in-memory caching module fetcher. This generates one roundtrip for every previously unseen file, so it is only a temporary solution. :param context: Context we should direct FileService requests to. For now (and probably forever) this is just the top-level Mitogen connection manager process. :param path: Path to fetch from FileService, must previously have been registered by a privileged context using the `register` command. :returns: Bytestring file data. """ pool = mitogen.service.get_or_create_pool(router=context.router) service = pool.get_service(u'mitogen.service.PushFileService') return service.get(path) def transfer_file(context, in_path, out_path, sync=False, set_owner=False): """ Streamily download a file from the connection multiplexer process in the controller. :param mitogen.core.Context context: Reference to the context hosting the FileService that will transmit the file. :param bytes in_path: FileService registered name of the input file. :param bytes out_path: Name of the output path on the local disk. :param bool sync: If :data:`True`, ensure the file content and metadat are fully on disk before renaming the temporary file over the existing file. This should ensure in the case of system crash, either the entire old or new file are visible post-reboot. :param bool set_owner: If :data:`True`, look up the metadata username and group on the local system and file the file owner using :func:`os.fchmod`. """ out_path = os.path.abspath(out_path) fd, tmp_path = tempfile.mkstemp(suffix='.tmp', prefix='.ansible_mitogen_transfer-', dir=os.path.dirname(out_path)) fp = os.fdopen(fd, 'wb', mitogen.core.CHUNK_SIZE) LOG.debug('transfer_file(%r) temporary file: %s', out_path, tmp_path) try: try: ok, metadata = mitogen.service.FileService.get( context=context, path=in_path, out_fp=fp, ) if not ok: raise IOError('transfer of %r was interrupted.' % (in_path,)) set_file_mode(tmp_path, metadata['mode'], fd=fp.fileno()) if set_owner: set_file_owner(tmp_path, metadata['owner'], metadata['group'], fd=fp.fileno()) finally: fp.close() if sync: os.fsync(fp.fileno()) os.rename(tmp_path, out_path) except BaseException: os.unlink(tmp_path) raise os.utime(out_path, (metadata['atime'], metadata['mtime'])) def prune_tree(path): """ Like shutil.rmtree(), but log errors rather than discard them, and do not waste multiple os.stat() calls discovering whether the object can be deleted, just try deleting it instead. """ try: os.unlink(path) return except OSError: e = sys.exc_info()[1] if not (os.path.isdir(path) and e.args[0] in (errno.EPERM, errno.EISDIR)): LOG.error('prune_tree(%r): %s', path, e) return try: # Ensure write access for readonly directories. Ignore error in case # path is on a weird filesystem (e.g. vfat). os.chmod(path, int('0700', 8)) except OSError: e = sys.exc_info()[1] LOG.warning('prune_tree(%r): %s', path, e) try: for name in os.listdir(path): if name not in ('.', '..'): prune_tree(os.path.join(path, name)) os.rmdir(path) except OSError: e = sys.exc_info()[1] LOG.error('prune_tree(%r): %s', path, e) def is_good_temp_dir(path): """ Return :data:`True` if `path` can be used as a temporary directory, logging any failures that may cause it to be unsuitable. If the directory doesn't exist, we attempt to create it using :func:`os.makedirs`. """ if not os.path.exists(path): try: os.makedirs(path, mode=int('0700', 8)) except OSError: e = sys.exc_info()[1] LOG.debug('temp dir %r unusable: did not exist and attempting ' 'to create it failed: %s', path, e) return False try: tmp = tempfile.NamedTemporaryFile( prefix='ansible_mitogen_is_good_temp_dir', dir=path, ) except (OSError, IOError): e = sys.exc_info()[1] LOG.debug('temp dir %r unusable: %s', path, e) return False try: try: os.chmod(tmp.name, int('0700', 8)) except OSError: e = sys.exc_info()[1] LOG.debug('temp dir %r unusable: chmod failed: %s', path, e) return False try: # access(.., X_OK) is sufficient to detect noexec. if not os.access(tmp.name, os.X_OK): raise OSError('filesystem appears to be mounted noexec') except OSError: e = sys.exc_info()[1] LOG.debug('temp dir %r unusable: %s', path, e) return False finally: tmp.close() return True def find_good_temp_dir(candidate_temp_dirs): """ Given a list of candidate temp directories extracted from ``ansible.cfg``, combine it with the Python-builtin list of candidate directories used by :mod:`tempfile`, then iteratively try each until one is found that is both writeable and executable. :param list candidate_temp_dirs: List of candidate $variable-expanded and tilde-expanded directory paths that may be usable as a temporary directory. """ paths = [os.path.expandvars(os.path.expanduser(p)) for p in candidate_temp_dirs] paths.extend(tempfile._candidate_tempdir_list()) for path in paths: if is_good_temp_dir(path): LOG.debug('Selected temp directory: %r (from %r)', path, paths) return path raise IOError(MAKE_TEMP_FAILED_MSG % { 'paths': '\n '.join(paths), }) @mitogen.core.takes_econtext def init_child(econtext, log_level, candidate_temp_dirs): """ Called by ContextService immediately after connection; arranges for the (presently) spotless Python interpreter to be forked, where the newly forked interpreter becomes the parent of any newly forked future interpreters. This is necessary to prevent modules that are executed in-process from polluting the global interpreter state in a way that effects explicitly isolated modules. :param int log_level: Logging package level active in the master. :param list[str] candidate_temp_dirs: List of $variable-expanded and tilde-expanded directory names to add to candidate list of temporary directories. :returns: Dict like:: { 'fork_context': mitogen.core.Context or None, 'good_temp_dir': ... 'home_dir': str } Where `fork_context` refers to the newly forked 'fork parent' context the controller will use to start forked jobs, and `home_dir` is the home directory for the active user account. """ # Copying the master's log level causes log messages to be filtered before # they reach LogForwarder, thus reducing an influx of tiny messges waking # the connection multiplexer process in the master. LOG.setLevel(log_level) logging.getLogger('ansible_mitogen').setLevel(log_level) global _fork_parent if FORK_SUPPORTED: mitogen.parent.upgrade_router(econtext) _fork_parent = econtext.router.fork() global good_temp_dir good_temp_dir = find_good_temp_dir(candidate_temp_dirs) return { u'fork_context': _fork_parent, u'home_dir': mitogen.core.to_text(os.path.expanduser('~')), u'good_temp_dir': good_temp_dir, } @mitogen.core.takes_econtext def spawn_isolated_child(econtext): """ For helper functions executed in the fork parent context, arrange for the context's router to be upgraded as necessary and for a new child to be prepared. The actual fork occurs from the 'virginal fork parent', which does not have any Ansible modules loaded prior to fork, to avoid conflicts resulting from custom module_utils paths. """ mitogen.parent.upgrade_router(econtext) if FORK_SUPPORTED: context = econtext.router.fork() else: context = econtext.router.local() LOG.debug('create_fork_child() -> %r', context) return context def run_module(kwargs): """ Set up the process environment in preparation for running an Ansible module. This monkey-patches the Ansible libraries in various places to prevent it from trying to kill the process on completion, and to prevent it from reading sys.stdin. """ runner_name = kwargs.pop('runner_name') klass = getattr(ansible_mitogen.runner, runner_name) impl = klass(**mitogen.core.Kwargs(kwargs)) return impl.run() def _get_async_dir(): return os.path.expanduser( os.environ.get('ANSIBLE_ASYNC_DIR', '~/.ansible_async') ) class AsyncRunner(object): def __init__(self, job_id, timeout_secs, started_sender, econtext, kwargs): self.job_id = job_id self.timeout_secs = timeout_secs self.started_sender = started_sender self.econtext = econtext self.kwargs = kwargs self._timed_out = False self._init_path() def _init_path(self): async_dir = _get_async_dir() if not os.path.exists(async_dir): os.makedirs(async_dir) self.path = os.path.join(async_dir, self.job_id) def _update(self, dct): """ Update an async job status file. """ LOG.info('%r._update(%r, %r)', self, self.job_id, dct) dct.setdefault('ansible_job_id', self.job_id) dct.setdefault('data', '') fp = open(self.path + '.tmp', 'w') try: fp.write(json.dumps(dct)) finally: fp.close() os.rename(self.path + '.tmp', self.path) def _on_sigalrm(self, signum, frame): """ Respond to SIGALRM (job timeout) by updating the job file and killing the process. """ msg = "Job reached maximum time limit of %d seconds." % ( self.timeout_secs, ) self._update({ "failed": 1, "finished": 1, "msg": msg, }) self._timed_out = True self.econtext.broker.shutdown() def _install_alarm(self): signal.signal(signal.SIGALRM, self._on_sigalrm) signal.alarm(self.timeout_secs) def _run_module(self): kwargs = dict(self.kwargs, **{ 'detach': True, 'econtext': self.econtext, 'emulate_tty': False, }) return run_module(kwargs) def _parse_result(self, dct): filtered, warnings = ( ansible.module_utils.json_utils. _filter_non_json_lines(dct['stdout']) ) result = json.loads(filtered) result.setdefault('warnings', []).extend(warnings) result['stderr'] = dct['stderr'] or result.get('stderr', '') self._update(result) def _run(self): """ 1. Immediately updates the status file to mark the job as started. 2. Installs a timer/signal handler to implement the time limit. 3. Runs as with run_module(), writing the result to the status file. :param dict kwargs: Runner keyword arguments. :param str job_id: String job ID. :param int timeout_secs: If >0, limit the task's maximum run time. """ self._update({ 'started': 1, 'finished': 0, 'pid': os.getpid() }) self.started_sender.send(True) if self.timeout_secs > 0: self._install_alarm() dct = self._run_module() if not self._timed_out: # After SIGALRM fires, there is a window between broker responding # to shutdown() by killing the process, and work continuing on the # main thread. If main thread was asleep in at least # basic.py/select.select(), an EINTR will be raised. We want to # discard that exception. try: self._parse_result(dct) except Exception: self._update({ "failed": 1, "msg": traceback.format_exc(), "data": dct['stdout'], # temporary notice only "stderr": dct['stderr'] }) def run(self): try: try: self._run() except Exception: self._update({ "failed": 1, "msg": traceback.format_exc(), }) finally: self.econtext.broker.shutdown() @mitogen.core.takes_econtext def run_module_async(kwargs, job_id, timeout_secs, started_sender, econtext): """ Execute a module with its run status and result written to a file, terminating on the process on completion. This function must run in a child forked using :func:`create_fork_child`. @param mitogen.core.Sender started_sender: A sender that will receive :data:`True` once the job has reached a point where its initial job file has been written. This is required to avoid a race where an overly eager controller can check for a task before it has reached that point in execution, which is possible at least on Python 2.4, where forking is not available for async tasks. """ arunner = AsyncRunner( job_id, timeout_secs, started_sender, econtext, kwargs ) arunner.run() def get_user_shell(): """ For commands executed directly via an SSH command-line, SSH looks up the user's shell via getpwuid() and only defaults to /bin/sh if that field is missing or empty. """ try: pw_shell = pwd.getpwuid(os.geteuid()).pw_shell except KeyError: pw_shell = None return pw_shell or '/bin/sh' def exec_args(args, in_data='', chdir=None, shell=None, emulate_tty=False): """ Run a command in a subprocess, emulating the argument handling behaviour of SSH. :param list[str]: Argument vector. :param bytes in_data: Optional standard input for the command. :param bool emulate_tty: If :data:`True`, arrange for stdout and stderr to be merged into the stdout pipe and for LF to be translated into CRLF, emulating the behaviour of a TTY. :return: (return code, stdout bytes, stderr bytes) """ LOG.debug('exec_args(%r, ..., chdir=%r)', args, chdir) assert isinstance(args, list) if emulate_tty: stderr = subprocess.STDOUT else: stderr = subprocess.PIPE proc = subprocess.Popen( args=args, stdout=subprocess.PIPE, stderr=stderr, stdin=subprocess.PIPE, cwd=chdir, ) stdout, stderr = proc.communicate(in_data) if emulate_tty: stdout = stdout.replace(b('\n'), b('\r\n')) return proc.returncode, stdout, stderr or b('') def exec_command(cmd, in_data='', chdir=None, shell=None, emulate_tty=False): """ Run a command in a subprocess, emulating the argument handling behaviour of SSH. :param bytes cmd: String command line, passed to user's shell. :param bytes in_data: Optional standard input for the command. :return: (return code, stdout bytes, stderr bytes) """ assert isinstance(cmd, mitogen.core.UnicodeType) return exec_args( args=[get_user_shell(), '-c', cmd], in_data=in_data, chdir=chdir, shell=shell, emulate_tty=emulate_tty, ) def read_path(path): """ Fetch the contents of a filesystem `path` as bytes. """ with open(path, 'rb') as f: return f.read() def set_file_owner(path, owner, group=None, fd=None): if owner: uid = pwd.getpwnam(owner).pw_uid else: uid = os.geteuid() if group: gid = grp.getgrnam(group).gr_gid else: gid = os.getegid() if fd is not None and hasattr(os, 'fchown'): os.fchown(fd, (uid, gid)) else: # Python<2.6 os.chown(path, (uid, gid)) def write_path(path, s, owner=None, group=None, mode=None, utimes=None, sync=False): """ Writes bytes `s` to a filesystem `path`. """ path = os.path.abspath(path) fd, tmp_path = tempfile.mkstemp(suffix='.tmp', prefix='.ansible_mitogen_transfer-', dir=os.path.dirname(path)) fp = os.fdopen(fd, 'wb', mitogen.core.CHUNK_SIZE) LOG.debug('write_path(path=%r) temporary file: %s', path, tmp_path) try: try: if mode: set_file_mode(tmp_path, mode, fd=fp.fileno()) if owner or group: set_file_owner(tmp_path, owner, group, fd=fp.fileno()) fp.write(s) finally: fp.close() if sync: os.fsync(fp.fileno()) os.rename(tmp_path, path) except BaseException: os.unlink(tmp_path) raise if utimes: os.utime(path, utimes) CHMOD_CLAUSE_PAT = re.compile(r'([uoga]*)([+\-=])([ugo]|[rwx]*)') CHMOD_MASKS = { 'u': stat.S_IRWXU, 'g': stat.S_IRWXG, 'o': stat.S_IRWXO, 'a': (stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO), } CHMOD_BITS = { 'u': {'r': stat.S_IRUSR, 'w': stat.S_IWUSR, 'x': stat.S_IXUSR}, 'g': {'r': stat.S_IRGRP, 'w': stat.S_IWGRP, 'x': stat.S_IXGRP}, 'o': {'r': stat.S_IROTH, 'w': stat.S_IWOTH, 'x': stat.S_IXOTH}, 'a': { 'r': (stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH), 'w': (stat.S_IWUSR | stat.S_IWGRP | stat.S_IWOTH), 'x': (stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH) } } def apply_mode_spec(spec, mode): """ Given a symbolic file mode change specification in the style of chmod(1) `spec`, apply changes in the specification to the numeric file mode `mode`. """ for clause in mitogen.core.to_text(spec).split(','): match = CHMOD_CLAUSE_PAT.match(clause) who, op, perms = match.groups() for ch in who or 'a': mask = CHMOD_MASKS[ch] bits = CHMOD_BITS[ch] cur_perm_bits = mode & mask new_perm_bits = reduce(operator.or_, (bits[p] for p in perms), 0) mode &= ~mask if op == '=': mode |= new_perm_bits elif op == '+': mode |= new_perm_bits | cur_perm_bits else: mode |= cur_perm_bits & ~new_perm_bits return mode def set_file_mode(path, spec, fd=None): """ Update the permissions of a file using the same syntax as chmod(1). """ if isinstance(spec, int): new_mode = spec elif not mitogen.core.PY3 and isinstance(spec, long): new_mode = spec elif spec.isdigit(): new_mode = int(spec, 8) else: mode = os.stat(path).st_mode new_mode = apply_mode_spec(spec, mode) if fd is not None and hasattr(os, 'fchmod'): os.fchmod(fd, new_mode) else: os.chmod(path, new_mode) def file_exists(path): """ Return :data:`True` if `path` exists. This is a wrapper function over :func:`os.path.exists`, since its implementation module varies across Python versions. """ return os.path.exists(path) mitogen-0.3.9/ansible_mitogen/transport_config.py000066400000000000000000000675541465666473100223220ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. """ Mitogen extends Ansible's target configuration mechanism in several ways that require some care: * Per-task configurables in Ansible like ansible_python_interpreter are connection-layer configurables in Mitogen. They must be extracted during each task execution to form the complete connection-layer configuration. * Mitogen has extra configurables not supported by Ansible at all, such as mitogen_ssh_debug_level. These are extracted the same way as ansible_python_interpreter. * Mitogen allows connections to be delegated to other machines. Ansible has no internal framework for this, and so Mitogen must figure out a delegated connection configuration all on its own. It cannot reuse much of the Ansible machinery for building a connection configuration, as that machinery is deeply spread out and hard-wired to expect Ansible's usual mode of operation. For normal and delegate_to connections, Ansible's PlayContext is reused where possible to maximize compatibility, but for proxy hops, configurations are built up using the HostVars magic class to call VariableManager.get_vars() behind the scenes on our behalf. Where Ansible has multiple sources of a configuration item, for example, ansible_ssh_extra_args, Mitogen must (ideally perfectly) reproduce how Ansible arrives at its value, without using mechanisms that are hard-wired or change across Ansible versions. That is what this file is for. It exports two spec classes, one that takes all information from PlayContext, and another that takes (almost) all information from HostVars. """ from __future__ import absolute_import, division, print_function from __future__ import unicode_literals __metaclass__ = type import abc import os import ansible.utils.shlex import ansible.constants as C from ansible.module_utils.six import with_metaclass from ansible.module_utils.parsing.convert_bool import boolean # this was added in Ansible >= 2.8.0; fallback to the default interpreter if necessary try: from ansible.executor.interpreter_discovery import discover_interpreter except ImportError: discover_interpreter = lambda action,interpreter_name,discovery_mode,task_vars: '/usr/bin/python' try: from ansible.utils.unsafe_proxy import AnsibleUnsafeText except ImportError: from ansible.vars.unsafe_proxy import AnsibleUnsafeText import mitogen.core def run_interpreter_discovery_if_necessary(s, task_vars, action, rediscover_python): """ Triggers ansible python interpreter discovery if requested. Caches this value the same way Ansible does it. For connections like `docker`, we want to rediscover the python interpreter because it could be different than what's ran on the host """ # keep trying different interpreters until we don't error if action._finding_python_interpreter: return action._possible_python_interpreter if s in ['auto', 'auto_legacy', 'auto_silent', 'auto_legacy_silent']: # python is the only supported interpreter_name as of Ansible 2.8.8 interpreter_name = 'python' discovered_interpreter_config = u'discovered_interpreter_%s' % interpreter_name if task_vars.get('ansible_facts') is None: task_vars['ansible_facts'] = {} if rediscover_python and task_vars.get('ansible_facts', {}).get(discovered_interpreter_config): # if we're rediscovering python then chances are we're running something like a docker connection # this will handle scenarios like running a playbook that does stuff + then dynamically creates a docker container, # then runs the rest of the playbook inside that container, and then rerunning the playbook again action._rediscovered_python = True # blow away the discovered_interpreter_config cache and rediscover del task_vars['ansible_facts'][discovered_interpreter_config] if discovered_interpreter_config not in task_vars['ansible_facts']: action._finding_python_interpreter = True # fake pipelining so discover_interpreter can be happy action._connection.has_pipelining = True s = AnsibleUnsafeText(discover_interpreter( action=action, interpreter_name=interpreter_name, discovery_mode=s, task_vars=task_vars)) # cache discovered interpreter task_vars['ansible_facts'][discovered_interpreter_config] = s action._connection.has_pipelining = False else: s = task_vars['ansible_facts'][discovered_interpreter_config] # propagate discovered interpreter as fact action._discovered_interpreter_key = discovered_interpreter_config action._discovered_interpreter = s action._finding_python_interpreter = False return s def parse_python_path(s, task_vars, action, rediscover_python): """ Given the string set for ansible_python_interpeter, parse it using shell syntax and return an appropriate argument vector. If the value detected is one of interpreter discovery then run that first. Caches python interpreter discovery value in `facts_from_task_vars` like how Ansible handles this. """ if not s: # if python_path doesn't exist, default to `auto` and attempt to discover it s = 'auto' s = run_interpreter_discovery_if_necessary(s, task_vars, action, rediscover_python) # if unable to determine python_path, fallback to '/usr/bin/python' if not s: s = '/usr/bin/python' return ansible.utils.shlex.shlex_split(s) def optional_secret(value): """ Wrap `value` in :class:`mitogen.core.Secret` if it is not :data:`None`, otherwise return :data:`None`. """ if value is not None: return mitogen.core.Secret(value) def first_true(it, default=None): """ Return the first truthy element from `it`. """ for elem in it: if elem: return elem return default class Spec(with_metaclass(abc.ABCMeta, object)): """ A source for variables that comprise a connection configuration. """ @abc.abstractmethod def transport(self): """ The name of the Ansible plug-in implementing the connection. """ @abc.abstractmethod def inventory_name(self): """ The name of the target being connected to as it appears in Ansible's inventory. """ @abc.abstractmethod def remote_addr(self): """ The network address of the target, or for container and other special targets, some other unique identifier. """ @abc.abstractmethod def remote_user(self): """ The username of the login account on the target. """ @abc.abstractmethod def password(self): """ The password of the login account on the target. """ @abc.abstractmethod def become(self): """ :data:`True` if privilege escalation should be active. """ @abc.abstractmethod def become_method(self): """ The name of the Ansible become method to use. """ @abc.abstractmethod def become_user(self): """ The username of the target account for become. """ @abc.abstractmethod def become_pass(self): """ The password of the target account for become. """ @abc.abstractmethod def port(self): """ The port of the login service on the target machine. """ @abc.abstractmethod def python_path(self): """ Path to the Python interpreter on the target machine. """ @abc.abstractmethod def host_key_checking(self): """ Whether or not to check the keys of the target machine """ @abc.abstractmethod def private_key_file(self): """ Path to the SSH private key file to use to login. """ @abc.abstractmethod def ssh_executable(self): """ Path to the SSH executable. """ @abc.abstractmethod def timeout(self): """ The generic timeout for all connections. """ @abc.abstractmethod def ansible_ssh_timeout(self): """ The SSH-specific timeout for a connection. """ @abc.abstractmethod def ssh_args(self): """ The list of additional arguments that should be included in an SSH invocation. """ @abc.abstractmethod def become_exe(self): """ The path to the executable implementing the become method on the remote machine. """ @abc.abstractmethod def sudo_args(self): """ The list of additional arguments that should be included in a become invocation. """ # TODO: split out into sudo_args/become_args. @abc.abstractmethod def mitogen_via(self): """ The value of the mitogen_via= variable for this connection. Indicates the connection should be established via an intermediary. """ @abc.abstractmethod def mitogen_kind(self): """ The type of container to use with the "setns" transport. """ @abc.abstractmethod def mitogen_mask_remote_name(self): """ Specifies whether to set a fixed "remote_name" field. The remote_name is the suffix of `argv[0]` for remote interpreters. By default it includes identifying information from the local process, which may be undesirable in some circumstances. """ @abc.abstractmethod def mitogen_buildah_path(self): """ The path to the "buildah" program for the 'buildah' transport. """ @abc.abstractmethod def mitogen_docker_path(self): """ The path to the "docker" program for the 'docker' transport. """ @abc.abstractmethod def mitogen_kubectl_path(self): """ The path to the "kubectl" program for the 'docker' transport. """ @abc.abstractmethod def mitogen_lxc_path(self): """ The path to the "lxc" program for the 'lxd' transport. """ @abc.abstractmethod def mitogen_lxc_attach_path(self): """ The path to the "lxc-attach" program for the 'lxc' transport. """ @abc.abstractmethod def mitogen_lxc_info_path(self): """ The path to the "lxc-info" program for the 'lxc' transport. """ @abc.abstractmethod def mitogen_machinectl_path(self): """ The path to the "machinectl" program for the 'setns' transport. """ @abc.abstractmethod def mitogen_podman_path(self): """ The path to the "podman" program for the 'podman' transport. """ @abc.abstractmethod def mitogen_ssh_keepalive_interval(self): """ The SSH ServerAliveInterval. """ @abc.abstractmethod def mitogen_ssh_keepalive_count(self): """ The SSH ServerAliveCount. """ @abc.abstractmethod def mitogen_ssh_debug_level(self): """ The SSH debug level. """ @abc.abstractmethod def mitogen_ssh_compression(self): """ Whether SSH compression is enabled. """ @abc.abstractmethod def extra_args(self): """ Connection-specific arguments. """ @abc.abstractmethod def ansible_doas_exe(self): """ Value of "ansible_doas_exe" variable. """ class PlayContextSpec(Spec): """ PlayContextSpec takes almost all its information as-is from Ansible's PlayContext. It is used for normal connections and delegate_to connections, and should always be accurate. """ def __init__(self, connection, play_context, transport, inventory_name): self._connection = connection self._play_context = play_context self._transport = transport self._inventory_name = inventory_name self._task_vars = self._connection._get_task_vars() # used to run interpreter discovery self._action = connection._action def transport(self): return self._transport def inventory_name(self): return self._inventory_name def remote_addr(self): return self._play_context.remote_addr def remote_user(self): return self._play_context.remote_user def become(self): return self._play_context.become def become_method(self): return self._play_context.become_method def become_user(self): return self._play_context.become_user def become_pass(self): # become_pass is owned/provided by the active become plugin. However # PlayContext is intertwined with it. Known complications # - ansible_become_password is higher priority than ansible_become_pass, # `play_context.become_pass` doesn't obey this (atleast with Mitgeon). # - `meta: reset_connection` runs `connection.reset()` but # `ansible_mitogen.connection.Connection.reset()` recreates the # connection object, setting `connection.become = None`. become_plugin = self._connection.become try: become_pass = become_plugin.get_option('become_pass', playcontext=self._play_context) except AttributeError: become_pass = self._play_context.become_pass return optional_secret(become_pass) def password(self): return optional_secret(self._play_context.password) def port(self): return self._play_context.port def python_path(self, rediscover_python=False): s = self._connection.get_task_var('ansible_python_interpreter') # #511, #536: executor/module_common.py::_get_shebang() hard-wires # "/usr/bin/python" as the default interpreter path if no other # interpreter is specified. return parse_python_path( s, task_vars=self._task_vars, action=self._action, rediscover_python=rediscover_python) def host_key_checking(self): def candidates(): yield self._connection.get_task_var('ansible_ssh_host_key_checking') yield self._connection.get_task_var('ansible_host_key_checking') yield C.HOST_KEY_CHECKING val = next((v for v in candidates() if v is not None), True) return boolean(val) def private_key_file(self): return self._play_context.private_key_file def ssh_executable(self): return C.config.get_config_value("ssh_executable", plugin_type="connection", plugin_name="ssh", variables=self._task_vars.get("vars", {})) def timeout(self): return self._play_context.timeout def ansible_ssh_timeout(self): return ( self._connection.get_task_var('ansible_timeout') or self._connection.get_task_var('ansible_ssh_timeout') or self.timeout() ) def ssh_args(self): return [ mitogen.core.to_text(term) for s in ( C.config.get_config_value("ssh_args", plugin_type="connection", plugin_name="ssh", variables=self._task_vars.get("vars", {})), C.config.get_config_value("ssh_common_args", plugin_type="connection", plugin_name="ssh", variables=self._task_vars.get("vars", {})), C.config.get_config_value("ssh_extra_args", plugin_type="connection", plugin_name="ssh", variables=self._task_vars.get("vars", {})) ) for term in ansible.utils.shlex.shlex_split(s or '') ] def become_exe(self): # In Ansible 2.8, PlayContext.become_exe always has a default value due # to the new options mechanism. Previously it was only set if a value # ("somewhere") had been specified for the task. # For consistency in the tests, here we make older Ansibles behave like # newer Ansibles. exe = self._play_context.become_exe if exe is None and self._play_context.become_method == 'sudo': exe = 'sudo' return exe def sudo_args(self): return [ mitogen.core.to_text(term) for term in ansible.utils.shlex.shlex_split( first_true(( self._play_context.become_flags, # Ansible <=2.7. getattr(self._play_context, 'sudo_flags', ''), # Ansible <=2.3. getattr(C, 'DEFAULT_BECOME_FLAGS', ''), getattr(C, 'DEFAULT_SUDO_FLAGS', '') ), default='') ) ] def mitogen_via(self): return self._connection.get_task_var('mitogen_via') def mitogen_kind(self): return self._connection.get_task_var('mitogen_kind') def mitogen_mask_remote_name(self): return self._connection.get_task_var('mitogen_mask_remote_name') def mitogen_buildah_path(self): return self._connection.get_task_var('mitogen_buildah_path') def mitogen_docker_path(self): return self._connection.get_task_var('mitogen_docker_path') def mitogen_kubectl_path(self): return self._connection.get_task_var('mitogen_kubectl_path') def mitogen_lxc_path(self): return self._connection.get_task_var('mitogen_lxc_path') def mitogen_lxc_attach_path(self): return self._connection.get_task_var('mitogen_lxc_attach_path') def mitogen_lxc_info_path(self): return self._connection.get_task_var('mitogen_lxc_info_path') def mitogen_podman_path(self): return self._connection.get_task_var('mitogen_podman_path') def mitogen_ssh_keepalive_interval(self): return self._connection.get_task_var('mitogen_ssh_keepalive_interval') def mitogen_ssh_keepalive_count(self): return self._connection.get_task_var('mitogen_ssh_keepalive_count') def mitogen_machinectl_path(self): return self._connection.get_task_var('mitogen_machinectl_path') def mitogen_ssh_debug_level(self): return self._connection.get_task_var('mitogen_ssh_debug_level') def mitogen_ssh_compression(self): return self._connection.get_task_var('mitogen_ssh_compression') def extra_args(self): return self._connection.get_extra_args() def ansible_doas_exe(self): return ( self._connection.get_task_var('ansible_doas_exe') or os.environ.get('ANSIBLE_DOAS_EXE') ) class MitogenViaSpec(Spec): """ MitogenViaSpec takes most of its information from the HostVars of the running task. HostVars is a lightweight wrapper around VariableManager, so it is better to say that VariableManager.get_vars() is the ultimate source of MitogenViaSpec's information. Due to this, mitogen_via= hosts must have all their configuration information represented as host and group variables. We cannot use any per-task configuration, as all that data belongs to the real target host. Ansible uses all kinds of strange historical logic for calculating variables, including making their precedence configurable. MitogenViaSpec must ultimately reimplement all of that logic. It is likely that if you are having a configruation problem with connection delegation, the answer to your problem lies in the method implementations below! """ def __init__(self, inventory_name, host_vars, task_vars, become_method, become_user, play_context, action): """ :param str inventory_name: The inventory name of the intermediary machine, i.e. not the target machine. :param dict host_vars: The HostVars magic dictionary provided by Ansible in task_vars. :param dict task_vars: Task vars provided by Ansible. :param str become_method: If the mitogen_via= spec included a become method, the method it specifies. :param str become_user: If the mitogen_via= spec included a become user, the user it specifies. :param PlayContext play_context: For some global values **only**, the PlayContext used to describe the real target machine. Values from this object are **strictly restricted** to values that are Ansible-global, e.g. the passwords specified interactively. :param ActionModuleMixin action: Backref to the ActionModuleMixin required for ansible interpreter discovery """ self._inventory_name = inventory_name self._host_vars = host_vars self._task_vars = task_vars self._become_method = become_method self._become_user = become_user # Dangerous! You may find a variable you want in this object, but it's # almost certainly for the wrong machine! self._dangerous_play_context = play_context self._action = action def transport(self): return ( self._host_vars.get('ansible_connection') or C.DEFAULT_TRANSPORT ) def inventory_name(self): return self._inventory_name def remote_addr(self): # play_context.py::MAGIC_VARIABLE_MAPPING return ( self._host_vars.get('ansible_ssh_host') or self._host_vars.get('ansible_host') or self._inventory_name ) def remote_user(self): return ( self._host_vars.get('ansible_ssh_user') or self._host_vars.get('ansible_user') or C.DEFAULT_REMOTE_USER ) def become(self): return bool(self._become_user) def become_method(self): return ( self._become_method or self._host_vars.get('ansible_become_method') or C.DEFAULT_BECOME_METHOD ) def become_user(self): return self._become_user def become_pass(self): return optional_secret( self._host_vars.get('ansible_become_pass') or self._host_vars.get('ansible_become_password') ) def password(self): return optional_secret( self._host_vars.get('ansible_ssh_pass') or self._host_vars.get('ansible_password') ) def port(self): return ( self._host_vars.get('ansible_ssh_port') or self._host_vars.get('ansible_port') or C.DEFAULT_REMOTE_PORT ) def python_path(self, rediscover_python=False): s = self._host_vars.get('ansible_python_interpreter') # #511, #536: executor/module_common.py::_get_shebang() hard-wires # "/usr/bin/python" as the default interpreter path if no other # interpreter is specified. return parse_python_path( s, task_vars=self._task_vars, action=self._action, rediscover_python=rediscover_python) def host_key_checking(self): def candidates(): yield self._host_vars.get('ansible_ssh_host_key_checking') yield self._host_vars.get('ansible_host_key_checking') yield C.HOST_KEY_CHECKING val = next((v for v in candidates() if v is not None), True) return boolean(val) def private_key_file(self): # TODO: must come from PlayContext too. return ( self._host_vars.get('ansible_ssh_private_key_file') or self._host_vars.get('ansible_private_key_file') or C.DEFAULT_PRIVATE_KEY_FILE ) def ssh_executable(self): return C.config.get_config_value("ssh_executable", plugin_type="connection", plugin_name="ssh", variables=self._task_vars.get("vars", {})) def timeout(self): # TODO: must come from PlayContext too. return C.DEFAULT_TIMEOUT def ansible_ssh_timeout(self): return ( self._host_vars.get('ansible_timeout') or self._host_vars.get('ansible_ssh_timeout') or self.timeout() ) def ssh_args(self): return [ mitogen.core.to_text(term) for s in ( C.config.get_config_value("ssh_args", plugin_type="connection", plugin_name="ssh", variables=self._task_vars.get("vars", {})), C.config.get_config_value("ssh_common_args", plugin_type="connection", plugin_name="ssh", variables=self._task_vars.get("vars", {})), C.config.get_config_value("ssh_extra_args", plugin_type="connection", plugin_name="ssh", variables=self._task_vars.get("vars", {})) ) for term in ansible.utils.shlex.shlex_split(s) if s ] def become_exe(self): return ( self._host_vars.get('ansible_become_exe') or C.DEFAULT_BECOME_EXE ) def sudo_args(self): return [ mitogen.core.to_text(term) for s in ( self._host_vars.get('ansible_sudo_flags') or '', self._host_vars.get('ansible_become_flags') or '', ) for term in ansible.utils.shlex.shlex_split(s) ] def mitogen_via(self): return self._host_vars.get('mitogen_via') def mitogen_kind(self): return self._host_vars.get('mitogen_kind') def mitogen_mask_remote_name(self): return self._host_vars.get('mitogen_mask_remote_name') def mitogen_buildah_path(self): return self._host_vars.get('mitogen_buildah_path') def mitogen_docker_path(self): return self._host_vars.get('mitogen_docker_path') def mitogen_kubectl_path(self): return self._host_vars.get('mitogen_kubectl_path') def mitogen_lxc_path(self): return self._host_vars.get('mitogen_lxc_path') def mitogen_lxc_attach_path(self): return self._host_vars.get('mitogen_lxc_attach_path') def mitogen_lxc_info_path(self): return self._host_vars.get('mitogen_lxc_info_path') def mitogen_podman_path(self): return self._host_vars.get('mitogen_podman_path') def mitogen_ssh_keepalive_interval(self): return self._host_vars.get('mitogen_ssh_keepalive_interval') def mitogen_ssh_keepalive_count(self): return self._host_vars.get('mitogen_ssh_keepalive_count') def mitogen_machinectl_path(self): return self._host_vars.get('mitogen_machinectl_path') def mitogen_ssh_debug_level(self): return self._host_vars.get('mitogen_ssh_debug_level') def mitogen_ssh_compression(self): return self._host_vars.get('mitogen_ssh_compression') def extra_args(self): return [] # TODO def ansible_doas_exe(self): return ( self._host_vars.get('ansible_doas_exe') or os.environ.get('ANSIBLE_DOAS_EXE') ) mitogen-0.3.9/ansible_mitogen/utils/000077500000000000000000000000001465666473100175065ustar00rootroot00000000000000mitogen-0.3.9/ansible_mitogen/utils/__init__.py000066400000000000000000000011341465666473100216160ustar00rootroot00000000000000from __future__ import absolute_import, division, print_function __metaclass__ = type import re import ansible __all__ = [ 'ansible_version', ] def _parse(v_string): # Adapted from distutils.version.LooseVersion.parse() component_re = re.compile(r'(\d+ | [a-z]+ | \.)', re.VERBOSE) for component in component_re.split(v_string): if not component or component == '.': continue try: yield int(component) except ValueError: yield component ansible_version = tuple(_parse(ansible.__version__)) del _parse del re del ansible mitogen-0.3.9/ansible_mitogen/utils/unsafe.py000066400000000000000000000050321465666473100213410ustar00rootroot00000000000000from __future__ import absolute_import, division, print_function __metaclass__ = type import ansible import ansible.utils.unsafe_proxy import ansible_mitogen.utils import mitogen import mitogen.core import mitogen.utils __all__ = [ 'cast', ] def _cast_to_dict(obj): return {cast(k): cast(v) for k, v in obj.items()} def _cast_to_list(obj): return [cast(v) for v in obj] def _cast_unsafe(obj): return obj._strip_unsafe() def _passthrough(obj): return obj # A dispatch table to cast objects based on their exact type. # This is an optimisation, reliable fallbacks are required (e.g. isinstance()) _CAST_DISPATCH = { bytes: bytes, dict: _cast_to_dict, list: _cast_to_list, tuple: _cast_to_list, mitogen.core.UnicodeType: mitogen.core.UnicodeType, } _CAST_DISPATCH.update({t: _passthrough for t in mitogen.utils.PASSTHROUGH}) if hasattr(ansible.utils.unsafe_proxy.AnsibleUnsafeText, '_strip_unsafe'): _CAST_DISPATCH.update({ ansible.utils.unsafe_proxy.AnsibleUnsafeBytes: _cast_unsafe, ansible.utils.unsafe_proxy.AnsibleUnsafeText: _cast_unsafe, ansible.utils.unsafe_proxy.NativeJinjaUnsafeText: _cast_unsafe, }) elif ansible_mitogen.utils.ansible_version[:2] <= (2, 16): _CAST_DISPATCH.update({ ansible.utils.unsafe_proxy.AnsibleUnsafeBytes: bytes, ansible.utils.unsafe_proxy.AnsibleUnsafeText: mitogen.core.UnicodeType, }) else: mitogen_ver = '.'.join(str(v) for v in mitogen.__version__) raise ImportError("Mitogen %s can't unwrap Ansible %s AnsibleUnsafe objects" % (mitogen_ver, ansible.__version__)) def cast(obj): """ Return obj (or a copy) with subtypes of builtins cast to their supertype. This is an enhanced version of :func:`mitogen.utils.cast`. In addition it handles ``ansible.utils.unsafe_proxy.AnsibleUnsafeText`` and variants. There are types handled by :func:`ansible.utils.unsafe_proxy.wrap_var()` that this function currently does not handle (e.g. `set()`), or preserve preserve (e.g. `tuple()`). Future enhancements may change this. :param obj: Object to undecorate. :returns: Undecorated object. """ # Fast path: obj is a known type, dispatch directly try: unwrapper = _CAST_DISPATCH[type(obj)] except KeyError: pass else: return unwrapper(obj) # Slow path: obj is some unknown subclass if isinstance(obj, dict): return _cast_to_dict(obj) if isinstance(obj, (list, tuple)): return _cast_to_list(obj) return mitogen.utils.cast(obj) mitogen-0.3.9/dev_requirements.txt000066400000000000000000000004061465666473100173310ustar00rootroot00000000000000# This file is no longer used by CI jobs, it's mostly for interactive use. # Instead CI jobs grab the relevant sub-requirement. # mitogen_tests -r tests/requirements.txt # ansible_tests -r tests/ansible/requirements.txt # readthedocs -r docs/requirements.txt mitogen-0.3.9/docs/000077500000000000000000000000001465666473100141375ustar00rootroot00000000000000mitogen-0.3.9/docs/.gitignore000066400000000000000000000000061465666473100161230ustar00rootroot00000000000000build mitogen-0.3.9/docs/Makefile000066400000000000000000000051541465666473100156040ustar00rootroot00000000000000# Makefile for Sphinx documentation # default: sphinx-build . build/html/ # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = build # User-friendly check for sphinx-build ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) $(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from https://sphinx-doc.org/) endif # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . # the i18n builder cannot share the environment and doctrees with the others I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help 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 " 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)" @echo " coverage to run coverage check of the documentation (if enabled)" .PHONY: clean clean: rm -rf $(BUILDDIR)/* .PHONY: html html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." .PHONY: dirhtml dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." .PHONY: changes changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." .PHONY: linkcheck 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." .PHONY: doctest doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." .PHONY: coverage coverage: $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage @echo "Testing of coverage in the sources finished, look at the " \ "results in $(BUILDDIR)/coverage/python.txt." mitogen-0.3.9/docs/_static/000077500000000000000000000000001465666473100155655ustar00rootroot00000000000000mitogen-0.3.9/docs/_static/style.css000066400000000000000000000042741465666473100174460ustar00rootroot00000000000000 body { font-size: 100%; } .sphinxsidebarwrapper { padding-top: 0 !important; } .sphinxsidebar { font-size: 80% !important; } .sphinxsidebar h3 { font-size: 130% !important; } img + p, h1 + p, h2 + p, h3 + p, h4 + p, h5 + p { margin-top: 0; } .section > h3:first-child { margin-top: 15px !important; } .body h1 { font-size: 200% !important; } .body h2 { font-size: 165% !important; } .body h3 { font-size: 125% !important; } .body h4 { font-size: 110% !important; font-weight: bold; } .body h5 { font-size: 100% !important; font-weight: bold; } .body h1, .body h2, .body h3, .body h4, .body h5 { margin-top: 30px !important; color: #7f0000; } .body h1 { margin-top: 0 !important; } body, .sphinxsidebar, .sphinxsidebar h1, .sphinxsidebar h2, .sphinxsidebar h3, .sphinxsidebar h4, .sphinxsidebar h5, .body h1, .body h2, .body h3, .body h4, .body h5 { /*font-family: sans-serif !important;*/ font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol !important; } .document { width: 1000px !important; } div.figure { padding: 0; } div.body li { margin-bottom: 0.5em; } /* * Undo the hyphens: auto in Sphinx basic.css. */ div.body p, div.body dd, div.body li, div.body blockquote { -moz-hyphens: inherit; -ms-hyphens: inherit; -webkit-hyphens: inherit; hyphens: inherit; } /* * Setting :width; on an image causes Sphinx to turn the image into a link, so * set :Class: instead. */ .mitogen-full-width { width: 100%; } .mitogen-right-150 { float: right; padding-left: 8px; width: 150px; } .mitogen-right-180 { float: right; padding-left: 8px; width: 180px; } .mitogen-right-225 { float: right; padding-left: 8px; width: 225px; } .mitogen-right-275 { float: right; padding-left: 8px; width: 275px; } .mitogen-right-300 { float: right; padding-left: 8px; width: 300px; } .mitogen-right-350 { float: right; padding-left: 8px; width: 350px; } .mitogen-logo-wrap { shape-margin: 8px; shape-outside: polygon( 100% 0, 50% 10%, 24% 24%, 0% 50%, 24% 75%, 50% 90%, 100% 100% ); } mitogen-0.3.9/docs/_templates/000077500000000000000000000000001465666473100162745ustar00rootroot00000000000000mitogen-0.3.9/docs/_templates/github.html000066400000000000000000000002531465666473100204440ustar00rootroot00000000000000


Star

mitogen-0.3.9/docs/_templates/globaltoc.html000066400000000000000000000000201465666473100211200ustar00rootroot00000000000000{{ toctree() }} mitogen-0.3.9/docs/_templates/layout.html000066400000000000000000000012361465666473100205010ustar00rootroot00000000000000{% extends "!layout.html" %} {% set css_files = css_files + ['_static/style.css'] %} {# We don't support Sphinx search, so don't let its JS either. #} {% block scripts %} {% endblock %} {# Alabaster ships a completely useless custom.css, suppress it. #} {%- block extrahead %} {% endblock %} {% block footer %} {{ super() }} {% endblock %} mitogen-0.3.9/docs/ansible_detailed.rst000066400000000000000000001530121465666473100201430ustar00rootroot00000000000000 .. _ansible_detailed: Mitogen for Ansible =================== .. image:: images/mitogen.svg :class: mitogen-right-180 mitogen-logo-wrap **Mitogen for Ansible** is a completely redesigned UNIX connection layer and module runtime for `Ansible`_. Requiring minimal configuration changes, it updates Ansible's slow and wasteful shell-centric implementation with pure-Python equivalents, invoked via highly efficient remote procedure calls to persistent interpreters tunnelled over SSH. No changes are required to target hosts. The extension is considered stable and real-world use is encouraged. .. _Ansible: https://www.ansible.com/ .. _Bug reports: https://github.com/mitogen-hq/mitogen/issues/new/choose Overview -------- **Expect a 1.25x - 7x speedup** and a **CPU usage reduction of at least 2x**, depending on network conditions, modules executed, and time already spent by targets on useful work. Mitogen cannot improve a module once it is executing, it can only ensure the module executes as quickly as possible. * **One connection is used per target**, in addition to one sudo invocation per user account. This is much better than SSH multiplexing combined with pipelining, as significant state can be maintained in RAM between steps, and system logs aren't spammed with repeat authentication events. * **A single network roundtrip is used** to execute a step whose code already exists in RAM on the target. Eliminating multiplexed SSH channel creation saves 4 ms runtime per 1 ms of network latency for every playbook step. * **Processes are aggressively reused**, avoiding the cost of invoking Python and recompiling imports, saving 300-800 ms for every playbook step. * Code is ephemerally cached in RAM, **reducing bandwidth usage by an order of magnitude** compared to SSH pipelining, with around 5x fewer frames traversing the network in a typical run. * **Fewer writes to the target filesystem occur**. In typical configurations, Ansible repeatedly rewrites and extracts ZIP files to multiple temporary directories on the target. Security issues relating to temporary files in cross-account scenarios are entirely avoided. The effect is most potent on playbooks that execute many **short-lived actions**, where Ansible's overhead dominates the cost of the operation, for example when executing large ``with_items`` loops to run simple commands or write files. Installation ------------ 1. Review :ref:`noteworthy_differences`. 2. Download and extract |mitogen_url|. 3. Modify ``ansible.cfg``: .. parsed-literal:: [defaults] strategy_plugins = /path/to/mitogen-|mitogen_version|/ansible_mitogen/plugins/strategy strategy = mitogen_linear The ``strategy`` key is optional. If omitted, the ``ANSIBLE_STRATEGY=mitogen_linear`` environment variable can be set on a per-run basis. Like ``mitogen_linear``, the ``mitogen_free`` and ``mitogen_host_pinned`` strategies exists to mimic the ``free`` and ``host_pinned`` strategies. Demo ~~~~ This demonstrates Ansible running a subset of the Mitogen integration tests concurrent to an equivalent run using the extension. .. raw:: html Testimonials ~~~~~~~~~~~~ * "With mitogen **my playbook runtime went from 45 minutes to just under 3 minutes**. Awesome work!" * "The runtime was reduced from **1.5 hours on 4 servers to just under 3 minutes**. Thanks!" * "Oh, performance improvement using Mitogen is *huge*. As mentioned before, running with Mitogen enables takes 7m36 (give or take a few seconds). Without Mitogen, the same run takes 19m49! **I'm not even deploying without Mitogen anymore** :)" * "**Works like a charm**, thank you for your quick response" * "I tried it out. **He is not kidding about the speed increase**." * "I don't know what kind of dark magic @dmw_83 has done, but his Mitogen strategy took Clojars' Ansible runs from **14 minutes to 2 minutes**. I still can't quite believe it." * "Enabling the mitogen plugin in ansible feels like switching from floppy to SSD" .. _noteworthy_differences: Noteworthy Differences ---------------------- * Mitogen 0.2.x supports Ansible 2.3-2.9; with Python 2.6, 2.7, or 3.6. Mitogen 0.3.1+ supports +-----------------+-----------------+ | Ansible version | Python versions | +=================+=================+ | 2.10 | | +-----------------+ | | 3 | 2.7, 3.6 - 3.11 | +-----------------+ | | 4 | | +-----------------+-----------------+ | 5 | 3.8 - 3.11 | +-----------------+-----------------+ | 6 | | +-----------------+ 3.8 - 3.12 | | 7 | | +-----------------+-----------------+ | 8 | 3.9 - 3.12 | +-----------------+-----------------+ | 9 | | +-----------------+ 3.10 - 3.12 | | 10 | | +-----------------+-----------------+ Verify your installation is running one of these versions by checking ``ansible --version`` output. * The ``raw`` action executes as a regular Mitogen connection, which requires Python on the target, precluding its use for installing Python. This will be addressed in a future release. For now, simply mix Mitogen and vanilla Ansible strategies: .. code-block:: yaml - hosts: web-servers strategy: linear tasks: - name: Install Python if necessary. raw: test -e /usr/bin/python || apt install -y python-minimal - hosts: web-servers strategy: mitogen_linear roles: - nginx - initech_app - y2k_fix * Ansible `become plugins `_ are not yet supported. * The ``doas``, ``su`` and ``sudo`` become methods are available. File bugs to register interest in more. * The ``sudo`` comands executed differ slightly compared to Ansible. In some cases where the target has a ``sudo`` configuration that restricts the exact commands allowed to run, it may be necessary to add a ``sudoers`` rule like: :: your_ssh_username = (ALL) NOPASSWD:/usr/bin/python -c* * The :ans:conn:`~buildah`, :ans:conn:`~docker`, :ans:conn:`~jail`, :ans:conn:`~kubectl`, :ans:conn:`~local`, :ans:conn:`~lxd`, :ans:conn:`~podman`, & :ans:conn:`~ssh` connection types are supported; also Mitogen-specific :ref:`mitogen_doas `, :ref:`machinectl `, :ref:`mitogen_su `, :ref:`mitogen_sudo `, and :ref:`setns ` types. File bugs to register interest in others. * Actions are single-threaded for each `(host, user account)` combination, including actions that execute on the local machine. Playbooks may experience slowdown compared to vanilla Ansible if they employ long-running ``local_action`` or ``delegate_to`` tasks delegating many target hosts to a single machine and user account. Ansible usually permits up to ``forks`` simultaneous local actions. Any long-running local actions that execute for every target will experience artificial serialization, causing slowdown equivalent to `task_duration * num_targets`. This will be addressed soon. * The Ansible 2.7 :ans:mod:`reboot` may require a ``pre_reboot_delay`` on systemd hosts, as insufficient time exists for the reboot command's exit status to be reported before necessary processes are torn down. * On OS X when a SSH password is specified and the default connection type of :ans:conn:`~smart` is used, Ansible may select the :ans:conn:`paramiko_ssh` rather than Mitogen. If you specify a password on OS X, ensure ``connection: ssh`` appears in your playbook, ``ansible.cfg``, or as ``-c ssh`` on the command-line. * Ansible permits up to ``forks`` connections to be setup in parallel, whereas in Mitogen this is handled by a fixed-size thread pool. Up to 32 connections may be established in parallel by default, this can be modified by setting the ``MITOGEN_POOL_SIZE`` environment variable. * Performance does not scale cleanly with target count. This will improve over time. * Performance on Python 3 is significantly worse than on Python 2. While this has not yet been investigated, at least some of the regression appears to be part of the core library, and should therefore be straightforward to fix as part of 0.2.x. * Connection and become timeouts are applied differently. Mitogen may consider a connection to have timed out, when Ansible would have waited longer or indefinately. For example if SSH authentication completes within the timeout, but execution of login scripts exceeds it - then Mitogen will consider the task to have timed out and that host to have failed. .. tests/ansible/integration/ssh/timeouts.yml covers (some of) this behaviour. .. * SSH and ``become`` are treated distinctly when applying timeouts, and timeouts apply up to the point when the new interpreter is ready to accept messages. Ansible has two timeouts: ``ConnectTimeout`` for SSH, applying up to when authentication completes, and a separate parallel timeout up to when ``become`` authentication completes. For busy targets, Ansible may successfully execute a module where Mitogen would fail without increasing the timeout. For sick targets, Ansible may hang indefinitely after authentication without executing a command, for example due to a stuck filesystem IO appearing in ``$HOME/.profile``. .. * "Module Replacer" style modules are not supported. These rarely appear in practice, and light web searches failed to reveal many examples of them. * The ``ansible_python_interpreter`` variable is parsed using a restrictive :mod:`shell-like ` syntax, permitting values such as ``/usr/bin/env FOO=bar python`` or ``source /opt/rh/rh-python36/enable && python``. Jinja2 templating is also supported for complex task-level interpreter settings. Ansible documents `ansible_python_interpreter `_ as an absolute path and releases since June 2024 (e.g. Ansible 10.1) reflect this. Older Ansible releases passed it to the shell unquoted. .. * Configurations will break that rely on the `hashbang argument splitting behaviour `_ of the ``ansible_python_interpreter`` setting, contrary to the Ansible documentation. This will be addressed in a future 0.2 release. New Features & Notes -------------------- Connection Delegation ~~~~~~~~~~~~~~~~~~~~~ .. image:: images/jumpbox.svg :class: mitogen-right-275 Included is a preview of **Connection Delegation**, a Mitogen-specific implementation of `stackable connection plug-ins`_. This enables connections via a bastion, or container connections delegated via their host machine, where reaching the host may entail further delegation. .. _Stackable connection plug-ins: https://github.com/ansible/proposals/issues/25 Unlike with SSH forwarding Ansible has complete visibility of the final topology, declarative configuration via static/dynamic inventory is possible, and data can be cached and re-served, and code executed on every intermediary. For example when targeting Docker containers on a remote machine, each module need only be uploaded once for the first task and container that requires it, then cached and served from the SSH account for every future task in any container. .. raw:: html
.. caution:: Connection delegation is a work in progress, bug reports are welcome. * Delegated connection setup is single-threaded; only one connection can be constructed in parallel per intermediary. * Inferring the configuration of intermediaries may be buggy, manifesting as duplicate connections between hops, due to not perfectly replicating the configuration Ansible would normally use for the intermediary. * Intermediary machines cannot use login and become passwords that were supplied to Ansible interactively. If an intermediary requires a password, it must be supplied via ``ansible_ssh_pass``, ``ansible_password``, or ``ansible_become_pass`` inventory variables. * Automatic tunnelling of SSH-dependent actions, such as the ``synchronize`` module, is not yet supported. This will be addressed in a future release. To enable connection delegation, set ``mitogen_via=`` on the command line, or as host and group variables. .. code-block:: ini # Docker container on web1.dc1 is reachable via web1.dc1. [app-containers.web1.dc1] app1.web1.dc1 ansible_host=app1 ansible_connection=docker mitogen_via=web1.dc1 # Web servers in DC1 are reachable via bastion.dc1 [dc1] web1.dc1 web2.dc1 web3.dc1 [dc1:vars] mitogen_via = bastion.dc1 # Web servers in DC2 are reachable via bastion.dc2 [dc2] web1.dc2 web2.dc2 web3.dc2 [dc2:vars] mitogen_via = bastion.dc2 # Prod bastions are reachable via a magic account on a # corporate network gateway. [bastions] bastion.dc1 mitogen_via=prod-ssh-access@corp-gateway.internal bastion.dc2 mitogen_via=prod-ssh-access@corp-gateway.internal [corp-gateway] corp-gateway.internal File Transfer ~~~~~~~~~~~~~ Normally :linux:man1:`sftp` or :linux:man1:`scp` are used to copy files by the :ans:mod:`~assemble`, :ans:mod:`~aws_s3`, :ans:mod:`~copy`, :ans:mod:`~patch`, :ans:mod:`~script`, :ans:mod:`~template`, :ans:mod:`~unarchive`, and :ans:mod:`~uri` actions, or when uploading modules with pipelining disabled. With Mitogen copies are implemented natively using the same interpreters, connection tree, and routed message bus that carries RPCs. This permits direct streaming between endpoints regardless of execution environment, without necessitating temporary copies in intermediary accounts or machines, for example when ``become`` is active, or in the presence of connection delegation. It also avoids the need to securely share temporary files between accounts and machines. As the implementation is self-contained, it is simple to make improvements like prioritizing transfers, supporting resume, or displaying progress bars. Safety ^^^^^^ Transfers proceed to a hidden file in the destination directory, with content and metadata synced using :linux:man2:`fsync` prior to rename over any existing file. This ensures the file remains consistent at all times, in the event of a crash, or when overlapping `ansible-playbook` runs deploy differing file contents. The :linux:man1:`sftp` and :linux:man1:`scp` tools may cause undetected data corruption in the form of truncated files, or files containing intermingled data segments from overlapping runs. As part of normal operation, both tools expose a window where readers may observe inconsistent file contents. Performance ^^^^^^^^^^^ One roundtrip initiates a transfer larger than 124 KiB, while smaller transfers are embedded in a 0-roundtrip pipelined call. For tools operating via SSH multiplexing, 4 roundtrips are required to configure the IO channel, followed by 6 roundtrips to transfer the file in the case of ``sftp``, in addition to the time to start the local and remote processes. An invocation of ``scp`` with an empty ``.profile`` over a 30 ms link takes ~140 ms, wasting 110 ms per invocation, rising to ~2,000 ms over a 400 ms UK-India link, wasting 1,600 ms per invocation. Interpreter Reuse ~~~~~~~~~~~~~~~~~ Python interpreters are aggressively reused to execute modules. While this works well, it violates an unwritten assumption, and so it is possible an earlier module execution could cause a subsequent module to fail, or for unrelated modules to interact poorly due to bad hygiene, such as monkey-patching that becomes stacked over repeat invocations. Before reporting a bug relating to a misbehaving module, please re-run with ``-e mitogen_task_isolation=fork`` to see if the problem abates. This may be set per-task, paying attention to the possibility an earlier task may be the true cause of a failure. .. code-block:: yaml - name: My task. broken_module: some_option: true vars: mitogen_task_isolation: fork If forking solves your problem, **please report a bug regardless**, as an internal list can be updated to prevent others bumping into the same problem. Interpreter Recycling ~~~~~~~~~~~~~~~~~~~~~ There is a per-target limit on the number of interpreters. Once 20 exist, the youngest is terminated before starting any new interpreter, preventing situations like below from triggering memory exhaustion. .. code-block:: yaml - hosts: corp_boxes vars: user_directory: [ # 10,000 corporate user accounts ] tasks: - name: Create user bashrc become: true vars: ansible_become_user: "{{item}}" copy: src: bashrc dest: "~{{item}}/.bashrc" with_items: "{{user_directory}}" The youngest is chosen to preserve useful accounts like ``root`` and ``postgresql`` that often appear early in a run, however it is simple to construct a playbook that defeats this strategy. A future version will key interpreters on the identity of their creating task, avoiding useful account recycling in every scenario. To modify the limit, set the ``MITOGEN_MAX_INTERPRETERS`` environment variable. Standard IO ~~~~~~~~~~~ Ansible uses pseudo TTYs for most invocations to allow it to type interactive passwords, however pseudo TTYs are disabled where standard input is required or ``sudo`` is not in use. Additionally when SSH multiplexing is enabled, a string like ``Shared connection to localhost closed\r\n`` appears in ``stderr`` of every invocation. Mitogen does not naturally require either of these, as command output is always embedded within framed messages, and it can simply call :py:func:`pty.openpty` in any location an interactive password must be typed. A major downside to Ansible's behaviour is that ``stdout`` and ``stderr`` are merged together into a single ``stdout`` variable, with carriage returns inserted in the output by the TTY layer. However ugly, the extension emulates this precisely, to avoid breaking playbooks that expect text to appear in specific variables with a particular linefeed style. .. _ansible_tempfiles: Temporary Files ~~~~~~~~~~~~~~~ Temporary file handling in Ansible is tricky, and the precise behaviour varies across major versions. A variety of temporary files and directories are created, depending on the operating mode. In the best case when pipelining is enabled and no temporary uploads are required, for each task Ansible will create one directory below a system-supplied temporary directory returned by :func:`tempfile.mkdtemp`, owned by the target account a new-style module will execute in. In other cases depending on the task type, whether become is active, whether the target become user is privileged, whether the associated action plugin needs to upload files, and whether the associated module needs to store files, Ansible may: * Create a directory owned by the SSH user either under ``remote_tmp``, or a system-default directory, * Upload action dependencies such as non-new style modules or rendered templates to that directory via :linux:man1:`sftp` or :linux:man1:`scp`. * Attempt to modify the directory's access control list to grant access to the target user using :linux:man1:`setfacl`, requiring that tool to be installed and a supported filesystem to be in use, or for the ``allow_world_readable_tmpfiles`` setting to be :data:`True`. * Create a directory owned by the target user either under ``remote_tmp``, or a system-default directory, if a new-style module needs a temporary directory and one was not previously created for a supporting file earlier in the invocation. In summary, for each task Ansible may create one or more of: * ``~ssh_user//...`` owned by the login user, * ``$TMPDIR/ansible-tmp-...`` owned by the login user, * ``$TMPDIR/ansible-tmp-...`` owned by the login user with ACLs permitting write access by the become user, * ``~become_user//...`` owned by the become user, * ``$TMPDIR/ansible__payload_.../`` owned by the become user, * ``$TMPDIR/ansible-module-tmp-.../`` owned by the become user. Mitogen for Ansible ^^^^^^^^^^^^^^^^^^^ As Mitogen can execute new-style modules from RAM, and transfer files to target user accounts without first writing an intermediary file in any separate login account, handling is relatively simplified. Temporary directories must exist to maintain compatibility with Ansible, as many modules introspect :data:`sys.argv` to find a directory where they may write files, however only one directory exists for the lifetime of each interpreter, its location is consistent for each account, and it is always privately owned by that account. During startup, the persistent remote interpreter tries the paths below until one is found that is writeable and lives on a filesystem with ``noexec`` disabled: 1. ``$variable`` and tilde-expanded ``remote_tmp`` setting from ``ansible.cfg`` 2. ``$variable`` and tilde-expanded ``system_tmpdirs`` setting from ``ansible.cfg`` 3. ``TMPDIR`` environment variable 4. ``TEMP`` environment variable 5. ``TMP`` environment variable 6. ``/tmp`` 7. ``/var/tmp`` 8. ``/usr/tmp`` 9. Current working directory The directory is created at startup and recursively destroyed during interpeter shutdown. Subdirectories are automatically created and destroyed by the controller for each task that requires them. Round-trip Avoidance ^^^^^^^^^^^^^^^^^^^^ Mitogen avoids many round-trips due to temporary file handling that are present in regular Ansible: * During task startup, it is not necessary to wait until the target has succeeded in creating a temporary directory. Instead, any failed attempt to create the directory will cause any subsequent RPC belonging to the same task to fail with the error that occurred. * As temporary directories are privately owned by the target user account, operations relating to modifying the directory to support cross-account access are avoided. * An explicit work-around is included to avoid the :ans:mod:`~copy` and :ans:mod:`~template` actions needlessly triggering a round-trip to set their temporary file as executable. * During task shutdown, it is not necessary to wait to learn if the target has succeeded in deleting a temporary directory, since any error that may occur is logged asynchronously via the logging framework, and the persistent remote interpreter arranges for all subdirectories to be destroyed during interpreter shutdown. .. _ansible_process_env: Process Environment Emulation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Since Ansible discards processes after each module invocation, follow-up tasks often (but not always) receive a new environment that will usually include changes made by previous tasks. As such modifications are common, for compatibility the extension emulates the existing behaviour as closely as possible. Some scenarios exist where emulation is impossible, for example, applying ``nsswitch.conf`` changes when ``nscd`` is not in use. If future scenarios appear that cannot be solved through emulation, the extension will be updated to automatically restart affected interpreters instead. DNS Resolution ^^^^^^^^^^^^^^ Modifications to ``/etc/resolv.conf`` cause the glibc resolver configuration to be reloaded via :linux:man3:`res_init`. This isn't necessary on some Linux distributions carrying glibc patches to automatically check ``/etc/resolv.conf`` periodically, however it is necessary on at least Debian and BSD derivatives. ``/etc/environment`` ^^^^^^^^^^^^^^^^^^^^ When ``become: true`` is active or SSH multiplexing is disabled, modifications by previous tasks to ``/etc/environment`` and ``$HOME/.pam_environment`` are normally reflected, since the content of those files is reapplied by `PAM `_ via `pam_env` on each authentication of ``sudo`` or ``sshd``. Both files are monitored for changes, and changes are applied where it appears safe to do so: * New keys are added if they did not otherwise exist in the inherited environment, or previously had the same value as found in the file before it changed. * Given a key (such as ``http_proxy``) added to the file where no such key exists in the environment, the key will be added. * Given a key (such as ``PATH``) where an existing environment key exists with a different value, the update or deletion will be ignored, as it is likely the key was overridden elsewhere after `pam_env` ran, such as by ``/etc/profile``. * Given a key removed from the file that had the same value as the existing environment key, the key will be removed. How Modules Execute ~~~~~~~~~~~~~~~~~~~ Ansible usually modifies, recompresses and reuploads modules every time they run on a target, work that must be repeated by the controller for every playbook step. With the extension any modifications are done on the target, allowing pristine copies of modules to be cached, reducing the necessity to re-transfer modules for each invocation. Unmodified modules are uploaded once on first use and cached in RAM for the remainder of the run. **Binary** Native executables detected using a complex heuristic. Arguments are supplied as a JSON file whose path is the sole script parameter. **Module Replacer** Python scripts detected by the presence of ``#<>`` appearing in their source. This type is not yet supported. **New-Style** Python scripts detected by the presence of ``from ansible.module_utils.`` appearing in their source. Arguments are supplied as JSON written to ``sys.stdin`` of the target interpreter. **JSON_ARGS** Detected by the presence of ``INCLUDE_ANSIBLE_MODULE_JSON_ARGS`` appearing in the script source. The interpreter directive (``#!interpreter``) is adjusted to match the corresponding value of ``{{ansible_*_interpreter}}`` if one is set. Arguments are supplied as JSON mixed into the script as a replacement for ``INCLUDE_ANSIBLE_MODULE_JSON_ARGS``. **WANT_JSON** Detected by the presence of ``WANT_JSON`` appearing in the script source. The interpreter directive is adjusted as above. Arguments are supplied as a JSON file whose path is the sole script parameter. **Old Style** Files not matching any of the above tests. The interpreter directive is adjusted as above. Arguments are supplied as a file whose path is the sole script parameter. The format of the file is ``"key=repr(value)[ key2=repr(value2)[ ..]] "``. Runtime Patches ~~~~~~~~~~~~~~~ Three small runtime patches are employed in ``strategy.py`` to hook into desirable locations, in order to override uses of shell, the module executor, and the mechanism for selecting a connection plug-in. While it is hoped the patches can be avoided in future, for interesting versions of Ansible deployed today this simply is not possible, and so they continue to be required. The patches are concise and behave conservatively, including by disabling themselves when non-Mitogen connections are in use. Additional third party plug-ins are unlikely to attempt similar patches, so the risk to an established configuration should be minimal. Flag Emulation ~~~~~~~~~~~~~~ Mitogen re-parses ``sudo_flags``, ``become_flags``, and ``ssh_flags`` using option parsers extracted from `sudo(1)` and `ssh(1)` in order to emulate their equivalent semantics. This allows: * robust support for common ``ansible.cfg`` tricks without reconfiguration, such as forwarding SSH agents across ``sudo`` invocations, * reporting on conflicting flag combinations, * reporting on unsupported flag combinations, * internally special-casing certain behaviour (like recursive agent forwarding) without boring the user with the details, * avoiding opening the extension up to untestable scenarios where users can insert arbitrary garbage between Mitogen and the components it integrates with, * precise emulation by an alternative implementation, for example if Mitogen grew support for Paramiko. Connection Types ---------------- Matching Ansible, connection variables are treated on a per-task basis, causing establishment of additional reuseable interpreters as necessary to match the configuration of each task. .. _method-buildah: Buildah ~~~~~~~ Like the :ans:conn:`buildah` except connection delegation is supported. * ``ansible_host``: Name of Buildah container (default: inventory hostname). * ``ansible_user``: Name of user within the container to execute as. .. _doas: Doas ~~~~ ``doas`` can be used as a connection method that supports connection delegation, or as a become method. When used as a become method: * ``ansible_python_interpreter`` * ``ansible_become_exe`` / ``ansible_doas_exe``: path to ``doas`` binary. * ``ansible_become_user`` (default: ``root``) * ``ansible_become_pass`` (default: assume passwordless) * ``mitogen_mask_remote_name``: if :data:`True`, mask the identity of the Ansible controller process on remote machines. To simplify diagnostics, Mitogen produces remote processes named like `"mitogen:user@controller.name:1234"`, however this may be a privacy issue in some circumstances. * ansible.cfg: ``timeout`` When used as the ``mitogen_doas`` connection method: * The inventory hostname has no special meaning. * ``ansible_user``: username to use. * ``ansible_password``: password to use. * ``ansible_doas_exe``: path to ``doas`` binary. * ``ansible_python_interpreter`` .. _method-docker: Docker ~~~~~~ Like the :ans:conn:`docker` except connection delegation is supported. * ``ansible_host``: Name of Docker container (default: inventory hostname). * ``ansible_user``: Name of user within the container to execute as. * ``mitogen_mask_remote_name``: if :data:`True`, mask the identity of the Ansible controller process on remote machines. To simplify diagnostics, Mitogen produces remote processes named like `"mitogen:user@controller.name:1234"`, however this may be a privacy issue in some circumstances. .. _method-jail: FreeBSD Jail ~~~~~~~~~~~~ Like the :ans:conn:`jail` except connection delegation is supported. * ``ansible_host``: Name of jail (default: inventory hostname). * ``ansible_user``: Name of user within the jail to execute as. * ``mitogen_mask_remote_name``: if :data:`True`, mask the identity of the Ansible controller process on remote machines. To simplify diagnostics, Mitogen produces remote processes named like `"mitogen:user@controller.name:1234"`, however this may be a privacy issue in some circumstances. .. _method-kubectl: Kubernetes Pod ~~~~~~~~~~~~~~ Like the :ans:conn:`kubectl` except connection delegation is supported. * ``ansible_host``: Name of pod (default: inventory hostname). * ``ansible_user``: Name of user to authenticate to API as. * ``mitogen_mask_remote_name``: if :data:`True`, mask the identity of the Ansible controller process on remote machines. To simplify diagnostics, Mitogen produces remote processes named like `"mitogen:user@controller.name:1234"`, however this may be a privacy issue in some circumstances. Local ~~~~~ Like the :ans:conn:`local` except connection delegation is supported. * ``ansible_python_interpreter`` Podman ~~~~~~ Like :ans:conn:`podman` except connection delegation is supported. * ``ansible_host``: Name of container (default: inventory hostname). * ``ansible_user``: Name of user within the container to execute as. * ``mitogen_mask_remote_name``: if :data:`True`, mask the identity of the Ansible controller process on remote machines. To simplify diagnostics, Mitogen produces remote processes named like `"mitogen:user@controller.name:1234"`, however this may be a privacy issue in some circumstances. Process Model ^^^^^^^^^^^^^ Ansible usually executes local connection commands as a transient subprocess of the forked worker executing a task. With the extension, the local connection exists as a persistent subprocess of the connection multiplexer. This means that global state mutations made to the top-level Ansible process that are normally visible to newly forked subprocesses, such as vars plug-ins that modify the environment, will not be reflected when executing local commands without additional effort. During execution the extension presently mimics the working directory and process environment inheritence of regular Ansible, however it is possible some additional differences exist that may break existing playbooks. .. _method-lxc: LXC ~~~ Connect to classic LXC containers, like the :ans:conn:`lxc` except connection delegation is supported, and ``lxc-attach`` is always used rather than the LXC Python bindings, as is usual with ``lxc``. * ``ansible_python_interpreter`` * ``ansible_host``: Name of LXC container (default: inventory hostname). * ``mitogen_lxc_attach_path``: path to ``lxc-attach`` command if not available on the system path. * ``mitogen_mask_remote_name``: if :data:`True`, mask the identity of the Ansible controller process on remote machines. To simplify diagnostics, Mitogen produces remote processes named like `"mitogen:user@controller.name:1234"`, however this may be a privacy issue in some circumstances. .. _method-lxd: LXD ~~~ Connect to modern LXD containers, like the :ans:conn:`lxd` except connection delegation is supported. The ``lxc`` command must be available on the host machine. * ``ansible_python_interpreter`` * ``ansible_host``: Name of LXC container (default: inventory hostname). * ``mitogen_lxc_path``: path to ``lxc`` command if not available on the system path. * ``mitogen_mask_remote_name``: if :data:`True`, mask the identity of the Ansible controller process on remote machines. To simplify diagnostics, Mitogen produces remote processes named like `"mitogen:user@controller.name:1234"`, however this may be a privacy issue in some circumstances. .. _machinectl: Machinectl ~~~~~~~~~~ Like the `machinectl third party plugin `_ except connection delegation is supported. This is a light wrapper around the :ref:`setns ` method. * ``ansible_host``: Name of Docker container (default: inventory hostname). * ``ansible_user``: Name of user within the container to execute as. * ``mitogen_machinectl_path``: path to ``machinectl`` command if not available as ``/bin/machinectl``. * ``mitogen_mask_remote_name``: if :data:`True`, mask the identity of the Ansible controller process on remote machines. To simplify diagnostics, Mitogen produces remote processes named like `"mitogen:user@controller.name:1234"`, however this may be a privacy issue in some circumstances. .. _setns: Setns ~~~~~ The ``setns`` method connects to Linux containers via `setns(2) `_. Unlike :ref:`method-docker`, :ref:`method-lxc`, and :ref:`method-lxd` the namespace transition is handled internally, ensuring optimal throughput to the child. This is necessary for :ref:`machinectl` where only PTY channels are supported. A utility program must be installed to discover the PID of the container's root process. * ``mitogen_kind``: one of ``docker``, ``lxc``, ``lxd`` or ``machinectl``. * ``ansible_host``: Name of container as it is known to the corresponding tool (default: inventory hostname). * ``ansible_user``: Name of user within the container to execute as. * ``mitogen_docker_path``: path to Docker if not available on the system path. * ``mitogen_lxc_path``: path to LXD's ``lxc`` command if not available as ``lxc-info``. * ``mitogen_lxc_info_path``: path to LXC classic's ``lxc-info`` command if not available as ``lxc-info``. * ``mitogen_machinectl_path``: path to ``machinectl`` command if not available as ``/bin/machinectl``. .. _su: Su ~~ Su can be used as a connection method that supports connection delegation, or as a become method. When used as a become method: * ``ansible_python_interpreter`` * ``ansible_su_exe``, ``ansible_become_exe`` * ``ansible_su_user``, ``ansible_become_user`` (default: ``root``) * ``ansible_su_pass``, ``ansible_become_pass`` (default: assume passwordless) * ``su_flags``, ``become_flags`` * ``mitogen_mask_remote_name``: if :data:`True`, mask the identity of the Ansible controller process on remote machines. To simplify diagnostics, Mitogen produces remote processes named like `"mitogen:user@controller.name:1234"`, however this may be a privacy issue in some circumstances. * ansible.cfg: ``timeout`` When used as the ``mitogen_su`` connection method: * The inventory hostname has no special meaning. * ``ansible_user``: username to su as. * ``ansible_password``: password to su as. * ``ansible_python_interpreter`` .. _sudo: Sudo ~~~~ Sudo can be used as a connection method that supports connection delegation, or as a become method. When used as a become method: * ``ansible_python_interpreter`` * ``ansible_sudo_exe``, ``ansible_become_exe`` * ``ansible_sudo_user``, ``ansible_become_user`` (default: ``root``) * ``ansible_sudo_pass``, ``ansible_become_pass`` (default: assume passwordless) * ``sudo_flags``, ``become_flags`` * ``mitogen_mask_remote_name``: if :data:`True`, mask the identity of the Ansible controller process on remote machines. To simplify diagnostics, Mitogen produces remote processes named like `"mitogen:user@controller.name:1234"`, however this may be a privacy issue in some circumstances. * ansible.cfg: ``timeout`` When used as the ``mitogen_sudo`` connection method: * The inventory hostname has no special meaning. * ``ansible_user``: username to sudo as. * ``ansible_password``: password to sudo as. * ``sudo_flags``, ``become_flags`` * ``ansible_python_interpreter`` SSH ~~~ Like the :ans:conn:`ssh` except connection delegation is supported. * ``ansible_ssh_timeout`` * ``ansible_host``, ``ansible_ssh_host`` * ``ansible_user``, ``ansible_ssh_user`` * ``ansible_port``, ``ssh_port`` * ``ansible_ssh_executable``, ``ssh_executable`` * ``ansible_ssh_private_key_file`` * ``ansible_ssh_pass``, ``ansible_password`` (default: assume passwordless) * ``ssh_args``, ``ssh_common_args``, ``ssh_extra_args`` * ``mitogen_mask_remote_name``: if :data:`True`, mask the identity of the Ansible controller process on remote machines. To simplify diagnostics, Mitogen produces remote processes named like `"mitogen:user@controller.name:1234"`, however this may be a privacy issue in some circumstances. * ``mitogen_ssh_debug_level``: integer between `0..3` indicating the SSH client debug level. Ansible must also be run with '-vvv' to view the output. * ``mitogen_ssh_compression``: :data:`True` to enable SSH compression, otherwise :data:`False`. This will change to off by default in a future release. If you are targetting many hosts on a fast network, please consider disabling SSH compression. * ``mitogen_ssh_keepalive_count``: integer count of server keepalive messages to which no reply is received before considering the SSH server dead. Defaults to 10. * ``mitogen_ssh_keepalive_interval``: integer seconds delay between keepalive messages. Defaults to 30. Debugging --------- Diagnostics and :py:mod:`logging` package output on targets are usually discarded. With Mitogen, these are captured and forwarded to the controller where they can be viewed with ``-vvv``. Basic high level logs are produced with ``-vvv``, with logging of all IO on the controller with ``-vvvv`` or higher. While uncaptured standard IO and the logging package on targets is forwarded, it is not possible to receive IO activity logs, as the forwarding process would would itself generate additional IO. To receive a complete trace of every process on every machine, file-based logging is necessary. File-based logging can be enabled by setting ``MITOGEN_ROUTER_DEBUG=1`` in your environment. When file-based logging is enabled, one file per context will be created on the local machine and every target machine, as ``/tmp/mitogen..log``. Common Problems ~~~~~~~~~~~~~~~ The most common bug reports fall into the following categories, so it is worth checking whether you can categorize a problem using the tools provided before reporting it: **Missed/Incorrect Configuration Variables** In some cases Ansible may support a configuration variable that Mitogen does not yet support, or Mitogen supports, but the support is broken. For example, Mitogen may pick the wrong username or SSH parameters. To detect this, use the special ``mitogen_get_stack`` action described below to verify the settings Mitogen has chosen for the connection make sense. **Process Environment Differences** Mitogen's process model differs significantly to Ansible's in many places. In the past, bugs have been reported because Ansible plug-ins modify an environment variable after Mitogen processes are started. If your task's failure may relate to the process environment in some way, for example, ``SSH_AUTH_SOCK``, ``LC_ALL`` or ``PATH``, then an environment difference may explain it. Environment differences are always considered bugs in the extension, and are very easy to repair, so even if you find a workaround, please report them to avoid someone else encountering the same problem. **Variable Expansion Differences** To avoid many classes of bugs, Mitogen avoids shell wherever possible. Ansible however is traditionally built on shell, and it is often difficult to tell just how many times a configuration parameter will pass through shell expansion and quoting, and in what context before it is used. Due to this, in some circumstances Mitogen may parse some expanded variables differently, for example, in the wrong user account. Careful review of ``-vvv`` and ``mitogen_ssh_debug_level`` logs can reveal this. For example in the past, Mitogen used a different method of expanding ``~/.ssh/id_rsa``, causing authentication to fail when ``ansible-playbook`` was run via ``sudo -E``. **External Tool Integration Differences** Mitogen reimplements any aspect of Ansible that involves integrating with SSH, sudo, Docker, or related tools. For this reason, sometimes its support for those tools differs or is less mature than in Ansible. In the past Mitogen has had bug reports due to failing to recognize a particular variation of a login or password prompt on an exotic or non-English operating system, or confusing a login banner for a password prompt. Careful review of ``-vvv`` logs help identify these cases, as Mitogen logs all strings it receives during connection, and how it interprets them. .. _mitogen-get-stack: The `mitogen_get_stack` Action ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ When a Mitogen strategy is loaded, a special ``mitogen_get_stack`` action is available that returns a concise description of the connection configuration as extracted from Ansible and passed to the core library. Using it, you can learn whether a problem lies in the Ansible extension or deeper in library code. The action may be used in a playbook as ``mitogen_get_stack:`` just like a regular module, or directly from the command-line:: $ ANSIBLE_STRATEGY=mitogen_linear ansible -m mitogen_get_stack -b -k k3 SSH password: k3 | SUCCESS => { "changed": true, "result": [ { "kwargs": { "check_host_keys": "enforce", "connect_timeout": 10, "hostname": "k3", "identities_only": false, "identity_file": null, "password": "mysecretpassword", "port": null, "python_path": null, "ssh_args": [ "-C", "-o", "ControlMaster=auto", "-o", "ControlPersist=60s" ], "ssh_debug_level": null, "ssh_path": "ssh", "username": null }, "method": "ssh" }, { "enable_lru": true, "kwargs": { "connect_timeout": 10, "password": null, "python_path": null, "sudo_args": [ "-H", "-S", "-n" ], "sudo_path": null, "username": "root" }, "method": "sudo" } ] } Each object in the list represents a single 'hop' in the connection, from nearest to furthest. Unlike in Ansible, the core library treats ``become`` steps and SSH steps identically, so they are represented distinctly in the output. The presence of ``null`` means no explicit value was extracted from Ansible, and either the Mitogen library or SSH will choose a value for the parameter. In the example above, Mitogen will choose ``/usr/bin/python`` for ``python_path``, and SSH will choose ``22`` for ``port``, or whatever ``Port`` it parses from ``~/.ssh/config``. Note the presence of ``null`` may indicate the extension failed to extract the correct value. When using ``mitogen_get_stack`` to diagnose a problem, pay special attention to ensuring the invocation exactly matches the problematic task. For example, if the failing task has ``delegate_to:`` or ``become:`` enabled, the ``mitogen_get_stack`` invocation must include those statements in order for the output to be accurate. If a playbook cannot start at all, you may need to temporarily use ``gather_facts: no`` to allow the first task to proceed. This action does not create connections, so if it is the first task, it is still possible to review its output. The `mitogen_ssh_debug_level` Variable ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Mitogen has support for capturing SSH diagnostic logs, and integrating them into the regular debug log output produced when ``-vvv`` is active. This provides a single audit trail of every component active during SSH authentication. Particularly for authentication failures, setting this variable to 3, in combination with ``-vvv``, allows review of every parameter passed to SSH, and review of every action SSH attempted during authentication. For example, this method can be used to ascertain whether SSH attempted agent authentication, or what private key files it was able to access and which it tried. Post-authentication Bootstrap Failure ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If logging indicates Mitogen was able to authenticate, but some error occurred after authentication preventing the Python bootstrap from completing, it can be immensely useful to temporarily replace ``ansible_python_interpreter`` with a wrapper that runs Python under ``strace``:: $ ssh badbox badbox$ cat > strace-python.sh #!/bin/sh strace -o /tmp/strace-python.$$ -ff -s 100 python "$@" ^D badbox$ chmod +x strace-python.sh badbox$ logout $ ansible-playbook site.yml \ -e ansible_python_interpreter=./strace-python.sh \ -l badbox This will produce a potentially large number of log files under ``/tmp/``. The lowest-numbered traced PID is generally the main Python interpreter. The most intricate bootstrap steps happen there, any error should be visible near the end of the trace. It is also possible the first stage bootstrap failed. That is usually the next lowest-numbered PID and tends to be the smallest file. Even if you can't ascertain the problem with your configuration from these logs, including them in a bug report can save days of detective effort. .. _diagnosing-hangs: Diagnosing Hangs ~~~~~~~~~~~~~~~~ If you encounter a hang, the ``MITOGEN_DUMP_THREAD_STACKS=`` environment variable arranges for each process on each machine to dump each thread stack into the logging framework every `secs` seconds, which is visible when running with ``-vvv``. However, certain controller hangs may render ``MITOGEN_DUMP_THREAD_STACKS`` ineffective, or occur too infrequently for interactive reproduction. In these cases :py:mod:`faulthandler` may be used with Python >= 3.3: 1. Once the hang occurs, observe the process tree using ``pstree`` or ``ps --forest``. 2. The most likely process to be hung is the connection multiplexer, which can easily be identified as the parent of all SSH client processes. 3. Send ``kill -SEGV `` to the multiplexer PID, causing it to print all thread stacks. 4. `File a bug `_ including a copy of the stacks and a description of the last task executing before the hang It is possible the hang occurred in a process on a target. If ``strace`` is available, look for the host name not listed in Ansible output as reporting a result for the most recent task, log into it, and use ``strace -ff -p `` on each process whose name begins with ``mitogen:``:: $ strace -ff -p 29858 strace: Process 29858 attached with 3 threads [pid 29864] futex(0x55ea9be52f60, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 0, NULL, 0xffffffff [pid 29860] restart_syscall(<... resuming interrupted poll ...> [pid 29858] futex(0x55ea9be52f60, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 0, NULL, 0xffffffff ^C $ This shows one thread waiting on IO (``poll``) and two more waiting on the same lock. It is taken from a real example of a deadlock due to a forking bug. Please include any such information for all processes that you are able to collect in any bug report. Getting Help ~~~~~~~~~~~~ Some users and developers hang out on the `#mitogen `_ channel on the FreeNode IRC network. Sample Profiles --------------- The summaries below may be reproduced using data and scripts maintained in the `pcaps branch `_. Traces were recorded using Ansible 2.5.14. Trivial Loop: Local Host ~~~~~~~~~~~~~~~~~~~~~~~~ This demonstrates Mitogen vs. SSH pipelining to the local machine running `bench/loop-100-items.yml `_, executing a simple command 100 times. Most Ansible controller overhead is isolated, characterizing just module executor and connection layer performance. Mitogen requires **63x less bandwidth and 5.9x less time**. .. image:: images/ansible/pcaps/loop-100-items-local.svg Unlike in SSH pipelining where payloads are sent as a single compressed block, by default Mitogen enables SSH compression for its uncompressed RPC data. In many-host scenarios it may be desirable to disable compression. This has negligible impact on footprint, since program code is separately compressed and sent only once. Compression also benefits SSH pipelining, but the presence of large precompressed per-task payloads may present a more significant CPU burden during many-host runs. .. image:: images/ansible/pcaps/loop-100-items-local-detail.svg In a detailed trace, improved interaction with the host machine is visible. In this playbook because no forks were required to start SSH clients from the worker process executing the loop, the worker's memory was never marked read-only, thus avoiding a major hidden performance problem - the page fault rate is more than halved. File Transfer: UK to France ~~~~~~~~~~~~~~~~~~~~~~~~~~~ `This playbook `_ was used to compare file transfer performance over a ~26 ms link. It uses the ``with_filetree`` loop syntax to copy a directory of 1,000 0-byte files to the target. .. raw:: html .. csv-table:: :header: , Secs, CPU Secs, Sent, Received, Roundtrips :class: nojunk :align: right Mitogen, 98.54, 43.04, "815 KiB", "447 KiB", 3.79 SSH Pipelining, "1,483.54", 329.37, "99,539 KiB", "6,870 KiB", 57.01 *Roundtrips* is the approximate number of network roundtrips required to describe the runtime that was consumed. Due to Mitogen's built-in file transfer support, continuous reinitialization of an external `scp`/`sftp` client is avoided, permitting large ``with_filetree`` copies to become practical without any special casing within the playbook or the Ansible implementation. DebOps: UK to India ~~~~~~~~~~~~~~~~~~~ This is an all-green run of 246 tasks from the `DebOps `_ 0.7.2 `common.yml `_ playbook over a ~370 ms link between the UK and India. The playbook touches a wide variety of modules, many featuring unavoidable waits for slow computation on the target. More tasks of a wider variety are featured than previously, placing strain on Mitogen's module loading and in-memory caching. By running over a long-distance connection, it highlights behaviour of the connection layer in the presence of high latency. Mitogen requires **14.5x less bandwidth and 4x less time**. .. image:: images/ansible/pcaps/debops-uk-india.svg Django App: UK to India ~~~~~~~~~~~~~~~~~~~~~~~ This short playbook features only 23 steps executed over the same ~370 ms link as previously, with many steps running unavoidably expensive tasks like building C++ code, and compiling static web site assets. Despite the small margin for optimization, Mitogen still manages **6.2x less bandwidth and 1.8x less time**. .. image:: images/ansible/pcaps/costapp-uk-india.svg mitogen-0.3.9/docs/api.rst000066400000000000000000000605071465666473100154520ustar00rootroot00000000000000 API Reference ************* Package Layout ============== mitogen Package --------------- .. automodule:: mitogen .. autodata:: mitogen.__version__ .. autodata:: mitogen.is_master .. autodata:: mitogen.context_id .. autodata:: mitogen.parent_id .. autodata:: mitogen.parent_ids .. autofunction:: mitogen.main mitogen.core ------------ .. automodule:: mitogen.core .. currentmodule:: mitogen.core .. autodecorator:: takes_econtext .. currentmodule:: mitogen.core .. autodecorator:: takes_router mitogen.master -------------- .. automodule:: mitogen.master mitogen.parent -------------- .. automodule:: mitogen.parent mitogen.fakessh --------------- .. image:: images/fakessh.svg :class: mitogen-right-300 .. automodule:: mitogen.fakessh .. currentmodule:: mitogen.fakessh .. autofunction:: run (dest, router, args, daedline=None, econtext=None) Message Class ============= .. currentmodule:: mitogen.core .. autoclass:: Message :members: Router Class ============ .. currentmodule:: mitogen.core .. autoclass:: Router :members: .. currentmodule:: mitogen.parent .. autoclass:: Router :members: .. currentmodule:: mitogen.master .. autoclass:: Router (broker=None) :members: .. _context-factories: Connection Methods ================== .. currentmodule:: mitogen.parent .. method:: Router.buildah (container=None, buildah_path=None, username=None, \**kwargs) Construct a context on the local machine over a ``buildah`` invocation. Accepts all parameters accepted by :meth:`local`, in addition to: :param str container: The name of the Buildah container to connect to. :param str buildah_path: Filename or complete path to the ``buildah`` binary. ``PATH`` will be searched if given as a filename. Defaults to ``buildah``. :param str username: Username to use, defaults to unset. .. currentmodule:: mitogen.parent .. method:: Router.fork (on_fork=None, on_start=None, debug=False, profiling=False, via=None) Construct a context on the local machine by forking the current process. The forked child receives a new identity, sets up a new broker and router, and responds to function calls identically to children created using other methods. The use of this method is strongly discouraged. It requires Python 2.6 or newer, as older Pythons made no effort to reset threading state upon fork. For long-lived processes, :meth:`local` is always better as it guarantees a pristine interpreter state that inherited little from the parent. Forking should only be used in performance-sensitive scenarios where short-lived children must be spawned to isolate potentially buggy code, and only after accounting for all the bad things possible as a result of, at a minimum: * Files open in the parent remaining open in the child, causing the lifetime of the underlying object to be extended indefinitely. * From the perspective of external components, this is observable in the form of pipes and sockets that are never closed, which may break anything relying on closure to signal protocol termination. * Descriptors that reference temporary files will not have their disk space reclaimed until the child exits. * Third party package state, such as urllib3's HTTP connection pool, attempting to write to file descriptors shared with the parent, causing random failures in both parent and child. * UNIX signal handlers installed in the parent process remaining active in the child, despite associated resources, such as service threads, child processes, resource usage counters or process timers becoming absent or reset in the child. * Library code that makes assumptions about the process ID remaining unchanged, for example to implement inter-process locking, or to generate file names. * Anonymous ``MAP_PRIVATE`` memory mappings whose storage requirement doubles as either parent or child dirties their pages. * File-backed memory mappings that cannot have their space freed on disk due to the mapping living on in the child. * Difficult to diagnose memory usage and latency spikes due to object graphs becoming unreferenced in either parent or child, causing immediate copy-on-write to large portions of the process heap. * Locks held in the parent causing random deadlocks in the child, such as when another thread emits a log entry via the :mod:`logging` package concurrent to another thread calling :meth:`fork`, or when a C extension module calls the C library allocator, or when a thread is using the C library DNS resolver, for example via :func:`socket.gethostbyname`. * Objects existing in Thread-Local Storage of every non-:meth:`fork` thread becoming permanently inaccessible, and never having their object destructors called, including TLS usage by native extension code, triggering many new variants of all the issues above. * Pseudo-Random Number Generator state that is easily observable by network peers to be duplicate, violating requirements of cryptographic protocols through one-time state reuse. In the worst case, children continually reuse the same state due to repeatedly forking from a static parent. :meth:`fork` cleans up Mitogen-internal objects, in addition to locks held by the :mod:`logging` package, reseeds :func:`random.random`, and the OpenSSL PRNG via :func:`ssl.RAND_add`, but only if the :mod:`ssl` module is already loaded. You must arrange for your program's state, including any third party packages in use, to be cleaned up by specifying an `on_fork` function. The associated stream implementation is :class:`mitogen.fork.Stream`. :param function on_fork: Function invoked as `on_fork()` from within the child process. This permits supplying a program-specific cleanup function to break locks and close file descriptors belonging to the parent from within the child. :param function on_start: Invoked as `on_start(econtext)` from within the child process after it has been set up, but before the function dispatch loop starts. This permits supplying a custom child main function that inherits rich data structures that cannot normally be passed via a serialization. :param mitogen.core.Context via: Same as the `via` parameter for :meth:`local`. :param bool debug: Same as the `debug` parameter for :meth:`local`. :param bool profiling: Same as the `profiling` parameter for :meth:`local`. .. method:: Router.local (remote_name=None, python_path=None, debug=False, connect_timeout=None, profiling=False, via=None) Construct a context on the local machine as a subprocess of the current process. The associated stream implementation is :class:`mitogen.master.Stream`. :param str remote_name: The ``argv[0]`` suffix for the new process. If `remote_name` is ``test``, the new process ``argv[0]`` will be ``mitogen:test``. If unspecified, defaults to ``@:``. This variable cannot contain slash characters, as the resulting ``argv[0]`` must be presented in such a way as to allow Python to determine its installation prefix. This is required to support virtualenv. :param str|list python_path: String or list path to the Python interpreter to use for bootstrap. Defaults to :data:`sys.executable` for local connections, and ``python`` for remote connections. It is possible to pass a list to invoke Python wrapped using another tool, such as ``["/usr/bin/env", "python"]``. :param bool debug: If :data:`True`, arrange for debug logging (:meth:`enable_debug`) to be enabled in the new context. Automatically :data:`True` when :meth:`enable_debug` has been called, but may be used selectively otherwise. :param bool unidirectional: If :data:`True`, arrange for the child's router to be constructed with :attr:`unidirectional routing ` enabled. Automatically :data:`True` when it was enabled for this router, but may still be explicitly set to :data:`False`. :param float connect_timeout: Fractional seconds to wait for the subprocess to indicate it is healthy. Defaults to 30 seconds. :param bool profiling: If :data:`True`, arrange for profiling (:data:`profiling`) to be enabled in the new context. Automatically :data:`True` when :data:`profiling` is :data:`True`, but may be used selectively otherwise. :param mitogen.core.Context via: If not :data:`None`, arrange for construction to occur via RPCs made to the context `via`, and for :data:`ADD_ROUTE ` messages to be generated as appropriate. .. code-block:: python # SSH to the remote machine. remote_machine = router.ssh(hostname='mybox.com') # Use the SSH connection to create a sudo connection. remote_root = router.sudo(username='root', via=remote_machine) .. method:: Router.doas (username=None, password=None, doas_path=None, password_prompt=None, incorrect_prompts=None, \**kwargs) Construct a context on the local machine over a ``doas`` invocation. The ``doas`` process is started in a newly allocated pseudo-terminal, and supports typing interactive passwords. Accepts all parameters accepted by :meth:`local`, in addition to: :param str username: Username to use, defaults to ``root``. :param str password: The account password to use if requested. :param str doas_path: Filename or complete path to the ``doas`` binary. ``PATH`` will be searched if given as a filename. Defaults to ``doas``. :param bytes password_prompt: A string that indicates ``doas`` is requesting a password. Defaults to ``Password:``. :param list incorrect_prompts: List of bytestrings indicating the password is incorrect. Defaults to `(b"doas: authentication failed")`. :raises mitogen.doas.PasswordError: A password was requested but none was provided, the supplied password was incorrect, or the target account did not exist. .. method:: Router.docker (container=None, image=None, docker_path=None, \**kwargs) Construct a context on the local machine within an existing or temporary new Docker container using the ``docker`` program. One of `container` or `image` must be specified. Accepts all parameters accepted by :meth:`local`, in addition to: :param str container: Existing container to connect to. Defaults to :data:`None`. :param str username: Username within the container to :func:`setuid` to. Defaults to :data:`None`, which Docker interprets as ``root``. :param str image: Image tag to use to construct a temporary container. Defaults to :data:`None`. :param str docker_path: Filename or complete path to the Docker binary. ``PATH`` will be searched if given as a filename. Defaults to ``docker``. .. method:: Router.jail (container, jexec_path=None, \**kwargs) Construct a context on the local machine within a FreeBSD jail using the ``jexec`` program. Accepts all parameters accepted by :meth:`local`, in addition to: :param str container: Existing container to connect to. Defaults to :data:`None`. :param str username: Username within the container to :func:`setuid` to. Defaults to :data:`None`, which ``jexec`` interprets as ``root``. :param str jexec_path: Filename or complete path to the ``jexec`` binary. ``PATH`` will be searched if given as a filename. Defaults to ``/usr/sbin/jexec``. .. method:: Router.kubectl (pod, kubectl_path=None, kubectl_args=None, \**kwargs) Construct a context in a container via the Kubernetes ``kubectl`` program. Accepts all parameters accepted by :meth:`local`, in addition to: :param str pod: Kubernetes pod to connect to. :param str kubectl_path: Filename or complete path to the ``kubectl`` binary. ``PATH`` will be searched if given as a filename. Defaults to ``kubectl``. :param list kubectl_args: Additional arguments to pass to the ``kubectl`` command. .. method:: Router.lxc (container, lxc_attach_path=None, \**kwargs) Construct a context on the local machine within an LXC classic container using the ``lxc-attach`` program. Accepts all parameters accepted by :meth:`local`, in addition to: :param str container: Existing container to connect to. Defaults to :data:`None`. :param str lxc_attach_path: Filename or complete path to the ``lxc-attach`` binary. ``PATH`` will be searched if given as a filename. Defaults to ``lxc-attach``. .. method:: Router.lxd (container, lxc_path=None, \**kwargs) Construct a context on the local machine within a LXD container using the ``lxc`` program. Accepts all parameters accepted by :meth:`local`, in addition to: :param str container: Existing container to connect to. Defaults to :data:`None`. :param str lxc_path: Filename or complete path to the ``lxc`` binary. ``PATH`` will be searched if given as a filename. Defaults to ``lxc``. .. currentmodule:: mitogen.parent .. method:: Router.podman (container=None, podman_path=None, username=None, \**kwargs) Construct a context on the local machine over a ``podman`` invocation. Accepts all parameters accepted by :meth:`local`, in addition to: :param str container: The name of the Podman container to connect to. :param str podman_path: Filename or complete path to the ``podman`` binary. ``PATH`` will be searched if given as a filename. Defaults to ``podman``. :param str username: Username to use, defaults to unset. .. method:: Router.setns (container, kind, username=None, docker_path=None, lxc_info_path=None, machinectl_path=None, \**kwargs) Construct a context in the style of :meth:`local`, but change the active Linux process namespaces via calls to `setns(2)` before executing Python. The namespaces to use, and the active root file system are taken from the root PID of a running Docker, LXC, LXD, or systemd-nspawn container. The setns method depends on the built-in :mod:`ctypes` module, and thus does not support Python 2.4. A program is required only to find the root PID, after which management of the child Python interpreter is handled directly. :param str container: Container to connect to. :param str kind: One of ``docker``, ``lxc``, ``lxd`` or ``machinectl``. :param str username: Username within the container to :func:`setuid` to. Defaults to ``root``. :param str docker_path: Filename or complete path to the Docker binary. ``PATH`` will be searched if given as a filename. Defaults to ``docker``. :param str lxc_path: Filename or complete path to the LXD ``lxc`` binary. ``PATH`` will be searched if given as a filename. Defaults to ``lxc``. :param str lxc_info_path: Filename or complete path to the LXC ``lxc-info`` binary. ``PATH`` will be searched if given as a filename. Defaults to ``lxc-info``. :param str machinectl_path: Filename or complete path to the ``machinectl`` binary. ``PATH`` will be searched if given as a filename. Defaults to ``machinectl``. .. method:: Router.su (username=None, password=None, su_path=None, password_prompt=None, incorrect_prompts=None, \**kwargs) Construct a context on the local machine over a ``su`` invocation. The ``su`` process is started in a newly allocated pseudo-terminal, and supports typing interactive passwords. Accepts all parameters accepted by :meth:`local`, in addition to: :param str username: Username to pass to ``su``, defaults to ``root``. :param str password: The account password to use if requested. :param str su_path: Filename or complete path to the ``su`` binary. ``PATH`` will be searched if given as a filename. Defaults to ``su``. :param bytes password_prompt: The string that indicates ``su`` is requesting a password. Defaults to ``Password:``. :param str incorrect_prompts: Strings that signal the password is incorrect. Defaults to `("su: sorry", "su: authentication failure")`. :raises mitogen.su.PasswordError: A password was requested but none was provided, the supplied password was incorrect, or (on BSD) the target account did not exist. .. method:: Router.sudo (username=None, sudo_path=None, password=None, \**kwargs) Construct a context on the local machine over a ``sudo`` invocation. The ``sudo`` process is started in a newly allocated pseudo-terminal, and supports typing interactive passwords. Accepts all parameters accepted by :meth:`local`, in addition to: :param str username: Username to pass to sudo as the ``-u`` parameter, defaults to ``root``. :param str sudo_path: Filename or complete path to the sudo binary. ``PATH`` will be searched if given as a filename. Defaults to ``sudo``. :param str password: The password to use if/when sudo requests it. Depending on the sudo configuration, this is either the current account password or the target account password. :class:`mitogen.sudo.PasswordError` will be raised if sudo requests a password but none is provided. :param bool set_home: If :data:`True`, request ``sudo`` set the ``HOME`` environment variable to match the target UNIX account. :param bool preserve_env: If :data:`True`, request ``sudo`` to preserve the environment of the parent process. :param str selinux_type: If not :data:`None`, the SELinux security context to use. :param str selinux_role: If not :data:`None`, the SELinux role to use. :param list sudo_args: Arguments in the style of :data:`sys.argv` that would normally be passed to ``sudo``. The arguments are parsed in-process to set equivalent parameters. Re-parsing ensures unsupported options cause :class:`mitogen.core.StreamError` to be raised, and that attributes of the stream match the actual behaviour of ``sudo``. .. method:: Router.ssh (hostname, username=None, ssh_path=None, ssh_args=None, port=None, check_host_keys='enforce', password=None, identity_file=None, identities_only=True, compression=True, \**kwargs) Construct a remote context over an OpenSSH ``ssh`` invocation. The ``ssh`` process is started in a newly allocated pseudo-terminal to support typing interactive passwords and responding to prompts, if a password is specified, or `check_host_keys=accept`. In other scenarios, ``BatchMode`` is enabled and no PTY is allocated. For many-target configurations, both options should be avoided as most systems have a conservative limit on the number of pseudo-terminals that may exist. Accepts all parameters accepted by :meth:`local`, in addition to: :param str username: The SSH username; default is unspecified, which causes SSH to pick the username to use. :param str ssh_path: Absolute or relative path to ``ssh``. Defaults to ``ssh``. :param list ssh_args: Additional arguments to pass to the SSH command. :param int port: Port number to connect to; default is unspecified, which causes SSH to pick the port number. :param str check_host_keys: Specifies the SSH host key checking mode. Defaults to ``enforce``. * ``ignore``: no host key checking is performed. Connections never fail due to an unknown or changed host key. * ``accept``: known hosts keys are checked to ensure they match, new host keys are automatically accepted and verified in future connections. * ``enforce``: known host keys are checked to ensure they match, unknown hosts cause a connection failure. :param str password: Password to type if/when ``ssh`` requests it. If not specified and a password is requested, :class:`mitogen.ssh.PasswordError` is raised. :param str identity_file: Path to an SSH private key file to use for authentication. Default is unspecified, which causes SSH to pick the identity file. When this option is specified, only `identity_file` will be used by the SSH client to perform authenticaion; agent authentication is automatically disabled, as is reading the default private key from ``~/.ssh/id_rsa``, or ``~/.ssh/id_dsa``. :param bool identities_only: If :data:`True` and a password or explicit identity file is specified, instruct the SSH client to disable any authentication identities inherited from the surrounding environment, such as those loaded in any running ``ssh-agent``, or default key files present in ``~/.ssh``. This ensures authentication attempts only occur using the supplied password or SSH key. :param bool compression: If :data:`True`, enable ``ssh`` compression support. Compression has a minimal effect on the size of modules transmitted, as they are already compressed, however it has a large effect on every remaining message in the otherwise uncompressed stream protocol, such as function call arguments and return values. :param int ssh_debug_level: Optional integer `0..3` indicating the SSH client debug level. :raises mitogen.ssh.PasswordError: A password was requested but none was specified, or the specified password was incorrect. :raises mitogen.ssh.HostKeyError: When `check_host_keys` is set to either ``accept``, indicates a previously recorded key no longer matches the remote machine. When set to ``enforce``, as above, but additionally indicates no previously recorded key exists for the remote machine. Context Class ============= .. currentmodule:: mitogen.core .. autoclass:: Context :members: .. currentmodule:: mitogen.parent .. autoclass:: Context :members: .. currentmodule:: mitogen.parent .. autoclass:: CallChain :members: Receiver Class ============== .. currentmodule:: mitogen.core .. autoclass:: Receiver :members: Sender Class ============ .. currentmodule:: mitogen.core .. autoclass:: Sender :members: Select Class ============ .. module:: mitogen.select .. currentmodule:: mitogen.select .. autoclass:: Event :members: .. autoclass:: Select :members: Channel Class ============= .. currentmodule:: mitogen.core .. autoclass:: Channel :members: Broker Class ============ .. currentmodule:: mitogen.core .. autoclass:: Broker :members: .. currentmodule:: mitogen.master .. autoclass:: Broker :members: Fork Safety =========== .. currentmodule:: mitogen.os_fork .. autoclass:: Corker :members: Utility Functions ================= .. currentmodule:: mitogen.core .. function:: now A reference to :func:`time.time` on Python 2, or :func:`time.monotonic` on Python >3.3. We prefer :func:`time.monotonic` when available to ensure timers are not impacted by system clock changes. .. module:: mitogen.utils A random assortment of utility functions useful on masters and children. .. currentmodule:: mitogen.utils .. autofunction:: cast .. currentmodule:: mitogen.utils .. autofunction:: setup_gil .. autofunction:: disable_site_packages .. autofunction:: log_to_file .. autofunction:: run_with_router(func, \*args, \**kwargs) .. currentmodule:: mitogen.utils .. decorator:: with_router Decorator version of :func:`run_with_router`. Example: .. code-block:: python @with_router def do_stuff(router, arg): pass do_stuff(blah, 123) Exceptions ========== .. currentmodule:: mitogen.core .. autoclass:: Error .. autoclass:: CallError .. autoclass:: ChannelError .. autoclass:: LatchError .. autoclass:: StreamError .. autoclass:: TimeoutError .. currentmodule:: mitogen.parent .. autoclass:: EofError .. autoclass:: CancelledError mitogen-0.3.9/docs/changelog.rst000066400000000000000000001572611465666473100166340ustar00rootroot00000000000000 .. _changelog: Release Notes ============= .. raw:: html To avail of fixes in an unreleased version, please download a ZIP file `directly from GitHub `_. v0.3.9 (2024-08-13) ------------------- * :gh:issue:`1097` Respect `ansible_facts.discovered_interpreter_python` when executing non new-style modules (e.g. JSONARGS style, WANT_JSON style). * :gh:issue:`1074` Support Ansible 10 (ansible-core 2.17) v0.3.8 (2024-07-30) ------------------- * :gh:issue:`952` Fix Ansible `--ask-become-pass`, add test coverage * :gh:issue:`957` Fix Ansible exception when executing against 10s of hosts "ValueError: filedescriptor out of range in select()" * :gh:issue:`1066` Support Ansible `ansible_host_key_checking` & `ansible_ssh_host_key_checking` * :gh:issue:`1090` CI: Migrate macOS integration tests to macOS 12, drop Python 2.7 jobs v0.3.7 (2024-04-08) ------------------- * :gh:issue:`1021` Support for Ansible 8 (ansible-core 2.15) * tests: Replace uses of ``include:`` & ``import:``, unsupported in Ansible 9 * :gh:issue:`1053` Support for Ansible 9 (ansible-core 2.16) v0.3.6 (2024-04-04) ------------------- * :gh:issue:`974` Support Ansible 7 * :gh:issue:`1046` Raise :py:exc:`TypeError` in :func:`` when casting a string subtype to `bytes()` or `str()` fails. This is potentially an API breaking change. Failures previously passed silently. * :gh:issue:`1046` Add :func:``, to cast :class:`ansible.utils.unsafe_proxy.AnsibleUnsafe` objects in Ansible 7+. v0.3.5 (2024-03-17) ------------------- * :gh:issue:`987` Support Python 3.11 * :gh:issue:`885` Fix :py:exc:`PermissionError` in :py:mod:`importlib` when becoming an unprivileged user with Python 3.x * :gh:issue:`1033` Support `PEP 451 `_, required by Python 3.12 * :gh:issue:`1033` Support Python 3.12 v0.3.4 (2023-07-02) ------------------- * :gh:issue:`929` Support Ansible 6 and ansible-core 2.13 * :gh:issue:`832` Fix runtime error when using the ansible.builtin.dnf module multiple times * :gh:issue:`925` :class:`ansible_mitogen.connection.Connection` no longer tries to close the connection on destruction. This is expected to reduce cases of `mitogen.core.Error: An attempt was made to enqueue a message with a Broker that has already exitted`. However it may result in resource leaks. * :gh:issue:`659` Removed :mod:`mitogen.compat.simplejson`, not needed with Python 2.7+, contained Python 3.x syntax errors * :gh:issue:`983` CI: Removed PyPI faulthandler requirement from tests * :gh:issue:`1001` CI: Fixed Debian 9 & 11 tests v0.3.3 (2022-06-03) ------------------- * :gh:issue:`906` Support packages dynamically inserted into sys.modules, e.g. `distro` >= 1.7.0 as `ansible.module_utils.distro`. * :gh:issue:`918` Support Python 3.10 * :gh:issue:`920` Support Ansible :ans:conn:`~podman` connection plugin * :gh:issue:`836` :func:`mitogen.utils.with_router` decorator preserves the docstring in addition to the name. * :gh:issue:`936` :ans:mod:`fetch` no longer emits `[DEPRECATION WARNING]: The '_remote_checksum()' method is deprecated.` v0.3.2 (2022-01-12) ------------------- * :gh:issue:`891` Correct `Framework :: Ansible` Trove classifier v0.3.1 (unreleased) ------------------- * :gh:issue:`874` Support for Ansible 5 (ansible-core 2.12) * :gh:issue:`774` Fix bootstrap failures on macOS 11.x and 12.x, involving Python 2.7 wrapper * :gh:issue:`834` Support for Ansible 3 and 4 (ansible-core 2.11) * :gh:issue:`869` Continuous Integration tests are now run with Tox * :gh:issue:`869` Continuous Integration tests now cover CentOS 6 & 8, Debian 9 & 11, Ubuntu 16.04 & 20.04 * :gh:issue:`860` Add initial support for podman connection (w/o Ansible support yet) * :gh:issue:`873` `python -c ...` first stage no longer uses :py:mod:`platform`` to detect the macOS release * :gh:issue:`876` `python -c ...` first stage no longer contains tab characters, to reduce size * :gh:issue:`878` Continuous Integration tests now correctly perform comparisons of 2 digit versions * :gh:issue:`878` Kubectl connector fixed with Ansible 2.10 and above v0.3.0 (2021-10-28) ------------------- This release separates itself from the v0.2.X releases. Ansible's API changed too much to support backwards compatibility so from now on, v0.2.X releases will be for Ansible < 2.10 and v0.3.X will be for Ansible 2.10+. `See here for details `_. * :gh:issue:`827` NewStylePlanner: detect `ansible_collections` imports * :gh:issue:`770` better check for supported Ansible version * :gh:issue:`731` ansible 2.10 support * :gh:issue:`652` support for ansible collections import hook * :gh:issue:`847` Removed historic Continuous Integration reverse shell v0.2.10 (2021-10-28) -------------------- * :gh:issue:`597` mitogen does not support Ansible 2.8 Python interpreter detection * :gh:issue:`655` wait_for_connection gives errors * :gh:issue:`672` cannot perform relative import error * :gh:issue:`673` mitogen fails on RHEL8 server with bash /usr/bin/python: No such file or directory * :gh:issue:`676` mitogen fail to run playbook without “/usr/bin/python” on target host * :gh:issue:`716` fetch fails with "AttributeError: 'ShellModule' object has no attribute 'tmpdir'" * :gh:issue:`756` ssh connections with `check_host_keys='accept'` would timeout, when using recent OpenSSH client versions. * :gh:issue:`758` fix initilialisation of callback plugins in test suite, to address a `KeyError` in :py:meth:`ansible.plugins.callback.CallbackBase.v2_runner_on_start` * :gh:issue:`775` Test with Python 3.9 * :gh:issue:`775` Add msvcrt to the default module deny list * :gh:issue:`847` Removed historic Continuous Integration reverse shell v0.2.9 (2019-11-02) ------------------- This release contains minimal fixes beyond those required for Ansible 2.9. * :gh:issue:`633`: :ans:mod:`meta: reset_connection ` could fail to reset a connection when ``become: true`` was set on the playbook. Thanks! ~~~~~~~ Mitogen would not be possible without the support of users. A huge thanks for bug reports, testing, features and fixes in this release contributed by `Can Ozokur `_. v0.2.8 (2019-08-18) ------------------- This release includes Ansible 2.8 and SELinux support, fixes for two deadlocks, and major internal design overhauls in preparation for future functionality. Enhancements ~~~~~~~~~~~~ * :gh:issue:`556`, :gh:issue:`587`: Ansible 2.8 is supported. `Become plugins `_ (:gh:issue:`631`) and `interpreter discovery `_ (:gh:issue:`630`) are not yet handled. * :gh:issue:`419`, :gh:issue:`470`: file descriptor usage is approximately halved, as it is no longer necessary to separately manage read and write sides to work around a design problem. * :gh:issue:`419`: setup for all connections happens almost entirely on one thread, reducing contention and context switching early in a run. * :gh:issue:`419`: Connection setup is better pipelined, eliminating some network round-trips. Most infrastructure is in place to support future removal of the final round-trips between a target booting and receiving function calls. * :gh:pull:`595`: the :meth:`~mitogen.parent.Router.buildah` connection method is available to manipulate `Buildah `_ containers, and is exposed to Ansible as the :ans:conn:`buildah`. * :gh:issue:`615`: a modified :ans:mod:`fetch` implements streaming transfer even when ``become`` is active, avoiding excess CPU and memory spikes, and improving performance. A representative copy of two 512 MiB files drops from 55.7 seconds to 6.3 seconds, with peak memory usage dropping from 10.7 GiB to 64.8 MiB. [#i615]_ * `Operon `_ no longer requires a custom library installation, both Ansible and Operon are supported by a single Mitogen release. * The ``MITOGEN_CPU_COUNT`` variable shards the connection multiplexer into per-CPU workers. This may improve throughput for large runs involving file transfer, and is required for future functionality. One multiplexer starts by default, to match existing behaviour. * :gh:commit:`d6faff06`, :gh:commit:`807cbef9`, :gh:commit:`e93762b3`, :gh:commit:`50bfe4c7`: locking is avoided on hot paths, and some locks are released before waking a thread that must immediately acquire the same lock. Mitogen for Ansible ~~~~~~~~~~~~~~~~~~~ * :gh:issue:`363`: fix an obscure race matching *Permission denied* errors from some versions of :linux:man1:`su` running on heavily loaded machines. * :gh:issue:`410`: Uses of :linux:man7:`unix` sockets are replaced with traditional :linux:man7:`pipe` pairs when SELinux is detected, to work around a broken heuristic in common SELinux policies that prevents inheriting :linux:man7:`unix` sockets across privilege domains. * :gh:issue:`467`: an incompatibility running Mitogen under `Molecule `_ was resolved. * :gh:issue:`547`, :gh:issue:`598`: fix a deadlock during initialization of connections, ``async`` tasks, tasks using custom :mod:`module_utils`, ``mitogen_task_isolation: fork`` modules, and modules present on an internal blacklist. This would manifest as a timeout or hang, was easily hit, had been present since 0.2.0, and likely impacted many users. * :gh:issue:`549`: the open file limit is increased to the permitted hard limit. It is common for distributions to ship with a higher hard limit than the default soft limit, allowing *"too many open files"* errors to be avoided more often in large runs without user intervention. * :gh:issue:`558`, :gh:issue:`582`: on Ansible 2.3 a directory was unconditionally deleted after the first module belonging to an action plug-in had executed, causing the :ans:mod:`unarchive` to fail. * :gh:issue:`578`: the extension could crash while rendering an error due to an incorrect format string. * :gh:issue:`590`: the importer can handle modules that replace themselves in :data:`sys.modules` with completely unrelated modules during import, as in the case of Ansible 2.8 :mod:`ansible.module_utils.distro`. * :gh:issue:`591`: the working directory is reset between tasks to ensure :func:`os.getcwd` cannot fail, in the same way :class:`AnsibleModule` resets it during initialization. However this restore happens before the module executes, ensuring code that calls :func:`os.getcwd` prior to :class:`AnsibleModule` initialization, such as the Ansible 2.7 :ans:mod:`pip`, cannot fail due to the actions of a prior task. * :gh:issue:`593`: the SSH connection method exposes ``mitogen_ssh_keepalive_interval`` and ``mitogen_ssh_keepalive_count`` variables, and the default timeout for an SSH server has been increased from `15*3` seconds to `30*10` seconds. * :gh:issue:`600`: functionality to reflect changes to ``/etc/environment`` did not account for Unicode file contents. The file may now use any single byte encoding. * :gh:issue:`602`: connection configuration is more accurately inferred for :ans:mod:`meta: reset_connection `, the :ans:mod:`synchronize`, and for any action plug-ins that establish additional connections. * :gh:issue:`598`, :gh:issue:`605`: fix a deadlock managing a shared counter used for load balancing, present since 0.2.4. * :gh:issue:`615`: streaming is implemented for the :ans:mod:`fetch` and other actions that transfer files from targets to the controller. Previously files were sent in one message, requiring them to fit in RAM and be smaller than an internal message size sanity check. Transfers from controller to targets have been streaming since 0.2.0. * :gh:commit:`7ae926b3`: the :ans:mod:`lineinfile` leaked writable temporary file descriptors between Ansible 2.7.0 and 2.8.2. When :ans:mod:`~lineinfile` created or modified a script, and that script was later executed, the execution could fail with "*text file busy*". Temporary descriptors are now tracked and cleaned up on exit for all modules. Core Library ~~~~~~~~~~~~ * Log readability is improving and many :func:`repr` strings are more descriptive. The old pseudo-function-call format is migrating to readable output where possible. For example, *"Stream(ssh:123).connect()"* might be written *"connecting to ssh:123"*. * In preparation for reducing default log output, many messages are delivered to per-component loggers, including messages originating from children, enabling :mod:`logging` aggregation to function as designed. An importer message like:: 12:00:00 D mitogen.ctx.remotehost mitogen: loading module "foo" Might instead be logged to the ``mitogen.importer.[remotehost]`` logger:: 12:00:00 D mitogen.importer.[remotehost] loading module "foo" Allowing a filter or handler for ``mitogen.importer`` to select that logger in every process. This introduces a small risk of leaking memory in long-lived programs, as logger objects are internally persistent. * :func:`bytearray` was removed from the list of supported serialization types. It was never portable between Python versions, unused, and never made much sense to support. * :gh:issue:`170`: to improve subprocess management and asynchronous connect, a :class:`~mitogen.parent.TimerList` interface is available, accessible as :attr:`Broker.timers` in an asynchronous context. * :gh:issue:`419`: the internal :class:`~mitogen.core.Stream` has been refactored into many new classes, modularizing protocol behaviour, output buffering, line-oriented input parsing, option handling and connection management. Connection setup is internally asynchronous, laying most groundwork for fully asynchronous connect, proxied Ansible become plug-ins, and in-process SSH. * :gh:issue:`169`, :gh:issue:`419`: zombie subprocess reaping has vastly improved, by using timers to efficiently poll for a child to exit, and delaying shutdown while any subprocess remains. Polling avoids process-global configuration such as a `SIGCHLD` handler, or :func:`signal.set_wakeup_fd` available in modern Python. * :gh:issue:`256`, :gh:issue:`419`: most :func:`os.dup` use was eliminated, along with most manual file descriptor management. Descriptors are trapped in :func:`os.fdopen` objects at creation, ensuring a leaked object will close itself, and ensuring every descriptor is fused to a `closed` flag, preventing historical bugs where a double close could destroy unrelated descriptors. * :gh:issue:`533`: routing accounts for a race between a parent (or cousin) sending a message to a child via an intermediary, where the child had recently disconnected, and :data:`~mitogen.core.DEL_ROUTE` propagating from the intermediary to the sender, informing it that the child no longer exists. This condition is detected at the intermediary and a :ref:`dead message ` is returned to the sender. Previously since the intermediary had already removed its route for the child, the *route messages upwards* rule would be triggered, causing the message (with a privileged :ref:`src_id/auth_id `) to be sent upstream, resulting in a ``bad auth_id`` error logged at the first upstream parent, and a possible hang due to a request message being dropped. * :gh:issue:`586`: fix import of :mod:`__main__` on later versions of Python 3 when running from the interactive console. * :gh:issue:`606`: fix example code on the documentation front page. * :gh:issue:`612`: fix various errors introduced by stream refactoring. * :gh:issue:`615`: when routing fails to deliver a message for some reason other than the sender cannot or should not reach the recipient, and no reply-to address is present on the message, instead send a :ref:`dead message ` to the original recipient. This ensures a descriptive message is delivered to a thread sleeping on the reply to a function call, where the reply might be dropped due to exceeding the maximum configured message size. * :gh:issue:`624`: the number of threads used for a child's automatically initialized service thread pool has been reduced from 16 to 2. This may drop to 1 in future, and become configurable via a :class:`Router` option. * :gh:commit:`a5536c35`: avoid quadratic buffer management when logging lines received from a child's redirected standard IO. * :gh:commit:`49a6446a`: the :meth:`empty` methods of :class:`~mitogen.core.Latch`, :class:`~mitogen.core.Receiver` and :class:`~mitogen.select.Select` are obsoleted by a more general :meth:`size` method. :meth:`empty` will be removed in 0.3 * :gh:commit:`ecc570cb`: previously :meth:`mitogen.select.Select.add` would enqueue one wake event when adding an existing receiver, latch or subselect that contained multiple buffered items, causing :meth:`get` calls to block or fail even though data existed to return. * :gh:commit:`5924af15`: *[security]* unidirectional routing, where contexts may optionally only communicate with parents and never siblings (so that air-gapped networks cannot be unintentionally bridged) was not inherited when a child was initiated directly from another child. This did not effect Ansible, since the controller initiates any new child used for routing, only forked tasks are initiated by children. Thanks! ~~~~~~~ Mitogen would not be possible without the support of users. A huge thanks for bug reports, testing, features and fixes in this release contributed by `Andreas Hubert `_, `Anton Markelov `_, `Dan `_, `Dave Cottlehuber `_, `Denis Krienbühl `_, `El Mehdi CHAOUKI `_, `Florent Dutheil `_, `James Hogarth `_, `Jordan Webb `_, `Julian Andres Klode `_, `Marc Hartmayer `_, `Nigel Metheringham `_, `Orion Poplawski `_, `Pieter Voet `_, `Stefane Fermigier `_, `Szabó Dániel Ernő `_, `Ulrich Schreiner `_, `Vincent S. Cojot `_, `yen `_, `Yuki Nishida `_, `@alexhexabeam `_, `@DavidVentura `_, `@dbiegunski `_, `@ghp-rr `_, `@migalsp `_, `@rizzly `_, `@SQGE `_, and `@tho86 `_. .. rubric:: Footnotes .. [#i615] Peak RSS of controller and target as measured with ``/usr/bin/time -v ansible-playbook -c local`` using the reproduction supplied in :gh:issue:`615`. v0.2.7 (2019-05-19) ------------------- This release primarily exists to add a descriptive error message when running on Ansible 2.8, which is not yet supported. Fixes ~~~~~ * :gh:issue:`557`: fix a crash when running on machines with high CPU counts. * :gh:issue:`570`: the :ans:mod:`firewalld` internally caches a dbus name that changes across :ans:mod:`~firewalld` restarts, causing a failure if the service is restarted between :ans:mod:`~firewalld` module invocations. * :gh:issue:`575`: fix a crash when rendering an error message to indicate no usable temporary directories could be found. * :gh:issue:`576`: fix a crash during startup on SuSE Linux 11, due to an incorrect version compatibility check in the Mitogen code. * :gh:issue:`581`: a ``mitogen_mask_remote_name`` Ansible variable is exposed, to allow masking the username, hostname and process ID of ``ansible-playbook`` running on the controller machine. * :gh:issue:`587`: display a friendly message when running on an unsupported version of Ansible, to cope with potential influx of 2.8-related bug reports. Thanks! ~~~~~~~ Mitogen would not be possible without the support of users. A huge thanks for bug reports, testing, features and fixes in this release contributed by `Orion Poplawski `_, `Thibaut Barrère `_, `@Moumoutaru `_, and `@polski-g `_. v0.2.6 (2019-03-06) ------------------- Fixes ~~~~~ * :gh:issue:`542`: some versions of OS X ship a default Python that does not support :func:`select.poll`. Restore the 0.2.3 behaviour of defaulting to Kqueue in this case, but still prefer :func:`select.poll` if it is available. * :gh:issue:`545`: an optimization introduced in :gh:issue:`493` caused a 64-bit integer to be assigned to a 32-bit field on ARM 32-bit targets, causing runs to fail. * :gh:issue:`548`: `mitogen_via=` could fail when the selected transport was set to ``smart``. * :gh:issue:`550`: avoid some broken TTY-related `ioctl()` calls on Windows Subsystem for Linux 2016 Anniversary Update. * :gh:issue:`554`: third party Ansible action plug-ins that invoked :func:`_make_tmp_path` repeatedly could trigger an assertion failure. * :gh:issue:`555`: work around an old idiom that reloaded :mod:`sys` in order to change the interpreter's default encoding. * :gh:commit:`ffae0355`: needless information was removed from the documentation and installation procedure. Core Library ~~~~~~~~~~~~ * :gh:issue:`535`: to support function calls on a service pool from another thread, :class:`mitogen.select.Select` additionally permits waiting on :class:`mitogen.core.Latch`. * :gh:issue:`535`: :class:`mitogen.service.Pool.defer` allows any function to be enqueued for the thread pool from another thread. * :gh:issue:`535`: a new :mod:`mitogen.os_fork` module provides a :func:`os.fork` wrapper that pauses thread activity during fork. On Python<2.6, :class:`mitogen.core.Broker` and :class:`mitogen.service.Pool` automatically record their existence so that a :func:`os.fork` monkey-patch can automatically pause them for any attempt to start a subprocess. * :gh:commit:`ca63c26e`: :meth:`mitogen.core.Latch.put`'s `obj` argument was made optional. Thanks! ~~~~~~~ Mitogen would not be possible without the support of users. A huge thanks for bug reports, testing, features and fixes in this release contributed by `Fabian Arrotin `_, `Giles Westwood `_, `Matt Layman `_, `Percy Grunwald `_, `Petr Enkov `_, `Tony Finch `_, `@elbunda `_, and `@zyphermonkey `_. v0.2.5 (2019-02-14) ------------------- Fixes ~~~~~ * :gh:issue:`511`, :gh:issue:`536`: changes in 0.2.4 to repair ``delegate_to`` handling broke default ``ansible_python_interpreter`` handling. Test coverage was added. * :gh:issue:`532`: fix a race in the service used to propagate Ansible modules, that could easily manifest when starting asynchronous tasks in a loop. * :gh:issue:`536`: changes in 0.2.4 to support Python 2.4 interacted poorly with modules that imported ``simplejson`` from a controller that also loaded an incompatible newer version of ``simplejson``. * :gh:issue:`537`: a swapped operator in the CPU affinity logic meant 2 cores were reserved on 1`_, `Guy Knights `_, and `Josh Smift `_. v0.2.4 (2019-02-10) ------------------- Mitogen for Ansible ~~~~~~~~~~~~~~~~~~~ This release includes a huge variety of important fixes and new optimizations. It is 35% faster than 0.2.3 on a synthetic 64 target run that places heavy load on the connection multiplexer. Enhancements ^^^^^^^^^^^^ * :gh:issue:`76`, :gh:issue:`351`, :gh:issue:`352`: disconnect propagation has improved, allowing Ansible to cancel waits for responses from abruptly disconnected targets. This ensures a task will reliably fail rather than hang, for example on network failure or EC2 instance maintenance. * :gh:issue:`369`, :gh:issue:`407`: :meth:`Connection.reset` is implemented, allowing :ans:mod:`meta: reset_connection ` to shut down the remote interpreter as documented, and improving support for the :ans:mod:`reboot`. * :gh:commit:`09aa27a6`: the ``mitogen_host_pinned`` strategy wraps the ``host_pinned`` strategy introduced in Ansible 2.7. * :gh:issue:`477`: Python 2.4 is fully supported by the core library and tested automatically, in any parent/child combination of 2.4, 2.6, 2.7 and 3.6 interpreters. * :gh:issue:`477`: Ansible 2.3 is fully supported and tested automatically. In combination with the core library Python 2.4 support, this allows Red Hat Enterprise Linux 5 targets to be managed with Mitogen. The ``simplejson`` package need not be installed on such targets, as is usually required by Ansible. * :gh:issue:`412`: to simplify diagnosing connection configuration problems, Mitogen ships a ``mitogen_get_stack`` action that is automatically added to the action plug-in path. See :ref:`mitogen-get-stack` for more information. * :gh:commit:`152effc2`, :gh:commit:`bd4b04ae`: a CPU affinity policy was added for Linux controllers, reducing latency and SMP overhead on hot paths exercised for every task. This yielded a 19% speedup in a 64-target job composed of many short tasks, and should easily be visible as a runtime improvement in many-host runs. * :gh:commit:`2b44d598`: work around a defective caching mechanism by pre-heating it before spawning workers. This saves 40% runtime on a synthetic repetitive task. * :gh:commit:`0979422a`: an expensive dependency scanning step was redundantly invoked for every task, bottlenecking the connection multiplexer. * :gh:commit:`eaa990a97`: a new ``mitogen_ssh_compression`` variable is supported, allowing Mitogen's default SSH compression to be disabled. SSH compression is a large contributor to CPU usage in many-target runs, and severely limits file transfer. On a `"shell: hostname"` task repeated 500 times, Mitogen requires around 800 bytes per task with compression, rising to 3 KiB without. File transfer throughput rises from ~25MiB/s when enabled to ~200MiB/s when disabled. * :gh:issue:`260`, :gh:commit:`a18a083c`: brokers no longer wait for readiness indication to transmit, and instead assume transmission will succeed. As this is usually true, one loop iteration and two poller reconfigurations are avoided, yielding a significant reduction in interprocess round-trip latency. * :gh:issue:`415`, :gh:issue:`491`, :gh:issue:`493`: the interface employed for in-process queues changed from :freebsd:man2:`kqueue` / :linux:man7:`epoll` to :linux:man2:`poll`, which requires no setup or teardown, yielding a 38% latency reduction for inter-thread communication. Fixes ^^^^^ * :gh:issue:`251`, :gh:issue:`359`, :gh:issue:`396`, :gh:issue:`401`, :gh:issue:`404`, :gh:issue:`412`, :gh:issue:`434`, :gh:issue:`436`, :gh:issue:`465`: connection delegation and ``delegate_to:`` handling suffered a major regression in 0.2.3. The 0.2.2 behaviour has been restored, and further work has been made to improve the compatibility of connection delegation's configuration building methods. * :gh:issue:`323`, :gh:issue:`333`: work around a Windows Subsystem for Linux bug that caused tracebacks to appear during shutdown. * :gh:issue:`334`: the SSH method tilde-expands private key paths using Ansible's logic. Previously the path was passed unmodified to SSH, which expanded it using :func:`pwd.getpwnam`. This differs from :func:`os.path.expanduser`, which uses the ``HOME`` environment variable if it is set, causing behaviour to diverge when Ansible was invoked across user accounts via ``sudo``. * :gh:issue:`364`: file transfers from controllers running Python 2.7.2 or earlier could be interrupted due to a forking bug in the :mod:`tempfile` module. * :gh:issue:`370`: the Ansible :ans:mod:`reboot` is supported. * :gh:issue:`373`: the LXC and LXD methods print a useful hint on failure, as no useful error is normally logged to the console by these tools. * :gh:issue:`374`, :gh:issue:`391`: file transfer and module execution from 2.x controllers to 3.x targets was broken due to a regression caused by refactoring, and compounded by :gh:issue:`426`. * :gh:issue:`400`: work around a threading bug in the AWX display callback when running with high verbosity setting. * :gh:issue:`409`: the setns method was silently broken due to missing tests. Basic coverage was added to prevent a recurrence. * :gh:issue:`409`: the LXC and LXD methods support ``mitogen_lxc_path`` and ``mitogen_lxc_attach_path`` variables to control the location of third pary utilities. * :gh:issue:`410`: the sudo method supports the SELinux ``--type`` and ``--role`` options. * :gh:issue:`420`: if a :class:`Connection` was constructed in the Ansible top-level process, for example while executing ``meta: reset_connection``, resources could become undesirably shared in subsequent children. * :gh:issue:`426`: an oversight while porting to Python 3 meant no automated 2->3 tests were running. A significant number of 2->3 bugs were fixed, mostly in the form of Unicode/bytes mismatches. * :gh:issue:`429`: the ``sudo`` method can now recognize internationalized password prompts. * :gh:issue:`362`, :gh:issue:`435`: the previous fix for slow Python 2.x subprocess creation on Red Hat caused newly spawned children to have a reduced open files limit. A more intrusive fix has been added to directly address the problem without modifying the subprocess environment. * :gh:issue:`397`, :gh:issue:`454`: the previous approach to handling modern Ansible temporary file cleanup was too aggressive, and could trigger early finalization of Cython-based extension modules, leading to segmentation faults. * :gh:issue:`499`: the ``allow_same_user`` Ansible configuration setting is respected. * :gh:issue:`527`: crashes in modules are trapped and reported in a manner that matches Ansible. In particular, a module crash no longer leads to an exception that may crash the corresponding action plug-in. * :gh:commit:`dc1d4251`: the :ans:mod:`synchronize` could fail with the Docker transport due to a missing attribute. * :gh:commit:`599da068`: fix a race when starting async tasks, where it was possible for the controller to observe no status file on disk before the task had a chance to write one. * :gh:commit:`2c7af9f04`: Ansible modules were repeatedly re-transferred. The bug was hidden by the previously mandatorily enabled SSH compression. Core Library ~~~~~~~~~~~~ * :gh:issue:`76`: routing records the destination context IDs ever received on each stream, and when disconnection occurs, propagates :data:`mitogen.core.DEL_ROUTE` messages towards every stream that ever communicated with the disappearing peer, rather than simply towards parents. Conversations between nodes anywhere in the tree receive :data:`mitogen.core.DEL_ROUTE` when either participant disconnects, allowing receivers to wake with :class:`mitogen.core.ChannelError`, even when one participant is not a parent of the other. * :gh:issue:`109`, :gh:commit:`57504ba6`: newer Python 3 releases explicitly populate :data:`sys.meta_path` with importer internals, causing Mitogen to install itself at the end of the importer chain rather than the front. * :gh:issue:`310`: support has returned for trying to figure out the real source of non-module objects installed in :data:`sys.modules`, so they can be imported. This is needed to handle syntax sugar used by packages like :mod:`plumbum`. * :gh:issue:`349`: an incorrect format string could cause large stack traces when attempting to import built-in modules on Python 3. * :gh:issue:`387`, :gh:issue:`413`: dead messages include an optional reason in their body. This is used to cause :class:`mitogen.core.ChannelError` to report far more useful diagnostics at the point the error occurs that previously would have been buried in debug log output from an unrelated context. * :gh:issue:`408`: a variety of fixes were made to restore Python 2.4 compatibility. * :gh:issue:`399`, :gh:issue:`437`: ignore a :class:`DeprecationWarning` to avoid failure of the ``su`` method on Python 3.7. * :gh:issue:`405`: if an oversized message is rejected, and it has a ``reply_to`` set, a dead message is returned to the sender. This ensures function calls exceeding the configured maximum size crash rather than hang. * :gh:issue:`406`: :class:`mitogen.core.Broker` did not call :meth:`mitogen.core.Poller.close` during shutdown, leaking the underlying poller FD in masters and parents. * :gh:issue:`406`: connections could leak FDs when a child process failed to start. * :gh:issue:`288`, :gh:issue:`406`, :gh:issue:`417`: connections could leave FD wrapper objects that had not been closed lying around to be closed during garbage collection, causing reused FD numbers to be closed at random moments. * :gh:issue:`411`: the SSH method typed "``y``" rather than the requisite "``yes``" when `check_host_keys="accept"` was configured. This would lead to connection timeouts due to the hung response. * :gh:issue:`414`, :gh:issue:`425`: avoid deadlock of forked children by reinitializing the :mod:`mitogen.service` pool lock. * :gh:issue:`416`: around 1.4KiB of memory was leaked on every RPC, due to a list of strong references keeping alive any handler ever registered for disconnect notification. * :gh:issue:`418`: the :func:`mitogen.parent.iter_read` helper would leak poller FDs, because execution of its :keyword:`finally` block was delayed on Python 3. Now callers explicitly close the generator when finished. * :gh:issue:`422`: the fork method could fail to start if :data:`sys.stdout` was opened in block buffered mode, and buffered data was pending in the parent prior to fork. * :gh:issue:`438`: a descriptive error is logged when stream corruption is detected. * :gh:issue:`439`: descriptive errors are raised when attempting to invoke unsupported function types. * :gh:issue:`444`: messages regarding unforwardable extension module are no longer logged as errors. * :gh:issue:`445`: service pools unregister the :data:`mitogen.core.CALL_SERVICE` handle at shutdown, ensuring any outstanding messages are either processed by the pool as it shuts down, or have dead messages sent in reply to them, preventing peer contexts from hanging due to a forgotten buffered message. * :gh:issue:`446`: given thread A calling :meth:`mitogen.core.Receiver.close`, and thread B, C, and D sleeping in :meth:`mitogen.core.Receiver.get`, previously only one sleeping thread would be woken with :class:`mitogen.core.ChannelError` when the receiver was closed. Now all threads are woken per the docstring. * :gh:issue:`447`: duplicate attempts to invoke :meth:`mitogen.core.Router.add_handler` cause an error to be raised, ensuring accidental re-registration of service pools are reported correctly. * :gh:issue:`448`: the import hook implementation now raises :class:`ModuleNotFoundError` instead of :class:`ImportError` in Python 3.6 and above, to cope with an upcoming version of the :mod:`subprocess` module requiring this new subclass to be raised. * :gh:issue:`453`: the loggers used in children for standard IO redirection have propagation disabled, preventing accidental reconfiguration of the :mod:`logging` package in a child from setting up a feedback loop. * :gh:issue:`456`: a descriptive error is logged when :meth:`mitogen.core.Broker.defer` is called after the broker has shut down, preventing new messages being enqueued that will never be sent, and subsequently producing a program hang. * :gh:issue:`459`: the beginnings of a :meth:`mitogen.master.Router.get_stats` call has been added. The initial statistics cover the module loader only. * :gh:issue:`462`: Mitogen could fail to open a PTY on broken Linux systems due to a bad interaction between the glibc :func:`grantpt` function and an incorrectly mounted ``/dev/pts`` filesystem. Since correct group ownership is not required in most scenarios, when this problem is detected, the PTY is allocated and opened directly by the library. * :gh:issue:`479`: Mitogen could fail to import :mod:`__main__` on Python 3.4 and newer due to a breaking change in the :mod:`pkgutil` API. The program's main script is now handled specially. * :gh:issue:`481`: the version of `sudo` that shipped with CentOS 5 replaced itself with the program to be executed, and therefore did not hold any child PTY open on our behalf. The child context is updated to preserve any PTY FD in order to avoid the kernel sending `SIGHUP` early during startup. * :gh:issue:`523`: the test suite didn't generate a code coverage report if any test failed. * :gh:issue:`524`: Python 3.6+ emitted a :class:`DeprecationWarning` for :func:`mitogen.utils.run_with_router`. * :gh:issue:`529`: Code coverage of the test suite was not measured across all Python versions. * :gh:commit:`16ca111e`: handle OpenSSH 7.5 permission denied prompts when ``~/.ssh/config`` rewrites are present. * :gh:commit:`9ec360c2`: a new :meth:`mitogen.core.Broker.defer_sync` utility function is provided. * :gh:commit:`f20e0bba`: :meth:`mitogen.service.FileService.register_prefix` permits granting unprivileged access to whole filesystem subtrees, rather than single files at a time. * :gh:commit:`8f85ee03`: :meth:`mitogen.core.Router.myself` returns a :class:`mitogen.core.Context` referring to the current process. * :gh:commit:`824c7931`: exceptions raised by the import hook were updated to include probable reasons for a failure. * :gh:commit:`57b652ed`: a stray import meant an extra roundtrip and ~4KiB of data was wasted for any context that imported :mod:`mitogen.parent`. Thanks! ~~~~~~~ Mitogen would not be possible without the support of users. A huge thanks for bug reports, testing, features and fixes in this release contributed by `Alex Willmer `_, `Andreas Krüger `_, `Anton Stroganov `_, `Berend De Schouwer `_, `Brian Candler `_, `dsgnr `_, `Duane Zamrok `_, `Eric Chang `_, `Gerben Meijer `_, `Guy Knights `_, `Jesse London `_, `Jiří Vávra `_, `Johan Beisser `_, `Jonathan Rosser `_, `Josh Smift `_, `Kevin Carter `_, `Mehdi `_, `Michael DeHaan `_, `Michal Medvecky `_, `Mohammed Naser `_, `Peter V. Saveliev `_, `Pieter Avonts `_, `Ross Williams `_, `Sergey `_, `Stéphane `_, `Strahinja Kustudic `_, `Tom Parker-Shemilt `_, `Younès HAFRI `_, `@killua-eu `_, `@myssa91 `_, `@ohmer1 `_, `@s3c70r `_, `@syntonym `_, `@trim777 `_, `@whky `_, and `@yodatak `_. v0.2.3 (2018-10-23) ------------------- Mitogen for Ansible ~~~~~~~~~~~~~~~~~~~ Enhancements ^^^^^^^^^^^^ * :gh:pull:`315`, :gh:issue:`392`: Ansible 2.6 and 2.7 are supported. * :gh:issue:`321`, :gh:issue:`336`: temporary file handling was simplified, undoing earlier damage caused by compatibility fixes, improving 2.6 compatibility, and avoiding two network roundtrips for every related action (:ans:mod:`~assemble`, :ans:mod:`~aws_s3`, :ans:mod:`~copy`, :ans:mod:`~patch`, :ans:mod:`~script`, :ans:mod:`~template`, :ans:mod:`~unarchive`, :ans:mod:`~uri`). See :ref:`ansible_tempfiles` for a complete description. * :gh:pull:`376`, :gh:pull:`377`: the ``kubectl`` connection type is now supported. Contributed by Yannig Perré. * :gh:commit:`084c0ac0`: avoid a roundtrip in :ans:mod:`~copy` and :ans:mod:`~template` due to an unfortunate default. * :gh:commit:`7458dfae`: avoid a roundtrip when transferring files smaller than 124KiB. Copy and template actions are now 2-RTT, reducing runtime for a 20-iteration template loop over a 250 ms link from 30 seconds to 10 seconds compared to v0.2.2, down from 120 seconds compared to vanilla. * :gh:issue:`337`: To avoid a scaling limitation, a PTY is no longer allocated for an SSH connection unless the configuration specifies a password. * :gh:commit:`d62e6e2a`: many-target runs executed the dependency scanner redundantly due to missing synchronization, wasting significant runtime in the connection multiplexer. In one case work was reduced by 95%, which may manifest as faster runs. * :gh:commit:`5189408e`: threads are cooperatively scheduled, minimizing `GIL `_ contention, and reducing context switching by around 90%. This manifests as an overall improvement, but is easily noticeable on short many-target runs, where startup overhead dominates runtime. * The `faulthandler `_ module is automatically activated if it is installed, simplifying debugging of hangs. See :ref:`diagnosing-hangs` for details. * The ``MITOGEN_DUMP_THREAD_STACKS`` environment variable's value now indicates the number of seconds between stack dumps. See :ref:`diagnosing-hangs` for details. Fixes ^^^^^ * :gh:issue:`251`, :gh:issue:`340`: Connection Delegation could establish connections to the wrong target when ``delegate_to:`` is present. * :gh:issue:`291`: when Mitogen had previously been installed using ``pip`` or ``setuptools``, the globally installed version could conflict with a newer version bundled with an extension that had been installed using the documented steps. Now the bundled library always overrides over any system-installed copy. * :gh:issue:`324`: plays with a `custom module_utils `_ would fail due to fallout from the Python 3 port and related tests being disabled. * :gh:issue:`331`: the connection multiplexer subprocess always exits before the main Ansible process, ensuring logs generated by it do not overwrite the user's prompt when ``-vvv`` is enabled. * :gh:issue:`332`: support a new :func:`sys.excepthook`-based module exit mechanism added in Ansible 2.6. * :gh:issue:`338`: compatibility: changes to ``/etc/environment`` and ``~/.pam_environment`` made by a task are reflected in the runtime environment of subsequent tasks. See :ref:`ansible_process_env` for a complete description. * :gh:issue:`343`: the sudo ``--login`` option is supported. * :gh:issue:`344`: connections no longer fail when the controller's login username contains slashes. * :gh:issue:`345`: the ``IdentitiesOnly yes`` option is no longer supplied to OpenSSH by default, better matching Ansible's behaviour. * :gh:issue:`355`: tasks configured to run in an isolated forked subprocess were forked from the wrong parent context. This meant built-in modules overridden via a custom ``module_utils`` search path may not have had any effect. * :gh:issue:`362`: to work around a slow algorithm in the :mod:`subprocess` module, the maximum number of open files in processes running on the target is capped to 512, reducing the work required to start a subprocess by >2000x in default CentOS configurations. * :gh:issue:`397`: recent Mitogen master versions could fail to clean up temporary directories in a number of circumstances, and newer Ansibles moved to using :mod:`atexit` to effect temporary directory cleanup in some circumstances. * :gh:commit:`b9112a9c`, :gh:commit:`2c287801`: OpenSSH 7.5 permission denied prompts are now recognized. Contributed by Alex Willmer. * A missing check caused an exception traceback to appear when using the ``ansible`` command-line tool with a missing or misspelled module name. * Ansible since >=2.7 began importing :mod:`__main__` from :mod:`ansible.module_utils.basic`, causing an error during execution, due to the controller being configured to refuse network imports outside the ``ansible.*`` namespace. Update the target implementation to construct a stub :mod:`__main__` module to satisfy the otherwise seemingly vestigial import. Core Library ~~~~~~~~~~~~ * A new :class:`mitogen.parent.CallChain` class abstracts safe pipelining of related function calls to a target context, cancelling the chain if an exception occurs. * :gh:issue:`305`: fix a long-standing minor race relating to the logging framework, where *no route for Message..* would frequently appear during startup. * :gh:issue:`313`: :meth:`mitogen.parent.Context.call` was documented as capable of accepting static methods. While possible on Python 2.x the result is ugly, and in every case it should be trivial to replace with a classmethod. The documentation was fixed. * :gh:issue:`337`: to avoid a scaling limitation, a PTY is no longer allocated for each OpenSSH client if it can be avoided. PTYs are only allocated if a password is supplied, or when `host_key_checking=accept`. This is since Linux has a default of 4096 PTYs (``kernel.pty.max``), while OS X has a default of 127 and an absolute maximum of 999 (``kern.tty.ptmx_max``). * :gh:issue:`339`: the LXD connection method was erroneously executing LXC Classic commands. * :gh:issue:`345`: the SSH connection method allows optionally disabling ``IdentitiesOnly yes``. * :gh:issue:`356`: if the master Python process does not have :data:`sys.executable` set, the default Python interpreter used for new children on the local machine defaults to ``"/usr/bin/python"``. * :gh:issue:`366`, :gh:issue:`380`: attempts by children to import :mod:`__main__` where the main program module lacks an execution guard are refused, and an error is logged. This prevents a common and highly confusing error when prototyping new scripts. * :gh:pull:`371`: the LXC connection method uses a more compatible method to establish an non-interactive session. Contributed by Brian Candler. * :gh:commit:`af2ded66`: add :func:`mitogen.fork.on_fork` to allow non-Mitogen managed process forks to clean up Mitogen resources in the child. * :gh:commit:`d6784242`: the setns method always resets ``HOME``, ``SHELL``, ``LOGNAME`` and ``USER`` environment variables to an account in the target container, defaulting to ``root``. * :gh:commit:`830966bf`: the UNIX listener no longer crashes if the peer process disappears in the middle of connection setup. Thanks! ~~~~~~~ Mitogen would not be possible without the support of users. A huge thanks for bug reports, testing, features and fixes in this release contributed by `Alex Russu `_, `Alex Willmer `_, `atoom `_, `Berend De Schouwer `_, `Brian Candler `_, `Dan Quackenbush `_, `dsgnr `_, `Jesse London `_, `John McGrath `_, `Jonathan Rosser `_, `Josh Smift `_, `Luca Nunzi `_, `Orion Poplawski `_, `Peter V. Saveliev `_, `Pierre-Henry Muller `_, `Pierre-Louis Bonicoli `_, `Prateek Jain `_, `RedheatWei `_, `Rick Box `_, `nikitakazantsev12 `_, `Tawana Musewe `_, `Timo Beckers `_, and `Yannig Perré `_. v0.2.2 (2018-07-26) ------------------- Mitogen for Ansible ~~~~~~~~~~~~~~~~~~~ * :gh:issue:`291`: ``ansible_*_interpreter`` variables are parsed using a restrictive shell-like syntax, supporting a common idiom where ``ansible_python_interpreter`` is set to ``/usr/bin/env python``. * :gh:issue:`299`: fix the ``network_cli`` connection type when the Mitogen strategy is active. Mitogen cannot help network device connections, however it should still be possible to use device connections while Mitogen is active. * :gh:pull:`301`: variables like ``$HOME`` in the ``remote_tmp`` setting are evaluated correctly. * :gh:pull:`303`: the :ref:`doas` become method is supported. Contributed by `Mike Walker `_. * :gh:issue:`309`: fix a regression to process environment cleanup, caused by the change in v0.2.1 to run local tasks with the correct environment. * :gh:issue:`317`: respect the verbosity setting when writing to Ansible's ``log_path``, if it is enabled. Child log filtering was also incorrect, causing the master to needlessly wake many times. This nets a 3.5% runtime improvement running against the local machine. * The ``mitogen_ssh_debug_level`` variable is supported, permitting SSH debug output to be included in Mitogen's ``-vvv`` output when both are specified. Core Library ~~~~~~~~~~~~ * :gh:issue:`291`: the ``python_path`` parameter may specify an argument vector prefix rather than a string program path. * :gh:issue:`300`: the broker could crash on OS X during shutdown due to scheduled :freebsd:man2:`kqueue` filter changes for descriptors that were closed before the IO loop resumes. As a temporary workaround, kqueue's bulk change feature is not used. * :gh:pull:`303`: the :ref:`doas` become method is now supported. Contributed by `Mike Walker `_. * :gh:issue:`307`: SSH login banner output containing the word 'password' is no longer confused for a password prompt. * :gh:issue:`319`: SSH connections would fail immediately on Windows Subsystem for Linux, due to use of `TCSAFLUSH` with :func:`termios.tcsetattr`. The flag is omitted if WSL is detected. * :gh:issue:`320`: The OS X poller could spuriously wake up due to ignoring an error bit set on events returned by the kernel, manifesting as a failure to read from an unrelated descriptor. * :gh:issue:`342`: The ``network_cli`` connection type would fail due to a missing internal SSH plugin method. * Standard IO forwarding accidentally configured the replacement ``stdout`` and ``stderr`` write descriptors as non-blocking, causing subprocesses that generate more output than kernel buffer space existed to throw errors. The write ends are now configured as blocking. * When :func:`mitogen.core.enable_profiling` is active, :mod:`mitogen.service` threads are profiled just like other threads. * The ``ssh_debug_level`` parameter is supported, permitting SSH debug output to be redirected to a Mitogen logger when specified. * Debug logs containing command lines are printed with the minimal quoting and escaping required. Thanks! ~~~~~~~ Mitogen would not be possible without the support of users. A huge thanks for the bug reports and pull requests in this release contributed by `Alex Russu `_, `Andy Freeland `_, `Ayaz Ahmed Khan `_, `Colin McCarthy `_, `Dan Quackenbush `_, `Duane Zamrok `_, `Gonzalo Servat `_, `Guy Knights `_, `Josh Smift `_, `Mark Janssen `_, `Mike Walker `_, `Orion Poplawski `_, `falbanese `_, `Tawana Musewe `_, and `Zach Swanson `_. v0.2.1 (2018-07-10) ------------------- Mitogen for Ansible ~~~~~~~~~~~~~~~~~~~ * :gh:issue:`297`: compatibility: local actions set their working directory to that of their defining playbook, and inherit a process environment as if they were executed as a subprocess of the forked task worker. v0.2.0 (2018-07-09) ------------------- Mitogen 0.2.x is the inaugural feature-frozen branch eligible for fixes only, except for problem areas listed as in-scope below. While stable from a development perspective, it should still be considered "beta" at least for the initial releases. **In Scope** * Python 3.x performance improvements * Subprocess reaping improvements * Major documentation improvements * PyPI/packaging improvements * Test suite improvements * Replacement CI system to handle every supported OS * Minor deviations from vanilla Ansible behaviour * Ansible ``raw`` action support The goal is a *tick/tock* model where even-numbered series are a maturation of the previous unstable series, and unstable series are released on PyPI with ``--pre`` enabled. The API and user visible behaviour should remain unchanged within a stable series. Mitogen for Ansible ~~~~~~~~~~~~~~~~~~~ * Support for Ansible 2.3 - 2.7.x and any mixture of Python 2.6, 2.7 or 3.6 on controller and target nodes. * Drop-in support for many Ansible connection types. * Preview of Connection Delegation feature. * Built-in file transfer compatible with connection delegation. Core Library ~~~~~~~~~~~~ * Synchronous connection establishment via OpenSSH, sudo, su, Docker, LXC and FreeBSD Jails, local subprocesses and :func:`os.fork`. Parallel connection setup is possible using multiple threads. Connections may be used from one or many threads after establishment. * UNIX masters and children, with Linux, MacOS, FreeBSD, NetBSD, OpenBSD and Windows Subsystem for Linux explicitly supported. * Automatic tests covering Python 2.6, 2.7 and 3.6 on Linux only. mitogen-0.3.9/docs/conf.py000066400000000000000000000054651465666473100154500ustar00rootroot00000000000000import sys sys.path.append('.') VERSION = '0.3.9' author = u'Network Genomics' copyright = u'2021, the Mitogen authors' exclude_patterns = ['_build', '.venv'] extensions = ['sphinx.ext.autodoc', 'sphinx.ext.intersphinx', 'sphinxcontrib.programoutput', 'domainrefs'] # get rid of version from , it messes with piwik html_title = 'Mitogen Documentation' html_show_copyright = False html_show_sourcelink = False html_show_sphinx = False html_sidebars = {'**': ['globaltoc.html', 'github.html']} html_static_path = ['_static'] html_theme = 'alabaster' html_theme_options = { 'font_family': "Georgia, serif", 'head_font_family': "Georgia, serif", 'fixed_sidebar': True, 'show_powered_by': False, 'pink_2': 'fffafaf', 'pink_1': '#fff0f0', } htmlhelp_basename = 'mitogendoc' intersphinx_mapping = {'python': ('https://docs.python.org/3', None)} language = None master_doc = 'toc' project = u'Mitogen' pygments_style = 'sphinx' release = VERSION source_suffix = '.rst' templates_path = ['_templates'] todo_include_todos = False version = VERSION domainrefs = { 'gh:commit': { 'text': '%s', 'url': 'https://github.com/mitogen-hq/mitogen/commit/%s', }, 'gh:issue': { 'text': '#%s', 'url': 'https://github.com/mitogen-hq/mitogen/issues/%s', }, 'gh:pull': { 'text': '#%s', 'url': 'https://github.com/mitogen-hq/mitogen/pull/%s', }, 'ans:mod': { 'text': '%s module', 'url': 'https://docs.ansible.com/ansible/latest/modules/%s_module.html', }, 'ans:conn': { 'text': '%s connection plug-in', 'url': 'https://docs.ansible.com/ansible/latest/plugins/connection/%s.html', }, 'freebsd:man2': { 'text': '%s(2)', 'url': 'https://man.freebsd.org/cgi/man.cgi?query=%s', }, 'linux:man1': { 'text': '%s(1)', 'url': 'https://man7.org/linux/man-pages/man1/%s.1.html', }, 'linux:man2': { 'text': '%s(2)', 'url': 'https://man7.org/linux/man-pages/man2/%s.2.html', }, 'linux:man3': { 'text': '%s(3)', 'url': 'https://man7.org/linux/man-pages/man3/%s.3.html', }, 'linux:man7': { 'text': '%s(7)', 'url': 'https://man7.org/linux/man-pages/man7/%s.7.html', }, } # > ## Official guidance # > Query PyPI’s JSON API to determine where to download files from. # > ## Predictable URLs # > You can use our conveyor service to fetch this file, which exists for # > cases where using the API is impractical or impossible. # > -- https://warehouse.pypa.io/api-reference/integration-guide.html#predictable-urls rst_epilog = """ .. |mitogen_version| replace:: %(VERSION)s .. |mitogen_url| replace:: `mitogen-%(VERSION)s.tar.gz <https://files.pythonhosted.org/packages/source/m/mitogen/mitogen-%(VERSION)s.tar.gz>`__ """ % locals() �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mitogen-0.3.9/docs/contributors.rst�����������������������������������������������������������������0000664�0000000�0000000�00000013276�14656664731�0017437�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ Contributors ============ Mitogen is production ready exclusively thanks to the careful testing, gracious sponsorship and outstanding future-thinking of its early adopters. .. raw:: html <!-- .. image:: images/sponsors/cgi.svg .. image:: images/sponsors/grx.svg .. image:: images/sponsors/securelink.svg .. image:: images/sponsors/seantis.svg .. raw:: html --> <div style="background: #efefef; padding: 16px; margin: 1.5em 0;"> <div style="float: left; padding: 8px 32px 16px 8px;"> <img src="_images/cgi.svg" height=110 width=238> </div> <div> <p> Founded in 1976, CGI is one of the world’s largest IT and business consulting services firms, helping clients achieve their goals, including becoming customer-centric digital organizations. </p> <p> <br clear="all"> For career opportunities, please visit <a href="http://cgi-group.co.uk/defence-and-intelligence-opportunities">cgi-group.co.uk/defence-and-intelligence-opportunities</a>. </p> <p style="margin-bottom: 0px;"> To <a href="https://cgi.njoyn.com/CGI/xweb/XWeb.asp?page=jobdetails&CLID=21001&SBDID=21814&jobid=J0118-0787">directly apply</a> to a UK team currently using Mitogen, contact us regarding <a href="https://cgi.njoyn.com/CGI/xweb/XWeb.asp?page=jobdetails&CLID=21001&SBDID=21814&jobid=J0118-0787">Open Source Developer/DevOps</a> opportunities. </p> </div> </div> .. raw:: html <table border="0" width="100%"> <tr> <td width="160" style="padding: 12px; text-align: center;"> <a href="https://www.goodrx.com/" ><img src="_images/grx.svg" width="160"></a> </td> <td style="padding: 12px;" valign=middle> GoodRx is America’s #1 prescription price transparency platform. Join GoodRx and help consumers save up to 80% on their medications. Apply today at <a href="https://www.goodrx.com/jobs">www.goodrx.com/jobs</a> </td> </tr> <tr> <td width="160" style="padding: 12px; text-align: center;"> <a href="https://www.seantis.ch/" ><img src="_images/seantis.svg" width="160"></a> </td> <td style="padding: 12px;" valign=middle> Seantis GmbH<br> <a href="https://www.seantis.ch">www.seantis.ch</a> </td> </tr> <tr> <td width="160" style="padding: 12px; text-align: center;"> <a href="https://www.securelink.com/" ><img src="_images/securelink.svg" width="160"></a> </td> <td style="padding: 12px;"> Secure Third-Party Remote Access for Highly Regulated Industries<br> <a href="https://www.securelink.com/">www.securelink.com</a> </td> </tr> </table> .. raw:: html <h3>Private Sponsors</h3> <ul style="line-height: 120% !important;"> <li><a href="https://skunkwerks.at/">SkunkWerks</a> — <em>Mitogen on FreeBSD runs like a kid in a candy store: fast & sweet.</em></li> <li>Donald Clark Jackson — <em>Mitogen is an exciting project, and I am happy to support its development.</em></li> <li><a href="https://nuvini.com">Niels Hendriks</a></li> <li><a href="https://uberspace.de/">Uberspace</a> — <em>Shared hosting for command-line lovers</em></li> </ul> <h3>Defenders of Time</h3> <ul> <li>Icil — <em>Time saving, money saving...phenomenal! Keep going and give us more. We await with anticipation.</em></li> <li><a href="https://www.systemli.org/">systemli tech collective</a> — <em>D.I.Y.</em></li> </ul> .. raw:: html <h3>Productivity Lovers</h3> <ul> <li>Alex Willmer</li> <li><a href="https://underwhelm.net/">Dan Dorman</a> — - <em>When I truly understand my enemy … then in that very moment I also love him.</em></li> <li>Daniel Foerster</li> <li><a href="https://www.deps.co/">Deps</a> — <em>Private Maven Repository Hosting for Java, Scala, Groovy, Clojure</em></li> <li><a href="https://www.edport.co.uk/">Edward Wilson</a> — <em>To efficiency and beyond! I wish Mitogen and all who sail in her the best of luck.</em></li> <li><a href="https://www.epartment.nl/">Epartment</a></li> <li><a href="http://andrianaivo.org/">Fidy Andrianaivo</a> — <em>never let a human do an ansible job ;)</em></li> <li><a href="https://www.channable.com">rkrzr</a></li> <li>jgadling</li> <li>John F Wall — <em>Making Ansible Great with Massive Parallelism</em></li> <li>KennethC</li> <li><a href="https://github.com/lberruti">Luca Berruti</li> <li>Lewis Bellwood — <em>Happy to be apart of a great project.</em></li> <li>luto</li> <li><a href="https://mayeu.me/">Mayeu a.k.a Matthieu Maury</a></li> <li><a href="https://twitter.com/nathanhruby">@nathanhruby</a></li> <li><a href="https://github.com/opoplawski">Orion Poplawski</a></li> <li><a href="https://github.com/philfry">Philippe Kueck</a></li> <li><a href="http://pageflows.com/">Ramy</a></li> <li>Scott Vokes</li> <li><a href="https://twitter.com/sirtux">Tom Eichhorn</a></li> <li><a href="https://dotat.at/">Tony Finch</a></li> <li>Tony Million — Never wear socks and sandles.</li> <li>randy — <em>desperate for automation</em></li> <li>Michael & Vicky Twomey-Lee</li> <li><a href="http://www.wezm.net/">Wesley Moore</a></li> <li><a href="https://github.com/baryluk">Witold Baryluk</a></li> </ul> ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mitogen-0.3.9/docs/domainrefs.py��������������������������������������������������������������������0000664�0000000�0000000�00000001751�14656664731�0016644�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ import functools import re import docutils.nodes import docutils.utils CUSTOM_RE = re.compile('(.*) <(.*)>') def role(config, role, rawtext, text, lineno, inliner, options={}, content=[]): template = 'https://docs.ansible.com/ansible/latest/modules/%s_module.html' match = CUSTOM_RE.match(text) if match: # "custom text <real link>" title = match.group(1) text = match.group(2) elif text.startswith('~'): # brief text = text[1:] title = config.get('brief', '%s') % ( docutils.utils.unescape(text), ) else: title = config.get('text', '%s') % ( docutils.utils.unescape(text), ) node = docutils.nodes.reference( rawsource=rawtext, text=title, refuri=config['url'] % (text,), **options ) return [node], [] def setup(app): for name, info in app.config._raw_config['domainrefs'].items(): app.add_role(name, functools.partial(role, info)) �����������������������mitogen-0.3.9/docs/examples.rst���������������������������������������������������������������������0000664�0000000�0000000�00000023401�14656664731�0016507�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ Examples ======== Fixing Bugs By Replacing Shell ------------------------------ Have you ever encountered shell like this? It arranges to conditionally execute an ``if`` statement as root on a file server behind a bastion host: .. code-block:: bash ssh bastion " if [ \"$PROD\" ]; then ssh fileserver sudo su -c \" if grep -qs /dev/sdb1 /proc/mounts; then echo \\\"sdb1 already mounted!\\\"; umount /dev/sdb1 fi; rm -rf \\\"/media/Main Backup Volume\\\"/*; mount /dev/sdb1 \\\"/media/Main Backup Volume\\\" \"; fi; sudo touch /var/run/start_backup; " Chances are high this is familiar territory, we've all seen it, and those working in infrastructure have almost certainly written it. At first glance, ignoring that annoying quoting, it looks perfectly fine: well structured, neatly indented, and the purpose of the snippet seems clear. 1. At first glance, is ``"/media/Main Backup Volume"`` quoted correctly? 2. How will the ``if`` statement behave if there is a problem with the machine, and, say, the ``/bin/grep`` binary is absent? 3. Ignoring quoting, are there any other syntax problems? 4. If this snippet is pasted from its original script into an interactive shell, will it behave the same as before? 5. Can you think offhand of differences in how the arguments to ``sudo ...`` and ``ssh fileserver ...`` are parsed? 6. In which context will the ``*`` glob be expanded, if it is expanded at all? 7. What will the exit status of ``ssh bastion`` be if ``ssh fileserver`` fails? Innocent But Deadly ~~~~~~~~~~~~~~~~~~~ 1. The quoting used is nonsense! At best, ``mount`` will receive 3 arguments. At worst, the snippet will not parse at all. 2. The ``if`` statement will treat a missing ``grep`` binary (exit status 127) the same as if ``/dev/sdb1`` was not mounted at all (exit status 1). Unless the program executing this script is parsing ``stderr`` output, the failure won't be noticed. Consequently, since the volume was still mounted when ``rm`` was executed, it got wiped. 3. There is at least one more syntax error present: a semicolon missing after the ``umount`` command. 4. If you paste the snippet into an interactive shell, the apparently quoted "!" character in the ``echo`` command will be interpreted as a history expansion. 5. ``sudo`` preserves the remainder of the argument vector as-is, while ``ssh`` **concatenates** each part into a single string that is passed to the login shell. While quotes appearing within arguments are preserved by ``sudo``, without additional effort, pairs of quotes are effectively stripped by ``ssh``. 6. As for where the glob is expanded, the answer is I have absolutely no idea without running the code, which might wipe out the backups! 7. If the ``ssh fileserver`` command fails, the exit status of ``ssh bastion`` will continue to indicate success. 8. Depending in which environment the ``PROD`` variable is set, either it will always evaluate to false, because it was set by the bastion host, or it will do the right thing, because it was set by the script host. Golly, we've managed to hit at least 8 potentially mission-critical gotchas in only 14 lines of code, and they are just those I can count! Welcome to the reality of "programming" in shell. In the end, superficial legibility counted for nothing, it's 4AM, you've been paged, the network is down and your boss is angry. Shell Quoting Madness ~~~~~~~~~~~~~~~~~~~~~ Let's assume on first approach that we really want to handle those quoting issues. I wrote a little Python script based around the :py:func:`shlex.quote` function to construct, to the best of my knowledge, the quoting required for each stage: .. code-block:: bash ssh bastion ' if [ "$PROD" ]; then ssh fileserver sudo su -c '"'"' if grep -qs /dev/sdb1 /proc/mounts; then echo "sdb1 already mounted!"; umount /dev/sdb1 fi; rm -rf "/media/Main Backup Volume"/*; mount /dev/sdb1 "/media/Main Backup Volume" '"'"'; fi; sudo touch /var/run/start_backup ' Even with Python handling the heavy lifting of quoting each shell layer, and even if the aforementioned minor disk-wiping issue was fixed, it is still not 100% clear that argument handling rules for all of ``su``, ``sudo``, ``ssh``, and ``bash`` are correctly respected. Finally, if any login shell involved is not ``bash``, we must introduce additional quoting in order to explicitly invoke ``bash`` at each stage, causing an explosion in quoting: .. code-block:: bash ssh bastion 'bash -c '"'"'if [ "$PROD" ]; then ssh fileserver bash -c '"'"' "'"'"'"'"'"'sudo su -c '"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'" 'bash -c '"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'" '"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"' "'"'"'"'"'"'"'"'"'"'if grep -qs /dev/sdb1 /proc/mounts; then echo "sdb1 alr eady mounted!"; umount /dev/sdb1 fi; rm -rf "/media/Main Backup Volume"/*; mount /dev/sdb1 "/media/Main Backup Volume"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'" '"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"' "'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"''"'"'"'"'"'"'"'"'"'"' "'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"''"'"'"'"'"'"'"'"'; fi; sudo touch /var/run/ start_backup'"'"'' There Is Hope ~~~~~~~~~~~~~ We could instead express the above using Mitogen: :: import shutil, os, subprocess import mitogen def run(*args): return subprocess.check_call(args) def file_contains(s, path): with open(path, 'rb') as fp: return s in fp.read() @mitogen.main() def main(router): device = '/dev/sdb1' mount_point = '/media/Media Volume' bastion = router.ssh(hostname='bastion') bastion_sudo = router.sudo(via=bastion) if PROD: fileserver = router.ssh(hostname='fileserver', via=bastion) if fileserver.call(file_contains, device, '/proc/mounts'): print('{} already mounted!'.format(device)) fileserver.call(run, 'umount', device) fileserver.call(shutil.rmtree, mount_point) fileserver.call(os.mkdir, mount_point, 0777) fileserver.call(run, 'mount', device, mount_point) bastion_sudo.call(run, 'touch', '/var/run/start_backup') * In which context must the ``PROD`` variable be defined? * On which machine is each step executed? * Are there any escaping issues? * What will happen if the ``grep`` binary is missing? * What will happen if any step fails? * What will happen if any login shell is not ``bash``? Recursively Nested Bootstrap ---------------------------- This demonstrates the library's ability to use slave contexts to recursively proxy connections to additional slave contexts, with a uniform API to any slave, and all features (function calls, import forwarding, stdio forwarding, log forwarding) functioning transparently. This example uses a chain of local contexts for clarity, however SSH and sudo contexts work identically. nested.py: .. code-block:: python import os import mitogen @mitogen.main() def main(router): mitogen.utils.log_to_file() context = None for x in range(1, 11): print('Connect local%d via %s' % (x, context)) context = router.local(via=context, name='local%d' % x) context.call(subprocess.check_call, ['pstree', '-s', 'python', '-s', 'mitogen']) Output: .. code-block:: shell $ python nested.py Connect local1 via None Connect local2 via Context(1, 'local1') Connect local3 via Context(2, 'local2') Connect local4 via Context(3, 'local3') Connect local5 via Context(4, 'local4') Connect local6 via Context(5, 'local5') Connect local7 via Context(6, 'local6') Connect local8 via Context(7, 'local7') Connect local9 via Context(8, 'local8') Connect local10 via Context(9, 'local9') 18:14:07 I ctx.local10: stdout: -+= 00001 root /sbin/launchd 18:14:07 I ctx.local10: stdout: \-+= 08126 dmw /Applications/iTerm.app/Contents/MacOS/iTerm2 18:14:07 I ctx.local10: stdout: \-+= 10638 dmw /Applications/iTerm.app/Contents/MacOS/iTerm2 --server bash --login 18:14:07 I ctx.local10: stdout: \-+= 10639 dmw bash --login 18:14:07 I ctx.local10: stdout: \-+= 13632 dmw python nested.py 18:14:07 I ctx.local10: stdout: \-+- 13633 dmw mitogen:dmw@Eldil.local:13632 18:14:07 I ctx.local10: stdout: \-+- 13635 dmw mitogen:dmw@Eldil.local:13633 18:14:07 I ctx.local10: stdout: \-+- 13637 dmw mitogen:dmw@Eldil.local:13635 18:14:07 I ctx.local10: stdout: \-+- 13639 dmw mitogen:dmw@Eldil.local:13637 18:14:07 I ctx.local10: stdout: \-+- 13641 dmw mitogen:dmw@Eldil.local:13639 18:14:07 I ctx.local10: stdout: \-+- 13643 dmw mitogen:dmw@Eldil.local:13641 18:14:07 I ctx.local10: stdout: \-+- 13645 dmw mitogen:dmw@Eldil.local:13643 18:14:07 I ctx.local10: stdout: \-+- 13647 dmw mitogen:dmw@Eldil.local:13645 18:14:07 I ctx.local10: stdout: \-+- 13649 dmw mitogen:dmw@Eldil.local:13647 18:14:07 I ctx.local10: stdout: \-+- 13651 dmw mitogen:dmw@Eldil.local:13649 18:14:07 I ctx.local10: stdout: \-+- 13653 dmw pstree -s python -s mitogen 18:14:07 I ctx.local10: stdout: \--- 13654 root ps -axwwo user,pid,ppid,pgid,command ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mitogen-0.3.9/docs/getting_started.rst��������������������������������������������������������������0000664�0000000�0000000�00000031776�14656664731�0020076�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ Getting Started =============== .. warning:: This section is incomplete. Liability Waiver ---------------- Before proceeding, it is critical you understand what you're involving yourself and possibly your team and its successors with: .. image:: images/pandora.svg :class: mitogen-right-350 * Constructing the most fundamental class, :py:class:`Broker <mitogen.master.Broker>`, causes a new thread to be spawned, exposing a huge class of difficult to analyse behaviours that Python software generally does not suffer from. While every effort is made to hide this complexity, you should expect threading-related encounters during development, and crucially, years after your program reached production. See :ref:`troubleshooting` for more information. * While high-level abstractions are provided, they are only a convenience, you must still understand :ref:`how Mitogen works <howitworks>` before depending on it. Mitogen interacts with many aspects of the operating system, threading, SSH, sudo, sockets, TTYs, shell, Python runtime, and timing and ordering uncertainty introduced through interaction with the network, GIL and OS scheduling. Knowledge of this domain is typically attained through painful years of failed attempts hacking system-level programs, and learning through continual suffering how to debug the atrocities left behind. If you feel you lack resources or willpower to diagnose problems independently, Mitogen is not appropriate, prefer a higher level solution instead. First Principles ---------------- Before starting, take a moment to reflect on writing a program that will operate across machines and privilege domains: * As with multithreaded programming, writing a program that spans multiple hosts is exposed to many asynchrony issues. Unlike multithreaded programming, the margin for unexpected failures is much higher, even between only two peers, as communication may be fail at any moment, since that communication depends on reliability of an external network. * Since a multi-host program always spans trust and privilege domains, trust must be taken into consideration in your design from the outset. Mitogen attempts to protect the consuming application by default where possible, however it is paramount that trust considerations are always in mind when exposing any privileged functionality to a potentially untrusted network of peers. A parent must always assume data received from a child is suspect, and must not base privileged control decisions on that data. As a small example, a parent should not form a command to execute in a subprocess using strings received from a child. * As the program spans multiple hosts, its design will benefit from a strict separation of program and data. This entails avoiding some common Python idioms that rely on its ability to manipulate functions and closures as if they were data, such as passing a lambda closed over some program state as a callback parameter. In the general case this is both difficult and unsafe to support in a distributed program, and so (for now at least) it should be assumed this functionality is unlikely to appear in future. Broker And Router ----------------- .. image:: images/layout.svg :class: mitogen-full-width .. currentmodule:: mitogen.core Execution starts when your program constructs a :py:class:`Broker` and associated :py:class:`Router`. The broker is responsible for multiplexing IO to children from a private thread, while in children, it is additionally responsible for ensuring robust destruction if communication with the master is lost. :py:class:`Router` is responsible for receiving messages and dispatching them to a callback from the broker thread (registered by :py:meth:`add_handler() <mitogen.core.Router.add_handler>`), or forwarding them to a :py:class:`Stream <mitogen.core.Stream>`. See :ref:`routing` for an in-depth description. :py:class:`Router` also doubles as the entry point to Mitogen's public API:: >>> import mitogen.master >>> broker = mitogen.master.Broker() >>> router = mitogen.master.Router(broker) >>> try: ... # Your code here. ... pass ... finally: ... broker.shutdown() As Python will not stop if threads still exist after the main thread exits, :py:meth:`Broker.shutdown` must be called reliably at exit. Helpers are provided by :py:mod:`mitogen.utils` to ensure :py:class:`Broker` is reliably destroyed:: def do_mitogen_stuff(router): # Your code here. mitogen.utils.run_with_router(do_mitogen_stuff) If your program cannot live beneath :py:func:`mitogen.utils.run_with_router` on the stack, you must arrange for :py:meth:`Broker.shutdown` to be called anywhere the main thread may exit. Enable Logging -------------- Mitogen makes heavy use of the :py:mod:`logging` package, both for child ``stdio`` redirection, and soft errors and warnings that may be generated. You should always configure the :py:mod:`logging` package in any program that integrates Mitogen. If your program does not otherwise use the :py:mod:`logging` package, a basic configuration can be performed by calling :py:func:`mitogen.utils.log_to_file`:: >>> import mitogen.utils # Errors, warnings, and child stdio will be written to stderr. >>> mitogen.utils.log_to_file() Additionally, if your program has :py:const:`logging.DEBUG` as the default logging level, you may wish to update its configuration to restrict the ``mitogen`` logger to :py:const:`logging.INFO`, otherwise vast amounts of output will be generated by default. .. _logging-env-vars: Logging Environment Variables ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ``MITOGEN_LOG_LEVEL`` Overrides the :py:mod:`logging` package log level set by any call to :py:func:`mitogen.utils.log_to_file`. Defaults to ``INFO``. If set to ``IO``, equivalent to ``DEBUG`` but additionally enabled IO logging for any call to :py:func:`mitogen.utils.log_to_file`. IO logging produces verbose records of any IO interaction, which is useful for debugging hangs and deadlocks. Logging Records ~~~~~~~~~~~~~~~ Messages received from a child context via :class:`mitogen.master.LogForwarder` receive extra attributes: * `mitogen_context`: :class:`mitogen.parent.Context` referring to the message source. * `mitogen_name`: original logger name in the source context. * `mitogen_msg`: original message in the source context. Creating A Context ------------------ Contexts are simply external Python programs over which your program has control, and can execute code within. They can be created as subprocesses on the local machine, in another user account via `sudo`, on a remote machine via `ssh`, or any recursive combination of the above. Now a :py:class:`Router` exists, our first :py:class:`contexts <Context>` can be created. To demonstrate basic functionality, we will start with some :py:meth:`local() <Router.local>` contexts created as subprocesses:: >>> local = router.local() >>> local_with_name = router.local(remote_name='i-have-a-name') Examination of the system process list with the ``pstree`` utility reveals the resulting process hierarchy:: | | \-+= 27660 dmw python | | |--- 27661 dmw mitogen:dmw@Eldil.local:27660 | | \--- 27663 dmw mitogen:i-have-a-name Both contexts are visible as subprocesses of the interactive Python interpreter, with their ``argv[0]`` including a description of their identity. To aid systems administrators in identifying errant software running on their machines, the default `remote_name` includes the location of the program that started the context, however as shown, this can be overridden. .. note:: Presently contexts are constructed in a blocking manner on the thread that invoked the :ref:`context factory <context-factories>`. In a future release, the factory will instead return immediately, and construction will happen asynchronously on the broker thread. Calling A Function ------------------ .. currentmodule:: mitogen.parent Now that some contexts exist, it is time to execute code in them. Any regular function, static method, or class method reachable directly from module scope may be used, including built-in functions such as :func:`time.time`. The :py:meth:`Context.call` method is used to execute a function and block the caller until the return value is available or an exception is raised:: >>> import time >>> import os >>> # Returns the current time. >>> print('Time in remote context:', local.call(time.time)) >>> try: ... # Raises OSError. ... local.call(os.chdir, '/nonexistent') ... except mitogen.core.CallError, e: ... print('Call failed:', str(e)) It is a simple wrapper around the more flexible :meth:`Context.call_async`, which immediately returns a :class:`Receiver <mitogen.core.Receiver>` wired up to receive the return value instead. A receiver may simply be discarded, kept around indefinitely without ever reading its result, or used to wait on the results from several calls. Here :meth:`get() <mitogen.core.Receiver.get>` is called to block the thread until the result arrives:: >>> call = local.call_async(time.time) >>> msg = call.get() >>> print(msg.unpickle()) 1507292737.75547 Running User Functions ---------------------- So far we have used the interactive interpreter to call some standard library functions, but since the source code typed at the interpreter cannot be recovered, Mitogen is unable to execute functions defined in this way. We must therefore continue by writing our code as a script:: # first-script.py import mitogen.utils def my_first_function(): print('Hello from remote context!') return 123 def main(router): local = router.local() print(local.call(my_first_function)) if __name__ == '__main__': mitogen.utils.log_to_file("mitogen.log") mitogen.utils.run_with_router(main) Let's try running it: .. code-block:: bash $ python first-script.py 19:11:32 I mitogen.ctx.local.32466: stdout: Hello from remote context! 123 Waiting On Multiple Calls ------------------------- Using :meth:`Context.call_async` it is possible to start multiple function calls then sleep waiting for responses as they are available. This makes it trivial to run tasks in parallel across processes (including remote processes) without the need for writing asynchronous code:: hostnames = ['host1', 'host2', 'host3', 'host4'] contexts = [router.ssh(hostname=hn) for hn in hostnames] calls = [context.call(my_func) for context in contexts] for msg in mitogen.select.Select(calls): print('Reply from %s: %s' % (recv.context, data)) Running Code That May Hang -------------------------- When executing code that may hang due to, for example, talking to network peers that may become unavailable, it is desirable to be able to recover control in the case a remote call has hung. By specifying the `timeout` parameter to :meth:`Receiver.get` on the receiver returned by `Context.call_async`, it becomes possible to wait for a function to complete, but time out if its result does not become available. When a context has become hung like this, it is still possible to gracefully terminate it using the :meth:`Context.shutdown` method. This method sends a shutdown message to the target process, where its IO multiplexer thread can still process it independently of the hung function running on on the target's main thread. Recovering Mitogen Object References In Children ------------------------------------------------ :: @mitogen.core.takes_econtext def func1(a, b, econtext): ... @mitogen.core.takes_router def func2(a, b, router): ... Recursion --------- Let's try something a little more complex: .. _serialization-rules: RPC Serialization Rules ----------------------- The following built-in types may be used as parameters or return values in remote procedure calls: * :class:`bool` * :func:`bytes` (:class:`str` on Python 2.x) * :class:`dict` * :class:`int` * :func:`list` * :class:`long` * :func:`tuple` * :func:`unicode` (:class:`str` on Python 3.x) User-defined types may not be used, except for: * :py:class:`mitogen.core.Blob` * :py:class:`mitogen.core.Secret` * :py:class:`mitogen.core.CallError` * :py:class:`mitogen.core.Context` * :py:class:`mitogen.core.Sender` Subclasses of built-in types must be undecorated using :py:func:`mitogen.utils.cast`. Test Your Design ---------------- ``tc qdisc add dev eth0 root netem delay 250ms`` .. _troubleshooting: Troubleshooting --------------- .. warning:: This section is incomplete. A typical example is a hang due to your application's main thread exitting perhaps due to an unhandled exception, without first arranging for any :py:class:`Broker <mitogen.master.Broker>` to be shut down gracefully. Another example would be your main thread hanging indefinitely because a bug in Mitogen fails to notice an event (such as RPC completion) your thread is waiting for will never complete. Solving this kind of hang is a work in progress. router.enable_debug() ��mitogen-0.3.9/docs/howitworks.rst�������������������������������������������������������������������0000664�0000000�0000000�00000126452�14656664731�0017123�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ .. _howitworks: How Mitogen Works ================= Some effort is required to accomplish the seemingly magical feat of bootstrapping a remote Python process without any software installed on the remote machine. The steps involved are unlikely to be immediately obvious to the casual reader, and they required several iterations to discover, so we document them thoroughly below. The UNIX First Stage -------------------- To allow delivery of the bootstrap compressed using :py:mod:`zlib`, it is necessary for something on the remote to be prepared to decompress the payload and feed it to a Python interpreter [#f1]_. Since we would like to avoid writing an error-prone shell fragment to implement this, and since we must avoid writing to the remote machine's disk in case it is read-only, the Python process started on the remote machine by Mitogen immediately forks in order to implement the decompression. Python Command Line ################### The Python command line sent to the host is a :mod:`zlib`-compressed [#f2]_ and base64-encoded copy of the :py:meth:`mitogen.master.Stream._first_stage` function, which has been carefully optimized to reduce its size. Prior to compression and encoding, ``CONTEXT_NAME`` is replaced with the desired context name in the function's source code. .. code:: python -c 'exec "xxx".decode("base64").decode("zlib")' The command-line arranges for the Python interpreter to decode the base64'd component, decompress it and execute it as Python code. Base64 is used since to protect against any special characters that may be interpreted by the system shell in use. Forking The First Stage ####################### The first stage creates a UNIX pipe and saves a copy of the process's real ``stdin`` file descriptor (used for communication with the master) so that it can be recovered by the bootstrapped process later. It then forks into a new process. After fork, the parent half overwrites its ``stdin`` with the read end of the pipe, and the child half writes the string ``MITOGEN0\n``, then begins reading the :py:mod:`zlib`-compressed payload supplied on ``stdin`` by the master, and writing the decompressed result to the write-end of the UNIX pipe. To allow recovery of ``stdin`` for reuse by the bootstrapped process for parent<->child communication, it is necessary for the first stage to avoid closing ``stdin`` or reading from it until EOF. Therefore, the master sends the :py:mod:`zlib`-compressed payload prefixed with an integer size, allowing reading by the first stage of exactly the required bytes. Configuring argv[0] ################### Forking provides an excellent opportunity to tidy up the eventual Python interpreter, in particular, restarting it using a fresh command-line to get rid of the large base64-encoded first stage parameter, and to replace **argv[0]** with something descriptive. After configuring its ``stdin`` to point to the read end of the pipe, the parent half of the fork re-executes Python, with **argv[0]** taken from the ``CONTEXT_NAME`` variable earlier substituted into its source code. As no arguments are provided to this new execution of Python, and since ``stdin`` is connected to a pipe (whose write end is connected to the first stage), the Python interpreter begins reading source code to execute from the pipe connected to ``stdin``. Bootstrap Preparation ##################### Now we have the mechanism in place to send a :py:mod:`zlib`-compressed script to the remote Python interpreter, it is time to choose what to send. The script sent is simply the source code for :py:mod:`mitogen.core`, with a single line suffixed to trigger execution of the :py:meth:`mitogen.core.ExternalContext.main` function. The encoded arguments to the main function include some additional details, such as the logging package level that was active in the parent process, and whether debugging or profiling are enabled. After the script source code is prepared, it is passed through :py:func:`mitogen.master.minimize_source` to strip it of docstrings and comments, while preserving line numbers. This reduces the compressed payload by around 20%. Preserving The `mitogen.core` Source #################################### One final trick is implemented in the first stage: after bootstrapping the new child, it writes a duplicate copy of the :py:mod:`mitogen.core` source it just used to bootstrap it back into another pipe connected to the child. The child's module importer cache is initialized with a copy of the source, so that subsequent bootstraps of children-of-children do not require the source to be fetched from the master a second time. Signalling Success ################## Once the first stage has signalled ``MITO000\n``, the master knows it is ready to receive the compressed bootstrap. After decompressing and writing the bootstrap source to its parent Python interpreter, the first stage writes the string ``MITO001\n`` to ``stdout`` before exiting. The master process waits for this string before considering bootstrap successful and the child's ``stdio`` ready to receive messages. The signal value is 8 bytes to match the minimum chunk size required to disambiguate between lines containing an interesting token during SSH password authentication, a debug message from the SSH client itself, or a message from the first stage. ExternalContext.main() ---------------------- .. automethod:: mitogen.core.ExternalContext.main Generating A Synthetic `mitogen` Package ######################################## Since the bootstrap consists of the :py:mod:`mitogen.core` source code, and this code is loaded by Python by way of its main script (:mod:`__main__` module), initially the module layout in the child will be incorrect. The first step taken after bootstrap is to rearrange :py:data:`sys.modules` slightly so that :py:mod:`mitogen.core` appears in the correct location, and all classes defined in that module have their ``__module__`` attribute fixed up such that :py:mod:`cPickle` correctly serializes instance module names. Once a synthetic :py:mod:`mitogen` package and :py:mod:`mitogen.core` module have been generated, the bootstrap **deletes** `sys.modules['__main__']`, so that any attempt to import it (by :py:mod:`cPickle`) will cause the import to be satisfied by fetching the master's actual :mod:`__main__` module. This is necessary to allow master programs to be written as a self-contained Python script. Reaping The First Stage ####################### After the bootstrap has called :py:func:`os.dup` on the copy of the ``stdin`` file descriptor saved by the first stage, it is closed. Additionally, since the first stage was forked prior to re-executing the Python interpreter, it will exist as a zombie process until the parent process reaps it. Therefore the bootstrap must call :py:func:`os.wait` soon after startup. Setup Logging ############# The child's :py:mod:`logging` package root logger is configured to have the same log level as the root logger in the master, and :py:class:`mitogen.core.LogHandler` is installed to forward logs to the master context's :py:data:`FORWARD_LOG <mitogen.core.FORWARD_LOG>` handle. The log level is copied into the child to avoid generating a potentially large amount of network IO forwarding logs that will simply be filtered away once they reach the master. The Module Importer ################### An instance of :py:class:`mitogen.core.Importer` is installed in :py:data:`sys.meta_path`, where Python's :keyword:`import` statement will execute it before attempting to find a module locally. Standard IO Redirection ####################### Two instances of :py:class:`mitogen.core.IoLogger` are created, one for ``stdout`` and one for ``stderr``. This class creates a UNIX pipe whose read end is added to the IO multiplexer, and whose write end is used to overwrite the handles inherited during process creation. Even without IO redirection, something must replace ``stdin`` and ``stdout``, otherwise it is possible for the stream used for communication between parent and child to be accidentally corrupted by subprocesses run by user code. The inherited ``stdin`` is replaced by a file descriptor pointing to ``/dev/null``. Finally Python's :py:data:`sys.stdout` is reopened to ensure line buffering is active, so that ``print`` statements and suchlike promptly appear in the logs. Function Call Dispatch ###################### .. currentmodule:: mitogen.core After all initialization is complete, the child's main thread sits in a loop reading from a :py:class:`Channel <mitogen.core.Channel>` connected to the :py:data:`CALL_FUNCTION <mitogen.core.CALL_FUNCTION>` handle. This handle is written to by :py:meth:`call() <mitogen.parent.Context.call>` and :py:meth:`call_async() <mitogen.parent.Context.call_async>`. :py:data:`CALL_FUNCTION <mitogen.core.CALL_FUNCTION>` only accepts requests from the context IDs listed in :py:data:`mitogen.parent_ids`, forming a chain of trust between the master and any intermediate context leading to the recipient of the message. In combination with :ref:`source-verification`, this is a major contributor to ensuring contexts running on compromised infrastructure cannot trigger code execution in siblings or any parent. Shutdown ######## .. currentmodule:: mitogen.core When a context receives :py:data:`SHUTDOWN <mitogen.core.SHUTDOWN>` from its immediate parent, it closes its own :py:data:`CALL_FUNCTION <mitogen.core.CALL_FUNCTION>` :py:class:`Channel <mitogen.core.Channel>` before sending :py:data:`SHUTDOWN <mitogen.core.SHUTDOWN>` to any directly connected children. Closing the channel has the effect of causing :py:meth:`ExternalContext._dispatch_calls` to exit and begin joining on the broker thread. During shutdown, the master waits up to 5 seconds for children to disconnect gracefully before force disconnecting them, while children will use that time to call :py:meth:`socket.shutdown(SHUT_WR) <socket.socket.shutdown>` on their :py:class:`IoLogger <mitogen.core.IoLogger>` socket's write ends before draining any remaining data buffered on the read ends, and ensuring any deferred broker function callbacks have had a chance to complete, necessary to capture for example forwarding any remaining :py:mod:`logging` records. An alternative approach is to wait until the IoLogger socket is completely closed, with some hard timeout, but this necessitates greater discipline than is common in infrastructure code (how often have you forgotten to redirect stderr to ``/dev/null`` when starting a daemon process?), so needless irritating delays would often be experienced during program termination. If the main thread (responsible for function call dispatch) fails to shut down gracefully, because some user function is hanging, it will still be cleaned up since as the final step in broker shutdown, the broker sends :py:mod:`signal.SIGTERM <signal>` to its own process. .. _stream-protocol: Stream Protocol --------------- .. currentmodule:: mitogen.core Once connected, a basic framing protocol is used to communicate between parent and child. Integers use big endian in their encoded form. .. list-table:: :header-rows: 1 :widths: auto * - Field - Size - Description * - `magic` - 2 - Integer 0x4d49 (``MI``), used to detect stream corruption. * - `dst_id` - 4 - Integer target context ID. :py:class:`Router` delivers messages locally when their `dst_id` matches :py:data:`mitogen.context_id`, otherwise they are routed up or downstream. * - `src_id` - 4 - Integer source context ID. Used as the target of replies if any are generated. * - `auth_id` - 4 - The context ID under whose authority the message is acting. See :py:ref:`source-verification`. * - `handle` - 4 - Integer target handle in the destination context. This is one of the :py:ref:`standard-handles`, or a dynamically generated handle used to receive a one-time reply, such as the return value of a function call. * - `reply_to` - 4 - Integer target handle to direct any reply to this message. Used to receive a one-time reply, such as the return value of a function call, or to signal a special condition for the message. :ref:`See below <reply_to_values>` for special values for this field. * - `length` - 4 - Length of the data part of the message. * - `data` - n/a - Message data, which may be raw or pickled. .. _standard-handles: Standard Handles ################ Masters listen on the following handles: .. _FORWARD_LOG: .. currentmodule:: mitogen.core .. data:: FORWARD_LOG Receives `(logger_name, level, msg)` 3-tuples and writes them to the master's ``mitogen.ctx.<context_name>`` logger. .. _GET_MODULE: .. currentmodule:: mitogen.core .. data:: GET_MODULE Receives the name of a module to load `fullname`, locates the source code for `fullname`, and routes one or more :py:data:`LOAD_MODULE` messages back towards the sender of the :py:data:`GET_MODULE` request. If lookup fails, :data:`None` is sent instead. See :ref:`import-preloading` for a deeper discussion of :py:data:`GET_MODULE`/:py:data:`LOAD_MODULE`. .. _ALLOCATE_ID: .. currentmodule:: mitogen.core .. data:: ALLOCATE_ID Replies to any message sent to it with a newly allocated range of context IDs, to allow children to safely start their own contexts. Presently IDs are allocated in batches of 1000 from a 32 bit range, allowing up to 4.2 million parent contexts to be created and destroyed before the associated Router must be recreated. This is handled by :class:`mitogen.master.IdAllocator` in the master process, and messages are sent to it from :class:`mitogen.parent.ChildIdAllocator` in children. Children listen on the following handles: .. _LOAD_MODULE: .. currentmodule:: mitogen.core .. data:: LOAD_MODULE Receives `(pkg_present, path, compressed, related)` tuples, composed of: * **pkg_present**: Either :data:`None` for a plain ``.py`` module, or a list of canonical names of submodules existing witin this package. For example, a :py:data:`LOAD_MODULE` for the :py:mod:`mitogen` package would return a list like: `["mitogen.core", "mitogen.fakessh", "mitogen.master", ..]`. This list is used by children to avoid generating useless round-trips due to Python 2.x's :keyword:`import` statement behavior. * **path**: Original filesystem where the module was found on the master. * **compressed**: :py:mod:`zlib`-compressed module source code. * **related**: list of canonical module names on which this module appears to depend. Used by children that have ever started any children of their own to preload those children with :py:data:`LOAD_MODULE` messages in response to a :py:data:`GET_MODULE` request. .. _CALL_FUNCTION: .. currentmodule:: mitogen.core .. data:: CALL_FUNCTION Receives `(chain_id, mod_name, class_name, func_name, args, kwargs)` 6-tuples from :class:`mitogen.parent.CallChain`, imports ``mod_name``, then attempts to execute `class_name.func_name(\*args, \**kwargs)`. * `chain_id`: if not :data:`None`, an identifier unique to the originating :class:`mitogen.parent.CallChain`. When set, if an exception occurs during a call, future calls with the same ID automatically fail with the same exception without ever executing, and failed calls with no `reply_to` set are not dumped to the logging framework as they otherwise would. This is used to implement pipelining. When this channel is closed (by way of receiving a dead message), the child's main thread begins graceful shutdown of its own :py:class:`Broker` and :py:class:`Router`. .. _SHUTDOWN: .. currentmodule:: mitogen.core .. data:: SHUTDOWN When received from a child's immediate parent, causes the broker thread to enter graceful shutdown, including sending a dead message to the child's main thread, causing it to join on the exit of the broker thread. The final step of a child's broker shutdown process sends :py:mod:`signal.SIGTERM <signal>` to itself, ensuring the process dies even if the main thread was hung executing user code. Each context is responsible for sending :py:data:`SHUTDOWN` to each of its directly connected children in response to the master sending :py:data:`SHUTDOWN` to it, and arranging for the connection to its parent to be closed shortly thereafter. Masters, and children that have ever been used to create a descendent child also listen on the following handles: .. _ADD_ROUTE: .. currentmodule:: mitogen.core .. data:: ADD_ROUTE Receives `target_id` integer from downstream, describing an ID allocated to a recently constructed child. The receiver verifies no existing route exists to `target_id` before updating its local table to route messages for `target_id` via the stream from which the :py:data:`ADD_ROUTE` message was received. .. _DEL_ROUTE: .. currentmodule:: mitogen.core .. data:: DEL_ROUTE Receives `target_id` integer from downstream, verifies a route exists to `target_id` via the stream on which the message was received, removes that route from its local table, triggers the ``disconnect`` signal on any :class:`mitogen.core.Context` instance in the local process, then propagates the message upward towards its own parent. .. currentmodule:: mitogen.core .. data:: DETACHING Sent to inform a parent that user code has invoked :meth:`ExternalContext.detach` to decouple the lifecycle of a directly connected context and its subtree from the running program. A child usually shuts down immediately if it loses its parent connection, and parents usually terminate any related Python/SSH subprocess on disconnection. Receiving :data:`DETACHING` informs the parent the connection will soon drop, but the process intends to continue life independently, and to avoid terminating the related subprocess if that subprocess is the child itself. Non-master parents also listen on the following handles: .. currentmodule:: mitogen.core .. data:: GET_MODULE As with master's ``GET_MODULE``, except this implementation (:py:class:`mitogen.master.ModuleForwarder`) serves responses using :py:class:`mitogen.core.Importer`'s cache before forwarding the request to its parent context. The response is cached by each context in turn before being forwarded on to the child context that originally made the request. In this way, the master need never re-send a module it has already sent to a direct descendant. .. currentmodule:: mitogen.core .. data:: FORWARD_MODULE Receives `(context, fullname)` tuples from its parent and arranges for a :data:`LOAD_MODULE` to be sent towards `context` for the module `fullname` and any related modules. The module must already have been delivered to the current context by its parent in a prior :data:`LOAD_MODULE` message. If the receiver is the immediate parent of `context`, then only :data:`LOAD_MODULE` is sent to the child. Otherwise :data:`LOAD_MODULE` is sent to the next closest parent if the module has not previously been sent on that stream, followed by a copy of the :data:`FORWARD_MODULE` message. This message is used to recursively preload indirect children with modules, ensuring they are cached and deduplicated at each hop in the chain leading to the target context. .. _reply_to_values: Special values for the `reply_to` field: .. _IS_DEAD: .. currentmodule:: mitogen.core .. autodata:: IS_DEAD Additional handles are created to receive the result of every function call triggered by :py:meth:`call_async() <mitogen.parent.Context.call_async>`. Use of Pickle ############# The current implementation uses the Python :py:mod:`cPickle` module, with a restrictive class whitelist to prevent triggering undesirable code execution. The primary reason for using :py:mod:`cPickle` is that it is computationally efficient, and avoids including a potentially large body of serialization code in the bootstrap. The pickler will instantiate only built-in types and one of 3 constructor functions, to support unpickling :py:class:`CallError <mitogen.core.CallError>`, :py:class:`mitogen.core.Sender`,and :py:class:`Context <mitogen.core.Context>`. The choice of Pickle is one area to be revisited later. All accounts suggest it cannot be used securely, however few of those accounts appear to be expert, and none mention any additional attacks that would not be prevented by using a restrictive class whitelist. The IO Multiplexer ------------------ Since we must include our IO multiplexer as part of the bootstrap, off-the-shelf implementations are for the most part entirely inappropriate. For example, a minimal copy of Twisted weighs in at around 440KiB and is composed of approximately 115 files. Even if we could arrange for an entire Python package to be transferred during bootstrap, this minimal configuration is massive in comparison to Mitogen's solution, multiplies quickly in the presence of many machines, and would require manually splitting up the parts of Twisted that we would like to use. .. _routing: Message Routing --------------- Routing assumes it is impossible to construct a tree such that one of a context's parents will not know the ID of a target the context is attempting to communicate with. When :py:class:`mitogen.core.Router` receives a message, it checks the IDs associated with its directly connected streams for a potential route. If any stream matches, either because it directly connects to the target ID, or because the master sent an :py:data:`ADD_ROUTE <mitogen.core.ADD_ROUTE>` message associating it, then the message will be forwarded down the tree using that stream. If the message does not match any :py:data:`ADD_ROUTE <mitogen.core.ADD_ROUTE>` message or stream, instead it is forwarded upwards to the immediate parent, and recursively by each parent in turn until one is reached that knows how to forward the message down the tree. When a parent establishes a new child, it sends a corresponding :py:data:`ADD_ROUTE <mitogen.core.ADD_ROUTE>` message towards its parent, which recursively forwards it up towards the root. Parents keep note of all routes associated with each stream they connect with, and trigger ``DEL_ROUTE`` messages propagated upstream for each route associated with that stream if the stream is disconnected for any reason. Example ####### .. image:: images/context-tree.svg :class: mitogen-full-width In the diagram, when ``node12b`` is creating the ``sudo:node12b:webapp`` context, it must send ``ADD_ROUTE`` messages to ``rack12``, which will propagate it to ``dc1``, and recursively to ``bastion``, and ``master``; ``node12b`` does not require an ``ADD_ROUTE`` message since it has a stream directly connected to the new context. Since Mitogen streams are strictly ordered, it is never possible for a parent to receive a message from a newly constructed child before receiving a corresponding ``ADD_ROUTE`` sent by the child's parent, describing how to reply to it. When ``sudo:node12b:webapp`` wants to send a message to ``sudo:node22a:webapp``, the message will be routed as follows: ``sudo:node12b:webapp -> node12b -> rack12 -> dc1 -> bastion -> dc2 -> rack22 -> node22a -> sudo:node22a:webapp`` .. image:: images/route.svg :class: mitogen-full-width Disconnect Propagation ###################### To ensure timely shutdown when a failure occurs, where some context is awaiting a response from another context that has become disconnected, :class:`mitogen.core.Router` additionally records the destination context ID of every message received on a particular stream. When ``DEL_ROUTE`` is generated locally or received on some other stream, :class:`mitogen.parent.RouteMonitor` uses this to find every stream that ever communicated with the route that is about to go away, and forwards the message to each found. The recipient ``DEL_ROUTE`` handler in turn uses the message to find any :class:`mitogen.core.Context` in the local process corresponding to the disappearing route, and if found, fires a ``disconnected`` event on it. Any interested party, such as :class:`mitogen.core.Receiver`, may subscribe to the event and use it to abort any threads that were asleep waiting for a reply that will never arrive. .. _source-verification: Source Verification ################### Before forwarding or dispatching a message it has received, :py:class:`mitogen.core.Router` first looks up the corresponding :py:class:`mitogen.core.Stream` it would use to send responses towards the context ID listed in the `auth_id` field, and if the looked up stream does not match the stream on which the message was received, the message is discarded and a warning is logged. This creates a trust chain leading up to the root of the tree, preventing downstream contexts from injecting messages appearing to be from the master or any more trustworthy parent. In this way, privileged functionality such as :py:data:`CALL_FUNCTION <mitogen.core.CALL_FUNCTION>` can base trust decisions on the accuracy of :py:ref:`auth_id <stream-protocol>`. The `auth_id` field is separate from `src_id` in order to support granting privilege to contexts that do not follow the tree's natural trust chain. This supports cases where siblings are permitted to execute code on one another, or where isolated processes can connect to a listener and communicate with an already established established tree, such as where a :mod:`mitogen.unix` client receives the same privilege as the process it connects to. Differences Between Master And Child Brokers ############################################ The main difference between :py:class:`mitogen.core.Broker` and :py:class:`mitogen.master.Broker` is that when the stream connection to the parent is lost in a child, the broker will trigger its own shutdown. The Module Importer ------------------- :py:class:`mitogen.core.Importer` is still a work in progress, as there are a variety of approaches to implementing it, and the present implementation is not pefectly efficient in every case. It operates by intercepting :keyword:`import` statements via :py:data:`sys.meta_path`, asking Python if it can satisfy the import by itself, and if not, indicating to Python that it is capable of loading the module. In :py:meth:`load_module() <mitogen.core.Importer.load_module>` an RPC is started to the parent context, requesting the module source code by way of a :py:data:`GET_MODULE <mitogen.core.GET_MODULE>`. If the parent context does not have the module available, it recursively forwards the request upstream, while avoiding duplicate requests for the same module from its own threads and any child contexts. Neutralizing :py:mod:`__main__` ############################### To avoid accidental execution of the :py:mod:`__main__` module's code in a slave context, when serving the source of the main module, Mitogen removes any code occurring after the first conditional that looks like a standard :py:mod:`__main__` execution guard: .. code-block:: python # Code that looks like this is stripped from __main__. if __name__ == '__main__': run_some_code() To further avoid accidental execution, Mitogen will refuse to serve :mod:`__main__` to children if no execution guard is found, as it is common that no guard is present during early script prototyping. These are hacks, but they are the safest and least annoying found to solve the problem. Avoiding Negative Imports ######################### In Python 2.x where relative imports are the default, a large number of import requests will be made for modules that do not exist. For example: .. code-block:: python # mypkg/__init__.py import sys import os In Python 2.x, Python will first try to load :py:mod:`mypkg.sys` and :py:mod:`mypkg.os`, which do not exist, before falling back on :py:mod:`sys` and :py:mod:`os`. These negative imports present a challenge, as they introduce a large number of pointless network round-trips. Therefore in addition to the :py:mod:`zlib`-compressed source, for packages the master sends along a list of child modules known to exist. Before indicating it can satisfy an import request, :py:class:`mitogen.core.Importer` first checks to see if the module belongs to a package it has previously imported, and if so, ignores the request if the module does not appear in the enumeration of child modules belonging to the package that was provided by the master. .. _import-preloading: Import Preloading ################# .. currentmodule:: mitogen.core To further avoid round-trips, when a module or package is requested by a child, its bytecode is scanned in the master to find all the module's :keyword:`import` statements, and of those, which associated modules appear to have been loaded in the master's :py:data:`sys.modules`. The :py:data:`sys.modules` check is necessary to handle various kinds of conditional execution, for example, when a module's code guards an :keyword:`import` statement based on the active Python runtime version, operating system, or optional third party dependencies. Before replying to a child's request for a module with dependencies: * If the request is for a package, any dependent modules used by the package that appear within the package itself are known to be missing from the child, since the child requested the top-level package module, therefore they are pre-loaded into the child using :py:data:`LOAD_MODULE` messages before sending the :py:data:`LOAD_MODULE` message for the requested package module itself. In this way, the child will already have dependent modules cached by the time it receives the requested module, avoiding one round-trip for each dependency. For example, when a child requests the :py:mod:`django` package, and the master determines the :py:mod:`django` module code in the master has :keyword:`import` statements for :py:mod:`django.utils`, :py:mod:`django.utils.lru_cache`, and :py:mod:`django.utils.version`, and that execution of the module code on the master caused those modules to appear in the master's :py:data:`sys.modules`, there is high probability execution of the :py:mod:`django` module code in the child will cause the same modules to be loaded. Since all those modules exist within the :py:mod:`django` package, and we already know the child lacks that package, it is safe to assume the child will make follow-up requests for those modules too. In the example, 4 round-trips are replaced by 1 round-trip. For any package module ever requested by a child, the parent keeps a note of the name of the package for one final optimization: * If the request is for a sub-module of a package, and it is known the child loaded the package's implementation from the parent, then any dependent modules of the requested module at any nesting level within the package that is known to be missing are sent using :py:data:`LOAD_MODULE` messages before sending the :py:data:`LOAD_MODULE` message for the requested module, avoiding 1 round-trip for each dependency within the same top-level package. For example, when a child has previously requested the :py:mod:`django` package module, the parent knows the package was completely absent on the child. Therefore when the child subsequently requests the :py:mod:`django.db` package module, it is safe to assume the child will generate subsequent :py:data:`GET_MODULE` requests for the 2 :py:mod:`django.conf`, 3 :py:mod:`django.core`, 2 :py:mod:`django.db`, 3 :py:mod:`django.dispatch`, and 7 :py:mod:`django.utils` indirect dependencies for :py:mod:`django.db`. In the example, 17 round-trips are replaced by 1 round-trip. The method used to detect import statements is similar to the standard library :py:mod:`modulefinder` module: rather than analyze module source code, :ref:`IMPORT_NAME <python:bytecodes>` opcodes are extracted from the module's bytecode. This is since clean source analysis methods (:py:mod:`ast` and :py:mod:`compiler`) are an order of magnitude slower, and incompatible across major Python versions. Concurrency ########### Duplicate requests must never be issued to the parent, either due to a local import or any :py:data:`GET_MODULE` originating from a child. This lets parents assume a module requested once by a downstream connection need never be re-sent, for example, if it appears as a preloading dependency in a subsequent :py:data:`GET_MODULE`, or had been requested immediately after being sent as a preloading dependency for an unrelated request by a descendent. Therefore each tree layer must deduplicate :py:data:`GET_MODULE` requests, and synchronize their descendents and local threads on corresponding :py:data:`LOAD_MODULE` responses from the parent. In each context, pending requests are serialized by a :py:class:`threading.Lock` within :py:class:`mitogen.core.Importer`, which may only be held for operations that cannot block, since :py:class:`ModuleForwarder <mitogen.master.ModuleForwarder>` must acquire it while synchronizing :py:data:`GET_MODULE` requests from children on the IO multiplexer thread. Requests From Local Threads ~~~~~~~~~~~~~~~~~~~~~~~~~~~ When Mitogen begins satisfying an import, it is known the module has never been imported in the local process. :py:class:`Importer <mitogen.core.Importer>` executes under the runtime importer lock, ensuring :py:keyword:`import` statements executing in local threads are serialized. .. note:: In Python 2, :py:exc:`ImportError` is raised when :py:keyword:`import` is attempted while the runtime import lock is held by another thread, therefore imports must be serialized by only attempting them from the main (:py:data:`CALL_FUNCTION`) thread. The problem is most likely to manifest in third party libraries that lazily import optional dependencies at runtime from a non-main thread. The workaround is to explicitly import those dependencies from the main thread before initializing the third party library. This was fixed in Python 3.5, but Python 3.x is not yet supported. See `Python Issue #9260`_. .. _Python Issue #9260: https://bugs.python.org/issue9260 While holding its own lock, :py:class:`Importer <mitogen.core.Importer>` checks if the source is not yet cached, determines if an in-flight :py:data:`GET_MODULE` exists for it, starting one if none exists, adds itself to a list of callbacks fired when a corresponding :py:data:`LOAD_MODULE` arrives from the parent, then sleeps waiting for the callback. When the source becomes available, the module is constructed on the calling thread using the best practice documented in `PEP 302`_. .. _PEP 302: https://www.python.org/dev/peps/pep-0302/ Requests From Children ~~~~~~~~~~~~~~~~~~~~~~ As with local imports, when :py:data:`GET_MODULE` is received from a child, while holding the :py:class:`Importer <mitogen.core.Importer>` lock, :py:class:`ModuleForwarder <mitogen.master.ModuleForwarder>` checks if the source is not yet cached, determines if an in-flight :py:data:`GET_MODULE` toward the parent exists for it, starting one if none exists, then adds a completion handler to the list of callbacks fired when a corresponding :py:data:`LOAD_MODULE` arrives from the parent. When the source becomes available, the completion handler issues corresponding :py:data:`LOAD_MODULE` messages toward the child for the requested module after any required for dependencies known to be absent from the child. Since intermediaries do not know a module's dependencies until the module's source arrives, it is not possible to preemptively issue :py:data:`LOAD_MODULE` for those dependencies toward a requesting child as they become available from the parent at the intermediary. This creates needless network serialization and latency that should be addressed in a future design. Child Module Enumeration ######################## Package children are enumerated using :py:func:`pkgutil.iter_modules`. Use Of Threads -------------- The package always runs the IO multiplexer in a thread. This is so the multiplexer retains control flow in order to shut down gracefully, say, if the user's code has hung and the master context has disconnected. While it is possible for the IO multiplexer to recover control of a hung function call on UNIX using for example :py:mod:`signal.SIGALRM <signal>`, this mechanism is not portable to non-UNIX operating systems, and does not work in every case, for example when Python blocks signals during a variety of :py:mod:`threading` package operations. At some point it is likely Mitogen will be extended to support children running on Windows. When that happens, it would be nice if the process model on Windows and UNIX did not differ, and in fact the code used on both were identical. .. _waking-sleeping-threads: Waking Sleeping Threads ####################### Due to fundamental deficiencies in Python 2's threading implementation, it is not possible to block waiting on synchronization objects sanely. Two major problems exist: * Sleeping with no timeout set causes signals to be blocked, preventing the user from terminating the process using CTRL+C. * Sleeping with a timeout set internally makes use of polling, with an exponential backoff that eventually results in the thread sleeping unconditionally in 50ms increments. . This is a huge source of latency that quickly multiplies. As the UNIX self-pipe trick must already be employed to wake the broker thread from its select loop, Mitogen reuses this technique to wake any thread synchronization primitive exposed by the library, embodied in a queue-like abstraction called a :py:class:`mitogen.core.Latch`. Unfortunately it is commonplace for hosts to enforce severe per-process file descriptors limits, so aside from being inefficient, it is impossible in the usual case to create a pair of descriptors for every waitable object, which for example includes the result of every single asynchronous function call. For this reason self-pipes are created on a per-thread basis, with their associated :py:func:`socketpairs <socket.socketpair>` kept in thread-local storage. When a latch wishes to sleep its thread, this pair is created on-demand and temporarily associated with it only for the duration of the sleep. Python's garbage collector is relied on to clean up by calling the pair's destructor on thread exit. There does not otherwise seem to be a robust method to trigger cleanup code on arbitrary threads. To summarize, file descriptor usage is bounded by the number of threads rather than the number of waitables, which is a much smaller number, however it also means that Mitogen requires twice as many file descriptors as there are user threads, with a minimum of 4 required in any configuration. Latch Internals ~~~~~~~~~~~~~~~ .. currentmodule:: mitogen.core Attributes: * `lock` – :py:class:`threading.Lock`. * `queue` – items waiting to be dequeued. * `sleeping` – write sides of the socketpairs for each sleeping thread, and threads in the process of waking from sleep. * `waking` – integer number of `sleeping` threads in the process of waking up. * `closed` – boolean defaulting to :py:data:`False`. Every time `lock` is acquired, `closed` must be tested, and if it is :py:data:`True`, :py:class:`LatchError` must be thrown. Latch.put() ~~~~~~~~~~~ :py:meth:`Latch.put` operates by: 1. Acquiring `lock`. 2. Appending the item on to `queue`. 3. If `waking` is less than the length of `sleeping`, write a byte to the socket at `sleeping[waking]` and increment `waking`. In this way each thread is woken only once, and receives each element according to when its socket was placed on `sleeping`. Latch.close() ~~~~~~~~~~~~~ :py:meth:`Latch.close` acquires `lock`, sets `closed` to :py:data:`True`, then writes a byte to every `sleeping[waking]` socket, while incrementing `waking`, until no more unwoken sockets exist. Per above, on waking from sleep, after removing itself from `sleeping`, each sleeping thread tests if `closed` is :py:data:`True`, and if so throws :py:class:`LatchError`. It is necessary to ensure at most one byte is delivered on each socket, even if the latch is being torn down, as the sockets outlive the scope of a single latch, and must never have extraneous data buffered on them, as this will cause unexpected wakeups if future latches sleep on the same thread. Latch.get() ~~~~~~~~~~~ :py:meth:`Latch.get` is far more intricate, as there are many outcomes to handle. Queue ordering is strictly first-in first-out, and threads always receive items in the order they are requested, as they become available. **1. Non-empty, No Waiters, No sleep** On entry `lock` is taken, and if `queue` is non-empty, and `sleeping` is empty, it is safe to return `queue`'s first item without blocking. **2. Non-empty, Waiters Present, Queue > Waiters, No sleep** When `sleeping` is non-empty but there are more items than sleeping threads, it is safe to pop `queue[len(sleeping)]` without blocking. **3. Non-empty, Waiters Present, Queue <= Waiters** In this case `sleeping` is non-empty and there are no surplus items. It is not safe to pop any item even though we are holding `lock`, as it would starve waking threads of their position in favour of the calling thread, since scheduling uncertainty exists between a thread waking from :py:func:`select.select` and re-acquiring `lock`. This avoids the need for a retry loop for waking threads, and a thread being continually re-woken to discover `queue` drained by a thread that never slept. **4. Sleep** Since no surplus items existed, the thread adds its socket to `sleeping` before releasing `lock`, and sleeping in :py:func:`select.select` waiting for timeout, or a write from :py:meth:`Latch.put` or :py:meth:`Latch.close`. If :py:func:`select.select` throws an exception, the exception must be caught and re-raised only after some of the wake steps below have completed. **5. Wake, Non-empty** On wake `lock` is re-acquired, the socket is removed from `sleeping` after noting its index, and :py:class:`TimeoutError` is thrown if `waking` indicates :py:meth:`Latch.put()` nor :py:meth:`Latch.close` have yet to send a wake byte to that index. The byte is then read off, :py:class:`LatchError` is thrown if `closed` is :py:data:`True`, otherwise the queue item corresponding to the thread's index is popped and returned. It is paramount that in every case, if a byte was written to the socket, that the byte is read away. The socket is reused by subsequent latches sleeping on the same thread, and unexpected wakeups are triggered if extraneous data remains buffered on the socket. It is also necessary to favour the synchronized `waking` variable over the return value of :py:func:`select.select`, as scheduling uncertainty introduces a race between the select timing out, and :py:meth:`Latch.put()` or :py:meth:`Latch.close` writing a wake byte before :py:meth:`Latch.get` has re-acquired `lock`. .. rubric:: Footnotes .. [#f1] Although some connection methods such as SSH support compression, and Mitogen enables SSH compression by default, there are circumstances where disabling SSH compression is desirable, and many scenarios for future connection methods where transport-layer compression is not supported at all. .. [#f2] Compression may seem redundant, however it is basically free and reducing IO is always a good idea. The 33% / 200 byte saving may mean the presence or absence of an additional frame on the network, or in real world terms after accounting for SSH overhead, around a 2% reduced chance of a stall during connection setup due to a dropped frame. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mitogen-0.3.9/docs/images/��������������������������������������������������������������������������0000775�0000000�0000000�00000000000�14656664731�0015404�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������mitogen-0.3.9/docs/images/ansible/������������������������������������������������������������������0000775�0000000�0000000�00000000000�14656664731�0017021�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������mitogen-0.3.9/docs/images/ansible/ansible_mitogen.svg�����������������������������������������������0000664�0000000�0000000�00000017766�14656664731�0022722�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version='1.0' encoding='UTF-8'?> <svg xmlns="http://www.w3.org/2000/svg" width="268.745" height="364.095" viewBox="0 0 268.745 364.095"><path d="M115.623 89.533c0 13.385-10.85 24.234-24.235 24.234-13.384 0-24.235-10.85-24.235-24.234 0-13.384 10.85-24.235 24.235-24.235s24.234 10.851 24.234 24.235" fill="#8f8f8f"/><path d="M91.796 80.103l6.271 15.478-9.473-7.462zm11.14 19.044L93.29 75.931c-.275-.67-.826-1.023-1.494-1.023-.67 0-1.26.354-1.536 1.023l-10.588 25.465h3.622l4.191-10.5 12.508 10.106c.503.406.866.59 1.338.59.945 0 1.77-.708 1.77-1.73 0-.167-.058-.431-.164-.715z" fill="#fff"/><path d="M191.643 38.576c0 13.385-10.849 24.234-24.234 24.234-13.384 0-24.234-10.85-24.234-24.234 0-13.384 10.85-24.235 24.234-24.235 13.385 0 24.235 10.851 24.235 24.235" fill="#8f8f8f"/><path d="M167.817 29.146l6.272 15.478-9.473-7.462zm11.141 19.044l-9.646-23.216c-.276-.67-.826-1.024-1.495-1.024-.67 0-1.26.355-1.535 1.024l-10.589 25.465h3.622l4.19-10.5 12.509 10.106c.503.406.866.59 1.338.59.945 0 1.77-.708 1.77-1.73 0-.167-.058-.431-.165-.715z" fill="#fff"/><path d="M191.643 129.377c0 13.385-10.849 24.234-24.234 24.234-13.384 0-24.234-10.85-24.234-24.234 0-13.384 10.85-24.235 24.234-24.235 13.385 0 24.235 10.851 24.235 24.235" fill="#8f8f8f"/><path d="M167.817 119.947l6.272 15.478-9.473-7.462zm11.141 19.044l-9.646-23.216c-.276-.67-.826-1.023-1.495-1.023-.67 0-1.26.354-1.535 1.023l-10.589 25.466h3.622l4.19-10.5 12.509 10.106c.503.407.866.59 1.338.59.945 0 1.77-.708 1.77-1.73 0-.167-.058-.43-.165-.715z" fill="#fff"/><path d="M191.793 230.712c0 13.385-10.85 24.235-24.235 24.235-13.384 0-24.235-10.85-24.235-24.235 0-13.384 10.85-24.234 24.235-24.234s24.234 10.85 24.234 24.234" fill="#8f8f8f"/><path d="M167.966 221.282l6.271 15.479-9.473-7.462zm11.14 19.044l-9.646-23.215c-.275-.67-.826-1.024-1.494-1.024-.67 0-1.26.354-1.536 1.024l-10.588 25.464h3.622l4.191-10.499 12.508 10.105c.503.407.866.59 1.338.59.945 0 1.77-.708 1.77-1.73 0-.166-.058-.43-.164-.715z" fill="#fff"/><path d="M115.623 278.487c0 13.385-10.85 24.234-24.235 24.234-13.384 0-24.235-10.85-24.235-24.234 0-13.384 10.85-24.235 24.235-24.235s24.234 10.85 24.234 24.235" fill="#8f8f8f"/><path d="M91.796 269.057l6.271 15.478-9.473-7.462zm11.14 19.044l-9.646-23.216c-.275-.67-.826-1.024-1.494-1.024-.67 0-1.26.355-1.536 1.024l-10.588 25.466h3.622l4.191-10.5 12.508 10.106c.503.406.866.59 1.338.59.945 0 1.77-.708 1.77-1.73 0-.167-.058-.431-.164-.715z" fill="#fff"/><path d="M191.495 321.365c0 13.385-10.85 24.235-24.234 24.235-13.384 0-24.235-10.85-24.235-24.235 0-13.384 10.851-24.234 24.235-24.234 13.385 0 24.234 10.85 24.234 24.234" fill="#8f8f8f"/><path d="M167.669 311.935l6.271 15.478-9.473-7.461zm11.14 19.044l-9.646-23.215c-.275-.67-.826-1.024-1.494-1.024-.67 0-1.26.354-1.536 1.024l-10.588 25.464h3.622l4.192-10.499 12.507 10.105c.503.407.866.59 1.338.59.945 0 1.771-.708 1.771-1.73 0-.167-.059-.43-.165-.715z" fill="#fff"/><path d="M268.745 147.974c0 9.587-7.772 17.358-17.36 17.358-9.586 0-17.358-7.77-17.358-17.358 0-9.587 7.772-17.36 17.359-17.36 9.587 0 17.359 7.773 17.359 17.36" fill="#8f8f8f"/><path d="M251.678 141.219l4.492 11.087-6.785-5.345zm7.98 13.641l-6.91-16.63c-.197-.479-.591-.733-1.07-.733-.48 0-.903.254-1.1.734l-7.584 18.24h2.594l3.002-7.52 8.96 7.238c.36.29.62.423.958.423.677 0 1.268-.508 1.268-1.24 0-.12-.042-.309-.118-.512z" fill="#fff"/><path d="M268.448 106.761c0 9.587-7.772 17.358-17.36 17.358-9.586 0-17.358-7.771-17.358-17.359 0-9.587 7.772-17.359 17.359-17.359 9.587 0 17.359 7.772 17.359 17.36" fill="#8f8f8f"/><path d="M251.381 100.005l4.492 11.088-6.785-5.345zm7.98 13.642l-6.91-16.63c-.197-.48-.591-.733-1.07-.733-.48 0-.903.254-1.1.734l-7.584 18.24h2.594l3.003-7.52 8.959 7.237c.36.292.62.423.958.423.677 0 1.269-.507 1.269-1.24 0-.119-.043-.308-.119-.511z" fill="#fff"/><path d="M268.745 57.419c0 9.587-7.772 17.358-17.36 17.358-9.586 0-17.358-7.771-17.358-17.358s7.772-17.36 17.359-17.36c9.587 0 17.359 7.773 17.359 17.36" fill="#8f8f8f"/><path d="M251.678 50.664l4.492 11.087-6.785-5.345zm7.98 13.641l-6.91-16.63c-.197-.479-.591-.733-1.07-.733-.48 0-.903.254-1.1.734l-7.584 18.24h2.594l3.002-7.52 8.96 7.238c.36.29.62.423.958.423.677 0 1.268-.508 1.268-1.24 0-.12-.042-.309-.118-.512z" fill="#fff"/><path d="M268.745 17.359c0 9.588-7.772 17.36-17.36 17.36-9.586 0-17.358-7.772-17.358-17.36C234.027 7.772 241.799 0 251.386 0c9.587 0 17.359 7.772 17.359 17.36" fill="#8f8f8f"/><path d="M251.678 10.604l4.492 11.088-6.785-5.345zm7.98 13.642l-6.91-16.63c-.197-.48-.591-.733-1.07-.733-.48 0-.903.254-1.1.733l-7.584 18.24h2.594l3.002-7.52 8.96 7.238c.36.292.62.423.958.423.677 0 1.268-.507 1.268-1.24a1.64 1.64 0 0 0-.118-.511z" fill="#fff"/><path d="M268.745 206.528c0 9.588-7.772 17.36-17.36 17.36-9.586 0-17.358-7.772-17.358-17.36 0-9.586 7.772-17.359 17.359-17.359 9.587 0 17.359 7.773 17.359 17.36" fill="#8f8f8f"/><path d="M251.678 199.773l4.492 11.088-6.785-5.345zm7.98 13.642l-6.91-16.63c-.197-.479-.591-.733-1.07-.733-.48 0-.903.254-1.1.734l-7.584 18.24h2.594l3.002-7.52 8.96 7.237c.36.292.62.423.958.423.677 0 1.268-.507 1.268-1.24a1.64 1.64 0 0 0-.118-.511z" fill="#fff"/><path d="M268.745 246.588c0 9.587-7.772 17.359-17.36 17.359-9.586 0-17.358-7.772-17.358-17.36 0-9.586 7.772-17.358 17.359-17.358 9.587 0 17.359 7.772 17.359 17.359" fill="#8f8f8f"/><path d="M251.678 239.833l4.492 11.087-6.785-5.345zm7.98 13.641l-6.91-16.629c-.197-.48-.591-.733-1.07-.733-.48 0-.903.253-1.1.733l-7.584 18.24h2.594l3.002-7.52 8.96 7.238c.36.291.62.423.958.423.677 0 1.268-.508 1.268-1.24 0-.12-.042-.308-.118-.512z" fill="#fff"/><path d="M268.745 306.677c0 9.587-7.772 17.359-17.36 17.359-9.586 0-17.358-7.772-17.358-17.36 0-9.586 7.772-17.358 17.359-17.358 9.587 0 17.359 7.772 17.359 17.359" fill="#8f8f8f"/><path d="M251.678 299.921l4.492 11.088-6.785-5.345zm7.98 13.642l-6.91-16.629c-.197-.48-.591-.733-1.07-.733-.48 0-.903.253-1.1.733l-7.584 18.24h2.594l3.002-7.52 8.96 7.238c.36.291.62.423.958.423.677 0 1.268-.508 1.268-1.24 0-.12-.042-.308-.118-.512z" fill="#fff"/><g><path d="M268.745 346.736c0 9.588-7.772 17.359-17.36 17.359-9.586 0-17.358-7.771-17.358-17.359 0-9.587 7.772-17.36 17.359-17.36 9.587 0 17.359 7.773 17.359 17.36" fill="#8f8f8f"/><path d="M251.678 339.981l4.492 11.087-6.785-5.344zm7.98 13.641l-6.91-16.629c-.197-.48-.591-.733-1.07-.733-.48 0-.903.254-1.1.733l-7.584 18.24h2.594l3.002-7.52 8.96 7.238c.36.291.62.423.958.423.677 0 1.268-.507 1.268-1.24a1.65 1.65 0 0 0-.118-.512z" fill="#fff"/></g><g><path d="M48.469 183.68c0 13.385-10.85 24.234-24.235 24.234C10.85 207.914 0 197.064 0 183.68c0-13.384 10.85-24.235 24.234-24.235 13.385 0 24.235 10.85 24.235 24.235" fill="#8f8f8f"/><path d="M24.643 174.249l6.27 15.479-9.472-7.462zm11.14 19.045l-9.647-23.216c-.275-.67-.826-1.024-1.494-1.024-.67 0-1.26.355-1.535 1.024l-10.588 25.465h3.622l4.19-10.5 12.509 10.105c.503.407.866.591 1.338.591.944 0 1.77-.708 1.77-1.73 0-.167-.058-.431-.165-.715z" fill="#fff"/></g><g fill="#8f8f8f"><path d="M45.491 143.793l16.053-22.447-2.415-1.719 6.944-1.246 1.08 6.955-2.384-1.696-16.053 22.447zm0 76.102l16.053 22.447-2.415 1.719 6.944 1.246 1.08-6.955-2.384 1.696-16.053-22.447zm70.132 37.49l19.554-12.65-1.358-2.1 5.827 1.175-1.317 5.797-1.34-2.07-19.554 12.65zm1.78 39.164l19.554 12.65-1.358 2.1 5.828-1.176-1.317-5.797-1.34 2.071-19.555-12.65zm-1.78-229.273l19.554-12.65-1.358-2.1 5.827 1.175-1.317 5.797-1.34-2.071-19.554 12.65zm1.78 39.163l19.554 12.65-1.358 2.1 5.828-1.175-1.317-5.797-1.34 2.07-19.555-12.65z"/></g><path d="M197.423 23.739l21.267-9.496-1.02-2.282 5.578 2.056-2.192 5.526-1.006-2.252-21.266 9.495zm-.188 22.805l21.267 9.495-1.02 2.283 5.578-2.057-2.192-5.525-1.006 2.252-21.266-9.495zm.828 67.103l21.267-9.495-1.02-2.283 5.579 2.056-2.193 5.526-1.005-2.252-21.267 9.495zm-.187 22.805l21.266 9.495-1.019 2.283 5.578-2.056-2.193-5.526-1.005 2.252-21.267-9.495zm.502 76.684l21.267-9.495-1.02-2.283 5.578 2.056-2.192 5.526-1.006-2.252-21.266 9.495zm-.188 22.805l21.267 9.495-1.02 2.283 5.578-2.056-2.192-5.526-1.005 2.252-21.267-9.495zm-.424 75.95l21.266-9.495-1.019-2.283 5.578 2.057-2.193 5.525-1.005-2.252-21.267 9.495zm-.188 22.806l21.266 9.495-1.019 2.282 5.578-2.056-2.192-5.526-1.006 2.252-21.267-9.495z" fill="#8f8f8f"/></svg>����������mitogen-0.3.9/docs/images/ansible/pcaps/������������������������������������������������������������0000775�0000000�0000000�00000000000�14656664731�0020127�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������mitogen-0.3.9/docs/images/ansible/pcaps/.gitattributes����������������������������������������������0000664�0000000�0000000�00000000300�14656664731�0023013�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������**pcap** filter=lfs diff=lfs merge=lfs -text run_hostname_100_times_mito.pcap.gz filter=lfs diff=lfs merge=lfs -text run_hostname_100_times_vanilla.pcap.gz filter=lfs diff=lfs merge=lfs -text ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mitogen-0.3.9/docs/images/ansible/pcaps/costapp-uk-india.svg����������������������������������������0000664�0000000�0000000�00000063471�14656664731�0024033�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<svg height="360" viewBox="0 0 696 270" width="928" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><style>*{stroke-linecap:butt;stroke-linejoin:round}</style></defs><g id="figure_1"><path d="M0 270.016h696.09V0H0z" fill="#fff" id="patch_1"/><g id="axes_1"><g id="matplotlib.axis_1"><g id="xtick_1"><path clip-path="url(#pc47d77ee3d)" d="M99.49 232.46V10.7" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_1"/><g id="line2d_2"><defs><path d="M0 0v3.5" id="m6347a1dde0" stroke="silver" stroke-width=".8"/></defs><use x="99.489" xlink:href="#m6347a1dde0" y="232.46" fill="silver" stroke="silver" stroke-width=".8"/></g><g id="text_1"><defs><path d="M31.781 66.406q-7.61 0-11.453-7.5Q16.5 51.422 16.5 36.375q0-14.984 3.828-22.484 3.844-7.5 11.453-7.5 7.672 0 11.5 7.5 3.844 7.5 3.844 22.484 0 15.047-3.844 22.531-3.828 7.5-11.5 7.5zm0 7.813q12.266 0 18.735-9.703 6.468-9.688 6.468-28.141 0-18.406-6.468-28.11-6.47-9.687-18.735-9.687-12.25 0-18.718 9.688-6.47 9.703-6.47 28.109 0 18.453 6.47 28.14Q19.53 74.22 31.78 74.22z" id="DejaVuSans-30"/><path d="M10.688 12.406H21V0H10.687z" id="DejaVuSans-2e"/><path d="M44.281 53.078v-8.5q-3.797 1.953-7.906 2.922-4.094.984-8.5.984-6.688 0-10.031-2.047-3.344-2.046-3.344-6.156 0-3.125 2.39-4.906 2.391-1.781 9.626-3.39l3.078-.688q9.562-2.047 13.593-5.781 4.032-3.735 4.032-10.422 0-7.625-6.032-12.078-6.03-4.438-16.578-4.438-4.39 0-9.156.86Q10.688.296 5.422 2v9.281q4.984-2.594 9.812-3.89 4.829-1.282 9.579-1.282 6.343 0 9.75 2.172 3.421 2.172 3.421 6.125 0 3.656-2.468 5.61-2.453 1.953-10.813 3.765l-3.125.735q-8.344 1.75-12.062 5.39-3.704 3.64-3.704 9.985 0 7.718 5.47 11.906Q16.75 56 26.811 56q4.97 0 9.36-.734 4.406-.72 8.11-2.188z" id="DejaVuSans-73"/></defs><g transform="matrix(.1 0 0 -.1 88.933 247.058)"><use xlink:href="#DejaVuSans-30"/><use x="63.623" xlink:href="#DejaVuSans-2e"/><use x="95.41" xlink:href="#DejaVuSans-30"/><use x="159.033" xlink:href="#DejaVuSans-73"/></g></g></g><g id="xtick_2"><path clip-path="url(#pc47d77ee3d)" d="M178.358 232.46V10.7" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_3"/><use x="178.358" xlink:href="#m6347a1dde0" y="232.46" fill="silver" stroke="silver" stroke-width=".8" id="line2d_4"/><g id="text_2"><defs><path d="M19.188 8.297h34.421V0H7.33v8.297q5.609 5.812 15.296 15.594 9.703 9.797 12.188 12.64 4.734 5.313 6.609 9 1.89 3.688 1.89 7.25 0 5.813-4.078 9.469-4.078 3.672-10.625 3.672-4.64 0-9.797-1.61-5.14-1.609-11-4.89v9.969Q13.767 71.78 18.938 73q5.188 1.219 9.485 1.219 11.328 0 18.062-5.672 6.735-5.656 6.735-15.125 0-4.5-1.688-8.531-1.672-4.016-6.125-9.485-1.218-1.422-7.765-8.187-6.532-6.766-18.453-18.922z" id="DejaVuSans-32"/></defs><g transform="matrix(.1 0 0 -.1 164.62 247.058)"><use xlink:href="#DejaVuSans-32"/><use x="63.623" xlink:href="#DejaVuSans-30"/><use x="127.246" xlink:href="#DejaVuSans-2e"/><use x="159.033" xlink:href="#DejaVuSans-30"/><use x="222.656" xlink:href="#DejaVuSans-73"/></g></g></g><g id="xtick_3"><path clip-path="url(#pc47d77ee3d)" d="M257.228 232.46V10.7" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_5"/><use x="257.228" xlink:href="#m6347a1dde0" y="232.46" fill="silver" stroke="silver" stroke-width=".8" id="line2d_6"/><g id="text_3"><defs><path d="M37.797 64.313L12.89 25.39h24.906zm-2.594 8.593H47.61V25.391h10.407v-8.203H47.609V0h-9.812v17.188H4.89v9.515z" id="DejaVuSans-34"/></defs><g transform="matrix(.1 0 0 -.1 243.49 247.058)"><use xlink:href="#DejaVuSans-34"/><use x="63.623" xlink:href="#DejaVuSans-30"/><use x="127.246" xlink:href="#DejaVuSans-2e"/><use x="159.033" xlink:href="#DejaVuSans-30"/><use x="222.656" xlink:href="#DejaVuSans-73"/></g></g></g><g id="xtick_4"><path clip-path="url(#pc47d77ee3d)" d="M336.097 232.46V10.7" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_7"/><use x="336.097" xlink:href="#m6347a1dde0" y="232.46" fill="silver" stroke="silver" stroke-width=".8" id="line2d_8"/><g id="text_4"><defs><path d="M33.016 40.375q-6.641 0-10.532-4.547-3.875-4.531-3.875-12.437 0-7.86 3.875-12.438 3.891-4.562 10.532-4.562 6.64 0 10.515 4.562 3.875 4.578 3.875 12.438 0 7.906-3.875 12.437-3.875 4.547-10.515 4.547zm19.578 30.922v-8.984q-3.719 1.75-7.5 2.671-3.782.938-7.5.938-9.766 0-14.922-6.594-5.14-6.594-5.875-19.922 2.875 4.25 7.219 6.516 4.359 2.266 9.578 2.266 10.984 0 17.36-6.672 6.374-6.657 6.374-18.125 0-11.235-6.64-18.032-6.641-6.78-17.672-6.78-12.657 0-19.344 9.687-6.688 9.703-6.688 28.109 0 17.281 8.204 27.563 8.203 10.28 22.015 10.28 3.719 0 7.5-.734t7.89-2.187z" id="DejaVuSans-36"/></defs><g transform="matrix(.1 0 0 -.1 322.36 247.058)"><use xlink:href="#DejaVuSans-36"/><use x="63.623" xlink:href="#DejaVuSans-30"/><use x="127.246" xlink:href="#DejaVuSans-2e"/><use x="159.033" xlink:href="#DejaVuSans-30"/><use x="222.656" xlink:href="#DejaVuSans-73"/></g></g></g><g id="xtick_5"><path clip-path="url(#pc47d77ee3d)" d="M414.966 232.46V10.7" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_9"/><use x="414.966" xlink:href="#m6347a1dde0" y="232.46" fill="silver" stroke="silver" stroke-width=".8" id="line2d_10"/><g id="text_5"><defs><path d="M31.781 34.625q-7.031 0-11.062-3.766-4.016-3.765-4.016-10.343 0-6.594 4.016-10.36Q24.75 6.391 31.78 6.391q7.032 0 11.078 3.78 4.063 3.798 4.063 10.345 0 6.578-4.031 10.343-4.016 3.766-11.11 3.766zm-9.86 4.188q-6.343 1.562-9.89 5.906Q8.5 49.079 8.5 55.329q0 8.733 6.219 13.812 6.234 5.078 17.062 5.078 10.89 0 17.094-5.078 6.203-5.079 6.203-13.813 0-6.25-3.547-10.61-3.531-4.343-9.828-5.906 7.125-1.656 11.094-6.5 3.984-4.828 3.984-11.796 0-10.61-6.468-16.282-6.47-5.656-18.532-5.656-12.047 0-18.531 5.656-6.469 5.672-6.469 16.282 0 6.968 4 11.797 4.016 4.843 11.14 6.5zM18.314 54.39q0-5.657 3.53-8.828 3.548-3.172 9.938-3.172 6.36 0 9.938 3.172 3.593 3.171 3.593 8.828 0 5.672-3.593 8.843-3.578 3.172-9.938 3.172-6.39 0-9.937-3.172-3.532-3.172-3.532-8.843z" id="DejaVuSans-38"/></defs><g transform="matrix(.1 0 0 -.1 401.229 247.058)"><use xlink:href="#DejaVuSans-38"/><use x="63.623" xlink:href="#DejaVuSans-30"/><use x="127.246" xlink:href="#DejaVuSans-2e"/><use x="159.033" xlink:href="#DejaVuSans-30"/><use x="222.656" xlink:href="#DejaVuSans-73"/></g></g></g><g id="xtick_6"><path clip-path="url(#pc47d77ee3d)" d="M493.835 232.46V10.7" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_11"/><use x="493.835" xlink:href="#m6347a1dde0" y="232.46" fill="silver" stroke="silver" stroke-width=".8" id="line2d_12"/><g id="text_6"><defs><path d="M12.406 8.297h16.11v55.625l-17.532-3.516v8.985l17.438 3.515h9.86V8.296H54.39V0H12.406z" id="DejaVuSans-31"/></defs><g transform="matrix(.1 0 0 -.1 476.917 247.058)"><use xlink:href="#DejaVuSans-31"/><use x="63.623" xlink:href="#DejaVuSans-30"/><use x="127.246" xlink:href="#DejaVuSans-30"/><use x="190.869" xlink:href="#DejaVuSans-2e"/><use x="222.656" xlink:href="#DejaVuSans-30"/><use x="286.279" xlink:href="#DejaVuSans-73"/></g></g></g><g id="xtick_7"><path clip-path="url(#pc47d77ee3d)" d="M572.705 232.46V10.7" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_13"/><use x="572.705" xlink:href="#m6347a1dde0" y="232.46" fill="silver" stroke="silver" stroke-width=".8" id="line2d_14"/><g transform="matrix(.1 0 0 -.1 555.786 247.058)" id="text_7"><use xlink:href="#DejaVuSans-31"/><use x="63.623" xlink:href="#DejaVuSans-32"/><use x="127.246" xlink:href="#DejaVuSans-30"/><use x="190.869" xlink:href="#DejaVuSans-2e"/><use x="222.656" xlink:href="#DejaVuSans-30"/><use x="286.279" xlink:href="#DejaVuSans-73"/></g></g><g id="xtick_8"><path clip-path="url(#pc47d77ee3d)" d="M651.574 232.46V10.7" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_15"/><use x="651.574" xlink:href="#m6347a1dde0" y="232.46" fill="silver" stroke="silver" stroke-width=".8" id="line2d_16"/><g transform="matrix(.1 0 0 -.1 634.655 247.058)" id="text_8"><use xlink:href="#DejaVuSans-31"/><use x="63.623" xlink:href="#DejaVuSans-34"/><use x="127.246" xlink:href="#DejaVuSans-30"/><use x="190.869" xlink:href="#DejaVuSans-2e"/><use x="222.656" xlink:href="#DejaVuSans-30"/><use x="286.279" xlink:href="#DejaVuSans-73"/></g></g><g id="text_9"><defs><path d="M-.297 72.906h61.672v-8.312H35.5V0h-9.906v64.594H-.296z" id="DejaVuSans-54"/><path d="M9.422 54.688h8.984V0H9.422zm0 21.296h8.984v-11.39H9.422z" id="DejaVuSans-69"/><path d="M52 44.188q3.375 6.062 8.063 8.937Q64.75 56 71.093 56q8.548 0 13.188-5.984 4.64-5.97 4.64-17V0h-9.03v32.719q0 7.86-2.797 11.656-2.781 3.813-8.485 3.813-6.984 0-11.046-4.641-4.047-4.625-4.047-12.64V0h-9.032v32.719q0 7.906-2.78 11.687-2.782 3.782-8.595 3.782-6.89 0-10.953-4.657-4.047-4.656-4.047-12.625V0H9.08v54.688h9.03v-8.5q3.078 5.03 7.375 7.421Q29.781 56 35.687 56q5.97 0 10.141-3.031Q50 49.953 52 44.187z" id="DejaVuSans-6d"/><path d="M56.203 29.594v-4.39H14.891q.593-9.282 5.593-14.142 5-4.859 13.938-4.859 5.172 0 10.031 1.266 4.86 1.265 9.656 3.812v-8.5Q49.266.734 44.187-.344 39.11-1.422 33.892-1.422q-13.094 0-20.735 7.61-7.64 7.625-7.64 20.625 0 13.421 7.25 21.296Q20.016 56 32.328 56q11.031 0 17.453-7.11 6.422-7.093 6.422-19.296zm-8.984 2.64q-.094 7.36-4.125 11.75-4.032 4.407-10.672 4.407-7.516 0-12.031-4.25-4.516-4.25-5.203-11.97z" id="DejaVuSans-65"/></defs><g transform="matrix(.1 0 0 -.1 366.102 260.737)"><use xlink:href="#DejaVuSans-54"/><use x="61.037" xlink:href="#DejaVuSans-69"/><use x="88.82" xlink:href="#DejaVuSans-6d"/><use x="186.232" xlink:href="#DejaVuSans-65"/></g></g></g><g id="matplotlib.axis_2"><g id="ytick_1"><path clip-path="url(#pc47d77ee3d)" d="M71.59 222.38h613.8" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_17"/><g id="line2d_18"><defs><path d="M0 0h-3.5" id="m315b31287f" stroke="silver" stroke-width=".8"/></defs><use x="71.589" xlink:href="#m315b31287f" y="222.38" fill="silver" stroke="silver" stroke-width=".8"/></g><g id="text_10"><defs><path d="M9.813 72.906h14.703l18.593-49.61 18.703 49.61h14.704V0H66.89v64.016l-18.797-50h-9.907l-18.796 50V0H9.813z" id="DejaVuSans-4d"/><path d="M19.672 34.813V8.108H35.5q7.953 0 11.781 3.297 3.844 3.297 3.844 10.078 0 6.844-3.844 10.078-3.828 3.25-11.781 3.25zm0 29.984V42.828h14.61q7.218 0 10.75 2.703 3.546 2.719 3.546 8.282 0 5.515-3.547 8.25-3.531 2.734-10.75 2.734zm-9.86 8.11h25.204q11.28 0 17.375-4.688Q58.5 63.53 58.5 54.89q0-6.703-3.125-10.657-3.125-3.953-9.188-4.922 7.282-1.562 11.313-6.53 4.031-4.954 4.031-12.376 0-9.765-6.64-15.093Q48.25 0 35.984 0H9.812z" id="DejaVuSans-42"/></defs><g transform="matrix(.1 0 0 -.1 20.878 226.18)"><use xlink:href="#DejaVuSans-30"/><use x="63.623" xlink:href="#DejaVuSans-2e"/><use x="95.41" xlink:href="#DejaVuSans-30"/><use x="159.033" xlink:href="#DejaVuSans-30"/><use x="222.656" xlink:href="#DejaVuSans-20"/><use x="254.443" xlink:href="#DejaVuSans-4d"/><use x="340.723" xlink:href="#DejaVuSans-69"/><use x="368.506" xlink:href="#DejaVuSans-42"/></g></g></g><g id="ytick_2"><path clip-path="url(#pc47d77ee3d)" d="M71.59 176.728h613.8" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_19"/><use x="71.589" xlink:href="#m315b31287f" y="176.728" fill="silver" stroke="silver" stroke-width=".8" id="line2d_20"/><g transform="matrix(.1 0 0 -.1 20.878 180.527)" id="text_11"><use xlink:href="#DejaVuSans-30"/><use x="63.623" xlink:href="#DejaVuSans-2e"/><use x="95.41" xlink:href="#DejaVuSans-34"/><use x="159.033" xlink:href="#DejaVuSans-38"/><use x="222.656" xlink:href="#DejaVuSans-20"/><use x="254.443" xlink:href="#DejaVuSans-4d"/><use x="340.723" xlink:href="#DejaVuSans-69"/><use x="368.506" xlink:href="#DejaVuSans-42"/></g></g><g id="ytick_3"><path clip-path="url(#pc47d77ee3d)" d="M71.59 131.075h613.8" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_21"/><use x="71.589" xlink:href="#m315b31287f" y="131.075" fill="silver" stroke="silver" stroke-width=".8" id="line2d_22"/><g id="text_12"><defs><path d="M10.984 1.516V10.5q3.72-1.766 7.516-2.688 3.813-.921 7.484-.921 9.766 0 14.907 6.562 5.156 6.563 5.89 19.953-2.828-4.203-7.187-6.453-4.344-2.25-9.61-2.25-10.937 0-17.312 6.61-6.375 6.625-6.375 18.109 0 11.219 6.64 18 6.641 6.797 17.672 6.797 12.657 0 19.313-9.703 6.672-9.688 6.672-28.141 0-17.234-8.188-27.516Q40.234-1.42 26.422-1.42q-3.719 0-7.531.734-3.797.734-7.907 2.203zM30.61 32.422q6.641 0 10.516 4.531 3.89 4.547 3.89 12.469 0 7.86-3.89 12.422-3.875 4.562-10.516 4.562-6.64 0-10.515-4.562-3.875-4.563-3.875-12.422 0-7.922 3.875-12.469 3.875-4.531 10.515-4.531z" id="DejaVuSans-39"/><path d="M10.797 72.906h38.719v-8.312H19.828v-17.86q2.14.735 4.281 1.094 2.157.36 4.313.36 12.203 0 19.328-6.688 7.14-6.688 7.14-18.11 0-11.765-7.328-18.296-7.328-6.516-20.656-6.516-4.593 0-9.36.781-4.75.782-9.827 2.344v9.922q4.39-2.39 9.078-3.563 4.687-1.171 9.906-1.171 8.453 0 13.375 4.437 4.938 4.438 4.938 12.063 0 7.609-4.938 12.047-4.922 4.453-13.375 4.453-3.953 0-7.89-.875-3.922-.875-8.016-2.735z" id="DejaVuSans-35"/></defs><g transform="matrix(.1 0 0 -.1 20.878 134.875)"><use xlink:href="#DejaVuSans-30"/><use x="63.623" xlink:href="#DejaVuSans-2e"/><use x="95.41" xlink:href="#DejaVuSans-39"/><use x="159.033" xlink:href="#DejaVuSans-35"/><use x="222.656" xlink:href="#DejaVuSans-20"/><use x="254.443" xlink:href="#DejaVuSans-4d"/><use x="340.723" xlink:href="#DejaVuSans-69"/><use x="368.506" xlink:href="#DejaVuSans-42"/></g></g></g><g id="ytick_4"><path clip-path="url(#pc47d77ee3d)" d="M71.59 85.423h613.8" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_23"/><use x="71.589" xlink:href="#m315b31287f" y="85.423" fill="silver" stroke="silver" stroke-width=".8" id="line2d_24"/><g id="text_13"><defs><path d="M40.578 39.313Q47.656 37.797 51.625 33q3.984-4.781 3.984-11.813 0-10.78-7.422-16.703-7.421-5.906-21.093-5.906-4.578 0-9.438.906-4.86.907-10.031 2.72v9.515q4.094-2.39 8.969-3.61 4.89-1.218 10.218-1.218 9.266 0 14.125 3.656 4.86 3.656 4.86 10.64 0 6.454-4.516 10.079-4.515 3.64-12.562 3.64h-8.5v8.11h8.89q7.266 0 11.125 2.906 3.86 2.906 3.86 8.375 0 5.61-3.985 8.61-3.968 3.015-11.39 3.015-4.063 0-8.703-.89-4.641-.876-10.203-2.72v8.782q5.624 1.562 10.53 2.344 4.907.78 9.25.78 11.235 0 17.766-5.109 6.547-5.093 6.547-13.78 0-6.063-3.468-10.235-3.47-4.172-9.86-5.782z" id="DejaVuSans-33"/></defs><g transform="matrix(.1 0 0 -.1 20.878 89.222)"><use xlink:href="#DejaVuSans-31"/><use x="63.623" xlink:href="#DejaVuSans-2e"/><use x="95.41" xlink:href="#DejaVuSans-34"/><use x="159.033" xlink:href="#DejaVuSans-33"/><use x="222.656" xlink:href="#DejaVuSans-20"/><use x="254.443" xlink:href="#DejaVuSans-4d"/><use x="340.723" xlink:href="#DejaVuSans-69"/><use x="368.506" xlink:href="#DejaVuSans-42"/></g></g></g><g id="ytick_5"><path clip-path="url(#pc47d77ee3d)" d="M71.59 39.77h613.8" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_25"/><use x="71.589" xlink:href="#m315b31287f" y="39.771" fill="silver" stroke="silver" stroke-width=".8" id="line2d_26"/><g transform="matrix(.1 0 0 -.1 20.878 43.57)" id="text_14"><use xlink:href="#DejaVuSans-31"/><use x="63.623" xlink:href="#DejaVuSans-2e"/><use x="95.41" xlink:href="#DejaVuSans-39"/><use x="159.033" xlink:href="#DejaVuSans-31"/><use x="222.656" xlink:href="#DejaVuSans-20"/><use x="254.443" xlink:href="#DejaVuSans-4d"/><use x="340.723" xlink:href="#DejaVuSans-69"/><use x="368.506" xlink:href="#DejaVuSans-42"/></g></g><g id="text_15"><defs><path d="M34.281 27.484q-10.89 0-15.093-2.484-4.204-2.484-4.204-8.5 0-4.781 3.157-7.594 3.156-2.797 8.562-2.797 7.485 0 12 5.297 4.516 5.297 4.516 14.078v2zm17.922 3.72V0H43.22v8.297Q40.14 3.328 35.547.953q-4.594-2.375-11.234-2.375-8.391 0-13.36 4.719Q6 8.016 6 15.922q0 9.219 6.172 13.906 6.187 4.688 18.437 4.688h12.61v.89q0 6.203-4.078 9.594-4.078 3.39-11.453 3.39-4.688 0-9.141-1.124-4.438-1.125-8.531-3.375v8.312q4.921 1.906 9.562 2.844 4.64.953 9.031.953 11.875 0 17.735-6.156 5.86-6.14 5.86-18.64z" id="DejaVuSans-61"/><path d="M54.89 33.016V0h-8.984v32.719q0 7.765-3.031 11.61-3.031 3.858-9.078 3.858-7.281 0-11.484-4.64-4.204-4.625-4.204-12.64V0H9.08v54.688h9.03v-8.5q3.235 4.937 7.594 7.374Q30.078 56 35.797 56q9.422 0 14.25-5.828 4.844-5.828 4.844-17.156z" id="DejaVuSans-6e"/><path d="M45.406 46.39v29.594h8.985V0h-8.985v8.203Q42.578 3.328 38.25.953q-4.313-2.375-10.375-2.375-9.906 0-16.14 7.906-6.22 7.922-6.22 20.813 0 12.89 6.22 20.797Q17.968 56 27.874 56q6.063 0 10.375-2.375 4.328-2.36 7.156-7.234zm-30.61-19.093q0-9.906 4.079-15.547 4.078-5.64 11.203-5.64 7.125 0 11.219 5.64 4.11 5.64 4.11 15.547 0 9.906-4.11 15.547-4.094 5.64-11.219 5.64-7.125 0-11.203-5.64-4.078-5.64-4.078-15.547z" id="DejaVuSans-64"/><path d="M4.203 54.688h8.985l11.234-42.672 11.172 42.672h10.593l11.235-42.672 11.187 42.672h8.985L63.28 0H52.688L40.922 44.828 29.109 0H18.5z" id="DejaVuSans-77"/><path d="M18.313 70.219V54.688h18.5v-6.985h-18.5V18.016q0-6.688 1.828-8.594 1.828-1.906 7.453-1.906h9.218V0h-9.218q-10.407 0-14.36 3.875-3.953 3.89-3.953 14.14v29.688H2.687v6.984h6.594V70.22z" id="DejaVuSans-74"/><path d="M54.89 33.016V0h-8.984v32.719q0 7.765-3.031 11.61-3.031 3.858-9.078 3.858-7.281 0-11.484-4.64-4.204-4.625-4.204-12.64V0H9.08v75.984h9.03V46.188q3.235 4.937 7.594 7.374Q30.078 56 35.797 56q9.422 0 14.25-5.828 4.844-5.828 4.844-17.156z" id="DejaVuSans-68"/></defs><g transform="matrix(0 -.1 -.1 0 14.798 148.199)"><use xlink:href="#DejaVuSans-42"/><use x="68.604" xlink:href="#DejaVuSans-61"/><use x="129.883" xlink:href="#DejaVuSans-6e"/><use x="193.262" xlink:href="#DejaVuSans-64"/><use x="256.738" xlink:href="#DejaVuSans-77"/><use x="338.525" xlink:href="#DejaVuSans-69"/><use x="366.309" xlink:href="#DejaVuSans-64"/><use x="429.785" xlink:href="#DejaVuSans-74"/><use x="468.994" xlink:href="#DejaVuSans-68"/></g></g></g><path clip-path="url(#pc47d77ee3d)" d="M99.49 222.38l2.76-.004 1.577-.124 7.492-.072 3.155-.11 2.76-.05.395-.13v-1.036l1.183-.13v-.13l1.972-.101v-2.004l1.183-.046V216.5l.394-.13v-2.593l5.127-.031v-.13l3.154-.114 1.578-.005.394-.13v-2.205l2.366 2.076 1.183-.13v-.13l1.578-.002v-1.878l1.183 1.407v-.594l.394-.13v-.13l1.183-.13v-.259l1.972-.294v-.13l1.577-.07v-.389l1.183-.017v-.26l10.648-.13v-.67l.788-.13v-.13l.789-.129v-2.204l.789-.13v-.389l.788-.13v-4.408l.789-.13v-.907l.394-.13v-1.555l.395-.08 5.126-.13V198l6.704-.093v-.7l1.972-.026v-.72l3.549-.142 3.55-.018v-.329l1.97-.145 3.944-.02v-.413l5.521-.13v-.223l1.972-.018v-.849l1.183-.13v-.388l.394-.093 6.31-.085v-.478l5.126-.142v-.263l1.578-.02v-.598l7.887-.251 29.576-.114v-.006l71.77-.182v-.566l9.07-.234.395-.032 24.055-.129v-.013l32.336-.128v-.003l7.493-.073h0" fill="none" stroke="#1f77b4" stroke-linecap="square" stroke-width="1.5" id="line2d_27"/><path clip-path="url(#pc47d77ee3d)" d="M99.49 222.38l4.731-.004v-.124l9.07-.072 1.183-.105 4.732-.028v-1.123l1.183-.13v-2.074l.395-.13v-.13l1.183-.13v-2.722l16.562-.16v-1.11l1.183-.13v-1.945l.395-.13v-.389l1.183-.13v-4.019l.394-.13v-.907l1.183-.13v-4.537l.395-.055 9.858-.031v-2.892l1.578-.13v-1.944l3.943-.098 1.577-.022v-4.951l6.31-.033v-5.163l5.915-.199v-5.03l5.915-.2v-6.3l7.887-.27v-4.517l5.521-.035v-2.147l.394-.097v-4.187l1.972-.129 6.31-.03v-4.77l10.647-.064.394-.13v-2.118l1.183-.13v-2.074l5.916-.218v-5.575l6.31-.033v-4.712l5.126-.033v-4.706l5.126-.033v-1.037l.395-.069v-3.601l6.31-.034v-4.542l6.703-.033v-2.145l.394-.099v-2.63l5.127-.033v-4.873l5.126-.033v-4.871l11.436-.076.395-.13v-4.521l2.366 2.148 1.577-.26v-.13l1.578-.13v-.258l1.183-.1v-.519l1.577-.13v-.621l4.732-.033.394-.13v-4.75l35.886-.055v-1.11l1.183-.13v-.39l.394-.129v-1.945l1.183-.13v-.648l5.521-.222V95.69l5.521-.033v-4.804l11.83-.034v-1.111l1.578-.13v-2.463l1.183-.13v-.648l65.067-.141v-1.11l1.577-.13v-2.462l1.578-.13v-.778l4.732-.205v-2.016l.394-.099v-2.634l8.676-.056.394-.13v-4.642l5.521-.092 1.578-.023v-4.322l5.915-.033v-4.541l7.492-.034v-4.03l1.578-.13v-.26l2.76-.127 2.76-.027V53.64l23.661-.033v-1.11l1.578-.13v-2.463l1.183-.13v-.648l5.915-.22v-4.414l8.281-.033v-1.037l.395-.073v-2.79l1.183-.13v-.39l17.745-.156v-1.11l1.183-.13v-1.425l.395-.13v-.907l1.183-.13v-.648l26.42-.136.395-.13v-.978l1.578-.13v-2.463l1.183-.13v-.778l11.041-.074v-1.108l1.578-.13v-2.463l1.183-.13v-.389l.394-.13v-.518l7.887-.067v-4.772l2.76-.086 81.63-.011h0" fill="none" stroke="#ff7f0e" stroke-linecap="square" stroke-width="1.5" id="line2d_28"/><g id="legend_1"><path d="M78.59 48.056h199.32q2 0 2-2V17.7q0-2-2-2H78.59q-2 0-2 2v28.356q0 2 2 2z" fill="#fff" opacity=".8" stroke="#ccc" id="patch_2"/><path d="M80.59 23.798h20" fill="none" stroke="#1f77b4" stroke-linecap="square" stroke-width="1.5" id="line2d_29"/><g id="text_16"><defs><path d="M30.61 48.39q-7.22 0-11.422-5.64-4.204-5.64-4.204-15.453 0-9.813 4.172-15.453 4.188-5.64 11.453-5.64 7.188 0 11.375 5.655 4.203 5.672 4.203 15.438 0 9.719-4.203 15.406-4.187 5.688-11.375 5.688zm0 7.61q11.718 0 18.406-7.625 6.703-7.61 6.703-21.078 0-13.422-6.703-21.078-6.688-7.64-18.407-7.64-11.765 0-18.437 7.64-6.656 7.656-6.656 21.078 0 13.469 6.656 21.078Q18.844 56 30.609 56z" id="DejaVuSans-6f"/><path d="M45.406 27.984q0 9.766-4.031 15.125-4.016 5.375-11.297 5.375-7.219 0-11.25-5.375-4.031-5.359-4.031-15.125 0-9.718 4.031-15.093t11.25-5.375q7.281 0 11.297 5.375 4.031 5.375 4.031 15.093zm8.985-21.203q0-13.953-6.203-20.765Q42-20.797 29.203-20.797q-4.734 0-8.937.703-4.203.703-8.157 2.172v8.735q3.954-2.141 7.813-3.157 3.86-1.031 7.86-1.031 8.843 0 13.234 4.61 4.39 4.609 4.39 13.937v4.453q-2.781-4.844-7.125-7.234Q33.938 0 27.875 0 17.828 0 11.672 7.656q-6.156 7.672-6.156 20.328 0 12.688 6.156 20.344Q17.828 56 27.875 56q6.063 0 10.406-2.39 4.344-2.391 7.125-7.22v8.297h8.985z" id="DejaVuSans-67"/><path d="M4.89 30.906h40.235v-7.031H4.891z" id="DejaVuSans-2013"/><path d="M11.719 12.406h10.297V4l-8-15.625H7.719l4 15.625z" id="DejaVuSans-2c"/><path d="M8.203 72.906h46.875v-4.203L28.61 0H18.312L43.22 64.594H8.203z" id="DejaVuSans-37"/></defs><g transform="matrix(.1 0 0 -.1 108.59 27.298)"><use xlink:href="#DejaVuSans-4d"/><use x="86.279" xlink:href="#DejaVuSans-69"/><use x="114.063" xlink:href="#DejaVuSans-74"/><use x="153.271" xlink:href="#DejaVuSans-6f"/><use x="214.453" xlink:href="#DejaVuSans-67"/><use x="277.93" xlink:href="#DejaVuSans-65"/><use x="339.453" xlink:href="#DejaVuSans-6e"/><use x="402.832" xlink:href="#DejaVuSans-20"/><use x="434.619" xlink:href="#DejaVuSans-2013"/><use x="484.619" xlink:href="#DejaVuSans-20"/><use x="516.406" xlink:href="#DejaVuSans-30"/><use x="580.029" xlink:href="#DejaVuSans-2e"/><use x="611.816" xlink:href="#DejaVuSans-33"/><use x="675.439" xlink:href="#DejaVuSans-34"/><use x="739.063" xlink:href="#DejaVuSans-20"/><use x="770.85" xlink:href="#DejaVuSans-4d"/><use x="857.129" xlink:href="#DejaVuSans-69"/><use x="884.912" xlink:href="#DejaVuSans-42"/><use x="953.516" xlink:href="#DejaVuSans-2c"/><use x="985.303" xlink:href="#DejaVuSans-20"/><use x="1017.09" xlink:href="#DejaVuSans-37"/><use x="1080.713" xlink:href="#DejaVuSans-34"/><use x="1144.336" xlink:href="#DejaVuSans-2e"/><use x="1176.123" xlink:href="#DejaVuSans-32"/><use x="1239.746" xlink:href="#DejaVuSans-73"/></g></g><path d="M80.59 38.477h20" fill="none" stroke="#ff7f0e" stroke-linecap="square" stroke-width="1.5" id="line2d_31"/><g id="text_17"><defs><path d="M53.516 70.516V60.89q-5.61 2.687-10.594 4-4.984 1.328-9.625 1.328-8.047 0-12.422-3.125t-4.375-8.89q0-4.845 2.906-7.313 2.907-2.453 11.016-3.97l5.953-1.218q11.031-2.11 16.281-7.406 5.25-5.297 5.25-14.172 0-10.61-7.11-16.078-7.093-5.469-20.812-5.469-5.172 0-11.015 1.172Q13.14.922 6.89 3.219v10.156q6-3.36 11.765-5.078 5.766-1.703 11.328-1.703 8.438 0 13.032 3.312 4.593 3.328 4.593 9.485 0 5.359-3.297 8.39-3.296 3.032-10.812 4.547L27.484 33.5q-11.03 2.188-15.968 6.875-4.922 4.688-4.922 13.047 0 9.672 6.812 15.234 6.813 5.563 18.766 5.563 5.14 0 10.453-.938 5.328-.922 10.89-2.765z" id="DejaVuSans-53"/><path d="M9.813 72.906h9.859v-29.89h35.844v29.89h9.859V0h-9.86v34.719H19.673V0h-9.86z" id="DejaVuSans-48"/><path d="M19.672 64.797v-27.39h12.406q6.89 0 10.64 3.562 3.766 3.562 3.766 10.156 0 6.547-3.765 10.11-3.75 3.562-10.64 3.562zm-9.86 8.11h22.266q12.266 0 18.531-5.548 6.282-5.546 6.282-16.234 0-10.797-6.282-16.313-6.265-5.515-18.53-5.515H19.671V0h-9.86z" id="DejaVuSans-50"/><path d="M18.11 8.203v-29H9.077v75.484h9.031v-8.296q2.844 4.875 7.157 7.234Q29.594 56 35.594 56q9.968 0 16.187-7.906 6.235-7.907 6.235-20.797T51.78 6.484q-6.218-7.906-16.187-7.906-6 0-10.328 2.375-4.313 2.375-7.157 7.25zm30.578 19.094q0 9.906-4.079 15.547-4.078 5.64-11.203 5.64-7.14 0-11.218-5.64-4.079-5.64-4.079-15.547 0-9.906 4.078-15.547 4.079-5.64 11.22-5.64 7.124 0 11.202 5.64t4.078 15.547z" id="DejaVuSans-70"/><path d="M9.422 75.984h8.984V0H9.422z" id="DejaVuSans-6c"/></defs><g transform="matrix(.1 0 0 -.1 108.59 41.977)"><use xlink:href="#DejaVuSans-53"/><use x="63.477" xlink:href="#DejaVuSans-53"/><use x="126.953" xlink:href="#DejaVuSans-48"/><use x="202.148" xlink:href="#DejaVuSans-20"/><use x="233.936" xlink:href="#DejaVuSans-50"/><use x="294.207" xlink:href="#DejaVuSans-69"/><use x="321.99" xlink:href="#DejaVuSans-70"/><use x="385.467" xlink:href="#DejaVuSans-65"/><use x="446.99" xlink:href="#DejaVuSans-6c"/><use x="474.773" xlink:href="#DejaVuSans-69"/><use x="502.557" xlink:href="#DejaVuSans-6e"/><use x="565.936" xlink:href="#DejaVuSans-69"/><use x="593.719" xlink:href="#DejaVuSans-6e"/><use x="657.098" xlink:href="#DejaVuSans-67"/><use x="720.574" xlink:href="#DejaVuSans-20"/><use x="752.361" xlink:href="#DejaVuSans-2013"/><use x="802.361" xlink:href="#DejaVuSans-20"/><use x="834.148" xlink:href="#DejaVuSans-32"/><use x="897.771" xlink:href="#DejaVuSans-2e"/><use x="929.559" xlink:href="#DejaVuSans-31"/><use x="993.182" xlink:href="#DejaVuSans-31"/><use x="1056.805" xlink:href="#DejaVuSans-20"/><use x="1088.592" xlink:href="#DejaVuSans-4d"/><use x="1174.871" xlink:href="#DejaVuSans-69"/><use x="1202.654" xlink:href="#DejaVuSans-42"/><use x="1271.258" xlink:href="#DejaVuSans-2c"/><use x="1303.045" xlink:href="#DejaVuSans-20"/><use x="1334.832" xlink:href="#DejaVuSans-31"/><use x="1398.455" xlink:href="#DejaVuSans-34"/><use x="1462.078" xlink:href="#DejaVuSans-31"/><use x="1525.701" xlink:href="#DejaVuSans-2e"/><use x="1557.488" xlink:href="#DejaVuSans-35"/><use x="1621.111" xlink:href="#DejaVuSans-73"/></g></g></g></g></g><defs><clipPath id="pc47d77ee3d"><path d="M71.589 10.7h613.8v221.76h-613.8z"/></clipPath></defs></svg>�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mitogen-0.3.9/docs/images/ansible/pcaps/debops-uk-india.svg�����������������������������������������0000664�0000000�0000000�00000102670�14656664731�0023631�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<svg height="360" viewBox="0 0 702 270" width="936" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><style>*{stroke-linecap:butt;stroke-linejoin:round}</style></defs><g id="figure_1"><path d="M0 270.016h702.452V0H0z" fill="#fff" id="patch_1"/><g id="axes_1"><g id="matplotlib.axis_1"><g id="xtick_1"><path clip-path="url(#p26b568cf67)" d="M105.852 232.46V10.7" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_1"/><g id="line2d_2"><defs><path d="M0 0v3.5" id="m7de3cda4b7" stroke="silver" stroke-width=".8"/></defs><use x="105.852" xlink:href="#m7de3cda4b7" y="232.46" fill="silver" stroke="silver" stroke-width=".8"/></g><g id="text_1"><defs><path d="M31.781 66.406q-7.61 0-11.453-7.5Q16.5 51.422 16.5 36.375q0-14.984 3.828-22.484 3.844-7.5 11.453-7.5 7.672 0 11.5 7.5 3.844 7.5 3.844 22.484 0 15.047-3.844 22.531-3.828 7.5-11.5 7.5zm0 7.813q12.266 0 18.735-9.703 6.468-9.688 6.468-28.141 0-18.406-6.468-28.11-6.47-9.687-18.735-9.687-12.25 0-18.718 9.688-6.47 9.703-6.47 28.109 0 18.453 6.47 28.14Q19.53 74.22 31.78 74.22z" id="DejaVuSans-30"/><path d="M10.688 12.406H21V0H10.687z" id="DejaVuSans-2e"/><path d="M44.281 53.078v-8.5q-3.797 1.953-7.906 2.922-4.094.984-8.5.984-6.688 0-10.031-2.047-3.344-2.046-3.344-6.156 0-3.125 2.39-4.906 2.391-1.781 9.626-3.39l3.078-.688q9.562-2.047 13.593-5.781 4.032-3.735 4.032-10.422 0-7.625-6.032-12.078-6.03-4.438-16.578-4.438-4.39 0-9.156.86Q10.688.296 5.422 2v9.281q4.984-2.594 9.812-3.89 4.829-1.282 9.579-1.282 6.343 0 9.75 2.172 3.421 2.172 3.421 6.125 0 3.656-2.468 5.61-2.453 1.953-10.813 3.765l-3.125.735q-8.344 1.75-12.062 5.39-3.704 3.64-3.704 9.985 0 7.718 5.47 11.906Q16.75 56 26.811 56q4.97 0 9.36-.734 4.406-.72 8.11-2.188z" id="DejaVuSans-73"/></defs><g transform="matrix(.1 0 0 -.1 95.295 247.058)"><use xlink:href="#DejaVuSans-30"/><use x="63.623" xlink:href="#DejaVuSans-2e"/><use x="95.41" xlink:href="#DejaVuSans-30"/><use x="159.033" xlink:href="#DejaVuSans-73"/></g></g></g><g id="xtick_2"><path clip-path="url(#p26b568cf67)" d="M210.72 232.46V10.7" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_3"/><use x="210.719" xlink:href="#m7de3cda4b7" y="232.46" fill="silver" stroke="silver" stroke-width=".8" id="line2d_4"/><g id="text_2"><defs><path d="M19.188 8.297h34.421V0H7.33v8.297q5.609 5.812 15.296 15.594 9.703 9.797 12.188 12.64 4.734 5.313 6.609 9 1.89 3.688 1.89 7.25 0 5.813-4.078 9.469-4.078 3.672-10.625 3.672-4.64 0-9.797-1.61-5.14-1.609-11-4.89v9.969Q13.767 71.78 18.938 73q5.188 1.219 9.485 1.219 11.328 0 18.062-5.672 6.735-5.656 6.735-15.125 0-4.5-1.688-8.531-1.672-4.016-6.125-9.485-1.218-1.422-7.765-8.187-6.532-6.766-18.453-18.922z" id="DejaVuSans-32"/></defs><g transform="matrix(.1 0 0 -.1 193.8 247.058)"><use xlink:href="#DejaVuSans-32"/><use x="63.623" xlink:href="#DejaVuSans-30"/><use x="127.246" xlink:href="#DejaVuSans-30"/><use x="190.869" xlink:href="#DejaVuSans-2e"/><use x="222.656" xlink:href="#DejaVuSans-30"/><use x="286.279" xlink:href="#DejaVuSans-73"/></g></g></g><g id="xtick_3"><path clip-path="url(#p26b568cf67)" d="M315.587 232.46V10.7" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_5"/><use x="315.587" xlink:href="#m7de3cda4b7" y="232.46" fill="silver" stroke="silver" stroke-width=".8" id="line2d_6"/><g id="text_3"><defs><path d="M37.797 64.313L12.89 25.39h24.906zm-2.594 8.593H47.61V25.391h10.407v-8.203H47.609V0h-9.812v17.188H4.89v9.515z" id="DejaVuSans-34"/></defs><g transform="matrix(.1 0 0 -.1 298.668 247.058)"><use xlink:href="#DejaVuSans-34"/><use x="63.623" xlink:href="#DejaVuSans-30"/><use x="127.246" xlink:href="#DejaVuSans-30"/><use x="190.869" xlink:href="#DejaVuSans-2e"/><use x="222.656" xlink:href="#DejaVuSans-30"/><use x="286.279" xlink:href="#DejaVuSans-73"/></g></g></g><g id="xtick_4"><path clip-path="url(#p26b568cf67)" d="M420.454 232.46V10.7" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_7"/><use x="420.454" xlink:href="#m7de3cda4b7" y="232.46" fill="silver" stroke="silver" stroke-width=".8" id="line2d_8"/><g id="text_4"><defs><path d="M33.016 40.375q-6.641 0-10.532-4.547-3.875-4.531-3.875-12.437 0-7.86 3.875-12.438 3.891-4.562 10.532-4.562 6.64 0 10.515 4.562 3.875 4.578 3.875 12.438 0 7.906-3.875 12.437-3.875 4.547-10.515 4.547zm19.578 30.922v-8.984q-3.719 1.75-7.5 2.671-3.782.938-7.5.938-9.766 0-14.922-6.594-5.14-6.594-5.875-19.922 2.875 4.25 7.219 6.516 4.359 2.266 9.578 2.266 10.984 0 17.36-6.672 6.374-6.657 6.374-18.125 0-11.235-6.64-18.032-6.641-6.78-17.672-6.78-12.657 0-19.344 9.687-6.688 9.703-6.688 28.109 0 17.281 8.204 27.563 8.203 10.28 22.015 10.28 3.719 0 7.5-.734t7.89-2.187z" id="DejaVuSans-36"/></defs><g transform="matrix(.1 0 0 -.1 403.535 247.058)"><use xlink:href="#DejaVuSans-36"/><use x="63.623" xlink:href="#DejaVuSans-30"/><use x="127.246" xlink:href="#DejaVuSans-30"/><use x="190.869" xlink:href="#DejaVuSans-2e"/><use x="222.656" xlink:href="#DejaVuSans-30"/><use x="286.279" xlink:href="#DejaVuSans-73"/></g></g></g><g id="xtick_5"><path clip-path="url(#p26b568cf67)" d="M525.322 232.46V10.7" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_9"/><use x="525.322" xlink:href="#m7de3cda4b7" y="232.46" fill="silver" stroke="silver" stroke-width=".8" id="line2d_10"/><g id="text_5"><defs><path d="M31.781 34.625q-7.031 0-11.062-3.766-4.016-3.765-4.016-10.343 0-6.594 4.016-10.36Q24.75 6.391 31.78 6.391q7.032 0 11.078 3.78 4.063 3.798 4.063 10.345 0 6.578-4.031 10.343-4.016 3.766-11.11 3.766zm-9.86 4.188q-6.343 1.562-9.89 5.906Q8.5 49.079 8.5 55.329q0 8.733 6.219 13.812 6.234 5.078 17.062 5.078 10.89 0 17.094-5.078 6.203-5.079 6.203-13.813 0-6.25-3.547-10.61-3.531-4.343-9.828-5.906 7.125-1.656 11.094-6.5 3.984-4.828 3.984-11.796 0-10.61-6.468-16.282-6.47-5.656-18.532-5.656-12.047 0-18.531 5.656-6.469 5.672-6.469 16.282 0 6.968 4 11.797 4.016 4.843 11.14 6.5zM18.314 54.39q0-5.657 3.53-8.828 3.548-3.172 9.938-3.172 6.36 0 9.938 3.172 3.593 3.171 3.593 8.828 0 5.672-3.593 8.843-3.578 3.172-9.938 3.172-6.39 0-9.937-3.172-3.532-3.172-3.532-8.843z" id="DejaVuSans-38"/></defs><g transform="matrix(.1 0 0 -.1 508.403 247.058)"><use xlink:href="#DejaVuSans-38"/><use x="63.623" xlink:href="#DejaVuSans-30"/><use x="127.246" xlink:href="#DejaVuSans-30"/><use x="190.869" xlink:href="#DejaVuSans-2e"/><use x="222.656" xlink:href="#DejaVuSans-30"/><use x="286.279" xlink:href="#DejaVuSans-73"/></g></g></g><g id="xtick_6"><path clip-path="url(#p26b568cf67)" d="M630.19 232.46V10.7" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_11"/><use x="630.189" xlink:href="#m7de3cda4b7" y="232.46" fill="silver" stroke="silver" stroke-width=".8" id="line2d_12"/><g id="text_6"><defs><path d="M12.406 8.297h16.11v55.625l-17.532-3.516v8.985l17.438 3.515h9.86V8.296H54.39V0H12.406z" id="DejaVuSans-31"/></defs><g transform="matrix(.1 0 0 -.1 610.09 247.058)"><use xlink:href="#DejaVuSans-31"/><use x="63.623" xlink:href="#DejaVuSans-30"/><use x="127.246" xlink:href="#DejaVuSans-30"/><use x="190.869" xlink:href="#DejaVuSans-30"/><use x="254.492" xlink:href="#DejaVuSans-2e"/><use x="286.279" xlink:href="#DejaVuSans-30"/><use x="349.902" xlink:href="#DejaVuSans-73"/></g></g></g><g id="text_7"><defs><path d="M-.297 72.906h61.672v-8.312H35.5V0h-9.906v64.594H-.296z" id="DejaVuSans-54"/><path d="M9.422 54.688h8.984V0H9.422zm0 21.296h8.984v-11.39H9.422z" id="DejaVuSans-69"/><path d="M52 44.188q3.375 6.062 8.063 8.937Q64.75 56 71.093 56q8.548 0 13.188-5.984 4.64-5.97 4.64-17V0h-9.03v32.719q0 7.86-2.797 11.656-2.781 3.813-8.485 3.813-6.984 0-11.046-4.641-4.047-4.625-4.047-12.64V0h-9.032v32.719q0 7.906-2.78 11.687-2.782 3.782-8.595 3.782-6.89 0-10.953-4.657-4.047-4.656-4.047-12.625V0H9.08v54.688h9.03v-8.5q3.078 5.03 7.375 7.421Q29.781 56 35.687 56q5.97 0 10.141-3.031Q50 49.953 52 44.187z" id="DejaVuSans-6d"/><path d="M56.203 29.594v-4.39H14.891q.593-9.282 5.593-14.142 5-4.859 13.938-4.859 5.172 0 10.031 1.266 4.86 1.265 9.656 3.812v-8.5Q49.266.734 44.187-.344 39.11-1.422 33.892-1.422q-13.094 0-20.735 7.61-7.64 7.625-7.64 20.625 0 13.421 7.25 21.296Q20.016 56 32.328 56q11.031 0 17.453-7.11 6.422-7.093 6.422-19.296zm-8.984 2.64q-.094 7.36-4.125 11.75-4.032 4.407-10.672 4.407-7.516 0-12.031-4.25-4.516-4.25-5.203-11.97z" id="DejaVuSans-65"/></defs><g transform="matrix(.1 0 0 -.1 372.464 260.737)"><use xlink:href="#DejaVuSans-54"/><use x="61.037" xlink:href="#DejaVuSans-69"/><use x="88.82" xlink:href="#DejaVuSans-6d"/><use x="186.232" xlink:href="#DejaVuSans-65"/></g></g></g><g id="matplotlib.axis_2"><g id="ytick_1"><path clip-path="url(#p26b568cf67)" d="M77.952 222.38h613.8" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_13"/><g id="line2d_14"><defs><path d="M0 0h-3.5" id="mf7f0efdb6e" stroke="silver" stroke-width=".8"/></defs><use x="77.952" xlink:href="#mf7f0efdb6e" y="222.38" fill="silver" stroke="silver" stroke-width=".8"/></g><g id="text_8"><defs><path d="M9.813 72.906h14.703l18.593-49.61 18.703 49.61h14.704V0H66.89v64.016l-18.797-50h-9.907l-18.796 50V0H9.813z" id="DejaVuSans-4d"/><path d="M19.672 34.813V8.108H35.5q7.953 0 11.781 3.297 3.844 3.297 3.844 10.078 0 6.844-3.844 10.078-3.828 3.25-11.781 3.25zm0 29.984V42.828h14.61q7.218 0 10.75 2.703 3.546 2.719 3.546 8.282 0 5.515-3.547 8.25-3.531 2.734-10.75 2.734zm-9.86 8.11h25.204q11.28 0 17.375-4.688Q58.5 63.53 58.5 54.89q0-6.703-3.125-10.657-3.125-3.953-9.188-4.922 7.282-1.562 11.313-6.53 4.031-4.954 4.031-12.376 0-9.765-6.64-15.093Q48.25 0 35.984 0H9.812z" id="DejaVuSans-42"/></defs><g transform="matrix(.1 0 0 -.1 27.24 226.18)"><use xlink:href="#DejaVuSans-30"/><use x="63.623" xlink:href="#DejaVuSans-2e"/><use x="95.41" xlink:href="#DejaVuSans-30"/><use x="159.033" xlink:href="#DejaVuSans-30"/><use x="222.656" xlink:href="#DejaVuSans-20"/><use x="254.443" xlink:href="#DejaVuSans-4d"/><use x="340.723" xlink:href="#DejaVuSans-69"/><use x="368.506" xlink:href="#DejaVuSans-42"/></g></g></g><g id="ytick_2"><path clip-path="url(#p26b568cf67)" d="M77.952 191.506h613.8" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_15"/><use x="77.952" xlink:href="#mf7f0efdb6e" y="191.506" fill="silver" stroke="silver" stroke-width=".8" id="line2d_16"/><g id="text_9"><defs><path d="M8.203 72.906h46.875v-4.203L28.61 0H18.312L43.22 64.594H8.203z" id="DejaVuSans-37"/></defs><g transform="matrix(.1 0 0 -.1 27.24 195.305)"><use xlink:href="#DejaVuSans-34"/><use x="63.623" xlink:href="#DejaVuSans-2e"/><use x="95.41" xlink:href="#DejaVuSans-37"/><use x="159.033" xlink:href="#DejaVuSans-37"/><use x="222.656" xlink:href="#DejaVuSans-20"/><use x="254.443" xlink:href="#DejaVuSans-4d"/><use x="340.723" xlink:href="#DejaVuSans-69"/><use x="368.506" xlink:href="#DejaVuSans-42"/></g></g></g><g id="ytick_3"><path clip-path="url(#p26b568cf67)" d="M77.952 160.632h613.8" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_17"/><use x="77.952" xlink:href="#mf7f0efdb6e" y="160.632" fill="silver" stroke="silver" stroke-width=".8" id="line2d_18"/><g id="text_10"><defs><path d="M10.984 1.516V10.5q3.72-1.766 7.516-2.688 3.813-.921 7.484-.921 9.766 0 14.907 6.562 5.156 6.563 5.89 19.953-2.828-4.203-7.187-6.453-4.344-2.25-9.61-2.25-10.937 0-17.312 6.61-6.375 6.625-6.375 18.109 0 11.219 6.64 18 6.641 6.797 17.672 6.797 12.657 0 19.313-9.703 6.672-9.688 6.672-28.141 0-17.234-8.188-27.516Q40.234-1.42 26.422-1.42q-3.719 0-7.531.734-3.797.734-7.907 2.203zM30.61 32.422q6.641 0 10.516 4.531 3.89 4.547 3.89 12.469 0 7.86-3.89 12.422-3.875 4.562-10.516 4.562-6.64 0-10.515-4.562-3.875-4.563-3.875-12.422 0-7.922 3.875-12.469 3.875-4.531 10.515-4.531z" id="DejaVuSans-39"/><path d="M10.797 72.906h38.719v-8.312H19.828v-17.86q2.14.735 4.281 1.094 2.157.36 4.313.36 12.203 0 19.328-6.688 7.14-6.688 7.14-18.11 0-11.765-7.328-18.296-7.328-6.516-20.656-6.516-4.593 0-9.36.781-4.75.782-9.827 2.344v9.922q4.39-2.39 9.078-3.563 4.687-1.171 9.906-1.171 8.453 0 13.375 4.437 4.938 4.438 4.938 12.063 0 7.609-4.938 12.047-4.922 4.453-13.375 4.453-3.953 0-7.89-.875-3.922-.875-8.016-2.735z" id="DejaVuSans-35"/></defs><g transform="matrix(.1 0 0 -.1 27.24 164.431)"><use xlink:href="#DejaVuSans-39"/><use x="63.623" xlink:href="#DejaVuSans-2e"/><use x="95.41" xlink:href="#DejaVuSans-35"/><use x="159.033" xlink:href="#DejaVuSans-34"/><use x="222.656" xlink:href="#DejaVuSans-20"/><use x="254.443" xlink:href="#DejaVuSans-4d"/><use x="340.723" xlink:href="#DejaVuSans-69"/><use x="368.506" xlink:href="#DejaVuSans-42"/></g></g></g><g id="ytick_4"><path clip-path="url(#p26b568cf67)" d="M77.952 129.758h613.8" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_19"/><use x="77.952" xlink:href="#mf7f0efdb6e" y="129.758" fill="silver" stroke="silver" stroke-width=".8" id="line2d_20"/><g id="text_11"><defs><path d="M40.578 39.313Q47.656 37.797 51.625 33q3.984-4.781 3.984-11.813 0-10.78-7.422-16.703-7.421-5.906-21.093-5.906-4.578 0-9.438.906-4.86.907-10.031 2.72v9.515q4.094-2.39 8.969-3.61 4.89-1.218 10.218-1.218 9.266 0 14.125 3.656 4.86 3.656 4.86 10.64 0 6.454-4.516 10.079-4.515 3.64-12.562 3.64h-8.5v8.11h8.89q7.266 0 11.125 2.906 3.86 2.906 3.86 8.375 0 5.61-3.985 8.61-3.968 3.015-11.39 3.015-4.063 0-8.703-.89-4.641-.876-10.203-2.72v8.782q5.624 1.562 10.53 2.344 4.907.78 9.25.78 11.235 0 17.766-5.109 6.547-5.093 6.547-13.78 0-6.063-3.468-10.235-3.47-4.172-9.86-5.782z" id="DejaVuSans-33"/></defs><g transform="matrix(.1 0 0 -.1 20.878 133.558)"><use xlink:href="#DejaVuSans-31"/><use x="63.623" xlink:href="#DejaVuSans-34"/><use x="127.246" xlink:href="#DejaVuSans-2e"/><use x="159.033" xlink:href="#DejaVuSans-33"/><use x="222.656" xlink:href="#DejaVuSans-31"/><use x="286.279" xlink:href="#DejaVuSans-20"/><use x="318.066" xlink:href="#DejaVuSans-4d"/><use x="404.346" xlink:href="#DejaVuSans-69"/><use x="432.129" xlink:href="#DejaVuSans-42"/></g></g></g><g id="ytick_5"><path clip-path="url(#p26b568cf67)" d="M77.952 98.885h613.8" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_21"/><use x="77.952" xlink:href="#mf7f0efdb6e" y="98.885" fill="silver" stroke="silver" stroke-width=".8" id="line2d_22"/><g transform="matrix(.1 0 0 -.1 20.878 102.684)" id="text_12"><use xlink:href="#DejaVuSans-31"/><use x="63.623" xlink:href="#DejaVuSans-39"/><use x="127.246" xlink:href="#DejaVuSans-2e"/><use x="159.033" xlink:href="#DejaVuSans-30"/><use x="222.656" xlink:href="#DejaVuSans-37"/><use x="286.279" xlink:href="#DejaVuSans-20"/><use x="318.066" xlink:href="#DejaVuSans-4d"/><use x="404.346" xlink:href="#DejaVuSans-69"/><use x="432.129" xlink:href="#DejaVuSans-42"/></g></g><g id="ytick_6"><path clip-path="url(#p26b568cf67)" d="M77.952 68.01h613.8" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_23"/><use x="77.952" xlink:href="#mf7f0efdb6e" y="68.011" fill="silver" stroke="silver" stroke-width=".8" id="line2d_24"/><g transform="matrix(.1 0 0 -.1 20.878 71.81)" id="text_13"><use xlink:href="#DejaVuSans-32"/><use x="63.623" xlink:href="#DejaVuSans-33"/><use x="127.246" xlink:href="#DejaVuSans-2e"/><use x="159.033" xlink:href="#DejaVuSans-38"/><use x="222.656" xlink:href="#DejaVuSans-34"/><use x="286.279" xlink:href="#DejaVuSans-20"/><use x="318.066" xlink:href="#DejaVuSans-4d"/><use x="404.346" xlink:href="#DejaVuSans-69"/><use x="432.129" xlink:href="#DejaVuSans-42"/></g></g><g id="ytick_7"><path clip-path="url(#p26b568cf67)" d="M77.952 37.137h613.8" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_25"/><use x="77.952" xlink:href="#mf7f0efdb6e" y="37.137" fill="silver" stroke="silver" stroke-width=".8" id="line2d_26"/><g transform="matrix(.1 0 0 -.1 20.878 40.936)" id="text_14"><use xlink:href="#DejaVuSans-32"/><use x="63.623" xlink:href="#DejaVuSans-38"/><use x="127.246" xlink:href="#DejaVuSans-2e"/><use x="159.033" xlink:href="#DejaVuSans-36"/><use x="222.656" xlink:href="#DejaVuSans-31"/><use x="286.279" xlink:href="#DejaVuSans-20"/><use x="318.066" xlink:href="#DejaVuSans-4d"/><use x="404.346" xlink:href="#DejaVuSans-69"/><use x="432.129" xlink:href="#DejaVuSans-42"/></g></g><g id="text_15"><defs><path d="M34.281 27.484q-10.89 0-15.093-2.484-4.204-2.484-4.204-8.5 0-4.781 3.157-7.594 3.156-2.797 8.562-2.797 7.485 0 12 5.297 4.516 5.297 4.516 14.078v2zm17.922 3.72V0H43.22v8.297Q40.14 3.328 35.547.953q-4.594-2.375-11.234-2.375-8.391 0-13.36 4.719Q6 8.016 6 15.922q0 9.219 6.172 13.906 6.187 4.688 18.437 4.688h12.61v.89q0 6.203-4.078 9.594-4.078 3.39-11.453 3.39-4.688 0-9.141-1.124-4.438-1.125-8.531-3.375v8.312q4.921 1.906 9.562 2.844 4.64.953 9.031.953 11.875 0 17.735-6.156 5.86-6.14 5.86-18.64z" id="DejaVuSans-61"/><path d="M54.89 33.016V0h-8.984v32.719q0 7.765-3.031 11.61-3.031 3.858-9.078 3.858-7.281 0-11.484-4.64-4.204-4.625-4.204-12.64V0H9.08v54.688h9.03v-8.5q3.235 4.937 7.594 7.374Q30.078 56 35.797 56q9.422 0 14.25-5.828 4.844-5.828 4.844-17.156z" id="DejaVuSans-6e"/><path d="M45.406 46.39v29.594h8.985V0h-8.985v8.203Q42.578 3.328 38.25.953q-4.313-2.375-10.375-2.375-9.906 0-16.14 7.906-6.22 7.922-6.22 20.813 0 12.89 6.22 20.797Q17.968 56 27.874 56q6.063 0 10.375-2.375 4.328-2.36 7.156-7.234zm-30.61-19.093q0-9.906 4.079-15.547 4.078-5.64 11.203-5.64 7.125 0 11.219 5.64 4.11 5.64 4.11 15.547 0 9.906-4.11 15.547-4.094 5.64-11.219 5.64-7.125 0-11.203-5.64-4.078-5.64-4.078-15.547z" id="DejaVuSans-64"/><path d="M4.203 54.688h8.985l11.234-42.672 11.172 42.672h10.593l11.235-42.672 11.187 42.672h8.985L63.28 0H52.688L40.922 44.828 29.109 0H18.5z" id="DejaVuSans-77"/><path d="M18.313 70.219V54.688h18.5v-6.985h-18.5V18.016q0-6.688 1.828-8.594 1.828-1.906 7.453-1.906h9.218V0h-9.218q-10.407 0-14.36 3.875-3.953 3.89-3.953 14.14v29.688H2.687v6.984h6.594V70.22z" id="DejaVuSans-74"/><path d="M54.89 33.016V0h-8.984v32.719q0 7.765-3.031 11.61-3.031 3.858-9.078 3.858-7.281 0-11.484-4.64-4.204-4.625-4.204-12.64V0H9.08v75.984h9.03V46.188q3.235 4.937 7.594 7.374Q30.078 56 35.797 56q9.422 0 14.25-5.828 4.844-5.828 4.844-17.156z" id="DejaVuSans-68"/></defs><g transform="matrix(0 -.1 -.1 0 14.798 148.199)"><use xlink:href="#DejaVuSans-42"/><use x="68.604" xlink:href="#DejaVuSans-61"/><use x="129.883" xlink:href="#DejaVuSans-6e"/><use x="193.262" xlink:href="#DejaVuSans-64"/><use x="256.738" xlink:href="#DejaVuSans-77"/><use x="338.525" xlink:href="#DejaVuSans-69"/><use x="366.309" xlink:href="#DejaVuSans-64"/><use x="429.785" xlink:href="#DejaVuSans-74"/><use x="468.994" xlink:href="#DejaVuSans-68"/></g></g></g><path clip-path="url(#p26b568cf67)" d="M105.852 222.38l3.04-.103.577-.124v-.035l.21-.108.053-.22.262-.113v-.044l.052.175.158-.017.262-.165.367-.108v-.046l.21-.11v-.167l.21-.114.052-.114.052-.015 1.573-.107.053-.076 5.977-.245 1.154-.111 1.31-.16v-.015l1.206-.144v-.024l1.311-.143v-.01l1.154-.144v-.046l1.468-.13v-.007l1.835-.11v-.017l1.52-.117v-.025l4.615-.124v-.063l1.73-.166v-.015l1.416-.144v-.019l1.678-.155v-.012l1.468-.119v-.037l4.51-.266v-.01l1.887-.167v-.013l2.254-.122v-.007l1.259-.111v-.046l1.52-.129v-.01l1.416-.156v-.023l1.73-.133v-.063l1.259-.133v-.032l1.468-.128v-.014l1.678-.155v-.016l1.94-.164v-.045l1.992-.178v-.007l1.416-.147v-.006l.996-.114v-.006l1.573-.115 1.416-.15v-.016l2.622-.181v-.025l1.363-.142v-.01l2.202-.14v-.017l3.199-.117v-.02l1.625-.156v-.025l1.101-.111v-.006l1.101-.111v-.007l1.102-.11v-.006l1.048-.111 1.626-.156v-.02l1.73-.165v-.01l1.835-.182v-.024l2.465-.183v-.002l.996-.112v-.015l1.625-.146v-.024l1.416-.149v-.006l1.153-.114v-.015l1.573-.155v-.025l.944-.112v-.054l.892-.128v-.004l1.258-.115v-.016l1.94-.16v-.014l1.259-.111v-.01l1.206-.142v-.045l1.468-.157v-.004l1.468-.12 1.625-.153v-.006l2.15-.187v-.063l1.101-.126v-.007l1.049-.14v-.007l.839-.11v-.005l.839-.11 1.782-.167v-.016l.892-.109v-.045l1.625-.133v-.007l1.154-.144v-.007l.891-.111v-.006l.892-.112v-.006l2.36-.118v-.015l1.782-.14v-.015l1.258-.116 3.356-.237v-.032l5.348-.287v-.061l1.573-.138 2.465-.188v-.006l.839-.11 1.468-.062h0" fill="none" stroke="#1f77b4" stroke-linecap="square" stroke-width="1.5" id="line2d_27"/><path clip-path="url(#p26b568cf67)" d="M105.852 222.38l2.726-.11v-.159l.21-.114v-.236l.21-.123.052-.544 1.206-.114v-.48h1.888l.21-.112v-.45l1.572-.168v-.07l.158-.114.052-.114.734-.116v-.32l.787-.12v-.327l.786-.104v-.329l.787-.12v-.326l.734-.104v-.336l.786-.104v-.336l.787-.104v-.334l.734-.114v-.327l.786-.104v-.333l.734-.11v-.333l.787-.104v-.329l.734-.12v-.325l.787-.114v-.327l.786-.104v-.336l.734-.104v-.335l.367.216.734-.136.053-.08.734-.104v-.212l2.464-.21.053-.157.157-.114v-.061l.681-.115v-.246l1.993-.22v-.246l.839-.139v-.316l2.045-.19v-.246l.839-.153v-.281l2.045-.22v-.228l.786-.153v-.29l2.045-.193v-.272l.839-.144v-.304l.787-.15v-.3l.734-.104v-.337l.734-.104v-.33l.681-.104v-.333l.734-.117v-.321l.734-.104v-.337l1.206-.107v-.365l.21-.114.105-.403.105-.123v-.158l1.153-.104v-.18l.21-.115v-.035l1.52-.15v-.29l.682-.118v-.32l1.154-.132v-.298l.786-.115v-.458l1.416-.17v-.052l.21-.11.052-.28 1.73-.11v-.114l.21-.114v-.097l.63-.118v-.329l1.153-.106v-.317l.787-.104v-.324l1.573-.12v-.32l.734-.108v-.334l1.153-.106v-.336l.84-.104v-.317l.733-.114v-.303l.84-.128v-.296l.786-.104v-.336l1.573-.109v-.324l.681-.118v-.33l1.993-.11v-.33l1.992-.11v-.325l1.154-.13v-.305l.839-.104v-.33l2.517-.014v-.313l.839-.138v-.339l1.363-.166v-.29l1.992-.22v-.113l.21-.114v-.035l.63-.125v-.245l.89-.142v-.313l.84-.153v-.296l.839-.153v-.29l.838-.141v-.308l.84-.146v-.307l.838-.142v-.295l.84-.153v-.316l.838-.124v-.319l.787-.104v-.33l.734-.119v-.32l.734-.12v-.325l.734-.115v-.325l.944-.115v-.327l.786-.104v-.364l2.045-.219v-.189l.21-.123v-.026l.63-.127v-.32l1.992-.11v-.331l.734-.104v-.337l1.206-.106v-.334l.839-.104v-.337l1.573-.108v-.33l.681-.104v-.338l1.626-.106v-.171l.21-.114.052-.202.996-.105v-.203l.21-.114v-.017l1.468-.12v-.316l.734-.118v-.315l.682-.119v-.322l1.206-.11v-.324l1.573-.151v-.296l.734-.104v-.333l1.206-.128v-.321l.786-.13v-.317l1.573-.12v-.32l.734-.113v-.325l1.364-.127v-.344l1.468-.192v-.32l1.835-.182v-.313l.734-.104v-.334l1.416-.118v-.327l1.573-.104v-.33l.681-.121v-.325l1.206-.106v-.322l3.304-.114v-.315l.786-.13v-.299l1.154-.114v-.22l3.46-.3v-.107l.84-.157v-.394l.733-.104v-.33l.682-.104v-.337l.734-.104v-.33l.734-.108v-.33l4.562-.154v-.305l1.206-.106v-.317l1.101-.104v-.22l.944-.156v-.384l.786-.103v-.318l.787-.104v-.317l.891-.104v-.317l.734-.104.053-.318 1.573-.109v-.324l.734-.118v-.329l1.153-.106v-.334l1.573-.12v-.321l.734-.104v-.334l1.206-.118v-.328l1.626-.108v-.33l.734-.104v-.334l1.206-.118v-.48l2.045-.001.157-.112v-.119l.21-.114v-.088l1.52-.14v-.299l.682-.119v-.328l1.154-.106v-.316l1.677-.12v-.32l.682-.104v-.334l1.258-.119v-.327l.735-.104v-.336l.786-.104v-.377l1.049-.166v-.203l.21-.114v-.219l1.73-.11v-.171l.21-.114.052-.044.63-.114v-.328l1.1-.106v-.336l1.573-.109v-.325l.682-.122v-.325l1.363-.106v-.44l1.311-.18v-.08l.21-.114v-.114l1.52-.129v-.307l.734-.122v-.325l1.206-.106v-.357l.21-.122v-.01l.892-.103v-.149l.157-.114.052-.07 1.52-.13v-.312l.682-.104v-.337l1.154-.106v-.318l.787-.104v-.333l1.625-.12v-.309l1.31-.106v-.366l1.102-.169v-.203l.21-.114v-.052l.734-.127v-.3l1.573-.11v-.328l.681-.105v-.334l1.206-.118v-.309l1.626-.109v-.324l.839-.118v-.326l1.887-.122v-.317l.734-.117v-.325l1.154-.119v-.327l.891-.104v-.414l1.101-.156v-.215l.84-.14v-.397l.733-.104v-.313l.735-.104v-.313l.681-.104.053-.313.839-.104v-.41l1.625-.119v-.317l.734-.117v-.32l1.888-.154v-.295l.734-.104v-.338l1.206-.106v-.33l1.625-.108v-.329l.734-.109v-.325l1.154-.14v-.3l.786-.116v-.45l1.311-.16v-.07l.21-.11v-.106l1.52-.14v-.296l.84-.138v-.308l1.52-.118v-.128l.21-.114v-.079l1.52-.15v-.29l.682-.118v-.325l2.045-.132v-.313l.734-.103v-.334l1.992-.132v-.313l.734-.104v-.337l1.154-.106v-.312l1.573-.14v-.298l.682-.123v-.324l1.258-.106v-.333l.787-.116v-.32l.839-.129v-.3l1.677-.108v-.324l.682-.119v-.328l1.888-.11v-.326l.734-.113v-.333l1.31-.106v-.333l1.574-.12v-.322l.681-.104v-.337l1.573-.107v-.127l.21-.114v-.062l.734-.117v-.383l1.154-.151v-.22l.21-.124v-.192l1.048-.105v-.172l.157-.114.053-.044.629-.128v-.312l.734-.12v-.327l.734-.104v-.336l.734-.108v-.332l1.626-.109v-.33l.734-.104v-.333l1.206-.119v-.308l1.573-.11v-.33l.734-.103v-.334l1.258-.127v-.312l.787-.123v-.316l.734-.129v-.316l.734-.115v-.327l.734-.104v-.336l.734-.104v-.336l.734-.108v-.332l.734-.104v-.334l1.835-.12v-.321l.734-.104v-.333l2.15-.133v-.313l.682-.103v-.338l2.464-.11v-.163l.21-.114v-.053l.63-.114.052-.304 2.411-.032.21-.112v-.203l.84-.156v-.404l2.464-.11v-.198l.21-.11v-.018l.628-.117v-.329l2.045-.11v-.331l.734-.104v-.334l2.045-.132v-.308l.734-.117v-.329l1.993-.11v-.33l.734-.105v-.337l1.992-.11v-.325l.735-.119v-.329l2.097-.11v-.33l.682-.105v-.337l.576.117v-.009l2.36-.205v-.238l.839-.152v-.305l2.097-.227v-.247l.84-.139v-.32l2.149-.168v-.282l.786-.152v-.282l2.15-.158v-.29l.787-.121v-.313l2.15-.193v-.26l.786-.14v-.321l2.15-.179v-.268l.734-.114v-.324l1.992-.133v-.313l.734-.103v-.338l1.993-.11.052-.33.682-.105v-.337l2.045-.11v-.325l.734-.119v-.329l2.097-.11v-.33l.734-.105v-.337l1.993-.11v-.331l.734-.104v-.33l3.093-.017v-.348l.787-.147v-.33l2.15-.194v-.295l.734-.104v-.334l2.045-.131v-.313l.681-.104v-.333l2.517-.133v-.11l.21-.123v-.079l.63-.113v-.238l1.31-.165v-.366l.786-.114v-.325l1.626-.12v-.322l.734-.107v-.334l1.258-.106v-.368l1.154-.175v-.193l.21-.114v-.07l1.52-.152v-.29l.682-.118v-.32l1.153-.14v-.292l1.573-.109v-.324l.735-.119v-.328l1.153-.106v-.333l1.573-.12v-.322l.734-.104v-.337l1.888-.106v-.333l.786-.115v-.32l1.94-.154v-.29l.682-.118v-.321l1.94-.154v-.282l1.154-.106v-.33l1.625-.141v-.298l.682-.119v-.328l1.153-.107v-.334l.84-.104v-.392l1.153-.169v-.215l.943-.156v-.411l1.521-.109v-.324l.734-.119v-.328l1.206-.107v-.449l1.311-.164v-.124l.157-.114.053-.228.891-.114v-.136l.21-.123V81l1.048-.113v-.145l.21-.114v-.088l.84-.128v-.3l1.572-.109v-.325l.734-.118v-.324l1.94-.132v-.308l.734-.118v-.328l1.469-.106v-.334l1.52-.12v-.313l.734-.121v-.326l1.206-.117v-.397l1.154-.173v-.234l.891-.143v-.37l1.363-.105v-.145l.158-.114.052-.15.682-.117v-.321l.786-.12V74.2l.734-.104v-.33l1.573-.132v-.312l.734-.113v-.326l1.206-.118v-.473l2.045-.009v-.203l.21-.114v-.114l1.52-.141v-.298l.735-.119v-.322l1.206-.13v-.296l.839-.104v-.352l.839-.115v-.32l1.573-.11v-.324l.681-.118v-.329l1.206-.106v-.333l1.52-.12v-.317l.735-.118v-.329l1.258-.106v-.365l1.101-.17v-.202l.21-.123v-.061l.787-.104v-.312l.838-.118v-.298l.735-.104v-.334l.996-.115v-.324l1.52-.12v-.322l.734-.104v-.333l2.15-.133v-.312l.734-.104v-.338l1.94-.11v-.33l.682-.105v-.337l1.258-.106v-.357l.21-.114.053-.017.943-.104v-.163l.21-.114v-.21l1.678-.11V60.6l.21-.114v-.044l.681-.113v-.325l1.94-.131v-.312l.682-.105v-.337l1.94-.11v-.326l.682-.117v-.328l1.887-.111v-.33l.734-.104v-.337l1.888-.11v-.331l.734-.104v-.337l1.94-.11v-.33l.682-.105v-.336l1.94-.111v-.33l.734-.104v-.337l1.888-.11v-.325l.681-.119v-.325l1.94-.122v-.322l.682-.104v-.333l1.992-.132v-.312l.682-.104v-.337l1.363-.106v-.336l1.573-.109v-.33l.734-.104v-.337l1.94-.111v-.33l.734-.108v-.334l1.259-.106v-.45l1.468-.187v-.136l.21-.123v-.009l1.468-.149v-.294l.682-.105v-.333l2.254-.132v-.313l.734-.104v-.33l1.888-.153v-.295l.734-.104V46.2l.524.338v-.01l.577-.127v-.119l2.045-.192v-.3l.839-.13v-.326l1.992-.214v-.238l.734-.118v-.328l1.888-.11v-.331l.734-.108v-.333l1.94-.111v-.326l.734-.117v-.329l1.888-.11v-.33l.682-.104v-.338l1.94-.11v-.33l.734-.105v-.337l1.206-.106v-.336l.734-.104v-.33l.786-.118v-.328l.734-.107v-.325l.734-.13v-.318l.787-.103v-.318l.734-.104v-.312l.786-.119v-.34l.21-.113v-.026l.944-.104v-.128l.21-.114v-.061l1.52-.14v-.3l.734-.117v-.328l1.993-.111v-.33l.734-.104v-.338l1.153-.106v-.316l1.626-.12v-.316l.682-.117v-.325l1.206-.119v-.327l1.573-.109v-.33l.734-.104v-.335l1.258-.118v-.299l.839-.117v-.295l.839-.113v-.366l1.468-.185v-.127l.21-.114v-.044l.734-.129v-.286l.786-.104v-.298l4.667-.197v-.272l.786-.115v-.435l1.102-.15v-.258l.891-.14v-.34l.944-.113v-.309l1.573-.108v-.33l.734-.104v-.338l1.992-.11v-.33l1.206-.106v-.318l.84-.103v-.336l.733-.104v-.334l1.573-.12v-.321l.682-.104v-.33l1.31-.131v-.47h1.784l.734-.105v-.118l.21-.123v-.088l1.468-.15v-.29l.734-.122v-.324l5.662-.117v-.022l.21-.123v-.123l1.626-.199v-.322l.734-.103v-.338l11.588-.003h0" fill="none" stroke="#ff7f0e" stroke-linecap="square" stroke-width="1.5" id="line2d_28"/><g id="legend_1"><path d="M84.952 48.056h212.045q2 0 2-2V17.7q0-2-2-2H84.952q-2 0-2 2v28.356q0 2 2 2z" fill="#fff" opacity=".8" stroke="#ccc" id="patch_2"/><path d="M86.952 23.798h20" fill="none" stroke="#1f77b4" stroke-linecap="square" stroke-width="1.5" id="line2d_29"/><g id="text_16"><defs><path d="M30.61 48.39q-7.22 0-11.422-5.64-4.204-5.64-4.204-15.453 0-9.813 4.172-15.453 4.188-5.64 11.453-5.64 7.188 0 11.375 5.655 4.203 5.672 4.203 15.438 0 9.719-4.203 15.406-4.187 5.688-11.375 5.688zm0 7.61q11.718 0 18.406-7.625 6.703-7.61 6.703-21.078 0-13.422-6.703-21.078-6.688-7.64-18.407-7.64-11.765 0-18.437 7.64-6.656 7.656-6.656 21.078 0 13.469 6.656 21.078Q18.844 56 30.609 56z" id="DejaVuSans-6f"/><path d="M45.406 27.984q0 9.766-4.031 15.125-4.016 5.375-11.297 5.375-7.219 0-11.25-5.375-4.031-5.359-4.031-15.125 0-9.718 4.031-15.093t11.25-5.375q7.281 0 11.297 5.375 4.031 5.375 4.031 15.093zm8.985-21.203q0-13.953-6.203-20.765Q42-20.797 29.203-20.797q-4.734 0-8.937.703-4.203.703-8.157 2.172v8.735q3.954-2.141 7.813-3.157 3.86-1.031 7.86-1.031 8.843 0 13.234 4.61 4.39 4.609 4.39 13.937v4.453q-2.781-4.844-7.125-7.234Q33.938 0 27.875 0 17.828 0 11.672 7.656q-6.156 7.672-6.156 20.328 0 12.688 6.156 20.344Q17.828 56 27.875 56q6.063 0 10.406-2.39 4.344-2.391 7.125-7.22v8.297h8.985z" id="DejaVuSans-67"/><path d="M4.89 30.906h40.235v-7.031H4.891z" id="DejaVuSans-2013"/><path d="M11.719 12.406h10.297V4l-8-15.625H7.719l4 15.625z" id="DejaVuSans-2c"/></defs><g transform="matrix(.1 0 0 -.1 114.952 27.298)"><use xlink:href="#DejaVuSans-4d"/><use x="86.279" xlink:href="#DejaVuSans-69"/><use x="114.063" xlink:href="#DejaVuSans-74"/><use x="153.271" xlink:href="#DejaVuSans-6f"/><use x="214.453" xlink:href="#DejaVuSans-67"/><use x="277.93" xlink:href="#DejaVuSans-65"/><use x="339.453" xlink:href="#DejaVuSans-6e"/><use x="402.832" xlink:href="#DejaVuSans-20"/><use x="434.619" xlink:href="#DejaVuSans-2013"/><use x="484.619" xlink:href="#DejaVuSans-20"/><use x="516.406" xlink:href="#DejaVuSans-32"/><use x="580.029" xlink:href="#DejaVuSans-2e"/><use x="611.816" xlink:href="#DejaVuSans-31"/><use x="675.439" xlink:href="#DejaVuSans-34"/><use x="739.063" xlink:href="#DejaVuSans-20"/><use x="770.85" xlink:href="#DejaVuSans-4d"/><use x="857.129" xlink:href="#DejaVuSans-69"/><use x="884.912" xlink:href="#DejaVuSans-42"/><use x="953.516" xlink:href="#DejaVuSans-2c"/><use x="985.303" xlink:href="#DejaVuSans-20"/><use x="1017.09" xlink:href="#DejaVuSans-32"/><use x="1080.713" xlink:href="#DejaVuSans-36"/><use x="1144.336" xlink:href="#DejaVuSans-34"/><use x="1207.959" xlink:href="#DejaVuSans-2e"/><use x="1239.746" xlink:href="#DejaVuSans-37"/><use x="1303.369" xlink:href="#DejaVuSans-73"/></g></g><path d="M86.952 38.477h20" fill="none" stroke="#ff7f0e" stroke-linecap="square" stroke-width="1.5" id="line2d_31"/><g id="text_17"><defs><path d="M53.516 70.516V60.89q-5.61 2.687-10.594 4-4.984 1.328-9.625 1.328-8.047 0-12.422-3.125t-4.375-8.89q0-4.845 2.906-7.313 2.907-2.453 11.016-3.97l5.953-1.218q11.031-2.11 16.281-7.406 5.25-5.297 5.25-14.172 0-10.61-7.11-16.078-7.093-5.469-20.812-5.469-5.172 0-11.015 1.172Q13.14.922 6.89 3.219v10.156q6-3.36 11.765-5.078 5.766-1.703 11.328-1.703 8.438 0 13.032 3.312 4.593 3.328 4.593 9.485 0 5.359-3.297 8.39-3.296 3.032-10.812 4.547L27.484 33.5q-11.03 2.188-15.968 6.875-4.922 4.688-4.922 13.047 0 9.672 6.812 15.234 6.813 5.563 18.766 5.563 5.14 0 10.453-.938 5.328-.922 10.89-2.765z" id="DejaVuSans-53"/><path d="M9.813 72.906h9.859v-29.89h35.844v29.89h9.859V0h-9.86v34.719H19.673V0h-9.86z" id="DejaVuSans-48"/><path d="M19.672 64.797v-27.39h12.406q6.89 0 10.64 3.562 3.766 3.562 3.766 10.156 0 6.547-3.765 10.11-3.75 3.562-10.64 3.562zm-9.86 8.11h22.266q12.266 0 18.531-5.548 6.282-5.546 6.282-16.234 0-10.797-6.282-16.313-6.265-5.515-18.53-5.515H19.671V0h-9.86z" id="DejaVuSans-50"/><path d="M18.11 8.203v-29H9.077v75.484h9.031v-8.296q2.844 4.875 7.157 7.234Q29.594 56 35.594 56q9.968 0 16.187-7.906 6.235-7.907 6.235-20.797T51.78 6.484q-6.218-7.906-16.187-7.906-6 0-10.328 2.375-4.313 2.375-7.157 7.25zm30.578 19.094q0 9.906-4.079 15.547-4.078 5.64-11.203 5.64-7.14 0-11.218-5.64-4.079-5.64-4.079-15.547 0-9.906 4.078-15.547 4.079-5.64 11.22-5.64 7.124 0 11.202 5.64t4.078 15.547z" id="DejaVuSans-70"/><path d="M9.422 75.984h8.984V0H9.422z" id="DejaVuSans-6c"/></defs><g transform="matrix(.1 0 0 -.1 114.952 41.977)"><use xlink:href="#DejaVuSans-53"/><use x="63.477" xlink:href="#DejaVuSans-53"/><use x="126.953" xlink:href="#DejaVuSans-48"/><use x="202.148" xlink:href="#DejaVuSans-20"/><use x="233.936" xlink:href="#DejaVuSans-50"/><use x="294.207" xlink:href="#DejaVuSans-69"/><use x="321.99" xlink:href="#DejaVuSans-70"/><use x="385.467" xlink:href="#DejaVuSans-65"/><use x="446.99" xlink:href="#DejaVuSans-6c"/><use x="474.773" xlink:href="#DejaVuSans-69"/><use x="502.557" xlink:href="#DejaVuSans-6e"/><use x="565.936" xlink:href="#DejaVuSans-69"/><use x="593.719" xlink:href="#DejaVuSans-6e"/><use x="657.098" xlink:href="#DejaVuSans-67"/><use x="720.574" xlink:href="#DejaVuSans-20"/><use x="752.361" xlink:href="#DejaVuSans-2013"/><use x="802.361" xlink:href="#DejaVuSans-20"/><use x="834.148" xlink:href="#DejaVuSans-33"/><use x="897.771" xlink:href="#DejaVuSans-31"/><use x="961.395" xlink:href="#DejaVuSans-2e"/><use x="993.182" xlink:href="#DejaVuSans-31"/><use x="1056.805" xlink:href="#DejaVuSans-34"/><use x="1120.428" xlink:href="#DejaVuSans-20"/><use x="1152.215" xlink:href="#DejaVuSans-4d"/><use x="1238.494" xlink:href="#DejaVuSans-69"/><use x="1266.277" xlink:href="#DejaVuSans-42"/><use x="1334.881" xlink:href="#DejaVuSans-2c"/><use x="1366.668" xlink:href="#DejaVuSans-20"/><use x="1398.455" xlink:href="#DejaVuSans-31"/><use x="1462.078" xlink:href="#DejaVuSans-30"/><use x="1525.701" xlink:href="#DejaVuSans-36"/><use x="1589.324" xlink:href="#DejaVuSans-34"/><use x="1652.947" xlink:href="#DejaVuSans-2e"/><use x="1684.734" xlink:href="#DejaVuSans-32"/><use x="1748.357" xlink:href="#DejaVuSans-73"/></g></g></g></g></g><defs><clipPath id="p26b568cf67"><path d="M77.952 10.7h613.8v221.76h-613.8z"/></clipPath></defs></svg>������������������������������������������������������������������������mitogen-0.3.9/docs/images/ansible/pcaps/loop-100-items-local-detail.svg�����������������������������0000664�0000000�0000000�00000137444�14656664731�0025603�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<svg height="581.782" viewBox="0 0 640.289 436.336" width="853.719" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><style>*{stroke-linecap:butt;stroke-linejoin:round}</style></defs><g id="figure_1"><path d="M0 436.336h640.29V0H0z" fill="#fff" id="patch_1"/><g id="axes_1"><g id="matplotlib.axis_1"><g id="xtick_1"><path clip-path="url(#p84a90af7d1)" d="M96.953 146.999V10.7" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_1"/><g id="line2d_2"><defs><path d="M0 0v3.5" id="m8a2061c7d3" stroke="silver" stroke-width=".8"/></defs><use x="96.953" xlink:href="#m8a2061c7d3" y="146.999" fill="silver" stroke="silver" stroke-width=".8"/></g></g><g id="xtick_2"><path clip-path="url(#p84a90af7d1)" d="M161.574 146.999V10.7" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_3"/><use x="161.574" xlink:href="#m8a2061c7d3" y="146.999" fill="silver" stroke="silver" stroke-width=".8" id="line2d_4"/></g><g id="xtick_3"><path clip-path="url(#p84a90af7d1)" d="M226.195 146.999V10.7" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_5"/><use x="226.195" xlink:href="#m8a2061c7d3" y="146.999" fill="silver" stroke="silver" stroke-width=".8" id="line2d_6"/></g><g id="xtick_4"><path clip-path="url(#p84a90af7d1)" d="M290.817 146.999V10.7" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_7"/><use x="290.817" xlink:href="#m8a2061c7d3" y="146.999" fill="silver" stroke="silver" stroke-width=".8" id="line2d_8"/></g><g id="xtick_5"><path clip-path="url(#p84a90af7d1)" d="M355.438 146.999V10.7" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_9"/><use x="355.438" xlink:href="#m8a2061c7d3" y="146.999" fill="silver" stroke="silver" stroke-width=".8" id="line2d_10"/></g><g id="xtick_6"><path clip-path="url(#p84a90af7d1)" d="M420.06 146.999V10.7" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_11"/><use x="420.059" xlink:href="#m8a2061c7d3" y="146.999" fill="silver" stroke="silver" stroke-width=".8" id="line2d_12"/></g><g id="xtick_7"><path clip-path="url(#p84a90af7d1)" d="M484.68 146.999V10.7" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_13"/><use x="484.681" xlink:href="#m8a2061c7d3" y="146.999" fill="silver" stroke="silver" stroke-width=".8" id="line2d_14"/></g><g id="xtick_8"><path clip-path="url(#p84a90af7d1)" d="M549.302 146.999V10.7" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_15"/><use x="549.302" xlink:href="#m8a2061c7d3" y="146.999" fill="silver" stroke="silver" stroke-width=".8" id="line2d_16"/></g><g id="xtick_9"><path clip-path="url(#p84a90af7d1)" d="M613.923 146.999V10.7" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_17"/><use x="613.923" xlink:href="#m8a2061c7d3" y="146.999" fill="silver" stroke="silver" stroke-width=".8" id="line2d_18"/></g></g><g id="matplotlib.axis_2"><g id="ytick_1"><path clip-path="url(#p84a90af7d1)" d="M71.59 140.803h558" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_19"/><g id="line2d_20"><defs><path d="M0 0h-3.5" id="m7f37620cfc" stroke="silver" stroke-width=".8"/></defs><use x="71.589" xlink:href="#m7f37620cfc" y="140.803" fill="silver" stroke="silver" stroke-width=".8"/></g><g id="text_1"><defs><path d="M31.781 66.406q-7.61 0-11.453-7.5Q16.5 51.422 16.5 36.375q0-14.984 3.828-22.484 3.844-7.5 11.453-7.5 7.672 0 11.5 7.5 3.844 7.5 3.844 22.484 0 15.047-3.844 22.531-3.828 7.5-11.5 7.5zm0 7.813q12.266 0 18.735-9.703 6.468-9.688 6.468-28.141 0-18.406-6.468-28.11-6.47-9.687-18.735-9.687-12.25 0-18.718 9.688-6.47 9.703-6.47 28.109 0 18.453 6.47 28.14Q19.53 74.22 31.78 74.22z" id="DejaVuSans-30"/><path d="M10.688 12.406H21V0H10.687z" id="DejaVuSans-2e"/><path d="M9.813 72.906h14.703l18.593-49.61 18.703 49.61h14.704V0H66.89v64.016l-18.797-50h-9.907l-18.796 50V0H9.813z" id="DejaVuSans-4d"/><path d="M9.422 54.688h8.984V0H9.422zm0 21.296h8.984v-11.39H9.422z" id="DejaVuSans-69"/><path d="M19.672 34.813V8.108H35.5q7.953 0 11.781 3.297 3.844 3.297 3.844 10.078 0 6.844-3.844 10.078-3.828 3.25-11.781 3.25zm0 29.984V42.828h14.61q7.218 0 10.75 2.703 3.546 2.719 3.546 8.282 0 5.515-3.547 8.25-3.531 2.734-10.75 2.734zm-9.86 8.11h25.204q11.28 0 17.375-4.688Q58.5 63.53 58.5 54.89q0-6.703-3.125-10.657-3.125-3.953-9.188-4.922 7.282-1.562 11.313-6.53 4.031-4.954 4.031-12.376 0-9.765-6.64-15.093Q48.25 0 35.984 0H9.812z" id="DejaVuSans-42"/></defs><g transform="matrix(.1 0 0 -.1 20.878 144.603)"><use xlink:href="#DejaVuSans-30"/><use x="63.623" xlink:href="#DejaVuSans-2e"/><use x="95.41" xlink:href="#DejaVuSans-30"/><use x="159.033" xlink:href="#DejaVuSans-30"/><use x="222.656" xlink:href="#DejaVuSans-20"/><use x="254.443" xlink:href="#DejaVuSans-4d"/><use x="340.723" xlink:href="#DejaVuSans-69"/><use x="368.506" xlink:href="#DejaVuSans-42"/></g></g></g><g id="ytick_2"><path clip-path="url(#p84a90af7d1)" d="M71.59 103.003h558" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_21"/><use x="71.589" xlink:href="#m7f37620cfc" y="103.003" fill="silver" stroke="silver" stroke-width=".8" id="line2d_22"/><g id="text_2"><defs><path d="M12.406 8.297h16.11v55.625l-17.532-3.516v8.985l17.438 3.515h9.86V8.296H54.39V0H12.406z" id="DejaVuSans-31"/><path d="M10.984 1.516V10.5q3.72-1.766 7.516-2.688 3.813-.921 7.484-.921 9.766 0 14.907 6.562 5.156 6.563 5.89 19.953-2.828-4.203-7.187-6.453-4.344-2.25-9.61-2.25-10.937 0-17.312 6.61-6.375 6.625-6.375 18.109 0 11.219 6.64 18 6.641 6.797 17.672 6.797 12.657 0 19.313-9.703 6.672-9.688 6.672-28.141 0-17.234-8.188-27.516Q40.234-1.42 26.422-1.42q-3.719 0-7.531.734-3.797.734-7.907 2.203zM30.61 32.422q6.641 0 10.516 4.531 3.89 4.547 3.89 12.469 0 7.86-3.89 12.422-3.875 4.562-10.516 4.562-6.64 0-10.515-4.562-3.875-4.563-3.875-12.422 0-7.922 3.875-12.469 3.875-4.531 10.515-4.531z" id="DejaVuSans-39"/></defs><g transform="matrix(.1 0 0 -.1 20.878 106.802)"><use xlink:href="#DejaVuSans-31"/><use x="63.623" xlink:href="#DejaVuSans-2e"/><use x="95.41" xlink:href="#DejaVuSans-39"/><use x="159.033" xlink:href="#DejaVuSans-31"/><use x="222.656" xlink:href="#DejaVuSans-20"/><use x="254.443" xlink:href="#DejaVuSans-4d"/><use x="340.723" xlink:href="#DejaVuSans-69"/><use x="368.506" xlink:href="#DejaVuSans-42"/></g></g></g><g id="ytick_3"><path clip-path="url(#p84a90af7d1)" d="M71.59 65.202h558" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_23"/><use x="71.589" xlink:href="#m7f37620cfc" y="65.202" fill="silver" stroke="silver" stroke-width=".8" id="line2d_24"/><g id="text_3"><defs><path d="M40.578 39.313Q47.656 37.797 51.625 33q3.984-4.781 3.984-11.813 0-10.78-7.422-16.703-7.421-5.906-21.093-5.906-4.578 0-9.438.906-4.86.907-10.031 2.72v9.515q4.094-2.39 8.969-3.61 4.89-1.218 10.218-1.218 9.266 0 14.125 3.656 4.86 3.656 4.86 10.64 0 6.454-4.516 10.079-4.515 3.64-12.562 3.64h-8.5v8.11h8.89q7.266 0 11.125 2.906 3.86 2.906 3.86 8.375 0 5.61-3.985 8.61-3.968 3.015-11.39 3.015-4.063 0-8.703-.89-4.641-.876-10.203-2.72v8.782q5.624 1.562 10.53 2.344 4.907.78 9.25.78 11.235 0 17.766-5.109 6.547-5.093 6.547-13.78 0-6.063-3.468-10.235-3.47-4.172-9.86-5.782z" id="DejaVuSans-33"/><path d="M31.781 34.625q-7.031 0-11.062-3.766-4.016-3.765-4.016-10.343 0-6.594 4.016-10.36Q24.75 6.391 31.78 6.391q7.032 0 11.078 3.78 4.063 3.798 4.063 10.345 0 6.578-4.031 10.343-4.016 3.766-11.11 3.766zm-9.86 4.188q-6.343 1.562-9.89 5.906Q8.5 49.079 8.5 55.329q0 8.733 6.219 13.812 6.234 5.078 17.062 5.078 10.89 0 17.094-5.078 6.203-5.079 6.203-13.813 0-6.25-3.547-10.61-3.531-4.343-9.828-5.906 7.125-1.656 11.094-6.5 3.984-4.828 3.984-11.796 0-10.61-6.468-16.282-6.47-5.656-18.532-5.656-12.047 0-18.531 5.656-6.469 5.672-6.469 16.282 0 6.968 4 11.797 4.016 4.843 11.14 6.5zM18.314 54.39q0-5.657 3.53-8.828 3.548-3.172 9.938-3.172 6.36 0 9.938 3.172 3.593 3.171 3.593 8.828 0 5.672-3.593 8.843-3.578 3.172-9.938 3.172-6.39 0-9.937-3.172-3.532-3.172-3.532-8.843z" id="DejaVuSans-38"/></defs><g transform="matrix(.1 0 0 -.1 20.878 69.002)"><use xlink:href="#DejaVuSans-33"/><use x="63.623" xlink:href="#DejaVuSans-2e"/><use x="95.41" xlink:href="#DejaVuSans-38"/><use x="159.033" xlink:href="#DejaVuSans-31"/><use x="222.656" xlink:href="#DejaVuSans-20"/><use x="254.443" xlink:href="#DejaVuSans-4d"/><use x="340.723" xlink:href="#DejaVuSans-69"/><use x="368.506" xlink:href="#DejaVuSans-42"/></g></g></g><g id="ytick_4"><path clip-path="url(#p84a90af7d1)" d="M71.59 27.402h558" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_25"/><use x="71.589" xlink:href="#m7f37620cfc" y="27.402" fill="silver" stroke="silver" stroke-width=".8" id="line2d_26"/><g id="text_4"><defs><path d="M10.797 72.906h38.719v-8.312H19.828v-17.86q2.14.735 4.281 1.094 2.157.36 4.313.36 12.203 0 19.328-6.688 7.14-6.688 7.14-18.11 0-11.765-7.328-18.296-7.328-6.516-20.656-6.516-4.593 0-9.36.781-4.75.782-9.827 2.344v9.922q4.39-2.39 9.078-3.563 4.687-1.171 9.906-1.171 8.453 0 13.375 4.437 4.938 4.438 4.938 12.063 0 7.609-4.938 12.047-4.922 4.453-13.375 4.453-3.953 0-7.89-.875-3.922-.875-8.016-2.735z" id="DejaVuSans-35"/><path d="M8.203 72.906h46.875v-4.203L28.61 0H18.312L43.22 64.594H8.203z" id="DejaVuSans-37"/><path d="M19.188 8.297h34.421V0H7.33v8.297q5.609 5.812 15.296 15.594 9.703 9.797 12.188 12.64 4.734 5.313 6.609 9 1.89 3.688 1.89 7.25 0 5.813-4.078 9.469-4.078 3.672-10.625 3.672-4.64 0-9.797-1.61-5.14-1.609-11-4.89v9.969Q13.767 71.78 18.938 73q5.188 1.219 9.485 1.219 11.328 0 18.062-5.672 6.735-5.656 6.735-15.125 0-4.5-1.688-8.531-1.672-4.016-6.125-9.485-1.218-1.422-7.765-8.187-6.532-6.766-18.453-18.922z" id="DejaVuSans-32"/></defs><g transform="matrix(.1 0 0 -.1 20.878 31.201)"><use xlink:href="#DejaVuSans-35"/><use x="63.623" xlink:href="#DejaVuSans-2e"/><use x="95.41" xlink:href="#DejaVuSans-37"/><use x="159.033" xlink:href="#DejaVuSans-32"/><use x="222.656" xlink:href="#DejaVuSans-20"/><use x="254.443" xlink:href="#DejaVuSans-4d"/><use x="340.723" xlink:href="#DejaVuSans-69"/><use x="368.506" xlink:href="#DejaVuSans-42"/></g></g></g><g id="text_5"><defs><path d="M34.281 27.484q-10.89 0-15.093-2.484-4.204-2.484-4.204-8.5 0-4.781 3.157-7.594 3.156-2.797 8.562-2.797 7.485 0 12 5.297 4.516 5.297 4.516 14.078v2zm17.922 3.72V0H43.22v8.297Q40.14 3.328 35.547.953q-4.594-2.375-11.234-2.375-8.391 0-13.36 4.719Q6 8.016 6 15.922q0 9.219 6.172 13.906 6.187 4.688 18.437 4.688h12.61v.89q0 6.203-4.078 9.594-4.078 3.39-11.453 3.39-4.688 0-9.141-1.124-4.438-1.125-8.531-3.375v8.312q4.921 1.906 9.562 2.844 4.64.953 9.031.953 11.875 0 17.735-6.156 5.86-6.14 5.86-18.64z" id="DejaVuSans-61"/><path d="M54.89 33.016V0h-8.984v32.719q0 7.765-3.031 11.61-3.031 3.858-9.078 3.858-7.281 0-11.484-4.64-4.204-4.625-4.204-12.64V0H9.08v54.688h9.03v-8.5q3.235 4.937 7.594 7.374Q30.078 56 35.797 56q9.422 0 14.25-5.828 4.844-5.828 4.844-17.156z" id="DejaVuSans-6e"/><path d="M45.406 46.39v29.594h8.985V0h-8.985v8.203Q42.578 3.328 38.25.953q-4.313-2.375-10.375-2.375-9.906 0-16.14 7.906-6.22 7.922-6.22 20.813 0 12.89 6.22 20.797Q17.968 56 27.874 56q6.063 0 10.375-2.375 4.328-2.36 7.156-7.234zm-30.61-19.093q0-9.906 4.079-15.547 4.078-5.64 11.203-5.64 7.125 0 11.219 5.64 4.11 5.64 4.11 15.547 0 9.906-4.11 15.547-4.094 5.64-11.219 5.64-7.125 0-11.203-5.64-4.078-5.64-4.078-15.547z" id="DejaVuSans-64"/><path d="M4.203 54.688h8.985l11.234-42.672 11.172 42.672h10.593l11.235-42.672 11.187 42.672h8.985L63.28 0H52.688L40.922 44.828 29.109 0H18.5z" id="DejaVuSans-77"/><path d="M18.313 70.219V54.688h18.5v-6.985h-18.5V18.016q0-6.688 1.828-8.594 1.828-1.906 7.453-1.906h9.218V0h-9.218q-10.407 0-14.36 3.875-3.953 3.89-3.953 14.14v29.688H2.687v6.984h6.594V70.22z" id="DejaVuSans-74"/><path d="M54.89 33.016V0h-8.984v32.719q0 7.765-3.031 11.61-3.031 3.858-9.078 3.858-7.281 0-11.484-4.64-4.204-4.625-4.204-12.64V0H9.08v75.984h9.03V46.188q3.235 4.937 7.594 7.374Q30.078 56 35.797 56q9.422 0 14.25-5.828 4.844-5.828 4.844-17.156z" id="DejaVuSans-68"/></defs><g transform="matrix(0 -.1 -.1 0 14.798 105.468)"><use xlink:href="#DejaVuSans-42"/><use x="68.604" xlink:href="#DejaVuSans-61"/><use x="129.883" xlink:href="#DejaVuSans-6e"/><use x="193.262" xlink:href="#DejaVuSans-64"/><use x="256.738" xlink:href="#DejaVuSans-77"/><use x="338.525" xlink:href="#DejaVuSans-69"/><use x="366.309" xlink:href="#DejaVuSans-64"/><use x="429.785" xlink:href="#DejaVuSans-74"/><use x="468.994" xlink:href="#DejaVuSans-68"/></g></g></g><path clip-path="url(#p84a90af7d1)" d="M158.338 140.803v-.063l9.694-.004v-1.28l6.462-.01v-1.28l6.462-.01v-1.284l3.23-.006v-1.28l6.463-.01v-1.285l3.231-.005v-1.284l3.231-.006v-1.28l6.462-.01v-1.284l3.231-.006v-1.28l6.463-.01v-1.284l3.23-.006v-1.284l3.232-.006v-1.28l6.462-.01v-1.284l3.23-.006v-1.28l6.463-.01v-1.285l3.231-.006v-1.281l3.231-.009v-.31l3.231-.31v-.665l3.231-.005v-1.284l3.231-.006v-1.28l6.462-.01v-1.284l3.232-.006v-1.28l6.462-.01v-1.284l3.23-.006v-1.28l6.463-.01v-1.285l3.23-.005v-1.284l3.232-.006v-1.28l6.462-.01v-1.284l3.231-.006v-1.28l6.462-.01v-1.286l3.231-.004v-1.284l3.231-.006v-1.28l6.463-.01V99.46l3.23-.005v-1.28l6.463-.01v-1.286l3.23-.005V95.59l3.232-.006v-1.28l6.462-.01V93.01l3.231-.006v-1.28l6.462-.01V90.43l3.231-.005V89.14l3.231-.006v-1.28l6.462-.01V86.56l3.232-.006v-1.28l6.462-.01v-1.286l3.23-.004V82.69l3.232-.006v-1.28l6.462-.01V80.11l3.231-.006v-1.28l6.462-.01v-1.286l3.231-.004v-1.285l3.231-.006v-1.28l6.462-.01v-1.285l3.231-.005V72.37l3.232-.006v-1.28l6.462-.01V69.79l3.23-.006v-1.28l6.463-.01v-1.285l3.23-.005V65.92l6.463-.006v-1.285l3.231-.005v-1.284l3.231-.006v-1.28l6.462-.01v-1.284l3.231-.006V59.47l6.462-.007v-1.286l3.232-.004v-1.284l3.23-.006v-1.28l6.463-.01v-1.286l3.23-.004v-1.285l3.232-.006v-1.28l6.462-.01v-1.284l3.231-.006v-1.284l3.231-.006v-1.28l6.462-.01v-1.284l3.231-.006V45.28l3.231-.008v-1.28l6.463-.01v-1.284l3.23-.006v-1.28l6.463-.01v-1.284l3.23-.006V38.83l3.232-.008v-1.28l6.462-.01v-1.284l3.231-.006V34.96l6.462-.01v-1.285l3.231-.004v-1.285l3.231-.005v-1.28l6.462-.01v-1.285l3.232-.006v-1.28l6.462-.01v-1.285l3.23-.005v-1.284l3.232-.006v-1.28l6.462-.01v-1.284l3.231-.006V22.06l6.462-.008v-1.285l3.231-.005v-1.284l3.231-.006v-1.28l6.462-.01v-1.284l3.231-.002h0" fill="none" stroke="#1f77b4" stroke-linecap="square" id="line2d_27"/><path clip-path="url(#p84a90af7d1)" d="M135.721 140.803h0l12.924-.078v-.303l3.231-.095v-.76l3.231-.087v-.24l3.231-.018v-.185l9.694-.106 35.541-.12v-.011l6.462-.019h0" fill="none" stroke="#ff7f0e" stroke-linecap="square" id="line2d_28"/><g id="legend_1"><path d="M78.59 48.056h192.957q2 0 2-2V17.7q0-2-2-2H78.589q-2 0-2 2v28.356q0 2 2 2z" fill="#fff" opacity=".8" stroke="#ccc" id="patch_2"/><path d="M80.59 23.798h20" fill="none" stroke="#1f77b4" stroke-linecap="square" id="line2d_29"/><g id="text_6"><defs><path d="M53.516 70.516V60.89q-5.61 2.687-10.594 4-4.984 1.328-9.625 1.328-8.047 0-12.422-3.125t-4.375-8.89q0-4.845 2.906-7.313 2.907-2.453 11.016-3.97l5.953-1.218q11.031-2.11 16.281-7.406 5.25-5.297 5.25-14.172 0-10.61-7.11-16.078-7.093-5.469-20.812-5.469-5.172 0-11.015 1.172Q13.14.922 6.89 3.219v10.156q6-3.36 11.765-5.078 5.766-1.703 11.328-1.703 8.438 0 13.032 3.312 4.593 3.328 4.593 9.485 0 5.359-3.297 8.39-3.296 3.032-10.812 4.547L27.484 33.5q-11.03 2.188-15.968 6.875-4.922 4.688-4.922 13.047 0 9.672 6.812 15.234 6.813 5.563 18.766 5.563 5.14 0 10.453-.938 5.328-.922 10.89-2.765z" id="DejaVuSans-53"/><path d="M9.813 72.906h9.859v-29.89h35.844v29.89h9.859V0h-9.86v34.719H19.673V0h-9.86z" id="DejaVuSans-48"/><path d="M19.672 64.797v-27.39h12.406q6.89 0 10.64 3.562 3.766 3.562 3.766 10.156 0 6.547-3.765 10.11-3.75 3.562-10.64 3.562zm-9.86 8.11h22.266q12.266 0 18.531-5.548 6.282-5.546 6.282-16.234 0-10.797-6.282-16.313-6.265-5.515-18.53-5.515H19.671V0h-9.86z" id="DejaVuSans-50"/><path d="M18.11 8.203v-29H9.077v75.484h9.031v-8.296q2.844 4.875 7.157 7.234Q29.594 56 35.594 56q9.968 0 16.187-7.906 6.235-7.907 6.235-20.797T51.78 6.484q-6.218-7.906-16.187-7.906-6 0-10.328 2.375-4.313 2.375-7.157 7.25zm30.578 19.094q0 9.906-4.079 15.547-4.078 5.64-11.203 5.64-7.14 0-11.218-5.64-4.079-5.64-4.079-15.547 0-9.906 4.078-15.547 4.079-5.64 11.22-5.64 7.124 0 11.202 5.64t4.078 15.547z" id="DejaVuSans-70"/><path d="M56.203 29.594v-4.39H14.891q.593-9.282 5.593-14.142 5-4.859 13.938-4.859 5.172 0 10.031 1.266 4.86 1.265 9.656 3.812v-8.5Q49.266.734 44.187-.344 39.11-1.422 33.892-1.422q-13.094 0-20.735 7.61-7.64 7.625-7.64 20.625 0 13.421 7.25 21.296Q20.016 56 32.328 56q11.031 0 17.453-7.11 6.422-7.093 6.422-19.296zm-8.984 2.64q-.094 7.36-4.125 11.75-4.032 4.407-10.672 4.407-7.516 0-12.031-4.25-4.516-4.25-5.203-11.97z" id="DejaVuSans-65"/><path d="M9.422 75.984h8.984V0H9.422z" id="DejaVuSans-6c"/><path d="M45.406 27.984q0 9.766-4.031 15.125-4.016 5.375-11.297 5.375-7.219 0-11.25-5.375-4.031-5.359-4.031-15.125 0-9.718 4.031-15.093t11.25-5.375q7.281 0 11.297 5.375 4.031 5.375 4.031 15.093zm8.985-21.203q0-13.953-6.203-20.765Q42-20.797 29.203-20.797q-4.734 0-8.937.703-4.203.703-8.157 2.172v8.735q3.954-2.141 7.813-3.157 3.86-1.031 7.86-1.031 8.843 0 13.234 4.61 4.39 4.609 4.39 13.937v4.453q-2.781-4.844-7.125-7.234Q33.938 0 27.875 0 17.828 0 11.672 7.656q-6.156 7.672-6.156 20.328 0 12.688 6.156 20.344Q17.828 56 27.875 56q6.063 0 10.406-2.39 4.344-2.391 7.125-7.22v8.297h8.985z" id="DejaVuSans-67"/><path d="M4.89 30.906h40.235v-7.031H4.891z" id="DejaVuSans-2013"/><path d="M33.016 40.375q-6.641 0-10.532-4.547-3.875-4.531-3.875-12.437 0-7.86 3.875-12.438 3.891-4.562 10.532-4.562 6.64 0 10.515 4.562 3.875 4.578 3.875 12.438 0 7.906-3.875 12.437-3.875 4.547-10.515 4.547zm19.578 30.922v-8.984q-3.719 1.75-7.5 2.671-3.782.938-7.5.938-9.766 0-14.922-6.594-5.14-6.594-5.875-19.922 2.875 4.25 7.219 6.516 4.359 2.266 9.578 2.266 10.984 0 17.36-6.672 6.374-6.657 6.374-18.125 0-11.235-6.64-18.032-6.641-6.78-17.672-6.78-12.657 0-19.344 9.687-6.688 9.703-6.688 28.109 0 17.281 8.204 27.563 8.203 10.28 22.015 10.28 3.719 0 7.5-.734t7.89-2.187z" id="DejaVuSans-36"/><path d="M11.719 12.406h10.297V4l-8-15.625H7.719l4 15.625z" id="DejaVuSans-2c"/><path d="M44.281 53.078v-8.5q-3.797 1.953-7.906 2.922-4.094.984-8.5.984-6.688 0-10.031-2.047-3.344-2.046-3.344-6.156 0-3.125 2.39-4.906 2.391-1.781 9.626-3.39l3.078-.688q9.562-2.047 13.593-5.781 4.032-3.735 4.032-10.422 0-7.625-6.032-12.078-6.03-4.438-16.578-4.438-4.39 0-9.156.86Q10.688.296 5.422 2v9.281q4.984-2.594 9.812-3.89 4.829-1.282 9.579-1.282 6.343 0 9.75 2.172 3.421 2.172 3.421 6.125 0 3.656-2.468 5.61-2.453 1.953-10.813 3.765l-3.125.735q-8.344 1.75-12.062 5.39-3.704 3.64-3.704 9.985 0 7.718 5.47 11.906Q16.75 56 26.811 56q4.97 0 9.36-.734 4.406-.72 8.11-2.188z" id="DejaVuSans-73"/></defs><g transform="matrix(.1 0 0 -.1 108.59 27.298)"><use xlink:href="#DejaVuSans-53"/><use x="63.477" xlink:href="#DejaVuSans-53"/><use x="126.953" xlink:href="#DejaVuSans-48"/><use x="202.148" xlink:href="#DejaVuSans-20"/><use x="233.936" xlink:href="#DejaVuSans-50"/><use x="294.207" xlink:href="#DejaVuSans-69"/><use x="321.99" xlink:href="#DejaVuSans-70"/><use x="385.467" xlink:href="#DejaVuSans-65"/><use x="446.99" xlink:href="#DejaVuSans-6c"/><use x="474.773" xlink:href="#DejaVuSans-69"/><use x="502.557" xlink:href="#DejaVuSans-6e"/><use x="565.936" xlink:href="#DejaVuSans-69"/><use x="593.719" xlink:href="#DejaVuSans-6e"/><use x="657.098" xlink:href="#DejaVuSans-67"/><use x="720.574" xlink:href="#DejaVuSans-20"/><use x="752.361" xlink:href="#DejaVuSans-2013"/><use x="802.361" xlink:href="#DejaVuSans-20"/><use x="834.148" xlink:href="#DejaVuSans-36"/><use x="897.771" xlink:href="#DejaVuSans-2e"/><use x="929.559" xlink:href="#DejaVuSans-32"/><use x="993.182" xlink:href="#DejaVuSans-35"/><use x="1056.805" xlink:href="#DejaVuSans-20"/><use x="1088.592" xlink:href="#DejaVuSans-4d"/><use x="1174.871" xlink:href="#DejaVuSans-69"/><use x="1202.654" xlink:href="#DejaVuSans-42"/><use x="1271.258" xlink:href="#DejaVuSans-2c"/><use x="1303.045" xlink:href="#DejaVuSans-20"/><use x="1334.832" xlink:href="#DejaVuSans-31"/><use x="1398.455" xlink:href="#DejaVuSans-33"/><use x="1462.078" xlink:href="#DejaVuSans-2e"/><use x="1493.865" xlink:href="#DejaVuSans-38"/><use x="1557.488" xlink:href="#DejaVuSans-73"/></g></g><path d="M80.59 38.477h20" fill="none" stroke="#ff7f0e" stroke-linecap="square" id="line2d_31"/><g id="text_7"><defs><path d="M30.61 48.39q-7.22 0-11.422-5.64-4.204-5.64-4.204-15.453 0-9.813 4.172-15.453 4.188-5.64 11.453-5.64 7.188 0 11.375 5.655 4.203 5.672 4.203 15.438 0 9.719-4.203 15.406-4.187 5.688-11.375 5.688zm0 7.61q11.718 0 18.406-7.625 6.703-7.61 6.703-21.078 0-13.422-6.703-21.078-6.688-7.64-18.407-7.64-11.765 0-18.437 7.64-6.656 7.656-6.656 21.078 0 13.469 6.656 21.078Q18.844 56 30.609 56z" id="DejaVuSans-6f"/></defs><g transform="matrix(.1 0 0 -.1 108.59 41.977)"><use xlink:href="#DejaVuSans-4d"/><use x="86.279" xlink:href="#DejaVuSans-69"/><use x="114.063" xlink:href="#DejaVuSans-74"/><use x="153.271" xlink:href="#DejaVuSans-6f"/><use x="214.453" xlink:href="#DejaVuSans-67"/><use x="277.93" xlink:href="#DejaVuSans-65"/><use x="339.453" xlink:href="#DejaVuSans-6e"/><use x="402.832" xlink:href="#DejaVuSans-20"/><use x="434.619" xlink:href="#DejaVuSans-2013"/><use x="484.619" xlink:href="#DejaVuSans-20"/><use x="516.406" xlink:href="#DejaVuSans-30"/><use x="580.029" xlink:href="#DejaVuSans-2e"/><use x="611.816" xlink:href="#DejaVuSans-31"/><use x="675.439" xlink:href="#DejaVuSans-30"/><use x="739.063" xlink:href="#DejaVuSans-20"/><use x="770.85" xlink:href="#DejaVuSans-4d"/><use x="857.129" xlink:href="#DejaVuSans-69"/><use x="884.912" xlink:href="#DejaVuSans-42"/><use x="953.516" xlink:href="#DejaVuSans-2c"/><use x="985.303" xlink:href="#DejaVuSans-20"/><use x="1017.09" xlink:href="#DejaVuSans-32"/><use x="1080.713" xlink:href="#DejaVuSans-2e"/><use x="1112.5" xlink:href="#DejaVuSans-33"/><use x="1176.123" xlink:href="#DejaVuSans-73"/></g></g></g></g><g id="axes_2"><g id="matplotlib.axis_3"><g id="xtick_10"><path clip-path="url(#p2b159da72d)" d="M96.953 209.944v-49.563" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_33"/><use x="96.953" xlink:href="#m8a2061c7d3" y="209.944" fill="silver" stroke="silver" stroke-width=".8" id="line2d_34"/></g><g id="xtick_11"><path clip-path="url(#p2b159da72d)" d="M161.574 209.944v-49.563" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_35"/><use x="161.574" xlink:href="#m8a2061c7d3" y="209.944" fill="silver" stroke="silver" stroke-width=".8" id="line2d_36"/></g><g id="xtick_12"><path clip-path="url(#p2b159da72d)" d="M226.195 209.944v-49.563" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_37"/><use x="226.195" xlink:href="#m8a2061c7d3" y="209.944" fill="silver" stroke="silver" stroke-width=".8" id="line2d_38"/></g><g id="xtick_13"><path clip-path="url(#p2b159da72d)" d="M290.817 209.944v-49.563" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_39"/><use x="290.817" xlink:href="#m8a2061c7d3" y="209.944" fill="silver" stroke="silver" stroke-width=".8" id="line2d_40"/></g><g id="xtick_14"><path clip-path="url(#p2b159da72d)" d="M355.438 209.944v-49.563" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_41"/><use x="355.438" xlink:href="#m8a2061c7d3" y="209.944" fill="silver" stroke="silver" stroke-width=".8" id="line2d_42"/></g><g id="xtick_15"><path clip-path="url(#p2b159da72d)" d="M420.06 209.944v-49.563" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_43"/><use x="420.059" xlink:href="#m8a2061c7d3" y="209.944" fill="silver" stroke="silver" stroke-width=".8" id="line2d_44"/></g><g id="xtick_16"><path clip-path="url(#p2b159da72d)" d="M484.68 209.944v-49.563" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_45"/><use x="484.681" xlink:href="#m8a2061c7d3" y="209.944" fill="silver" stroke="silver" stroke-width=".8" id="line2d_46"/></g><g id="xtick_17"><path clip-path="url(#p2b159da72d)" d="M549.302 209.944v-49.563" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_47"/><use x="549.302" xlink:href="#m8a2061c7d3" y="209.944" fill="silver" stroke="silver" stroke-width=".8" id="line2d_48"/></g><g id="xtick_18"><path clip-path="url(#p2b159da72d)" d="M613.923 209.944v-49.563" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_49"/><use x="613.923" xlink:href="#m8a2061c7d3" y="209.944" fill="silver" stroke="silver" stroke-width=".8" id="line2d_50"/></g></g><g id="matplotlib.axis_4"><g id="ytick_5"><path clip-path="url(#p2b159da72d)" d="M71.59 209.29h558" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_51"/><use x="71.589" xlink:href="#m7f37620cfc" y="209.291" fill="silver" stroke="silver" stroke-width=".8" id="line2d_52"/><g transform="matrix(.1 0 0 -.1 43.477 213.09)" id="text_8"><use xlink:href="#DejaVuSans-30"/><use x="63.623" xlink:href="#DejaVuSans-2e"/><use x="95.41" xlink:href="#DejaVuSans-30"/><use x="159.033" xlink:href="#DejaVuSans-73"/></g></g><g id="ytick_6"><path clip-path="url(#p2b159da72d)" d="M71.59 177.101h558" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_53"/><use x="71.589" xlink:href="#m7f37620cfc" y="177.101" fill="silver" stroke="silver" stroke-width=".8" id="line2d_54"/><g transform="matrix(.1 0 0 -.1 43.477 180.9)" id="text_9"><use xlink:href="#DejaVuSans-32"/><use x="63.623" xlink:href="#DejaVuSans-2e"/><use x="95.41" xlink:href="#DejaVuSans-30"/><use x="159.033" xlink:href="#DejaVuSans-73"/></g></g><g id="text_10"><defs><path d="M64.406 67.281v-10.39q-4.984 4.64-10.625 6.922-5.64 2.296-11.984 2.296-12.5 0-19.14-7.64-6.641-7.64-6.641-22.094 0-14.406 6.64-22.047 6.64-7.64 19.14-7.64 6.345 0 11.985 2.296 5.64 2.297 10.625 6.938V5.609Q59.234 2.094 53.437.33q-5.78-1.75-12.218-1.75-16.563 0-26.094 10.124-9.516 10.14-9.516 27.672 0 17.578 9.516 27.703 9.531 10.14 26.094 10.14 6.531 0 12.312-1.734 5.797-1.734 10.875-5.203z" id="DejaVuSans-43"/><path d="M8.688 72.906h9.921V28.61q0-11.718 4.235-16.875 4.25-5.14 13.781-5.14 9.469 0 13.719 5.14 4.25 5.157 4.25 16.875v44.297H64.5V27.391q0-14.25-7.063-21.532-7.046-7.28-20.812-7.28-13.828 0-20.89 7.28-7.047 7.282-7.047 21.532z" id="DejaVuSans-55"/></defs><g transform="matrix(0 -.1 -.1 0 14.798 195.328)"><use xlink:href="#DejaVuSans-43"/><use x="69.824" xlink:href="#DejaVuSans-50"/><use x="130.127" xlink:href="#DejaVuSans-55"/></g></g></g><path clip-path="url(#p2b159da72d)" d="M96.953 207.691l29.127-14.5 6.472-.204 6.477-.296 3.237-.14 3.236-.282 6.47-.331 6.471-.514 3.236-.083 6.472-.506 3.236-.07 9.708-.76 3.234-.08 6.473-.519 3.235-.08 6.473-.515 6.473-.318 6.473-.51 3.237-.068 3.236-.606 3.235-.256 3.235-.08 9.707-.756 3.236-.076 6.47-.503 3.237-.068 6.47-.503 3.236-.078 9.708-.8 3.236-.079 6.473-.526 3.234-.066 9.706-.814 3.236-.072 6.47-.53 6.472-.327 6.47-.509 3.236-.07 6.472-.541 3.236-.073 9.706-.772 3.235-.074 9.709-.737 3.235-.104 6.471-.556 3.236-.072 9.708-.77 3.236-.072 6.47-.55 29.516-1.753 6.47-.503 3.236-.072 9.708-.752 3.234-.083 6.473-.501 6.47-.329 6.471-.521 3.236-.072 9.707-.769 3.237-.071 9.705-.764 3.236-.076 6.472-.564 3.235-.072 9.707-.787 3.235-.069 9.706-.722 3.236-.145 6.47-.515 3.236-.071 9.71-.757 3.236-.09 6.473-.508 3.235-.07 9.71-.773 3.235-.068 6.472-.51 3.237-.072 9.707-.779 3.236-.076 3.236-.26 3.238-.815.507-.252h0" fill="none" stroke="#1f77b4" stroke-linecap="square" id="line2d_55"/><path clip-path="url(#p2b159da72d)" d="M96.953 207.687l3.236-1.609 3.237-1.609 3.236-1.615 3.236-1.617 3.236-1.611 3.236-1.612 3.237-1.612 3.238-1.609 3.239-1.283 3.245-1.513 3.238-.11 3.238-.064 3.239-.048 3.236-.498 3.237-1.681 3.237-1.669 3.237-.57 3.241-1.143 3.244-1.15 3.24-1.138 3.24-1.29 3.243-1.632 3.24-1.145 3.24-1.095 3.237-1.083 3.244-1.088 3.24-1.086 3.24-.989 3.239-1.066 3.238-1.042 3.24-1.056 3.239-1.024 3.236-1.593.048-.022" fill="none" stroke="#ff7f0e" stroke-linecap="square" id="line2d_56"/></g><g id="axes_3"><g id="matplotlib.axis_5"><g id="xtick_19"><path clip-path="url(#pe6d4fa9c4a)" d="M96.953 272.89v-49.564" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_57"/><use x="96.953" xlink:href="#m8a2061c7d3" y="272.889" fill="silver" stroke="silver" stroke-width=".8" id="line2d_58"/></g><g id="xtick_20"><path clip-path="url(#pe6d4fa9c4a)" d="M161.574 272.89v-49.564" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_59"/><use x="161.574" xlink:href="#m8a2061c7d3" y="272.889" fill="silver" stroke="silver" stroke-width=".8" id="line2d_60"/></g><g id="xtick_21"><path clip-path="url(#pe6d4fa9c4a)" d="M226.195 272.89v-49.564" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_61"/><use x="226.195" xlink:href="#m8a2061c7d3" y="272.889" fill="silver" stroke="silver" stroke-width=".8" id="line2d_62"/></g><g id="xtick_22"><path clip-path="url(#pe6d4fa9c4a)" d="M290.817 272.89v-49.564" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_63"/><use x="290.817" xlink:href="#m8a2061c7d3" y="272.889" fill="silver" stroke="silver" stroke-width=".8" id="line2d_64"/></g><g id="xtick_23"><path clip-path="url(#pe6d4fa9c4a)" d="M355.438 272.89v-49.564" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_65"/><use x="355.438" xlink:href="#m8a2061c7d3" y="272.889" fill="silver" stroke="silver" stroke-width=".8" id="line2d_66"/></g><g id="xtick_24"><path clip-path="url(#pe6d4fa9c4a)" d="M420.06 272.89v-49.564" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_67"/><use x="420.059" xlink:href="#m8a2061c7d3" y="272.889" fill="silver" stroke="silver" stroke-width=".8" id="line2d_68"/></g><g id="xtick_25"><path clip-path="url(#pe6d4fa9c4a)" d="M484.68 272.89v-49.564" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_69"/><use x="484.681" xlink:href="#m8a2061c7d3" y="272.889" fill="silver" stroke="silver" stroke-width=".8" id="line2d_70"/></g><g id="xtick_26"><path clip-path="url(#pe6d4fa9c4a)" d="M549.302 272.89v-49.564" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_71"/><use x="549.302" xlink:href="#m8a2061c7d3" y="272.889" fill="silver" stroke="silver" stroke-width=".8" id="line2d_72"/></g><g id="xtick_27"><path clip-path="url(#pe6d4fa9c4a)" d="M613.923 272.89v-49.564" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_73"/><use x="613.923" xlink:href="#m8a2061c7d3" y="272.889" fill="silver" stroke="silver" stroke-width=".8" id="line2d_74"/></g></g><g id="matplotlib.axis_6"><g id="ytick_7"><path clip-path="url(#pe6d4fa9c4a)" d="M71.59 271.53h558" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_75"/><use x="71.589" xlink:href="#m7f37620cfc" y="271.531" fill="silver" stroke="silver" stroke-width=".8" id="line2d_76"/><g id="text_11"><defs><path d="M9.078 75.984h9.031V31.11l26.813 23.578H56.39l-29-25.578L57.625 0H45.906L18.11 26.703V0H9.08z" id="DejaVuSans-6b"/></defs><g transform="matrix(.1 0 0 -.1 52.436 275.33)"><use xlink:href="#DejaVuSans-30"/><use x="63.623" xlink:href="#DejaVuSans-6b"/></g></g></g><g id="ytick_8"><path clip-path="url(#pe6d4fa9c4a)" d="M71.59 241.577h558" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_77"/><use x="71.589" xlink:href="#m7f37620cfc" y="241.577" fill="silver" stroke="silver" stroke-width=".8" id="line2d_78"/><g transform="matrix(.1 0 0 -.1 39.71 245.376)" id="text_12"><use xlink:href="#DejaVuSans-32"/><use x="63.623" xlink:href="#DejaVuSans-30"/><use x="127.246" xlink:href="#DejaVuSans-30"/><use x="190.869" xlink:href="#DejaVuSans-6b"/></g></g><g id="text_13"><defs><path d="M9.813 72.906h41.89v-8.312H19.672V43.109h28.906v-8.297H19.672V0h-9.86z" id="DejaVuSans-46"/><path d="M8.5 21.578v33.11h8.984V21.922q0-7.766 3.016-11.656 3.031-3.875 9.094-3.875 7.265 0 11.484 4.64 4.234 4.64 4.234 12.656v31h8.985V0h-8.984v8.406Q42.047 3.422 37.718 1q-4.313-2.422-10.032-2.422-9.421 0-14.312 5.86Q8.5 10.296 8.5 21.578zM31.11 56z" id="DejaVuSans-75"/></defs><g transform="matrix(0 -.1 -.1 0 14.798 263.163)"><use xlink:href="#DejaVuSans-46"/><use x="57.379" xlink:href="#DejaVuSans-61"/><use x="118.658" xlink:href="#DejaVuSans-75"/><use x="182.037" xlink:href="#DejaVuSans-6c"/><use x="209.82" xlink:href="#DejaVuSans-74"/><use x="249.029" xlink:href="#DejaVuSans-73"/></g></g></g><path clip-path="url(#pe6d4fa9c4a)" d="M96.953 270.637l6.473-1.036 6.472-1.566 9.708-2.95 3.238-1.439 3.236-.557 16.186-.039 3.236-.456 3.235-.244 3.236-.117 6.47-.716h3.236l6.472-.71h3.236l9.708-1.064 3.234-.001 6.473-.732h3.235l6.473-.712 3.237-.236 3.236-.119 6.473-.714h3.237l3.236-.966 3.235-.356 3.235-.007 9.707-1.067h3.236l6.47-.71h3.237l6.47-.712h3.236l9.708-1.105h3.236l6.473-.721 3.234-.006 9.706-1.065h3.236l6.47-.72 6.472-.357 6.47-.727h3.236l6.472-.724 3.236-.006 9.706-1.076h3.235l9.709-1.09 3.235-.015 6.471-.717h3.236l9.708-1.081h3.236l9.706-1.02 3.236-.069 6.471-.725h3.236l6.866-.717 3.235-.238 3.236-.117 6.47-.742h3.236l9.708-1.096 3.234-.003 6.473-.732 6.47-.359 6.471-.722h3.236l9.707-1.08h3.237l9.705-1.092h3.236l6.472-.728h3.235l9.707-1.124h3.235l9.706-1.025 3.236-.07 6.47-.728h3.236l9.71-1.08 3.236-.004 6.473-.736h3.235l9.71-1.072h3.235l6.472-.73 3.237-.006 9.707-1.129h3.236l3.236-.368 3.238-.504.507-.406h0" fill="none" stroke="#1f77b4" stroke-linecap="square" id="line2d_79"/><path clip-path="url(#pe6d4fa9c4a)" d="M96.953 270.582l3.236-.69 3.237-.404 3.236-.713 3.236-.806 3.236-.882 3.236-1.058 3.237-1.313 3.238-.672 3.239-1.03 3.245-.227 3.238-.005h6.477l3.236-.166 3.237-.437 3.237-.03 3.237-.183 3.241-.16 3.244-.04 3.24-.025 3.24-.564 3.243-.518 3.24-.038 3.24-.002 3.237-.004 3.244-.002 3.24-.003 3.24-.001 3.239-.002 3.238-.002h3.24l3.239-.003 3.236-.965.048-.001" fill="none" stroke="#ff7f0e" stroke-linecap="square" id="line2d_80"/></g><g id="axes_4"><g id="matplotlib.axis_7"><g id="xtick_28"><path clip-path="url(#p450655f579)" d="M96.953 335.835V286.27" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_81"/><use x="96.953" xlink:href="#m8a2061c7d3" y="335.835" fill="silver" stroke="silver" stroke-width=".8" id="line2d_82"/></g><g id="xtick_29"><path clip-path="url(#p450655f579)" d="M161.574 335.835V286.27" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_83"/><use x="161.574" xlink:href="#m8a2061c7d3" y="335.835" fill="silver" stroke="silver" stroke-width=".8" id="line2d_84"/></g><g id="xtick_30"><path clip-path="url(#p450655f579)" d="M226.195 335.835V286.27" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_85"/><use x="226.195" xlink:href="#m8a2061c7d3" y="335.835" fill="silver" stroke="silver" stroke-width=".8" id="line2d_86"/></g><g id="xtick_31"><path clip-path="url(#p450655f579)" d="M290.817 335.835V286.27" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_87"/><use x="290.817" xlink:href="#m8a2061c7d3" y="335.835" fill="silver" stroke="silver" stroke-width=".8" id="line2d_88"/></g><g id="xtick_32"><path clip-path="url(#p450655f579)" d="M355.438 335.835V286.27" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_89"/><use x="355.438" xlink:href="#m8a2061c7d3" y="335.835" fill="silver" stroke="silver" stroke-width=".8" id="line2d_90"/></g><g id="xtick_33"><path clip-path="url(#p450655f579)" d="M420.06 335.835V286.27" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_91"/><use x="420.059" xlink:href="#m8a2061c7d3" y="335.835" fill="silver" stroke="silver" stroke-width=".8" id="line2d_92"/></g><g id="xtick_34"><path clip-path="url(#p450655f579)" d="M484.68 335.835V286.27" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_93"/><use x="484.681" xlink:href="#m8a2061c7d3" y="335.835" fill="silver" stroke="silver" stroke-width=".8" id="line2d_94"/></g><g id="xtick_35"><path clip-path="url(#p450655f579)" d="M549.302 335.835V286.27" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_95"/><use x="549.302" xlink:href="#m8a2061c7d3" y="335.835" fill="silver" stroke="silver" stroke-width=".8" id="line2d_96"/></g><g id="xtick_36"><path clip-path="url(#p450655f579)" d="M613.923 335.835V286.27" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_97"/><use x="613.923" xlink:href="#m8a2061c7d3" y="335.835" fill="silver" stroke="silver" stroke-width=".8" id="line2d_98"/></g></g><g id="matplotlib.axis_8"><g id="ytick_9"><path clip-path="url(#p450655f579)" d="M71.59 333.597h558" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_99"/><use x="71.589" xlink:href="#m7f37620cfc" y="333.597" fill="silver" stroke="silver" stroke-width=".8" id="line2d_100"/><g transform="matrix(.1 0 0 -.1 52.436 337.396)" id="text_14"><use xlink:href="#DejaVuSans-30"/><use x="63.623" xlink:href="#DejaVuSans-6b"/></g></g><g id="ytick_10"><path clip-path="url(#p450655f579)" d="M71.59 308.743h558" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_101"/><use x="71.589" xlink:href="#m7f37620cfc" y="308.743" fill="silver" stroke="silver" stroke-width=".8" id="line2d_102"/><g transform="matrix(.1 0 0 -.1 46.073 312.542)" id="text_15"><use xlink:href="#DejaVuSans-31"/><use x="63.623" xlink:href="#DejaVuSans-30"/><use x="127.246" xlink:href="#DejaVuSans-6b"/></g></g><g id="text_16"><defs><path d="M48.781 52.594v-8.407q-3.812 2.11-7.64 3.157-3.828 1.047-7.735 1.047-8.75 0-13.593-5.547-4.829-5.532-4.829-15.547 0-10.016 4.829-15.563 4.843-5.53 13.593-5.53 3.907 0 7.735 1.046 3.828 1.047 7.64 3.156V2.094Q45.016.344 40.984-.531q-4.015-.89-8.562-.89-12.36 0-19.64 7.765-7.266 7.765-7.266 20.953 0 13.375 7.343 21.031Q20.22 56 33.016 56q4.14 0 8.093-.86 3.953-.843 7.672-2.546z" id="DejaVuSans-63"/></defs><g transform="matrix(0 -.1 -.1 0 14.798 333.265)"><use xlink:href="#DejaVuSans-53"/><use x="63.477" xlink:href="#DejaVuSans-77"/><use x="145.264" xlink:href="#DejaVuSans-69"/><use x="173.047" xlink:href="#DejaVuSans-74"/><use x="212.256" xlink:href="#DejaVuSans-63"/><use x="267.236" xlink:href="#DejaVuSans-68"/><use x="330.615" xlink:href="#DejaVuSans-65"/><use x="392.139" xlink:href="#DejaVuSans-73"/></g></g></g><path clip-path="url(#p450655f579)" d="M96.953 333.572l22.653-.184 6.474-.38 35.599-2.841 19.416-1.8 3.234-.248 3.236-.674 22.654-1.993 12.945-1.09 6.471-.563 9.707-.867 16.178-1.459 6.471-.562 16.18-1.446 3.235-.256 6.471-1.457 6.47-.569 55.007-4.893 16.177-1.452 6.473-.601 3.236-.246 6.47-1.64 29.516-2.55 19.414-1.778 19.413-1.705 3.235-.648 6.472-.552 19.413-1.705 6.472-.567 9.706-.84 3.235-.649 25.884-2.299 3.236-.243 3.236-.676 45.308-4.054 16.688-1.56h0" fill="none" stroke="#1f77b4" stroke-linecap="square" id="line2d_103"/><path clip-path="url(#p450655f579)" d="M96.953 333.582l3.236-.018 3.237-.02 3.236-.04 3.236-.056 3.236-.018 3.236-.022 3.237-.01 3.238-.025 3.239-.542 3.245-.243 3.238-.19 3.238-.213 3.239-.229 3.236-.275 3.237-.244 3.237-.244 3.237-.293 3.241-1.307 3.244-1.049 3.24-1.352 3.24-1.273 3.243-1.252 3.24-1.218 3.24-1.618 3.237-1.434 3.244-1.534 3.24-1.406 3.24-1.574 3.239-1.742 3.238-1.702 3.24-1.4 3.239-1.573 3.236-.397h.048" fill="none" stroke="#ff7f0e" stroke-linecap="square" id="line2d_104"/></g><g id="axes_5"><g id="matplotlib.axis_9"><g id="xtick_37"><path clip-path="url(#p1371aef0ed)" d="M96.953 398.78v-49.563" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_105"/><use x="96.953" xlink:href="#m8a2061c7d3" y="398.78" fill="silver" stroke="silver" stroke-width=".8" id="line2d_106"/><g transform="matrix(.1 0 0 -.1 86.396 413.378)" id="text_17"><use xlink:href="#DejaVuSans-30"/><use x="63.623" xlink:href="#DejaVuSans-2e"/><use x="95.41" xlink:href="#DejaVuSans-30"/><use x="159.033" xlink:href="#DejaVuSans-73"/></g></g><g id="xtick_38"><path clip-path="url(#p1371aef0ed)" d="M161.574 398.78v-49.563" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_107"/><use x="161.574" xlink:href="#m8a2061c7d3" y="398.78" fill="silver" stroke="silver" stroke-width=".8" id="line2d_108"/><g transform="matrix(.1 0 0 -.1 151.018 413.378)" id="text_18"><use xlink:href="#DejaVuSans-32"/><use x="63.623" xlink:href="#DejaVuSans-2e"/><use x="95.41" xlink:href="#DejaVuSans-30"/><use x="159.033" xlink:href="#DejaVuSans-73"/></g></g><g id="xtick_39"><path clip-path="url(#p1371aef0ed)" d="M226.195 398.78v-49.563" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_109"/><use x="226.195" xlink:href="#m8a2061c7d3" y="398.78" fill="silver" stroke="silver" stroke-width=".8" id="line2d_110"/><g id="text_19"><defs><path d="M37.797 64.313L12.89 25.39h24.906zm-2.594 8.593H47.61V25.391h10.407v-8.203H47.609V0h-9.812v17.188H4.89v9.515z" id="DejaVuSans-34"/></defs><g transform="matrix(.1 0 0 -.1 215.64 413.378)"><use xlink:href="#DejaVuSans-34"/><use x="63.623" xlink:href="#DejaVuSans-2e"/><use x="95.41" xlink:href="#DejaVuSans-30"/><use x="159.033" xlink:href="#DejaVuSans-73"/></g></g></g><g id="xtick_40"><path clip-path="url(#p1371aef0ed)" d="M290.817 398.78v-49.563" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_111"/><use x="290.817" xlink:href="#m8a2061c7d3" y="398.78" fill="silver" stroke="silver" stroke-width=".8" id="line2d_112"/><g transform="matrix(.1 0 0 -.1 280.26 413.378)" id="text_20"><use xlink:href="#DejaVuSans-36"/><use x="63.623" xlink:href="#DejaVuSans-2e"/><use x="95.41" xlink:href="#DejaVuSans-30"/><use x="159.033" xlink:href="#DejaVuSans-73"/></g></g><g id="xtick_41"><path clip-path="url(#p1371aef0ed)" d="M355.438 398.78v-49.563" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_113"/><use x="355.438" xlink:href="#m8a2061c7d3" y="398.78" fill="silver" stroke="silver" stroke-width=".8" id="line2d_114"/><g transform="matrix(.1 0 0 -.1 344.882 413.378)" id="text_21"><use xlink:href="#DejaVuSans-38"/><use x="63.623" xlink:href="#DejaVuSans-2e"/><use x="95.41" xlink:href="#DejaVuSans-30"/><use x="159.033" xlink:href="#DejaVuSans-73"/></g></g><g id="xtick_42"><path clip-path="url(#p1371aef0ed)" d="M420.06 398.78v-49.563" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_115"/><use x="420.059" xlink:href="#m8a2061c7d3" y="398.78" fill="silver" stroke="silver" stroke-width=".8" id="line2d_116"/><g transform="matrix(.1 0 0 -.1 406.322 413.378)" id="text_22"><use xlink:href="#DejaVuSans-31"/><use x="63.623" xlink:href="#DejaVuSans-30"/><use x="127.246" xlink:href="#DejaVuSans-2e"/><use x="159.033" xlink:href="#DejaVuSans-30"/><use x="222.656" xlink:href="#DejaVuSans-73"/></g></g><g id="xtick_43"><path clip-path="url(#p1371aef0ed)" d="M484.68 398.78v-49.563" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_117"/><use x="484.681" xlink:href="#m8a2061c7d3" y="398.78" fill="silver" stroke="silver" stroke-width=".8" id="line2d_118"/><g transform="matrix(.1 0 0 -.1 470.943 413.378)" id="text_23"><use xlink:href="#DejaVuSans-31"/><use x="63.623" xlink:href="#DejaVuSans-32"/><use x="127.246" xlink:href="#DejaVuSans-2e"/><use x="159.033" xlink:href="#DejaVuSans-30"/><use x="222.656" xlink:href="#DejaVuSans-73"/></g></g><g id="xtick_44"><path clip-path="url(#p1371aef0ed)" d="M549.302 398.78v-49.563" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_119"/><use x="549.302" xlink:href="#m8a2061c7d3" y="398.78" fill="silver" stroke="silver" stroke-width=".8" id="line2d_120"/><g transform="matrix(.1 0 0 -.1 535.564 413.378)" id="text_24"><use xlink:href="#DejaVuSans-31"/><use x="63.623" xlink:href="#DejaVuSans-34"/><use x="127.246" xlink:href="#DejaVuSans-2e"/><use x="159.033" xlink:href="#DejaVuSans-30"/><use x="222.656" xlink:href="#DejaVuSans-73"/></g></g><g id="xtick_45"><path clip-path="url(#p1371aef0ed)" d="M613.923 398.78v-49.563" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_121"/><use x="613.923" xlink:href="#m8a2061c7d3" y="398.78" fill="silver" stroke="silver" stroke-width=".8" id="line2d_122"/><g transform="matrix(.1 0 0 -.1 600.186 413.378)" id="text_25"><use xlink:href="#DejaVuSans-31"/><use x="63.623" xlink:href="#DejaVuSans-36"/><use x="127.246" xlink:href="#DejaVuSans-2e"/><use x="159.033" xlink:href="#DejaVuSans-30"/><use x="222.656" xlink:href="#DejaVuSans-73"/></g></g><g id="text_26"><defs><path d="M-.297 72.906h61.672v-8.312H35.5V0h-9.906v64.594H-.296z" id="DejaVuSans-54"/><path d="M52 44.188q3.375 6.062 8.063 8.937Q64.75 56 71.093 56q8.548 0 13.188-5.984 4.64-5.97 4.64-17V0h-9.03v32.719q0 7.86-2.797 11.656-2.781 3.813-8.485 3.813-6.984 0-11.046-4.641-4.047-4.625-4.047-12.64V0h-9.032v32.719q0 7.906-2.78 11.687-2.782 3.782-8.595 3.782-6.89 0-10.953-4.657-4.047-4.656-4.047-12.625V0H9.08v54.688h9.03v-8.5q3.078 5.03 7.375 7.421Q29.781 56 35.687 56q5.97 0 10.141-3.031Q50 49.953 52 44.187z" id="DejaVuSans-6d"/></defs><g transform="matrix(.1 0 0 -.1 338.202 427.057)"><use xlink:href="#DejaVuSans-54"/><use x="61.037" xlink:href="#DejaVuSans-69"/><use x="88.82" xlink:href="#DejaVuSans-6d"/><use x="186.232" xlink:href="#DejaVuSans-65"/></g></g></g><g id="matplotlib.axis_10"><g id="ytick_11"><path clip-path="url(#p1371aef0ed)" d="M71.59 396.527h558" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_123"/><use x="71.589" xlink:href="#m7f37620cfc" y="396.527" fill="silver" stroke="silver" stroke-width=".8" id="line2d_124"/><use xlink:href="#DejaVuSans-30" transform="matrix(.1 0 0 -.1 58.227 400.326)" id="text_27"/></g><g id="ytick_12"><path clip-path="url(#p1371aef0ed)" d="M71.59 371.743h558" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_125"/><use x="71.589" xlink:href="#m7f37620cfc" y="371.743" fill="silver" stroke="silver" stroke-width=".8" id="line2d_126"/><g transform="matrix(.1 0 0 -.1 45.502 375.542)" id="text_28"><use xlink:href="#DejaVuSans-35"/><use x="63.623" xlink:href="#DejaVuSans-30"/><use x="127.246" xlink:href="#DejaVuSans-30"/></g></g><g id="text_29"><defs><path d="M41.11 46.297q-1.516.875-3.297 1.281Q36.03 48 33.89 48q-7.625 0-11.703-4.953-4.079-4.953-4.079-14.234V0H9.08v54.688h9.03v-8.5q2.844 4.984 7.375 7.39Q30.031 56 36.531 56q.922 0 2.047-.125 1.125-.11 2.484-.36z" id="DejaVuSans-72"/></defs><g transform="matrix(0 -.1 -.1 0 14.798 400.177)"><use xlink:href="#DejaVuSans-4d"/><use x="86.279" xlink:href="#DejaVuSans-69"/><use x="114.063" xlink:href="#DejaVuSans-67"/><use x="177.539" xlink:href="#DejaVuSans-72"/><use x="218.652" xlink:href="#DejaVuSans-61"/><use x="279.932" xlink:href="#DejaVuSans-74"/><use x="319.141" xlink:href="#DejaVuSans-69"/><use x="346.924" xlink:href="#DejaVuSans-6f"/><use x="408.105" xlink:href="#DejaVuSans-6e"/><use x="471.484" xlink:href="#DejaVuSans-73"/></g></g></g><path clip-path="url(#p1371aef0ed)" d="M96.953 396.527h29.127l3.236-.694 6.474-.942 6.476-.198 3.236-.297 3.235-.1 6.47-.892 3.236-.099 3.236-.248 3.236-.396 3.236-.1 16.178-1.536 3.236-.545 9.708-.744 3.237-.446 6.473-.396 12.946-.793 6.47-.05 3.236-.446 12.942-.992 3.236-.099 12.942-1.338 6.472-1.14 6.472-.595 6.473-.892 3.234-.149 3.237-.694 3.234-.495 3.235-.1 6.47-.694 12.943-1.09 3.236-.397 6.47-1.09 3.237-.347 6.472-.446 3.234-.347 3.236-.198 3.235-.447 6.473-.495 3.236-.1 3.235-.495 3.236-.694 3.235-.149 3.236-.396 3.235-.595 3.237-.297 3.236-.15 3.236-.445 3.236-.1 32.75-3.073 3.236-.446 3.234-.05 3.236-.247 3.236-.446 22.65-1.983 3.235-.545 6.471-.595 3.236-.644 3.235-.298 6.473-.248 3.236-.694 3.234-.248 3.235-.099 3.236-.347 3.236-.495 3.236-.1 3.235-.396 3.235-.149 6.472-.793 3.235-.347 6.47-1.14 16.178-.694 3.236-.396 6.474-.298 6.472-1.19h3.237l3.235-.247 6.473-1.289 3.237-.198 3.235-.347 3.236-.496 6.473-.496 3.236-.446 3.235-.297 3.236-.05 10.217-.842h0" fill="none" stroke="#1f77b4" stroke-linecap="square" id="line2d_127"/><path clip-path="url(#p1371aef0ed)" d="M96.953 396.478H122.845l3.239-.05 3.245-.149 3.238-.05h6.477l3.236-.297h9.711l3.241-.248 3.244-.05h3.24l3.24-.098h3.243l3.24-.05 3.24-.149 3.237-.05 3.244-.098h3.24l3.24-.1h3.239l3.238-.049h6.479l3.236-.1h.048" fill="none" stroke="#ff7f0e" stroke-linecap="square" id="line2d_128"/></g></g><defs><clipPath id="p84a90af7d1"><path d="M71.589 10.7h558v136.299h-558z"/></clipPath><clipPath id="p2b159da72d"><path d="M71.589 160.381h558v49.563h-558z"/></clipPath><clipPath id="pe6d4fa9c4a"><path d="M71.589 223.326h558v49.563h-558z"/></clipPath><clipPath id="p450655f579"><path d="M71.589 286.271h558v49.563h-558z"/></clipPath><clipPath id="p1371aef0ed"><path d="M71.589 349.217h558v49.563h-558z"/></clipPath></defs></svg>����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mitogen-0.3.9/docs/images/ansible/pcaps/loop-100-items-local.svg������������������������������������0000664�0000000�0000000�00000106761�14656664731�0024341�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<svg height="360" viewBox="0 0 696 270" width="928" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><style>*{stroke-linecap:butt;stroke-linejoin:round}</style></defs><g id="figure_1"><path d="M0 270.016h696.09V0H0z" fill="#fff" id="patch_1"/><g id="axes_1"><g id="matplotlib.axis_1"><g id="xtick_1"><path clip-path="url(#pee29df804a)" d="M99.49 232.46V10.7" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_1"/><g id="line2d_2"><defs><path d="M0 0v3.5" id="ma4b67352d6" stroke="silver" stroke-width=".8"/></defs><use x="99.489" xlink:href="#ma4b67352d6" y="232.46" fill="silver" stroke="silver" stroke-width=".8"/></g><g id="text_1"><defs><path d="M31.781 66.406q-7.61 0-11.453-7.5Q16.5 51.422 16.5 36.375q0-14.984 3.828-22.484 3.844-7.5 11.453-7.5 7.672 0 11.5 7.5 3.844 7.5 3.844 22.484 0 15.047-3.844 22.531-3.828 7.5-11.5 7.5zm0 7.813q12.266 0 18.735-9.703 6.468-9.688 6.468-28.141 0-18.406-6.468-28.11-6.47-9.687-18.735-9.687-12.25 0-18.718 9.688-6.47 9.703-6.47 28.109 0 18.453 6.47 28.14Q19.53 74.22 31.78 74.22z" id="DejaVuSans-30"/><path d="M10.688 12.406H21V0H10.687z" id="DejaVuSans-2e"/><path d="M44.281 53.078v-8.5q-3.797 1.953-7.906 2.922-4.094.984-8.5.984-6.688 0-10.031-2.047-3.344-2.046-3.344-6.156 0-3.125 2.39-4.906 2.391-1.781 9.626-3.39l3.078-.688q9.562-2.047 13.593-5.781 4.032-3.735 4.032-10.422 0-7.625-6.032-12.078-6.03-4.438-16.578-4.438-4.39 0-9.156.86Q10.688.296 5.422 2v9.281q4.984-2.594 9.812-3.89 4.829-1.282 9.579-1.282 6.343 0 9.75 2.172 3.421 2.172 3.421 6.125 0 3.656-2.468 5.61-2.453 1.953-10.813 3.765l-3.125.735q-8.344 1.75-12.062 5.39-3.704 3.64-3.704 9.985 0 7.718 5.47 11.906Q16.75 56 26.811 56q4.97 0 9.36-.734 4.406-.72 8.11-2.188z" id="DejaVuSans-73"/></defs><g transform="matrix(.1 0 0 -.1 88.933 247.058)"><use xlink:href="#DejaVuSans-30"/><use x="63.623" xlink:href="#DejaVuSans-2e"/><use x="95.41" xlink:href="#DejaVuSans-30"/><use x="159.033" xlink:href="#DejaVuSans-73"/></g></g></g><g id="xtick_2"><path clip-path="url(#pee29df804a)" d="M176.56 232.46V10.7" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_3"/><use x="176.561" xlink:href="#ma4b67352d6" y="232.46" fill="silver" stroke="silver" stroke-width=".8" id="line2d_4"/><g id="text_2"><defs><path d="M19.188 8.297h34.421V0H7.33v8.297q5.609 5.812 15.296 15.594 9.703 9.797 12.188 12.64 4.734 5.313 6.609 9 1.89 3.688 1.89 7.25 0 5.813-4.078 9.469-4.078 3.672-10.625 3.672-4.64 0-9.797-1.61-5.14-1.609-11-4.89v9.969Q13.767 71.78 18.938 73q5.188 1.219 9.485 1.219 11.328 0 18.062-5.672 6.735-5.656 6.735-15.125 0-4.5-1.688-8.531-1.672-4.016-6.125-9.485-1.218-1.422-7.765-8.187-6.532-6.766-18.453-18.922z" id="DejaVuSans-32"/><path d="M10.797 72.906h38.719v-8.312H19.828v-17.86q2.14.735 4.281 1.094 2.157.36 4.313.36 12.203 0 19.328-6.688 7.14-6.688 7.14-18.11 0-11.765-7.328-18.296-7.328-6.516-20.656-6.516-4.593 0-9.36.781-4.75.782-9.827 2.344v9.922q4.39-2.39 9.078-3.563 4.687-1.171 9.906-1.171 8.453 0 13.375 4.437 4.938 4.438 4.938 12.063 0 7.609-4.938 12.047-4.922 4.453-13.375 4.453-3.953 0-7.89-.875-3.922-.875-8.016-2.735z" id="DejaVuSans-35"/></defs><g transform="matrix(.1 0 0 -.1 166.005 247.058)"><use xlink:href="#DejaVuSans-32"/><use x="63.623" xlink:href="#DejaVuSans-2e"/><use x="95.41" xlink:href="#DejaVuSans-35"/><use x="159.033" xlink:href="#DejaVuSans-73"/></g></g></g><g id="xtick_3"><path clip-path="url(#pee29df804a)" d="M253.633 232.46V10.7" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_5"/><use x="253.633" xlink:href="#ma4b67352d6" y="232.46" fill="silver" stroke="silver" stroke-width=".8" id="line2d_6"/><g transform="matrix(.1 0 0 -.1 243.076 247.058)" id="text_3"><use xlink:href="#DejaVuSans-35"/><use x="63.623" xlink:href="#DejaVuSans-2e"/><use x="95.41" xlink:href="#DejaVuSans-30"/><use x="159.033" xlink:href="#DejaVuSans-73"/></g></g><g id="xtick_4"><path clip-path="url(#pee29df804a)" d="M330.705 232.46V10.7" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_7"/><use x="330.705" xlink:href="#ma4b67352d6" y="232.46" fill="silver" stroke="silver" stroke-width=".8" id="line2d_8"/><g id="text_4"><defs><path d="M8.203 72.906h46.875v-4.203L28.61 0H18.312L43.22 64.594H8.203z" id="DejaVuSans-37"/></defs><g transform="matrix(.1 0 0 -.1 320.148 247.058)"><use xlink:href="#DejaVuSans-37"/><use x="63.623" xlink:href="#DejaVuSans-2e"/><use x="95.41" xlink:href="#DejaVuSans-35"/><use x="159.033" xlink:href="#DejaVuSans-73"/></g></g></g><g id="xtick_5"><path clip-path="url(#pee29df804a)" d="M407.776 232.46V10.7" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_9"/><use x="407.776" xlink:href="#ma4b67352d6" y="232.46" fill="silver" stroke="silver" stroke-width=".8" id="line2d_10"/><g id="text_5"><defs><path d="M12.406 8.297h16.11v55.625l-17.532-3.516v8.985l17.438 3.515h9.86V8.296H54.39V0H12.406z" id="DejaVuSans-31"/></defs><g transform="matrix(.1 0 0 -.1 394.039 247.058)"><use xlink:href="#DejaVuSans-31"/><use x="63.623" xlink:href="#DejaVuSans-30"/><use x="127.246" xlink:href="#DejaVuSans-2e"/><use x="159.033" xlink:href="#DejaVuSans-30"/><use x="222.656" xlink:href="#DejaVuSans-73"/></g></g></g><g id="xtick_6"><path clip-path="url(#pee29df804a)" d="M484.848 232.46V10.7" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_11"/><use x="484.848" xlink:href="#ma4b67352d6" y="232.46" fill="silver" stroke="silver" stroke-width=".8" id="line2d_12"/><g transform="matrix(.1 0 0 -.1 471.11 247.058)" id="text_6"><use xlink:href="#DejaVuSans-31"/><use x="63.623" xlink:href="#DejaVuSans-32"/><use x="127.246" xlink:href="#DejaVuSans-2e"/><use x="159.033" xlink:href="#DejaVuSans-35"/><use x="222.656" xlink:href="#DejaVuSans-73"/></g></g><g id="xtick_7"><path clip-path="url(#pee29df804a)" d="M561.92 232.46V10.7" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_13"/><use x="561.92" xlink:href="#ma4b67352d6" y="232.46" fill="silver" stroke="silver" stroke-width=".8" id="line2d_14"/><g transform="matrix(.1 0 0 -.1 548.183 247.058)" id="text_7"><use xlink:href="#DejaVuSans-31"/><use x="63.623" xlink:href="#DejaVuSans-35"/><use x="127.246" xlink:href="#DejaVuSans-2e"/><use x="159.033" xlink:href="#DejaVuSans-30"/><use x="222.656" xlink:href="#DejaVuSans-73"/></g></g><g id="xtick_8"><path clip-path="url(#pee29df804a)" d="M638.992 232.46V10.7" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_15"/><use x="638.992" xlink:href="#ma4b67352d6" y="232.46" fill="silver" stroke="silver" stroke-width=".8" id="line2d_16"/><g transform="matrix(.1 0 0 -.1 625.254 247.058)" id="text_8"><use xlink:href="#DejaVuSans-31"/><use x="63.623" xlink:href="#DejaVuSans-37"/><use x="127.246" xlink:href="#DejaVuSans-2e"/><use x="159.033" xlink:href="#DejaVuSans-35"/><use x="222.656" xlink:href="#DejaVuSans-73"/></g></g><g id="text_9"><defs><path d="M-.297 72.906h61.672v-8.312H35.5V0h-9.906v64.594H-.296z" id="DejaVuSans-54"/><path d="M9.422 54.688h8.984V0H9.422zm0 21.296h8.984v-11.39H9.422z" id="DejaVuSans-69"/><path d="M52 44.188q3.375 6.062 8.063 8.937Q64.75 56 71.093 56q8.548 0 13.188-5.984 4.64-5.97 4.64-17V0h-9.03v32.719q0 7.86-2.797 11.656-2.781 3.813-8.485 3.813-6.984 0-11.046-4.641-4.047-4.625-4.047-12.64V0h-9.032v32.719q0 7.906-2.78 11.687-2.782 3.782-8.595 3.782-6.89 0-10.953-4.657-4.047-4.656-4.047-12.625V0H9.08v54.688h9.03v-8.5q3.078 5.03 7.375 7.421Q29.781 56 35.687 56q5.97 0 10.141-3.031Q50 49.953 52 44.187z" id="DejaVuSans-6d"/><path d="M56.203 29.594v-4.39H14.891q.593-9.282 5.593-14.142 5-4.859 13.938-4.859 5.172 0 10.031 1.266 4.86 1.265 9.656 3.812v-8.5Q49.266.734 44.187-.344 39.11-1.422 33.892-1.422q-13.094 0-20.735 7.61-7.64 7.625-7.64 20.625 0 13.421 7.25 21.296Q20.016 56 32.328 56q11.031 0 17.453-7.11 6.422-7.093 6.422-19.296zm-8.984 2.64q-.094 7.36-4.125 11.75-4.032 4.407-10.672 4.407-7.516 0-12.031-4.25-4.516-4.25-5.203-11.97z" id="DejaVuSans-65"/></defs><g transform="matrix(.1 0 0 -.1 366.102 260.737)"><use xlink:href="#DejaVuSans-54"/><use x="61.037" xlink:href="#DejaVuSans-69"/><use x="88.82" xlink:href="#DejaVuSans-6d"/><use x="186.232" xlink:href="#DejaVuSans-65"/></g></g></g><g id="matplotlib.axis_2"><g id="ytick_1"><path clip-path="url(#pee29df804a)" d="M71.59 222.38h613.8" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_17"/><g id="line2d_18"><defs><path d="M0 0h-3.5" id="m65261853ca" stroke="silver" stroke-width=".8"/></defs><use x="71.589" xlink:href="#m65261853ca" y="222.38" fill="silver" stroke="silver" stroke-width=".8"/></g><g id="text_10"><defs><path d="M9.813 72.906h14.703l18.593-49.61 18.703 49.61h14.704V0H66.89v64.016l-18.797-50h-9.907l-18.796 50V0H9.813z" id="DejaVuSans-4d"/><path d="M19.672 34.813V8.108H35.5q7.953 0 11.781 3.297 3.844 3.297 3.844 10.078 0 6.844-3.844 10.078-3.828 3.25-11.781 3.25zm0 29.984V42.828h14.61q7.218 0 10.75 2.703 3.546 2.719 3.546 8.282 0 5.515-3.547 8.25-3.531 2.734-10.75 2.734zm-9.86 8.11h25.204q11.28 0 17.375-4.688Q58.5 63.53 58.5 54.89q0-6.703-3.125-10.657-3.125-3.953-9.188-4.922 7.282-1.562 11.313-6.53 4.031-4.954 4.031-12.376 0-9.765-6.64-15.093Q48.25 0 35.984 0H9.812z" id="DejaVuSans-42"/></defs><g transform="matrix(.1 0 0 -.1 20.878 226.18)"><use xlink:href="#DejaVuSans-30"/><use x="63.623" xlink:href="#DejaVuSans-2e"/><use x="95.41" xlink:href="#DejaVuSans-30"/><use x="159.033" xlink:href="#DejaVuSans-30"/><use x="222.656" xlink:href="#DejaVuSans-20"/><use x="254.443" xlink:href="#DejaVuSans-4d"/><use x="340.723" xlink:href="#DejaVuSans-69"/><use x="368.506" xlink:href="#DejaVuSans-42"/></g></g></g><g id="ytick_2"><path clip-path="url(#pee29df804a)" d="M71.59 192.859h613.8" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_19"/><use x="71.589" xlink:href="#m65261853ca" y="192.859" fill="silver" stroke="silver" stroke-width=".8" id="line2d_20"/><g id="text_11"><defs><path d="M10.984 1.516V10.5q3.72-1.766 7.516-2.688 3.813-.921 7.484-.921 9.766 0 14.907 6.562 5.156 6.563 5.89 19.953-2.828-4.203-7.187-6.453-4.344-2.25-9.61-2.25-10.937 0-17.312 6.61-6.375 6.625-6.375 18.109 0 11.219 6.64 18 6.641 6.797 17.672 6.797 12.657 0 19.313-9.703 6.672-9.688 6.672-28.141 0-17.234-8.188-27.516Q40.234-1.42 26.422-1.42q-3.719 0-7.531.734-3.797.734-7.907 2.203zM30.61 32.422q6.641 0 10.516 4.531 3.89 4.547 3.89 12.469 0 7.86-3.89 12.422-3.875 4.562-10.516 4.562-6.64 0-10.515-4.562-3.875-4.563-3.875-12.422 0-7.922 3.875-12.469 3.875-4.531 10.515-4.531z" id="DejaVuSans-39"/></defs><g transform="matrix(.1 0 0 -.1 20.878 196.658)"><use xlink:href="#DejaVuSans-30"/><use x="63.623" xlink:href="#DejaVuSans-2e"/><use x="95.41" xlink:href="#DejaVuSans-39"/><use x="159.033" xlink:href="#DejaVuSans-35"/><use x="222.656" xlink:href="#DejaVuSans-20"/><use x="254.443" xlink:href="#DejaVuSans-4d"/><use x="340.723" xlink:href="#DejaVuSans-69"/><use x="368.506" xlink:href="#DejaVuSans-42"/></g></g></g><g id="ytick_3"><path clip-path="url(#pee29df804a)" d="M71.59 163.338h613.8" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_21"/><use x="71.589" xlink:href="#m65261853ca" y="163.338" fill="silver" stroke="silver" stroke-width=".8" id="line2d_22"/><g transform="matrix(.1 0 0 -.1 20.878 167.137)" id="text_12"><use xlink:href="#DejaVuSans-31"/><use x="63.623" xlink:href="#DejaVuSans-2e"/><use x="95.41" xlink:href="#DejaVuSans-39"/><use x="159.033" xlink:href="#DejaVuSans-31"/><use x="222.656" xlink:href="#DejaVuSans-20"/><use x="254.443" xlink:href="#DejaVuSans-4d"/><use x="340.723" xlink:href="#DejaVuSans-69"/><use x="368.506" xlink:href="#DejaVuSans-42"/></g></g><g id="ytick_4"><path clip-path="url(#pee29df804a)" d="M71.59 133.817h613.8" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_23"/><use x="71.589" xlink:href="#m65261853ca" y="133.817" fill="silver" stroke="silver" stroke-width=".8" id="line2d_24"/><g id="text_13"><defs><path d="M31.781 34.625q-7.031 0-11.062-3.766-4.016-3.765-4.016-10.343 0-6.594 4.016-10.36Q24.75 6.391 31.78 6.391q7.032 0 11.078 3.78 4.063 3.798 4.063 10.345 0 6.578-4.031 10.343-4.016 3.766-11.11 3.766zm-9.86 4.188q-6.343 1.562-9.89 5.906Q8.5 49.079 8.5 55.329q0 8.733 6.219 13.812 6.234 5.078 17.062 5.078 10.89 0 17.094-5.078 6.203-5.079 6.203-13.813 0-6.25-3.547-10.61-3.531-4.343-9.828-5.906 7.125-1.656 11.094-6.5 3.984-4.828 3.984-11.796 0-10.61-6.468-16.282-6.47-5.656-18.532-5.656-12.047 0-18.531 5.656-6.469 5.672-6.469 16.282 0 6.968 4 11.797 4.016 4.843 11.14 6.5zM18.314 54.39q0-5.657 3.53-8.828 3.548-3.172 9.938-3.172 6.36 0 9.938 3.172 3.593 3.171 3.593 8.828 0 5.672-3.593 8.843-3.578 3.172-9.938 3.172-6.39 0-9.937-3.172-3.532-3.172-3.532-8.843z" id="DejaVuSans-38"/><path d="M33.016 40.375q-6.641 0-10.532-4.547-3.875-4.531-3.875-12.437 0-7.86 3.875-12.438 3.891-4.562 10.532-4.562 6.64 0 10.515 4.562 3.875 4.578 3.875 12.438 0 7.906-3.875 12.437-3.875 4.547-10.515 4.547zm19.578 30.922v-8.984q-3.719 1.75-7.5 2.671-3.782.938-7.5.938-9.766 0-14.922-6.594-5.14-6.594-5.875-19.922 2.875 4.25 7.219 6.516 4.359 2.266 9.578 2.266 10.984 0 17.36-6.672 6.374-6.657 6.374-18.125 0-11.235-6.64-18.032-6.641-6.78-17.672-6.78-12.657 0-19.344 9.687-6.688 9.703-6.688 28.109 0 17.281 8.204 27.563 8.203 10.28 22.015 10.28 3.719 0 7.5-.734t7.89-2.187z" id="DejaVuSans-36"/></defs><g transform="matrix(.1 0 0 -.1 20.878 137.616)"><use xlink:href="#DejaVuSans-32"/><use x="63.623" xlink:href="#DejaVuSans-2e"/><use x="95.41" xlink:href="#DejaVuSans-38"/><use x="159.033" xlink:href="#DejaVuSans-36"/><use x="222.656" xlink:href="#DejaVuSans-20"/><use x="254.443" xlink:href="#DejaVuSans-4d"/><use x="340.723" xlink:href="#DejaVuSans-69"/><use x="368.506" xlink:href="#DejaVuSans-42"/></g></g></g><g id="ytick_5"><path clip-path="url(#pee29df804a)" d="M71.59 104.295h613.8" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_25"/><use x="71.589" xlink:href="#m65261853ca" y="104.295" fill="silver" stroke="silver" stroke-width=".8" id="line2d_26"/><g id="text_14"><defs><path d="M40.578 39.313Q47.656 37.797 51.625 33q3.984-4.781 3.984-11.813 0-10.78-7.422-16.703-7.421-5.906-21.093-5.906-4.578 0-9.438.906-4.86.907-10.031 2.72v9.515q4.094-2.39 8.969-3.61 4.89-1.218 10.218-1.218 9.266 0 14.125 3.656 4.86 3.656 4.86 10.64 0 6.454-4.516 10.079-4.515 3.64-12.562 3.64h-8.5v8.11h8.89q7.266 0 11.125 2.906 3.86 2.906 3.86 8.375 0 5.61-3.985 8.61-3.968 3.015-11.39 3.015-4.063 0-8.703-.89-4.641-.876-10.203-2.72v8.782q5.624 1.562 10.53 2.344 4.907.78 9.25.78 11.235 0 17.766-5.109 6.547-5.093 6.547-13.78 0-6.063-3.468-10.235-3.47-4.172-9.86-5.782z" id="DejaVuSans-33"/></defs><g transform="matrix(.1 0 0 -.1 20.878 108.095)"><use xlink:href="#DejaVuSans-33"/><use x="63.623" xlink:href="#DejaVuSans-2e"/><use x="95.41" xlink:href="#DejaVuSans-38"/><use x="159.033" xlink:href="#DejaVuSans-31"/><use x="222.656" xlink:href="#DejaVuSans-20"/><use x="254.443" xlink:href="#DejaVuSans-4d"/><use x="340.723" xlink:href="#DejaVuSans-69"/><use x="368.506" xlink:href="#DejaVuSans-42"/></g></g></g><g id="ytick_6"><path clip-path="url(#pee29df804a)" d="M71.59 74.774h613.8" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_27"/><use x="71.589" xlink:href="#m65261853ca" y="74.774" fill="silver" stroke="silver" stroke-width=".8" id="line2d_28"/><g id="text_15"><defs><path d="M37.797 64.313L12.89 25.39h24.906zm-2.594 8.593H47.61V25.391h10.407v-8.203H47.609V0h-9.812v17.188H4.89v9.515z" id="DejaVuSans-34"/></defs><g transform="matrix(.1 0 0 -.1 20.878 78.574)"><use xlink:href="#DejaVuSans-34"/><use x="63.623" xlink:href="#DejaVuSans-2e"/><use x="95.41" xlink:href="#DejaVuSans-37"/><use x="159.033" xlink:href="#DejaVuSans-37"/><use x="222.656" xlink:href="#DejaVuSans-20"/><use x="254.443" xlink:href="#DejaVuSans-4d"/><use x="340.723" xlink:href="#DejaVuSans-69"/><use x="368.506" xlink:href="#DejaVuSans-42"/></g></g></g><g id="ytick_7"><path clip-path="url(#pee29df804a)" d="M71.59 45.253h613.8" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_29"/><use x="71.589" xlink:href="#m65261853ca" y="45.253" fill="silver" stroke="silver" stroke-width=".8" id="line2d_30"/><g transform="matrix(.1 0 0 -.1 20.878 49.052)" id="text_16"><use xlink:href="#DejaVuSans-35"/><use x="63.623" xlink:href="#DejaVuSans-2e"/><use x="95.41" xlink:href="#DejaVuSans-37"/><use x="159.033" xlink:href="#DejaVuSans-32"/><use x="222.656" xlink:href="#DejaVuSans-20"/><use x="254.443" xlink:href="#DejaVuSans-4d"/><use x="340.723" xlink:href="#DejaVuSans-69"/><use x="368.506" xlink:href="#DejaVuSans-42"/></g></g><g id="ytick_8"><path clip-path="url(#pee29df804a)" d="M71.59 15.732h613.8" fill="none" stroke="#b0b0b0" stroke-linecap="square" stroke-width=".8" id="line2d_31"/><use x="71.589" xlink:href="#m65261853ca" y="15.732" fill="silver" stroke="silver" stroke-width=".8" id="line2d_32"/><g transform="matrix(.1 0 0 -.1 20.878 19.531)" id="text_17"><use xlink:href="#DejaVuSans-36"/><use x="63.623" xlink:href="#DejaVuSans-2e"/><use x="95.41" xlink:href="#DejaVuSans-36"/><use x="159.033" xlink:href="#DejaVuSans-38"/><use x="222.656" xlink:href="#DejaVuSans-20"/><use x="254.443" xlink:href="#DejaVuSans-4d"/><use x="340.723" xlink:href="#DejaVuSans-69"/><use x="368.506" xlink:href="#DejaVuSans-42"/></g></g><g id="text_18"><defs><path d="M34.281 27.484q-10.89 0-15.093-2.484-4.204-2.484-4.204-8.5 0-4.781 3.157-7.594 3.156-2.797 8.562-2.797 7.485 0 12 5.297 4.516 5.297 4.516 14.078v2zm17.922 3.72V0H43.22v8.297Q40.14 3.328 35.547.953q-4.594-2.375-11.234-2.375-8.391 0-13.36 4.719Q6 8.016 6 15.922q0 9.219 6.172 13.906 6.187 4.688 18.437 4.688h12.61v.89q0 6.203-4.078 9.594-4.078 3.39-11.453 3.39-4.688 0-9.141-1.124-4.438-1.125-8.531-3.375v8.312q4.921 1.906 9.562 2.844 4.64.953 9.031.953 11.875 0 17.735-6.156 5.86-6.14 5.86-18.64z" id="DejaVuSans-61"/><path d="M54.89 33.016V0h-8.984v32.719q0 7.765-3.031 11.61-3.031 3.858-9.078 3.858-7.281 0-11.484-4.64-4.204-4.625-4.204-12.64V0H9.08v54.688h9.03v-8.5q3.235 4.937 7.594 7.374Q30.078 56 35.797 56q9.422 0 14.25-5.828 4.844-5.828 4.844-17.156z" id="DejaVuSans-6e"/><path d="M45.406 46.39v29.594h8.985V0h-8.985v8.203Q42.578 3.328 38.25.953q-4.313-2.375-10.375-2.375-9.906 0-16.14 7.906-6.22 7.922-6.22 20.813 0 12.89 6.22 20.797Q17.968 56 27.874 56q6.063 0 10.375-2.375 4.328-2.36 7.156-7.234zm-30.61-19.093q0-9.906 4.079-15.547 4.078-5.64 11.203-5.64 7.125 0 11.219 5.64 4.11 5.64 4.11 15.547 0 9.906-4.11 15.547-4.094 5.64-11.219 5.64-7.125 0-11.203-5.64-4.078-5.64-4.078-15.547z" id="DejaVuSans-64"/><path d="M4.203 54.688h8.985l11.234-42.672 11.172 42.672h10.593l11.235-42.672 11.187 42.672h8.985L63.28 0H52.688L40.922 44.828 29.109 0H18.5z" id="DejaVuSans-77"/><path d="M18.313 70.219V54.688h18.5v-6.985h-18.5V18.016q0-6.688 1.828-8.594 1.828-1.906 7.453-1.906h9.218V0h-9.218q-10.407 0-14.36 3.875-3.953 3.89-3.953 14.14v29.688H2.687v6.984h6.594V70.22z" id="DejaVuSans-74"/><path d="M54.89 33.016V0h-8.984v32.719q0 7.765-3.031 11.61-3.031 3.858-9.078 3.858-7.281 0-11.484-4.64-4.204-4.625-4.204-12.64V0H9.08v75.984h9.03V46.188q3.235 4.937 7.594 7.374Q30.078 56 35.797 56q9.422 0 14.25-5.828 4.844-5.828 4.844-17.156z" id="DejaVuSans-68"/></defs><g transform="matrix(0 -.1 -.1 0 14.798 148.199)"><use xlink:href="#DejaVuSans-42"/><use x="68.604" xlink:href="#DejaVuSans-61"/><use x="129.883" xlink:href="#DejaVuSans-6e"/><use x="193.262" xlink:href="#DejaVuSans-64"/><use x="256.738" xlink:href="#DejaVuSans-77"/><use x="338.525" xlink:href="#DejaVuSans-69"/><use x="366.309" xlink:href="#DejaVuSans-64"/><use x="429.785" xlink:href="#DejaVuSans-74"/><use x="468.994" xlink:href="#DejaVuSans-68"/></g></g></g><path clip-path="url(#pee29df804a)" d="M99.49 222.38v-.043l15.413-.079v-.474l3.083-.127v-1.206l3.083-.007v-.815l3.083-.105v-.02l21.58-.118v-.007l33.912-.13v-.003l9.248-.024h0" fill="none" stroke="#1f77b4" stroke-linecap="square" stroke-width="1.5" id="line2d_33"/><path clip-path="url(#pee29df804a)" d="M99.49 222.38v-.043l9.248-.062v-2l6.165-.015v-2l6.166-.015v-2.006l3.083-.009v-2l6.166-.015v-2.006l6.166-.009v-2l6.165-.015v-2.006l3.083-.009v-2l6.166-.015v-2.006l6.166-.009v-2.006l3.083-.009v-2l6.165-.015v-2.006l6.166-.009v-2.008l3.083-.007v-2l6.166-.015v-2l9.248-.015v-2.005l6.166-.01v-2.005l3.083-.01v-2l6.166-.015V184l6.165-.01v-2.005l3.083-.01v-2l6.166-.015v-2.005l6.166-.01v-2.005l3.083-.01v-2l6.165-.015v-2.008l3.083-.007v-2l9.249-.015v-2.005l3.083-.01v-2l6.165-.015v-2.005l3.083-.01v-2l6.166-.015v-2l6.166-.015v-2.005l3.083-.01v-2l6.165-.015v-2l6.166-.015v-2.001l6.166-.014v-2.008l3.083-.007v-2l6.166-.015v-2l6.165-.015V143.7l6.166-.01v-2.005l3.083-.01v-2l6.166-.015v-2.005l3.083-.01v-2l6.165-.015v-2l6.166-.015v-2.005l3.083-.01v-2l6.166-.015v-2.005l3.083-.01v-2l6.165-.015v-2.005l3.083-.01v-1.999l6.166-.016v-2.005l6.166-.01v-2.007l3.082-.007v-2l6.166-.015v-2.006l3.083-.01v-1.999l6.166-.015v-2.006l3.083-.01v-1.999l6.165-.015v-2l6.166-.015V103.4l3.083-.01v-1.999l6.166-.015V99.37l3.083-.01v-1.999l6.165-.015V95.34l3.083-.01v-1.999l6.166-.015v-2l6.166-.015v-2.006l3.083-.01v-1.999l6.165-.015v-2.006l3.083-.01v-1.999l6.166-.015v-2.006l6.166-.01v-2.003l6.166-.011v-2.006l3.082-.01v-1.999l6.166-.015v-2.008l3.083-.007v-2l6.166-.015v-2.002l6.166-.013V67.13l3.082-.01v-1.999l6.166-.015v-2l6.166-.015v-2.006l3.083-.01v-2.003l6.166-.011v-2.006l3.082-.01v-1.999l6.166-.015v-2.006l3.083-.01v-1.999l6.166-.015v-2.006l6.166-.01V46.98l3.082-.01v-1.999l6.166-.015v-2l6.166-.015v-2.002l6.166-.013V38.92l3.082-.01v-1.999l6.166-.015v-2l6.166-.015v-2.008l3.083-.007v-2l6.166-.015v-2l6.165-.015V26.83l3.083-.01v-1.999l6.166-.015v-2.002l6.166-.013v-2.008l6.165-.003h0" fill="none" stroke="#ff7f0e" stroke-linecap="square" stroke-width="1.5" id="line2d_34"/><path clip-path="url(#pee29df804a)" d="M99.49 222.38v-.043l15.413-.082v-.659l3.083-.062v-1.152l3.083-.012v-.52l3.083-.03v-.624l3.083-.133v-.178l3.083-.133v-.083l3.083-.095v-.083l3.083-.094v-.09l3.082-.132v-.045l3.083-.133v-.089l3.083-.133v-.089l3.083-.133v-.044l6.166-.178v-.177l3.083-.134v-.088l3.083-.134v-.083l3.082-.094v-.09l3.083-.132v-.045l3.083-.133v-.089l3.083-.133v-.044l3.083-.133v-.045l3.083-.133v-.083l3.083-.095v-.044l3.083-.133v-.083l3.082-.095v-.089l3.083-.133v-.044l3.083-.05h0" fill="none" stroke="#2ca02c" stroke-linecap="square" stroke-width="1.5" id="line2d_35"/><path clip-path="url(#pee29df804a)" d="M99.49 222.38v-.043l9.248-.061v-1.438l9.248-.013v-1.44l6.166-.007v-1.44l3.083-.008v-1.433l6.166-.014v-1.439l6.165-.008v-1.441l3.083-.006v-1.434l6.166-.013v-1.44l6.166-.007v-1.44l3.083-.008 3.083-.359v-1.082l3.082-.006v-1.44l3.083-.007v-1.434l6.166-.013v-1.434l6.166-.013v-1.44l3.083-.007v-1.436l6.165-.012v-1.433l6.166-.014v-1.439l3.083-.008 3.083-.359v-1.082l3.083-.006v-1.434l6.165-.013v-1.44l3.083-.008v-1.433l6.166-.014v-1.433l6.166-.014v-1.439l3.083-.008v-1.434l9.248-.013v-1.44l3.083-.007v-1.434l6.166-.014v-1.439l6.166-.008v-1.439l6.165-.008v-1.44l3.083-.007v-1.434l6.166-.014v-1.436l6.166-.01v-1.442l3.083-.006v-1.434l9.248-.013v-1.44l3.083-.008v-1.433l6.166-.014v-1.439l6.166-.008v-1.439l3.083-.008v-1.434l6.165-.013v-1.44l6.166-.007v-1.434l6.166-.014v-1.439l3.083-.008v-1.434l6.165-.013v-1.434l6.166-.013v-1.434l9.249-.014v-1.439l3.083-.008v-1.434l6.165-.013v-1.434l6.166-.013v-1.434l9.249-.013v-1.44l6.165-.007v-1.44l3.083-.008v-.359l3.083-.367v-.715l3.083-.006v-1.439l6.166-.008v-1.434l6.166-.013v-1.44l3.082-.007v-1.434l6.166-.013v-1.434l6.166-.014v-1.439l6.166-.008v-1.441l3.083-.006v-1.433l6.165-.014v-1.44l6.166-.007v-1.437l6.166-.01v-1.434l6.166-.013v-1.44l3.082-.008v-1.433l6.166-.014v-1.434l6.166-.013v-1.44l6.166-.007v-1.442l3.083-.006v-1.433l6.165-.014v-1.439l6.166-.008v-1.441l3.083-.006v-1.434l6.166-.013v-1.434l6.165-.014v-1.439l6.166-.008v-1.44l3.083-.007v-1.434l6.166-.013v-1.44l3.083-.008v-1.433l6.165-.014v-1.434l6.166-.013v-1.434l6.166-.013v-1.44l3.083-.007v-1.434l6.166-.014v-1.439l3.082-.008v-1.433l6.166-.014v-1.434l6.166-.013v-1.44l6.166-.007v-1.44l6.165-.007v-1.44l6.166-.008v-1.439l6.166-.008v-1.434l6.166-.013v-1.434l6.165-.013v-1.44l6.166-.008v-1.439l3.083-.008v-1.433l6.166-.014v-1.44l6.165-.007v-1.44l3.083-.008v-1.433l6.166-.014v-1.439l6.166-.008v-1.439l6.166-.008v-1.44L648.24 79v-1.434l9.25-.01h0" fill="none" stroke="#d62728" stroke-linecap="square" stroke-width="1.5" id="line2d_36"/><g id="legend_1"><path d="M78.59 77.412H344.9q2 0 2-2V17.7q0-2-2-2H78.59q-2 0-2 2v57.712q0 2 2 2z" fill="#fff" opacity=".8" stroke="#ccc" id="patch_2"/><path d="M80.59 23.798h20" fill="none" stroke="#1f77b4" stroke-linecap="square" stroke-width="1.5" id="line2d_37"/><g id="text_19"><defs><path d="M30.61 48.39q-7.22 0-11.422-5.64-4.204-5.64-4.204-15.453 0-9.813 4.172-15.453 4.188-5.64 11.453-5.64 7.188 0 11.375 5.655 4.203 5.672 4.203 15.438 0 9.719-4.203 15.406-4.187 5.688-11.375 5.688zm0 7.61q11.718 0 18.406-7.625 6.703-7.61 6.703-21.078 0-13.422-6.703-21.078-6.688-7.64-18.407-7.64-11.765 0-18.437 7.64-6.656 7.656-6.656 21.078 0 13.469 6.656 21.078Q18.844 56 30.609 56z" id="DejaVuSans-6f"/><path d="M45.406 27.984q0 9.766-4.031 15.125-4.016 5.375-11.297 5.375-7.219 0-11.25-5.375-4.031-5.359-4.031-15.125 0-9.718 4.031-15.093t11.25-5.375q7.281 0 11.297 5.375 4.031 5.375 4.031 15.093zm8.985-21.203q0-13.953-6.203-20.765Q42-20.797 29.203-20.797q-4.734 0-8.937.703-4.203.703-8.157 2.172v8.735q3.954-2.141 7.813-3.157 3.86-1.031 7.86-1.031 8.843 0 13.234 4.61 4.39 4.609 4.39 13.937v4.453q-2.781-4.844-7.125-7.234Q33.938 0 27.875 0 17.828 0 11.672 7.656q-6.156 7.672-6.156 20.328 0 12.688 6.156 20.344Q17.828 56 27.875 56q6.063 0 10.406-2.39 4.344-2.391 7.125-7.22v8.297h8.985z" id="DejaVuSans-67"/><path d="M4.89 30.906h40.235v-7.031H4.891z" id="DejaVuSans-2013"/><path d="M11.719 12.406h10.297V4l-8-15.625H7.719l4 15.625z" id="DejaVuSans-2c"/></defs><g transform="matrix(.1 0 0 -.1 108.59 27.298)"><use xlink:href="#DejaVuSans-4d"/><use x="86.279" xlink:href="#DejaVuSans-69"/><use x="114.063" xlink:href="#DejaVuSans-74"/><use x="153.271" xlink:href="#DejaVuSans-6f"/><use x="214.453" xlink:href="#DejaVuSans-67"/><use x="277.93" xlink:href="#DejaVuSans-65"/><use x="339.453" xlink:href="#DejaVuSans-6e"/><use x="402.832" xlink:href="#DejaVuSans-20"/><use x="434.619" xlink:href="#DejaVuSans-2013"/><use x="484.619" xlink:href="#DejaVuSans-20"/><use x="516.406" xlink:href="#DejaVuSans-30"/><use x="580.029" xlink:href="#DejaVuSans-2e"/><use x="611.816" xlink:href="#DejaVuSans-31"/><use x="675.439" xlink:href="#DejaVuSans-30"/><use x="739.063" xlink:href="#DejaVuSans-20"/><use x="770.85" xlink:href="#DejaVuSans-4d"/><use x="857.129" xlink:href="#DejaVuSans-69"/><use x="884.912" xlink:href="#DejaVuSans-42"/><use x="953.516" xlink:href="#DejaVuSans-2c"/><use x="985.303" xlink:href="#DejaVuSans-20"/><use x="1017.09" xlink:href="#DejaVuSans-32"/><use x="1080.713" xlink:href="#DejaVuSans-2e"/><use x="1112.5" xlink:href="#DejaVuSans-39"/><use x="1176.123" xlink:href="#DejaVuSans-73"/></g></g><path d="M80.59 38.477h20" fill="none" stroke="#ff7f0e" stroke-linecap="square" stroke-width="1.5" id="line2d_39"/><g id="text_20"><defs><path d="M53.516 70.516V60.89q-5.61 2.687-10.594 4-4.984 1.328-9.625 1.328-8.047 0-12.422-3.125t-4.375-8.89q0-4.845 2.906-7.313 2.907-2.453 11.016-3.97l5.953-1.218q11.031-2.11 16.281-7.406 5.25-5.297 5.25-14.172 0-10.61-7.11-16.078-7.093-5.469-20.812-5.469-5.172 0-11.015 1.172Q13.14.922 6.89 3.219v10.156q6-3.36 11.765-5.078 5.766-1.703 11.328-1.703 8.438 0 13.032 3.312 4.593 3.328 4.593 9.485 0 5.359-3.297 8.39-3.296 3.032-10.812 4.547L27.484 33.5q-11.03 2.188-15.968 6.875-4.922 4.688-4.922 13.047 0 9.672 6.812 15.234 6.813 5.563 18.766 5.563 5.14 0 10.453-.938 5.328-.922 10.89-2.765z" id="DejaVuSans-53"/><path d="M9.813 72.906h9.859v-29.89h35.844v29.89h9.859V0h-9.86v34.719H19.673V0h-9.86z" id="DejaVuSans-48"/><path d="M19.672 64.797v-27.39h12.406q6.89 0 10.64 3.562 3.766 3.562 3.766 10.156 0 6.547-3.765 10.11-3.75 3.562-10.64 3.562zm-9.86 8.11h22.266q12.266 0 18.531-5.548 6.282-5.546 6.282-16.234 0-10.797-6.282-16.313-6.265-5.515-18.53-5.515H19.671V0h-9.86z" id="DejaVuSans-50"/><path d="M18.11 8.203v-29H9.077v75.484h9.031v-8.296q2.844 4.875 7.157 7.234Q29.594 56 35.594 56q9.968 0 16.187-7.906 6.235-7.907 6.235-20.797T51.78 6.484q-6.218-7.906-16.187-7.906-6 0-10.328 2.375-4.313 2.375-7.157 7.25zm30.578 19.094q0 9.906-4.079 15.547-4.078 5.64-11.203 5.64-7.14 0-11.218-5.64-4.079-5.64-4.079-15.547 0-9.906 4.078-15.547 4.079-5.64 11.22-5.64 7.124 0 11.202 5.64t4.078 15.547z" id="DejaVuSans-70"/><path d="M9.422 75.984h8.984V0H9.422z" id="DejaVuSans-6c"/></defs><g transform="matrix(.1 0 0 -.1 108.59 41.977)"><use xlink:href="#DejaVuSans-53"/><use x="63.477" xlink:href="#DejaVuSans-53"/><use x="126.953" xlink:href="#DejaVuSans-48"/><use x="202.148" xlink:href="#DejaVuSans-20"/><use x="233.936" xlink:href="#DejaVuSans-50"/><use x="294.207" xlink:href="#DejaVuSans-69"/><use x="321.99" xlink:href="#DejaVuSans-70"/><use x="385.467" xlink:href="#DejaVuSans-65"/><use x="446.99" xlink:href="#DejaVuSans-6c"/><use x="474.773" xlink:href="#DejaVuSans-69"/><use x="502.557" xlink:href="#DejaVuSans-6e"/><use x="565.936" xlink:href="#DejaVuSans-69"/><use x="593.719" xlink:href="#DejaVuSans-6e"/><use x="657.098" xlink:href="#DejaVuSans-67"/><use x="720.574" xlink:href="#DejaVuSans-20"/><use x="752.361" xlink:href="#DejaVuSans-2013"/><use x="802.361" xlink:href="#DejaVuSans-20"/><use x="834.148" xlink:href="#DejaVuSans-36"/><use x="897.771" xlink:href="#DejaVuSans-2e"/><use x="929.559" xlink:href="#DejaVuSans-35"/><use x="993.182" xlink:href="#DejaVuSans-31"/><use x="1056.805" xlink:href="#DejaVuSans-20"/><use x="1088.592" xlink:href="#DejaVuSans-4d"/><use x="1174.871" xlink:href="#DejaVuSans-69"/><use x="1202.654" xlink:href="#DejaVuSans-42"/><use x="1271.258" xlink:href="#DejaVuSans-2c"/><use x="1303.045" xlink:href="#DejaVuSans-20"/><use x="1334.832" xlink:href="#DejaVuSans-31"/><use x="1398.455" xlink:href="#DejaVuSans-37"/><use x="1462.078" xlink:href="#DejaVuSans-2e"/><use x="1493.865" xlink:href="#DejaVuSans-30"/><use x="1557.488" xlink:href="#DejaVuSans-73"/></g></g><path d="M80.59 53.155h20" fill="none" stroke="#2ca02c" stroke-linecap="square" stroke-width="1.5" id="line2d_41"/><g id="text_21"><defs><path d="M31 75.875q-6.531-11.219-9.719-22.219-3.172-10.984-3.172-22.265 0-11.266 3.203-22.328Q24.517-2 31-13.188h-7.813Q15.875-1.704 12.235 9.375q-3.64 11.078-3.64 22.016 0 10.89 3.61 21.922 3.624 11.046 10.983 22.562z" id="DejaVuSans-28"/><path d="M8.688 72.906h9.921V28.61q0-11.718 4.235-16.875 4.25-5.14 13.781-5.14 9.469 0 13.719 5.14 4.25 5.157 4.25 16.875v44.297H64.5V27.391q0-14.25-7.063-21.532-7.046-7.28-20.812-7.28-13.828 0-20.89 7.28-7.047 7.282-7.047 21.532z" id="DejaVuSans-55"/><path d="M48.781 52.594v-8.407q-3.812 2.11-7.64 3.157-3.828 1.047-7.735 1.047-8.75 0-13.593-5.547-4.829-5.532-4.829-15.547 0-10.016 4.829-15.563 4.843-5.53 13.593-5.53 3.907 0 7.735 1.046 3.828 1.047 7.64 3.156V2.094Q45.016.344 40.984-.531q-4.015-.89-8.562-.89-12.36 0-19.64 7.765-7.266 7.765-7.266 20.953 0 13.375 7.343 21.031Q20.22 56 33.016 56q4.14 0 8.093-.86 3.953-.843 7.672-2.546z" id="DejaVuSans-63"/><path d="M41.11 46.297q-1.516.875-3.297 1.281Q36.03 48 33.89 48q-7.625 0-11.703-4.953-4.079-4.953-4.079-14.234V0H9.08v54.688h9.03v-8.5q2.844 4.984 7.375 7.39Q30.031 56 36.531 56q.922 0 2.047-.125 1.125-.11 2.484-.36z" id="DejaVuSans-72"/><path d="M8.016 75.875h7.812q7.313-11.516 10.953-22.563 3.64-11.03 3.64-21.921 0-10.938-3.64-22.016-3.64-11.078-10.953-22.563H8.016Q14.5-2 17.703 9.063q3.203 11.063 3.203 22.329 0 11.28-3.203 22.265-3.203 11-9.687 22.219z" id="DejaVuSans-29"/></defs><g transform="matrix(.1 0 0 -.1 108.59 56.655)"><use xlink:href="#DejaVuSans-4d"/><use x="86.279" xlink:href="#DejaVuSans-69"/><use x="114.063" xlink:href="#DejaVuSans-74"/><use x="153.271" xlink:href="#DejaVuSans-6f"/><use x="214.453" xlink:href="#DejaVuSans-67"/><use x="277.93" xlink:href="#DejaVuSans-65"/><use x="339.453" xlink:href="#DejaVuSans-6e"/><use x="402.832" xlink:href="#DejaVuSans-20"/><use x="434.619" xlink:href="#DejaVuSans-28"/><use x="473.633" xlink:href="#DejaVuSans-55"/><use x="546.826" xlink:href="#DejaVuSans-6e"/><use x="610.205" xlink:href="#DejaVuSans-63"/><use x="665.186" xlink:href="#DejaVuSans-6f"/><use x="726.367" xlink:href="#DejaVuSans-6d"/><use x="823.779" xlink:href="#DejaVuSans-70"/><use x="887.256" xlink:href="#DejaVuSans-72"/><use x="928.338" xlink:href="#DejaVuSans-65"/><use x="989.861" xlink:href="#DejaVuSans-73"/><use x="1041.961" xlink:href="#DejaVuSans-73"/><use x="1094.061" xlink:href="#DejaVuSans-65"/><use x="1155.584" xlink:href="#DejaVuSans-64"/><use x="1219.061" xlink:href="#DejaVuSans-29"/><use x="1258.074" xlink:href="#DejaVuSans-20"/><use x="1289.861" xlink:href="#DejaVuSans-2013"/><use x="1339.861" xlink:href="#DejaVuSans-20"/><use x="1371.648" xlink:href="#DejaVuSans-30"/><use x="1435.271" xlink:href="#DejaVuSans-2e"/><use x="1467.059" xlink:href="#DejaVuSans-32"/><use x="1530.682" xlink:href="#DejaVuSans-35"/><use x="1594.305" xlink:href="#DejaVuSans-20"/><use x="1626.092" xlink:href="#DejaVuSans-4d"/><use x="1712.371" xlink:href="#DejaVuSans-69"/><use x="1740.154" xlink:href="#DejaVuSans-42"/><use x="1808.758" xlink:href="#DejaVuSans-2c"/><use x="1840.545" xlink:href="#DejaVuSans-20"/><use x="1872.332" xlink:href="#DejaVuSans-33"/><use x="1935.955" xlink:href="#DejaVuSans-2e"/><use x="1967.742" xlink:href="#DejaVuSans-31"/><use x="2031.365" xlink:href="#DejaVuSans-73"/></g></g><path d="M80.59 67.833h20" fill="none" stroke="#d62728" stroke-linecap="square" stroke-width="1.5" id="line2d_43"/><g id="text_22"><defs><path d="M64.406 67.281v-10.39q-4.984 4.64-10.625 6.922-5.64 2.296-11.984 2.296-12.5 0-19.14-7.64-6.641-7.64-6.641-22.094 0-14.406 6.64-22.047 6.64-7.64 19.14-7.64 6.345 0 11.985 2.296 5.64 2.297 10.625 6.938V5.609Q59.234 2.094 53.437.33q-5.78-1.75-12.218-1.75-16.563 0-26.094 10.124-9.516 10.14-9.516 27.672 0 17.578 9.516 27.703 9.531 10.14 26.094 10.14 6.531 0 12.312-1.734 5.797-1.734 10.875-5.203z" id="DejaVuSans-43"/></defs><g transform="matrix(.1 0 0 -.1 108.59 71.333)"><use xlink:href="#DejaVuSans-53"/><use x="63.477" xlink:href="#DejaVuSans-53"/><use x="126.953" xlink:href="#DejaVuSans-48"/><use x="202.148" xlink:href="#DejaVuSans-20"/><use x="233.936" xlink:href="#DejaVuSans-50"/><use x="294.207" xlink:href="#DejaVuSans-69"/><use x="321.99" xlink:href="#DejaVuSans-70"/><use x="385.467" xlink:href="#DejaVuSans-65"/><use x="446.99" xlink:href="#DejaVuSans-6c"/><use x="474.773" xlink:href="#DejaVuSans-69"/><use x="502.557" xlink:href="#DejaVuSans-6e"/><use x="565.936" xlink:href="#DejaVuSans-69"/><use x="593.719" xlink:href="#DejaVuSans-6e"/><use x="657.098" xlink:href="#DejaVuSans-67"/><use x="720.574" xlink:href="#DejaVuSans-20"/><use x="752.361" xlink:href="#DejaVuSans-28"/><use x="791.375" xlink:href="#DejaVuSans-43"/><use x="861.199" xlink:href="#DejaVuSans-6f"/><use x="922.381" xlink:href="#DejaVuSans-6d"/><use x="1019.793" xlink:href="#DejaVuSans-70"/><use x="1083.27" xlink:href="#DejaVuSans-72"/><use x="1124.352" xlink:href="#DejaVuSans-65"/><use x="1185.875" xlink:href="#DejaVuSans-73"/><use x="1237.975" xlink:href="#DejaVuSans-73"/><use x="1290.074" xlink:href="#DejaVuSans-65"/><use x="1351.598" xlink:href="#DejaVuSans-64"/><use x="1415.074" xlink:href="#DejaVuSans-29"/><use x="1454.088" xlink:href="#DejaVuSans-20"/><use x="1485.875" xlink:href="#DejaVuSans-2013"/><use x="1535.875" xlink:href="#DejaVuSans-20"/><use x="1567.662" xlink:href="#DejaVuSans-34"/><use x="1631.285" xlink:href="#DejaVuSans-2e"/><use x="1663.072" xlink:href="#DejaVuSans-36"/><use x="1726.695" xlink:href="#DejaVuSans-38"/><use x="1790.318" xlink:href="#DejaVuSans-20"/><use x="1822.105" xlink:href="#DejaVuSans-4d"/><use x="1908.385" xlink:href="#DejaVuSans-69"/><use x="1936.168" xlink:href="#DejaVuSans-42"/><use x="2004.771" xlink:href="#DejaVuSans-2c"/><use x="2036.559" xlink:href="#DejaVuSans-20"/><use x="2068.346" xlink:href="#DejaVuSans-31"/><use x="2131.969" xlink:href="#DejaVuSans-38"/><use x="2195.592" xlink:href="#DejaVuSans-2e"/><use x="2227.379" xlink:href="#DejaVuSans-31"/><use x="2291.002" xlink:href="#DejaVuSans-73"/></g></g></g></g></g><defs><clipPath id="pee29df804a"><path d="M71.589 10.7h613.8v221.76h-613.8z"/></clipPath></defs></svg>���������������mitogen-0.3.9/docs/images/ansible/pcaps/stroke-width.py���������������������������������������������0000664�0000000�0000000�00000000755�14656664731�0023134�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ import sys # Add viewBox attr to SVGs lacking it, so IE scales properly. import lxml.etree import glob for name in sys.argv[1:]: # glob.glob('*/*.svg'): #+ glob.glob('images/ansible/*.svg'): doc = lxml.etree.parse(open(name)) svg = doc.getroot() for elem in svg.cssselect('[stroke-width]'): if elem.attrib['stroke-width'] < '2': elem.attrib['stroke-width'] = '2' open(name, 'w').write(lxml.etree.tostring(svg, xml_declaration=True, encoding='UTF-8')) �������������������mitogen-0.3.9/docs/images/ansible/pcaps/svg-boxify.py�����������������������������������������������0000664�0000000�0000000�00000000666�14656664731�0022606�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ # Add viewBox attr to SVGs lacking it, so IE scales properly. import lxml.etree import glob for name in glob.glob('images/*.svg') + glob.glob('images/ansible/*.svg'): doc = lxml.etree.parse(open(name)) svg = doc.getroot() if 'viewBox' not in svg.attrib: svg.attrib['viewBox'] = '0 0 %(width)s %(height)s' % svg.attrib open(name, 'w').write(lxml.etree.tostring(svg, xml_declaration=True, encoding='UTF-8')) ��������������������������������������������������������������������������mitogen-0.3.9/docs/images/ansible/run_hostname_100_times_mito.svg�����������������������������������0000664�0000000�0000000�00000247446�14656664731�0025076�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 632.46 181.53" height="242.04" width="843.28"><defs><symbol id="a" overflow="visible"><path d="M4.55-3.28c0 1.19-.17 2.05-.52 2.6-.33.55-.86.82-1.58.82C1.73.14 1.21-.14.87-.7a4.97 4.97 0 0 1-.51-2.57c0-1.17.17-2.03.52-2.59.34-.54.86-.81 1.57-.81.72 0 1.25.28 1.6.84.33.58.5 1.42.5 2.55zm-1.13 2c.08-.2.15-.48.19-.81a12.89 12.89 0 0 0 0-2.35c-.04-.33-.1-.6-.19-.83a1.4 1.4 0 0 0-.36-.51 1.01 1.01 0 0 0-.6-.17.98.98 0 0 0-.6.17c-.16.12-.28.3-.38.51-.09.23-.15.52-.17.85a11.37 11.37 0 0 0-.02 2.3c.04.3.1.58.2.82.08.23.2.4.35.52.16.12.36.19.61.19.24 0 .44-.05.61-.18.15-.1.27-.28.36-.51zm0 0"/></symbol><symbol id="b" overflow="visible"><path d="M1.88 0H.8v-1.25h1.06zm0 0"/></symbol><symbol id="c" overflow="visible"><path d="M3.55-5.02c0-.28-.1-.53-.3-.73-.2-.2-.47-.3-.81-.3-.33 0-.59.1-.78.27a.88.88 0 0 0-.32.7c0 .22.05.4.16.56.1.15.26.28.47.4l.42.21c.18.09.34.16.5.2.25-.19.42-.4.52-.6.09-.2.14-.43.14-.7zm.12 3.29c0-.27-.05-.49-.15-.65-.11-.16-.31-.32-.61-.48a20.16 20.16 0 0 0-.97-.42c-.24.17-.42.37-.55.6-.14.23-.2.5-.2.8 0 .4.11.73.36.99.24.26.54.39.9.39.37 0 .66-.11.9-.34.21-.22.32-.52.32-.9zM2.44.16a2.5 2.5 0 0 1-.9-.16C1.3-.1 1.07-.23.88-.4.7-.59.55-.8.46-1.06c-.1-.24-.14-.49-.14-.76 0-.35.1-.68.28-.97.2-.29.46-.53.83-.72v-.02C1.1-3.7.85-3.9.7-4.14c-.15-.22-.23-.5-.23-.83 0-.49.19-.9.56-1.23.36-.32.83-.49 1.4-.49.6 0 1.08.15 1.44.46.36.32.54.72.54 1.2a1.71 1.71 0 0 1-1 1.55v.03c.38.18.67.39.87.64.2.26.3.59.3.98 0 .56-.2 1.03-.61 1.4-.42.4-.93.59-1.53.59zm0 0"/></symbol><symbol id="d" overflow="visible"><path d="M4.17 0H.98v-.67h1.2v-4.38H.97v-.6c.44 0 .77-.07.99-.2.2-.12.33-.36.36-.71h.69v5.89h1.15zm0 0"/></symbol><symbol id="e" overflow="visible"><path d="M4.6-2.13c0 .35-.06.66-.16.94A2.14 2.14 0 0 1 3.33-.02c-.24.1-.51.16-.8.16-.3 0-.57-.05-.81-.16-.24-.09-.45-.23-.64-.43-.23-.24-.4-.56-.53-.96a6.38 6.38 0 0 1-.02-3.02c.11-.45.3-.84.55-1.18.24-.33.54-.6.92-.78.36-.19.8-.28 1.3-.28l.4.03c.13.01.24.03.33.06v.85H4a2.7 2.7 0 0 0-.34-.13 2.46 2.46 0 0 0-.49-.05c-.54 0-.98.19-1.31.55a2.6 2.6 0 0 0-.6 1.64c.2-.14.42-.26.65-.34.22-.07.45-.11.72-.11.25 0 .47.02.67.06.18.06.38.17.6.31.23.2.4.42.52.7.13.27.19.6.19.98zm-.88.04c0-.26-.04-.49-.11-.68a1.28 1.28 0 0 0-.34-.46 1.34 1.34 0 0 0-.4-.2l-.45-.02c-.2 0-.4.03-.6.1-.18.05-.37.13-.55.26-.02.06-.02.12-.02.18a3.43 3.43 0 0 0 .13 1.31c.09.29.2.5.32.65.13.13.26.23.4.3.13.05.27.07.43.07.35 0 .64-.12.86-.37.2-.25.32-.63.33-1.14zm0 0"/></symbol><symbol id="f" overflow="visible"><path d="M4.5 0H.47v-.92l.81-.78a14.92 14.92 0 0 0 1.78-2.11c.18-.33.27-.67.27-1.02 0-.19-.03-.35-.08-.48a1.21 1.21 0 0 0-.23-.35c-.11-.08-.23-.14-.36-.2a1.58 1.58 0 0 0-.91 0c-.17.04-.32.09-.47.14l-.36.19a6.4 6.4 0 0 1-.28.17H.6v-.92a4.44 4.44 0 0 1 1.69-.4c.6 0 1.08.16 1.44.48.34.33.51.77.51 1.33 0 .26-.04.5-.09.7A3.02 3.02 0 0 1 3.5-3l-.48.55-.93.93-.8.77H4.5zm0 0"/></symbol><symbol id="g" overflow="visible"><path d="M4.69-2.25H3.9V0h-.85v-2.25H.17v-.92l2.94-3.38h.8v3.6h.78zm-1.63-.7v-2.57L.86-2.95zm0 0"/></symbol><symbol id="h" overflow="visible"><path d="M2.25-5.92c-.16 0-.32.02-.48.06l-.46.14a2.78 2.78 0 0 0-.65.38H.6v-.94a4.5 4.5 0 0 1 1.7-.4c.3 0 .55.04.78.09.22.06.42.15.6.28a1.43 1.43 0 0 1 .6 1.2c0 .37-.13.68-.37.95-.24.28-.53.45-.86.52v.06c.14.03.29.08.46.14.14.08.28.17.43.28.14.14.25.3.33.49a2.14 2.14 0 0 1-.45 2.2 2 2 0 0 1-.69.45c-.27.1-.58.16-.92.16-.34 0-.67-.04-.99-.12C.91-.05.64-.15.43-.27v-.93h.05c.2.15.44.27.75.39.3.12.61.19.93.19.18 0 .36-.04.54-.1.18-.05.33-.14.46-.26A1.48 1.48 0 0 0 3.52-2a1.87 1.87 0 0 0-.11-.6.88.88 0 0 0-.29-.35 1.48 1.48 0 0 0-.43-.2l-.55-.04h-.37v-.72h.28c.4 0 .72-.09.97-.28.25-.18.37-.46.37-.83 0-.15-.03-.3-.1-.42-.07-.11-.15-.2-.24-.28a1.32 1.32 0 0 0-.38-.16 1.89 1.89 0 0 0-.42-.04zm0 0"/></symbol><symbol id="i" overflow="visible"><path d="M2.19 0v-5.77H0v-.78h5.27v.78h-2.2V0zm0 0"/></symbol><symbol id="j" overflow="visible"><path d="M1.42 0H.6v-4.9h.83zm.06-5.73H.55v-.86h.93zm0 0"/></symbol><symbol id="k" overflow="visible"><path d="M6.17 0v-2.84c0-.22-.01-.43-.03-.63a1.1 1.1 0 0 0-.1-.45.52.52 0 0 0-.26-.25.92.92 0 0 0-.44-.1c-.18.02-.36.07-.54.16-.2.1-.4.26-.61.45l.01.2V0h-.8v-2.84c0-.22-.02-.43-.04-.63a1.67 1.67 0 0 0-.11-.45.62.62 0 0 0-.25-.25.92.92 0 0 0-.44-.1c-.19.02-.37.07-.56.18-.2.11-.4.25-.58.42V0H.6v-4.9h.83v.54c.22-.22.43-.39.64-.51a1.54 1.54 0 0 1 1.48.03c.23.12.39.34.5.64.26-.27.5-.48.74-.63a1.6 1.6 0 0 1 1.34-.13c.18.08.33.19.46.33.13.15.24.34.31.57.07.22.11.5.11.83V0zm0 0"/></symbol><symbol id="l" overflow="visible"><path d="M2.73.1C1.95.13 1.34-.1.91-.54.47-.98.25-1.6.27-2.42c0-.8.2-1.44.62-1.92.41-.47.96-.7 1.64-.7.3 0 .57.04.81.13a1.698 1.698 0 0 1 1.01 1.1c.1.27.15.6.15 1v.44H1.1c0 .57.14 1 .43 1.3.28.31.68.46 1.19.46.17 0 .35-.02.53-.06.18-.03.34-.08.48-.16.15-.06.27-.13.38-.2.1-.05.18-.11.25-.17h.05v.9c-.1.05-.22.1-.36.14a3.27 3.27 0 0 1-1.32.27zM3.7-3a2.45 2.45 0 0 0-.1-.58 1.3 1.3 0 0 0-.18-.4c-.1-.13-.23-.22-.37-.29-.16-.06-.35-.09-.57-.09-.21 0-.4.03-.56.1a1.25 1.25 0 0 0-.7.71c-.06.16-.1.34-.13.55zm0 0"/></symbol><symbol id="m" overflow="visible"><path d="M3.13 1.81H2.1C1.6 1.21 1.2.57.92-.1a5.81 5.81 0 0 1-.45-2.4c0-.9.14-1.7.44-2.4.29-.67.69-1.32 1.2-1.93h1.02v.04c-.25.22-.47.47-.7.74a6.43 6.43 0 0 0-1 2.17A5.59 5.59 0 0 0 1.84.05a5.25 5.25 0 0 0 1.28 1.72zm0 0"/></symbol><symbol id="n" overflow="visible"><path d="M1.9.13c-.33 0-.63-.05-.92-.15a3.37 3.37 0 0 1-.7-.28v-.92h.05a2.43 2.43 0 0 0 .62.4c.14.07.3.12.47.16.17.06.34.08.52.08.13 0 .27-.01.42-.05.14-.03.26-.07.34-.12.1-.06.17-.13.22-.2a.75.75 0 0 0 .06-.35c0-.2-.05-.34-.15-.45-.12-.1-.31-.18-.58-.25l-.4-.1a3.49 3.49 0 0 1-.48-.1 1.4 1.4 0 0 1-.8-.5 1.3 1.3 0 0 1-.27-.83c0-.44.16-.8.5-1.08.33-.27.78-.41 1.34-.42.26.01.53.05.81.1.27.07.5.16.7.26v.89h-.04a2.35 2.35 0 0 0-1.5-.55c-.27 0-.5.06-.69.17a.57.57 0 0 0-.28.52c0 .21.06.36.17.45.1.1.28.19.53.25l.43.1.46.1c.37.1.65.25.83.46.18.22.27.5.27.86 0 .22-.04.42-.13.6-.08.2-.2.36-.36.5-.18.14-.37.25-.59.32-.23.08-.51.13-.84.13zm0 0"/></symbol><symbol id="o" overflow="visible"><path d="M2.95-2.52c0 .91-.15 1.7-.43 2.4-.3.68-.7 1.33-1.2 1.93h-1v-.04A5.71 5.71 0 0 0 1.58.05 5.7 5.7 0 0 0 2-3.89 6.18 6.18 0 0 0 .99-6.06a8.5 8.5 0 0 0-.67-.74v-.04h1a6.13 6.13 0 0 1 1.64 4.33zm0 0"/></symbol><symbol id="p" overflow="visible"><path d="M4.42-2.08A2.25 2.25 0 0 1 3.86-.5c-.19.2-.42.36-.69.47-.28.11-.59.17-.92.17a3.9 3.9 0 0 1-.92-.1 2.89 2.89 0 0 1-.8-.27v-.94H.6L.88-1a3.14 3.14 0 0 0 .9.33c.13.03.29.05.47.05s.35-.04.52-.1c.16-.06.3-.16.43-.31a1.48 1.48 0 0 0 .33-1.06c0-.23-.03-.42-.1-.57a.92.92 0 0 0-.26-.37c-.13-.1-.3-.18-.47-.24-.18-.03-.39-.06-.6-.06a5.5 5.5 0 0 0-1.3.16v-3.38h3.6v.77H1.63v1.75l.31-.03h.28c.34 0 .62.02.86.08a2 2 0 0 1 .66.32c.22.16.38.36.5.61.11.25.17.58.17.97zm0 0"/></symbol><symbol id="q" overflow="visible"><path d="M4.58-5.56L1.75 0H.81L3.8-5.78H.42v-.77h4.16zm0 0"/></symbol><symbol id="r" overflow="visible"><path d="M.13-2.47A4.96 4.96 0 0 1-.4-.33h-1.1v-.06c.28-.28.49-.6.63-.97.15-.36.22-.71.22-1.05 0-.47-.1-.84-.3-1.09a.96.96 0 0 0-.8-.38 1.1 1.1 0 0 0-.62.2c-.16.13-.29.34-.37.62a29.45 29.45 0 0 1-.52 1.8 1.63 1.63 0 0 1-1.55.89c-.52 0-.96-.2-1.33-.61a2.38 2.38 0 0 1-.53-1.6 4.85 4.85 0 0 1 .43-1.94h1.03v.07a2.79 2.79 0 0 0-.7 1.83c0 .4.09.71.28.96.18.27.43.39.75.38.28 0 .5-.07.65-.22.17-.14.29-.36.36-.64a18 18 0 0 1 .34-1.33c.14-.46.35-.79.63-1a1.86 1.86 0 0 1 1.78-.16c.25.11.47.25.64.44.19.22.34.46.44.72.1.27.15.6.15 1zm0 0"/></symbol><symbol id="s" overflow="visible"><path d="M.1-2.73c.02.78-.2 1.39-.65 1.82-.43.44-1.06.66-1.87.64-.8 0-1.44-.2-1.92-.62-.47-.41-.7-.96-.7-1.64 0-.3.04-.57.13-.81a1.698 1.698 0 0 1 1.1-1.01c.27-.1.6-.15 1-.15h.44v3.4c.57 0 1-.14 1.3-.43.31-.28.46-.68.46-1.19 0-.17-.02-.35-.06-.53a1.76 1.76 0 0 0-.16-.48 2.1 2.1 0 0 0-.2-.38c-.05-.1-.11-.18-.17-.25v-.05h.9c.05.1.1.22.14.36a3.27 3.27 0 0 1 .27 1.32zM-3-3.7c-.22 0-.41.04-.58.1-.15.03-.29.1-.4.18-.13.1-.22.23-.29.37-.06.16-.09.35-.09.57 0 .21.03.4.1.56a1.25 1.25 0 0 0 .71.7c.16.06.34.1.55.13zm0 0"/></symbol><symbol id="t" overflow="visible"><path d="M1.81-4.38v.83H-.53c.22.25.37.48.47.7.1.24.15.49.15.76 0 .56-.22 1-.67 1.34-.44.32-1.05.48-1.86.48a2.89 2.89 0 0 1-1.94-.62 1.87 1.87 0 0 1-.67-1.44 2.37 2.37 0 0 1 .34-1.22l-.2-.06v-.77zm-3.04.83h-2.8a2.33 2.33 0 0 0-.27 1.08c0 .44.16.77.47 1 .31.24.76.36 1.35.36.58 0 1.02-.1 1.32-.28.32-.19.47-.48.47-.88a2 2 0 0 0-.55-1.28zm0 0"/></symbol><symbol id="u" overflow="visible"><path d="M0-4.42v.83h-.55c.23.25.4.49.5.71.13.24.2.49.2.77 0 .22-.05.42-.12.61-.07.19-.18.36-.33.5-.15.14-.34.24-.57.31-.23.09-.51.13-.85.13H-4.9v-.83h2.8c.26 0 .48 0 .64-.03.18-.02.33-.06.45-.13a.61.61 0 0 0 .29-.28c.05-.11.07-.28.07-.5 0-.2-.05-.4-.17-.64a2.83 2.83 0 0 0-.42-.62H-4.9v-.83zm0 0"/></symbol><symbol id="v" overflow="visible"><path d="M0-4.45v.83h-2.8c-.22 0-.42 0-.62.03-.2.02-.35.06-.47.12a.75.75 0 0 0-.28.28c-.05.13-.08.3-.1.49 0 .2.06.42.18.64.11.22.25.43.42.64H0v.83h-4.9v-.83h.54a3.07 3.07 0 0 1-.51-.74 1.73 1.73 0 0 1-.18-.75c0-.48.16-.86.47-1.14.33-.27.8-.4 1.4-.4zm0 0"/></symbol><symbol id="w" overflow="visible"><path d="M.1-2.55c0 .34-.05.64-.15.92A1.94 1.94 0 0 1-1.3-.43c-.32.11-.7.16-1.14.16a2.77 2.77 0 0 1-1.9-.62c-.22-.2-.38-.44-.5-.73a2.69 2.69 0 0 1-.06-1.7c.08-.26.17-.48.27-.68h.92v.05l-.17.22-.2.34a3.05 3.05 0 0 0-.22.86c0 .43.17.77.48 1.03.34.26.8.4 1.38.4a2.1 2.1 0 0 0 1.36-.4c.32-.24.48-.58.48-1.03a2.12 2.12 0 0 0-.6-1.42V-4h.93a4.37 4.37 0 0 1 .36 1.02c.02.11.03.26.03.43zm0 0"/></symbol><symbol id="x" overflow="visible"><path d="M0-5.33v.97l-5.64 2.9H0v.82h-6.55V-1.9l5.2-2.63h-5.2v-.8zm0 0"/></symbol><symbol id="y" overflow="visible"><path d="M0-6.17h-2.84c-.22 0-.43.01-.63.03a1.1 1.1 0 0 0-.45.1.52.52 0 0 0-.25.26.92.92 0 0 0-.1.44c.02.18.07.36.16.54.1.2.26.4.45.61l.2-.01H0v.8h-2.84c-.22 0-.43.02-.63.04-.19.02-.33.06-.45.11a.62.62 0 0 0-.25.25.92.92 0 0 0-.1.44c.02.19.07.37.18.56.11.2.25.4.42.58H0v.83h-4.9v-.83h.54c-.22-.22-.39-.43-.51-.64a1.54 1.54 0 0 1 .03-1.48c.12-.23.34-.39.64-.5-.27-.26-.48-.5-.63-.74a1.6 1.6 0 0 1-.13-1.34c.08-.18.19-.33.33-.46.15-.13.34-.24.57-.31.22-.07.5-.11.83-.11H0zm0 0"/></symbol><symbol id="z" overflow="visible"><path d="M-2.47-3.86c-.58 0-1.03.09-1.34.27-.3.18-.46.46-.46.86 0 .23.06.46.18.68.1.23.23.44.39.63h2.8a2 2 0 0 0 .28-1.1c.01-.41-.14-.74-.44-.98s-.76-.36-1.4-.36zm-.06-.86c.8 0 1.45.2 1.94.6.49.38.73.87.73 1.45 0 .27-.04.5-.1.69-.07.18-.16.37-.27.56l.23.04v.79h-6.84v-.83h2.45c-.19-.2-.34-.43-.47-.67a1.82 1.82 0 0 1-.19-.83c0-.55.23-.99.67-1.31a3.12 3.12 0 0 1 1.85-.49zm0 0"/></symbol><symbol id="A" overflow="visible"><path d="M-4.02-3.2v.04l-.04.2v.24c0 .23.04.45.14.67.1.22.25.43.44.63H0v.83h-4.9v-.83h.73a3.9 3.9 0 0 1-.58-.8c-.1-.22-.16-.43-.16-.64v-.2a.64.64 0 0 0 .04-.14zm0 0"/></symbol><symbol id="B" overflow="visible"><path d="M1.81-3.13v1.02C1.21-1.6.57-1.2-.1-.92c-.68.3-1.48.45-2.4.45-.9 0-1.7-.14-2.4-.44a7.92 7.92 0 0 1-1.93-1.2v-1.02h.04c.22.25.47.47.74.7a6.43 6.43 0 0 0 2.17 1 5.59 5.59 0 0 0 3.94-.42 5.25 5.25 0 0 0 1.72-1.28zm0 0"/></symbol><symbol id="C" overflow="visible"><path d="M-2.02-5.1c.34 0 .63.07.88.2.25.12.45.29.6.5.2.24.34.5.42.8.08.27.12.63.12 1.07v1.89h-6.55V-2.4c0-.46.02-.8.05-1.05.03-.22.1-.45.22-.67.12-.23.3-.4.5-.5.21-.11.45-.17.72-.17.31 0 .59.08.83.25.24.17.43.39.56.67h.03c.12-.38.3-.69.58-.9.29-.22.64-.33 1.04-.33zm-2.92 1.22c-.15 0-.3.03-.42.08a.59.59 0 0 0-.26.25c-.09.15-.14.31-.16.49l-.02.7v.84h1.9v-.98c.02-.28 0-.48-.02-.6a1.57 1.57 0 0 0-.17-.42.74.74 0 0 0-.35-.28c-.13-.05-.3-.08-.5-.08zm2.97-.3c-.25 0-.45.03-.6.1a.87.87 0 0 0-.41.42c-.07.15-.12.3-.15.46-.01.16-.03.4-.03.7v.98h2.41v-.7c0-.38-.02-.69-.05-.9-.03-.22-.1-.42-.22-.58a1.06 1.06 0 0 0-.39-.36 1.46 1.46 0 0 0-.56-.13zm0 0"/></symbol><symbol id="D" overflow="visible"><path d="M-2.52-2.95c.91 0 1.7.15 2.4.43.68.3 1.33.7 1.93 1.2v1h-.04A5.71 5.71 0 0 0 .05-1.58 5.7 5.7 0 0 0-3.89-2 6.18 6.18 0 0 0-6.06-.99a8.5 8.5 0 0 0-.74.67h-.04v-1a6.13 6.13 0 0 1 4.33-1.64zm0 0"/></symbol></defs><path d="M61.62 153.62V1.5" fill="none" stroke="#c7c7c7" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M145.66 153.62V1.5m84.03 152.12V1.5m84.03 152.12V1.5m84.03 152.12V1.5m84.03 152.12V1.5m84.02 152.12V1.5" fill="none" stroke="#c7c7c7" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10" stroke-dasharray="1.00055247,2.00110494"/><path d="M53.78 148.38h577.18" fill="none" stroke="#c7c7c7" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M53.78 124.95h577.18M53.78 101.53h577.18M53.78 78.1h577.18M53.78 54.68h577.18M53.78 31.26h577.18M53.78 7.84h577.18" fill="none" stroke="#c7c7c7" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10" stroke-dasharray="1.00055247,2.00110494"/><use xlink:href="#a" x="175.29" y="18.17" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#a" x="238.06" y="18.17" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#a" x="305.22" y="18.17" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#a" x="327.63" y="18.17" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#a" x="439.29" y="18.17" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#a" x="456.09" y="18.17" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><path d="M61.62 148.38h1.48v-.03h.97v-1.28h2.17v-.04h4.4V147h.03v-.04h.18v-.06h2.91v-.58h.36v-1.08h7.08v-.05h4.49v-.43h24.18v-12.84h15.8v-8.7h.11V108.7h.18V93.3h.15V78.58h.17v-14.4h.05V49.05h.1v-15.3h12.19v-1.6h.75v-.05h7.45v-4.35h4.62v-.57h.9v-.09h.1v-.12h1.84v-.06h1.38v-.03h.23v-.12h3.54v-.06h1.77v-.04h.22v-.12h3.45v-.05h1.09v-.04h.15v-.12h2.17v-.06h1.09v-.04h.13v-.11h2.07v-.06h1.08v-.04h.14v-.12h2.2v-.05h1v-.05h.17v-.11h3.02v-.06h2v-.04h.17v-.11h2.61v-.06h1.18v-.04h.13v-.12h2.11v-.05h1.16v-.05h.15v-.11h1.94v-.06h1.05v-.04h.16v-.11h3.28v-.06h1.73v-.04h.22v-.12h3.14v-.05h1.73v-.05h.13v-.11h2.07v-.06h1.05v-.04h.2v-.11h1.27v-.06h1.96v-.04h.2v-.12h2.04v-.05h1v-.05h.08v-.11h2.2v-.06h1.11v-.04h.12v-.12h2.16v-.05h1.58v-.04h.5v-.12h2.63v-.05h1.06v-.05h.12v-.11h2.04v-.06h1.2v-.04h.18v-.12h2.07v-.05h1.24v-.04h.17v-.12h3.36v-.06h.93v-.04h.2v-.12h2.24v-.05h1v-.04h.22v-.12h2.31v-.06h.92v-.04h.12v-.12h2.23V22h1.09v-.04h.12v-.11h2.12v-.06h.98v-.04h.13v-.12h3.6v-.05h1.36v-.04h.12v-.12h2.2v-.06h1.2v-.04h.16v-.11h2.57v-.06h1.13v-.04h.1v-.12h2.32v-.05h.88v-.05h.11v-.11h2.19v-.06h1v-.04h.13v-.12h1.24v-.05h1.77v-.04h.1v-.12h3.44v-.05h1v-.05h.17v-.11h2.2v-.07h1.1v-.04h.17v-.11h2.2v-.06h.92v-.04h.13v-.12h1.92v-.05h1.14v-.05h.14v-.1h2.08v-.07h1.04v-.04h.14v-.11h2.37v-.06h1.14v-.04h.12v-.12h2.94V19h1.7v-.05h.22v-.11h2.97v-.06h.99v-.04h.1v-.11h2.6v-.06h2.1v-.04h.24v-.12h3.64v-.05h2.38v-.05h.36v-.11h3.71v-.06h1.82v-.04h.19v-.12h3.84v-.05h1.94v-.04h.27v-.12h3.75v-.05h1.7v-.05h.2v-.11h3.48v-.06h1.95v-.04h.18v-.12h3.4v-.05h2.05v-.04h.24v-.12h3.29v-.06h1.9v-.04h.25v-.12h2.25v-.05h3.01v-.04h.37v-.12h3.6v-.06h1.66v-.03h.18v-.12h3.6v-.06h1.43v-.04h.2v-.12h2.3v-.05h1.27v-.04h.14v-.12h2.08V16h1.3v-.03h.15v-.12h2.24v-.06h1.24v-.04h.13v-.12h3.3v-.05h1.72v-.04h.25v-.12h3.49v-.06h1.84v-.04h.18v-.11h3.53v-.06h2.02v-.04h.27v-.12h3.29v-.06h2.1v-.04h.3v-.12h2.3v-.05h1v-.04h.12v-.12h2.19v-.06h.99v-.04h.2v-.12h3.66v-.05h1.88v-.04h.26v-.12h3.81v-.06h1.63v-.03h.2v-.12h3.6v-.06h1.66v-.04h.2v-.12h3.79v-.05h1.66v-.04h.38v-.12h3.47v-.06h1.92v-.04h.23v-.11h1.99v-.06h3.3v-.04h.32v-.12h3.61v-.05h1.68v-.04h.19v-.12h3.86v-.06h1.64v-.04h.28v-.11h3.84v-.06h1.68v-.04h.18v-.12h3.98v-.05h1.67v-.05h.2v-.11h3.59v-.06h1.66v-.04h.2V12h3.68v-.06h1.89v-.04h.25v-.12h4.07v-.05h1.66v-.05h.22v-.11h3.88v-.06h1.61v-.04h.25v-.11h3.69v-.06h1.72v-.04h.17v-.12h3.63v-.05h1.62v-.05h.21v-.11h3.7v-.06h1.8v-.04h.23v-.11h3.69v-.06h1.16v-.04h.14v-.12h2.07v-.05h1.35v-.05h.15v-.11h2.1v-.06h1.12v-.04h.14v-.12h2.31v-.05h1.02v-.04h.14v-.12h2.97V9.8h1.75v-.04h.29v-.12h2.23V9.6H525v-.04h.2v-.12h3.82v-.05h1.6v-.04h.22v-.12h3.87v-.06h1.73v-.04h.2V9h3.74v-.05h1.56v-.04h.25v-.12h3.58v-.06h1.6V8.7h.21v-.11h3.75v-.06h1.77v-.04h.2v-.12h3.66v-.05h1.72v-.04h.22v-.12h3.75V8.1h1.77v-.04h.32v-.11h3.54v-.06h1.7v-.04h.2v-.12h3.65v-.05h1.62v-.04h.5V7.5h3.64v-.06h1.77V7.4h.18v-.1h3.75v-.06h1.6V7.2h.2v-.12h3.62v-.05h1.61v-.05h.24v-.11h3.6V6.8h1.87v-.04h.2v-.11h3.57V6.6h1.6v-.04h.2v-.12h3.69v-.06h1.63v-.04h.24v-.11h3.8v-.07h1v-.04h.11v-.11h1.28v-.06h6.75V5.9h.12v-.05h1.04v-.04h.03v-.08h.81" fill="none" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M63.12 148.38a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M63.14 148.38a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M63.18 148.38a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M64.6 148.35a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M64.66 148.35a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M65.57 147.07a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M67.74 147.03a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm4.39-.02a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M72.18 146.97a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M72.35 146.91a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M75.26 146.33a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M75.62 145.25a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm7.08-.05a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M82.71 145.2a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M82.76 145.2a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm4.43-.43a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm18.15 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M106.7 144.77a1.5 1.5 0 1 1-3.01 0 1.5 1.5 0 0 1 3 0zm4.67-12.84a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm15.68 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm.12-8.7a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm.11-14.53a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm.18-15.4a1.5 1.5 0 1 1-3 .01 1.5 1.5 0 0 1 3 0zm.14-14.72a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm.18-14.4a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm.05-15.13a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M127.9 49.05a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm.04-15.3a1.5 1.5 0 1 1-3.01 0 1.5 1.5 0 0 1 3 0zm12.18-1.6a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M140.87 32.1a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm7.43 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm.02-4.35a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm4.62-.57a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M153.84 27.1a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M153.94 26.97a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M155.78 26.91a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M157.16 26.88a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M157.39 26.76a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.54-.06a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M162.7 26.66a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M162.92 26.54a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.45-.05a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M167.46 26.45a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M167.6 26.33a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M169.78 26.27a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M170.87 26.23a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M171 26.12a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M173.07 26.06a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M174.15 26.02a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M174.3 25.9a1.5 1.5 0 1 1-3.01 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M176.48 25.85a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M177.49 25.8a1.5 1.5 0 1 1-3.01 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M177.66 25.69a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.03-.06a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M182.67 25.6a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M182.85 25.48a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M185.46 25.42a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M186.64 25.38a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M186.77 25.26a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M188.88 25.2a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M190.04 25.16a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M190.2 25.05a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M192.13 25a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M193.18 24.95a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M193.34 24.84a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.28-.06a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M198.35 24.74a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M198.57 24.62a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.13-.05a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M203.44 24.52a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M203.57 24.4a1.5 1.5 0 1 1-3 .01 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M205.64 24.35a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M206.7 24.3a1.5 1.5 0 1 1-3.01.01 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M206.88 24.2a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M208.16 24.14a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M209.15 24.14a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M210.12 24.1a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M210.32 23.98a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M212.36 23.93a1.5 1.5 0 1 1-3 0 1.5 1.5 0 1 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M213.36 23.88a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M213.44 23.77a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M215.64 23.71a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M216.75 23.67a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M216.87 23.55a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M219.03 23.5a1.5 1.5 0 1 1-3.01 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M220.6 23.46a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M221.1 23.34a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M223.74 23.29a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M224.8 23.24a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M224.92 23.13a1.5 1.5 0 1 1-3.01 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M226.97 23.07a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M228.16 23.03a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M228.34 22.91a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M230.4 22.86a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M231.66 22.82a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M231.82 22.7a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.36-.06a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M236.11 22.6a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M236.32 22.48a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M238.55 22.43a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M239.56 22.39a1.5 1.5 0 1 1-3.01 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M239.77 22.27a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M242.08 22.2a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M243 22.17a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M243.12 22.05a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M245.36 22a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M246.44 21.95a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M246.56 21.84a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M248.68 21.78a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M249.66 21.74a1.5 1.5 0 1 1-3.01 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M249.8 21.62a1.5 1.5 0 1 1-3.01 0 1.5 1.5 0 0 1 3 0zm3.6-.05a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M254.75 21.53a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M254.87 21.41a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M257.07 21.35a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M258.28 21.31a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M258.43 21.2a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M261 21.14a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M262.13 21.1a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M262.24 20.98a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M264.55 20.93a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M265.43 20.88a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M265.54 20.77a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M267.73 20.71a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M268.73 20.67a1.5 1.5 0 1 1-3 0 1.5 1.5 0 1 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M268.86 20.55a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M270.1 20.5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M270.93 20.5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M271.87 20.46a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M271.96 20.34a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.44-.05a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M276.41 20.24a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M276.59 20.13a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M278.8 20.06a1.5 1.5 0 1 1-3.01 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M279.87 20.02a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M280.05 19.9a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M282.25 19.85a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M283.17 19.8a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M283.3 19.7a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M285.22 19.64a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M286.37 19.6a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M286.5 19.48a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M288.59 19.42a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M289.62 19.38a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M289.76 19.27a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M292.14 19.21a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M293.27 19.17a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M293.39 19.05a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M296.33 19a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M298.03 18.95a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M298.25 18.84a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M301.22 18.78a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M302.2 18.74a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M302.3 18.63a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M304.9 18.57a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M307 18.53a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M307.25 18.41a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.64-.05a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M313.27 18.31a1.5 1.5 0 1 1-3 .01 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M313.63 18.2a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.71-.06a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M319.16 18.1a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M319.35 17.98a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.85-.05a1.5 1.5 0 1 1-3.01 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M325.13 17.89a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M325.4 17.77a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.75-.05a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M330.85 17.67a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M331.05 17.56a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.48-.06a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M336.48 17.46a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M336.66 17.34a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.41-.05a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M342.11 17.25a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M342.35 17.13a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.29-.06a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M347.54 17.03a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M347.79 16.91a1.5 1.5 0 1 1-3 .01 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M350.04 16.86a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M351.28 16.86a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M353.05 16.82a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M353.42 16.7a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.6-.06a1.5 1.5 0 1 1-3 .01 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M358.68 16.6a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M358.86 16.49a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.6-.06a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M363.9 16.4a1.5 1.5 0 1 1-3-.01 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M364.1 16.27a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M366.39 16.22a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M367.66 16.18a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M367.8 16.06a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M369.88 16a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M371.18 15.97a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M371.34 15.85a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M373.57 15.8a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M374.81 15.75a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M374.94 15.63a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.31-.05a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M379.96 15.54a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M380.21 15.42a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.49-.06a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M385.54 15.32a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M385.72 15.2a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.53-.05a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M391.28 15.11a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M391.54 15a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.29-.07a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M396.92 14.89a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M397.22 14.77a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M399.52 14.72a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M400.53 14.68a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M400.65 14.56a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M402.84 14.5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M403.83 14.46a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M404.04 14.34a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.66-.05a1.5 1.5 0 1 1-3.01 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M409.57 14.25a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M409.83 14.13a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.81-.06a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M415.27 14.04a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M415.46 13.92a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.61-.06a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M420.74 13.82a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M420.93 13.7a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.79-.05a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M426.38 13.6a1.5 1.5 0 1 1-3 .01 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M426.76 13.5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.47-.07a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M432.15 13.4a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M432.38 13.28a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M434.37 13.22a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M436.03 13.22a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M437.68 13.18a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M438 13.06a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.6-.06a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M443.28 12.97a1.5 1.5 0 1 1-3.01 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M443.47 12.85a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.86-.05a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M448.97 12.75a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M449.25 12.64a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.84-.06a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M454.77 12.54a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M454.95 12.42a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.98-.05a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M460.6 12.32a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M460.8 12.2a1.5 1.5 0 1 1-3 .01 1.5 1.5 0 0 1 3 0zm3.6-.05a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M466.05 12.11a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M466.25 12a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.68-.06a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M471.82 11.9a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M472.07 11.78a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm4.07-.05a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M477.8 11.68a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M478.02 11.57a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.88-.06a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M483.51 11.47a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M483.76 11.36a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.69-.06a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M489.17 11.26a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M489.34 11.14a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.63-.05a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M494.59 11.04a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M494.8 10.93a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.7-.06a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M500.3 10.83a1.5 1.5 0 1 1-3.01 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M500.53 10.72a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.69-.06a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M505.38 10.62a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M505.52 10.5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M507.6 10.45a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M508.94 10.4a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M509.09 10.29a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M511.19 10.23a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M512.31 10.19a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M512.45 10.07a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M514.76 10.02a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M515.78 9.98a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M515.92 9.86a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M518.89 9.8a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M520.64 9.76a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M520.93 9.64a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M523.16 9.59a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M524.82 9.59a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M526.51 9.55a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M526.71 9.43a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.82-.05a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M532.13 9.34a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M532.35 9.22a1.5 1.5 0 1 1-3 0 1.5 1.5 0 1 1 3 0zm3.87-.06a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M537.95 9.12a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M538.16 9a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.73-.05a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M543.45 8.9a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M543.7 8.79a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.59-.06a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M548.88 8.7a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M549.1 8.58a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.74-.06a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M554.6 8.48a1.5 1.5 0 1 1-3 0 1.5 1.5 0 1 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M554.82 8.36a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.65-.06a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M560.2 8.27a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M560.4 8.15a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.76-.05a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M565.93 8.05a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M566.25 7.94a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.55-.06a1.5 1.5 0 1 1-3.01 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M571.5 7.84a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M571.7 7.72a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.64-.05a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M576.96 7.63a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M577.46 7.5a1.5 1.5 0 1 1-3 .01 1.5 1.5 0 0 1 3 0zm3.64-.05a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M582.87 7.41a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M583.05 7.3a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.75-.06a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M588.4 7.2a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M588.6 7.08a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.63-.05a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M593.83 6.98a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M594.07 6.87a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.6-.06a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M599.54 6.77a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M599.73 6.66a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.58-.06a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M604.91 6.56a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M605.1 6.44a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.7-.06a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M610.43 6.34a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M610.67 6.23a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.81-.07a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M615.47 6.12a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M615.59 6a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M616.86 5.95a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M618.16 5.95a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm5.45-.04a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M623.73 5.86a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M624.77 5.82a1.5 1.5 0 1 1-3 .01 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M624.78 5.82a1.5 1.5 0 1 1-3 .01 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M624.8 5.8a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M624.8 5.74a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M625.61 5.74a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M53.78 153.62h578.18m-570.34 0v-5m84.04 5v-5m84.03 5v-5m84.03 5v-5m84.03 5v-5m84.03 5v-5m84.02 5v-5m-483.17 5v-2m21.01 2v-2m21.01 2v-2m42.01 2v-2m21.01 2v-2m21.01 2v-2m42.02 2v-2m21 2v-2m21.01 2v-2m42.02 2v-2m21 2v-2m21.01 2v-2m42.02 2v-2m21 2v-2m21.01 2v-2m42.01 2v-2m21.02 2v-2m21 2v-2m42.02 2v-2m21 2v-2m21.01 2v-2" fill="none" stroke="#000" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><use xlink:href="#a" x="67.41" y="227.18" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#a" x="147.63" y="227.18" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#b" x="152.53" y="227.18" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#c" x="155.25" y="227.18" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#d" x="231.66" y="227.18" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#b" x="236.57" y="227.18" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#e" x="239.29" y="227.18" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#f" x="315.69" y="227.18" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#b" x="320.6" y="227.18" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#g" x="323.32" y="227.18" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#h" x="399.72" y="227.18" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#b" x="404.63" y="227.18" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#f" x="407.35" y="227.18" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#g" x="487.56" y="227.18" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#g" x="567.78" y="227.18" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#b" x="572.69" y="227.18" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#c" x="575.41" y="227.18" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#i" x="334.46" y="241.27" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#j" x="339.71" y="241.27" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#k" x="341.76" y="241.27" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#l" x="349.31" y="241.27" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#n" x="354.05" y="241.27" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#m" x="356.86" y="241.27" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#n" x="360.3" y="241.27" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#o" x="364.31" y="241.27" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><path d="M53.78 153.62V.5m0 147.88h5m-5-23.43h5m-5-23.42h5m-5-23.43h5m-5-23.42h5m-5-23.42h5m-5-23.42h5m-5 145.22h2m-2-9.36h2m-2-4.7h2m-2-4.68h2m-2-4.68h2m-2-9.37h2m-2-4.68h2m-2-4.69h2m-2-4.68h2m-2-9.38h2m-2-4.68h2m-2-4.68h2m-2-4.68h2m-2-9.38h2m-2-4.68h2m-2-4.69h2m-2-4.68h2m-2-9.37h2m-2-4.69h2m-2-4.68h2m-2-4.68h2m-2-9.38h2m-2-4.67h2m-2-4.7h2m-2-4.68h2m-2-9.37h2" fill="none" stroke="#000" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><use xlink:href="#a" x="51.56" y="213.93" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#f" x="31.74" y="190.51" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#p" x="36.65" y="190.51" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="41.56" y="190.51" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="46.47" y="190.51" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="51.38" y="190.51" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#p" x="31.74" y="167.08" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="36.65" y="167.08" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="41.56" y="167.08" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="46.47" y="167.08" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="51.38" y="167.08" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#q" x="31.74" y="143.66" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#p" x="36.65" y="143.66" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="41.56" y="143.66" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="46.47" y="143.66" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="51.38" y="143.66" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#d" x="27.29" y="120.24" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="32.2" y="120.24" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="37.11" y="120.24" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="42.01" y="120.24" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="46.92" y="120.24" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="51.83" y="120.24" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#d" x="27.29" y="96.81" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#f" x="32.2" y="96.81" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#p" x="37.11" y="96.81" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="42.01" y="96.81" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="46.92" y="96.81" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="51.83" y="96.81" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#d" x="27.29" y="73.39" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#p" x="32.2" y="73.39" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="37.11" y="73.39" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="42.01" y="73.39" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="46.92" y="73.39" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="51.83" y="73.39" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#r" x="15.08" y="182.47" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#s" x="15.08" y="177.47" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#t" x="15.08" y="172.73" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#u" x="15.08" y="167.76" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#s" x="15.08" y="162.74" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#v" x="15.08" y="158" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#w" x="15.08" y="152.98" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#s" x="15.08" y="148.84" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#z" x="15.08" y="144.1" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#x" x="15.08" y="141.28" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#u" x="15.08" y="135.28" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#y" x="15.08" y="130.26" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#z" x="15.08" y="122.71" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#s" x="15.08" y="117.73" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#A" x="15.08" y="113" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#z" x="15.08" y="109.76" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#B" x="15.08" y="106.94" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#C" x="15.08" y="103.5" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#D" x="15.08" y="98.2" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/></svg>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mitogen-0.3.9/docs/images/ansible/run_hostname_100_times_plain.svg����������������������������������0000664�0000000�0000000�00000306251�14656664731�0025217�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 632.46 181.53" height="242.04" width="843.28"><defs><symbol id="a" overflow="visible"><path d="M4.55-3.28c0 1.19-.17 2.05-.52 2.6-.33.55-.86.82-1.58.82C1.73.14 1.21-.14.87-.7a4.97 4.97 0 0 1-.51-2.57c0-1.17.17-2.03.52-2.59.34-.54.86-.81 1.57-.81.72 0 1.25.28 1.6.84.33.58.5 1.42.5 2.55zm-1.13 2c.08-.2.15-.48.19-.81a12.89 12.89 0 0 0 0-2.35c-.04-.33-.1-.6-.19-.83a1.4 1.4 0 0 0-.36-.51 1.01 1.01 0 0 0-.6-.17.98.98 0 0 0-.6.17c-.16.12-.28.3-.38.51-.09.23-.15.52-.17.85a11.37 11.37 0 0 0-.02 2.3c.04.3.1.58.2.82.08.23.2.4.35.52.16.12.36.19.61.19.24 0 .44-.05.61-.18.15-.1.27-.28.36-.51zm0 0"/></symbol><symbol id="b" overflow="visible"><path d="M4.69-2.25H3.9V0h-.85v-2.25H.17v-.92l2.94-3.38h.8v3.6h.78zm-1.63-.7v-2.57L.86-2.95zm0 0"/></symbol><symbol id="c" overflow="visible"><path d="M3.55-5.02c0-.28-.1-.53-.3-.73-.2-.2-.47-.3-.81-.3-.33 0-.59.1-.78.27a.88.88 0 0 0-.32.7c0 .22.05.4.16.56.1.15.26.28.47.4l.42.21c.18.09.34.16.5.2.25-.19.42-.4.52-.6.09-.2.14-.43.14-.7zm.12 3.29c0-.27-.05-.49-.15-.65-.11-.16-.31-.32-.61-.48a20.16 20.16 0 0 0-.97-.42c-.24.17-.42.37-.55.6-.14.23-.2.5-.2.8 0 .4.11.73.36.99.24.26.54.39.9.39.37 0 .66-.11.9-.34.21-.22.32-.52.32-.9zM2.44.16a2.5 2.5 0 0 1-.9-.16C1.3-.1 1.07-.23.88-.4.7-.59.55-.8.46-1.06c-.1-.24-.14-.49-.14-.76 0-.35.1-.68.28-.97.2-.29.46-.53.83-.72v-.02C1.1-3.7.85-3.9.7-4.14c-.15-.22-.23-.5-.23-.83 0-.49.19-.9.56-1.23.36-.32.83-.49 1.4-.49.6 0 1.08.15 1.44.46.36.32.54.72.54 1.2a1.71 1.71 0 0 1-1 1.55v.03c.38.18.67.39.87.64.2.26.3.59.3.98 0 .56-.2 1.03-.61 1.4-.42.4-.93.59-1.53.59zm0 0"/></symbol><symbol id="d" overflow="visible"><path d="M4.17 0H.98v-.67h1.2v-4.38H.97v-.6c.44 0 .77-.07.99-.2.2-.12.33-.36.36-.71h.69v5.89h1.15zm0 0"/></symbol><symbol id="e" overflow="visible"><path d="M4.5 0H.47v-.92l.81-.78a14.92 14.92 0 0 0 1.78-2.11c.18-.33.27-.67.27-1.02 0-.19-.03-.35-.08-.48a1.21 1.21 0 0 0-.23-.35c-.11-.08-.23-.14-.36-.2a1.58 1.58 0 0 0-.91 0c-.17.04-.32.09-.47.14l-.36.19a6.4 6.4 0 0 1-.28.17H.6v-.92a4.44 4.44 0 0 1 1.69-.4c.6 0 1.08.16 1.44.48.34.33.51.77.51 1.33 0 .26-.04.5-.09.7A3.02 3.02 0 0 1 3.5-3l-.48.55-.93.93-.8.77H4.5zm0 0"/></symbol><symbol id="f" overflow="visible"><path d="M4.6-2.13c0 .35-.06.66-.16.94A2.14 2.14 0 0 1 3.33-.02c-.24.1-.51.16-.8.16-.3 0-.57-.05-.81-.16-.24-.09-.45-.23-.64-.43-.23-.24-.4-.56-.53-.96a6.38 6.38 0 0 1-.02-3.02c.11-.45.3-.84.55-1.18.24-.33.54-.6.92-.78.36-.19.8-.28 1.3-.28l.4.03c.13.01.24.03.33.06v.85H4a2.7 2.7 0 0 0-.34-.13 2.46 2.46 0 0 0-.49-.05c-.54 0-.98.19-1.31.55a2.6 2.6 0 0 0-.6 1.64c.2-.14.42-.26.65-.34.22-.07.45-.11.72-.11.25 0 .47.02.67.06.18.06.38.17.6.31.23.2.4.42.52.7.13.27.19.6.19.98zm-.88.04c0-.26-.04-.49-.11-.68a1.28 1.28 0 0 0-.34-.46 1.34 1.34 0 0 0-.4-.2l-.45-.02c-.2 0-.4.03-.6.1-.18.05-.37.13-.55.26-.02.06-.02.12-.02.18a3.43 3.43 0 0 0 .13 1.31c.09.29.2.5.32.65.13.13.26.23.4.3.13.05.27.07.43.07.35 0 .64-.12.86-.37.2-.25.32-.63.33-1.14zm0 0"/></symbol><symbol id="g" overflow="visible"><path d="M2.25-5.92c-.16 0-.32.02-.48.06l-.46.14a2.78 2.78 0 0 0-.65.38H.6v-.94a4.5 4.5 0 0 1 1.7-.4c.3 0 .55.04.78.09.22.06.42.15.6.28a1.43 1.43 0 0 1 .6 1.2c0 .37-.13.68-.37.95-.24.28-.53.45-.86.52v.06c.14.03.29.08.46.14.14.08.28.17.43.28.14.14.25.3.33.49a2.14 2.14 0 0 1-.45 2.2 2 2 0 0 1-.69.45c-.27.1-.58.16-.92.16-.34 0-.67-.04-.99-.12C.91-.05.64-.15.43-.27v-.93h.05c.2.15.44.27.75.39.3.12.61.19.93.19.18 0 .36-.04.54-.1.18-.05.33-.14.46-.26A1.48 1.48 0 0 0 3.52-2a1.87 1.87 0 0 0-.11-.6.88.88 0 0 0-.29-.35 1.48 1.48 0 0 0-.43-.2l-.55-.04h-.37v-.72h.28c.4 0 .72-.09.97-.28.25-.18.37-.46.37-.83 0-.15-.03-.3-.1-.42-.07-.11-.15-.2-.24-.28a1.32 1.32 0 0 0-.38-.16 1.89 1.89 0 0 0-.42-.04zm0 0"/></symbol><symbol id="h" overflow="visible"><path d="M2.19 0v-5.77H0v-.78h5.27v.78h-2.2V0zm0 0"/></symbol><symbol id="i" overflow="visible"><path d="M1.42 0H.6v-4.9h.83zm.06-5.73H.55v-.86h.93zm0 0"/></symbol><symbol id="j" overflow="visible"><path d="M6.17 0v-2.84c0-.22-.01-.43-.03-.63a1.1 1.1 0 0 0-.1-.45.52.52 0 0 0-.26-.25.92.92 0 0 0-.44-.1c-.18.02-.36.07-.54.16-.2.1-.4.26-.61.45l.01.2V0h-.8v-2.84c0-.22-.02-.43-.04-.63a1.67 1.67 0 0 0-.11-.45.62.62 0 0 0-.25-.25.92.92 0 0 0-.44-.1c-.19.02-.37.07-.56.18-.2.11-.4.25-.58.42V0H.6v-4.9h.83v.54c.22-.22.43-.39.64-.51a1.54 1.54 0 0 1 1.48.03c.23.12.39.34.5.64.26-.27.5-.48.74-.63a1.6 1.6 0 0 1 1.34-.13c.18.08.33.19.46.33.13.15.24.34.31.57.07.22.11.5.11.83V0zm0 0"/></symbol><symbol id="k" overflow="visible"><path d="M2.73.1C1.95.13 1.34-.1.91-.54.47-.98.25-1.6.27-2.42c0-.8.2-1.44.62-1.92.41-.47.96-.7 1.64-.7.3 0 .57.04.81.13a1.698 1.698 0 0 1 1.01 1.1c.1.27.15.6.15 1v.44H1.1c0 .57.14 1 .43 1.3.28.31.68.46 1.19.46.17 0 .35-.02.53-.06.18-.03.34-.08.48-.16.15-.06.27-.13.38-.2.1-.05.18-.11.25-.17h.05v.9c-.1.05-.22.1-.36.14a3.27 3.27 0 0 1-1.32.27zM3.7-3a2.45 2.45 0 0 0-.1-.58 1.3 1.3 0 0 0-.18-.4c-.1-.13-.23-.22-.37-.29-.16-.06-.35-.09-.57-.09-.21 0-.4.03-.56.1a1.25 1.25 0 0 0-.7.71c-.06.16-.1.34-.13.55zm0 0"/></symbol><symbol id="l" overflow="visible"><path d="M3.13 1.81H2.1C1.6 1.21 1.2.57.92-.1a5.81 5.81 0 0 1-.45-2.4c0-.9.14-1.7.44-2.4.29-.67.69-1.32 1.2-1.93h1.02v.04c-.25.22-.47.47-.7.74a6.43 6.43 0 0 0-1 2.17A5.59 5.59 0 0 0 1.84.05a5.25 5.25 0 0 0 1.28 1.72zm0 0"/></symbol><symbol id="m" overflow="visible"><path d="M1.9.13c-.33 0-.63-.05-.92-.15a3.37 3.37 0 0 1-.7-.28v-.92h.05a2.43 2.43 0 0 0 .62.4c.14.07.3.12.47.16.17.06.34.08.52.08.13 0 .27-.01.42-.05.14-.03.26-.07.34-.12.1-.06.17-.13.22-.2a.75.75 0 0 0 .06-.35c0-.2-.05-.34-.15-.45-.12-.1-.31-.18-.58-.25l-.4-.1a3.49 3.49 0 0 1-.48-.1 1.4 1.4 0 0 1-.8-.5 1.3 1.3 0 0 1-.27-.83c0-.44.16-.8.5-1.08.33-.27.78-.41 1.34-.42.26.01.53.05.81.1.27.07.5.16.7.26v.89h-.04a2.35 2.35 0 0 0-1.5-.55c-.27 0-.5.06-.69.17a.57.57 0 0 0-.28.52c0 .21.06.36.17.45.1.1.28.19.53.25l.43.1.46.1c.37.1.65.25.83.46.18.22.27.5.27.86 0 .22-.04.42-.13.6-.08.2-.2.36-.36.5-.18.14-.37.25-.59.32-.23.08-.51.13-.84.13zm0 0"/></symbol><symbol id="n" overflow="visible"><path d="M2.95-2.52c0 .91-.15 1.7-.43 2.4-.3.68-.7 1.33-1.2 1.93h-1v-.04A5.71 5.71 0 0 0 1.58.05 5.7 5.7 0 0 0 2-3.89 6.18 6.18 0 0 0 .99-6.06a8.5 8.5 0 0 0-.67-.74v-.04h1a6.13 6.13 0 0 1 1.64 4.33zm0 0"/></symbol><symbol id="o" overflow="visible"><path d="M4.42-2.08A2.25 2.25 0 0 1 3.86-.5c-.19.2-.42.36-.69.47-.28.11-.59.17-.92.17a3.9 3.9 0 0 1-.92-.1 2.89 2.89 0 0 1-.8-.27v-.94H.6L.88-1a3.14 3.14 0 0 0 .9.33c.13.03.29.05.47.05s.35-.04.52-.1c.16-.06.3-.16.43-.31a1.48 1.48 0 0 0 .33-1.06c0-.23-.03-.42-.1-.57a.92.92 0 0 0-.26-.37c-.13-.1-.3-.18-.47-.24-.18-.03-.39-.06-.6-.06a5.5 5.5 0 0 0-1.3.16v-3.38h3.6v.77H1.63v1.75l.31-.03h.28c.34 0 .62.02.86.08a2 2 0 0 1 .66.32c.22.16.38.36.5.61.11.25.17.58.17.97zm0 0"/></symbol><symbol id="p" overflow="visible"><path d="M4.58-5.56L1.75 0H.81L3.8-5.78H.42v-.77h4.16zm0 0"/></symbol><symbol id="q" overflow="visible"><path d="M.13-2.47A4.96 4.96 0 0 1-.4-.33h-1.1v-.06c.28-.28.49-.6.63-.97.15-.36.22-.71.22-1.05 0-.47-.1-.84-.3-1.09a.96.96 0 0 0-.8-.38 1.1 1.1 0 0 0-.62.2c-.16.13-.29.34-.37.62a29.45 29.45 0 0 1-.52 1.8 1.63 1.63 0 0 1-1.55.89c-.52 0-.96-.2-1.33-.61a2.38 2.38 0 0 1-.53-1.6 4.85 4.85 0 0 1 .43-1.94h1.03v.07a2.79 2.79 0 0 0-.7 1.83c0 .4.09.71.28.96.18.27.43.39.75.38.28 0 .5-.07.65-.22.17-.14.29-.36.36-.64a18 18 0 0 1 .34-1.33c.14-.46.35-.79.63-1a1.86 1.86 0 0 1 1.78-.16c.25.11.47.25.64.44.19.22.34.46.44.72.1.27.15.6.15 1zm0 0"/></symbol><symbol id="r" overflow="visible"><path d="M.1-2.73c.02.78-.2 1.39-.65 1.82-.43.44-1.06.66-1.87.64-.8 0-1.44-.2-1.92-.62-.47-.41-.7-.96-.7-1.64 0-.3.04-.57.13-.81a1.698 1.698 0 0 1 1.1-1.01c.27-.1.6-.15 1-.15h.44v3.4c.57 0 1-.14 1.3-.43.31-.28.46-.68.46-1.19 0-.17-.02-.35-.06-.53a1.76 1.76 0 0 0-.16-.48 2.1 2.1 0 0 0-.2-.38c-.05-.1-.11-.18-.17-.25v-.05h.9c.05.1.1.22.14.36a3.27 3.27 0 0 1 .27 1.32zM-3-3.7c-.22 0-.41.04-.58.1-.15.03-.29.1-.4.18-.13.1-.22.23-.29.37-.06.16-.09.35-.09.57 0 .21.03.4.1.56a1.25 1.25 0 0 0 .71.7c.16.06.34.1.55.13zm0 0"/></symbol><symbol id="s" overflow="visible"><path d="M1.81-4.38v.83H-.53c.22.25.37.48.47.7.1.24.15.49.15.76 0 .56-.22 1-.67 1.34-.44.32-1.05.48-1.86.48a2.89 2.89 0 0 1-1.94-.62 1.87 1.87 0 0 1-.67-1.44 2.37 2.37 0 0 1 .34-1.22l-.2-.06v-.77zm-3.04.83h-2.8a2.33 2.33 0 0 0-.27 1.08c0 .44.16.77.47 1 .31.24.76.36 1.35.36.58 0 1.02-.1 1.32-.28.32-.19.47-.48.47-.88a2 2 0 0 0-.55-1.28zm0 0"/></symbol><symbol id="t" overflow="visible"><path d="M0-4.42v.83h-.55c.23.25.4.49.5.71.13.24.2.49.2.77 0 .22-.05.42-.12.61-.07.19-.18.36-.33.5-.15.14-.34.24-.57.31-.23.09-.51.13-.85.13H-4.9v-.83h2.8c.26 0 .48 0 .64-.03.18-.02.33-.06.45-.13a.61.61 0 0 0 .29-.28c.05-.11.07-.28.07-.5 0-.2-.05-.4-.17-.64a2.83 2.83 0 0 0-.42-.62H-4.9v-.83zm0 0"/></symbol><symbol id="u" overflow="visible"><path d="M0-4.45v.83h-2.8c-.22 0-.42 0-.62.03-.2.02-.35.06-.47.12a.75.75 0 0 0-.28.28c-.05.13-.08.3-.1.49 0 .2.06.42.18.64.11.22.25.43.42.64H0v.83h-4.9v-.83h.54a3.07 3.07 0 0 1-.51-.74 1.73 1.73 0 0 1-.18-.75c0-.48.16-.86.47-1.14.33-.27.8-.4 1.4-.4zm0 0"/></symbol><symbol id="v" overflow="visible"><path d="M.1-2.55c0 .34-.05.64-.15.92A1.94 1.94 0 0 1-1.3-.43c-.32.11-.7.16-1.14.16a2.77 2.77 0 0 1-1.9-.62c-.22-.2-.38-.44-.5-.73a2.69 2.69 0 0 1-.06-1.7c.08-.26.17-.48.27-.68h.92v.05l-.17.22-.2.34a3.05 3.05 0 0 0-.22.86c0 .43.17.77.48 1.03.34.26.8.4 1.38.4a2.1 2.1 0 0 0 1.36-.4c.32-.24.48-.58.48-1.03a2.12 2.12 0 0 0-.6-1.42V-4h.93a4.37 4.37 0 0 1 .36 1.02c.02.11.03.26.03.43zm0 0"/></symbol><symbol id="w" overflow="visible"><path d="M0-5.33v.97l-5.64 2.9H0v.82h-6.55V-1.9l5.2-2.63h-5.2v-.8zm0 0"/></symbol><symbol id="x" overflow="visible"><path d="M0-6.17h-2.84c-.22 0-.43.01-.63.03a1.1 1.1 0 0 0-.45.1.52.52 0 0 0-.25.26.92.92 0 0 0-.1.44c.02.18.07.36.16.54.1.2.26.4.45.61l.2-.01H0v.8h-2.84c-.22 0-.43.02-.63.04-.19.02-.33.06-.45.11a.62.62 0 0 0-.25.25.92.92 0 0 0-.1.44c.02.19.07.37.18.56.11.2.25.4.42.58H0v.83h-4.9v-.83h.54c-.22-.22-.39-.43-.51-.64a1.54 1.54 0 0 1 .03-1.48c.12-.23.34-.39.64-.5-.27-.26-.48-.5-.63-.74a1.6 1.6 0 0 1-.13-1.34c.08-.18.19-.33.33-.46.15-.13.34-.24.57-.31.22-.07.5-.11.83-.11H0zm0 0"/></symbol><symbol id="y" overflow="visible"><path d="M-2.47-3.86c-.58 0-1.03.09-1.34.27-.3.18-.46.46-.46.86 0 .23.06.46.18.68.1.23.23.44.39.63h2.8a2 2 0 0 0 .28-1.1c.01-.41-.14-.74-.44-.98s-.76-.36-1.4-.36zm-.06-.86c.8 0 1.45.2 1.94.6.49.38.73.87.73 1.45 0 .27-.04.5-.1.69-.07.18-.16.37-.27.56l.23.04v.79h-6.84v-.83h2.45c-.19-.2-.34-.43-.47-.67a1.82 1.82 0 0 1-.19-.83c0-.55.23-.99.67-1.31a3.12 3.12 0 0 1 1.85-.49zm0 0"/></symbol><symbol id="z" overflow="visible"><path d="M-4.02-3.2v.04l-.04.2v.24c0 .23.04.45.14.67.1.22.25.43.44.63H0v.83h-4.9v-.83h.73a3.9 3.9 0 0 1-.58-.8c-.1-.22-.16-.43-.16-.64v-.2a.64.64 0 0 0 .04-.14zm0 0"/></symbol><symbol id="A" overflow="visible"><path d="M1.81-3.13v1.02C1.21-1.6.57-1.2-.1-.92c-.68.3-1.48.45-2.4.45-.9 0-1.7-.14-2.4-.44a7.92 7.92 0 0 1-1.93-1.2v-1.02h.04c.22.25.47.47.74.7a6.43 6.43 0 0 0 2.17 1 5.59 5.59 0 0 0 3.94-.42 5.25 5.25 0 0 0 1.72-1.28zm0 0"/></symbol><symbol id="B" overflow="visible"><path d="M-2.02-5.1c.34 0 .63.07.88.2.25.12.45.29.6.5.2.24.34.5.42.8.08.27.12.63.12 1.07v1.89h-6.55V-2.4c0-.46.02-.8.05-1.05.03-.22.1-.45.22-.67.12-.23.3-.4.5-.5.21-.11.45-.17.72-.17.31 0 .59.08.83.25.24.17.43.39.56.67h.03c.12-.38.3-.69.58-.9.29-.22.64-.33 1.04-.33zm-2.92 1.22c-.15 0-.3.03-.42.08a.59.59 0 0 0-.26.25c-.09.15-.14.31-.16.49l-.02.7v.84h1.9v-.98c.02-.28 0-.48-.02-.6a1.57 1.57 0 0 0-.17-.42.74.74 0 0 0-.35-.28c-.13-.05-.3-.08-.5-.08zm2.97-.3c-.25 0-.45.03-.6.1a.87.87 0 0 0-.41.42c-.07.15-.12.3-.15.46-.01.16-.03.4-.03.7v.98h2.41v-.7c0-.38-.02-.69-.05-.9-.03-.22-.1-.42-.22-.58a1.06 1.06 0 0 0-.39-.36 1.46 1.46 0 0 0-.56-.13zm0 0"/></symbol><symbol id="C" overflow="visible"><path d="M-2.52-2.95c.91 0 1.7.15 2.4.43.68.3 1.33.7 1.93 1.2v1h-.04A5.71 5.71 0 0 0 .05-1.58 5.7 5.7 0 0 0-3.89-2 6.18 6.18 0 0 0-6.06-.99a8.5 8.5 0 0 0-.74.67h-.04v-1a6.13 6.13 0 0 1 4.33-1.64zm0 0"/></symbol></defs><path d="M69.28 153.62V1.5" fill="none" stroke="#c7c7c7" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M134.93 153.62V1.5m65.64 152.12V1.5m65.65 152.12V1.5m65.64 152.12V1.5m65.64 152.12V1.5m65.65 152.12V1.5m65.65 152.12V1.5m65.64 152.12V1.5" fill="none" stroke="#c7c7c7" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10" stroke-dasharray="1.00055247,2.00110494"/><path d="M59.78 144.77h571.18" fill="none" stroke="#c7c7c7" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M59.78 126.63h571.18M59.78 108.48h571.18M59.78 90.33h571.18M59.78 72.19h571.18M59.78 54.04h571.18M59.78 35.9h571.18M59.78 17.75h571.18" fill="none" stroke="#c7c7c7" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10" stroke-dasharray="1.00055247,2.00110494"/><use xlink:href="#a" x="175.29" y="18.17" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#a" x="238.06" y="18.17" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#a" x="305.22" y="18.17" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#a" x="327.63" y="18.17" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#a" x="439.29" y="18.17" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#a" x="456.09" y="18.17" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><path d="M69.03 144.77h.5v-.02h1.5v-.02h.5v-.02h1v-1.35h5.01V142h6v-1.35h6v-1.35h5v-1.35h5.5v-.01h.5v-1.35h5v-1.35h6v-1.36h5.01v-1.35h6v-1.35h5v-1.36h5v-1.35h6v-1.35h5.01v-1.36h6v-1.35h5v-1.36h5v-1.35h6v-1.35h5v-1.36h6v-1.35h4.01v-1.36h6v-1.35h5v-1.35h5v-1.35h5v-1.36h5v-1.35h6.01v-1.36h5v-1.35h4v-1.35h6v-1.36h5.01v-.6h.5v-.3h.5v-.45h5v-1.35h5v-1.36h6V98.7h5v-1.36h6v-1.35h5v-1.35h6v-1.35h5.01v-1.36h6v-1.35h5V89.2h6v-1.35h6V86.5h4v-1.36h6V83.8h5v-1.36h6.01V81.1h6v-1.35h5v-1.36h6.01v-1.35h5.5v-.3h.5v-1.05h4v-1.36h6v-1.35h6V71.6h5v-1.35h6.01V68.9h5v-1.35h6V66.2h5v-1.35h6v-1.36h4v-1.35h6.01v-1.35h6v-1.36h5v-1.35h6v-1.35h6v-1.36h5v-1.35h6v-1.36h6v-1.35h5.01v-1.35h6V48.6h6v-1.35h5v-1.36h4v-1.35h6.01v-1.35h6v-1.35h6v-1.36h5v-1.35h6.01v-1.36h6v-1.35h4v-1.35h6V33.7h5v-1.35h5V31h6v-1.36h5V28.3h6.01v-1.35h6v-1.36h5v-1.35h6v-1.35h6.01v-1.36h5v-1.35h6v-1.35h5v-1.35h6v-1.36h5v-1.35h6V13.4h6v-1.35h6V10.7h5.51v-.01h.5V9.35h8" fill="none" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M70.79 144.77a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M71.03 144.75a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M71.35 144.74a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M72.09 144.74a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M72.53 144.73a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M72.67 144.71a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M73.59 144.7a1.5 1.5 0 1 1-3 .01 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M73.65 143.36a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M75.66 143.36a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.07 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M79.25 142a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M81.21 142a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.16 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M84.92 140.65a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M86.94 140.65a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.06 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M90 140.65a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M90.43 140.65a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M90.47 139.3a1.5 1.5 0 1 1-3.01 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M92.43 139.3a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M95.4 139.3a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M95.84 137.95a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M97.48 137.95a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.36-.01a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M101.28 137.94a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M101.3 137.94a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M101.32 136.59a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M103.35 136.59a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.34 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M107.2 135.24a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M109.25 135.23a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M112.13 135.23a1.5 1.5 0 1 1-3 .01 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M112.14 135.23a1.5 1.5 0 1 1-3.01 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M112.57 135.23a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M112.63 133.88a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M114.67 133.88a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.1 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M118.22 132.53a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M119.82 132.53a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M123.28 132.53a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M123.32 132.52a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M123.34 131.18a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M125.44 131.18a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M128.32 131.18a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M128.78 129.82a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M130.25 129.82a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.01 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M133.26 129.82a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M133.75 129.82a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M133.82 128.47a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M135.85 128.47a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.13 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M138.98 128.47a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M139.4 128.47a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M139.45 127.12a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M141.62 127.11a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M144.5 127.11a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M144.95 125.76a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M146.73 125.76a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.15 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M149.88 125.76a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M150.37 125.76a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M150.43 124.41a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M152.48 124.4a1.5 1.5 0 1 1-3 .01 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M155.48 124.4a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M155.94 123.05a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M157.93 123.05a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M160.73 123.05a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M161.27 121.7a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M163.36 121.7a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.07 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M166.88 120.35a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M168.64 120.35a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.06 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 1 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M172.15 119a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M174.12 119a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M177.1 119a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M177.11 119a1.5 1.5 0 1 1-3-.01 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M177.53 119a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M177.56 117.64a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M178.78 117.64a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M181.32 117.64a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M181.87 116.29a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M184 116.29a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.04 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M187.04 116.29a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M187.48 116.29a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M187.51 114.93a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M189.27 114.93a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M192.08 114.93a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M192.09 114.93a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M192.51 114.93a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M192.55 113.58a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M194.29 113.58a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M197.17 113.58a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M197.17 113.58a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M197.73 113.58a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M197.8 112.23a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M199.88 112.23a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M202.78 112.22a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M203.26 110.87a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M204.63 110.87a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.03 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M208.13 109.52a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M210.15 109.52a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M213.08 109.52a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M213.08 109.52a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M213.5 109.52a1.5 1.5 0 1 1-3.01 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M213.53 108.16a1.5 1.5 0 1 1-3 .01 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M215.2 108.16a1.5 1.5 0 1 1-3.01 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M218.1 108.16a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M218.1 108.16a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M218.53 108.16a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M218.56 106.81a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M219.8 106.81a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M222.59 106.8a1.5 1.5 0 1 1-3 .01 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M223.1 105.46a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M225.24 105.46a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M228.12 105.46a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M228.12 105.46a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M228.67 105.46a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M228.73 104.1a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M230.88 104.1a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M234.34 103.5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M234.34 103.2a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M234.34 102.75a1.5 1.5 0 1 1-3.01 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M236.12 102.75a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M239 102.75a1.5 1.5 0 1 1-3 0 1.5 1.5 0 1 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M239 102.75a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M239.56 102.75a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M239.63 101.4a1.5 1.5 0 1 1-3 0 1.5 1.5 0 1 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M241.75 101.4a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M244.73 101.4a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M245.2 100.04a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M247 100.04a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.08 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M250.08 100.04a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M250.52 100.04a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M250.56 98.7a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M252.01 98.69a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.06 0a1.5 1.5 0 1 1-3.01 0 1.5 1.5 0 0 1 3.01 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M255.07 98.69a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M255.81 98.69a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M255.89 97.34a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M258.01 97.34a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M261.02 97.34a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M261.46 97.34a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M261.51 95.98a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M263.66 95.98a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M266.56 95.98a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M267.14 94.63a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M269.32 94.63a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.24 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M273.02 93.28a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M274.67 93.27a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.06 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M278.2 91.92a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M280.32 91.92a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M283.27 91.92a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M283.28 91.92a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M283.71 91.92a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M283.75 90.57a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M285.62 90.57a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.04 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M289.18 89.22a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M291.34 89.22a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.09 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M294.9 87.86a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M297.06 87.86a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M300 87.86a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M300 87.86a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M300.44 87.86a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M300.47 86.5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M301.73 86.5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M304.59 86.5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M305.23 85.15a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M307.36 85.15a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.02 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M310.84 83.8a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M312.68 83.8a1.5 1.5 0 1 1-3 0 1.5 1.5 0 1 1 3 0zm3.03 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M316.18 82.45a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M318.36 82.45a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.04 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M322.21 81.1a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M324.31 81.1a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M327.25 81.09a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M327.25 81.09a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M327.67 81.09a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M327.7 79.74a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M328.99 79.74a1.5 1.5 0 1 1-3.01 0 1.5 1.5 0 0 1 3 0zm3.25 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M332.24 79.74a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M332.8 79.74a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M332.88 78.39a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M335.04 78.39a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.18-.01a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M338.22 78.38a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M338.66 78.38a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M338.7 77.03a1.5 1.5 0 1 1-3.01 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M340.76 77.03a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.1 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M344.37 77.03a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M344.37 76.73a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M344.38 75.68a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M345.65 75.68a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M348.5 75.68a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M349.1 74.32a1.5 1.5 0 1 1-3 .01 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M351.34 74.32a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.26 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M355.07 72.97a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M357.14 72.97a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.06 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M360.2 72.97a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M360.63 72.97a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M360.66 71.62a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M362.18 71.62a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.21 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M365.87 70.27a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M367.96 70.27a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.4-.01a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M371.36 70.26a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M371.8 70.26a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M371.84 68.91a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M373.2 68.91a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M376.2 68.91a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M376.8 68.91a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M376.89 67.56a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M379.11 67.56a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3-.01a1.5 1.5 0 1 1-3 .01 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M382.12 67.55a1.5 1.5 0 1 1-3 .01 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M382.55 67.55a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M382.6 66.2a1.5 1.5 0 1 1-3.01 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M384.55 66.2a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M388.02 64.85a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M390.06 64.85a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.23 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M393.3 64.85a1.5 1.5 0 1 1-3.01 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M393.78 64.85a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M393.82 63.5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M395.1 63.5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M397.76 63.5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 1 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M398.26 62.14a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M400.17 62.14a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.38 0a1.5 1.5 0 1 1-3.01 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M404.03 60.79a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M405.83 60.79a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.22 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M409.05 60.79a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M409.5 60.79a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M409.54 59.44a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M411.46 59.43a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.12 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M415.07 58.08a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M417.27 58.08a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.18 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M420.9 56.73a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M423.12 56.73a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.02 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M426.14 56.73a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M426.6 56.73a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M426.66 55.38a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M427.96 55.38a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.05 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M431.02 55.38a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M431.53 55.37a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M431.6 54.02a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M433.94 54.02a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.26 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M437.2 54.02a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M437.64 54.02a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M437.68 52.67a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M439.8 52.67a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.07 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M443.4 52.66a1.5 1.5 0 1 1-3 .01 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M443.4 52.66a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M443.46 51.32a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M445.63 51.31a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.26 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M449.36 49.96a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M451.45 49.96a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.17 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 1 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M455.11 48.6a1.5 1.5 0 1 1-3 .01 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M457.3 48.6a1.5 1.5 0 1 1-3 .01 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M460.26 48.6a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M460.27 48.6a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M460.84 48.6a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M460.9 47.25a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M462.33 47.25a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M465.02 47.25a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M465.03 47.25a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M465.47 47.25a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M465.5 45.9a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M466.78 45.9a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M469.7 45.9a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M470.35 44.55a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M472.51 44.55a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.2-.01a1.5 1.5 0 1 1-3 .01 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M476.22 43.2a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M477.95 43.2a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.03 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M480.98 43.2a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M481.48 43.2a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M481.55 41.84a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M483.85 41.84a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.22 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M487.07 41.84a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M487.54 41.84a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M487.59 40.48a1.5 1.5 0 1 1-3 .01 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M489.28 40.48a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M492.28 40.48a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M492.82 40.48a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M492.88 39.13a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M495.1 39.13a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.13 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M498.23 39.13a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M498.73 39.13a1.5 1.5 0 1 1-3.01 0 1.5 1.5 0 0 1 3.01 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M498.79 37.78a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M501.01 37.78a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.06 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M504.07 37.78a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M504.51 37.78a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M504.55 36.43a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M505.8 36.43a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M508.27 36.42a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M508.27 36.42a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M508.82 36.42a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M508.89 35.07a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M511.07 35.07a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.21 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M514.28 35.07a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M514.73 35.07a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M514.76 33.72a1.5 1.5 0 1 1-3 0 1.5 1.5 0 1 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M516.44 33.72a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.1 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M520.02 32.36a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M521.59 32.36a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M524.57 32.36a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M525.21 31.01a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M527.42 31.01a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.18-.01a1.5 1.5 0 1 1-3 .01 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M531.09 29.66a1.5 1.5 0 1 1-3.01 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M532.54 29.66a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M535.5 29.66a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M536.19 28.3a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M538.34 28.3a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M541.33 28.3a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M541.33 28.3a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M541.86 28.3a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M541.93 26.95a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M544.08 26.95a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.06 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M547.14 26.95a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M547.58 26.95a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M547.64 25.6a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M549.55 25.6a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.05 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M553.16 24.24a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M555.36 24.24a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.49 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M559.32 22.9a1.5 1.5 0 1 1-3-.01 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M561.42 22.89a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.09 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M565.04 21.54a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M566.59 21.54a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M569.2 21.54a1.5 1.5 0 1 1-3.01 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M569.2 21.54a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M569.82 21.54a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M569.9 20.18a1.5 1.5 0 1 1-3 0 1.5 1.5 0 1 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M572.06 20.18a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.02 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M575.08 20.18a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M575.66 20.18a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M575.73 18.83a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M577.9 18.83a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M580.82 18.83a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M581.39 17.48a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M583.55 17.47a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M586.48 17.47a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M586.97 16.12a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M588.8 16.12a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.07 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M592.42 14.77a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M594.56 14.77a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M597.4 14.77a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M597.4 14.77a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M598.04 14.77a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M598.1 13.41a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M600.23 13.41a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M603.14 13.41a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M603.14 13.41a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M603.69 13.41a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M603.76 12.06a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M605.96 12.06a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.01 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M608.98 12.06a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M609.69 12.06a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M609.75 10.7a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M611.91 10.7a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M614.85 10.7a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M615.44 10.7a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M615.48 10.7a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M615.5 9.35a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M617.61 9.35a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.1 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M620.71 9.35a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm3.16 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M623.95 9.35a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 0" fill="#1e4a85" fill-rule="evenodd" stroke="#1e4a85" stroke-width=".5" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><path d="M59.78 153.62h572.18m-562.68 0v-5m65.65 5v-5m65.64 5v-5m65.65 5v-5m65.64 5v-5m65.64 5v-5m65.65 5v-5m65.65 5v-5m65.64 5v-5m-508.74 5v-2m16.4 2v-2m16.42 2v-2m32.82 2v-2m16.41 2v-2m16.41 2v-2m32.83 2v-2m16.41 2v-2m16.4 2v-2m32.83 2v-2m16.41 2v-2m16.41 2v-2m32.83 2v-2m16.41 2v-2m16.41 2v-2m32.82 2v-2m16.41 2v-2m16.41 2v-2m32.82 2v-2m16.42 2v-2m16.41 2v-2m32.81 2v-2m16.42 2v-2m16.41 2v-2m32.82 2v-2m16.41 2v-2" fill="none" stroke="#000" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><use xlink:href="#a" x="75.07" y="227.18" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#b" x="140.72" y="227.18" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#c" x="206.36" y="227.18" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#d" x="269.55" y="227.18" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#e" x="274.46" y="227.18" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#d" x="335.19" y="227.18" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#f" x="340.1" y="227.18" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#e" x="400.84" y="227.18" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#a" x="405.75" y="227.18" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#e" x="466.48" y="227.18" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#b" x="471.39" y="227.18" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#e" x="532.13" y="227.18" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#c" x="537.04" y="227.18" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#g" x="597.77" y="227.18" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#e" x="602.68" y="227.18" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#h" x="337.46" y="241.27" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#i" x="342.71" y="241.27" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#j" x="344.76" y="241.27" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#k" x="352.31" y="241.27" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#m" x="357.05" y="241.27" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#l" x="359.86" y="241.27" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#m" x="363.3" y="241.27" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><use xlink:href="#n" x="367.32" y="241.27" width="100%" height="100%" transform="translate(-8.24 -61.55)"/><path d="M59.78 153.62V.5m0 144.27h5m-5-18.14h5m-5-18.15h5m-5-18.15h5m-5-18.14h5m-5-18.15h5m-5-18.14h5m-5-18.15h5m-5 134.28h2m-2-3.63h2m-2-7.26h2m-2-3.63h2m-2-3.63h2m-2-3.63h2m-2-7.25h2m-2-3.63h2m-2-3.63h2m-2-3.63h2m-2-7.26h2m-2-3.63h2m-2-3.63h2m-2-3.63h2m-2-7.26h2m-2-3.63h2m-2-3.62h2m-2-3.63h2m-2-7.26h2m-2-3.63h2m-2-3.63h2m-2-3.63h2m-2-7.26h2m-2-3.62h2m-2-3.63h2m-2-3.63h2m-2-7.26h2m-2-3.63h2m-2-3.64h2m-2-3.62h2m-2-7.26h2m-2-3.62h2m-2-3.64h2m-2-3.63h2" fill="none" stroke="#000" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="10"/><use xlink:href="#a" x="57.56" y="210.32" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#d" x="27.84" y="192.18" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="32.74" y="192.18" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="37.65" y="192.18" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="42.56" y="192.18" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="47.47" y="192.18" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="52.38" y="192.18" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="57.28" y="192.18" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#e" x="27.84" y="174.03" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="32.74" y="174.03" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="37.65" y="174.03" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="42.56" y="174.03" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="47.47" y="174.03" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="52.38" y="174.03" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="57.28" y="174.03" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#g" x="27.84" y="155.89" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="32.74" y="155.89" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="37.65" y="155.89" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="42.56" y="155.89" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="47.47" y="155.89" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="52.38" y="155.89" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="57.28" y="155.89" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#b" x="27.84" y="137.74" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="32.74" y="137.74" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="37.65" y="137.74" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="42.56" y="137.74" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="47.47" y="137.74" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="52.38" y="137.74" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="57.28" y="137.74" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#o" x="27.84" y="119.6" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="32.74" y="119.6" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="37.65" y="119.6" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="42.56" y="119.6" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="47.47" y="119.6" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="52.38" y="119.6" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="57.28" y="119.6" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#f" x="27.84" y="101.45" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="32.74" y="101.45" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="37.65" y="101.45" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="42.56" y="101.45" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="47.47" y="101.45" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="52.38" y="101.45" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="57.28" y="101.45" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#p" x="27.84" y="83.31" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="32.74" y="83.31" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="37.65" y="83.31" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="42.56" y="83.31" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="47.47" y="83.31" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="52.38" y="83.31" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#a" x="57.28" y="83.31" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#q" x="15.08" y="182.47" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#r" x="15.08" y="177.47" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#s" x="15.08" y="172.73" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#t" x="15.08" y="167.76" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#r" x="15.08" y="162.74" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#u" x="15.08" y="158" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#v" x="15.08" y="152.98" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#r" x="15.08" y="148.84" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#y" x="15.08" y="144.1" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#w" x="15.08" y="141.28" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#t" x="15.08" y="135.28" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#x" x="15.08" y="130.26" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#y" x="15.08" y="122.71" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#r" x="15.08" y="117.73" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#z" x="15.08" y="113" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#y" x="15.08" y="109.76" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#A" x="15.08" y="106.94" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#B" x="15.08" y="103.5" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/><use xlink:href="#C" x="15.08" y="98.2" width="100%" height="100%" transform="translate(-8.24 -61.55)" fill="#1e4a85"/></svg>�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mitogen-0.3.9/docs/images/async.graphml�������������������������������������������������������������0000664�0000000�0000000�00001140112�14656664731�0020075�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" standalone="no"?> <graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd"> <!--Created by yEd 3.14.4--> <key attr.name="Description" attr.type="string" for="graph" id="d0"/> <key for="port" id="d1" yfiles.type="portgraphics"/> <key for="port" id="d2" yfiles.type="portgeometry"/> <key for="port" id="d3" yfiles.type="portuserdata"/> <key attr.name="url" attr.type="string" for="node" id="d4"/> <key attr.name="description" attr.type="string" for="node" id="d5"/> <key for="node" id="d6" yfiles.type="nodegraphics"/> <key for="graphml" id="d7" yfiles.type="resources"/> <key attr.name="url" attr.type="string" for="edge" id="d8"/> <key attr.name="description" attr.type="string" for="edge" id="d9"/> <key for="edge" id="d10" yfiles.type="edgegraphics"/> <graph edgedefault="directed" id="G"> <data key="d0"/> <node id="n0" yfiles.foldertype="group"> <data key="d4"/> <data key="d6"> <y:ProxyAutoBoundsNode> <y:Realizers active="0"> <y:GroupNode> <y:Geometry height="75.77734375" width="80.0" x="160.0" y="-117.75"/> <y:Fill color="#F5F5F5" transparent="false"/> <y:BorderStyle color="#000000" type="dashed" width="1.0"/> <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" height="15.77734375" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="80.0" x="0.0" y="0.0">rack11.dc1</y:NodeLabel> <y:Shape type="roundrectangle"/> <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/> <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/> </y:GroupNode> <y:GroupNode> <y:Geometry height="50.0" width="50.0" x="-5.0" y="-20.77734375"/> <y:Fill color="#F5F5F5" transparent="false"/> <y:BorderStyle color="#000000" type="dashed" width="1.0"/> <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="63.75830078125" x="-6.879150390625" y="0.0">Folder 1</y:NodeLabel> <y:Shape type="roundrectangle"/> <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/> <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/> </y:GroupNode> </y:Realizers> </y:ProxyAutoBoundsNode> </data> <graph edgedefault="directed" id="n0:"> <node id="n0::n0"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="165.0" y="-96.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n0::n1"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="175.0" y="-96.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n0::n2"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="185.0" y="-96.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n0::n3"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="195.0" y="-96.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n0::n4"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="205.0" y="-96.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n0::n5"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="215.0" y="-96.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n0::n6"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="225.0" y="-96.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n0::n7"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="165.0" y="-86.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n0::n8"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="175.0" y="-86.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n0::n9"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="185.0" y="-86.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n0::n10"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="195.0" y="-86.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n0::n11"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="205.0" y="-86.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n0::n12"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="215.0" y="-86.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n0::n13"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="225.0" y="-86.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n0::n14"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="165.0" y="-76.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n0::n15"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="175.0" y="-76.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n0::n16"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="185.0" y="-76.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n0::n17"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="195.0" y="-76.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n0::n18"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="205.0" y="-76.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n0::n19"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="215.0" y="-76.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n0::n20"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="225.0" y="-76.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n0::n21"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="165.0" y="-66.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n0::n22"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="175.0" y="-66.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n0::n23"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="185.0" y="-66.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n0::n24"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="195.0" y="-66.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n0::n25"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="205.0" y="-66.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n0::n26"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="215.0" y="-66.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n0::n27"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="225.0" y="-66.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n0::n28"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="165.0" y="-56.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n0::n29"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="175.0" y="-56.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n0::n30"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="185.0" y="-56.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n0::n31"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="195.0" y="-56.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> </graph> </node> <node id="n1" yfiles.foldertype="group"> <data key="d4"/> <data key="d6"> <y:ProxyAutoBoundsNode> <y:Realizers active="0"> <y:GroupNode> <y:Geometry height="75.77734375" width="80.0" x="255.0" y="-117.75"/> <y:Fill color="#F5F5F5" transparent="false"/> <y:BorderStyle color="#000000" type="dashed" width="1.0"/> <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" height="15.77734375" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="80.0" x="0.0" y="0.0">rack12.dc1</y:NodeLabel> <y:Shape type="roundrectangle"/> <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/> <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/> </y:GroupNode> <y:GroupNode> <y:Geometry height="50.0" width="50.0" x="90.0" y="-20.77734375"/> <y:Fill color="#F5F5F5" transparent="false"/> <y:BorderStyle color="#000000" type="dashed" width="1.0"/> <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="63.75830078125" x="-6.879150390625" y="0.0">Folder 1</y:NodeLabel> <y:Shape type="roundrectangle"/> <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/> <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/> </y:GroupNode> </y:Realizers> </y:ProxyAutoBoundsNode> </data> <graph edgedefault="directed" id="n1:"> <node id="n1::n0"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="260.0" y="-96.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1::n1"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="270.0" y="-96.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1::n2"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="280.0" y="-96.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1::n3"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="290.0" y="-96.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1::n4"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="300.0" y="-96.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1::n5"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="310.0" y="-96.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1::n6"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="320.0" y="-96.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1::n7"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="260.0" y="-86.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1::n8"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="270.0" y="-86.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1::n9"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="280.0" y="-86.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1::n10"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="290.0" y="-86.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1::n11"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="300.0" y="-86.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1::n12"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="310.0" y="-86.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1::n13"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="320.0" y="-86.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1::n14"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="260.0" y="-76.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1::n15"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="270.0" y="-76.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1::n16"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="280.0" y="-76.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1::n17"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="290.0" y="-76.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1::n18"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="300.0" y="-76.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1::n19"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="310.0" y="-76.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1::n20"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="320.0" y="-76.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1::n21"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="260.0" y="-66.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1::n22"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="270.0" y="-66.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1::n23"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="280.0" y="-66.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1::n24"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="290.0" y="-66.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1::n25"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="300.0" y="-66.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1::n26"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="310.0" y="-66.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1::n27"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="320.0" y="-66.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1::n28"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="260.0" y="-56.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1::n29"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="270.0" y="-56.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1::n30"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="280.0" y="-56.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1::n31"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="290.0" y="-56.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> </graph> </node> <node id="n2" yfiles.foldertype="group"> <data key="d4"/> <data key="d6"> <y:ProxyAutoBoundsNode> <y:Realizers active="0"> <y:GroupNode> <y:Geometry height="75.77734375" width="80.0" x="345.0" y="-117.75"/> <y:Fill color="#F5F5F5" transparent="false"/> <y:BorderStyle color="#000000" type="dashed" width="1.0"/> <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" height="15.77734375" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="80.0" x="0.0" y="0.0">rack13.dc1</y:NodeLabel> <y:Shape type="roundrectangle"/> <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/> <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/> </y:GroupNode> <y:GroupNode> <y:Geometry height="50.0" width="50.0" x="-5.0" y="69.72265625"/> <y:Fill color="#F5F5F5" transparent="false"/> <y:BorderStyle color="#000000" type="dashed" width="1.0"/> <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="63.75830078125" x="-6.879150390625" y="0.0">Folder 1</y:NodeLabel> <y:Shape type="roundrectangle"/> <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/> <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/> </y:GroupNode> </y:Realizers> </y:ProxyAutoBoundsNode> </data> <graph edgedefault="directed" id="n2:"> <node id="n2::n0"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="350.0" y="-96.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2::n1"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="360.0" y="-96.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2::n2"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="370.0" y="-96.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2::n3"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="380.0" y="-96.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2::n4"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="390.0" y="-96.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2::n5"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="400.0" y="-96.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2::n6"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="410.0" y="-96.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2::n7"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="350.0" y="-86.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2::n8"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="360.0" y="-86.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2::n9"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="370.0" y="-86.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2::n10"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="380.0" y="-86.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2::n11"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="390.0" y="-86.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2::n12"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="400.0" y="-86.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2::n13"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="410.0" y="-86.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2::n14"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="350.0" y="-76.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2::n15"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="360.0" y="-76.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2::n16"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="370.0" y="-76.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2::n17"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="380.0" y="-76.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2::n18"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="390.0" y="-76.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2::n19"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="400.0" y="-76.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2::n20"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="410.0" y="-76.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2::n21"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="350.0" y="-66.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2::n22"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="360.0" y="-66.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2::n23"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="370.0" y="-66.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2::n24"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="380.0" y="-66.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2::n25"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="390.0" y="-66.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2::n26"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="400.0" y="-66.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2::n27"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="410.0" y="-66.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2::n28"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="350.0" y="-56.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2::n29"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="360.0" y="-56.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2::n30"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="370.0" y="-56.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2::n31"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="380.0" y="-56.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> </graph> </node> <node id="n3" yfiles.foldertype="group"> <data key="d4"/> <data key="d6"> <y:ProxyAutoBoundsNode> <y:Realizers active="0"> <y:GroupNode> <y:Geometry height="75.77734375" width="80.0" x="440.0" y="-117.75"/> <y:Fill color="#F5F5F5" transparent="false"/> <y:BorderStyle color="#000000" type="dashed" width="1.0"/> <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" height="15.77734375" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="80.0" x="0.0" y="0.0">rack14.dc1</y:NodeLabel> <y:Shape type="roundrectangle"/> <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/> <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/> </y:GroupNode> <y:GroupNode> <y:Geometry height="50.0" width="50.0" x="90.0" y="69.72265625"/> <y:Fill color="#F5F5F5" transparent="false"/> <y:BorderStyle color="#000000" type="dashed" width="1.0"/> <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="63.75830078125" x="-6.879150390625" y="0.0">Folder 1</y:NodeLabel> <y:Shape type="roundrectangle"/> <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/> <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/> </y:GroupNode> </y:Realizers> </y:ProxyAutoBoundsNode> </data> <graph edgedefault="directed" id="n3:"> <node id="n3::n0"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="445.0" y="-96.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3::n1"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="455.0" y="-96.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3::n2"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="465.0" y="-96.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3::n3"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="475.0" y="-96.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3::n4"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="485.0" y="-96.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3::n5"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="495.0" y="-96.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3::n6"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="505.0" y="-96.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3::n7"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="445.0" y="-86.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3::n8"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="455.0" y="-86.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3::n9"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="465.0" y="-86.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3::n10"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="475.0" y="-86.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3::n11"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="485.0" y="-86.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3::n12"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="495.0" y="-86.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3::n13"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="505.0" y="-86.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3::n14"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="445.0" y="-76.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3::n15"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="455.0" y="-76.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3::n16"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="465.0" y="-76.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3::n17"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="475.0" y="-76.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3::n18"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="485.0" y="-76.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3::n19"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="495.0" y="-76.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3::n20"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="505.0" y="-76.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3::n21"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="445.0" y="-66.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3::n22"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="455.0" y="-66.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3::n23"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="465.0" y="-66.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3::n24"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="475.0" y="-66.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3::n25"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="485.0" y="-66.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3::n26"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="495.0" y="-66.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3::n27"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="505.0" y="-66.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3::n28"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="445.0" y="-56.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3::n29"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="455.0" y="-56.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3::n30"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="465.0" y="-56.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3::n31"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="475.0" y="-56.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> </graph> </node> <node id="n4" yfiles.foldertype="group"> <data key="d4"/> <data key="d6"> <y:ProxyAutoBoundsNode> <y:Realizers active="0"> <y:GroupNode> <y:Geometry height="75.77734375" width="80.0" x="160.0" y="38.02734375"/> <y:Fill color="#F5F5F5" transparent="false"/> <y:BorderStyle color="#000000" type="dashed" width="1.0"/> <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" height="15.77734375" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="80.0" x="0.0" y="0.0">rack15.dc1</y:NodeLabel> <y:Shape type="roundrectangle"/> <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/> <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/> </y:GroupNode> <y:GroupNode> <y:Geometry height="50.0" width="50.0" x="-5.0" y="-20.77734375"/> <y:Fill color="#F5F5F5" transparent="false"/> <y:BorderStyle color="#000000" type="dashed" width="1.0"/> <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="63.75830078125" x="-6.879150390625" y="0.0">Folder 1</y:NodeLabel> <y:Shape type="roundrectangle"/> <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/> <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/> </y:GroupNode> </y:Realizers> </y:ProxyAutoBoundsNode> </data> <graph edgedefault="directed" id="n4:"> <node id="n4::n0"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="165.0" y="58.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4::n1"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="175.0" y="58.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4::n2"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="185.0" y="58.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4::n3"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="195.0" y="58.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4::n4"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="205.0" y="58.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4::n5"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="215.0" y="58.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4::n6"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="225.0" y="58.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4::n7"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="165.0" y="68.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4::n8"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="175.0" y="68.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4::n9"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="185.0" y="68.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4::n10"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="195.0" y="68.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4::n11"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="205.0" y="68.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4::n12"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="215.0" y="68.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4::n13"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="225.0" y="68.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4::n14"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="165.0" y="78.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4::n15"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="175.0" y="78.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4::n16"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="185.0" y="78.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4::n17"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="195.0" y="78.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4::n18"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="205.0" y="78.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4::n19"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="215.0" y="78.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4::n20"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="225.0" y="78.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4::n21"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="165.0" y="88.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4::n22"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="175.0" y="88.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4::n23"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="185.0" y="88.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4::n24"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="195.0" y="88.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4::n25"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="205.0" y="88.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4::n26"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="215.0" y="88.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4::n27"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="225.0" y="88.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4::n28"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="165.0" y="98.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4::n29"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="175.0" y="98.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4::n30"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="185.0" y="98.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4::n31"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="195.0" y="98.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> </graph> </node> <node id="n5" yfiles.foldertype="group"> <data key="d4"/> <data key="d6"> <y:ProxyAutoBoundsNode> <y:Realizers active="0"> <y:GroupNode> <y:Geometry height="75.77734375" width="80.0" x="255.0" y="38.02734375"/> <y:Fill color="#F5F5F5" transparent="false"/> <y:BorderStyle color="#000000" type="dashed" width="1.0"/> <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" height="15.77734375" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="80.0" x="0.0" y="0.0">rack16.dc1</y:NodeLabel> <y:Shape type="roundrectangle"/> <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/> <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/> </y:GroupNode> <y:GroupNode> <y:Geometry height="50.0" width="50.0" x="90.0" y="-20.77734375"/> <y:Fill color="#F5F5F5" transparent="false"/> <y:BorderStyle color="#000000" type="dashed" width="1.0"/> <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="63.75830078125" x="-6.879150390625" y="0.0">Folder 1</y:NodeLabel> <y:Shape type="roundrectangle"/> <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/> <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/> </y:GroupNode> </y:Realizers> </y:ProxyAutoBoundsNode> </data> <graph edgedefault="directed" id="n5:"> <node id="n5::n0"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="260.0" y="58.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n5::n1"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="270.0" y="58.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n5::n2"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="280.0" y="58.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n5::n3"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="290.0" y="58.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n5::n4"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="300.0" y="58.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n5::n5"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="310.0" y="58.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n5::n6"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="320.0" y="58.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n5::n7"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="260.0" y="68.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n5::n8"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="270.0" y="68.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n5::n9"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="280.0" y="68.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n5::n10"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="290.0" y="68.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n5::n11"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="300.0" y="68.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n5::n12"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="310.0" y="68.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n5::n13"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="320.0" y="68.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n5::n14"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="260.0" y="78.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n5::n15"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="270.0" y="78.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n5::n16"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="280.0" y="78.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n5::n17"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="290.0" y="78.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n5::n18"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="300.0" y="78.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n5::n19"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="310.0" y="78.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n5::n20"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="320.0" y="78.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n5::n21"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="260.0" y="88.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n5::n22"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="270.0" y="88.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n5::n23"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="280.0" y="88.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n5::n24"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="290.0" y="88.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n5::n25"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="300.0" y="88.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n5::n26"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="310.0" y="88.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n5::n27"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="320.0" y="88.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n5::n28"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="260.0" y="98.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n5::n29"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="270.0" y="98.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n5::n30"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="280.0" y="98.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n5::n31"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="290.0" y="98.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> </graph> </node> <node id="n6" yfiles.foldertype="group"> <data key="d4"/> <data key="d6"> <y:ProxyAutoBoundsNode> <y:Realizers active="0"> <y:GroupNode> <y:Geometry height="75.77734375" width="80.0" x="345.0" y="38.02734375"/> <y:Fill color="#F5F5F5" transparent="false"/> <y:BorderStyle color="#000000" type="dashed" width="1.0"/> <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" height="15.77734375" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="80.0" x="0.0" y="0.0">rack17.dc1</y:NodeLabel> <y:Shape type="roundrectangle"/> <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/> <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/> </y:GroupNode> <y:GroupNode> <y:Geometry height="50.0" width="50.0" x="-5.0" y="69.72265625"/> <y:Fill color="#F5F5F5" transparent="false"/> <y:BorderStyle color="#000000" type="dashed" width="1.0"/> <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="63.75830078125" x="-6.879150390625" y="0.0">Folder 1</y:NodeLabel> <y:Shape type="roundrectangle"/> <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/> <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/> </y:GroupNode> </y:Realizers> </y:ProxyAutoBoundsNode> </data> <graph edgedefault="directed" id="n6:"> <node id="n6::n0"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="350.0" y="58.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n6::n1"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="360.0" y="58.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n6::n2"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="370.0" y="58.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n6::n3"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="380.0" y="58.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n6::n4"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="390.0" y="58.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n6::n5"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="400.0" y="58.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n6::n6"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="410.0" y="58.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n6::n7"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="350.0" y="68.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n6::n8"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="360.0" y="68.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n6::n9"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="370.0" y="68.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n6::n10"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="380.0" y="68.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n6::n11"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="390.0" y="68.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n6::n12"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="400.0" y="68.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n6::n13"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="410.0" y="68.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n6::n14"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="350.0" y="78.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n6::n15"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="360.0" y="78.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n6::n16"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="370.0" y="78.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n6::n17"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="380.0" y="78.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n6::n18"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="390.0" y="78.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n6::n19"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="400.0" y="78.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n6::n20"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="410.0" y="78.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n6::n21"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="350.0" y="88.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n6::n22"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="360.0" y="88.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n6::n23"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="370.0" y="88.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n6::n24"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="380.0" y="88.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n6::n25"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="390.0" y="88.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n6::n26"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="400.0" y="88.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n6::n27"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="410.0" y="88.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n6::n28"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="350.0" y="98.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n6::n29"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="360.0" y="98.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n6::n30"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="370.0" y="98.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n6::n31"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="380.0" y="98.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> </graph> </node> <node id="n7" yfiles.foldertype="group"> <data key="d4"/> <data key="d6"> <y:ProxyAutoBoundsNode> <y:Realizers active="0"> <y:GroupNode> <y:Geometry height="75.77734375" width="80.0" x="440.0" y="38.02734375"/> <y:Fill color="#F5F5F5" transparent="false"/> <y:BorderStyle color="#000000" type="dashed" width="1.0"/> <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasLineColor="false" height="15.77734375" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="80.0" x="0.0" y="0.0">rack18.dc1</y:NodeLabel> <y:Shape type="roundrectangle"/> <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/> <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/> </y:GroupNode> <y:GroupNode> <y:Geometry height="50.0" width="50.0" x="0.0" y="60.0"/> <y:Fill color="#F5F5F5" transparent="false"/> <y:BorderStyle color="#000000" type="dashed" width="1.0"/> <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="63.75830078125" x="-6.879150390625" y="0.0">Folder 1</y:NodeLabel> <y:Shape type="roundrectangle"/> <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/> <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/> </y:GroupNode> </y:Realizers> </y:ProxyAutoBoundsNode> </data> <graph edgedefault="directed" id="n7:"> <node id="n7::n0"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="445.0" y="58.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n7::n1"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="455.0" y="58.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n7::n2"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="465.0" y="58.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n7::n3"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="475.0" y="58.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n7::n4"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="485.0" y="58.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n7::n5"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="495.0" y="58.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n7::n6"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="505.0" y="58.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n7::n7"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="445.0" y="68.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n7::n8"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="455.0" y="68.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n7::n9"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="465.0" y="68.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n7::n10"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="475.0" y="68.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n7::n11"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="485.0" y="68.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n7::n12"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="495.0" y="68.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n7::n13"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="505.0" y="68.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n7::n14"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="445.0" y="78.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n7::n15"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="455.0" y="78.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n7::n16"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="465.0" y="78.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n7::n17"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="475.0" y="78.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n7::n18"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="485.0" y="78.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n7::n19"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="495.0" y="78.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n7::n20"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="505.0" y="78.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n7::n21"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="445.0" y="88.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n7::n22"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="455.0" y="88.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n7::n23"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="465.0" y="88.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n7::n24"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="475.0" y="88.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n7::n25"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="485.0" y="88.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n7::n26"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="495.0" y="88.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n7::n27"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="505.0" y="88.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n7::n28"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="445.0" y="98.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n7::n29"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="455.0" y="98.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n7::n30"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="465.0" y="98.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n7::n31"> <data key="d6"> <y:ShapeNode> <y:Geometry height="10.0" width="10.0" x="475.0" y="98.8046875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.0" y="3.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> </graph> </node> <node id="n8"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="120.0" x="282.5" y="-170.75"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="57.712890625" x="31.1435546875" y="5.93359375">ops1.dc1<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n9"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="120.0" x="282.5" y="-16.97265625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="57.712890625" x="31.1435546875" y="5.93359375">ops2.dc1<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n10"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="120.0" x="80.0" y="-170.75"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="72.15625" x="23.921875" y="5.93359375">bastion.dc1<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n11"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="120.0" x="80.0" y="-216.75"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="41.060546875" x="39.4697265625" y="5.93359375">laptop<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n12"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="3.0" x="525.0" y="-96.97265625"/> <y:Fill hasColor="false" transparent="false"/> <y:BorderStyle hasColor="false" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="-0.5" y="13.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n13"> <data key="d6"> <y:SVGNode> <y:Geometry height="35.484542934485205" width="32.2024545674844" x="123.89877271625778" y="-263.23454293448515"/> <y:Fill color="#CCCCFF" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="14.101227283742219" y="39.484542934485205"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:SVGNodeProperties usingVisualBounds="true"/> <y:SVGModel svgBoundsPolicy="0"> <y:SVGContent refid="1"/> </y:SVGModel> </y:SVGNode> </data> </node> <edge id="e0" source="n9" target="n4"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="-37.92745399475098"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e1" source="n9" target="n5"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="-37.92745399475098"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e2" source="n9" target="n7"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="-37.92745399475098"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e3" source="n9" target="n6"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="-37.92745399475098"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e4" source="n8" target="n0"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="-37.92745399475098"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e5" source="n8" target="n1"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="-37.92745399475098"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e6" source="n8" target="n3"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="-37.92745399475098"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e7" source="n10" target="n8"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e8" source="n10" target="n9"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"> <y:Point x="140.0" y="-1.97265625"/> </y:Path> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e9" source="n11" target="n10"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e10" source="n8" target="n2"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="-37.92745399475098"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e11" source="n6::n17" target="n6"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> </graph> <data key="d7"> <y:Resources> <y:Resource id="1"><?xml version="1.0" encoding="utf-8"?> <svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="57px" height="65px" viewBox="0 0 57 65" enable-background="new 0 0 57 65" xml:space="preserve"> <g> <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3398" y1="3115.7266" x2="27.5807" y2="3145.5239" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)"> <stop offset="0.2711" style="stop-color:#FFAB4F"/> <stop offset="1" style="stop-color:#FFD28F"/> </linearGradient> <path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> <path id="body_18_" fill="#ECECEC" stroke="#9B9B9B" stroke-miterlimit="10" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51 c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-11.244-6.146-11.244-6.146 c-1.771,1.655-5.61,3.802-10.063,3.802c-4.453,0-8.292-2.146-10.063-3.802c0,0-5.755,0.586-11.189,6.021 C1.378,56.689,0.5,62.768,0.5,62.768z"/> <radialGradient id="SVGID_2_" cx="22.6621" cy="21.707" r="17.7954" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#FCB57A"/> <stop offset="1" style="stop-color:#FF8C36"/> </radialGradient> <path fill="url(#SVGID_2_)" stroke="#E55E03" d="M28.106,33.486c-8.112,0-12.688,4.313-12.688,10.438 c0,7.422,12.688,10.438,12.688,10.438s14.688-3.016,14.688-10.438C42.793,38.75,36.215,33.486,28.106,33.486z M26.288,53.051 c0,0-7.135-2.093-8.805-7.201c-0.222-0.682,0.147-1.156,0.795-1.521V37.8h20.188v6.663c0.235,0.352,1.109,0.737,1.229,1.387 C40.445,49.917,26.288,53.051,26.288,53.051z"/> <radialGradient id="SVGID_3_" cx="15.2056" cy="831.1875" r="32.3071" gradientTransform="matrix(1 0 0 1 0.0801 -773.6914)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#FCB57A"/> <stop offset="1" style="stop-color:#FF8C36"/> </radialGradient> <path fill="url(#SVGID_3_)" stroke="#E55E03" d="M49.529,51.225c-2.239-2.24-5.041-3.724-7.396-4.67 c-2.854,5.51-14.021,7.807-14.021,7.807s-10.472-2.483-12.387-8.514c-2.439,0.771-5.787,2.287-8.749,5.25 c-5.592,5.592-6.47,11.67-6.47,11.67c0,1.938,1.575,3.492,3.523,3.492h48.51c1.946,0,3.521-1.558,3.521-3.492 C56.055,62.768,54.211,55.906,49.529,51.225z"/> <radialGradient id="SVGID_4_" cx="17.0723" cy="18.4907" r="11.8931" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#FCB57A"/> <stop offset="1" style="stop-color:#FF8C36"/> </radialGradient> <path fill="url(#SVGID_4_)" stroke="#E55E03" d="M13.404,44.173c1.15-1.81,2.039-3.832,3.332-5.397 c-0.514,1.027-1.669,4.084-1.669,5.148c0,5.186,10.366,9.079,14.688,10.438c-3.472,1.627-9.134-1.498-11.334-2.359 c-3.601-1.419-4.071-3.063-5.89-4.854C12.523,47.135,12.878,45,13.404,44.173z"/> <radialGradient id="SVGID_5_" cx="31.8184" cy="19.3525" r="14.63" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#FCB57A"/> <stop offset="1" style="stop-color:#FF8C36"/> </radialGradient> <path fill="url(#SVGID_5_)" stroke="#E55E03" d="M45.777,43.924c-1.317-1.568-5.11-9.424-6.604-6.617 c0.516,1.025,3.617,3.693,3.617,6.617c0,5.186-10.271,8.576-16.699,9.145c1.429,4.938,11.373,1.293,13.805-0.313 c3.563-2.354,4.563-5.133,7.854-3.705C47.754,49.045,48.006,46.574,45.777,43.924z"/> <radialGradient id="SVGID_6_" cx="30.4893" cy="4.8721" r="5.2028" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#FCB57A"/> <stop offset="1" style="stop-color:#FF8C36"/> </radialGradient> <path fill="url(#SVGID_6_)" stroke="#E55E03" d="M30.777,54.167c0.357,0.836-0.153,1.983-0.352,2.813 c-0.256,1.084-0.072,2.104,0.102,3.186c0.164,1.02,0.156,2.107,0.25,3.167c0.082,0.916,0.482,1.849,0.357,2.75"/> <radialGradient id="SVGID_7_" cx="23.2871" cy="5.3008" r="5.5143" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#FCB57A"/> <stop offset="1" style="stop-color:#FF8C36"/> </radialGradient> <path fill="url(#SVGID_7_)" stroke="#E55E03" d="M23.695,53.417c-0.508,0.584-0.476,2.209-0.398,3 c0.116,1.183,0.456,2.099,0.333,3.333c-0.192,1.943,0.154,4.479-0.436,6.333"/> <radialGradient id="face_x5F_white_1_" cx="27.5835" cy="3117.4922" r="23.425" fx="23.0139" fy="3115.0024" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#FFD28F"/> <stop offset="1" style="stop-color:#FFAB4F"/> </radialGradient> <path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 c0.086,10.2-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 C36.627,4.945,43.59,13.158,43.676,23.357z"/> <linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="6468.501" y1="-12291.5195" x2="6492.1304" y2="-12384.9688" gradientTransform="matrix(0.275 0 0 -0.2733 -1752.8849 -3351.7349)"> <stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> <stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> </linearGradient> <path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M28.415,5.625c-6.035,0.047-10.747,4.493-12.787,10.386 c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.54,13.244,36.729,5.56,28.415,5.625z"/> <path id="Hair_Young_Black_1_" fill="#5C5C5C" stroke="#353535" stroke-linecap="round" stroke-linejoin="round" d="M20.278,13.25 c3.417,4.333,9.333,6.917,9.333,6.917l-1.417-3.5c0,0,7.094,4.691,8.083,4.333c0.968-0.2-1.082-3.807-1.082-3.807 s3.138,1.795,4.854,3.969c1.803,2.28,4.285,3.504,4.285,3.504S47.027,2.719,27.289,2.744C8.278,2.709,12.058,27.678,12.058,27.678 L14.695,17c0,0,0.914,5.757,1.399,4.875C17.861,15.211,18.861,11.5,20.278,13.25z"/> </g> </svg> </y:Resource> </y:Resources> </data> </graphml> ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mitogen-0.3.9/docs/images/async.png�����������������������������������������������������������������0000664�0000000�0000000�00000216313�14656664731�0017235�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR����#���h�IDATxpT+]aEWײM)$B =ޥI!@)" bA=gw%(3qB9g<J ������6+ ������pI������hr7o?>ڲeKbb̙3'N8bĈaÆDGG ;vi/^k׮G^tI.+J����#'yCƌ3p@777kkkD"lmm, $J/ѣGpp<xU�����[$qjKLL:t[nzӻw}3#O>罽{boo/Je2Y=͛wĉ����!'ߖ.](Jv޽O>'݆ ^/|;8;; fkk۫W#F<xm�����>IhIR>}8pП#>ԯu|Ĉ~Zo����r'''gٲeɩo߾mmmdccj*J?�����9rnF_ ߌ֣Ggd2D~U�����-rnZCBBRS޽ֶгgOY'O,))�����W!'a櫯<xT*uuu߿fׯ_?kkkoo>����_}Rw_g߾}Q����/ANBn޼9fC 0/!\ѣG+**A�����43rSXXdGp]9???L7ߨjn�����͉<xƦo߾6 *\Մ 233M�����4'rt#GZ[[ٳٞv's;99nڴ-o�����4'rjWYY~z;;.] ٳpy; ����fCNB\ncc3o) M*7NTr�����h$Ԣl֭ϥI-oR̙35�����9 vZddviT* /))���� INT~'vvv $___[>{����@3 '3fd=z@7KӧO@@_[<==G#�����h$Toyzz:::ׯc{!=_iRgϞ~-����FNFgT^$zyz99 /ҥ_X\\\VZ����`AV?^&ٳ9::vss<nuqk=;㚚p QQQD�����9 ˝н{wTn` ˿1ZW%|Yn"�����M NH$u;::zwrzگk/Y3^&u/&\Ά 4 ����CNdTڵk׺T:kĀcŹPqne1==mld hmmm=mڴR#�����M 2W^&???7g]ˢ5⺤DaJ.߿bd?/7k׮(M|Ixgkk먨k׮q����h:$9::__ `֯_?L=SŐ$N8VhYQr6plld..]S oWWW77_+􀀀I~~~w>}[ ����@!'ի^q_O4p=zȬ(9*$%iY&Y0+'>%6VгgOԧO?{,Sԭ[:'|[׮]˭����鐓`rDҥK}d3p@'''O7bZ!$U*եho+|MIT8%:u-S^&e >3NxA݅קj&�����MuI$www}1kkAH Jzi]%^faNIl'|C&99*|ϯfݻplmmol0'y{{ _`Aaa!w����&BN̙3%I'[W[LϞ=U~P%BkQ~%1k\]]}uRɹSL YKRGGǚ "|ow';2$&O,˹�����4rLbcc%n}礞={w8mYUGK IߧOŕ[putYxSB*/8e򠾞2k2%QMRthuC.9::8Q߶111W^n����DI07EիZf-uww9<$[ҕfy:V#Iݩ&L խNүT=oLsLfPQJre&�����MJ)H? V&ޫ#T׽r%VV_tE։CՈR8"V6'7%W^HbˤCvssw}e櫅i =3w5]ϟ����DI0Jef>]d2k62ĩ!´x5dH?7I$Sw'opn7N6Y|oVZ'!vxL&suuҟt qLOmkc]qK뽽O: ����` ˻v*Jgccݦ jR{[٩͖&Umђ>Ukt(N.=sIoIoo|2wǒޮbTȬ?]=\uvqWLmk#svv<'vĉP�����9 ?T*8p$I\WG1'qI$OW/OJT7F4/J1pdX$$kڟ;wtׂighZ8y??aLh/~~~G����DI0r>'wqm_slķýOUC{~Z& IƼ(Y,P2VeJ.r8+-:>.Ԟ[I tEic"<9O>����DI00$???{{=O%Yytکi˩ K ;ݾ[mZ_dI?F֢dId.&h/k/.2K-IIbKҞf9g7vvuu  '����<I00K$hGjO~6貣՟מ=3C=bN-M^֙&Y{ugaҏc9I͘E2'_=<'iS9Ƒ>ݜkvtt!'����I0$De-]ut>'iOՊ-iI/՞#quRJY{u(IW,No-s҅xگIgjOўѽ;K;;;ooo_k׮G����DI09z˔^c#'FUI_==U{.Nl@bNZkf:iK-9IkIsJ;;beN;[\tFΈ9I{G9Z lllzu)n(�����M7nK$n֧yםhL~P,AIl$TuvUg'-$>mE$eگZaunٸj9IG.ԭRٳP�����9 D*ԛi^X,mI&ϛL-x>'g'4.,#'Nmvӷ$1'i.3xh>Mv7����&BNAii>'ZK[oc_stWa]Qoy>뫞fvp'rxwb9nƜLV8\^˅P�����9 &N9FRhQĜt2'=7[{a؆E釪d I-JUKNwj$cݾ1tӵ K p-I9܆d틙/fh S$+[ ����@!'$((H"x:J))\d)'|DCN:=հsv]YgGƹRm]0$˖d&ӝdfkG(?ω~8NSǭ����鐓`2vXD-{gGabNTp7fk^ YJHI5 I-M2t2'}mImnqu椓+/)xVV����tI0Jf[+2CAƜTu|~iJt~xq;>!YT[RnbKZnX$̹s/fh +#7ٱ˕G�����9 & bʕ|47IVSN2w3[tfEQ:7G<:BRm-|i҅mnI?[<*'}>EPT׼+>����ФIN,aNdInͷz3.S&A,Gdْ.ZaiRRaiS;p%t-M:(4/>2"w����&ENB-oVuWf@i%2%}T%>D1B庤o=ͭҤE v<5iX'CU{r"5%9>�����9 P,;</پR<>iDm j-JUQɰRiR"@oW+EI%Y$mҤ5&Ut%}6^{d=slin�����MZh*KϤ$X#w3_d7}Qz3D%]W2ql8qѥaIEI,vn]٪tz4q]ؒ"ŜT)/Ž;�����9 Ѩ+~9YNmDG鷼(}9L]lN w ~t)t^w%<5iړFhD-I4I-oCoua:����FNBԹ׋MݎvbJՋ~Ҕj9SftYss`t~q&|霮%#$qEұOGG&U-M*='LF͍����PƜ$-=5GG@zQ`fXd)UcI5LOj&~pj'kOڣOc nGsR`p ۜDʛi�����4rTyBy+lUŠc6tdndXd6o|M7+n\Vğ%D}H:#.JTגKKʷ&Xm!�����4r,+9hSKs4TcEW1ҽ^>WlI,M*H钓`]>n�����̓T^?e@^0jE7Jf]LmInj-ji%.dS_Vr�����h$K]Y||a *JQԕƸƙmp%U&%E.X㒛dWG(����� 9 P77Ѻbw%1*Jd ɼ"Y,Jҷ$mnBKz& D M�����4rѨ.lI_(ny3%Yof{;1*glU`2H2$nI=~RWV6����lIh,hȜinZ()T2tц}pgeE2 IEI5Kqd@`:DY,M����p[TY?z&ٔn~бQiY*g<$U[TgK|"nsK.=TK�����hf$rmWڋ(鋏aRUT2n3 9^"UjoICa筰]Zŝ����pss%+?>цdJպRc^ ۪mp3i]0}V,dN)kMe)w����DNB#rYNar}QήTZT$d(zKRli˃ۤ.>^]í����ِpTŇ+=9ㅜeo* >YD~k!ɸ(Hsܴ”rYN֬?^0_CO j}����@ 'vUrFTZpkEY3_YNAs1hEWmz6dvX]+=1OGtHhg7cHGᒊ/(˹G�����4rn$/']&sēѝG=-U c 0rmyH!IߒWmp;X;?^Y9Nڱ`3œ>c%("bce_6���� I-ޣX8O9Oe/z'omnunxc7A4bLȬ1YB8<$oKIKf%n]49BI(Bf{l;O j5^=w ����FNB<y2-O%0椂.eۼV$H R˶ ij#CB2HU[t0lwjDU. Y3 9IVVDž?fbMv7ƪˊ_�����4)r.^Zܦh}Ś>ƜT0Hp $j> 3DLDUE2H|R^5]rlrwVXyN.)羑=!3yY&=}-����IЀ;UmX,'? ~2Ds(bojxinu*mNq9lBjmwI 9dh6SNvvvuW ,fᔗӂZ,R_����tIO^K G܉/IƽlCe;rMAJm5X#ݎ6q-m Rsu$ l'e{[ve6%҂1A2ܯ\jIޱ@VUɽ����P'uAFim9<G#bM?>!F,@ZdDi~}AsQkZTׂ'3 bBm[a'a#Q WO]9IVzxVE^)?|?hA�����9 uPVOI%)BڪwWֺِGVK?Q +߷hc5.W:%%孰lA|Akek&ڔ3' >%\aVL'RqCo.����IFSybV{ZP+qɈzxhS}>Q\wPw >V>/|U{lx3B&,s1'O e"3iI�����8rj)-5M1#!EX{<SKNZ$dA5Ǎ3ڔׯFN2NFVڮtxw_>Ξ물Vn����pgPF,1/d +CH 'g md~v:wa5aNgTgt){9)="mh\UlrG>!i)-����pgP(;'W־`[K]ң2NX0Eß^fẮO/ASwAr?{zNҭN*&UХbCw,7 ����EN%qyxǬ++OxvRt'E7B>%Ң5G7>'qFV<MN#s^3EVesRbr(B))r ����DN%:o0yhYoߋTmlZ=6MY[V-;alX15?e;}NٚkٻǼ*wcosR+LOdI<%2sT]Vč����N!'FU>%uW5`<T<dsgx6nLM]鎥EG'iA39eͩ'']5kC;vH]S3C:V~iR֐iA=Iv$ju9IAHA~_Y�����r,TyZ=Y#Tn礊A ̌}x]ZpE^O~sεkذ甞>9f $aԟO.lg-i57nO3I**$"IȃZ+W.u0Iڥ6SĥLYӭՅY\�����re7.g'K j3yն1'?L;h"<M73u|6p?^9t͛׬Ysh{o.86Ud} 25gr:n9s٦u7nܸgϞo&[yb|#9s^/rzx{ŠGCBŜLIE{c;|; ����AN<Zѩ7ZJ jhiR7pQ]ѪQ3J j/{ܳv8ϬNΝ;o߾ 6_rx{wGf~6MŻUy]Q9iGfw`;6KvϞ=_|us\WEh ,R搎yU'{hYIr&svvp3yk´Jn4�����9nQ\9*Gr=3%yH(_[;UypE}ׯ9s?ܴiӺԔݛVܵ?{|f5_N~9bZfzx|TqkہN>/dff뒲23S,)m;тqOgF'\g4+i9)Q;hȔT_:s����Iw5eav) iHams&(I/ *Jѕs&|^VN]L=YYׯ_tұcvܹnݺkSvn\yp{ѝ_Yzq.?^>%'w-?^I7Z"|ݻ?~k׮B,O<uvCWu(2Uf.'j(H&7ꉜsb: [Mzq8�����9U6:m3i!s'\~/R>Yϟr`CQzXVuH G]Q]}~K.}g{՟f͆7[umټ~uׯMvm۶<xԩS/__ryV%aCfF=A:#YSЬYM]T2?Y+Bۊ$nޓ1Ųs�����y䤻TE^ owTDW0WZazGvȒn:);ͷQm e&C[9}P_҆vJ_m&++KPܼyڵk?Ӆ N:uرO?СC'N>}W^~֭[L!>r1xKi#MΘ/uRIsni*)?sb:N{b֫#_55����?t7*NqVpJH[z/hxLRhv!D%{e|J瞴v9]~&YYY5GF7*溦E>VN^'Kի{ihRziV&P't<UzxR/p/iIʦV`b~h_������ r]F.cO jh*o]Hbt'% g8{E}i󧿮(Fl Qn ț"~7|?2)Z.S#5l n-n#:=hѬYYY%.MR.w-Y..sRvLX? J?$O�����CN+s6򅴠֙#Xk(2$MaqֶVY/KPSo(#;Rhsny )KLH 5%֊Y~KY_ؒR+=+f./3yojr>'EiG?!i{}* }�����!'-4ʊs{ooZpV3$$;jbջbJzd~FN܉/.uLQmSo PoW_<:{{-iC;߾3#ݺY>pbY?ylվ9]H)g% mUkzkZ$qzGw2> nI@w$2;R[CNZb/J긷 ?k{.QW[����@N+hTʢޜp+ؒ6֒CRz~rKH\OC)gyh<]G =k*Wv/fΨĕJC;'e|:člH_<Q- {ȇÐB"ެs?W4$O Ėa[UKR&M5cHGyHQO*hu9ѐUIh]49E<iFw����"'| n=5}K2oI!ixՌ0jT8qϋGt͌y4.)=ÌR ų^tzĽbT W19coHO~SyEpgZg]ZWHnQ%WXl7YEXS-&v$9iEN(-xp36 y4f~=�����h,rRẄ́7B:d\%>dI#T34{GxwLS_KxHvdǜON{|:CrCٜ7 3seGBڙmgkq_V+ZI|Yʕ=U%$6cUE^͊~D&3Q-w$Xxd:>ɬ(?p%~9~C�����hrR ,ʕox#̘GK<T,YU-ɲ"3Z7L]imk̷Ɍy\<(]Fԃw_T-W/V/d(>vm^,fBN jIm}5"U IkzUw)N򐶹c.]4IP qײ߭7ggY ~O�����}M;FȎETBkf\d\d^+^&~gT9_RupѤ~MVKd[U=4kz(GulzkR{[[i4g?cڊ}tΛ.nbNJ5'Փg}CqȇߛU)e����6Z2uiՑ/CM{M%X^!'/MflIƐ4FolՌэeQU.ؕ6̓)"W֧%EH{ZGg(J)^bTJX\8?KH?KK=q<Q.Uvce%䮚dqII”MYxuj;-�����&rRQ~^?-𞬑+ZR-Kmn-I͸ЕEiaXVDft9Lx!}v62=\4Ky㞓-_eR׊%sΟBVt'1!#66./V.YCfU7JOJM>'riܷ4 -,[+3�����rR}nKoWIS̶}!iET5JjCQsRJGGv\/"+ (K,^T0qeD=,բ@q�@)֊vCx/-7fJYwNrV;<'-3' S9経E>J_�����DNjsҮ#-u޻Qm IvrҤt`|LЍcCQ2_4Ҹ@trr@}NӅRow_TFt'1!ˌ5쑝&pk% d]uz;'ɜYNgmnRr~s�����h9ecZZh*SGIUt3t:8ҤuIDØj '(ŖW'G冁ƜPg#j=$z_T=M,w}91'iIr0ʹg<{XǬʊ����~跋7&ت0F=Ԕ,N6jKhI'NGJ,(V7sU݆(ՖԛMyEڮ`~ n;'u39)9IHR2yEh&\?�����ԏɷN~F#ʍIsi>˜dޒEIF2'U[aPaS֟T2?>䁒%NmN/PʉyfhKԕe ����PrRKS[ln*^$?&[IU jIS_K~rwO{[zя'svxⳊжNxCYo����� '4{)#QƀsRT9io&5:IxvvRm7'xŚ>}NZ,U{#+ꁛAm����zZ lU4_XoNVIg'M2Nްxy!LxA5ޣ!2?QO夤;)<͏ ����zZS]\zd5}pc" EɔŜ(d1+k<MxÒf{N5'GܟX*oF͆F$ȓ݌S9Ռ7Zz%�����BNj94ʊ=snϛo?ֺr9iJYؒtbJu9iU9IגĜ*^VQYG=T[T[NJm0'sd};9IH)-K����@]I-Gɍn-.nSIeYN I=P(R[4iT͝n{/uQDv̝j[)'mNxAq_kI9I4sbi߆u,7 ����ZZ~l-/J;guwA5v5 IcmsS$]N*Z7wTBj`]N /ooCOpp)'UtK1Ֆ9)<'Nr[R9IVFxඊOS����V䤖#C:N|2.'y|ΚtEɴM̻"%U;5IiXѢ$nv3fI$qԦ%҂ZN|AהI)u$cݒ,w9I l>F����P+rRˑaxZP9o6rRvDsR-'((RUW2VT%UI9iG;ĜyPniAyFS9bN2tVIu䤥$'OwZ=D T�����DNj9PQy.X.Pү%%(ՌJ!Iǭ$g"Ǫ\4,'mbN\-2kIݪr$99ɸ4म $I6X7h#i{k7 ����I-ѯdD=T<H\SmҎj ,U/JQɼ"CRm-II Ŝ7UCN2$1'&7L)3xږ&5jps9܍ID?|39K����@M䤖 oG=XUk9|R[ EZTGf 0Ƴ-ZE a fU#'U½ِkzgz:ce[T9]-x{q^R����P96Sڶxz(NP2f^MEzTH{b go[$= ZCz[Iu.M$\rmI/)}nvyyp!'X7?|noʃZ3����&rRˑwޭv_\ӻJ[j-JՖ)f<$Y$= f#nS8ZB͖&/MRo Pm-NZPw_Qͻ<Ŗ$pk]0sZ=7ʔeER����P9;רΊ{˖6@fQ2qR-]I-FHa.'ȟFZ=E 'Z>'&77-ureZvspR;{w+Bۦ55(�����jEN�����@#������$������49 ������@N�����@#������$������49 ������@N�����@#������$������49 ������@N�����@#������$������49 ������@N�����@#������$������49 ������@N�����@#������$������49 ������@N�����@#������$������49 ������@N�����@#������$������49 ������@N�����@#������$������4I�h =����ܱ�-ɓ'=���������$� '���4a3I����Є9I_/ya3I����@Nb!'����9a����$ar����aI����@N"'1 CN����!'����0 CN����r0 9 ����I 0$���� '1 Ð����DNb���� '1 CN"'����9a����$ar����aI����@Nb!'����90 9 ����@NbDN����r0 9 ����I 0$���� '1 Ð����0 CN����r9ar����0 9����$ar����aI����@Nb!'����9a����$r0$�����9ar9 ����I 0$���� '1 Ð����0 CN����r0 9 ����I4꯬*NFDN����rS|;߸Vʳ;����$trC[1$���� '1zVW JNbI����@NbI LRI 9 ����I 9Đ����ĐI 9 ����I$r9!'����IINXJ*/G:oujlS$ ?$OZ���� '9DU`NbaWxqU{W߶AXp%z?-6ON [Zj/UV?__-CN����t㠕t]˷IXRdT}o*Xw8_߷I>uU \ꄠ62$�����9I7̵mcexZ^X6ͪ/Ś>~1+VVodmdkTNW,VcPmkjr����tW$M_>jW_Y[j3<۹@wo{qk\g-O8-y*>jy2@X쀛)0A2$�����9I֚+uA{̪W\_iۦߜ#V<azٗ},m[ R[,keI�����r]"u{Fho#oF$Km_͗jr����t夝qܼťIuyy1qZ=cᕭ[n?' o۾i{l̛/Mr 9 ����@NK7vy?I6sZ _pX녏jr����DN>ʳbY4Jm xC6"' ?՜/՞2$�����9nIW?_lUU.YG_NN:q`F/Jhߺ^Mr 9 ����@NKsRQi2_=9զ~]B{tlmoeI�����rݘz:Q6Vl#̏"39IxQg#rR` ' 9 ����@NrͦǥM=> \F"nNMr 9 ����@Nrk/;|o''oKF5"'Ըon(?y 9 ����@Nrҙ ?xNP=orVLhb0F$F^7eI�����rݕ60}~rhot[9æ}֭g3 [ WRYKwjr����twԩ}#0Μ$gܩ ^ Ix9nZ}|q镝R$Wː�����䤻+'3}ERzlt}9鍗jbZg;^vq[-5_rg/XA?ez覺Z���� ']9)ŚjE?Vz&_}FV?xW,Lw0ΦYGdu=)(Jն/|Mjwjr����t=m̠aerh6?wS{ZgbSdp1 }ݪˆWߨ}[ oW,D'& osQq!'����Iw]NR8V&X3=\gY6ɪVZ-ߕyĢ(xZ5EbI-g!'����IwWNϜaV<XKLy>qeF{hR^ϋXc<hg\W{*b`|J|=QMq 9 ����@NKGՙ V[fE?V 4uO_ӿ[Éۅ_׳,?Eq+jr����4bj 4\-CN����rÐr����Đr����hI 9 ����I Đ����ĐZ����$2$���� '1Lyņ~eI����@Nb!'����I Ð=����aI����@Nb!'����9a����$ar����aI�����r0$s����$ar����aI����@Nb!'����9a����$ar����0 9����9a����$ar����aI����@Nb!'����9a���� '1 CN?����@Nb!'����9a����$ar����aI����p礤z1 ôION���I�Ђ�����$���� '�9 ����9$,o/|_SAA���;+@8~1' ����Q$4r�����-9 ̈́����@@NB3!'����2LI����� $4r�����-9 ̈́����@@NB3!'����2LI����� $4r�����-9 ̈́����@@Nw/9Q?�����45r{4HP΋XNڲe�����})ʧ~\|q/nlN|;vW ����9 J\\y礼#Gjw?uu.0(rʟgo5d1c u*d+!`,YuDxAq˨U o@d:N* {{뽾˅99~ge˖MOOg�����; %199Y__<Vk׮e˖?ӣ����H$J{{{]ٞ}NJ?ݖfɒ%�����$ vJett.gIѧۢX����NBhjjEٷ줌ۢ [�����; enϾeIOEYr���� PfgժU7xc{9nm6 ����@a'<lܸ`N>ҫ�����$vGgg.���� P6Z[[e'O����� ; echh,^Қ5kt&�����qȑA ����@ba'%-[lzzZO����XI('I===����$NBioo/KZd!�����I23::Z֦����H8$a����@a'%\R����|I(? 󵓶mۦ�����H>$T7Ko�����$v*e'uvv4�����v*Ekkkvؘ����*`'R %YFw����P-P)9X488�����I }}}szI˖-W�����T $TvROO����`',YrA����@NBec'"����� v*NSSlv����`'V\s�����:I8 vҶmt�����U; qq /~jjJ�����Puϰ:;;u �����; 1 �����; 1144֬YC�����RI#G466A����@NB|-[lzzZo�����P= '1ϛrʬ~�n'@(!*��`'�9���I�@?�@BNi*m'B�@!j'´F!��$! ��$!9H$!�$ NB�IBA$!�$ NB�IBA$AA?��;I!A�$!@?��;IA�;I!�`' !9~��vB�;I!�`' !9~��vB�;~B�NBr�;IA?�NB NB�IBA$!�$ NB�IBA$!�$ N�NB� 9~��vB�;I!�`' !9~��vB�;I!�`' !9!��$! ��$!9H$!�$ NB�IBA$!�$ NB�IBA$AA?��;I!A�$!@?��;IAE>m۶IvB�NBr(-[׷~��vBLOOX"5Λ_IBA?��;)^}5;X\||d9p]7߿$j ⯉�T֗V?W#ߩ;O9=؁{֣;v=u9aK?(APhmm:r;ITi,HM$���$v⦿~`j׏ս6JM@LLL墱uD D@�Nb'?gz,T8(5Ib˖-uSIk" �`' ONZ(5cjEtM<envH��I줲I?43BR0;oֽݙ|$9̗5Pr$Q5��IeaĦ&-uoZd$"ȹ&w[$j&�~��v;h5}$9D50Ik" �`'-tf:3룷ͼ-8:soC?կ?vo'!t·6Է^=+;fv5p&!~p?~#%/zLS P".rF+o=rkA*DP5��b'F݅#wu={FQxsC/3slaԵ3S}Oo\gtϝ?^vc_!ZmB3OpPHݓ0OI﫻Ⓔ l '庲JA%g^&3=AO4:Sa̤ ϿwjJ5KY(fԵ oF+cK!|ED@�NJO#2xgV[sιMsk?{ g~}]}B6A?YțusX93;fkN( o&s!j2HЫyj2Ka$9Nkr\7;)!QJ(]EMQ2ʼn�,;gxC-{k-#{[37e%~̥·ȼʗsxsLAev"zoQ\)3;v,e ;}{ta_ qks#Å֣W' ϚCMř󐃤8ks|/Ks\&A,wMy-NJBXy3o'N]ҚyMN%S&�~��vR줴ƋG߹W9A@n|~MDuנ1{>G?6xQIyQNj@Zh4zg:'M)T^v._c:o/GxMG4tMzc ?JKX=G_8f9_;^GMVH~K_.;O8ᄺ]Qz(邕QWֲk" I�NJ,~Y�(X~4wƬ+Vۃu׎[f?kֽmygz\;TTZ\z u 7|gHcT.?7sgweٔ&茾79ekA�e!\M7NZ(K.5cޣYS �N�vRB$Ekg<x7_~p̝i":?V)zw~x[)oY7"^?9z֏ȣ&wnw6<񵅾揚d']y[Ee!D@�D;)N/+TfDÅܚ Q}}?|&lhm'ͦ )^<lݕ{}xWK/S#{ۊYd\<d'˪UI 媼ŷ9~Tɤ/&��$Ic_G?7\=#qG﻾g^2ߍm'E/W~Y˦;nsEх햏VA 3F2&ƽ7.Ғ%KۿI 媼c;E+]P �N�vRB9Ayn&5oN^;+n'^vsrƣVKOmawxgEwWVQ P:;;˸-[Rp`'-`f<gžOSP �A?��;)vҜ).Y?6~pufބeo)_y7mNN|>f;̋>uv5ͅcb'E߃"iF<;[M/ r$w%Kn$޽ȑ#g'-`f9W~[G?rj" �`'%NiD_O% $zx~F>̒y8}Ybvҟ쟟Z ]{N Q5]kIrH"k֬)Ejhhڿlg'-`f9}dK!1D@�NA;)hSNU愙-☵f}vi鿓O7h;)KI^ $9@)l>|8rUIfE$@�NJ;rATKkGϒw4Ҿ?wNIޛ[>^6;i^2$ZMI}jr/AM@Zti)l;i\7OYI)Bb�P;)wKqyѿG_F{YomBL2o׃KD;馿>s6RܕYr9dTalh&A YweI rUތ:ʞ(&�~��vRBwY?;3B!y3TcvRtYʰ9wkr_ًNJWVC՗[MF/ ѻfaв$9Ty=2줄G*oFIʧ>5|%Bb�P;)U)ّ %uG?|t W[䶓Yӏr╳^,N -=eswZU9W|N  sx_3be; 4Ir(BVsmvR£\7λߞCɔES �A?��;)vRvy^H1NP{jnj W MB\x~/:O1Nԟ(dt k?{t<}5Id \f(K(<O?rkn%SOM$���$Iw9vcǞVݲcA弛:]`qL[_迎}2?4-GMf_>yt#9ĉ2f]<F V.;)~@:sr^ ?G 5׾O?f;䨍2jK6;)Qʛm'RSs+D@�NV;)pnӌX~ir](s2WBgdl;#1W2׏sǬu1|f&NAf_ GUgyK|h̹)'g}uͿj2zlP|6/wɗ$ɹwql"JvRoYd(D@�NJ;7sg^;<FJvdʸ|F-r{>G?̼*(~ [OSÌ/^)ę~tJgfDg؍Qv 8_?V뱡¯nV!.n9f#MrTynʋ]Ad]2줪+oFIXRJ2Eإ$@�NJ%|AcɉYq |8Oݖ8B8_ܛpּ-B힠//i{B%T -AЗa?A;'hZP P:˲6;R*oFI9P2=VN"���I~Xˏ>Q歧-?‘(o8ig~,>I]:|o] __1E_[7f^Ɍ^&Tɸ~W\2E<LS 5 $9 e\fT]Qt.A\cnSJ;,wͱ%$@�NJh r 3ף,73+Š᾿s+! }3_OCo'F·4#1s,^HwfWzv]4 f+[!"#A`^>|l19%XjS>)E�~��vB@N(`!��;IA`' v�I$��$! v`' A?��;I!A$IB�NBr`' v�Nb' A?��IBr�;Iuwo}5~q~��vB�;I!�`' !9~��vB�;I!�`' !9~��vB�IB�NB�IBA?��;I!A$�IBA?��;I!A$�IBA?��;I!A�$!��`' !A�$!�$ NB�IBA$!�$ NB�IBA$!�$ �v~�� �vB�NBr`' !��$! vB�NBr`' !��$! vB�NBr�;IA?��IBr�;I!�(NھifB/o"Iy÷}fsb#LDa:�Rv�0 P!; ��`'�9��� N��h'= —tmC'?(Çٳ`_|֭[?s^:ss9w?㺻uB&??<S 'w//nV� tnf!�P9r{͛=%K9[lw999{666FۅQÇڢ?DOOnYX&&&׭[А*0$�"߿m۶kמtIyλ¿τO'�G={薅ȑ#]]]|`%-%_jUww~ I v�$ɝ;w_~ٲeyίW8 gb'34ǗKssÇuKr?ݻC,_<ϼW__ںu}4�HNBL� R{ٸqʕ+/>>>d8iLNNY&c[ϔZSTd||-]{wwa'!&I�,TK2z7YAl٢[E;I7èf===4E; )v�, C=o5.]:<<[Q/$9TLMM nذ!pmmm5sXT$�!*gMMMz&jժh *b۷oommo766nذ!SSS: @ NBL� ,TLLL^:a~jIoק[f{zz2215ks$; �*###K.}vR]ʮ.^CrС9oM=G?>>�$; �ʎڅUIRzzzI`߾}!I[[[˗/ܽ{�T5$; �ʂ'^n]C43K azzzdd)D9Lԣ&j�U; 1NR!-fǣK86lZ-G@GGGk� ֭﷦>j`'Rٳ'gFog-5he[jOíXshhȅ�I`'@!X Q6oޜ{荇!tKm3===<<<=K,inn޲e @a'!&I�0CB6^vmt�J7$;epPۣ/m4\�$vb�f0Et1C9-޽{lܜT]V�, $; �,Bؽ{wQ߻v-dNlIC/9777y @$�!p7':*/_>66g}}}9e311100nݺ,]u�NBL�,*,rСhmm3 Vb78ΣLww~P!I vrH(˗GIoo/q ˖-s"2*Pggg:kOõlݺu߾}: @ya'!>UNP{X FE8>{n݂Goo BN?R*CvR�vbN,^zyʕF ҄UVE-3pY&O(vb,YvA㤯O`N7lؐ meV=�; 1NP'rCB%K,ٲenAN9p(o߾};jׯ_?88x!`NI v*:s*@th544 䧧':1QD :<իWFf͚a%`'!&I�ׯXd||\ϠFF:thpp0HsV۷z�2`'!&I�'̸# &CCCQ( amݺ5l/_ٹ{)`'HC‚022XR8y-(0Y455ʲfWYE; 1NX ֭[/ p¦[P4'tАnAy up׮]sߺu'&&t`'!&I�rHXX>NիW<xPϠSs=7zH8-ccc}}}---[bEggАz�; 1N)吐3 #szzZϠ,3�-(a^jU!E֓@ NBL�TrHHጫ!zr500[P^9Օ;p;w/]4O 3aL�= $; @O,IJe˖Œ\GNzs޽{8 c/p+WrQ I v`9$$p^ƹ=+fpp0`ZʨB́{p}}}ݫӀ*`'(!ZxV SMkE}0aӱLLL Gfҥ3{MP]a'(!ؽ{wd>{e]A錎|U�H>$; X 1sСr ]|ؘFY1ʭ0q}pᡡ0VXi>s)XI vٰ#GtttX @2Nכc2Xu�kHvr H$; @!a #0˗GmOO'喖eWp&k֬{rSSSfGFF< ,8$; 吐yH, y׮]+wޭoYwtjmkk+bRK}=L˺1055 >i֭[gX(I v8I7::ZbŊ}X$αvJ3߾}766 188Ac NI v吐X)qER0MCbN+WהuN'#G35ky===Þ;* ; 1N)Ptvv-[ݽ{666Ft̺ gtt4:3.'C 1d}v NBLrH:yEٟ 6݁wéuҺ2u8*[H޶m[kkk/_fA~(PFI vP3X UڵkaNE_\jD0oGfLnPB2ijj5k" vbT;CB%9Ψ3VXnPq;燆[I$]v}P,!]�P$PK^:{�fEΥQՄMٲ`˖-9<֓ &햖<JfŊCCC.�NBLjrHU; u۷G\tȈD חgΙ<V4۶mӇ.WZUQWȀ$,XÉsQ厎OOLLI ?cgO+VA K0/]4ihhXn@LsqNBLbD^89d,~z'ϨIy-[秦pQݻ7Oí\+wdyMℝ ; 5̑#Gzzz. 吰 g/;ϳpzuȅ۷C*N:)Ç?(477oٲe޽ <!E $0AX]__kVC"'<~ݺuO3?A3jbdB o۶-عsCM211100ޞRDjALȞ_>o _TvbZedd$}]%9;f9$ xXzo^q]׭[5k$ a۰aC~;iŊ5-[B/% r d`z.=t_`'& j;-p!dD9//DxOggXT|US$o\>|8 Pf[>E}}}KKKcccC;ؘ̇P$SSSb!4'xbL#<X,&EDu? YGGG7Y&CY8`'ػwo_!p؅\ $wqg9r͛׬YiJ? ۛݺ$Ԓ*ٮ$吀ٽ{$L`1N57lP3n=7ܺNgggEnjZ[[nݺo߾Jl655MLLPFI vjÇg+% k9$9y ~~kӦMڵ=id0>>?xK],ŌPf{/rzvbjg߾}+f\h*-ĖCJdw"LMMC0hiiy|inn֥@N< >K|hOOOp2;(n$QI vZ[[KorH@ʿ<꜄sax__|sP$ oۋav`` †ja'!&IR™dWWל2:o9$T[{y֮]I-eښ7l0888/slؘNBLPLLL^=ߥ -T4sPLNNłSSQOOϜ37(>rΝ~ ; 1NB1<<\mB.P[ <K旎P<xp֭MMMt5P A+ڵkNxI'tmSf ʻ�($; UD8K-\@=ۦ,޽{qE8ܲeK7KA Hۺukkkkm/_ٹ{z422Rx^󅝄`'Zliiz;! Hsssvg]bEy#5} 5GGG ߚsK.$T]~–C={T[\{ݸqcLN8 Iё_644[3ϜonٲE'pI vO8Q3QN>l!I $W_\bŊaJ * t577k׮ ; 1NB U3X r݈ں}v7Y`rȑ 6+-Y",@9<<\J_J `'!zY#,,SSS}R5v#"$PGGG'sNku <x0RjbH]vO䇝`'! ~o9$`aټysqr9$oĄ>r2=={ek*rwe䁝`'!v)Ip:/_xժU###nDU7wڵvBtzKY㫘 vbD1>>Tޕ֭[QBN:)$�Y ȡCB* OyJ###ٰ$$ݻwG H&cccyiWZmf;wݼy.bNիWWB:uV= I v@8ܸqc]%(1Ғ ;wt#!©fm!ݠdGz[1Nn^r.wK ʲsI~r966V6s]2::Z6swu\p###sdmŰ*MBQW(CSo}ٟx㍅$`aw2 57].7ynP*e'jm*]tj|ӛ vmIŦI`'U0EQK:ׯ_;w2pŽ(Mإm677͜Kf a1a,PK><006Jx8MjiiI݈X) riJw,U{nRҎ3+`gAj/>N;Toا?7 GOWY|+_)en Rv){y{JX6KoIċGv#dGF/Rvv_|[W.ǟ{6KܚO9^'xbww3R׿u ZINՌ< LP[NKLJ.{?vvNd'T?;v(N_r)sӦMX6.eo"0{o|K\$/=dGȑv#GOsjА/SO=_jt#IRUJRR5@i'Nբù*; *&''?Od_?><~ȩ Kfإmm>RŻk]vم^zN8 qg .=0Y'!SBT1z,|5]___(ۅtOHF؟ ?/e5tM/8g/$UToVDigsu'PC׭X~w[[_7dԮ1N;:0r)c|/9ɨv~ܶmۧ> /csN:HYr!,k dʓO>YuvR Jx.`!C45UN|S*$J;={d9m38/N~KEI`'Un>hmڴ3<UW]q9DNpVTK (zCf/3+rɒ%/w e'IU`^Z-Qin /5yMP}{ׯ_W90hԴEI`'UxᇿV 6lu=T 8J^Y$㪳�F8{ 3aKe$�jDiz /;::ꪛniϞ=&fS$Nf?c=2`'D$*R$�v; `'-�?я@@)c'?@)�v; $vN*SSS'tҪUnv?X;I$�$>s)h~_'0SeIRa;)(mP >lE6; imm=/b/~>G kצ櫓O>JR(K;6pN;xRGnEȚT<J`v/]TvEo~3؆WTT$6}D}}},`^Igd;RZLinvIE2::>˜̋5 ٔ޷oRZLinvIe8!s0/B$vN@U$Tb� $9�; j1 I`')rX8|[]Ob$3<s_=9|v.Uz꩐!aXlJ[vNRPf>~ʯ|+%n;Hm*B8MmNP y/8ZqwYg]{8_!RU>V}Cti]y:Y]*I}_*N;ICO[nBܼEIGs=Q7;~#<Ru6 .Ujck<mhh;lS-=###w\I nvISx+VGElMH!. [袋{޶iӦ}Ci~*Lp*UKWػkoꪫ_߽{wumŠg㩧:_:;)N;IC7 |7!EC aQE}-믿>_}e˖Ϋ Rz?/|!O=\nll,g3U%8ViK_.;)N;ICEo e#>"W! ;~g>qƜx衇#?6 .Ujc3466>UqCbOIInvI/ras9ѻ KnB\)@"v#Ux6{y>vu%Y&?T-nNNN<9?s%>p饗&lS-PSK-oI[Ua'%?I`')rq.GFFʿ׾;v>we}c[lg;o'?IE.lG߇W .P Kn!<#۶m +ۅ;C a%x< ^\v72yZ\JlrEv;fj G[b%kRiGyޗUzOJ(mvI~0=~3NvZ(ӟ{|PB=xg+7n7Mh=[y\tݻO?=Z\~gw}?8˗9[E 57xc"7N+HX Oōpt=Pễ\ 4]- .Ujiz[b5\wuDh;f'%޽;c2 ۼys\z /i~D_HӞSN~PH -oyKV\J|?n'<}ݯ{f[l\V!</.+=\Fndfw$TJ{,=Pb ZRvG}4e߬^:cO(mvI\R*\jV *k׮ M7ݔ}ݗޏ|#.^yэ?3Ka*2e/3V8轾9\(ic6zv|)ߝG -N;RG{,i% +IⲻBI:r||<]- .Uj%R;LK.Ir!VQt׼NRld8SSDiNRT SO=7KΦҋ7*}i?Oe ZϲܓO>@:R$lgA /8p _g+ruZ@Jx]^7cue7;Ipc } u9@/Wh۶m{RDiNRTN8+wqǶg[pdd$_;{Cqȅ-իWvYwCUNuZ;ñ,ru H2fwI 4@M'$IRS5~}?Ř3N/<r9$Jv" v<Svv?~#9+_:C1sP:83 X;)tU37tSv+HXTE1KItZeRuN5!B=9g?6n(ULVڡKζ|$Jv" wW'7xc|f¯,-]w]/ԡz*NKvttM(EN#aQ ^.:IM_=jnvTT=6lHo!TU[WҾ袋Rˊ(mvI\*\ƫ fG k xn3HOcXqkgKKwQ-vRW?tNe3\ѝVCxeh1Kpo|Sz^7_/)9ND߭FTUk8kLiCN}=ϞNR=55U<e'-X_B|ɮK|g鯤WțҒONGh=ɴRS-rEw; Ue"F7׿"^R*R5' <M_|Q-^ ^J;ʋ79+NRN;T.=Pvy;;/}czO<Q"8R7;M2f|Gߦ?}NJRvT b'mڴ)=$VvIհ rq)X˕W^Nb'N{ꩧR祦wqGK~_7ݭ??J?.F-2l^v |;H2fFxWWWz׻"iN5yHxk;UI-kXiW8*W՘f'PTsοL*o@xGs~&:\g.k6g^_Qu#BIs֪gy&R=00 k ˘݅:_|qNJnMJypiO9唋.(F7uYɴR ~M7I'x +IUI`'%*V%lӰ6E|f|s~1gorYǗ-[>I_R=Sg̎;\ѝVvR ek $x~@&0'<h';:Η׿y}@mj2A'ֲ'UڇJX;J6; $vҢttt̶[3O?=͛7b{]Z2^֐ ߈PvR=go馜9쳳\ѝNBU$xo|#tiB$Uk&U8^foos~>R)՛ŖVib'Uf'NZt.K}1 _|q&ըӿm۶ ތ>C9\`ڵvҵ^{+x㍳+(ruZj)˘s𰫧zjag7;IL<r*OƿG?J,Nk>UI-.NI`'[FGիm?x򖷤QO/ߏ;w}waߴiSjy[jhꅣވ[i;)}t9_q9 wI](ru; Ue9Gxz5'%\REٝg'I"jؙIa~*5VIHE (mvIꖰ6rݻɨavNO9 3O?]` ʚޚd;i||<]ٲeKGv+I/cv9X6G(IRfR5O+VGy 1; $TڥI6; $vRHTiI?6-o SvnjǨ4򔖜E.ZZ.]O$N:ʣݟgOwW ÿV4v"˘sJI $Z3&930%}UWI(0.NI`'_K.ioo(;v? ~bZ׫Po {iIKeINT~R NtR59OO%V$pD!]U#f$"*`'N9 Hp `'$�$, *Kp9NZ �v"`'RU-d7; $E ae7Nv"(rRPNb'$Tb �v�RP%8NI@`'RU-I�;IHX �v"`'PN;I9 Hp �I`'U{S�CȚHlKU@-N; G4<<̇5U!ae7Z `v",�!N{˗n�;IUI`')r/nVUW@U^xyN;II(?/TK/$vIN�; �; `'Nb'$ *NN;ڙ r ϚR|GvIRJUT?`'TkvR)A^$I)B+=;)E ~ v; Q}x LSSS$NI$Jﯨf'NP>'U>_NJL|;NI`'�v; g'5\I�; `'`'$I�; �; $ dttt姽B8"sP36ݩ@b\5_)mԠ=,f$"*`'(_ {GC E |qJx(P;vRb*!VJvR|E.Pq8$ ]vTTZ,!I`'�E8G�;I`'9(r$9TI6NIEjK4pl(lOJ~vWd$hfJrRoI`'-L o~P8o146N'R %?N24T3 %9U)m ZU$9 7v;IC+v!vm(mvI"NҐN;d(mvIZSIFI$!vmI`'̡"N2J5Nb'b'Q*I�;IS9v!v;ɜ!v!NI"!v;IC$vʥ!v!FiNR4I$ IFIQjI`')ro;IC+v;IC$vcI`')r&kEfXGGǥ^~R IIʥ2*??f'iH- ⋵$ UWe' %U?яƥJ|Eig /T4OI`')ro$vWe/hSUPUI)^z%J(5_I`')r&kNb'i|Nb'iN2xW$vI$"Nb'b'dIf'T-<9EN ;)E$ bRV*Ie!J|!vI$ENSII$[C$vʥI�;i"w[ne```Ν$TC$v!v;IP)mvI$ (r I2_}R;v/f' v[b/WJf'NҐ~c'4d*9j NATe'iH�v;I;!v;I;!NI$ 7v;IC+v!v;(u86; ؎(")r5c'$ O$ʥ!v!NI"!v;IC$vʥ!vm:Jv"!Nb'i|N24Nb'+Jv"gv8;IC+v;IC$vcI`'̡"N2J5Nb' (mN;dU9v!v;;V4NI"ȱR I*I; `')rI$ I*IQp(mvI Q䆆_⒙ B|tooh%G |qI$Qgw2HCOUJ[CV6; 7P:a/N;ICvW$U!UknHpvI$@c'Q*NvI$E; p*Uv �vҼ=ܓM3kU(<^!CCѕ8_vR< nj(ٝp;j PS֐~UN;)"}7}fhțC\f7J[C͛�v"iN;riDif'iHI2_ IFf'șN3W_y扉 vQ!v;;V4TF[QN;IӐ~[xk#Ib'e~U$5\Sv(m /P<e'iHI2_9/MUKCUa'x饗(m|Nb'ș;!;!v;1_I`'%˗ 9EN;)ݩ/0Ib'o'%9UU. (m 7vNGHYSRy=/9N;)f;)Eh%riTNWb'NR9EdhN25Nb'\IJx}W_ɰ4db' b'RSJJv;ICmpvW)gcI2HC%5\K;$󕆒I`'4I$ ygd"UIo$NR4Nb'iNR4Nb'iH�vx'_W"Ռg7;IC<H`\b'%6_ivRI# )r\IEd7;IC<ɩriDikH�v"iN;riDif'iHI2_ IFf'ș"NҐN;d(mvI$s"ȱR I2HC$J|EiNb'C9EdhN25NU. �v")r$TC$vʥ!v!NI"!v;IC$vʥ!vm:Jv"!Nb'i|N24Nb'+Jv"gv8;IC+v;IC$vcI`'̡"N2J5Nb' (mN;dU9v!v;;V4NI"ȱR I*I; `')rI$ I*IQp(mvI;!;H;d(mvI /rCCC\qThk>:|b 鷊7 q8x(P;vRb*!VJvR|Enj0 Ir-;w;ICvW$U!UkNݐ1+mvI0*6/FvKplcǎX %Uoڸ#!3x*$9(sv^~e $?U_z%J`'NJt{_پifM k5bh(aN'R UKv'NZ,4Tz֌Di(mvIXssy獎z߄MxD_(X;)\pAnfT*nI(mKC'8; DR|V9E*A^K4NNJZI`\b'(mI`'9ENc'<b' l I*~c'$v"yw777R II$KCUI`'4 '|N`'i|U9jJŦ6_NA*1U/^a'4dN;!Nb'i|Us8$4TNҐ~c'$v"!v;IC$vʥ!v;ICΝ;n(r"W3vR*o³!vR J;v$0UU. (m 7vNB*r"W3vRN;)Or\b'Qo$)rb'4Nb'\b'QFáI`')ro$vW$#AC$vQjI`')r&kȱ4db'4Nb'<+Jv;)r$TC$v ;6_Q$IPENc'<b' l (mKC$)r;(;riDikH�v"iN;riDif'iHI2_ IFf'ș"NҐN;d(mvI$s"ȱR I2HC$J|EiNb'C9EdhN25NU. �v")r$TC$vʥ!v!NI"!v;IC$vʥ!vm:Jv"!Nb'i|N24Nb'+Jv"gv8;IC+v;IC$vcI`'̡\ _W???OLLLOOR IIʥ2*'|Jv"!0*6/Fv4NVe' %UƥJ|Eig /T4OI`')ro$vWe/hSUPUI)^z%J(5_I`')r&kNb'i|Nb'iN2xW$vIdbbbͽgqENSjNJe5\Sxv4NNJg?ʥ!vRYꫯWb'TkvR")rUa'z^r!vRvRJSU;,@i4N;ҝp%3P5*K6ⴓIpTCՒ݉j 5c'Q+JvRI7pCPq^H:yWX|h I*$ ZvYiNb' P䆇>'QS*v+T/f'U$6; $vNb'<G3I@U*; `'{' 7ͬV"x[ EW" |qI$Qgw2HCՒ1If'T^_5Ӑ~}IkqTCU6x<g*nɯW_}5mPb6; 2QHWENSjN*"Ib'şINUKC$J[C9ENC$vI$KC$J(u86; $ENCNҐd$hN2JW6; $Edp9vW$vI$|EiNb'C9EdjNAb'Q+Jv;)r$GC$v!vri9ENc'b'T. (m 7vNR9 Ib'T. (mP$9 7v;IC+v!v;(5_Q$9QI2_Ib' N;dU9vQ!v;IiDi(mvI$s"ȱ  IIʥ!vNR9EdjNR4N5I�;IS4Nb'iNR4NRCiNR4I$ IFI$|EiNRLGc'i|Nb'iN2xW6; $v9T/XN;riDikH%Ji SvI;!U;//TU4TvR^z6JW$vIᰓI2_Ib' ;v;dȱIFI$!vmI`'U;;w[8)r\I nvIITݱcGSU;֐~c'|-<9EN ;)E$ bRV*Ie!J|!vI$ENSII$[C$vʥI�;i"4db' b'RCiNb'iHI2_wgd"UIo$NR4Nb'iNR�88D!.u¸ԀqR31CMbbRS(Gbܫ (( G f A9iL"2n#J8Mp ϫjZ>}>Ho''<&Nq8Yo$q''<8Id+vI`SSӿ:9N.1qR?^$O$N*}J5(Rsy"qRQ 2ҶD$II(NN'KLGu<8^ΥD$#mOd@TNnџ|꣓;9j|JOkrg2㞣O7Ot V_e'%/V/U#mO:'!N*]'w7WA-8I+"NR(դŪ.NB$N8 *U'i8 q8I'NNQ*AYurw_'szyJuož(>M7ٿ&l x' 3N*Mn^]qRb/.R5D;#mqur7ȻwvStq2ʹM/66F8II1')U/66F$NqsI JU_lmI N0'9FE$NRJHnqtrH'g+Nr8ITXunq$'Š<'*$ugItr:9NN')UFFڈ'=:98Iu;FU$TFFڈ@!NRtQ8>AꋍU8 I:9 t TcTXqRU$#m#m*h-NBD:y/'IQ:Ŋ*QFڞHuϗsZ$I:9O'R|/lj/~a/6''tr:9q8)pq8I"NRwF$q$qNN''N'n.N')UIFFڈ'UF®0p/NN'GbTu?ùW81*R#a8(Cii#NB8)%hQqRJ^꽈R8)%<K8I"'!N'tr/>Ca0::*NRݎQI$TI$#m8yNG$I$O+}81*by$JW;$#my-NB$ND:9q81*Z$Jbq6$'trcT.NRJU_,N2V$'trIQ'R'y"-NqRjkktr:93MUwsnqcTJ_\$T='8iwU'#1C<[x98I*U#mOI N0'9FE$NRJH[_U8 qN aIQ'R'鋍U8 qNN'ɉ<'*$]'!N'tr:9qV \Tii#NB$Ntr$URii#NqNN'8ɡcTI$T='8I'Vq8I*U#m}V$IɅvإQkh'ʣvN8Ǩsn+TKm+UFFڈ'-823-+"NB*դIn-NB$NB''RUUF8INN''NB+pRinI NO~Kb7!|X!CYUWQ%۶*b#m#mI' �}1nqtȑw}Y0+<@TAR} nq<DoςY9|ٟ}\b$ Q(( T8H/ӑ8 qRjjjR僧> _BuC"G[n]~e˔*(Ui'対>7KvX0+/!&&&*jT8)w޽{`V^~e I_RB{WŐH?Iŋ?OY!lT---pVԧ*6$U '!N*GFF¸ fOMWw}X0[95)^exi 4눓'Q,h޽o>\ʣ>8E(X R-u"a//>8}]�I) KhѢXxqWWWr)}C;#0@zWciC2F$IEzT%7'?R+_%  3LTuuuccc()U(R-$QRP&#mq"sO>duu[֯}kX~ӟ~_QPY_?U7_C9}ojjꩧ*W^1҆i'UVE oxÕW^y7ݻ7ad````2S~X2KÇ̌7 +ef܏~_W/7n\xqՉ*qUN+˿X---JU*U_#mqb:tPMMMU>\xS/e~3B^e666̌}RWs+d C_dɞ={TV݉З-[ݭTRU \+2'!N*і9q)}E]4uwuW!>7uᇅ,3˼ꪫ Yf__eMdR`'>P.;UNއ|&aQJՇ^8 qҜ]ݻ7lذt#S544TȾiڵSY2m6uᇅ,3ljj*d Yf=iׇZ?խUw>PWJU*UBi'͹G````Ꟈ� Yfg/.sppefܱ\2ۼȑ#?SխUw>ʚM*U/V H[8 ���O$JD��� NDI��� $JD��� NDI��� $JD��� NDI��� $JD��� NDI��� $JD��� NDI��� $JD��� NDI��� $JD��� NDI��� $JD��� NDI��� $JD��� NDI��� $JD��� NDI��� $JD��� NDI��� $JD��� NDI��� $JD��� NDI��� $JD��� NDI��� $JD��� NDI��� $JD��� NDI��� $JD��� NDI��� $JD��� NDI��� $JD��� NDI��� $JD��� NDI��� $JD��� NDI��� $JD��� NDI��� $JD��� NDI��� $JD��� NDI��� $JD��� NDI��� $JD��� NDI��� $JD��� NDI��� $JD��� NDI��� $JD��� NDI��� $JD��� NDI��� $JD��� NDI��� $JD��� NDI��� $JD��� NDI��� $JD��� NDI��� $JD��� NDI��� $JD��� NDI��� $JD��� NDI��� $JD��� NDI��� $JD��� NDI��� $JD��� NDI��� $JD��� NDI�K/=�ݝ}>8 q�E�'!N@ N'!N@ N'!N"⤎S4-9-I�$I�aIMӴ䴰['' N4M'' N4M'' N4M'@ N4M'@ N'i&N'8 �qi$q8 q�$M4q8 q�$M4q8 q�$M4q8 I�$M4q8 I�$qi$�q�'i&N'' N4M'' N4M'' N4M'@ N4M'@ N'i&N'8 �qi$q8 q�$M4q8 q�$M4q8 q�$M4q8 I�$M4q8 I�$qi$�q�'i&N'' N4M'' N4M'' N4M'@ N4M'@ N'i&N'8 �qi$q8 q�$M4q8 q�ccc۶m'i�I�I[[ۢE6l+N4M''0˗v+Vhoo'i�I�VoooULuuussÇIZ嶱ǪJճWMR?+^x|s~-8 @$aÆ)֬Y5>>.N*Zܪ,:aK>U~)˸w.^{^8 @$744T]]]ҥK[[[;]8I+z٪_?*&ZJdw''�I N(,ŝ[ҷמ\f֜;ҼIxII$�q�J$>'wE[6p ׵[v]^{8iqU8a I�$'NڜY8]8I+V{yjow>ÞJ&!q~J/Oq8 @$8'wM-NҊվ[~$ד6/ qrYK3T8I Nq@Ie;N-NҊ>|gx駽׽翝~;~G$N'8 `d(uXwU?yE5,&ǬPT}v3ytͼ^t|s R -I kgGvUf ''�I N79]ti?{檷9C<k~l{ԽƟW~r¿OrIUeպOJŸ['_t9hʵ=9⤗_i5^0Br^zjǟN4gLިi7p͒EI�$'̧onqRݟS}'d1ݟ?79X>mQ~m3lNyjվ30DUf{?StO|L~SqkOhj~.N'@0f;''COjN/J%A/ I;l|_Gקz7DMxz3W?>˩[J^kM.*J>o8i3[ڞ¥?_%q8 @3I�̙{O*tyo'Uۮ<%3I)Oi!N<| מ{߆Wu{?-gIm7䳄? gD)+n 'M9.lxC剓I�$9N޹s8i?wY0;Sg_ w-3I=9Op?'ro_i_?UwY_짩'I~+7:MRZɌI<aULjs?i'�I NDm5ٵ[gn~//:>5fQeu9>>/a߲I۲1uz&W$N'8 `A[z?iq|WV^WȖwv?7mRwx$U-']^_v&'\tYmܔ|8w{-d۵9-~58I NY5 @i߿EL:N?Q([?>{8O?2r}_7M孈oOȒ.>?3Jk.sQ|<0*N'�yiӦbI;w<vXpq<mS¿guC"'a9|wi橸SǪvNㄹb2iEfNq`&>$q8 �OE {zz._4O?rέ3?ضpٻf!2_qo˼uz\Onϒn7uJbo8)asQ$N@� 211zBR-[ Myl#fS|n8iư?;W/=:9/u'S~Oт+s|ڵEqR||N$N@� k׮BylW}`~⤱f`wͿmC3?/:O+-']GqҬ'�I�@8vؒ%K f;yl:&-EISڏul잜]\uOsNx.JO4nOd9Q$q8 �l{42ok̏9Mg1A>K}}>N;^ʵ]U{? /X+b8)1l N' ND M-N*4iϩI_ן >i:"ՋUN?+JgjO mߎqR<ϟ_??̆8I N�R3p8Ͷ88~˳K`ڹqRxX>5&_Cꇻ?;9-|3[\BR[Ϳ]zgxde;WB٦vx>8I N�nj3p8Ͷ8ec>38ytqR儠:?|R[=9o<i.V']N+ɨh8)>g{'�I�@2l'{+?X\t#-Nݷf>&,'>ỏ&3n(^ߏd>7Oz<Ixv6x vg>OX'iqRXݫ n/HL8I N�Ef[T(M=3]'d@o{s -s2O8*m9gƟ?ȸҶ^s>߮Z{+$-NJ;!7O0z㷴{͢YL%N'�ҙ:w!l*?QUa28w :㍙I~ L_睰w== &?u'\;^|J;*8镃U~?"Û_g1SЮ\wBrMxiwv'�(l*(QcϯɃn>ù9qhk] 3OMJ'VZZw:II /5fJ$N'�&5w'UVέz)tqN'%,v2#UwOK󖳪 W]RIVK \�Sǫ^9NJ=c�_L2$N'�766RiI~dMBӝ%NWյ}ֱ3W+VoJɗӐv͇Ur4q8 �H8qR2Z8I4q8 �'i$M'��q&N4q8 �'i$M'��q&N4q8 �'I&N'�I�I�8I顪{wڞ 4q8 �'i�I�8I4M N�Ii$�q� N4M'��I�'�$M4q8 �'i�I�8I4M N�Ii$�q� N4M'��I�'�$M4q8 �'i�I�8I4M N�Ii$�q� N4M'��I�'�$M4q8 �'i�I�8I4M N�Ii$�q� N4M'��I�'�$M4q8 �(IqW:o5MӦRn'��L N�I�$�q� N'�rK/=6}mٲeڵ{o?;w>?~[-sgguVC!tttX-smo|v_bK;|�q�P|ccc7o^bEcŋ]v=zJ+&&&6::ZWW8`Ƒ#GvEBitvvXc�'�y[:Kjժq+dqիD[[R2cccDiѢEVK)vuu555dA2ٺu5q�0#e˖e9B o/G@/RbigIm֬Y3^kϞ=ǎ�r$N�511qr]]][[WOOŋeҥ>yDjGǎܸq%Kfܕ:tN�޽{w㮠{llJw)cV\944ḍ͛7KFT&ˁZ[[Cdٿ-[lӦMo�'�{{{lْ}Rwtt ZisxgL?PbIHEvڝ;wĉ�`A H0i'^re8 3v _jnnvZZZrlar˗/^{B�q�,8ݛ6m FY,Yqa+< /YhQGGR(+[G u=dtI)`�`Hᨮ.>:֬Yp?ХKocx544(2766j9{b 'o 8 �ldd$u3'*B⳽Oȑ#VK'J֭3UcǎkfCI644޽B NIM2}Ѭe+Q\<WZ*BOOO<(Uyuww755 jժU[n=psЀ'@BD}dEQ꺌SVphchCC<8p ^uС5kdqϞ=ǎƀ$'@ۿS{D`5Ѻ'jTyVX!QܳgOcccˊS3:t@�'xY<R.H+V'MZ*'J˗/wimիGBr�2>aGtŠ$_dI ._<^$޽{wCCC -Zv;vJ8$�(_ٿ议v@`i7_b!1FFF'-]t``jIޞo˖-:6{zzTq�]vgT{7ovlyg 322ϋC8pjI}oqQk ([$�( ccc===7o_qRp4bR텰I444?&`%O< d 7R=BKKK__{qF�ȑ#;vXvmoSomm&,igmmmVK[.>Nwwղ@ ܹ3l�Y}0<<l@�vر'nllܳg;/4GYlY02l0VKMLLGshll{ӦM=T+W0I�Pݣ׬Y !uCYi SOOO|,s3/Eccc|n,L}A]]]S,YqN:�'N94444㍢T{:\$Y PKKٳ&K?f͚m۶I'@&X  x׻w)-$lk˖-!Om۶Mktt8 �#K5ک9/ܦǷf,pMb6 "###7nrEڎ9bE'Nvuu8mjMM-ʕ+GV D)~cCCD4aommF T誺8 �f=vO]nf͚,36م#~ŋX-DZ$`:CCCvrRuuuv988h'@NSW,Y$کoMZG}˖-sM S%Juuu%ۼy˳tX1. NF[l~Auu}ˬŷիW8p < ѣG۳~U__k.r'Ntׯ>+l{]fkbb)-%Ja#dVNgR][I�868{ɒ%7nܽ{F;VWWߨZ[[r188i+#GرcڵYf�\xqCCC@F$�pxeHYf۶mm-+Vi0M((ƖBO߮Zz֭[C'hq� H8oll~[0lsPyÿOfkxx8JJ(覥YzosϞ=ǎ`' CUVeT{ݺu;vp-3~܊+D�mdd$(-^i#ѱc3L:d$N Ɏ=k׮gM,tִ̅c0_S$\%DخnݚK.ݴiSww>q�IyMss˳ S/2s5,555bm]DiѢExja ޽{Æ Y ڵkwKXI�$ġCfOM4[ S###a{o~mmmV EWJ(񾾾-[į'<JD'PR;xKSRJGYlYl.HKۭJѣׯ2)ax@xXx5I"Nnݚvtܛ%_tҁ+n޼9(QbkkkTe˖>,A� CCCvjhh>SgכrʕZZZ;pn0/g<t6lؽ{5J@ݼys ¨~׮]Ng~MLL4777K6)b0xwwM_rʭ[8pPYI�#GرcݺuYbVZyiM%mCE8Ւ%K6nhC$�hWWWSSS|jjjQggȈFZre|ꮎy OdRK+z~͚5۶m33q�&8p è1uuummmw+֢–c===0󨻻;([.w<P.fFެ]]]q�6<<{7.Y$9zP[_˖-;r˼K`]]]!ҵk׆ XmD7l2!N{{{lْ}Rwtt Zi̝G—6ի]I8p@༐3,'콭RDe˖mڴ]\a~�C;w\~}IW\Ǝ}}}.4ÆWȭ�1OSSS|3nhhp`CI3(>|8J)]vgB_[ݭ]I�h3sxxJcg8:vXZ[[X`<QZ|lOܽ{wo׮]k}Rz7o,_MAɈ�(m۶cS'>>A̗ 66ȝ;wwp #l՝*,lK*QڴiS>ߍ9׭[唥ŋڵkhh#N ###@zƍomY(y| k]cХK~UVEvV&`ll,u*tcd5}E'N`v, ѲOnݺ;wTvf͛ 222#ŋ8A{I9r-aO]b P,$�rrюgo�ZSS߶6;v*ŧ gK IhWWWcccW^B�vjݻwʚ2?5)%H(B *wǾnݺFYsΩ|W.SRS:Y&�qϞ=6iȃ8 tjkk YNm֭p\MEؿxoӮ BuXTӎ'٧o{<*.M6'`kϞ=IO~2*N|:Ȯ]ɑ#G⓼.^8l$ 011vZhooȌ Tf?䏩twwYi8 5䋩j]vǎJBe<5)زet)lVw‚Ғ̻麆,'4A ]hѢʺi+)1q@фFoooΡP7o};Gs<B?_rJSH[l2t9lj*kHݯ6lu)aPTw 'Gs/^l c0>Z o!]ڵˑ3Iٙ%6M{Dsss1ׯ7:'|) ¦4 #IR7]n]uuuSCP#k׮XRN҉� [nM]l_nȑ#;vc,s[[[ͅA"+4{yll,'ܬ.Hx ~ӒVDJ} Xb˖-}}}MQ_8_J'N(ȱcǢϦ2yI]]]8v###>G*>>CCCYu[+;-Q Gٯ$U\݆J %{}Q>5q@06L-&&&8u5kdEšC||,s EGc+%-Qz;Q52J`ll,V^caT6/,']dIZ.c�ٙvٱcJv ٿ@mnn޿! Mڤ0m۶-!ċhٲecg<#)m�:t(ٿëI^ /cʕG1I�6u )J㽽---+V>;::!XFGGh~᷿i_,;<f!mj`;vlϞ=s Ēk׮gTJq g2j֭s;w~wPadW7ضm[,.,u͛:ܫ&XjU+jˆ1tRI�?WEѮM6eHMMƍ;;;R]TW_}9]E{{"HMgcǎzqL(.q@veY&\ H]"Wuuua>5+VDċNDZ|yUBFPV׷e˖)VԔ4v}"NY |΍7f?" 86m=::s錌}EʪUP\tfL|gϞJ'<^rea]XrU;wq@.ZZZu\WW{߷%D,7G!ǒmnn~_"7H5E!NȦ'Wf%`._X" #€ä0+CCCE?"׭[gNPY&&&v޽zꪹw+f%ukf`gu_:5 !Nvmjkkg\Z譻g&jɒ%7n2gD᪫7lذ~9/ȑ#[lnEJz3}%u8[YgZjhh'?$ FGGׯ_�y e)XfͶmr�=z4{KMMMggNe LOOOCCC\] C8zL}{wgq@Çj|dd${W˖-kjj26ќ Tިtt׮]k֬)nd~ȣNCw32dڭ~C'+;w™-q Bg5J[[[WZ2uرȑ#V5Ç(EZlY8Ns ! 388:jБkn```֭AUYWW75%NxU8Jܼyl˗/Ϟ@X",W' sjÆ MV\i_B"{I/۶m s'u|CCCE֭[75"Nxow83^z]v镡4xjRܹ,0,@cccw.C\t&&&RƯX3J�źիnzwW@]tRwbnZSXP=.۵k444nMDq@T߳gP/yocc] >nVǨ˗/`^n޼~ LČIȢ* 8`}<I---ֆ{ -힧@)uww]i4tI544.l%===mva+ =CfkZW0/ۋ8ҥKU2' Qoo%K{nJ/{4hѢuօy8iӦ,:tZ۱cGUnúe*ql۶('�gn%JPb 6 x#ohh~ZZZLSS6F, UsiѢEh%311v䚚M6B) -_<!:%Je>_l*%IP`2y.0b̌šB^R9rYgU͛s|GGG Yf؀go! $Twخr_j5Ij˖-{)d Yf"k<l$uDTKY_җ.Ep S qR]hj_i]tEvirKƑ^#mq̉SضmۺufucUZڌBqr.?a]M]fa! /)p9ϢdJ}>Γ7gM8(mkk[fM[/nOLL466#l u)l>PJUN'JUiBH[i/̑8 ىo]pJeRȾ3Ϝzew7uv[!˼.3e_~|;z׻ʭ3.͇>29ڸqczr꥜`H{ʻ\xJV YfXuSV +RR ϢTR-TCW}q'i^sAiWH;|KQG?+_<~'~-㤴ϟ~j1x,NRJURe'iv#p*NʈFFFnV}9455_ߟw3ua]2.3 Yf#e'x"?߻w-\se]wMozөn]z,3~wy?M6MüJoy[O;wܷo_kROgVe\2Y8,>_qRUJuVZ)qv\GGoojD׿>/n!l7x>ݣҮ8 *&NJ žzѢE7n|衇8wU>_veadsiehƮʴM@*.N '?Ɍ>,La̚ut(@v$ jIFfs0yӛtUtק{,`Ui$-@>l誣+Xzuzx9x;ߙZ'FȆCyK$#ԇ>3<3€3 ;?_%C,䑶8 *,N'طoΝ;�HvE]ve'ۀaVƯa]i⤗_~ʇBJ$dF>'8 cW-8o3$L7mll<x`K'r-J )Uq$u-Nq$VIK.zk_cqR‰ IPw=mʍ%><$ H3q$PCCCj{g[A⤨_BIJ'i8 kɒ%N+2 ')UHpd ?H[yN7_w}gqFPMe[.*$8N2҆i O:}g*h``{pp0zm(VWW]+U(J}sZFڐԑ8 :Do&PMR} nqVu8 T8 trS NŠI"W}CXxs=^PJ}XS]pCwIȮG/}Eݻ7|#)|gSms&sT\uj o^r%'|r9y_ѣG6KPeXJU淭~`6/RUH;8x5\SSSmKS=osIhO?X3>ΫiVAܬ޾!,7} AKU \*կ}kUQľxag^FwqG4'au@'Gq:gyfV?O_$)N7↰o᡺ zd}}}x0O9p~ a˳Ro[mTTH;:'uj-[BG}?8'N"trwC_}fc=z[RYCYm---QfO.[, l \*pT=pZ©+U}14Ytia\r?g>fo-Nz뭡H23ysqH9/\o j wI'qj/"N4wCr.pT V3:x੧Z޽{+hS_vFtx{ޓz@cc8 trO'6wі%nڴ)/| ' a!l[_zW_=cտ \*·թ~ӟmoK^[#ӄʌ뮻RXb8 tr$jw `'o1?_Wok&> p'z~6UXw1d%;⣟ƿ%Α^zia<\=氺R/;N.V7U%+;-o~sw{LX'7guWJ+UZ:Ֆ-[)ҮQDxFڍ|{YJI xrpgǏx$wI'?thKKKuu? >trybs //mU-9S3wq^`"eɒ%zkNn+oKVUw~[xFsQL\ꮔWJmujE׫=}RURIitM\p>F$Udݝ3袋m۶mƛq/#{~O>d.\aat6lߴ{w^>tDŽ?OwyUW566nf޽ygL{ot먩>OL~ _u緅G]GݷoO<QȊ-euWJ+UZ&:J?T.<=7?|I.W UcoO=vz?<%7*E 8®<?]w+s9'dB}-0uB\1祗^zWG_;<&dɒ(zklj'J*Rx~՝}za <><SCrJ)pT V{a^˔8vݜ{~SOEqX9ii@'W1=\?aS?^k&O::4駟x6 {Lw^7`e/LQ D_LE4N.7U,"V[x4Ymݶo߾PiN?0p')ĔtB}%TxxG)7pCiv%DU2\2'NL{O>9;}?w}___j!GtwL t\=OV^]!_?ias :aEoaV^92}ь %c'J3" =}9yrJxà6Y.')ĔjFщq RUTi? mi@'W^=\}}}]=ܓ.?|tFzƞo釞zk6tf{oN.tiw^ŬNq/ggCwyg+Oo}j'J3" ==Wʅ^v}WSS矟㓖IujbJ5[JUWP'{}WWEum\rIx( 5xmU\@{g?zSa/wwo苅e˖=ss1\-?Ywyl艹\+("Vs9'-QeR$R*: Nw#S>@ / #h!WUY.Nq.Vyǿm߾=߆t #ׁɥ-_j hٳZ/>:W!,QEYI7[{c6mTA-NR)թibJOH;-tWWŀO=8 treB~m޼90$MџD3e`ƃt} f{euhN:)_r%yYzkN.VK/n>^q ߸qc4< _Bto nqRML =]*S$xRGw_L,O|"#9Sq歇r>:{ Gh^xW_}]w=3sɽ|g7j^hQYKI[g£B˲{vg&5RUeXie3w㤔_~Y_ <#o1PY]e.$q8 Jptvvm@U[lYtNu]nf9wƍur^zij( .g{"n}hgy)2)]i Rս{n՝/buϸwt\^:]qRT(UZȶܜwnR-8)U~/z'{MrHSOMH[e-C؛n)B|wVSg袋kv٣/!n_D7>~;#ŬFY^x!]i RZ&X3nRPn3~#UUwI)YԝR-d[=sR Y['qj-z'{UG>,77@>'8i a.+n!vi5X.tWc2vrG]ti_~y:('"k)W+*38c|_ITDs£7zLkkkU8I&T#=\gM^Z/vodf5aI NZpC\s=74n۶-O{KN.+~"{gy椓NJ=f3~#8ϟITDso9県#po~[TTPHdZ'{OG#P /DooLH[7׻lٲg}6###w)񤿽=SN9OG}4Ai6urA}}Ne/)iѓO>ygL]ۯ[ou({{{~{G-o/bu粅=z4tÇn+IJ5IPD8ixGW]uU| ik a#mq6~nիԗ?Þo}k4s^o/h뮻{ Dp 4Y:a.'沗g{O>|/27ȨG93vѻ8c;b|{Mii\~+NoN,NJRsa{O{ PH4[TV)Mr<*NZhѣG7Tbx=O`ӗI N!lZ?駟-'톝a3 {>N.OwuWQc3N␽ gM֖ʪvry4qQEܷ0МviS,.')BK/4/| E8" <#,UWWg|.#mq`SSG?э7NwO¦蚯xY /3hNȲen馩Żgy({.>OD5o{.Q_]|&;5;c%xJu'Xݳ¿G7DSl^?a%VwxT?)UzR)?~[[[;J{/?<F$(i\[s_wG}t01?/'=57ljs_l\V+[Ks=~{edcdTj9S \u‹ }qx1'N*!,(p b$'8 qCX@JU_ [:90U N/-NT7�}1nq@'A+U$'*8@$P IN aq(U}1nqVu8 T8 trS NŠI NTA_ @‚W/V N'l!ꆲ-p b`[Ez{{P51UPTA_ cu@'ITŠI*_P`TAF$yU7$u[+s7UPa?:'NIR_B_ $qh|ýV8)U?rR#(UH^*zH8 )$,NJ ksŪI)aq�qI N'8 IYk"E ]4E@&¤Z2kg]EBXb L&ey39wN8AgϳsVB<7$�t@'I�N֍7It@'I7ׯuӦ�: 8Bu%޺u+_L'CF͛ļiI�ItPԀI@]L't Zmfff!, 6Kwp wM F4՝$J7P*ID複^υr\Jb6A |2W|#IuTmynnt_ɅOd$tB'*D5.n8I�QEl�IJJN|FUNit@' \r_\)< SjP.Nr JfPQi乥iI\1saPxq:);ş$'dUA[6(9<7:N2}E'9 I6m}eӦ�%g$WtdD'9<+6(9SrtSjD'IAtM}eӦ�:D'IAtM[sD'tSrJNrx $wAtM ύN䔜AtdD'i.$AMNAD'侢$S꾲iI3sSrtA+:N2NMNZ)9:)5N$ :ɦiI�UrJNrJ $ :ɦ �:I)9%߹sNrJ $ :ɦ }ܹnt g Z4M'D'nK'IA# ʦ'XsJ'J ύN r_8݁N3Q\B'emS꾢$ oBDϳSrJ:)#Z$褜uRFaT5AtH{M}eIJN)9:1Nl$:Isynt@'IJ :N2N4AtdF'F'I$' :NrJ:N$<JhmnnINAt`D'Iˠmt@'BmmmuIZRRI/$Ƞ!I+b޴$N2s$Wg$ 2Q $�!IJW%\2:itII<j.$A@)9$: :N\I6m۱iI3s$Wt`D'9+6(9$WtdD'9<+6IP%$ :N $ʦM't;T)9:1Nl$2N$%D'I :ɦmF'PrJ :N2N4AtM)vlt $: $D'INʦM'\\Kg^@c9=yA]<|P8瓩 SjP\'%dPQi乥iI@~%W* |2uC DjK7N$@IϨ I6mN$%%G'>*@'ٴ: TrJKTϥ}{A[MON'NA;rXKAGզmM'}o79<fI27ٴ |�% $$:IsD'ٴRoǦM'J ύN r_INAt䔺lt\ގ r_ItAtlt@'C\%w텅+W<xNrJ $ :ɦ ᦽ8MNAlVF$-veee[,$A$iюM}efs9j333䔜KF'eg$^:FUsTnmNN ?JN)B褌^h rIaJQ\I#! 6mAt@')9%$ :Nr $I�D')9$: :N\ItANRrD'侢$:)v$: "*d"6: $D'INSM{qqq6IynPr[[[_RV$ԠtRŮ$ 2hȨ.//GG;tʠ7m: Ǐ޽{nh]%\2:)KO7d6 *Nݻgv_D'bٍhSrJ.4@$sT5AtM ύN䔜AtdD'i.$Sش$@ItA+:I0NRMNQrtA+:N2NMN$wSrtSjD'IAtM}eӦ�:D'IAtM[sD'tSrJNrJ $ed6s�(9%gD'D'I :ɦz;6m: PryntdNr $}eӦ�%vdN $}eӦ�:D'Iddv_ٴ$Nr*9%G'9<Itmd\I�䔜R$:IsD'ٴ $�JND'IIt2Ni;ގMNAD'侢$:)u_ٴ$@ɹ%G'侢$$:q_ٴ$ T.٧И~N>q?c6A>d|#IuTmynnt_ɕJ) u9L$B$Q �: H*�d iIg Z4--vccc[#z#?l6ǚS: z>;;{'Nj~\Tjc5sa0,ݧN?ݹ)5(t:0ˠ vmvJWIv1DMhy}oMB'e@ov37嬓2” *7Ŭ2ž`v_4p$Nr*9:NrJ $ 2Nilt@'C$:6N4At@')9%$ :N\ItANRrjډ'N<9;;[$ :Nr $eP6m: 䶶ZINA)l;vmܾN S:}eP̛6 jPrJN%tn: :)gQ؈0ˠBئ2N$IJW%\2:itII<j.$A@)9$: :N\I6m۱iI3s$Wt`D'9+6(9$WtdD'9<+6IP%$ :N $ʦM't;T)9:1Nl$2N$%D'I :ɦmF'PrJ :N2N4AtM)vlt $: $D'INʦM'Je(9: D'D'IʦM't;T)9:)5N$ :ɦiI�UrJNrx $ :ɦ �:I)9%G'9It2NiI�3N $edvJ6(9<7:N2}E'9 ItS꾲iIsY{;JN2}E'IIt㾲iI�UrJNrJ $ 2Nilt@'C$:6Nik.$NRrJNYro߾wރ?~L'9Itmd\pӾ{X7m: PrynZV馓 zF1-N FG;6mMO4ͱN$+WB+9%IYO7dK!+++FUsTn⥥% : H䔜+Nq: :)gDUe4ž`v_D'tSrJNrx $ :N\IIr{\:7g >9LORhuRb],A dtM}eӦduRTR'I.NUj:I!t@'\Z~LV�:N$: (ЦM'tp%%$ Ϩ;qb: (DT$ MN$RtSژ~.k ro" :)K}<;şEuee%¨j.rsT ҒM}eP6 He7!oM>o"vtf7|[9ˠB|[b]lv_ٴ$Nr*9%G'9ItD'ٴWI�䔜$:6Nik.ύN$% $$:IsD'ٴ $�JNyntdNr lNcӦ�%gF'I$: :NrxW6m: Pr.koGI$:I$:ɦiI�UrJNrJ $ 2Ni �:I)9%G'9<Itmd\IJND'IIt2NiI�$: $D'ٴRoǦM'J ύN r_ItAtlt\ގ r_ItItM}eӦ�:D'Iddv_D'tSrJNrx $ :ɦ<7: 3N $ed6s�(9%ItA+:I0Ni;ގMNAD'侢$$:q_ٴ$@ɹ~ Z4M'D'I :ɦmզl6ǚS: Pryntdjt:2:)n۴RD'h4Sr,N2N_'eQ؈0 :ɦmF'+BDϳSrJ:)#Z$褜uRFaT5AtH{M}eIJN)9:1Nl$:Isynt@'IJ :N2N4AtdF'F'I$' :NrJ:N$<J./' r_INAtz;6m: $: U~Q 8$A"tA?ܹsg~~ܹssssz])9%N}…M'D', F۴WI@jXv#䔜KF' n: :)Ued6s�(9%gD'D'I :ɦz;6m: 8+_r hL?g81ߟ3|?.>sAanyN)-;rX.?6m;MN+R4$tB'*D5.n8I�QEl�IJJN|FUNit@'*JǛؠg}v}lS<|p2uR>n?ݑĺXTuqQi$ݩnt_$݄PDئmIG)9:I}Fp:ITEU۴mڠ�:I)9IB3IQ6mtI�Nt$j6H$�J %g|FD'ڴutK7(9N2H$:ITA'ɝM[$@)9%$pDئmIG)9:I}Fp:ITEU۴mڠ�:I)9IB3IQ6mtI�Nt$j6H$�J %+!AϘjttjDUT$Mڴ$@VF$Qѻ<c|[,$(DTmIal6ǚS: Pr)9:NLlT$Q-vۦmt^pVrJ,7o?tϨ_'eQuVQDNIoܸaӶiN$D<+9%B褌^I>"gDU:IT餑Mt@')9%:I|F$QU:NiK7ItD' :NU:N2H$�tSrf{{{kkƍjuooNnQ$:ITENlX7m: Rr@h=G'IϨmnI!zhhNi#MN$D'NU$tMt Zmfff!JN!6Kw>M'sT$QUAM'x1!݈*9%dVM'sT$QUAM'PrJVX:gTItM[KtI3HYa$QA'I*t.iK7(9%dItNR6m馓�:I)9%G'I 8$6m6$N=JNI3I*ئmIJNɁNgTItM 馓�(9%+,3*$:ITEզ[$K.JųS J ;Ϩ;-^vEئmLNB(9+0Q!^QTu[$NSrt\EUT[A't .U]lӖnI�<|z.T* f!+>pp/DTs;ۢ ]lӶiNI�I� �b@$@JN:IT] N B^FRvTդH.@!*@6 N7RɝnBH5?URݴ$`p=EtnnΝzo?~\$ 8M's;/#~O|wyGTUqNgmm-4kDՊ<Ǐn`0:Nғ'OD=ڴi6t/{{{׮] Au[1; @n0c"9|vӦ'! M7 8('aDis$0JAGIhG^ߚM[,ۡD5)ʟشh7m:  v5W^}饗} DO曐M7 7700̦[$`F>XXX~vwwC.Be_[o믅3J ?0D;dڵk MMNFF7xcuuU޾}%2t___׻/ڴ7m: ?/?ǎ;sLTzQV_xAl AV}F1k޾}5?5ÿRka^s{{5C5_x O?}92xtKt7=ly@oQj!*.ilt0J]+L !8qDk 0z_snnn|a'0/8iǏ/]/7^}կZTEUTEU\'dӦ?GG{N:_~0_5ϟ??k~w9d=yC܄9r$p_tKt+W퉪 l策����IENDB`���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mitogen-0.3.9/docs/images/billing.graphml�����������������������������������������������������������0000664�0000000�0000000�00000022017�14656664731�0020402�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" standalone="no"?> <graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd"> <!--Created by yEd 3.14.4--> <key attr.name="Description" attr.type="string" for="graph" id="d0"/> <key for="port" id="d1" yfiles.type="portgraphics"/> <key for="port" id="d2" yfiles.type="portgeometry"/> <key for="port" id="d3" yfiles.type="portuserdata"/> <key attr.name="url" attr.type="string" for="node" id="d4"/> <key attr.name="description" attr.type="string" for="node" id="d5"/> <key for="node" id="d6" yfiles.type="nodegraphics"/> <key for="graphml" id="d7" yfiles.type="resources"/> <key attr.name="url" attr.type="string" for="edge" id="d8"/> <key attr.name="description" attr.type="string" for="edge" id="d9"/> <key for="edge" id="d10" yfiles.type="edgegraphics"/> <graph edgedefault="directed" id="G"> <data key="d0"/> <node id="n0"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="140.0" x="319.0" y="189.0"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="44.03125" x="47.984375" y="5.93359375">master<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="140.0" x="319.0" y="239.0"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="70.55078125" x="34.724609375" y="5.93359375">ssh:bastion<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="140.0" x="319.0" y="342.0"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="60.42578125" x="39.787109375" y="5.93359375">sudo:root<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="140.0" x="319.0" y="392.0"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="91.421875" x="24.2890625" y="5.93359375">docker:billing0<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="140.0" x="319.0" y="442.0"/> <y:Fill color="#99CC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="131.740234375" x="4.1298828125" y="5.93359375">run-nightly-billing.py<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n5"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="140.0" x="319.0" y="290.5"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="80.728515625" x="29.6357421875" y="5.93359375">ssh:docker-a<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <edge id="e0" source="n0" target="n1"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e1" source="n1" target="n5"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e2" source="n2" target="n3"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e3" source="n3" target="n4"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e4" source="n5" target="n2"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> </graph> <data key="d7"> <y:Resources/> </data> </graphml> �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mitogen-0.3.9/docs/images/billing.svg���������������������������������������������������������������0000664�0000000�0000000�00000050422�14656664731�0017550�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="867.208" height="1728" viewBox="0 0 325.203 648"><defs><symbol overflow="visible" id="a"><path d="M1.781 0v-14.031h2.125v1.969a5.06 5.06 0 0 1 1.766-1.657c.726-.414 1.562-.625 2.5-.625 1.031 0 1.879.215 2.547.64.664.43 1.133 1.032 1.406 1.813 1.113-1.632 2.563-2.453 4.344-2.453 1.383 0 2.453.387 3.203 1.156.75.774 1.125 1.954 1.125 3.547V0h-2.36v-8.844c0-.945-.078-1.629-.234-2.047a2.06 2.06 0 0 0-.844-1.015 2.605 2.605 0 0 0-1.422-.39c-.992 0-1.812.335-2.468 1-.649.655-.969 1.702-.969 3.14V0h-2.375v-9.125c0-1.05-.2-1.844-.594-2.375-.386-.531-1.015-.797-1.89-.797-.668 0-1.29.18-1.86.531-.574.356-.992.871-1.25 1.547-.25.68-.375 1.656-.375 2.938V0zm0 0"/></symbol><symbol overflow="visible" id="b"><path d="M10.938-1.734c-.876.75-1.727 1.28-2.547 1.593-.813.301-1.684.454-2.61.454-1.543 0-2.73-.376-3.562-1.125C1.395-1.563.984-2.524.984-3.704c0-.688.157-1.313.47-1.875a3.926 3.926 0 0 1 1.218-1.375 5.897 5.897 0 0 1 1.719-.781c.468-.125 1.171-.243 2.109-.36 1.914-.226 3.332-.5 4.25-.812v-.625c0-.969-.227-1.649-.672-2.047-.605-.531-1.508-.797-2.703-.797-1.125 0-1.953.2-2.484.594-.532.386-.922 1.074-1.172 2.062L1.39-10.03c.207-.989.55-1.79 1.03-2.406.49-.614 1.192-1.083 2.11-1.407.914-.332 1.977-.5 3.188-.5 1.195 0 2.172.14 2.922.422.75.281 1.296.637 1.64 1.063.352.43.602.964.75 1.609.07.406.11 1.14.11 2.203v3.172c0 2.21.05 3.605.156 4.188.101.585.305 1.148.61 1.687h-2.485c-.25-.488-.414-1.066-.485-1.734zm-.188-5.313c-.867.356-2.164.656-3.89.906-.981.137-1.673.293-2.079.47-.406.179-.718.437-.937.78-.219.336-.328.711-.328 1.125 0 .637.238 1.168.718 1.594.477.418 1.18.625 2.11.625.914 0 1.726-.195 2.437-.594.719-.406 1.242-.957 1.578-1.656.258-.531.391-1.32.391-2.375zm0 0"/></symbol><symbol overflow="visible" id="c"><path d="M.828-4.188l2.36-.375c.132.95.5 1.672 1.093 2.172.602.5 1.446.75 2.532.75 1.093 0 1.906-.218 2.437-.656.531-.445.797-.973.797-1.578 0-.531-.235-.953-.703-1.266-.324-.207-1.137-.476-2.438-.812-1.742-.438-2.949-.817-3.625-1.14-.68-.321-1.187-.766-1.531-1.329a3.6 3.6 0 0 1-.516-1.89c0-.626.141-1.204.422-1.735.29-.531.68-.973 1.172-1.328.375-.27.879-.5 1.516-.688a7.181 7.181 0 0 1 2.047-.28c1.101 0 2.07.155 2.906.468.832.313 1.445.742 1.844 1.281.394.543.664 1.274.812 2.188l-2.312.312c-.118-.719-.43-1.281-.938-1.687-.5-.406-1.215-.61-2.14-.61-1.094 0-1.875.184-2.344.547-.461.356-.688.778-.688 1.266 0 .305.094.578.281.828.196.25.504.46.922.625.239.094.938.297 2.094.61 1.688.449 2.86.82 3.516 1.109.664.281 1.187.699 1.562 1.25.383.543.578 1.218.578 2.031 0 .793-.234 1.543-.703 2.25-.46.7-1.125 1.242-2 1.625-.867.375-1.851.563-2.953.563-1.824 0-3.215-.376-4.172-1.125C1.707-1.57 1.098-2.696.828-4.188zm0 0"/></symbol><symbol overflow="visible" id="d"><path d="M6.984-2.125l.344 2.094c-.68.144-1.277.218-1.797.218-.867 0-1.539-.136-2.015-.406-.48-.281-.82-.64-1.016-1.078-.188-.445-.281-1.383-.281-2.812v-8.079H.469v-1.843h1.75v-3.485l2.36-1.422v4.907h2.405v1.844H4.578v8.203c0 .687.04 1.132.125 1.328.094.187.234.34.422.453.188.117.457.172.813.172.257 0 .609-.031 1.046-.094zm0 0"/></symbol><symbol overflow="visible" id="e"><path d="M11.39-4.516l2.454.297c-.387 1.438-1.106 2.555-2.156 3.344C10.645-.082 9.305.313 7.671.313c-2.055 0-3.684-.63-4.89-1.891C1.581-2.836.983-4.61.983-6.891c0-2.363.61-4.195 1.829-5.5 1.218-1.3 2.796-1.953 4.734-1.953 1.875 0 3.406.64 4.594 1.922 1.187 1.274 1.78 3.063 1.78 5.375v.64H3.454c.082 1.544.516 2.727 1.297 3.548.79.812 1.77 1.218 2.938 1.218.875 0 1.617-.226 2.234-.687.613-.457 1.101-1.188 1.469-2.188zM3.579-8.359h7.844c-.106-1.188-.406-2.07-.906-2.657-.762-.914-1.743-1.375-2.938-1.375-1.094 0-2.016.368-2.766 1.094-.742.73-1.152 1.711-1.234 2.938zm0 0"/></symbol><symbol overflow="visible" id="f"><path d="M1.75 0v-14.031h2.14v2.125c.551-1 1.055-1.656 1.516-1.969a2.7 2.7 0 0 1 1.532-.469c.8 0 1.613.258 2.437.766l-.813 2.203c-.585-.344-1.167-.516-1.75-.516-.523 0-.992.157-1.406.47-.406.312-.699.745-.875 1.296-.261.844-.39 1.773-.39 2.781V0zm0 0"/></symbol><symbol overflow="visible" id="g"><path d="M1.781 0v-19.375h2.375v6.953c1.114-1.281 2.516-1.922 4.203-1.922 1.04 0 1.942.203 2.704.61.769.406 1.32.976 1.656 1.703.332.719.5 1.765.5 3.14V0h-2.39v-8.89c0-1.188-.259-2.051-.767-2.594-.511-.54-1.242-.813-2.187-.813a3.91 3.91 0 0 0-2 .547c-.617.367-1.059.86-1.328 1.484-.262.625-.39 1.493-.39 2.594V0zm0 0"/></symbol><symbol overflow="visible" id="h"><path d="M2.438-11.328v-2.703h2.718v2.703zM2.438 0v-2.703h2.718V0zm0 0"/></symbol><symbol overflow="visible" id="i"><path d="M3.984 0H1.766v-19.375h2.39v6.922c1-1.258 2.282-1.89 3.844-1.89.863 0 1.68.171 2.453.515a4.87 4.87 0 0 1 1.89 1.469c.5.625.891 1.386 1.173 2.28a9.36 9.36 0 0 1 .421 2.845c0 2.406-.593 4.265-1.78 5.578C10.968-.344 9.538.312 7.874.312c-1.656 0-2.953-.687-3.89-2.062zm-.03-7.125c0 1.688.226 2.906.687 3.656C5.39-2.25 6.398-1.64 7.67-1.64c1.04 0 1.942-.445 2.704-1.343.758-.907 1.14-2.254 1.14-4.047 0-1.832-.367-3.18-1.093-4.047-.73-.875-1.61-1.313-2.64-1.313-1.044 0-1.946.454-2.704 1.36-.75.898-1.125 2.199-1.125 3.906zm0 0"/></symbol><symbol overflow="visible" id="j"><path d="M1.797-16.64v-2.735h2.375v2.734zm0 16.64v-14.031h2.375V0zm0 0"/></symbol><symbol overflow="visible" id="k"><path d="M.906-7.016c0-2.601.719-4.53 2.156-5.78 1.208-1.032 2.68-1.548 4.422-1.548 1.926 0 3.5.633 4.72 1.89 1.226 1.263 1.843 3.009 1.843 5.235 0 1.813-.274 3.235-.813 4.266A5.756 5.756 0 0 1 10.86-.547a6.862 6.862 0 0 1-3.375.86c-1.968 0-3.558-.63-4.765-1.891C1.508-2.836.906-4.648.906-7.016zm2.438 0c0 1.793.39 3.137 1.172 4.032.78.898 1.77 1.343 2.968 1.343 1.176 0 2.157-.445 2.938-1.343.789-.895 1.187-2.266 1.187-4.11 0-1.738-.398-3.05-1.187-3.937-.793-.895-1.774-1.344-2.938-1.344-1.199 0-2.187.445-2.968 1.328-.782.887-1.172 2.23-1.172 4.031zm0 0"/></symbol><symbol overflow="visible" id="l"><path d="M1.781 0v-14.031h2.14v2c1.032-1.54 2.52-2.313 4.47-2.313.843 0 1.617.153 2.328.453.707.305 1.238.704 1.594 1.204.351.492.601 1.074.75 1.75.082.437.124 1.21.124 2.312V0h-2.374v-8.531c0-.969-.094-1.692-.282-2.172a2.271 2.271 0 0 0-.984-1.156c-.469-.29-1.024-.438-1.656-.438-1.012 0-1.887.324-2.625.969-.743.648-1.11 1.867-1.11 3.656V0zm0 0"/></symbol><symbol overflow="visible" id="m"><path d="M10.984 0v-2.063C9.891-.476 8.406.313 6.531.313c-.836 0-1.61-.157-2.328-.47-.719-.32-1.25-.722-1.594-1.202-.343-.477-.59-1.067-.734-1.766-.094-.457-.14-1.195-.14-2.219v-8.687h2.374v7.781c0 1.242.047 2.078.141 2.516.156.625.473 1.117.953 1.468.488.356 1.086.532 1.797.532.719 0 1.39-.18 2.016-.547.625-.364 1.066-.86 1.328-1.485.258-.632.39-1.55.39-2.75v-7.515h2.375V0zm0 0"/></symbol><symbol overflow="visible" id="n"><path d="M10.89 0v-1.766C9.993-.379 8.688.313 6.97.313A5.537 5.537 0 0 1 3.875-.61c-.938-.614-1.668-1.473-2.188-2.579C1.176-4.288.922-5.562.922-7c0-1.406.234-2.676.703-3.813.469-1.144 1.164-2.019 2.094-2.624a5.696 5.696 0 0 1 3.14-.907c.844 0 1.594.18 2.25.531.664.356 1.207.82 1.625 1.391v-6.953h2.36V0zM3.376-7c0 1.793.375 3.137 1.125 4.031.758.887 1.656 1.328 2.688 1.328 1.039 0 1.921-.421 2.64-1.265.727-.852 1.094-2.156 1.094-3.906 0-1.915-.371-3.32-1.11-4.22-.742-.894-1.652-1.343-2.734-1.343-1.055 0-1.933.434-2.64 1.297-.711.855-1.063 2.215-1.063 4.078zm0 0"/></symbol><symbol overflow="visible" id="o"><path d="M10.938-5.14l2.343.296c-.261 1.617-.918 2.883-1.969 3.797C10.258-.14 8.97.313 7.438.313c-1.918 0-3.461-.625-4.625-1.875-1.168-1.258-1.75-3.063-1.75-5.407 0-1.508.25-2.832.75-3.968.5-1.133 1.257-1.985 2.28-2.547a6.825 6.825 0 0 1 3.36-.86c1.52 0 2.766.387 3.734 1.156.97.774 1.594 1.868 1.876 3.282l-2.313.36c-.23-.946-.625-1.657-1.188-2.126-.554-.476-1.226-.719-2.015-.719-1.2 0-2.172.434-2.922 1.297-.75.856-1.125 2.211-1.125 4.063 0 1.886.36 3.258 1.078 4.11.727.855 1.672 1.28 2.828 1.28.938 0 1.719-.285 2.344-.859.625-.57 1.02-1.453 1.188-2.64zm0 0"/></symbol><symbol overflow="visible" id="p"><path d="M1.797 0v-19.375h2.375v11.047l5.64-5.703h3.079L7.516-8.828 13.422 0h-2.938L5.86-7.172l-1.687 1.61V0zm0 0"/></symbol><symbol overflow="visible" id="q"><path d="M1.734 0v-19.375H4.11V0zm0 0"/></symbol><symbol overflow="visible" id="r"><path d="M1.344 1.156l2.312.344c.102.719.375 1.238.813 1.563.593.437 1.398.656 2.422.656 1.093 0 1.937-.219 2.53-.656.602-.438 1.017-1.055 1.235-1.844.114-.492.172-1.508.172-3.063C9.785-.614 8.488 0 6.938 0c-1.93 0-3.422-.691-4.485-2.078C1.398-3.473.875-5.145.875-7.094c0-1.343.238-2.578.719-3.703.488-1.133 1.191-2.008 2.11-2.625.925-.613 2.007-.922 3.25-.922 1.655 0 3.019.668 4.093 2v-1.687h2.187v12.125c0 2.187-.226 3.734-.671 4.64-.438.914-1.141 1.633-2.11 2.157-.96.53-2.148.796-3.562.796-1.668 0-3.016-.375-4.047-1.125-1.031-.75-1.531-1.886-1.5-3.406zm1.968-8.422c0 1.844.364 3.188 1.094 4.032.739.843 1.657 1.265 2.75 1.265 1.094 0 2.008-.422 2.75-1.265.739-.844 1.11-2.16 1.11-3.954 0-1.718-.383-3.007-1.141-3.875-.762-.874-1.68-1.312-2.75-1.312-1.063 0-1.965.43-2.703 1.281-.742.856-1.11 2.133-1.11 3.828zm0 0"/></symbol><symbol overflow="visible" id="s"><path d="M1.125-9.547c0-2.289.234-4.133.703-5.531.469-1.395 1.164-2.473 2.094-3.235.937-.757 2.11-1.14 3.515-1.14 1.04 0 1.954.21 2.735.625.781.418 1.426 1.023 1.937 1.812.52.793.922 1.758 1.204 2.891.289 1.125.437 2.652.437 4.578 0 2.274-.234 4.106-.703 5.5-.461 1.399-1.156 2.477-2.094 3.234C10.023-.05 8.852.329 7.438.329c-1.868 0-3.329-.664-4.391-2C1.766-3.285 1.125-5.91 1.125-9.547zm2.438 0c0 3.18.367 5.293 1.109 6.344.75 1.055 1.672 1.578 2.766 1.578 1.093 0 2.007-.523 2.75-1.578.75-1.063 1.124-3.176 1.124-6.344 0-3.195-.374-5.316-1.124-6.36-.743-1.05-1.668-1.577-2.782-1.577-1.086 0-1.953.464-2.61 1.39-.823 1.18-1.234 3.36-1.234 6.547zm0 0"/></symbol><symbol overflow="visible" id="t"><path d="M.86-5.813v-2.39h7.312v2.39zm0 0"/></symbol><symbol overflow="visible" id="u"><path d="M1.672 5.406l-.266-2.234c.52.144.977.219 1.375.219.52 0 .938-.09 1.25-.266.32-.18.586-.43.797-.75.145-.242.383-.828.719-1.766.039-.136.113-.328.219-.578L.437-14.03H3l2.922 8.125c.375 1.031.71 2.117 1.016 3.25.269-1.094.597-2.16.984-3.203l3-8.172h2.375L7.953.234c-.574 1.54-1.016 2.602-1.328 3.188-.43.781-.918 1.351-1.469 1.719-.543.363-1.187.546-1.937.546-.461 0-.977-.093-1.547-.28zm0 0"/></symbol><symbol overflow="visible" id="v"><path d="M2.453 0v-2.703h2.719V0zm0 0"/></symbol><symbol overflow="visible" id="w"><path d="M1.781 5.375v-19.406h2.172v1.828c.508-.719 1.082-1.254 1.719-1.61.644-.351 1.426-.53 2.344-.53 1.195 0 2.254.308 3.171.921.915.617 1.61 1.485 2.079 2.61.468 1.124.703 2.355.703 3.687 0 1.438-.262 2.734-.781 3.89-.512 1.15-1.262 2.028-2.25 2.641-.981.602-2.012.906-3.094.906-.793 0-1.508-.167-2.14-.5a4.847 4.847 0 0 1-1.548-1.265v6.828zM3.938-6.938c0 1.805.363 3.137 1.093 4 .727.868 1.614 1.297 2.657 1.297 1.062 0 1.968-.445 2.718-1.343.75-.895 1.125-2.282 1.125-4.157 0-1.78-.37-3.113-1.11-4-.73-.894-1.605-1.343-2.624-1.343-1.012 0-1.906.476-2.688 1.421-.78.95-1.171 2.325-1.171 4.126zm0 0"/></symbol></defs><path d="M0 0h325.203v648H0zm0 0" fill="#fff"/><path d="M4.563 4.559H320.64v67.68H4.562zm0 0" fill="#ffca00"/><use xlink:href="#a" x="264.6" y="121.08" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#b" x="287.148" y="121.08" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#c" x="302.203" y="121.08" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#d" x="315.737" y="121.08" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#e" x="323.257" y="121.08" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#f" x="338.312" y="121.08" width="100%" height="100%" transform="translate(-143.398 -72)"/><path d="M4.563 3.36h317.16v69.96H3.48V3.36zm0 2.28V4.56H5.64v67.68H4.563V71.16H320.64v1.078h-1.079V4.558h1.079v1.083zm0 0"/><path d="M4.563 117.36H320.64v67.8H4.562zm0 0" fill="#ffca00"/><use xlink:href="#c" x="237.48" y="233.88" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#c" x="251.014" y="233.88" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#g" x="264.549" y="233.88" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#h" x="279.603" y="233.88" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#i" x="287.123" y="233.88" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#b" x="302.178" y="233.88" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#c" x="317.232" y="233.88" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#d" x="331.037" y="233.88" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#j" x="338.558" y="233.88" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#k" x="344.571" y="233.88" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#l" x="359.459" y="233.88" width="100%" height="100%" transform="translate(-143.398 -72)"/><path d="M4.563 116.281h317.16v69.957H3.48v-69.957zm0 2.278v-1.2H5.64v67.801H4.563v-1.2H320.64v1.2h-1.079v-67.8h1.079v1.199zm0 0"/><path d="M4.563 349.922H320.64v67.797H4.562zm0 0" fill="#ffca00"/><use xlink:href="#c" x="249.48" y="466.44" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#m" x="263.014" y="466.44" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#n" x="278.069" y="466.44" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#k" x="293.123" y="466.44" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#h" x="308.177" y="466.44" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#f" x="315.698" y="466.44" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#k" x="324.901" y="466.44" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#k" x="339.955" y="466.44" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#d" x="355.01" y="466.44" width="100%" height="100%" transform="translate(-143.398 -72)"/><path d="M4.563 348.84h317.16v69.96H3.48v-69.96zm0 2.281v-1.2H5.64v67.798H4.563v-1.2H320.64v1.2h-1.079v-67.797h1.079v1.2zm0 0"/><path d="M4.563 462.84H320.64v67.8H4.562zm0 0" fill="#ffca00"/><use xlink:href="#n" x="219.36" y="579.36" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#k" x="234.414" y="579.36" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#o" x="249.469" y="579.36" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#p" x="263.003" y="579.36" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#e" x="276.537" y="579.36" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#f" x="291.591" y="579.36" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#h" x="300.795" y="579.36" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#i" x="308.315" y="579.36" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#j" x="323.37" y="579.36" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#q" x="329.383" y="579.36" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#q" x="335.397" y="579.36" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#j" x="341.411" y="579.36" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#l" x="347.425" y="579.36" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#r" x="362.312" y="579.36" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#s" x="377.367" y="579.36" width="100%" height="100%" transform="translate(-143.398 -72)"/><path d="M4.563 461.762h317.16v69.957H3.48v-69.957zm0 2.277v-1.2H5.64v67.802H4.563v-1.2H320.64v1.2h-1.079V462.84h1.079v1.2zm0 0"/><path d="M4.563 575.762H320.64v67.68H4.562zm0 0" fill="#97ca00"/><use xlink:href="#f" x="185.52" y="692.28" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#m" x="194.534" y="692.28" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#l" x="209.588" y="692.28" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#t" x="224.643" y="692.28" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#l" x="233.657" y="692.28" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#j" x="248.711" y="692.28" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#r" x="254.725" y="692.28" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#g" x="269.779" y="692.28" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#d" x="284.833" y="692.28" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#q" x="292.354" y="692.28" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#u" x="298.58" y="692.28" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#t" x="312.114" y="692.28" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#i" x="321.128" y="692.28" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#j" x="336.016" y="692.28" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#q" x="342.242" y="692.28" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#q" x="348.255" y="692.28" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#j" x="354.269" y="692.28" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#l" x="360.283" y="692.28" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#r" x="375.171" y="692.28" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#v" x="390.225" y="692.28" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#w" x="397.745" y="692.28" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#u" x="412.8" y="692.28" width="100%" height="100%" transform="translate(-143.398 -72)"/><path d="M4.563 574.68h317.16v69.96H3.48v-69.96zm0 2.16v-1.078H5.64v67.68H4.563v-1.083H320.64v1.082h-1.079v-67.68h1.079v1.079zm0 0"/><path d="M4.563 233.64H320.64v67.801H4.562zm0 0" fill="#ffca00"/><use xlink:href="#c" x="228.48" y="350.16" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#c" x="242.014" y="350.16" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#g" x="255.549" y="350.16" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#h" x="270.603" y="350.16" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#n" x="278.123" y="350.16" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#k" x="293.178" y="350.16" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#o" x="308.232" y="350.16" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#p" x="322.037" y="350.16" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#e" x="335.571" y="350.16" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#f" x="350.459" y="350.16" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#t" x="359.662" y="350.16" width="100%" height="100%" transform="translate(-143.398 -72)"/><use xlink:href="#b" x="368.676" y="350.16" width="100%" height="100%" transform="translate(-143.398 -72)"/><path d="M4.563 232.559h317.16v69.96H3.48v-69.96zm0 2.28v-1.198H5.64v67.8H4.563v-1.203H320.64v1.203h-1.079v-67.8h1.079v1.199zm0 0M163.68 72.238V99.36h-2.157V72.24zm0 0"/><path d="M162.602 117.36l11.28-27-11.28 6.718-11.282-6.719zm0 0M163.68 417.719v27.12h-2.157v-27.12zm0 0"/><path d="M162.602 462.84l11.28-27.121-11.28 6.84-11.282-6.84zm0 0M163.68 530.64v27h-2.157v-27zm0 0"/><path d="M162.602 575.762l11.28-27.121-11.28 6.84-11.282-6.84zm0 0M163.68 185.16v30.48h-2.157v-30.48zm0 0"/><path d="M162.602 233.64l11.28-27-11.28 6.72-11.282-6.72zm0 0M163.68 301.441v30.48h-2.157v-30.48zm0 0"/><path d="M162.602 349.922l11.28-27-11.28 6.719-11.282-6.72zm0 0"/></svg>����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mitogen-0.3.9/docs/images/context-tree.graphml������������������������������������������������������0000664�0000000�0000000�00000061577�14656664731�0021421�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" standalone="no"?> <graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd"> <!--Created by yEd 3.14.4--> <key attr.name="Description" attr.type="string" for="graph" id="d0"/> <key for="port" id="d1" yfiles.type="portgraphics"/> <key for="port" id="d2" yfiles.type="portgeometry"/> <key for="port" id="d3" yfiles.type="portuserdata"/> <key attr.name="url" attr.type="string" for="node" id="d4"/> <key attr.name="description" attr.type="string" for="node" id="d5"/> <key for="node" id="d6" yfiles.type="nodegraphics"/> <key for="graphml" id="d7" yfiles.type="resources"/> <key attr.name="url" attr.type="string" for="edge" id="d8"/> <key attr.name="description" attr.type="string" for="edge" id="d9"/> <key for="edge" id="d10" yfiles.type="edgegraphics"/> <graph edgedefault="directed" id="G"> <data key="d0"/> <node id="n0"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="303.75" y="0.0"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="44.03125" x="13.484375" y="5.93359375">master<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="303.75" y="50.0"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="47.072265625" x="11.9638671875" y="5.93359375">bastion<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="121.5" y="100.0"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="25.287109375" x="22.8564453125" y="5.93359375">dc1<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="486.0" y="100.0"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="25.287109375" x="22.8564453125" y="5.93359375">dc2<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="40.5" y="150.0"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="43.873046875" x="13.5634765625" y="5.93359375">rack11<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n5"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="202.5" y="150.0"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="43.873046875" x="13.5634765625" y="5.93359375">rack12<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n6"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="81.0" y="200.0"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="54.859375" x="8.0703125" y="5.93359375">node11a<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n7"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="0.0" y="200.0"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="55.78515625" x="7.607421875" y="5.93359375">node11b<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n8"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="162.0" y="200.0"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="54.859375" x="8.0703125" y="5.93359375">node12a<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n9"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="243.0" y="200.0"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="55.78515625" x="7.607421875" y="5.93359375">node12b<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n10"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="526.5" y="200.0"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="54.859375" x="8.0703125" y="5.93359375">node21a<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n11"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="607.5" y="200.0"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="55.78515625" x="7.607421875" y="5.93359375">node21b<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n12"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="445.5" y="200.0"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="54.859375" x="8.0703125" y="5.93359375">node22a<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n13"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="364.5" y="200.0"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="55.78515625" x="7.607421875" y="5.93359375">node22b<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n14"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="567.0" y="150.0"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="43.873046875" x="13.5634765625" y="5.93359375">rack21<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n15"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="405.0" y="150.0"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="43.873046875" x="13.5634765625" y="5.93359375">rack22<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n16"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="152.0" x="202.5" y="250.0"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="137.083984375" x="7.4580078125" y="5.93359375">sudo:node12b:webapp<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n17"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="152.0" x="405.0" y="250.0"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="136.158203125" x="7.9208984375" y="5.93359375">sudo:node22a:webapp<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <edge id="e0" source="n0" target="n1"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e1" source="n1" target="n3"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e2" source="n1" target="n2"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e3" source="n2" target="n4"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e4" source="n4" target="n7"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e5" source="n4" target="n6"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e6" source="n5" target="n9"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e7" source="n5" target="n8"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e8" source="n2" target="n5"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e9" source="n15" target="n13"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e10" source="n15" target="n12"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e11" source="n3" target="n14"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e12" source="n14" target="n10"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e13" source="n14" target="n11"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e14" source="n9" target="n16"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e15" source="n3" target="n15"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e16" source="n12" target="n17"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> </graph> <data key="d7"> <y:Resources/> </data> </graphml> ���������������������������������������������������������������������������������������������������������������������������������mitogen-0.3.9/docs/images/context-tree.svg����������������������������������������������������������0000664�0000000�0000000�00000067074�14656664731�0020564�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="624" height="259.521" viewBox="0 0 468 194.641"><defs><symbol overflow="visible" id="a"><path d="M.547 0v-4.281h.64v.593c.133-.207.313-.374.532-.5.226-.132.488-.203.781-.203.313 0 .566.07.766.204.207.136.351.324.437.562.344-.508.785-.766 1.328-.766.426 0 .754.121.985.36.226.242.343.605.343 1.093V0h-.734v-2.703c0-.29-.027-.5-.078-.625a.544.544 0 0 0-.25-.297.718.718 0 0 0-.422-.125c-.305 0-.559.102-.766.297-.199.2-.296.523-.296.969V0h-.72v-2.781c0-.32-.062-.563-.187-.719-.117-.164-.308-.25-.578-.25-.2 0-.387.055-.562.156a.912.912 0 0 0-.391.469c-.074.21-.11.512-.11.906V0zm0 0"/></symbol><symbol overflow="visible" id="b"><path d="M3.344-.531c-.274.23-.531.39-.781.484a2.25 2.25 0 0 1-.797.14C1.296.094.93-.02.672-.25a1.13 1.13 0 0 1-.375-.875c0-.207.047-.398.14-.578.094-.176.22-.317.376-.422.156-.102.332-.18.53-.234.134-.04.348-.079.641-.11.582-.07 1.016-.156 1.297-.25v-.187c0-.301-.07-.508-.203-.625-.187-.164-.465-.25-.828-.25-.344 0-.602.062-.766.187-.156.117-.273.324-.343.625l-.72-.094c.063-.3.165-.546.313-.734a1.52 1.52 0 0 1 .641-.437c.281-.102.61-.157.984-.157.364 0 .66.047.891.141.227.086.395.195.5.328.113.125.191.29.234.485.02.124.032.351.032.671v.97c0 .679.015 1.105.046 1.28.032.18.094.352.188.516h-.766a1.447 1.447 0 0 1-.14-.531zM3.28-2.156c-.261.117-.656.21-1.187.281-.305.043-.516.09-.64.14a.689.689 0 0 0-.282.235.659.659 0 0 0-.094.344c0 .199.07.367.219.5.144.125.36.187.64.187.282 0 .532-.062.75-.187a1.17 1.17 0 0 0 .485-.5c.07-.164.11-.41.11-.735zm0 0"/></symbol><symbol overflow="visible" id="c"><path d="M.25-1.281l.719-.11c.039.293.156.516.344.672.187.149.44.219.765.219.332 0 .578-.066.735-.203a.611.611 0 0 0 .25-.485.441.441 0 0 0-.204-.375c-.105-.07-.355-.156-.75-.25-.53-.132-.902-.25-1.109-.343a1.073 1.073 0 0 1-.469-.406 1.098 1.098 0 0 1-.156-.579c0-.195.04-.375.125-.53.094-.165.21-.302.36-.407.113-.082.269-.156.468-.219.195-.062.406-.094.625-.094.332 0 .625.055.875.157.258.093.445.226.563.39.125.168.21.387.265.656l-.719.11c-.03-.227-.124-.399-.28-.516C2.5-3.719 2.28-3.78 2-3.78c-.336 0-.574.058-.719.172-.136.105-.203.23-.203.375 0 .093.031.18.094.25a.52.52 0 0 0 .266.203c.07.023.289.086.656.187.508.137.863.25 1.062.344.207.086.367.21.485.375.113.168.171.371.171.61 0 .25-.074.484-.218.702-.137.211-.34.372-.61.485a2.222 2.222 0 0 1-.89.172C1.53.094 1.102-.02.813-.25.52-.477.332-.82.25-1.281zm0 0"/></symbol><symbol overflow="visible" id="d"><path d="M2.125-.656l.11.64c-.212.051-.391.079-.547.079-.262 0-.465-.043-.61-.126A.703.703 0 0 1 .766-.39C.703-.523.672-.812.672-1.25v-2.469H.14v-.562h.53v-1.063l.735-.437v1.5h.719v.562h-.719v2.5c0 .211.008.344.032.407.03.062.07.109.125.14a.56.56 0 0 0 .25.047c.082 0 .187-.008.312-.031zm0 0"/></symbol><symbol overflow="visible" id="e"><path d="M3.484-1.375l.75.094c-.125.437-.351.777-.671 1.015-.313.243-.72.36-1.22.36-.624 0-1.124-.192-1.5-.578C.478-.867.298-1.41.298-2.11c0-.72.187-1.274.562-1.672.375-.406.852-.61 1.438-.61.582 0 1.05.2 1.406.594.363.387.547.934.547 1.64v.204H1.047c.031.469.164.828.406 1.078.238.25.535.375.89.375.27 0 .5-.066.688-.203.188-.145.336-.367.453-.672zm-2.39-1.188h2.39c-.03-.351-.12-.617-.265-.796a1.146 1.146 0 0 0-.906-.422c-.336 0-.618.117-.844.344-.23.218-.356.511-.375.874zm0 0"/></symbol><symbol overflow="visible" id="f"><path d="M.531 0v-4.281h.656v.64c.165-.3.317-.5.454-.593a.824.824 0 0 1 .484-.157c.238 0 .484.079.734.235l-.25.687a1.077 1.077 0 0 0-.53-.156.686.686 0 0 0-.423.14.756.756 0 0 0-.265.391 2.688 2.688 0 0 0-.125.844V0zm0 0"/></symbol><symbol overflow="visible" id="g"><path d="M1.219 0H.547v-5.922h.719v2.11c.312-.383.703-.579 1.171-.579.27 0 .52.059.75.172.239.106.43.258.579.453.156.188.273.418.359.688.094.273.14.562.14.875 0 .73-.183 1.297-.546 1.703-.367.398-.805.594-1.313.594-.511 0-.906-.207-1.187-.625zm-.016-2.172c0 .512.07.883.219 1.11.226.375.535.562.922.562.32 0 .597-.133.828-.406.226-.281.344-.692.344-1.235 0-.562-.118-.972-.344-1.234-.219-.27-.485-.406-.797-.406-.313 0-.59.14-.828.422-.23.273-.344.668-.344 1.187zm0 0"/></symbol><symbol overflow="visible" id="h"><path d="M.547-5.078v-.844h.734v.844zM.547 0v-4.281h.734V0zm0 0"/></symbol><symbol overflow="visible" id="i"><path d="M.281-2.14c0-.79.219-1.38.656-1.766.364-.32.813-.485 1.344-.485.594 0 1.078.2 1.453.594.375.387.563.918.563 1.594 0 .555-.086.992-.25 1.312a1.797 1.797 0 0 1-.734.735C3 .008 2.655.094 2.28.094c-.594 0-1.078-.192-1.453-.578C.461-.867.281-1.422.281-2.141zm.735 0c0 .554.117.964.359 1.234.238.273.54.406.906.406.364 0 .664-.133.906-.406.239-.281.36-.703.36-1.266 0-.531-.121-.93-.36-1.203a1.168 1.168 0 0 0-.906-.406c-.367 0-.668.136-.906.406-.242.273-.36.684-.36 1.234zm0 0"/></symbol><symbol overflow="visible" id="j"><path d="M.547 0v-4.281h.656v.61c.313-.477.766-.72 1.36-.72.257 0 .492.047.703.141.218.094.379.219.484.375.113.148.191.324.234.531.032.137.047.371.047.703V0h-.734v-2.61c0-.288-.031-.507-.094-.656a.667.667 0 0 0-.297-.343.866.866 0 0 0-.5-.141c-.304 0-.57.102-.797.297-.23.187-.343.558-.343 1.11V0zm0 0"/></symbol><symbol overflow="visible" id="k"><path d="M3.328 0v-.547c-.273.43-.672.64-1.203.64-.344 0-.664-.093-.953-.28A1.85 1.85 0 0 1 .516-.97 2.802 2.802 0 0 1 .28-2.14c0-.425.067-.812.203-1.156.145-.351.36-.625.641-.812.29-.188.613-.282.969-.282.258 0 .488.059.687.172.207.106.375.246.5.422v-2.125H4V0zM1.031-2.14c0 .554.114.964.344 1.234.227.273.504.406.828.406.313 0 .578-.129.797-.39.227-.258.344-.657.344-1.188 0-.582-.117-1.008-.344-1.281-.23-.282-.512-.422-.844-.422-.324 0-.594.136-.812.406-.211.262-.313.672-.313 1.234zm0 0"/></symbol><symbol overflow="visible" id="l"><path d="M3.344-1.563l.719.079c-.086.5-.29.89-.61 1.171-.324.274-.719.407-1.187.407C1.68.094 1.21-.094.859-.47.504-.852.33-1.406.33-2.125c0-.469.07-.875.218-1.219.156-.344.39-.601.703-.781a2.069 2.069 0 0 1 1.031-.266c.457 0 .832.121 1.125.36.301.242.492.574.578 1l-.703.11c-.062-.282-.183-.493-.36-.642a.924.924 0 0 0-.624-.218c-.367 0-.664.133-.89.39-.231.262-.345.68-.345 1.25 0 .575.11.993.329 1.25.226.262.52.391.875.391a.973.973 0 0 0 .703-.266c.195-.175.32-.441.375-.796zm0 0"/></symbol><symbol overflow="visible" id="m"><path d="M3.078 0H2.36v-4.625c-.18.168-.414.336-.703.5a4.767 4.767 0 0 1-.75.375v-.703c.406-.195.758-.43 1.063-.703.3-.27.515-.532.64-.782h.47zm0 0"/></symbol><symbol overflow="visible" id="n"><path d="M4.156-.703V0H.25a1.132 1.132 0 0 1 .078-.5 2.58 2.58 0 0 1 .484-.781 7.6 7.6 0 0 1 .954-.907c.644-.53 1.078-.945 1.296-1.25.227-.312.344-.601.344-.874a.983.983 0 0 0-.312-.735 1.13 1.13 0 0 0-.797-.297c-.356 0-.637.11-.844.328-.21.211-.312.496-.312.86l-.75-.078c.05-.551.242-.973.578-1.266.332-.29.781-.438 1.344-.438.562 0 1.007.157 1.343.47.332.312.5.702.5 1.171 0 .242-.054.477-.156.703-.094.23-.258.469-.484.719-.22.25-.59.594-1.11 1.031-.437.375-.719.633-.844.766-.125.125-.226.25-.296.375zm0 0"/></symbol><symbol overflow="visible" id="o"><path d="M.547 0v-5.922h.734v3.375L3-4.28h.938L2.296-2.703 4.094 0h-.89L1.78-2.188l-.5.485V0zm0 0"/></symbol><symbol overflow="visible" id="p"><path d="M3.36 0v-.625c-.337.48-.79.719-1.36.719-.262 0-.5-.047-.719-.14-.218-.095-.383-.212-.484-.36a1.425 1.425 0 0 1-.219-.547 3.471 3.471 0 0 1-.047-.672v-2.656h.719v2.375c0 .375.016.633.047.765.05.188.148.34.297.454a.906.906 0 0 0 .547.156c.218 0 .421-.051.609-.156a.909.909 0 0 0 .406-.454c.082-.195.125-.476.125-.843v-2.297H4V0zm0 0"/></symbol><symbol overflow="visible" id="q"><path d="M.75-3.453v-.828h.828v.828zM.75 0v-.828h.828V0zm0 0"/></symbol><symbol overflow="visible" id="r"><path d="M1.328 0L.031-4.281h.75l.672 2.468.266.922c.008-.039.082-.336.218-.89l.672-2.5h.75L4-1.797l.219.813.25-.829.734-2.468h.703L4.563 0h-.75l-.688-2.563-.156-.734L2.094 0zm0 0"/></symbol><symbol overflow="visible" id="s"><path d="M.547 1.64V-4.28h.656v.547c.156-.22.332-.38.531-.485.196-.113.438-.172.72-.172.362 0 .687.102.968.297.281.188.488.453.625.797.144.344.219.719.219 1.125 0 .438-.079.836-.235 1.188-.156.343-.386.609-.687.796a1.79 1.79 0 0 1-.953.282c-.243 0-.461-.047-.657-.14a1.528 1.528 0 0 1-.468-.392v2.079zm.656-3.765c0 .555.11.965.328 1.234.227.262.5.391.813.391.32 0 .597-.133.828-.406.226-.27.344-.692.344-1.266 0-.55-.118-.96-.344-1.234-.219-.27-.485-.406-.797-.406-.305 0-.574.148-.813.437-.242.281-.359.7-.359 1.25zm0 0"/></symbol></defs><path d="M0 0h468v194.64H0zm0 0" fill="#fff"/><path d="M209.52 1.441h48.601v20.52H209.52zm0 0" fill="#ffff97"/><use xlink:href="#a" x="293.28" y="313.56" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#b" x="300.164" y="313.56" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#c" x="304.627" y="313.56" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#d" x="308.842" y="313.56" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#e" x="311.138" y="313.56" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#f" x="315.683" y="313.56" width="100%" height="100%" transform="translate(-72 -298.68)"/><path d="M209.52 1.082h48.96V22.32h-49.32V1.082zm0 .598V1.44h.359v20.52h-.36v-.36h48.602v.36h-.36V1.44h.36v.239zm0 0"/><path d="M209.52 35.64h48.601v20.52H209.52zm0 0" fill="#ffff97"/><use xlink:href="#g" x="292.56" y="347.88" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#b" x="297.105" y="347.88" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#c" x="301.651" y="347.88" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#d" x="305.866" y="347.88" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#h" x="308.162" y="347.88" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#i" x="309.998" y="347.88" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#j" x="314.543" y="347.88" width="100%" height="100%" transform="translate(-72 -298.68)"/><path d="M209.52 35.281h48.96V56.52h-49.32V35.28zm0 .719v-.36h.359v20.52h-.36v-.238h48.602v.238h-.36V35.64h.36V36zm0 0"/><path d="M84.602 69.96h48.718v20.52H84.602zm0 0" fill="#ffff97"/><use xlink:href="#k" x="174.36" y="382.08" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#l" x="178.905" y="382.08" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#m" x="183.12" y="382.08" width="100%" height="100%" transform="translate(-72 -298.68)"/><path d="M84.602 69.602h48.957V90.84h-49.32V69.602zm0 .597v-.238h.359v20.52h-.36v-.36h48.72v.36h-.36V69.96h.36v.238zm0 0"/><path d="M334.441 69.96h48.598v20.52h-48.598zm0 0" fill="#ffff97"/><use xlink:href="#k" x="424.08" y="382.08" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#l" x="428.625" y="382.08" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#n" x="432.84" y="382.08" width="100%" height="100%" transform="translate(-72 -298.68)"/><path d="M334.441 69.602h48.957V90.84h-49.32V69.602zm0 .597v-.238h.239v20.52h-.239v-.36h48.598v.36h-.36V69.96h.36v.238zm0 0"/><path d="M29.16 104.16h48.602v20.52H29.16zm0 0" fill="#ffff97"/><use xlink:href="#f" x="113.16" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#b" x="115.912" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#l" x="120.457" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#o" x="124.672" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#m" x="128.887" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#m" x="133.432" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><path d="M29.16 103.8h48.961v21.24h-49.32V103.8zm0 .72v-.36h.36v20.52h-.36v-.239h48.602v.239h-.364v-20.52h.364v.36zm0 0"/><path d="M140.16 104.16h48.602v20.52H140.16zm0 0" fill="#ffff97"/><use xlink:href="#f" x="224.16" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#b" x="226.912" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#l" x="231.457" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#o" x="235.672" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#m" x="239.887" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#n" x="244.432" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><path d="M140.16 103.8h48.961v21.24h-49.32V103.8zm0 .72v-.36h.36v20.52h-.36v-.239h48.602v.239h-.364v-20.52h.364v.36zm0 0"/><path d="M56.879 138.48h48.601V159H56.88zm0 0" fill="#ffff97"/><use xlink:href="#j" x="137.16" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#i" x="141.705" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#k" x="146.251" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#e" x="150.847" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#m" x="155.392" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#m" x="159.938" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#b" x="164.483" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><path d="M56.879 138.121h48.96v21.238H56.52v-21.238zm0 .598v-.239h.36V159h-.36v-.36h48.601v.36h-.242v-20.52h.242v.239zm0 0"/><path d="M1.32 138.48h48.72V159H1.32zm0 0" fill="#ffff97"/><use xlink:href="#j" x="81.72" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#i" x="86.265" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#k" x="90.811" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#e" x="95.407" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#m" x="99.952" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#m" x="104.498" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#g" x="109.043" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><path d="M1.32 138.121h49.078v21.238H1.078v-21.238zm0 .598v-.239h.36V159h-.36v-.36h48.72v.36h-.36v-20.52h.36v.239zm0 0"/><path d="M112.32 138.48h48.72V159h-48.72zm0 0" fill="#ffff97"/><use xlink:href="#j" x="192.72" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#i" x="197.265" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#k" x="201.811" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#e" x="206.407" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#m" x="210.952" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#n" x="215.498" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#b" x="220.043" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><path d="M112.32 138.121h49.078v21.238h-49.32v-21.238zm0 .598v-.239h.36V159h-.36v-.36h48.72v.36h-.36v-20.52h.36v.239zm0 0"/><path d="M167.879 138.48h48.601V159H167.88zm0 0" fill="#ffff97"/><use xlink:href="#j" x="248.16" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#i" x="252.705" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#k" x="257.251" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#e" x="261.847" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#m" x="266.392" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#n" x="270.938" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#g" x="275.483" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><path d="M167.879 138.121h48.96v21.238h-49.32v-21.238zm0 .598v-.239h.36V159h-.36v-.36h48.601v.36h-.242v-20.52h.242v.239zm0 0"/><path d="M362.16 138.48h48.602V159H362.16zm0 0" fill="#ffff97"/><use xlink:href="#j" x="442.44" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#i" x="446.985" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#k" x="451.531" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#e" x="456.127" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#n" x="460.672" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#m" x="465.218" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#b" x="469.763" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><path d="M362.16 138.121h48.961v21.238h-49.32v-21.238zm0 .598v-.239h.36V159h-.36v-.36h48.602v.36h-.364v-20.52h.364v.239zm0 0"/><path d="M417.602 138.48h48.718V159h-48.718zm0 0" fill="#ffff97"/><use xlink:href="#j" x="498" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#i" x="502.545" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#k" x="507.091" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#e" x="511.687" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#n" x="516.232" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#m" x="520.778" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#g" x="525.323" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><path d="M417.602 138.121h49.078v21.238h-49.442v-21.238zm0 .598v-.239h.359V159h-.36v-.36h48.72v.36h-.36v-20.52h.36v.239zm0 0"/><path d="M306.602 138.48h48.718V159h-48.718zm0 0" fill="#ffff97"/><use xlink:href="#j" x="387" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#i" x="391.545" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#k" x="396.091" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#e" x="400.687" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#n" x="405.232" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#n" x="409.778" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#b" x="414.323" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><path d="M306.602 138.121h49.078v21.238h-49.442v-21.238zm0 .598v-.239h.359V159h-.36v-.36h48.72v.36h-.36v-20.52h.36v.239zm0 0"/><path d="M251.16 138.48h48.602V159H251.16zm0 0" fill="#ffff97"/><use xlink:href="#j" x="331.44" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#i" x="335.985" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#k" x="340.531" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#e" x="345.127" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#n" x="349.672" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#n" x="354.218" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#g" x="358.763" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><path d="M251.16 138.121h48.961v21.238h-49.32v-21.238zm0 .598v-.239h.36V159h-.36v-.36h48.602v.36h-.364v-20.52h.364v.239zm0 0"/><path d="M389.879 104.16h48.601v20.52H389.88zm0 0" fill="#ffff97"/><use xlink:href="#f" x="473.88" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#b" x="476.632" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#l" x="481.177" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#o" x="485.392" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#n" x="489.607" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#m" x="494.152" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><path d="M389.879 103.8h48.96v21.24h-49.32V103.8zm0 .72v-.36h.36v20.52h-.36v-.239h48.601v.239h-.242v-20.52h.242v.36zm0 0"/><path d="M278.879 104.16h48.601v20.52H278.88zm0 0" fill="#ffff97"/><use xlink:href="#f" x="362.88" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#b" x="365.632" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#l" x="370.177" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#o" x="374.392" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#n" x="378.607" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#n" x="383.152" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><path d="M278.879 103.8h48.96v21.24h-49.32V103.8zm0 .72v-.36h.36v20.52h-.36v-.239h48.601v.239h-.242v-20.52h.242v.36zm0 0"/><path d="M140.16 172.68h104.16v20.52H140.16zm0 0" fill="#ffff97"/><use xlink:href="#c" x="222.6" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#p" x="226.815" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#k" x="231.36" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#i" x="235.906" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#q" x="240.451" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#j" x="242.747" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#i" x="247.292" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#k" x="251.838" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#e" x="256.434" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#m" x="260.979" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#n" x="265.525" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#g" x="270.07" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#q" x="274.666" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#r" x="276.898" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#e" x="282.866" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#g" x="287.329" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#b" x="291.925" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#s" x="296.47" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#s" x="301.016" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><path d="M140.16 172.32h104.52v21.239H139.8V172.32zm0 .72v-.36h.36v20.52h-.36v-.24h104.16v.24h-.36v-20.52h.36v.36zm0 0"/><path d="M278.879 172.68h104.16v20.52H278.88zm0 0" fill="#ffff97"/><use xlink:href="#c" x="361.32" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#p" x="365.535" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#k" x="370.08" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#i" x="374.626" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#q" x="379.171" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#j" x="381.467" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#i" x="386.012" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#k" x="390.558" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#e" x="395.154" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#n" x="399.699" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#n" x="404.245" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#b" x="408.79" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#q" x="413.386" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#r" x="415.618" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#e" x="421.586" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#g" x="426.049" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#b" x="430.645" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#s" x="435.19" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#s" x="439.736" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><path d="M278.879 172.32h104.52v21.239h-104.88V172.32zm0 .72v-.36h.36v20.52h-.36v-.24h104.16v.24h-.36v-20.52h.36v.36zm0 0M234.121 21.96v8.161h-.601v-8.16zm0 0"/><path d="M233.879 35.64l3.36-8.16-3.36 2.04-3.48-2.04zm0 0M209.64 52.922l-71.038 19.437-.122-.597 70.918-19.442zm0 0"/><path d="M133.32 73.559l8.758 1.082-2.879-2.762 1.082-3.84zm0 0M258.238 52.32l70.922 19.442-.12.597-70.919-19.437zm0 0"/><path d="M334.441 73.559l-7.082-5.52 1.082 3.84-2.882 2.762zm0 0M92.52 90.719L75 101.64l-.36-.602 17.52-10.918zm0 0"/><path d="M70.078 104.16l8.762-1.441-3.48-1.797-.122-3.961zm0 0M125.762 90.121l17.52 10.918-.36.602-17.524-10.922zm0 0"/><path d="M147.84 104.16l-5.281-7.2v3.962l-3.598 1.797zm0 0M62.04 124.559l7.679 9.363-.598.476-7.562-9.476zm0 0"/><path d="M72.84 138.48l-2.52-8.64-1.32 3.84-3.96.48zm0 0M45.36 124.922l-7.68 9.476-.48-.476 7.679-9.363zm0 0"/><path d="M34.078 138.48l7.8-4.32-3.956-.48-1.442-3.84zm0 0M156.36 124.922l-7.56 9.476-.6-.476 7.679-9.363zm0 0"/><path d="M145.078 138.48l7.8-4.32-3.956-.48-1.442-3.84zm0 0M173.04 124.559l7.679 9.363-.598.476-7.562-9.476zm0 0"/><path d="M183.84 138.48l-2.52-8.64-1.32 3.84-3.96.48zm0 0M375.48 90.121l17.641 10.918-.36.602-17.64-10.922zm0 0"/><path d="M397.559 104.16l-5.16-7.2-.118 3.962-3.48 1.797zm0 0M406.2 124.922l-7.68 9.476-.598-.476 7.68-9.363zm0 0"/><path d="M394.8 138.48l7.802-4.32-3.961-.48-1.32-3.84zm0 0M422.762 124.559l7.68 9.363-.481.476-7.68-9.476zm0 0"/><path d="M433.68 138.48l-2.52-8.64-1.441 3.84-3.957.48zm0 0M342.238 90.719l-17.52 10.922-.359-.602 17.52-10.918zm0 0"/><path d="M319.8 104.16l8.88-1.441-3.602-1.797V96.96zm0 0M295.2 124.922l-7.68 9.476-.598-.476 7.68-9.363zm0 0"/><path d="M283.8 138.48l7.802-4.32-3.961-.48-1.32-3.84zm0 0M311.762 124.559l7.68 9.363-.481.476-7.68-9.476zm0 0"/><path d="M322.68 138.48l-2.52-8.64-1.441 3.84-3.957.48zm0 0M192.602 159v8.16h-.723V159zm0 0"/><path d="M192.238 172.68l3.364-8.16-3.364 2.039-3.476-2.04zm0 0M331.32 159v8.16h-.718V159zm0 0"/><path d="M330.96 172.68l3.481-8.16-3.48 2.039-3.48-2.04zm0 0"/></svg>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mitogen-0.3.9/docs/images/detached-subtree.graphml��������������������������������������������������0000664�0000000�0000000�00000074613�14656664731�0022203�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" standalone="no"?> <graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd"> <!--Created by yEd 3.14.4--> <key attr.name="Description" attr.type="string" for="graph" id="d0"/> <key for="port" id="d1" yfiles.type="portgraphics"/> <key for="port" id="d2" yfiles.type="portgeometry"/> <key for="port" id="d3" yfiles.type="portuserdata"/> <key attr.name="url" attr.type="string" for="node" id="d4"/> <key attr.name="description" attr.type="string" for="node" id="d5"/> <key for="node" id="d6" yfiles.type="nodegraphics"/> <key for="graphml" id="d7" yfiles.type="resources"/> <key attr.name="url" attr.type="string" for="edge" id="d8"/> <key attr.name="description" attr.type="string" for="edge" id="d9"/> <key for="edge" id="d10" yfiles.type="edgegraphics"/> <graph edgedefault="directed" id="G"> <data key="d0"/> <node id="n0"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="303.75" y="0.0"/> <y:Fill color="#C0C0C0" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="44.03125" x="13.484375" y="5.93359375">master<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="303.75" y="50.0"/> <y:Fill color="#C0C0C0" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="47.072265625" x="11.9638671875" y="5.93359375">bastion<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2" yfiles.foldertype="group"> <data key="d4"/> <data key="d5"/> <data key="d6"> <y:ProxyAutoBoundsNode> <y:Realizers active="0"> <y:GroupNode> <y:Geometry height="231.666015625" width="384.5" x="-56.65467625899282" y="110.0"/> <y:Fill color="#F5F5F5" transparent="false"/> <y:BorderStyle color="#000000" type="dashed" width="1.0"/> <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="384.5" x="0.0" y="0.0">Subtree 1</y:NodeLabel> <y:Shape type="roundrectangle"/> <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/> <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/> </y:GroupNode> <y:GroupNode> <y:Geometry height="50.0" width="50.0" x="-15.0" y="63.333984375"/> <y:Fill color="#F5F5F5" transparent="false"/> <y:BorderStyle color="#000000" type="dashed" width="1.0"/> <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="63.75830078125" x="-6.879150390625" y="0.0">Folder 1</y:NodeLabel> <y:Shape type="roundrectangle"/> <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/> <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/> </y:GroupNode> </y:Realizers> </y:ProxyAutoBoundsNode> </data> <graph edgedefault="directed" id="n2:"> <node id="n2::n0"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="79.84532374100718" y="146.666015625"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="25.287109375" x="22.8564453125" y="5.93359375">dc1<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2::n1"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="-1.1546762589928221" y="196.666015625"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="43.873046875" x="13.5634765625" y="5.93359375">rack11<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2::n2"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="160.84532374100718" y="196.666015625"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="43.873046875" x="13.5634765625" y="5.93359375">rack12<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2::n3"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="39.34532374100718" y="246.666015625"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="54.859375" x="8.0703125" y="5.93359375">node11a<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2::n4"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="-41.65467625899282" y="246.666015625"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="55.78515625" x="7.607421875" y="5.93359375">node11b<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2::n5"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="120.34532374100718" y="246.666015625"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="54.859375" x="8.0703125" y="5.93359375">node12a<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2::n6"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="201.34532374100718" y="246.666015625"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="55.78515625" x="7.607421875" y="5.93359375">node12b<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2::n7"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="152.0" x="160.84532374100718" y="296.666015625"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="137.083984375" x="7.4580078125" y="5.93359375">sudo:node12b:webapp<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> </graph> </node> <node id="n3" yfiles.foldertype="group"> <data key="d4"/> <data key="d5"/> <data key="d6"> <y:ProxyAutoBoundsNode> <y:Realizers active="0"> <y:GroupNode> <y:Geometry height="231.666015625" width="344.0" x="342.8453237410072" y="110.0"/> <y:Fill color="#F5F5F5" transparent="false"/> <y:BorderStyle color="#000000" type="dashed" width="1.0"/> <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="344.0" x="0.0" y="0.0">Subtree 2</y:NodeLabel> <y:Shape type="roundrectangle"/> <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/> <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/> </y:GroupNode> <y:GroupNode> <y:Geometry height="50.0" width="50.0" x="0.0" y="60.0"/> <y:Fill color="#F5F5F5" transparent="false"/> <y:BorderStyle color="#000000" type="dashed" width="1.0"/> <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="63.75830078125" x="-6.879150390625" y="0.0">Folder 2</y:NodeLabel> <y:Shape type="roundrectangle"/> <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/> <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/> </y:GroupNode> </y:Realizers> </y:ProxyAutoBoundsNode> </data> <graph edgedefault="directed" id="n3:"> <node id="n3::n0"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="479.3453237410072" y="146.666015625"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="25.287109375" x="22.8564453125" y="5.93359375">dc2<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3::n1"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="519.8453237410072" y="246.666015625"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="54.859375" x="8.0703125" y="5.93359375">node21a<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3::n2"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="600.8453237410072" y="246.666015625"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="55.78515625" x="7.607421875" y="5.93359375">node21b<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3::n3"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="438.8453237410072" y="246.666015625"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="54.859375" x="8.0703125" y="5.93359375">node22a<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3::n4"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="357.8453237410072" y="246.666015625"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="55.78515625" x="7.607421875" y="5.93359375">node22b<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3::n5"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="560.3453237410072" y="196.666015625"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="43.873046875" x="13.5634765625" y="5.93359375">rack21<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3::n6"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="398.3453237410072" y="196.666015625"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="43.873046875" x="13.5634765625" y="5.93359375">rack22<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3::n7"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="152.0" x="398.3453237410072" y="296.666015625"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="136.158203125" x="7.9208984375" y="5.93359375">sudo:node22a:webapp<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> </graph> </node> <edge id="e0" source="n0" target="n1"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="n3::e0" source="n3::n6" target="n3::n4"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="n3::e1" source="n3::n6" target="n3::n3"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="n3::e2" source="n3::n0" target="n3::n5"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="n3::e3" source="n3::n5" target="n3::n1"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="n3::e4" source="n3::n5" target="n3::n2"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="n3::e5" source="n3::n0" target="n3::n6"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="n3::e6" source="n3::n3" target="n3::n7"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="n2::e0" source="n2::n0" target="n2::n1"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="n2::e1" source="n2::n0" target="n2::n2"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="n2::e2" source="n2::n1" target="n2::n4"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="n2::e3" source="n2::n1" target="n2::n3"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="n2::e4" source="n2::n2" target="n2::n6"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="n2::e5" source="n2::n2" target="n2::n5"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="n2::e6" source="n2::n6" target="n2::n7"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> </graph> <data key="d7"> <y:Resources/> </data> </graphml> ���������������������������������������������������������������������������������������������������������������������mitogen-0.3.9/docs/images/detached-subtree.svg������������������������������������������������������0000664�0000000�0000000�00000123611�14656664731�0021341�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="624" height="288.635" viewBox="0 0 468 216.477"><defs><symbol overflow="visible" id="a"><path d="M.5 0v-3.906h.594v.547c.125-.196.285-.352.484-.47C1.785-3.94 2.02-4 2.281-4c.29 0 .524.063.703.188.188.117.32.28.407.5C3.69-3.77 4.094-4 4.594-4c.383 0 .68.11.89.328.207.211.313.54.313.985V0H5.14v-2.469c0-.258-.024-.445-.063-.562a.493.493 0 0 0-.234-.281.77.77 0 0 0-.407-.11c-.273 0-.5.094-.687.281-.18.18-.266.465-.266.86V0h-.656v-2.547c0-.289-.058-.508-.172-.656-.105-.145-.281-.219-.531-.219a.93.93 0 0 0-.516.156.808.808 0 0 0-.343.422c-.075.188-.11.461-.11.813V0zm0 0"/></symbol><symbol overflow="visible" id="b"><path d="M3.047-.484c-.242.21-.477.359-.703.453a2.18 2.18 0 0 1-.735.125c-.43 0-.761-.102-1-.313a1.072 1.072 0 0 1-.343-.812c0-.188.039-.36.125-.516a1.16 1.16 0 0 1 .343-.39c.145-.094.305-.165.485-.22.133-.03.332-.062.593-.093.532-.063.926-.14 1.188-.234v-.172c0-.27-.063-.461-.188-.578-.167-.145-.417-.22-.75-.22-.312 0-.546.06-.703.173-.148.105-.257.297-.328.578l-.64-.094c.05-.281.144-.504.28-.672.134-.164.329-.297.579-.39A2.66 2.66 0 0 1 2.156-4c.332 0 .602.043.813.125.207.074.36.172.453.297.101.117.176.262.219.437.02.118.03.32.03.61v.89c0 .618.009 1.008.032 1.172.031.168.086.324.172.469h-.688a1.26 1.26 0 0 1-.14-.484zM3-1.97c-.242.106-.605.188-1.094.25-.273.043-.465.09-.578.14a.648.648 0 0 0-.25.22.554.554 0 0 0-.094.312c0 .18.063.324.188.438.133.117.332.171.594.171.257 0 .488-.05.687-.156.195-.113.344-.27.438-.469.07-.144.109-.363.109-.656zm0 0"/></symbol><symbol overflow="visible" id="c"><path d="M.234-1.172l.657-.094c.03.262.129.465.296.61.176.136.415.203.72.203.3 0 .523-.063.671-.188a.564.564 0 0 0 .219-.437.433.433 0 0 0-.188-.36c-.093-.05-.324-.125-.687-.218-.48-.125-.813-.227-1-.313a1.089 1.089 0 0 1-.438-.375 1.06 1.06 0 0 1-.14-.531c0-.176.035-.336.11-.484a1.25 1.25 0 0 1 .327-.375c.102-.07.242-.133.422-.188.188-.05.379-.078.578-.078.313 0 .582.047.813.14.226.087.394.204.5.36.113.148.191.344.234.594l-.64.094a.678.678 0 0 0-.266-.47c-.137-.113-.336-.171-.594-.171-.305 0-.523.055-.656.156a.421.421 0 0 0-.188.344c0 .086.024.164.079.234a.47.47 0 0 0 .25.172c.07.031.269.09.593.172.469.125.797.23.985.313a.917.917 0 0 1 .437.343c.102.157.156.344.156.563 0 .23-.07.445-.203.64-.125.188-.312.34-.562.454a2.078 2.078 0 0 1-.813.156c-.511 0-.902-.102-1.172-.313-.261-.218-.43-.535-.5-.953zm0 0"/></symbol><symbol overflow="visible" id="d"><path d="M1.953-.594L2.047 0a3.092 3.092 0 0 1-.5.047c-.25 0-.445-.04-.578-.11a.593.593 0 0 1-.266-.296C.648-.484.625-.742.625-1.141v-2.25h-.5v-.515h.5v-.969l.656-.406v1.375h.672v.515h-.672v2.282c0 .187.008.312.032.375.019.054.054.093.109.125.05.03.129.046.234.046.07 0 .172-.007.297-.03zm0 0"/></symbol><symbol overflow="visible" id="e"><path d="M3.172-1.266l.687.094c-.105.399-.304.711-.593.938-.293.218-.668.328-1.125.328-.575 0-1.028-.176-1.36-.531-.336-.352-.5-.848-.5-1.485 0-.656.164-1.164.5-1.531C1.125-3.816 1.566-4 2.11-4c.52 0 .946.18 1.282.531.332.356.5.856.5 1.5 0 .043-.008.106-.016.188H.969c.02.43.14.758.36.984.218.23.487.344.812.344.25 0 .457-.063.625-.188.175-.132.312-.343.406-.625zM1-2.328h2.188c-.032-.332-.118-.582-.25-.75a1.055 1.055 0 0 0-.829-.375 1.04 1.04 0 0 0-.765.312c-.211.2-.324.47-.344.813zm0 0"/></symbol><symbol overflow="visible" id="f"><path d="M.484 0v-3.906h.61v.594c.144-.282.281-.461.406-.547A.748.748 0 0 1 1.938-4c.218 0 .44.074.671.219l-.218.61a.99.99 0 0 0-.485-.142.648.648 0 0 0-.39.126.692.692 0 0 0-.25.359c-.075.242-.11.5-.11.781V0zm0 0"/></symbol><symbol overflow="visible" id="g"><path d="M1.11 0H.5v-5.406h.656v1.937C1.438-3.82 1.796-4 2.234-4c.239 0 .461.055.672.156.219.094.395.23.531.406.145.168.254.376.329.626.082.25.125.515.125.796 0 .668-.168 1.188-.5 1.563-.336.367-.73.547-1.188.547-.469 0-.836-.192-1.094-.578zm0-1.984c0 .468.062.808.187 1.015.207.344.488.516.844.516.289 0 .539-.125.75-.375.207-.258.312-.633.312-1.125 0-.52-.101-.899-.297-1.14a.926.926 0 0 0-.734-.36c-.293 0-.543.125-.75.375-.211.25-.313.617-.313 1.094zm0 0"/></symbol><symbol overflow="visible" id="h"><path d="M.5-4.64v-.766h.672v.765zM.5 0v-3.906h.672V0zm0 0"/></symbol><symbol overflow="visible" id="i"><path d="M.25-1.953c0-.727.203-1.266.61-1.61C1.19-3.852 1.597-4 2.077-4c.54 0 .985.18 1.328.531.344.356.516.84.516 1.453 0 .512-.078.914-.235 1.204a1.645 1.645 0 0 1-.656.671 1.99 1.99 0 0 1-.953.235c-.543 0-.984-.176-1.328-.531-.336-.352-.5-.86-.5-1.516zm.688 0c0 .5.109.875.328 1.125.218.25.488.375.812.375.332 0 .61-.125.828-.375.219-.25.328-.633.328-1.156 0-.477-.109-.844-.328-1.094a1.055 1.055 0 0 0-.828-.375c-.324 0-.594.125-.812.375-.22.25-.329.625-.329 1.125zm0 0"/></symbol><symbol overflow="visible" id="j"><path d="M.5 0v-3.906h.594v.547C1.383-3.785 1.8-4 2.344-4c.226 0 .441.043.64.125.196.086.344.2.438.344.101.136.176.297.219.484.02.125.03.34.03.64V0h-.655v-2.375c0-.27-.028-.473-.079-.61a.624.624 0 0 0-.28-.312.811.811 0 0 0-.454-.125c-.281 0-.527.09-.734.266-.211.18-.313.515-.313 1.015V0zm0 0"/></symbol><symbol overflow="visible" id="s"><path d="M3.031 0v-.5c-.242.398-.605.594-1.094.594-.312 0-.601-.086-.859-.25a1.743 1.743 0 0 1-.61-.735 2.617 2.617 0 0 1-.202-1.062c0-.383.062-.738.187-1.063.133-.32.332-.566.594-.734.258-.164.547-.25.86-.25.238 0 .445.055.624.156.188.094.344.219.469.375v-1.937h.656V0zM.937-1.953c0 .5.102.875.313 1.125.219.25.469.375.75.375.29 0 .535-.117.734-.36.207-.238.313-.597.313-1.078 0-.539-.106-.937-.313-1.187-.21-.25-.464-.375-.765-.375a.915.915 0 0 0-.735.36c-.199.241-.296.62-.296 1.14zm0 0"/></symbol><symbol overflow="visible" id="t"><path d="M3.047-1.438l.656.094c-.074.45-.258.805-.547 1.063-.293.25-.652.375-1.078.375-.543 0-.976-.176-1.297-.531C.457-.79.297-1.29.297-1.938c0-.426.066-.797.203-1.11.145-.32.36-.562.64-.719A1.94 1.94 0 0 1 2.079-4c.426 0 .774.11 1.047.328.27.211.441.512.516.906L3-2.672c-.063-.258-.172-.453-.328-.578a.843.843 0 0 0-.563-.203c-.336 0-.609.121-.828.36-.21.241-.312.62-.312 1.14 0 .523.097.902.297 1.14.207.243.472.36.796.36a.965.965 0 0 0 .657-.234c.176-.165.285-.415.328-.75zm0 0"/></symbol><symbol overflow="visible" id="u"><path d="M2.813 0H2.14v-4.234a3.33 3.33 0 0 1-.625.468 6.587 6.587 0 0 1-.688.344v-.64c.363-.176.688-.391.969-.641s.476-.488.594-.719h.421zm0 0"/></symbol><symbol overflow="visible" id="v"><path d="M.5 0v-5.406h.672v3.078l1.562-1.578h.86l-1.5 1.437L3.75 0h-.828L1.625-2l-.453.453V0zm0 0"/></symbol><symbol overflow="visible" id="w"><path d="M3.797-.64V0H.234a.96.96 0 0 1 .078-.453c.083-.25.223-.488.422-.719.207-.238.5-.516.875-.828.582-.477.977-.86 1.188-1.14.207-.282.312-.547.312-.797a.875.875 0 0 0-.28-.657c-.188-.187-.434-.281-.735-.281-.324 0-.578.102-.766.297-.187.187-.289.45-.297.781L.36-3.859c.04-.508.211-.895.516-1.157.313-.27.723-.406 1.234-.406.52 0 .93.149 1.235.438.3.28.453.636.453 1.062 0 .219-.047.434-.14.64-.087.212-.231.43-.438.657-.211.23-.547.547-1.016.953-.406.336-.668.563-.781.688-.106.117-.195.23-.266.343zm0 0"/></symbol><symbol overflow="visible" id="x"><path d="M3.063 0v-.578c-.305.45-.715.672-1.235.672a1.68 1.68 0 0 1-.656-.125 1.169 1.169 0 0 1-.453-.344 1.293 1.293 0 0 1-.203-.5 3.815 3.815 0 0 1-.032-.61v-2.421h.657v2.156c0 .355.015.59.046.703.04.18.13.32.266.422.133.094.3.14.5.14a1.2 1.2 0 0 0 .563-.14.855.855 0 0 0 .375-.422c.07-.176.109-.43.109-.766v-2.093h.656V0zm0 0"/></symbol><symbol overflow="visible" id="y"><path d="M.688-3.156v-.75h.75v.75zM.688 0v-.75h.75V0zm0 0"/></symbol><symbol overflow="visible" id="z"><path d="M1.219 0L.016-3.906h.687l.86 3.094c.007-.04.078-.313.203-.813l.625-2.281h.671l.594 2.265.188.75.234-.765.672-2.25h.64L4.173 0h-.688L2.86-2.344l-.156-.672L1.906 0zm0 0"/></symbol><symbol overflow="visible" id="A"><path d="M.5 1.5v-5.406h.61v.5c.132-.196.288-.344.468-.438.188-.101.406-.156.656-.156.332 0 .625.09.875.266.258.168.454.406.579.718.132.313.203.657.203 1.032 0 .398-.075.757-.22 1.078a1.58 1.58 0 0 1-.624.75c-.274.164-.559.25-.86.25-.218 0-.417-.047-.593-.14a1.281 1.281 0 0 1-.438-.36V1.5zm.594-3.438c0 .512.097.887.297 1.125a.95.95 0 0 0 .75.36c.3 0 .554-.125.765-.375.207-.25.313-.633.313-1.156 0-.5-.106-.875-.313-1.125-.199-.25-.445-.375-.734-.375-.281 0-.531.136-.75.406-.219.262-.328.64-.328 1.14zm0 0"/></symbol><symbol overflow="visible" id="k"><path d="M.422-2.156l.828-.063c.04.336.133.61.281.828.145.211.367.383.672.516.3.125.645.188 1.031.188.332 0 .63-.047.891-.141.258-.102.453-.238.578-.406a.973.973 0 0 0 .188-.579.852.852 0 0 0-.188-.546c-.117-.157-.312-.29-.594-.407-.18-.062-.574-.164-1.187-.312-.617-.156-1.047-.297-1.297-.422-.324-.164-.563-.375-.719-.625a1.525 1.525 0 0 1-.234-.828c0-.344.094-.66.281-.953.195-.29.477-.508.844-.657a3.174 3.174 0 0 1 1.234-.234c.489 0 .922.078 1.297.234.383.157.676.391.875.704.207.312.32.668.344 1.062l-.86.063c-.042-.426-.195-.743-.453-.954-.261-.218-.652-.328-1.171-.328-.532 0-.922.102-1.172.297-.243.188-.36.422-.36.703a.77.77 0 0 0 .25.594c.176.156.625.32 1.344.484.719.157 1.21.297 1.484.422.383.18.672.407.86.688.187.273.281.586.281.937 0 .356-.105.696-.313 1.016-.21.313-.507.559-.89.734-.375.164-.805.25-1.281.25-.606 0-1.11-.09-1.516-.265a2.182 2.182 0 0 1-.969-.797 2.223 2.223 0 0 1-.36-1.203zm0 0"/></symbol><symbol overflow="visible" id="l"><path d="M3.797 0v-.719C3.41-.164 2.895.11 2.25.11a2.1 2.1 0 0 1-.797-.156C1.203-.16 1.016-.3.891-.469a1.6 1.6 0 0 1-.25-.61c-.032-.155-.047-.41-.047-.765v-3h.828v2.688c0 .43.016.715.047.86.05.218.16.39.328.515.164.125.375.187.625.187.238 0 .469-.062.687-.187.22-.125.368-.297.454-.516.093-.219.14-.535.14-.953v-2.594h.828V0zm0 0"/></symbol><symbol overflow="visible" id="m"><path d="M1.375 0H.609v-6.688h.829v2.391c.343-.437.785-.656 1.328-.656.289 0 .566.062.828.187.27.118.488.282.656.5.176.22.313.485.406.797.102.305.157.625.157.969 0 .836-.211 1.48-.625 1.938-.407.449-.899.671-1.47.671-.573 0-1.023-.238-1.343-.718zm-.016-2.453c0 .574.079.992.235 1.25.258.43.613.64 1.062.64.352 0 .66-.156.922-.468.258-.313.39-.774.39-1.39 0-.634-.124-1.102-.374-1.407-.25-.3-.555-.453-.906-.453-.356 0-.668.156-.938.468-.262.313-.39.766-.39 1.36zm0 0"/></symbol><symbol overflow="visible" id="n"><path d="M2.406-.734l.125.718c-.23.051-.437.079-.625.079-.304 0-.539-.047-.703-.141A.837.837 0 0 1 .86-.453C.797-.61.766-.93.766-1.422v-2.781H.172v-.64h.594v-1.204l.812-.484v1.687h.828v.64h-.828v2.829c0 .242.016.39.047.453a.386.386 0 0 0 .14.156.5.5 0 0 0 .282.063c.094 0 .21-.008.36-.031zm0 0"/></symbol><symbol overflow="visible" id="o"><path d="M.61 0v-4.844h.734v.735c.187-.344.36-.567.515-.672a.925.925 0 0 1 .532-.172c.28 0 .562.09.843.266l-.28.765a1.115 1.115 0 0 0-.595-.187.792.792 0 0 0-.5.171.886.886 0 0 0-.296.438c-.094.293-.141.617-.141.969V0zm0 0"/></symbol><symbol overflow="visible" id="p"><path d="M3.938-1.563l.843.11c-.136.492-.386.875-.75 1.156-.355.274-.812.406-1.375.406-.71 0-1.273-.218-1.687-.656C.55-.984.344-1.594.344-2.375c0-.82.207-1.457.625-1.906.414-.446.96-.672 1.64-.672.645 0 1.172.226 1.579.672.414.437.625 1.054.625 1.843 0 .055-.008.126-.016.22h-3.61c.032.53.18.945.454 1.234.27.28.609.421 1.015.421.301 0 .555-.078.766-.234.219-.164.39-.422.515-.765zM1.233-2.89h2.704c-.032-.406-.137-.71-.313-.921a1.265 1.265 0 0 0-1.016-.47c-.375 0-.695.134-.953.391-.25.25-.39.586-.422 1zm0 0"/></symbol><symbol overflow="visible" id="r"><path d="M3.484 0h-.828v-5.234c-.199.187-.46.375-.781.562a5.073 5.073 0 0 1-.86.422v-.781a5.15 5.15 0 0 0 1.204-.782c.344-.312.586-.613.734-.906h.531zm0 0"/></symbol><symbol overflow="visible" id="B"><path d="M4.703-.797V0H.281a1.7 1.7 0 0 1 .094-.563c.113-.3.297-.597.547-.89.25-.29.61-.629 1.078-1.016.719-.594 1.203-1.062 1.453-1.406.258-.352.39-.688.39-1 0-.32-.116-.594-.343-.813-.23-.226-.531-.343-.906-.343-.399 0-.715.12-.953.36-.243.23-.36.558-.36.984l-.843-.094c.062-.625.28-1.102.656-1.438.375-.332.879-.5 1.515-.5.645 0 1.149.184 1.516.547.375.356.563.793.563 1.313 0 .273-.06.539-.172.796a3.15 3.15 0 0 1-.532.813c-.25.281-.671.672-1.265 1.172a19.6 19.6 0 0 0-.953.844 3.29 3.29 0 0 0-.344.437zm0 0"/></symbol></defs><path d="M0 0h468v216.477H0zm0 0" fill="#fff"/><path d="M226.922 1.2h44.52v18.84h-44.52zm0 0" fill="#bfbfbf"/><use xlink:href="#a" x="309.72" y="301.32" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#b" x="316.006" y="301.32" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#c" x="320.156" y="301.32" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#d" x="323.853" y="301.32" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#e" x="326.041" y="301.32" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#f" x="330.116" y="301.32" width="100%" height="100%" transform="translate(-72 -287.762)"/><path d="M226.922.957h44.758v19.32h-45V.957zm0 .602v-.36h.36v18.84h-.36v-.36h44.52v.36h-.364V1.2h.363v.36zm0 0"/><path d="M226.922 32.52h44.52v18.84h-44.52zm0 0" fill="#bfbfbf"/><use xlink:href="#g" x="309.12" y="332.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#b" x="313.317" y="332.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#c" x="317.513" y="332.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#d" x="321.361" y="332.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#h" x="323.458" y="332.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#i" x="325.193" y="332.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#j" x="329.343" y="332.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><path d="M226.922 32.277h44.758v19.32h-45v-19.32zm0 .602v-.36h.36v18.84h-.36V51h44.52v.36h-.364V32.52h.363v.359zm0 0M249.48 20.04v7.437h-.601v-7.438zm0 0"/><path d="M249.121 32.52l3.238-7.442-3.238 1.8-3.121-1.8zm0 0"/><path d="M1.441 72.117V212.52c0 1.32 1.2 2.52 2.52 2.52H239.52c1.44 0 2.52-1.2 2.52-2.52V72.117c0-1.32-1.08-2.52-2.52-2.52H3.96c-1.32 0-2.519 1.2-2.519 2.52zm0 0" fill="#f5f5f5"/><path d="M1.441 69.598H242.04v14.039H1.441zm0 0" fill="#ebebeb"/><use xlink:href="#k" x="272.04" y="368.04" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#l" x="278.271" y="368.04" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#m" x="283.41" y="368.04" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#n" x="288.548" y="368.04" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#o" x="291.257" y="368.04" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#p" x="294.368" y="368.04" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#p" x="299.506" y="368.04" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#q" x="304.645" y="368.04" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#r" x="307.24" y="368.04" width="100%" height="100%" transform="translate(-72 -287.762)"/><path d="M1.8 77.16v3.719h-.6V77.16zm0 5.04v3.718h-.6v-3.719zm0 4.917v3.84h-.6v-3.84zm0 5.043v3.719h-.6V92.16zm0 5.04v3.718h-.6v-3.719zm0 4.917v3.84h-.6v-3.84zm0 5.043v3.719h-.6v-3.719zm0 5.04v3.718h-.6v-3.719zm0 5.038v3.719h-.6v-3.719zm0 4.922v3.719h-.6v-3.719zm0 5.04v3.718h-.6v-3.719zm0 5.038v3.719h-.6v-3.719zm0 4.922V141h-.6v-3.84zm0 5.04v3.718h-.6v-3.719zm0 5.038v3.719h-.6v-3.719zm0 4.922V156h-.6v-3.84zm0 5.04v3.718h-.6v-3.719zm0 5.038v3.719h-.6v-3.719zm0 5.04V171h-.6v-3.723zm0 4.921v3.84h-.6v-3.84zm0 5.04v3.718h-.6v-3.719zm0 5.038V186h-.6v-3.723zm0 4.922v3.84h-.6v-3.84zm0 5.04v3.718h-.6v-3.719zm0 5.038V201h-.6v-3.723zm0 5.04v3.722h-.6v-3.723zm0 4.921v3.84h-.6v-3.84zm0 5.04v.242h-.359.36c0 1.078.719 2.039 1.8 2.16l-.12.597c-1.32-.238-2.282-1.32-2.282-2.757v-.243zm3 2.402h3.72v.597H4.8zm5.04 0h3.719v.597h-3.72zm4.922 0h3.84v.597h-3.84zm5.039 0h3.719v.597H19.8zm5.039 0h3.719v.597h-3.72zm5.039 0h3.723v.597h-3.723zm4.922 0h3.84v.597H34.8zm5.039 0h3.719v.597h-3.72zm5.039 0h3.723v.597h-3.723zm4.922 0h3.84v.597H49.8zm5.039 0h3.719v.597h-3.72zm5.039 0h3.723v.597h-3.723zm5.043 0h3.719v.597h-3.72zm4.918 0h3.84v.597h-3.84zm5.039 0h3.723v.597h-3.723zm5.043 0h3.719v.597h-3.72zm4.918 0h3.84v.597h-3.84zm5.039 0h3.723v.597h-3.723zm5.043 0h3.719v.597h-3.72zm5.039 0h3.719v.597h-3.72zm4.918 0h3.84v.597h-3.84zm5.043 0h3.719v.597h-3.72zm5.039 0h3.719v.597h-3.72zm4.918 0h3.84v.597h-3.84zm5.043 0h3.719v.597h-3.72zm5.039 0h3.719v.597h-3.72zm5.039 0h3.719v.597H135zm4.922 0h3.84v.597h-3.84zm5.039 0h3.719v.597h-3.72zm5.039 0h3.719v.597H150zm4.922 0h3.84v.597h-3.84zm5.039 0h3.719v.597h-3.72zm5.039 0h3.719v.597H165zm5.04 0h3.722v.597h-3.723zm4.92 0h3.84v.597h-3.84zm5.04 0h3.719v.597H180zm5.04 0h3.722v.597h-3.723zm4.92 0h3.84v.597h-3.84zm5.04 0h3.719v.597H195zm5.04 0h3.722v.597h-3.723zm5.038 0h3.723v.597h-3.723zm4.922 0h3.84v.597H210zm5.04 0h3.722v.597h-3.723zm5.038 0h3.723v.597h-3.723zm4.922 0h3.84v.597H225zm5.04 0h3.722v.597h-3.723zm5.038 0h3.723v.597h-3.723zm4.922 0a2.2 2.2 0 0 0 1.68-2.16h.36-.36v-.36h.718v.36c0 1.32-.957 2.52-2.277 2.757zm1.68-3.723v-3.84h.718v3.84zm0-5.039v-3.719h.718v3.719zm0-5.04v-3.718h.718v3.719zm0-4.921v-3.84h.718v3.84zm0-5.039v-3.719h.718v3.719zm0-5.04v-3.718h.718v3.719zm0-5.038v-3.723h.718v3.723zm0-4.922v-3.84h.718v3.84zm0-5.04v-3.718h.718v3.719zm0-5.038v-3.723h.718v3.723zm0-4.922v-3.84h.718v3.84zm0-5.04v-3.718h.718v3.719zm0-5.038v-3.723h.718v3.723zm0-5.043v-3.719h.718v3.719zm0-4.918v-3.84h.718v3.84zm0-5.04v-3.722h.718v3.723zm0-5.042v-3.719h.718v3.719zm0-4.918v-3.84h.718v3.84zm0-5.04v-3.722h.718v3.723zm0-5.042v-3.719h.718v3.719zm0-5.04v-3.718h.718v3.719zm0-4.917V102h.718v3.84zm0-5.043v-3.719h.718v3.719zm0-5.04V92.04h.718v3.719zm0-4.917V87h.718v3.84zm0-5.043v-3.719h.718v3.719zm0-5.04V77.04h.718v3.719zm0-5.038v-3.602h.36-.36V72h.718v3.719zm-.239-4.68c-.363-.723-1.082-1.082-1.921-1.082v-.36.36h-1.2v-.598h1.2c1.082 0 1.921.48 2.402 1.32zm-4.32-1.082h-3.723v-.598h3.723zm-5.043 0h-3.719v-.598h3.72zm-5.039 0h-3.719v-.598h3.72zm-4.918 0h-3.84v-.598h3.84zm-5.043 0h-3.719v-.598h3.72zm-5.039 0h-3.719v-.598h3.72zm-4.918 0h-3.84v-.598h3.84zm-5.043 0h-3.719v-.598h3.72zm-5.039 0h-3.719v-.598h3.72zm-5.039 0h-3.719v-.598H192zm-4.922 0h-3.84v-.598h3.84zm-5.039 0h-3.719v-.598h3.72zm-5.039 0h-3.719v-.598H177zm-4.922 0h-3.84v-.598h3.84zm-5.039 0h-3.719v-.598h3.72zm-5.039 0h-3.719v-.598H162zm-5.04 0h-3.722v-.598h3.723zm-4.92 0h-3.84v-.598h3.84zm-5.04 0h-3.719v-.598H147zm-5.04 0h-3.722v-.598h3.723zm-4.92 0h-3.84v-.598h3.84zm-5.04 0h-3.719v-.598H132zm-5.04 0h-3.722v-.598h3.723zm-5.038 0h-3.723v-.598h3.723zm-4.922 0h-3.84v-.598H117zm-5.04 0h-3.722v-.598h3.723zm-5.038 0h-3.723v-.598h3.723zm-4.922 0h-3.84v-.598H102zm-5.04 0h-3.722v-.598h3.723zm-5.038 0h-3.723v-.598h3.723zm-5.043 0H83.16v-.598h3.719zm-4.918 0h-3.84v-.598h3.84zm-5.04 0H73.2v-.598h3.723zm-5.042 0H68.16v-.598h3.719zm-4.918 0h-3.84v-.598h3.84zm-5.04 0H58.2v-.598h3.723zm-5.042 0H53.16v-.598h3.719zm-5.04 0h-3.718v-.598h3.719zm-4.917 0h-3.723v-.598h3.723zm-5.043 0H38.16v-.598h3.719zm-5.04 0h-3.718v-.598h3.719zm-4.917 0h-3.844v-.598h3.844zm-5.043 0H23.16v-.598h3.719zm-5.04 0h-3.718v-.598h3.719zm-4.917 0h-3.844v-.598h3.844zm-5.043 0H8.16v-.598h3.719zm-5.04 0H3.962v-.36.36c-.242 0-.48 0-.723.121L3 69.477c.36-.118.602-.118.96-.118h2.88zm-4.558.723c-.242.36-.48.84-.48 1.437h-.36.36v3.723h-.602v-3.723c0-.719.242-1.32.602-1.8zm0 0"/><path d="M86.879 93h44.402v18.84H86.88zm0 0" fill="#ffff97"/><use xlink:href="#s" x="175.08" y="393.12" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#t" x="179.277" y="393.12" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#u" x="183.125" y="393.12" width="100%" height="100%" transform="translate(-72 -287.762)"/><path d="M86.879 92.758h44.762v19.32H86.52v-19.32zm0 .601V93h.36v18.84h-.36v-.363h44.402v.363h-.242V93h.242v.36zm0 0"/><path d="M36.238 124.316h44.403v18.723H36.238zm0 0" fill="#ffff97"/><use xlink:href="#f" x="119.16" y="424.44" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#b" x="121.673" y="424.44" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#t" x="125.869" y="424.44" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#v" x="129.567" y="424.44" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#u" x="133.34" y="424.44" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#u" x="137.49" y="424.44" width="100%" height="100%" transform="translate(-72 -287.762)"/><path d="M36.238 123.957h44.64v19.441h-45v-19.441zm0 .602v-.243h.242v18.723h-.242v-.242h44.403v.242h-.36v-18.723h.36v.243zm0 0"/><path d="M137.52 124.316h44.402v18.723H137.52zm0 0" fill="#ffff97"/><use xlink:href="#f" x="220.44" y="424.44" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#b" x="222.953" y="424.44" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#t" x="227.149" y="424.44" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#v" x="230.847" y="424.44" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#u" x="234.62" y="424.44" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#w" x="238.77" y="424.44" width="100%" height="100%" transform="translate(-72 -287.762)"/><path d="M137.52 123.957h44.761v19.441h-45v-19.441zm0 .602v-.243h.359v18.723h-.36v-.242h44.403v.242h-.242v-18.723h.242v.243zm0 0"/><path d="M61.559 155.637h44.402v18.722H61.559zm0 0" fill="#ffff97"/><use xlink:href="#j" x="141.12" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#i" x="145.317" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#s" x="149.513" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#e" x="153.71" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#u" x="157.86" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#u" x="162.056" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#b" x="166.253" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><path d="M61.559 155.277h44.761v19.442H61.2v-19.442zm0 .602v-.242h.242v18.722h-.242V174h44.402v.36h-.36v-18.723h.36v.242zm0 0"/><path d="M10.8 155.637h44.52v18.722H10.8zm0 0" fill="#ffff97"/><use xlink:href="#j" x="90.48" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#i" x="94.677" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#s" x="98.873" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#e" x="103.07" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#u" x="107.22" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#u" x="111.416" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#g" x="115.613" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><path d="M10.8 155.277H55.56v19.442h-45v-19.442zm0 .602v-.242h.36v18.722h-.36V174h44.52v.36h-.36v-18.723h.36v.242zm0 0"/><path d="M112.2 155.637h44.402v18.722h-44.403zm0 0" fill="#ffff97"/><use xlink:href="#j" x="191.76" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#i" x="195.957" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#s" x="200.153" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#e" x="204.35" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#u" x="208.5" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#w" x="212.696" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#b" x="216.893" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><path d="M112.2 155.277h44.76v19.442h-45.12v-19.442zm0 .602v-.242h.359v18.722h-.36V174h44.403v.36h-.243v-18.723h.243v.242zm0 0"/><path d="M162.84 155.637h44.52v18.722h-44.52zm0 0" fill="#ffff97"/><use xlink:href="#j" x="242.52" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#i" x="246.717" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#s" x="250.913" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#e" x="255.11" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#u" x="259.26" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#w" x="263.456" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#g" x="267.653" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><path d="M162.84 155.277h44.762v19.442h-45v-19.442zm0 .602v-.242h.36v18.722h-.36V174h44.52v.36H207v-18.723h.36v.242zm0 0"/><path d="M137.52 186.84h95.16v18.84h-95.16zm0 0" fill="#ffff97"/><use xlink:href="#c" x="219.12" y="486.96" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#x" x="222.968" y="486.96" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#s" x="227.165" y="486.96" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#i" x="231.315" y="486.96" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#y" x="235.512" y="486.96" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#j" x="237.7" y="486.96" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#i" x="241.896" y="486.96" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#s" x="246.093" y="486.96" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#e" x="250.289" y="486.96" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#u" x="254.486" y="486.96" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#w" x="258.636" y="486.96" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#g" x="262.833" y="486.96" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#y" x="267.029" y="486.96" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#z" x="269.217" y="486.96" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#e" x="274.348" y="486.96" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#g" x="278.545" y="486.96" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#b" x="282.742" y="486.96" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#A" x="286.938" y="486.96" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#A" x="291.135" y="486.96" width="100%" height="100%" transform="translate(-72 -287.762)"/><path d="M137.52 186.598h95.402v19.32h-95.64v-19.32zm0 .601v-.36h.359v18.84h-.36v-.363h95.16v.364h-.359v-18.84h.36v.36zm0 0M94.078 112.078L78 121.918l-.238-.48 15.957-9.961zm0 0"/><path d="M73.559 124.316L81.602 123l-3.243-1.684v-3.597zm0 0M124.441 111.477l16.079 9.96-.36.481-16.082-9.84zm0 0"/><path d="M144.602 124.316l-4.801-6.597v3.597L136.559 123zm0 0M66.238 142.918l6.961 8.52-.48.48-6.957-8.64zm0 0"/><path d="M76.2 155.637l-2.4-7.918-1.198 3.48-3.602.48zm0 0M51 143.277l-6.96 8.641-.481-.48 6.96-8.52zm0 0"/><path d="M40.68 155.637l7.199-3.957-3.719-.48-1.2-3.481zm0 0M152.398 143.277l-6.957 8.641-.48-.48 6.96-8.52zm0 0"/><path d="M142.078 155.637l7.082-3.957-3.601-.48-1.2-3.481zm0 0M167.64 142.918l6.962 8.52-.48.48-6.962-8.64zm0 0"/><path d="M177.48 155.637l-2.28-7.918-1.2 3.48-3.602.48zm0 0M185.398 174.36v7.437h-.597v-7.438zm0 0"/><path d="M185.16 186.84l3.121-7.442-3.12 1.801-3.24-1.8zm0 0"/><path d="M251.398 72.117V212.52c0 1.32 1.204 2.52 2.524 2.52H464.16c1.32 0 2.52-1.2 2.52-2.52V72.117c0-1.32-1.2-2.52-2.52-2.52H253.922c-1.32 0-2.524 1.2-2.524 2.52zm0 0" fill="#f5f5f5"/><path d="M251.398 69.598H466.68v14.039H251.398zm0 0" fill="#ebebeb"/><use xlink:href="#k" x="496.68" y="368.04" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#l" x="502.911" y="368.04" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#m" x="508.05" y="368.04" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#n" x="513.188" y="368.04" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#o" x="515.897" y="368.04" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#p" x="519.008" y="368.04" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#p" x="524.146" y="368.04" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#q" x="529.285" y="368.04" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#B" x="531.88" y="368.04" width="100%" height="100%" transform="translate(-72 -287.762)"/><path d="M251.762 77.16v3.719h-.602V77.16zm0 5.04v3.718h-.602v-3.719zm0 4.917v3.84h-.602v-3.84zm0 5.043v3.719h-.602V92.16zm0 5.04v3.718h-.602v-3.719zm0 4.917v3.84h-.602v-3.84zm0 5.043v3.719h-.602v-3.719zm0 5.04v3.718h-.602v-3.719zm0 5.038v3.719h-.602v-3.719zm0 4.922v3.719h-.602v-3.719zm0 5.04v3.718h-.602v-3.719zm0 5.038v3.719h-.602v-3.719zm0 4.922V141h-.602v-3.84zm0 5.04v3.718h-.602v-3.719zm0 5.038v3.719h-.602v-3.719zm0 4.922V156h-.602v-3.84zm0 5.04v3.718h-.602v-3.719zm0 5.038v3.719h-.602v-3.719zm0 5.04V171h-.602v-3.723zm0 4.921v3.84h-.602v-3.84zm0 5.04v3.718h-.602v-3.719zm0 5.038V186h-.602v-3.723zm0 4.922v3.84h-.602v-3.84zm0 5.04v3.718h-.602v-3.719zm0 5.038V201h-.602v-3.723zm0 5.04v3.722h-.602v-3.723zm0 4.921v3.84h-.602v-3.84zm0 5.04v.242h-.364.364c0 1.078.718 2.039 1.797 2.16l-.118.597c-1.32-.238-2.28-1.32-2.28-2.757v-.243zm3 2.402h3.718v.597h-3.718zm5.039 0h3.719v.597h-3.72zm4.918 0h3.84v.597h-3.84zm5.043 0h3.718v.597h-3.718zm5.039 0h3.719v.597h-3.72zm5.039 0h3.719v.597h-3.72zm4.922 0h3.84v.597h-3.84zm5.039 0h3.719v.597h-3.72zm5.039 0h3.719v.597h-3.72zm4.922 0h3.84v.597h-3.84zm5.039 0h3.719v.597h-3.72zm5.039 0h3.719v.597h-3.72zm5.039 0h3.723v.597h-3.723zm4.922 0h3.84v.597h-3.84zm5.039 0h3.719v.597h-3.72zm5.039 0h3.723v.597h-3.723zm4.922 0h3.84v.597h-3.84zm5.039 0h3.719v.597h-3.72zm5.039 0h3.723v.597h-3.723zm5.043 0h3.719v.597h-3.72zm4.918 0h3.84v.597h-3.84zm5.039 0h3.723v.597h-3.723zm5.043 0h3.719v.597h-3.72zm4.918 0h3.84v.597h-3.84zm5.039 0h3.723v.597h-3.723zm5.043 0h3.719v.597h-3.72zm5.039 0h3.719v.597h-3.72zm4.918 0h3.84v.597h-3.84zm5.043 0h3.719v.597h-3.72zm5.039 0h3.719v.597h-3.72zm4.918 0h3.84v.597h-3.84zm5.043 0h3.719v.597h-3.72zm5.039 0h3.719v.597h-3.72zm4.918 0h3.84v.597h-3.84zm5.043 0h3.719v.597h-3.72zm5.039 0h3.719v.597h-3.72zm5.039 0h3.719v.597H435zm4.922 0h3.84v.597h-3.84zm5.039 0h3.719v.597h-3.72zm5.039 0h3.719v.597H450zm4.922 0h3.84v.597h-3.84zm5.039 0h3.719v.597h-3.72zm4.918-.121c.84-.243 1.441-1.082 1.441-2.04h.36-.36v-.722h.602v.723c0 1.199-.723 2.277-1.8 2.64zm1.441-3.961v-3.72h.602v3.72zm0-5.04v-3.718h.602v3.719zm0-4.921v-3.84h.602v3.84zm0-5.04v-3.718h.602v3.719zm0-5.038v-3.72h.602v3.72zm0-5.04v-3.722h.602v3.723zm0-4.921v-3.84h.602v3.84zm0-5.04v-3.718h.602v3.719zm0-5.038v-3.723h.602v3.723zm0-4.922v-3.84h.602v3.84zm0-5.04v-3.718h.602v3.719zm0-5.038v-3.723h.602v3.723zm0-4.922v-3.84h.602v3.84zm0-5.04v-3.718h.602v3.719zm0-5.038v-3.723h.602v3.723zm0-5.043v-3.72h.602v3.72zm0-4.918v-3.84h.602v3.84zm0-5.04v-3.722h.602v3.723zm0-5.042v-3.72h.602v3.72zm0-4.918v-3.84h.602v3.84zm0-5.04v-3.722h.602v3.723zm0-5.042v-3.72h.602v3.72zm0-5.04V96.72h.602v3.718zm0-4.917v-3.84h.602v3.84zm0-5.043v-3.72h.602v3.72zm0-5.04V81.72h.602v3.718zm0-4.917v-3.84h.602v3.84zm0-5.043v-3.36h.36-.36v-.36l.602-.12v3.84zm-.48-4.68c-.36-.48-.961-.84-1.68-.84v-.36.36h-1.558v-.598h1.558c.84 0 1.68.36 2.16 1.078zm-4.442-.84h-3.718v-.598h3.718zm-5.039 0h-3.718v-.598h3.718zm-4.918 0h-3.84v-.598h3.84zm-5.043 0h-3.718v-.598h3.718zm-5.039 0h-3.718v-.598h3.718zm-5.039 0h-3.718v-.598h3.718zm-4.922 0h-3.84v-.598h3.84zm-5.039 0h-3.718v-.598h3.718zm-5.039 0h-3.718v-.598h3.718zm-4.922 0h-3.84v-.598h3.84zm-5.039 0h-3.718v-.598h3.718zm-5.039 0h-3.718v-.598h3.718zm-5.039 0h-3.722v-.598h3.722zm-4.922 0h-3.84v-.598h3.84zm-5.039 0h-3.718v-.598h3.718zm-5.039 0h-3.722v-.598h3.722zm-4.922 0h-3.84v-.598h3.84zm-5.039 0h-3.718v-.598h3.718zm-5.039 0h-3.722v-.598h3.722zm-5.043 0h-3.718v-.598h3.718zm-4.918 0h-3.84v-.598h3.84zm-5.039 0h-3.722v-.598h3.722zm-5.043 0h-3.718v-.598h3.718zm-4.918 0h-3.84v-.598h3.84zm-5.039 0h-3.722v-.598h3.722zm-5.043 0h-3.718v-.598h3.718zm-4.918 0h-3.84v-.598h3.84zm-5.039 0h-3.722v-.598h3.722zm-5.043 0h-3.718v-.598h3.718zm-5.039 0h-3.719v-.598h3.72zm-4.918 0h-3.84v-.598h3.84zm-5.043 0h-3.718v-.598h3.718zm-5.039 0h-3.719v-.598h3.72zm-4.918 0h-3.84v-.598h3.84zm-5.043 0h-3.718v-.598h3.718zm-5.039 0h-3.719v-.598h3.72zm-5.039 0h-3.719v-.598h3.72zm-4.922 0h-3.84v-.598h3.84zm-5.039 0h-3.719v-.598h3.72zm-5.039 0h-3.719v-.598h3.72zm-4.922 0h-3.84v-.598h3.84zm-5.039 0h-2.277v-.36.36c-.48 0-.844.121-1.203.36l-.36-.477c.48-.363.961-.48 1.563-.48h2.277zM252 71.16a2.227 2.227 0 0 0-.238.957h-.364.364v3.723h-.602v-3.723c0-.48.121-.84.238-1.32zm0 0"/><path d="M336.84 93h44.398v18.84H336.84zm0 0" fill="#ffff97"/><use xlink:href="#s" x="425.04" y="393.12" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#t" x="429.237" y="393.12" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#w" x="433.085" y="393.12" width="100%" height="100%" transform="translate(-72 -287.762)"/><path d="M336.84 92.758h44.762v19.32H336.48v-19.32zm0 .601V93h.238v18.84h-.238v-.363h44.398v.363h-.36V93h.36v.36zm0 0"/><path d="M362.16 155.637h44.399v18.722H362.16zm0 0" fill="#ffff97"/><use xlink:href="#j" x="441.72" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#i" x="445.917" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#s" x="450.113" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#e" x="454.31" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#w" x="458.46" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#u" x="462.656" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#b" x="466.853" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><path d="M362.16 155.277h44.762v19.442H361.8v-19.442zm0 .602v-.242h.36v18.722h-.36V174h44.399v.36h-.239v-18.723h.239v.242zm0 0"/><path d="M412.8 155.637h44.52v18.722H412.8zm0 0" fill="#ffff97"/><use xlink:href="#j" x="492.48" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#i" x="496.677" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#s" x="500.873" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#e" x="505.07" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#w" x="509.22" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#u" x="513.416" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#g" x="517.613" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><path d="M412.8 155.277h44.759v19.442h-45v-19.442zm0 .602v-.242h.36v18.722h-.36V174h44.52v.36h-.36v-18.723h.36v.242zm0 0"/><path d="M311.52 155.637h44.402v18.722H311.52zm0 0" fill="#ffff97"/><use xlink:href="#j" x="391.08" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#i" x="395.277" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#s" x="399.473" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#e" x="403.67" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#w" x="407.82" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#w" x="412.016" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#b" x="416.213" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><path d="M311.52 155.277h44.761v19.442h-45.12v-19.442zm0 .602v-.242h.242v18.722h-.242V174h44.402v.36h-.363v-18.723h.363v.242zm0 0"/><path d="M260.762 155.637h44.52v18.722h-44.52zm0 0" fill="#ffff97"/><use xlink:href="#j" x="340.44" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#i" x="344.637" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#s" x="348.833" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#e" x="353.03" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#w" x="357.18" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#w" x="361.376" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#g" x="365.573" y="455.64" width="100%" height="100%" transform="translate(-72 -287.762)"/><path d="M260.762 155.277h44.758v19.442h-45v-19.442zm0 .602v-.242h.36v18.722h-.36V174h44.52v.36h-.36v-18.723h.36v.242zm0 0"/><path d="M387.48 124.316h44.399v18.723H387.48zm0 0" fill="#ffff97"/><use xlink:href="#f" x="470.4" y="424.44" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#b" x="472.913" y="424.44" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#t" x="477.109" y="424.44" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#v" x="480.807" y="424.44" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#w" x="484.58" y="424.44" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#u" x="488.73" y="424.44" width="100%" height="100%" transform="translate(-72 -287.762)"/><path d="M387.48 123.957h44.758v19.441h-45v-19.441zm0 .602v-.243h.36v18.723h-.36v-.242h44.399v.242h-.238v-18.723h.238v.243zm0 0"/><path d="M286.2 124.316h44.402v18.723h-44.403zm0 0" fill="#ffff97"/><use xlink:href="#f" x="369.12" y="424.44" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#b" x="371.633" y="424.44" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#t" x="375.829" y="424.44" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#v" x="379.527" y="424.44" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#w" x="383.3" y="424.44" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#w" x="387.45" y="424.44" width="100%" height="100%" transform="translate(-72 -287.762)"/><path d="M286.2 123.957h44.64v19.441h-45v-19.441zm0 .602v-.243h.241v18.723h-.242v-.242h44.403v.242h-.364v-18.723h.364v.243zm0 0"/><path d="M286.2 186.84h95.038v18.84H286.2zm0 0" fill="#ffff97"/><use xlink:href="#c" x="367.68" y="486.96" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#x" x="371.528" y="486.96" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#s" x="375.725" y="486.96" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#i" x="379.875" y="486.96" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#y" x="384.072" y="486.96" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#j" x="386.26" y="486.96" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#i" x="390.456" y="486.96" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#s" x="394.653" y="486.96" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#e" x="398.849" y="486.96" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#w" x="403.046" y="486.96" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#w" x="407.196" y="486.96" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#b" x="411.393" y="486.96" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#y" x="415.589" y="486.96" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#z" x="417.777" y="486.96" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#e" x="422.908" y="486.96" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#g" x="427.105" y="486.96" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#b" x="431.302" y="486.96" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#A" x="435.498" y="486.96" width="100%" height="100%" transform="translate(-72 -287.762)"/><use xlink:href="#A" x="439.695" y="486.96" width="100%" height="100%" transform="translate(-72 -287.762)"/><path d="M286.2 186.598h95.402v19.32H285.84v-19.32zm0 .601v-.36h.241v18.84h-.242v-.363h95.04v.364h-.36v-18.84h.36v.36zm0 0M374.398 111.477l15.961 9.96-.238.481-16.082-9.84zm0 0"/><path d="M394.559 124.316l-4.797-6.597v3.597L386.52 123zm0 0M402.36 143.277l-6.962 8.641-.476-.48 6.957-8.52zm0 0"/><path d="M391.922 155.637l7.2-3.957-3.602-.48-1.2-3.481zm0 0M417.602 142.918l6.957 8.52-.48.48-6.958-8.64zm0 0"/><path d="M427.441 155.637l-2.28-7.918-1.2 3.48-3.723.48zm0 0M344.04 112.078l-16.08 9.84-.358-.48 16.078-9.961zm0 0"/><path d="M323.52 124.316l8.039-1.316-3.239-1.684v-3.597zm0 0M300.96 143.277l-6.96 8.641-.48-.48 6.96-8.52zm0 0"/><path d="M290.64 155.637l7.079-3.957-3.598-.48-1.2-3.481zm0 0M316.2 142.918l6.96 8.52-.48.48-6.961-8.64zm0 0"/><path d="M326.04 155.637l-2.278-7.918-1.203 3.48-3.598.48zm0 0M333.96 174.36v7.437h-.6v-7.438zm0 0"/><path d="M333.719 186.84l3.12-7.442-3.12 1.801-3.117-1.8zm0 0"/></svg>�����������������������������������������������������������������������������������������������������������������������mitogen-0.3.9/docs/images/distribute.graphml��������������������������������������������������������0000664�0000000�0000000�00000133467�14656664731�0021154�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" standalone="no"?> <graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd"> <!--Created by yEd 3.14.4--> <key attr.name="Description" attr.type="string" for="graph" id="d0"/> <key for="port" id="d1" yfiles.type="portgraphics"/> <key for="port" id="d2" yfiles.type="portgeometry"/> <key for="port" id="d3" yfiles.type="portuserdata"/> <key attr.name="url" attr.type="string" for="node" id="d4"/> <key attr.name="description" attr.type="string" for="node" id="d5"/> <key for="node" id="d6" yfiles.type="nodegraphics"/> <key for="graphml" id="d7" yfiles.type="resources"/> <key attr.name="url" attr.type="string" for="edge" id="d8"/> <key attr.name="description" attr.type="string" for="edge" id="d9"/> <key for="edge" id="d10" yfiles.type="edgegraphics"/> <graph edgedefault="directed" id="G"> <data key="d0"/> <node id="n0"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="88.0" x="225.0" y="137.0078125"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="50.01953125" x="18.990234375" y="5.93359375">rack12c<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="88.0" x="165.0" y="-38.9921875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="47.072265625" x="20.4638671875" y="5.93359375">bastion<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="88.0" x="225.0" y="32.0078125"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="50.5" x="18.75" y="5.93359375">rack12a<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="88.0" x="165.0" y="-110.9921875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="41.060546875" x="23.4697265625" y="5.93359375">laptop<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4"> <data key="d6"> <y:GenericNode configuration="com.yworks.flowchart.dataBase"> <y:Geometry height="30.0" width="26.0" x="401.0" y="-110.9921875"/> <y:Fill color="#E8EEF7" color2="#B7C9E3" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="11.0" y="13.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> </y:GenericNode> </data> </node> <node id="n5"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="88.0" x="283.0" y="-110.9921875"/> <y:Fill color="#99CC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="60.1796875" x="13.91015625" y="5.93359375">distribute<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n6"> <data key="d6"> <y:GenericNode configuration="com.yworks.flowchart.dataBase"> <y:Geometry height="30.0" width="26.0" x="401.0" y="-38.9921875"/> <y:Fill color="#E8EEF7" color2="#B7C9E3" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="11.0" y="13.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> </y:GenericNode> </data> </node> <node id="n7"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="88.0" x="283.0" y="-38.9921875"/> <y:Fill color="#99CC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="60.1796875" x="13.91015625" y="5.93359375">distribute<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n8"> <data key="d6"> <y:GenericNode configuration="com.yworks.flowchart.dataBase"> <y:Geometry height="30.0" width="26.0" x="461.0" y="32.0078125"/> <y:Fill color="#E8EEF7" color2="#B7C9E3" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="11.0" y="13.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> </y:GenericNode> </data> </node> <node id="n9"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="88.0" x="343.0" y="33.0078125"/> <y:Fill color="#99CC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="60.1796875" x="13.91015625" y="5.93359375">distribute<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n10"> <data key="d6"> <y:GenericNode configuration="com.yworks.flowchart.dataBase"> <y:Geometry height="30.0" width="26.0" x="-67.0" y="32.0078125"/> <y:Fill color="#E8EEF7" color2="#B7C9E3" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="11.0" y="13.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> </y:GenericNode> </data> </node> <node id="n11"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="88.0" x="-11.0" y="32.0078125"/> <y:Fill color="#99CC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="60.1796875" x="13.91015625" y="5.93359375">distribute<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n12"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="88.0" x="107.0" y="32.0078125"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="50.5" x="18.75" y="5.93359375">rack11a<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n13"> <data key="d6"> <y:GenericNode configuration="com.yworks.flowchart.dataBase"> <y:Geometry height="30.0" width="26.0" x="461.0" y="85.0078125"/> <y:Fill color="#E8EEF7" color2="#B7C9E3" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="11.0" y="13.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> </y:GenericNode> </data> </node> <node id="n14"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="88.0" x="343.0" y="85.0078125"/> <y:Fill color="#99CC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="60.1796875" x="13.91015625" y="5.93359375">distribute<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n15"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="88.0" x="107.0" y="85.0078125"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="51.42578125" x="18.287109375" y="5.93359375">rack11b<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n16"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="88.0" x="-11.0" y="85.0078125"/> <y:Fill color="#99CC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="60.1796875" x="13.91015625" y="5.93359375">distribute<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n17"> <data key="d6"> <y:GenericNode configuration="com.yworks.flowchart.dataBase"> <y:Geometry height="30.0" width="26.0" x="-67.0" y="85.0078125"/> <y:Fill color="#E8EEF7" color2="#B7C9E3" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="11.0" y="13.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> </y:GenericNode> </data> </node> <node id="n18"> <data key="d6"> <y:GenericNode configuration="com.yworks.flowchart.dataBase"> <y:Geometry height="30.0" width="26.0" x="461.0" y="137.0078125"/> <y:Fill color="#E8EEF7" color2="#B7C9E3" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="11.0" y="13.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> </y:GenericNode> </data> </node> <node id="n19"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="88.0" x="343.0" y="137.0078125"/> <y:Fill color="#99CC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="60.1796875" x="13.91015625" y="5.93359375">distribute<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n20"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="88.0" x="107.0" y="137.0078125"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="50.01953125" x="18.990234375" y="5.93359375">rack11c<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n21"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="88.0" x="-11.0" y="137.0078125"/> <y:Fill color="#99CC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="60.1796875" x="13.91015625" y="5.93359375">distribute<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n22"> <data key="d6"> <y:GenericNode configuration="com.yworks.flowchart.dataBase"> <y:Geometry height="30.0" width="26.0" x="-67.0" y="137.0078125"/> <y:Fill color="#E8EEF7" color2="#B7C9E3" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="11.0" y="13.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> </y:GenericNode> </data> </node> <node id="n23"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="88.0" x="225.0" y="85.0078125"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="51.42578125" x="18.287109375" y="5.93359375">rack12b<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n24"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="11.0" x="482.0" y="58.5078125"/> <y:Fill hasColor="false" transparent="false"/> <y:BorderStyle hasColor="false" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.5" y="13.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n25"> <data key="d5"/> <data key="d6"> <y:SVGNode> <y:Geometry height="35.484542934485205" width="32.2024545674844" x="192.89877271625778" y="-161.4767304344852"/> <y:Fill color="#CCCCFF" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="14.10122728374219" y="39.484542934485205"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:SVGNodeProperties usingVisualBounds="true"/> <y:SVGModel svgBoundsPolicy="0"> <y:SVGContent refid="1"/> </y:SVGModel> </y:SVGNode> </data> </node> <edge id="e0" source="n1" target="n1"> <data key="d10"> <y:ArcEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"> <y:Point x="209.0" y="-23.9921875"/> </y:Path> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:Arc height="0.0" ratio="1.0" type="fixedRatio"/> </y:ArcEdge> </data> </edge> <edge id="e1" source="n3" target="n3"> <data key="d10"> <y:ArcEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"> <y:Point x="209.0" y="-95.9921875"/> </y:Path> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:Arc height="0.0" ratio="1.0" type="fixedRatio"/> </y:ArcEdge> </data> </edge> <edge id="e2" source="n7" target="n6"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="44.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e3" source="n4" target="n5"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e4" source="n5" target="n3"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e5" source="n3" target="n1"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="10" fontStyle="bold" hasLineColor="false" height="15.77734375" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="46.5537109375" x="-23.27685546875" y="13.111328124999986">(300ms)<y:LabelModel> <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.5" segment="0"/> </y:ModelParameter> <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/> </y:EdgeLabel> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e6" source="n1" target="n7"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e7" source="n1" target="n2"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="10" fontStyle="bold" hasLineColor="false" height="15.77734375" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="43.78515625" x="-4.568634033203125" y="12.611328124999993">(250μs)<y:LabelModel> <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.5" segment="0"/> </y:ModelParameter> <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/> </y:EdgeLabel> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e8" source="n8" target="n9"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="44.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e9" source="n11" target="n10"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="-44.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e10" source="n2" target="n23"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e11" source="n1" target="n12"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="10" fontStyle="bold" hasLineColor="false" height="15.77734375" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="43.78515625" x="-38.63905334472656" y="12.611328124999993">(250μs)<y:LabelModel> <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.5" segment="0"/> </y:ModelParameter> <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/> </y:EdgeLabel> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e12" source="n9" target="n2"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="-44.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e13" source="n14" target="n13"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e14" source="n23" target="n14"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e15" source="n12" target="n15"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e16" source="n12" target="n11"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="44.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e17" source="n15" target="n16"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e18" source="n16" target="n17"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e19" source="n19" target="n18"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e20" source="n0" target="n19"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e21" source="n20" target="n21"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e22" source="n21" target="n22"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e23" source="n2" target="n0"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="-43.863669958563634" sy="14.9921875" tx="-43.863669958563634" ty="-15.020771131556558"> <y:Point x="212.0" y="73.0"/> <y:Point x="212.0" y="119.5078125"/> </y:Path> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="true"/> </y:PolyLineEdge> </data> </edge> <edge id="e24" source="n12" target="n20"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="42.85528831480789" sy="15.017222708103716" tx="42.85528831480789" ty="-15.0390625"> <y:Point x="205.0" y="74.0"/> <y:Point x="205.0" y="120.5078125"/> </y:Path> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="true"/> </y:PolyLineEdge> </data> </edge> </graph> <data key="d7"> <y:Resources> <y:Resource id="1"><?xml version="1.0" encoding="utf-8"?> <svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="57px" height="63px" viewBox="0 0 57 63" enable-background="new 0 0 57 63" xml:space="preserve"> <g> <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.5" y1="1570.3457" x2="27.741" y2="1600.1431" gradientTransform="matrix(1 0 0 1 0.1602 -1546.3828)"> <stop offset="0.2711" style="stop-color:#FFAB4F"/> <stop offset="1" style="stop-color:#FFD28F"/> </linearGradient> <path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> <radialGradient id="face_x5F_white_1_" cx="27.7427" cy="1572.1094" r="23.4243" fx="23.1732" fy="1569.6195" gradientTransform="matrix(1 0 0 1 0.1602 -1546.3828)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#FFD28F"/> <stop offset="1" style="stop-color:#FFAB4F"/> </radialGradient> <path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 c0.086,10.2-6.738,18.52-15.247,18.586c-8.502,0.068-15.466-8.146-15.552-18.344C12.794,13.4,19.618,5.079,28.123,5.012 C36.627,4.945,43.59,13.158,43.676,23.357z"/> <linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="3646.5117" y1="-6644.2471" x2="3670.1414" y2="-6737.6978" gradientTransform="matrix(0.275 0 0 -0.2733 -977.2951 -1807.6279)"> <stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> <stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> </linearGradient> <path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M27.958,6.333c-6.035,0.047-10.747,4.493-12.787,10.386 c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.384,11.893,1.247 c2.274-0.592,3.988-2.459,4.375-4.766c0.183-1.094,0.293-2.289,0.283-3.553C42.083,13.952,36.271,6.268,27.958,6.333z"/> <path fill="#656565" stroke="#4B4B4B" stroke-linejoin="round" stroke-miterlimit="10" d="M15.038,26.653 c0.145,2.05,3.468,2.593,6.477,2.56c2.298-0.026,3.25-0.889,4.746-2.685c2.539-3.05-0.767-3.715-4.817-3.67 C15.984,22.919,14.777,22.933,15.038,26.653z"/> <path fill="#656565" stroke="#4B4B4B" stroke-linejoin="round" stroke-miterlimit="10" d="M41.116,26.653 c-0.146,2.05-3.47,2.593-6.478,2.56c-2.299-0.026-3.252-0.889-4.746-2.685c-2.538-3.05,0.769-3.715,4.816-3.67 C40.17,22.919,41.377,22.933,41.116,26.653z"/> <path fill="none" stroke="#4B4B4B" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M27.453,24.375 c0,0,0.604-0.469,1.305,0"/> <line fill="none" stroke="#4B4B4B" stroke-linecap="round" stroke-miterlimit="10" x1="41.727" y1="24.592" x2="41.844" y2="25.375"/> <line fill="none" stroke="#4B4B4B" stroke-linecap="round" stroke-miterlimit="10" x1="42.165" y1="24.938" x2="44.027" y2="24.938"/> <line fill="none" stroke="#4B4B4B" stroke-linecap="round" stroke-miterlimit="10" x1="14.374" y1="24.592" x2="14.257" y2="25.375"/> <line fill="none" stroke="#4B4B4B" stroke-linecap="round" stroke-miterlimit="10" x1="13.937" y1="24.938" x2="12.073" y2="24.938"/> <path id="body_9_" fill="#9B9B9B" stroke="#4B4B4B" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d=" M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543 c-4.815-4.813-11.244-6.146-11.244-6.146c-1.771,1.655-5.61,2.802-10.063,2.802c-4.453,0-8.292-1.146-10.063-2.802 c0,0-5.755,0.586-11.189,6.021C1.378,56.689,0.5,62.768,0.5,62.768z"/> <path id="turtleneck_6_" fill="#9B9B9B" stroke="#4B4B4B" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d=" M39.715,44.786l-1.557-3.405c0,0-0.574,2.369-3.012,4.441c-2.109,1.795-6.785,2.072-6.785,2.072s-4.753-0.356-6.722-2.031 c-2.436-2.072-3.012-4.441-3.012-4.441l-1.555,3.404c0,0-0.552,1.404,1.37,3.479c1.025,1.105,5.203,3.611,9.682,3.582 c4.479-0.029,9.264-2.594,10.218-3.623C40.266,46.191,39.715,44.786,39.715,44.786z"/> <path fill="#656565" stroke="#4B4B4B" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M49.529,51.225 c-1.094-1.094-2.319-2.006-3.563-2.766c0.193,0.346,0.401,0.68,0.574,1.041c-4.906,6.014-15.921,9.289-21.743,16.709 c1.969-7.594-11.166-13.127-14.493-16.926c-0.158-0.182-0.258-0.422-0.332-0.686c-1.015,0.707-2.031,1.525-3.001,2.5 c-5.592,5.592-6.47,11.67-6.47,11.67c0,1.936,1.575,3.489,3.523,3.489h48.51c1.948,0,3.521-1.558,3.521-3.489 C56.055,62.768,54.211,55.906,49.529,51.225z"/> <path fill="#656565" stroke="#4B4B4B" stroke-linejoin="round" stroke-miterlimit="10" d="M3.007,32.205 c1.521,2.295,10.771,12.17,10.771,12.17s-5.137,3.012-3.474,4.908c3.327,3.799,10.533,14.018,14.865,16.467 c2.499-4.6-3.906-23.327-5.724-25.833c-1.296-1.786-3.22-3.269-4.598-5.417C14.846,34.5,9.195,34.5,3.007,32.205z"/> <path fill="#656565" stroke="#4B4B4B" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M52.277,32.205 c-4.791,3.299-10.368,10.391-11.074,11.066c2.313,1.744,4.9,3.799,6.146,6.406c-4.906,6.014-14.766,9.277-21.747,16.069 c2.015-7.771,5.157-20.46,12.517-27.083c1.667-1.5,2.713-2.833,4.043-5.391C42.165,33.275,45.637,33.25,52.277,32.205z"/> <path id="wh2_1_" fill="#9B9B9B" stroke="#4B4B4B" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d=" M28.276,15.5c5.635,0,10.826,1.416,14.979,3.794c-1.614-8.228-7.794-14.34-15.132-14.282c-7.272,0.057-13.299,6.155-14.846,14.294 C17.434,16.921,22.632,15.5,28.276,15.5z"/> <path id="wh1_1_" fill="#9B9B9B" stroke="#4B4B4B" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d=" M28.278,20.808c5.662,0,11.937,0.811,16.391,2.207c-0.11-2.059-0.274-2.826-0.413-3.72c-4.154-2.379-10.344-3.795-15.98-3.795 c-5.644,0-11.842,1.421-16,3.807c-0.228,1.197-0.362,2.436-0.388,3.707C16.343,21.618,22.618,20.808,28.278,20.808z"/> </g> </svg> </y:Resource> </y:Resources> </data> </graphml> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mitogen-0.3.9/docs/images/distribute.png������������������������������������������������������������0000664�0000000�0000000�00000051115�14656664731�0020273�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��0��J�����RIDATx \M9:c㘻K4q5IK%rKA1䒌q`RR2RdOkMnW+~Z߽^Z^I����C �/޼?~݊/ ^8h٢EaO=w3Y�B@<<u"+6l_X;Rc+� $�g)߮YrM6}7X@8d � �۹ V%6n XBN*Ȼ�!a>y-l _pxH��ݹf˦M7lذre~K._oV ݸa_x$� $�4b~p\xR% .Xp |/]{h wE }:K,Y`Kџ=� $�4E+|}C46 _'Kh '-Xo/@� $�4�%33er+/ ^lm ~A+_Yo"!��ɓ'aa?,]sl/YwZ`vjc| ts~`Rﰰ0� � ٳ~vɌs's8}twn:9 8m4ټ:Xنu섄� �Pc7vs쬭lmmiy/Ex"{�@H�hO ~Z=zT<[(i֕.oM:Z=� $�4'g[wi~ ];̟cp޴C\F/C bV:wc1 <gd� �QoOzt)[:%t#O$9eꢸ^raלsV(�B@M={^PPPvw2OrI"M)/9-IX I\"I$,^$򐜜)'**ȑ#GMLLDz�.O<ϟqƽ{N&KNN:5O.-͓̕DϑD9I;<?<-uܹs]\\fϞGCz�./_,,,ܱc)S&Olgg7sLgM}z؞['ڙk$tjn\$'yY/θ}yV|&hӦM%%%H/��5sR^^޾}hCF̞1H{&KN8phI(\E3KL>>l4>nnnnWNOOǝ�PI;wtrr)^6_gJי/+*17f*I61VPPЙ3g`#� $�j;wh$#/{k>g|߄ygYoBqE_M<VM`#� $�j $??˖-HP{'8d|II'9N.tta\7�B@c[n9::L8ADsAG׉6S999ϟ?G��3g,?#gm#`Zq)w;yT+͛7/&&9�Bc;;7zԩ9&$`O!s!pIW-Wۼ3L� $�ԵQi߯n\fՄe(| :::*KzS]]ӒR� $�/&(r02ei&MD*%9U  &oh3H,��5ɓ?m4\SI/iaNNNd#gggZh#ڄlD[ĉܺ�!P]^(9oe9ZvHdUaޚ8q"ҒBMI�B/4iRo'HBUV)\4 'ISŜ@�g,ƛOSوL# z 7NYA#aWM<mӓ?#�@H�TMG'H92-'hDl${z"d� $�F/&Α3xФI¨HoNnc$�!P5'NxMĪ r< �@&)L\i<<qIV/3l~I�Bjʱ4rbѣG]嚲e鷮_F���@H�������B��� $�������!������ ������@H��� $����B���!����b !IQ+(u-җ/ 7-_Fo?;ZRR!�!AHy(l.i݌ud8hp3s˩f:x:a3i̸ 34DOc'CISn {�!AHVâ<۴yC\}"d|pNEWssn=B9/<? S}Vsꌖ $�!AHR=)=B1Dwq:WQUYmt_#1ic̭ $� $ BROzr=e蒼2FDZx6lV<%&&&�!k7HF6JˢRp*n�!AH#>"YeݪFEl-(5 Jb � BϰQf?Wn+6XL5Ѱ �!AHg8#~̙ptB uRt~<굴@Ӗ&L�:"Nn]ҋR3#$ wUcVnpB} ^ĩv]uo׾g6aTgOXM;uiDgxKg2AH�舐u`tGHy%IFJ̐\S?BғMfAvChIHʰݑNnu>;x,^f] )W /'_l!ȅ4'۱a )-K{v_oʅ֝VRonX#!Y{!i65-LKR (IF !$�tQH^읷WeX~l ̠%33eŧ؂iݶk{V׹qW0"+PB*z,] BRHK3ٛ:|$ G?6g¬ ֱkޒb{jn6$+Og}?GmHB2ekNJÏ6quK?eZCŭ2zB]FElt< � z`~em -z}+ٱu{l+:>{ Orцo7Ԭ1Y]b"Q dZm3\Ӿqlu sZÚ볉^r$C="yS.l <&OٌF{~%s^zOܲ5Y\r\$fl>آRBjk4N3 $�tݐ:w l0#);q=R|9s_,-[$Wiު\S!ij7e?Ԯ=3J5ZK5$9 #'*lLS'eX ^! u 6PmTvNjDyAH�褐#)M [Ah Ԫ4l J7)GhOJ>[V1avҠsZ[Nd]#${u.T2\azm/kyŦ߅�5!`oβa} c # iX=*ՏMSZTr<Eb,1rRâ:eOϲې8XH(kߚ ?S؀1]7Z I7pDc4aK=w\ʧ0O6'k�:'C<',c7Ҟ;HW;_(*8<+ e^ OهoUs:{hBU}I%&ZkH23gI>\9 א֝f # >ɗ{e%U1+;0sW~^LR!$ۉ /ODLTU/UvB]6"<;�& |Fg|k~֮|nء| g<kIBXw̅fM4r 懱JHSwBdMlGHvMְmJ!u ~2Hƛ7);٘ wCMkϰNaHPFAH�芐Ja@Yc=;-}K($ur8 \z Rji\ RuoV4 _GN 1Wnք:YĜ�Q!iVھeJNRmTqBbl}6@c|SBHAHՙ]qB]yFiOAH�4!n62,NS>^ultFQ�!"sj4Njt(7:%B�B $5ջ,/KlB,^obb!�!AH:dffvflfn~ FEҿGll팍 $� $ BRboooΞ}ە٨|B9w#i[gg|F $ B!k)<<DOOhs +YήB5j A*Zsζ۶mAH�B ܲeKpp¿ OKK{]kfmLZ75�t5 AH�4hmx~4��!P=\��B1��B@(w6��@=|Y9S� $�P9!٭DJ��s Br�@ݲ1RFT‘� $�@= W`g>��!PG=׭+y$96%��!PWl9rQnd~� ������@H��� $����B@<zHx>|/*>Sie5z*r�"$nݺ$_CC-Z_zÇtaРAbee�! Ih!''pcl׮]»:uZjz|rɓ'}|� $�k/O8ABE˗.]eQF)w BCC?cZHJJ?~ᄏm6!+:wܺu@{ԩH>��"W\!rbbСC[h Q]ZlYRRR͛Tӽ{[$kի_~ݻwBBBh>N?t�B@$""y2 }!Ct… Tyf2 /^Lk>b0fڳg՘҂hӧ(cӦMhb��!9w$,)GɓΝ;Ts!OiC_:BMxx|�! BCTZq5mڴbO}|| v秴R<xpMZ=ztn݄?��Rh2}/^ѣUV&۷yoֿ)TRrr2$uAS##;w"�@H�H?]RRr wϞ=uVu*U ̛ 2�"?˫~:r����B��� $����Ö#M#\ŅH� I%Ϟ5/J8J =�@H�LeH./;K#=�@H�!#J@8�@ݒwS;H ��u[V"%�@H�ɗt<)�B2Pg:�� $�ꇈ(QH��Ic>ջ I#$� zevH��Mv.��@o/W4�B#$I2v1TZ\ڿaf+=ݨxx-_}RRRKJJ $� $ B<me3;qw==  nfn9uL'OG^<l;7aaF]udh5i֭a<� $*zX4wg6o}>pOј)vjnQvnQ֭GW|t9ᥜ?xG}>dy\ $ B!g\Q1f㏜7_***k#R.P k_$&mQZZ�!AHI^>`ly]QhsW f*B�B $53qFU6"(]FiYT N%_Ӎـ $~4݇T$k[h󂍲Ef^)pv[ !�!AH6_mtEFfS:v� $I gdupvo9μ^0Nj#~Nяb]hRՄ=}B 'va EIQ%oQ%;ت1+ubv78!>W~T.ݺ7kpa30~lw*ݧLsrE4iaN_ \<rҥ3 $�^m!uiF  U{!ݗl>$G|6ԥ'8/݁ R'jђ4aӻ#^.} 6wrwX$ dͦ"sS$_O/(B i@Oc\Ş!e'S/)<zʠTXVM/jKHAQliU,U5f3\„+dlpBEAKffʊO^읷WeXk|_.ƚm˺g%?؉ 7}YXI+P]6BB*z̟X[*N7}-> 囨!M}c>ԣA\aV؃5o_~1Zeogŕ3>#6$!MYLm{5xkmIILڥΟf-XϡV IKV=.]~ hˢ6mtB+/lJvl%ӸvWրkHK?dQ|t=bwa=cr-ZӮd,e‡oP/v&LS׮1Y]b" dU܏P�G\ul8:9aD/Mhk!s ef)A6l ^p=Cf9co'Fnٚ,@[9QG_6nl)M !i55PF�G0ٸa+ sgX黽?+EeP/4^\aXI&!xsogҌU\V]R( xB goVu ]{f:nE)kkH4rGNfU*$٘$͙O8F۱~V3,P`# uFe6OQ.]Cڲe�>B q+4/kU [ZH?bjg}]cBGhOJ:pj;"RP >[V1avҠsZ[Nd]#${u.T2\azm/kyŦ߅�!yLavcB,k_G*$*%l#{3NRWCϻ{c.x>XV;|C95Ң:eOϲې8XH(kߚ ?S؀1]7Z I7pDc4aK=w\ʧ0O6'k�NW} NY ?CT',c7?M+f|!҃|yPe(ZѪ9<l>Zu#rr$-W$KVS:kY֤Vm3$kHN| A=Q*T ޘML+?/ wcĆ'|F}k***;Rv W^Hs Z/ Ǽ1ߚK A;f>WT#k9')&;>KYScd4m! <~*#f踞zP\Ekw[z&z\6䀊#$AvZ[&NkX6|LS:tg?$ z {M€Ol̅]V&5gXRe0$OahS $�^q!=f/Oa[54x*eZ_v5 Q~:TZjl8#WC#*Th*BUE5[5NF"*1g!$�^q!^veW +Q*NQLކ� $I Wgzw u6&>!�!AHR-2,NS>^ultFQ�!"sj4Njt(7:%B�B $5ջ,/KlB,^obb!�!AH:dffvflfn~ FEҿGll팍 $� $ BRboooΞ}ە٨|B9w#i[gg|F $ B!k)<<DOOhs +YήB5j A*Zsζ۶mAH�B ܲeKpp¿ OKK{]kAǯUSњ1@{;en�uͩs+?~ofZ _ygmTtQ��� JI}gI=dUb��PH&<P,vW`7� $�O)<az(wO* ; -�!Mc~F* Ւp5S Q� $� yKm8惕rCXi2a?g4ݸ~B�B@Ÿy2M"iSH9!# � WDY-.NJsx� $�wOųgY;ol� $�I˒Z ՑHkŽjO�@H�FJ=O 3~���@H��� $����B:ƣGʟHFGx1zja� $�ݺuηCN͇3zwҤI?Çʃ ͫA!!!VVVp�ԉǏcbb^|ByDDп;::-#++KؤSNV1G=/_^z￿o߾ƶ�@H�Tvڝ>}Z޽{Z@@пoݺUݜ/]D...F6144e+Xsέ[ SNml; �@\r:Bʅ \vM}] n۶6N|he˖%%%wܡʝ;wR2hݻzzz!!!@D5?C׮]�!P-"""7o.[w-Z/<yrY{{{-ټy3-SMˋ/͟??شiSi)}PTTV\\xv� jq9pjԩS ԏO>]R66>|8-;hj-KKKz4�BZ8 55o޼٦MϔC'{e꣩wj߾Oaaa׮]w;;۷ߟ*<x@1iaݺu___ F�@H�TЅđ#G T9hРݻmvرϟ۷o?z_{^?I#֭[Serr2 _H:tصkӧOdj�4>|xvvwOvY֭[/~xšBBBhw� 㼼Z=o6oӦO?bׯ7�B���!����jS=a$*UK�BAp2M'}>Xrh9 �@H�4�|$jr ׏ː%Lt� $�ꇱ $$׷# _94�!PJQɾQLNF{�WC,|%4q9Iq@H�+S=2SJɪH~_'$(="Y_*.qh�BȻ/3C#렍 vV,ێ $�=12) JyP'2 pT4@�@*#˜ )RE4 �!Ph3g_Lғx8k $�ꁴ,_o䧪Z厳v�Bq1seGKd"�B #0hDB*-}y.?߰qnT<}Ӿ))%%%u,(.%(aPנ/QQ]6wpАfStrtfӘq fhԵ^NVn BBw {Ehж/~?|X4wg6o}>pOј)vjnQvnQ֭GW|t9ᥜ?xG}>dy\j M Ba.$g\Q1f㏜7_硋F/P k_$&mQZZtж/'={zBlgPkbsW f*M BBw CH:Kh|ד3ݨ*:.=-JkhjKdB^B>݇BFϺUIbBl1zjVAghjKdB^BnԹϿƕG"bUL5Ѱ tЪ/gdupvo9μ^0AB?uZoiKV&Oe45 %2 !p/U_]띿r'xuֽ^لI3gS>e×c-4dԥI;tjo .ɼ"/J%G}V*-7eSpg[5=։-Z3\} 'vawfR3\Ȯg!=V|R5wazNnu>˄N.ٴsWdtBznʕɗ艕)d!W9NVX}ֲu& ow`3ԉ A4.u`+s03S~;ŀjCHʰݐa–C/Z|-j[ᰵ6B Sz-ʼ}0QR]gX^z+B$ ? -?V'&))!EuUfT[HH*b־i6 ,:ŮeNljCHBT(kkQ=nYgYʏHE.|O㰵FB4JMLQ#m<($$/I/// @_,"mgTliWrK RMm~f1{SXĦ֣A\aV؃5o_~1Zeogŕ3>#66e3Ϸe֜╆3m &%1i:ʚ`=[ԴZv4tdL0鬗1{-f{knY6l\wyx և'wIx*W ]RdJ>kz0zA8^ielRGpZQHC s(O ")KmBQH5 "z|F^6&ɖU!.CVsijcc\Mk%I݇%7ef)A66+x±{~%s^zOܲ5Y\r\$fljiFSjk0n>i{ܱ_NOoag']٠^,=FBwIG%oB<+| n2L}2 bkAGrɨ,xV%B>űWOAj"f}\H  e&He.iDqy-[Wg+,+.)LXޔj0ޮ=3J){B+[z)SGNfU*$٘$͙O8F۱~ijUfXEf ׾ RR?3ΝDT&ۖ:W-*Qt[HuaiOp6236E*i"!lNVi/h^D\eIVz+?"JY_(Rz+/=A>zlr3o>$7HN(VFU8E~} сJ䅼UGHTCAjs죍 krE?3 au۷oI&Q6cO鶐_ֲN)Nx9DIH9qQ>jGV<RW#$FƉ*mBQHJwjṲ;_J _ȓ{^ OʿXu. ڟ^% ^Gִ ö́)l-O`m䚚3G4vvX`w:A^Lc?b*~P#62݆%W H7I-yUMVT+ͺ}Ji]<["'O(ar>ThZTH*';A:oQL_K͎1I.Zj [ef\|r4_nIs(e]6|"`�^Ʉ_0KZyL߻OȄNMeXݶh.홿 `fۿH7fRj$BFb=K険0aG}߰JHo PK3㰵:~1夙.#hd5mﺊ^J$U1swT1 =JޢzzK0dMx3"TljA [&NkX6qT:tW ƛ7챏l̅]V&5 gXcfВ/oOlggwٛ%36r7sazY·bLJ?1IV sOfdxwc&/Uvj*z ٙJDޢ9IAmyꋲ[5AB6:sNC)V9Mʆ3r54RuoVX*-sq ąʻxW~{&)/JUJqZ^[_1^Ǭ⭃ JG8AB6zLY賷q*wZC_{ᰵF֪/Wg^ ѣ)ziUuЪ/$O׻W'ˢGBHKdB^B>F$ˆ]EύNAS]"Zջ,/lBt*W|F:tж/Xfffnfk4ABNîiGll팍 $t0}`ࠡyo{<>ve'HP͞ñ |1uvvϗh 45 BBKo/m_0ُ wppaPV6v]=b?k6 >$Itv۶mZU!!%J;==[l ^TCiiiO<!hj h BҒ/zkԀ�2 #R%�8zc׆%!8l}!FW+zm-PFa� $�=1gϑ� $�jHÞk#20�BU � 4bt Z  yeoWs���5s�@H�hǒ-G� $4+/J3: �!WR)'ll(;y9Gh+2 �tg$}f;#ԇp?yht&�B@P8UN2Sr2M!/ɼ*<~*q\ �!WT( n?#0H72 �꙼Bw�S^U!*�B[\_iG �@H'\wy<C |�2 �tJ;Q ;k6Ыa�!PDDeCqLWxf+a�!PPG?ؙ_{ r2 �˶7#�@H@8s#�4z!1p=fr26x3\?B*-}y.?߰qnT<}Ӿ))%%%u,(c$jZ V;%H/m_Hᣢlw3ס!-Nȋt1& <Шk= &Mݺ5hjtFHZlqu<};n]--ʺ .<0o<hL[9ϙU-AH 5$dB!i,=B1Dwq:]|U6:~_#1ic̭ $.ky 酐^^B۾`{ ѳ_Aѯ]-<]x6p45 אaI'{ mzrƵUEв壧eQ)8| M B5$dB^B>݇BFϺUIbBl1zjVAghj!!Zu]-5<~dŔ] $\CB!$% w[0d<g3*LF.1b]hRՄ=}M B5$dB^B.L;N'Nҭ{=  ? gvb?}4/ZhɨK&zv8+.']?yOE"^gƄf<j{[5gNJ߽k#RM3\ȮA:5ljު^6Bf JE;]~+׹,;x,^f] )W /'_'V"͇$#\~pr-Zl|v63HDKMMS[v H233ec_ ^i\CR/vcXwC~! [R?�G%4.jfX^z+B$ ? -?;zIA,=k0^ԂغӪVY- kTĬ}SlHwYt]Uqw]CQoBY[8 .SfxOU'($$/I/// P? BYԖgF7ٿuHlj=9f=XӘU[v{!Q\y?39RnCjjS1|^l)^i1&@nRvY szMMKM/C̴_.zwb_I:7C]S; ;S]*[g-Q)TgxB!dWrm^ByG/QK!U'j4ABEfmLm}%=hjcc\M;l Mb>d.fY$Y}}ЅM`ǤMl ^0ϐٯd[[f6+VkїhMM呸1rR~)z4:>הatezV% %SǚMxT!۷[:6z5:0<Np9qJZ�G\Pe5 BNP.3AG/vIg'GkJ ).GJ?5mj!MϪkL'ҭIvL+[z)?;LDɬJlLjvM3p滗cFԴZvʺ!u|zC"*TqmKG !Ѹ7Lg!Yyd>A{˰zTiwIGxa B*L׻_y| c PxBӺ!A U_4hǜVԔ^]UQ ;v njZʰUPf>>7^C{gqxT[cy]T7e-D:ΰJ GeG/QSvUfXPߝZxC嗤R'HdǞ�nSӝ˿[]NjXlHdcYf,$Nl־5kjܲ3~& E]x5]`oίC>bwy&|VŭvՀ<ybz 2݆UW.SYeԠ"ZTH*';A:oQ<I@d3r]CjՖ9I>1)^w- O=Qjj'A'X{c6=Wv2a| wiS+INlxY k<ۖSץ=wB똙|/ҭh÷";54w"_p_1@!i;Ãz1FLCɰ0)Z8jD-}W'Zu$$IbSH㧒=1oԝ,=Y=ތOnG)lⴆlÏVljԞ ƛoӲq٘ wCMk>Ú.'IYug9Nֵ={Y2Cn+:*_mٜ5}/|-UZO&;r,2ݻ +2\4T keRklt M%읆vSjUΛ gjX*U&oEGOAQrkc|A!b[F td-[O5)t {vZqwH:a Ъ/+" 1eѣ]p/;ƽtЪ/Wg^ ѣ)zi!!.ZuqzdYT BaI{ zMF/v=7:%M BaI{ {U6AB!:K+>#M Bj אddBz{ meffvflfn~ F$4:{$:8)) M Bjl媈j=^^B۾]\\m``0p=~$fGI:;;KTev?B!$% &14342j:nPgͦaG$iΝ;n۶M*BSHw)w2 !5f!iwzzl/Ҟ<y"C ]>(aIg%_~צde8$(26z?/�T{%n �@H�7S�� �sjI�@H�;j��B i��ByQ8g��@CQ���Œj /#[�@H�h rq5CD��bϿkJ�@H�4j8'JGZ$ \r$" �BHzq'=~lNPv+T� $�jΞn*;?yՌC>H�@H�ԜUFK6F@'2j5/, ' 1n �@q\-ZDP甓hH7?ݧړ��h,EH"uڍV#!U.#�!P3h E[kvv ^>{�!Pm&70RnLN@v�6?|oc/JĀ#]� $�͔ў|ZqY�!P=?k>2 ï�!102 #Ris~itv|}HII-))c!mLF$~3.B}!¶ﲙf͸^N 73:m#/6ӝƌ0`0CM:v24uְ@HKdBj$BҒ/~?|X4wg6o}>pOј)vjnQvnQ֭GW|t9ᥜ?xG}>dy\j M Ba.$g\Q1f㏜7_硋F/P k_$&mQZZtж/'={zBlgPkbsW f*M BBw CH:Kh|ד3ݨ*:.=-JkhjKdB^B>݇BFϺUIbBl1zjVAghjKdB^BnԹϿƕG"bUL5Ѱ tЪ/gdupvo9μ^0AB?uZoiKV&Oe45 %2 !p/U_]띿r'xuֽ^لI3gS>e×c-4dԥI;tjo .ɼ"/J%GHŽOSpg[5=։-Z3\/ 'vawF2\ȮhBM[KFH̰V}w]tco:weBt{'wKBlڹ+2:!=7JAKBJw_dό*֥'8/݁ R'jRST륻ցR=L4a1!O?Ð-iX-F~?_F/q!U3ZM&H^)'DOiYPK wY_֝VRonX"f훚f3pˢS^FB`oBY[8aevN }E>eW kTOH$%F,F?#Dȣ'|@cIDd}hjK3ٛ:|$6؜ XyKKiLu֪-{=ې(<͟a)!5)Im/S4ymWM\7)IS֬9TJ ײ#fڇY/Og;o1ۯ$q!yk}֮ )]^Æaɝk螊cꪐ&T^k ~QxzID-T kB 31Y?jS9Tj5Z洆5g[BXK(?YkVbta<X1ij>( 3d+:{b䖭ټ %1{e(ZƪFSjk$n>i{ܱ_NOo5g']٠^,=FBwIGԱ&o=+U!MOA`2E/I UfXP.$ 2$xa4zf~|| r㫿\Ӧޔpt[+݊dδtL$,zƤf״9 g{h;o:MM}wꥤ~gl;_ސ UjQ'C+a!AIx=y˰zTiwIGxa B*L׻_y| c PxBӺ!A U_4hǜVԔ^]UQ ;v njZʰfUD3T}+ƞ+n%=4^!)BvY:'7ѮdEiQiK]ָ/w+P% <<>}夆EIp /;|̆D6Ƒ5mBfa[)l-;#>鷑kjBL0pDc+5a v;K<] Uq~GlҘAHpnvv~: 'ܩج_a2z MMjPa-B*$ Qit ~T(MDN$ \2ؙhή!j̜$ޘ;FwOC(j51+;0sW>Ǥfn'6tجOHST5]ZmҞ;quLYq|Vl]4fc62<aXJ4 Nzem@/QiɰV}w]d/I%_Թ;*dO=u'$KOD7#߭xCӭQsE 8a-*w:'Ħc&ka۴`\6샮|+Pnjϰ ̠%?Y4ߚSJd]۳7%3䶢s7zazۖY·ޕV* +eFԼЖaAjMNĜn B`yt\ +QD)(J~m/(\u\l:(q\c?gi*&2JgoM_]W=E>z cʢGT^v2{p/U_]t$bKGS' $ %2 !r/U_]'H(w:OEJ $t0˽V}w=|N&HH !D!$% ֫wY.^*W T/t45 %2 !F/m_n݌-Dh]'rD'%%AH.aI'{ mwqqACg޾x|ʢO=c.1b$m윟/hj ^B۾`@(===C##-lf9z ~l6|Iܹm۴"45 BBK4!iwzzl/Ҟ<y"C $ F/@%_~צdFzɰmtpk����IENDB`���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mitogen-0.3.9/docs/images/distribute2.graphml�������������������������������������������������������0000664�0000000�0000000�00000134201�14656664731�0021221�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" standalone="no"?> <graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd"> <!--Created by yEd 3.14.4--> <key attr.name="Description" attr.type="string" for="graph" id="d0"/> <key for="port" id="d1" yfiles.type="portgraphics"/> <key for="port" id="d2" yfiles.type="portgeometry"/> <key for="port" id="d3" yfiles.type="portuserdata"/> <key attr.name="url" attr.type="string" for="node" id="d4"/> <key attr.name="description" attr.type="string" for="node" id="d5"/> <key for="node" id="d6" yfiles.type="nodegraphics"/> <key for="graphml" id="d7" yfiles.type="resources"/> <key attr.name="url" attr.type="string" for="edge" id="d8"/> <key attr.name="description" attr.type="string" for="edge" id="d9"/> <key for="edge" id="d10" yfiles.type="edgegraphics"/> <graph edgedefault="directed" id="G"> <data key="d0"/> <node id="n0"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="88.0" x="225.0" y="137.0078125"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="50.01953125" x="18.990234375" y="5.93359375">rack12c<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="88.0" x="165.0" y="-38.9921875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="47.072265625" x="20.4638671875" y="5.93359375">bastion<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="88.0" x="225.0" y="32.0078125"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="50.5" x="18.75" y="5.93359375">rack12a<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="88.0" x="165.0" y="-110.9921875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="41.060546875" x="23.4697265625" y="5.93359375">laptop<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4"> <data key="d6"> <y:GenericNode configuration="com.yworks.flowchart.dataBase"> <y:Geometry height="30.0" width="26.0" x="401.0" y="-110.9921875"/> <y:Fill color="#E8EEF7" color2="#B7C9E3" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="11.0" y="13.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> </y:GenericNode> </data> </node> <node id="n5"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="88.0" x="283.0" y="-110.9921875"/> <y:Fill color="#99CC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="60.1796875" x="13.91015625" y="5.93359375">distribute<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n6"> <data key="d6"> <y:GenericNode configuration="com.yworks.flowchart.dataBase"> <y:Geometry height="30.0" width="26.0" x="401.0" y="-38.9921875"/> <y:Fill color="#E8EEF7" color2="#B7C9E3" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="11.0" y="13.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> </y:GenericNode> </data> </node> <node id="n7"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="88.0" x="283.0" y="-38.9921875"/> <y:Fill color="#99CC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="60.1796875" x="13.91015625" y="5.93359375">distribute<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n8"> <data key="d6"> <y:GenericNode configuration="com.yworks.flowchart.dataBase"> <y:Geometry height="30.0" width="26.0" x="461.0" y="32.0078125"/> <y:Fill color="#E8EEF7" color2="#B7C9E3" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="11.0" y="13.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> </y:GenericNode> </data> </node> <node id="n9"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="88.0" x="343.0" y="33.0078125"/> <y:Fill color="#99CC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="60.1796875" x="13.91015625" y="5.93359375">distribute<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n10"> <data key="d6"> <y:GenericNode configuration="com.yworks.flowchart.dataBase"> <y:Geometry height="30.0" width="26.0" x="-67.0" y="32.0078125"/> <y:Fill color="#E8EEF7" color2="#B7C9E3" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="11.0" y="13.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> </y:GenericNode> </data> </node> <node id="n11"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="88.0" x="-11.0" y="32.0078125"/> <y:Fill color="#99CC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="60.1796875" x="13.91015625" y="5.93359375">distribute<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n12"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="88.0" x="107.0" y="32.0078125"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="50.5" x="18.75" y="5.93359375">rack11a<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n13"> <data key="d6"> <y:GenericNode configuration="com.yworks.flowchart.dataBase"> <y:Geometry height="30.0" width="26.0" x="461.0" y="85.0078125"/> <y:Fill color="#E8EEF7" color2="#B7C9E3" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="11.0" y="13.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> </y:GenericNode> </data> </node> <node id="n14"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="88.0" x="343.0" y="85.0078125"/> <y:Fill color="#99CC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="60.1796875" x="13.91015625" y="5.93359375">distribute<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n15"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="88.0" x="107.0" y="85.0078125"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="51.42578125" x="18.287109375" y="5.93359375">rack11b<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n16"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="88.0" x="-11.0" y="85.0078125"/> <y:Fill color="#99CC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="60.1796875" x="13.91015625" y="5.93359375">distribute<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n17"> <data key="d6"> <y:GenericNode configuration="com.yworks.flowchart.dataBase"> <y:Geometry height="30.0" width="26.0" x="-67.0" y="85.0078125"/> <y:Fill color="#E8EEF7" color2="#B7C9E3" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="11.0" y="13.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> </y:GenericNode> </data> </node> <node id="n18"> <data key="d6"> <y:GenericNode configuration="com.yworks.flowchart.dataBase"> <y:Geometry height="30.0" width="26.0" x="461.0" y="137.0078125"/> <y:Fill color="#E8EEF7" color2="#B7C9E3" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="11.0" y="13.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> </y:GenericNode> </data> </node> <node id="n19"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="88.0" x="343.0" y="137.0078125"/> <y:Fill color="#99CC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="60.1796875" x="13.91015625" y="5.93359375">distribute<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n20"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="88.0" x="107.0" y="137.0078125"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="50.01953125" x="18.990234375" y="5.93359375">rack11c<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n21"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="88.0" x="-11.0" y="137.0078125"/> <y:Fill color="#99CC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="60.1796875" x="13.91015625" y="5.93359375">distribute<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n22"> <data key="d6"> <y:GenericNode configuration="com.yworks.flowchart.dataBase"> <y:Geometry height="30.0" width="26.0" x="-67.0" y="137.0078125"/> <y:Fill color="#E8EEF7" color2="#B7C9E3" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="11.0" y="13.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> </y:GenericNode> </data> </node> <node id="n23"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="88.0" x="225.0" y="85.0078125"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="51.42578125" x="18.287109375" y="5.93359375">rack12b<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n24"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="11.0" x="482.0" y="58.5078125"/> <y:Fill hasColor="false" transparent="false"/> <y:BorderStyle hasColor="false" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="3.5" y="13.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n25"> <data key="d5"/> <data key="d6"> <y:SVGNode> <y:Geometry height="35.484542934485205" width="32.2024545674844" x="192.89877271625778" y="-162.00238804439104"/> <y:Fill color="#CCCCFF" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="14.101227283742205" y="39.484542934485205"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:SVGNodeProperties usingVisualBounds="true"/> <y:SVGModel svgBoundsPolicy="0"> <y:SVGContent refid="1"/> </y:SVGModel> </y:SVGNode> </data> </node> <edge id="e0" source="n1" target="n1"> <data key="d10"> <y:ArcEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"> <y:Point x="209.0" y="-23.9921875"/> </y:Path> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:Arc height="0.0" ratio="1.0" type="fixedRatio"/> </y:ArcEdge> </data> </edge> <edge id="e1" source="n3" target="n3"> <data key="d10"> <y:ArcEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"> <y:Point x="209.0" y="-95.9921875"/> </y:Path> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:Arc height="0.0" ratio="1.0" type="fixedRatio"/> </y:ArcEdge> </data> </edge> <edge id="e2" source="n7" target="n6"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="44.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e3" source="n4" target="n5"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e4" source="n5" target="n3"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e5" source="n3" target="n1"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="10" fontStyle="bold" hasLineColor="false" height="15.77734375" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="46.5537109375" x="-23.27685546875" y="13.111328124999986">(300ms)<y:LabelModel> <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.5" segment="0"/> </y:ModelParameter> <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/> </y:EdgeLabel> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e6" source="n1" target="n7"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e7" source="n1" target="n2"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="10" fontStyle="bold" hasLineColor="false" height="15.77734375" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="43.78515625" x="-4.568634033203125" y="12.611328124999993">(250μs)<y:LabelModel> <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.5" segment="0"/> </y:ModelParameter> <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/> </y:EdgeLabel> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e8" source="n8" target="n9"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="44.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e9" source="n11" target="n10"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="-44.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e10" source="n2" target="n23"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e11" source="n1" target="n12"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="10" fontStyle="bold" hasLineColor="false" height="15.77734375" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="43.78515625" x="-38.63905334472656" y="12.611328124999993">(250μs)<y:LabelModel> <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.5" segment="0"/> </y:ModelParameter> <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/> </y:EdgeLabel> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e12" source="n9" target="n2"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="-44.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e13" source="n14" target="n13"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e14" source="n23" target="n14"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e15" source="n12" target="n15"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e16" source="n12" target="n11"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="44.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e17" source="n15" target="n16"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e18" source="n16" target="n17"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e19" source="n19" target="n18"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e20" source="n0" target="n19"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e21" source="n20" target="n21"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e22" source="n21" target="n22"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e23" source="n2" target="n0"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="-43.863669958563634" sy="14.9921875" tx="-43.863669958563634" ty="-15.020771131556558"> <y:Point x="212.0" y="73.0"/> <y:Point x="212.0" y="119.5078125"/> </y:Path> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="true"/> </y:PolyLineEdge> </data> </edge> <edge id="e24" source="n12" target="n20"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="42.85528831480789" sy="15.017222708103716" tx="42.85528831480789" ty="-15.0390625"> <y:Point x="205.0" y="74.0"/> <y:Point x="205.0" y="120.5078125"/> </y:Path> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="true"/> </y:PolyLineEdge> </data> </edge> </graph> <data key="d7"> <y:Resources> <y:Resource id="1"><?xml version="1.0" encoding="utf-8"?> <svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="57px" height="65px" viewBox="0 0 57 65" enable-background="new 0 0 57 65" xml:space="preserve"> <g> <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3398" y1="3115.7266" x2="27.5807" y2="3145.5239" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)"> <stop offset="0.2711" style="stop-color:#FFAB4F"/> <stop offset="1" style="stop-color:#FFD28F"/> </linearGradient> <path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> <path id="body_18_" fill="#ECECEC" stroke="#9B9B9B" stroke-miterlimit="10" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51 c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-11.244-6.146-11.244-6.146 c-1.771,1.655-5.61,3.802-10.063,3.802c-4.453,0-8.292-2.146-10.063-3.802c0,0-5.755,0.586-11.189,6.021 C1.378,56.689,0.5,62.768,0.5,62.768z"/> <radialGradient id="SVGID_2_" cx="22.6621" cy="21.707" r="17.7954" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#FCB57A"/> <stop offset="1" style="stop-color:#FF8C36"/> </radialGradient> <path fill="url(#SVGID_2_)" stroke="#E55E03" d="M28.106,33.486c-8.112,0-12.688,4.313-12.688,10.438 c0,7.422,12.688,10.438,12.688,10.438s14.688-3.016,14.688-10.438C42.793,38.75,36.215,33.486,28.106,33.486z M26.288,53.051 c0,0-7.135-2.093-8.805-7.201c-0.222-0.682,0.147-1.156,0.795-1.521V37.8h20.188v6.663c0.235,0.352,1.109,0.737,1.229,1.387 C40.445,49.917,26.288,53.051,26.288,53.051z"/> <radialGradient id="SVGID_3_" cx="15.2056" cy="831.1875" r="32.3071" gradientTransform="matrix(1 0 0 1 0.0801 -773.6914)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#FCB57A"/> <stop offset="1" style="stop-color:#FF8C36"/> </radialGradient> <path fill="url(#SVGID_3_)" stroke="#E55E03" d="M49.529,51.225c-2.239-2.24-5.041-3.724-7.396-4.67 c-2.854,5.51-14.021,7.807-14.021,7.807s-10.472-2.483-12.387-8.514c-2.439,0.771-5.787,2.287-8.749,5.25 c-5.592,5.592-6.47,11.67-6.47,11.67c0,1.938,1.575,3.492,3.523,3.492h48.51c1.946,0,3.521-1.558,3.521-3.492 C56.055,62.768,54.211,55.906,49.529,51.225z"/> <radialGradient id="SVGID_4_" cx="17.0723" cy="18.4907" r="11.8931" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#FCB57A"/> <stop offset="1" style="stop-color:#FF8C36"/> </radialGradient> <path fill="url(#SVGID_4_)" stroke="#E55E03" d="M13.404,44.173c1.15-1.81,2.039-3.832,3.332-5.397 c-0.514,1.027-1.669,4.084-1.669,5.148c0,5.186,10.366,9.079,14.688,10.438c-3.472,1.627-9.134-1.498-11.334-2.359 c-3.601-1.419-4.071-3.063-5.89-4.854C12.523,47.135,12.878,45,13.404,44.173z"/> <radialGradient id="SVGID_5_" cx="31.8184" cy="19.3525" r="14.63" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#FCB57A"/> <stop offset="1" style="stop-color:#FF8C36"/> </radialGradient> <path fill="url(#SVGID_5_)" stroke="#E55E03" d="M45.777,43.924c-1.317-1.568-5.11-9.424-6.604-6.617 c0.516,1.025,3.617,3.693,3.617,6.617c0,5.186-10.271,8.576-16.699,9.145c1.429,4.938,11.373,1.293,13.805-0.313 c3.563-2.354,4.563-5.133,7.854-3.705C47.754,49.045,48.006,46.574,45.777,43.924z"/> <radialGradient id="SVGID_6_" cx="30.4893" cy="4.8721" r="5.2028" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#FCB57A"/> <stop offset="1" style="stop-color:#FF8C36"/> </radialGradient> <path fill="url(#SVGID_6_)" stroke="#E55E03" d="M30.777,54.167c0.357,0.836-0.153,1.983-0.352,2.813 c-0.256,1.084-0.072,2.104,0.102,3.186c0.164,1.02,0.156,2.107,0.25,3.167c0.082,0.916,0.482,1.849,0.357,2.75"/> <radialGradient id="SVGID_7_" cx="23.2871" cy="5.3008" r="5.5143" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#FCB57A"/> <stop offset="1" style="stop-color:#FF8C36"/> </radialGradient> <path fill="url(#SVGID_7_)" stroke="#E55E03" d="M23.695,53.417c-0.508,0.584-0.476,2.209-0.398,3 c0.116,1.183,0.456,2.099,0.333,3.333c-0.192,1.943,0.154,4.479-0.436,6.333"/> <radialGradient id="face_x5F_white_1_" cx="27.5835" cy="3117.4922" r="23.425" fx="23.0139" fy="3115.0024" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#FFD28F"/> <stop offset="1" style="stop-color:#FFAB4F"/> </radialGradient> <path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 c0.086,10.2-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 C36.627,4.945,43.59,13.158,43.676,23.357z"/> <linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="6468.501" y1="-12291.5195" x2="6492.1304" y2="-12384.9688" gradientTransform="matrix(0.275 0 0 -0.2733 -1752.8849 -3351.7349)"> <stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> <stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> </linearGradient> <path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M28.415,5.625c-6.035,0.047-10.747,4.493-12.787,10.386 c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.54,13.244,36.729,5.56,28.415,5.625z"/> <path id="Hair_Young_Black_1_" fill="#5C5C5C" stroke="#353535" stroke-linecap="round" stroke-linejoin="round" d="M20.278,13.25 c3.417,4.333,9.333,6.917,9.333,6.917l-1.417-3.5c0,0,7.094,4.691,8.083,4.333c0.968-0.2-1.082-3.807-1.082-3.807 s3.138,1.795,4.854,3.969c1.803,2.28,4.285,3.504,4.285,3.504S47.027,2.719,27.289,2.744C8.278,2.709,12.058,27.678,12.058,27.678 L14.695,17c0,0,0.914,5.757,1.399,4.875C17.861,15.211,18.861,11.5,20.278,13.25z"/> </g> </svg> </y:Resource> </y:Resources> </data> </graphml> �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mitogen-0.3.9/docs/images/distribute2.png�����������������������������������������������������������0000664�0000000�0000000�00000236002�14656664731�0020355�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR�������*:�;IDATx XTgZ[yo-S}wE@E5w-wwRSrܗM+sI6Yd_f91<`f83=}��������������EGN�����@1��@eu,\׷[n6FlmmX[[iӦSN >v+ ��`9 ��TYYYN9s]6m:wܭ[7z"Dcǎ3o޼Ç߿?==W�� r�� ju||3g&MdoooggסCWWWqwwݻw׮]۷oo1rC_YYY���z$��`ܹj*''';;; wҥ1cΟ?#^g���9 ��p???kkmۣ۷o~ӦMJRV����ʺzmN=J[^ڴicoo?cƌS���I��\Tp%uͣׯSNvvvcǎwE ��Tq$��`T*ݻw `ccS-IQݨQJ%?��I��ꄄ3fX[[;;;{ (988̟??))w��TY$��`~233geeվ}{rֱcGGG-[deeF����̌Jw^Qįخ];O��j"'��3l2++r2k9887.55��TA$��`NIm۶mٲݽsΎG��U9 ��իW[YYڲeˡC@ ��TA$��`6ju\\J@ĉ/��!'��s-ZtdӧO޽\]]ˡ(qҤIQ��*��Fzz̙3#ww=zjئ}6mʡ(_}m۶믿xk��@BN��f#>>C&7۷o+'Gmɮn[��r��0**<<E;w_v:v -}+Ӣ'o��:I��<dff[ҲW^fog;ʳpep50\mڷo_k>|��r��0iii|򉍍{I]tq>Jp5H}uYErz۷T*ɗ;s o��:I��<$''wYq>*trѩUE !|pmZpKN߮CVzmҧO<eI|{{k���̀ZkѢEԵkWj2%/ VW]ZvO׎uJW^⃘<NM#?6*'M0��T$��`T*---?ſw]{ΝmolhIץ$gUvʣ'SN$777͛[[Ym66{m.]I|Ov��U9 ��Ç[ZZݭ]%ޤ3Z:tpʸВ4!ICWnn};urttޭk׮],-۴.uҥo߾'999izc= Hxvڵj*55 ��T$��`6oliiٷo_7~-l[hѺukWWW[~}$MH~gffӯGVvڵѣ}.qwlR|w++vԩ[rrr{.o��"I�� ϟ?ͭO>-ZX[sqq6d%ni׿[֎vv6V_.us}\kd߮]^zOBZjOzumhk"q.]��r��0iiiǏeޝ?[nݶ]Ա�CNҶ$]Hef6hF{5N˹CK[kڦ\\ogޣs+'G;իK.V&p|? l2OQ{}o��"I�� ٹwh߶f-4{ip5AUҟ$.ZuF{uwW\]~~ >=wjɡuֶ6S<K >}k-[9gϞ_5o��"I�� ۻke߿C[9XX5Xt[&I-iԌipS7j:fW~t+5׃[!\[y9̦ݯ[[/!\Z$\ZyvY5g޽{چ6�*��@JJ"n G[ӿ5{[ז זk&.MEI/[S^^yT~^#'UJC][&,~TJ9Ib@ƙ9ƻ:۴mV_I��!'��3ҧO''ݻZ\>I~Wh."!ii:i ͍hүNbIh)DJQ%]N WJ|y>'/O8?}D۷۷;9 ��T5$��`{ԩcV*D89N8=A83Y8;]LR?minm%7MNo,]�N59)\IrBpaģݶ]VzݫW/;;͛76�*��@JJtC;ک変RNapa4gK~"+y('"$ns@%V'9)@8?W!uI󫯾m��U9 ��y+nkkvNN7s 7Vh&o$͚d~-('fI ݄ $}p@ζ6=��r��0 h޼umu2O.ϓ/ttB[~;id+X;'g-./ʛTskE}-z_x��@AN��f --mĈ͛7wmq}&'}b"'].HyWBs]M4pe79'-|9ipq~LȨ/Ƭp#��Pu��HKK:uj;Y[q0U8+ř•Fk4EFIRK,MŨ%t[n4K4O>MIg~1>:#��T$��`222,[quz!' $0E8pnp~'Y•�FH&I7Kg5tgi[8I49I{Y7Ist9i m7�*��@fffXX) 섣 9$iY..͖v$-A"B~i*GIkt?MsM7yi6' '& z%mh ��P��PTW\3 ~Uη1ܻq(EiK5BR4-I4if]RҤڥI&o4]82Bu`@ SKy��@BN��ARun ˭2vJ9)nJE颦(]'-SitjO5b2I4I^IK&-Ȼ4А]}��P��Pթq k&vmd@IAɨ(i+] я+4'[nOsPw|nSN%auwxg��@BN��Dg +lUk(͵7(MD%]W|!s)]_.oiIWk&Ig]Iaw>o%mɛ��r��0+[[g~/%)o5Jg5EIkӒf 3ڮ~./՜ݶh]e%#}3'Ä sǯO;��T5$��`VjUrtGۨ4AI>MWeJRTu%h>&-]+eKk..NONN J-;L/WɎ��T5$��`nr2~X*Ty ii}QG%S#~J)ҍL%D͟<>Z86J8')iIIy L\a�� "'��sV܊_:##4 )R IrK(K8⃈uR%ӵ\Kdl)oy7��@DN��Grl`蓧(%}T2=t!III'$yiqK-Mz`I=Y�� "'��3VeNX)yC;FEI3!*ilړtIZd(&$bhI$$횔=~U_>����̒:;3;z GFj3LI4]Čtrm4\8mI¡!9<BZ>j8K��@EN��IV=L镰6@)˵LIJdHK 1I$mK҄$CK,MG>-%}NY/��*��̖Zj†.ֵR};$WQ:>FRIӕ99V׏)OH2Z$4oúůtL=k��2r��0gV9|QuGHJF 6$EI~I9n-2wIXa:��TM$��`T z= 8uꐷrEQFihW$㐔:n9nꃃv_n^o(krQ��@DN��LM_> l.oK=HCr$:IKF_<-[}WQ?v+<Eww���TA$��`Ԫ{b>(js[0yv9_{J=HJdHK#%$m!IגTxflV ڻҫF=Q>uS%>����̓ZJ9Fe",.|?!:iSWn͏H4\"I2:-gGږ.˭.NLS'cUו>ROnT9��J!'��L=1b`alꟶ}ĠqsRC -]rW""mW2ad\$:0 swGk[%N\06H`gMSx8Q/Dwփx;��@BN��fHΉ5_Փf:(mY)'k>V%OMOշ^Clg7^9g#}Mj]3v19[&i9zk]{��r��0?oG x:ʻv~m^i˵9)sw_)ѺRTZiEnj=sySKRR};Hr{d闾t։!:{0eIg@ZQԐ>u'N|#һ^\ ��T$��`n꜇E{+b`QTۼTsRƮS؆59}jk)ggqúm钺S6IkV%OZ*mk;'٨HzgGӛd s��*��MvfUd8.'uݮ988ck.4(qcbvV;%i!m[ Gr]-s{$,T|T=vDUpuO7��T$��`VةM#TZ7e}ޜ!?yzg㥙>uL? s/so|9JY:A9A-UZ>H9Q͓��r��0+)GVF xZw[I{s 3:?csltr~ ,RZ<jhݸ9-��9 ��*;V'+ԒOvK[F+{SG Wv? O9+,sv}L%KCI+ڨ9|ow/Ǫ3Rx��@FN��fCmrpͤ9#>U#%6gǣyVe֪K9)ϸ"͉wq» F4ȜTIqßdQzy+v c\x��@FN��fBa?}D0U] u'xG}|; 9_~<;> c|6S0jp(+9IrYqz13,U ]��#'��HI2F9V*09-"=G ZזnM!|tDm:=3)䜚x}Ξ=u<|Qf7If3S^AKmR+һNڙM_��#'��sVe W+!ò6rp#F{狧ٳySK|73ħ9' g& g&mhfjO~МCۂ6ot`ޛ7oƉ6OP:M Rj^F$!NhwVUi��"'�Nؕ&4 uS᛺һrHODz׍޻O޾}6$~곜3 ?L-|ۤ߿wd{/BwyJRjI1ѱW(Ǽ]+ַES|^)礖Bh^l?E9 ��T^$��P9i7ߝҧN藔޵>mjoG 쥏oS/bkǏ߾}͛m]ui;=<63I3<3]KI3cͺ}h=K|j;w<}Ľ{dc.Rΰ|&ƧvwU^NZ落Eּ漟4HY/�ʊ��**:3^w+ }!zDٛ$@9fsaIQCFԉPNkŸXɝ;wΝ;o߾-[6rۂO oɕ}K~zq zۊ[oٲe_wkCR2k1߭Vj5Mo^^YzE63<0ڻVOhZ>2 ��9 ��THjU#xG +\T}20~ҖI6ٛv>4yc^5"YDt釸9ܾ}ҥKGݷoΝ;w#]ȁ{;zʕ;wBcV.sT#W I9)zEG(~*vx#1ZOx�@eEN��Z~픃kOy'+]jI~IT;e9)k'_Vh?ig0cǼ9VWS>'22޽{hܾ}ڭ b"޺Ψ "<9Fк ^]Eje1F{z4 %Vi?1C3��9 ��T,jUNK[+J4g`]Hή[DS'~3Vlꕽ5F 97clz~cEG5Ʃ+ DxՊrEO/.Qo)u]kVO,fhuvRskae|>bp;KzG ��9 ��T rK3wYi[a5B3#ü消|s,3Wwu:n#׊ {pݛU{b9'-G0R9݈OkIz6jhݸ1/XTo^CӒsVOQOa2f kr𹕰RQ#1=7V��Pɐ��@VyΔI'i 6,J҆IkdG 3f^-gm9b^Tz׊|ccKJQә_Eoai9x '^:%I[&e/oT9f2}(,s@{)'i(Y [6K(9eD�� 9 ��T jUڽw(hZYR$We<9;(QC%LwWO~CjE6Z?"؟x&cQGNl1Z$Ѿō}3WtTWGrVu\b05WQ/f-9is|7)'irQsKF}a��Pi��ORe(3rHD5tjIgt4cftΑi$zD(:Ǿ6㬥l+nd(ZkFNlNwHQCjG =^̈H<sEFMECƞ򢤜U3:>u}$MlneIA&rT4KJϬ䇼��r '�:+)AȠ5˰4)oKU9*X0/*}Ďx>n?'EwT|&fx1/%Nwʬӗ8f-oZM:M =5+zV;gXlFy׎ۨW1l$qT=|wx�@%@N��3UfzܑCjMx3g�MK9-wKW$i؜}+\H헹yc^tԐG6Lfڌw+yXd ^^5{EDŽJ[d#Ѷjm3:0~+IpҞLjEm59.'9ߍ۸(e}?fh#_}n��P ��II።GjwI%BҸ}f+TFdlpLbG39w(:$s>\*cIof-k)}ͣ}8u| o8_U:C:WuvJIݸ I¢3ޑ<#/t��`I��VeDy{J3O6!IrN,MmԒ4!iܓ(ҮiFH]␳upJ�i՘/_1ڷ^F ^P-ʧNܨD/%Zs8iRe5.5]ԫ;I\9nsE?ZZw׍Peg��FN��UFꃭ#j$Ԓ¼ gwM2>MZiI&jf/;MV:GH -wvUye{4*~[=AjQC=zҴXe.k#mل[tN!'uTʝ4(}[oğN��FN��4[;QnF9)nIkCדss(Igshi!IAmNRNm^/69zʼ/\ա}hwrRw]NrΗ$7&k>͞��FN��:QZ+J[F;ҙnsn}Nʷ49Lffh)(=YIIarNr`&6 ֪/rR$is'!u���拜��ꜬxJTvJraQN}h5ʑϡrwAW5]59ɵ89MqstyDzc|h ��"'�rVg%F6R]'suIV'w42٬PV''hz6gksR$ɓ^{0ֽF���f��ʛ*;+lXĠ SU}Y`Nڕ;'iN`;I:MߒqNjjԠ^5C;I:iFS{ԻLNM ��"'�򖝒pkһvfH\9)V#䜤n+nݤoIyOsxJ`;g+Ms>oʹЭ3'YJ_R|3���sDN��-}8MՖմ9i.' rN9'PJHJ=-Gsj_E^52YįGbAi 9i>'urҚ9iڔ8' ">.��9 ��Fz=N<m|Co[+J&JF#}d)IG(F;in!3<U_PmvO[*rE"{]NIu9('u0IV2\9"$&1*��!'�Q#^_ >xqQҸ\!xפݚ}hfRN=>ܞR̒rRK)'-sRmNZTNImu9 yn9'Y=6'5~ܜ��`vI��E HTCI%O݆hw˵!w+<-IkDNȌ"?i@/-ut[z`+n&rwNԮМه9I/T��`vI��EFI>Ͱ@ɨ(JG%dԒTy'L{O93ݶM<MNjY>ܚb}ۨ[r.'=nr'M~#b|?���CN��gg4Umr.Pr`JF{rEIGI;5 ivEv$CKmVν4ivi1K{'UO]`{$>^-wN ,~NZqi��0;$��Pnm9rp˵@I*Jě(J~J~$$CKR+f1#_̻kK1k[jg&)6Nʻwu*JKoא��`vI�� 1Z'd[dREɰR)B%3ڷAW wMڬI9{#ʧj}\g8)>ڜdW˺ g~/fX^2��`vI������(r�����������b '�����I������(r�����������b '�����I������(r�����������b '�����I������(r�����������b '�����I������(r�����������b '�����I������(r�����������b '�����I������(r�����������b '�����I������(r�����������b '�����I������(r�����������b '�����I������(r�����������b '�����I������(r�������@GTj͚5GG�9 ��_ R{@N��;SO)^~a*ۈU<'S/2Le{��@S[0m^z$՗MI)==Ν;Ν;~CB &ҥKx@N�Dz`I$!'UleOOO''ƍרQVVM|q<<< _* '�@Nbr9aI*<<<00+m}]`ggg.��9aI$!'Uh֭֭[ڵ >/} =n8/ ςә~c :Gow{&m+=6-*o I��DNbrRjggg2XX{>}5þ;~?(my"a4?'IK;也xS3>p\ڭ&wrZXX<''0Ά9 ��rÐI CN)1cԯ_?OiNf^푳<H,a iI$ί qoEmsx:v}UÆ Ǐ/3oI��DNbrRyKNNO&^tʽ Ie֒Y;\#v΃Cy7R<怀�V*��9aI$!'sν[Ƨvؽ{<YKͨ%CɖK-'yQ3Tƍ9r��9aI$!'jժC#x~tJ[>$.h$t'^ߒĹ!covڃE`` 9 ��rÐI CN*C>5kqyBR)Op{$ui[ŋ'I��DNbrR8r䈾 :~LJQ[_ĭX-Gt;WK4WnE.{_e '�@Nbr9aI,==]_Ҕi䐔jI&7.YKACOW^agn�� '1 90R*k[RiIOx_ xrHӒ~7?THH09 ��rÐI CN*MryVZq+zK*E܊ؒ4Wҥ 09 ��rÐI CN*M53ի~/-/Vd7t?=xzI��DNbrRiYg뮯K"n%kIE[-oq}-?Zj3�� '1 90Ģ2[[>$kB<t{'5lؐ��9aI$!'_]7.▫%EL$H|v $��I CN"'1 945nXad?$mq+%U9ώ��9aI$!'~NW9}W"nE-CcW>9 $��I CN"'1 9r+6}U[/\-L/fܒ xyna=M˯@N�0$rÐ0'Q&oq@~E.]{mMۆm_IW_coŒ@N�0$rÐ<'snOgխ[x9lذ=ݺ_.aC{7Nz>~O߽|+@N�0$rÐ!'ɛ%]<MH]?c~Tċ]ĄRGUn=C˷bDN9 ��rÐI CN*g_ Z^aEKSf\s.şol<it6ckf53 ܍rH|SےI '�@Nbr9aIe w, ҵgZ+vN{ 1f-Y9o4sYb΢3 =w~tkniMb_fm:Mx­+!)wKHN9 ��rT%>),0*'娄. 7I9݇1gq}|mEyy&tmN\-N)$].%]5r��$9RX]p#XGxa^xp׊m!q{Ԟ?_a']mae+=]ZKK~FM$$l ?E\=o%@N�09'娄 WMy<+69!'х_!Ba)k+菶>'%*x 7>s}c,^^{9nq7?G/vwuLX}Kdܒ~ն $�� 'UG14rR% !I)nr ['}\Uc+ZXRDžshI˔*zN2 Iy[_IO~7IẐTܖDN9 ��rREK+,A9mi\msZEѮ49FM魬V=ǛD8W _uGU1ɣLBIDH(v衊IOڒJt'jI~!'��9TͦC}*hN7į69͏]7sIOTN+$㍷ oITҖ0oK2u[ZyrI��IEoAN9IvAmSawj9GaKi2?ݏd ZLAP9IBIl2sn9 [[J% IrK"'��9DN2לB]rREn1䤊l]T$}K*%nIEx1qߒI '�@N"'/'f;pI$=l2y<9e)'%=QK*%lINpϹI '�@N2vŎ�ņ�?=L2"Q+)sEw?(eBax:Ki yH{$AG. f;pW4nb,iK!s }LN >XvJ5ukXŀi y &ntaIg,?C.J'@t1ǐ''->,K1+2yCLOx>?],C+<c{Il]TM$3[DN9 ��ryo0#ů޾f ^O(~*]įtl޻leGuw(:ژo+.3}%8*v!Sw64lA\߷O=p#en=bLSo9I7FS;)мpg,6u+naz|Mu*B>yRXv^<^y[1~m%If;pIՒJ"nEoIDN9 ��ry$gWO?SSQ\ttF{F+:i+̭CsR<EuçĿ9~0U0'emށ|sRṾk4&-<s)Ə&28EIVsj%BI:#|rPEOws$}ǛwN*6Tq+%=E򷤳?@N�d9ih3T 禭xQkL5ml:}+ל8/xDE}/U$KJp0U''kd!ʶ}&|{&>B!'|WZK5{S7 `jY$?.B.Jg}>WylNZ|Xaɯ5J')@7+brߑxGN6nB 2gCĿ?aNzSMӶΛ9Z:6易vqw஘?ڜkOڒ"nm%@N�d9IuLOO<5QpLM3j=H:Yԭy]q&dGa҃oK`*wNVsv!#>Hj?ZOY]Ty[_%" v-I}SHa9k#SL|!N_}!FS6x椧2q6٨e>[;FH%I} ~&/S|v /3miѷ.|a+쏶qN*%=EܮE$rI��2'KʋRmhSۘ,8~}M˧IEIuazG鬽t9J: .9H׀ˏIOͦow|1rT\5eT[|9e_Ӈ؜`2Ih?^yӛsK�s9Nj_lZ 6m}N*E܊ВJ"n7vO|r��$;IuQz;O3Yp·lUnZm>|t'Z}_;7mIm=LliZf$�^lBrR=f2}Ge*ÜocrsE;-.I5OqB6"^q-qߒ~1r��$3[<'jµaǢza {ArRg;ǏL.*T3gsKkg!KI%ߙcVx*jNZ~&vKϿ$-]넲ߖ$'=cQ :;2I:zIчn[q?h,29fY2>$[9 $��I杓v렰y_ڤoM%WPNj5uRKx?T]iK&<&nF97 JNE햌/v3iEߗ0'i7'5|UEWH9IWol7^/sR]-l.▿%!'��9LsRY<߯=/:E9]a_ֳ&XPNW[sEzɧJ`fN%$ [zT(, *bNg!:n˔p)IN* Ig yC*Ԯ9)Ú]NefIX]%,'"nR[[[9 $��I暓£Lib냷 T3qZA9Fڏ~5}uʾP SsBѷ.hOnrR&o G39T2Lns)S.'5hIϖꤞu[Ow9Imu'wI&[R_ĭh-xqߒ '��9 sݕş[ENl_.^yA{I z UTyPW+f *6z9I?.Htake 9}l;GU/'w$G**ݜ$+vO<9'kI~"$㐤iIoD5"'��9rRV.Nw]6O{O"qK\VS8L{K`Iyq '央M2.A5)gvic鞣M?TYik呓DYenդ/PEI}ƚ*y&`r$Y{r[-qߒI '�@N2˜FKM+h!'.(8SLѩI^.>~f5*p$ <ɩCN*HuW=('ܥltCZ`Cɟr#sr`&-֥sRow| |N5qޟ<>'y 2l#4X{*sN+| '>'U܋%@N�dޫ{Mbjiդ'j?W_:ϧlgQߛI=rR ٮ"mF9xPiP[[Bsi:=[[rQɏZ~N{҆d\x6y2c`<v3i}Vϊ*oB]wEޓې"nEoIE[t꺒r��$IZ4ްo@sk|*޵U,?&}\o/-O)n{1ѣ"OuS?n7d󾴗6$5u MXCN*uW=+'ݧYW]Nn(b4CK*bNZ|P(Ɔh3\uxǙm#iIO1dn$QA'l (*qk jF:#o)R&\Q~/E!O!7Qi!EڇUYN*\+yrR2YSo$JrI��n#'q߽DUu{iF[3|J� "^x$CN*<uW=+'3q!nsvE܊{ttbW!/1>K.i_O?m]Lx#x <˗<qlR}= HNٮm>E$rI��5'eSL &'tSonp,DA# x�\JWء]Jڤoo%E{Ki|!'vsOnI" '^Ŀ;2Gr8;UN_3p>{uɗ*$ڦ_od3w=G? i/VHN*)QE~:<,NUVtuW=9t[RY]-_K:m%$'��9ɬ'2hG4ɂ#]W<ž1NJv֏A1޶,T?ߕvV"',=&]b{|vXg9iG!�, k#~ű!R2YTfG⻸-G<ɡck>a-Ծ&22Izwb ݾ!'=%EnyZk$�� 'USp8**9$9\q-.IDN9 ��r9!'T>9-\-K:AN9 ��r9!'T9$q /狸ВNjI␓@N�DN`I$!'mN*%E܊ޒ~-D89 $��I$DNbrRY椗t9FYRۙ7ޖOpӷ$�� 'U G  90rI&[R_ĭH-8qߒI '�@Nbr9aIe"nҾ[-xaI '�@Nbr9aIe"n%jI]-K:vr��$!'T9Zғ]DK ےI '�@Nbr9aIe oIezOv-rI��DNbrRYҺ[l^ĭh-(9 $��I CN"'1 9LsRފ\-_K*E/ޫ]z-ar��$!'TtXiO鶤2 S!InIGD#?)WWWar��$!'TBBB[яkI"nyZ84Thh(09 ��rÐI CN*M鯼_ S/v-iT[f '�@Nbr9aIl޽ C.ߌ*׋В%t?#G2�� '1 902xb}_3+TFq['4H,'I��DNbrR Vb~Z~K-.v/vJ{yWn!,I��DNbrR;rHƍ |,,,uziIq<-)h}!I/ܹsc $��I CN"'1 9ԯ__a˯,ޒL {<~)rr2o"I��DNbrRyS*Ǐoذ"5hy9ד"^k1~c7{T3F<f8�� '1 90䤿SzzzXX”M_NGp_=y̯%[twt :}_1مɛr��$!'TƆ֮][8|^skN\<>~ٟY&TM4 ѥ>yw4|[n֭$��I CN"'1 9Bxwsuu :I��DNbrJOO prrjܸqjJjԨ!>8cnٲE||e9 ��rÐI CNܹsҥǏСCmΝ;'ޞlr��$SOIx3L%{Jśa*S$��*(7T5^rVs6�r��(}͚5{mPor~~���RJp",+��P$��P圾!4���FN��U_}��I��jmI���(6r��Zwr8���9 ��T!YҖI9iZ^��!'�*d\-IÄ$^��b '�*ܼ9I���9 ��T7nhIt$xy�����iM$q^��(*r��$ߥB���EEN��UB[<wH���EBN��_Jp򘜴`��@��@wcZ8Nc ^*��#'�/9I'y�����*EjI��x<r��w5';/��c��@e%mT4e-��c��@eL1Z8- qIl���!'�ʬ$q��Pr��n.vK$!Gŋ��{?>+^255%i7ZR]̼GkDK.x[uEď)w3ax%C˃{<0s>3<zؙ3g|f=/"N��>kjG$Q;x���f'��tT+8)v��`q��M)[-FVhB���mI��R2lT4u>@\u殣��'�� (|P'}i鿿TЇ%h)���`8 ��%Px7y6Q_Y A7!��4'��_ST}wbLPW7���0E��|w)&<RL2{ hN���cI��ِn޷+iQ���cI��d׸o!t ���jI��L_qwc{Q��j N��JGnϴ+��@ I������q������@������;'�����I������q������@������;'�����I������q������@������;'�����I������q������@��jIQQQ-ϟ7}ƭl\߮kӆ D���^8 ��ԒPN׸qReaEEx].]%={%%%UVV:r틈ۤO��I��6ʁN||ʕ+<NK޽]f%Kh߷orgVwi|H�� N��nWQQѦM979y|ذa:ģFɱ~\\+ס=zȻk.>*��+'��[t+ ?;;w˫nٲ\,Too߾C3g,//߳gOV%~~~Νsl:t��q��p.]ȉ3gԌSSS充={*˕J={+׭"erss���G��kϞ=J\,xbFF… nj^?%%E3NJKKS6RoGY>`�VN:WE[,Ύ 4hoFw5A1bĒ%Kn޼is+vqbk˖-qU]��<q��peV5[4hf%e;¦MOiذiӦ)oذaȐ!Fc-l277r`\uBzzz@@M3zSL ��<q��pYɨQ,VPPe˖(%y=zz#F(eggRTQQaqR֭5 F7oĉ h֬:xz222Gsrr���G��ʕ+JPpB kFFFSh% 8Pyt=]fqЭ[7񬲲 7r\nnnIIĉ}5JjLc'6/+]R߂d>6��'��7R k(ki&))K<$JfqRÆ .]CM*)  LW~ iii999FIt_2����*˶m,ѻwoeΝ;_|YYBB~jdf4h z))r+ 7n)rC) 2 ��pI��ϟ9r )ٻfd4\RRڵkG W 6;::z[nJ��x8$��FqqqJbtʳÆ SnٲEztm9ֱke}8)::ZeM' 3fЙ7`+We��G��7Tb,PZ$8G67 S@@2+m6e.NN<oneeD'z'��G��h͚5Jk.C6mJJJ3foa,uI-R.]TYLY޻woVֻ!NR?~\@DDzF9R`` c'��oA��(##C PS^秌a5zxǏۧٻG=VLٵuqRiiTjj؈:ƒߗM53��G��ܨ@ PRSS͙3GQH\5P?]vFlCYʮΝ;,i޼_ʼu~~~ꑤsg-\ ��pI��5k&%111奥۷Wb??֭[7nX}GQ{Oh˖-6l]xxEŻ^jմiBBBl߾<t���8 ��WddǏ(fӭ.n8,,,nݺu38Iy VVV��8 ��WZZQQQ~~~%446pBejٰaMgʮ[M&Nx WW7��^8 ��Wyyrٶm4שزeKFFFvvQM/))qʮuE}eee:ujJvZ>0��'��Frrr A��#N��n/'&mڴ5?^nDZ��x$��PQh ͛77o.g:��g"N��0 @s~L{…��I��̟??ӧO 4��"I������q������@������;'�����I������q������@������;'�zX~_���88 ��S笯w1Ҧ ��+I��L]^ji+8IײR ��Pq��)yRTߴW[I,?QhQzI<9j���q��5%JI|;ۉBKC%<��0F��|ͦ0H.)۔'_9��'��_SSu",Wݦ.+��OI��]g 6uʧ!��4'��tF<dzm A+��h#N��)vD),A~m+���@q��M;ZJ,Wxe4!��6$��~`4'��08 ��Ig.x���f'��UrC2,i<Z��$��˦;Nvf��8 ��''I.��$��K#NZI��XA��|ܦfI!h0���+��+I`S4y��`q��}s'ʧ���#N��%YR ��&I��^]d%NZF�� q��v%XF#��؄8 �� TN1'I���lE��f3h���['�>dF4vm��`$��PL]'m;B���؁8 ��#yYғa���`;$��P<X#NZI���؇8 ��/VgI!h���'�'}X!N���q��w3Ii ���'�z%)K AK���88 ��裏A-̾N)88S@��\F"סnm-hԶm[NmS�q��p5g(J|y(W �$��ל[KQVmq~?|ZM'��$"N"N(:R^^~޽{֭)楧u9"ֿ~:M$��($$"N(///---11q̘1aaaAAA5rx*(t}*45�� N($$"NVyyy/޽{޵kרd'�@DQIIEѮ^jժÇ~s[ٻϳϿ0ۂyW(5wD坤 SǾ3/m۵-}LII{šq��IEDDQI<%%%44T3 h> 3fm:s.c\~<SU![Q?\EV8VWVCû?H@@>s7�� N($$"Nc.]JHHhѢQ|sw==d_glGΙ].={sE$*{CKԹN_^{rఖ-2ګI&}8 ��$"N"N(VZZh$7ldIUjT$7,gINuVgsK:wRsRR=@��qE''QqR9p@NԷEDFmd{Q jI.ΒnI_];y֬!Ϩo ڱc?@��qE''Qq%''+AW㎞,4Iʒ@$ꄨk~1%??΋wxb~8 ��$"N"N($7Zx_~UT_$7#K:Β u\gn;c=w`~8 ��$"N"N($رcD'I,;$%HWIfIHutq䟢ɯ2'�@DQIIEbxISϴ1Kr$nV$ܪ+Y1 ҫ i׮#s8 ��$"N"N($KII×^c&Kr`7,ɱIȒ McN~S+V�� N($$"NrH9ygp=Kr$n mt۱Yҭ*Yoj0q��IEDDQIԺukv[%[&q%ے_o6Zj3'�@DQIIEJM4;mYROf%̒DY6m3'�@DQIIEJwuݧe7 Y઱a$��(88\C*͒\?YޖTYR;f N�8(8ɕt*/;3,ɵfIƌSa$��(88\'5oR` ㋣eI.rdu7%Kڴ@SE-@��qE''Qqv1kň0zcgtmLV%m_ƌ- ~g$i{/q�� N($$"NrctRiچ,O@@Þ]1RIlϒ^ӡόT$}~K'8 ��$"N"N($wI9wu_fqGsD:m,ɁI֬4vOh?y_޹o8 I��'QqqE'J$tX+.]MbSN҆Ov<SI,gIG)Ndϛo-G/O垾*gII N�8(8qʒ>|WF|dISYjmڑ%ɢM_"ͷ ٥[lj|')Rʒ@��qEջ8'rg/Iq8I8O]KqI8;wъ›4mm]ӣWh؈gG[36g9 zWf_N?^?%v_>귏v[ݭ,oIaO=]bjfI@��qE՟8%uy%7(k+y ,PqI{`3wttۀ#&uD%W@��qExK~Q}"}p>,Aԑ:'d=MDQ'ʗNIt,LC!*q,I{[,x-_}ٚ?χ mۮñQ@@@v{wCG{}ʻ WD.UtUɒ|)K"Nq��IqR l)ҵ\:9iy.Q~#'QIL:gT ;yr!ֈTAqd$nN۾OvZt nFÍ~m[>ut7QdI@��qу8};;qR^~JÂr(O:@ŠTx&cqRgt=~7x3rQ}3O}#NJnsҤSO}&>9I:=1&]:Nr(Kr$nvdI7UgII N�8ɳrϥu񎝯qRORk\*uP݋A]&cqR&ҡxyeJd~}hq+ͭoIvD?v AgOmnV-;QjIʒ&q3Β Ȓ8 I��''VEٺn=8$yMQR]sb0"m2IvURݭ1tIμz'ly7vkNmݬFL?D8Ɂ,_,i+$ko$Q@��qqİqRbnfڏl[(G6eԓ8iH?H eUY}8əPO$em˧&e3%q偷]%iঙ%u4K"Nq��II.:LٶPΌmB/o'q'g1I'm۔Y釨I.Ȓj,rtPUI N�888$a-#pk^Z`m2IIIl[u۔Y(Im8ɑIܜϒ4K:p8 I��'ybtenC4uoz)bx ю>+#],ݢ Uust6hSqHWOia WTyayհ{K&I/t|5)!= IٶPΏm^ &qt/͔~W73+qRrԴt/=7A7z9 wHzŖⰴط$ݒV(NZ]zx3t ˥Mi)sHsoA]ߩ] z,m۔ջY퇨\%$n5Snq�� N8i8]Cxtd]6EױNSGuH׹S(EQ5Sgjo<9>A7_[*iO[;Ym\5){1r7Il]٠.9)w(EVZcR^%3x]yo2=Bc覬u(t~5 G#'k4Ugm=ԤFݯG$l[(WmƻYm쇨I.JIL$$'�@qqRD?5=HCV ?i^bIfg$?3qR]mO6ڽǚ3G4WNߏlfvF6@/ x]4FMn!IckR 8+YmNVٝ;Ne۔]wZX'9%d7+YFYRI N�8$qtG<K ՉYW+U'jUCk<vC)QucnʋչXƛI{>~SI]\JFoJޚ)Y=/RNJi/rd0jN}Q5ԬTYR6dNViT=4rm2')_1GtwwAI nMnpS)bvj6)&;r~!ӺtaTktez~a7&H;'Y} I՛Ҿ.Nkm#p}gwhڵw$ngILf%'8 ��$4~t? 6zՁPDJf7UYQOMIu(nsqR4^hCRutyMZҀPFZ5hǶ'7 |`&,K\%nJ +I3{380%G>Uo~]~qCs`8/x8&q FTmZ4иBo1qշ nžݔΨ.5Ǖmס8rOv`6^T=}&mށ,ɭYΒ6ʒ@��qIo^!I oԵk%O{ݬܭI^4æ־éR`$[TD`]:ݽ1C xEckoxJaC%7K{.ةM ;I,tsTGuIڎ=Wx~qRTƦJiXvIx^{IGi?UFOwc4'˰g^Iv|XM:u(߽]?b7;v {'$n3i!Nq��I'9;ca~J~mYKB[xmC{تnsJ:tؚxEg)I7mrlkbd{8dSDS+?Fi id4}Ɩ8)&zɫBd4q;[W~nFN#B򾱓~%=47IK8{zW#ovIlϒ$9Ke$'�@A9B�+[5~t{S;4IeuUûշѹ$NjXkmV6jl.gYHfv;uNbpOmGu2.t…S+⤇~o&,7NNIKn6Rכ5n(s,N#qR�/PVn,f)֯;xng/IC 96c:u(L%wR$7Nf{$nYq�� Nx@rpsYh֣~PZi z`iS?wA$V:OOYػIˤ;†m)M1.ؽ0> WIm:>"'gvz%oK^8IH8)nq҃}u~y~$æ-i8f679PeUsI8Ɂ,mٗ%}ʒ'8 ��$XZG)kq.]3Rw'8Iŭ<nnJWhgV]*}499_K5Vҏ]&u/f�B"y!$QJݡu>8'7qx{w8Gqf.NR(O]i_J+w9{{oYդjg\=iD$��<l {'5mK- ݶLtVك)t~kZa('"ҫ+2qkNمunq!g{ l<Ͼ8IRtCVlԌ%Iw;)qmN /۲\6qޮԶס-$g$NvȆAT'.&Nq��I^1vόGN_f';ɴ*It+}c];<vW48ɖkNupLng{$e%fz4J](o^s_dU^rr.f{\'l۵crnY%Nr$nֳ$'q3͒ Nq��I6۹,RgV3İ$a7m'\/`27Zy4ڷlJ㤉U_g]oa'9')lUcr[> ' {Mǐ: 2F9]/ ,>^{S9ҸײI+k#Ndi?񥪿B:T@'=7AU*)[ڙ7$-ujLn˽mej,$́$$'�@qqҌWWð¶dÒ Ki?eɤ8pnn~^jI/)ٿڰ}k҃I9'9p)<\Kp/}7Nzgxgk %j 4ʹ||w=Pu>NMb~7qWرꅝ6,|+E)oX̏ٞU{OkXOx$<\K[V-I$O4K"Nq��I'ܦYc^NL֘M7MX_6O,lD5B('x]!fFxeS 6m\c.9$9v~Ln{aqz|Ast#N\u>>zwSu+W/||$S֘u}5dX)]_3Ma-({?Qo 𽱓,37\crk:U+qYRM&I,Ҿ㗈@��qgIB&R"ymJt0))O+L#OQxe4ܒl`oi%96*/RjaAF֢%־k%9zVuoJX5ݾ8Fu;9&ѽ0NY8ͺ&U'QPCYq҂՛[7a!6Z_KxVc;TO랉E8IhD$ݒXT#^H?~Vp鎼MHK ͚6]݌'-Cy[u c'Y9\3cr:tU[$Lf%Krv7,8 I��'yV PhԦܕ&@ =&FƏ4{ӼOܖ\h诱]r';ۗWGW370{"$ {a\g$QWW@F0\CqOn.9۾g毐ɸE yx}ɴ),QSSuweMTO$pΌɭl[V-I\%99A{6ʒ@��qImM׸p݋y@hýifP.o®bsOm50Hvn ,ȨMɦ|gg5vrKEIQvlL.q܉OVx%='vI7Hܧ{quPm;,Nom hl6?w6Lf!N2N#~RFJSnvQvlL=\v˪8͓YΒ4KK$��<*IC_ϑ`ۗ6$I%eW"V6rFZ!QꑕXY<KIXNTIn,=˵}| Nk.iWHcKw9\H# $I[47Ú+NX!Qꑕ\RޑؓfV؁R5ɷ ov<C>!tPyeZʒ2Y$YcI N�8S᧶7I qR$7Nf{$nYq�� N($$"N8 Ys6!HʒH$��(88'$neI_:%'8 ��$"N"N($I.Ȓ\>Y!H2dI{@��qE''Qq;6UqRLvȥfI@��qE''QqR-Iʒ:,iw@��qE''Qq{$Y'qSeINNf%'8 ��$"N"N($I8,t=y5]_'8 ��$"N"N($IY7Lf%'8 ��$"N"N($IMf%Kr$n56ʒv}u8 I��'QqqE'1NjvG-%99ALf%}~ۛ!WNa$��(88\i[>H8,v&qSIv~ua MEFF I��'QqqE'Ҋ+wt*Kr$ngIOf%<z^JII�� N($$"Nrv\%97YΪ,iԩxw0q��IEDDQI.o.sWOΒG;v I��'QqqE'ł z~/ݔ%ᦽz<ŋ I��'QqqE'ŋ,ّc>_,ɶIv~u៟煏z"99c N�8(8vt- `ioIeIKd $%8pc N�8(8'%%hBroČ_<uYΒL%k2Ƿ7HbKKK9 N�8(8]tiҤIZC&L&}~%vE+ӷMxZHHH́q��IEDDQIu<===,,L嶀n#&L{w8KR%Í]ߜ;uy@};ZhhhJJO�� N($$"N W^MIIu]WߧG&2/4C-Ia?X:u3}>|U^qh@��qE''QqGKNNڵt=22r9 N�8(8[奧'&&FEE;5jHlAlg̘1biiib$��(88|Ϟ={ȑݻwuV΁F N�88"N"N($�I��k oz'tMQ>Vj@'��4r ޑOq 8 ��^pppzヌ0ν&=s{z~|ŇS@��1 1Rw'5 8��'�TTos8q0��x/$��P7JngCU,Vg]$T��^8 ��Զ3QhYQWK��� q��=7>,A;[8ŗu8}b ��&I��6R?9I;RkV/xw޻*0��''��sL>R"'|rQ��#N��n{Zj"')7OMA��<q��pE%6'r%$~L_mG%ϒ-��4I��ŊM-B��<q��p]Z!MD_)Í Kf�!N��.cԉƱLO֗JHvD=9Iv��{I��)72'&8z?4W~JRG��$��_*Y9o;:QX_z7hvJ��N'��G99ݦ^;5F�� q��OO]J_ v-&Ln}�F��tTI+J ŽXjk1 sI9Ty���u8 ��R }^4%{YJģe?ջV|xtzRf��i��[R)M@_ D,$JKcζ'K~\6����[9fG8!uS2l[K]Nv#����[:'K:{:Z2k} $5]^#����_3}gFΪ<R&Z��"N��aVFt<6H^F'��x$��P4ӓz~3) `I��+'�Zb<17Ȝ4F��^8 ��тS{N7����@-9{Fzh}o_*kP~C��-$��k1IE9r!:g}`jC_/rW��8 ��8+s!ʚkw֌]DIAzIkN^A�:F��U|M8lQ 7v76D ib ��1$��PbIɅZ`rt��I��V}vP>f Kh��M��@*I:fvT��� q��m&���fI������q������@������;'�����I������q������@������;'�����I������q������@������;'�����I��Խ[Ο?oheeeiiiyy;^Zl ps� N�tƍ* o޼hѢGyOwX!<<Úٵk 󢢢߳gOXX񠠠Z~[+,,px=n��ZI��ԱT ?>>^Yxx@gFRRvuiF%K4W۷Řo>pu9��刓��K_>y<$$DgQVVѦCNN5jz!]8ܶnۏ5��q��uiҥuppp۶m~V6o\^^^XX,FjܸPvP۷3gٳGܹsIIIKݛmXs�;'�Pt"_Zϟ?_Y\*+++۷o<tM+.\h 5{,WaٵEEEKr-nۏ5�� q��ufϞ=uu~~_V3#!<<\yz^ eyvvMKKSUQ_xQY>`�S,Yhkk֬QU,z̙3gĈ;v8p`ddenܸaWKr-nۏ۱c�!N�(l>ZYYyÌ3Y[lIOO0^yQaӦM6l(/oڴi Uo5 Y%%%rjj߾}Fۙ2eh`` X;p8n��!$��r+ӨQlY_}RΝ)XZl&w#Fۢ~bEEC^^:Ph֬2E ^ŋ{p-nۏہ8 �@=D�@ݸr#7oݻk];wVz'۾}z#µkת.15J{_VVV/++2͊í~ځ@�"N�ndee)WWP;wVV^^ڷo1h ue|<AވAAv*++cccrrrԽdގ=mpu8In��!$��Fjjrqm6 kÅÇW8~XYf,]2^^IEB~ș8I=tƍ:Xn͛O2dX;p8��CI��ԍ+yyyV+--U"6olney5m6mOAAACEEE?6l`nTk|n4p;|8In��!$��F\\rm:ƍt6lh!KҔ<=22R,6ld˖-[i:05`�Y̔2>9W-ncvlf77�� q��u7T潒Åf͚ڵWپ}#F%G672׻G z(b8yd|||֭5#mJUjpkcǚ �@}C�@XfroSjٲŕ|VVVzzgd<^hdҥ8CY޻w?TKB ;~xTbQ@LUۮcvXs�'��,GՃ1F6fe唔CǏWJKKKۧgD=oQJaaڵk 64JKKSSST_={4(e|r/Wnۮc�"N�n(Wj\ЩSWAAAZɳmۦܺuӧO˷l٢L޲eKeȞv \RRңGyL#AoMf?bCrp9eI7%vL=͛7g-\mp{=vk7��q��uF]Q/W@@] QK~{ァ~e˖' 0PSvF)"hŻ[jմiԻ~ ?Fq]mp�P?'�Pg,T_']xQ=ﻑzf֭[?BzHDd<iPVVfaϻuf4βe˔D p-n{]c�~"N�Τ^Tl`7&taW_p2lذa'ߴi2Mdddzzf ގؾiѼy'޸q\3p{m?k7��q��u\Imm }eddl޼YX+ggg[K1rmٟ/nٲEDVV֩S̭$k׮pXx9n��$��Rll{<B͈:n>p�È��Ku6m<炛#eDozu�aI��1e䬬,Έ͛͛7'3dKǺn��|q��uPX=g\pgĠLpBozx�UI��Խbˀʵ/ʒ%K\CCC9>�''�����I������q������@������;'�����I��x Wix}Z}6cx��$��<T}5[W=2U?u%7JLColdzVgKO��K��DK;l]V(DM.wY/\O�S��DY9R64r.ҏ_1-"><p -�O!N�M^amt/<I>]Dc��;��8T.8ཆ'��D�9o.!x5N7g��$��<ᢘ ^jb��A�QkV*Mugi xYNI^Mk�#��,g/ո ]诗T>' ?Fh-��|q��%eEGWx?1AN{韘/Vc=r��q��e<˫WNZ'޸PW~,ӗdN7例��I��xqn}?uւ=1�'�A>;}.j^^cV8d~� �� SWJi(%sB��x=$��<"<,E=g.0j<׏e>��"N�SnF_" ˽vh?ԁv^i7|rn8P��q��bF;$Qig 9_Kݝ�*!}r̘h\{і��x7$��<𷝊%.OҢpsҬ܉iWM_M�݈��EŮP9K p_*Y9.K<:�w#N�#|R_\PP> �#N�#,pIp6t@M{muBI!�bI��Խˤi,ihY 1N �bI��ԽmG'VrC]C%F+��VI��ԽOL<ďeR/9{Cr��x+$��/'&z?]D* 6�['�P l;O{ւ^*݆+ΦO 4��^8 �:c+%MJn*Φ��JI��ԱfʑQ TKE#���KEڗa ҄Y7 R5Z��C�@]ZW4e |PI��'�PbU_W+�_uH?q��'�Pg~xJPCqdp��'G} ӂ93'q9}SS=s)ЩDpj�P׶im۶ԆϸfmhNL~p" � NB0U]Vk%>A]VkՀSS�'~ s)תS:RUNmNmS۷p:I(//?{v޽u:G_~ADQI\sR\srjSo�?ɓ'wߒf!BٺuX'??ٳ^'w8f̘F9q[ۉLOONj8椸Ԧ(Nm:}b� gff.XwLעE z*::ZlO?/qR^^ŋ###NZٵkרdꞐ'Qqל5'6Eqj79,G)))я=3=oNKKswd=NzU~[կ< _?q-Hx\s?aW_&}º=УmVFCdd8$btE5'EqɩMQ (~{֭[[74m={8xϿ 'ߙ;*?P䯳O**jL̠!B;uly]V#7n;V{qRyyyJJJhh>4M{1so}ԙ]*\? ՙ*8/ꆨoArG7O>?rķG4!,,L'ۋ⫋kN⚓S8ANQ&+׌/O0i)S^*U"B7U3?v[+ĀAt܁FO]x˗Ftҥ-Zw%_glGΙ]._);|$*{CKԹN_^{rఖ-I&}̷Wל5'6Eqj󃜢M^k_hiӦa8?rREb,I3B=u~e>?ѤISk׮ٳ]2Ψ_h )辎oL/W9JfIjQD׏Ϣ%h $z*E5'EqɩMQ (~[yyٳ{ڴ3յ?*?$%?W'Fo.{_nc$'';S:N:p@NԷEDFmd Q#K2 f'O ~F}+\PPЎ;⚓Ԧ(Nm~S$//O=A~݅XPO\%I]u:UߎשS/8)99Y/ ؘ' Vp4Kr}C$Q' uQ/)-"ŋ⚓Ԧ(Nm~S]nŊJ~"D(f=Bq C~b>K:Ql{lXHuxxbe[,Ɔuߢ2|䱞ʻX`q((99)Sor2Oʑ#7\ӌPʙo+oıN9;v(j a9K֝%8vGOG)Zy/IWל5'6Eqj󃜢MwV2W㾻Y]Mے%)3Iy;[n;NRK:}j7 ҫ psdn((99)Sor*//ڵ8>aJѕ:%i2R\bzCj)TSBT7{wZb^Wל5'6Eqj󃜢M%?1T瓸oj j*GMl)Kr$n${"DԊX~Sۋ⚓Ԧ(Nm~Sɝ)G 38%e1R"T펓v[% շ%>߰m}jՊo/⫋kN⚓S8ANQ&wR֭.srisY3wڍzPDCZSM5mڔo/⫋kN⚓S8ANQ&wR&Ma8%ݨLƛ6P>hc!NٻOx{&%Uc'EQ|uqIQ\srjS6?)N >ޫq2pe#eV8]lDY҅:loߖO:EQ|uqIQ\srjS6?)NС6&'7w<޴JkPtj/{i&bԘqķE5'EqɩMQ (~;)((H8D׽n2%K:EzN-?kG53mzÏ)yI⚓Ԧ(Nm~S]'hq<x_zeZ}qDݼEzf{Ϙ5_ސ :vƕ'qS_kԘqv6m%NWל5'6Eqj󃜢M8ݽfmU~"< 6o?2䙑~~J2E(8Ҵ YJ4<ٵf$ fݧCI½poCķWל5'6Eqj󃜢M8IOuT?~|jU?mɒ5He7 4B mmn#8IT2;oqܟ'gl5g$W5ĚuF6wc';'q^_]\sRלũr7{$Qg~ΜFI{ڎ/wW\=w#MŠ_nc0-yg"8I,бWb_oy]Ē ;I>qLC5!~Sɞ7ߞ-ZhQ/S AķWל5'6Eqj󃜢M8IP}s~”ikT4iڴoX7&OOXM/ZI&M]b'>r&!?q6N2x_]YއШ >ijUk8p% qDѦ/^sҭv6{,i$$((99)Sor7IFʷ_[~ h_7 {c6~{g dzM=G]jSР5wϿ\<п.ʑo\'̒7>qv oҴΚwM^a#RL|\[oۜEke_6{w)㧌ʰQ=nw&Mzw<}TNLp~-I7EQK#OqY\sRל6qE$ R=7Żw3!ϼ+q oz{|ee9r2,|?{gSEHS*T($6R)ÒD̒6vo';jXgʟa$aII[~S>ιw=sϟ;xu99|ޯ?4M'EU|ofn.k'6,N #}`_'fuֳAJH}<I ٸSRNvm;qu<uYut5̩7V+5{<9'B䜄6B6rĘ<zuf~ؤNprqJ4}G_|){i6 %Klx줰^R`~ͯ㭧}C=[lSn=;mRnޥ{AόrN޻|\L4{v/ջSfծ/XȷN[;IPLt]rVC,BcfE9"$ 1&ꊁ]c'-U;sr~a{=ֶ]nhtY2ޑRʫRotz4ms㧾>om<hjHdvR$ bGnpѻr,zmg=|ߝx{vp7H6"'SgK'H֏_<C\&CsGua#"-Ry9l'DFK8vB1h'Ei%Gn+ IA$+}t۵[>\~gn7ww[Wޘ=]%Q&nKm'ln '=s,Qh [~'<F-POWnJۻPuw۵{zuY*zC#?G9֟9A<ԹvOCw)F]I(Cd7YMynӧP.# zMc >Ng?I1ͺ3{F}ID$\+vqg$PkٷP<v aKNIZ/%PS!Sv'3>1 Uhިg?9SzR7wթks强~:0 �6ګwyTsC$t\KCmγ,s]9'vО\QxBwm'C[$Z*Nˏcl>yy5(c8pLh϶H_mٜ a'^^KæZ aNlY<TlWC=:zn줈R{|j'ٹ꺴2۾KV4t3ADusfι=WJƐwsb' =QʃwIMR_(9ھӑ|%v0 `~$j'm.<`iqxz v{^GaN[(^;)1L5m[f;,WDBu'yr]R6 Yb]C$;$]^f;DYV;ϲV3s 9e$4; `h/9qTZ@h;6Wbn1B<m vaDDIZ$@"obq֋IM՛vBIV$G¼d!;Q[!;N0$vR,{1I1u!;B&猵sb2ZCEΉb3YHK|JK<XJh;37't4ᘙgE']'byŀ^ 0vtxGn'ٻBWoڜR?c戂(j!n 2!dw 5Cdn$$.2ۡ-Ekrh\79g[f+:Ɛwsb' =4I zδc^Ch;0W"tLYb. MY!줤>aN+d%ag̒LTh:]ݻ̲N%=SmQf;Z12Bk㥩6IyiU+{꿥 O\ JccEǼC}P4֝='gߜHqm3\_VKqT׬*|zep鲅0eC~@&<owGRe*o28[o[5eYiU|׬rgʾEVrN:K%άS*er Ɛwo $$B۽נv͹cv#?id ⣓U#TQnLIܷqMz/D|qvS{}W.{fB c'ET뾩-–!G*pz[!jr uc5hRV*(zH[$҇!C*5lR4S||b&,jTvci4h=e[fKqwTT⻽F4;򰷠iJrI{>3AeC/&u 3r sָ@εKRoyhA;n O.w/T$r69]Y9N==uCe)mC:-Rv ,SGxN2/j~sgO9b!fJ\I $ʩZ룅ͲC$C/Ө]Di_/ɶCL7֏dT$lMu]SePҍF-"e1{}&qI-(s@J)Baf\sFNz.W[~W3=.3eS;5#*םx9ce#J2 Վy7*#+?HD#ޢo̤崫M┺5Iro"j.MDhG'[<'YIhOG[]wNV`Q$$: $EoFA1pewIT^n%EDe#zqYs B=i=A0'T ~2lDoj&r{韼N<rva_U k'eUR. Ū\.k9{{qɕb}V7vҾrgH齗6ggx1BJCۦ2WzOۤ2vw\a4늨vWe r sj9FJgJC;J'J9;`XƓ] g`Y띏pʩarNOeSL.9syNN"11zjHOR-ϢJNU\Z ("> (Hr~ X\ I$sx$z줺;{'v$;^GdmryjWY(곈8 [)X%"j> k!ٿNm%yj5O^˥1dNݕ#c ~m80$A7bO3l?ޫBdϼZ@jʂn]ĵiӔGs ]W6-kc)놳-|GŽ'LΩ%+DDZR.0x7 3TK **-Ce)r m]me8mk:s+El-q8`O8U}r k',MVH& $.vkU~ֿ!e~I2\mO[ԖmΎ59w+tvv8S\BN{,0I}|%m̑n8Iw` ޫ}7zƺh'M^W}<rKNu--vLu{SqWޖ`9H wJ[S.:R.,ѿ9n1xe o s ȉ3.kMDhohk*]vc2e3LGi8Il9~Kc:Tp֪Og'%pH $>7 L /-~nP[Tsfq1,wd͏=qb޴[(V$ ^R46qBC׾mqL ;w# CtovW+QTRCL50al9}Svҋ(Nq.IGôgG-:e׵|݇2] muټ<vq9e=NQӕ}]ޫ25 V`>NWYh $$B|C[Hܣ~ 5@JоΗY. XD0r' u=t\>zky͋<U>'>a�fn!Q P\ݠkKxĻ0薋"BjcJC6_OEu2G_Y(IQ6jm!]Iv@ˌi}Ԍ|-qd'tAjzmKrP+MI$1Cc额laC֯㉵ZY+[a֊͜JUKT^wγ3>s>yAָU;)ҦNN"7OSIUْ0l;593tS_VOX.@a1y[HS%#"4bזz'鵓bd2;}-Iv4"jmqWƑ;[zWW?f9[+>w䓇h'i2"j unC1O+^15V!npz>g0&^ynGÎ.l 3]|ֳS䜾Ԭ^o,I5vv]}pR]mvdE^׍1K7;˔3ԽT\Z 7.@rY>fԴbP;ֱv}AΜ򭵪Iqw_ );)ڷnj&BW"]jka"S-*;%?CL >WR gNS]_y;)صwCܻ6V\{vR6IMI*ó# mV3aNd Y\yR!juECnm<tC7lĻocNIIvy"Mho8ZW…SᲖp<N PX>ᆝ(e@rT;Zf"*-\{ g'eMGjT3[e-u䶃 Zm3?=zky>73W=F|Gd'2Hix>~{vRZg'\I݇y[e};IPi\wܖ1WVf;qəsՓO!+h[t5["SE1a'Yh $$B\B{X=t_+I+C[z`~]NFH~{R}© PX>ᆝ<(N}/g[R6 $8leQB)B j'9[zI#o m_mӸU71ɢ97x(.^sN {PC\b$}q#v>dnkr[fS׼ 7L}7gtEB1_%;ZS`'a'#nv f%廍FAӑ>R (UpNJZ@Y(l*b*X3l.R )vRy]f޴پdKojmr]۰vIkt'(mu3>UVA÷{v`r7l(vR?O+<w"*# ls~/?k| M.-@П۲Ʌ){3L5}kb\5vv~}ʃm23?V0D OX[>ᆝ((G mƪ,dN߽lo'Q6.脵0Yۑ!*p(`vҋ=k{(z1?3o|e;?V|?Yo'u`M< ~1gI~0~) c(!$3w2䜺:ezwȥOfgUږw[y &;y&Ÿd'Yk $$B;Mek괄v*'煟pozн,`rӑ>R vR'\(1G֏ m1V ɌK..,[(e$ ^r1B6Ŀ?k'dH2 {~npYN<_.4O7vIU%g.~Ee~+蜬\[-K l[ЛfIkPZ!!Џ@ گmX;lmr|w2l~f1x>,L)$76.I6vvWs 6m2zm31xTxt$OT}¦i (B(z.X|3H2e'9wgQݻB-&nAΛjv"mmvI.n3o({ܰSL^YkjZ㱍^"sσO9τeޟrJmMIU7yfc#YH#}p6k/No&KijAaS̕f͵뚩4@:sZ] uAYۯ2䜺r3ӽ;J?Hgw dUv͔-S},גoz,t]f'Yn $$B;:kZyM(K툞#[<~1EDӑ>R vR',q T&BO#r$vR p]%ٵbk7vŷ\zn eN5۠\F[=LL> -A p*9e_6$z{5L58aA=ӗ T1s4nm0q)I$Qon>}+pGZfWz(^Vj}Տ )e޸{7 ^-.ư^o`ιowmg7MDhG!5*B;R3ވy zcӑ>R vRD',q 6r֖ 8pC:GN6I&޻w.&v -SN[:zM13NH;IGJ]isDd' e,|Oy|O̻h\CcvG{dvѵk3cCInA+{z{yR$Z庭^zmrN#~Llq=F)/ؐ{^ ^"7 ܷ;D)4nw%qr4vvvhW`N"q{YoF?_Ogg:'\>aNoC;fuh@;).xIDT h';iRD2ۉj'iA0Y0}L)&lO#(߾CޑYAHJ\s|ؼxddYma8>&diRv(kgȊB"3L CW$c{Wg{ג$aS`'a'ڄvpWmN>w-HTp};) P Pa2箱x-dNrgڻ׺ⱓ۷.6Hi<IłDΉvPva9_dY,ޫƴbO8U}¦d!nM\X B_Kwf$vRx P]%mtN%^R؆ظ+$$DΉ9'PbL&YE"<ORwdf v P>A @?uzi0;ɽvEe2,R;M>^C`'a'!$rN9 mmTV}r@N,כvBIyI尉[`Ca'a'!$rN9 mm1&wNruﲝ]VjHdcu E.mhjN6KNBt]s bLTw:N/)V7q 1>!]9'B䜄6B6rd'w7Qػ) c'[M5$z/DEΉ9'̀!.IwzӎX(e줸1B6Ć]9'B䜄6B6r`'e'-{I{Ts!lBt]s bLN %}{'>8nNrTUSͰ!,Bt]s bLN,v.'mhjBkv}^}{!DEΉ9'̀!I?dL]Ai_/ɲh9gY<jBheMՋ !.rN9 mm1&I׮]u$.+c9ʛY(;m9pK ʦ# q-~߬vS^us"DIh#Dh3 G1Mf͚Y 77o'a1wf-nݺ;p;^[ &6yvRSSKJJ"DFf@crxAw2_ 呴a5l0R EWJhOv!${[NMJ]9'B䜄6B6r;NAA9<ݟ %튽yIJaaaS4mri6k^ 1dCdS&w1m45YBt]s bLӦMӝ5i]&n5-EoJ*i'X{['h)gh/";;[Mb]9'B䜄6B6rDvvt뽼^]ܣbJc_֭Ӹ8%zcn~9o7hCLkhH%m۶MMn]9'B䜄6B6r͛SSSu/bJmwcv5>?AH4nܸr#(SRRYZ5Ň]oఙ\} WM5 1e}ӆչEk8s挚{!.rN9 mm1&wsegg'5kޫ߫-RHV®=կgL8eJN8^F ,ծ~}GV{~5Smc3IgNWTUժ >\\3F"DFf@cq';Triw6o/ٸH^zӫ?8u'nK\wajmޕ`())k׮b))7 1vJozo~[^RiCۋ7LߡKn]K6mrssmi^us"DIh#Dh3 G1J+VԩSʕ ^{:>6x{њkv;w;?1g̜~FپSPR%qyRk%~mnnn^V7ua[[q^}=a'e⫚j茗.ԭlڼ רv:k,qU{!.rN9 mm1&Μ9xⴴZjO]Ynkou]tB0Q5 =Skվ:pQ\}QH1s犊4lP7ի״iԈB!rNB!B9Bɣ͛O7mw'8W\rrsszwedd۷]v׷Fy')]l^us"rNB!B9B]ZbEVVVZZZ7nW;RjԨ!NҩS~Z6??m1;)O>rȮ] rSPP ٶm8ۈ !.rNDIh#Dh3 G1ypܹ#G߿ 2o޼ |G_|E,\ !.rN9 mm1&d rL;*9B 6m$�; bH`y` @h�6vBIӬY:� #'mBNB; ����ߩEiķ>(@I����.2{:0K->wYp@ua!v�X I���+D_K{EhTN3j!fg7OhC:V`)+`'��$#C˄_Bt0G<F\7[|Xߢ3vB�� N��_9+����v��?'Sl�@h��@ I��������I����s; $��@‚���0W=���`'��@, i_ŏʑvRۡ�� 1N��Xdv;ϯ���$���EPޛ>\����1v���(˕n���� v��O�6�����τ9dx�B���N��sW;ʄB�� N��gQu< mCNh��$I����YX(c'i ���H"��� n(:vʉeoQw7���v��� /-(W���P`'��@p:0K����(O�������� �������� �������� ����Lq;0������@nj|9nTn:��Hv���>N@燳҉o,1m��d; ��{nbΪE_GgV?L���v���1=2|����; ��NN-<ʟ{ӥ4f&-> 9֏4 �� NN�$bV 2QOaI|9t\>}HjJcqvNu:t:%��@�� gr2SOr:a<IArx�eHÌ|Oô(��@(�� XB"i2oWl/4*Dljbڷ{c<g=��v��$Oy2FM׾i|߻c? +k _n %hN��0`'�@1<Lv훾Wѐ O?߻U^Z׾nn8q��`'�@ұ? ouҐ ]ߵGNjo|%��`'�@2bFkVmWeo뿺MWۡJ1Ԏ(G j7-_#'hE��`'�@2"`ɤP+4yM*r[_XOA:&��0v��$#LHw"W<UlZH^~9/'Y{iB���S`'�@k1?ƋE~8MCc$5WZ 펣���fN�$eQ9'c%Q9ԾIvN}/'Y��,I��B3 33n5DP���`$��H^o8眑O:E#13i6��N�姟{FDpĞ�Aô��@`'�@R3mq  >X)=�� $��Hj ܱK毓᱓DrGpd ��I�� 6pvGS% '_Z@c1g& ^�� "�� \l*\XHS% Wfɭ~Lc1GN T�����v&l;T,g N:rv��$���u0 y4R|p{ jx Y'LhN#��X; ��@=}Fl s:N#z~e -v* ���X�; ��@4?'`<<#+v���,�� w4hιz^m18s h���`'��xxtAyo:�13 B4��5���<,jsȧa�⛢=f& ��`$���?3Lbz; o'U�����e2 $ر_[H,T&{OI���l��29'B}ՋWH$ %h���[`'��ax'PHNjxBp���쀝��PŞsa!89 ���vN��PD[ gW�_Ovґ��][n6@BӬY3B6/6o/(fw@;k�D7`'?"N:6M5.ޘv޸W%_ m*TZ @Mh݀ƽTPD($|`ZR&B 6m1&$KJ4UUL\ݍP6Mh#B9B;ȑ#۶m+,,,(( N^^8f׮]ӧOˠBs bL<|}Q͛B)((߿ȑ#Νc;HmFFF~ڵkW~ʕ+[/TQ88O߾}9Oϋ !.rNDIh#Dh3 G1y~SN7QUժU'СCZZ8+ď];hڴiz_ 6۷ovv{!DEΉP眇o,6BI bLn?MKKk޼7NiڴO?=o<ݥvҷ~;k֬]VZ5u毯o#=1p1Bʞ2-GKS^3Ot{m5I6^z_*:]vB䜎{l|%Nb@c8sL^^^߾}kժܨruײuێ#2ŗ^Z(5t>Х{VmWPe-^X\X줒6mRMI7{77[]cߡs:RǥB } ߧڶkeϜ?to|)))Ю];{b5NBA̔vx%Nb@cr3;w.??SN*U2/~zOܥ+6|R?UB"~kN性T\Y\ފ+\e`'8qbժUի_%ZЗ~}FܿR/VCܣO*:ek{;>x[55L躰"/#'+vrs.vw!qyKwѯ[(NxI?ڽf mJK.nݺ'Ntd34o^h?# >;zk?(z !OGNx9Zz4AL%z/Dׅ9`._|%Nb@cr7())8qu+>;v`IH bBWBo.UBζ9Sk'm۶-55w9ý.yw'%/fCyIGhw;t~֭NBt]I%y`Ma'1 G1nPVR.]87/?bK2t 亮@/I?^ %{vޝwWw9^jj͛IcZ+n^(:,ayBoqӦMNBt]I%s9zo|%Nb@crg{c'y BiSJٹ8{>ؽmN6m~[(AD K%SMo~s]deea'1躰"$"#ĘA6lO>uK-E7ISFMQ֭[h q͆8tC==Nz4M|$9"$"#Ę u!OCrk5>*O -n=o b;I4fxM/\7մTtOi^<9+s{!.rN9 mm1&w j3#Fc޴{P<FTƯ7On~M{!DEΉ9'̀!6?^{PoZ(MK ͚5ˊݵql6DS<KԩBt]sF3F;9BuzY Pi. %Y(]vN~~*(jVNmˋ.XW͚5NB3"fWB!$1&שUD%/Ͻ|u9hxf'_YS0% ^BK/ !.$9#bTi'WB!$1&שRG{Pޜ5 c'lW> Q-6ĞN5+TF z/躰"猈ΪwWB!$1&שQf5z[__<]'E_[P]CG:%}5S344}~G\s Bt]I%aY|Xȕ6BI bL\sMY$*{9[SiOl(<}q:KMOAS~}z/躰Jœ8`Ma'1 G1#ԯ_pㇾ<w{Ki\QJ[ZyO6D/iI&MwqհCt]I%mi'WB!$1&wNV<4-+׽eכF|gݫ덛RJ<X{Ei#b7W4j\f:Wc'1躰J3:ŏm#Ie'ս'?|;>ܭwŊt Y(;ȉ3-[$%r8J^{ ւ]֍$\vo]vB䜄6B6r;m'9q_יּQRa֜&nً{!HF -[(^;IhoGe_| =="oO~&n5[ V=5k.bQ.:*bv"DFf@crw$C_~q~Ihl)ǽtdswiϾiUByj[eBIb{̕կR"bw}tdL={w_ܾCjW_h>ivVk$z/DEΉ9'̀!I/F[7u*^zGώyh]f{wȳϷ*U.j8tTC-{IJO߾U[ňʍo.dckm{/i[%L˙&wFM|ҴY3_Zh߆NBt]sZjaJh#Ā!v_>nݾCJJeC~N<5+ o-vjM>xKg zf:t: XRۻ}yƜӮ|G^zWR%uk&ڴ{}8tY3&yz1է<lt<ؽOڤ^ߨƯj>*kIo?炋;GN:B u>Ji$9'Bsʑ‰WBD3 G2u;)&n8կ~?U7hѲ=!ßza -c'`<ؽ:vi~ |?W5Ms-N2|?w ubVn=^DC{>;%uTعW$gߣRlNB(d9yJIN6Bj'ڮTWR9Bc':PskwײvRM4 pW֫3&;))k}%JSZ(XP<vR؆Ã_/{o+xgP-ԩ[NԮ[mw{3'v@3xI!vf'^}czog].,}vgJI݋WB^h`@//j|B|{v?hU;sr~a{=ֶ]nhtY2ޑRʫRotz4ms㧾>om OxI;yI& o(>fˇݐ`yk=嫜ϞūXsWYh7$mBAOSSaj#]סK ԶC99g?Fv9b#g[?f@PI?<DN%P>:-X3w7w-B+o̞ВU[lH/BVP|MklZ(v UpT9%1;w΂&̉i^m)-PnnCׅ^Qn]Ferɪ_hCrN79Tys;'Rvu]z;vIs6N"%[nw˟>urpzY >Ιe2 }L΀<KqNCI!u]6q3oIQbKlx$^ QK۝,ٵ0 {U"D+]F-<́k+5hN]]@CrN7Ծ4f<˲<Y9w3W92+vvhOOWj _g vI~t_&À<Y`@;iYdn'%Y͢dTo 丩|CI,*f{YPJmƫd \G9c6ܞ\V%b;9 v.Mhkլ<x$_(1>W0 h6줤Dž仚5P!I&-?qK2ZeKrN*pT,Z:TnKա==`-$Clj|:$͜sCN) &$"L%S<\5ߐW>pe2 ȣ95 In'f?N wYh e_bXO'6-TzyI5DP/iE9 &zX+ĒոuH9!J eV"z9'vg!-bc+K/p`)`m rcv5y{I՛%Y7mB ">f!k sh- ]%q7된3r-}Bh;»9P,Ş=gZW1!c"]&À9c_jaf'OyIԛ6%7L[(A$WM5W7qa"9 q&{o*O&)/ {eoU^ᩞ<9A1Byl2`wȷ*޺S)m`2}Sk뽲w>>N>CS#ނ^Y Β3]_&`erj<:L̿J)6JY|o5Nn$^eɧaW]ʝ&+Y9/U8NoCs~VG4h3dsGԊ.z97snvLc~e2 ȝ[[[G4 O1y|fh˜7bNISBCk sk-L^z2+TP‘V2UY`k 4D\퀪.<rl#M\~l).ʜ_|Wd8BaoAӔeQz%}ft]-YYsָ@εKRoyhA;n O.w/T$W9]Y9N==uCs\TD|WS6"H퐮Ӳ,e眠2u$#ڱND.a@Ԁڀ˜<I<DNu]~lN[/aL5mayB||hCV ^2⽾gv9@F㈰vRe.J9c'=\V-v+]%q:0!sFHD#FoU+G4WfUGEߘIiWg9)uk*G,DԌ1d]zp2Ts:AjHBЎh@q$2 8 Y !0 wj@nyLnm@cDZzN*7BN-SFC9 aˆK1,:qS uc^y܂;jeC˼:{/}�Ϝ՜r2W {eUR.J\.SX9{{qɉZ_}V7vҾr轗D 6y* ovR[\=.>L^8Cu]֖uˡ09c\_yL2?>~ﺏs;"C'1w{W|;˕S"˦Y}c9Nr:B79CF|N"I[fxjڢGB&=E/ ѷV!&>Z8C˳0 wj@nyLnm@naLnxLma5ky6!tݻ,+vR4L0Մ޿_Vib4g/־+F< m]!A<S2>@$7z__||&/ <2S l<C_1s NP`3 YmN { 7] N(M{$".8:E *\T+ 펣 fxh'LΩ%+DDg.0x7 Ӡ@.} ArΡ==_1dNXALWarE2*vbHV. m6x~+H>Q;@}8@8@S ?Tc2 ? <&6 <&} 9&螻ƙоo.sO8[0 ŞdKOLBEm^w?;ن)h^}|%mD#>1/̏N兵1~Ne뢝$˯ Z ?> O]Wݫ,* 1;):9H wJ[SX[=^5sbJ45lI1>WɬI *c\b' mM%[nl_;iC;g'^J\ 2 wd@nyLnm@cx_*g'wךbNJSM4D`[l.3/NC_~&hVk`ިl%~%I/.6~8-wh' %j]2r=2IIQۿ/\;SGMW>&-zbLHMXI﯏,ጎ>," $(&BkYݠm+_Ȅ ȝ[[a'%Ø<ƙVh g]i)v\.ea-oo-A)ubNbNߗ`>#1uR^m)Dm>MI&I7N额O'laC误<+'rUi7x會K9|O xk\w䶝tIJ--LdX5j ڧ˩R*Õ}vlRt֜#'2 <&6 wNJ1ylbya!r_ eNˌ3Jdvg0նk~V-Y q{nԫLn$>ӻwG2{_cNEj'ը8n'tb}mu]![JvΩ e>db滋/ COsRz`'5<VP)s+v"eJڞwպ*#B;wrnII8&YڒS-Nro7W.B1e'&nj2Gayd%4@nTw3I-$޵$%g'5iAx,Cլs9ֵ̆:"=ͻ͓b-x0}lI:CG+7sQ%rN$BC{Cwލ B&}-. -ɭ ݰvL}k'eJ=;)aL5-jn,8꽮i\[\eVCׁg'UaH%ј}|LZK<_͚<9o*x]=FѠO[SEn$r?=\CvRZ0\z 9'v]=k)-<kaBY`@ҀܦI9&YKVCI^ҾٻKB j'\kL5͖2؟Ge voo{z}, x G"eݳBLU}i86o'U ݒK]y5Iryo1>&p +r$9ubW-I_~|9'v]n=u7IMV7OhZs4 i'E: <&q cya%fݻw.fN$ K&,8|oC 6P>T[e=Ѱw6,\I=F?e+ uY$~/?B&@П۲a&[#^ݎ.7>`NINP~\WBگ^y#w-9 ]۴"[18̒հvR6q bخ7%ٶ"\m\|²dfLbŞ굌?>C 6~s+1q70fG]: 0~c&e{r $[[oJs̭&KbbfMc0k[{37} 7k= C*׶J[nx7qN0.& vҸilrN'ڄv gЎ0Y`@Ҁܾр<-0&Y旬bw7Kʿ?<ဝSՆ\|r[_&˳]KhO^\V=Ktw ѥiU.~W=n$q٣ Ht_oY:lm-]轘q z^L> mvy5٦0fY; d[}5AaarN!qɷu1QR.V݉&X9Wmx% A*_GOhZs4 o'E4 <&} caaKVIqw䀝Z ᠝lL,bKt*NMxSz.WZVFxz׶ȹz":LX)ݯtMrNTLWo<i{G~O<F<WLservq +(:KuRt9\m81fW&IΙ{qUAt|7@VEhL2[Npڞ+{-rNK;<tWLIlіٛ{$4tpQ#Mhҗ^smBwkalY`@Ҁܾр<-0&/Y>ež NM$$e21;!z/Q oT4YoXD rڴ]/C\䐩'l!QnAH  wi=}Cd|!jIOe pﴅ}a=^2wԫ% 9-n4R9I &DUR,wDhE*B;82gKrv1y[`L^.m.Y k'eMzIIּ-!6f'-Y q{i'y Ŀ^BCSg',*!1;II?pл=ga=MZm BInA+{z{4F]$!j9Eǔ(,2(Er<__{k!=+Wv9 nD%N[vҲ&wZf9b %mBbv]kaܥ};€ژ<1yfޛ̒vR|l`lfm'9[/M$m2 r;1=tg2eWvl6t#rd绐CޑYAJ\s|ڼxdR6% ʎs;3d\!!+RjMDSMVe@v#<t\}m|N" m$C; }@nyLʁc-Y c'e~^];)MbcTcP"AΉP&Nh#Dh3 G(亝eA ESmWI^!rNB!B9Bݱu2PJ$k^g1gNBt]s bL{m*cHdc ;vz7DjBEI^!rNB!B9Bɝ}2?/;)L D9"ƽ,Jh#Ā!~v?ǽűix$"ڦvNBǩWB!$1&7z2,R;ɚxC6հ]vBv-P[ 6BI bLh'w]ҵvp!$mA]vB䜄6B6rYoڅvM/iW̘jt; us"95Jh#Ā!IwYn'ETspNBt]I%yG6BI c򤲓B{IDy2K}-v.'co`^RX].+55 !.$0:r|%Nb@cr$|v>eNeq_CML^z{!Dׅ9'̀!6ڵ&nz^ eW\lBIo}ρ6$77q0}VM{!DEΉ9'̀!65kf5ܼOv2Ffe E['4<z QKJv;%%%^us"DIh#Dh3 G1MJJJɠἤKz$mvG 6BQRz=ӯxIͷ!˺uԤ us"DIh#Dh3 G1C=ױP5yIJaaaS4mri3^Q[6m{!.rN9yuJuFvr2m4y] X{EZozo_cBQTv+w5ڿu3Sw&1^ ; !rN;l.V ZF;9BAn~/{=*V[(999An:m;SR{7oYlo-IZm۶ NBO톫ma'1 G1ç͛SSSu/bJmwa2s<3wn$ 7n\TTd)))̬V7pؾD,jZ7mX^挌3gΨINB&g"Nb@c`;w.;;?Yv^^ Yصo,'ܾL ҉'kԨڕ﹯1g罷yQ3>63owtEWU5c${!.$9?UO:}F;9B]'Nw|өRVm<l?^qϑh]![*]XZ222eۿw%7JJJڵkqqJJMpCCF=۲ߑxoo4<C7軜͗6mڴNB(r{<ŏo%Nb@chTZbEN*Wlh_wϼ8eۋ,]۩9e4O5J*]+aosss{UjU%su O=/_WGgtnإg歯MmXFеkYfO ua'!Di8;ituTf'!Ā!Q̙3/NKKUVXڕֻ[[ص{J , ӟ5^P:>س:5m޺V'E۷o^^;w(;;[\MÆ hѸq^zM6N(z/躰"$"#Ę<:߿޼yO?tӦM}wsʕ+7o<---77W\7X~gIIIQQQ^^^FFF߾}۵kW~};m$n[A_~✢YF]9'"$"#Ę<ݥ+VdeeuСq~e#F$:uziq#Gڵ0///78m۶㱍"D䜄6B6r'Ν;r B'+G}_+"DFf@crNJv;* G($|`Z#`RIB m1&${$0<0 ƽjlB^ ;) h֬YF� .�ڄ6� I����&+����$���H~9@9C==���I���8Ԅf1����; ���~VeBڇ����n�����������������������������������`b5#W=p����(v���1Gh ���2`'���3vf%����ʀ���?����`'��@80-���.I���^.Lȥ1����; ���=2���:I��������I��������I��������I����强qz8-������`+qm?1��� N���v���v���@xnGN����I���_'yZ��� z`'��@X.@Z����I���CVGNH87E%���H0��� F.^3ϩb)~���8`'��@ 1*G8:j!u.���$���! k!%cyGn�� qN��Xᇳ=2bR9W_Z1̑#g;<_/���$I���+ﱓ6K}s'RNm1s$��� aN��Xa40+/S{cl7 ��� v��� rP_Ϋ?怎3f&a���H��� V5_F?`j jnA|ƽent~��� `'��@LpLEӑe<U~Ր���@���1b;)#1]_[>O��� 1N��`J Y:ymP> ���$��� F0_^^ϲRR33���$I���vgjqj{:p_5���=I���PRqpVnm��@܃���anbHf`TFkK7KfVuvuu򹋓ߩ^U u #g��; ���ʟ$3<U?,O殑uTO&WA.p~���`'��@3<#p9AqN#";bxQ> ���$���(aף-ךO?W8c']/���$���(gN~g˝g\zKIC;��; w-pQ{Z bii᥼!R"x+ QBQ=jW4M/(fh^0/iQӏso80;;;ݙ=gO}^���`IL+3q&GNꔠFu�������9 �����C9]NfM7sRe����c@N����Őpw?]<rnir!����������p1:b Ucl O�����9 �����W=T9\_$mGo$9v|����������p%f<qA7ێ(i|:������6�9 �����W"-۾`c:lb䤯�����r�����{li.Q3E7ؑS����^9 �����W"lv]ȗo7cUN"I����������pݱZT|&x7㴥8> �����w$�����\sێo Ɓ8> �����$�����\9܃/\sϙq}>g_l �����% '����2ħZ݊,QVnbKұ����� I����� LE:<hSf#������rUV �Ѻuk6�vig:  @q{M|�^^�`�$ M[# � �6 d %��� '^FAw#Z5*>a L9"& 'Z^ȿ:F==0%ѹa L9"& 'UTT#++\sqr}YY1@ 9' 0m spg?5klH(yyy䚒XN(**"MNN ˋ<<'&&<3++< @ 9' 0m \())IMM;vlxxx_KңG8\ڕҢɠvWhhhLLLFFyw-(p^ ׅs´ADL֏ C\\\6mT8ZӲe˱cǮYFmuɾte˖EFF֮]Dgu校ގ?iG 2.XDRxw\C;t k\ KCMIȨ u!A0mi# AAyyyVVVLLmqfZ u3<ACdƬW'\ ù cb{GDm߱Qp:uٕP0ⲳ''UTT ; ϓ9Ϝ`ʬ]]}Vi^4oҼTɋ7 u^uwAҵ&jނc #N u!A0mi# Asrrý勧C 4Læ]-O0Ur/#l_d]~i3*K@Nuք |}}yo_n=2,ܱȥeWot@K%?2¢ n3uGo[_~KJJ"c_0ׅs´A; eeeɖHj zԙYv|r'% s73n_Zf-ΝH34WE'$?8a{~&Uʅ <GXJҲ3fLjQ5AJ%x/ 9'"i L9"&Ws'O6ݳ&\)<OkI< _} < %##CfYN*(( ngq랟Zx^1qڭ=sݻrׅs´A"n2//7Wg\{U ھ.$AL OBbP2g֥{x!!!+'edd{}Fď9y5fXZ(&LsͮEZZ$x/ 9'"i L9"&W~B~kw#^Bs޴4-Pv<7j0WȐ.'jպmS-m-IՅ <sWœ]G_lӎEjj*$|́p]9A9'LaA1';'.ӒP0ʥ_7l;lDP{e11B^Tsd!O_;oűsɁp]9A9'LaA1"g5w\wZ%zٗP.[P|N^^r{^Ҵ WGKbXt׷ߝW's{p]9A9'LaA1 eqS"XmhIH(&!+jI7q%9'n+̤233@ 9'"i L9"& 'Wn._KRM Wr,<8hٲeR䤍[]T{{.&fR^ ׅs´ADtt4#5߼SK(rΛԒxJddrC5j\fE5ԏ~㡇jyկ_ Ẑs rN6´ brg%?Իj-:imvjd!e&UV-x/B 9a F@ef͚԰Otջ̆diINjסҒn@T'׺$???x/B 9a F@eϏ^z+%]wv2F?)O KnKPخp{ .^BLvF5A.  0m \&5jĪ iDxZō$YBλTT# 1$vw:^ ׅs´ADpp0Wp:ҍ2.adJ(=aoӶC'UՔnՒ6hنcBNׅs´A+('e/ھ;5Λ#;op%A3,<0t؈c/BTCbG6 ) BNׅs´A+('6 '~B校;'EKR %g>WJ(gJPLrR5 j.ĊuBAFO\OBNẐs rN6´ br[lƬQ˫=FˎbB4[/YB1I%WN~>>(񨱉Yw.WK\rFOj) y]% qrׅs´A#'^^6k'<ɀ!oXsW~BcצA1qO7I('L?R| ,'8qu֣ңwglغ;N[dm=w[?* Cs'.e$I^ \rND A6rDLH(H2�RQVWúM<_Y[OYe6ϛ̵k8ë]k֬X= _:qȕ,p+_n߉O_4-ek)(8}Y-2Q6kEf|~-$qrׅs´A$'ߖK>Ev?fbj}G:oWgZlԸ)n�WO\u[ZBr&nť -UV-BmѾcX70fԩ3?%<1Y)?S7jH;4ix}ϯYVX^3;zRK*,qTVn躴l9A䜐@}_DLI6p+cꁃ?v:u7nۮc>9fTf,(L1PF ygD_idY|įEz~>J[z'RUK,r&n%n;Ԉ4&ͺu[ l,Da/jI2kBNAr] 9s rN6i6&67rt9o3n<h9AN-/xgKcb=ׂ NU~E~ޚ cS^+*"YB1Iu{ۛwc'N7mArۻA`P_?xԸ)>z7nvU%''W6floA'.o}1 { A0mtsӎM~)FC9UXzK=9ɚdS>fNaݞi쑪x; :B4{K^x].Z'vc IhI6N:V|u37ۖrSǦ-.3Wf/_uu ,NBSANbjڏ4]t` u{ƴlcDik9'r´bh;I?m2rԽ?!r8%YP^}uۖ+f)|Wn%ܸg-ٕPxgɗP*$%|j(ǻђĭYrrn:^?~p1vDnY噶fsĔjXo}w~qrNIL5O FEuzQ"uq3L[T1p9x2d<&G@Gq曶Ruf9ɆdGe< O*}]6$INRRK$ qT 9ɲff¸Izެ%z2zwYT.UKj9JVi+ͩlOW.䜐@vzXmm}ôkڼ*n/s rgF@@ݘݬ<ʯCdKjjI6ג PIn -' ,pٽ0^ |p|HIrQr˪sj9<j0$.䜐@v xT.5:Ex ӶbR6Όf 'yT@ 9Ւ-$G*'$ZΛVDB1IR$EB$n!]('z3M &O#L\-:DΩٜsfsBNf.x؛Z1F~;L[bM3Ya p9Ip7:D$i;P-N1(%UOdJ(f9mD58vkƣ?4llY]!rNmPիU"FvrNIMBڸP׶S6]paL[] m r5UN"+'Ғ;oZ$i9J9)^Z9jd! ĭȚ텁eUwU9s^No`a ݅rM.6EEY< iحbpt rɵUB"#'UOٻ(%r ՒN,Y jtFk vq;x#g|;s԰TkoUYޡYH_IB3JCE>%(136# NOQcDuܲǪCw9˿YqB+'SR? _v=3VM俛S/y]f͕S6H9eI¿u` ɮ0$. B 9IMmmd5aښ*d+Kɥbrrա:De<-I 9IC aEK6њ}ѯ"uTWF ?=o"~@knS /sAm_9vA 򦦬{w(WOf^.̣^E/)MnڲǪCw9Hr87udE+B5#] |yQI_DJ.ULE b!iwIrNIn1his*U,J4=aR L[p6Jcri\d@!1~wCd$Uz]v^2n-eImf%Y}ѩ;)f?dop{&W^nCԮw 7b+'Ve0ܑg:GNjk7AI:v]-aU-!/:e/#)#HW.o?|$qeAna319 Q9'?%>uu]Σ aH]&rL6_mez†hm2ȕ %r$i7:DU]ӒIA2xk!f^56{wz!cw~=_B{ی GjV3 bGURPBҚl +yfD2$7܋6zU_ȰދڄDQ 2$SHn~,3֙ktcc@;%m˪ȪC-IL]EMBgW~8_Bs-t+nD1as. #1#yNII1o$b0)䜐4kbܓr5mш_#ލ8k G%Va❉wb&\\rL.- 亰n Y!?4%e6$)rE5UY0?OGp5deꡈ]YC|URI,MK9FO3C;sL &Fߘ8H{lO}*gڕU\Yʖ 'ٝ‹Mz%BdlW"d9PUφ(b=TjܴFNbM"$d3.8Ĝkq_3JT~99{3agM%aR 'iӺ=Ǵ߼op6 F| Od. ^/]aD<5μ ԨH>cri2&חu1z$r4qJ(rΛJ() 'Ӓ [z-kѸK_m3$SΊ$G1hBAIxW <N`rRAó+'u"|Ko.6CE9ֳzkoV~<GO+QT.X \pZ=N`}zLV]ôS}nc<,p͕_>o5dΦe! wI$Iڴn1mŠ#mn5ꤲrzcЂo26l"\Z@1^e)<|~tyی"UNrBXwT, Ӗ,0Յz=F`5o#Ջ^)&/W'KxGfe HȠUS^Dm{ə҉ױh$'mNu߅Y:ߔr=&,+~~c zrIANe&dPQP0m͂rK:n:R\Z@ 1VKcALœFzI>o%ɕђ8KTťR# ' zM@X*5e~'l)'MR+('=ߡWX}]׽?rm!T5ἱñIZx` x߾Wު<M3JrI!焜/v3Ӿ.)bk1^\\rL.- WCN\\uvUIz]&RBqLNrB^?kMF/U :^ >7y8$wws;J4iMnrsnr_[~ɣxzq]fEΩvy+n{lAf܆G\ERrN.u[$iB 9IƦ}q3t=zL[/-m/ > R\Z@i1TvM pj)'iwK($jBZH&*y/̮fދpa6hx)rٖom̝i'AԢu]u$ǎEXdh[u"psv--tӄ$mR9!'iֺ۴g7=ց0m!ä/5 U %r5$XuBlYWNRwE.K($9y!ph.t53}nlzM.y/S T(*%Cps`Iu3_٦zq]!j7GIT D4v [2W[mIfR\/'IrNIn76e32Yt[7ô9f[L:\\h@jug亨:dٶqL$VKeϛjII(V$}jk!~tؖ5O?/{\|>aSW"BY$ vn$v/'*Fׇ[RuCnVϑ17 ߟ)|e Hm8(s#^d9)䜐inlڋIr|qۏiq/ m eIcrS@LC1bۻ[sH—[gjrB6W1{-XP,ƇC ?*}ΐoٕ :<rDw1e;=џR3ֹSݬ#'Eu1]D 8(pJv>]_B0'in $iB 9Ixy֦^c;3 )'9KmL1vTNZ2GϛjIr$9ZijP-rm2bБml/y3ݪb6|ʼ-o\{V |>R-L0T-&ڗxS|<a7<uٮCnVϑzv $=ɜU�14y6kM4m$M}s}1*I&r6-MP0m]셱q6rg$r1) &Tաc޻'|{r aEKRz!ߒhAGދRȟzދ /vx#ҘUMe_V]ȰqUƬopy0Kac 6iM-[ʃ<m:D-fꤙ#~[J+#_?{䜄Ϸ}1*I&rƫƴÃM|0±ikv/c;3 /'9KmO1혜$RKe<-I9I[MܤjrB6-W1{vm56Dz=G5@%fQ֣}Μwy?DSD4}ӡyFo<&q$+i)_cj+{?L<r)lL!ey$3la9X.ܧ-Xݬ#'I7vPG[?9>AXkr>mM/圄/VЯ+$ B 9I~D{vzwE>8ˆ?f3rrCP1$.( '9c!"!' nlfCKE7>."/ESr+ Hm{Xy᦯JZ!  KOs]:Dfnl6EY>[0)?ƅUn<ڜY"ȟB"x^evnOy.$L 9'$Zvf4Bikg/l# wf@.SNKmL1K=fQ9I{񴤃r$Z)'j:r6mV1{1=e< aTaK~9RisQLNb*i/X<+3=M]Sr)0tu)~fxtCnVHaCU wGh-}LӋ޽wSc%m䜄3GQǺJNrtR9!'i̴ֺW%']F1ȝ˗$br9brUvMx̶CrzN8w_B9-[NԒ )2m2t;1n*FLK}F#%O#ϴЁK򎉙nV3"#y/{\L5Ѓ'R(s cG-4MhJj (S)Q{O%$C>Ƚ$/eݕaVqIANiôa. , w\rLnw UŹҏvLN%]h2$WNRDTSk!,$ q)rS=z/t.9ArLaAn VNRwq{)%p$Ԓ\u!A0mi# AI:]R)')%~! '{p]9A9'LaA1:r U]ƑPh@<9e aZ"I^ \rND A6rDL$VKe<-)_Ԡr9;IT@.  0m \q9ɬջL&nJ(f9I " 9 B 9a F@UֻPLrD5 9 B 9a F@ՐӻjxSJIt% !g-@ 9'"i L9"&%'wO?+'))8UT\nBNẐs rN6´ br5$].SJBa$)YI^ \rND A6rDLebϛJ(I<ة wt&Y_ȣd^!!!^ ׅs´A+"'ɏwtݻ/JP(KVmԒN9YTSb!ӗof& p]9A9'LaA1LDFFx-zUPNtI4 $'y(#2Q, 32 ^ ׅs´AIJe6hD˸Ÿ$K(T`` s;NpBXhI,a\tf:!!!^ ׅs´ADEEY?5At\c˸и̌BCCPoŝ8[)-Z2޽{ x/ 9'"i L9"&Wyyyo['c2.+;_jj*mm+BxYV,Ҍ x/ 9'"i L9"&Wiiil%:w%]///Aի{98vw?hi[ !#kfOfa`{p]9A9'LaA1J`KU9u3zu/VB̔޽{w jx{w9,-ɡH_+$1%=^ \rND A6rDL:jի{uFWk]MO)_wޗ7o^TT$y(HII8hTl_=wKB7>a0wdFׅs´Agdd c?[37djI7w45s}䠷I2w\(˗nݺGUo]I6wyC+/YY'-3&ik Ș!${p]9A9'LaA1PVV6w\5kӾXR'4qc%]tI;cᚵxONN&Ö?w/***(!nּI0c9w.Qd!v2{E+svA!MngcǎAp]9A9'LaA1JpAgB_sq~rMO(ջlˁ\mfJfIu  ^NNR^q]]vm hLhڿ+2zHON73}J'oD;=#lᩐк~m?!22rٲedTẐs rN6´ br<;;;..߮~[n`S^ЭgdԐ#F'&NH@B>nlFBwP-toвȲ)&&&++K(޿(##&44r7o&(x/B 9a F@ɝ5k֌;e˖NpǧM6qqq @ Rﬨ(**JNN Fd 9d Ẑs9a F@.榦ѣycyHxxرccsrr֏YYY#!{ \rN9'LaA1%%%yyy65k?ٳg_SA.  0m r?FnFijttnj0m6F@I�1<90�6L�`0m�u�Ѻu��pk?r6�a��ӆi�������������NW FƳ����IENDB`������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mitogen-0.3.9/docs/images/fakessh.graphml�����������������������������������������������������������0000664�0000000�0000000�00000036442�14656664731�0020415�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" standalone="no"?> <graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd"> <!--Created by yEd 3.14.4--> <key attr.name="Description" attr.type="string" for="graph" id="d0"/> <key for="port" id="d1" yfiles.type="portgraphics"/> <key for="port" id="d2" yfiles.type="portgeometry"/> <key for="port" id="d3" yfiles.type="portuserdata"/> <key attr.name="url" attr.type="string" for="node" id="d4"/> <key attr.name="description" attr.type="string" for="node" id="d5"/> <key for="node" id="d6" yfiles.type="nodegraphics"/> <key for="graphml" id="d7" yfiles.type="resources"/> <key attr.name="url" attr.type="string" for="edge" id="d8"/> <key attr.name="description" attr.type="string" for="edge" id="d9"/> <key for="edge" id="d10" yfiles.type="edgegraphics"/> <graph edgedefault="directed" id="G"> <data key="d0"/> <node id="n0"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="106.0" x="156.0" y="-15.0"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="47.072265625" x="29.4638671875" y="5.93359375">bastion<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="106.0" x="20.0" y="60.0"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="86.482421875" x="9.7587890625" y="5.93359375">ssh.webserver<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="106.0" x="20.0" y="141.0"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="81.501953125" x="12.2490234375" y="5.93359375">sudo.webapp<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="106.0" x="156.0" y="222.0"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="48.419921875" x="28.7900390625" y="5.93359375">fakessh<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="106.0" x="156.0" y="141.0"/> <y:Fill color="#99CC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="34.890625" x="35.5546875" y="5.93359375">rsync<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n5"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="106.0" x="20.0" y="222.0"/> <y:Fill color="#99CC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="88.09375" x="8.953125" y="5.93359375">rsync --server<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n6"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="106.0" x="156.0" y="60.0"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="81.033203125" x="12.4833984375" y="5.93359375">ssh.fileserver<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n7"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="106.0" x="156.0" y="-90.0"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="44.03125" x="30.984375" y="5.93359375">master<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <edge id="e0" source="n0" target="n1"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="-53.0" sy="0.0" tx="0.0" ty="-15.0"> <y:Point x="73.0" y="0.0"/> </y:Path> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e1" source="n1" target="n2"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="15.0" tx="0.0" ty="-15.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e2" source="n0" target="n6"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="15.0" tx="0.0" ty="-15.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e3" source="n3" target="n6"> <data key="d9"/> <data key="d10"> <y:ArcEdge> <y:Path sx="53.0" sy="0.0" tx="53.0" ty="0.0"> <y:Point x="313.97589111328125" y="156.0"/> </y:Path> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:Arc height="-51.97590637207031" ratio="-1.283355712890625" type="fixedRatio"/> </y:ArcEdge> </data> </edge> <edge id="e4" source="n0" target="n1"> <data key="d9"/> <data key="d10"> <y:ArcEdge> <y:Path sx="-53.0" sy="0.0" tx="46.522850036621094" ty="-15.0078125"> <y:Point x="120.11017608642578" y="19.263574600219727"/> </y:Path> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:Arc height="-20.658016204833984" ratio="-1.176903247833252" type="fixedRatio"/> </y:ArcEdge> </data> </edge> <edge id="e5" source="n1" target="n2"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="44.41933213706437" sy="15.025426211222324" tx="44.41933213706437" ty="-14.9921875"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e6" source="n2" target="n5"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="44.30647864807331" sy="14.996030393496994" tx="44.30647864807331" ty="-15.0234375"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e7" source="n6" target="n4"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e8" source="n6" target="n0"> <data key="d9"/> <data key="d10"> <y:ArcEdge> <y:Path sx="53.0" sy="0.0" tx="53.0" ty="0.0"> <y:Point x="298.25" y="37.5"/> </y:Path> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:Arc height="-36.25" ratio="-1.9333332777023315" type="fixedRatio"/> </y:ArcEdge> </data> </edge> <edge id="e9" source="n0" target="n0"> <data key="d9"/> <data key="d10"> <y:ArcEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"> <y:Point x="209.0" y="0.0"/> </y:Path> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:Arc height="0.0" ratio="1.0" type="fixedRatio"/> </y:ArcEdge> </data> </edge> <edge id="e10" source="n7" target="n7"> <data key="d9"/> <data key="d10"> <y:ArcEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"> <y:Point x="209.0" y="-75.0"/> </y:Path> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:Arc height="0.0" ratio="1.0" type="fixedRatio"/> </y:ArcEdge> </data> </edge> <edge id="e11" source="n7" target="n0"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="-6.5"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e12" source="n4" target="n3"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="15.0" tx="0.0" ty="-15.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e13" source="n2" target="n5"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> </graph> <data key="d7"> <y:Resources/> </data> </graphml> ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mitogen-0.3.9/docs/images/fakessh.svg���������������������������������������������������������������0000664�0000000�0000000�00000076354�14656664731�0017570�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="624" height="724.479" viewBox="0 0 468 543.359"><defs><symbol overflow="visible" id="a"><path d="M2.766 0H1.234v-13.453h1.641v4.797C3.57-9.531 4.461-9.97 5.547-9.97c.601 0 1.172.121 1.703.36.54.242.984.578 1.328 1.015.344.438.613.969.813 1.594.195.617.296 1.277.296 1.984 0 1.668-.417 2.961-1.25 3.875C7.614-.234 6.625.22 5.47.22 4.32.219 3.422-.258 2.766-1.22zM2.75-4.953c0 1.18.156 2.027.469 2.547.52.844 1.222 1.265 2.11 1.265.726 0 1.35-.312 1.874-.937C7.734-2.703 8-3.633 8-4.875c0-1.281-.258-2.223-.766-2.828-.5-.602-1.109-.906-1.828-.906-.718 0-1.343.312-1.875.937-.523.625-.781 1.531-.781 2.719zm0 0"/></symbol><symbol overflow="visible" id="b"><path d="M7.594-1.203c-.606.523-1.196.89-1.766 1.11a5.213 5.213 0 0 1-1.812.312C2.94.219 2.113-.04 1.53-.562c-.574-.52-.86-1.188-.86-2A2.735 2.735 0 0 1 1.86-4.829c.352-.238.75-.422 1.188-.547.32-.082.812-.16 1.469-.234 1.332-.164 2.316-.36 2.953-.579v-.437c0-.664-.157-1.14-.469-1.422-.418-.363-1.043-.547-1.875-.547-.781 0-1.36.137-1.734.406-.368.274-.637.75-.813 1.438l-1.61-.219c.145-.687.384-1.242.72-1.672.332-.425.816-.754 1.453-.984.644-.227 1.382-.344 2.218-.344.832 0 1.508.102 2.032.297.52.2.898.45 1.14.75.25.293.422.664.516 1.11.05.28.078.792.078 1.53v2.204c0 1.531.035 2.5.11 2.906.07.406.21.797.421 1.172H7.937a3.365 3.365 0 0 1-.343-1.203zm-.125-3.688c-.606.243-1.508.45-2.703.625-.68.094-1.157.204-1.438.329-.281.124-.5.308-.656.546-.156.23-.235.493-.235.782 0 .437.165.804.5 1.093.333.293.82.438 1.47.438.632 0 1.195-.133 1.687-.406a2.64 2.64 0 0 0 1.11-1.157c.175-.363.265-.91.265-1.64zm0 0"/></symbol><symbol overflow="visible" id="c"><path d="M.578-2.906l1.64-.266c.083.656.333 1.164.75 1.516.427.343 1.016.515 1.766.515.758 0 1.32-.148 1.688-.453.363-.312.547-.676.547-1.093 0-.376-.164-.665-.485-.876-.218-.156-.78-.343-1.687-.562-1.211-.313-2.047-.578-2.516-.797-.469-.226-.824-.535-1.062-.922a2.456 2.456 0 0 1-.36-1.312c0-.438.098-.836.297-1.203.196-.375.469-.68.813-.922.25-.196.597-.36 1.047-.485a4.964 4.964 0 0 1 1.421-.203c.77 0 1.442.11 2.016.328.582.22 1.008.524 1.281.907.282.375.473.875.579 1.5l-1.626.218c-.074-.5-.289-.89-.64-1.171-.344-.282-.84-.422-1.484-.422-.762 0-1.305.125-1.625.375-.325.25-.485.543-.485.875 0 .218.067.414.203.578.133.187.344.34.625.453.164.062.656.203 1.469.422 1.164.312 1.977.57 2.438.765.468.2.832.493 1.093.875.258.375.39.844.39 1.407a2.8 2.8 0 0 1-.483 1.562c-.325.48-.79.856-1.391 1.125-.606.258-1.29.39-2.047.39-1.273 0-2.242-.257-2.906-.78C1.187-1.095.766-1.875.578-2.906zm0 0"/></symbol><symbol overflow="visible" id="d"><path d="M4.844-1.484l.234 1.468c-.46.094-.871.141-1.234.141-.606 0-1.074-.094-1.406-.281a1.57 1.57 0 0 1-.688-.75c-.137-.313-.203-.961-.203-1.953v-5.61H.328V-9.75h1.219v-2.406l1.64-1v3.406h1.657v1.281H3.187v5.703c0 .47.024.774.079.907a.765.765 0 0 0 .28.328c.134.086.329.125.579.125.176 0 .414-.024.719-.078zm0 0"/></symbol><symbol overflow="visible" id="e"><path d="M1.25-11.563v-1.89h1.656v1.89zM1.25 0v-9.75h1.656V0zm0 0"/></symbol><symbol overflow="visible" id="f"><path d="M.625-4.875c0-1.8.5-3.14 1.5-4.016.844-.718 1.863-1.078 3.063-1.078 1.343 0 2.437.446 3.28 1.328.852.875 1.282 2.086 1.282 3.625 0 1.262-.188 2.25-.563 2.97a3.96 3.96 0 0 1-1.64 1.671 4.832 4.832 0 0 1-2.36.594C3.82.219 2.72-.22 1.876-1.094 1.039-1.969.625-3.227.625-4.875zm1.703 0c0 1.25.27 2.188.813 2.813.539.617 1.222.921 2.046.921.82 0 1.504-.312 2.047-.937.551-.625.829-1.57.829-2.844 0-1.207-.278-2.117-.829-2.734-.543-.625-1.226-.938-2.046-.938-.825 0-1.508.309-2.047.922-.543.617-.813 1.547-.813 2.797zm0 0"/></symbol><symbol overflow="visible" id="g"><path d="M1.234 0v-9.75H2.72v1.39c.719-1.07 1.754-1.609 3.11-1.609.581 0 1.116.11 1.609.328.5.211.867.485 1.109.829.25.335.422.742.515 1.218.063.305.094.836.094 1.594v6H7.5v-5.922c0-.676-.063-1.18-.188-1.516a1.561 1.561 0 0 0-.687-.796 2.166 2.166 0 0 0-1.14-.297c-.712 0-1.32.226-1.829.672-.511.437-.765 1.28-.765 2.53V0zm0 0"/></symbol><symbol overflow="visible" id="h"><path d="M1.234 0v-13.453h1.657v4.828c.77-.895 1.742-1.344 2.921-1.344.72 0 1.344.149 1.875.438.532.281.91.672 1.141 1.172.227.5.344 1.23.344 2.187V0h-1.64v-6.172c0-.832-.184-1.437-.548-1.812-.355-.375-.859-.563-1.515-.563-.492 0-.953.133-1.39.39-.43.25-.735.595-.923 1.032-.18.43-.265 1.027-.265 1.797V0zm0 0"/></symbol><symbol overflow="visible" id="i"><path d="M1.703 0v-1.875h1.89V0zm0 0"/></symbol><symbol overflow="visible" id="j"><path d="M3.031 0L.062-9.75h1.704l1.546 5.625.579 2.094c.02-.102.187-.77.5-2L5.953-9.75h1.688l1.468 5.656.485 1.86.562-1.875 1.672-5.641h1.594L10.375 0H8.672L7.109-5.844 6.734-7.5 4.766 0zm0 0"/></symbol><symbol overflow="visible" id="k"><path d="M7.906-3.14l1.719.218c-.273.992-.773 1.762-1.5 2.313-.73.554-1.664.828-2.797.828-1.43 0-2.558-.438-3.39-1.313-.836-.875-1.25-2.11-1.25-3.703 0-1.633.421-2.906 1.265-3.812.844-.907 1.938-1.36 3.281-1.36 1.313 0 2.38.446 3.204 1.328.82.887 1.234 2.137 1.234 3.75v.438H2.39c.062 1.074.363 1.898.906 2.469.55.562 1.234.843 2.047.843.601 0 1.117-.156 1.547-.468.425-.32.765-.832 1.015-1.532zM2.484-5.813h5.454c-.086-.82-.293-1.438-.625-1.844-.532-.633-1.215-.953-2.047-.953-.762 0-1.403.257-1.922.765-.524.512-.809 1.188-.86 2.032zm0 0"/></symbol><symbol overflow="visible" id="l"><path d="M1.219 0v-9.75h1.484v1.484c.383-.695.735-1.156 1.047-1.375.32-.218.676-.328 1.063-.328.562 0 1.128.18 1.703.531l-.563 1.532c-.406-.239-.812-.36-1.219-.36-.367 0-.695.11-.984.329-.281.218-.484.523-.61.906a6.532 6.532 0 0 0-.265 1.922V0zm0 0"/></symbol><symbol overflow="visible" id="m"><path d="M3.953 0L.234-9.75h1.75l2.094 5.844c.227.625.438 1.277.625 1.953a27.66 27.66 0 0 1 .61-1.844L7.483-9.75h1.688L5.484 0zm0 0"/></symbol><symbol overflow="visible" id="n"><path d="M7.625 0v-1.438C6.863-.331 5.832.22 4.531.22c-.574 0-1.11-.11-1.61-.328-.5-.22-.87-.493-1.108-.829-.243-.332-.415-.742-.516-1.234-.063-.32-.094-.832-.094-1.531V-9.75H2.86v5.406c0 .867.032 1.45.094 1.75.102.43.32.766.656 1.016.344.25.758.375 1.25.375.5 0 .961-.125 1.391-.375.438-.258.742-.61.922-1.047.187-.438.281-1.07.281-1.906V-9.75H9.11V0zm0 0"/></symbol><symbol overflow="visible" id="o"><path d="M7.563 0v-1.234C6.944-.266 6.038.219 4.842.219c-.78 0-1.5-.215-2.155-.64-.649-.427-1.153-1.024-1.516-1.798C.816-2.989.64-3.867.64-4.859c0-.977.16-1.864.484-2.657.32-.789.805-1.394 1.453-1.812a3.93 3.93 0 0 1 2.188-.64 3.22 3.22 0 0 1 1.562.374c.457.25.832.574 1.125.969v-4.828h1.64V0zm-5.22-4.86c0 1.25.259 2.184.782 2.798.531.617 1.156.921 1.875.921.719 0 1.328-.289 1.828-.875.508-.593.766-1.5.766-2.718 0-1.332-.262-2.305-.782-2.922-.511-.625-1.14-.938-1.89-.938-.742 0-1.356.305-1.844.906-.492.594-.734 1.54-.734 2.829zm0 0"/></symbol><symbol overflow="visible" id="p"><path d="M1.234 3.734V-9.75H2.75v1.266c.352-.489.75-.86 1.188-1.11.445-.25.992-.375 1.64-.375.82 0 1.55.215 2.188.64.644.43 1.129 1.032 1.453 1.813.32.782.484 1.637.484 2.563 0 1-.183 1.902-.547 2.703-.355.793-.875 1.402-1.562 1.828-.68.426-1.39.64-2.14.64a3.174 3.174 0 0 1-1.485-.343 3.467 3.467 0 0 1-1.078-.89v4.75zm1.5-8.546c0 1.25.254 2.18.766 2.78.508.595 1.125.891 1.844.891.726 0 1.351-.304 1.875-.921.531-.626.797-1.586.797-2.891 0-1.238-.258-2.164-.766-2.781-.512-.625-1.121-.938-1.828-.938-.711 0-1.336.328-1.875.985-.543.656-.813 1.617-.813 2.875zm0 0"/></symbol><symbol overflow="visible" id="q"><path d="M1.64 0v-8.469H.173V-9.75H1.64v-1.031c0-.656.054-1.145.171-1.469.157-.426.43-.77.829-1.031.406-.27.968-.406 1.687-.406.469 0 .984.058 1.547.171l-.25 1.438a5.44 5.44 0 0 0-.969-.094c-.5 0-.855.11-1.062.328-.211.211-.313.61-.313 1.203v.891h1.89v1.281h-1.89V0zm0 0"/></symbol><symbol overflow="visible" id="r"><path d="M1.25 0v-13.453h1.656v7.672L6.812-9.75h2.141L5.22-6.125 9.329 0H7.28L4.063-4.984 2.905-3.86V0zm0 0"/></symbol><symbol overflow="visible" id="s"><path d="M1.172 3.75L.984 2.203c.364.094.676.14.938.14.375 0 .672-.062.89-.187.22-.117.395-.281.532-.5.101-.168.273-.578.515-1.234L4 .016.297-9.75h1.781L4.11-4.11c.258.72.493 1.477.704 2.266.195-.758.425-1.5.687-2.218L7.578-9.75h1.656L5.531.172c-.406 1.062-.718 1.797-.937 2.203-.293.54-.633.938-1.016 1.188-.375.257-.824.39-1.344.39-.324 0-.68-.07-1.062-.203zm0 0"/></symbol><symbol overflow="visible" id="t"><path d="M7.594-3.563l1.625.204c-.18 1.125-.633 2.007-1.36 2.64-.73.625-1.625.938-2.687.938-1.336 0-2.406-.43-3.219-1.297C1.141-1.953.734-3.207.734-4.844c0-1.05.172-1.968.516-2.75.352-.789.883-1.383 1.594-1.781a4.756 4.756 0 0 1 2.328-.594c1.062 0 1.926.274 2.594.813.675.531 1.109 1.289 1.296 2.265l-1.593.25c-.157-.656-.434-1.144-.828-1.468-.387-.332-.856-.5-1.407-.5-.824 0-1.496.304-2.015.906-.524.594-.781 1.539-.781 2.828 0 1.305.25 2.25.75 2.844.5.594 1.156.89 1.968.89.645 0 1.18-.195 1.61-.593.437-.395.71-1.004.828-1.829zm0 0"/></symbol><symbol overflow="visible" id="v"><path d="M.594-4.031v-1.672h5.078v1.672zm0 0"/></symbol><symbol overflow="visible" id="w"><path d="M1.203 0v-13.453H2.86V0zm0 0"/></symbol><symbol overflow="visible" id="x"><path d="M1.234 0v-9.75H2.72v1.375c.3-.477.707-.863 1.219-1.156a3.446 3.446 0 0 1 1.734-.438c.719 0 1.305.153 1.766.453.468.305.796.72.984 1.25.77-1.132 1.773-1.703 3.015-1.703.97 0 1.711.274 2.235.813.52.531.781 1.355.781 2.469V0h-1.656v-6.14c0-.657-.055-1.13-.156-1.423a1.384 1.384 0 0 0-.579-.703 1.855 1.855 0 0 0-1-.265c-.68 0-1.246.23-1.703.687-.449.45-.671 1.18-.671 2.188V0H7.03v-6.328c0-.738-.136-1.29-.406-1.656-.273-.364-.71-.547-1.313-.547-.468 0-.902.125-1.296.375a2.03 2.03 0 0 0-.86 1.062c-.18.469-.265 1.149-.265 2.032V0zm0 0"/></symbol></defs><path d="M0 0h468v543.36H0zm0 0" fill="#fff"/><path d="M216.719 120.96H383.16V168H216.72zm0 0" fill="#ffca00"/><use xlink:href="#a" x="341.52" y="276.24" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#b" x="351.978" y="276.24" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#c" x="362.32" y="276.24" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#d" x="371.911" y="276.24" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#e" x="377.135" y="276.24" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#f" x="381.313" y="276.24" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#g" x="391.771" y="276.24" width="100%" height="100%" transform="translate(-72 -124.32)"/><path d="M216.719 120.121H384v48.719H215.879V120.12zm0 1.559v-.72h.84V168h-.84v-.719H383.16V168h-.719v-47.04h.72v.72zm0 0"/><path d="M3.121 238.68H169.56v47.16H3.12zm0 0" fill="#ffca00"/><use xlink:href="#c" x="97.68" y="393.96" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#c" x="107.082" y="393.96" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#h" x="116.672" y="393.96" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#i" x="127.015" y="393.96" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#j" x="132.239" y="393.96" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#k" x="145.59" y="393.96" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#a" x="156.048" y="393.96" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#c" x="166.506" y="393.96" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#k" x="175.908" y="393.96" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#l" x="186.367" y="393.96" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#m" x="192.628" y="393.96" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#k" x="202.031" y="393.96" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#l" x="212.489" y="393.96" width="100%" height="100%" transform="translate(-72 -124.32)"/><path d="M3.121 237.96h167.277v48.599h-168V237.96zm0 1.56v-.84h.84v47.16h-.84V285H169.56v.84h-.72v-47.16h.72v.84zm0 0"/><path d="M3.121 365.879H169.56v47.16H3.12zm0 0" fill="#ffca00"/><use xlink:href="#c" x="102.36" y="521.16" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#n" x="111.762" y="521.16" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#o" x="122.22" y="521.16" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#f" x="132.678" y="521.16" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#i" x="143.021" y="521.16" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#j" x="148.474" y="521.16" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#k" x="161.637" y="521.16" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#a" x="172.095" y="521.16" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#b" x="182.553" y="521.16" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#p" x="192.895" y="521.16" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#p" x="203.353" y="521.16" width="100%" height="100%" transform="translate(-72 -124.32)"/><path d="M3.121 365.16h167.277v48.598h-168V365.16zm0 1.559v-.84h.84v47.16h-.84v-.84H169.56v.84h-.72v-47.16h.72v.84zm0 0"/><path d="M216.719 493.078H383.16v47.16H216.72zm0 0" fill="#ffca00"/><use xlink:href="#q" x="339.48" y="648.36" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#b" x="344.704" y="648.36" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#r" x="355.163" y="648.36" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#k" x="364.565" y="648.36" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#c" x="375.023" y="648.36" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#c" x="384.613" y="648.36" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#h" x="394.015" y="648.36" width="100%" height="100%" transform="translate(-72 -124.32)"/><path d="M216.719 492.36H384v48.6H215.879v-48.6zm0 1.558v-.84h.84v47.16h-.84v-.84H383.16v.84h-.719v-47.16h.72v.84zm0 0"/><path d="M216.719 365.879H383.16v47.16H216.72zm0 0" fill="#97ca00"/><use xlink:href="#l" x="349.44" y="521.16" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#c" x="355.702" y="521.16" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#s" x="365.104" y="521.16" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#g" x="374.506" y="521.16" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#t" x="384.849" y="521.16" width="100%" height="100%" transform="translate(-72 -124.32)"/><path d="M216.719 365.16H384v48.598H215.879V365.16zm0 1.559v-.84h.84v47.16h-.84v-.84H383.16v.84h-.719v-47.16h.72v.84zm0 0"/><path d="M3.121 493.078H169.56v47.16H3.12zm0 0" fill="#97ca00"/><use xlink:href="#l" x="100.8" y="648.36" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#c" x="107.062" y="648.36" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#s" x="116.464" y="648.36" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#g" x="125.866" y="648.36" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#t" x="136.209" y="648.36" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#u" x="145.799" y="648.36" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#v" x="151.023" y="648.36" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#v" x="157.285" y="648.36" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#c" x="163.547" y="648.36" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#k" x="172.949" y="648.36" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#l" x="183.292" y="648.36" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#m" x="189.685" y="648.36" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#k" x="199.087" y="648.36" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#l" x="209.43" y="648.36" width="100%" height="100%" transform="translate(-72 -124.32)"/><path d="M3.121 492.36h167.277v48.6h-168v-48.6zm0 1.558v-.84h.84v47.16h-.84v-.84H169.56v.84h-.72v-47.16h.72v.84zm0 0"/><path d="M216.719 238.68H383.16v47.16H216.72zm0 0" fill="#ffca00"/><use xlink:href="#c" x="316.44" y="393.96" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#c" x="325.842" y="393.96" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#h" x="335.432" y="393.96" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#i" x="345.775" y="393.96" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#q" x="350.999" y="393.96" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#e" x="356.452" y="393.96" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#w" x="360.63" y="393.96" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#k" x="364.808" y="393.96" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#c" x="375.15" y="393.96" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#k" x="384.74" y="393.96" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#l" x="395.083" y="393.96" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#m" x="401.345" y="393.96" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#k" x="410.747" y="393.96" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#l" x="421.205" y="393.96" width="100%" height="100%" transform="translate(-72 -124.32)"/><path d="M216.719 237.96H384v48.599H215.879V237.96zm0 1.56v-.84h.84v47.16h-.84V285H383.16v.84h-.719v-47.16h.72v.84zm0 0"/><path d="M216.719 3.121H383.16v47.16H216.72zm0 0" fill="#ffca00"/><use xlink:href="#x" x="343.2" y="158.4" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#b" x="358.996" y="158.4" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#c" x="369.338" y="158.4" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#d" x="378.928" y="158.4" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#k" x="384.153" y="158.4" width="100%" height="100%" transform="translate(-72 -124.32)"/><use xlink:href="#l" x="394.495" y="158.4" width="100%" height="100%" transform="translate(-72 -124.32)"/><path d="M216.719 2.398H384V51H215.879V2.398zm0 1.563v-.84h.84v47.16h-.84v-.84H383.16v.84h-.719V3.121h.72v.84zm0 0M216.719 145.2H86.399v-.72h.722v81.598H85.56v-82.437h131.16zm0 0"/><path d="M86.398 238.68l7.801-18.84-7.8 4.68-7.919-4.68zm0 0"/><path d="M201.36 147.238c.359 0 .718.364.718.723 0 .48-.36.84-.719.84a.82.82 0 0 1-.84-.84c0-.36.36-.723.84-.723zm-6 1.68c.359 0 .718.363.718.84 0 .363-.36.722-.719.722-.48 0-.84-.359-.84-.722 0-.477.36-.84.84-.84zm-5.88 2.402c.48 0 .84.36.84.84 0 .36-.36.719-.84.719-.359 0-.718-.36-.718-.719 0-.48.36-.84.718-.84zm-5.761 2.399c.48 0 .722.36.722.84 0 .359-.242.722-.722.722s-.84-.363-.84-.722c0-.48.36-.84.84-.84zm-5.399 3.12c.48 0 .84.36.84.84 0 .481-.36.84-.84.84a.82.82 0 0 1-.84-.84c0-.48.36-.84.84-.84zm-5.16 3.602c.48 0 .84.36.84.84 0 .477-.36.719-.84.719s-.719-.242-.719-.719c0-.48.239-.84.72-.84zm-4.922 3.957c.48 0 .84.36.84.723 0 .48-.36.84-.84.84-.36 0-.718-.36-.718-.84 0-.363.359-.723.718-.723zm-3.957 4.801c.48 0 .84.36.84.84 0 .36-.36.719-.84.719s-.84-.36-.84-.719c0-.48.36-.84.84-.84zm-3.96 4.922c.359 0 .718.36.718.719 0 .48-.36.84-.719.84a.82.82 0 0 1-.84-.84c0-.36.36-.719.84-.719zm-2.52 5.758c.48 0 .84.36.84.723 0 .476-.36.84-.84.84-.36 0-.723-.364-.723-.84 0-.364.363-.723.723-.723zm-2.403 5.762c.48 0 .84.359.84.84 0 .359-.36.718-.84.718-.476 0-.718-.36-.718-.719 0-.48.242-.84.718-.84zm-1.078 6.117c.36 0 .72.363.72.844 0 .359-.36.718-.72.718-.48 0-.84-.36-.84-.718 0-.48.36-.844.84-.844zm-.84 6.242c.36 0 .72.36.72.84 0 .36-.36.719-.72.719-.48 0-.84-.36-.84-.72 0-.48.36-.839.84-.839zm-.242 6.238c.364 0 .723.364.723.84 0 .363-.36.723-.723.723-.476 0-.84-.36-.84-.723 0-.476.364-.84.84-.84zm.48 6.242c.481 0 .84.36.84.84 0 .36-.359.72-.84.72-.359 0-.718-.36-.718-.72 0-.48.36-.84.719-.84zm.602 6.239c.36 0 .72.36.72.84s-.36.84-.72.84a.82.82 0 0 1-.84-.84c0-.48.36-.84.84-.84zm1.2 6.242c.48 0 .84.238.84.719 0 .48-.36.84-.84.84-.36 0-.72-.36-.72-.84s.36-.72.72-.72zm0 0" fill="#3063ff"/><path d="M216.602 144.48L196.559 141l6.363 6.602-2.883 8.757zm0 0M159.48 238.68l2.88-20.16-6.481 6.48-8.758-2.64zm0 0" fill="#3063ff"/><path d="M87.121 285.84v67.441H85.56V285.84zm0 0"/><path d="M86.398 365.879l7.801-18.84-7.8 4.68-7.919-4.68zm0 0"/><path d="M156.121 300.719c.48 0 .84.36.84.84s-.36.84-.84.84c-.36 0-.723-.36-.723-.84s.364-.84.723-.84zm0 6.36c.48 0 .84.362.84.722 0 .48-.36.84-.84.84-.36 0-.723-.36-.723-.84 0-.36.364-.723.723-.723zm0 6.241c.48 0 .84.36.84.84 0 .36-.36.719-.84.719-.36 0-.723-.36-.723-.719 0-.48.364-.84.723-.84zm0 6.239c.48 0 .84.359.84.84 0 .48-.36.84-.84.84-.36 0-.723-.36-.723-.84 0-.481.364-.84.723-.84zm0 6.359c.48 0 .84.363.84.723 0 .48-.36.84-.84.84-.36 0-.723-.36-.723-.84 0-.36.364-.723.723-.723zm0 6.242c.48 0 .84.36.84.84 0 .36-.36.719-.84.719-.36 0-.723-.36-.723-.719 0-.48.364-.84.723-.84zm0 6.36c.48 0 .84.238.84.718s-.36.84-.84.84c-.36 0-.723-.36-.723-.84s.364-.718.723-.718zm0 6.238c.48 0 .84.363.84.722 0 .48-.36.84-.84.84-.36 0-.723-.36-.723-.84 0-.359.364-.722.723-.722zm0 6.242c.48 0 .84.36.84.84 0 .36-.36.719-.84.719-.36 0-.723-.36-.723-.72 0-.48.364-.839.723-.839zm0 0" fill="#3063ff"/><path d="M156.121 285.84l-7.8 18.84 7.8-4.68 7.918 4.68zm0 0M156.121 365.879l7.918-18.84-7.918 4.68-7.8-4.68zm0 0M300 427.918c.36 0 .719.363.719.84 0 .363-.36.722-.719.722-.48 0-.84-.359-.84-.722 0-.477.36-.84.84-.84zm0 6.363c.36 0 .719.239.719.719s-.36.84-.719.84a.82.82 0 0 1-.84-.84c0-.48.36-.719.84-.719zm0 6.239c.36 0 .719.359.719.718 0 .48-.36.84-.719.84a.82.82 0 0 1-.84-.84c0-.36.36-.718.84-.718zm0 6.238c.36 0 .719.363.719.844 0 .359-.36.718-.719.718-.48 0-.84-.36-.84-.718 0-.48.36-.844.84-.844zm0 6.363c.36 0 .719.36.719.719 0 .48-.36.84-.719.84a.82.82 0 0 1-.84-.84c0-.36.36-.719.84-.719zm0 6.238c.36 0 .719.36.719.72 0 .48-.36.839-.719.839a.82.82 0 0 1-.84-.84c0-.36.36-.719.84-.719zm0 6.243c.36 0 .719.359.719.84 0 .359-.36.718-.719.718-.48 0-.84-.36-.84-.719 0-.48.36-.84.84-.84zm0 6.359c.36 0 .719.36.719.719 0 .48-.36.84-.719.84a.82.82 0 0 1-.84-.84c0-.36.36-.72.84-.72zm0 6.238c.36 0 .719.36.719.84 0 .36-.36.719-.719.719-.48 0-.84-.36-.84-.719 0-.48.36-.84.84-.84zm0 0" fill="#3063ff"/><path d="M300 413.04l-7.922 18.839 7.922-4.68 7.8 4.68zm0 0M300 493.078l7.8-18.84-7.8 4.68-7.922-4.68zm0 0M156 428.04c.36 0 .719.358.719.718 0 .48-.36.844-.719.844a.823.823 0 0 1-.84-.844c0-.36.36-.719.84-.719zm0 6.241c.36 0 .719.36.719.84 0 .36-.36.719-.719.719-.48 0-.84-.36-.84-.719 0-.48.36-.84.84-.84zm0 6.239c.36 0 .719.359.719.84 0 .48-.36.84-.719.84a.82.82 0 0 1-.84-.84c0-.481.36-.84.84-.84zm0 6.359c.36 0 .719.36.719.723 0 .476-.36.84-.719.84a.822.822 0 0 1-.84-.84c0-.364.36-.723.84-.723zm0 6.242c.36 0 .719.36.719.84 0 .36-.36.719-.719.719-.48 0-.84-.36-.84-.72 0-.48.36-.839.84-.839zm0 6.36c.36 0 .719.238.719.718s-.36.84-.719.84a.82.82 0 0 1-.84-.84c0-.48.36-.719.84-.719zm0 6.238c.36 0 .719.36.719.722 0 .477-.36.84-.719.84a.822.822 0 0 1-.84-.84c0-.363.36-.722.84-.722zm0 6.242c.36 0 .719.36.719.84 0 .36-.36.719-.719.719-.48 0-.84-.36-.84-.72 0-.48.36-.84.84-.84zm0 6.36c.36 0 .719.359.719.718 0 .48-.36.84-.719.84a.82.82 0 0 1-.84-.84c0-.36.36-.719.84-.719zm0 0" fill="#3063ff"/><path d="M156 413.04l-7.922 18.839 7.922-4.68 7.8 4.68zm0 0M156 493.078l7.8-18.84-7.8 4.68-7.922-4.68zm0 0" fill="#3063ff"/><path d="M87.121 413.04v67.562H85.56v-67.563zm0 0"/><path d="M86.398 493.078l7.801-18.84-7.8 4.801-7.919-4.8zm0 0M300.719 168v58.078h-1.559V168zm0 0"/><path d="M300 238.68l7.8-18.84-7.8 4.68-7.922-4.68zm0 0"/><path d="M395.281 505.8c.48 0 .719.36.719.84 0 .481-.238.84-.719.84a.82.82 0 0 1-.84-.84c0-.48.36-.84.84-.84zm4.797-3.96c.48 0 .844.36.844.719 0 .48-.363.84-.844.84-.36 0-.719-.36-.719-.84 0-.36.36-.72.72-.72zm4.684-4.2c.476 0 .84.36.84.84 0 .36-.364.72-.84.72-.364 0-.723-.36-.723-.72 0-.48.36-.84.723-.84zm4.558-4.32c.48 0 .72.36.72.72 0 .48-.24.839-.72.839a.82.82 0 0 1-.84-.84c0-.36.36-.719.84-.719zm4.559-4.32c.36 0 .723.238.723.719 0 .48-.364.84-.723.84a.82.82 0 0 1-.84-.84c0-.48.36-.719.84-.719zm4.441-4.441c.48 0 .84.359.84.84 0 .359-.36.722-.84.722-.36 0-.718-.363-.718-.723 0-.48.359-.84.718-.84zm4.2-4.68c.48 0 .84.36.84.84s-.36.722-.84.722c-.36 0-.72-.242-.72-.722s.36-.84.72-.84zm4.199-4.68c.48 0 .84.36.84.84 0 .36-.36.719-.84.719s-.719-.36-.719-.719c0-.48.238-.84.719-.84zm4.203-4.68c.36 0 .719.36.719.72 0 .48-.36.84-.72.84a.823.823 0 0 1-.843-.84c0-.36.363-.72.844-.72zm3.84-4.917c.476 0 .84.359.84.84 0 .359-.364.718-.84.718-.364 0-.723-.36-.723-.719 0-.48.36-.84.723-.84zm3.718-5.043c.48 0 .84.242.84.722 0 .477-.36.84-.84.84a.822.822 0 0 1-.84-.84c0-.48.36-.722.84-.722zm3.72-5.16c.359 0 .722.359.722.84 0 .363-.363.722-.723.722-.48 0-.84-.36-.84-.723 0-.48.36-.84.84-.84zm3.359-5.278c.48 0 .84.36.84.84s-.36.84-.84.84c-.36 0-.72-.36-.72-.84s.36-.84.72-.84zm3.12-5.402c.481 0 .84.36.84.722 0 .477-.359.84-.84.84a.822.822 0 0 1-.84-.84c0-.363.36-.722.84-.722zm3.122-5.52c.36 0 .719.36.719.84 0 .36-.36.719-.72.719-.48 0-.84-.36-.84-.719 0-.48.36-.84.84-.84zm2.64-5.64c.48 0 .84.359.84.84 0 .359-.36.722-.84.722-.363 0-.722-.363-.722-.723 0-.48.36-.84.722-.84zm2.399-5.88c.36 0 .719.36.719.84 0 .481-.36.84-.72.84a.82.82 0 0 1-.839-.84c0-.48.36-.84.84-.84zm2.281-5.761c.48 0 .84.363.84.723 0 .48-.36.84-.84.84-.36 0-.723-.36-.723-.84 0-.36.364-.723.723-.723zm1.68-6c.48 0 .84.363.84.723 0 .48-.36.84-.84.84-.36 0-.723-.36-.723-.84 0-.36.363-.723.723-.723zm1.437-6.117c.48 0 .84.36.84.719 0 .48-.36.84-.84.84-.36 0-.718-.36-.718-.84 0-.36.359-.72.718-.72zm1.442-6.121c.36 0 .718.36.718.718 0 .48-.359.84-.718.84a.82.82 0 0 1-.84-.84c0-.359.36-.718.84-.718zm.48-6.36c.36 0 .719.36.719.84s-.36.719-.719.719c-.48 0-.84-.238-.84-.719 0-.48.36-.84.84-.84zm.48-6.242c.481 0 .72.363.72.84 0 .363-.239.723-.72.723-.48 0-.84-.36-.84-.723 0-.477.36-.84.84-.84zm-.12-6.238c.48 0 .718.36.718.84 0 .36-.238.718-.718.718s-.84-.359-.84-.718c0-.48.36-.84.84-.84zm-.48-6.238c.358 0 .722.359.722.718 0 .48-.364.84-.723.84a.82.82 0 0 1-.84-.84c0-.36.36-.718.84-.718zm-.599-6.243c.48 0 .84.36.84.72 0 .48-.36.839-.84.839a.82.82 0 0 1-.84-.84c0-.36.36-.719.84-.719zM462 366.24c.36 0 .719.363.719.722 0 .48-.36.84-.719.84a.82.82 0 0 1-.84-.84c0-.36.36-.723.84-.723zm-1.559-6.118c.48 0 .84.36.84.84 0 .36-.36.719-.84.719-.363 0-.722-.36-.722-.72 0-.48.36-.839.722-.839zm-1.8-6c.359 0 .718.36.718.84 0 .36-.359.719-.718.719-.48 0-.84-.36-.84-.72 0-.48.36-.839.84-.839zm-2.403-5.762c.48 0 .84.36.84.72 0 .48-.36.839-.84.839-.36 0-.718-.36-.718-.84 0-.36.359-.719.718-.719zm-2.277-5.879c.36 0 .719.36.719.84 0 .36-.36.72-.72.72-.48 0-.839-.36-.839-.72 0-.48.36-.84.84-.84zm-2.883-5.52c.363 0 .723.36.723.72 0 .48-.36.84-.723.84a.822.822 0 0 1-.84-.84c0-.36.364-.72.84-.72zm-3.117-5.519c.48 0 .84.36.84.72 0 .48-.36.839-.84.839-.36 0-.723-.36-.723-.84 0-.36.364-.719.723-.719zm-3-5.523c.36 0 .719.363.719.84 0 .363-.36.722-.72.722-.48 0-.839-.359-.839-.722 0-.477.36-.84.84-.84zm-3.602-5.16c.36 0 .72.363.72.844 0 .476-.36.718-.72.718-.48 0-.84-.242-.84-.718 0-.48.36-.844.84-.844zm-3.718-5.04c.48 0 .84.36.84.723 0 .477-.36.84-.84.84s-.72-.363-.72-.84c0-.363.24-.722.72-.722zm-3.72-5.16c.477 0 .84.36.84.84s-.363.84-.84.84c-.362 0-.722-.36-.722-.84s.36-.84.723-.84zm-3.96-4.8c.48 0 .719.363.719.844 0 .359-.239.718-.72.718-.48 0-.839-.36-.839-.718 0-.48.36-.844.84-.844zm-4.2-4.68c.477 0 .84.363.84.84 0 .363-.363.723-.84.723-.363 0-.722-.36-.722-.723 0-.477.36-.84.723-.84zm-4.081-4.68c.36 0 .718.36.718.723 0 .48-.359.84-.718.84a.82.82 0 0 1-.84-.84c0-.363.36-.723.84-.723zm-4.32-4.558c.48 0 .84.238.84.719 0 .48-.36.84-.84.84a.82.82 0 0 1-.84-.84c0-.48.359-.72.84-.72zm-4.56-4.442c.481 0 .84.36.84.84 0 .364-.359.723-.84.723-.359 0-.722-.36-.722-.723 0-.48.363-.84.723-.84zm-4.562-4.32c.48 0 .84.363.84.84 0 .363-.36.723-.84.723-.36 0-.718-.36-.718-.723 0-.477.359-.84.718-.84zm-4.437-4.32c.36 0 .719.363.719.722 0 .48-.36.84-.72.84a.82.82 0 0 1-.84-.84c0-.359.36-.722.84-.722zM399 274.68c.48 0 .84.238.84.718s-.36.84-.84.84c-.36 0-.719-.36-.719-.84s.36-.718.719-.718zm-4.8-4.078c.48 0 .722.359.722.84 0 .359-.242.718-.723.718-.48 0-.84-.36-.84-.719 0-.48.36-.84.84-.84zm0 0" fill="#3063ff"/><path d="M383.16 516.719l19.559-6-8.64-3.117-1.438-9zm0 0M383.16 262.2l9.48 18.12 1.438-9 8.64-3zm0 0" fill="#3063ff"/><path d="M300.719 285.84v67.558h-1.559V285.84zm0 0"/><path d="M300 365.879l7.8-18.84-7.8 4.68-7.922-4.68zm0 0"/><path d="M396.719 253.441c.48 0 .722.36.722.84 0 .36-.242.719-.722.719s-.84-.36-.84-.719c0-.48.36-.84.84-.84zm5.402-3.12c.48 0 .84.359.84.718 0 .48-.36.84-.84.84a.82.82 0 0 1-.84-.84c0-.36.36-.719.84-.719zm5.399-3.243c.48 0 .84.363.84.84 0 .363-.36.723-.84.723s-.72-.36-.72-.723c0-.477.24-.84.72-.84zm4.921-3.957c.48 0 .72.36.72.84s-.24.719-.72.719-.84-.239-.84-.72c0-.48.36-.839.84-.839zm4.797-3.96c.48 0 .84.359.84.839 0 .36-.36.719-.84.719-.36 0-.718-.36-.718-.719 0-.48.359-.84.718-.84zm4.922-3.962c.36 0 .719.36.719.719 0 .48-.36.84-.719.84a.82.82 0 0 1-.84-.84c0-.36.36-.719.84-.719zm4.559-4.32c.36 0 .722.36.722.84 0 .36-.363.722-.722.722-.48 0-.84-.363-.84-.722 0-.48.36-.84.84-.84zm3.722-5.04c.36 0 .72.36.72.72 0 .48-.36.84-.72.84a.82.82 0 0 1-.84-.84c0-.36.36-.72.84-.72zm3.598-5.038c.48 0 .84.238.84.719 0 .48-.36.84-.84.84-.36 0-.719-.36-.719-.84s.36-.72.72-.72zm3.242-5.403c.36 0 .719.36.719.723 0 .48-.36.84-.719.84a.82.82 0 0 1-.84-.84c0-.363.36-.723.84-.723zm2.04-5.878c.359 0 .718.238.718.718s-.36.84-.719.84a.82.82 0 0 1-.84-.84c0-.48.36-.718.84-.718zm.718-6.239c.48 0 .84.239.84.719s-.36.84-.84.84-.719-.36-.719-.84.239-.719.72-.719zm-.598-6.242c.48 0 .84.36.84.719 0 .48-.36.844-.84.844s-.722-.364-.722-.844c0-.36.242-.719.722-.719zm-1.68-6c.36 0 .72.36.72.719 0 .48-.36.844-.72.844a.823.823 0 0 1-.84-.844c0-.36.36-.719.84-.719zm-2.882-5.52c.36 0 .723.36.723.72 0 .48-.364.84-.723.84a.82.82 0 0 1-.84-.84c0-.36.36-.72.84-.72zm-3.719-5.16c.48 0 .719.36.719.84 0 .36-.238.719-.719.719-.48 0-.84-.36-.84-.719 0-.48.36-.84.84-.84zm-3.719-5.039c.48 0 .84.36.84.72 0 .48-.36.839-.84.839-.363 0-.722-.36-.722-.84 0-.36.36-.719.722-.719zm-4.32-4.441c.48 0 .719.36.719.723 0 .476-.238.84-.719.84a.822.822 0 0 1-.84-.84c0-.364.36-.723.84-.723zm-4.8-4.078c.359 0 .718.36.718.84 0 .359-.36.718-.719.718-.48 0-.84-.359-.84-.718 0-.48.36-.84.84-.84zm-4.923-3.961c.48 0 .84.36.84.719 0 .48-.36.84-.84.84-.359 0-.718-.36-.718-.84 0-.36.36-.72.718-.72zm-4.796-4.082c.476 0 .718.363.718.844 0 .476-.242.84-.718.84a.822.822 0 0 1-.84-.84c0-.48.36-.844.84-.844zm-5.403-3.238c.48 0 .84.359.84.84 0 .359-.36.718-.84.718-.36 0-.719-.36-.719-.719 0-.48.36-.84.72-.84zm-5.398-3.122c.48 0 .84.243.84.723s-.36.84-.84.84c-.36 0-.723-.36-.723-.84s.363-.723.723-.723zm0 0" fill="#3063ff"/><path d="M383.16 262.2l20.281-2.759-8.043-4.32v-9.242zm0 0M383.16 144.48l12.238 16.32v-9.12l8.043-4.32zm0 0" fill="#3063ff"/><path d="M300.719 50.281v58.078h-1.559V50.281zm0 0"/><path d="M300 120.96l7.8-18.839-7.8 4.68-7.922-4.68zm0 0"/></svg>������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mitogen-0.3.9/docs/images/jumpbox.graphml�����������������������������������������������������������0000664�0000000�0000000�00000066273�14656664731�0020462�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" standalone="no"?> <graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd"> <!--Created by yEd 3.14.4--> <key attr.name="Description" attr.type="string" for="graph" id="d0"/> <key for="port" id="d1" yfiles.type="portgraphics"/> <key for="port" id="d2" yfiles.type="portgeometry"/> <key for="port" id="d3" yfiles.type="portuserdata"/> <key attr.name="url" attr.type="string" for="node" id="d4"/> <key attr.name="description" attr.type="string" for="node" id="d5"/> <key for="node" id="d6" yfiles.type="nodegraphics"/> <key for="graphml" id="d7" yfiles.type="resources"/> <key attr.name="url" attr.type="string" for="edge" id="d8"/> <key attr.name="description" attr.type="string" for="edge" id="d9"/> <key for="edge" id="d10" yfiles.type="edgegraphics"/> <graph edgedefault="directed" id="G"> <data key="d0"/> <node id="n0"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="110.0" x="154.0" y="-296.9921875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="41.060546875" x="34.4697265625" y="5.93359375">laptop<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="110.0" x="154.0" y="-158.9921875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="47.072265625" x="31.4638671875" y="5.93359375">bastion<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="110.0" x="231.0" y="-21.9921875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="50.5" x="29.75" y="5.93359375">rack12a<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="110.0" x="154.0" y="-266.9921875"/> <y:Fill color="#99CC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="105.537109375" x="2.2314453125" y="5.93359375">ansible-playbook<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="110.0" x="154.0" y="-128.9921875"/> <y:Fill color="#99CC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="105.537109375" x="2.2314453125" y="5.93359375">ansible-playbook<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n5"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="110.0" x="231.0" y="8.0078125"/> <y:Fill color="#99CC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="105.537109375" x="2.2314453125" y="5.93359375">ansible-playbook<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n6"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="110.0" x="81.0" y="8.0078125"/> <y:Fill color="#99CC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="105.537109375" x="2.2314453125" y="5.93359375">ansible-playbook<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n7"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="110.0" x="81.0" y="-21.9921875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="50.5" x="29.75" y="5.93359375">rack11a<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n8"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="110.0" x="154.0" y="-236.9921875"/> <y:Fill color="#CCFFCC" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="99.513671875" x="5.2431640625" y="5.93359375">ansible_mitogen<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n9"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="110.0" x="154.0" y="-98.9921875"/> <y:Fill color="#CCFFCC" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="99.513671875" x="5.2431640625" y="5.93359375">ansible_mitogen<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n10"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="110.0" x="81.0" y="38.0078125"/> <y:Fill color="#CCFFCC" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="99.513671875" x="5.2431640625" y="5.93359375">ansible_mitogen<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n11"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="110.0" x="231.0" y="38.0078125"/> <y:Fill color="#CCFFCC" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="99.513671875" x="5.2431640625" y="5.93359375">ansible_mitogen<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n12"> <data key="d6"> <y:ShapeNode> <y:Geometry height="105.0078125" width="2.0" x="345.5" y="-29.49609375"/> <y:Fill hasColor="false" transparent="false"/> <y:BorderStyle hasColor="false" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="-1.0" y="50.50390625"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n13"> <data key="d6"> <y:SVGNode> <y:Geometry height="35.484542934485205" width="32.2024545674844" x="192.89877271625775" y="-349.95346086897035"/> <y:Fill color="#CCCCFF" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="14.101227283742219" y="39.484542934485205"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:SVGNodeProperties usingVisualBounds="true"/> <y:SVGModel svgBoundsPolicy="0"> <y:SVGContent refid="1"/> </y:SVGModel> </y:SVGNode> </data> </node> <edge id="e0" source="n1" target="n1"> <data key="d10"> <y:ArcEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"> <y:Point x="209.0" y="-143.9921875"/> </y:Path> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:Arc height="0.0" ratio="1.0" type="fixedRatio"/> </y:ArcEdge> </data> </edge> <edge id="e1" source="n0" target="n0"> <data key="d10"> <y:ArcEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"> <y:Point x="209.0" y="-281.9921875"/> </y:Path> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:Arc height="0.0" ratio="1.0" type="fixedRatio"/> </y:ArcEdge> </data> </edge> <edge id="e2" source="n8" target="n1"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="15.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="10" fontStyle="bold" hasLineColor="false" height="15.77734375" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="69.078125" x="-34.5390625" y="16.111328125">SSH (300ms)<y:LabelModel> <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.5" segment="0"/> </y:ModelParameter> <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/> </y:EdgeLabel> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e3" source="n1" target="n4"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e4" source="n9" target="n2"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="10" fontStyle="bold" hasLineColor="false" height="15.77734375" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="66.3095703125" x="-9.65478515625" y="15.611328124999993">SSH (250µs)<y:LabelModel> <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.5" segment="0"/> </y:ModelParameter> <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/> </y:EdgeLabel> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e5" source="n9" target="n7"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="10" fontStyle="bold" hasLineColor="false" height="15.77734375" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="66.3095703125" x="-55.43400573730469" y="15.611328124999986">SSH (250µs)<y:LabelModel> <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.5" segment="0"/> </y:ModelParameter> <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/> </y:EdgeLabel> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> </graph> <data key="d7"> <y:Resources> <y:Resource id="1"><?xml version="1.0" encoding="utf-8"?> <svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="57px" height="65px" viewBox="0 0 57 65" enable-background="new 0 0 57 65" xml:space="preserve"> <g> <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3398" y1="3115.7266" x2="27.5807" y2="3145.5239" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)"> <stop offset="0.2711" style="stop-color:#FFAB4F"/> <stop offset="1" style="stop-color:#FFD28F"/> </linearGradient> <path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> <path id="body_18_" fill="#ECECEC" stroke="#9B9B9B" stroke-miterlimit="10" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51 c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-11.244-6.146-11.244-6.146 c-1.771,1.655-5.61,3.802-10.063,3.802c-4.453,0-8.292-2.146-10.063-3.802c0,0-5.755,0.586-11.189,6.021 C1.378,56.689,0.5,62.768,0.5,62.768z"/> <radialGradient id="SVGID_2_" cx="22.6621" cy="21.707" r="17.7954" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#FCB57A"/> <stop offset="1" style="stop-color:#FF8C36"/> </radialGradient> <path fill="url(#SVGID_2_)" stroke="#E55E03" d="M28.106,33.486c-8.112,0-12.688,4.313-12.688,10.438 c0,7.422,12.688,10.438,12.688,10.438s14.688-3.016,14.688-10.438C42.793,38.75,36.215,33.486,28.106,33.486z M26.288,53.051 c0,0-7.135-2.093-8.805-7.201c-0.222-0.682,0.147-1.156,0.795-1.521V37.8h20.188v6.663c0.235,0.352,1.109,0.737,1.229,1.387 C40.445,49.917,26.288,53.051,26.288,53.051z"/> <radialGradient id="SVGID_3_" cx="15.2056" cy="831.1875" r="32.3071" gradientTransform="matrix(1 0 0 1 0.0801 -773.6914)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#FCB57A"/> <stop offset="1" style="stop-color:#FF8C36"/> </radialGradient> <path fill="url(#SVGID_3_)" stroke="#E55E03" d="M49.529,51.225c-2.239-2.24-5.041-3.724-7.396-4.67 c-2.854,5.51-14.021,7.807-14.021,7.807s-10.472-2.483-12.387-8.514c-2.439,0.771-5.787,2.287-8.749,5.25 c-5.592,5.592-6.47,11.67-6.47,11.67c0,1.938,1.575,3.492,3.523,3.492h48.51c1.946,0,3.521-1.558,3.521-3.492 C56.055,62.768,54.211,55.906,49.529,51.225z"/> <radialGradient id="SVGID_4_" cx="17.0723" cy="18.4907" r="11.8931" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#FCB57A"/> <stop offset="1" style="stop-color:#FF8C36"/> </radialGradient> <path fill="url(#SVGID_4_)" stroke="#E55E03" d="M13.404,44.173c1.15-1.81,2.039-3.832,3.332-5.397 c-0.514,1.027-1.669,4.084-1.669,5.148c0,5.186,10.366,9.079,14.688,10.438c-3.472,1.627-9.134-1.498-11.334-2.359 c-3.601-1.419-4.071-3.063-5.89-4.854C12.523,47.135,12.878,45,13.404,44.173z"/> <radialGradient id="SVGID_5_" cx="31.8184" cy="19.3525" r="14.63" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#FCB57A"/> <stop offset="1" style="stop-color:#FF8C36"/> </radialGradient> <path fill="url(#SVGID_5_)" stroke="#E55E03" d="M45.777,43.924c-1.317-1.568-5.11-9.424-6.604-6.617 c0.516,1.025,3.617,3.693,3.617,6.617c0,5.186-10.271,8.576-16.699,9.145c1.429,4.938,11.373,1.293,13.805-0.313 c3.563-2.354,4.563-5.133,7.854-3.705C47.754,49.045,48.006,46.574,45.777,43.924z"/> <radialGradient id="SVGID_6_" cx="30.4893" cy="4.8721" r="5.2028" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#FCB57A"/> <stop offset="1" style="stop-color:#FF8C36"/> </radialGradient> <path fill="url(#SVGID_6_)" stroke="#E55E03" d="M30.777,54.167c0.357,0.836-0.153,1.983-0.352,2.813 c-0.256,1.084-0.072,2.104,0.102,3.186c0.164,1.02,0.156,2.107,0.25,3.167c0.082,0.916,0.482,1.849,0.357,2.75"/> <radialGradient id="SVGID_7_" cx="23.2871" cy="5.3008" r="5.5143" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#FCB57A"/> <stop offset="1" style="stop-color:#FF8C36"/> </radialGradient> <path fill="url(#SVGID_7_)" stroke="#E55E03" d="M23.695,53.417c-0.508,0.584-0.476,2.209-0.398,3 c0.116,1.183,0.456,2.099,0.333,3.333c-0.192,1.943,0.154,4.479-0.436,6.333"/> <radialGradient id="face_x5F_white_1_" cx="27.5835" cy="3117.4922" r="23.425" fx="23.0139" fy="3115.0024" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#FFD28F"/> <stop offset="1" style="stop-color:#FFAB4F"/> </radialGradient> <path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 c0.086,10.2-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 C36.627,4.945,43.59,13.158,43.676,23.357z"/> <linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="6468.501" y1="-12291.5195" x2="6492.1304" y2="-12384.9688" gradientTransform="matrix(0.275 0 0 -0.2733 -1752.8849 -3351.7349)"> <stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> <stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> </linearGradient> <path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M28.415,5.625c-6.035,0.047-10.747,4.493-12.787,10.386 c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.54,13.244,36.729,5.56,28.415,5.625z"/> <path id="Hair_Young_Black_1_" fill="#5C5C5C" stroke="#353535" stroke-linecap="round" stroke-linejoin="round" d="M20.278,13.25 c3.417,4.333,9.333,6.917,9.333,6.917l-1.417-3.5c0,0,7.094,4.691,8.083,4.333c0.968-0.2-1.082-3.807-1.082-3.807 s3.138,1.795,4.854,3.969c1.803,2.28,4.285,3.504,4.285,3.504S47.027,2.719,27.289,2.744C8.278,2.709,12.058,27.678,12.058,27.678 L14.695,17c0,0,0.914,5.757,1.399,4.875C17.861,15.211,18.861,11.5,20.278,13.25z"/> </g> </svg> </y:Resource> </y:Resources> </data> </graphml> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mitogen-0.3.9/docs/images/jumpbox.svg���������������������������������������������������������������0000664�0000000�0000000�00000160612�14656664731�0017617�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="546.563" height="864" viewBox="0 0 409.922 648"><defs><symbol overflow="visible" id="a"><path d="M1.156 0v-12.938H2.75V0zm0 0"/></symbol><symbol overflow="visible" id="b"><path d="M7.313-1.156c-.594.5-1.165.855-1.704 1.062A4.866 4.866 0 0 1 3.86.22c-1.03 0-1.824-.25-2.375-.75C.93-1.04.656-1.687.656-2.47c0-.457.102-.875.313-1.25.207-.383.476-.691.812-.922a3.984 3.984 0 0 1 1.157-.515c.312-.082.78-.164 1.406-.25 1.281-.145 2.222-.328 2.828-.547.008-.219.016-.352.016-.406 0-.645-.153-1.102-.454-1.375-.406-.352-1.011-.532-1.812-.532-.75 0-1.305.133-1.656.391-.356.262-.618.727-.782 1.39L.922-6.702c.144-.664.379-1.203.703-1.61.32-.406.79-.718 1.406-.937.614-.227 1.32-.344 2.125-.344.801 0 1.453.102 1.953.297.5.188.864.422 1.094.703.238.281.406.64.5 1.078.05.274.078.762.078 1.47v2.124c0 1.469.031 2.402.094 2.797.07.398.207.773.406 1.125H7.625a3.17 3.17 0 0 1-.313-1.156zm-.141-3.547c-.574.23-1.438.43-2.594.594-.656.093-1.121.203-1.39.328-.262.117-.47.289-.626.515a1.301 1.301 0 0 0-.218.75c0 .43.16.782.484 1.063.32.281.79.422 1.406.422.614 0 1.157-.133 1.625-.407.477-.269.832-.632 1.063-1.093.164-.364.25-.895.25-1.594zm0 0"/></symbol><symbol overflow="visible" id="c"><path d="M1.188 3.594V-9.375H2.64v1.219c.343-.477.726-.836 1.156-1.078.426-.239.945-.36 1.562-.36.801 0 1.504.211 2.11.625.613.418 1.078 1 1.39 1.75.313.75.47 1.57.47 2.453 0 .97-.173 1.84-.517 2.61-.343.761-.843 1.351-1.5 1.765C6.657.016 5.97.22 5.25.22c-.531 0-1.012-.11-1.438-.328a3.28 3.28 0 0 1-1.03-.86v4.563zm1.437-8.235c0 1.211.242 2.106.734 2.688.489.574 1.082.86 1.782.86.707 0 1.312-.298 1.812-.891.5-.602.75-1.532.75-2.782 0-1.195-.246-2.093-.734-2.687-.492-.594-1.078-.89-1.766-.89-.68 0-1.277.32-1.797.952-.523.637-.781 1.555-.781 2.75zm0 0"/></symbol><symbol overflow="visible" id="d"><path d="M4.656-1.422l.235 1.406a5.97 5.97 0 0 1-1.204.141c-.574 0-1.023-.09-1.343-.266-.313-.187-.54-.425-.672-.718-.125-.301-.188-.93-.188-1.891v-5.39H.313v-1.235h1.171v-2.328l1.579-.953v3.281h1.593v1.234H3.063v5.485c0 .449.023.742.078.875.062.125.156.23.28.312.126.074.306.11.548.11.176 0 .406-.02.687-.063zm0 0"/></symbol><symbol overflow="visible" id="e"><path d="M.594-4.688c0-1.738.484-3.023 1.453-3.859.8-.695 1.785-1.047 2.953-1.047 1.281 0 2.332.43 3.156 1.281.82.844 1.235 2.012 1.235 3.5 0 1.2-.184 2.149-.547 2.844A3.905 3.905 0 0 1 7.25-.359 4.551 4.551 0 0 1 5 .219c-1.313 0-2.375-.422-3.188-1.266C1-1.89.595-3.102.595-4.687zm1.64 0c0 1.2.258 2.102.782 2.704.52.593 1.18.89 1.984.89.781 0 1.43-.297 1.953-.89.531-.602.797-1.52.797-2.75 0-1.164-.266-2.047-.797-2.641-.523-.594-1.172-.89-1.953-.89-.805 0-1.465.296-1.984.89-.524.594-.782 1.492-.782 2.688zm0 0"/></symbol><symbol overflow="visible" id="f"><path d="M2.656 0H1.187v-12.938h1.579v4.61C3.44-9.172 4.3-9.594 5.344-9.594c.57 0 1.113.121 1.625.36.52.23.945.558 1.281.984.332.418.594.922.781 1.516.188.593.281 1.23.281 1.906 0 1.605-.402 2.851-1.203 3.734C7.316-.219 6.367.22 5.266.22c-1.118 0-1.985-.461-2.61-1.39zm-.015-4.766c0 1.125.148 1.938.453 2.438.5.824 1.176 1.234 2.031 1.234.695 0 1.297-.3 1.797-.906.508-.602.766-1.504.766-2.703 0-1.219-.247-2.117-.735-2.703-.48-.582-1.062-.875-1.75-.875-.7 0-1.305.304-1.812.906-.5.605-.75 1.477-.75 2.61zm0 0"/></symbol><symbol overflow="visible" id="g"><path d="M.563-2.797l1.562-.25c.094.637.336 1.121.734 1.453.407.336.973.5 1.704.5.726 0 1.265-.144 1.609-.437.351-.301.531-.657.531-1.063 0-.351-.156-.633-.469-.844-.21-.132-.75-.312-1.625-.53-1.156-.29-1.964-.548-2.421-.766-.45-.22-.79-.516-1.016-.891a2.406 2.406 0 0 1-.344-1.266c0-.414.094-.8.281-1.156a2.58 2.58 0 0 1 .782-.89c.25-.176.586-.329 1.015-.454a4.54 4.54 0 0 1 1.36-.203c.738 0 1.382.11 1.937.328.563.211.973.496 1.234.86.27.367.454.851.547 1.453l-1.546.203c-.075-.477-.282-.852-.625-1.125-.336-.27-.81-.406-1.422-.406-.73 0-1.25.12-1.563.36-.312.241-.469.523-.469.843 0 .21.063.398.188.562.133.168.336.309.61.422.163.063.632.2 1.405.407 1.125.304 1.907.554 2.344.75a2.34 2.34 0 0 1 1.047.828c.258.367.39.82.39 1.359 0 .531-.155 1.031-.468 1.5-.305.46-.746.82-1.328 1.078-.586.258-1.246.39-1.984.39-1.22 0-2.149-.253-2.782-.765C1.145-1.055.738-1.805.563-2.797zm0 0"/></symbol><symbol overflow="visible" id="h"><path d="M1.203-11.11v-1.828h1.594v1.829zm0 11.11v-9.375h1.594V0zm0 0"/></symbol><symbol overflow="visible" id="i"><path d="M1.188 0v-9.375h1.437v1.328c.688-1.031 1.68-1.547 2.984-1.547.563 0 1.079.106 1.547.313.477.199.832.465 1.063.797.238.336.406.726.5 1.171.062.293.094.81.094 1.547V0H7.218v-5.703c0-.645-.063-1.129-.188-1.453a1.524 1.524 0 0 0-.656-.766c-.313-.187-.684-.281-1.11-.281-.68 0-1.261.215-1.75.64-.492.43-.734 1.243-.734 2.438V0zm0 0"/></symbol><symbol overflow="visible" id="j"><path d="M1.172 0v-9.375h1.437v1.422c.364-.664.696-1.102 1-1.313a1.76 1.76 0 0 1 1.032-.328c.53 0 1.07.172 1.625.516l-.547 1.484c-.387-.226-.774-.343-1.157-.343-.355 0-.671.105-.953.312a1.68 1.68 0 0 0-.578.86 6.094 6.094 0 0 0-.265 1.859V0zm0 0"/></symbol><symbol overflow="visible" id="k"><path d="M7.313-3.438l1.562.204c-.18 1.086-.621 1.933-1.328 2.546-.7.606-1.559.907-2.578.907-1.282 0-2.313-.414-3.094-1.25C1.094-1.875.703-3.082.703-4.656c0-1.008.164-1.895.5-2.657.344-.757.852-1.328 1.531-1.703a4.551 4.551 0 0 1 2.25-.578c1.008 0 1.836.262 2.485.781.656.512 1.07 1.243 1.25 2.188l-1.547.25c-.149-.633-.406-1.11-.781-1.422a2.007 2.007 0 0 0-1.344-.484c-.805 0-1.453.289-1.953.86-.5.573-.75 1.48-.75 2.718 0 1.262.238 2.18.719 2.75.476.574 1.109.86 1.89.86.625 0 1.145-.188 1.563-.563.414-.383.68-.977.796-1.782zm0 0"/></symbol><symbol overflow="visible" id="l"><path d="M1.203 0v-12.938h1.594v7.376l3.75-3.813h2.062L5.016-5.891 8.969 0H7.016l-3.11-4.797-1.11 1.078V0zm0 0"/></symbol><symbol overflow="visible" id="m"><path d="M6.734 0H5.141v-10.125c-.375.367-.875.73-1.5 1.094-.625.367-1.184.64-1.672.828V-9.75a9.651 9.651 0 0 0 2.328-1.516c.664-.593 1.14-1.171 1.422-1.734h1.015zm0 0"/></symbol><symbol overflow="visible" id="n"><path d="M9.094-1.531V0H.547c-.012-.383.05-.754.187-1.11.22-.581.567-1.156 1.047-1.718.477-.563 1.172-1.211 2.078-1.953 1.407-1.157 2.352-2.067 2.844-2.735.5-.675.75-1.316.75-1.921a2.08 2.08 0 0 0-.687-1.579c-.45-.437-1.032-.656-1.75-.656-.774 0-1.387.23-1.844.688-.461.46-.688 1.093-.688 1.906L.844-9.25c.113-1.219.535-2.145 1.265-2.781.727-.645 1.707-.969 2.938-.969 1.238 0 2.219.352 2.937 1.047.727.687 1.094 1.539 1.094 2.547 0 .523-.105 1.031-.312 1.531-.211.5-.563 1.027-1.063 1.578-.492.555-1.305 1.313-2.437 2.281-.961.805-1.575 1.352-1.844 1.641a5.081 5.081 0 0 0-.672.844zm0 0"/></symbol><symbol overflow="visible" id="o"><path d="M7.61-3.016l1.64.204c-.262.96-.742 1.703-1.438 2.234-.699.531-1.593.797-2.687.797-1.367 0-2.453-.422-3.266-1.266C1.055-1.898.656-3.086.656-4.609c0-1.57.406-2.797 1.219-3.672.813-.875 1.867-1.313 3.172-1.313 1.25 0 2.27.43 3.062 1.281.79.856 1.188 2.06 1.188 3.61v.422h-7c.062 1.031.351 1.824.875 2.375.531.543 1.187.812 1.969.812.582 0 1.078-.148 1.484-.453.414-.312.742-.8.984-1.469zM2.39-5.594h5.235c-.074-.781-.273-1.367-.594-1.765-.511-.614-1.168-.922-1.968-.922-.731 0-1.344.246-1.844.734-.5.492-.778 1.14-.828 1.953zm0 0"/></symbol><symbol overflow="visible" id="p"><path d="M.578-3.89v-1.594h4.875v1.593zm0 0"/></symbol><symbol overflow="visible" id="q"><path d="M1.125 3.61L.937 2.124c.352.094.66.14.922.14.352 0 .633-.062.844-.187a1.49 1.49 0 0 0 .516-.484c.101-.168.265-.563.484-1.188l.14-.39L.298-9.375H2l1.953 5.422c.25.7.477 1.422.688 2.172.175-.727.39-1.438.64-2.125l2.016-5.469h1.578L5.312.156c-.386 1.032-.683 1.739-.89 2.125-.281.531-.606.914-.969 1.156-.367.239-.805.36-1.312.36-.305 0-.641-.063-1.016-.188zm0 0"/></symbol><symbol overflow="visible" id="r"><path d="M-.281 3.594V2.438H10.25v1.156zm0 0"/></symbol><symbol overflow="visible" id="s"><path d="M1.188 0v-9.375h1.421v1.313c.29-.458.68-.829 1.172-1.11.489-.281 1.047-.422 1.672-.422.695 0 1.266.149 1.703.438.446.293.766.699.953 1.219C8.848-9.04 9.813-9.595 11-9.595c.926 0 1.64.262 2.14.781.5.512.75 1.305.75 2.376V0h-1.578v-5.906c0-.633-.054-1.094-.156-1.375a1.326 1.326 0 0 0-.562-.672 1.815 1.815 0 0 0-.953-.25c-.657 0-1.204.219-1.641.656-.438.438-.656 1.137-.656 2.094V0H6.766v-6.094c0-.707-.133-1.234-.391-1.578-.262-.351-.684-.531-1.266-.531-.449 0-.867.121-1.25.36-.375.23-.652.573-.828 1.03-.168.45-.25 1.102-.25 1.954V0zm0 0"/></symbol><symbol overflow="visible" id="t"><path d="M.906.781L2.437 1c.07.477.254.828.547 1.047.395.289.93.437 1.61.437.738 0 1.304-.148 1.703-.437.406-.293.676-.703.812-1.235.082-.324.125-1.003.125-2.046C6.535-.41 5.672 0 4.641 0c-1.293 0-2.293-.46-3-1.39C.93-2.329.578-3.442.578-4.735c0-.895.16-1.72.485-2.47.32-.757.789-1.347 1.406-1.765.625-.414 1.347-.625 2.172-.625 1.101 0 2.015.45 2.734 1.344v-1.125h1.469v8.11c0 1.456-.153 2.488-.453 3.093-.293.613-.762 1.094-1.407 1.438-.648.351-1.437.53-2.375.53-1.117 0-2.023-.25-2.718-.75C1.203 2.547.875 1.79.906.782zm1.313-5.64c0 1.23.242 2.132.734 2.703.488.562 1.098.844 1.828.844.727 0 1.336-.282 1.828-.844.5-.563.75-1.442.75-2.64 0-1.145-.257-2.009-.765-2.595-.512-.582-1.121-.875-1.828-.875-.711 0-1.313.29-1.813.86-.492.574-.734 1.422-.734 2.547zm0 0"/></symbol><symbol overflow="visible" id="u"><path d="M.547-3.516l2.125-.203c.125.711.379 1.23.765 1.563.395.336.926.5 1.594.5.696 0 1.223-.145 1.578-.438.364-.3.547-.648.547-1.047a.94.94 0 0 0-.234-.64c-.149-.188-.406-.348-.781-.485a43.297 43.297 0 0 0-1.75-.468c-1.168-.29-1.985-.645-2.454-1.063-.667-.594-1-1.316-1-2.172 0-.55.157-1.066.47-1.547.312-.476.757-.843 1.343-1.093.594-.25 1.3-.375 2.125-.375 1.352 0 2.375.296 3.063.89.687.594 1.046 1.387 1.078 2.375l-2.172.094c-.094-.55-.297-.945-.61-1.188-.304-.25-.761-.374-1.375-.374-.636 0-1.132.132-1.484.39a.775.775 0 0 0-.36.672c0 .262.11.48.329.656.281.23.945.469 2 .719 1.062.25 1.847.512 2.36.781.507.274.905.64 1.187 1.11.289.46.437 1.03.437 1.718 0 .618-.172 1.196-.515 1.735-.344.543-.836.945-1.47 1.203C6.72.055 5.939.187 5 .187c-1.367 0-2.414-.312-3.14-.937C1.128-1.383.69-2.305.546-3.516zm0 0"/></symbol><symbol overflow="visible" id="v"><path d="M1.11 0v-10.797H3.28v4.25h4.281v-4.25H9.75V0H7.562v-4.719h-4.28V0zm0 0"/></symbol><symbol overflow="visible" id="x"><path d="M4.516 3.172H3.094A14.524 14.524 0 0 1 1.375-.36C.977-1.586.781-2.77.781-3.906c0-1.426.242-2.77.735-4.031a14.33 14.33 0 0 1 1.609-3.047h1.422c-.68 1.492-1.149 2.757-1.406 3.796a14.18 14.18 0 0 0-.375 3.313c0 .813.07 1.64.218 2.484.157.844.364 1.645.625 2.407.176.5.477 1.218.907 2.156zm0 0"/></symbol><symbol overflow="visible" id="y"><path d="M.563-2.86l2.015-.25c.063.512.235.903.516 1.172.281.274.617.407 1.015.407.426 0 .786-.16 1.079-.485.289-.32.437-.757.437-1.312 0-.52-.14-.93-.422-1.235a1.335 1.335 0 0 0-1.031-.468c-.262 0-.574.054-.938.156l.22-1.688c.562.024.987-.097 1.28-.359.301-.258.454-.601.454-1.031 0-.363-.11-.649-.329-.86C4.641-9.03 4.352-9.14 4-9.14c-.355 0-.656.125-.906.375-.25.243-.406.594-.469 1.063L.719-8.031c.133-.645.332-1.16.594-1.547.269-.395.644-.703 1.125-.922a3.712 3.712 0 0 1 1.609-.344c1.02 0 1.836.324 2.453.969.508.531.766 1.133.766 1.797 0 .95-.524 1.703-1.563 2.265.625.137 1.117.438 1.484.907.375.46.563 1.011.563 1.656 0 .95-.352 1.762-1.047 2.438-.687.667-1.547 1-2.578 1-.98 0-1.793-.282-2.438-.844C1.04-1.22.665-1.953.563-2.86zm0 0"/></symbol><symbol overflow="visible" id="z"><path d="M4.14-10.844c1.051 0 1.868.371 2.454 1.11.707.886 1.062 2.355 1.062 4.406 0 2.043-.355 3.512-1.062 4.406C6.008-.18 5.19.188 4.14.188c-1.055 0-1.903-.399-2.547-1.204C.957-1.828.64-3.27.64-5.344c0-2.039.347-3.508 1.046-4.406.594-.727 1.41-1.094 2.454-1.094zm0 1.719c-.25 0-.476.078-.671.234-.2.157-.352.446-.453.86-.149.531-.22 1.433-.22 2.703 0 1.273.063 2.148.188 2.625.133.469.297.781.485.937.195.157.422.235.672.235.25 0 .472-.078.671-.235.196-.164.348-.453.454-.859.144-.531.218-1.43.218-2.703 0-1.27-.07-2.14-.203-2.61-.125-.476-.289-.796-.484-.953a.994.994 0 0 0-.656-.234zm0 0"/></symbol><symbol overflow="visible" id="A"><path d="M.922-7.828h1.922v1.062C3.52-7.586 4.332-8 5.28-8c.5 0 .93.105 1.297.313.375.199.676.507.906.921.344-.414.711-.722 1.11-.921A2.783 2.783 0 0 1 9.875-8c.57 0 1.055.121 1.453.36.406.23.707.57.906 1.015.133.336.204.875.204 1.625v5h-2.063v-4.469c0-.781-.074-1.285-.219-1.515-.187-.29-.484-.438-.89-.438A1.467 1.467 0 0 0 7.89-5.375c-.106.344-.157.883-.157 1.61V0H5.656v-4.297c0-.758-.039-1.25-.11-1.469a.91.91 0 0 0-.343-.484c-.156-.113-.367-.172-.625-.172-.324 0-.617.09-.875.266-.25.168-.433.414-.547.734C3.051-5.098 3-4.555 3-3.797V0H.922zm0 0"/></symbol><symbol overflow="visible" id="B"><path d="M.36-2.234l2.078-.313c.082.399.257.703.53.922.27.21.65.313 1.141.313.532 0 .93-.098 1.204-.297a.678.678 0 0 0 .28-.563.542.542 0 0 0-.155-.39c-.106-.094-.336-.18-.688-.266-1.68-.375-2.742-.711-3.188-1.016-.617-.414-.921-1-.921-1.75 0-.687.265-1.258.796-1.718C1.978-7.77 2.813-8 3.938-8c1.07 0 1.868.18 2.391.531.52.344.879.856 1.078 1.532l-1.953.359a1.173 1.173 0 0 0-.484-.688c-.23-.164-.563-.25-1-.25-.543 0-.934.079-1.172.235a.487.487 0 0 0-.235.422c0 .148.067.273.204.375.187.136.832.328 1.937.578 1.102.25 1.875.558 2.313.922.437.367.656.875.656 1.53 0 .72-.305 1.34-.906 1.86-.606.512-1.493.766-2.657.766-1.074 0-1.921-.211-2.546-.64A2.988 2.988 0 0 1 .359-2.235zm0 0"/></symbol><symbol overflow="visible" id="C"><path d="M.516 3.172c.406-.875.691-1.547.859-2.016.164-.46.316-.992.453-1.593.145-.614.25-1.192.313-1.735.07-.55.109-1.117.109-1.703 0-1.164-.125-2.27-.375-3.313-.25-1.039-.71-2.304-1.375-3.796h1.406a13.396 13.396 0 0 1 1.719 3.359c.414 1.18.625 2.375.625 3.594C4.25-3 4.086-1.895 3.766-.72 3.39.594 2.78 1.891 1.937 3.171zm0 0"/></symbol><symbol overflow="visible" id="D"><path d="M7.64-1.922V0H.376a5.106 5.106 0 0 1 .703-2.063c.395-.656 1.172-1.519 2.328-2.593.938-.875 1.508-1.461 1.719-1.766.29-.426.438-.848.438-1.266 0-.468-.125-.82-.375-1.062-.25-.25-.594-.375-1.032-.375-.43 0-.773.133-1.031.39-.262.262-.406.696-.438 1.297L.626-7.655c.113-1.133.492-1.946 1.14-2.438.657-.5 1.47-.75 2.438-.75 1.07 0 1.91.29 2.516.86.613.574.922 1.289.922 2.14 0 .492-.09.953-.266 1.39a5.84 5.84 0 0 1-.828 1.376c-.25.324-.703.789-1.36 1.39-.656.594-1.074.993-1.25 1.188-.167.2-.308.39-.421.578zm0 0"/></symbol><symbol overflow="visible" id="E"><path d="M.672-2.781L2.734-3c.063.469.235.844.516 1.125.29.273.629.406 1.016.406.425 0 .789-.176 1.093-.531.301-.352.454-.883.454-1.594 0-.656-.153-1.148-.454-1.484-.293-.332-.68-.5-1.156-.5-.594 0-1.125.262-1.594.781L.922-5.03l1.062-5.625h5.47v1.937H3.546L3.234-6.89a3.137 3.137 0 0 1 1.407-.343c.914 0 1.691.34 2.328 1.015.644.668.968 1.532.968 2.594a3.87 3.87 0 0 1-.78 2.375C6.456-.29 5.483.188 4.233.188c-1 0-1.812-.266-2.437-.797-.625-.54-1-1.266-1.125-2.172zm0 0"/></symbol><symbol overflow="visible" id="F"><path d="M.813-7.828h2.062v3.547c0 1.023.102 1.715.313 2.078.257.48.644.719 1.156.719.27 0 .523-.086.765-.266.25-.176.43-.422.547-.734.125-.313.188-.907.188-1.782v-3.562h2.093V0H6v-.938c-.148.274-.29.477-.422.61a1.601 1.601 0 0 1-.531.36 1.467 1.467 0 0 1-.61.155c-.355 0-.664-.093-.921-.28-.2-.145-.414-.427-.641-.845V3H.812zm0 0"/></symbol><clipPath id="G"><path d="M273 75.121h48v53.52h-48zm0 0"/></clipPath><image id="H" width="405" height="446" xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAA0JCgsKCA0LCwsPDg0QFCEVFBISFCgdHhghMCoyMS8qLi00O0tANDhHOS0uQllCR05QVFVUMz9dY1xSYktTVFH/2wBDAQ4PDxQRFCcVFSdRNi42UVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVH/wAARCAG+AZUDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD06iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKbJIkUbSSOqIoyzMcAD61xuuePre2LQ6XGLiQcGV8hB9B1P6UAdk7pGhd2CKOSzHAFc/qHjXRLIlVna6cfwwDI/PpXmeo6tqOrS7ry5kl54Too+ijioY7SRuWwo96AOvvPiLdvkWdjFEOxlYuf0xWLceMNfuM5v2jB7Roq4/EDNUUs4x94lv0qVYYl6Iv5UAV5dU1K4J82/upP8AelY/1qu3nyct5jfXJrU6UUAZXlSf882/KlXz4/u+Yv0yK1KKAKUepalB/q766j/3ZWH9avQeK9et8bNSlb/roA/8waSmNFG3VFP4UAbVr8QtViwLiC3nXucFW/MHH6Vu2PxC02bC3dvNbE9x86j8uf0rhGtIW6Ar9DUL2TD7jg/WgD2Ww1Sw1Fd1ndxTd8K3zD6jqKuV4Rtmt3DjcjKchlPT8a6HSfG+rWBVJ3F5CP4ZT834N1/PNAHq1FYmi+KdM1jakUvk3B/5Yy8E/Tsa26ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArP1nWbLRbXz7uTBP3I1+859h/WofEWvW2hWPmyfPM+RFEDyx/wryXUL+71e+a5unMkr8AdlHoB2FAF3X/El/rkpEreVbA/LAh4H19TWfDaM/wAz/KPTvU8FssXzNy/8qsUAMjjSMYRQKfRRQAUUUUAFFFFABRRRQAUUUUAFFFFABUEtrG/IG0+1T0UAZkkMkJyenZhXVeHfHF1YlbfUt1zb9BJ1kT/4ofrWQRkYPIqnPadWi/75oA9qs7u3vrZLi1lWWJxkMpqavGNC1280K78yBt0TH95Cx+Vv8D716zo+rWms2S3Vo+R0ZD95D6GgC9RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFUtX1O30jTpLy4Pypwqjq7dgKukgAknAFeR+MdeOs6oUic/Y4CViHZj3b8f5UAZmqajdaxqL3Vwd0jnCqOijsB7VLbwCFfVj1NMtIPLXew+Y/pVmgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigCvc24lG5eH/AJ0uiavdaHqAuYDx0kjPRx6H/Gp6rXcG8b1HzDr70AexaXqNtqthHeWr7o3HQ9VPcH3q3XkXhHxA+iaiBIxNnMQJV/u+jD6fyr1xWV0DqwZWGQR0IoAWiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiikZgqlmICgZJPagDlfH+tGw0sWMLYnugQSP4U7/AJ9PzrzW0i8yTcR8q1c8Q6m2sa1PdZJQttiHog6f4/jSwxiKIL37/WgCSiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAoXkOxt6j5W/Q133w81w3Fs2k3D5khG6Enuncfh/L6Vx0iCRCp6Gqdjdz6XqUV1CcSwvke/qPoRQB7lRUFjdxX1lDdwnMcqBh+Pap6ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK5zx3qX2Dw9JGjYluj5S/T+I/lx+NdHXl/xFv/tOuraKcpaoBj/abk/pj8qAObs498249F5rQqCzTZAD3bmp6ACiiigAoqtdzmMbEPzHqfSqeyYRifa4QnAfBwT6ZoA1aKrWtx5nyOfm9fWrNABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFUr6PkSD6GrtMlTzI2X1FAHX/DXVPMtp9Lkb5ov3sX+6eo/PH513FeLeHNQOl69a3JOED7ZP908H/H8K9poAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigBHdY0Z2OFUZJ9BXht9cvqGpz3LfenlLfTJr1vxddfY/DF9IDhmj8sf8C+X+teRWa7rgH05oA0AAAAOgpaKKACkZgqlj0HNLVa9fbDt7saAILaGS/v44E+/M4Ue3/6q9NfSrSTShpzR/uAu0eo9/r3rkvAtl5uoS3jD5YV2r/vH/62fzru64sRP3rLodVGPu3fU8q1bTbjSb4wS9OqSDow9afbXAlGDw4/WvRdV0y31W0NvcD3Rx1Q+orzbU9NutJvDDOMHqjjow9RW9Krzqz3MqlPl1Wxboqvb3Ik+VuH/nVitjIKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDNuk2Tt6HmvYfC99/aHh2zuCcvs2P8A7y8H+WfxryS/XhH/AArufhld77G8syf9XIJF+jDB/wDQf1oA7eiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA434l3Pl6PbWwODLNuP0Uf4kVwNgv32/Cup+J0+7UrK3z9yIv/wB9HH/stc1ZDEGfU5oAnJCgknAFNjlSTOxs4qG9bEO3+8ar2TYuAPUEUAaNZ96+6fHZRir5OASegrOt4nvL2OFfvTSBR+JoA9D8I2n2XQYSRh5iZT+PT9AK2qbFGsUSRoMKgCgewp9eXJ8zbO9KysFVdR0621K1NvcpuU9COqn1Bq3RSTtqgep5dreh3WjzfON8DH5JQOD7H0NVre7xhZf++q9XmhiuIWimRZI2GCrDINcNr3hGW23XGnBpYepi6sv09R+tdtOsnpI5p0raozgQRkciisyGd4TjqO6mr8UySj5Tz6GugxFlfy42fGcVWivcnEgAHqKtOodCp6EYrKZSrFT1HFAGsCGGQcilrLimeI/KePQ1ehuEl4+63oaAJqKKKACk3KW27hn0zS1lSK0cpBPIPWgDVoqjDeEfLJyPWrqsGXKnIoAWiiigAooooAhu13W7e3NbHw6ufJ8RmEnieFlx7j5v6GstxuRl9Rik8Lz/AGfxLp8mcfvlT/vr5f60Aez0UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAHlHxBl8zxTKmf8AVxov6Z/rWbbDFug9qm8YSeZ4qv29JAv5AD+lRxDESD2FAFO+bMqr6CoYW2zIfQ0spMtw2OSTgVPqlmbDUJbUnOzHP1AP9aV1ew7aXJ7pttu3qeKu+C7X7RrqyEZWBC/49B/P9KyruTfHEPUbjXYeA7Xy9PuLojmV9o+i/wD1yfyrOtK0GXTV5I6qlpKWvPOwKKWigQUYpaKYGFrfhmz1TdKmILk/xqOG+o/rXB6lpV7pU225iKjPyyLyrfQ16zUc0MVxE0U0ayRtwVYZBraFZx0exlKmpHk8N4RxIMj1FR3YUuJEIIb09a6/V/BaPul0x9h6+S54/A/41yF3Z3NlMYbqF4nHZh1+nrXXGpGexzyi47nT6BY2Wv6Mbe4XZdWx2rKv3tp6Z9R1H4VjavoF9pLFpE8yDPEqdPx9Kl8JXxstchUn5J/3TD69P1xXpTKGUqwBB4IPesJzlSl5G0YqcfM8khu2Th/mX9auRyJIuVOa6jWPB9vc7pbAi3l67D9w/wCFcZeWV5ptx5dxE8T9j2P0PetoVIz2MpQcdy9VS+jyokHUcGkivO0o/EVZyksZAIKnjitCClZWct9MYYAGl2llQnBbHUD3x/KmK8ttIVIKkHDIwxT7Sd7G/inX70Lg/XB6V6BrOhWuswCZMR3BXKSgfeHYH1rKdTkkr7M0jDmWm5xcMyyrlevcVJVC7tbnTbswzoY5F/Ij1HqKs284mX0YdRWid9UZ7E1FFFMArNhk+z3qSj/lnIG/I1pVl3AxO/1oA9460VBYv5thbyf3olb8wKnoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPFPEbb/EepH/p5kH5MRT5G8uAt6CoNaO7XL8+txIf/AB406+bEIX+8aAHeH7f7VrdrGRkB95+g5/pWr43ttl9BcgcSptP1H/1iPyp3ga23XVzckfcUIPqef6frW/4j05tS0p44xmaM74/cjt+VcU6vLXR1QhekzzgknGe1eq6Fa/Y9GtICMMIwW+p5P6mvPNK0m6u9Tiha3kVFcGUspAUA85r1FTkU8RNO0UTRi9WOoopRXMbhS0UUxBRS0UAJRS0lACVDdWtvdwmK5hSVD2YZqekoAw7TwtpdpfrdxLIWQ7kRmyqn19fzNbdFFEpOW4JJbCVFc20F3CYbiJZYz1VhmpaSpKOP1TwWpzJpsu3/AKZSHj8D/j+dctdWV7p0u24hkhbsSOD9D0Nes010SRSjqGU9QwyDW8MRKO+plKinseQqsk8oVQXkc4AA5Jr1iyiaCxt4X5aONVP1AxTYdPsreQyQWkET/wB5IwDVipq1faWsVTp8hn6xpNvq1qYphhx9yQdVP+HtXm95a3Gm3rQTLskQ9exHqPavV6yvEGjR6vaYGFuE5jf+h9qdGryOz2FVp82q3OHgmEyZHBHUVLWa6TWVy0ciFJEOGU1ehlWVcr17j0r0DjJKzLr/AI+HrTrMuv8Aj5f8P5UAe06G27QdPb1toz/46KvVQ0D/AJF7Tf8Ar1i/9AFX6ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDw/WMjWr4HqLiT/0I0y+bMoX+6Km15duv6ivpcyf+hGqchMs5xyWOBQB3vhC28jREcjDTMXP8h/KtyoLOEW1nDAvSNAv5Cp68WcuaTZ6kVyxSFFOU4NNFLSQMnByM0tRK2KlBzWqdzNqwtLSUVRI6ikopiCkpaSkMKSlpKBiUUUUgCkpaSkMSkpaSkMKSlpKBiUUUUhmNr+gw6tFvXEd0o+V/X2PtXn88Fzp900UyNHKvUH/PIr1iqGq6Va6pB5dwnzD7sg+8tb0q7ho9jGpS5tVucBBcrLwflb09ap3X/Hw9XNV0a60uTMg3wk/LKvQ/X0NZxJY5Jya74yUldHG4uLsz27Q12aFp6+ltGP8Ax0VeqGyj8qxgi/uRqv5CpqoQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAeMeKE2eJtRH/Tdj+fP9ag0aHz9UgXHCtvP4c1oeOI/L8WXvo2xh+Kil8Kw5mnnI+6Ag/Hn+lY15clNs1ox5qiR3URzGh9QKfUNqc26fTFTV5CPRe4opaQUtUSKKerY+lMpaaEyYHNLUStipAc9K0TuZtC0tJRVCCiikoAWkoopDEoopKACiikpDCkpaSkMKSiikMSiiigYlIehpaa5+U0mNGffgNGFYAg9Qe9QaN4S0q7nN3KkmI3GIg3yHvyMZ/Wpr0/Mo9q3PDybdPLf3nJ/kKvCN+1shYlL2VzUooor1jzAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA8z+I9lKmtx3YjYxSxBd4HG4E8flirul6XJp+gWkksZSWcs7KwwR0x+ld/Wbr0XmacWA5jYN/T+tYYmPNSZth5ctRGPYtmIj0NWqz7FsSFfUVfFeRHY9Ka1HUtNpaogWlpKWmIWlBI6U2lpiJQwNLUNPD+tWpEND6KTOaKoQtJRRQAUlFFIYlFFJQMKKKKQCUlLSUhhRRSUhhUch7U5jgVET3NRJ9C4ooXTZnPtxXUaVH5WmwL6ru/Pn+tcqAZrgKOrtgfjXaIoRAo6AYFdOBjeUpGOMdoqItFFFemeeFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABTJ4xNBJEejqRT6KTV9Bp21OKQmGcbhgqcH+tagqDXLfydQZgPlk+YfXvS2sm+Eeo4NeE48knFnr354qSJ6KSlqiBaWkopiHUUlFADqKbS0xCg4pwf1plFF7BYlBB6UVDmnBiKrmFyklJTd/qKNw9ad0KwtFGR60lAC0lFJkUhi0lIWA70hcUrodhaazAU0uT7U2pcuxSiBJJ5qG4bZCx7nipap3r5YIO3JrNs0itSfRIfN1FDj5YwWP9P1rqayPD1vstXnI5kOB9B/9fNa9erhIctNeZ5+JnzVPQKKKK6jmCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAzdctvPsTIo+eL5vw7/wCfasCzk2S7T0b+ddiQCCCMg1yGoWxs7x4xnb95D7V5mNp2aqI9DCTunBl6iooJPNiDd+hqWuVG7QtLTaWmSLS02loAWikopiFopKKAFopKKQwopKKACiikoAKKKSkMKKKSkMKSiigYjEKpJ6Cs9Ve5uAqjLO2BU95JgCMd+TV/w9abpGumHC/Kv1706cPaTUQlL2cHJm5DEsMKRJ91RgU+iivcStojx27hRRRTAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArO1qz+1Wu9BmSPke47itGionBTi4sqEnCSkjjLaXypOfunrWjUetWH2afzox+6kP/fJ9KhtJtw8tjyOleJKLpycJHrXU48yLdFJRTJHUUlFAC0UlLTEFFFFABRRSUALRSUUhhRSUUAFFFJSGFFFJQMKbI4jQse1OqhcS+Y2B90frUt2GlcSKOS6uVjXl3NdhbwpbwJCn3VGPrWbodj5EX2iQfvJBwD2Fa1ephKPJHme7ODE1eeXKtkFFFFdhyhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQBHPClxC0UgyrDBrk721ksrkxt9Vb1FdZcTR28DzSttRBkmuCvtUmvL5rhuF6KnYLXnY5wSV9z0MDGcm7bGxbziVcH7w61PWPDKGAkjP/1q0YJxKMHhvSuBSudUo2J6KSlqiApaSimAtFJRQAtJRRQAUUUlIBaKSigApKKKBhRRVS4uOqIfqaTdhpXC5nzmNT9TWdcXJhICEb+vTOKdPN5YwvLnoKqW8qCU+coZW6kjpWTep004aXZ0Ol+KCXEWoKADwJVGMfUf4V06sGUMpBUjII7153dWnljzI+U7j0rT8Oa0bSRbS5b/AEdj8rH+A/4V6GHxbT5Kn3nHicHFrnpfcdlRRRXqHkhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRWF4o1P7Ja/ZYmxNMOSP4V/+v/jWdSoqcXJmlKm6klFGP4i1c3s5t4H/ANGQ44/jPr9Ko2tt/ok07D+Ehfy61UjQySKi9WOK3J0EdjIi9FQgflXhuTqyc5Hv8qpRUImPaMROoB4PWtEEg5BwazbX/j4T/Pati1UPIVYZG2s4hV0ZNDdA/LJwfWrOaozWzJyvzL+opsU7x8Dkehq723OdxT2NGjNQx3CPxnB9DUtVciwtGaSimAtFJRQAtFJRQAUUUhIAyTgUgFprMFGWOBUMl0q8J8x/SqrM8rc5J7Ck2Uokk1wX+VeF/nVaRisbMOoGauw2uPmk6+lUZ/8AUv8A7pqHfqaRteyKVqxa7Usck5/lTry38tt6D5T1HpTLP/j6T8f5VpsAwIIyDUpXR1N2ZUsbj/ljIeD90n+VRXlv5L7lHyN+lR3EJhkx2PINXreRbq3McnLAYP8AjRvoJ6ao3PC+refH9hnbMqD92T/Evp+FdDXmuZbO6DIxV0OVYV32lX6ajYpOuA3R1/utXrYOvzrklujyMbh+R+0jsy5RRRXeeeFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQBHcTR21u80pwiDcTXnV9dyXt5JcSdXPA9B2FdB4u1HLLYRtwMNJj9B/X8q5ivHxtbmlyLZHt4CjyR53u/wAi9pMe64aQ/wAA/U/5NaV1/wAekv8AuH+VVdIXFuzerVbuv+PSb/cP8qwirRNpu8zDtf8Aj4T/AD2rasv9cf8AdrFtf+PhP89q2rL/AF5+lZQHXL1RS26Sc4w3qKmoraxy3sZ0ltInbcPUU1JpI+Axx6GtOmPFG/3lBqeXsVz9yqt5/eT8qlF1EepI+opGskP3WI/WojZSDoymj3h+6ywJoj/GKXzY/wC+v51TNpMP4Qfxo+yzf3P1FK7Cy7lozxD+MUxruMdMmoRaTHsB+NPWyb+JwPpRqHujWu2P3VA/Woi0krYJLH0q4lnEvXLfWp1VUGFUAe1Plb3FzJbFKO0duXO0frVuOJIxhR+NPoqkrEuTYh6VjT/6l/8AdNbR6Viz/wCpf/dNRM0p7lGz/wCPpPx/lWoay7P/AI+k/H+VahrNbHXPciniEsZXv2NZ0MjQTBvQ4IrVrPvo9sgcdG/nQ+4RfQtXcInhDpywGR7ijQdSOnXwLn9xJ8sg9PQ/hRYSb4Np6qcfhVW+g8uTeo+Vv0NWpOLU4kuKknTlsejgggEHIPeiue8K6n58H2KVv3kQ+Qnuvp+FdDXvUqiqRUkfPVabpTcWFFFFaGYUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVV1K9TT7KS4fkgYUf3m7CrVcX4rvTPqAtlP7uAdPVj1rDEVfZQb6nRhqPtqii9jJUS3t4SzFnkbLN/OoWxuOOmeK2dLt/Lh81h8z/AKCsd12uynqDivCkrK7PfjJNtLobWmDFknuT/Opbr/j1m/3D/KodMObNR6Eiq+o3py0Ef0Y/0rW6UTDlbnoUrX/j4T/Patqx/wBefpWPaIxmVgOB3rZsAfOJ7bazih1mmX6MUtFbHIJijFLRQAmKMUtFMBMUYpaKAExRS0UAJRS0UAJRilooEIRxWJP/AKl/901uHpWHMMwuB1INZzV9Ea03bVlGz/4+k/H+VahrIicxSq+M47VpxTJMuVP1HpWSO2XcfVa+GYM+hqzVe+OLfHqRTYluRaaf3rr6jNXZYxJGUboao6aP3zn0XFaNOOwpfEZMUk1ldrIh2yRtkGu/02/i1GzWePg9GX+6fSuNu4PNTcv3x096Zo2pPpl6H5MTcSL6j1+orow1f2MrPZnPiqHt4XW6PQKKRHWRFdCGVhkEdxS17Z4QUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRQSAMngUANdxHGzscKoJNebszXd4Xb70r5P4mup1zX7Vbaa0t282R1KFl+6uevPeuZ04A3qbiBjOK8nG1FOSinsexgabhCU2tzdUAAAcAVianD5V2xx8r/MP61tioL+2+02+B99eV/wrnnG6NqcuWWpS0iX78R/3h/X+lUZwVuJA3Xcc0QSNbzq+OVPIqzqKKzJcRnKSDr71jvH0Om1pepbmt3gCHGY2AKMOhFWbS7RRskAX/aA/nUvh65jurNrGcBinKg91/wDrUt7pEkWXt8un93uP8a9uKhiKaZ4E+ehUcSyMEZByKXFY0NxLAcA8d1NaEN9FJw3yN79K5KmHlDbVG8K0Zb6FnFGKBgjI5FLWBqJijFLRQAmKMUtFACYopaKAEopaKAExRio5biKH77DPoOtUJ7+R+IxsX171rCjOexnKrGO5cuLmOEEE5b+6KyQGkcKoJJ4AFWLWynu2yi4Xu7dK3rOwhtF+Ubn7uetd9KhGnr1OSdWU9OhhzeH7iSISKUEmMlc1i2zlJ1x3ODXb6hdrZWckzHkDCj1PauJtkL3C+xya8/HRgprl36nqYCU5QfNt0NSs++l3yBB0X+dWLq4ES7VPzn9KqW0JnlxztHLGuF9juirasu6fHsgLHq5z+FWaXAAAAwBSVexne7uNrPvotr+YBw3X61oGo5k8yJl9RxUsqLszZ8JX5mtns5DlouU/3f8A6x/nXQ157ot0bTVoJM4Uttb6HivQq9jBVOenZ9Dx8dS5Kl11Ciiiuw4gooooAKKKKACiiigAooooAKKKKACiiigAoorD1rxBHZbre2xJcdCeyf4n2qKlSNNc0maU6cqkuWKNDUdSttOi3zv8x+6g5Zq47VNcutRJTPlQdo1PX6nvVJmuL65LszSytySa07XTo4sNJh3/AEFeTVxM62kdEevSw1OhrLVlC2sZZ8MRsT1NMurZ7WXBOR1Vq36jnhSeIxuOD0PpWDpq2hsqzvrsVtPvPPXY5/eD9avA1zskctpcYPDKcgjvWxZ3a3MfpIOopwl0YqkPtLYg1Ky35niHzfxKO/vWdFNtRon5jbqPQ+oroc1QvrAS5khAD917GlOHVFU6n2ZGbbzyWlyk0TfMhyPQ129jeRX1ss0Z68MvdT6VwbKVYqwII6g1a06/l0+48yPlTwyHowrTDYj2MrPZkYrDe2jdbo7G6sbe65dMN/eXg1kXOj3EWTFiVfbg/lWzZ3kN7AJYWyO47g+hqevbTUldHgtOLszklkmt2KgshHUH/CrUepOOJEDe44roJYYplxLGrj3FUJtFtn5jZoz+YqJU4T3RUZyjsysl/A3UlfqKmWeFukqfnVaTRJ1/1ciOPfg1XfTLxP8AliT9CDWLwsXszVYiXU1AynowP40ZHqKxzZXQ/wCXeX8FNJ9juj/y7S/98Go+qeZX1jyNcyxr96RR9TUTXluv/LQH6DNUF0+8bpbv+PFTx6Ndt97Yn1b/AAqlhI9WS8Q+iFk1JR/q4yfc8VVlvJ5ON+0ei8VpxaGg5lmJ9lGKvwWFrBykS59Tya2jRhHZGcqkpbs5+3sLm55SMhT/ABNwK1rXR4YsNMfNb07VpU2SRIkLyOqKOpY4Fa7Ge44AKAAAAOwqC8vILKHzJ32jsO5+lZF/4jjTKWa72/vt0H0HeudnnluZTJNIXc9zXDWxsYaQ1Z6FDAynrPRfiWdS1CbUrgEjCDhEHb/69RLItshVMNKep7CoAxA+Xj3qxbWbzYZvlT19fpXkuUpu73PXUYwjZaIiiikuJMDk9ye1a0MSwxhF/E+tOjjSJNqDApxqlGxnKXMIaaaSSRY13OcCs2e8eQkJ8q/rSbsOMWy+8sacM4B9M0wXEJ/5aCs+O3lk5VDj1PFJLE8Rw4x71NzTlQTACZ9pyM5GK9ItJfOs4ZT/ABxq35ivNK9H01DHplqjdViUH8q9DL370jzsxS5YlmiiivVPICiiigAooooAKKKKACiiigAooooAKKK5XxHru7fZWj/L0kkHf2FZVasaUeaRrRoyrS5Yjte8Q4LWti/s8o/kP8a561tZLl+OEHVjT7Kza5bc2RGOp9a2kRY0CoAFHQCvGnKVaXNI9uMYUI8kNxsEEcCbY1x6nualooq0rGTdwopaKYiC7tUuYtp4Yfdb0rDdZrSfByrr0PrXR1FcW8dwm2Rc+h7is5wvqjWFTl0exVtL9JgFkwkn6GrmaxLqwlt8sBvT+8O31ot76aHAJ3r6GoU2tJGjpqWsTTurWO5HzDD9mFZFxbS27fOMr2YdK1Ib+CXgtsb0apyAy4IBBptKWqFGUoaMxbS7nsphLA+09x2I9DXWaZrFvfgIT5c3dCev0rnrjTlbLQnaf7p6VnvHJC+HUqaulXnQfkTWoU8QuzPQqK5TT/EE8GI7kGaP+9/EP8a6O0vra8XMEoY916EfhXrUsRCrs9Tx62GqUt1p3LFFFFbnOFFFFABRUFxe2tr/AK6dEPoTz+VZVz4lgTIt4mkPq3yisp1qdP4mbU6FSp8KNyq91fWtoP38yqf7vU/lXJ3Wt39zkeb5a/3Y+P161nkknJOSa4qmPX2Ed1PLnvN/cdFeeJeq2kP/AAOT/CsO5u7i7fdPKzntnoPoKhAJOAMmrMVjPJyV2D1auCdapV+JnoU6NKj8KK1Sw28s5+RePU9K0odPhj5f943v0/KrPAGAMCpUO43V7FSCwjiwz/O36CrdFJV2tsZtt7iVFPMkKbmPPYetNubpIBjq/YVmEyXEvdmNRKRcYX1YSyyXEmTyewFXLezCANIMt6dhUltbLCMnlz1NT0ku5Tl0QlNZVdSrDINOpKZJnXFqY/mTlP5Vo6JrsunsIZsyWxPTun0/woqjdWuMvGOO4pwnKnLmiOcY1Y8sz0KGWOeJZYnDowyGHen1weh6xJps2xyWtnPzL6e4ruopUmiWWNgyMMgjvXtUK8a0brc8LEYeVGVnsOoooroOcKKKKACiiigAooooAKKKy9d1UabafIQbiThB6e9TOahFykXCDnJRjuyj4l1ryFaxtm/esP3jj+Eeg965qytGuZOeIx1P9KZDFJd3GCSSxyzHn8a3Yo1hjCIMAV4k5uvPmlse5CEcPDljuORFRQqgBR0FOpKWqMwpaKKYgopaKBBRRRTAKqXGnwTZIGxvVf8ACrdFJpPcak1sYU+mzxZKjzF/2ev5VBFcTQHCsQB/CeldJUM9tDOP3iAn171k6X8pvGt0kjPh1FG4kGw+o5FWT5cyfwup/Gqk+lOuTC24eh4NUiJrd+Q0bflUNyW5olGXwsuTaeDzE2PY1TZJrdw2GRgeGH+NSm+mKbcjP97HNWIbuORNsuFbvnoajR7Fe8tyaz8Q3cGFmAnT/a4b861B4ksvL3FJt393aP8AGsWS0ikGUO0+3Ss4gqxB4IrojiqsFa9znlhKNR3tY37jxPIci3t1X3c5/QVmXGq31xkPcMB6L8o/SnRaerqG87IPoKnXT4B1LN9TUyq1Z7sqNKjT+FGV1pyRvJ9xGb6CtlLaBPuxL+IzUo4rNQNHV7IyY9PnfqAg9zVqPTY15kct7DgVdzRmqUUiHOTGRwxRD5EC0/NJRVEBRUck0cQ+dwKpy6iOkS592pOSRSi2XmYKCWIAHc1QuL/qsP8A31VR5JZ2+Ylj2AqzBYMcNKcD+6OtQ5N7Gqio7laKKS4fjJ9WNacECQLheSep9akVVRdqgADtS0JWE5XEooopkiUlLSUhhRRRQMo3dvjMiDjuK0PDusmxl+zzt/oznr/cPr9KbWbdweU25fuH9KcJypy5oilCNWPJI9JByMjpRXN+FtW8xRYTt86j90x7j0/Cukr3qVRVY8yPAq0pUpuMgooorQyCiiigAooooAiubiO1t5J5ThEGTXn1/dzajfNM+SzHCr6DsK1/FepedOLGJvkjOXx3b0/CqGlW3/Ldx7L/AI15GLq+0n7OOyPZwdJUoe0luy5Z2wtoQvVzyxqxRRWSVtC27u7FpaSlpkhRRS0xBRRS0wCiiloEJSU6koASiiigYlNdFddrqGHoRTqKQzC1KKOG5CxrtBXJFMSynkhWVFDA9s81Lq3/AB+f8BFaGnf8eMX4/wA651FOTR1ObjBMxmjmhPzK6fhioySxyTk+tdNUbQxN96JD9VFN0vMSrd0YdvcvAcDle6mtCO9hfq20+hqSfT4JeVHlt/s9PyqjJps6/d2uPY4pWlErmhI0BLG3R1P0NZc1zMZzlzhW4A4HFNa0uFBJibAqFVLMFUZJ6CpbZUYpG408S9ZFH41E19Av8Rb6Cs9bK5b/AJZEfUipV02Y/eZV/WneXYnlit2SPqX9yP8AFjVaS8nk/j2j0XiriabGPvuzfTirEdtDH92MZ9TzRaT3DmgtjJjt5peVQnPc1bi04DmV8+y1fopqKE6jZHHEkQwigU6lpKZAUlLSUDEooopDEpKWkpDCiiigYU10DoVYZBp1FIDKIktbgFWKuhyrD9DXfaPqC6lYrNwJB8sijsa467h82PIHzL0pdB1E6dfqWP7mT5ZB7ev4f4104Wt7KdnszDFUfbU7rdHfUUZzyKK9s8EKKKKACqWr3w0/T5J+N/3UHqx6f4/hV2uM8V332i/FshzHBwfdj1/w/OsMRV9lTb6nRhqXtaij0MeGN7q5AJJLHLMf1Nb6qEUKowAMAVR0uDZCZSPmfp9Kv148FZXPZqSu7LoLRRRWhiLS0lLTEFLSUtAgpaKKYhaWkpaYhKKWkoASkpaSkMKSlpKRRj6yuLhG9Vx+tW9LbdZKP7pI/rUWsrmOJ/Qkf5/Kk0Zsxyr6EH/P5VitJnQ9aRo0UUVoYCUlLSUDK9++y0kPcjH51m6am+7B7KCau6r/AMeo/wB4f1qDSR88h9hWL1kjeOkGzSooorQyEpKWkpDEooopDEpKWkoGFJS0lIYlFFFIYlFFFIYlFFFAwooooAKzbuLy5cj7rc1pVFcRebEV79R9aTGnZnQ+FtQ+1WP2eRsywcfVe3+H5Vt153pN62n6jHPzsztceqnr/n2r0MEMoZSCDyCO9ezg6vtKdnujxcbR9nUutmLRRRXWcZBfXK2dlNcN0jUkD1PYfnXnaB7q6+YktI2WP8zXUeMbrZbQ2inmQ72+g6fr/KsPSYss8p7fKK8jGz56ih2PZwUOSk59zSUBVCgYA4FOpKWsixaKKKYhaWkpaBBS0lLTEFLSUUxDqKSimAtJRRSAKSiigYlFFFIZQ1j/AI9F/wB8fyNQaN96X6D+tS6yf3EY/wBr+lM0YfLMfp/WsX/EOhfwjSpKWkrQwCkoooGVNSXdZsfQg1T0psXDL6rWldLutpR/smsiwbbeR++R+lYy0kjeGsGjaoopK0MgpKKKQxKKKKQxKSlpKQwpKWkoGJRRRSGJSUtJSGFFFFAwooooAKKKKAM28j2Tbh0bmuw8LXv2rTPJY5kgO3/gPb/D8K5u7j8yA+q8il8OXn2TVowxwkv7tvx6fritsNU9nVXZmOKp+1pPujvKKKK908A4PxJc/aNZmwcrHiMfh1/XNWLGPy7RB3IyfxrHZmuLosxy0j5J9ya3xxwK8Dm55uR9C48kIwFpaSirMh1FJS0ALRSUtMQtFFFMQtFJS0xBRRRQAUUUUAFJRRSAKKKSgZnaz/qo/wDeNJo/+rl+opdZ/wBVH/vU3R/9XL9RWP8Ay8Oj/l0aVJS0laGIlFFFIYyTmNvoaw7T/j6i/wB4VuP9xvpWHa/8fUX+8KynujanszdpKWkrQzEooopAJSUtJSGFJS0lIYUlFFAxKKKKQxKSlpKQwooooGFFFFABRRRQAVlTIYpmUcYORWrVLUE+6/4GpZUdzutMuvtunQXHdl+b6jg/rRWF4QuZPs9xBjKIwYcEnnOf5UV79Gpz01I+fr0vZ1HE5uaNrW8eNvvROR+RrdRg6BlOQRkUzxdZrDepdJgCcfMPcY5/lVHTLk58huR1U+leNKPs6jgz2lL2tNTRp0UlLVGYtLTaWmIWiiimIWlptLQIWikpaYBRRRQAUUUUAFFJRSAKKKSgZnawf3cQ9zRo/wDqpD7imayfmiH1P8ql0gYtmPq/9BWP2zf/AJdF6kpaStTEKSlpKQxDzWAh8q4Un+FufwNb9Yl8gS7kA7nP51nU7m1LqjbpKjtnL20bHqVp9UZ2sFFFJQMKSlpKQBSUUUhiUUUUhiUUUUDEpKWkpDCiiigYUUUUAFFFFABVLUH+4n4mrUjiOMuRnFZbs0sm49SallRXU6rwZEy21zMfuuwUfgP/AK9FbenWi2NjFbLzsHJ9T3NFfQUYezpqJ89Xqe0qOR//2Q=="/></defs><path d="M0 0h409.922v648H0zm0 0" fill="#fff"/><path d="M113.04 82.922h165.722v45.238H113.039zm0 0" fill="#ffca00"/><use xlink:href="#a" x="272.28" y="184.56" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#b" x="276.44" y="184.56" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#c" x="286.387" y="184.56" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#d" x="296.445" y="184.56" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#e" x="301.47" y="184.56" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#c" x="311.528" y="184.56" width="100%" height="100%" transform="translate(-101.04 -72)"/><path d="M113.04 82.2h166.562v46.679H112.32v-46.68zm0 1.44v-.718h.722v45.238h-.723v-.84h165.723v.84h-.723V82.922h.723v.719zm0 0"/><path d="M113.04 290.879h165.722v45.242H113.039zm0 0" fill="#ffca00"/><use xlink:href="#f" x="267.84" y="392.52" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#b" x="277.898" y="392.52" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#g" x="287.957" y="392.52" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#d" x="297" y="392.52" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#h" x="302.024" y="392.52" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#e" x="306.184" y="392.52" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#i" x="316.242" y="392.52" width="100%" height="100%" transform="translate(-101.04 -72)"/><path d="M113.04 290.16h166.562v46.68H112.32v-46.68zm0 1.442v-.723h.722v45.242h-.723v-.84h165.723v.84h-.723V290.88h.723v.723zm0 0"/><path d="M229.082 497.281h165.719v45.239H229.082zm0 0" fill="#ffca00"/><use xlink:href="#j" x="380.88" y="599.04" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#b" x="386.903" y="599.04" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#k" x="396.961" y="599.04" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#l" x="406.004" y="599.04" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#m" x="415.228" y="599.04" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#n" x="425.175" y="599.04" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#b" x="435.233" y="599.04" width="100%" height="100%" transform="translate(-101.04 -72)"/><path d="M229.082 496.559h166.559v46.68H228.359v-46.68zm0 1.562v-.84h.719v45.239h-.719v-.72h165.719v.72h-.719V497.28h.719v.84zm0 0"/><path d="M113.04 128.16h165.722v45.121H113.039zm0 0" fill="#97ca00"/><use xlink:href="#b" x="229.08" y="229.8" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#i" x="239.138" y="229.8" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#g" x="249.197" y="229.8" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#h" x="258.24" y="229.8" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#f" x="262.399" y="229.8" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#a" x="272.458" y="229.8" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#o" x="276.476" y="229.8" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#p" x="286.534" y="229.8" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#c" x="292.557" y="229.8" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#a" x="302.615" y="229.8" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#b" x="306.775" y="229.8" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#q" x="316.722" y="229.8" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#f" x="325.765" y="229.8" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#e" x="335.823" y="229.8" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#e" x="345.882" y="229.8" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#l" x="355.94" y="229.8" width="100%" height="100%" transform="translate(-101.04 -72)"/><path d="M113.04 127.32h166.562v46.801H112.32v-46.8zm0 1.559v-.719h.722v45.121h-.723v-.722h165.723v.722h-.723v-45.12h.723v.718zm0 0"/><path d="M113.04 336.121h165.722v45.117H113.039zm0 0" fill="#97ca00"/><use xlink:href="#b" x="229.08" y="437.76" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#i" x="239.138" y="437.76" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#g" x="249.197" y="437.76" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#h" x="258.24" y="437.76" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#f" x="262.399" y="437.76" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#a" x="272.458" y="437.76" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#o" x="276.476" y="437.76" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#p" x="286.534" y="437.76" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#c" x="292.557" y="437.76" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#a" x="302.615" y="437.76" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#b" x="306.775" y="437.76" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#q" x="316.722" y="437.76" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#f" x="325.765" y="437.76" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#e" x="335.823" y="437.76" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#e" x="345.882" y="437.76" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#l" x="355.94" y="437.76" width="100%" height="100%" transform="translate(-101.04 -72)"/><path d="M113.04 335.281h166.562v46.797H112.32v-46.797zm0 1.559v-.719h.722v45.117h-.723v-.718h165.723v.718h-.723v-45.117h.723v.719zm0 0"/><path d="M229.082 542.52h165.719v45.242H229.082zm0 0" fill="#97ca00"/><use xlink:href="#b" x="345.12" y="644.28" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#i" x="355.178" y="644.28" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#g" x="365.237" y="644.28" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#h" x="374.28" y="644.28" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#f" x="378.439" y="644.28" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#a" x="388.498" y="644.28" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#o" x="392.516" y="644.28" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#p" x="402.574" y="644.28" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#c" x="408.597" y="644.28" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#a" x="418.655" y="644.28" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#b" x="422.815" y="644.28" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#q" x="432.762" y="644.28" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#f" x="441.805" y="644.28" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#e" x="451.863" y="644.28" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#e" x="461.922" y="644.28" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#l" x="471.98" y="644.28" width="100%" height="100%" transform="translate(-101.04 -72)"/><path d="M229.082 541.8h166.559v46.68H228.359V541.8zm0 1.438v-.718h.719v45.242h-.719v-.84h165.719v.84h-.719V542.52h.719v.718zm0 0"/><path d="M3 542.52h165.84v45.242H3zm0 0" fill="#97ca00"/><use xlink:href="#b" x="119.04" y="644.28" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#i" x="129.098" y="644.28" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#g" x="139.157" y="644.28" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#h" x="148.2" y="644.28" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#f" x="152.359" y="644.28" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#a" x="162.418" y="644.28" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#o" x="166.436" y="644.28" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#p" x="176.494" y="644.28" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#c" x="182.517" y="644.28" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#a" x="192.575" y="644.28" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#b" x="196.735" y="644.28" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#q" x="206.682" y="644.28" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#f" x="215.725" y="644.28" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#e" x="225.783" y="644.28" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#e" x="235.842" y="644.28" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#l" x="245.9" y="644.28" width="100%" height="100%" transform="translate(-101.04 -72)"/><path d="M3 541.8h166.563v46.68H2.28V541.8zm0 1.438v-.718h.723v45.242H3v-.84h165.84v.84H168V542.52h.84v.718zm0 0"/><path d="M3 497.281h165.84v45.239H3zm0 0" fill="#ffca00"/><use xlink:href="#j" x="154.8" y="599.04" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#b" x="160.823" y="599.04" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#k" x="170.881" y="599.04" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#l" x="179.924" y="599.04" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#m" x="189.148" y="599.04" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#m" x="199.095" y="599.04" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#b" x="209.153" y="599.04" width="100%" height="100%" transform="translate(-101.04 -72)"/><path d="M3 496.559h166.563v46.68H2.28v-46.68zm0 1.562v-.84h.723v45.239H3v-.72h165.84v.72H168V497.28h.84v.84zm0 0"/><path d="M113.04 173.281h165.722v45.239H113.039zm0 0" fill="#caffca"/><use xlink:href="#b" x="231.12" y="275.04" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#i" x="241.178" y="275.04" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#g" x="251.237" y="275.04" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#h" x="260.28" y="275.04" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#f" x="264.439" y="275.04" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#a" x="274.498" y="275.04" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#o" x="278.516" y="275.04" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#r" x="288.574" y="275.04" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#s" x="298.632" y="275.04" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#h" x="313.824" y="275.04" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#d" x="317.842" y="275.04" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#e" x="322.867" y="275.04" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#t" x="332.926" y="275.04" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#o" x="342.984" y="275.04" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#i" x="353.042" y="275.04" width="100%" height="100%" transform="translate(-101.04 -72)"/><path d="M113.04 172.559h166.562v46.68H112.32v-46.68zm0 1.562v-.84h.722v45.239h-.723v-.72h165.723v.72h-.723V173.28h.723v.84zm0 0"/><path d="M113.04 381.238h165.722v45.242H113.039zm0 0" fill="#caffca"/><use xlink:href="#b" x="231.12" y="483" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#i" x="241.178" y="483" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#g" x="251.237" y="483" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#h" x="260.28" y="483" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#f" x="264.439" y="483" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#a" x="274.498" y="483" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#o" x="278.516" y="483" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#r" x="288.574" y="483" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#s" x="298.632" y="483" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#h" x="313.824" y="483" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#d" x="317.842" y="483" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#e" x="322.867" y="483" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#t" x="332.926" y="483" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#o" x="342.984" y="483" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#i" x="353.042" y="483" width="100%" height="100%" transform="translate(-101.04 -72)"/><path d="M113.04 380.52h166.562v46.68H112.32v-46.68zm0 1.558v-.84h.722v45.242h-.723v-.718h165.723v.718h-.723v-45.242h.723v.84zm0 0"/><path d="M3 587.762h165.84V633H3zm0 0" fill="#caffca"/><use xlink:href="#b" x="121.08" y="689.4" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#i" x="131.138" y="689.4" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#g" x="141.197" y="689.4" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#h" x="150.24" y="689.4" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#f" x="154.399" y="689.4" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#a" x="164.458" y="689.4" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#o" x="168.476" y="689.4" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#r" x="178.534" y="689.4" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#s" x="188.592" y="689.4" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#h" x="203.784" y="689.4" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#d" x="207.802" y="689.4" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#e" x="212.827" y="689.4" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#t" x="222.886" y="689.4" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#o" x="232.944" y="689.4" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#i" x="243.002" y="689.4" width="100%" height="100%" transform="translate(-101.04 -72)"/><path d="M3 586.922h166.563v46.797H2.28v-46.797zm0 1.558v-.718h.723V633H3v-.84h165.84v.84H168v-45.238h.84v.718zm0 0"/><path d="M229.082 587.762h165.719V633H229.082zm0 0" fill="#caffca"/><use xlink:href="#b" x="347.16" y="689.4" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#i" x="357.218" y="689.4" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#g" x="367.277" y="689.4" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#h" x="376.32" y="689.4" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#f" x="380.479" y="689.4" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#a" x="390.538" y="689.4" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#o" x="394.556" y="689.4" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#r" x="404.614" y="689.4" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#s" x="414.672" y="689.4" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#h" x="429.864" y="689.4" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#d" x="433.882" y="689.4" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#e" x="438.907" y="689.4" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#t" x="448.966" y="689.4" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#o" x="459.024" y="689.4" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#i" x="469.082" y="689.4" width="100%" height="100%" transform="translate(-101.04 -72)"/><path d="M229.082 586.922h166.559v46.797H228.359v-46.797zm0 1.558v-.718h.719V633h-.719v-.84h165.719v.84h-.719v-45.238h.719v.718zm0 0"/><path d="M195.96 232.8c.36 0 .72.36.72.84 0 .36-.36.72-.72.72-.48 0-.839-.36-.839-.72 0-.48.36-.84.84-.84zm0 6.122c.36 0 .72.238.72.719 0 .359-.36.718-.72.718-.48 0-.839-.359-.839-.718 0-.48.36-.72.84-.72zm0 6c.36 0 .72.36.72.719 0 .48-.36.718-.72.718-.48 0-.839-.238-.839-.718 0-.36.36-.72.84-.72zm0 6c.36 0 .72.36.72.719 0 .48-.36.84-.72.84a.82.82 0 0 1-.839-.84c0-.36.36-.72.84-.72zm0 6c.36 0 .72.36.72.84 0 .36-.36.718-.72.718-.48 0-.839-.359-.839-.718 0-.48.36-.84.84-.84zm0 6c.36 0 .72.36.72.84 0 .36-.36.718-.72.718-.48 0-.839-.359-.839-.718 0-.48.36-.84.84-.84zm0 6.117c.36 0 .72.36.72.723 0 .36-.36.718-.72.718-.48 0-.839-.359-.839-.718 0-.364.36-.723.84-.723zm0 6c.36 0 .72.36.72.723 0 .476-.36.84-.72.84a.822.822 0 0 1-.839-.84c0-.364.36-.723.84-.723zm0 0" fill="#3063ff"/><path d="M195.96 218.52l-7.558 18.12 7.559-4.562 7.441 4.563zm0 0M195.96 290.879l7.442-18.117-7.441 4.558-7.559-4.558zm0 0" fill="#3063ff"/><path d="M146.883 242.398h98.156v24.48h-98.156zm0 0" fill="#fff"/><use xlink:href="#u" x="250.92" y="332.64" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#u" x="260.986" y="332.64" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#v" x="271.052" y="332.64" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#w" x="281.95" y="332.64" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#x" x="286.143" y="332.64" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#y" x="291.169" y="332.64" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#z" x="299.562" y="332.64" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#z" x="307.955" y="332.64" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#A" x="316.348" y="332.64" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#B" x="329.766" y="332.64" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#C" x="338.067" y="332.64" width="100%" height="100%" transform="translate(-101.04 -72)"/><path d="M229.2 436.441c.362 0 .722.239.722.72 0 .359-.36.718-.723.718-.476 0-.719-.36-.719-.719 0-.48.243-.719.72-.719zm4.202 4.2c.48 0 .84.359.84.718 0 .48-.36.84-.84.84-.363 0-.722-.36-.722-.84 0-.359.36-.718.722-.718zm4.32 4.32c.36 0 .72.238.72.719 0 .36-.36.718-.72.718-.48 0-.722-.359-.722-.718 0-.48.242-.72.723-.72zm4.2 4.2c.48 0 .84.359.84.718 0 .48-.36.84-.84.84-.36 0-.723-.36-.723-.84 0-.36.363-.719.723-.719zm4.32 4.32c.36 0 .719.238.719.718 0 .36-.36.723-.719.723-.48 0-.722-.363-.722-.723 0-.48.242-.719.722-.719zm4.2 4.199c.48 0 .84.36.84.718 0 .48-.36.84-.84.84-.36 0-.72-.36-.72-.84 0-.359.36-.718.72-.718zm4.32 4.32c.36 0 .718.36.718.719 0 .36-.359.722-.718.722-.48 0-.723-.363-.723-.722 0-.36.242-.719.723-.719zm4.199 4.2c.48 0 .84.359.84.722 0 .476-.36.84-.84.84-.36 0-.719-.364-.719-.84 0-.363.36-.723.719-.723zm4.32 4.32c.36 0 .719.359.719.718 0 .364-.36.723-.719.723-.36 0-.719-.36-.719-.723 0-.36.36-.718.72-.718zm4.32 4.199c.36 0 .72.36.72.84 0 .363-.36.722-.72.722-.48 0-.84-.36-.84-.722 0-.48.36-.84.84-.84zm4.2 4.32c.36 0 .719.36.719.723 0 .476-.36.718-.72.718-.359 0-.718-.242-.718-.718 0-.364.36-.723.719-.723zm4.32 4.2c.36 0 .719.363.719.84 0 .362-.36.722-.719.722-.48 0-.84-.36-.84-.723 0-.476.36-.84.84-.84zm4.2 4.32c.48 0 .718.363.718.722 0 .48-.238.719-.719.719-.36 0-.718-.238-.718-.719 0-.36.359-.722.718-.722zm0 0" fill="#3063ff"/><path d="M218.52 426.48l7.44 18.122 2.161-8.524 8.52-2.156zm0 0M289.32 497.281l-7.437-18.12-2.16 8.519-8.524 2.16zm0 0" fill="#3063ff"/><path d="M207.242 449.64h93.36v24.481h-93.36zm0 0" fill="#fff"/><use xlink:href="#u" x="311.28" y="539.76" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#u" x="321.346" y="539.76" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#v" x="331.412" y="539.76" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#w" x="342.31" y="539.76" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#x" x="346.503" y="539.76" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#D" x="351.529" y="539.76" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#E" x="359.922" y="539.76" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#z" x="368.315" y="539.76" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#F" x="376.708" y="539.76" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#B" x="385.403" y="539.76" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#C" x="393.796" y="539.76" width="100%" height="100%" transform="translate(-101.04 -72)"/><path d="M164.16 436.68c.36 0 .723.36.723.718 0 .48-.363.723-.723.723-.48 0-.84-.242-.84-.723 0-.359.36-.718.84-.718zm-4.2 4.32c.481 0 .72.36.72.84 0 .36-.239.719-.72.719-.358 0-.718-.36-.718-.72 0-.48.36-.839.719-.839zm-4.077 4.441c.36 0 .719.36.719.72 0 .48-.36.718-.72.718-.48 0-.843-.238-.843-.719 0-.36.363-.719.844-.719zm-4.203 4.32c.36 0 .722.36.722.84 0 .36-.363.72-.722.72-.36 0-.72-.36-.72-.72 0-.48.36-.84.72-.84zm-4.2 4.438c.48 0 .84.36.84.723 0 .36-.36.719-.84.719-.359 0-.718-.36-.718-.72 0-.362.36-.722.718-.722zm-4.078 4.32c.36 0 .72.36.72.72 0 .48-.36.84-.72.84-.48 0-.722-.36-.722-.84 0-.36.242-.72.722-.72zm-4.203 4.442c.48 0 .84.238.84.719 0 .36-.36.718-.84.718-.36 0-.719-.359-.719-.718 0-.48.36-.72.72-.72zm-4.078 4.32c.36 0 .719.36.719.719 0 .48-.36.84-.719.84a.82.82 0 0 1-.84-.84c0-.36.36-.719.84-.719zm-4.2 4.438c.481 0 .72.242.72.722 0 .36-.239.72-.72.72-.359 0-.722-.36-.722-.72 0-.48.363-.722.723-.722zm-4.081 4.32c.36 0 .722.36.722.723 0 .476-.363.84-.722.84a.822.822 0 0 1-.84-.84c0-.364.36-.723.84-.723zm-4.2 4.32c.481 0 .72.36.72.84 0 .36-.239.723-.72.723-.359 0-.718-.363-.718-.723 0-.48.36-.84.719-.84zm-4.078 4.442c.36 0 .72.36.72.719 0 .48-.36.718-.72.718-.48 0-.84-.238-.84-.718 0-.36.36-.72.84-.72zm0 0" fill="#3063ff"/><path d="M174.48 426.48l-17.878 7.918 8.52 1.922 2.398 8.52zm0 0M107.281 497.281l18-7.922-8.64-1.918-2.282-8.402zm0 0" fill="#3063ff"/><path d="M94.2 449.64h93.48v24.481H94.2zm0 0" fill="#fff"/><use xlink:href="#u" x="198.24" y="539.76" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#u" x="208.306" y="539.76" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#v" x="218.372" y="539.76" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#w" x="229.27" y="539.76" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#x" x="233.463" y="539.76" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#D" x="238.489" y="539.76" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#E" x="246.882" y="539.76" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#z" x="255.275" y="539.76" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#F" x="263.668" y="539.76" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#B" x="272.363" y="539.76" width="100%" height="100%" transform="translate(-101.04 -72)"/><use xlink:href="#C" x="280.756" y="539.76" width="100%" height="100%" transform="translate(-101.04 -72)"/><g clip-path="url(#G)" transform="translate(-101.04 -72)"><use xlink:href="#H" transform="matrix(.12 0 0 .12 272.64 75.12)" width="100%" height="100%"/></g></svg>����������������������������������������������������������������������������������������������������������������������mitogen-0.3.9/docs/images/layout.graphml������������������������������������������������������������0000664�0000000�0000000�00000106772�14656664731�0020312�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" standalone="no"?> <graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd"> <!--Created by yEd 3.14.4--> <key attr.name="Description" attr.type="string" for="graph" id="d0"/> <key for="port" id="d1" yfiles.type="portgraphics"/> <key for="port" id="d2" yfiles.type="portgeometry"/> <key for="port" id="d3" yfiles.type="portuserdata"/> <key attr.name="url" attr.type="string" for="node" id="d4"/> <key attr.name="description" attr.type="string" for="node" id="d5"/> <key for="node" id="d6" yfiles.type="nodegraphics"/> <key for="graphml" id="d7" yfiles.type="resources"/> <key attr.name="url" attr.type="string" for="edge" id="d8"/> <key attr.name="description" attr.type="string" for="edge" id="d9"/> <key for="edge" id="d10" yfiles.type="edgegraphics"/> <graph edgedefault="directed" id="G"> <data key="d0"/> <node id="n0" yfiles.foldertype="group"> <data key="d4"/> <data key="d5"/> <data key="d6"> <y:ProxyAutoBoundsNode> <y:Realizers active="0"> <y:GroupNode> <y:Geometry height="408.666015625" width="359.0" x="31.0" y="9.333984375"/> <y:Fill color="#F5F5F5" transparent="false"/> <y:BorderStyle color="#000000" type="dashed" width="1.0"/> <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="359.0" x="0.0" y="0.0">Master</y:NodeLabel> <y:Shape type="roundrectangle"/> <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/> <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/> </y:GroupNode> <y:GroupNode> <y:Geometry height="50.0" width="50.0" x="0.0" y="60.0"/> <y:Fill color="#F5F5F5" transparent="false"/> <y:BorderStyle color="#000000" type="dashed" width="1.0"/> <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="63.75830078125" x="-6.879150390625" y="0.0">Folder 1</y:NodeLabel> <y:Shape type="roundrectangle"/> <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/> <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/> </y:GroupNode> </y:Realizers> </y:ProxyAutoBoundsNode> </data> <graph edgedefault="directed" id="n0:"> <node id="n0::n0"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="325.0" width="155.0" x="220.0" y="78.0"/> <y:Fill color="#C0C0C0" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="75.5" y="160.5"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n0::n1"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="326.0" width="155.0" x="46.0" y="77.0"/> <y:Fill color="#C0C0C0" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="75.5" y="161.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n0::n2"> <data key="d4"/> <data key="d5"/> <data key="d6"> <y:UMLClassNode> <y:Geometry height="82.0" width="132.0" x="58.0" y="91.5"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="55.9365234375" x="38.03173828125" y="3.0">Context<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="true"> <y:AttributeLabel/> <y:MethodLabel>call(func, *args) send(msg)</y:MethodLabel> </y:UML> </y:UMLClassNode> </data> </node> <node id="n0::n3"> <data key="d4"/> <data key="d5"/> <data key="d6"> <y:UMLClassNode> <y:Geometry height="82.0" width="132.0" x="231.5" y="92.0"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="48.154296875" x="41.9228515625" y="3.0">Broker<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="true"> <y:AttributeLabel/> <y:MethodLabel>_start_transmit(strm) _stop_transmit(strm)</y:MethodLabel> </y:UML> </y:UMLClassNode> </data> </node> <node id="n0::n4"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="155.0" x="220.0" y="47.0"/> <y:Fill hasColor="false" transparent="false"/> <y:BorderStyle hasColor="false" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="86.400390625" x="34.2998046875" y="5.93359375">Broker Thread<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n0::n5"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="155.0" x="46.0" y="46.0"/> <y:Fill hasColor="false" transparent="false"/> <y:BorderStyle hasColor="false" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="80.751953125" x="37.1240234375" y="5.93359375">User Threads<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n0::n6"> <data key="d4"/> <data key="d5"/> <data key="d6"> <y:UMLClassNode> <y:Geometry height="104.0" width="132.0" x="150.0" y="188.5"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="48.60498046875" x="41.697509765625" y="3.0">Router<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="true"> <y:AttributeLabel>handlers[]</y:AttributeLabel> <y:MethodLabel>ssh(hostname=...) sudo(username=...) route(msg)</y:MethodLabel> </y:UML> </y:UMLClassNode> </data> </node> <node id="n0::n7"> <data key="d4"/> <data key="d5"/> <data key="d6"> <y:UMLClassNode> <y:Geometry height="82.0" width="132.0" x="231.5" y="308.0"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="50.47119140625" x="40.764404296875" y="3.0">Stream<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="true"> <y:AttributeLabel/> <y:MethodLabel>send() on_transmit()</y:MethodLabel> </y:UML> </y:UMLClassNode> </data> </node> <node id="n0::n8"> <data key="d4"/> <data key="d5"/> <data key="d6"> <y:UMLClassNode> <y:Geometry height="82.0" width="132.0" x="57.5" y="307.5"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="58.361328125" x="36.8193359375" y="3.0">Channel<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="true"> <y:AttributeLabel/> <y:MethodLabel>put()</y:MethodLabel> </y:UML> </y:UMLClassNode> </data> </node> </graph> </node> <node id="n1" yfiles.foldertype="group"> <data key="d4"/> <data key="d5"/> <data key="d6"> <y:ProxyAutoBoundsNode> <y:Realizers active="0"> <y:GroupNode> <y:Geometry height="408.666015625" width="359.0" x="471.25" y="9.333984375"/> <y:Fill color="#F5F5F5" transparent="false"/> <y:BorderStyle color="#000000" type="dashed" width="1.0"/> <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="359.0" x="0.0" y="0.0">Child</y:NodeLabel> <y:Shape type="roundrectangle"/> <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/> <y:BorderInsets bottom="0" bottomF="0.0" left="1" leftF="0.5" right="0" rightF="0.0" top="1" topF="1.0"/> </y:GroupNode> <y:GroupNode> <y:Geometry height="50.0" width="50.0" x="0.0" y="60.0"/> <y:Fill color="#F5F5F5" transparent="false"/> <y:BorderStyle color="#000000" type="dashed" width="1.0"/> <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="63.75830078125" x="-6.879150390625" y="0.0">Folder 2</y:NodeLabel> <y:Shape type="roundrectangle"/> <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/> <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/> </y:GroupNode> </y:Realizers> </y:ProxyAutoBoundsNode> </data> <graph edgedefault="directed" id="n1:"> <node id="n1::n0"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="325.0" width="155.0" x="486.75" y="78.0"/> <y:Fill color="#C0C0C0" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="75.5" y="160.5"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1::n1"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="324.0" width="155.0" x="660.25" y="79.0"/> <y:Fill color="#C0C0C0" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="75.5" y="160.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1::n2"> <data key="d4"/> <data key="d5"/> <data key="d6"> <y:UMLClassNode> <y:Geometry height="82.0" width="132.0" x="498.25" y="92.0"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="48.154296875" x="41.9228515625" y="3.0">Broker<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="true"> <y:AttributeLabel/> <y:MethodLabel>start_receive(strm) stop_receive(strm)</y:MethodLabel> </y:UML> </y:UMLClassNode> </data> </node> <node id="n1::n3"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="155.0" x="486.75" y="47.0"/> <y:Fill hasColor="false" transparent="false"/> <y:BorderStyle hasColor="false" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="86.400390625" x="34.2998046875" y="5.93359375">Broker Thread<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1::n4"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="155.0" x="660.25" y="48.0"/> <y:Fill hasColor="false" transparent="false"/> <y:BorderStyle hasColor="false" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="76.486328125" x="39.2568359375" y="5.93359375">Main Thread<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1::n5"> <data key="d4"/> <data key="d5"/> <data key="d6"> <y:UMLClassNode> <y:Geometry height="82.0" width="132.0" x="590.25" y="188.5"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="48.60498046875" x="41.697509765625" y="3.0">Router<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="true"> <y:AttributeLabel>handlers[]</y:AttributeLabel> <y:MethodLabel>route(msg)</y:MethodLabel> </y:UML> </y:UMLClassNode> </data> </node> <node id="n1::n6"> <data key="d4"/> <data key="d5"/> <data key="d6"> <y:UMLClassNode> <y:Geometry height="82.0" width="132.0" x="498.25" y="308.0"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="50.47119140625" x="40.764404296875" y="3.0">Stream<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="true"> <y:AttributeLabel/> <y:MethodLabel>send() on_receive()</y:MethodLabel> </y:UML> </y:UMLClassNode> </data> </node> <node id="n1::n7"> <data key="d4"/> <data key="d5"/> <data key="d6"> <y:UMLClassNode> <y:Geometry height="82.0" width="132.0" x="671.75" y="93.25"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="110.6279296875" x="10.68603515625" y="3.0">ExternalContext<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="true"> <y:AttributeLabel/> <y:MethodLabel>_dispatch_calls()</y:MethodLabel> </y:UML> </y:UMLClassNode> </data> </node> <node id="n1::n8"> <data key="d4"/> <data key="d5"/> <data key="d6"> <y:UMLClassNode> <y:Geometry height="82.0" width="132.0" x="671.75" y="307.5"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" modelName="custom" textColor="#000000" visible="true" width="58.361328125" x="36.8193359375" y="3.0">Channel<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="true"> <y:AttributeLabel>CALL_FUNCTION</y:AttributeLabel> <y:MethodLabel>get()</y:MethodLabel> </y:UML> </y:UMLClassNode> </data> </node> </graph> </node> <node id="n2"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="82.0" width="40.0" x="410.625" y="308.0"/> <y:Fill color="#33CCCC" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" rotationAngle="270.0" textColor="#000000" visible="true" width="52.580078125" x="10.93359375" y="14.7099609375">Network<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <edge id="n0::e0" source="n0::n2" target="n0::n6"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="n0::e1" source="n0::n6" target="n0::n3"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="n0::e2" source="n0::n3" target="n0::n7"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="n0::e3" source="n0::n7" target="n0::n6"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="n1::e0" source="n1::n5" target="n1::n2"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="n1::e1" source="n1::n2" target="n1::n6"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="n1::e2" source="n1::n6" target="n1::n5"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="n1::e3" source="n1::n0" target="n1::n5"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="none"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e0" source="n2" target="n0::n7"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="-19.993890966244177" sy="24.690749004906024" tx="66.02343749999994" ty="24.690749004906024"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e1" source="n1::n6" target="n2"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="-65.97656250000006" sy="24.0" tx="20.01418551326256" ty="24.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e2" source="n1::n6" target="n2"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="-65.99218750000006" sy="-24.99128644254978" tx="20.03046259684592" ty="-24.99128644254978"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="standard" target="none"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e3" source="n2" target="n0::n7"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="-19.993750000000052" sy="-22.79645270270271" tx="66.01034628378375" ty="-22.79645270270271"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="standard" target="none"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="n0::e4" source="n0::n8" target="n0::n2"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="n0::e5" source="n0::n7" target="n0::n3"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="n1::e4" source="n1::n6" target="n1::n2"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="-9.999999999999972"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="n1::e5" source="n1::n5" target="n1::n8"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="n1::e6" source="n1::n8" target="n1::n7"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> </graph> <data key="d7"> <y:Resources/> </data> </graphml> ������mitogen-0.3.9/docs/images/layout.svg����������������������������������������������������������������0000664�0000000�0000000�00000260752�14656664731�0017456�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="624" height="321.281" viewBox="0 0 468 240.961"><defs><symbol overflow="visible" id="a"><path d="M.656 0v-6.266h1.235l1.484 4.438c.133.418.234.726.297.922.07-.227.187-.563.344-1l1.5-4.36h1.109V0h-.797v-5.25L4 0h-.734L1.453-5.328V0zm0 0"/></symbol><symbol overflow="visible" id="b"><path d="M3.531-.563a2.812 2.812 0 0 1-.828.516A2.314 2.314 0 0 1 1.86.11C1.367.11.99-.008.72-.25a1.23 1.23 0 0 1-.406-.953c0-.219.05-.414.156-.594.101-.187.234-.332.39-.437.164-.114.352-.204.563-.266.144-.04.375-.078.687-.11.614-.07 1.067-.16 1.36-.265.008-.102.015-.172.015-.203 0-.313-.074-.535-.218-.672-.2-.164-.493-.25-.875-.25-.368 0-.637.063-.813.188-.168.124-.293.351-.375.671l-.75-.109c.063-.313.172-.566.328-.766.156-.195.38-.347.672-.453.3-.113.649-.172 1.047-.172.383 0 .695.047.938.141.238.094.414.21.53.344.114.136.196.308.25.515.02.137.032.375.032.72v1.015c0 .718.016 1.172.047 1.36.031.187.098.37.203.546h-.813a1.958 1.958 0 0 1-.156-.563zM3.47-2.28c-.274.117-.688.215-1.25.297-.313.043-.54.093-.672.156a.628.628 0 0 0-.313.25.695.695 0 0 0-.093.36c0 .21.078.382.234.515.156.137.379.203.672.203.3 0 .566-.063.797-.188.226-.132.394-.312.5-.53.082-.177.125-.438.125-.782zm0 0"/></symbol><symbol overflow="visible" id="c"><path d="M.266-1.36l.765-.109c.04.305.157.54.344.703.195.157.473.235.828.235.352 0 .613-.07.781-.219.176-.145.266-.313.266-.5a.449.449 0 0 0-.234-.406c-.106-.07-.368-.16-.782-.266-.562-.144-.953-.27-1.171-.375a1.14 1.14 0 0 1-.5-.422 1.125 1.125 0 0 1-.172-.61c0-.206.046-.394.14-.562.094-.175.223-.32.39-.437.114-.082.274-.156.485-.219.207-.062.426-.094.657-.094.363 0 .675.055.937.157.27.105.469.246.594.421.133.168.222.403.265.704l-.75.093a.776.776 0 0 0-.296-.53C2.655-3.93 2.425-4 2.125-4c-.355 0-.61.059-.766.172-.148.117-.218.25-.218.406 0 .106.03.195.093.266.063.086.16.152.297.203a7 7 0 0 0 .672.203c.55.148.93.266 1.14.36.22.093.384.23.5.406.126.18.188.398.188.656 0 .25-.074.492-.218.719a1.42 1.42 0 0 1-.641.53 2.368 2.368 0 0 1-.969.188C1.617.11 1.172-.008.86-.25.547-.5.348-.867.266-1.36zm0 0"/></symbol><symbol overflow="visible" id="d"><path d="M2.25-.688l.11.672c-.212.051-.403.079-.579.079-.273 0-.484-.043-.64-.126a.763.763 0 0 1-.329-.359C.75-.566.72-.867.72-1.328v-2.61H.156v-.593H.72v-1.125l.765-.469v1.594h.766v.593h-.766v2.657c0 .218.008.36.032.422a.386.386 0 0 0 .14.156.599.599 0 0 0 .266.047c.082 0 .191-.008.328-.031zm0 0"/></symbol><symbol overflow="visible" id="e"><path d="M3.688-1.469l.796.11c-.125.46-.359.82-.703 1.078-.344.261-.777.39-1.297.39C1.816.11 1.29-.094.906-.5.52-.914.328-1.492.328-2.234.328-2.992.52-3.582.906-4c.395-.426.906-.64 1.531-.64.602 0 1.098.21 1.485.624.383.407.578.985.578 1.735v.203H1.11c.03.5.171.887.421 1.156.258.262.578.39.953.39.282 0 .52-.07.72-.218.194-.145.358-.383.483-.719zM1.155-2.703h2.532c-.032-.383-.126-.672-.282-.86-.25-.289-.57-.437-.953-.437a1.21 1.21 0 0 0-.89.36c-.243.23-.375.542-.407.937zm0 0"/></symbol><symbol overflow="visible" id="f"><path d="M.563 0v-4.531h.703v.687c.175-.32.336-.535.484-.64a.854.854 0 0 1 .5-.157c.25 0 .508.086.781.25l-.265.72a1.083 1.083 0 0 0-.563-.173.733.733 0 0 0-.453.156.716.716 0 0 0-.281.422c-.086.274-.125.57-.125.891V0zm0 0"/></symbol><symbol overflow="visible" id="al"><path d="M5.14-2.203l.829.219c-.168.68-.48 1.199-.938 1.562-.449.356-1 .531-1.656.531-.68 0-1.23-.132-1.656-.406C1.3-.578.984-.977.766-1.5a4.268 4.268 0 0 1-.329-1.672c0-.656.126-1.223.376-1.703a2.54 2.54 0 0 1 1.062-1.11 3.03 3.03 0 0 1 1.516-.39c.625 0 1.148.164 1.578.484.426.325.722.774.89 1.344l-.812.188c-.149-.446-.36-.774-.64-.985-.274-.207-.618-.312-1.032-.312-.48 0-.883.117-1.203.343a1.84 1.84 0 0 0-.688.938 3.832 3.832 0 0 0-.187 1.188c0 .53.07 1 .219 1.406.156.398.394.695.718.89.332.188.692.282 1.079.282.457 0 .847-.13 1.171-.391.32-.27.54-.672.657-1.203zm0 0"/></symbol><symbol overflow="visible" id="am"><path d="M.578 0v-6.266h.766v2.25a1.738 1.738 0 0 1 1.36-.625c.331 0 .624.07.874.204.25.125.426.308.531.546.102.23.157.57.157 1.016V0H3.5v-2.875c0-.383-.086-.664-.25-.844-.168-.176-.402-.265-.703-.265-.23 0-.445.062-.64.187-.2.117-.345.277-.438.485-.086.199-.125.476-.125.828V0zm0 0"/></symbol><symbol overflow="visible" id="an"><path d="M.578-5.375v-.89h.766v.89zM.578 0v-4.531h.766V0zm0 0"/></symbol><symbol overflow="visible" id="ao"><path d="M.563 0v-6.266h.765V0zm0 0"/></symbol><symbol overflow="visible" id="ap"><path d="M3.516 0v-.578c-.282.46-.704.687-1.266.687-.367 0-.7-.101-1-.296a2.018 2.018 0 0 1-.703-.844c-.168-.352-.25-.766-.25-1.235 0-.445.07-.851.219-1.218a1.83 1.83 0 0 1 .687-.86c.3-.195.64-.297 1.016-.297a1.542 1.542 0 0 1 1.25.625v-2.25h.765V0zM1.094-2.266c0 .586.117 1.024.36 1.313.25.281.538.422.874.422.332 0 .613-.133.844-.406.238-.282.36-.704.36-1.266 0-.613-.122-1.067-.36-1.36C2.93-3.852 2.64-4 2.297-4s-.633.14-.86.422c-.23.273-.343.71-.343 1.312zm0 0"/></symbol><symbol overflow="visible" id="g"><path d="M4-1.984l1.063.328c-.168.593-.438 1.039-.813 1.328-.375.281-.855.422-1.438.422-.71 0-1.296-.242-1.765-.735C.586-1.129.359-1.8.359-2.656c0-.895.227-1.594.688-2.094.469-.5 1.082-.75 1.844-.75.656 0 1.191.2 1.609.594.238.23.422.562.547 1l-1.078.25c-.063-.281-.2-.5-.406-.656-.2-.165-.446-.25-.735-.25-.398 0-.719.148-.969.437-.25.281-.375.746-.375 1.39 0 .688.118 1.18.36 1.47.25.28.57.421.968.421.29 0 .54-.086.75-.265.208-.188.352-.477.438-.875zm0 0"/></symbol><symbol overflow="visible" id="h"><path d="M.297-2.016c0-.343.082-.675.25-1 .176-.32.422-.566.734-.734.313-.164.657-.25 1.032-.25.593 0 1.078.195 1.453.578.382.387.578.871.578 1.453 0 .594-.196 1.09-.578 1.485-.387.386-.868.578-1.438.578-.367 0-.71-.078-1.031-.235a1.753 1.753 0 0 1-.75-.718c-.168-.32-.25-.707-.25-1.157zm1.062.063c0 .387.094.683.282.89.187.211.414.313.687.313.27 0 .492-.102.672-.313.188-.207.281-.507.281-.906 0-.375-.094-.664-.281-.875a.854.854 0 0 0-.672-.312.89.89 0 0 0-.687.312c-.188.211-.282.508-.282.89zm0 0"/></symbol><symbol overflow="visible" id="i"><path d="M4.094 0H3.062v-2c0-.414-.023-.688-.062-.813a.516.516 0 0 0-.219-.28.587.587 0 0 0-.36-.11c-.179 0-.339.047-.483.14a.808.808 0 0 0-.297.391c-.055.168-.079.469-.079.906V0H.532v-3.906H1.5v.562C1.844-3.78 2.27-4 2.781-4c.227 0 .438.043.625.125.196.086.344.188.438.313.094.124.156.273.187.437.04.156.063.387.063.688zm0 0"/></symbol><symbol overflow="visible" id="j"><path d="M2.344-3.906v.812h-.719v1.578c0 .325.004.512.016.563.02.055.05.101.093.14.051.032.114.047.188.047.094 0 .226-.035.406-.109l.094.813a2.078 2.078 0 0 1-.813.156C1.422.094 1.25.062 1.094 0a.773.773 0 0 1-.328-.234.867.867 0 0 1-.141-.422C.602-.77.594-1.008.594-1.375v-1.719H.109v-.812h.485v-.781l1.031-.61v1.39zm0 0"/></symbol><symbol overflow="visible" id="k"><path d="M2.813-1.25l1.03.172c-.136.387-.35.68-.64.875-.281.2-.637.297-1.062.297C1.453.094.945-.13.625-.578c-.262-.352-.39-.8-.39-1.344 0-.656.163-1.164.5-1.531A1.708 1.708 0 0 1 2.03-4c.582 0 1.04.195 1.375.578.344.387.504.977.485 1.766H1.297c.008.304.094.543.25.718a.8.8 0 0 0 .594.25c.164 0 .3-.039.406-.125.113-.093.203-.238.265-.437zm.046-1.047c0-.289-.078-.515-.234-.672a.706.706 0 0 0-.531-.234.731.731 0 0 0-.563.234c-.148.168-.218.39-.218.672zm0 0"/></symbol><symbol overflow="visible" id="l"><path d="M.047 0l1.406-2.016L.11-3.906h1.25l.704 1.062.734-1.062H4L2.672-2.062 4.125 0H2.859l-.796-1.219L1.25 0zm0 0"/></symbol><symbol overflow="visible" id="F"><path d="M.547-5.406h2.172c.426 0 .742.023.953.062.207.032.394.106.562.219.164.117.301.266.407.453a1.277 1.277 0 0 1-.031 1.328c-.137.211-.325.367-.563.469a1.4 1.4 0 0 1 .766.5c.175.23.265.5.265.813 0 .242-.058.48-.172.718-.117.23-.273.418-.468.563-.2.136-.446.219-.735.25-.18.023-.617.031-1.312.031H.547zM1.64-4.5v1.25h.718c.426 0 .692-.004.797-.016a.777.777 0 0 0 .438-.203.572.572 0 0 0 .156-.422.59.59 0 0 0-.14-.406.65.65 0 0 0-.407-.187 17.74 17.74 0 0 0-.937-.016zm0 2.14v1.454h1.015c.395 0 .645-.008.75-.031a.688.688 0 0 0 .39-.22c.102-.113.157-.269.157-.468a.686.686 0 0 0-.125-.406.646.646 0 0 0-.344-.25c-.148-.051-.464-.078-.953-.078zm0 0"/></symbol><symbol overflow="visible" id="G"><path d="M1.531 0H.5v-3.906h.953v.547c.164-.258.313-.43.438-.516A.85.85 0 0 1 2.344-4c.238 0 .469.063.687.188l-.312.906c-.18-.114-.344-.172-.5-.172a.559.559 0 0 0-.36.125c-.105.086-.187.23-.25.437-.054.211-.078.649-.078 1.313zm0 0"/></symbol><symbol overflow="visible" id="H"><path d="M.5 0v-5.406h1.047v2.875L2.75-3.906h1.281L2.688-2.484 4.125 0H3l-.984-1.75-.47.5V0zm0 0"/></symbol><symbol overflow="visible" id="U"><path d="M.547 0v-5.406h2.297c.582 0 1.004.054 1.265.156.258.094.47.266.625.516.157.25.235.53.235.843 0 .407-.121.746-.36 1.016-.242.262-.593.422-1.062.484.238.149.43.305.578.47.156.155.363.448.625.874L5.406 0H4.11l-.796-1.172c-.282-.426-.477-.691-.579-.797a.62.62 0 0 0-.328-.218 1.828 1.828 0 0 0-.547-.063h-.218V0zM1.64-3.125h.812c.52 0 .844-.02.969-.063a.567.567 0 0 0 .312-.218.76.76 0 0 0 .11-.406c0-.188-.047-.333-.14-.438a.658.658 0 0 0-.407-.219c-.094-.008-.36-.015-.797-.015h-.86zm0 0"/></symbol><symbol overflow="visible" id="V"><path d="M3.125 0v-.578a1.596 1.596 0 0 1-1.297.672 1.47 1.47 0 0 1-.719-.172C.9-.203.75-.368.656-.578c-.094-.207-.14-.492-.14-.86v-2.468h1.046v1.797c0 .543.016.875.047 1 .04.125.11.226.204.296a.65.65 0 0 0 .39.11.809.809 0 0 0 .469-.14.715.715 0 0 0 .297-.36c.05-.145.078-.5.078-1.063v-1.64h1.031V0zm0 0"/></symbol><symbol overflow="visible" id="ac"><path d="M.266-1.75l1.062-.11c.07.356.203.618.39.782.196.168.462.25.798.25.351 0 .617-.07.796-.219.176-.144.266-.316.266-.516a.457.457 0 0 0-.125-.328c-.074-.093-.203-.171-.39-.234-.126-.05-.415-.129-.86-.234-.594-.145-1.008-.329-1.234-.547-.336-.29-.5-.649-.5-1.078 0-.282.078-.54.234-.782.156-.238.379-.421.672-.546.29-.125.645-.188 1.063-.188.675 0 1.187.152 1.53.453.345.293.524.688.548 1.188l-1.094.046c-.055-.28-.156-.476-.313-.593-.148-.125-.375-.188-.687-.188-.313 0-.559.07-.735.203a.388.388 0 0 0-.171.329c0 .125.05.234.156.328.133.117.469.234 1 .359.531.125.922.258 1.172.39.258.137.46.325.61.563.144.23.218.512.218.844 0 .312-.09.605-.266.875a1.515 1.515 0 0 1-.734.61C3.359.03 2.969.093 2.5.093c-.68 0-1.203-.157-1.578-.469C.555-.688.336-1.145.266-1.75zm0 0"/></symbol><symbol overflow="visible" id="ad"><path d="M1.313-2.719L.375-2.89c.102-.375.285-.648.547-.828C1.18-3.906 1.566-4 2.078-4c.457 0 .797.059 1.016.172.226.105.39.242.484.406.094.168.14.477.14.922l-.015 1.219c0 .343.016.601.047.765.04.157.102.329.188.516H2.921a2.457 2.457 0 0 1-.11-.313c-.011-.05-.023-.085-.03-.109-.18.168-.372.297-.579.39-.2.083-.414.126-.64.126-.399 0-.715-.11-.954-.328a1.088 1.088 0 0 1-.343-.829c0-.226.05-.425.156-.593.101-.176.25-.313.437-.407.196-.093.473-.171.829-.234.488-.094.828-.176 1.015-.25v-.11c0-.195-.055-.335-.156-.421-.094-.082-.277-.125-.547-.125-.188 0-.336.039-.438.11-.105.062-.187.187-.25.374zm1.39.844a8.212 8.212 0 0 1-.64.156c-.282.063-.47.121-.563.172-.137.106-.203.23-.203.375 0 .149.05.274.156.375a.594.594 0 0 0 .422.156.873.873 0 0 0 .531-.187.58.58 0 0 0 .25-.344c.031-.082.047-.25.047-.5zm0 0"/></symbol><symbol overflow="visible" id="ae"><path d="M.469-3.906h.953v.531C1.766-3.789 2.172-4 2.64-4c.25 0 .46.055.64.156.188.106.344.262.469.469.164-.207.348-.363.547-.469.195-.101.41-.156.64-.156.29 0 .536.059.735.172.195.117.344.289.437.515.07.168.11.438.11.813V0H5.187v-2.234c0-.383-.039-.633-.109-.75-.094-.145-.242-.22-.437-.22a.773.773 0 0 0-.703.516c-.055.168-.079.438-.079.813V0H2.83v-2.14c0-.383-.024-.63-.063-.735a.422.422 0 0 0-.172-.25.551.551 0 0 0-.313-.078.754.754 0 0 0-.422.125.773.773 0 0 0-.28.375c-.056.156-.079.422-.079.797V0H.469zm0 0"/></symbol><symbol overflow="visible" id="ah"><path d="M1.578-5.406v1.984C1.91-3.805 2.305-4 2.766-4c.238 0 .453.047.64.14.196.087.344.196.438.329.101.136.172.289.203.453.031.168.047.43.047.781V0H3.062v-2.063c0-.414-.023-.675-.062-.78a.446.446 0 0 0-.203-.266.666.666 0 0 0-.375-.094.85.85 0 0 0-.453.125.734.734 0 0 0-.297.375c-.063.168-.094.418-.094.75V0H.531v-5.406zm0 0"/></symbol><symbol overflow="visible" id="ai"><path d="M.547 0v-5.406h1.031V0zm0 0"/></symbol><symbol overflow="visible" id="ay"><path d="M.547 0v-5.406h4v.922H1.64v1.187h2.718v.922H1.641v1.469h3.015V0zm0 0"/></symbol><symbol overflow="visible" id="o"><path d="M2.813-1.328l.593.078c-.062.418-.23.746-.5.984-.273.23-.605.344-1 .344-.492 0-.886-.16-1.187-.484-.305-.32-.453-.785-.453-1.39 0-.384.062-.724.187-1.016a1.41 1.41 0 0 1 .594-.657c.27-.144.562-.219.875-.219.383 0 .703.102.953.297.25.2.41.48.484.844l-.593.094c-.063-.238-.168-.422-.313-.547a.735.735 0 0 0-.515-.188.95.95 0 0 0-.75.344C1-2.625.905-2.28.905-1.813c0 .493.086.844.266 1.063.187.219.43.328.734.328.239 0 .438-.07.594-.219.164-.144.27-.375.313-.687zm0 0"/></symbol><symbol overflow="visible" id="p"><path d="M2.813-.438c-.231.188-.45.325-.657.407-.21.07-.433.11-.672.11-.398 0-.703-.095-.921-.282a.973.973 0 0 1-.313-.75c0-.176.04-.336.125-.485.082-.144.188-.257.313-.343.125-.094.269-.16.437-.203a5.06 5.06 0 0 1 .547-.094c.488-.063.851-.129 1.094-.203v-.172c0-.25-.059-.422-.172-.516-.156-.144-.39-.219-.703-.219-.282 0-.496.055-.641.157-.137.105-.234.281-.297.531L.36-2.578c.051-.25.141-.453.266-.61.125-.164.3-.289.531-.374.239-.083.516-.126.828-.126.301 0 .547.04.735.11.195.074.344.168.437.281a.834.834 0 0 1 .188.406c.02.106.031.293.031.563v.812c0 .575.008.938.031 1.094.031.149.086.29.172.422h-.64a1.306 1.306 0 0 1-.126-.438zm-.047-1.375c-.23.094-.563.172-1 .235-.25.031-.43.074-.532.125a.533.533 0 0 0-.25.203.51.51 0 0 0-.078.281.56.56 0 0 0 .172.422c.125.106.305.156.547.156.238 0 .445-.05.625-.156a.921.921 0 0 0 .406-.422c.07-.144.11-.347.11-.61zm0 0"/></symbol><symbol overflow="visible" id="q"><path d="M.438 0v-4.984h.625V0zm0 0"/></symbol><symbol overflow="visible" id="r"><path d="M1.625 1.469a6.464 6.464 0 0 1-.86-1.5 4.674 4.674 0 0 1-.343-1.766c0-.539.086-1.055.266-1.547.195-.57.507-1.144.937-1.719h.438c-.274.47-.454.81-.547 1.016a6.017 6.017 0 0 0-.329.969c-.093.43-.14.855-.14 1.281 0 1.086.336 2.172 1.016 3.266zm0 0"/></symbol><symbol overflow="visible" id="s"><path d="M.61 0v-3.125H.062v-.484h.546v-.375c0-.25.02-.43.063-.547a.682.682 0 0 1 .297-.375c.156-.102.367-.157.64-.157.164 0 .352.024.563.063l-.094.531a2.354 2.354 0 0 0-.36-.031c-.187 0-.32.043-.39.125-.074.074-.11.219-.11.438v.328h.704v.484h-.703V0zm0 0"/></symbol><symbol overflow="visible" id="t"><path d="M2.828 0v-.531c-.281.406-.668.61-1.156.61-.211 0-.406-.04-.594-.11a1.03 1.03 0 0 1-.422-.313 1.12 1.12 0 0 1-.172-.453 2.587 2.587 0 0 1-.046-.578v-2.234h.625v2c0 .324.007.543.03.656.04.156.126.281.25.375.126.094.274.14.454.14.187 0 .36-.046.516-.14a.744.744 0 0 0 .343-.39c.063-.165.094-.4.094-.704v-1.937h.625V0zm0 0"/></symbol><symbol overflow="visible" id="u"><path d="M.453 0v-3.61h.563v.516c.257-.394.64-.594 1.14-.594.219 0 .414.043.594.126a.85.85 0 0 1 .406.296c.094.125.16.278.203.454.02.117.032.312.032.593V0h-.61v-2.188c0-.25-.027-.437-.078-.562a.544.544 0 0 0-.25-.297.848.848 0 0 0-.422-.11c-.261 0-.492.087-.687.25-.188.169-.282.481-.282.938V0zm0 0"/></symbol><symbol overflow="visible" id="v"><path d="M.625 0v-.703h.688V0c0 .258-.047.469-.141.625a.844.844 0 0 1-.422.36L.578.718A.57.57 0 0 0 .86.469C.922.363.957.207.97 0zm0 0"/></symbol><symbol overflow="visible" id="x"><path d="M.219-4.063l.156-.484c.352.125.613.234.781.328a9.3 9.3 0 0 1-.062-.843h.484c0 .23-.027.511-.078.843.238-.113.508-.222.813-.328l.156.484a4.413 4.413 0 0 1-.86.188c.145.125.344.34.594.64l-.406.297a8.315 8.315 0 0 1-.469-.734c-.168.324-.312.57-.437.735l-.407-.297c.258-.32.446-.536.563-.641a7.848 7.848 0 0 1-.828-.188zm0 0"/></symbol><symbol overflow="visible" id="y"><path d="M.453 0v-3.61H1v.547c.145-.25.273-.414.39-.5a.648.648 0 0 1 .391-.124c.207 0 .414.07.625.203l-.203.562a.885.885 0 0 0-.453-.14.559.559 0 0 0-.36.124.649.649 0 0 0-.218.344c-.074.211-.11.446-.11.703V0zm0 0"/></symbol><symbol overflow="visible" id="z"><path d="M.344.297L.938.39c.03.175.097.304.203.39.156.114.363.172.625.172.28 0 .5-.058.656-.172a.777.777 0 0 0 .312-.469c.032-.124.047-.382.047-.78-.273.312-.605.468-1 .468-.5 0-.886-.176-1.156-.531C.352-.895.219-1.328.219-1.828c0-.344.062-.66.187-.953.125-.29.305-.516.547-.672.238-.156.516-.235.828-.235.426 0 .782.172 1.063.516v-.437h.562v3.125c0 .562-.058.957-.172 1.187a1.266 1.266 0 0 1-.546.563c-.25.132-.56.203-.922.203-.43 0-.778-.102-1.047-.297C.457.972.332.68.344.297zm.515-2.172c0 .48.094.828.282 1.047a.888.888 0 0 0 .703.328c.281 0 .515-.11.703-.328.187-.219.281-.555.281-1.016 0-.445-.101-.781-.297-1a.88.88 0 0 0-.703-.344c-.273 0-.5.118-.687.344-.188.219-.282.543-.282.969zm0 0"/></symbol><symbol overflow="visible" id="A"><path d="M.219-1.078l.594-.094c.039.242.132.43.28.563.157.125.376.187.657.187s.488-.055.625-.172A.524.524 0 0 0 2.578-1a.397.397 0 0 0-.172-.328c-.086-.05-.293-.117-.625-.203-.449-.114-.761-.211-.937-.297a.908.908 0 0 1-.406-.344.897.897 0 0 1-.126-.469c0-.164.036-.316.11-.453.07-.133.172-.25.297-.344.101-.07.234-.128.39-.171a1.8 1.8 0 0 1 .532-.079c.28 0 .523.043.734.126.219.085.379.195.484.328.102.136.176.324.22.562l-.61.078a.632.632 0 0 0-.235-.437c-.125-.102-.308-.156-.546-.156-.282 0-.485.046-.61.14a.408.408 0 0 0-.172.328c0 .086.024.156.078.219.051.063.13.117.235.156.062.024.238.074.531.156.438.118.738.211.906.282a.875.875 0 0 1 .406.328c.094.137.141.308.141.516 0 .21-.058.402-.172.578-.117.18-.289.32-.515.421a2.01 2.01 0 0 1-.766.141C1.281.078.922-.016.672-.203.43-.398.282-.691.219-1.078zm0 0"/></symbol><symbol overflow="visible" id="B"><path d="M.86 1.469H.421C1.098.375 1.438-.711 1.438-1.797c0-.426-.047-.848-.141-1.266a6.612 6.612 0 0 0-.328-.984 21.587 21.587 0 0 0-.547-1.016h.437a6.51 6.51 0 0 1 .938 1.72 4.566 4.566 0 0 1-.094 3.312c-.23.57-.512 1.07-.844 1.5zm0 0"/></symbol><symbol overflow="visible" id="C"><path d="M2.922-1.156l.64.078A1.604 1.604 0 0 1 3-.218c-.273.198-.617.296-1.031.296-.524 0-.938-.16-1.25-.484C.406-.726.25-1.18.25-1.766c0-.613.156-1.086.469-1.421.312-.333.719-.5 1.219-.5.476 0 .867.167 1.171.5.313.324.47.78.47 1.374v.172H.89c.02.399.129.7.328.907.207.21.457.312.75.312a.94.94 0 0 0 .578-.172c.156-.125.281-.312.375-.562zm-2-1h2.015c-.03-.301-.109-.524-.234-.672a.94.94 0 0 0-.75-.36c-.281 0-.523.094-.719.282-.187.187-.293.437-.312.75zm0 0"/></symbol><symbol overflow="visible" id="D"><path d="M2.797 0v-.453c-.23.355-.563.531-1 .531C1.504.078 1.238 0 1-.156a1.545 1.545 0 0 1-.563-.656 2.275 2.275 0 0 1-.203-.985c0-.363.055-.691.172-.984.125-.29.305-.516.547-.672.238-.156.508-.235.813-.235.218 0 .41.047.578.141.164.094.3.215.406.36v-1.797h.61V0zM.859-1.797c0 .461.098.805.297 1.031.196.23.426.344.688.344.27 0 .5-.11.687-.328.188-.219.281-.55.281-1 0-.488-.101-.848-.296-1.078-.188-.238-.422-.36-.704-.36-.273 0-.5.118-.687.344-.18.219-.266.57-.266 1.047zm0 0"/></symbol><symbol overflow="visible" id="E"><path d="M.453 0v-3.61H1v.516c.113-.176.266-.316.453-.422.188-.113.399-.171.64-.171.27 0 .489.058.657.171a.798.798 0 0 1 .36.454c.288-.415.663-.626 1.124-.626.352 0 .625.102.813.297.195.2.297.508.297.922V0h-.61v-2.266c0-.25-.023-.425-.062-.53a.451.451 0 0 0-.203-.25.662.662 0 0 0-.375-.11c-.25 0-.461.086-.625.25-.168.168-.25.437-.25.812V0h-.625v-2.344c0-.27-.055-.472-.156-.61-.094-.132-.25-.202-.47-.202-.179 0-.34.047-.484.14a.76.76 0 0 0-.328.391c-.062.18-.093.43-.093.75V0zm0 0"/></symbol><symbol overflow="visible" id="K"><path d="M-.11 1.375V.937h4.048v.438zm0 0"/></symbol><symbol overflow="visible" id="L"><path d="M1.797-.547L1.875 0c-.168.031-.32.047-.453.047-.219 0-.39-.031-.516-.094a.595.595 0 0 1-.265-.281C.598-.441.578-.688.578-1.062v-2.063H.125v-.484h.453V-4.5l.594-.36v1.25h.625v.485h-.625v2.11c0 .167.008.277.031.327a.383.383 0 0 0 .11.125c.05.032.125.047.218.047.063 0 .149-.007.266-.03zm0 0"/></symbol><symbol overflow="visible" id="M"><path d="M.469-4.281v-.703h.61v.703zM.469 0v-3.61h.61V0zm0 0"/></symbol><symbol overflow="visible" id="N"><path d="M.234-1.797c0-.664.18-1.16.547-1.484.313-.27.692-.406 1.14-.406.5 0 .907.164 1.22.484.312.324.468.773.468 1.344 0 .468-.074.84-.218 1.109-.137.262-.34.465-.61.61a1.746 1.746 0 0 1-.86.218c-.5 0-.905-.16-1.218-.484-.312-.32-.469-.785-.469-1.39zm.625 0c0 .461.098.805.297 1.031.207.23.461.344.766.344.3 0 .55-.113.75-.344.207-.226.312-.582.312-1.062 0-.438-.105-.77-.312-1a.94.94 0 0 0-.75-.36.998.998 0 0 0-.766.344c-.199.23-.297.578-.297 1.047zm0 0"/></symbol><symbol overflow="visible" id="O"><path d="M.453 1.375v-4.984h.563v.468c.132-.175.28-.312.437-.406.164-.094.367-.14.61-.14.3 0 .57.078.812.234.238.156.414.383.531.672.125.293.188.61.188.953 0 .367-.07.7-.203 1a1.528 1.528 0 0 1-.579.672c-.25.156-.515.234-.796.234a1.21 1.21 0 0 1-.954-.453v1.75zm.563-3.156c0 .46.093.804.28 1.031.188.219.411.328.673.328a.869.869 0 0 0 .703-.344c.195-.226.297-.582.297-1.062 0-.457-.102-.8-.297-1.031-.188-.227-.414-.344-.672-.344-.262 0-.492.121-.688.36-.199.241-.296.593-.296 1.062zm0 0"/></symbol><symbol overflow="visible" id="P"><path d="M.516 0v-4.984h1.859c.383 0 .691.054.922.156.226.105.406.262.531.469.133.21.203.43.203.656 0 .21-.058.406-.172.594a1.338 1.338 0 0 1-.53.468c.3.086.53.235.687.454.164.21.25.46.25.75 0 .23-.055.445-.157.64a1.27 1.27 0 0 1-.359.469 1.771 1.771 0 0 1-.547.25A3.35 3.35 0 0 1 2.406 0zm.656-2.89H2.25c.29 0 .5-.016.625-.047a.704.704 0 0 0 .375-.25.726.726 0 0 0 .125-.438.787.787 0 0 0-.125-.438.546.546 0 0 0-.328-.25c-.149-.05-.402-.078-.766-.078h-.984zm0 2.296h1.234c.207 0 .36-.004.453-.015a1.25 1.25 0 0 0 .375-.141.685.685 0 0 0 .25-.266.93.93 0 0 0 .094-.421.833.833 0 0 0-.14-.485.759.759 0 0 0-.391-.281c-.168-.063-.414-.094-.735-.094h-1.14zm0 0"/></symbol><symbol overflow="visible" id="Q"><path d="M.469 0v-4.984h.61v2.843l1.437-1.468h.796L1.938-2.266 3.452 0h-.75L1.5-1.844l-.422.422V0zm0 0"/></symbol><symbol overflow="visible" id="R"><path d="M1.797 0v-4.39H.157v-.594h3.952v.593H2.47V0zm0 0"/></symbol><symbol overflow="visible" id="S"><path d="M.453 0v-4.984h.61v1.796c.289-.332.656-.5 1.093-.5.258 0 .489.055.688.157.195.105.336.25.422.437.082.188.125.461.125.813V0h-.61v-2.281c0-.313-.07-.535-.203-.672-.125-.133-.308-.203-.547-.203a1.06 1.06 0 0 0-.531.14.834.834 0 0 0-.344.391c-.062.156-.093.375-.093.656V0zm0 0"/></symbol><symbol overflow="visible" id="T"><path d="M3.797-4.984h.672v2.89c0 .5-.059.899-.172 1.188a1.493 1.493 0 0 1-.625.719c-.293.18-.68.265-1.156.265-.47 0-.856-.078-1.157-.234a1.326 1.326 0 0 1-.625-.688C.61-1.156.547-1.57.547-2.094v-2.89h.656v2.875c0 .437.04.761.125.968.082.2.219.356.406.47.196.105.438.155.72.155.487 0 .831-.109 1.03-.328.207-.219.313-.64.313-1.265zm0 0"/></symbol><symbol overflow="visible" id="X"><path d="M.469 1.375v-6.36h1.344v.516h-.735V.875h.734v.5zm0 0"/></symbol><symbol overflow="visible" id="Y"><path d="M1.484 1.375H.125v-.5h.75v-5.344h-.75v-.515h1.36zm0 0"/></symbol><symbol overflow="visible" id="aa"><path d="M3.672-2.922H.39V-3.5h3.28zm0 1.5H.39v-.562h3.28zm0 0"/></symbol><symbol overflow="visible" id="ab"><path d="M.625 0v-.703h.703V0zm0 0"/></symbol><symbol overflow="visible" id="as"><path d="M1.453 0L.093-3.61h.641L1.5-1.452c.094.242.172.484.234.734.051-.187.13-.414.235-.687l.797-2.203h.625L2.03 0zm0 0"/></symbol><symbol overflow="visible" id="at"><path d="M.516 0v-4.984H1.5l1.188 3.53c.101.337.18.579.234.735.062-.176.148-.441.265-.797l1.188-3.468h.89V0h-.64v-4.172L3.187 0h-.593L1.156-4.234V0zm0 0"/></symbol><symbol overflow="visible" id="aC"><path d="M4.094-1.75l.656.172c-.137.543-.387.953-.75 1.234-.355.281-.793.422-1.313.422-.542 0-.98-.11-1.312-.328a2.057 2.057 0 0 1-.766-.938A3.34 3.34 0 0 1 .344-2.53c0-.508.097-.957.297-1.344.195-.395.476-.691.843-.89.364-.196.77-.298 1.22-.298.487 0 .905.133 1.25.391.343.25.577.606.702 1.063l-.64.156c-.118-.363-.282-.629-.5-.797-.22-.164-.496-.25-.829-.25-.386 0-.71.094-.968.281-.25.18-.43.422-.532.735a2.971 2.971 0 0 0-.156.953c0 .43.055.797.172 1.11.125.312.317.546.578.702.258.156.54.235.844.235.375 0 .688-.102.938-.313.257-.207.437-.523.53-.953zm0 0"/></symbol><symbol overflow="visible" id="aD"><path d="M-.016 0l1.922-4.984h.703L4.641 0h-.75l-.579-1.5H1.235L.688 0zm1.438-2.047h1.687l-.515-1.375a16.507 16.507 0 0 1-.36-1.031c-.062.324-.152.64-.265.953zm0 0"/></symbol><symbol overflow="visible" id="aE"><path d="M.516 0v-4.984h.656v4.39h2.453V0zm0 0"/></symbol><symbol overflow="visible" id="aF"><path d="M.578 0v-4.984h3.344v.593H1.234v1.547h2.329v.578H1.233V0zm0 0"/></symbol><symbol overflow="visible" id="aG"><path d="M.531 0v-4.984h.672l2.61 3.921v-3.921h.64V0h-.672L1.156-3.906V0zm0 0"/></symbol><symbol overflow="visible" id="aH"><path d="M.656 0v-4.984h.656V0zm0 0"/></symbol><symbol overflow="visible" id="aI"><path d="M.344-2.422c0-.82.219-1.469.656-1.937.445-.47 1.02-.704 1.719-.704.457 0 .867.11 1.234.329.375.218.656.527.844.921.195.387.297.829.297 1.329 0 .511-.106.964-.313 1.359-.199.398-.484.7-.86.906-.374.2-.776.297-1.202.297-.469 0-.89-.11-1.266-.328a2.172 2.172 0 0 1-.828-.922 2.88 2.88 0 0 1-.281-1.25zm.672.016c0 .594.16 1.062.484 1.406.32.344.727.516 1.219.516.488 0 .894-.172 1.219-.516.32-.352.484-.848.484-1.484 0-.407-.074-.758-.219-1.063a1.617 1.617 0 0 0-.594-.703 1.645 1.645 0 0 0-.89-.25c-.461 0-.86.164-1.203.484-.336.325-.5.86-.5 1.61zm0 0"/></symbol><symbol overflow="visible" id="aK"><path d="M0-.531h-4.984v-.672l3.921-2.61h-3.921v-.64H0v.672l-3.906 2.625H0zm0 0"/></symbol><symbol overflow="visible" id="aL"><path d="M-1.156-2.922l.078-.64c.367.105.652.292.86.562.198.273.296.617.296 1.031 0 .524-.16.938-.484 1.25-.32.313-.774.469-1.36.469-.613 0-1.086-.156-1.421-.469-.333-.312-.5-.719-.5-1.219 0-.476.167-.867.5-1.171.324-.313.78-.47 1.374-.47h.172V-.89c.399-.02.7-.129.907-.328.21-.207.312-.457.312-.75a.94.94 0 0 0-.172-.578c-.125-.156-.312-.281-.562-.375zm-1 2v-2.015c-.301.03-.524.109-.672.234a.94.94 0 0 0-.36.75c0 .281.094.523.282.719.187.187.437.293.75.312zm0 0"/></symbol><symbol overflow="visible" id="aM"><path d="M-.547-1.797L0-1.875c.031.168.047.32.047.453 0 .219-.031.39-.094.516a.595.595 0 0 1-.281.265c-.113.043-.36.063-.734.063h-2.063v.453h-.484v-.453H-4.5l-.36-.594h1.25v-.625h.485v.625h2.11c.167 0 .277-.008.327-.031a.383.383 0 0 0 .125-.11.423.423 0 0 0 .047-.218 1.38 1.38 0 0 0-.03-.266zm0 0"/></symbol><symbol overflow="visible" id="aN"><path d="M0-1.125l-3.61 1.11v-.641l2.079-.563.781-.218c-.04-.008-.29-.07-.75-.188l-2.11-.578v-.625l2.094-.547.688-.172-.688-.203-2.093-.625v-.594L0-3.844v.64l-2.156.579-.625.14L0-1.764zm0 0"/></symbol><symbol overflow="visible" id="aO"><path d="M-1.797-.234c-.664 0-1.16-.18-1.484-.547a1.686 1.686 0 0 1-.406-1.14c0-.5.164-.907.484-1.22.324-.312.773-.468 1.344-.468.468 0 .84.074 1.109.218.262.137.465.34.61.61.144.261.218.547.218.86 0 .5-.16.905-.484 1.218-.32.312-.785.469-1.39.469zm0-.625c.461 0 .805-.098 1.031-.297a.985.985 0 0 0 .344-.766c0-.3-.113-.55-.344-.75-.226-.207-.582-.312-1.062-.312-.438 0-.77.105-1 .312a.94.94 0 0 0-.36.75c0 .305.118.559.344.766.23.199.578.297 1.047.297zm0 0"/></symbol><symbol overflow="visible" id="aP"><path d="M0-.453h-3.61V-1h.547c-.25-.145-.414-.273-.5-.39a.648.648 0 0 1-.124-.391c0-.207.07-.414.203-.625l.562.203a.885.885 0 0 0-.14.453c0 .137.042.258.124.36.086.105.2.18.344.218.211.074.446.11.703.11H0zm0 0"/></symbol><symbol overflow="visible" id="aQ"><path d="M0-.469h-4.984v-.61h2.843l-1.468-1.437v-.796l1.343 1.374L0-3.452v.75L-1.844-1.5l.422.422H0zm0 0"/></symbol><clipPath id="m"><path d="M89 339h76.719v2H89zm0 0"/></clipPath><clipPath id="n"><path d="M89 345h76.719v2H89zm0 0"/></clipPath><clipPath id="I"><path d="M189.602 339h76.796v2h-76.796zm0 0"/></clipPath><clipPath id="J"><path d="M189.602 345h76.796v2h-76.796zm0 0"/></clipPath><clipPath id="W"><path d="M142.441 396h76.797v2h-76.797zm0 0"/></clipPath><clipPath id="Z"><path d="M142.441 410h76.797v2h-76.797zm0 0"/></clipPath><clipPath id="af"><path d="M189.602 465h76.796v2h-76.796zm0 0"/></clipPath><clipPath id="ag"><path d="M189.602 471h76.796v2h-76.796zm0 0"/></clipPath><clipPath id="aj"><path d="M88.32 465H165v2H88.32zm0 0"/></clipPath><clipPath id="ak"><path d="M88.32 471H165v2H88.32zm0 0"/></clipPath><clipPath id="aq"><path d="M345 339h76.8v2H345zm0 0"/></clipPath><clipPath id="ar"><path d="M345 345h76.8v2H345zm0 0"/></clipPath><clipPath id="au"><path d="M398.52 396h76.921v2H398.52zm0 0"/></clipPath><clipPath id="av"><path d="M398.52 410h76.921v2H398.52zm0 0"/></clipPath><clipPath id="aw"><path d="M345 465h76.8v2H345zm0 0"/></clipPath><clipPath id="ax"><path d="M345 471h76.8v2H345zm0 0"/></clipPath><clipPath id="az"><path d="M445.68 340h76.8v2h-76.8zm0 0"/></clipPath><clipPath id="aA"><path d="M445.68 346h76.8v2h-76.8zm0 0"/></clipPath><clipPath id="aB"><path d="M445.68 465h76.8v2h-76.8zm0 0"/></clipPath><clipPath id="aJ"><path d="M445.68 479h76.8v2h-76.8zm0 0"/></clipPath></defs><path d="M0 0h468v240.96H0zm0 0" fill="#fff"/><path d="M1.2 3.84v233.64c0 1.32.96 2.282 2.28 2.282h204.36c1.2 0 2.281-.961 2.281-2.282V3.84c0-1.32-1.082-2.281-2.281-2.281H3.48c-1.32 0-2.28.96-2.28 2.28zm0 0" fill="#f5f5f5"/><path d="M1.2 1.559H210.12v12.96H1.2zm0 0" fill="#ebebeb"/><use xlink:href="#a" x="254.28" y="286.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#b" x="261.624" y="286.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#c" x="266.487" y="286.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#d" x="270.946" y="286.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#e" x="273.376" y="286.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#f" x="278.238" y="286.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><path d="M1.441 8.52V12H.84V8.52zm0 4.68v3.48H.84V13.2zm0 4.562v3.597H.84v-3.597zm0 4.68v3.48H.84v-3.48zm0 4.68v3.48H.84v-3.48zm0 4.679v3.48H.84v-3.48zm0 4.68v3.48H.84v-3.48zm0 4.558v3.602H.84v-3.602zm0 4.68v3.48H.84v-3.48zm0 4.683v3.477H.84v-3.477zm0 4.68v3.477H.84v-3.477zm0 4.68v3.48H.84v-3.48zm0 4.68v3.48H.84v-3.48zm0 4.558v3.48H.84V69zm0 4.68v3.48H.84v-3.48zm0 4.68v3.48H.84v-3.48zm0 4.68v3.48H.84v-3.48zm0 4.679v3.48H.84v-3.48zm0 4.562v3.48H.84v-3.48zm0 4.68v3.48H.84v-3.48zm0 4.68v3.48H.84v-3.48zm0 4.68v3.48H.84v-3.48zm0 4.679v3.48H.84V111zm0 4.559v3.48H.84v-3.48zm0 4.683v3.477H.84v-3.477zm0 4.68v3.48H.84v-3.48zm0 4.68v3.48H.84v-3.48zm0 4.68v3.48H.84v-3.48zm0 4.558v3.601H.84v-3.601zm0 4.68V147H.84v-3.48zm0 4.68v3.48H.84v-3.48zm0 4.679v3.48H.84v-3.48zm0 4.68v3.48H.84v-3.48zm0 4.562v3.598H.84v-3.598zm0 4.68v3.48H.84v-3.48zm0 4.68v3.48H.84v-3.48zm0 4.68v3.48H.84v-3.48zm0 4.679v3.48H.84v-3.48zm0 4.562V189H.84v-3.598zm0 4.68v3.477H.84v-3.477zm0 4.68v3.48H.84v-3.48zm0 4.68v3.48H.84v-3.48zm0 4.68v3.48H.84v-3.48zm0 4.558v3.601H.84v-3.601zm0 4.68v3.48H.84v-3.48zm0 4.68v3.48H.84v-3.48zm0 4.679v3.48H.84v-3.48zm0 4.683v3.477H.84v-3.477zm0 4.68v3.477H.84v-3.477zm0 4.559v.84H1.2h.242c0 .84.48 1.558 1.2 1.921l-.243.477c-.84-.36-1.558-1.32-1.558-2.399v-.84zm2.278 2.879h3.48v.601H3.72zm4.68 0h3.48v.601h-3.48zm4.562 0h3.48v.601h-3.48zm4.68 0h3.48v.601h-3.48zm4.68 0h3.48v.601h-3.48zm4.679 0h3.48v.601H27zm4.68 0h3.48v.601h-3.48zm4.558 0h3.48v.601h-3.48zm4.684 0h3.476v.601h-3.476zm4.68 0h3.476v.601h-3.476zm4.68 0h3.48v.601h-3.48zm4.679 0h3.48v.601h-3.48zm4.559 0h3.601v.601H59.52zm4.68 0h3.48v.601H64.2zm4.679 0h3.48v.601h-3.48zm4.68 0h3.48v.601h-3.48zm4.68 0h3.48v.601h-3.48zm4.562 0h3.597v.601h-3.597zm4.68 0h3.48v.601h-3.48zm4.68 0h3.48v.601h-3.48zm4.679 0h3.48v.601h-3.48zm4.68 0H105v.601h-3.48zm4.558 0h3.602v.601h-3.602zm4.684 0h3.476v.601h-3.476zm4.68 0h3.48v.601h-3.48zm4.68 0h3.48v.601h-3.48zm4.679 0h3.48v.601h-3.48zm4.68 0h3.48v.601h-3.48zm4.558 0h3.48v.601h-3.48zm4.68 0h3.48v.601h-3.48zm4.68 0h3.48v.601h-3.48zm4.68 0h3.48v.601h-3.48zm4.683 0h3.476v.601h-3.476zm4.558 0h3.48v.601h-3.48zm4.68 0h3.48v.601H162zm4.68 0h3.48v.601h-3.48zm4.68 0h3.48v.601h-3.48zm4.68 0h3.48v.601h-3.48zm4.562 0h3.476v.601h-3.476zm4.68 0h3.48v.601h-3.48zm4.679 0h3.48v.601h-3.48zm4.68 0h3.48v.601h-3.48zm4.68 0h3.48v.601h-3.48zm4.558 0h3.601v.601h-3.601zm4.562-.118c.84-.242 1.438-1.082 1.438-1.922h.242-.242v-.601h.601v.601c0 1.2-.84 2.16-1.8 2.52zm1.438-3.722v-3.48h.601v3.48zm0-4.68v-3.48h.601V231zm0-4.559v-3.601h.601v3.601zm0-4.68v-3.48h.601v3.48zm0-4.679v-3.48h.601v3.48zm0-4.68v-3.48h.601v3.48zm0-4.683v-3.477h.601v3.477zm0-4.559v-3.601h.601v3.601zm0-4.68V195h.601v3.48zm0-4.68v-3.48h.601v3.48zm0-4.679v-3.48h.601v3.48zm0-4.68v-3.48h.601v3.48zm0-4.562v-3.598h.601v3.598zm0-4.68v-3.48h.601v3.48zm0-4.68v-3.48h.601v3.48zm0-4.68v-3.48h.601v3.48zm0-4.679v-3.48h.601v3.48zm0-4.68V153h.601v3.48zm0-4.558v-3.48h.601v3.48zm0-4.68v-3.48h.601v3.48zm0-4.683v-3.477h.601v3.477zm0-4.68v-3.477h.601v3.477zm0-4.68v-3.48h.601v3.48zm0-4.558v-3.48h.601v3.48zm0-4.68v-3.48h.601v3.48zm0-4.68v-3.48h.601v3.48zm0-4.68v-3.48h.601v3.48zm0-4.68v-3.48h.601v3.48zm0-4.562v-3.48h.601v3.48zm0-4.68V97.2h.601v3.48zm0-4.679v-3.48h.601V96zm0-4.68v-3.48h.601v3.48zm0-4.68v-3.48h.601v3.48zm0-4.558V78.48h.601v3.602zm0-4.68v-3.48h.601v3.48zm0-4.683v-3.477h.601v3.477zm0-4.68v-3.48h.601v3.48zm0-4.68v-3.48h.601v3.48zm0-4.558v-3.602h.601v3.602zm0-4.68v-3.48h.601v3.48zm0-4.68v-3.48h.601v3.48zm0-4.68v-3.48h.601v3.48zm0-4.679v-3.48h.601v3.48zm0-4.562v-3.598h.601v3.598zm0-4.68v-3.48h.601v3.48zm0-4.68v-3.48h.601v3.48zm0-4.68V18h.601v3.48zm0-4.68v-3.48h.601v3.48zm0-4.679v-3.48h.601v3.48zm0-4.562V4.082h.601v3.477zM209.64 3c-.243-.719-.961-1.2-1.801-1.2V1.56 1.8H207v-.602h.84c1.082 0 1.922.723 2.398 1.563zm-3.84-1.2h-3.48v-.6h3.48zm-4.68 0h-3.48v-.6h3.48zm-4.562 0h-3.48v-.6h3.48zm-4.68 0h-3.48v-.6h3.48zm-4.68 0h-3.48v-.6h3.48zm-4.68 0h-3.48v-.6h3.48zm-4.68 0h-3.48v-.6h3.48zm-4.558 0h-3.48v-.6h3.48zm-4.68 0h-3.48v-.6h3.48zm-4.68 0h-3.48v-.6h3.48zm-4.683 0h-3.476v-.6h3.476zm-4.68 0h-3.48v-.6h3.48zM150 1.8h-3.602v-.6H150zm-4.68 0h-3.48v-.6h3.48zm-4.68 0h-3.48v-.6h3.48zm-4.68 0h-3.48v-.6h3.48zm-4.679 0h-3.48v-.6h3.48zm-4.562 0h-3.598v-.6h3.598zm-4.68 0h-3.48v-.6h3.48zm-4.68 0h-3.48v-.6h3.48zm-4.68 0h-3.48v-.6h3.48zM108 1.8h-3.48v-.6H108zm-4.559 0H99.84v-.6h3.601zm-4.68 0h-3.48v-.6h3.48zm-4.683 0h-3.476v-.6h3.476zm-4.68 0h-3.476v-.6h3.476zm-4.68 0h-3.48v-.6h3.48zm-4.679 0h-3.48v-.6h3.48zm-4.559 0H72v-.6h3.48zm-4.68 0h-3.48v-.6h3.48zm-4.679 0h-3.48v-.6h3.48zm-4.68 0h-3.48v-.6h3.48zm-4.68 0h-3.48v-.6h3.48zm-4.562 0h-3.48v-.6h3.48zm-4.68 0h-3.48v-.6h3.48zm-4.68 0h-3.48v-.6h3.48zm-4.679 0h-3.48v-.6h3.48zm-4.68 0H30v-.6h3.48zm-4.558 0h-3.48v-.6h3.48zm-4.684 0h-3.476v-.6h3.476zm-4.68 0h-3.48v-.6h3.48zm-4.68 0h-3.48v-.6h3.48zm-4.679 0H6.72v-.6h3.48zm-4.558 0H3.48V1.56 1.8c-.36 0-.84.12-1.083.36L2.04 1.68C2.4 1.44 3 1.2 3.48 1.2h2.16zM1.68 2.88c-.121.363-.239.601-.239.96H1.2h.242V7.32H.84V3.84c0-.48.12-.84.36-1.2zm0 0"/><path d="M111.121 41.879h90.238V231.12h-90.238zm0 0" fill="#bfbfbf"/><path d="M111.121 41.64h90.598v189.72h-90.84V41.64zm0 .602v-.363h.36V231.12h-.36v-.36h90.238v.36h-.238V41.88h.238v.363zm0 0"/><path d="M9.84 41.281h90.238v189.84H9.84zm0 0" fill="#bfbfbf"/><path d="M9.84 41.04h90.601v190.32H9.601V41.04zm0 .6v-.359h.36v189.84h-.36v-.36h90.238v.36h-.238V41.281h.238v.36zm0 0"/><path d="M17.52 50.04H93.12v46.562H17.52zm0 0" fill="#ffca00"/><path d="M16.922 49.441h.598V97.2h-.598zm0 0M17.52 49.441H93.12v.598H17.52zm0 0" fill="#ff0"/><path d="M17.52 96.602h76.199v.597h-76.2zm0 0M93.121 49.441h.598v47.16h-.598zm0 0" fill="#b08c00"/><use xlink:href="#g" x="113.16" y="335.76" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#h" x="118.609" y="335.76" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#i" x="123.137" y="335.76" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#j" x="127.664" y="335.76" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#k" x="130.177" y="335.76" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#l" x="134.373" y="335.76" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#j" x="138.57" y="335.76" width="100%" height="100%" transform="translate(-72 -275.52)"/><g clip-path="url(#m)" transform="translate(-72 -275.52)"><path d="M89.52 340.078h75.601" fill="none" stroke="#000" stroke-width=".6000000000000001" stroke-linecap="square" stroke-miterlimit="10"/></g><g clip-path="url(#n)" transform="translate(-72 -275.52)"><path d="M89.52 345.96h75.601" fill="none" stroke="#000" stroke-width=".6000000000000001" stroke-linecap="square" stroke-miterlimit="10"/></g><use xlink:href="#o" x="91.8" y="356.16" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#p" x="95.273" y="356.16" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#q" x="99.094" y="356.16" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#q" x="100.692" y="356.16" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#r" x="102.235" y="356.16" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#s" x="104.549" y="356.16" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#t" x="106.424" y="356.16" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#u" x="110.245" y="356.16" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#o" x="114.109" y="356.16" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#v" x="117.582" y="356.16" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#w" x="119.458" y="356.16" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#x" x="121.388" y="356.16" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#p" x="124.166" y="356.16" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#y" x="127.987" y="356.16" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#z" x="130.3" y="356.16" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#A" x="134.121" y="356.16" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#B" x="137.595" y="356.16" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#A" x="91.8" y="364.68" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#C" x="95.273" y="364.68" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#u" x="99.094" y="364.68" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#D" x="102.958" y="364.68" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#r" x="106.778" y="364.68" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#E" x="109.092" y="364.68" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#A" x="114.927" y="364.68" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#z" x="118.4" y="364.68" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#B" x="122.221" y="364.68" width="100%" height="100%" transform="translate(-72 -275.52)"/><path d="M118.2 50.64h75.6V97.2h-75.6zm0 0" fill="#ffca00"/><path d="M117.602 50.04h.597V97.8h-.597zm0 0M118.2 50.04h75.6v.6h-75.6zm0 0" fill="#ff0"/><path d="M118.2 97.2h76.198v.6H118.2zm0 0M193.8 50.04h.598V97.2h-.597zm0 0" fill="#b08c00"/><use xlink:href="#F" x="216.12" y="336.12" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#G" x="221.569" y="336.12" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#h" x="224.506" y="336.12" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#H" x="229.033" y="336.12" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#k" x="233.23" y="336.12" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#G" x="237.426" y="336.12" width="100%" height="100%" transform="translate(-72 -275.52)"/><g clip-path="url(#I)" transform="translate(-72 -275.52)"><path d="M190.2 340.078h75.6" fill="none" stroke="#000" stroke-width=".6000000000000001" stroke-linecap="square" stroke-miterlimit="10"/></g><g clip-path="url(#J)" transform="translate(-72 -275.52)"><path d="M190.2 345.96h75.6" fill="none" stroke="#000" stroke-width=".6000000000000001" stroke-linecap="square" stroke-miterlimit="10"/></g><use xlink:href="#K" x="192.84" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#A" x="196.661" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#L" x="200.134" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#p" x="202.064" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#y" x="205.885" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#L" x="208.198" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#K" x="210.074" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#L" x="213.937" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#y" x="215.867" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#p" x="218.181" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#u" x="222.002" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#A" x="225.822" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#E" x="229.296" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#M" x="235.131" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#L" x="236.729" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#r" x="238.659" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#A" x="240.972" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#L" x="244.376" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#y" x="246.306" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#E" x="248.62" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#B" x="254.455" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#K" x="192.84" y="364.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#A" x="196.661" y="364.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#L" x="200.134" y="364.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#N" x="202.064" y="364.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#O" x="205.885" y="364.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#K" x="209.748" y="364.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#L" x="213.569" y="364.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#y" x="215.499" y="364.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#p" x="217.813" y="364.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#u" x="221.633" y="364.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#A" x="225.454" y="364.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#E" x="228.927" y="364.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#M" x="234.832" y="364.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#L" x="236.376" y="364.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#r" x="238.251" y="364.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#A" x="240.565" y="364.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#L" x="244.038" y="364.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#y" x="245.968" y="364.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#E" x="248.281" y="364.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#B" x="254.117" y="364.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#P" x="205.92" y="310.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#y" x="210.553" y="310.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#N" x="212.867" y="310.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#Q" x="216.688" y="310.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#C" x="220.3" y="310.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#y" x="224.121" y="310.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#w" x="226.434" y="310.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#R" x="228.31" y="310.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#S" x="232.686" y="310.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#y" x="236.507" y="310.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#C" x="238.82" y="310.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#p" x="242.641" y="310.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#D" x="246.462" y="310.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#T" x="105.84" y="310.32" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#A" x="110.911" y="310.32" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#C" x="114.385" y="310.32" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#y" x="118.205" y="310.32" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#w" x="120.519" y="310.32" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#R" x="122.394" y="310.32" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#S" x="126.701" y="310.32" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#y" x="130.522" y="310.32" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#C" x="132.835" y="310.32" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#p" x="136.656" y="310.32" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#D" x="140.477" y="310.32" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#A" x="144.34" y="310.32" width="100%" height="100%" transform="translate(-72 -275.52)"/><path d="M71.04 106.559h75.6v59.28h-75.6zm0 0" fill="#ffca00"/><path d="M70.441 105.96h.598v60.481h-.598zm0 0M71.04 105.96h75.6v.599h-75.6zm0 0" fill="#ff0"/><path d="M71.04 165.84h76.198v.601H71.04zm0 0M146.64 105.96h.598v59.88h-.597zm0 0" fill="#b08c00"/><use xlink:href="#U" x="168.6" y="392.28" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#h" x="174.049" y="392.28" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#V" x="178.577" y="392.28" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#j" x="183.104" y="392.28" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#k" x="185.617" y="392.28" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#G" x="189.813" y="392.28" width="100%" height="100%" transform="translate(-72 -275.52)"/><g clip-path="url(#W)" transform="translate(-72 -275.52)"><path d="M143.04 396.602h75.6" fill="none" stroke="#000" stroke-width=".6000000000000001" stroke-linecap="square" stroke-miterlimit="10"/></g><use xlink:href="#S" x="145.32" y="406.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#p" x="149.141" y="406.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#u" x="153.1" y="406.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#D" x="156.964" y="406.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#q" x="160.785" y="406.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#C" x="162.382" y="406.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#y" x="166.342" y="406.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#A" x="168.565" y="406.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#X" x="172.038" y="406.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#Y" x="173.969" y="406.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><g clip-path="url(#Z)" transform="translate(-72 -275.52)"><path d="M143.04 411.121h75.6" fill="none" stroke="#000" stroke-width=".6000000000000001" stroke-linecap="square" stroke-miterlimit="10"/></g><use xlink:href="#A" x="145.32" y="421.2" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#A" x="148.793" y="421.2" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#S" x="152.267" y="421.2" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#r" x="156.088" y="421.2" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#S" x="158.401" y="421.2" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#N" x="162.222" y="421.2" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#A" x="166.042" y="421.2" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#L" x="169.516" y="421.2" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#u" x="171.446" y="421.2" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#p" x="175.267" y="421.2" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#E" x="179.13" y="421.2" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#C" x="185.035" y="421.2" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#aa" x="188.856" y="421.2" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#ab" x="192.912" y="421.2" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#ab" x="194.843" y="421.2" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#ab" x="196.773" y="421.2" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#B" x="198.648" y="421.2" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#A" x="145.32" y="429.72" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#t" x="148.793" y="429.72" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#D" x="152.614" y="429.72" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#N" x="156.478" y="429.72" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#r" x="160.298" y="429.72" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#t" x="162.612" y="429.72" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#A" x="166.432" y="429.72" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#C" x="169.906" y="429.72" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#y" x="173.727" y="429.72" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#u" x="176.04" y="429.72" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#p" x="179.861" y="429.72" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#E" x="183.681" y="429.72" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#C" x="189.586" y="429.72" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#aa" x="193.407" y="429.72" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#ab" x="197.464" y="429.72" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#ab" x="199.394" y="429.72" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#ab" x="201.324" y="429.72" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#B" x="203.254" y="429.72" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#y" x="145.32" y="438.24" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#N" x="147.633" y="438.24" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#t" x="151.454" y="438.24" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#L" x="155.275" y="438.24" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#C" x="157.205" y="438.24" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#r" x="161.026" y="438.24" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#E" x="163.339" y="438.24" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#A" x="169.174" y="438.24" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#z" x="172.648" y="438.24" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#B" x="176.468" y="438.24" width="100%" height="100%" transform="translate(-72 -275.52)"/><path d="M118.2 176.402h75.6v46.559h-75.6zm0 0" fill="#ffca00"/><path d="M117.602 175.8h.597v47.759h-.597zm0 0M118.2 175.8h75.6v.602h-75.6zm0 0" fill="#ff0"/><path d="M118.2 222.96h76.198v.599H118.2zm0 0M193.8 175.8h.598v47.16h-.597zm0 0" fill="#b08c00"/><use xlink:href="#ac" x="215.52" y="461.76" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#j" x="220.553" y="461.76" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#G" x="223.066" y="461.76" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#k" x="226.084" y="461.76" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#ad" x="230.234" y="461.76" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#ae" x="234.431" y="461.76" width="100%" height="100%" transform="translate(-72 -275.52)"/><g clip-path="url(#af)" transform="translate(-72 -275.52)"><path d="M190.2 465.84h75.6" fill="none" stroke="#000" stroke-width=".6000000000000001" stroke-linecap="square" stroke-miterlimit="10"/></g><g clip-path="url(#ag)" transform="translate(-72 -275.52)"><path d="M190.2 471.719h75.6" fill="none" stroke="#000" stroke-width=".6000000000000001" stroke-linecap="square" stroke-miterlimit="10"/></g><use xlink:href="#A" x="192.84" y="482.16" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#C" x="196.313" y="482.16" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#u" x="200.134" y="482.16" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#D" x="204.094" y="482.16" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#r" x="207.957" y="482.16" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#B" x="210.319" y="482.16" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#N" x="192.84" y="490.68" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#u" x="196.661" y="490.68" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#K" x="200.524" y="490.68" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#L" x="204.345" y="490.68" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#y" x="206.275" y="490.68" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#p" x="208.588" y="490.68" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#u" x="212.409" y="490.68" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#A" x="216.23" y="490.68" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#E" x="219.703" y="490.68" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#M" x="225.608" y="490.68" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#L" x="227.151" y="490.68" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#r" x="229.027" y="490.68" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#B" x="231.34" y="490.68" width="100%" height="100%" transform="translate(-72 -275.52)"/><path d="M16.922 175.8H92.52v46.56H16.922zm0 0" fill="#ffca00"/><path d="M16.32 175.2h.602v47.76h-.602zm0 0M16.922 175.2H92.52v.6H16.922zm0 0" fill="#ff0"/><path d="M16.922 222.36h76.2v.6h-76.2zm0 0M92.52 175.2h.601v47.16h-.601zm0 0" fill="#b08c00"/><use xlink:href="#g" x="112.08" y="461.52" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#ah" x="117.529" y="461.52" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#ad" x="122.057" y="461.52" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#i" x="126.207" y="461.52" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#i" x="130.816" y="461.52" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#k" x="135.343" y="461.52" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#ai" x="139.54" y="461.52" width="100%" height="100%" transform="translate(-72 -275.52)"/><g clip-path="url(#aj)" transform="translate(-72 -275.52)"><path d="M88.922 465.84h75.598" fill="none" stroke="#000" stroke-width=".6000000000000001" stroke-linecap="square" stroke-miterlimit="10"/></g><g clip-path="url(#ak)" transform="translate(-72 -275.52)"><path d="M88.922 471.719h75.598" fill="none" stroke="#000" stroke-width=".6000000000000001" stroke-linecap="square" stroke-miterlimit="10"/></g><use xlink:href="#O" x="91.56" y="481.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#t" x="95.381" y="481.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#L" x="99.34" y="481.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#r" x="101.27" y="481.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#B" x="103.584" y="481.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><path d="M75.84 97.32l4.441 5.16-.48.36-4.442-5.16zm0 0"/><path d="M83.04 106.2L80.761 99l-1.082 3.242-3.36.598zm0 0M131.52 106.082l3.601-4.8.48.359-3.601 4.8zm0 0"/><path d="M138.238 97.8l-6.597 3.84L135 102l1.32 3.121zm0 0M156.602 97.8v73.321H156v-73.32zm0 0"/><path d="M156.238 175.8l3-6.96-3 1.68-2.879-1.68zm0 0M138.121 175.922l-3.96-5.281.48-.36 3.96 5.278zm0 0"/><path d="M131.64 166.8l1.801 7.321 1.32-3.121 3.36-.36zm0 0M156 175.8v-73.44h.602v73.44zm0 0"/><path d="M156.238 97.8l-2.879 6.962 2.88-1.801 3 1.8zm0 0M54.719 175.441l.242-73.32h.598l-.239 73.32zm0 0"/><path d="M55.2 97.441l-2.88 6.961 2.88-1.683 2.878 1.8zm0 0"/><path d="M257.398 3.84v233.64c0 1.32 1.082 2.282 2.403 2.282h204.238c1.32 0 2.402-.961 2.402-2.282V3.84c0-1.32-1.082-2.281-2.402-2.281H259.801c-1.32 0-2.403.96-2.403 2.28zm0 0" fill="#f5f5f5"/><path d="M257.398 1.559h209.043v12.96H257.398zm0 0" fill="#ebebeb"/><use xlink:href="#al" x="517.32" y="286.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#am" x="523.703" y="286.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#an" x="528.565" y="286.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#ao" x="530.508" y="286.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#ap" x="532.45" y="286.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><path d="M257.762 8.52V12h-.602V8.52zm0 4.68v3.48h-.602V13.2zm0 4.562v3.597h-.602v-3.597zm0 4.68v3.48h-.602v-3.48zm0 4.68v3.48h-.602v-3.48zm0 4.679v3.48h-.602v-3.48zm0 4.68v3.48h-.602v-3.48zm0 4.558v3.602h-.602v-3.602zm0 4.68v3.48h-.602v-3.48zm0 4.683v3.477h-.602v-3.477zm0 4.68v3.477h-.602v-3.477zm0 4.68v3.48h-.602v-3.48zm0 4.68v3.48h-.602v-3.48zm0 4.558v3.48h-.602V69zm0 4.68v3.48h-.602v-3.48zm0 4.68v3.48h-.602v-3.48zm0 4.68v3.48h-.602v-3.48zm0 4.679v3.48h-.602v-3.48zm0 4.562v3.48h-.602v-3.48zm0 4.68v3.48h-.602v-3.48zm0 4.68v3.48h-.602v-3.48zm0 4.68v3.48h-.602v-3.48zm0 4.679v3.48h-.602V111zm0 4.559v3.48h-.602v-3.48zm0 4.683v3.477h-.602v-3.477zm0 4.68v3.48h-.602v-3.48zm0 4.68v3.48h-.602v-3.48zm0 4.68v3.48h-.602v-3.48zm0 4.558v3.601h-.602v-3.601zm0 4.68V147h-.602v-3.48zm0 4.68v3.48h-.602v-3.48zm0 4.679v3.48h-.602v-3.48zm0 4.68v3.48h-.602v-3.48zm0 4.562v3.598h-.602v-3.598zm0 4.68v3.48h-.602v-3.48zm0 4.68v3.48h-.602v-3.48zm0 4.68v3.48h-.602v-3.48zm0 4.679v3.48h-.602v-3.48zm0 4.562V189h-.602v-3.598zm0 4.68v3.477h-.602v-3.477zm0 4.68v3.48h-.602v-3.48zm0 4.68v3.48h-.602v-3.48zm0 4.68v3.48h-.602v-3.48zm0 4.558v3.601h-.602v-3.601zm0 4.68v3.48h-.602v-3.48zm0 4.68v3.48h-.602v-3.48zm0 4.679v3.48h-.602v-3.48zm0 4.683v3.477h-.602v-3.477zm0 4.68v3.477h-.602v-3.477zm0 4.559v.84h-.364.364c0 .84.476 1.558 1.199 1.921l-.242.477c-.957-.36-1.559-1.32-1.559-2.399v-.84zm2.16 2.879h3.476v.601h-3.476zm4.68 0h3.476v.601h-3.476zm4.68 0h3.48v.601h-3.48zm4.679 0h3.48v.601h-3.48zm4.68 0h3.48v.601h-3.48zm4.558 0h3.48v.601h-3.48zm4.68 0h3.48v.601h-3.48zm4.68 0h3.48v.601h-3.48zm4.68 0h3.48v.601h-3.48zm4.683 0h3.476v.601h-3.476zm4.558 0h3.48v.601h-3.48zm4.68 0h3.48v.601h-3.48zm4.68 0h3.48v.601h-3.48zm4.68 0H324v.601h-3.48zm4.68 0h3.48v.601h-3.48zm4.562 0h3.476v.601h-3.476zm4.68 0h3.48v.601h-3.48zm4.68 0h3.48v.601h-3.48zm4.679 0h3.48v.601h-3.48zm4.68 0h3.48v.601h-3.48zm4.558 0h3.602v.601h-3.602zm4.68 0h3.48v.601h-3.48zm4.68 0h3.48v.601h-3.48zm4.68 0h3.48v.601h-3.48zm4.683 0h3.476v.601h-3.476zm4.558 0h3.602v.601h-3.602zm4.68 0h3.48v.601H381zm4.68 0h3.48v.601h-3.48zm4.68 0h3.48v.601h-3.48zm4.68 0h3.48v.601h-3.48zm4.562 0h3.597v.601h-3.597zm4.68 0h3.48v.601h-3.48zm4.679 0h3.48v.601h-3.48zm4.68 0h3.48v.601h-3.48zm4.68 0h3.48v.601h-3.48zm4.679 0h3.48v.601H423zm4.559 0h3.48v.601h-3.48zm4.68 0h3.48v.601h-3.48zm4.683 0h3.476v.601h-3.476zm4.68 0h3.476v.601h-3.476zm4.68 0h3.48v.601h-3.48zm4.558 0h3.48v.601h-3.48zm4.68 0H459v.601h-3.48zm4.68 0h3.48v.601h-3.48zm4.562-.118c.718-.242 1.316-1.082 1.316-1.922h.363-.363v-.601h.602v.601c0 1.2-.72 2.16-1.801 2.52zm1.316-3.722v-3.48h.602v3.48zm0-4.68v-3.48h.602V231zm0-4.559v-3.601h.602v3.601zm0-4.68v-3.48h.602v3.48zm0-4.679v-3.48h.602v3.48zm0-4.68v-3.48h.602v3.48zm0-4.683v-3.477h.602v3.477zm0-4.559v-3.601h.602v3.601zm0-4.68V195h.602v3.48zm0-4.68v-3.48h.602v3.48zm0-4.679v-3.48h.602v3.48zm0-4.68v-3.48h.602v3.48zm0-4.562v-3.598h.602v3.598zm0-4.68v-3.48h.602v3.48zm0-4.68v-3.48h.602v3.48zm0-4.68v-3.48h.602v3.48zm0-4.679v-3.48h.602v3.48zm0-4.68V153h.602v3.48zm0-4.558v-3.48h.602v3.48zm0-4.68v-3.48h.602v3.48zm0-4.683v-3.477h.602v3.477zm0-4.68v-3.477h.602v3.477zm0-4.68v-3.48h.602v3.48zm0-4.558v-3.48h.602v3.48zm0-4.68v-3.48h.602v3.48zm0-4.68v-3.48h.602v3.48zm0-4.68v-3.48h.602v3.48zm0-4.68v-3.48h.602v3.48zm0-4.562v-3.48h.602v3.48zm0-4.68V97.2h.602v3.48zm0-4.679v-3.48h.602V96zm0-4.68v-3.48h.602v3.48zm0-4.68v-3.48h.602v3.48zm0-4.558V78.48h.602v3.602zm0-4.68v-3.48h.602v3.48zm0-4.683v-3.477h.602v3.477zm0-4.68v-3.48h.602v3.48zm0-4.68v-3.48h.602v3.48zm0-4.558v-3.602h.602v3.602zm0-4.68v-3.48h.602v3.48zm0-4.68v-3.48h.602v3.48zm0-4.68v-3.48h.602v3.48zm0-4.679v-3.48h.602v3.48zm0-4.562v-3.598h.602v3.598zm0-4.68v-3.48h.602v3.48zm0-4.68v-3.48h.602v3.48zm0-4.68V18h.602v3.48zm0-4.68v-3.48h.602v3.48zm0-4.679v-3.48h.602v3.48zm0-4.562V4.082h.602v3.477zM465.961 3a2.141 2.141 0 0 0-1.922-1.2V1.56 1.8h-.84v-.602h.84c1.082 0 2.04.723 2.402 1.563zm-3.84-1.2h-3.48v-.6h3.48zm-4.68 0h-3.48v-.6h3.48zm-4.68 0h-3.48v-.6h3.48zm-4.683 0h-3.476v-.6h3.476zm-4.558 0h-3.598v-.6h3.598zm-4.68 0h-3.48v-.6h3.48zm-4.68 0h-3.48v-.6h3.48zm-4.68 0H426v-.6h3.48zm-4.68 0h-3.48v-.6h3.48zm-4.562 0h-3.597v-.6h3.597zm-4.68 0h-3.48v-.6h3.48zm-4.68 0h-3.48v-.6h3.48zm-4.679 0h-3.48v-.6h3.48zm-4.68 0h-3.48v-.6h3.48zm-4.558 0h-3.602v-.6h3.602zm-4.68 0h-3.48v-.6h3.48zm-4.68 0h-3.48v-.6h3.48zm-4.68 0h-3.48v-.6h3.48zm-4.683 0h-3.476v-.6h3.476zm-4.68 0h-3.48v-.6h3.48zM369 1.8h-3.48v-.6H369zm-4.68 0h-3.48v-.6h3.48zm-4.68 0h-3.48v-.6h3.48zm-4.68 0h-3.48v-.6h3.48zm-4.679 0h-3.48v-.6h3.48zm-4.562 0h-3.48v-.6h3.48zm-4.68 0h-3.48v-.6h3.48zm-4.68 0h-3.48v-.6h3.48zm-4.68 0h-3.48v-.6h3.48zM327 1.8h-3.48v-.6H327zm-4.559 0h-3.48v-.6h3.48zm-4.68 0h-3.48v-.6h3.48zm-4.683 0h-3.476v-.6h3.476zm-4.68 0h-3.476v-.6h3.476zm-4.68 0h-3.48v-.6h3.48zm-4.558 0h-3.601v-.6h3.601zm-4.68 0H291v-.6h3.48zm-4.68 0h-3.48v-.6h3.48zm-4.679 0h-3.48v-.6h3.48zm-4.68 0h-3.48v-.6h3.48zm-4.562 0h-3.598v-.6h3.598zm-4.68 0h-3.48v-.6h3.48zm-4.68 0h-3.48v-.6h3.48zm-4.68 0h-2.038V1.56 1.8c-.48 0-.84.12-1.2.36l-.363-.481c.48-.239.961-.48 1.563-.48h2.039zM258 2.88c-.238.363-.238.601-.238.96h-.364.364V7.32h-.602V3.84c0-.48.121-.84.238-1.2zm0 0"/><path d="M266.398 41.879h90.243V231.12h-90.243zm0 0" fill="#bfbfbf"/><path d="M266.398 41.64H357v189.72h-90.84V41.64zm0 .602v-.363h.364V231.12h-.364v-.36h90.243v.36h-.243V41.88h.243v.363zm0 0"/><path d="M367.441 42.48h90.239v188.641H367.44zm0 0" fill="#bfbfbf"/><path d="M367.441 42.242h90.48V231.36H367.2V42.242zm0 .477v-.239h.239v188.641h-.239v-.36h90.239v.36h-.36V42.481h.36v.238zm0 0"/><path d="M273.602 50.64h75.597V97.2h-75.597zm0 0" fill="#ffca00"/><path d="M273 50.04h.602V97.8H273zm0 0M273.602 50.04h75.597v.6h-75.597zm0 0" fill="#ff0"/><path d="M273.602 97.2H349.8v.6h-76.2zm0 0M349.2 50.04h.6V97.2h-.6zm0 0" fill="#b08c00"/><use xlink:href="#F" x="371.4" y="336.12" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#G" x="376.849" y="336.12" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#h" x="379.786" y="336.12" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#H" x="384.313" y="336.12" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#k" x="388.51" y="336.12" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#G" x="392.706" y="336.12" width="100%" height="100%" transform="translate(-72 -275.52)"/><g clip-path="url(#aq)" transform="translate(-72 -275.52)"><path d="M345.602 340.078h75.597" fill="none" stroke="#000" stroke-width=".6000000000000001" stroke-linecap="square" stroke-miterlimit="10"/></g><g clip-path="url(#ar)" transform="translate(-72 -275.52)"><path d="M345.602 345.96h75.597" fill="none" stroke="#000" stroke-width=".6000000000000001" stroke-linecap="square" stroke-miterlimit="10"/></g><use xlink:href="#A" x="348" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#L" x="351.473" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#p" x="353.403" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#y" x="357.224" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#L" x="359.538" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#K" x="361.413" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#y" x="365.234" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#C" x="367.547" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#o" x="371.368" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#C" x="374.841" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#M" x="378.662" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#as" x="380.26" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#C" x="383.733" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#r" x="387.554" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#A" x="389.867" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#L" x="393.341" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#y" x="395.216" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#E" x="397.53" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#B" x="403.365" y="356.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#A" x="348" y="364.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#L" x="351.473" y="364.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#N" x="353.403" y="364.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#O" x="357.224" y="364.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#K" x="361.045" y="364.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#y" x="364.908" y="364.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#C" x="367.222" y="364.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#o" x="371.043" y="364.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#C" x="374.516" y="364.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#M" x="378.337" y="364.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#as" x="379.88" y="364.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#C" x="383.353" y="364.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#r" x="387.174" y="364.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#A" x="389.488" y="364.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#L" x="392.961" y="364.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#y" x="394.837" y="364.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#E" x="397.15" y="364.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#B" x="403.055" y="364.92" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#P" x="361.2" y="310.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#y" x="365.833" y="310.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#N" x="368.147" y="310.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#Q" x="371.968" y="310.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#C" x="375.58" y="310.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#y" x="379.401" y="310.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#w" x="381.714" y="310.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#R" x="383.59" y="310.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#S" x="387.966" y="310.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#y" x="391.787" y="310.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#C" x="394.1" y="310.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#p" x="397.921" y="310.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#D" x="401.742" y="310.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#at" x="465" y="311.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#p" x="470.787" y="311.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#M" x="474.65" y="311.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#u" x="476.248" y="311.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#w" x="480.069" y="311.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#R" x="481.999" y="311.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#S" x="486.306" y="311.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#y" x="490.169" y="311.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#C" x="492.601" y="311.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#p" x="496.421" y="311.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#D" x="500.242" y="311.4" width="100%" height="100%" transform="translate(-72 -275.52)"/><path d="M327.121 106.559h75.719v46.562H327.12zm0 0" fill="#ffca00"/><path d="M326.52 105.96h.601v47.642h-.601zm0 0" fill="#ff0"/><path d="M327.121 105.96h75.719v.599H327.12zm0 0" fill="#ff0"/><path d="M327.121 153.121h76.32v.48h-76.32zm0 0M402.84 105.96h.601v47.161h-.601zm0 0" fill="#b08c00"/><use xlink:href="#U" x="424.92" y="392.28" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#h" x="430.369" y="392.28" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#V" x="434.897" y="392.28" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#j" x="439.424" y="392.28" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#k" x="441.937" y="392.28" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#G" x="446.133" y="392.28" width="100%" height="100%" transform="translate(-72 -275.52)"/><g clip-path="url(#au)" transform="translate(-72 -275.52)"><path d="M399.121 396.602h75.719" fill="none" stroke="#000" stroke-width=".6000000000000001" stroke-linecap="square" stroke-miterlimit="10"/></g><use xlink:href="#S" x="401.64" y="406.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#p" x="405.461" y="406.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#u" x="409.42" y="406.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#D" x="413.284" y="406.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#q" x="417.105" y="406.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#C" x="418.702" y="406.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#y" x="422.662" y="406.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#A" x="424.885" y="406.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#X" x="428.359" y="406.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#Y" x="430.289" y="406.8" width="100%" height="100%" transform="translate(-72 -275.52)"/><g clip-path="url(#av)" transform="translate(-72 -275.52)"><path d="M399.121 411.121h75.719" fill="none" stroke="#000" stroke-width=".6000000000000001" stroke-linecap="square" stroke-miterlimit="10"/></g><use xlink:href="#y" x="401.64" y="421.2" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#N" x="403.953" y="421.2" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#t" x="407.774" y="421.2" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#L" x="411.595" y="421.2" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#C" x="413.525" y="421.2" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#r" x="417.346" y="421.2" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#E" x="419.659" y="421.2" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#A" x="425.494" y="421.2" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#z" x="428.968" y="421.2" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#B" x="432.788" y="421.2" width="100%" height="100%" transform="translate(-72 -275.52)"/><path d="M273.602 176.402h75.597v46.559h-75.597zm0 0" fill="#ffca00"/><path d="M273 175.8h.602v47.759H273zm0 0M273.602 175.8h75.597v.602h-75.597zm0 0" fill="#ff0"/><path d="M273.602 222.96H349.8v.599h-76.2zm0 0M349.2 175.8h.6v47.16h-.6zm0 0" fill="#b08c00"/><use xlink:href="#ac" x="370.68" y="461.76" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#j" x="375.713" y="461.76" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#G" x="378.226" y="461.76" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#k" x="381.244" y="461.76" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#ad" x="385.394" y="461.76" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#ae" x="389.591" y="461.76" width="100%" height="100%" transform="translate(-72 -275.52)"/><g clip-path="url(#aw)" transform="translate(-72 -275.52)"><path d="M345.602 465.84h75.597" fill="none" stroke="#000" stroke-width=".6000000000000001" stroke-linecap="square" stroke-miterlimit="10"/></g><g clip-path="url(#ax)" transform="translate(-72 -275.52)"><path d="M345.602 471.719h75.597" fill="none" stroke="#000" stroke-width=".6000000000000001" stroke-linecap="square" stroke-miterlimit="10"/></g><use xlink:href="#A" x="348" y="482.16" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#C" x="351.473" y="482.16" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#u" x="355.294" y="482.16" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#D" x="359.254" y="482.16" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#r" x="363.117" y="482.16" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#B" x="365.479" y="482.16" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#N" x="348" y="490.68" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#u" x="351.821" y="490.68" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#K" x="355.684" y="490.68" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#y" x="359.505" y="490.68" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#C" x="361.818" y="490.68" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#o" x="365.639" y="490.68" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#C" x="369.112" y="490.68" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#M" x="372.933" y="490.68" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#as" x="374.531" y="490.68" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#C" x="378.004" y="490.68" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#r" x="381.825" y="490.68" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#B" x="384.138" y="490.68" width="100%" height="100%" transform="translate(-72 -275.52)"/><path d="M374.281 51.242H450v46.559h-75.719zm0 0" fill="#ffca00"/><path d="M373.68 50.64h.601v47.762h-.601zm0 0M374.281 50.64H450v.602h-75.719zm0 0" fill="#ff0"/><path d="M374.281 97.8h76.2v.602h-76.2zm0 0M450 50.64h.48V97.8H450zm0 0" fill="#b08c00"/><use xlink:href="#ay" x="455.52" y="336.84" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#l" x="460.553" y="336.84" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#j" x="464.749" y="336.84" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#k" x="467.262" y="336.84" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#G" x="471.459" y="336.84" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#i" x="474.477" y="336.84" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#ad" x="479.004" y="336.84" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#ai" x="483.201" y="336.84" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#g" x="485.389" y="336.84" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#h" x="490.747" y="336.84" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#i" x="495.356" y="336.84" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#j" x="499.883" y="336.84" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#k" x="502.396" y="336.84" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#l" x="506.593" y="336.84" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#j" x="510.743" y="336.84" width="100%" height="100%" transform="translate(-72 -275.52)"/><g clip-path="url(#az)" transform="translate(-72 -275.52)"><path d="M446.281 341.281H522" fill="none" stroke="#000" stroke-width=".6000000000000001" stroke-linecap="square" stroke-miterlimit="10"/></g><g clip-path="url(#aA)" transform="translate(-72 -275.52)"><path d="M446.281 347.16H522" fill="none" stroke="#000" stroke-width=".6000000000000001" stroke-linecap="square" stroke-miterlimit="10"/></g><use xlink:href="#K" x="449.04" y="357.12" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#D" x="452.861" y="357.12" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#M" x="456.724" y="357.12" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#A" x="458.268" y="357.12" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#O" x="461.741" y="357.12" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#p" x="465.562" y="357.12" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#L" x="469.425" y="357.12" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#o" x="471.355" y="357.12" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#S" x="474.829" y="357.12" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#K" x="478.649" y="357.12" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#o" x="482.47" y="357.12" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#p" x="485.944" y="357.12" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#q" x="489.764" y="357.12" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#q" x="491.362" y="357.12" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#A" x="492.905" y="357.12" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#r" x="496.379" y="357.12" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#B" x="498.692" y="357.12" width="100%" height="100%" transform="translate(-72 -275.52)"/><path d="M374.281 175.8H450v46.56h-75.719zm0 0" fill="#ffca00"/><path d="M373.68 175.2h.601v47.76h-.601zm0 0M374.281 175.2H450v.6h-75.719zm0 0" fill="#ff0"/><path d="M374.281 222.36h76.2v.6h-76.2zm0 0M450 175.2h.48v47.16H450zm0 0" fill="#b08c00"/><use xlink:href="#g" x="469.68" y="461.52" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#ah" x="475.129" y="461.52" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#ad" x="479.657" y="461.52" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#i" x="483.807" y="461.52" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#i" x="488.416" y="461.52" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#k" x="492.943" y="461.52" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#ai" x="497.14" y="461.52" width="100%" height="100%" transform="translate(-72 -275.52)"/><g clip-path="url(#aB)" transform="translate(-72 -275.52)"><path d="M446.281 465.84H522" fill="none" stroke="#000" stroke-width=".6000000000000001" stroke-linecap="square" stroke-miterlimit="10"/></g><use xlink:href="#aC" x="449.04" y="476.04" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#aD" x="454.111" y="476.04" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#aE" x="458.745" y="476.04" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#aE" x="462.565" y="476.04" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#K" x="466.429" y="476.04" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#aF" x="470.25" y="476.04" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#T" x="474.493" y="476.04" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#aG" x="479.51" y="476.04" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#aC" x="484.527" y="476.04" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#R" x="489.543" y="476.04" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#aH" x="493.85" y="476.04" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#aI" x="495.656" y="476.04" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#aG" x="501.06" y="476.04" width="100%" height="100%" transform="translate(-72 -275.52)"/><g clip-path="url(#aJ)" transform="translate(-72 -275.52)"><path d="M446.281 480.36H522" fill="none" stroke="#000" stroke-width=".6000000000000001" stroke-linecap="square" stroke-miterlimit="10"/></g><use xlink:href="#z" x="449.04" y="490.44" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#C" x="452.861" y="490.44" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#L" x="456.82" y="490.44" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#r" x="458.75" y="490.44" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#B" x="461.064" y="490.44" width="100%" height="100%" transform="translate(-72 -275.52)"/><path d="M222.121 175.8h23.277v47.759h-23.277zm0 0" fill="#30caca"/><use xlink:href="#aK" x="308.517" y="487.924" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#aL" x="308.517" y="482.853" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#aM" x="308.517" y="479.032" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#aN" x="308.517" y="477.156" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#aO" x="308.517" y="472.085" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#aP" x="308.517" y="468.264" width="100%" height="100%" transform="translate(-72 -275.52)"/><use xlink:href="#aQ" x="308.517" y="465.972" width="100%" height="100%" transform="translate(-72 -275.52)"/><path d="M222.121 175.441h23.64v48.36H221.88v-48.36zm0 .598v-.238h.36v47.758h-.36v-.36h23.277v.36h-.238V175.8h.238v.238zm0 0M342.121 106.441l-4.8-5.039.359-.48 4.922 5.039zm0 0"/><path d="M334.32 97.8l2.758 7.079.844-3.36 3.36-.718zm0 0M311.879 97.8v73.321h-.598v-73.32zm0 0"/><path d="M311.52 175.8l3-6.96-3 1.68-2.88-1.68zm0 0M329.762 175.559l13.918-18.118.48.36-14.039 18.12zm0 0"/><path d="M346.8 153.96l-6.6 3.72 3.359.36 1.203 3.241zm0 0M311.281 175.8v-73.32h.598v73.32zm0 0"/><path d="M311.52 97.8l-2.88 6.962 2.88-1.801 3 1.8zm0 0M381.719 153.84l12.12 17.64-.48.36-12.12-17.758zm0 0"/><path d="M396.238 175.441l-1.558-7.32-1.442 3-3.36.238zm0 0M412.32 175.441V103.2h.48v72.242zm0 0"/><path d="M412.559 98.52l-2.88 6.96 2.88-1.8 2.882 1.8zm0 0M273.121 213.96h-23.043v-.6h23.043zm0 0"/><path d="M245.398 213.602l6.961 2.878-1.68-2.878 1.68-2.883zm0 0M268.441 185.402h-23.043v-.601h23.043zm0 0"/><path d="M273.121 185.04l-6.96-2.88 1.679 2.88-1.68 3zm0 0M222.121 214.32h-22.8v-.601h22.8zm0 0"/><path d="M194.762 213.96l6.957 3-1.797-3 1.797-2.878zm0 0M217.441 186.719h-22.68v-.598h22.68zm0 0"/><path d="M222.121 186.36l-6.96-2.88 1.679 2.88-1.68 2.882zm0 0"/></svg>����������������������mitogen-0.3.9/docs/images/mitogen.svg���������������������������������������������������������������0000664�0000000�0000000�00000166171�14656664731�0017603�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version='1.0' encoding='UTF-8'?> <svg xmlns="http://www.w3.org/2000/svg" width="277.66" height="375.01" viewBox="0 0 277.66 375.01"><path d="M242.35 373.34l-2.15-1.67-2.94-5.73-2.94-5.74-.66-5.85-.66-5.85.82-3.27.82-3.26 6.91-4.44 6.91-4.43 6.8.1 6.8.1 4.23 2.18 4.21 2.18 2.09 2.97 2.08 2.97v11.54l-1.88 3.6-1.89 3.6-3.78 3.52-3.79 3.52-5.61 2.81-5.61 2.82h-7.6l-2.16-1.67zm-80.5-24l-6.44-4.33-3.93-6.39-3.92-6.38v-7.8l4.76-7.17 4.76-7.17 4.66-2.21 4.66-2.22h16.39l3.18 3.18 3.18 3.18 1.57 5.82 1.57 5.82-1.48 6.46-1.49 6.45-4.26 5.94-4.26 5.93-4.22 2.61-4.23 2.61h-4.05zm81.1-28.3l-5.7-1.78-1.96-1.62-1.96-1.63v-11.2l2.12-6.22 2.13-6.23 3.91-4.2 3.92-4.18 7.75.7 7.74.7 4.24 2.2 4.25 2.19 3.97 5.48 3.97 5.49v8.27l-2.54 4.15-2.53 4.15-5.88 2.85-5.89 2.85-5.91-.1-5.91-.08-5.71-1.78zM81 305.75l-5-.98-2.62-2.37-2.62-2.38-2.05-7.04-2.04-7.04v-8.34l1.83-4.39 1.83-4.39 4.27-4.86 4.27-4.86 4.48-.84 4.48-.84 4.9 1.62 4.9 1.62 5.18 5.33 5.18 5.34 2 6.75 2.01 6.75v13.02l-1.36 2.54-1.35 2.54-6.89 2.04-6.88 2.05-4.76-.16-4.76-.15zm165.45-31.43l-6.22-3.24-3.05-4.28-3.05-4.28-.53-7.43-.54-7.44 3.65-3.64 3.65-3.65 5.36-1.45 5.37-1.44 4.73.88 4.72.89 4.73 2.43 4.73 2.44 3.83 4.03 3.83 4.03-.84 4.43-.84 4.42-4.74 5.96-4.75 5.96-3.58 2.36-3.58 2.37-3.33-.06-3.33-.05-6.22-3.24zM162 257.17l-6.67-3.14-2.93-3.2-2.94-3.2-2.06-4.93-2.07-4.94v-9.33l4.03-4.58 4.03-4.59 6.48-1.55 6.48-1.56 5.82 1.57 5.83 1.57 3.43 1.77 3.44 1.77 4.23 3.96 4.23 3.95v7.07l-2.14 4.26-2.15 4.27-4.85 5.11-4.86 5.11-3.6 1.89-3.6 1.89-1.73-.01-1.73-.02-6.67-3.14zm82.67-32.53l-6.67-3.63-3-5.95-3-5.95v-10.94l3.77-3.6 3.76-3.62 4.56-1.3 4.56-1.31 3.34.01 3.34.02 7 3.25 7 3.26 3.34 3.34 3.33 3.33v7.67l-4.17 6.3-4.17 6.29-4.8 3.27-4.81 3.26-3.36-.03-3.36-.03-6.66-3.64zM8.33 211.36l-3.73-4-2.3-7.29-2.3-7.3v-14.6l3.67-3.43 3.66-3.44 5.62-2.81 5.61-2.82 7.05.03 7.06.03 5.64 2.56 5.63 2.56 2.7 4.41 2.68 4.41v4.74l.01 4.74-3.36 6.75-3.36 6.75-2.3 2.03L38 206.7l-7.06 3.65-7.06 3.65-5.91.67-5.92.67-3.72-4zm240.25-34.43l-4.09-2.02-4.86-4-4.87-4.02-1.37-4.94L232 157v-5.52l-.01-5.52 2.55-3.15 2.55-3.15 11.78.06 11.79.06 6.06 2.75 6.06 2.75 1.6 5.34 1.6 5.35v7.28l-2.86 4.03-2.87 4.03-6.06 3.85-6.06 3.84-2.74-.03-2.73-.03-4.1-2.02zm-85.35-22.48l-4.1-1.79-4.97-4.36-4.96-4.36-1.75-3.46-1.75-3.47-.82-5.39-.82-5.38 1.36-4.93 1.36-4.94 2.52-1.35 2.52-1.35 11.1.06 11.08.06 6.67 2.28 6.66 2.27 2.33 4.67 2.34 4.66v12.47l-3.64 4.32-3.64 4.33-5.95 3.77-5.96 3.78-2.74-.05-2.73-.05-4.1-1.8zm93.44-24.04l-1.34-.52-4.96-.83-4.96-.83-4.1-3.44-4.1-3.45-2.6-5.11-2.61-5.12v-6.31l3-2.74 3-2.75 5.37-2.7 5.36-2.68 8.13-1.6 8.13-1.6 2.78 1.49 2.79 1.49 3.54 4.65 3.55 4.64-.08 5.41-.07 5.41-2.78 5.75-2.79 5.75-2.47 2.23-2.46 2.24-4.5.56-4.5.57zm-180-16.8L71.33 111 69 108.2l-2.33-2.81V101l3.9-8.23 3.88-8.23 6.72-6.96 6.71-6.97 6.66.79 6.65.79 4.18 2.16 4.17 2.16 2.54 5.58 2.53 5.57.03 8.09.03 8.08-3.67 3.5-3.67 3.51-6 2.72-6 2.71-6.66-.02-6.67-.03-5.33-2.62zm166.98-28.5l-5-1.8-2.2-1.82-2.2-1.82-1.79-4.29-1.8-4.29V56.13l3.81-3.8 3.8-3.8 7.67-2.23 7.67-2.23 5.99 1.68 5.99 1.67 4.54 4.29 4.54 4.28v5.82l-2.15 4.14-2.14 4.14-6.15 6.58-6.15 6.57-3.64 1.88-3.64 1.89-1.07-.06-1.06-.06zm-82.98-21.48l-5.34-1.92-.3-.02-.3-.02-4.7-6.98-4.7-6.98V36.38l5-3.31 5-3.31 7.88-2.71 7.87-2.71h12.73l2.11 2.12 2.12 2.11 3.5 4.58 3.48 4.57-.82 6-.82 6-2.18 4.31-2.17 4.31-3.43 3.67-3.43 3.66-8.09-.06-8.08-.05-5.33-1.93zM252 37.76l-3.33-1.02-5.53-2.82-5.53-2.82-2.89-5.97-2.89-5.97-.07-5.65-.08-5.64 2.47-1.8 2.47-1.81 6.6-1.96 6.6-1.96h17.94l3.42 4.06 3.42 4.06 1.52 5.08 1.52 5.08-2.44 5.15-2.44 5.15-5.05 5.04-5.04 5.05-3.67-.12-3.67-.11-3.33-1.02z" fill="#f2dde0"/><path d="M240.82 370.94l-3.42-4.06-2.03-6.85-2.04-6.84v-6.36l1.43-2.67 1.43-2.67 6.17-3.9 6.16-3.92h12.92l5.02 2.56 5.01 2.56 1.6 3.5 1.6 3.5-.03 3.61-.03 3.6-2.5 5.5-2.49 5.48-4.57 3.49-4.57 3.48-5.74 2.03-5.74 2.03h-4.76l-3.42-4.07zm13.47-2.1l-.83-.82 1.95-1.95 1.95-1.94-.77-1.25-.77-1.25-1.35.83-1.35.84-4.18-3.81-4.17-3.82 1.69 2.23 1.69 2.22-2.4 1.4-2.42 1.4 1.4.05 1.4.04 1.27-1.24 1.27-1.24 3.03 2.47 3.02 2.48-1.38.86-1.38.85.76 1.24.77 1.24h1.62l-.82-.82zm4.89-2.57l.79-2.07-1.32.82-1.32.81v2.51h1.05zm-8.51-1.18v-.6l-1.34-.82-1.33-.82v2.82h2.67zm12.66-2.08l-2.41-2.67-2.13.08-2.12.09 2.86 1.15 2.86 1.16.89 1.43.88 1.42h1.59l-2.42-2.66zm1.07-3.2l-2.4-3.2-.55.52-.54.53 2.42 2.67 2.42 2.68h1.04zm-20.46-7.35l1.36-2.55-1.95.29-1.94.29-.93.92-.92.93h3.26l-.82 1.33-.82 1.34h1.4zm.67-5.36l.77-1.24-1.14-.7-1.13-.7v3.88h.73zm14.8-.8l-2.59-1.96-1.4.04-1.42.04 2.59 1.96 2.59 1.96 1.4-.04 1.42-.04zm-9.37-1.7l-.75-.75-1.65 1.66-1.64 1.65 2.4-.9 2.38-.92zm.63-2.1v-.5l-2.03-1.69-2.03-1.68.84 2.19.84 2.19h2.38zM166 351.57l-4-2.07-3.18-2.92-3.18-2.9-3.82-5.2-3.82-5.2v-4.8l.01-4.8 5.02-6.67 5.02-6.67 4.64-2.33 4.64-2.33h13.96l4.03 3.66 4.04 3.66 1.06 6 1.06 6-1.16 5.7-1.15 5.7-1.24-.77-1.23-.76.72 1.9.73 1.88-6.4 6.76-6.42 6.75-2.66.74-2.67.74-4-2.07zm5.64-9.37l-.8-.8-1.76.7-1.75.7 2.56.1 2.55.1-.8-.8zm-8.25-3.1l-.88-1.43h-2.62l1.72 1.87 1.72 1.86.47-.44.47-.44zm10.9-.86l2.1-2.1.92 1.5.93 1.5 1.56-1.89 1.56-1.88-3.01.36-3.02.36-4 2.11-4 2.12 2.43.01 2.43.01 2.1-2.1zm-7.03-2.46l-2.59-1.89-.63.63-.63.63 1.96 1.24 1.96 1.24 1.26.02 1.25.02-2.58-1.89zm17.06-7.2l-.8-2.1-.65 1.93-.64 1.93-2.11 1.69-2.12 1.69 3.56-1.52 3.56-1.53zm-21.97 1.08l-1.67-2.68-.5 1.5-.5 1.5 1.82 1.16 1.83 1.16.35.02.34.02-1.67-2.68zm18.23-4.32l-.93-3-2.16-1.3-2.16-1.3-1.22-.03-1.22-.04-.62-1.85-.62-1.85 1.51.93 1.5.93v-3.05l-1.66.56-1.67.55-.4 2.07-.4 2.07 3.94 1.38 3.95 1.37.88 2.78.88 2.78h1.33l-.93-3zm-15.86-3.76l.88-1.42-.61-.6-.61-.62-1.69 2.03-1.68 2.04h2.83zm4.04-3.76v-2.51l-1.63.63-1.63.62.73 1.89.72 1.89h1.81zm75.47 3.28l-5.78-1.88-2.56-2.31-2.56-2.32.02-5.46.01-5.46 3.15-6.77 3.16-6.77 3.83-3.02 3.83-3.02 6.56.87 6.56.86 4.42 1.85 4.43 1.85 4.02 6.34 4.01 6.34v5.75l-3 4.45-3 4.46-4.2 2.46-4.2 2.45-6.47.6-6.46.6-5.77-1.87zm1.65-9.43l-2.19-3.33h-.94l.85 2.22.85 2.22-1.76-1.1-1.77-1.09.97 1.57.96 1.56L244 313l1.15-.71.84 1.35.83 1.36h1.24zm.79-7.1v-2.45h-3.75l1.53 2.44 1.52 2.45h.7zm1.99-5.55l.81-1.32-2.07.8-2.07.8v1.04h2.51zm-1.33-2.68l.83-1.33h-2.83v2.66h1.18zm10.81-3.37l.3-1.96h-3.62l-.83 1.33-.82 1.33h4.32l-.96 1.67-.96 1.67 1.14-1.04 1.14-1.04zM84 305.7l-6-.82-2.88-1.59-2.89-1.59-2.38-6.24-2.38-6.24-.07-6.87-.07-6.88 4.03-6.56 4.02-6.57 4.9-2.4 4.9-2.41 5.72 1.54 5.72 1.54 5.54 5.54 5.54 5.54 2.15 7.24 2.15 7.23v10.92l-2 2.86-2 2.86-4.34 1.32-4.33 1.31-4.66.54-4.67.54zm20.67-9.36l-.83-1.33-1.59.02-1.58.02 2 1.29 2 1.3.4.01.42.02zm2.5-18.07l.8-2.07-1.32.82-1.32.81v2.51h1.05zm-23.14-1.3l1.68-2.02-2.4.92-2.41.92 1.09-1.76 1.09-1.77-1.48.92-1.48.91.75 1.96.75 1.96h.72zm5.97-3.3l-.82-1.33H86.5l.82 1.33.83 1.34h2.66zm6.7-2.4l-.74-.75-1.65 1.65-1.64 1.66 2.39-.9 2.39-.92zm149.88 2.72l-7.05-3.69-3.1-5.86-3.1-5.85v-10.05l3.31-3.93 3.31-3.93 5.28-1.34 5.27-1.34 5.2.95 5.2.95 5.77 3.22 5.76 3.22 2.6 3.52 2.6 3.52-1.52 4.62-1.52 4.62-4.76 5.56-4.76 5.56-3.8 1.97-3.8 1.96h-3.83zm14.12-6.73l-.74-.74-1.65 1.65-1.64 1.66 2.39-.9 2.39-.92zm-9.49-.59l-.94-1.66-2.7-3-2.7-3h-2.8l3.1 2.17 3.1 2.17-1.8 1.29-1.8 1.28 2.33-.75 2.33-.75v3.92h2.82zm8.18-2.42l.88-1.43 1.73.67 1.74.67-.29-1.95-.28-1.94-.92.03-.92.04-2.66 2.67-2.67 2.66h2.51zm9-3.47l-.68-1.77h-.76l-.68 1.77-.68 1.78h3.49zm-21.26-6.67l2.43-2.9-2.44.46-2.45.47-1.67.1-1.67.1v2.82l1.34-.82 1.33-.82v4.6l.35-.56.35-.55zm15.54-1.77v-1.33h-2.82l.82 1.33.82 1.33h1.18zm-7.82-5.05l-1.75-.58-1.4 1.4-1.42 1.41 3.16-.82 3.16-.83zm-4.8-1.7l.88-1.43-.46-.44-.47-.44-1.72 1.86-1.72 1.87h2.62zm-90.26 10.06l-6.2-3.23-2.72-3.46-2.72-3.45-1.56-7.01-1.57-7.01 2.22-4.3 2.22-4.3 4.27-2.6 4.27-2.6h14.67l6.72 3.14 6.72 3.13 3.73 4.43 3.73 4.44-.76 3.82-.77 3.82-4.06 5.9-4.05 5.89-4.43 3.37-4.42 3.38-4.54-.07-4.54-.06-6.2-3.23zm11.58-4.39l-.75-.74-1.64 1.65-1.65 1.66 2.4-.9 2.39-.92zm4.63-9.35v-.65l-2.44 2.2-2.44 2.21h-4.45v2.23l.79.79.79.78 3.87-3.45 3.88-3.45zm-12 3.76l-1.43-2.66h-1.33l1.43 2.66 1.42 2.67h1.34zm-2.67-6.4v-1.97l-2.2-1.6-2.2-1.62 1.74-1.08 1.74-1.07-.95 1.54-.95 1.54h2.66l-.2-2.58-.19-2.57-1.06.65-1.05.65-.02-1.74-.02-1.75-1.72 3.34-1.72 3.33 2.47 1.79 2.47 1.78-1.38 1.66-1.37 1.66h3.95v-1.97zm23.58-1.85l-.7-1.75-.1 2.56-.11 2.55.8-.8.81-.8-.7-1.76zm-7.41-5.44l-1.66-1.64.91 2.4.91 2.38.75-.74.75-.75zm-4.47-10.56l-.53-1.58-1.62-.32-1.61-.31 1.51.72 1.52.73-1.82 1.15-1.81 1.16 2.44.02 2.45.02-.53-1.59zm72.97 3.43l-6.67-3.43-2.3-3.09-2.31-3.09-1.63-6.09-1.63-6.08 1.29-3.66 1.29-3.65 4.64-3.16 4.65-3.16 8.95.5 8.94.48 5.7 4 5.7 4.01 1.95 3.49 1.96 3.48-2.4 5.33-2.4 5.33-5.56 5.44-5.54 5.45-3.98.67-3.98.66zm11.33-3.18l-2-1.29h-2.66l2 1.3 2 1.29h2.66zm-7-6.9l-1.66-1.06H246l1.86 1.18 1.86 1.18-.86 2.47-.87 2.47 2-2.6 2.01-2.58zm10.89-3.76l-.07-2-1.15 2.66-1.15 2.67-.07 1.33-.07 1.34 1.29-2 1.3-2-.08-2zm-14.55-.26v-1.27l-2 2-2 2v1.85l2-1.66 2-1.66zm18.66.26v-1.34h-2.82l.82 1.34.83 1.33h1.17zM247 205l.6-3.16-.9-1.49-.93-1.48-1.73 2.1-1.74 2.09 2.2-.85 2.2-.84-.88 2.48-.9 2.48-1.3 1.7-1.32 1.7 2.05-.8 2.05-.78zm15.25.41l-.7-1.75-.1 2.56-.1 2.55.8-.8.8-.8-.7-1.76zm5.53 1.2l1.43-1.72-2.93-.15-2.94-.14 1.68.65 1.67.64-.75 1.22-.75 1.22h1.16zm-5.64-7.92l2.54-2.98-2.13 1.63-2.12 1.63-.65-.65-.66-.66v4h.48zm-7.65-1.91l.49-.3-2.82.2-2.82.22v3.76l2.34-1.79 2.33-1.79zM8.84 211.49l-3.51-3.52-2.67-8.62L0 190.73V179.6l2.1-3 2.1-2.99 7.86-3.97 7.86-3.97h11.6l7.24 3.67 7.24 3.67 1.9 5.47 1.89 5.48-1.83 6.52-1.82 6.52-6.15 6.14-6.15 6.15-7.64 2.86-7.63 2.86h-6.2zM26.36 201l.28-3.34-2.32.1-2.32.11 1.82.73 1.82.72-1.82 1.17-1.82 1.17 2 1.32 2 1.3.04.03.05.02.27-3.33zm11.6.6l-.86-1.39 1.71-2.27 1.71-2.28-2.42 2.2-2.42 2.21.9 1.47.91 1.46h1.33zm-17.24-3.85l-.88-1.42h-2.83l1.68 2.03 1.69 2.03.61-.6.61-.62zM30 199l.82-1.34H28v2.67h1.18zm-14-4.6v-.58l-1.33-.82-1.34-.83V195H16zm22.67-3.4v-1.34h-2.82l.82 1.34.82 1.33h1.18zM36 187v-1.34h-2.67v2.67H36zm-1.33-4v-1.34h-1.18l-.82 1.34-.83 1.33h2.83zm-15.28-1.43l.88-1.42-.47-.44-.47-.44-1.72 1.86-1.72 1.87h2.61zm10.04-2.4l-1.34-2.49.56-.56.56-.55H24.3l.75 1.94.75 1.95-2.57-.98-2.56-.97 1.33 1.3 1.33 1.3 3.34.6 3.33.59.38.18.38.18zm219.9-2.3l-4.66-2-5.03-4.9-5.03-4.9-1.42-5.28-1.42-5.27.86-5.76.87-5.76 2.91-1.6 2.92-1.6 10 .18 10 .19 5.28 1.86 5.27 1.86 2.63 3.52 2.63 3.52.1 6.63.1 6.64-5.23 5.35-5.23 5.36-4.3 2.04-4.32 2.05-1.13-.06-1.13-.05-4.67-2.01zm8.9-6.48v-1.94l-1.14.7-1.13.7.76 1.24.77 1.24h.73zm-3.56 0v-.44l-1.96-.75-1.96-.75-.61 1-.62 1 2.57.19 2.58.2zm-6.93-5.43l-.74-.75-.91 2.4-.91 2.39 1.65-1.65 1.66-1.64zm14.8-3.87l-.64-.64-1.77 2.94-1.76 2.94 2.4-2.3 2.4-2.3zm-23.87-4.17v-2.08l-1.36.84-1.35.83.76 1.25.77 1.24h1.18zm6.25-2.9l-.61-2.36-.05 4-.05 4 .66-1.64.67-1.64-.62-2.36zm16.05-3.18l-2.36-1.34.95-1.59.95-1.58-2.24 1.82-2.24 1.82.55.89.55.89 3.1.22 3.1.21zm-10.3-1.99v-.52h-4v2.58l2-.76 2-.77zm8-4v-.52h-5.49l.78 1.28.8 1.27 1.95-.75 1.96-.75zM245.33 143v-1.34h-2.82l.82 1.34.83 1.33h1.17zm-82 10.8l-5.33-2.4-4.51-3.8-4.52-3.81-1.82-4.36-1.82-4.35v-14.86l3.28-3.27 3.27-3.28 10.4.06 10.39.06 6.55 2.28 6.56 2.27 2.6 3.51 2.58 3.52.7 6.16.69 6.16-3.62 5.22-3.61 5.22-4.9 3.22-4.89 3.22-3.33.83-3.33.82zm-7.18-9.96l-1.52-1.82 1.9-1.58 1.9-1.57.86 1.4.87 1.4h2.97l-2.55-2.43-2.55-2.42-2.23 2.75-2.24 2.76 1.39 1.67 1.38 1.66h1.33zm6.52.27v-1.56l-.88.88-.88.88-2.12-1.66-2.12-1.65 1.83 2.33 1.83 2.33h2.34zm-11.54-4.5l-.8-2.06-.63.63-.63.64.88 1.42.87 1.42h1.1zm27.54-2.27v-1.01h-.92l-2.54 2.86-2.54 2.85 3-1.84 3-1.84zM153.22 131l-.07-2-1.15 2.66-1.15 2.67-.07 1.33-.07 1.34 1.29-2 1.3-2-.08-2zm28.11 4.14v-1.2l-2.19-.83-2.18-.84 1.68 2.03 1.69 2.03h1zm-22.96-3.55l.28-3.4-1.35.83-1.34.83.76 1.24.77 1.24-1.74.02-1.75.02 2 1.3 2 1.29.04.02.04.02.29-3.41zm18.96-3.12v-1.19l-2.19-.84-2.18-.84 1.68 2.03 1.69 2.03h1zm-19.47-2.58l.69-1.12h-3.77l.7 1.12.68 1.1h1.02zm4.98-1.23l1.83-2.33-2.34 1.83L160 126v1h1zm-10.14-5.4l-.74-.75-1.65 1.65-1.64 1.66 2.39-.9 2.39-.92zm93.05 7.81l-5.57-2.53-3.34-5.1-3.34-5.11-.9-3.68-.9-3.67 2.06-3.14 2.05-3.13 6.43-3.07 6.43-3.07 6.66-1.57 6.67-1.57 3.64 1 3.64.99 1.75 1.79 1.75 1.79 2.27 3.3 2.28 3.29-.03 4.7-.03 4.7-2.51 5.56-2.52 5.54-2.79 2.79-2.78 2.78-7.67-.03-7.67-.03-5.58-2.53zm4.57-3.06l.23-2.98-1.19 1.92-1.18 1.92.65 1.06.66 1.07h.6zm-2.25-2.75l1.41-2.93-1.74 2.05-1.74 2.05-2.36-.25-2.36-.25 2.04.64 2.05.63-.9 1.44-.88 1.44 1.53-.95 1.53-.95zm9.26 3.07V123h-1.18l-.82 1.33-.82 1.33h2.82zm-9.84-10.03l-2.16-2.16v-1.32l1.37-2.55 1.37-2.56 3.63-2.07 3.63-2.07-3.16.85-3.17.86 1.04-1.68 1.04-1.68-1.56.96-1.56.97.76 1.24.77 1.24h-2.4l-1.59 3.5-1.6 3.5 2.16 3.28 2.15 3.28.72-.71.72-.72zm22.74-1.51l-.87-.88 1.65-2.12 1.66-2.13-2.32 1.82-2.32 1.82.73 1.18.73 1.18h1.62zm-29.63-4.57l-.78-1.27-1.27.78-1.26.78.78 1.27.78 1.26 1.26-.78 1.27-.78zm.36-2.31l1.82 1.5 1.61-1.62 1.61-1.62-2.32.89-2.32.88-.81-2.1-.8-2.1-1.88 1.86-1.87 1.87v2.06l1.57-1.57 1.57-1.57zm24.37-2.91v-1.34h-2.82l.82 1.34.83 1.33h1.17zm-7.33-1.34l.82-1.33H256V103h1.18zm-.67-4v-1.33h-2.66V99h2.66zM77.9 113.81l-5.44-2.47-2.81-3.57-2.81-3.57 1.85-6.17 1.86-6.16 5-7.26 5-7.26 5.02-3.33 5.03-3.32 5.03.93 5.04.93 4.2 1.98 4.21 1.99 2.8 6.48 2.79 6.5v13.85l-4.61 4.34-4.6 4.35-6.3 2.14-6.3 2.15-4.76-.03-4.77-.03zm9.42-1.45l.82-1.32-2.07.8-2.07.79v1.04h2.51zm8.14-1.56l.95-1.54-1.54.95-1.54.95v-1.27l-.77-2-.77-2.01 1.77.27 1.77.27 1.58.98 1.57.98.9-1.44.89-1.45 1.93.74 1.94.75-.85-1.38-.85-1.37-2.55.81-2.56.81v-3.38l-1.46 1.47-1.47 1.47-4-1.15-4-1.14-1.9-1.58-1.9-1.58-.64.64-.64.64 4.57 2.47 4.58 2.46 1.4 3.09 1.4 3.08h1.24zm-15.9-1.73v-1.95l-1.14.7-1.13.7.77 1.25.76 1.24h.74zm-2.77-2.3l2.54-2.89-1.55.9-1.55.91-.5-1.49-.5-1.49-1.8 2.18-1.8 2.18 2.51-.95 2.53-.95-1.83 2.25-1.83 2.25h1.24zm-4.12-3.76l.82-1.34h-2.82v2.67h1.18zm11.05-13.12l-.39-2-1.59-.53-1.59-.52.2 2.53.18 2.53h3.58zm5-4.97l-3.38-1.75-1.67-.85-1.67-.84 2.47 2 2.46 2.02-.76 1.23-.76 1.22 3.35-.63 3.34-.64zm9.01-2.8l-.68-1.78h-2.17l-2.1-.8-2.11-.82v3.11l1.56-.96 1.56-.97-.84 2.19-.84 2.18 2.26 1.27 2.27 1.26.89-1.44.89-1.44zm8.94 2.74v-.36l-1.24-.77-1.25-.77-.7 1.14-.7 1.13h3.89zm133.6-1.42l-4.4-2.17-1.96-3.77-1.95-3.78-.8-5.86-.81-5.85 1.64-4.98 1.64-4.98 7.22-3.3 7.2-3.3h11.65l3.82 2 3.81 1.99 3.84 4.03L275 57.5l-.82 3.25-.81 3.25-4.47 6.5-4.47 6.5-5.65 4.34-5.65 4.33-4.23-.03-4.23-.03zm9.57-6.5l.8-2.07-1.32.81-1.32.82V79h1.05zm-6.68-.89l-.65-1.04h-3.84v2.09h5.13zm14.17-.3v-.59l-1.33-.82-1.33-.82v2.82h2.66zm-4.36-2.88l-.8-.8-1.75.7-1.75.7 2.55.1 2.56.1-.8-.8zm10.73-2.35l2.3.74-1.82-1.3-1.83-1.3-1.3-1.83-1.3-1.82.75 2.33.75 2.33H256v2.45l1.67.58 1.66.58 1.04-1.75 1.03-1.75zm-21.86-13.58l.8-2.07-1.32.81-1.32.82V59h1.05zm24.83.22v-.5l-2.67-.7-2.67-.7.75 1.2.74 1.21h3.85zm-14.58-3.31l-1.33-2.5.95-1.12.96-1.14-2.67 1.92-2.67 1.9-.66.6-.67.59 2.52-.91 2.52-.91-1.68 2.03-1.69 2.03h5.76zm12.35-1.66l-2.81-2.81-2.48 1.58-2.48 1.58 2.2-.67 2.2-.68 2.47 1.87 2.46 1.86.63.04.63.05-2.82-2.82zm-8.44.9v-.6l-1.33-.82-1.34-.82v2.82H256zm-5.33-5.51v-.67L248 48.34l-2.67 1.43v1.33l2.67-1.43 2.67-1.42zm-86.3 16.8l-4.3-1.02-3.45-2.26-3.45-2.26-3.92-6.18-3.92-6.18v-8.34l3-2.82 3.01-2.83 7.74-3.54 7.74-3.54 8-.73 8-.72 4.56 4.43 4.57 4.42 1.46 4.42 1.45 4.42-2.1 7.26-2.12 7.27-4.48 4.75-4.47 4.74-6.51-.13-6.51-.14zm15.1-12.7l.3-2.02-1.24.77-1.24.76.77 1.24.76 1.24H176v3.2l1.59-1.58 1.58-1.59zm-16.53-1.98l-2.27-3.97-.45 1.32-.45 1.3-1.22-.75-1.22-.75v2.82h4.09l.76 2 .77 2h2.26zm-5.6 2.05v-.59l-1.34-.82-1.33-.82v2.82h2.66zm27.74-4.11l-.75-.75-.91 2.4-.91 2.38 1.66-1.64 1.65-1.65zm-32.69-2.1l-1.42-1.43-1.03 1.65-1.02 1.66 1.54-.95 1.54-.95v3.26l.91-.9.91-.92zM158.4 44l-.38-1.67 1.17-.22 1.18-.22.81-1.23.82-1.22 2.67-1.66 2.66-1.65-2.66.9-2.67.89-1.89.76-1.88.77.9-1.47.91-1.47-1.18-.72-1.17-.73.15 2.97L158 41l-1.68-.34-1.68-.34L156.3 43l1.66 2.67h.81zm26.56-1.62l1.04-1.14-1.67.95-1.66.96V39h-4v2.82l1.56-.96 1.56-.97-.8 2.09-.8 2.09 1.86-.28 1.87-.27zm-31.15-8.57l-.41-.53-2.03 1.69-2.04 1.69V39l2.45-2.34 2.44-2.33zm19.16 1.71l-.8-.8-1.75.7-1.75.7 2.55.1 2.56.11-.8-.8zm1.34-4l-.81-.8-1.75.7-1.75.7 2.56.1 2.55.11-.8-.8zm75.35 4.97l-7-2.42-2.85-2.54-2.85-2.53-2.45-5.34-2.45-5.33-.03-4.8-.03-4.79 2.37-2.14 2.37-2.15 7.91-2.06 7.91-2.06h12.95l2.46 1.32 2.46 1.31 2.78 4.51 2.79 4.5v10.3l-4.24 6.22-4.24 6.22-3.63 2.14-3.63 2.15-1.8-.05-1.8-.04zm1.58-5.62l.65-.65-2.59-.2-2.58-.19-.77 1.26-.78 1.25 2.71-.42 2.72-.41zm4.76-2.54V27l-2.33.02-2.34.02 2 1.29 2 1.3.34.01.33.02zm4.17-1.69L258.51 25l.9 2.39.92 2.39.75-.75.74-.74zm-11.4-2l-2.41-2.31 1.6 3.11 1.59 3.12.81-.81.81-.82zm-4.34-1.22l-1.57-.58 1.39-4.26 1.38-4.25L248.3 12l2.66-2.34h-2.76l-2.1 2.1-2.09 2.1v3.96l-1.48-.91-1.47-.91.86 2.72.87 2.72-1.46.9-1.45.9 1.6 1.93 1.62 1.94 1.45-1.56 1.46-1.55zm19.15-4.67l-.7-1.75-.1 2.55-.11 2.56.8-.8.8-.81zM262 13.67l-2.41-2.66h-2.55l3.15 2.62 3.14 2.62.54.05.54.04zm-22.67 0l.83-1.33h-2.67l-.82 1.33-.83 1.34h2.67zm-1.83-5.69l-1.66-1.64.91 2.4.91 2.38.75-.74.75-.75zm19.83-.97l-1.92-1.2-.67.68-.66.66L256 8.34l1.92 1.19.67-.67.67-.66zM248 7l2-1.3h-2.67l-2 1.3-2 1.29H246z" fill="#f0dbdd"/><path d="M241.63 371.99l-2.84-3.02-1.93-4.65-1.94-4.65-.92-6.18-.92-6.18 1.55-2.9 1.56-2.92 6.17-3.9 6.16-3.92h12.92l5.02 2.56 5.01 2.56 1.6 3.5 1.6 3.5v7.05l-2.8 5.78-2.8 5.78-5.54 3.77-5.53 3.76-4.53 1.54-4.53 1.55h-4.48zm12.78-2.21l1.75-.1-.65-1.05-.64-1.04 3.57.21 3.56.2 3.6-3.35 3.62-3.37-1.21-2.26-1.22-2.27 1.6-1.7 1.61-1.71-1.67-.61-1.66-.61V346l-3-2.23-3-2.22 1.87.93 1.87.94-.96-1.56-.97-1.56-1.3.8-1.3.8-1.6-1.27-1.61-1.27-3.67-.66-3.67-.66v2.46l-1.39-.86-1.39-.86-1.93 1.6-1.92 1.6.75 1.21.75 1.22-1.66-.37-1.66-.37-1.72 3.32-1.72 3.31.84 3.34.84 3.34 1.87 1.87 1.87 1.88-1.76 1.12-1.77 1.12 1.34.17 1.33.18 1.14-.2 1.14-.2 1.88 1.55 1.87 1.56-1.54 1.85-1.53 1.85 2.4-.92 2.41-.92-.9 1.44-.88 1.44 2.34-.44 2.34-.45 1.74-.1zm6.56-4.91l-.97-.97v-1.66l2.67-.2 2.66-.2v2.66l-1.22-.76-1.22-.75-.47 1.43-.48 1.42zm-15.43-3.04l-1.8-1.14.46-2.16.47-2.16 1.54 3.32 1.54 3.32-.2-.02-.22-.02-1.8-1.14zm10.5.46l-.04-1.38-2.77-.21-2.78-.21-1.89-1.57-1.9-1.57-.01-2.84-.02-2.84-1.3 2-1.29 2-.02-2.33-.02-2.33h2.82l-.7-1.14-.7-1.13 3.28-1.75 3.27-1.75 5.42 1.78 5.41 1.8.8 1.3.81 1.3-1.54-.95-1.54-.95v10.98l-1.25-.78-1.25-.77-1.37 2.36-1.38 2.36-.04-1.38zm-10.7-16.47v-1.2l2.18-.83 2.2-.84-1.7 2.03-1.68 2.03h-1zm.57 19.71l-.73-1.19h-2.51v3.92l1.99-.77 2-.76zm-80.29-14.09l-4.38-2.14-5.91-6.58-5.91-6.57-.89-4.72-.88-4.72 2.01-4.22 2.02-4.23 3.76-4.47 3.77-4.48 4.35-1.82 4.35-1.82h12.83l2.97 2.08 2.97 2.09 2 3.85 1.99 3.85v13.96l-2.65 5.46-2.64 5.46-5.02 4.82-5.03 4.81-2.66.77-2.67.77zm9.68-5.74l2.39-2.63 1.15.71 1.16.72v-2.83h3.92l-.84-2.33-.84-2.33 1.1.99 1.08.98 1.8-1.48L188 336v-6.2l-2.33-1.36-2.34-1.36 1.68-.04 1.68-.04-1.68-3-1.68-2.98-2.45-3.35-2.45-3.34-6.48-.13-6.48-.14.09.8.09.8-.24 2-.25 2-1.23-3.07-1.23-3.08-3.02 3.12-3.01 3.12-2.4 4.68-2.4 4.69.92 2.38.91 2.39 1.13-1.78 1.13-1.78.02 3 .02 3h2.67l-.33 1-.32 1 1.99 2.8 1.99 2.79 4 2.15 4 2.15 1.46.06 1.46.05 2.38-2.64zm-4.88.4l1.75-.7.8.8.8.8-2.55-.1-2.55-.1 1.75-.7zm-8.55-4.74l-2.54-2.97 2.59 1.97 2.58 1.98-.89-2.36-.88-2.37 2.72 1.46 2.72 1.46-1.58 1.9-1.58 1.91h-.6zm12.19.4l-.77-1.24 1.35-.83 1.36-.84V343h-1.18zm-12.25-6.49l-1.45-.93-.91-3.33-.91-3.34 1.46 2.34 1.47 2.33h2.84l-2.26-3.45-2.26-3.45.77-.77.77-.77v2.37l2.08-2.97 2.07-2.96h8.12l3.75 4.02 3.75 4.01.68-1.68.68-1.68.1 2.85.1 2.86 2 .77 2 .77v2.94l-2.09-2.1-2.1-2.1h-3.8v2.83l1.66-1 1.67-1-1.83 2.25-1.83 2.26h-1.16l.82-1.33.82-1.34h-2.66l-.83 1.34-.82 1.33h-7.69l-.9-1.48-.92-1.47-.87 1.4-.87 1.4-1.45-.92zM245 321.19l-6.33-1.77-2.82-2.54-2.81-2.54.7-6.83.7-6.83 2.74-5.38 2.75-5.37 3.65-2.88 3.66-2.88 6.72.89 6.7.89 4.52 2.1 4.51 2.1 3.82 6.02 3.82 6.03v5.75l-3 4.45-3 4.46-4.12 2.4-4.1 2.4-5.9.65-5.88.65zm11.33-.4l-1.66-.67-1.67.67-1.67.67H258zm9.74-8.68l.79-2.48 1.04.65 1.05.65-.63-3.63-.63-3.63-2.18-1.83-2.18-1.83 2.98.7 2.98.7-1.6-2.87-1.59-2.87.34-1.16.33-1.15-4.1.6-4.09.6 1.38-1.38 1.37-1.37v-2.29l-1.33.82-1.33.82v-2.15l-6 .1-6 .11-.9.9-.9.91 2.56 2.06 2.57 2.06-2.92-1.4-2.92-1.42-.82 1.34-.83 1.34.74 1.19.73 1.2-1.8.69-1.8.69-.82 3.78-.83 3.78-.85 3-.86 3h6.16l-2.6 1.96-2.58 1.96 3.59.04 3.59.04.81 1.32.82 1.32 5.26-.2 5.27-.21.9.9.9.9 3.07-2.9 3.08-2.89.78-2.47zm-19.88-.61l-3.52-3.52.02-1.49.02-1.48 1.24 1.96 1.24 1.96.88-2.29.88-2.29.2-3.23.18-3.22.67.15.67.15 3.07-1.04 3.07-1.04-1.57-1.9-1.57-1.88h1.57l4.13 4.03 4.12 4.03-.41 4.84-.41 4.83-2.67 1.47-2.67 1.47-.98 1.33-.98 1.33-.02-1.83-.02-1.83-1.8 1.5-1.82 1.51zm2.67-1.16l-2-2H245l1.66 2 1.66 2h2.54zm-172.3-6.56l-4.1-1.79-1.52-3.82-1.52-3.83-1.56-6.43-1.56-6.43 1.5-5.02 1.51-5.02 3.97-5.48 3.96-5.47 4.71-1.3 4.72-1.3 5 1.38 4.99 1.38 5.52 5.52 5.52 5.52 2.15 7.24 2.15 7.23v10.36l-1.44 2.69-1.44 2.69-4.52 1.89-4.51 1.88-9.71-.05-9.71-.05zm22.1-5.43l2.4-2.17.47 1.37.47 1.37 2-1.31 2-1.32-2.59-1.98-2.59-1.97h2.02l2.75 1.47 2.75 1.47-.6-4.1-.6-4.1 1.42-.48 1.42-.47-2.33-2.33-2.32-2.32v-1.3l1.38.85 1.38.86-.68-3.77-.69-3.77-2.36-1.76-2.36-1.75-3.65-.75-3.64-.74.81-1.32.81-1.3-3 .94-3 .96-.98-1.6-1-1.6-2.84 1.77-2.84 1.78v3.28l1.66-.41 1.67-.4-1 .55-1 .56-.1 2.22-.11 2.23-.68-1.68-.67-1.67-1.43.88-1.42.88.9-1.46.9-1.46-2.9.22-2.9.22-.61 2.35-.62 2.35-1.16-.72-1.17-.72.75 1.97.76 1.96-1.44 2.7-1.44 2.68 1.4.86 1.38.86-.76 2.4-.76 2.4 2.18.83 2.18.84-.74 1.92-.74 1.92 1.93-.74 1.94-.75v4.1l3 .46 3 .45 5.8-.27 5.79-.27zm-14.24-8l-2.87-2-.6 1.66-.6 1.66.13-6.89.13-6.89.94.58.93.58 1.76-2.35 1.76-2.36 7.2-.2 7.18-.2-1.8 1.11-1.79 1.11-1.4-.78-1.39-.79 3.5 3.88 3.5 3.87-2.43 3.91-2.43 3.9.47.77.47.75-4.9.35-4.9.34zm14.75.15l.3-2.08.84-.83.82-.83-.3 2.09-.3 2.08-.84.83-.82.82zm4.94-5.6l.1-2.56.7 1.75.7 1.75-.8.8-.81.81zm-5.44-7.3v-1.42l1.33.83 1.33.82v1.18h-2.66zm148.1-3.62l-7.23-3.64-3.1-5.88-3.1-5.87v-9.66l2.07-2.97 2.09-2.97 3.85-2 3.85-1.98h12.99l7.17 3.66 7.17 3.67 2.55 3.52 2.56 3.52-1.53 4.62-1.52 4.62-4.76 5.56-4.76 5.56-3.8 1.97-3.8 1.96-1.74-.02-1.73-.02-7.23-3.65zm10.56-3.05l-2-1.38 4 .4 4 .39-.2-2.42-.2-2.43 1.77.68 1.77.68 1.2-1.59 1.2-1.59 1.61-5.64 1.61-5.64-2.26-3.46-2.27-3.45-2.6.68-2.59.67-.7-2.65-.69-2.66-1.9.73-1.89.73.82-1.32.81-1.32h-5.33l-.84 1.36-.83 1.35-1.25-.77-1.24-.76v4.15H252v2.69l-2.48-1.55-2.48-1.55-3.19 2.3-3.18 2.3 2.04-.43 2.04-.42v2.66l-1.71-.39-1.7-.39v5.45H244v2.58l-1.94-.74-1.94-.75 1.2 4.18 1.2 4.18 3.07 2.56 3.08 2.57 1.08.04 1.07.05-.8-1.67-.79-1.67 1.71 2.34 1.71 2.33 3.34-.02 3.34-.02-2-1.37zm-7.21-8.4l-4.88-4.47 2.38-4.23 2.38-4.23 2.67-.65 2.66-.65 4 1.24 4 1.24-1.74.11-1.75.12.98 1.57.97 1.58.22 3.7.22 3.7-1.34-.83-1.34-.83.87 2.3.88 2.28-1.32-.82-1.31-.81-1.48.91-1.47.91 1.8 1.15 1.81 1.15-2.16.02-2.17.02-4.88-4.48zm16.65-6.97l.1-2.55.7 1.75.7 1.75-.8.8-.8.8.1-2.55zm-106.98.1l-6.2-3.24-2.72-3.46-2.72-3.45-1.56-7.01-1.57-7.01 2.22-4.3 2.22-4.3 4.27-2.6 4.27-2.6h14.67l6.72 3.14 6.72 3.13 3.61 4.3 3.61 4.28v2.24l-.02 2.23-3.93 6.86-3.94 6.85-5.02 4.15-5.03 4.14-4.7-.07-4.69-.06-6.2-3.23zm15.27-2.32l3.59-1.67v-1.1l.02-1.09 1.66-1.75 1.67-1.76 2.43-2.94 2.43-2.94-.68-.68-.68-.68 1.18-3.08 1.17-3.08-2.42-2.78-2.4-2.78-1.85-.02-1.85-.02 2-1.3 2-1.29-2.06-.02-2.07-.02-1.6 1.6-1.6 1.6v-4.53l-1.67-.02-1.66-.02 1.79-1.14 1.8-1.14-3.48-.87-3.47-.87-3.99 2.06-3.99 2.07v2.75l-1.33-.82-1.33-.83v3.65l-2.1 2.59-2.1 2.59.84-1.67.85-1.67h-2.83v6.82l1.47-.9 1.47-.9-1.47 2.73-1.47 2.74v3l1-.6 1-.6 1.96 2.1 1.96 2.12-2.3-.88-2.28-.88v2.16l3.4 1.55 3.41 1.55-.95 1.54-.95 1.54 2.65-.7 2.65-.68 2.48 1.81 2.48 1.82h1.62l3.6-1.67zm-9.88-6l-.16-1 .11-.87.12-.88-1.96-.75-1.96-.75-.02 1.63-.02 1.62-1.29-2-1.3-2-.01-1.08-.02-1.08 1.33.83 1.33.82v-9.08l2.34-2.02 2.33-2.02 4.25-.8 4.24-.8 1.35 4.28 1.34 4.28-.28 4.24-.27 4.25-1.2 1.09-1.19 1.09.86-2.4.86-2.4-2.94 2.07-2.95 2.06h-4.89l.82 1.34.82 1.33h-1.49l-.15-1zm.15-24.86v-.52l2.07-.8 2.07-.79-.81 1.32-.82 1.32h-2.51zm80.71 2.16l-6.62-3.63-3.01-4.49-3.01-4.48-.89-4.72-.88-4.72 1.2-3.42 1.2-3.42 4.65-3.16 4.65-3.16 8.67.51 8.67.5 5.63 3.61 5.63 3.6 2.16 3.3 2.15 3.28-1.5 4.52-1.49 4.53-4.76 5.56-4.76 5.56-3.8 1.97-3.8 1.96-1.73-.03-1.73-.03-6.63-3.64zm16.08-4.63l3.17-3 .02-1.23.02-1.23 2.06-2.27 2.06-2.28.65-3.6.66-3.6-1.37.84-1.37.84-2.34-1.46-2.35-1.47 2.9.78 2.88.79.76-1.24.77-1.24-1.99-1.65-1.98-1.64-2.22 1.83-2.22 1.83 1.58-2.97 1.59-2.97-2.25.86-2.25.86.96-1.56.96-1.56h-4.15v-2.66h-5.34v2.66h-5.18l-.76 1.24-.77 1.25 1.38.85 1.38.85-.91 1.47-.9 1.46 2.21-.89 2.22-.9 2-.8 2-.81v3.11l1.33-.83 1.34-.82v2.99l1.12-.7 1.12-.7.17 4.66.18 4.65-2.63 2.63L256 215l-2.33-.02-2.34-.02-2.8-.75-2.82-.76.48-4.23.48-4.22.65-1.74.65-1.74-1.45.9-1.45.9 1.44-2.7 1.44-2.69-1.96-.75-1.96-.75.32 1.55.32 1.56-1.56.06-1.55.06-1.12 1.22-1.1 1.21 1.66-.96 1.67-.96v2.7l-2.26 1.26-2.25 1.27 1.65 5.5 1.65 5.52 1.26-.78 1.25-.77-.76 1.97-.75 1.96 2.44 1.26 2.43 1.25 1.55-.55 1.54-.56.87 1.4.87 1.4h6.8l3.16-3zm-15.17-3.14l-1.72-1.86h2.61l.88 1.42.88 1.42-.47.44-.46.45zm8.15-.07l.54-.54 2.85-.55 2.84-.55v2.18h-6.77zm-15-7.96l-.1-1.5 1.78-1.48 1.78-1.48v3.84l-1-.61-1-.62-.67 1.68-.68 1.67-.1-1.5zM9.59 211.68l-4.2-3.54-2.69-8.7-2.7-8.72V179.6l2.1-3 2.1-2.99 7.86-3.97 7.86-3.97h11.6l7.24 3.67 7.24 3.67 1.73 5.3 1.73 5.29-1.5 6.25-1.5 6.25-4.6 5.37-4.6 5.37-6.96 3.35-6.97 3.34-4.77.85-4.77.84zm5.28-4.67h1.3l-.83 1.33-.82 1.33h9.65l-.83-1.33-.82-1.33 5.74-.02 5.75-.02 1.73-1.1 1.74-1.1 1.93-6.43 1.93-6.42-.02-4.13-.02-4.12-1.43 2-1.42 2 .71-3.23.72-3.23-2.8-2.44-2.81-2.43h-3.32l-.78-2.03-.78-2.03-2.56 1.6-2.56 1.6.67 1.76.68 1.77h-2.8l-.87-1.42-.87-1.41-1.77 2.41-1.76 2.41-1.1-1.18-1.12-1.18 1.67-.6 1.67-.59v-3.2l3.56-.29 3.56-.3.66-.66.66-.66h-8.44l-1 .33-1 .34.31.95.32.95-2.12-.81-2.12-.82-1.15 1.87-1.15 1.86H7.74l-1.56 3.8-1.56 3.82.51 5.35.51 5.35 1.3-1.83 1.3-1.83-.67 3-.65 3 1.3.8 1.3.8-.75 1.94-.74 1.94 1.18-.73 1.18-.73L11.4 204l1.02 2.33-.17 2-.17 2 .74-1.67.74-1.66zm4.44-10.72l-.86-1.4-2.89.72-2.88.7 1.55-.72 1.55-.73-1.1-3.86-1.11-3.86 3.51-3.51 3.52-3.51 5 .47 5 .48.51-1.37.52-1.36-.35 2.33-.35 2.33 1.2.75 1.21.75v5.33l1.43-.88 1.42-.88-.71-1.86-.72-1.87h2.58l-.04 1.67-.05 1.66-1.9 3.34-1.91 3.33-.05-1-.05-1-2.66 2.67-2.67 2.66h-7.84zm230.5-19.2l-4.19-1.84-5.4-4.87-5.4-4.88-1.57-7.05-1.58-7.05 1.59-4.8 1.58-4.8 2.92-.92 2.91-.93 9.24.17 9.25.17 4.76 1.53 4.76 1.52 2.22 1.95 2.23 1.94 1.5 6.29 1.52 6.28-1.29 3.4-1.29 3.38-6.3 5.55-6.3 5.54h-3.4l-1.78.62-1.78.62zm9.64-5.62l-.64-1.66 1.69.64 1.68.65 2.58-3.02 2.58-3.03-2.33 1.81-2.33 1.8v-3.14l-1.54.95-1.54.95.82-1.33.82-1.33 4 .24 3.99.24.93-2.12.94-2.11-.09-.67-.09-.67-.68-4.4-.69-4.4-1.6-1.93-1.6-1.93-3.5.02-3.5.02-2 1.37-2 1.37 3 2.1 3 2.1v9.1l-2 .76-2 .77.67 1.07.66 1.07-2.67-.7-2.67-.7v2.98h-3.84l-.92 1.48-.91 1.48 1.48.92 1.49.92h9.45l-.64-1.67zm-10.6-6.46l-2.84-1.34-.43-4.9-.42-4.9 2.76-2.77 2.76-2.76h-3.87l-1.2 2.15-1.2 2.14-.82-2.13-.82-2.13 3.38-.85 3.39-.85 1.5 1.5 1.5 1.5h2.05l-.68-1.78-.68-1.77 2.92.1 2.92.12.54-1.53.53-1.53-5.06.52-5.07.51 2.67-1.22 2.66-1.23-7.37-.1-7.37-.09-2.96 2.08-2.96 2.07v5.99l1.66 1.8 1.67 1.79-1.67-.94-1.66-.94v7l1.54 2.88 1.54 2.89 1.47 1.46 1.47 1.47 1.66-.55 1.65-.55v4.42l3.84-3.1 3.83-3.1-2.83-1.33zm-7.24-4.6l1.63-2.62.42.42.41.42-.84 2.19-.84 2.19h-2.4zM236 151v-1.34h2.67v2.67H236zm-74.1 1.9l-6.57-3.47-3.17-2.88-3.17-2.89-1.83-4.29-1.83-4.29v-14.45l2.56-3.15 2.55-3.15 13.11.08 13.12.08 4.9 2.14 4.89 2.14 2.1 3.2 2.09 3.2.86 6.25.85 6.24-3.75 5.42-3.76 5.42-5.42 3.1-5.43 3.12-2.77.82-2.77.82-6.56-3.46zm13.84-6.99l1.74-2.25 2.06.43 2.05.42 2.56-2.32 2.55-2.3-.74-2.34-.74-2.33 1.46-.9 1.45-.9-1.27-1.54-1.27-1.55-.46-2.67-.46-2.66-1.57-1.67-1.58-1.67h-3.01l.76-1.23.77-1.24-2.35-.64-2.36-.64-3.78-.84-3.77-.85.85 1.39.86 1.39h-3.01l-2-2-2-2h-7.66l-.83 1.35-.84 1.36-1.28-.8-1.27-.78.37 1.77.36 1.76-1.56-.3-1.56-.3.45 4.87.45 4.86-1.27-1.9-1.26-1.9.81 5.94.82 5.94 1.93 3.73 1.93 3.73h4.09l-.95 1.54-.96 1.54 1.45-.9 1.45-.89.9 1.45.89 1.44 1.82-.7 1.82-.7.86 1.4.87 1.4 4.84-.88 4.85-.87zm-13.25-5.45l-3.43-1.92-.11-4.01-.12-4.02 1.19-2.22 1.19-2.22-1.27-1.54-1.27-1.53 1.36 1.1 1.37 1.1 3.95-.59 3.96-.58-.76-1.52-.75-1.51 1.77 2.11 1.76 2.12 1.71-.57 1.71-.58-.27 1.13-.28 1.12 1.78 3.67 1.78 3.66-1.48 3.25-1.48 3.24.94.54.93.54-1.54-.36-1.54-.36-.8.81-.8.8-3.04.14-3.02.13-3.44-1.93zm-7.3.18l-1.5-.98.95-2.63.94-2.63.69 3.63.7 3.63-.15-.02-.15-.02-1.49-.98zm7.14-18.53l1.67-.67 1.67.67 1.66.68h-6.66zm83.42 4.96l-5.57-2.53-3.4-5.13-3.39-5.12-.85-4.25-.85-4.25 4.2-3.83 4.2-3.83 8.29-2.92 8.29-2.9h5.5l5.52.02 4.82 5.34 4.82 5.33-.03 5-.03 5-2.47 5.33-2.48 5.33-2.88 3-2.88 3-7.61-.03-7.62-.03-5.58-2.53zm15.45-2.36l3.2-.77-1.07 1.73-1.08 1.74 1.57-.97 1.56-.96-.77-1.24-.77-1.24H268v-3.41l-2.57-2.2-2.58-2.2-2.32 3.57-2.33 3.57 2.45-2 2.45-2-.68 2-.67 2-3.88-.1-3.87-.1-2-.57-2-.56-.96-1.34-.96-1.33-2.7 1.68-2.71 1.68v-1.4l1.59-2.54 1.58-2.54 3.26 2.56 3.26 2.56 2.15-.08 2.16-.09-2.86-1.15-2.86-1.16-2.14-3.05-2.14-3.06v-4.68l3.28-2.15 3.27-2.15 4.06.9 4.05.88 2.17 2.9 2.16 2.89-.77-2.3-.77-2.28 1.27-.79 1.28-.79v13.49h3.66l.74-3.66.74-3.67 1.02-2.67 1.02-2.66-2.53 2.5-2.53 2.52-.58-1.73-.58-1.73 2.19-1.6 2.18-1.6v-1.85l-1.33.82-1.34.82-.02-1.74-.02-1.75-1.29 2-1.3 2-.01-3.74-.02-3.75-1.34.83-1.33.82v-2.99l-1.56.97-1.56.97-6.1-.07-6.11-.07L243 99.3l-5.66 2.66.74 1.19.73 1.19-2.4.04-2.42.04 2.16 1.65 2.15 1.64-1.83 1.7-1.82 1.71 2 3.87 2 3.87 3 3.2 3 3.2 2 .81 2 .81 4.67-.7 4.67-.69zm-10.89-.55l1.65-1.65.74.74.75.75-2.4.91-2.38.91zm-12.36-9.25l-.88-1.42.63-.64.64-.63.79 2.05.79 2.06h-1.1zm3.98-.03l-.9-1.45 1.42-1.41 1.41-1.42-.21 2.86-.22 2.87h-.6zm3.4-11.14v-2.08H248v2.51l-1.33.83-1.34.82zm14.67-.28l-3.33-1.76h4l1.96 1.24 1.96 1.25-.63.51-.63.52zm-9.23-1.38l-.1-1.6 1.06-.65 1.06-.66 1.94 1.37 1.94 1.37-2.25-.71-2.25-.72-.65 1.6-.64 1.58-.1-1.58zm-172.9 11.63l-5.45-2.43-2.8-3.54-2.78-3.55 1.8-6.01 1.82-6.01 5.1-7.44 5.1-7.45 4.91-3.25 4.9-3.26 7.39 1.53 7.38 1.53 3.33 3.96 3.33 3.96 1.37 4.95 1.38 4.96v5.85l.02 5.84-4.61 4.34-4.6 4.35-6.3 2.14-6.3 2.15-4.77-.1-4.76-.09zm17.76-.44l1.63-.42.8-.8.8-.8.36-2.4.35-2.38 1.88-.5 1.88-.51-1.8 1.27-1.81 1.27 1.3.8 1.29.8 1.98-2.3 1.97-2.3 1.08-1.88 1.07-1.87-1.45.9-1.44.89-.97-1.56-.96-1.56 1.47.9 1.47.92 1.3-2.42 1.3-2.42-.65-5.28-.63-5.29-.14-2-.13-2-2.66-2.33-2.66-2.34h-3.6v2.67h-5.6l.77-2 .76-2h-3.91v2.82l-1.23-.75-1.23-.76-1.77 1.75-1.77 1.76-2.31.87-2.32.88.75 1.93.74 1.93-2.74.86-2.74.87.31.92.3.92-1.33.51-1.33.52-1.74 2.48-1.75 2.5-.56 2.9-.55 2.9 1.63 2.01 1.64 2.03-2-1.14-2-1.14 3.32 3.64 3.32 3.64 3.06-.58 3.06-.58-.76.75-.75.75 3.04 1.75 3.04 1.75 4-.67 4-.67zm-9.63-7.6l-.82-1.34 1.07.02 1.08.02 2 1.3 2 1.29-2.25.02-2.26.02zm11.9-1.19l.99-1.59-3.47.87-3.47.87-3.98-1.64-3.97-1.65V99l-2.33-.02-2.34-.02 1.86-1.18 1.87-1.18-.82-2.14-.82-2.13H84v-5.18l1.32-.81 1.32-.82-.85 2.2-.85 2.21L88.81 88l3.86-1.95 2 .66 2 .65 2.37 2.07 2.37 2.07-.3 5.1-.3 5.08h-2.3l.77 1.24.76 1.25-1.56.96-1.56.97zM72 99.67l-1.66-2h2.71l.77 2 .76 2h-.92zm2.22-2.89l-.89-.88v-1.78h3.75l-.68 1.78-.69 1.77h-.6zm24.2-12.02l1.75-.7.8.8.8.81-2.55-.1-2.55-.1zm-8.47-1.84l-.88-1.42.63-.64.64-.63.79 2.05.79 2.06h-1.1zm149.98.13l-4.74-2.5-1.59-3.48-1.58-3.48-.8-5.02-.8-5 1.53-5.72 1.54-5.7 6.92-3.23 6.92-3.22 5.71-.01 5.71-.02 4.3 1.84 4.28 1.83 3.84 4.08L275 57.5l-.82 3.25-.81 3.25-4.47 6.5-4.47 6.5-5.65 4.34-5.65 4.33-4.23-.06-4.23-.05-4.74-2.51zm14.76-5.04l.02-2.34 1.29 2 1.3 2 .01-1.62.02-1.63 2.22.86 2.22.85-.94-1.53-.94-1.52-6.79-2.02-6.78-2.01-1.82-1.52-1.83-1.52v-6.43l2.03-3.1 2.02-3.1 3.64.58 3.64.58 2.87 1.4 2.88 1.38.6 3.13.6 3.14-2.53 2.7-2.52 2.72-1.62.1-1.61.1 4.66 1.8 4.67 1.8 1.25.1 1.26.1-2.59-2.1-2.59-2.1 2.9.61 2.89.61 3.05-3.5 3.06-3.52.25-3.67.25-3.67-2.2-.1-2.2-.1 1.66-.68 1.65-.66-1.89-1.9-1.9-1.89h-2.44L262 49.67l-2.41-2.66h-8.8l-3.4 1.54L244 50.1v2.4l-1.18-.73-1.18-.73-1.38 1.65-1.37 1.65-.24 1.33-.25 1.34-1.02-.28-1.01-.27.48 6.27.49 6.28-1.42-2-1.42-2 .9 4.66.9 4.67 1.97 2.24 1.98 2.25 1.74-.67 1.74-.67.88 1.43.88 1.42h9.18l.02-2.33zm-8-.56l-.02-2.22-3.67-2.7-3.67-2.69 2.04.29 2.03.28 2.81 2.8 2.8 2.82-1.15 1.82-1.15 1.82-.02-2.22zm-9.25-4.55l.1-2.56.7 1.75.7 1.75-.8.8-.8.81.1-2.55zm2.6-10.64l.04-1.25 1.96-2.6 1.96-2.58-.04 1.26-.04 1.25-1.96 2.59-1.96 2.59zM244 54.5V54l2.33-1.83 2.34-1.83-1.83 2.33-1.83 2.34H244zm12.53-1.05l-.69-1.11h4l.69 1.11.69 1.11h-4zm-92.16 10.93l-4.3-1.02-3.37-2.21-3.37-2.2-3.45-5.21-3.44-5.2-.7-5.2-.7-5.19 4.13-3.47 4.12-3.47 7.69-2.89 7.69-2.88 7.07-.75 7.07-.74 4.57 4.43 4.57 4.43 1.43 4.35 1.44 4.34-1.54 5.7-1.53 5.7-3.83 5.56-3.83 5.56-2.15.83-2.16.82-5.56-.13-5.55-.14zm12.72-5.06l2.01-.77-.95 1.55-.96 1.54 2.07-.8 2.07-.79v-3.3l2.62-2.36 2.62-2.37 1.5-4.58 1.52-4.57-.84-3.35-.84-3.35-4.29-1.86-4.29-1.87 1.83-.05 1.83-.05-1.38-1.67-1.38-1.66-6.45.18-6.45.18-1.62.15-1.63.15.75 2.34.75 2.33-1.35-1.9-1.35-1.92-5.28 1.58-5.28 1.59-1.32 1.66-1.3 1.66-.71 5.57-.71 5.57 2.03 2.9 2.03 2.9 1.29-1.8 1.29-1.81-.75 2.33-.75 2.34.8 2.1.82 2.12 2.81 1.2 2.82 1.2 7.2-.77 7.21-.76zM168 56.37v-1.14l1.67-.67 1.66-.68-2.28-.1-2.28-.1-2.72-2.92-2.72-2.92V40.4l3-1.9 3-1.92 5.64-.6 5.63-.62-.72 1.18-.73 1.18-1.58-.8-1.57-.8 3.33 3.11 3.34 3.11-.08 2-.07 2-2.87 5.33-2.87 5.34-.05-1.67-.06-1.67h-2.96l.67 1.73.66 1.73-2.52.19-2.52.19zm-8.35-3.62l-2.35-.61.76-1.23.76-1.24h2.22l.78 2 .76 2-.29-.15-.29-.16zm23.02-.25v-1.34l1.33-.82 1.33-.82v2.66l-1.33.83-1.33.82zm-32.58-3.77l-.91-2.39 1.65 1.64 1.66 1.65-.75.75-.74.74zm8.68-3.83l.1-2.56.7 1.75.7 1.75-.8.8-.8.81.1-2.55zm-6.1-3.32v-3.65l1 .62 1 .61v-2.6l-1.6-.53-1.6-.53 2-.77 2-.77.16 5.64.16 5.63h-3.12zm30-1.24v-1.33h2.66v2.66h-2.66zM160 37.67v-1.33h2.82l-.82 1.33-.82 1.34H160zm95.33.42l-2.66-.6-5.72-2.11-5.72-2.1L238 29.4l-3.25-3.86-1.49-4.96-1.49-4.96.45-3.98.46-3.98 6-2.96 6-2.96 7.55-.88 7.55-.87 4.77.9 4.78.9 3.34 4.9 3.34 4.93V22.6l-3.86 5.32-3.85 5.32-3.66 2.88-3.66 2.88-1.48-.16-1.49-.15zm-1.4-4.3l.74-1.2 2.33.6 2.33.61 2.67-2.16 2.67-2.16-1.65.83-1.66.84.8-2.07.79-2.06 1.05.65 1.05.65.8-2.07.8-2.08 1.15.71 1.14.71 1.53-3.35 1.53-3.36v-3.91l-1.67-2.83-1.66-2.83-2.76-2.82-2.75-2.82-3-.43-2.99-.43-1.8 1.5-1.8 1.5-.8-1.29-.78-1.28-5.66.63-5.66.64-3.3 2.15-3.32 2.14 1.64.55 1.64.55v3.78h-2.44l-.64-1.67-.64-1.67.14 2.9.14 2.92 1.04-.65 1.05-.65-.17 3.07-.18 3.08 1.49 3.66 1.48 3.67h2.9l-.73 1.18-.73 1.18 2.98.97 2.99.96 1.57-.18 1.56-.18.85 1.37.84 1.37h2.36zM246 28.35l.82-1.33H248v2.66h-2.82zm-7.23-3.44l.1-2.56.7 1.75.7 1.75-.8.8-.8.81.1-2.55zm10.64-.12l-3.19-2.23 1.15 1.9 1.14 1.89-2.25-1.83-2.26-1.83.02-2.17.02-2.17 1.4 2 1.4 2-.83-2.95-.82-2.95 1.53-2.87 1.54-2.88 5.91.67 5.9.66-.77-2.84-.77-2.84 2.07 2.59 2.07 2.59-1.48.9-1.47.92 1.47.91 1.48.91v7.7l-2.97 2.07-2.96 2.08h-4.15l-3.18-2.23zm14.7-2.55l.1-2.56.7 1.75.7 1.75-.8.8-.81.81.1-2.55zM244 11.1V9.77l2.33-1.21 2.34-1.22 2.97.25 2.97.25.92.92.91.91h-7.28l-2.58 1.38-2.58 1.38z" fill="#edd5d8"/><path d="M240.77 370.67l-1.97-3-1.9-4.66-1.9-4.67-.79-5.33-.79-5.34 1.13 3.34 1.13 3.33 1.79 5.92 1.79 5.91 3.15 3.75 3.16 3.75h-2.84zm9.65 2.1l1.75-.7.8.8.8.8-2.55-.1-2.55-.1 1.75-.7zm17.58-9.68v-1.26l1.32-.81 1.32-.82-.8 2.07-.8 2.07H268zm-19-4.19l-2.33-1.36v-7.68l2.1-2.1 2.09-2.09h4.95l2.1 2.1 2.09 2.09.81 3.26.82 3.25-1.64 1.99-1.65 1.98-3.5-.04-3.5-.04-2.34-1.36zm23-3.89l1.28-4.48-2.85-5.7-2.85-5.72-1.03.64-1.03.63-.85-1.37-.85-1.38-1.45.9-1.45.89.91-1.47.91-1.48-4.59-.86-4.58-.86-3.12.94-3.12.93-5.7 3.27-5.7 3.27.73 1.16.72 1.17-1.36.84-1.35.83v-4.21l6.33-4.03 6.33-4.02 3.02-.76 3.02-.76 6.23.93 6.24.94 4.58 4.58 4.59 4.58-.69 6.08-.69 6.08-1.46 1.46-1.46 1.46zm-110.24-6.51l-5.3-3.84-4.23-6.39-4.23-6.39v-5.58l2.77-5.31 2.78-5.32 4.72-4.2 4.72-4.2 4-.8 4.01-.8h9.18l2.46 1.32 2.46 1.32 2.78 4.5 2.79 4.51-.2 7.18-.2 7.17-.9-7.33-.92-7.33-.92-2-.92-2-5.22-2.2-5.23-2.2-6.7.22-6.7.22-4.66 4.53-4.66 4.52-2.2 4.64-2.21 4.65 1.5 4.8 1.5 4.82 3 3.33 3.02 3.33 4.4 3.67 4.42 3.67h8l5.46-5.67 5.45-5.67-1.53 2.86-1.52 2.86-4.14 3.47-4.13 3.48h-7.4zm3.63-15.08l-2.72-2.92v-5.97l2.1-2.1 2.09-2.09h5.88l2.96 2.08 2.97 2.07v7.7l-2.97 2.07-2.96 2.08h-4.64zm96.92-13.25l1.65-1.65.74.74.75.75-2.4.91-2.38.91zm-26.44-3.96l-2.8-2.8.93-6.17.92-6.17 2.57-5.03 2.56-5.03h1.34l-2.52 5-2.52 5-.84 6-.84 6 1 1.44 1 1.45 2.66 1.51 2.67 1.52-1.67.04-1.66.04zm33.97-.95l3.85-4.1-.63-6.55-.63-6.55-3.87-5.07-3.86-5.07 2.88 1.8 2.89 1.8 3.02 5.39 3.03 5.38-.3 4-.3 3.99-1.96 2.98-1.96 2.99-3 1.55-3 1.55zm-19.45-4.59l-2.12-1.66-.88-2.98-.89-2.98 3.36-3.35 3.35-3.36H256l2.67 2.67 2.66 2.66v6.48l-2.1 2.1-2.09 2.09h-4.63zM79.8 304.81l-3.53-.62-2.47-2.8-2.48-2.8 3.5 2.25 3.5 2.25 6.7.8 6.71.8 6.37-.96 6.37-.96 3.64-3.9 3.64-3.88-.73 2.76-.72 2.76-3.27 2.14-3.26 2.14-10.23.32-10.22.32zm-10.97-14.14l-.8-3-.02-5.8-.02-5.8 2.2-4.62 2.2-4.63 3.9-3.9 3.9-3.91h10.57l4.95 2.52 4.95 2.53 2.66 3.1 2.67 3.11-4.78-3.53-4.77-3.53-4.57-.86-4.57-.85-3.7 1.4-3.68 1.4-5.44 5.69-5.44 5.68.63 9 .63 9h-.67zm42.04.34v-3.34l.67 1.67.67 1.67-.67 1.66-.67 1.67zm-25.17-.12l-2.87-1.07-1.51-2.83-1.52-2.83 2.17-3.3 2.16-3.3 3.26-1.5 3.27-1.48 3.3 1.5 3.29 1.5.88 3.5.87 3.5-2.65 3.54-2.65 3.55-2.56.14-2.57.14zm157.26-3.32l2.3-2.4.64.63.64.64-2.94 1.77-2.94 1.76zm-133.43-3.23v-3.33l.68 1.66.67 1.67-.67 1.67-.68 1.66zm142.14 1.72l3.02-.58 2.32.61 2.31.6-5.33-.02-5.33-.03 3.01-.58zm1.99-10.64l2.33-.6 2.33.6 2.34.61h-9.34zm10.06-3.06l3.07-2.55 2.56-3.07 2.55-3.07.05.96.04.95-4.14 4.71-4.14 4.72-1.52-.05-1.53-.04 3.06-2.56zm-23.83-3.56l-3.23-3.55 4.33 3.13 4.33 3.13v.83h-2.2zm-5.1-8.66l-1.47-4.2v-7.24l2.7-3.42 2.68-3.41 4.63-1.53 4.64-1.53 2.34.6 2.35.62-3.07.16-3.07.15-4.05 2.1-4.06 2.1.78.78.78.77-1.14 1.46-1.13 1.46-.84 4.44-.85 4.44 1.33 2.48 1.32 2.47-1.2.75-1.21.75zm14.8 2.6l-1.6-1.6v-8.27l1.6-1.6 1.6-1.6h6.93l1.6 1.6 1.6 1.6v7.32l-2.96 2.07-2.96 2.08h-4.21zm23.15-1.46l.91-2.39.75.75.75.74-1.66 1.65-1.66 1.64zm-107.35-3.54l-1.93-1.22 5.43.73 5.42.73 5.5-4.98 5.51-4.97v2.51l-3 2.73-3 2.74-2.9 1.5-2.92 1.5-3.09-.02-3.09-.02-1.93-1.23zm-9.55-4.72l-4.82-3.15-2.23-5.58-2.23-5.57-.15-4.19-.15-4.19.94-2.97.95-2.96 3.93-2.8 3.93-2.8 7.66-.5 7.65-.5-6 1.04-6 1.04-3.66 1.77-3.67 1.77-.06.8-.06.78-1.78 6.66-1.78 6.67 1.36 1.7 1.37 1.7-.81.8-.81.82 1.35 2.53 1.36 2.53 5.46 3.96 5.47 3.96-1.2-.08-1.2-.08-4.82-3.15zm118.82.26v-2.17l-3.67-3.53-3.67-3.53 3.62 2.26 3.61 2.27.84 2.65.84 2.64-.78.8-.8.78zm-87.68-8.6l2.08-2.34 1.4-5.13 1.39-5.13-2.93-2.87-2.93-2.87-3.33-2.4-3.34-2.38 4.48 2.39 4.47 2.39 2.39 3 2.38 3-.98 4.34-.98 4.35-1.86 2.99-1.87 2.99h-2.44zm-22.7-1.08l-2.96-2.08v-7.34l2.72-2.92 2.72-2.92h3.3l2.97 2.08 2.96 2.07v9.11l-3.93 2.04-3.94 2.03h-.87zm95.04-18.84l4-2.15 4.4-4.8 4.4-4.8-1.28 2.66-1.27 2.67-3.12 2.83-3.13 2.84-2.9 1.5-2.92 1.5-1.09-.06-1.09-.05 4-2.14zm-19.22-3.87l-4.1-3.45-2.17-7.47-2.18-7.47 2.49-4.61 2.49-4.62 4.3-1.8 4.3-1.8 3.72.1 3.7.11-1.33.4-1.33.4-5.62 1.7-5.62 1.7.7 1.13.7 1.13h-2.5l-1.43 5.61-1.42 5.62 1.25 1.5 1.25 1.52-.76.75-.76.76 1.85 3.53 1.84 3.52 3.93 2.58 3.92 2.6h-1.56l-1.57.01-4.1-3.45zm8.89-7.32l-2.33-1.36v-9.14l3.33-2.19 3.33-2.18 3.34 2.18 3.33 2.19v7.79l-2.96 2.07-2.97 2.08-1.37-.04-1.37-.04-2.33-1.36zM9.04 211.34l-2.03-2.33-1.7-3.28-1.7-3.27-1.79-6.73-1.79-6.72-.01-3.67-.02-3.67h2.58l-.73 1.92-.74 1.92 1.6 7.75 1.6 7.75 2.53 4.98 2.53 4.97 3.32.84 3.33.83 4.75-.89 4.75-.89 2.24-.6 2.24-.62-4 1.96-4 1.96-5.46.06-5.46.06zm262.96.42v-.58l1.3-3.41 1.3-3.42-4.3-4.9-4.3-4.9 2.99 1.6 2.98 1.6 2.01 3.89 2.01 3.88-1.3 3.41-1.3 3.41H272zm-233.33-7.92v-.5L41 201.5l2.33-1.83-1.83 2.34-1.83 2.33h-1zm6.16-10.18l2.14-5.36-.64-2.98-.63-2.98-.52-1.93-.51-1.93-3.61-3.14-3.61-3.14-.58.4-.59.4-2.47-2.17-2.48-2.17-2.91-.9-2.91-.88-7.43 2.16-7.43 2.16L6 175.6l-4.66 4.39v-2.32l2.44-2.43 2.44-2.44 6.56-3.23 6.56-3.23h13.34l6.19 3.05 6.2 3.05 1.68 4.07 1.68 4.07-.17 4.49-.16 4.48-1.98 4.73-1.97 4.73H42.7zm-26.65 1.25l-3.51-2.76v-6.28l3.51-2.77 3.51-2.76h7.32l1.39 1.67 1.39 1.68.9 3.59.9 3.6-3.4 3.4-3.4 3.4h-5.1zm235.15-18.16l3.34-.56 4.34-1.37 4.35-1.36-.76-1.23-.76-1.22h3.98l2.82-3.96 2.82-3.97-.3-6.37-.3-6.37-4.72-4.52-4.72-4.52 4.03 2.09 4.03 2.08 1.6 3.5 1.59 3.5v11.78l-4.2 4.78-4.2 4.78-3.74 1.93-3.73 1.93-4.4-.18-4.4-.18zm-13.5-6.74l-1.83-2.34 2.33 1.83 2.34 1.83v1.01h-1.01zm8.17-7l-2.67-2.67v-6.25l2.44-2.21 2.44-2.2h4.1l3.51 2.76 3.51 2.76v6.06l-2.43 2.2-2.44 2.21h-5.8zm-85.67-10.1l-3.66-1.99v-1.32l4.2 2.18 4.2 2.18 4.65-.76 4.65-.75 6.81-5.62 6.82-5.62-4.67 5.01-4.66 5.01-3.6 1.89-3.6 1.89-3.74-.06-3.73-.05-3.67-1.99zm71.1-6.07l-.1-2.17 2.34-1.83L238 141l-1.49 2-1.49 2-.74 2-.74 2-.1-2.17zm-71.35-8.13l-2.08-2.96v-8.21l1.6-1.6 1.6-1.6h5.77l3.52 2.76 3.51 2.77v7.61l-2.1 2.1-2.09 2.1h-7.66zm91.61 2.04l2.36-.62 1.64.67 1.64.66-4-.05-4-.05 2.36-.61zm-64.15-6.38l-.25-6.52-2.37-4.09-2.38-4.09-6.6-2.31-6.6-2.32 4.66.78 4.67.78 4 2.28 4 2.27 1.86 6.94 1.86 6.95-1.3 2.92-1.3 2.92zm70.46-5.9l6-.87 1.69-1.05 1.68-1.06 2.54-4.97 2.53-4.97.83-4.6.82-4.61-2.7-4.33-2.68-4.34h-2.87l.8-1.3.8-1.29-3.05-.67-3.06-.67-4-.5-4-.5 6.09-.2 6.08-.2 3.42 3.67 3.42 3.66 1.62 3.14 1.62 3.14-.9 4.82-.9 4.81-2.05 4.05-2.04 4.04-2.75 3-2.74 3-6.1-.17-6.1-.18zM145.54 123v-3.34l.68 1.67.67 1.67-.67 1.66-.68 1.67zm104.67-6.44l-2.21-2.44v-6.59l1.6-1.6 1.6-1.6h8.61l2.1 2.1 2.09 2.1v6.05l-2.44 2.21-2.44 2.2h-6.71zm-148.24-4.51l2.63-1.72 4.52-4.35 4.52-4.35-.96-7.65-.95-7.65-1.78-3.43-1.77-3.43-2.23-1.85-2.22-1.84-2.2-.46-2.2-.46-5.74-.78-5.75-.78-4.92 4.51L78 82.34l4.6-5 4.59-5h6.74l6.74.01 4.41 2.7 4.41 2.68 1.8 4.3 1.78 4.31.95 7.67.95 7.66-1.97 3-1.97 3-5.85 3.05-5.85 3.05zm-17.2-11.6l-2.42-2.68.85-3.37.84-3.37 3.23-2.11 3.22-2.12 3.72.43 3.7.43 2.05 3.67L102 95l-2.04 3.66-2.04 3.67-5.36.4-5.36.4zM74.67 86.5V86L77 84.17l2.33-1.83-1.83 2.33-1.83 2.34h-1zm168-2.32l-3.34-1.33-3-2.82-3-2.82v-2.56l2.77 3.51 2.76 3.51h4.98l.92 1.48.91 1.48 4.83-.77 4.83-.78-2 1.28-2 1.27-2.66-.06-2.67-.07-3.33-1.32zm15.2-3.65l2.54-2.86h.92v2.02l-3 1.85-3 1.84zM232.13 65l-.09-9.34 1.15-1.8 1.14-1.81-.6 9.8-.61 9.81-.45 1.34-.46 1.33-.08-9.33zm14.99 6l-2.89-1.15-.82-2.6-.83-2.6 1.55-3.39 1.54-3.38 3.09-.78 3.09-.77 3.44 1.57 3.44 1.56.81 3.23.81 3.23-2.5 2.4-2.52 2.4-2.66.72-2.67.7zm-74.79-6.25l2.34-.6 2.33.6 2.33.61H170zm-7.25-1.32l1.75-.7.8.8.81.81-2.55-.1-2.56-.11 1.75-.7zm16.53-.95l1.72-1.86 1 .6 1 .61v-4.16h2.01l1.81-4.07 1.8-4.08.63.62.62.62-2.17 4.2-2.17 4.19-2.6 2.6-2.6 2.59h-2.76zm88.26-9.14l-2.54-3 3 2.54 3 2.54v.92h-.92zM164.1 50.16l-2.77-3.51v-4.79l2.1-2.1 2.1-2.09h9.14l2.66 2.67 2.67 2.67v3.64l-2.76 3.51-2.77 3.51h-7.61zm73.82.25l2.59-2.07h2.6l-.55.49-.56.48-3.33 1.59-3.34 1.59zm-91.76-4.12l-.83-2.17.14-2.89.14-2.89 1.1 4.66 1.09 4.66-.4.4-.4.4zm45.59-3.03l.48-5.08-4.5-5.92-4.52-5.92-4.6-.82-4.61-.83 4.04-.17 4.03-.18 2.86 2 2.85 2 2.78 4.49 2.77 4.5v11.01h-2.07zm59.14-6.76l-1.78-1.12 6.44.6 6.45.62 3.83-3.02 3.84-3.03 2.47-5.44 2.47-5.44.03-3.2.03-3.21-3.6-4.8-3.6-4.79-1.4-.98-1.4-.98h2.66l1.5.98 1.5.98 2.83 4.67 2.83 4.67v3.72l.01 3.72-2.6 5.1-2.62 5.12-4.16 3.5-4.16 3.5-4.9-.02-4.9-.02zM166 27l2.67-1.14 2.66.04 2.67.04-3.33 1.07-3.34 1.06-2 .04-2 .04zm86-1.07l-2-.69-1.62-2.12-1.63-2.11-.04-3.4-.04-3.4 1.6-1.6 1.6-1.6h7.46l2.67 2.66 2.67 2.67v4.92l-2.34 2-2.33 2-2 .68-2 .67zm-19.9-10.37l.11-2.55.7 1.75.7 1.75-.8.8-.81.8.1-2.55zM257 .8l1.67-.67 1.66.67 1.67.67h-6.67z" fill="#e7bdc5"/><path d="M249.4 358.43l-1.58-1.92.42-4.42.43-4.42 4.25-.4 4.25-.42 2.23 3.41 2.24 3.41-2.18 3.34-2.19 3.33H251zm-84-25.34l-1.58-1.9.42-4.43.43-4.42 4.45-.43 4.46-.42 2.54 2.3 2.55 2.3v4.5l-2.44 2.21-2.44 2.2h-6.8zm84.26-23.62L248 307.8v-5.72l2.44-2.21 2.44-2.2h3.86l2.48 2.88 2.47 2.9-1.2 3.44-1.2 3.44-3.99.4-3.98.39zM84.3 288.93l-2.97-2.07v-4.68l2.72-2.92 2.72-2.92h7.36l1.6 1.6 1.6 1.6v7.28l-2.1 2.1-2.09 2.09h-5.88zm165.3-27.52l-1.6-1.6.04-2.74.04-2.73 1.78-2.33 1.77-2.34h5.29l2.2 2.44 2.21 2.44v4.83l-2.33 1.77-2.33 1.77-2.74.04-2.73.05-1.6-1.6zm-85.35-18.22l-1.75-1.11-.12-4.16-.12-4.15 1.7-2.05 1.7-2.05h6.15l2.1 2.1 2.09 2.1v6.32l-2.96 2.07-2.97 2.08-2.03-.02-2.04-.02-1.75-1.11zm84.2-31.18l-1.04-1.67-.3-2-.3-2 1.95-3 1.97-3h5.08l2.1 2.1 2.09 2.1v5.51l-2.33 1.77-2.34 1.77-2.92.04-2.92.04-1.04-1.66zM21.33 195.87l-4.66-1.53-.41-4.19-.4-4.19 3.73-2.63 3.74-2.63 2.63.41 2.63.41 1.7 2.33 1.71 2.33-.02 2.75-.02 2.74-.98 1.34-.98 1.33-2 1.53-2 1.52-4.67-1.52zm228.3-32.27l-2.96-2.08v-8.75l3-1.37 3-1.37 2.91 1.08 2.91 1.08 1.35 2.53 1.36 2.52-.71 2.72-.72 2.72-3.28 1.5-3.28 1.5h-.62zm-85.22-23.29l-2.93-1.16-.93-4.97-.93-4.97 2.9-2.35 2.9-2.35 3.98 1.39 3.99 1.39 1.3 2.44 1.31 2.43-.04 1.76-.04 1.75-1.63 2.14-1.63 2.14-2.67.77-2.66.76-2.92-1.17zm86.23-24.67l-2.97-3.15.84-3.35.84-3.35 4.9-.92 4.88-.91 2.44 3 2.43 3v2.08l-2.33 2.85-2.34 2.84-2.86.54-2.86.53zm-163.68-14.7L84 98.85v-6.33l3.4-2.67 3.4-2.67 2.74.52 2.73.53 1.87 1.55 1.86 1.54v7.26l-2.44 2.21-2.44 2.2h-5.2zM245.6 69.4l-1.6-1.6v-7.4l3.24-2.13 3.25-2.13 3.09 1.63 3.09 1.63.98 1.46.98 1.47.02 2.52.02 2.52-2.34 1.77-2.33 1.77-3.4.04-3.4.05zm-80.07-18.86l-2.86-3.05v-6.63l1.6-1.6 1.6-1.6h8.39l2.2 2.44 2.2 2.44v5.82l-2.6 2.22-2.6 2.23-2.53.39-2.54.39zm83.21-27.84l-2.07-2.96v-4.33l2.43-2.2 2.44-2.21h3.87l2.96 2.07 2.96 2.08v7.75l-2.58 1.38-2.57 1.38h-5.36z" fill="#d799a8"/><path d="M250.42 358.95l-2.24-1.3.11-4 .12-3.99 1.53-1.27 1.53-1.27 2.92.76 2.91.76-.72 1.17-.72 1.17 2.07-.8 2.07-.8v7.33l-2.33 1.77-2.34 1.78h-2.66l-2.25-1.31zm2.25-5.28l.82-1.33h-2.82v2.67h1.18zm-86.43-19.66l-.6-1-.92-4.33-.93-4.33 3.44-1.3 3.44-1.31L174 323l3.33 1.26v7.54l-1.6 1.6-1.6 1.6h-7.31zm8.94-3.74l.79-2.07-1.32.82-1.32.81v2.51h1.05zm-5.24-.5l.77-1.25-1.35-.83-1.36-.84V331h1.18zm3.9-3.5l.8-2.07-1.32.82-1.32.81v2.51h1.05zm75.22-18.66l-1.54-3.4 3.65-3.6 3.65-3.6 3.2 3.68 3.22 3.69-.86 2.31-.85 2.32-1.43.98-1.43.98-3.03.02-3.03.02-1.55-3.4zm9.25-1.4l-.81-.81-1.75.7-1.75.7 2.56.1 2.55.1-.8-.8zM86.67 289.23l-3.34-1.72.38-4.52.37-4.52.33-.33.34-.34 4.21-.74 4.22-.74 2.07 2.97 2.08 2.97v4.32l-2.43 2.21-2.44 2.2-1.23-.01-1.23-.02zm4-3.57v-1.33H88V287h2.67zm.46-4.72l-.8-2.06-.63.64-.63.63.88 1.42.87 1.43h1.1zm158.45-21.28l-1.52-3.33h2.76l-.86-1.4-.86-1.38 1.62-1.95 1.6-1.94H256l2.67 2.67 2.66 2.67v2.56l-2.91 2.72-2.92 2.72h-4.4zm-85.53-19.24l-1.38-2.58v-1.67l1.66.94 1.67.94-1.6-1.73-1.6-1.73 1.3-2.46 1.33-2.47h4.73l2.4 1.77 2.42 1.76.4 3.65.4 3.64-3.3 1.26-3.32 1.26h-3.73zm7.59-2.23l-.8-.8-1.76.7-1.75.7 2.56.1 2.55.1-.8-.8zm77.15-27.86l-2.18-3.33h2.43l-.19-2.15-.18-2.15 2.2-1.43 2.2-1.42 3.46 2.27 3.47 2.27v4.98l-3.29 2.15-3.28 2.15h-2.46zm7.21-1.25v-.6l-1.33-.82-1.34-.82v2.82H256zM20.33 194.35L16 192.47v-2.83l1.67-2.98 1.66-2.99 1.34-.98 1.33-.98 2.97-.02 2.97-.02 2.22 3.4 2.22 3.38-1.56 3.4-1.55 3.42-2.04-.78-2.04-.79.82 1.32.81 1.32-1.07-.05-1.08-.05zm5-3.12v-1.11l-.85-.85-.85-.86-1.17.73-1.17.72.77 1.24.76 1.24h2.51zm2.84-5.91l-1.66-1.65.9 2.4.92 2.39.75-.75.74-.75zm221.66-22l-1.5-.98-.9-4.2-.92-4.21 1.08-.61 1.08-.61 3.69-.88 3.69-.89-.65 3.7-.65 3.7 1.28 2 1.28 2-.49-4.39-.48-4.39 1.5.5 1.5.49.43 2.97.43 2.97-1.6 1.92-1.6 1.93-2.83-.02-2.84-.02-1.5-.98zm2.78-4.22l.77-1.24-1.36-.84-1.35-.84v4.16h1.18zm-89.7-19.88l-1.76-1.15.42-5.15.43-5.15 4.42-.9 4.42-.9-.69 1.79-.68 1.78 2.26-.71 2.27-.7-2.33 1.91-2.34 1.93v1.73l2.6-1.63 2.62-1.63.84.85.85.85-1.8 3.77-1.8 3.76-3.98.35-4 .35zm4.62-3.55l-.2-3.33h-2v2.45l.81 2.1.81 2.12h.77zm5.8-.66v-1.34h-1.18l-.82 1.34-.82 1.33h2.82zm77.55-20.73l-1.55-3.4v-3.68l3-1.01 3-1.01 1.67-.3 1.66-.3-.47 2.89-.47 2.88.59-1.74.58-1.74 1.56.51 1.55.51.44 2.97.43 2.97-1.6 1.93-1.6 1.92h-7.24zm5.12-1.94v-1.33h-2.67v2.66H256zM88.83 100.56l-3.84-2.26.23-1.31.23-1.32.74-2.95.74-2.95 2.63-.84 2.63-.83 3.22.8 3.22.81.8 3.2.8 3.18-1.55 2.9-1.55 2.89-1.97-.75-1.97-.76.82 1.32.81 1.32-1.07-.1-1.08-.1zm4.5-2.66v-1.12l-.85-.85-.85-.85-1.17.72-1.17.72.77 1.25.76 1.24h2.51zM246.1 68.44l-2.1-2.31v-4.04l2.44-2.21 2.44-2.2h3.95l2.92 2.71 2.92 2.72-.05.95-.04.95-1.9 2.5-1.9 2.52-3.3.36-3.3.36-2.09-2.3zm7.24-5.43v-1.34h-2.82l.82 1.34.83 1.33h1.17zm-86.66-12.5v-1.84l-2-1.66-2-1.66v-1.5l.01-1.51 4.15-2.36 4.14-2.36-.85 2.22-.85 2.21 1.86-1.54 1.86-1.55 2.12.81 2.12.82.83 2.6.83 2.61-2.14 3.27-2.14 3.27h-7.94zm4.38-3.5l-.7-2.67H168v3.78l1.67.67 1.66.67.21.1.21.11-.7-2.66zm4.53-1.59l-.7-1.75-.1 2.56-.11 2.55.8-.8.8-.8-.7-1.76zm-2.67-2.66l-.7-1.75-.1 2.55-.11 2.56.8-.8.81-.81-.7-1.75zm78.04-18.21l-1.71-1.1-.76-4.7-.77-4.7 3.15-.83 3.14-.84 1.08-.02 1.08-.02-.94 1.67-.94 1.66 1.7-1.58 1.72-1.58 1.81 1.82 1.82 1.82v5.33l-2.1 2.1-2.09 2.1-2.24-.03-2.23-.02zm1.96-5.8l-.7-1.74-.1 2.55-.11 2.56.8-.8.81-.81-.7-1.75z" fill="#cd748c"/><path d="M250.67 356.93v-2.08l-1.14.7-1.14.7.63-3.3.63-3.32 1.23-.75 1.23-.76-.87 3.46-.87 3.46 2.78-.43 2.78-.42.92-.93.93-.92h-5.7l.8-2.07.79-2.06 2.16.48 2.17.48-.33 1.58-.34 1.59H260v2.67h-4.08l-.77 2-.77 2h-3.71zm-81.34-23.48v-1.55l-.88.88-.88.88-1.57-3-1.57-2.99 1.08-2.16 1.07-2.17 2.61-.68 2.61-.68-.82 2.18-.81 2.18 2.58-2 2.58-2-1.77 2.27-1.78 2.27.95 2.98.94 2.98 1.83-2.5 1.83-2.51v2.99l-2.1 2.1-2.09 2.09h-3.8zm1.8-3.5l-.77-2.94H168v2.78l1.67 1.8 1.66 1.81.28-.25.28-.26zm2.2-1.48v-1.3l1.43-.88 1.42-.88.44.46.44.47-1.86 1.72-1.87 1.72zm77.7-19.13l-1.28-1.67-.79-2.2-.78-2.21 2.35-2.13 2.35-2.12h5.05l-2.97 2.07-2.96 2.08v2.51h2.67v-3.43l2.98-.22 2.98-.23-1.8 1.11-1.8 1.12 1.15.6 1.15.62-1.62-.4-1.62-.38-.8 1.27-.78 1.28h4.16v2.76l-2.59-1.39-2.58-1.38-.77 1.24-.76 1.23 2.35.61 2.35.62-2.17.15-2.17.16zm-163.7-20.08l-2.66-1.59-.97-1.33-.97-1.33.78-2.67.79-2.67 1.1-1.17 1.08-1.18-.31 2.14-.32 2.14-.92.92-.93.93v2.38l1.24-.77 1.24-.76.84 1.35.84 1.36h6.66l-.83-1.36-.84-1.35-1.15.7-1.15.72-.85-1.38-.85-1.38-1.3.8-1.29.8.9-3.77.92-3.78.47-.56.48-.55v7.1h2.72l-.88-3.51-.88-3.5 1.86.6 1.85.62 1.55 3.08 1.55 3.1-1.06 2.8-1.06 2.8-2.3-.42-2.28-.42.88 1.42.88 1.43-1.08-.08-1.08-.08-2.67-1.59zm7.72-7.59l-.7-2.66h-2.1l.7 2.66.7 2.67h2.1zM253.33 260l3.34-1.5.55-.4.54-.4-3.76-3.24-3.76-3.23 4.44.23 4.44.22.55 1.67.55 1.67h-2.89v-2.67l-1.66.04-1.67.05 3.06 2.55 3.06 2.55.04 1.02.04 1.02-2.43.96-2.44.96H250l3.33-1.5zm-2.94-1.88l1.72-.7-1.72-2.2-1.72-2.2 2.33 1.83 2.33 1.83V259l-2.33-.1-2.33-.11 1.72-.7zm-85.87-17l-.73-1.9-.36-2.43-.37-2.44 2.52-2.2 2.51-2.2 2.62.7 2.62.68v1.33l-2.37-.62-2.37-.62-1.7 1.81-1.7 1.82 2 .76 1.97.76-.72 1.89-.73 1.89h2.51l.9-.9.89-.88-2.06-2.28-2.06-2.27 3.72.02 3.72.03-1.66.58-1.67.59v2.6l1.37-.84 1.36-.85-.36 1.77-.37 1.76-2.67 1.62-2.66 1.62-1.71.05-1.71.05-.73-1.9zm86.08-30.04l1.94-1.22 1.07.66 1.08.67.8-2.09.8-2.08h2.38l-.34 1.66-.33 1.67-2 .9-2 .91-2.67.08-2.66.07 1.93-1.23zm-2.09-2.98l-.92-1.5 1.27.79 1.27.78 1.93-1.19 1.93-1.2-2.66-2-2.66-2.01 1.58-.04 1.6-.05.82 1.34.82 1.33 2.26-.02 2.25-.02-2-1.42-2-1.41 1.92.52 1.91.52.44 1.32.45 1.33-4.64 2.2-4.65 2.22-.92-1.5zM22.07 194.6l-2.6-1.58-1.51-1.28-1.52-1.28 1.31-3.47 1.31-3.48 3.35 3.1 3.34 3.1.57-.57.56-.56-1.5-2.82-1.51-2.82-1.27.78-1.27.79v-2.67l3.64.28 3.64.28 1.58 3.17 1.58 3.17-1.07 2.8-1.07 2.81-2.13-.18-2.14-.19.73 1.19.73 1.18-1.07-.08-1.08-.08-2.6-1.59zm6.67-3.47l-.76-1.22 1.25-.45 1.25-.44-1.99-3.34-1.98-3.33.75 3.58.75 3.59-1.25.77-1.24.77-.85-1.38-.85-1.37-1.25.76-1.24.77v2.51h8.16zm221.95-29.11l.02-2.34 1.14 1.81 1.15 1.81v-6.95h-1.82l-1.45 3.67-1.45 3.66-.14-5.66-.14-5.67 3.67.1 3.66.09-2.66 1.26-2.67 1.27 4.67-.67 4.66-.67-2.33 1.38-2.33 1.37v2.86l2.03-1.68 2.03-1.69.86.86.86.86-1.78 3.33-1.79 3.33h-6.21l.02-2.33zm7.98-3.33v-1.33l-2 1.66-2 1.66v2.66l2-1.66 2-1.66zm-93.5-19.34l-.15-1 .21-1.16.21-1.17-1.77.68-1.76.68.17-3.52.17-3.51.2-1.67.22-1.66 3.66.02 3.67.02 1.96 1.24 1.97 1.24-2.3.88-2.3.88.04 2.2.04 2.18 1.36-2.33 1.36-2.33h2.54l-.05 2.33-.04 2.33-1.77 2.34-1.77 2.33h-5.71l-.15-1zm4.14-1.84l.02 1.83 2-1.66 2-1.66v-2.66l-1.98 1.64-1.99 1.65-.82-2.15-.83-2.15H164v1.37l1.62 2.6 1.62 2.59 1.03-1.61 1.02-1.62.02 1.83zm-2.64-7.83v-1.33h-2.82l.82 1.33.82 1.34h1.18zm84.71-14.88l-.99-3.12-.4-1.6-.4-1.6 3.16-2.07 3.17-2.07-.88 2.34-.87 2.34 2.1-1.72 2.11-1.7 2.15 2.13 2.14 2.14-.02 1.58-.02 1.57-1.1-1.73-1.1-1.73-1.71 2.06-1.71 2.06 1.16.16 1.16.16 1-.16 1-.16v2.38l-2.1.81-2.11.81h-2.45v-2.58l2.13.82 2.13.82-1.79-2.86-1.78-2.86h-3.69l1.42 1.7 1.42 1.72-1.07 1.73-1.07 1.74zm7.29-5.86v-2.08l-1.34.82-1.33.83V111h2.67zM89.65 101.2l-3-1.5-.7-2.14-.67-2.16 1.27-3.19 1.28-3.2.09 1.82.08 1.8 2-.76 2-.77v3.76l-1.36.84-1.35.83.77 1.25.76 1.24h6.67l-.84-1.36-.83-1.35-1.15.7-1.15.72-.84-1.36-.84-1.35h2.88l-.84-3.34-.84-3.33h2.9l2.12 3.24 2.13 3.25-1.48 2.75-1.47 2.76h-4.06l.82 1.33.82 1.34-1.07-.17-1.08-.16zm-.98-6.2l.82-1.34h-2.82v2.67h1.18zm8.66-2.67l-1.55-2.9-.66.67-.67.67 1.55 2.9 1.55 2.89.67-.67.66-.66zm148.12-25.67l-1.13-3 1.27-2.43 1.28-2.44 1.9.73 1.9.73v-2.6l3 1.67 3 1.68.87 1.21.88 1.21-1.5 2.42-1.51 2.4-3.04-1.98-3.04-2v5.4h-2.75zM248.5 64l.88-3.67h-2.87l.82 1.33.83 1.34h-2.58l.71 2.72.72 2.72.3-.39.31-.39zm7.5.38V63.1l-2.67-1.43-2.66-1.42v4.38l2-.77 2-.77v2.58H256zm-90.33-15.7L164 45.15v-3.16l3.54-2.32 3.54-2.32-.9 2.36-.9 2.35 2.02-1.68 2.03-1.69v3l1.67-.34 1.67-.33.4 4.24.42 4.25-2.83 1.51-2.83 1.52-1.79-1.49-1.78-1.48-.46 1.35-.47 1.34zm7.66.98v-1.33h-2.66l.04-2.33.05-2.34 2.62 3.15 2.62 3.15-.02-3.82-.02-3.81-1.3 2-1.29 2-.02-2.6-.02-2.6-1.6 1.6-1.6 1.6h-3.62l.82-1.33.83-1.34h-2.83v2.44l3 3.43 3 3.42 1 .02 1 .03zm79.27-25.44l-.89-1.44 4.13-4.03 4.13-4.04.79 2.04.78 2.04-1.48 2.77-1.49 2.77H256v-2.67h-2.58l.76 2 .77 2h-1.46zm7.38-5.72l.02-1.16-1.99 1.64-1.98 1.65.82 1.33.82 1.32 1.14-1.8 1.15-1.82.02-1.16zm-11.12 1.8l-.85-4.24.64-1.04.64-1.03 2.7-.7 2.68-.71-.89 1.43-.88 1.44 2.4-.92 2.41-.93-1.68 2.03-1.69 2.03h-3.96l.69 1.8.68 1.78-1.02 1.65-1.02 1.66z" fill="#bb6081"/><path d="M250.67 356.93v-2.08l-1.14.7-1.14.7.63-3.3.63-3.32 1.23-.75 1.23-.76-.92 3.66-.92 3.67 1.92-.74 1.93-.74.2 2.52.18 2.52h-3.83zm6.66-3.26v-1.33H260v2.67h-2.67zm-4.48-3.33l.77-2h1.94v4h-3.48zm-83.52-16.89v-1.55l-.88.88-.88.88-1.56-3-1.55-2.99.55-1.58.54-1.58 2.11.8 2.11.82-.88-1.42-.87-1.42 1.82-.7 1.83-.7-.05 1.56-.04 1.56.25 2.66.25 2.67 1.36-2.33 1.36-2.34h2.72l-2.1 2.1-2.09 2.1v2.63l1.34-.83 1.33-.82v2.54l-2.1.8-2.12.82h-2.45v-1.56zm1.93-2.78l-.92-3-.42-.46-.4-.47-1.52.93-1.52.94 2.43 2.45 2.42 2.45.43.08.42.08-.92-3zm79.28-22l-1.79-2.33 1.12.94 1.11.93 1.85-1.84 1.84-1.84v-2.86h-2.38l-.8 2.09-.8 2.08-1.53-.94-1.52-.94 3.18-2.45 3.18-2.44 1-.03 1-.03-.33 1.66-.34 1.67 1.77-.37 1.76-.36-.77 1.25-.77 1.25 1 .56 1.01.57-1.54-.36-1.54-.36-2.2 2.44-2.21 2.44 1.75.7 1.74.7-1.5.1-1.5.1-1.79-2.33zm6.13-.33l-.83-1.33h2.83v2.66h-1.18zM88 289.29l-3.33-1.54-.98-1.37-.98-1.37v-2.67l1.14 1.8 1.15 1.82 1-1.63 1-1.62-1.83-1.31-1.84-1.31 2.25.72 2.25.72.57-2.93.57-2.93.18 3.67.18 3.67h2.85l-.85-2.67-.84-2.67h2.48l-.32 3-.31 3-.17 1.17L92 286l-1.79-1.49-1.79-1.48-.88.88-.87.87V287h8.15l-.82-1.33-.82-1.33h2.57l-.57-3-.57-3 1.16 2.65 1.15 2.64-.62 2.36-.61 2.35H90.5l.82 1.33.83 1.34-.41-.1-.42-.08zm165.67-29.35l3.66-1.45v-2.15H260l-.33 1.67-.34 1.66-2 .91-2 .9-2.66-.04-2.67-.05 3.67-1.45zm-2.57-1.81l.88-.88-1.66-2.12-1.65-2.12 2.33 1.83 2.33 1.83V259h-3.11zm6.23-4.54v-1.4l1.34.82 1.33.82v1.18h-2.67zm-6-1.25l-.82-1.33h2.82v2.66h-1.18zm-86.52-10.43l-.67-1.09-.58-3.24-.59-3.24 1.78-1.65 1.78-1.66.81 1.32.82 1.32h-2.58l1.55 3.33 1.54 3.32.92.01.92.01.77-1.24.76-1.24-1.35-.84-1.36-.84v-1.94l3-.15 3-.14-1.66.64-1.67.64v2.6l1.37-.84 1.36-.85-.36 1.77-.37 1.76-2.67 1.62-2.66 1.62-1.6.05-1.58.05-.68-1.1zm85.8-30.84l1.93-1.22 1.07.66 1.08.67.8-2.09.8-2.08h2.38l-.34 1.66-.33 1.67-2 .9-2 .91-2.67.08-2.66.07 1.93-1.23zm1.1-4.04l3.04-2.87 2.15.42 2.15.43-5.2 2.44-5.18 2.45zM22.06 194.59l-2.61-1.58-1.66-1.5-1.66-1.51 1.72-2.35 1.72-2.35 2.39 1.34 2.38 1.33-1.5.93-1.5.93v2.51h8.32l-1.66 2-1.66 2-.84-.08-.83-.08zm4.02-5.04l.67-1.1 1.86.72 1.86.71-.76-3.1-.77-3.1.74.66.73.67.46 2.64.46 2.64-2.96.18-2.97.17zm-1.26-4.63l-.8-2.08-1.34.83-1.35.83v-2.66l2.67.2 2.67.2v4.77h-1.05zm226.29-22.7l-.81-2.1-1.13 1.77-1.13 1.78-.02-5.66-.02-5.67 3.67.1 3.66.09-2.66 1.26-2.67 1.27 4.67-.67 4.66-.67-2.33 1.38-2.33 1.37v3.07l1.6-1.6 1.6-1.6H260v2.67l-1.62-.34-1.62-.33-1.36 3-1.37 3h-2.11l-.81-2.11zm2.22-2.55v-3.33h-3.94l1.52 3.33 1.52 3.34h.9zm-85.44-21.66l-.1-2.34-.67 1.67-.68 1.67h-2.6l.97-1.56.96-1.56-1.88.72-1.89.72.17-3.83.16-3.83.17-1.33.17-1.33h6.32l.04 4.33.04 4.33.13 1.83.13 1.83 2.34-1.83 2.33-1.83-1.83 2.34-1.83 2.33H168zm-.76-6.7l-.77-2.97h-1.92l-.1 2.33-.12 2.34.6 1.89.6 1.89 1.25-1.25 1.24-1.25-.78-2.97zm4.01.14l-.2-3.11h2.55l-.82 1.33-.83 1.34h2.83v3.55h-3.34zm80.22-16.66l-1-3.12-.18-1.98-.18-1.98 2.26-.43 2.25-.44 2.14 4.13 2.13 4.12 1.61-.96 1.61-.97-1.83 2.26-1.83 2.25h-3.67v-2.58l2.13.82 2.13.82-1.79-2.86-1.78-2.86h-3.69l1.42 1.7 1.42 1.72-1.07 1.73-1.07 1.74zm8.07-5.88l-2.1-2.1v-1.05l1.9.72 1.9.73.73 1.9.72 1.9h-1.06zm-166.76-7.24l-.83-1.33h-5L86 97.69l-.84-2.66.83-1.34.83-1.35h4.96l.44 1.32.45 1.32 3.56.3 3.56.3-1.27 2.38-1.28 2.38h-4.06l.82 1.33.82 1.34H93.5zm3.98-4.02l-.83-1.35-1.15.7-1.15.72-.85-1.38-.85-1.38-1.27.78-1.26.78.77 1.25.76 1.24h6.67zm-7.98-2.64l.82-1.34h-2.82v2.67h1.18zm5.55-2.23l-.89-.88v-3.56h2.1v5.33h-.32zm151.11-26.44v-2l.34-1 .33-1 1.76.2 1.76.2-.75-1.94-.74-1.93 1.32.81 1.32.82v-2.58l3.32 1.55 3.32 1.54.01 1.55.01 1.56-.8 2.09-.8 2.08-2.86-1.6-2.87-1.58-1 .28-1 .28v-2.66h-2.42l.7 2.66.7 2.67h-1.65zm9.36-3.97l-1.68-2.03h-2.34v4.29l2-.77 2-.77v3.03l.85-.86.86-.86zm-89.04-13.73l-1.65-3.5v-3.16l3.3-2.16 3.29-2.16-.77 2-.77 2.01H172l.02-1.66.02-1.67 1.13 1.78 1.13 1.78 1.18-.45 1.19-.44.23 4.66.23 4.67-1.08-4-1.07-4-.18 1.33-.17 1.34-1.15-1.81-1.15-1.81-.84 1.37-.85 1.37 2.14 2.14 2.15 2.14-.76 1.96-.75 1.97h-2.6l-.9-1.48-.92-1.47-.85 1.37-.85 1.38zm7.68 1.03v-1.33h-2.66v-4h-4.16l.82-1.33.83-1.34h-2.83v2.44l3 3.43 3 3.42 1 .02 1 .03zM252 22.93v-1.41l-1.2.73-1.18.74-.85-3.39-.85-3.38.69-1.11.68-1.11 2.42-.64 2.42-.63.18 2.47.2 2.47h-3.84v2.23l.87.87.88.88 1.63-1.36 1.64-1.35.9 2.33.89 2.33 1.24-1.96 1.24-1.97.02 1.6.02 1.58-1.59.98-1.59.98-.52-1.57-.52-1.57h-2.6l.82 1.34.82 1.33H252zm5.66-5.58l.4-1.21h2.54l.4 1.21.4 1.21h-4.14z" fill="#c45a7c"/><path d="M249.05 352.76l.6-3.13.84-.52.84-.52v7.31h-2.88zm-81.9-20.12l.9-1.45-1.36-.84-1.36-.83.16-2.93.15-2.92.66 2.67.65 2.67 1.26 1.54 1.25 1.55-1.6 1-1.6.99zm4.3-1.16l-.84-2.18 2.36 1.8 2.36 1.82.56.38.55.37h-4.15zm-3-6.42v-1.94l1.49-.57 1.49-.57V327h-2.99zm83.05-15.12l-.66-1.06 1.19-1.92 1.19-1.92-.23 2.98-.22 2.99h-.61zm3.17-7.08v-1.47l-2 .77-2 .76v-1.15l2.68-1.44 2.69-1.44-.35 1.73-.36 1.72 1.77-.37 1.76-.36-.84 1.36-.84 1.37h-2.51zM88.4 289.23l-2.92-1.46.25-3.54.26-3.55 1.7.65 1.7.65-1.61 1.95-1.62 1.95 1.8 1.1 1.79 1.11 1.45-.32 1.46-.33-1.01.57-1.01.56.75 1.22.76 1.22-.41-.17-.42-.16zm5.68-3.42l-.74-1.2 1.92-.73 1.93-.74-.74 1.93-.75 1.94h-.89zm156.9-24.9l.76-.76 4.46-.55 4.46-.54-2.67 1.21-2.67 1.22-2.55.09-2.56.1.77-.77zm.34-8.57l-.82-1.33h2.82v2.66h-1.18zm-83.29-10.38l.04-.95 3.07-2.23 3.07-2.23v3.67l-1.1-.68-1.12-.7v2.55l-2 .77-2 .76zm-4.54-4.01l-.65-1.06 2.58-.19 2.57-.2v2.51h-3.84zm88.5-27.02v-1.7l.9.9.88.88 2.22-2 2.22-2.01v4h-2l-2.11.82-2.11.8zM22.67 194.34l-1.66-2h1.85l2 2 2 2h-2.53zm-4.57-2.88l-.83-2.17.7-.7.7-.7.04 1.9.04 1.88 1.95-2.57 1.94-2.57.56.57.57.57-2.42 2.98-2.41 2.98-.84-2.17zm7.98-1.65l.64-.64 2.58-.19 2.58-.19-.63 1.03-.64 1.02-2.58-.2-2.58-.2zm-.64-6.25l.1-2.55.7 1.75.7 1.75-.8.8-.8.8.1-2.55zm222.69-23.89l-.09-4 1.3-2 1.29-2 .02 1.57.02 1.57 2.33.61 2.33.61-3 .16-3 .15v2.51l1.34.82 1.33.83-.02 1.59-.02 1.58-1.15-1.81-1.15-1.82-.73 1.82-.72 1.81-.08-4zm8.85-2.16l1.64-1.66.75.75.75.74-2.4.91-2.39.91zM168 137.67l-1.43-2.66h1.34l1.42 2.66 1.43 2.67h-1.33zm-5.81-3.82l.26-3.51.1-1.22.12-1.22.9.9.9.9.14 3.29.14 3.29-1.41.54-1.41.54.26-3.5zm9.35-.91l.75-1.93h2.38v2.38l-1.94.74-1.93.74zm-4.87-1.93v-1.34h2.66v2.67h-2.66zm84.68-16.34l-.96-3-.4-1.57-.4-1.58 1.87.72 1.87.72v-3.11l1.54.95 1.53.95-2.13 1.56-2.14 1.56.76 2.9.75 2.9h-1.33zm-158.68-13l-.83-1.33h-4.89l-.8-2.1-.82-2.12V94.5l1.78 2.43 1.78 2.43.02-2.51.02-2.51-1.47-.98-1.46-.98h2.67l1.8 1.15 1.81 1.14-1.5.93-1.49.92.77 1.25.76 1.24h6.67l-.74-1.2-.73-1.2 2.02-.77 2.02-.77-1.4 2.63-1.42 2.64h-4.06l.82 1.33.82 1.34H93.5zm.66-11.33v-2h2.59l-.77 2-.77 2h-1.05zM252 65.75V64.5l1.42-.88 1.42-.88-2.42-2.72L250 57.3l2.97 1.82 2.98 1.83.7 1.82.7 1.81-.76 1.21-.75 1.22H252zm4-1.41v-1.33h-1.18l-.82 1.33-.82 1.33H256zm-11.28.1l-.76-1.25 1.44-.9 1.44-.88.8.8.8.8h-3.26l.82 1.33.82 1.33h-1.33zM165.67 48.7L164 45.14l.05-2.07.06-2.06 2.04 3.77 2.05 3.77 1.61-.62 1.62-.62v4.88l-1.59-1.31-1.58-1.32-.46 1.35-.47 1.34-1.66-3.55zm2.93-5.58l.75-1.22-1.38-.68-1.37-.68 1.62.32 1.61.31.53 1.59.53 1.58h-3.05zm81.94-21.91l-2.12-2.87.54-1.6.55-1.58 2.13.81 2.13.82-.9-1.46-.91-1.47 1.07-.67 1.08-.67.2 2.58.2 2.57h-3.84v2.14l1.57 1.57 1.58 1.58-.58.56-.57.56zm7.46-4.87l.82-1.33H260v2.66h-2.82z" fill="#b54c75"/><path d="M46.02 152.12l16.06-22.45-2.42-1.72 6.95-1.25 1.08 6.96-2.39-1.7-16.05 22.45zm0 76.1l16.06 22.45-2.42 1.71 6.95 1.25 1.08-6.95-2.39 1.7-16.05-22.46zm70.14 37.48l19.55-12.64-1.36-2.1 5.83 1.17-1.32 5.8-1.34-2.07-19.55 12.65zm1.78 39.17l19.55 12.65-1.36 2.1 5.83-1.17-1.32-5.8-1.34 2.07-19.55-12.65zM116.16 75.6l19.55-12.65-1.36-2.1 5.83 1.17-1.32 5.8-1.34-2.07-19.55 12.65zm1.78 39.16l19.55 12.65-1.36 2.1 5.83-1.17-1.32-5.8-1.34 2.07-19.55-12.65zm80.02-82.7l21.26-9.5-1.02-2.28 5.58 2.06-2.19 5.53-1-2.26-21.27 9.5zm-.19 22.81l21.27 9.5-1.02 2.28 5.57-2.06-2.19-5.53-1 2.26-21.27-9.5zm.83 67.1l21.26-9.5-1.02-2.28 5.58 2.06-2.19 5.52-1-2.25-21.27 9.5zm-.19 22.81l21.27 9.49-1.02 2.28 5.57-2.05-2.19-5.53-1 2.25-21.27-9.5zm.5 76.68l21.27-9.5-1.02-2.28 5.58 2.06-2.2 5.52-1-2.25-21.27 9.5zm-.19 22.8l21.27 9.5-1.02 2.28 5.58-2.05-2.2-5.53-1 2.25-21.27-9.5zm-.42 75.95l21.27-9.5-1.02-2.27 5.57 2.05-2.19 5.53-1-2.25-21.27 9.5zm-.19 22.81l21.27 9.5-1.02 2.28 5.58-2.06-2.2-5.52-1 2.25-21.27-9.5z"/></svg>�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mitogen-0.3.9/docs/images/pandora.svg���������������������������������������������������������������0000664�0000000�0000000�00000776526�14656664731�0017600�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version='1.0' encoding='UTF-8'?> <svg xmlns="http://www.w3.org/2000/svg" width="1949" height="1614.282" viewBox="0 0 1949 1614.282"><path d="M1075.846 1613.786c-.268-.268-14.18-.732-30.917-1.03-16.736-.3-31.978-.792-33.871-1.095-1.894-.303-22.144-.723-45-.934-44.649-.412-93.655-1.865-117.058-3.47-7.975-.546-29.35-1.258-47.5-1.58-18.15-.324-35.925-.731-39.5-.906-18.137-.888-27.64-1.871-29-3-1.485-1.232-28.292-2.373-61.102-2.602-15.206-.106-19.726-1.253-9.326-2.366 7.388-.791 9.428-1.335 9.428-2.513 0-.423-24.347-.74-54.105-.707l-54.106.062-1.653-2.191c-1.603-2.126-2.217-2.189-20.145-2.077-26.88.169-72.36-.364-73.29-.857-.439-.234-.36-.952.175-1.597.683-.822 7.942-1.245 24.299-1.413 23.078-.238 28.825-.67 28.825-2.166 0-1.863-32.916-2.145-73.6-.63-21.59.804-37.4.203-37.4-1.422 0-.446 3.6-1.129 8-1.519 7.66-.678 9.996-1.76 6.25-2.895-.963-.292-6.925-.344-13.25-.115-11.625.42-38.975.541-44.5.197-1.65-.103-3.225-.629-3.5-1.17-.746-1.466 6.329-2.532 16.75-2.524 5.505 0 9.25-.397 9.25-.993 0-.558-2.98-1.041-6.75-1.094-3.712-.052-16.2-.545-27.75-1.095-11.55-.551-24.262-.979-28.25-.951-5.408.038-7.25-.29-7.25-1.286 0-1.471 57.804-1.526 65.196-.062 4.899.97 9.386-.106 7.9-1.896-1.165-1.404-2.463-1.446-64.096-2.103-18.975-.202-35.063-.4-35.75-.44-.688-.04-1.25-.73-1.25-1.535 0-1.969 7.432-3.884 12.148-3.13 2.052.328 3.971.208 4.264-.266.702-1.135-9.316-2.142-21.312-2.142-9.378 0-9.674-.071-12.438-3-1.557-1.65-3.442-3-4.188-3-2.028 0-2.698-1.713-1.527-3.901 2.486-4.646 3.4-4.917 14.633-4.344 10.447.534 10.637.504 9.99-1.537-.584-1.837-.156-2.152 3.634-2.68 4.722-.657 13.297-.137 16.054.974 2.25.906 9.289-.38 8.122-1.486-.484-.458-2.905-1.522-5.38-2.363-4.407-1.498-4.205-1.525 9.817-1.329 14.812.208 16.497-.048 15.986-2.426-.24-1.117 1.87-1.511 10.197-1.908 8.041-.383 11.151-.941 13.28-2.385 2.414-1.636 3.892-1.795 11.19-1.203 9.76.792 11.722-.553 9.616-6.595-.609-1.746-.699-3.687-.211-4.557 1.206-2.157 2.313-.038 2.382 4.558.147 9.816 2.985 17.942 7.66 21.932 1.87 1.595 11.302 1.631 12.883.05 2.067-2.067 1.335-2.8-2.8-2.8s-4.867-.733-2.8-2.8c.933-.933.918-1.478-.067-2.45-1.015-1.002-1.524-.902-2.56.5-2.333 3.158-4.422 1.991-7.558-4.222-3.607-7.144-3.78-9.028-.83-9.028 1.203 0 3.293-1.013 4.645-2.25l2.459-2.25-1.566 2.5c-.862 1.375-1.874 4.609-2.249 7.187l-.682 4.686 4.719-.384c2.595-.212 4.823-.52 4.95-.687 1.322-1.725 3.386-7.241 2.964-7.924-1.015-1.642-3.485-.886-4.483 1.372-1.544 3.491-.44-2.903 1.164-6.75 1.24-2.972 1.255-2.977 1.669-.551l.417 2.449 1.725-2.287c1.68-2.227 1.827-2.245 5.581-.676 4.715 1.97 6.83.689 4.01-2.427-1.781-1.968-1.783-2.086-.033-3.366 2.307-1.687-1.25-4.642-5.586-4.642-1.467 0-3.73-.885-5.028-1.967l-2.36-1.967 4-.22c2.2-.122 5.342-.25 6.983-.283 2.013-.043 3.094-.632 3.323-1.813.187-.963 1.207-1.75 2.267-1.75 1.388 0 1.926-.698 1.926-2.5 0-2.67.644-3.011 2.941-1.558 1.05.664 2.517-.165 5.408-3.056l3.968-3.967-2.158-2.919c-2.517-3.403-2.639-4-.82-4 .738 0 1.853 1.125 2.48 2.5 1.366 3 4.163 3.285 4.892.5.287-1.1 1.16-2 1.937-2 .779 0 1.687-.71 2.02-1.577.333-.867 1.72-2 3.08-2.517 2.477-.942 2.569-1.749.715-6.271-.645-1.572-.427-1.758 1.386-1.183 2.796.887 2.767.738-1.349-7.02-1.925-3.63-3.5-7.49-3.5-8.58 0-1.091-.481-2.884-1.07-3.984-1.4-2.616-3.075-11.133-3.366-17.118-.427-8.78-3.377-7.178-6.581 3.572-4.45 14.931-12.515 30.549-19.457 37.678-7.518 7.721-14.526 19.081-14.526 23.546 0 4.335-3.084 8.65-5.712 7.99-1.745-.438-2.56.091-3.782 2.453-1.396 2.7-3.506 4.1-3.506 2.325 0-2.6 4.593-16.252 6.122-18.196 1.033-1.313 1.878-3.377 1.878-4.587s2.815-5.987 6.254-10.615c16.977-22.846 18.9-26.494 24.29-46.095 2.971-10.8 3.615-12.135 8.56-17.754 6.459-7.336 7.839-7.864 13.778-5.265 2.54 1.112 6.14 2.59 8 3.285 3.317 1.24 9.982 7.35 21.328 19.555 6.801 7.314 15.336 12.33 28.73 16.885 12.163 4.137 33.686 7.896 39.992 6.986 9.605-1.385 37.662.111 45.062 2.404 8.825 2.735 13.086.457 8.852-4.732-12.838-15.733-24.845-29.159-41.426-46.319-11.956-12.373-23.15-25.075-28.527-32.366-4.866-6.6-9.868-13.33-11.115-14.954-16.758-21.834-24.568-52.617-19.928-78.546 1.132-6.325 3.207-20.462 4.612-31.416 3.998-31.19 4.52-33.809 12.425-62.369 4.26-15.393 11.184-28.864 19.497-37.935 3.096-3.379 2.954-7.82-.558-17.4-.706-1.924-.531-3.648.655-6.487 3.434-8.22 7.773-10.122 15.302-6.706l3.717 1.686-3 .354c-1.65.195-4.235.84-5.745 1.433-5.88 2.31-6.029 15.027-.207 17.68 2.851 1.299 2.445 3.16-.69 3.16-2.783 0-1.822 2.278 1.45 3.434 2.189.774 4.326.154 12.418-3.604 5.376-2.497 11.078-4.942 12.67-5.435 1.594-.492 3.394-1.795 4-2.895a143.29 143.29 0 0 1 1.356-2.418c.138-.23 1.405.2 2.815.954 3.137 1.679 5.973.265 5.854-2.917-.06-1.583.518-2.119 2.281-2.119 1.299 0 2.62-.675 2.937-1.5.326-.85 1.815-1.5 3.433-1.5 1.82 0 3.24-.715 3.913-1.971.837-1.564 1.7-1.842 4.185-1.345 2.255.45 3.457.18 4.298-.97.796-1.089 2.74-1.598 6.1-1.6 2.713 0 6.057-.057 7.432-.123s4.3-.096 6.5-.067c2.2.03 5.125.02 6.5-.022 5.237-.156 14.667 1.817 18.71 3.915 2.316 1.2 5.691 2.177 7.5 2.169 1.85-.01 6.454 1.603 10.515 3.682 6.513 3.333 7.467 3.568 9.688 2.38 2.086-1.117 3.25-1.06 7.613.366 3.978 1.301 5.472 1.418 6.562.514 1.02-.847 2.172-.883 4.161-.13 5.725 2.164 8.438 2.344 10.278.679 1.454-1.316 2.48-1.43 5.457-.609 4.061 1.122 6.085.698 6.908-1.445.301-.785 1.867-1.422 3.495-1.422 3.493 0 7.191-5.04 7.332-9.99.124-4.36-.385-4.532-9.55-3.207-16.407 2.373-42.12 1.078-59.169-2.979-6.005-1.429-6.689-1.9-5.512-3.804.777-1.258 1.506-1.275 5.208-.122 2.367.738 6.23 1.282 8.582 1.21 2.353-.072 5.667.587 7.365 1.465 2.328 1.204 3.366 1.313 4.222.444 1.123-1.14-.135-2.587-4.356-5.011-.82-.471-1.156-1.192-.746-1.602.41-.41 1.756.167 2.991 1.282 5.35 4.829 17.746 8.286 17.746 4.95 0-1.985.414-1.998 5.5-.165 5.206 1.875 7.5 1.884 7.5.029 0-1.752.441-1.808 4.688-.59 5.54 1.59 7.409-.898 3.189-4.245-2.757-2.186-3.106-2.85-1.903-3.619 3.043-1.943-1.237-13.83-6.744-18.727-5.05-4.491-5.27-6.426-.45-3.933 4.308 2.228 6.006-.756 2.582-4.539-1.282-1.416-1.381-2.119-.457-3.232.768-.926 1.103-4.86.957-11.27-.165-7.268.243-11.235 1.558-15.155 1.121-3.344 1.548-6.548 1.153-8.657-.685-3.65 1.954-18.244 3.674-20.326 2.062-2.494 2.562.358 1.26 7.18-2.773 14.526-.35 43.859 4.468 54.113 1.034 2.2 2.353 5.8 2.93 8 2.198 8.365 13.993 22.592 24.204 29.192 9.677 6.257 12.144 7.44 19.453 9.326 15.57 4.019 32.133 3.487 45.216-1.452 16.761-6.329 23.138-9.154 25.79-11.428 2.787-2.388 7.089-5.598 15.852-11.827 1.694-1.205 6.23-5.142 10.08-8.75 6.622-6.207 7.018-6.427 7.317-4.062.363 2.873.316 2.853 3.462 1.42 1.91-.87 3.091-.677 6.068.995 3.093 1.737 4.025 1.872 5.705.83 1.634-1.011 2.17-.985 2.873.143.533.858 1.866 1.195 3.494.884 1.743-.334 2.925.02 3.5 1.048.92 1.643 6.081-.678 6.081-2.735 0-.479.733-1.151 1.629-1.495 1.35-.518 1.527-.117 1.033 2.354-.788 3.938.862 4.785 4.327 2.223 2.7-1.996 2.78-2 2.292-.13-.723 2.765 2.419 3.673 5.865 1.695 1.733-.995 3.044-1.234 3.42-.624.358.578 2.443.714 5.023.327 2.782-.417 4.411-.282 4.411.366 0 .645 2.324.846 6.25.54 3.438-.267 7.822-.477 9.744-.467 1.973.01 4.366-.763 5.5-1.779 3.702-3.315 4.6-3.472 3.515-.616-1.167 3.068 1.006 4.584 3.547 2.476 1.158-.962 1.81-.989 2.687-.112 1.626 1.626 3.788 1.44 5.945-.512 1.728-1.564 1.933-1.548 3.248.25 1.37 1.874 1.464 1.863 3.93-.455 2.306-2.165 2.668-2.235 4.11-.792 1.533 1.532 4.524 1.293 4.524-.363 0-.448 1.465-1.299 3.256-1.89 2.204-.727 4.133-2.528 5.975-5.577 3.295-5.455 5.438-6.04 3.29-.897-2.258 5.402.682 7.797 3.911 3.187 1.524-2.174 1.567-2.178 2.987-.25 1.4 1.9 1.546 1.856 5.011-1.49 2.72-2.624 3.57-3.034 3.57-1.718 0 2.734 2.866 3.14 5.396.763 1.445-1.358 2.93-1.91 4.015-1.494 1.172.45 2.816-.4 5.155-2.668 1.889-1.83 3.434-2.79 3.434-2.132 0 1.68 2.511 1.49 4-.304.685-.825 2.245-1.5 3.468-1.5 1.222 0 3.037-.9 4.032-2 .996-1.1 2.839-2 4.096-2 1.258 0 2.543-.416 2.857-.923.314-.508 1.882-1.212 3.486-1.564 1.603-.352 4.066-1.791 5.473-3.197 1.718-1.719 3.239-2.38 4.634-2.015 1.452.38 2.831-.302 4.582-2.268 1.566-1.758 3.182-2.634 4.311-2.339 1.192.312 2.52-.53 3.907-2.477 1.587-2.23 2.69-2.838 4.51-2.49 1.326.254 2.714-.032 3.086-.633.372-.602 1.675-1.094 2.895-1.094s2.974-.882 3.896-1.96c.923-1.077 4.1-2.662 7.06-3.523 3.689-1.072 6.349-2.657 8.459-5.04 1.693-1.913 3.757-3.477 4.586-3.477 1.32 0 8.023-6.312 18.266-17.2 1.708-1.815 4.408-4.28 6-5.479 1.593-1.198 4.75-3.701 7.016-5.562 9.912-8.14 14.286-10.221 21.837-10.387 5.877-.13 6.995-.421 6.75-1.764-.225-1.23.538-1.608 3.25-1.608 4.472 0 4.692-2.091.543-5.158-3.28-2.426-3.833-3.842-1.5-3.842 2.553 0 1.667-2.435-2.25-6.18-6.926-6.62-8.408-6.874-21.54-3.695-9.787 2.37-10.629 2.207-8.148-1.58 2.579-3.935 5.063-4.943 8.585-3.485 2.16.895 3.264.93 4.067.126 2.464-2.464-4.306-6.074-11.714-6.244-2.873-.066-2.9-.109-.667-1.004 4.715-1.89 13.425 1.842 25.557 10.95 11.59 8.701 12.267 9.536 12.838 15.829.642 7.088 1.348 7.666 12.526 10.245 5.36 1.237 12.896 3.543 16.746 5.124 9.943 4.084 24.389 9.527 28.5 10.74 1.925.567 7.325 2.47 12 4.229s10.525 3.704 13 4.321c2.475.618 5.175 1.572 6 2.119 2.01 1.333 20.595 8.407 25.02 9.524 1.937.488 6.212 2.09 9.5 3.56 3.29 1.47 8.905 3.686 12.48 4.924 12.824 4.44 20.958 7.504 26.186 9.863 7.338 3.312 9.541 3.885 10.29 2.674 2.23-3.61 8.085 1.88 6.926 6.496-.435 1.732-.073 3.169 1.132 4.501 2.086 2.305 2.184 7.473.186 9.813-1.053 1.233-1.448 5.31-1.566 16.15-.123 11.378-.679 16.76-2.582 25a1094.073 1094.073 0 0 0-4.589 21c-2.746 13.33-4.434 20.21-6.502 26.5-3.541 10.774-8.91 24.366-12.606 31.912-2.131 4.352-3.875 9.174-3.875 10.716 0 1.612-1.182 4.197-2.783 6.087-3.647 4.303-6.818 9.34-12.683 20.138-2.644 4.87-6.213 10.72-7.93 13-1.718 2.28-3.843 5.272-4.723 6.647-2.885 4.508-22.303 23.708-25.752 25.462-2.807 1.427-4.094 1.532-7.692.626-2.377-.599-4.837-1.088-5.466-1.088-.82 0-1.058 4.17-.84 14.75.166 8.112-.012 30.05-.395 48.75l-1.238 60.5c-.297 14.575-1.255 47.229-2.127 72.564l-1.587 46.064 4.268 5.707c2.347 3.139 5.208 5.893 6.358 6.12 2.002.398 5.375.97 14.09 2.392 2.59.423 4 1.18 4 2.146 0 1.694 18.432 3.436 46.598 4.404 15.362.528 21.62 1.632 20.404 3.6-.341.552-1.606 1.016-2.81 1.033-1.72.024-1.869.214-.692.882.825.468 12.975 1.148 27 1.51 14.025.363 29.325 1.04 34 1.506 4.675.466 10.75.65 13.5.409 6.066-.532 8.56.682 6.5 3.163-1.03 1.24-2.26 1.49-4.936.998-2.854-.524-3.319-.404-2.333.604.902.923 7.258 1.32 23.862 1.49 22.947.236 26.038.738 23.488 3.811-.995 1.198-3.179 1.396-11.2 1.016-9.88-.469-16.278.721-10.867 2.021 3.432.825 21.809.908 31.486.143 4.4-.348 9.125-.66 10.5-.695 3.634-.091 16.019 2.73 17.21 3.92 1.497 1.498.028 3.192-2.769 3.192-1.342 0-2.44.426-2.44.948 0 .574 6.593.795 16.75.561 18.54-.427 21.25.225 21.25 5.114 0 2.434.237 2.554 4.25 2.148 2.337-.237 4.963-.752 5.835-1.145.957-.43 2.502.029 3.9 1.161 3.143 2.545 2.169 6.9-1.75 7.832-1.505.357-3.522 1.332-4.483 2.167-1.433 1.246-3.631 1.403-12.25.875-9.771-.597-13.582.227-8.503 1.839 1.1.349 2 1.325 2 2.17 0 1.602-.818 1.6-33.5-.102-4.95-.258-17.325-.701-27.5-.986-10.175-.285-23.225-.815-29-1.177-7.577-.477-10.217-.356-9.484.433 1.336 1.438 29.567 4.009 50.984 4.643 19.43.575 21.5.891 21.5 3.288 0 1.937-25.745 2.083-54 .305-14.814-.932-14.998-.903-13.13 2.09 1.95 3.122.158 4.19-4.795 2.856-2.3-.62-9.22-1.078-15.378-1.02-17.108.164-44.296-.84-52.945-1.953-9.555-1.23-13.752-.563-13.752 2.188 0 1.93-.521 1.969-19.25 1.407-44.075-1.321-71.716-2.503-72.696-3.109-2.024-1.25-29.054-1.863-29.054-.658 0 .619.563 1.167 1.25 1.22.688.051 3.95.274 7.25.493 5.137.342 8.141.67 11.75 1.284.413.07.75.582.75 1.138 0 1.123-44.657.54-68.49-.894-11.653-.7-14.164-.603-15.032.583-1.416 1.936-60.716 1.807-85.297-.186-3.867-.313-5.21-.1-4.914.778.223.665 1.042 1.22 1.82 1.235 1.87.035 3.913 1.357 3.913 2.533 0 .967-3.282 1.325-4.154.453zm145.923-9.005c.148-.117-3.757-.79-8.678-1.494-10.532-1.51-15.797-.439-7.091 1.442 4.436.96 14.577.992 15.769.052zm-153.805-1.964c1.603-1.932.483-3.544-2.464-3.544-3.357 0-3.992-1.66-.928-2.428 5.121-1.286 2.812-5.02-3.322-5.374-2.888-.166-5.25-.698-5.25-1.182 0-1.27 3.682-2.251 5.859-1.56 2.02.64 4.696-1.749 3.722-3.325-.325-.526-2.39-1.26-4.586-1.631-5.18-.875-5.156-2.5.037-2.5 4.432 0 6.095-1.937 3.916-4.562-2.885-3.477.59-4.41 18.591-4.99 9.329-.301 19.886-.966 23.461-1.478 3.575-.511 11-.945 16.5-.964 5.5-.02 16.525-.484 24.5-1.033 25.539-1.758 83.57-3.023 95.5-2.082 7.841.619 17-.4 17-1.892 0-.965-1.177-1.612-3.31-1.816-4.05-.39-3.772-2.544.387-3.01 3.677-.41 4.027-.808 4.867-5.527.874-4.912-1.205-4.618-2.827.399-2.24 6.933-4.09 4.332-4.402-6.187-.259-8.774-.47-9.691-2.346-10.182-3.278-.857-5.127.295-4.355 2.712.371 1.162.552 5.263.403 9.113-.15 3.85-.304 8.237-.344 9.75-.066 2.504-.412 2.75-3.868 2.75h-3.795l.603-3.75c.331-2.063.783-4.654 1.003-5.759.22-1.104-.018-2.68-.529-3.5-1.653-2.652-4.447.178-4.794 4.856-.22 2.966-.895 4.458-2.377 5.251-3.048 1.631-3.783-.266-3.8-9.813-.017-9.34.932-10.563 8.12-10.464 2.55.035 4.142-.495 4.75-1.581.71-1.269 2.532-1.646 8.147-1.687 7.043-.052 10.926-1.928 8.668-4.187-1.322-1.321-10.594-2.021-16.953-1.28-3.436.4-8.048.405-10.248.01l-4-.717 6-.883c3.3-.486 6.9-.945 8-1.019 4.884-.33 5.582-.536 5-1.477-.34-.55-2.391-1-4.559-1-3.537 0-3.94-.256-3.94-2.5 0-3.027-2.012-3.25-4.5-.5-.996 1.1-2.43 2-3.188 2-.757 0-3.05.705-5.095 1.567l-3.718 1.566 2.5 1.398c3.661 2.047 3.743 2.04-32 3.025-46.665 1.287-49.179 1.243-45.538-.794.942-.527 13.486-1.149 27.875-1.381 14.39-.233 27.738-.771 29.663-1.197l3.5-.775-5-1.454c-2.83-.824-8.255-1.365-12.5-1.248-4.125.113-22.103.399-39.95.633l-32.452.427-2.049 2.566c-2.941 3.684-9.558 4.647-12.229 1.78-2.784-2.988-10.638-5.09-19.07-5.102-4.16-.01-7.25-.437-7.25-1.011 0-.55.45-1 1-1 1.842 0 1.025-2.857-1-3.5-3.727-1.183-6.192.348-5.516 3.427.75 3.409-1.456 5.548-4.841 4.698-1.311-.329-8.307-.67-15.546-.757-16.884-.204-24.477-1.612-24.912-4.62-.235-1.63.329-2.339 2.249-2.82 2.376-.597 6.83-5.996 14.58-17.675 1.437-2.166 4.31-4.61 6.807-5.789 2.376-1.122 4.176-2.404 4-2.85-1.875-4.728-5.478-11.061-6.164-10.833-.477.159-1.463 2.024-2.192 4.144-2.743 7.979-15.27 23.931-22.586 28.76-10.224 6.75-19.365 9.07-33.823 8.583l-12.556-.423-10.236-4.956c-14.056-6.804-19.904-11.845-26.444-22.796l-5.32-8.908-.862 4.019c-1.114 5.186.75 9.237 7.978 17.337 5.479 6.14 6.04 7.377 4.468 9.858-.67 1.057-2.075 1.227-5.735.695-2.667-.388-8.674-.896-13.349-1.13-25.274-1.263-26.805-1.872-20.852-8.284 7.894-8.505 13.694-18.306 15.303-25.86 1.22-5.73 6.55-6.77 6.55-1.28 0 3.48 1.108 5.115 2.616 3.863 1.642-1.362 1.775-5.09.353-9.91-2.188-7.42-2.771-25.07-1.336-40.406 3.21-34.284 13.339-52.534 35.116-63.267 7.5-3.696 8.068-3.815 17.552-3.662 11.27.182 15.997 1.97 25.913 9.802 7.27 5.742 13.802 19.431 13.79 28.896 0 2.12.72 6.62 1.605 10 2.32 8.852 1.535 33.534-1.355 42.644-1.134 3.575-2.636 8.525-3.337 11-2.45 8.644-8.22 18.302-14.98 25.073-10.646 10.66-21.584 11.445-35.019 2.512-6.999-4.654-8.982-7.095-15.364-18.916-6.376-11.809-8.152-25.355-6.38-48.669.65-8.558 6.433-21.852 13.162-30.256 10.091-12.603 28.128-11.844 36.964 1.556 10.662 16.17 11.456 31.448 3.135 60.37-3.712 12.901-9.675 19.33-17.93 19.33-5.247 0-5.427-.099-10.366-5.73-3.982-4.54-5.158-5.385-5.663-4.07-.878 2.289 1.934 7.837 5.941 11.72 8.477 8.217 18.427 4.72 26.445-9.294 2.276-3.978 4.137-7.768 4.137-8.425 0-.656.891-3.782 1.98-6.947 13.61-39.56-5.792-80.78-33.53-71.237-3.195 1.1-6.68 2.783-7.743 3.741-3.777 3.404-10.908 13.563-12.31 17.535-.783 2.219-1.943 4.66-2.577 5.425-3.61 4.35-7.76 38.525-5.8 47.782 1.207 5.703 6.82 20.283 8.117 21.085.475.293.863 1.57.863 2.836 0 4.076 15.567 18.04 22.11 19.834 12.232 3.355 16.298 3.93 20.39 2.882 2.2-.564 5.955-1.512 8.343-2.107 2.595-.646 7.491-3.478 12.162-7.033 8.723-6.64 12.254-11.691 23.688-33.881 3.51-6.811 7.04-13.324 7.845-14.473.804-1.148 1.462-3.577 1.462-5.397 0-4.181 1.717-4.886 8.238-3.38 5.442 1.256 7.762.418 7.762-2.8 0-1.415-1.064-1.691-6.512-1.691-8.978 0-10.629-1.958-1.855-2.2 7.403-.204 10.162-1.513 8.19-3.888-.807-.973-2.858-1.38-6.262-1.243-7.525.304-8.56.108-8.56-1.616 0-1.332 1.05-1.486 6.882-1.007 5.396.444 7.151.243 8.123-.928 1.95-2.35-.524-4.493-5.187-4.493-2.37 0-3.69-.398-3.319-1 .34-.55 2.306-1 4.368-1 5.11 0 7.751-1.975 6.291-4.703-.884-1.651-.72-2.384.848-3.803 2.685-2.43 3.409-5.287 1.826-7.205-1.036-1.255-1.058-1.707-.096-2.03 7.977-2.685 5.948-7.259-3.22-7.259-9.236 0-15.517-1.052-15.517-2.598 0-1.533 10.928-1.056 17.054.744 4.555 1.339 11.297-1.085 10.761-3.87-.372-1.934-3.864-2.972-10.624-3.158-2.37-.065-4.07-.503-3.78-.973.29-.47 4.178-.667 8.639-.437 8.065.415 13.931-1.312 12.472-3.673-.58-.937-10.474-2.233-19.522-2.557-11.362-.407-12.536-.532-14-1.493-2.22-1.458.72-3.202 4-2.373 1.375.348 3.845.806 5.489 1.018 1.643.213 3.68.606 4.524.874 4.918 1.56 25.705 1.424 30.237-.198 7.465-2.673 6.031-3.921-5.36-4.668-13.196-.865-16.694-2.645-4.39-2.234 8.837.295 28.658 2.112 37.473 3.434 3.388.509 4.773 1.272 5.708 3.149 2.065 4.14 9.935 7.665 16.867 7.552 4.451-.073 5.952-.458 5.952-1.528 0-2.29-6.418-6.01-10.398-6.026-5.076-.022-7.142-1.527-3.182-2.319 4.27-.854 4.142-3.647-.17-3.724-5.067-.09-10.693-.789-11.787-1.465-2.284-1.411.482-2.637 4.567-2.025 4.707.706 6.677-.673 4.324-3.027-1.346-1.346-24.346-5.083-37.604-6.111-3.437-.267-6.25-.82-6.25-1.232 0-.984 9.344-.317 20.26 1.446 8.673 1.4 13.74.856 13.74-1.478 0-2.458-12.37-6.444-23.446-7.555-4.18-.419-6.37-1.002-5.5-1.465 1.016-.54 28.234 2.24 28.468 2.908.764 2.183 10.765 9.107 15.19 10.515 3.183 1.014 5.226 2.04 4.538 2.279-1.783.62-1.547 3.94.332 4.661.87.334 3.12.607 5 .607 4.38 0 4.664-2.704.451-4.294-2.433-.918-2.862-1.54-2.381-3.453.735-2.93-1.715-5.789-6.24-7.282-2.964-.978-3.21-1.322-2.154-3.013 1.715-2.745-.14-4.196-6.505-5.09-12.892-1.81-14.753-2.17-14.753-2.851 0-.398 2.185-.513 4.855-.257 5.116.492 9.145-.909 9.145-3.179 0-1.769 3.33-2.588 6.764-1.665l2.736.736-2.25 1.21c-3.226 1.733-2.796 2.936 1.693 4.732 3.287 1.315 3.995 2.105 4.25 4.742.302 3.11.407 3.17 6.057 3.464 4.385.229 5.75-.03 5.75-1.09 0-1.44-4.005-3.71-6.547-3.71-.799 0-1.453-.45-1.453-1s.649-1 1.441-1c.793 0 1.732-.47 2.086-1.044.979-1.583-1.475-3.956-4.09-3.956-3.147 0-3.95-1.655-1.452-2.992 3.685-1.972.963-4.743-7.257-7.392-1.494-.48-1.58-.88-.545-2.537 1.833-2.936-1.253-5.834-7.048-6.62-8.553-1.158-10.663-2.607-5.635-3.87 3.274-.821 3.174-2.352-.25-3.807l-2.75-1.168 2.835-.381c3.892-.524 5.27.172 6.844 3.453 2.208 4.608 17.852 8.019 18.626 4.061.389-1.986-.386-2.34-7.055-3.234-5.48-.733-6.407-2.513-1.309-2.513 3.734 0 4.892-.969 3.985-3.332-.747-1.948-6.474-4.668-9.827-4.668-3.135 0-3.443-1.546-.462-2.325 1.783-.467 2.035-1.064 1.525-3.617-.546-2.73-.354-3.058 1.782-3.058 4.344 0 5.516.953 4.909 3.99-.535 2.674-.3 2.884 4.955 4.411 6.144 1.786 8.692 1.335 8.692-1.54 0-2.082-.567-2.384-6.25-3.328-4.475-.744-5.005-2.533-.75-2.533 2.246 0 3-.462 3-1.84 0-2.278-3.868-4.12-10.232-4.874-7.41-.877-6.912-3.095.548-2.444 1 .087 2.757-.346 3.906-.96 1.745-.934 2.366-.755 3.752 1.083 2.272 3.012 7.384 2.534 7.848-.733.25-1.76-.421-2.583-3-3.675-3.402-1.442-3.404-1.438 1.678-3.026 1.815-.566 1.998-3.454.25-3.945-.687-.194-4.4-.9-8.25-1.57-13.974-2.433-24.65-5.265-23.642-6.273.641-.642 2.665-.577 5.847.186 8.727 2.094 25.731 3.98 26.77 2.969.632-.614.507-1.697-.352-3.073-2.217-3.55 5.688-2.265 42.877 6.976 3.575.888 5.673 1.787 4.663 1.997-1.852.385-14.067-1.71-25.163-4.317-8.317-1.954-16.671-2.309-17.226-.731-.242.687.16 1.41.893 1.608.733.198 2.91.862 4.838 1.477 1.927.614 7.09 1.616 11.473 2.225 4.383.61 8.733 1.517 9.666 2.017.934.5 4.724 1.337 8.422 1.861 7.325 1.037 11.094 3.062 5.7 3.062-1.725 0-4.335-.456-5.802-1.014-1.466-.557-9.033-2.097-16.815-3.422-7.782-1.325-14.932-2.716-15.89-3.09-2.117-.828-3.583 2.102-1.896 3.789.621.62 6.193 1.95 12.383 2.953 6.19 1.003 14.18 2.3 17.754 2.882 13.005 2.116 21 2.258 21 .372 0-2.022 8.775-1.665 23 .936 4.675.855 9.936 1.563 11.691 1.574 5.731.036 5.367-4.076-.399-4.504-5.088-.377-10.292-1.686-10.292-2.587 0-1.088-.517-1.102 6.35.168 6.243 1.154 9.65.59 9.65-1.596 0-1.76-7.827-4.053-18.5-5.418a723.79 723.79 0 0 1-14.5-2.02c-3.575-.547-8.975-1.25-12-1.563-3.025-.312-6.85-.98-8.5-1.484-1.65-.503-10.65-2.477-20-4.385-9.35-1.909-20.113-4.2-23.918-5.092-3.806-.891-11.456-2.481-17-3.533-11.118-2.109-30.57-6.159-37.582-7.824-6.21-1.476-19.92-3.888-29.5-5.19-12.296-1.672-12.379-1.699-11.813-3.862.326-1.248-.2-2.295-1.507-2.994-3.31-1.77-20.945-2.474-30.203-1.204-8.88 1.218-10.364 1.339-36.977 3.012-23.601 1.484-39.098 2.293-50 2.61-12.163.353-72.082 4.14-86.558 5.47-13.623 1.252-23.146 1.303-23.871.13-.727-1.176 2.876-2.08 8.43-2.116 4.986-.032 7.618-1.188 6.568-2.886-.412-.667-3.963-1.118-8.878-1.127-7.48-.014-12.188-1.043-10.047-2.197 1.407-.758 26.519 1.918 31.052 3.309 3.368 1.033 6.521 1.05 16 .089 6.492-.66 18.554-1.425 26.804-1.7 8.25-.277 21.975-.972 30.5-1.545 8.525-.574 18.875-.968 23-.878 4.125.091 15.15-.645 24.5-1.635s19.025-1.74 21.5-1.665c2.475.075 10.527-.741 17.892-1.813 7.365-1.073 17.548-1.95 22.628-1.95 10.333 0 10.025.184 13.396-8 12.42-30.15 13.92-33.92 21.882-55 2.805-7.425 8.07-20.7 11.698-29.5 6.583-15.96 22.571-55.937 29.196-73 1.922-4.95 4.352-10.83 5.401-13.066 1.05-2.236 1.907-5.036 1.907-6.223 0-1.187.871-4.082 1.935-6.434 3.14-6.943 9.065-22.458 9.065-23.74 0-2.688-3.17.062-12.613 10.942-10.453 12.045-13.769 14.407-31.887 22.715-7.15 3.279-30.38 15.083-50.5 25.662-7.975 4.193-15.09 7.628-15.811 7.634-.722.01-5.222 1.09-10 2.41-14.237 3.934-22.41 5.605-27.402 5.602-2.592 0-7.092.943-10 2.098-5.124 2.036-6.352 2.083-39.98 1.512-19.083-.323-37.8-.876-41.593-1.229l-6.899-.641-2.907 4.374c-13.553 20.388-38.841 33.568-66.408 34.613-11 .417-13.16.221-18-1.627-4.6-1.757-7.698-2.101-18.932-2.102h-13.432l-12.95 7.174c-7.122 3.946-17.053 8.84-22.068 10.878-19.161 7.784-19.433 7.94-32.118 18.365-3.3 2.712-9.015 6.885-12.701 9.274-3.686 2.389-6.975 4.785-7.31 5.326-.333.54-2.055.983-3.825.983s-4.247.72-5.503 1.6c-1.257.88-3.093 1.39-4.08 1.13-.988-.257-2.568-.037-3.512.491-1.26.705-2.048.505-2.968-.753-1.879-2.57-5.04-1.04-7.046 3.41-1.134 2.516-2.94 4.412-5.25 5.513-2.77 1.322-3.404 2.12-2.977 3.754.389 1.486-.01 2.22-1.392 2.582-2.55.667-2.463 1.76.987 12.595 5.574 17.5 6.077 19.581 6.077 25.126 0 4.487.417 5.91 2.143 7.312 6.696 5.438 8.857 7.59 8.857 8.82 0 2.988 4.63 4.68 10.232 3.742 5.321-.892 13.803-.471 45.268 2.249 17.646 1.525 25.16 2.455 34.5 4.27 3.025.588 9.325 1.758 14 2.602 17.582 3.172 30.605 7.17 33.084 10.157.964 1.163.439 1.4-3.1 1.4-2.702 0-4.68-.57-5.4-1.555-1.417-1.938-11.833-.553-19.023 2.529-6.113 2.62-5.8 1.688.506-1.508 2.792-1.415 4.876-3.106 4.642-3.767-.575-1.625-9.609-1.086-11.642.695-.862.755-3.573 2.382-6.024 3.616-8.738 4.396-19.305 12.802-33.928 26.99-8.169 7.925-20.569 16.879-21.746 15.702-.209-.21 1.957-2.35 4.813-4.758 2.855-2.408 10.308-9.198 16.56-15.088 11.34-10.682 16.96-15.12 29.258-23.104 5.92-3.843 6.264-4.249 3.857-4.542-1.723-.21-4.577.915-8.201 3.234-3.058 1.956-5.838 3.556-6.178 3.556-1.52 0-14.364 9.884-17.996 13.849-2.76 3.014-4.639 4.261-6 3.986-3.763-.76 17.322-18.851 28.041-24.059 5.083-2.469 5.232-2.783 2.496-5.26-2.316-2.095-9.786-1.554-13.668.99-3.34 2.188-5.277 1.928-4.61-.62.465-1.78.213-2.017-1.594-1.5l-4.245 1.213c-1.798.513-1.999.283-1.4-1.602.65-2.05.468-2.151-2.652-1.492-3.268.691-13.154 6.56-14.373 8.533-1.074 1.738-8.34 4.993-8.948 4.009-.53-.86 8.41-7.748 14.086-10.852 1.312-.717 2.385-1.955 2.385-2.75 0-2.03-3.894-1.807-7.568.434-5.253 3.203-7.815 3.707-6.517 1.281.597-1.116 1.085-2.332 1.085-2.704 0-.775-5.705-.109-8.118.948-1.138.498-1.778.101-2.153-1.335-.53-2.025-.59-2.02-6.16.443-6.9 3.052-6.749 3.053-5.967-.062.682-2.715-.721-2.773-7.417-.304-3.436 1.267-4.052 1.063-3.474-1.147.786-3.006-1.46-2.458-5.728 1.397-8.018 7.244-22.189 8.112-35.483 2.172a465.592 465.592 0 0 0-10.5-4.498c-3.025-1.245-9.325-4.119-14-6.386l-8.5-4.122 4.5-.531 4.5-.532-3.216-1.357c-1.77-.747-3.737-1.984-4.372-2.75-2.87-3.458 14.005 2.677 19.06 6.93 2.998 2.523 14.011 3.215 14.776.928.23-.687-.181-1.411-.914-1.609-2.243-.604-9.19-2.863-11.8-3.837-3.432-1.28-.915-2.769 4.716-2.79 2.891-.01 4.25-.446 4.25-1.363 0-.741-1.912-2.168-4.25-3.17l-4.25-1.82 4.5-.58c6.32-.816 5.485-2.188-3.09-5.082-8.182-2.76-9.276-4.681-2.373-4.167 5.864.437 5.65-.935-.602-3.863-6.82-3.195-7.123-4.196-1.022-3.387 3.079.409 5.087.293 5.087-.293 0-1.07-4.333-3.29-6.424-3.29-.732 0-1.89-.673-2.573-1.497-1.089-1.311-.5-1.42 4.74-.872 7.317.765 8.927-.695 4.635-4.205l-2.878-2.354 3.282-.036c3.108-.034 5.94-2.938 3.648-3.742-3.23-1.133-3.937-2.326-2.18-3.673 2.771-2.123 2.103-3.298-3.25-5.717-5.48-2.477-6.67-4.488-2.118-3.577 3.836.767 4.735-.353 1.963-2.444-1.867-1.408-2.032-1.952-.978-3.221 1.061-1.28.841-1.807-1.351-3.243-1.44-.944-2.258-2.025-1.817-2.402 1.195-1.023 10.052-4.29 16.288-6.009 9.328-2.57 6.99-7.92-6.43-14.713-8.455-4.28-12.158-4.083-22.072 1.177-6.51 3.454-9.485 4.314-9.485 2.744 0-.43 3.915-2.793 8.7-5.25 9.895-5.08 11.417-6.966 5.62-6.966-5.987 0-24.587 7.65-25.71 10.573-.447 1.167-1.027 1.275-2.529.47-3.603-1.928-4.08-1.25-4.08 5.788 0 19.641 6.142 37.877 18.547 55.067 4.74 6.569 2.695 8.797-4.64 5.055-3.126-1.594-3.88-2.466-3.41-3.944.434-1.37-.177-2.38-2.198-3.633-4.26-2.64-5.486-4.446-4.13-6.08.883-1.064.517-2.013-1.647-4.272-1.825-1.905-2.558-3.49-2.13-4.605.36-.935-.056-2.783-.923-4.105-.866-1.323-1.322-3.202-1.013-4.176.354-1.117-.36-2.638-1.935-4.117-1.938-1.821-2.243-2.652-1.362-3.713.874-1.053.642-1.89-1.013-3.651-2.1-2.236-2.932-4.26-1.349-3.282 2.833 1.751 3.47-1.486.833-4.238-2.818-2.941-2.822-2.964-.72-4.09 1.772-.947 1.934-1.469.999-3.216-.825-1.542-.82-2.268.019-2.786.624-.386 1.233-3.002 1.353-5.813l.218-5.112 5-.679c5.083-.69 11.582-3.427 14.75-6.212 5.39-4.738-3.783-15.229-13.315-15.229-4.678 0-20.958 6.734-24.639 10.192-1.89 1.776-3.1 2.017-8.011 1.591-6.583-.57-8.285-.205-8.285 1.778 0 .766-1.237 2.18-2.75 3.143-3.406 2.168-4.202 3.256-3.576 4.888.275.716-.9 1.99-2.683 2.913-2.597 1.343-3.063 2.072-2.572 4.028.457 1.818.061 2.67-1.66 3.577-3.132 1.65-3.789 2.965-2.595 5.197.853 1.593.426 2.407-2.545 4.856-3.068 2.529-3.405 3.207-2.397 4.82.982 1.573.775 2.214-1.275 3.947-2.416 2.043-2.422 2.088-.466 3.598 1.941 1.5 1.922 1.577-1 3.931-2.735 2.204-2.867 2.588-1.602 4.663 1.254 2.059 1.142 2.45-1.25 4.358-3.204 2.554-3.388 5.304-.429 6.399 2.191.81 2.189.82-.5 2.582-2.963 1.942-3.331 3.555-1.485 6.51 1.02 1.634.86 2.321-1 4.301-2.397 2.551-2.807 4.736-1.193 6.35.696.696.377 1.766-1 3.353-2.545 2.935-2.533 3.681.08 5.08 2.098 1.122 2.097 1.13-.5 3.84-3.406 3.555-3.419 6.105-.03 6.105 2.532 0 2.513.056-1.24 3.596l-3.813 3.595 2.339 1.894 2.339 1.894-2.598 3.088c-3.147 3.74-3.308 5.935-.49 6.672 1.963.513 1.855.78-1.578 3.925-5.008 4.588-3.99 7.066 1.97 4.797 1.48-.563 1.154.136-1.25 2.687-3.547 3.763-4.131 6.3-1.668 7.245 1.386.532 1.312 1.043-.598 4.133-2.6 4.209-2.106 6.58 1.195 5.717 2.256-.59 2.247-.538-.439 2.655-3.084 3.664-3.532 6.102-1.123 6.102 1.608 0 1.58 1.14-.133 5.31-.559 1.36-.2 1.952 1.443 2.381 1.202.315 1.998 1.076 1.767 1.69-2.207 5.888-1.114 8.214 2.375 5.057 2.365-2.14 3.49-1.351 2.012 1.41-1.483 2.771-1.39 9.152.132 9.152.666 0 2.201-1.237 3.41-2.75 3.07-3.841 3.793-2.386 1.417 2.851-3.429 7.557-2.105 11.039 2.364 6.22 3.67-3.957 4.22-2.214 1.21 3.827-3.296 6.615-1.95 9.122 2.198 4.093 1.478-1.792 3.026-3.255 3.438-3.25 1.467.018.72 3.726-1.077 5.353-1.251 1.132-1.688 2.599-1.386 4.655.536 3.654 1.182 3.728 4.226.488 3.06-3.257 4.698-1.761 2.572 2.349-3.312 6.405-.992 10.653 3.566 6.528 2.54-2.298 3.618.62 1.942 5.257-1.885 5.211.86 7.77 3.09 2.88 1.146-2.519 3.817-3.474 3.817-1.367 0 .624-.532 2.91-1.182 5.079-1.38 4.608.34 6.86 3.238 4.237 3.61-3.268 4.794-1.443 2.743 4.229-1.535 4.247.064 6.512 3.213 4.546 2.887-1.803 3.072-1.598 2.392 2.65-.738 4.616.824 6.134 3.665 3.563 2.445-2.212 3.198-1.467 3.328 3.293.103 3.77.5 4.041 3.942 2.702 1.582-.615 1.812-.242 1.649 2.676-.294 5.235-.088 6.146 1.262 5.594 4.944-2.021 4.75-2.108 4.75 2.131 0 4.505 1.144 5.903 3 3.666 1.496-1.802 3.364-.89 2.546 1.242-1.128 2.939.437 5.48 2.982 4.84 1.984-.497 2.387-.168 2.655 2.166.232 2.01.95 2.842 2.663 3.084 2.063.293 2.273.723 1.738 3.572-.772 4.118.031 4.895 3.03 2.93 2.339-1.533 2.386-1.502 2.386 1.551 0 3.284 1.637 4.078 3.848 1.867.998-.997 1.196-.476.99 2.593-.187 2.773.216 4.106 1.452 4.797.976.547 1.71 2.155 1.71 3.748 0 1.966.701 3.109 2.376 3.872 1.75.797 2.265 1.697 1.954 3.41-.514 2.827 5.716 6.828 10.63 6.828 2.682 0 19.995 4.178 28.54 6.887 16.938 5.37 40.039 18.937 52.511 30.84 11.944 11.398 21.271 25.274 16.989 25.274-.55 0-1-.435-1-.966 0-1.866-6.23-8.034-8.113-8.034-1.212 0-3.034-1.834-5.003-5.034-2.448-3.978-3.38-4.8-4.447-3.914-1.416 1.175-3.437.51-3.437-1.131 0-.529-1.141-2.769-2.536-4.978-2.485-3.936-5.113-4.561-3.964-.943 1.264 3.983-1.639 2.941-3.495-1.255-3.567-8.064-10.28-13.867-8.67-7.495.61 2.412-2.53-.746-6.673-6.712-2.119-3.052-3.87-2.893-4.653.422-.513 2.173-.772 2.035-4.344-2.325-4.002-4.883-6.252-5.987-5.376-2.635.797 3.046-1.168 2.415-6.514-2.093-4.308-3.633-7.78-4.61-7.773-2.189 0 .43 5.881 7.082 13.065 14.782 7.185 7.7 14.647 16.7 16.583 20 8.772 14.951 15 22.52 31.14 37.843 3.966 3.765 7.21 7.252 7.21 7.75 0 1.158-1.713 1.18-2.422.033-.297-.48-2.985-2.07-5.974-3.532-8.797-4.303-29.572-28.49-33.622-39.141-1.064-2.8-10.98-16.453-11.948-16.453-.396 0-3.09-2.813-5.989-6.25-7.143-8.474-14.608-14.636-23.74-19.599-8.445-4.59-9.305-4.835-9.305-2.651 0 2.203-1.279 1.855-5.5-1.5-4.17-3.314-6.5-3.828-6.5-1.433 0 1.992-2.972 1.141-8.278-2.37-2.649-1.753-4.12-2.2-4.85-1.47-.73.73-.217 1.612 1.69 2.91 1.506 1.024 3.908 2.989 5.338 4.366 1.43 1.377 4.4 3.804 6.6 5.395 5.718 4.135 17.316 16.243 22 22.967 6.556 9.413 9.227 12.922 13.044 17.135 1.994 2.2 7.222 8.6 11.618 14.224 4.397 5.623 11.38 13.386 15.517 17.25 4.138 3.864 7.23 7.026 6.872 7.026-4.429 0-21.466-14.533-29.308-25-1.442-1.925-4.05-5.075-5.795-7-4.216-4.65-12.148-15.127-16.864-22.274-6.002-9.095-21.458-23.753-35.3-33.476-3.68-2.585-7.284-2.956-7.284-.75 0 2.22-1.54 1.845-6.159-1.5-7.316-5.3-9.638-2.176-3.53 4.747 7.886 8.935 9.502 13.922 10.769 33.242 1.152 17.568 3.29 26.4 7.911 32.684 2.85 3.876 11.415 10.327 13.711 10.327.566 0 2.188.912 3.607 2.028 1.418 1.116 7.216 3.404 12.885 5.085 5.668 1.68 11.656 3.652 13.306 4.381 3.021 1.335 13.547 2.841 32 4.578 5.5.517 12.612 1.643 15.805 2.501 3.203.862 7.103 1.276 8.7.925 1.922-.422 4.47.06 7.572 1.433 2.573 1.138 5.857 2.083 7.3 2.1 1.442.017 3.496.693 4.564 1.5 2.62 1.982 8.559 1.96 8.559-.032 0-.825.69-1.5 1.532-1.5.842 0 3.147.675 5.122 1.5 5.448 2.277 7.735.968 3.597-2.058-2.898-2.12-.527-2.89 4.74-1.54 4.836 1.239 11.009.75 11.009-.873 0-.446-1.125-1.094-2.5-1.44-4.067-1.02-2.855-2.589 2-2.589 3.333 0 4.5-.389 4.5-1.5 0-.825-.675-1.5-1.5-1.5-2.715 0-1.564-1.737 1.566-2.363 2.95-.59 3.29-2.637.44-2.637-.757 0-2.643-.5-4.191-1.11-3.501-1.38-1.183-2.705 4.935-2.82 2.062-.038 3.75-.543 3.75-1.12 0-1.346-6.188-3.95-9.386-3.95-3.516 0-5.614-.993-5.614-2.66 0-1.15 1.536-1.404 7.52-1.246 4.136.11 7.835-.116 8.22-.502.93-.93-1.726-2.553-4.24-2.592-3.536-.054-10.883-2.648-11.334-4.002-.344-1.032.933-1.184 5.982-.713 11.14 1.04 11.898-1.78 1.375-5.113-7.34-2.325-8.866-4.75-2.447-3.888 5.175.694 10.141-.131 9.65-1.604-.362-1.088-2.167-1.786-9.476-3.664-6.279-1.614-5.46-3.42 1.236-2.73 9.286.96 7.73-2.982-1.636-4.143-3.076-.381-5.375-1.209-5.649-2.034-.347-1.046.24-1.257 2.368-.85 5.975 1.141 9.487-2 4.682-4.19l-2.748-1.252 2.947-1.544 2.947-1.545-2.699-2.151c-3.03-2.416-3.419-3.577-1.198-3.577 2.074 0 1.886-2.722-.269-3.876-.972-.52-3.447-1.261-5.5-1.646-4.343-.815-4.995-2.47-.981-2.493 7.87-.044 4.329-4.77-4.303-5.743-6.026-.68-5.263-2.756.873-2.378 2.759.17 4.68-.14 4.68-.753 0-1.59-3.49-3.109-7.185-3.126-5.477-.025-6.702-1.411-3.892-4.403 1.968-2.094 2.155-2.783 1.101-4.052-1.083-1.305-.893-1.53 1.294-1.53 7.494 0-.334-5.937-9.086-6.892-7.622-.831-8.683-3.46-1.194-2.96 9.738.65 7.508-2.36-5.038-6.803l-6.5-2.302 7.333-.021c5.397-.015 7.232-.351 6.95-1.271-.537-1.747-9.477-5.9-14.012-6.508-2.278-.305-3.771-1.048-3.771-1.874 0-1.74 1.235-1.719 8.371.14 5.7 1.485 8.229 1.272 7.074-.596-.91-1.473-9.484-5.576-14.437-6.91-3.937-1.06-4.256-1.348-2.733-2.462 2.76-2.018 2.037-3.193-2.801-4.548-7.79-2.18-6.123-3.774 3.276-3.129 5.15.353 3.824-1.303-3.887-4.857-6.662-3.07-6.99-3.368-4.933-4.47 2.766-1.48 1.372-2.86-4.461-4.418-2.217-.593-4.917-1.747-6-2.566-1.858-1.405-1.757-1.49 1.78-1.52 6.732-.058 2.382-3.465-7.008-5.492-4.332-.935-3.146-2.54 1.877-2.54 10.04 0-2.914-4.247-19.783-6.485-6.141-.815-13.341-2.4-16-3.52l-4.835-2.04 8 .465c21.08 1.223 34.463 4.558 44.5 11.09 6.778 4.41 20.489 18.327 24.294 24.658 1.213 2.018 3.814 6.068 5.78 9 7.927 11.822 12.005 18.754 16.076 27.332 8.497 17.902 12.046 21.912 15.293 17.277 2.386-3.407 2-5.777-.943-5.777-3.94 0-2.939-1.566 2.5-3.905 6.766-2.91 6.51-4.428-.598-3.54-5.088.636-5.566.532-5.245-1.134.237-1.232 1.664-2.098 4.348-2.639 8.297-1.67 12.718-4.782 6.795-4.782-4.09 0-1.567-1.627 4.483-2.89 6.034-1.26 13.217-4.638 13.217-6.216 0-.723-2.455-.835-7.64-.35-7.805.732-9.914-.663-3.099-2.05 3.509-.714 8.606-2.19 13.026-3.77 3.888-1.392 2.815-3.295-1.632-2.896-7.758.696-3.778-2.388 4.942-3.83 7.266-1.203 13.818-4.184 10.468-4.764-1.34-.232-5.108.104-8.375.747-4.065.8-6.265.844-6.968.141-1.299-1.3 1.381-2.432 11.037-4.664 7.38-1.706 10.855-3.808 5.598-3.386-11.731.94-10.586-1.76 1.93-4.55 10.254-2.285 11.695-2.94 10.059-4.576-.694-.694-1.893-.689-3.749.017-3.357 1.276-6.597 1.343-6.597.137 0-.495 2.362-1.45 5.25-2.122 10.733-2.498 17.08-6.146 13.25-7.616-2.18-.837-1.838-2.362.531-2.362 2.435 0 3.808-2.864 1.929-4.025-.973-.601-1.04-1.18-.25-2.149 1.638-2.01 2.832-30.373 1.317-31.309-1.23-.76-4.284.317-16.522 5.831-25.69 11.576-54.52 36.074-70.025 59.503-1.59 2.404-3.532 4.149-4.613 4.149-2.667 0-2.365-3.255.633-6.818 1.375-1.634 2.5-3.683 2.5-4.553 0-.87 1.125-2.32 2.5-3.221 1.375-.9 2.5-2.391 2.5-3.311 0-.92 2.025-3.366 4.5-5.435 2.554-2.135 4.5-4.619 4.5-5.743 0-1.09.787-2.266 1.75-2.613 3.59-1.295 7.25-4.505 7.25-6.357 0-1.279 1.58-2.72 4.75-4.335 2.612-1.332 5.2-3.467 5.75-4.746.598-1.392 2.405-2.736 4.5-3.347 4.811-1.404 6-2.316 6-4.605 0-2.056 3.436-3.916 7.236-3.916 2.65 0 5.792-2.762 5.124-4.504-.548-1.427.187-1.721 8.983-3.605 4.309-.923 6.05-1.796 6.632-3.327.641-1.685 2.26-2.31 8.597-3.318 8.135-1.294 10.579-2.857 7.76-4.965-1.37-1.024-1.418-1.473-.303-2.817.845-1.017 1.391-4.796 1.505-10.393.098-4.838.506-9.327.908-9.977.401-.65.25-1.759-.335-2.464-.757-.913-.714-2.213.15-4.502 1.002-2.654.966-3.372-.207-4.097-1.178-.728-1.197-1.15-.114-2.455 1.667-2.008-.174-4.576-3.281-4.576-2.081 0-2.08-.014.122-1.557 2.4-1.68 3.005-4.443.973-4.443-2.304.001-11.482 3.878-15.275 6.452-2.065 1.402-4.166 2.548-4.668 2.548-.503 0-3.928 2.396-7.61 5.325-3.684 2.929-7.43 5.741-8.326 6.25-2.559 1.453-20.054 18.284-22.617 21.758-1.27 1.72-4.2 4.398-6.512 5.951-2.312 1.554-4.906 3.459-5.763 4.234-2.875 2.602-24.62 13.717-29.98 15.324-12.549 3.762-19.102 4.477-29.386 3.206-5.562-.688-11.7-1.202-13.641-1.142-3.476.108-14.958-3.647-42.472-13.889-7.7-2.866-15.35-5.634-17-6.15-13.33-4.174-28.428-3.964-37.272.517-7.28 3.69-10.72 3.25-6.624-.846 9.707-9.706 31.523-9.3 57.706 1.076 20.153 7.986 42.636 12.894 54.69 11.938 27.401-2.172 58.733-16.333 80-36.156 3.025-2.82 7.525-6.38 10-7.913 2.475-1.532 6.975-4.685 10-7.004 6.262-4.803 22.77-13.044 28-13.979 7.38-1.318 8.719-2.3 8.605-6.311-.1-3.534-.266-3.702-3.937-4.004-2.944-.242-3.697-.667-3.25-1.832.32-.834.582-1.93.582-2.435 0-.505 1.8-.918 4-.918 3.613 0 4-.245 4-2.531 0-1.393-.563-2.67-1.25-2.837-6.36-1.553-15.851-5.274-18.434-7.226-1.75-1.323-3.465-2.406-3.81-2.406-.346 0-4.453-1.8-9.126-4-4.674-2.2-8.712-4-8.973-4-.671 0-26.326-12.843-35.907-17.976a8202.73 8202.73 0 0 0-16.5-8.809c-14.125-7.516-22.108-13.066-30.323-21.082-9.416-9.187-11.646-12.69-8.678-13.633 2.703-.858 4 .144 4 3.09 0 3.107 2.833 4.36 4.55 2.013 1.401-1.918 1.845-1.474 2.893 2.891.97 4.04 2.257 5.397 4.55 4.798 1.433-.375 2.082.155 2.57 2.103.713 2.84 3.156 3.502 4.076 1.105 1.033-2.692 2.311-1.586 3.466 3 .937 3.723 1.536 4.5 3.465 4.5 1.282 0 2.779.787 3.326 1.75.838 1.477 1.313 1.555 3.036.5 2.815-1.724 2.901-1.67 3.255 2 .282 2.923.635 3.25 3.51 3.25 1.758 0 3.725.527 4.372 1.172.646.644 1.765.945 2.486.669.755-.29 1.973.777 2.871 2.514 1.964 3.798 3.288 4.628 5.052 3.164 1.098-.912 1.746-.607 3.096 1.453 1.103 1.683 2.446 2.504 3.79 2.317 1.444-.2 2.493.556 3.415 2.461 1.52 3.14 3.664 3.559 5.114 1 .93-1.64 1.086-1.623 2.476.25.816 1.1 2.53 2 3.807 2 1.452 0 2.695.845 3.312 2.25.543 1.237 1.812 2.25 2.821 2.25 1.01 0 2.56.725 3.445 1.61 1.482 1.482 1.717 1.468 2.919-.176 1.497-2.048 1.512-2.039 3.726 2.316 1.775 3.49 2.569 3.883 4.317 2.135.82-.82 1.54-.29 2.725 2 1.732 3.348 2.541 3.734 4.252 2.023.79-.79 1.428-.074 2.304 2.582 1.076 3.258 1.502 3.602 3.763 3.034 1.58-.396 2.843-.167 3.32.603.422.684 3.135 1.384 6.028 1.556 3.562.212 5.948.96 7.39 2.315 2.144 2.013 4.45 2.646 4.564 1.252.034-.413.225-3.844.426-7.626.426-8.008.842-8.605 6.351-9.11 2.272-.207 4.592-.662 5.156-1.01 1.05-.65 5.478.357 4.755 1.08-.221.221-2.811.859-5.756 1.417-9.174 1.74-8.857.752-9.073 28.355-.103 13.28-.297 31.569-.431 40.644s-.337 31.575-.452 50c-.115 18.425-.602 38.9-1.083 45.5-.48 6.6-.971 19.473-1.09 28.607l-.216 16.606 3.321 6.394c6.01 11.567 21.93 26.73 34.626 32.979 6.313 3.107 24.832 3.54 29.905.698 10.17-5.698 17.412-13.838 23.383-26.284 6.29-13.11 7.827-45.53 2.726-57.5-1.524-3.575-3.253-7.94-3.843-9.702-1.065-3.181-3.144-4.8-4.826-3.761-.873.54 2.36 9.914 4.17 12.095.519.626 1.197 4.227 1.507 8.003.31 3.776.988 8.27 1.508 9.986 3.255 10.753-1.416 33.96-9.669 48.043-3.212 5.482-9.234 12.336-10.838 12.336-.631 0-4.026 1.404-7.544 3.12-14.276 6.965-30.212-1.536-39.814-21.238-5.415-11.111-5.252-10.499-6.739-25.268-4.374-43.44 13.199-78.614 39.276-78.614 12.924 0 27.343 5.188 33.794 12.16 3.88 4.193 11.774 16.363 13.193 20.34.589 1.65 1.998 5.456 3.133 8.457 2.853 7.552 3.953 38.324 1.607 44.973-.838 2.377-1.534 5.952-1.546 7.946-.012 1.993-.912 5.586-2 7.983-1.088 2.398-1.978 4.89-1.978 5.539 0 .648-.89 2.925-1.978 5.059-1.088 2.134-2.485 5.414-3.104 7.29-1.48 4.483-10.978 15.052-16.248 18.078-13.8 7.926-26.417 8.46-47.67 2.017-12.185-3.694-12.17-3.684-23.44-14.576-6.292-6.082-10.047-9.017-11.046-8.633-3.259 1.25-1.428 4.746 6.236 11.906 4.262 3.983 7.487 7.516 7.166 7.851-1.208 1.263-7.613 1.455-12.982.39-11.916-2.364-21.689 7.423-14.067 14.087l3.012 2.633-.69 8.49c-.573 7.054-.993 8.546-2.487 8.832-3.328.635-4.933-1.798-4.239-6.426.598-3.986-.593-6.6-2.25-4.942-.36.36-.71 6.593-.778 13.85-.135 14.493-1.177 17.97-9.158 30.563-3.814 6.017-3.68 8.133.512 8.133 7.637 0 17.654-8.358 23.37-19.5 6.488-12.645 13.991-16.14 27.84-12.97 3.576.818 12.803 1.661 20.506 1.874 7.702.213 15.802.86 18 1.439 2.197.578 8.945 1.313 14.995 1.632 14.427.762 36.471 2.495 39 3.065 1.796.406 29.006 2.404 40.568 2.98 7.085.353 28.71 2.509 35.932 3.583 3.575.531 11.225 1.142 17 1.357 16.398.61 15.873.053 21.966 23.303 1.387 5.29 6.216 10.937 10.385 12.144 4.99 1.446 11.261 1.265 12.612-.363zM1055 1575.39c0-.979 4.663-2.12 5.45-1.334.272.273.256.884-.036 1.357-.7 1.134-5.414 1.115-5.414-.023zm6.5-6.072c-1.84-.75-1.78-.873.748-1.538 3.172-.834 6.167.013 5.256 1.486-.729 1.18-3.184 1.201-6.004.051zm20.528-1.006c-2.18-1.379 1.173-2.466 4.724-1.532 2.528.665 2.588.788.748 1.538-2.69 1.096-3.731 1.095-5.472-.01zm27.468-1.046c-.76-1.228 1.992-2.427 3.472-1.512.586.362.806 1.077.49 1.589-.764 1.235-3.18 1.188-3.962-.076zm15.004-1.992c.34-.55 1.716-1 3.059-1 1.343 0 2.441.45 2.441 1s-1.377 1-3.059 1c-1.785 0-2.802-.417-2.441-1zm-74.96-2.213c-1.483-1.275-3.017-3.887-3.41-5.803-.918-4.49-2.543-4.481-2.936.016-.353 4.041-2.418 6-6.326 6-3.852 0-4.272-1.204-3.994-11.455.337-12.445.713-12.775 13.126-11.52 13.18 1.333 15.106 3.307 14.302 14.66-.624 8.822-.644 8.86-4.934 9.763-2.446.515-3.722.151-5.828-1.66zm87.504.765c-.661-.796-1.33-3.06-1.486-5.03-.46-5.79-3.558-6.166-3.558-.432 0 3.505-2.08 4.65-5.564 3.062-3.669-1.671-3.215-16.817.575-19.16 1.372-.847 13.809.427 14.905 1.528 1.036 1.041-.012 14.589-1.372 17.73-.582 1.343-.282 1.75 1.29 1.75 1.126 0 2.326.45 2.666 1 .99 1.6-6.11 1.175-7.456-.448zm12.956-.053c.685-.825 1.64-1.5 2.122-1.5.483 0 .878.675.878 1.5 0 .862-.902 1.5-2.122 1.5-1.774 0-1.918-.247-.878-1.5zm9.397.331c-.228-.367.94-.966 2.594-1.33 3.13-.686 3.646-1.44 2.094-3.051-.504-.522-1.066-2.075-1.25-3.45-.4-2.985-3.15-3.36-3.675-.5-.509 2.776-3.119 5.5-5.27 5.5-2.351 0-3.349-5.172-2.425-12.57.73-5.846 1.39-6.51 7.826-7.89 7.827-1.679-1.404-2.268-31.524-2.013-75.267.636-73.293.666-71.55-1.077.301-.302 13.314-.835 28.916-1.184 30.457-.681 35.986-.727 59.867-.492 8.525.084 19.325-.046 24-.288 9.925-.515 16.127.188 13.93 1.578-.786.498-3.905.966-6.93 1.039-3.025.073-6.85.467-8.5.873l-3 .74 3.32 1.264 3.32 1.265-.352 8.127c-.193 4.47-.562 8.803-.82 9.628-.37 1.184.682 1.565 4.99 1.81 5.334.302 5.42.265 3.716-1.618-1.877-2.074-1.797-16.47.103-18.369.49-.49 4.125-1.015 8.077-1.166 9.643-.366 9.98.085 9.377 12.593l-.47 9.75h-3.349c-2.328 0-3.198-.394-2.853-1.293.747-1.946-.953-9.005-2.274-9.445-.636-.212-1.6 1.22-2.142 3.182-2.124 7.694-5.405 9.605-15.987 9.313-5.14-.141-9.53-.558-9.759-.926zm-93.337-1.259c-1.176-1.417.365-17.064 1.847-18.745 1.413-1.604 16.562-2.014 18.574-.503 1.958 1.47 2.5 11.583.907 16.924-1.49 4.993-8.388 2.633-8.388-2.87 0-4.6-1.685-4.26-2.995.605-1.48 5.498-7.056 8.07-9.945 4.589zm31.632-.725c-1.783-.997-2.36-9.26-1.089-15.612.6-2.995.66-3.02 9.036-3.718 11.125-.927 11.502-.598 10.702 9.338-.7 8.698-1.464 10.145-5.357 10.145-2.94 0-3.984-1.485-3.984-5.665 0-3.661-2.398-2.355-3 1.635-.553 3.659-3.482 5.46-6.309 3.877zm105.971-5.597c.932-14.539 1.402-15.294 9.887-15.884 9.107-.632 9.568-.037 9.234 11.926-.25 9-.5 10.226-2.14 10.54-2.736.524-3.987-1.268-4.598-6.586-.596-5.18-3.262-6.76-3.89-2.305-.471 3.334-4.996 9.059-7.16 9.059-1.556 0-1.714-.801-1.333-6.75zm-185.912 5.06c-1.826-.476-2.528-2.432-2.981-8.31-.374-4.85-2.899-4.595-4.31.437-1.31 4.665-3.189 6.099-6.805 5.191-2.622-.658-2.655-.775-2.655-9.492 0-12.011.7-12.646 13.068-11.845 11.912.772 11.932.794 11.932 12.631 0 11.813-1.055 13.27-8.25 11.389zm-30.528-3.867c-1.722-1.206-2.223-2.544-2.223-5.94 0-7.283-3.311-6.98-4.274.391-.627 4.795-2.134 6.376-5.226 5.482-3.68-1.064-4.365-3.091-3.786-11.204.76-10.655 1.7-11.566 11.193-10.856 10.474.783 11.674 2.144 11.34 12.863-.328 10.498-2.04 12.756-7.024 9.264zm-29.188-3.377c-.57-1.064-1.035-3.577-1.035-5.584 0-4.774-2.104-4.163-3.563 1.035-1.287 4.588-3.181 6.015-6.782 5.111-2.612-.655-2.655-.803-2.655-9.147 0-11.467 1.39-13.024 10.771-12.063 10.566 1.082 11.242 2.136 10.313 16.082-.419 6.275-4.663 9.024-7.049 4.566zm-39.79-2.22c-1.893-1.894-1.68-17.24.262-18.852 1.6-1.328 16.02-1.022 18.303.389 1.62 1 1.611 16.796-.01 18.417-3.649 3.649-8.228.452-7.537-5.262.141-1.166-.448-2.103-1.452-2.311-1.345-.279-1.753.53-2 3.961-.287 3.98-.543 4.335-3.316 4.607-1.652.162-3.565-.265-4.25-.95zm-15.263-1.88c-.633-1.183-.907-3.127-.609-4.317.3-1.191.113-2.837-.415-3.657-1.153-1.796-2.588-.176-3.55 4.008-1.054 4.584-1.333 5-3.353 5-5.003 0-6.25-16.128-1.523-19.691 2.346-1.77 13.597-1.277 15.978.7 1.559 1.293 1.901 10.437.617 16.491-.824 3.886-5.352 4.816-7.145 1.467zm-27.433-3.216a57.982 57.982 0 0 1-.769-4.672c-.402-3.479-2.595-3.744-3.303-.399-1.239 5.86-5.457 8.436-8.037 4.908-1.416-1.936-.722-15.416.898-17.443 1.109-1.389 6.325-1.188 15.162.583l4 .801.29 7.625c.227 5.958-.062 7.976-1.321 9.235-2.438 2.438-6.33 2.079-6.92-.638zm-235.549-.71c-5.367-2.87-13.678-13.55-12.72-16.345.224-.657 4.191 2.79 8.814 7.66 10.681 11.252 11.307 12.642 3.906 8.685zm88.694.32c-2.225-2.225 2.063-3.011 4.865-.892 1.843 1.394 1.785 1.47-1.142 1.5-1.696.017-3.371-.256-3.723-.607zm107.506-.56c-1.48-1.48-1.599-13.621-.17-17.38l1.031-2.712 8.168.63c4.699.362 8.736 1.199 9.506 1.969 2.204 2.203 2.674 14.584.64 16.831-3.082 3.406-8.375.977-8.375-3.844 0-2.845-2.55-4.908-3.383-2.738-.34.884-.617 2.606-.617 3.826 0 2.604-1.744 4.618-4 4.618-.88 0-2.14-.54-2.8-1.2zm-23.608-2.109c-1.606-1.175-1.703-2.226-.941-10.25l.849-8.941 6.698-.294c8.108-.357 9.288.876 10.093 10.55.426 5.115.184 6.665-1.323 8.5-2.92 3.556-5.392 1.342-5.772-5.172-.41-6.995-3.518-7.069-4.015-.095-.46 6.446-2.176 8.198-5.589 5.702zm-191.331-6.941c-1.718-2.337-4.73-6.381-6.693-8.987-1.962-2.605-3.568-5.23-3.568-5.833 0-2.204 2.472-.18 5.66 4.636 1.795 2.714 4.632 6.67 6.303 8.792 1.67 2.122 3.037 4.26 3.037 4.75 0 1.94-1.762.692-4.74-3.358zm-10.632 1.172c-2.944-2.315-5.11-5.774-4.192-6.693.661-.66 8.563 6.698 8.563 7.974 0 1.36-1.618.885-4.371-1.28zm590.871-.653c-7.32-.57-7.54-1.897-.422-2.542 6.694-.607 9.221-.125 8.631 1.646-.436 1.312-1.444 1.422-8.209.896zm-12-1.269c-.34-.55.057-1 .882-1s1.778.45 2.118 1c.34.55-.057 1-.882 1s-1.778-.45-2.118-1zm30.5 0c0-.55 1.152-1 2.559-1 1.451 0 2.292.433 1.941 1-.34.55-1.492 1-2.559 1-1.068 0-1.941-.45-1.941-1zm-624.333-2.667c-1.498-1.497-.735-3.634.833-2.333.825.685 1.5 1.64 1.5 2.122 0 1.036-1.384 1.161-2.333.211zm461.96-1.127c-1-1.62.796-2.28 6.083-2.231 2.635.024 6.057-.01 7.605-.067 2.828-.111 4.467.644 3.498 1.613-1.128 1.128-16.532 1.743-17.186.686zm63.915-1.138c-.316-.512-.23-1.124.192-1.361 1.197-.675 13.266.449 13.266 1.234 0 1.068-12.802 1.189-13.458.127zm-40.542-1.119c6.394-1.138 11.779-1.116 12.5.051.396.641-2.543.955-8.191.875-7.71-.11-8.247-.225-4.309-.926zm-478.965-2.883c-1.755-3.28-1.1-4.725.998-2.205 1.082 1.298 1.967 2.76 1.967 3.25 0 1.603-1.907.93-2.965-1.045zm-11.42-1.204c-.888-1.269-1.615-2.941-1.615-3.716 0-.776-.915-2.89-2.033-4.699-1.437-2.326-1.697-3.496-.888-3.996 1.249-.771 2.881 1.193 2.906 3.495.01.796 1.213 3.175 2.677 5.288 1.854 2.675 2.345 4.16 1.616 4.888-.729.729-1.537.346-2.662-1.26zm7.844-4.928c-.363-.587-.42-1.307-.126-1.6.717-.717 2.667.545 2.667 1.725 0 1.278-1.726 1.193-2.541-.126zm78.921-64.386c-.815-2.123.413-3.548 3.057-3.548 2.614 0 5.068 2.373 4.09 3.956-.975 1.577-6.506 1.261-7.147-.408zm-35.88-7.548c-.837-1.354.293-3 2.06-3 .792 0 1.44.9 1.44 2 0 2.07-2.412 2.76-3.5 1zm93-18c-.34-.55-.403-1-.14-1 .262 0 1.188-.273 2.058-.607 1.038-.398 1.582-.054 1.582 1 0 1.764-2.515 2.2-3.5.607zm-83.282-1.256c-3.88-1.243-3.739-2.826.347-3.924 4.95-1.33 9.545 1.137 7.255 3.896-1.234 1.488-3.027 1.494-7.602.028zm400.782-7.744c0-.55.423-1 .941-1 .517 0 1.22.45 1.559 1 .34.55-.083 1-.941 1-.857 0-1.559-.45-1.559-1zm-439.25-1.666c-2.546-.699-2.142-3.197.63-3.893 4.35-1.091 8.12-.135 8.12 2.06 0 2.05-4.515 2.995-8.75 1.833zm443.433-5.067c-4.341-.251-6.193-.74-5.923-1.566.787-2.395 14.783-1.64 14.827.8.022 1.186-.655 1.244-8.904.766zm-416.061-2.17c-2.015-1.276-.426-3.099 2.687-3.083 4.227.021 7.191 1.094 7.191 2.603 0 1.58-7.561 1.947-9.878.48zm42.878-.097c0-.55.648-1 1.441-1s1.72.45 2.059 1c.34.55-.308 1-1.44 1-1.133 0-2.06-.45-2.06-1zm69-3.231c0-1.995 4.97-4.2 6.352-2.817 1.348 1.348-.01 2.698-3.602 3.586-2.046.505-2.75.308-2.75-.77zm-37.032-5.353c-1.382-3.636-1.296-3.854 2.032-5.11 2.826-1.067 4.181-3.306 2-3.306-2.3 0-.725-2.1 3-4 2.239-1.142 4-2.771 4-3.7 0-.912 1.462-3.11 3.25-4.886 7.329-7.28 8.75-9.016 8.75-10.695 0-.968 2.087-3.213 4.637-4.99 2.551-1.776 8.392-6.428 12.98-10.338 4.588-3.91 10.812-8.636 13.832-10.5 3.403-2.102 5.862-4.437 6.469-6.141.746-2.099 1.641-2.757 3.78-2.782 1.541-.017 3.676-.692 4.743-1.5 1.068-.807 2.815-1.468 3.882-1.468 1.067 0 3.456-1.607 5.309-3.571 3.576-3.792 4.382-6.032 1.816-5.047-1.7.652-1.223-.626 1.36-3.632 2.025-2.359 4.503-2.304 3.745.083-.686 2.163 3.587 4.575 6.478 3.657 2.193-.696 3.425.916 1.708 2.235-.681.523-6.006 3.014-11.832 5.535-5.826 2.522-12.777 5.97-15.446 7.663-2.669 1.692-5.35 3.077-5.957 3.077-.607 0-4.98 3.488-9.716 7.75-4.736 4.263-11.041 9.775-14.012 12.25-2.97 2.475-7.08 6.863-9.13 9.75-2.052 2.888-4.122 5.25-4.6 5.25-.479 0-2.777 2.813-5.107 6.25-13.067 19.276-16.305 22.548-17.971 18.166zm-41.468-.416c-1.013-1.638 7.24-1.559 8.95.087.58.557-.862.914-3.69.914-2.554 0-4.92-.45-5.26-1zm253.748-.309c-.494-.655-1.478-3.216-2.187-5.69-5.576-19.461-30.323-46.964-42.304-47.014-4.724-.02-7.757-1.024-7.757-2.568 0-1.54 3.055-3.419 5.562-3.419 2.21 0 14.438 6.025 14.438 7.114 0 .461 1.534 1.637 3.408 2.613 4.365 2.271 13.648 12.693 16.434 18.448 2.256 4.66 7.7 10.616 8.748 9.57 2.62-2.62-3.169-17.982-10.918-28.977-4.146-5.88-4.343-7.433-.802-6.309 2.95.936 14.13 19.933 14.13 24.009 0 .708.607 1.791 1.348 2.406 1.714 1.423 3.104-.142 7.935-8.935 4.107-7.476 20.927-25.001 29.587-30.826 12.177-8.192 12.13-8.17 12.13-5.627 0 .817-1.913 2.719-4.25 4.225-2.337 1.506-6.436 4.663-9.108 7.014-2.672 2.352-5.24 4.275-5.707 4.275-.467 0-4.58 4.204-9.142 9.34-8.543 9.622-13.252 17.28-16.233 26.399-.942 2.88-2.128 5.495-2.636 5.809-1.243.768-1.186 8.453.062 8.453.542 0 2.394-2.813 4.116-6.25 5.322-10.625 25.137-32.96 32.701-36.86 1.483-.765 4.53-2.607 6.771-4.093 5.764-3.822 13.342-6.286 14.796-4.81 1.288 1.308-1.599 4.003-4.311 4.025-10.62.086-43.633 31.855-48.538 46.71-3.143 9.518-6.255 13.643-8.273 10.968zm133.752.31c-2.124-.68-1.86-.816 1.75-.9 2.337-.056 4.25.35 4.25.9 0 1.152-2.401 1.152-6 0zm-9.457-.931c-.317-.512-.092-1.23.498-1.595 1.422-.879 5.959.297 5.959 1.545s-5.69 1.292-6.457.05zm-458.462-9.438c-6.032-1.273-7.64-3.202-3.529-4.234 2.892-.726 11.448 2.705 11.448 4.59 0 1.192-.744 1.159-7.919-.356zm9.419-5.168c-1.65-.755-4.463-1.394-6.25-1.418-1.788-.025-3.25-.554-3.25-1.175 0-1.317 11.261-.336 14.201 1.237 4.734 2.534.523 3.748-4.701 1.356zm55-.464c.34-.55 1.24-1 2-1s1.66.45 2 1c.352.57-.51 1-2 1s-2.352-.43-2-1zm-42-3.655c-2.75-.837-7.475-1.82-10.5-2.183-3.144-.378-5.286-1.09-5-1.661.275-.55 1.175-.886 2-.746s4.65.654 8.5 1.143c7.788.99 12.5 2.527 12.5 4.078 0 1.335-1.43 1.215-7.5-.631zm154.996.648c-.343-.553.1-1.284.984-1.623 1.914-.735 2.981.075 2.061 1.564-.83 1.343-2.235 1.371-3.045.059zm284.004.01c.34-.55 1.042-1 1.559-1 .518 0 .941.45.941 1s-.702 1-1.559 1c-.858 0-1.28-.45-.941-1zm-427.5-3.57c-3.575-1.307-7.876-2.388-9.559-2.403-1.682-.015-3.932-.67-5-1.457-2.425-1.788 3.914-1.26 12.213 1.016 2.835.778 6.267 1.414 7.628 1.414 2.558 0 5.2 2.184 4.043 3.342-.96.96-2.118.723-9.325-1.912zm74.013-.757c.818-.754 4.187-2.37 7.487-3.592s7.35-2.816 9-3.544c1.65-.727 4.448-1.87 6.217-2.537 1.77-.668 3.764-1.874 4.433-2.68 1.637-1.972 8.337-5.327 10.56-5.288 2.922.052-.891 2.561-11.71 7.707-5.225 2.484-11.975 5.751-15 7.26-6.463 3.221-13.413 4.914-10.987 2.674zm-77.513-6.676c-.34-.55.083-1 .941-1s1.559.45 1.559 1-.423 1-.94 1c-.519 0-1.22-.45-1.56-1zm440.643-3.89c-2.303-1.46.227-2.03 6.246-1.409 3.656.378 5.271.9 4.432 1.431-1.726 1.095-8.94 1.08-10.678-.022zm36.952-3.228c-11.01-1.276-10.075-2.235 1.405-1.438 12.58.873 19.969 2.367 11.5 2.324-3.025-.015-8.832-.413-12.905-.886zm-17.095-1.602c-1.375-.247-2.95-.913-3.5-1.481-1.276-1.317 8.573-.046 9.95 1.284.983.95-1.782 1.034-6.45.197zm-15.5-2.195l-3-.68 2.937-.6c3.332-.68 5.822-.032 4.998 1.3-.6.973-.549.973-4.935-.02zm-141.603-4.782c-3.364-7.926-5.02-11.512-8.135-17.616-1.632-3.198-2.735-6.047-2.45-6.331 1.3-1.3 4.72 2.05 5.661 5.545.573 2.127 1.69 4.405 2.483 5.063.793.658 1.973 2.848 2.623 4.867 2.34 7.266 4.701 8.036 7.425 2.42 4.788-9.874 6.178-12.3 11.317-19.75 9.622-13.95 19.873-23.267 22.544-20.49.855.89.525 1.588-1.341 2.835-4.924 3.29-8.73 7.146-13.085 13.261-2.441 3.428-5.818 7.843-7.504 9.813-3.098 3.62-6.782 9.586-11.37 18.415-3.839 7.387-5.681 7.83-8.168 1.968zm129.113 3.805c-1.37-.381-2.044-.958-1.5-1.283 1.034-.616 5.49.718 5.49 1.643 0 .628-.65.57-3.99-.36zm-312.43-2.358c.783-1.896 7.528-6.753 9.331-6.72.979.018-.139 1.543-2.911 3.97-4.451 3.898-7.42 5.17-6.42 2.75zm340.689-4.442c.973-.254 2.323-.237 3 .037.677.273-.119.48-1.769.46-1.65-.02-2.204-.244-1.231-.498zM741 1353.774c.685-.825 1.695-1.5 2.245-1.5.558 0 .45.663-.245 1.5-.685.825-1.695 1.5-2.245 1.5-.558 0-.45-.664.245-1.5zm15-2.433c0-1.146 14.938-14.793 19.029-17.382 4.918-3.114 3.35-.136-2.633 5.002a8734.794 8734.794 0 0 0-10.533 9.063c-5.162 4.45-5.863 4.846-5.863 3.317zm-9.5-1.067c.34-.55 1.068-1 1.618-1s.722.45.382 1c-.34.55-1.068 1-1.618 1s-.722-.45-.382-1zm-60.688-.684c.722-.288 1.585-.253 1.917.08.332.332-.258.568-1.312.525-1.165-.048-1.402-.285-.605-.604zm6.738-1.18c1.28-1.163 7.661-3.259 8.22-2.7.245.246-1.232 1.148-3.284 2.005-4.15 1.734-6.433 2.056-4.936.695zm388.847-1.303c-.283-.458 1.087-.833 3.044-.833s3.559.375 3.559.833c0 .458-1.37.833-3.044.833s-3.276-.375-3.559-.833zm-153.338-9.035c-4.19-17.717-12.693-35.204-19.215-39.52-3.717-2.46-4.482-4.232-2.162-5.006 1.77-.59 9.464 6.004 11.35 9.727 8.5 16.774 10.258 20.98 11.016 26.337 1.061 7.51 2.395 9.044 4.938 5.678 2.948-3.902 3.572-1.554 1.395 5.252-2.998 9.371-4.654 8.813-7.322-2.468zm-24.587 5.156c-2.032-3.287-10.726-8.765-14.905-9.392-2.794-.42-4.567-1.202-4.567-2.017 0-3.286 5.798-2.638 10.384 1.161 1.585 1.314 4.608 3.27 6.716 4.345 3.805 1.94 6.41 5.106 5.198 6.317-.937.937-2.096.767-2.826-.414zm-145.578-2.704c1.009-1.832 9.438-10.757 12.392-13.123 4.353-3.485 1.185 1.615-4.95 7.97-6.463 6.694-9.42 8.741-7.442 5.152zm50.919 1.066c.721-.288 1.584-.253 1.916.08.332.332-.258.568-1.312.525-1.165-.048-1.402-.285-.605-.604zm298.437-.01c.963-.251 2.538-.251 3.5 0 .963.252.175.458-1.75.458s-2.712-.206-1.75-.458zm-385.39-5.344c1.3-1.081 2.874-1.951 3.5-1.933.627.018.078.918-1.22 2-1.3 1.082-2.874 1.952-3.5 1.933-.627-.018-.078-.918 1.22-2zm397.825.177c-1.722-.678-1.71-.81.21-2.548 2.725-2.467 10.105-.621 10.105 2.527 0 1.037-7.7 1.053-10.315.021zm-402.109-4.266c.355-.574 3.005-2.553 5.89-4.4 2.886-1.845 7.674-5.629 10.64-8.408 5.052-4.732 6.894-5.922 6.894-4.452 0 .816-7.055 7.48-9.935 9.383-1.248.825-3.686 2.727-5.417 4.226-3.313 2.869-9.248 5.553-8.072 3.65zm11.462.341c.061-1.155 8.039-6.36 9.17-5.982.568.189-.485 1.484-2.338 2.877-3.694 2.777-6.891 4.23-6.832 3.105zm-22.538-1.215c.34-.55.817-1 1.06-1 .242 0 .44.45.44 1s-.476 1-1.059 1c-.582 0-.78-.45-.441-1zm384.313.317c.721-.289 1.584-.253 1.916.08.332.332-.258.568-1.312.525-1.165-.048-1.402-.285-.604-.605zM693 1330.274c1.958-1.266 3.282-1.266 2.5 0-.34.55-1.379.993-2.309.984-1.457-.013-1.484-.15-.191-.985zm217.212-4.446c-2.528-4.144-11.071-9.555-15.087-9.555-.619 0-1.125-.674-1.125-1.5 0-3.78 12.096-.032 13.733 4.256.367.96 2.152 3.148 3.967 4.863 1.815 1.714 3.3 3.852 3.3 4.75 0 2.915-2.017 1.73-4.788-2.814zm226.6 3.762c.722-.288 1.585-.253 1.917.08.332.332-.258.568-1.312.525-1.165-.048-1.402-.285-.604-.604zm-439.312-1.316c.34-.55 1.068-1 1.618-1s.722.45.382 1c-.34.55-1.068 1-1.618 1s-.722-.45-.382-1zm239.892-3.048c1.083-6.773 14.604-30.29 16.39-28.505.245.246-.505 1.657-1.668 3.135-1.163 1.478-2.114 3.24-2.114 3.917 0 .677-.881 2.351-1.958 3.72-1.077 1.37-3.15 6.043-4.604 10.385-3.135 9.354-4.138 11.395-5.6 11.395-.718 0-.87-1.392-.446-4.047zm182.7 3.126c-.774-.49-5.366-1.205-10.205-1.588-4.84-.382-10.506-1.335-12.593-2.116l-3.794-1.42 5 .56c2.75.307 8.15.746 12 .975 3.85.23 8.572.888 10.493 1.464 1.922.575 4.933 1.046 6.691 1.046 1.76 0 3.476.45 3.816 1 .78 1.261-9.43 1.331-11.407.079zM539 1326.836c0-3.393 11.697-6.039 12.734-2.88.53 1.616-2.316 2.983-7.984 3.832-4.05.608-4.75.467-4.75-.952zm130-1.563c-.901-.582-1.025-.975-.309-.984.655-.01 1.47.435 1.809.985.767 1.241.421 1.241-1.5 0zm50-2.073c1.925-1.66 5.226-4.153 7.337-5.54 2.11-1.386 5.935-4.67 8.5-7.299 2.564-2.627 7.956-7.366 11.982-10.53 4.025-3.164 7.553-6.363 7.84-7.109.592-1.546 6.85-5.465 8.648-5.417.656.017.293.693-.807 1.5-3.872 2.841-10.783 9.011-14.371 12.831-3.956 4.211-20.241 17.642-26.611 21.947-5.337 3.606-6.872 3.373-2.518-.383zm66 2.18c0-.49.712-1.166 1.582-1.5 2.446-.938 2.77-.735 1.418.893-1.38 1.663-3 1.99-3 .608zm-6.18-6.145c7.147-6.666 10.252-6.634 3.68.038-2.793 2.836-5.807 4.984-6.962 4.962-1.626-.03-.963-1.04 3.282-5zm-84.82 3.039c1.958-1.266 3.282-1.266 2.5 0-.34.55-1.379.993-2.309.984-1.457-.013-1.484-.15-.191-.985zm56.568-7.563c13.05-12.861 18.432-17.122 18.432-14.591 0 1.197-12.708 13.485-17.5 16.922-9.276 6.653-9.494 6.108-.932-2.331zm56.932 7.563c.34-.55 1.042-1 1.56-1 .517 0 .94.45.94 1s-.702 1-1.559 1-1.28-.45-.941-1zm269-.192c-4.4-.501-11.15-1.226-15-1.61-7.497-.748-9.219-2.174-3.5-2.897 5.984-.758 12.721-.267 18.22 1.325 2.904.842 6.747 1.77 8.54 2.062 1.792.293 3.506.933 3.808 1.422.625 1.012-.87.974-12.068-.302zm-403.5-1.86c-2.944-.882-2.854-.929 3-1.551 12.972-1.38 25.04-8.35 36.647-21.169 10.327-11.406 15.595-16.229 17.724-16.229 2.59 0 1.956 1.175-3.445 6.386-2.785 2.688-6.784 7.188-8.887 10-11.99 16.04-32.513 26.322-45.039 22.564zm26.427-.47c1.06-.802 2.172-1.213 2.471-.914.628.628-1.912 2.413-3.398 2.388-.55-.01-.133-.672.927-1.474zm233.153-.729a206.373 206.373 0 0 1-.894-4.75c-.458-2.626-5.052-20.067-6.19-23.5-.556-1.675-.307-1.594 1.535.5 1.23 1.399 3.029 2.363 4.084 2.188 1.176-.196 1.885.275 1.885 1.25 0 2.78 2.953 1.657 4.435-1.687 1.414-3.189 1.431-3.136.914 2.75-.29 3.3-.912 7.35-1.38 9-.47 1.65-1.157 6.037-1.528 9.75-.67 6.717-1.988 8.788-2.861 4.5zm-272.08.25c-1.772-.761-1.687-.867.75-.93 1.512-.038 2.75.38 2.75.93 0 1.174-.769 1.174-3.5 0zm450-1c-1.634-.702-1.36-.869 1.5-.914 1.925-.03 4.175.381 5 .915 1.947 1.258-3.572 1.258-6.5 0zm-465-2.096c-3.36-1.035-19.49-5.316-23.79-6.314-1.536-.357-2.542-1.052-2.237-1.545.327-.53 1.837-.53 3.683 0 1.72.494 3.445.703 3.83.464 1.391-.86 20.961 4.974 23.729 7.074 2.224 1.687-.28 1.842-5.215.321zm-72.563-1.48c-1.545-1.86.103-3.382 3.69-3.408 3.715-.027 5.066 2.77 1.917 3.968-3.544 1.347-4.068 1.295-5.607-.56zm511.606-.354c-.317-.512-.114-1.216.45-1.565 1.315-.813 5.007.34 5.007 1.563 0 1.214-4.707 1.215-5.457 0zM799 1313.88c0-.216.698-.66 1.552-.988.89-.342 1.291-.174.941.393-.587.95-2.493 1.405-2.493.596zm272.5-.712a273.695 273.695 0 0 0-9.77-1.432c-5.546-.687-5.397-2.463.206-2.463 5.015 0 18.064 2.969 18.064 4.109 0 1.014-1.429.978-8.5-.213zm-360.5-2.394c.685-.825 1.92-1.5 2.745-1.5 1.22 0 1.268.28.255 1.5-.685.825-1.92 1.5-2.745 1.5-1.22 0-1.267-.28-.255-1.5zm33 .103c0-2.672 19.874-18.603 23.206-18.603.688 0-.534 1.462-2.714 3.25-2.18 1.787-7.304 6.287-11.387 10-7.602 6.912-9.105 7.795-9.105 5.353zm-139-1.398c0-1.133 4.518-3.206 6.988-3.206 2.285 0 3.672 1.846 1.825 2.43-3.463 1.094-8.813 1.566-8.813.776zm56.5-.34c-2.2-.516-6.025-1.339-8.5-1.829-5.68-1.124-11.28-3.135-17.571-6.308-14.351-7.24-22.7-9.137-40.429-9.184l-16.5-.044-10.5 3.794c-5.775 2.087-12.178 4.9-14.229 6.25-7.256 4.78-7.875 1.991-.699-3.15 2.435-1.744 4.33-3.628 4.21-4.187-.12-.558.443-1.564 1.25-2.234.807-.67 1.468-1.838 1.468-2.596 0-1.528 3.64-1.919 4.167-.447.7 1.952 6.026 1.634 7.198-.43 1.708-3.01 2.72-3.468 7.685-3.485 2.502-.01 4.979-.444 5.503-.968.603-.603 3.442-.526 7.747.211 5.31.91 7.225.895 8.77-.07 1.507-.941 2.485-.961 4.121-.086 1.18.632 5.108 1.22 8.727 1.31 6.587.16 14.851 3.287 19.315 7.306 1.334 1.202 2.978 1.415 7.146.925 4.617-.543 6.64-.165 13.767 2.573 10.701 4.11 19.138 4.219 25.934.335 2.43-1.39 5.545-2.539 6.92-2.553 3.551-.036 7-1.078 7-2.115 0-.486-1.35-.883-3-.883-3.499 0-4.04-1.749-.75-2.424 10.451-2.145 13.937-3.348 18.535-6.4 5.899-3.913 8.904-3.402 6.004 1.022-12.534 19.12-35.02 29.95-53.289 25.667zm463-5.865c-.34-.55.083-1 .941-1 .857 0 1.559.45 1.559 1s-.423 1-.941 1c-.517 0-1.22-.45-1.559-1zm-7.688-1.684c.722-.289 1.585-.253 1.917.08.332.332-.258.568-1.312.525-1.165-.048-1.402-.285-.604-.605zm-.312-6.822c-12.535-1.998-15.5-2.691-15.5-3.625 0-1.101-.742-1.157 14.169 1.058 12.833 1.907 20.003 4.1 12.831 3.927-1.925-.047-7.1-.659-11.5-1.36zm-62-2.495c.34-.55.817-1 1.059-1 .243 0 .441.45.441 1s-.477 1-1.059 1c-.583 0-.78-.45-.441-1zm-257.941-1.468c2.724-2.06 6.145-2.085 4.441-.032-.685.825-2.4 1.5-3.813 1.5-2.474 0-2.497-.054-.628-1.468zm135.142-7.532c-1.615-19.18-1.62-23.093-.028-23.705.84-.322 1.832-.096 2.202.503 1.274 2.062 1.13 19.692-.208 25.202l-1.334 5.5-.632-7.5zm7.33 5.71c-.066-1.723 4.15-8.842 5.557-9.382 2.97-1.14 2.845.896-.223 3.638-1.724 1.54-3.623 3.64-4.22 4.667-.596 1.027-1.098 1.512-1.114 1.078zm141.469-.71c-.367-.593.803-1 2.882-1 1.925 0 3.778.45 4.118 1 .367.594-.803 1-2.882 1-1.925 0-3.778-.45-4.118-1zm51 0c-2.722-.692-2.768-.767-.5-.81 1.375-.027 3.4.338 4.5.81 2.466 1.06.164 1.06-4 0zm-464.578-1.41c-.288-.288-2.88-.758-5.76-1.045-2.88-.287-7.994-1.427-11.365-2.533-3.37-1.106-6.715-2.012-7.434-2.012-.72 0-8.407-3.626-17.085-8.058-28.327-14.47-36.877-17.069-56.028-17.035-13.426.024-28.204 3.678-39.3 9.717-9.346 5.087-7.236.388 2.463-5.485 20.505-12.416 56.595-11.213 84.5 2.817 25.956 13.05 53.53 18.581 67.74 13.587.634-.223 1.88.127 2.769.777 2.043 1.494 0 4.908-4.233 7.06-2.792 1.422-15.35 3.127-16.267 2.21zm111.078-1.59c1.958-1.265 3.282-1.265 2.5 0-.34.55-1.379.994-2.309.985-1.457-.013-1.484-.15-.191-.985zm-11-.93c0-.938 3.12-3.07 4.493-3.07 1.104 0-.542 1.956-2.549 3.03-1.269.68-1.944.694-1.944.041zm151.946-1.879l-3.446-3.132 2.715-.029c1.736-.019 3.111.712 3.815 2.026 1.999 3.735.418 4.317-3.084 1.135zm192.054 1.81c0-.55.648-1 1.441-1 .792 0 1.72.45 2.059 1 .34.55-.308 1-1.441 1-1.132 0-2.059-.45-2.059-1zm121-1c-1.187-.768-.979-.97 1-.97 1.375 0 3.175.436 4 .97 1.187.767.979.969-1 .969-1.375 0-3.175-.436-4-.97zm-141.674-1.388c-3.936-1.063-6.752-2.613-4.743-2.612 1.63 0 15.858 3.107 16.311 3.56.846.846-7.434.167-11.568-.948zm45.674-.659c-4.675-1.013-11.844-2.324-15.932-2.913-4.087-.59-7.65-1.29-7.917-1.556-1.343-1.343 1.31-1.362 8.938-.062 4.626.789 12.555 1.923 17.62 2.521 9.946 1.174 12.291 1.778 12.291 3.163 0 1.333-5.471.913-15-1.153zm-348.5.046c.34-.55 1.293-1 2.118-1s1.222.45.882 1c-.34.55-1.293 1-2.118 1s-1.222-.45-.882-1zm425.75-.662c-.688-.277-1.25-.917-1.25-1.421 0-1.313 4.902-.995 9 .583l3.5 1.348h-5c-2.75 0-5.563-.23-6.25-.507zm-156.75-5.337c-.34-.55.083-1 .941-1 .857 0 1.559.45 1.559 1s-.423 1-.941 1c-.517 0-1.22-.45-1.559-1zm50.25.337c.688-.277 1.813-.277 2.5 0 .688.278.125.505-1.25.505s-1.938-.227-1.25-.505zm-21.5-4.027c.963-.251 2.538-.251 3.5 0 .963.252.175.458-1.75.458s-2.712-.206-1.75-.458zm-6.75-1.31c-.731-1.183.247-1.183 3 0 1.928.828 1.921.862-.191.93-1.205.038-2.47-.38-2.809-.93zm41.5.022c-2.475-.391-5.85-1.323-7.5-2.07l-3-1.36 3-.287c4.277-.408 14.77 1.96 15.256 3.444.444 1.35-.678 1.39-7.756.273zm-63-4.022c0-.55.648-1 1.441-1 .792 0 1.72.45 2.059 1 .34.55-.308 1-1.441 1-1.132 0-2.059-.45-2.059-1zm89-.6c-3.575-.77-9.57-1.844-13.323-2.383-3.753-.54-8.478-1.413-10.5-1.94-4.335-1.131-10.389-2.523-18.677-4.294l-6-1.282 5.331-.306c2.932-.168 5.865.137 6.518.679 1.108.92 4.111 1.408 15.886 2.586 2.605.26 6.07 1.163 7.7 2.006 1.631.844 4.481 1.534 6.333 1.534 3.44 0 17.392 3.327 18.47 4.404.985.985-4.824.489-11.738-1.003zm-47.25-.062c.688-.278 1.813-.278 2.5 0 .688.277.125.504-1.25.504s-1.938-.227-1.25-.504zm-7.25-1.338c-.79-1.277 2.524-1.277 4.5 0 1.173.758.914.972-1.191.984-1.48.01-2.97-.434-3.309-.984zm-15.5-3.06c0-.582.45-.78 1-.44s1 .816 1 1.059c0 .242-.45.44-1 .44s-1-.476-1-1.058zm8.734-6.357c-6.568-1.767-6.73-2.368-.506-1.883 7.442.58 9.946 1.21 9.254 2.329-.771 1.247-2.844 1.142-8.748-.446zM803 1239.225c-16.472-5.917-33.074-18.637-60.368-46.25-22.505-22.767-28.68-31.387-8.474-11.828 19.884 19.247 40.895 38.601 42.646 39.282.933.363 7.546 4.531 14.696 9.264 9.819 6.498 13.612 8.495 15.5 8.16 1.375-.245 5.65-.973 9.5-1.617 3.85-.645 11.05-2.014 16-3.043 22.32-4.64 30.644-4.127 42.112 2.593 8.379 4.91 6.195 6.121-3.241 1.797-6.755-3.095-18.224-4.135-27.371-2.481-3.025.547-8.425 1.512-12 2.146a870.34 870.34 0 0 0-13.778 2.588c-8.973 1.772-8.542 1.79-15.222-.61zm-235.559-1.384c-1.28-.945-1.6-1.76-.941-2.396 1.384-1.333 5.5.386 5.5 2.296 0 1.924-2.027 1.968-4.559.1zm-20.241-3.767c-.66-.66-1.2-1.56-1.2-2 0-1.192 2.779-.968 3.554.287 1.03 1.666-.956 3.11-2.354 1.712zm407.8-6.452c0-.55 1.125-2.057 2.5-3.349 1.375-1.291 2.5-1.898 2.5-1.348 0 .55-1.125 2.057-2.5 3.349-1.375 1.291-2.5 1.898-2.5 1.348zm80-2.765c0-1.76 7.213-7.583 9.394-7.583 2.797 0 1.757 1.719-3.278 5.414-5.421 3.98-6.116 4.226-6.116 2.17zm-488.5-.583c-.34-.55-.168-1 .382-1s1.278.45 1.618 1c.34.55.168 1-.382 1s-1.278-.45-1.618-1zm20.75-.031c-2.82-1.134-2.933-2.97-.184-2.97 2.798 0 6.127 1.88 5.403 3.05-.71 1.149-2.22 1.125-5.219-.08zm436.364-3.22c2.11-3.606 9.652-13.75 10.224-13.75.364-.001 3.362-2.499 6.662-5.551s8.025-7.206 10.5-9.231a426.186 426.186 0 0 0 9.358-7.95c6.137-5.39 8.011-5.572 2.76-.267-2.18 2.2-4.338 4-4.798 4-1.253 0-21.159 19.526-27.779 27.25-5.089 5.937-9.002 9.044-6.927 5.5zm-82.427-1.812c.241-.722 1.029-1.51 1.75-1.75.75-.25 1.125.125.875.875-.24.722-1.028 1.51-1.75 1.75-.75.25-1.125-.125-.875-.875zm-371.532-1.766c-.91-1.006-1.655-3.06-1.655-4.566 0-1.505-.46-3.597-1.023-4.648-.724-1.354-.666-2.483.202-3.873.979-1.566.95-2.475-.14-4.513-1.2-2.243-1.15-2.791.419-4.525.981-1.084 1.536-2.62 1.232-3.412-.842-2.194 1.27-15.645 2.832-18.03.757-1.157 1.684-4.027 2.059-6.377.375-2.35 1.073-4.513 1.55-4.809.478-.295.869-1.41.869-2.478 0-1.067.45-1.94 1-1.94s1-.92 1-2.042c0-3.292 3.323-6.167 6.272-5.426 1.39.349 5.31-.078 8.71-.95 10.517-2.694 12.948-1.183 4.84 3.01-1.65.853-2.822 2.278-2.822 3.433 0 2.333-.805 2.436-3.441.443-3.919-2.964-4.958-1.914-9.496 9.6-5.152 13.072-7.099 23.187-7.524 39.093-.378 14.175-1.168 16.116-4.884 12.01zM980 1214.518c0-.55.675-1.56 1.5-2.245.837-.694 1.5-.802 1.5-.244 0 .55-.675 1.56-1.5 2.245-.837.694-1.5.802-1.5.244zm-11.437-2.547c.275-.717 1.948-2.15 3.718-3.187 3.176-1.858 3.2-1.857 1.768.053-2.884 3.85-6.568 5.954-5.486 3.134zm-38.063-1.697c.34-.55.817-1 1.06-1 .242 0 .44.45.44 1s-.476 1-1.059 1c-.582 0-.78-.45-.441-1zm-314-3.019c-4.24-1.564-4.961-2.204-4.744-4.21.204-1.887-.44-2.617-3.186-3.61-2.288-.827-3.547-1.982-3.756-3.444-.176-1.23-1.544-2.786-3.107-3.533-2.133-1.02-2.644-1.808-2.16-3.332.388-1.222-.018-2.715-1.047-3.852-1-1.104-1.432-2.64-1.067-3.788.365-1.151 0-2.44-.91-3.194-.838-.695-1.523-2.333-1.523-3.64 0-1.309-.438-2.379-.974-2.379-.87 0-4.026-5.058-4.026-6.45 0-.302 1.59-.55 3.535-.55 3.159 0 3.428.202 2.522 1.894-.781 1.46-.522 2.517 1.134 4.622 2.46 3.127 9.67 3.159 15.647.068 3.431-1.774 8.162-2.112 8.162-.584 0 .55-1.772 2.772-3.937 4.937-3.64 3.641-4.156 3.855-6.852 2.837-9.163-3.459-7.676 6.534 2.289 15.384 2.2 1.954 5.35 4.004 7 4.555 2.075.693 2.933 1.586 2.781 2.895-.12 1.04.194 3.13.698 4.642 1.092 3.275.574 3.334-6.479.732zm431.5-.789c0-.98 8.664-7.192 10.03-7.192 2.28 0 .681 2.165-2.78 3.766-2.063.953-4.11 2.296-4.55 2.984-.893 1.395-2.7 1.692-2.7.442zm-139.282-3.248c1.77-1.838 3.47-3.09 3.777-2.783.308.308-1.14 1.812-3.218 3.342l-3.777 2.783zm83.515-.645c2.035-2.035 3.993-3.407 4.35-3.05.747.747-5.514 6.75-7.04 6.75-.555 0 .655-1.664 2.69-3.7zm7.767 2.823c0-1.279 2.94-3.515 3.667-2.79.726.727-1.51 3.668-2.79 3.668a.88.88 0 0 1-.877-.878zm-61.738-1.813c.93-.93 1.971-1.41 2.314-1.067.985.985-.526 2.758-2.35 2.758-1.526 0-1.523-.132.036-1.691zm93.738.837c0-2.069 17.061-15.576 24.502-19.4 1.652-.848 3.859-2.488 4.905-3.644 2.177-2.405 4.593-2.771 4.593-.696 0 1.383-9.034 9.593-10.555 9.593-1.268 0-15.673 9.123-19.23 12.179-3.488 2.996-4.215 3.336-4.215 1.968zm-53.758-1.397c.524-1.603 10.676-8.75 12.429-8.75 2.315 0 1.436 1.997-1.421 3.228-1.512.652-4.39 2.442-6.394 3.979-3.975 3.048-5.245 3.472-4.614 1.543zm-323.09-2.635c-.94-.595-.183-1.074 2.49-1.575 2.6-.488 5.054-1.997 7.599-4.672 2.854-3 3.759-3.514 3.759-2.132 0 5.534-9.381 11.21-13.849 8.379zm357.855-5.864c.01-.918 5.747-4.874 8.493-5.855 2.445-.873 2.075-.422-2.887 3.518-3.845 3.053-5.62 3.792-5.606 2.337zM700 1193.391c0-.55.45-1.279 1-1.619.55-.34 1-.167 1 .383s-.45 1.278-1 1.618c-.55.34-1 .168-1-.382zm208.627-2.673c.956-1.458 3.472-3.745 5.592-5.084 2.12-1.338 5.565-3.978 7.656-5.868 5.708-5.156 17.128-11.5 20.61-11.449 2.907.043 2.944.099 1.015 1.555-4.453 3.362-15.777 10.507-20.244 12.773-2.616 1.326-5.656 3.408-6.756 4.626-1.1 1.218-3.712 3.088-5.805 4.156l-3.804 1.942zm86.32.652c1.858-3.47 12.053-7.862 12.053-5.193 0 1.036-7.343 5.482-10.836 6.562-2.127.658-2.235.536-1.216-1.369zm-22.447-3.098c.34-.55 1.068-1 1.618-1s.722.45.382 1c-.34.55-1.068 1-1.618 1s-.722-.45-.382-1zm53-2c.34-.55 1.068-1 1.618-1s.722.45.382 1c-.34.55-1.068 1-1.618 1s-.722-.45-.382-1zm-410.031-1.05c-.95-1.537.351-2.53 1.635-1.246.718.718.735 1.278.052 1.7-.56.346-1.32.142-1.687-.454zm393.407-1.718c.576-1.076 2.527-2.551 4.336-3.277 1.808-.726 4.59-2.388 6.18-3.693 1.591-1.305 4.966-3.471 7.5-4.814 17.722-9.392 30.392-19.688 40.6-32.993 8.847-11.53 9.835-20.614 2.065-18.983-9.29 1.95-10.606 1.856-13.564-.978-5.632-5.396-6.149-14.907-1.27-23.386 4.646-8.074 20.277-23.116 20.277-19.513 0 .326-1.926 3.139-4.28 6.25-5.12 6.763-8.72 15.712-8.72 21.673 0 6.31 1.644 7.482 10.495 7.482 14.466 0 17.412 7.507 8.493 21.644-2.379 3.771-5.52 7.982-6.978 9.357-1.458 1.375-3.07 3.181-3.58 4.015-3.167 5.164-20.996 18.24-33.43 24.52-5.225 2.638-12.875 6.7-17 9.025-9.635 5.43-12.587 6.406-11.124 3.671zm-24.376-.232c.34-.55 1.068-1 1.618-1s.722.45.382 1c-.34.55-1.068 1-1.618 1s-.722-.45-.382-1zm-21.991-2.014c.805-1.302 8.542-5.268 9.13-4.68.84.84-5.79 5.694-7.775 5.694-1.09 0-1.7-.456-1.355-1.014zm72.491-1.053c2.335-1.889 8.33-5.647 23.923-14.997 3.532-2.118 8.032-5.36 10-7.205 7.893-7.402 7.587-4.85-.497 4.14-2.577 2.867-5.962 5.873-7.522 6.679-1.67.863-2.622 2.023-2.316 2.82.32.835-1.354 2.555-4.372 4.492-5.55 3.561-6.216 3.737-6.216 1.639 0-2.136-1.32-1.893-8.159 1.5-7.049 3.497-8.311 3.74-4.841.932zm-40.924-2.568c1.333-1.45 4.871-4.218 7.862-6.151 6.57-4.248 22.227-19.827 26.165-26.038 3.94-6.21 5.594-12.833 6.417-25.676.75-11.703 3.414-20.382 8.03-26.16 3.415-4.27 4.05-2.103.984 3.358-4.679 8.335-5.243 11.082-4.493 21.88 1.682 24.216-12.682 44.616-41.751 59.296-5.511 2.784-6.15 2.682-3.214-.51zm-19.653-3.24c.298-.481 4.533-3.219 9.412-6.082 23.104-13.562 37.056-32 34.22-45.223-2-9.329.842-20.089 6.043-22.872 2.583-1.383 2.39-.26-.727 4.239-2.766 3.991-2.856 6.841-.753 24.014 1.19 9.713-7.444 25.17-17.953 32.146-11.61 7.707-32.321 17.142-30.242 13.778zm-19.387-11.537c1.32-1.273 8.964-3.907 8.964-3.089 0 .861-6.941 4.502-8.582 4.502-1.615 0-1.663-.178-.382-1.413zm-5.536-6.588c.34-.55 1.068-1 1.618-1s.722.45.382 1c-.34.55-1.068 1-1.618 1s-.722-.45-.382-1zm22.233-2.124c.679-.683 1.486-.99 1.794-.682.307.307-.248.867-1.234 1.242-1.425.543-1.54.428-.56-.56zm-15.285-1.79c.383-.622 3.252-3.013 6.375-5.314 3.122-2.3 7.79-6.154 10.37-8.562 2.956-2.756 5.364-4.22 6.5-3.953 1.803.424-8.737 11.744-10.934 11.744-.482 0-2.537 1.304-4.568 2.898-3.959 3.11-8.97 5.171-7.743 3.187zM969 1133.907c0-.256 2.025-2.64 4.5-5.297 2.475-2.658 4.5-5.595 4.5-6.527 0-5.135 16.42-20.81 21.798-20.81 1.221 0-6.408 7.229-9.138 8.658-1.979 1.036-3.836 3.662-6.127 8.665-2.624 5.73-4.27 7.884-8.16 10.678-6.295 4.52-7.373 5.198-7.373 4.633zm15.75-4.828c1.207-1.207 2.496-1.893 2.865-1.524.973.973-1.582 3.719-3.46 3.719-1.285 0-1.169-.431.595-2.195zm93.72-36.452c.713-4.758 2.365-8.353 3.838-8.353.455 0 .61.787.343 1.75-.265.962-.773 3.887-1.128 6.5-.455 3.349-1.103 4.75-2.198 4.75-1.28 0-1.43-.815-.855-4.647zm14.009-11.692c2.656-7.6 9.11-17.073 16.971-24.911 3.172-3.163 5.937-5.75 6.144-5.75.75 0-3.214 5.726-8.68 12.538-5.794 7.218-12.047 17.051-13.834 21.752-2.163 5.689-2.708 2.4-.601-3.629zm334.356 522.462c2.404-1.524-2.618-2.104-23.835-2.752-15.8-.483-20.246-.355-19.39.56.732.784 7.025 1.375 18.5 1.74 9.564.304 17.578.727 17.807.94.761.71 5.563.37 6.918-.488zm87.915-9.97c3.278-.403.705-1.784-3.5-1.877-2.612-.058-12.323-.6-21.578-1.202-16.62-1.082-21.387-.723-16.593 1.252 3.24 1.336 34.529 2.708 41.671 1.828zm-247.75-4.594c0-.793-.474-1.734-1.053-2.092-.579-.358-.863-1.172-.632-1.81.23-.636-.16-2.282-.87-3.657-.708-1.375-1.557-3.348-1.886-4.384-.504-1.587-1.268-1.791-4.851-1.3-4.91.673-8.212-.658-5.708-2.3.825-.54 2.85-.756 4.5-.479 3.588.604 6.018-.744 5.198-2.883-.49-1.277-1.87-1.447-7.896-.974-8.09.636-10.288 1.726-7.552 3.747.963.711 1.75 2.523 1.75 4.026 0 1.901.615 2.894 2.019 3.262 1.48.387 1.947 1.23 1.75 3.156-.252 2.467.038 2.66 4.731 3.128 3.105.311 4.52.811 3.734 1.32-2.054 1.328-.377 2.68 3.325 2.68 2.33 0 3.441-.465 3.441-1.44zm-12.5-7.56c-.352-.569.51-1 2-1s2.352.431 2 1c-.34.55-1.24 1-2 1s-1.66-.45-2-1zm211.23 8.396c-.333-.332-1.196-.367-1.918-.079-.797.32-.56.557.605.605 1.054.043 1.645-.193 1.312-.526zm34.242-2.357c1.26-.797 1.225-1.026-.25-1.592-2.18-.836-5.05.214-4.226 1.546.772 1.25 2.543 1.268 4.476.046zm-13.972-1.038c1.165-.753.872-.973-1.309-.985-1.621-.01-2.548.407-2.191.985.767 1.241 1.579 1.241 3.5 0zm29-5c0-.973-2.159-1.219-12.5-1.422-6.649-.13-8.13.77-2.5 1.521 7.568 1.01 15 .96 15-.1zm-32.238-1.688c-.956-.25-2.756-.259-4-.02-1.244.24-.462.444 1.738.455 2.2.011 3.218-.184 2.262-.434zm-1048.194-2.535c-.93-.52-2.45-.62-3.379-.224-1.41.603-1.277.838.811 1.427 3.114.878 4.84.07 2.568-1.203zm1062.682-3.44c-.688-.277-1.813-.277-2.5 0-.688.278-.125.505 1.25.505s1.938-.227 1.25-.505zm-1174-15c-.688-.277-1.813-.277-2.5 0-.688.278-.125.505 1.25.505s1.938-.227 1.25-.505zm1089.75-.338c0-.55-.477-1-1.059-1-.583 0-.78.45-.441 1 .34.55.817 1 1.059 1 .243 0 .441-.45.441-1zm5.2-.2c-.933-.933-1.467-.933-2.4 0-.933.934-.667 1.2 1.2 1.2s2.133-.266 1.2-1.2zm-1103.47-.404c-.333-.332-1.196-.368-1.918-.079-.797.32-.56.557.605.605 1.054.043 1.645-.193 1.312-.526zm-.318-4c2.219-.852.948-2.396-1.971-2.396-2.376 0-3.124.984-1.774 2.334.825.825 1.718.84 3.746.062zm443.088-.396c-.34-.55-1.24-1-2-1s-1.66.45-2 1c-.352.57.51 1 2 1s2.352-.43 2-1zm-456-1c.352-.569-.51-1-2-1s-2.352.431-2 1c.34.55 1.24 1 2 1s1.66-.45 2-1zm-9.846-1.133c-1.324-.77-2.16-.761-2.95.03-.805.804-.305 1.095 1.846 1.073 2.586-.027 2.722-.163 1.104-1.104zM760 1547.332c0-1.436-1.637-2.135-3.41-1.455-2.441.937-1.887 2.396.91 2.396 1.375 0 2.5-.423 2.5-.94zm4.715-6.684c.388-1.184-3.431-2.302-5.503-1.612-.666.222-1.212 1.07-1.212 1.884 0 1.774 6.126 1.526 6.715-.272zm-336.215-4.14c.55-.404 1-1.39 1-2.19s1.125-1.733 2.5-2.073l2.5-.619-2.25-.743c-2.353-.778-2.91-2.084-1.31-3.073 1.368-.845 32.874-.824 44.46.03 7.433.548 9.722.44 9.182-.435-.396-.64-1.073-.946-1.504-.68-.43.267-1.637-.144-2.68-.912-4.328-3.185 2.125-3.516 43.102-2.211 14.3.455 29.334 1.2 33.41 1.657 7.629.854 10.42.506 9.843-1.227-.538-1.614-46.09-24.51-52.431-26.353-3.197-.93-7.39-2.685-9.317-3.901-1.928-1.217-4.63-2.539-6.005-2.938s-3.963-1.386-5.75-2.193c-1.788-.807-5.613-1.72-8.5-2.03-2.888-.31-7.178-1.189-9.535-1.953-6.025-1.955-17.59-1.85-19.27.176-.714.86-2.682 2.276-4.372 3.145-1.69.869-5.25 3.53-7.91 5.916-2.66 2.384-7.943 6.4-11.74 8.924-8.568 5.696-8.86 6.232-8.196 15.017.315 4.171.032 9.27-.682 12.243-.672 2.802-.93 5.565-.574 6.141.74 1.199 4.54 1.376 6.029.282zm351.924-1.259c.65-.649-.17-1.952-2.392-3.808-4.27-3.565-3.655-5.916 1.662-6.354 7.377-.608 3.807-2.314-5.444-2.601-9.159-.285-13.356-2.213-4.816-2.213 4.093 0 4.457-.21 4.75-2.75.304-2.649.555-2.76 6.816-3.052 9.084-.424 10.244-2.193 1.45-2.213-3.822-.01-7.612-.434-8.422-.946-1.779-1.125-1.656-1.174 8.472-3.356 5.428-1.17 6.495-1.666 4.75-2.212-1.238-.387-2.25-1.052-2.25-1.479 0-1.278 7.791-3.992 11.461-3.992 3.638 0 5.72-1.681 3.102-2.507-.86-.27-2.227-.7-3.04-.952-2.264-.705 1.157-6.034 4.946-7.704 1.78-.785 2.927-1.982 2.78-2.9-.15-.94 1.149-2.233 3.25-3.235 2.47-1.178 3.505-2.337 3.515-3.935.01-1.247.285-3.279.616-4.517 1.28-4.777-4.425-1.192-17.13 10.763-8.162 7.68-17.632 14.515-25.861 18.665-10.75 5.421-11.659 6.815-11.54 17.718.155 14.089.097 13.992 8.942 14.708 8.403.679 12.931.324 14.383-1.128zm-9.611-3.659c.721-.288 1.584-.253 1.916.08.332.332-.258.568-1.312.525-1.165-.048-1.402-.285-.605-.604zm-7.248-4.212c-.666-1.077 1.436-1.984 3.185-1.374.688.24 1.25.849 1.25 1.353 0 1.18-3.708 1.198-4.435.022zM418 1534.274c0-.55-.675-1-1.5-1s-1.5.45-1.5 1 .675 1 1.5 1 1.5-.45 1.5-1zm-65.27-.605c-.333-.332-1.196-.368-1.918-.079-.797.32-.56.557.605.605 1.054.043 1.645-.193 1.312-.526zm136.77-.396c.378-.61-1.156-1-3.94-1-2.508 0-4.56.45-4.56 1s1.774 1 3.941 1c2.168 0 4.22-.45 4.559-1zm14.262.313c-.956-.25-2.756-.259-4-.02-1.244.24-.462.444 1.738.455 2.2.011 3.218-.184 2.262-.434zm6.967.083c-.332-.332-1.195-.367-1.916-.079-.798.32-.561.557.604.605 1.054.043 1.645-.193 1.312-.526zM410.5 1530.44c0-1.809-1.957-1.478-2.345.396-.216 1.043.158 1.5 1 1.22.74-.247 1.345-.974 1.345-1.616zm34.75 1.171c-.688-.277-1.813-.277-2.5 0-.688.278-.125.505 1.25.505s1.938-.227 1.25-.505zm-26.75-3.338c-.34-.55-1.041-1-1.559-1-.517 0-.941.45-.941 1s.702 1 1.56 1c.856 0 1.28-.45.94-1zm99.5-.08c0-.824-8.934-2.078-10.02-1.406-.448.276-3.756.086-7.352-.424-6.558-.928-10.628-.562-10.628.958 0 .448 1.012 1.004 2.25 1.236 3.56.668 25.75.355 25.75-.363zm12.75.392c-.963-.252-2.538-.252-3.5 0-.963.251-.175.457 1.75.457s2.712-.206 1.75-.457zM419 1521.773c0-.824-.675-1.5-1.5-1.5s-1.5.676-1.5 1.5c0 .826.675 1.5 1.5 1.5s1.5-.674 1.5-1.5zm719.362 0c.316-.824 1.243-1.5 2.06-1.5 2.807 0 6.578-2.323 6.578-4.053 0-4.443-7.768-2.23-10.462 2.98-.823 1.591-2.068 3.123-2.767 3.404-.699.281-.082.547 1.372.59 1.485.045 2.895-.577 3.219-1.42zm-562.363-1.25c0-.412-1.083-5.25-2.405-10.75-1.322-5.5-2.695-13.948-3.053-18.774-.613-8.29-3.174-17.247-7.099-24.837-2.58-4.99-5.1-5.864-19.983-6.927-7.597-.543-15.42-1.42-17.386-1.95-1.965-.528-7.191-1.851-11.613-2.939-10.557-2.596-23-7.394-28.93-11.156-6.43-4.077-7.187-3.668-10.44 5.642-1.548 4.432-3.398 9.15-4.112 10.483-.714 1.334-1.789 4.908-2.388 7.942-.741 3.753-1.57 5.517-2.59 5.517-4.563 0-.309-20.533 6.182-29.841l4.073-5.841-2.133-2.66c-1.174-1.462-3.932-5.003-6.13-7.868-6.894-8.988-11.28-13.011-15.431-14.151-3.763-1.034-8.48-.641-8.633.719-2.332 20.735 1.312 38.346 11.477 55.454 3.086 5.196 2.602 9.688-1.046 9.688-2.438 0-10.362 4.786-13.901 8.396-1.674 1.707-6.545 5.958-10.824 9.446-4.28 3.489-7.57 6.555-7.31 6.814.583.584 13.098-7.857 17.176-11.584 10.448-9.551 14.939-11.923 23.963-12.655 4.725-.383 8.85-1.113 9.164-1.622.314-.51 1.393-.182 2.398.727 2.271 2.055 5.584 1.538 5.181-.809-.493-2.876 1.478-1.914 3.661 1.787 2.563 4.343 6.745 5.073 5.722 1-.907-3.614.877-3.07 3.278 1 2.206 3.738 4.484 4.482 5.912 1.93.728-1.301 1.343-.96 3.6 2 3.004 3.938 5.621 4.668 5.621 1.57 0-2.697 1.841-2.54 2.919.25 2.058 5.327 9.178 8.782 7.554 3.665-1.171-3.69 2.19-1.989 4 2.026 2.432 5.393 6.934 6.503 5.113 1.26-.325-.935.423-.355 1.661 1.29 5.575 7.402 8.358 8.546 7.319 3.009-.872-4.648.819-4.492 2.722.25 2.446 6.094 6.636 10.073 8.264 7.847 1.194-1.632 1.518-1.449 3.957 2.237 4.352 6.577 8.527 6.004 5.063-.695-1.854-3.586-1.959-4.435-.485-3.944.598.2 2.735 3.5 4.75 7.334 3.97 7.553 7.68 9.904 8.336 5.28.3-2.125.514-2.01 2.659 1.44 2.122 3.414 4.17 4.888 4.167 3zM459 1442.274c0-.55.675-1 1.5-1s1.5.45 1.5 1-.675 1-1.5 1-1.5-.45-1.5-1zm-5.333-.666c-1.165-1.165-.72-4.045.823-5.325 1.233-1.023 1.644-.829 2.385 1.127 1.195 3.159-1.162 6.244-3.208 4.198zm-6.111-5.243c-.723-1.17.385-4.09 1.551-4.09.491 0 .893 1.125.893 2.5 0 2.47-1.355 3.352-2.444 1.59zm718.153 82.282c.657-1.971-3.667-4.889-5.518-3.723-2.12 1.335-2.782 4.367-1.171 5.363 1.49.92 6.222-.24 6.69-1.64zm23.291 1.077c0-1.634-5.598-4.45-8.845-4.45-3.068 0-4.54 2.472-2.618 4.395 2.218 2.218 11.463 2.262 11.463.055zm-138.565-.425c3.037-1.154 3.58-5.421.824-6.479-2.776-1.065-6.677 4.703-4.592 6.788.84.84.72.85 3.768-.309zm22.377-3.268c.224-1.175-1.135-2.643-4.167-4.5-2.475-1.516-4.715-3.544-4.979-4.506-.263-.963-1.42-1.75-2.572-1.75-2.413 0-2.815 1.786-.594 2.638.828.318 1.5 1.802 1.5 3.314 0 5.417 9.86 9.798 10.812 4.804zm171.938-.34c-.953-.953-2.864.59-2.153 1.74.422.683.981.666 1.7-.052.588-.59.792-1.348.453-1.688zm-30.75-2.524c0-.49-1.125-.892-2.5-.892-2.599 0-3.43 1.508-1.25 2.269 1.608.56 3.75-.225 3.75-1.376zm-34-.873c0-1.248-4.537-2.423-5.96-1.544-.59.364-.814 1.082-.497 1.594.768 1.242 6.457 1.198 6.457-.05zm-30-1.732c0-.942 1.238-2.731 2.75-3.976 2.222-1.83 2.48-2.443 1.34-3.196-2.418-1.597-5.613.34-5.402 3.275.122 1.69-.318 2.61-1.25 2.61-1.509 0-1.905 1.199-.771 2.333 1.289 1.289 3.333.648 3.333-1.046zm77.868-1.799c1.657-1.57.682-3.489-1.772-3.489-2.26 0-5.514 3.514-4.61 4.978.782 1.266 4.355.432 6.382-1.489zm-297.872.016c1.478-1.78-1.053-6.505-3.484-6.505-1.713 0-3.512 3.04-3.512 5.934 0 2.528 5.03 2.939 6.996.571zm187.44.6c.8-1.296-3.256-1.942-14.436-2.3-9.934-.319-14.156 1.255-6 2.236 8.182.985 19.844 1.02 20.436.063zm81.038-1.062c.325-.527-.751-1.652-2.392-2.5-3.681-1.904-4.082-1.913-4.082-.092 0 2.546 5.212 4.633 6.474 2.592zm-22.474-1.42c0-2.27-2.775-3.896-5.487-3.215-4.453 1.118-3.328 4.593 1.487 4.593 2.73 0 4-.438 4-1.378zm-86.194-3.837c.221-1.16-.538-1.931-2.347-2.385-3.091-.776-5.016 1.223-3.24 3.364 1.492 1.797 5.182 1.15 5.587-.979zm145.858-.353c1.064-2.772-1.271-3.92-4.145-2.037-1.42.93-2.317 2.123-1.992 2.648.955 1.546 5.482 1.095 6.137-.61zm-174.914-1.182c.547-1.642-2.586-2.814-3.93-1.47-.575.575-.728 1.56-.34 2.188.884 1.43 3.714.954 4.27-.718zm111.049-2.445c.483-2.507-3.621-4.412-5.487-2.546-1.273 1.273-1.243 1.666.238 3.148 2.032 2.031 4.803 1.714 5.249-.602zm16.384-.023c-.717-.717-1.183-.776-1.183-.15 0 1.335 1.183 2.518 1.85 1.85.284-.284-.016-1.049-.667-1.7zm-30.194-.27c.68-.818.994-2.114.7-2.88-.4-1.043.73-1.515 4.495-1.877 6.762-.65 8.798-5.09 3.608-7.867-1.796-.961-1.827-1.193-.375-2.797 1.762-1.947 2.08-4.667.649-5.551-.514-.318-.695-2.053-.402-3.856.626-3.859-1.18-5.886-4.477-5.024-2.055.538-4.105 4.754-2.898 5.961.29.29.185 1.732-.235 3.204-.42 1.47-.442 3.574-.05 4.674.515 1.44.024 2.645-1.748 4.299-1.735 1.618-2.292 2.95-1.882 4.5.406 1.537-.062 2.69-1.552 3.823-1.337 1.016-1.9 2.23-1.51 3.25.782 2.036 4.038 2.117 5.678.14zm-22.665-1.915c.296-.771.3-1.64.01-1.931-.918-.919-3.333.487-3.333 1.94 0 1.815 2.627 1.808 3.324-.01zm107.437-1.232c1.725-1.088 2.115-2.013 1.642-3.896-.458-1.824-.218-2.47.917-2.47 2.291 0 4.902-3.045 4.366-5.092-.258-.988.381-2.564 1.423-3.506 2.374-2.148 2.452-5.972.141-6.862-1.61-.62-1.618-.748-.095-1.604 1.88-1.056 2.002-8.178.171-10.01-1.404-1.404-7.555-.782-8.08.818-.225.684.865 1.767 2.422 2.407 2.489 1.023 2.59 1.217.832 1.604-3.651.802-4.154 2.235-1.5 4.277 2.443 1.88 2.45 1.924.321 1.946-5.063.052-6.946 5.331-2.601 7.294l2.72 1.228-3.97.5c-3.865.487-3.978.613-4.278 4.75-.169 2.338-.716 4.25-1.215 4.25-.499 0-1.43.977-2.069 2.171-2.356 4.403 3.178 5.774 8.853 2.195zm-160.034-.026c.574-1.75-3.907-5.459-6.197-5.129-2.673.385-3.225 3.808-.89 5.516 2.14 1.564 6.525 1.325 7.087-.387zm133.323-1.865c3.152-1.63 4.208-4.222 1.2-2.947-.962.408-3.548 1.392-5.747 2.187-5.223 1.89-5.504 2.286-1.62 2.286 1.769 0 4.544-.687 6.167-1.526zM755 1492.714c0-.857-.457-1.276-1.016-.93-.56.345-.758 1.047-.441 1.559.857 1.387 1.457 1.128 1.457-.629zm429.298-.071c.99-.99-1.203-4.369-2.833-4.369-1.738 0-1.807.492-.43 3.066 1.062 1.983 2.148 2.417 3.263 1.303zm-44.464-5.309c.227-1.551-.093-2.142-1-1.843-.734.242-1.484 1.467-1.668 2.723-.227 1.551.093 2.142 1 1.843.734-.242 1.484-1.467 1.668-2.723zm-38.834 1.114c0-1.09-3.921-4.626-6.75-6.084-1.238-.638-2.25-1.897-2.25-2.796 0-1.695-2.752-5.294-4.048-5.294-3.967 0 3.278 11.288 8.797 13.705 3.322 1.455 4.251 1.558 4.251.47zm21.771-.987c.244-.73-.214-.954-1.187-.58-.871.334-1.584 1.046-1.584 1.583 0 1.315 2.273.492 2.771-1.003zm-365.021.183c2.368-.635 3.065-2.932 1.09-3.59-.637-.212.938-1.187 3.5-2.166 5.144-1.964 5.419-2.339 3.007-4.102-2.063-1.509-.951-3.507 1.962-3.526 3.704-.023 6.691-1.154 6.691-2.533 0-.723-1.012-1.491-2.25-1.707-2.541-.445-1.857-.808 5.064-2.691 4.5-1.224 5.229-3.305 1.358-3.875-3.25-.478-2.619-2.18.808-2.18 6.601 0 13.692-4.489 9.02-5.71-2.708-.708-2.52-1.943.408-2.677 1.799-.452 2.276-1.106 1.888-2.591-.611-2.336 2.83-4.022 8.21-4.022 3.66 0 5.57-1.717 3.401-3.057-1.637-1.012-1.277-1.382 2.593-2.66 1.97-.65 2.898-1.56 2.703-2.65-.163-.913.379-1.919 1.204-2.236 3.979-1.526 6.71-10.397 3.201-10.397-1.746 0-16.338 7.754-17.192 9.136-.33.534-2.96 2.014-5.844 3.29-2.885 1.276-8.13 4.759-11.658 7.74-3.528 2.982-9.789 7.953-13.914 11.047-4.125 3.094-9.952 7.838-12.949 10.541l-5.449 4.915 1.7 4.45c.934 2.446 1.698 4.966 1.698 5.6 0 5.368 3.416 7.348 9.75 5.65zm122.46-2.78c15.713-5.046 20.745-49.56 7.889-69.785-5.632-8.859-15.63-10.751-21.714-4.11-5.319 5.807-4.623 9.697.77 4.305 8.94-8.94 20.3-.086 23.092 18 4.47 28.955-2.433 47.692-17.968 48.769l-5.779.4-5.306-5.229c-9.953-9.808-12.741-19.767-11.883-42.44 1.19-31.425 8.462-42.9 27.189-42.902 6.29-.001 8.78 1.076 15.285 6.608 3.745 3.185 6.222 3.602 6.2 1.044-.03-3.31-7.588-9.87-13.914-12.075-22.275-7.765-38.292 12.152-38.46 47.825-.116 24.743 3.282 37.154 12.437 45.425 7.26 6.558 11.957 7.44 22.162 4.164zm196.116 1.004c.296-.773-.305-2.17-1.338-3.105-1.032-.934-2.014-3.112-2.183-4.84-.235-2.424-1.05-3.494-3.562-4.675-3.022-1.42-3.139-1.65-1.613-3.175 2.93-2.931-1.891-7.787-6.121-6.164-2.815 1.08-.65 7.365 2.537 7.365.497 0 .63 1.37.295 3.043-.449 2.246-.083 3.622 1.394 5.25 1.101 1.214 2.295 3.445 2.653 4.957.732 3.096 6.867 4.134 7.938 1.344zm147.674-1.594c0-1.1-.395-2-.878-2-1.31 0-3.204 2.585-2.447 3.342 1.37 1.369 3.325.58 3.325-1.342zm-29-.941c0-1.18-1.95-2.443-2.667-1.726-.716.716.546 2.667 1.726 2.667a.944.944 0 0 0 .941-.941zm-14.317-2.247c-.32-.798-.556-.56-.604.604-.043 1.054.193 1.645.525 1.313.332-.333.368-1.195.08-1.917zm-36.683-2.518c0-2.364-2.468-.858-2.846 1.736-.302 2.072-.143 2.206 1.25 1.05.878-.73 1.596-1.983 1.596-2.786zm-15.172.956c1.662-3.24 2.363-10.48.969-10.016-1.083.36-4.781 8.862-4.793 11.015-.01 1.485 2.945.712 3.824-1zm99.51-2.424c.539-.855.678-2.341.31-3.303-.949-2.471-3.648-.116-3.648 3.182 0 2.654 1.7 2.716 3.338.12zm-36.338-3.326c0-2.381-.46-3.5-1.441-3.5-2.048 0-2.72 1.51-1.981 4.454.978 3.897 3.422 3.216 3.422-.955zm-12.758-2.032c-1.194-2.134-2.738-.204-1.798 2.247.442 1.15.931 1.31 1.692.548.71-.709.745-1.654.106-2.795zm-34.242.032c0-.825-.45-1.5-1-1.5s-1 .675-1 1.5.45 1.5 1 1.5 1-.675 1-1.5zm-58-3.032c0-1.392-.694-2.798-1.543-3.123-2.16-.83-2.803.14-2.058 3.108.842 3.356 3.601 3.368 3.601.015zm30.5.531c0-1.07-.87-1.413-3.037-1.196-1.67.166-4.932-.123-7.25-.644-4.643-1.043-5.034-.724-2.518 2.056 2.192 2.422 12.805 2.243 12.805-.215zm98.929-.57c1.97-1.971 2.015-3.43.106-3.43-1.63 0-3.822 3.38-2.833 4.369.867.867.947.84 2.727-.94zM728 1466.272c0-.55-.476-1-1.059-1-.582 0-.78.45-.441 1 .34.55.817 1 1.06 1 .242 0 .44-.45.44-1zm462.5-1c0-.733-.563-1.52-1.25-1.75-.744-.247-1.25.462-1.25 1.75 0 1.29.506 1.998 1.25 1.75.688-.229 1.25-1.016 1.25-1.75zm-24.5-.8c0-.99-.471-2.271-1.048-2.847-.73-.73-.678-1.86.173-3.727 1.39-3.05.076-5.3-2.514-4.306-1.249.479-1.801 9.998-.722 12.43.548 1.236 4.111-.108 4.111-1.55zm-178.29-1.164c8.656-5.278 13.239-29.177 7.892-41.161-5.866-13.15-16.825-16.318-25.581-7.395-2.676 2.726-4.07 4.971-3.822 6.156.327 1.56 1.004 1.19 4.159-2.273 9.186-10.086 21.993-3.502 23.312 11.983.778 9.146.402 14.614-1.22 17.75-.797 1.543-1.45 3.442-1.45 4.22 0 2.228-3.96 6.684-5.938 6.684-9.191 0-11.523-18.034-3.315-25.64 2.226-2.064 2.374-4.36.28-4.36-.47 0-2.186 1.812-3.814 4.025-5.789 7.872-4.911 24.921 1.545 30 3.12 2.454 3.944 2.455 7.952.01zm-108.265-1.286c4.78-4.206 5.487-16.068 1.477-24.768-2.786-6.044-5.93-9.306-7.48-7.757-.224.224 1.214 3.46 3.195 7.19 2.951 5.558 3.516 7.538 3.128 10.974-1.32 11.721-6.923 15.03-12.885 7.612-4.493-5.59-7.586-4.2-4.393 1.975 3.584 6.93 11.861 9.26 16.958 4.774zm254.305-.333c-.953-.953-2.864.59-2.153 1.74.422.683.981.666 1.7-.052.588-.59.792-1.348.453-1.688zm-168.143-.998c-.334-.87-.614-4.583-.622-8.25-.01-3.668-.459-7.343-1-8.168-1.908-2.906-3.132 1.03-2.54 8.166.662 7.973 1.28 9.833 3.269 9.833.957 0 1.28-.572.893-1.581zm99.328-.168c1.908-1.549 1.996-1.97.758-3.66-1.051-1.434-1.146-2.58-.382-4.602 1.657-4.39.381-5.988-4.78-5.988-2.895 0-4.574.45-4.65 1.25-.248 2.62.359 4.321 2.28 6.394 1.292 1.392 1.612 2.378.914 2.809-1.494.924-1.343 2.135.496 3.975 1.997 1.997 2.713 1.973 5.364-.178zm18.92-1.926c-1.495-1.801-3.373-.117-2.476 2.22.526 1.371.921 1.451 2.145.435 1.165-.966 1.239-1.56.33-2.655zm16.295 2.176c0-.523-.484-1.112-1.075-1.309-.591-.197-1.075.392-1.075 1.309 0 .916.484 1.505 1.075 1.308.591-.197 1.075-.786 1.075-1.309zm90.514-2.068c.791-2.061-1.282-4.214-2.697-2.8-1.145 1.146-.28 4.368 1.171 4.368.509 0 1.195-.706 1.526-1.568zm61.402-.468c2.162-1.157 2.571-4.927.734-6.765-1.776-1.775-7.467-1.51-8.193.382-2.18 5.682 2.033 9.287 7.459 6.383zm-128.473-5.45c-.367-1.462-1.213-2.477-1.88-2.257-1.42.467-2.14 4.188-1.255 6.493 1.098 2.862 3.95-.992 3.135-4.237zm24.966 1.581c-.372-.602-1.048-1.095-1.501-1.095-1.022 0-2.055 3.669-1.259 4.465.945.946 3.5-2.173 2.76-3.37zm-50.559-2.595c0-3.407-1.216-4.579-2.535-2.444-.871 1.41.314 5.944 1.554 5.944.54 0 .981-1.575.981-3.5zm37 1.5c0-1.112-.667-2-1.5-2s-1.5.888-1.5 2c0 1.11.667 2 1.5 2s1.5-.89 1.5-2zm-52-2.441c0-3.95-1.224-5.2-2.998-3.062-1.551 1.87-.47 6.503 1.517 6.503 1.021 0 1.481-1.07 1.481-3.441zm138.965 1.506c1.453-2.715 1.287-5.066-.358-5.066-1.529 0-2.607 2.102-2.607 5.082 0 2.475 1.637 2.466 2.965-.016zm-29.965-3.672c0-1.483-.583-2.393-1.531-2.393-1.802 0-2.923 2.375-2.114 4.483.863 2.248 3.645.652 3.645-2.09zm12 .048c0-.793-.45-1.441-1-1.441s-1 .926-1 2.059c0 1.132.45 1.78 1 1.44.55-.34 1-1.266 1-2.058zm-38.5-1.955c0-2.798-2.929-2.488-3.331.353-.257 1.813.08 2.26 1.5 1.986 1.042-.2 1.831-1.209 1.831-2.34zm-17.5-.545c0-1.133-.45-1.781-1-1.441-.55.34-1 1.266-1 2.059 0 .792.45 1.44 1 1.44s1-.926 1-2.058zm-25-1.941c0-1.95-1.06-2.606-2.264-1.403-.802.801.247 3.402 1.371 3.402.491 0 .893-.9.893-2zm12 1c0-.55-.45-1-1-1s-1 .45-1 1 .45 1 1 1 1-.45 1-1zm-51.666-4.574c-.645-1.68-1.952-1.853-2.864-.379-1.203 1.948.373 4.327 1.982 2.992.786-.652 1.183-1.828.882-2.613zm14.666 2.132c0-1.955-1.938-3.02-3.2-1.759-.564.565-.723 1.515-.354 2.113.98 1.586 3.554 1.33 3.554-.353zm155.527-.602c.993-1.606-1.491-3.956-4.18-3.956-2.78 0-4.306 2.779-2.243 4.085 1.917 1.214 5.64 1.139 6.423-.13zm-87.704-2.29c.192-.986-.318-1.666-1.25-1.666-.927 0-1.573.855-1.573 2.083 0 2.437 2.337 2.092 2.823-.416zm68.177.5c0-1.302-1.189-2.168-2.156-1.57-1.034.639-.142 2.404 1.215 2.404.518 0 .941-.375.941-.834zm-12-2.666c0-.825-.45-1.5-1-1.5s-1 .675-1 1.5.45 1.5 1 1.5 1-.675 1-1.5zm-257.682-.25c.24-.413.706-3.9 1.035-7.75l.6-7-1.95 4c-2.69 5.516-2.399 15.418.315 10.75zm119.383-3.648c-.57-1.71-2.677-1.828-3.308-.186-1.163 3.032.507 5.413 2.192 3.124.793-1.078 1.295-2.4 1.116-2.938zm37.299 3.433c0-1.198-3.531-3.171-4.3-2.403-.309.31-.32 1.194-.024 1.965.602 1.569 4.325 1.945 4.325.438zm60.393-1.297c1.244-1.972.285-3.213-1.85-2.393-1.785.685-2.142 5.02-.364 4.428.648-.216 1.644-1.132 2.214-2.035zm-83.393-.238c0-.825-.423-1.5-.941-1.5-1.261 0-2.164 1.561-1.365 2.36 1.126 1.126 2.306.686 2.306-.86zm12.075.225c-.124-1.196-1.495-.965-1.925.324-.22.66.14 1.02.8.8.66-.22 1.166-.726 1.125-1.125zm58.234-5.992c.635-4.734-.496-6.734-3.809-6.734-3.206 0-4.922 2.343-3.57 4.87.589 1.1 1.07 3.064 1.07 4.365 0 6.727 5.356 4.604 6.309-2.501zm26.691 5.766c0-.825-.45-1.5-1-1.5s-1 .675-1 1.5.45 1.5 1 1.5 1-.675 1-1.5zm58.82-2.25c.239-1.685-.18-2.25-1.669-2.25-1.093 0-2.695-.271-3.56-.603-1.81-.695-3.12 1.782-2.205 4.167.987 2.572 7.034 1.503 7.434-1.314zm-32.82-1.69c0-2.653-1.687-4.305-2.983-2.922-1.008 1.076.55 5.362 1.95 5.362.568 0 1.033-1.098 1.033-2.44zm-87.556.53c.69-1.114-.362-4.09-1.444-4.09-1.082 0-2.133 2.976-1.444 4.09.309.501.959.91 1.444.91s1.135-.409 1.444-.91zm15.556-.59c0-.824-.675-1.5-1.5-1.5s-1.5.676-1.5 1.5c0 .826.675 1.5 1.5 1.5s1.5-.674 1.5-1.5zm49.813-3.437c.25-.75-.126-1.125-.876-.875-.721.24-1.509 1.028-1.75 1.75-.25.75.126 1.125.876.875.721-.24 1.509-1.028 1.75-1.75zm-114.813-1.62c0-.793-.675-1.441-1.5-1.441-1.506 0-2.056 2.11-.86 3.306.933.933 2.36-.195 2.36-1.865zm16.5.545c0-2.144-2.906-1.834-3.327.354-.257 1.337.15 1.744 1.486 1.487 1.013-.195 1.841-1.024 1.841-1.841zm83 .014c.34-.55.141-1-.441-1s-1.059.45-1.059 1 .198 1 .441 1c.242 0 .72-.45 1.059-1zm68.918.393c2.249-.863 1.958-2.897-.668-4.662l-2.25-1.514 2.75-1.269c3.291-1.52 3.48-3.191.654-5.823l-2.096-1.952 2.096-1.122c4.318-2.31.27-4.864-8.404-5.3-6.624-.333-6.915 2.12-.5 4.225 3.845 1.26 4.136 1.53 2 1.846-5.704.844-6.958 5.6-1.94 7.349l3.062 1.067-2.061 1.92c-4.287 3.994.925 7.703 7.357 5.235zm-104.008-2.02c.71-1.848-1.003-4.373-2.965-4.373-1.51 0-2.875 3.494-1.95 4.99.98 1.588 4.226 1.18 4.915-.617zm66.59-1.713c0-2.85-8.664-4.79-11.992-2.687-2.087 1.32-.306 2.79 3.992 3.295 6.9.811 8 .727 8-.608zm-85-1.554c0-2.235-3.015-3.7-4.077-1.981-1.115 1.803.052 3.875 2.184 3.875 1.19 0 1.893-.703 1.893-1.893zm-25.621-1.652c.802-2.09-1.356-2.906-3.093-1.169-.838.837-1.23 1.996-.872 2.575.812 1.315 3.253.45 3.965-1.406zm65.371-1.24c2.04-2.605 1.452-4.974-1.5-6.052l-2.75-1.005 2.816-.079c4.123-.115 6.684-1.83 6.684-4.476 0-2.164-.513-2.373-7.346-2.992-4.04-.366-8.09-.38-9-.031-2.346.9-2.077 5.123.41 6.455 1.487.796 1.779 1.45 1.042 2.337-1.099 1.325-.455 5.314 1.198 7.423 1.29 1.646 6.716.632 8.446-1.58zm-83.75-1.273c0-.518-.45-.941-1-.941s-1 .701-1 1.559c0 .857.45 1.28 1 .94.55-.34 1-1.041 1-1.558zm-650.5-.941c.34-.55.141-1-.44-1-.583 0-1.06.45-1.06 1s.199 1 .441 1c.243 0 .72-.45 1.059-1zm685.5-1.46c0-2.23-7.382-4.143-10.503-2.721-4.94 2.25-2.78 3.368 7.753 4.012 1.82.112 2.75-.325 2.75-1.291zm24.444.55c.863-1.397-.488-4.09-2.051-4.09-.766 0-1.393.824-1.393 1.833 0 2.847 2.192 4.283 3.444 2.257zm-55.97-5.04c2.007-3.882 1.939-4.248-.724-3.87-1.725.245-2.323 1.079-2.563 3.57-.391 4.052 1.269 4.203 3.287.3zm101.942-.694c.838-2.181-.274-3.195-1.455-1.328-1.183 1.87-1.208 2.971-.068 2.971.491 0 1.177-.739 1.523-1.643zm-49.416-3.587c0-1.35-2.98-4.77-4.155-4.77-1.44 0-.93 3.773.736 5.438 1.632 1.633 3.419 1.284 3.419-.668zm80-1.734c0-1.052-3.224-3.035-4.934-3.035-1.928 0-1.112 2.045 1.184 2.968 2.997 1.205 3.75 1.218 3.75.066zm-21.86-2.002c1.35-1.125 1.797-1.981 1.044-2-1.883-.048-5.184 1.864-5.184 3.002 0 1.517 1.572 1.137 4.14-1.002zm-103.363-.59c2.532-1.773 2.966-4.443.723-4.443-1.977 0-5.738 3.805-4.977 5.036.823 1.332 1.676 1.213 4.255-.593zm157.49-.13c1.265-.746-.313-2.427-3.637-3.873-3.1-1.35-3.105-1.363-.502-1.401 3.086-.046 5.156-2.135 4.308-4.347-.872-2.272-28.98-7.71-31.572-6.108-2.353 1.454 8.497 6.796 15.944 7.85 9.518 1.346 11.705 4.062 2.426 3.012-6.577-.744-8.067.129-6.195 3.627.702 1.312 1.802 1.94 2.896 1.654.97-.254 3.52-.119 5.665.3 3.609.705 8.855.353 10.666-.714zm-74.868-1.622c.875-1.438.717-2.094-.772-3.2-1.768-1.314-1.713-1.427 1-2.025 4.884-1.077 5.553-1.427 5.133-2.687-.973-2.92-12.76-3.272-12.76-.382 0 .747 1.012 2.065 2.25 2.928 2.188 1.526 2.193 1.571.191 1.622-3.653.093-6.104 2.548-4.489 4.495 1.82 2.193 7.95 1.706 9.447-.751zm-17.899-1.191c0-1.122-1-2.439-2.275-2.998-1.817-.797-2.156-1.538-1.686-3.68.711-3.238-1.581-4.823-6.973-4.823-4.69 0-5.072 3.28-.566 4.85 3.232 1.127 3.673 2.077 1.824 3.927-.902.902-.74 1.66.698 3.248 2.56 2.829 8.978 2.454 8.978-.524zm-28.5-2.345c0-5.133-21.44-8.666-28.865-4.757-5.167 2.72-2.699 4.27 4.305 2.702 5.834-1.305 9.272-1.04 16.56 1.273 5.312 1.686 8 1.95 8 .781zm34.75-5.905c.547-1.642-2.586-2.814-3.93-1.47-.575.575-.728 1.56-.34 2.188.884 1.43 3.714.954 4.27-.718zm28.51-4.226c2.774-.694 5.186-1.99 5.784-3.107 1.186-2.215 6.961-2.56 16.022-.956 2.989.53 8.134 1.154 11.434 1.387 3.3.234 9.964.99 14.81 1.679 6.424.915 9.107.956 9.912.15 1.342-1.341-2.835-3.177-7.228-3.177-1.582 0-3.198-.521-3.591-1.158-.521-.843.51-.99 3.802-.538 8.691 1.191 10.52-4.364 1.945-5.91-6.077-1.095-5.964-1.868.35-2.394 5.09-.425 6-.794 6-2.431 0-1.56-1.247-2.21-6.5-3.387-7.281-1.63-6.056-3.528 1.632-2.528 4.253.553 6.294-.657 4.107-2.435-1.369-1.114-35.596-4.696-36.474-3.818-1.305 1.305 2.138 3.394 6.503 3.947 7.965 1.009 14.213 2.299 14.992 3.095.913.934-13.958-.271-18.76-1.521-8.734-2.274-20.704-.236-22.487 3.828-.644 1.466-1.863 2.255-3.5 2.265-3.738.023-6.047 1.687-3.485 2.512a81.117 81.117 0 0 1 4.12 1.486c1.183.469 7.708 1.36 14.5 1.982 14.186 1.299 23.675 2.91 24.44 4.147.715 1.156-7.668 1.086-14.528-.12-23.767-4.183-37.4-5.038-36.881-2.315.279 1.461 1.682 1.897 7.597 2.358 3.99.31 7.81 1.155 8.49 1.877 1.015 1.08-.096 1.178-6.266.554-13.402-1.353-17-.6-17 3.563 0 2.984 10.237 3.472 20.26.965zm16.99-15.362c-3.437-.46-6.25-1.29-6.25-1.844 0-.62 1.821-.77 4.75-.39 2.613.34 8.527.807 13.144 1.038 4.617.232 8.871.899 9.455 1.482 1.233 1.233-10.997 1.067-21.099-.286zm-47.984 13.738c1.266-1.266-1.68-5.35-4.59-6.364-4.883-1.702-5.9.446-1.91 4.03 3.155 2.834 5.249 3.586 6.5 2.334zm7.205-.756c2.244-1.64 1.417-4.645-1.28-4.645-1.512 0-4.191 3.545-4.191 5.548 0 .988 3.726.374 5.471-.903zm5.529-8.645c0-2.227-1.96-2.64-3.8-.8-1.864 1.865-1.43 2.8 1.3 2.8 1.833 0 2.5-.533 2.5-2zm-19.185-1.287c.39-2.011-5.638-3.947-7.577-2.433-1.626 1.27.036 3.434 3.085 4.017 3.139.6 4.136.25 4.492-1.584zm9.685.287c0-.81-.787-1.624-1.75-1.81-1.228-.236-1.75.304-1.75 1.81 0 1.507.522 2.047 1.75 1.81.963-.185 1.75-1 1.75-1.81zm5.106-6.687c1.159-1.367 3.184-3.019 4.5-3.671 1.648-.817 2.492-2.195 2.708-4.422.228-2.345 1.073-3.627 3.073-4.66 1.517-.786 3.344-2.132 4.058-2.994.715-.86 2.09-1.566 3.055-1.566 2.256 0 4.511-2.566 3.049-3.47-2.441-1.508-.693-2.53 4.329-2.53 3.488 0 5.802-.511 6.586-1.456 1.603-1.932.483-3.544-2.464-3.544-1.31 0-2.651-.436-2.98-.968-.834-1.349 22.103 0 24.427 1.436.57.352 3.55.833 6.622 1.069 7.148.548 14.14 2.407 12.611 3.352-1.127.697-2.767.542-19.586-1.856-8.51-1.214-10.594-.938-10.594 1.4 0 2.332 3.616 3.71 9.734 3.71 8.201 0 26.384 2.567 27.663 3.905 1.194 1.25-9.338.702-22.897-1.19-22.841-3.188-27.084-3.082-28.525.708-.557 1.465-1.854 2.408-3.596 2.613-3.997.472-3.836 2.09.4 3.998 4.771 2.15 16.038 1.204 19.145-1.607 2.139-1.936 10.466-1.536 31.883 1.533 8.671 1.243 12.151-.099 8.316-3.204-1.811-1.467-1.89-1.847-.603-2.915 2.816-2.337 1.576-3.82-4.27-5.108l-5.75-1.266 5.5-.968c8.992-1.582 8.813-5.129-.298-5.906-2.861-.243-8.577-1.125-12.702-1.959-4.125-.834-12.225-2.069-18-2.744-10.922-1.278-14.232-1.986-12.452-2.665 1.098-.419 14.359.881 25.452 2.495 14.082 2.048 24.466 1.872 24.794-.42.195-1.363-.564-2.517-2.25-3.419-3.103-1.66-3.22-2.613-.414-3.347 1.511-.395 1.94-1.052 1.476-2.262-.382-.994.046-2.477 1.025-3.56 1.574-1.739 1.566-1.98-.131-3.855-1.74-1.923-1.741-2.075-.017-3.98 2.35-2.597.799-4.578-4.269-5.45-7.845-1.348-9.214-1.761-9.214-2.778 0-.697 2.31-.822 6.875-.373 7.858.775 10.259-.974 5.563-4.051l-2.498-1.637 2.078-1.455c3.709-2.599.75-4.285-7.39-4.212-5.288.047-6.547.297-4.878.968 4.803 1.93 2.287 4.21-3.31 3-6.38-1.381-16.368-3.037-24.94-4.135-8.034-1.03-9.366-1.192-19.5-2.37-3.025-.351-6.989-1.107-8.809-1.68-5.603-1.762-12.204 2.238-8.612 5.219.803.666 5.584 1.592 10.625 2.057 5.04.465 9.622 1.303 10.18 1.862 1.36 1.36.143 1.31-11.797-.49-12.386-1.867-13.509-1.862-14.251.073-1.27 3.308 4.198 5.162 17.447 5.914 4.006.227 8.73.861 10.5 1.41 1.77.549 6.592 1.513 10.717 2.143 4.125.63 8.534 1.555 9.797 2.056 1.263.5 5.614.91 9.668.91 7.829 0 10.535.575 10.535 2.24 0 1.12-9.173.527-19.5-1.258-3.3-.57-8.825-1.25-12.278-1.511-3.453-.261-8.178-.913-10.5-1.449-6.014-1.387-10.293-1.245-11.648.388-.8.965-.84 1.616-.123 2.06 1.974 1.219 1.076 2.753-1.267 2.165-2.884-.724-6.684 1.79-6.684 4.421 0 1.642.737 1.954 4.75 2.014 2.613.039 5.65.437 6.75.885 3.834 1.563-2.597 2.237-7.5.787-6.104-1.806-8.198-1.262-7.808 2.027.454 3.835 12.702 6.323 18.223 3.703 4.051-1.922 4.5-3.047 1.585-3.973-4.447-1.411-1.947-2.723 3.75-1.967 3.163.42 8.315.809 11.45.865 6.482.117 10.672 2.517 4.75 2.72-1.897.066-3.9.023-4.45-.094-6.83-1.46-10.662.555-8.2 4.31 1.996 3.048 1.374 3.72-2.433 2.629-6.075-1.743-15.027 4.192-9.617 6.375.688.278-.122.54-1.8.584-3.62.094-5.45 1.662-5.45 4.67 0 1.504-.785 2.389-2.5 2.82-2.514.63-3.36 2.939-1.5 4.089 1.832 1.132 1.032 2.079-1.722 2.04-3.584-.053-4.37 3.09-1.102 4.401 2.207.885 2.17.935-.726.995-3.944.082-5.45 1.675-5.45 5.764 0 3.175-.15 3.3-3.941 3.3-4.075 0-5.426.838-4.243 2.633 2.43 3.687 8.534 3.521 11.79-.32zm57.894-41.484c-2.75-.522-5.45-1.426-6-2.01-1.34-1.423 14.236-.181 21 1.675l5 1.371-7.5-.044c-4.125-.024-9.75-.47-12.5-.992zm15.313-5.512c.721-.289 1.584-.253 1.916.08.333.332-.258.568-1.312.525-1.165-.048-1.402-.285-.604-.605zm-21.313-2.317c-1.1-.472-3.8-.907-6-.965-4.43-.117-15.33-2.51-16.35-3.59-.867-.918 14.933.543 16.85 1.559.825.437 4.082 1.116 7.239 1.51 3.156.392 5.492 1.113 5.19 1.6-.676 1.095-4.253 1.036-6.929-.114zm-30.25-4.662c-2.121-.856-1.38-2.338 1.168-2.338 3.062 0 5.582.952 5.582 2.107 0 .938-4.608 1.096-6.75.231zm49.293-1.268a1.095 1.095 0 0 1 .35-1.504c1.183-.73 4.107.367 4.107 1.541 0 1.184-3.722 1.152-4.457-.038zM1218 1302.649c-18.106-2.853-19.175-3.131-16.92-4.398.992-.556 5.091-.19 11 .981 5.181 1.028 12.882 2.168 17.114 2.535 4.715.408 8.15 1.216 8.873 2.087 1.622 1.955-1.03 1.796-20.067-1.204zm-33.5 67.625c0-2.307-5.875-2.01-6.323.32-.291 1.513.212 1.765 2.986 1.5 2.157-.207 3.337-.85 3.337-1.82zm10.1-5.75c4.119-1.964 4.276-2.824.65-3.555-1.512-.306-3.495-.844-4.405-1.196-2.17-.84-8.486 4.654-7.39 6.428.928 1.501 6.118.72 11.146-1.677zm-31.73-1.828c.204-.181.078-1.491-.278-2.911-1.218-4.854-9.575-5.69-8.785-.879.65 3.959 6.243 6.298 9.063 3.79zm5.95-11.175c.176-1.238 1.212-2.73 2.302-3.313 1.236-.662 1.869-1.874 1.68-3.223-.21-1.506.305-2.278 1.698-2.544 4.654-.89 5.928-4.218 2.25-5.877-1.976-.891-1.601-1.105 3.071-1.756 5.216-.727 7.495-2.619 5.527-4.587-1.663-1.663-11.344-3.02-13.46-1.887-1.516.81-2.516.59-4.534-.996-2.841-2.236-4.354-1.933-4.354.872 0 2.5 2.181 4.09 4.706 3.43 2.908-.76 4.124 3.059 1.794 5.633-1.072 1.185-1.439 2.617-1.014 3.956.614 1.935.33 2.076-3.66 1.821-5.07-.324-6.882 3.053-2.81 5.232 1.311.702 1.914 1.73 1.558 2.658-.843 2.198.299 3.493 2.77 3.14 1.353-.192 2.275-1.145 2.476-2.559zm-6.122-12.903c1.401-3.651-6.997-7.099-9.613-3.947-.92 1.108-.605 1.835 1.512 3.5 3.2 2.518 7.221 2.74 8.101.447zm-3.32-8.58c1.685-2.675-2.12-5.868-7.748-6.503-7.796-.879-7.325 4.485.652 7.424 4.047 1.49 5.714 1.274 7.097-.922zm7.96-6.42c3.416-.565 3.788-.905 3.372-3.084-.379-1.98.067-2.636 2.33-3.425 5.635-1.964 4.42-6.151-1.642-5.655-3.97.325-4.49 1.245-3.291 5.82.308 1.176-.417 1.429-3.358 1.171-3.936-.344-5.564 1.262-4.387 4.328.64 1.668 1.419 1.762 6.977.844zm-3.535-9.533c.53-2.8-3.48-5.972-7.104-5.62-3.924.38-4.65 2.857-1.702 5.806 2.583 2.582 8.305 2.461 8.806-.186zm15.632-4.787c5.118-1.946.524-6.025-6.787-6.025-4.931 0-4.361 5.324.675 6.304 1.197.233 2.485.485 2.862.56.377.075 1.84-.302 3.25-.839zM1163 1297.274c0-.55-.477-1-1.059-1-.583 0-.78.45-.441 1 .34.55.817 1 1.059 1 .243 0 .441-.45.441-1zm9.107-5.886c1.996-1.616 2.137-2.116.988-3.5-3.107-3.743-8.318-.768-6.056 3.458 1.288 2.407 2.138 2.415 5.068.042zm54.393-1.114c-.34-.55-1.042-1-1.559-1-.518 0-.941.45-.941 1s.702 1 1.559 1c.858 0 1.28-.45.941-1zm38.722-25.494c8.559-6.719 19.31-20.282 31.394-39.609 1.713-2.74 4.076-6.005 5.25-7.255 1.174-1.25 2.134-3.068 2.134-4.042 0-.974 2.666-7.245 5.924-13.935 19.686-40.427 29.324-81.003 28.77-121.122l-.194-13.957-7-2.393c-3.85-1.316-11.05-3.978-16-5.916-10.143-3.97-29.651-10.931-76-27.12-11-3.841-23.821-8.34-28.492-9.996-4.67-1.656-8.701-2.802-8.957-2.546-.255.255-.362 6.184-.238 13.174.125 6.991-.265 16.535-.867 21.21-.601 4.675-1.292 10.3-1.535 12.5-.66 5.973-4.255 21.466-8.122 35-1.885 6.6-3.99 15.669-4.679 20.152-.714 4.653-2.079 9.326-3.18 10.89-3.38 4.798-3.29 4.603-10.417 22.458-3.41 8.541-13.5 27.329-21.484 40-3.985 6.325-8.049 13.075-9.031 15-.982 1.925-3.7 5.975-6.037 9-2.339 3.025-5.163 7.3-6.277 9.5-1.114 2.2-4.536 6.46-7.605 9.466-5.676 5.561-6.888 8.034-3.936 8.034 2.03 0 10.252-8.345 12.56-12.75.937-1.787 2.4-3.25 3.25-3.25 2.406 0 1.89 1.217-2.887 6.815-4.197 4.916-6.295 8.79-5.3 9.784 1.01 1.01 3.5-1.062 8.234-6.854 2.75-3.364 7.025-8.211 9.5-10.772 4.927-5.098 10.574-12.89 18.822-25.973 2.947-4.675 6.443-9.65 7.768-11.054 1.326-1.405 2.41-3.283 2.41-4.173 0-.89 2.432-6.715 5.404-12.945 7.527-15.776 13.46-29.897 15.615-37.163 1.005-3.39 2.3-7.515 2.878-9.165 2.474-7.072 8.076-27.48 9.058-33 .587-3.3 1.967-9.6 3.066-14 1.099-4.4 2.694-15.2 3.545-24 1.997-20.653 1.262-19.956 15.646-14.833 6.209 2.211 24.563 8.416 40.788 13.788 16.225 5.372 32.2 10.803 35.5 12.067 3.3 1.265 8.475 3.005 11.5 3.868 3.025.863 7.018 2.505 8.872 3.65l3.373 2.08-.612 8.19c-2.127 28.49-4.585 47.672-7.137 55.69-9.31 29.254-17.726 51.353-21.517 56.5-.405.55-2.895 5.05-5.533 10-10.758 20.19-33.567 50.5-38.001 50.5-1.381 0-8.445 7.28-8.445 8.703 0 2.73 4.389 1.126 8.596-3.14 2.406-2.441 5.924-5.62 7.816-7.064 1.893-1.443 5.378-5.184 7.744-8.312 2.366-3.127 5.774-7.455 7.573-9.617 1.799-2.161 3.271-4.29 3.271-4.73 0-.44 2.185-4.072 4.856-8.07 2.67-3.998 5.386-8.282 6.035-9.52 1.196-2.281 4.109-3.128 4.109-1.195 0 .58-1.904 3.843-4.23 7.25-2.327 3.408-6.315 9.61-8.862 13.784-5.043 8.265-16.514 22.911-17.943 22.911-1.614 0-8.965 8.366-8.965 10.202 0 2.823 2.049 2.152 8.222-2.695zm-126.133-43.24c1.217-3.2 8.79-14.917 22.773-35.232 2.826-4.106 5.138-8.017 5.138-8.691 0-.675 2.374-6.09 5.276-12.035 2.902-5.945 6.016-12.721 6.92-15.059.972-2.514 2.289-4.25 3.224-4.25 1.803 0 2.01 1.252.618 3.764-.528.955-2.54 5.111-4.468 9.236-1.93 4.126-3.895 8.176-4.368 9-.473.826-1.764 3.3-2.87 5.5-4.874 9.705-9.311 17.104-19.94 33.25-10.652 16.182-14.794 21.07-12.304 14.518zm158.459-13.19c-.86-1.392 12.51-28.262 14.372-28.883 3.13-1.043.431 6.664-6.348 18.131-2.515 4.253-4.572 8.115-4.572 8.582 0 1.532-2.77 3.274-3.452 2.17zm-54.45 53.854c3.677-2.619 5.463-5.77 4.064-7.169-1.125-1.125-8.149 5.753-8.157 7.988-.01 1.725.726 1.578 4.093-.819zm-6.043-2.868c4.26-4.052 4.473-6.076.636-6.045-2.162.018-8.691 6.716-8.691 8.915 0 2.332 4.136.858 8.055-2.87zm-18.54-3.077c5.625-5.761 2.473-9.91-3.788-4.986-3.24 2.55-3.314 2.533-3.266-.722.064-4.416-3.054-4.093-8.076.835-5.626 5.522-5.754 7.294-.46 6.4 3.163-.534 4.313-.274 5.926 1.338 2.616 2.616 5.002 1.908 9.664-2.865zm8.187 1.818c3.572-3.462 4.353-6.804 1.59-6.804-2.01 0-9.292 6.82-9.292 8.703 0 2.402 4.379 1.323 7.702-1.899zm-27.452-6.62c3.152-2.932 3.568-5.184.958-5.184-2.375 0-10.652 8.472-9.732 9.962.81 1.31 4.234-.555 8.774-4.778zm-9.453-.718c5.03-5.03 4.798-7.764-.5-5.901-2.378.836-8.173 7.628-8.264 9.685-.101 2.289 4.814.167 8.764-3.784zm-10.636.284c6.339-4.29 7.777-8.75 2.822-8.75-2.66 0-9.983 7.223-9.983 9.846 0 2.947 1.537 2.712 7.161-1.095zm-7.739-2.93c4.845-5.66 4-9.27-1.374-5.87-1.023.647-1.852.347-2.807-1.016-1.867-2.666-2.498-2.49-7.16 1.988-6.056 5.82-4.683 10.057 1.646 5.078 3.22-2.533 4.644-2.561 3.308-.065-2.983 5.574 1.588 5.492 6.387-.115zm-15.775-2.386c5.001-4.099 5.803-7.434 1.787-7.434-1.41 0-3.432-.463-4.49-1.03-3.24-1.733-12.944 5.748-12.944 9.977 0 1.34 4.676 1.386 5.5.053.934-1.511 2.5-1.198 2.5.5 0 2.516 3.066 1.687 7.647-2.067zm-15.585-3.495c3.94-3.94 4.76-6.833 2.18-7.691-1.278-.426-11.242 9.188-11.242 10.846 0 2.454 5.298.609 9.062-3.155zm-57.762-.548c14.13-7.107 32.482-27.798 45.136-50.89 2.11-3.85 4.847-8.363 6.082-10.03 2.985-4.024 24.482-47.451 24.482-49.457 0-.863.626-2.463 1.392-3.556 3.071-4.385 13.033-41.472 15.299-56.958 3.197-21.848 3.919-54.177 1.403-62.842-2.64-9.095-7.377-8.707-11.012.903-2.266 5.99-4.33 6.602-11.28 3.347-4.45-2.085-4.996-2.142-6.456-.682-3.563 3.563-1.475 9.099 3.831 10.16 6.767 1.353 7.524 5.302 2.809 14.643-3.331 6.598-4.138 6.911-10.222 3.971-5.406-2.611-6.614-2.524-7.789.566-2.432 6.396-1.27 7.973 6.525 8.864a180.9 180.9 0 0 1 3.75.457c2.373.36-4.083 18.656-7.28 20.632-.647.4-3.346-.29-5.998-1.532-5.815-2.723-7.653-2.206-8.516 2.396-.837 4.463-.24 5.33 4.57 6.624 5.75 1.549 6.127 3.146 3.063 12.985-3.033 9.736-3.639 10.118-11.015 6.945-4.116-1.77-5.356-1.947-6.573-.937-3.757 3.118-.097 9 5.6 9 5.034 0 5.392 2.094 1.867 10.929-4.394 11.01-5.137 11.437-13.799 7.923-3.042-1.234-3.458-1.177-4.792.648-2.694 3.684-1.363 6.756 4.123 9.515 5.33 2.68 5.528 3.212 3.718 9.986-3.023 11.305-4.954 12.705-12.334 8.94-8.332-4.25-10.129 3.736-1.883 8.367 5.532 3.107 5.803 3.975 3.426 10.952-2.369 6.952-3.496 7.494-9.99 4.803-6.672-2.765-8.437-2.275-8.437 2.343 0 3.156.472 3.723 5.25 6.309 6.083 3.292 6.466 5.268 2.619 13.536-2.582 5.547-2.276 5.467-8.682 2.25-6.289-3.16-7.987-3.144-8.796.077-.944 3.761 1.185 6.874 6.786 9.922 5.509 2.999 5.75 4.71 1.774 12.567-2.954 5.838-4.004 6.268-9.52 3.904-14.658-6.283-13.72 4.118 1.069 11.85 4.89 2.556 5.751 2.606 9.8.57zm5.7-14.308c0-.504.95-3.092 2.11-5.75 1.162-2.658 4.951-12.933 8.421-22.833 3.47-9.9 7.958-22.05 9.973-27 4.264-10.472 11.496-29.936 11.496-30.939 0-.379 1.056-3.022 2.346-5.875 1.29-2.852 3.168-7.436 4.172-10.186 1.005-2.75 2.147-5.45 2.539-6 .391-.55 1.039-2.575 1.438-4.5.399-1.925 2.076-6.65 3.727-10.5 3.386-7.898 13.398-32.377 22.7-55.5 9.04-22.466 9.184-22.786 11.153-24.568.99-.895 2.277-1.332 2.862-.97 1.351.834 1.401 32.421.061 38.038-.525 2.2-1.428 8.893-2.006 14.873-.579 5.98-1.523 11.753-2.1 12.83-.576 1.075-2.336 6.758-3.91 12.627-5.964 22.217-6.965 25.334-8.946 27.852-1.12 1.424-2.036 3.097-2.036 3.718 0 .622-.97 2.923-2.155 5.115-1.185 2.192-3.198 6.627-4.472 9.855-1.275 3.228-3.455 7.361-4.845 9.183-1.39 1.823-2.528 3.604-2.528 3.957 0 1.798-12.178 24.853-14.876 28.163-1.717 2.105-7.1 9.227-11.963 15.827-10.94 14.848-18.767 23.5-21.26 23.5-1.046 0-1.9-.412-1.9-.917zm165.68 4.167c2.036-3.162 5.798-8 8.36-10.75 6.898-7.405 21.745-35.827 24.547-46.992.38-1.514 2.235-6.41 4.122-10.88 4.385-10.385 6.746-17.597 8.227-25.128.649-3.3 2.085-9.6 3.192-14 1.988-7.908 4.943-31.989 4.181-34.081-.216-.595-3.637-2.105-7.601-3.355-3.965-1.25-10.358-3.52-14.208-5.041-3.85-1.523-14.425-5.099-23.5-7.948s-19.021-6.056-22.103-7.127c-7.738-2.69-7.57-2.799-8.182 5.302-.927 12.252-2.824 23.835-5.447 33.25a9543.528 9543.528 0 0 1-4.333 15.5c-1.912 6.807-5.498 16.375-10.871 29-5.384 12.65-10.076 26-9.138 26 1.178 0 7.305-11.366 9.036-16.764 1.446-4.51 3.463-6.975 4.429-5.413.467.757-3.958 10.346-9.08 19.677-.605 1.1-2.416 4.925-4.027 8.5-3.306 7.34-5.434 11.21-9.833 17.878-1.677 2.543-4.292 7.2-5.812 10.348-1.52 3.15-4.085 6.668-5.7 7.818-4.879 3.474-3.255 8.078 2.313 6.56 2.387-.652 5.827-5.898 13.868-21.148 2.623-4.975 5.694-9.882 6.824-10.905 1.131-1.023 2.056-2.361 2.056-2.973 0-.612 1.052-2.68 2.338-4.595 1.286-1.916 2.595-4.383 2.91-5.483 1.282-4.496 9.35-21 10.266-21 1.226 0 1.046.573-2.514 8-1.582 3.3-3.19 7.35-3.572 9-.383 1.65-1.294 3.692-2.024 4.537-.73.845-2.052 3.095-2.938 5-3.12 6.708-5.687 11.48-6.978 12.963-.717.825-3.112 4.945-5.321 9.156-2.21 4.21-5.4 9.565-7.092 11.9-3.062 4.226-3.905 6.944-2.156 6.944.506 0 4.085-3.47 7.955-7.711s7.318-7.43 7.662-7.086c.893.893-1.28 4.688-5.18 9.05-3.53 3.947-4.329 6.747-1.926 6.747 1.63 0 15.07-14.573 15.07-16.34 0-.692-1.503-1.114-3.726-1.048-5.716.172-5.916-2.435-.812-10.612 2.673-4.283 14.479-29.097 18.811-39.54 8.927-21.516 17.275-49.706 17.247-58.24-.024-7.412.972-8.224 7.268-5.923 2.317.847 11.412 3.645 20.212 6.217 21.502 6.287 20.872 5.809 20.231 15.34-.29 4.314-1.9 12.222-3.696 18.146-3.388 11.18-4.01 12.97-8.902 25.569-1.723 4.438-3.133 8.573-3.133 9.19 0 2.047-10.083 22.38-13.529 27.282-1.864 2.652-4.687 7.665-6.273 11.14-1.586 3.476-4.53 8.275-6.541 10.664-2.011 2.39-3.657 4.648-3.657 5.018 0 .371-1.798 2.85-3.995 5.509-3.86 4.67-4.324 6.628-1.574 6.628 1.816 0 18.963-21.607 20.98-26.437.904-2.166 3.315-6.441 5.357-9.5 4.258-6.38 7.793-12.45 9.353-16.063 3.94-9.125 5.014-11.034 5.895-10.49 1.227.758.277 5.15-1.835 8.49-.87 1.375-2.545 4.3-3.721 6.5-7.669 14.337-9.45 17.495-12.052 21.373a229.644 229.644 0 0 0-5.408 8.524c-1.375 2.306-4.862 7.008-7.75 10.45-5.853 6.976-6.51 9.153-2.76 9.153 1.935 0 3.314-1.28 6.19-5.75zm-25.298-2.569c11.003-11.539 12.946-16.79 5.618-15.18-1.78.39-3.112.068-3.963-.956-2.784-3.354-5.727-1.872-10.337 5.205-2.418 3.713-5.364 7.608-6.548 8.655-4.207 3.725-1.32 6.768 3.873 4.083 2.699-1.396 2.972-1.36 3.972.507 1.554 2.904 2.774 2.522 7.385-2.314zm-7.382-1.739c0-1.614 8.752-10.523 9.552-9.723.386.386-1.198 2.97-3.518 5.742-4.09 4.885-6.034 6.167-6.034 3.981zm14.1 3.959c3.216-3.216.745-5.043-2.587-1.913-1.382 1.299-2.513 2.733-2.513 3.187 0 1.57 3.008.818 5.1-1.274zm-21.793-9.52c7.848-8.314 9.087-11.662 4.512-12.19-2.307-.267-3.194.5-6.357 5.5-2.022 3.195-4.978 6.855-6.57 8.132-3.427 2.752-3.89 6.178-.835 6.178 1.268 0 4.82-2.927 9.25-7.62zm30.554-1.186c1.348-1.893 1.705-3.275 1.097-4.25-1.142-1.83-3.922-.305-5.647 3.098-2.335 4.607 1.414 5.556 4.55 1.152zm-170.06-1.377c.367-1.93-3.259-4.24-5.38-3.426-1.754.673-1.878 4.25-.171 4.965 2.31.966 5.227.158 5.55-1.539zm7.199-24.317c1.441-1.737-.189-4.5-2.654-4.5-1.99 0-2.803 2.744-1.335 4.512 1.556 1.876 2.424 1.873 3.989-.013zm-428.04-3.12c2.61-2.196 6.04-7.143 6.04-8.71 0-1.768-11.45-8.774-13.498-8.26-4.374 1.097-17.502 8.755-17.502 10.208 0 3.5 6.728 2.413 13.495-2.18 4.058-2.753 5.505-3.044 5.505-1.106 0 .733-1.681 2.42-3.736 3.75s-3.904 3.288-4.11 4.352c-.946 4.917 8.664 6.272 13.805 1.946zm595.216-5.63c1.857-1.49 3.329-4.173 9.188-16.75 7.51-16.121 8.809-19.591 11.736-31.362 1.251-5.032-.086-6.647-5.472-6.61-6.57.048-11.267 5.025-14.263 15.113-.814 2.741-3.254 8.753-5.422 13.36-2.169 4.607-3.943 8.903-3.943 9.547 0 .645-1.397 3.793-3.105 6.997-3.811 7.15-3.532 8.15 2.686 9.609 6.556 1.537 6.794 1.54 8.595.095zm-2.718-12.818c-.878-1.42 9.454-28.845 11.721-31.112 1.865-1.865 4.821-1.479 4.821.63 0 2.026-3.64 11.99-8.068 22.088-4.05 9.232-6.472 11.633-8.474 8.394zM666 1170.793c0-1.18.915-1.356 4.5-.864 4.686.642 6.017-.739 3.316-3.44-.913-.912-.052-1.13 3.75-.95 7.245.344 6.916-1.527-.587-3.346-6.027-1.461-17.434-7.197-32.37-16.278-8.62-5.24-25.876-9.448-33.478-8.164-4.082.69-8.131-.62-8.131-2.63 0-.642 1.117-.864 2.75-.548 1.69.328 3.389-.04 4.409-.956 1.313-1.178 2.422-1.277 5.33-.474 2.552.705 4.398.683 6.05-.07 1.888-.86 2.931-.722 5.052.668 1.767 1.157 3.77 1.573 5.912 1.225 2.594-.42 4.211.17 8.118 2.966 3.936 2.816 5.52 3.39 8.196 2.968 2.934-.463 3.822 0 7.702 4.054 3.402 3.551 4.882 4.447 6.6 3.998 1.39-.363 3.283.183 5.089 1.47 1.753 1.247 3.738 1.836 5.084 1.508 1.214-.297 3.082.11 4.15.902 2.526 1.876 3.558 1.822 3.558-.187 0-1.33.708-1.514 3.883-1.007 2.721.436 4.23.205 5.039-.77.905-1.091 1.778-1.157 4.036-.305 2.246.848 3.255.778 4.574-.316.93-.773 3.138-1.28 4.906-1.128 1.977.17 3.714-.324 4.51-1.284.714-.86 2.78-1.562 4.593-1.562 4.262 0 6.459-.875 6.459-2.572 0-.747.9-1.84 2-2.428 1.428-.764 2-2.094 2-4.649 0-3.516-.056-3.566-3.25-2.865-6.977 1.53-26.228 1.21-37.25-.618-11.734-1.947-14.531-2.649-32.541-8.169-19.92-6.105-37.913-4.963-57.209 3.63-7.026 3.13-7.113 4.446-.505 7.682 3.722 1.824 6.093 3.947 8.652 7.75l3.525 5.24h6.65c5.386 0 7.327.46 10.218 2.421 1.963 1.332 5.667 3.35 8.232 4.485 5.557 2.458 17.297 10.13 19.897 13.004 2.189 2.418 3.932 1.77 3.015-1.12-.708-2.23-.632-2.203 5.456 1.916 3.877 2.623 8.11 3.047 8.11.812zm-4-4.578c0-.583.45-.781 1-.441s1 .816 1 1.059c0 .242-.45.44-1 .44s-1-.476-1-1.058zm428.75 2.309c.547-1.642-2.586-2.814-3.93-1.47-.575.575-.728 1.56-.34 2.188.884 1.43 3.714.954 4.27-.718zm10.68-23.928c.815-2.124-1.761-4.793-3.853-3.99-.867.332-1.577 1.744-1.577 3.136 0 3.006 4.342 3.688 5.43.854zm11.07-29.336c0-1.817-.606-2.572-2.25-2.806-2.25-.32-3.355 3.381-1.549 5.187 1.484 1.484 3.799.032 3.799-2.381zm11.454-25.431c.66-.795 1.053-2.483.873-3.75-.45-3.176-5.361-3.848-6.308-.864-1.508 4.749 2.5 8.15 5.435 4.614zm11.573-29.6c.888-1.437-1.382-3.955-3.566-3.955-1.931 0-2.95 1.73-2.207 3.75.557 1.512 4.87 1.666 5.773.206zm10.473-31.888c0-1.075-3.89-2.51-4.676-1.725-.288.288-.228 1.004.135 1.591.81 1.312 4.541 1.422 4.541.134zm-497.435 570.037c-.305-.492.104-1.147.909-1.456 1.562-.6 2.897.647 1.832 1.712-.904.904-2.093.793-2.741-.256zM392 1512.892c0-.826.45-1.779 1-2.119.55-.34 1 .058 1 .883s-.45 1.778-1 2.118c-.55.34-1-.057-1-.882zm21-4.619c-.901-.582-1.025-.975-.309-.984.655-.01 1.47.435 1.809.985.767 1.241.421 1.241-1.5 0zm140.01-381.866c3.208-2.679 3.35-3.046 2.18-5.616-1.218-2.673-1.18-2.732 1.37-2.092 3.143.79 7.238-3.101 14.134-13.426 2.388-3.574 6.555-9.2 9.26-12.5 5.932-7.236 5.918-7.12 1.556-12.609-6.593-8.293-2.698-17.731 11.49-27.842 4.105-2.926 4.95-3.151 9.63-2.57 6.648.824 11.925-4.263 10.87-10.479l-.594-3.5 2.516 4c1.383 2.2 2.54 4.676 2.57 5.5.028.826.915 2.623 1.968 3.994 1.795 2.337 1.962 2.374 2.644.596 2.005-5.225-6.51-20.37-10.82-19.243-1.487.389-2.279-.286-3.353-2.857-1.96-4.691-.877-9.049 3.77-15.168 5.725-7.54 7.887-8.686 15.211-8.062 7.248.617 8.588.233 8.588-2.46 0-1.782.49-1.59 3.978 1.561 4.946 4.469 7.512 4.046 6.677-1.1-.307-1.893-.059-4.241.55-5.218.903-1.444.487-2.644-2.217-6.41-4.348-6.055-6.988-5.885-6.988.45 0 1.088-.69 1.918-1.594 1.918-.876 0-1.833.918-2.127 2.04-.853 3.261-2.79 1.594-2.673-2.302.116-3.882 8.47-14.69 11.394-14.738.825-.014 4.151-1.37 7.391-3.013 7.435-3.77 10.115-3.75 15.958.12l4.692 3.108 5.534-3.812c5.485-3.778 5.617-3.81 14.73-3.669l9.195.143 4.75-4.651c2.612-2.558 4.75-5.14 4.75-5.736 0-3.347 7.778-8.61 14.097-9.54 3.522-.517 8.396-1.545 10.832-2.285l4.43-1.344.197-11.911c.29-17.519 4.828-27.579 19.866-44.034 10.924-11.955 16.754-14.717 34.175-16.191 4.573-.387 8.925-1.322 10-2.148 1.047-.804 4.153-3.326 6.903-5.603 8.043-6.66 10.86-7.75 18.612-7.194 15.058 1.077 25.363 10.9 21.396 20.394-.883 2.113-1.378 4.747-1.1 5.854.448 1.784.014 2.012-3.84 2.012-3.858 0-4.955.575-9.765 5.125-2.98 2.818-6.835 5.857-8.566 6.752-2.434 1.259-3.28 2.477-3.733 5.375-1.225 7.848-2.572 10.908-6.475 14.719-2.216 2.164-4.029 4.707-4.029 5.652 0 1.079-1.07 1.952-2.874 2.349-6.713 1.474-11.376 12.454-7.983 18.795.863 1.612.858 2.232-.02 2.525-2.041.68-4.123 5.964-4.123 10.464 0 3.075-.735 5.35-2.5 7.744-1.375 1.863-2.5 3.777-2.5 4.252 0 2.154-6.478 8.748-8.595 8.748-2.895 0-6.842 4.768-5.393 6.514.563.678 3.283 1.532 6.045 1.899 8.573 1.137 25.765 8.131 34.986 14.234 3.661 2.423 6.957 2.353 6.957-.148 0-.707.722-1.563 1.604-1.9.885-.34 1.356-1.262 1.05-2.057-.332-.867.224-1.686 1.397-2.059 1.072-.34 1.95-1.398 1.95-2.35 0-.954.52-2.254 1.157-2.891.851-.852.863-1.512.046-2.496-1.372-1.653-.908-7.012.652-7.532 1.84-.613 1.32-2.024-1.02-2.766-1.915-.608-1.973-.793-.5-1.617 2.685-1.503 1.937-2.532-2.336-3.216-4.139-.661-4.796-1.42-2.886-3.33.82-.82.299-1.537-1.97-2.71-1.697-.878-3.548-2.461-4.114-3.518-.565-1.057-1.891-2.196-2.946-2.53-1.054-.335-2.372-1.912-2.927-3.505-.555-1.593-2.843-4.11-5.083-5.592-4.371-2.893-5.424-4.993-1.95-3.89 1.17.37 3.942.849 6.163 1.063 4.837.465 5.385.881 3.753 2.847-1.33 1.604-.276 2.309 6.46 4.313 1.95.58 3.111 1.653 3.32 3.065.176 1.2 1.07 2.205 2 2.246 3.697.163 6.656 1.047 8.206 2.45.897.811 2.863 1.476 4.368 1.476 1.505 0 3.528.423 4.495.94 2.382 1.275 9.702 2.366 14.738 2.197 2.592-.087 4.59.42 5.372 1.362.685.825 2.26 1.5 3.5 1.5 3.156 0 9.95 2.978 8.882 3.892-.485.416-3.737 1.847-7.227 3.182-7.858 3.005-13.41 7.638-17.2 14.353-1.6 2.835-6.069 9.06-9.932 13.836-3.862 4.774-7.022 9.358-7.022 10.186 0 2.417 4.171 4.489 12.105 6.014 4.067.78 11.598 2.797 16.735 4.479 6.443 2.11 11.31 3.059 15.69 3.059 3.494 0 6.591.388 6.885.862.293.475 2.682 1.44 5.309 2.145 2.626.704 6.217 2.14 7.98 3.19 1.761 1.05 5.361 2.302 8 2.784 2.637.482 6.596 1.403 8.796 2.047 14.936 4.374 26.24 5.418 39.354 3.636 6.955-.946 15.796-1.926 19.646-2.18 7.255-.476 10.501-.796 26.5-2.607 16.732-1.894 23.32-2.206 22.619-1.07-1.38 2.233-9.309 3.696-39.12 7.218-19.108 2.257-25.149 3.117-29.31 4.174-5.88 1.493-20.808.376-30.69-2.296-11.349-3.068-24.646-5.785-25.918-5.295-.595.23-2.431 2.922-4.081 5.984-5.22 9.686-7.75 9.608-2.978-.092 3.896-7.921 3.164-11.472-1.964-9.523-2.657 1.01-2.938 1.45-3.988 6.247-.336 1.539-1.746 3.327-3.237 4.109-1.487.78-3.12 2.848-3.737 4.734-.748 2.285-1.887 3.536-3.581 3.933-2.137.501-6.27 6.668-8.286 12.364-.168.475-1.572 1.003-3.12 1.173-1.547.17-3.39 1.131-4.096 2.136-3.225 4.595-5.655 6.794-6.161 5.577-.94-2.264-3.04-1.31-5.76 2.616-1.474 2.127-3.785 4.905-5.136 6.174l-2.456 2.308v-2.174c0-3.584-2.268-2.492-6.91 3.326-2.414 3.025-4.997 5.5-5.74 5.5-1.788 0-1.716-1.452.15-3 1.886-1.566 1.951-4 .108-4-.766 0-3.644 2.025-6.397 4.5-5.653 5.082-6.211 5.307-6.211 2.5 0-3-2.737-2.457-7.566 1.5-5.092 4.172-5.294 4.215-4.68 1 .413-2.154.115-2.5-2.151-2.5-1.447 0-3.487-.535-4.535-1.19-2.01-1.255-8.53.86-12.26 3.98-.931.778-2.242 1.232-2.914 1.008-.672-.224.427-1.38 2.442-2.57 6.826-4.027 3.174-7.174-4.806-4.141-6.287 2.39-7.72 2.398-4.637.027 2.891-2.222 2.042-4.114-1.846-4.114-1.596 0-3.085-.655-3.41-1.5-.316-.825-1.296-1.5-2.178-1.5-.881 0-2.268-.666-3.082-1.48-1.131-1.132-2.877-1.333-7.428-.857-4.157.434-5.95.277-5.95-.521 0-.628.845-1.143 1.878-1.143s2.412-.643 3.065-1.43c1.442-1.737-1.318-3.57-5.377-3.57-1.41 0-2.565-.45-2.565-1s.45-1 1-1 1-.674 1-1.5c0-1.047-1.056-1.5-3.5-1.5-2.986 0-3.5-.338-3.5-2.3 0-1.264-.403-2.727-.896-3.25-1.157-1.226.437-5.45 2.056-5.45.674 0 5.751 4.442 11.282 9.87 10.287 10.095 13.284 12.086 25.22 16.758 6.167 2.414 8.162 2.683 20.338 2.744 25.348.128 39.731-6.097 64.322-27.84 12.5-11.053 23.79-28.531 18.427-28.531-.723 0-4.47 3.057-8.327 6.794-7.222 6.996-20.624 15.516-25.923 16.479-17.34 3.152-36.221 4.946-38.608 3.668-.968-.518-3.799-.941-6.29-.941-3.508 0-4.773-.452-5.602-2-.83-1.551-2.093-2-5.628-2-3.674 0-4.657-.378-5.067-1.945-.342-1.309-1.537-2.044-3.656-2.25-2.38-.23-3.148-.794-3.148-2.306 0-1.342-.779-2.11-2.366-2.334-1.305-.185-2.59-1.194-2.867-2.25-.275-1.054-.896-1.916-1.378-1.916-1.506 0-9.725-8.641-10.066-10.582-.68-3.875 3.147-2.257 11.66 4.929 22.422 18.927 48.075 23.71 75.517 14.079 9.113-3.199 9.01-3.153 13.923-6.213 5.19-3.233 6.059-4.914 3.103-6.007l-2.14-.792 2.056-1.862c4.618-4.178 1.598-5.429-8.048-3.334-.718.156-1.322-.614-1.348-1.718-.05-2.13-.57-2.212-7.286-1.15-3.977.63-4.226.53-4-1.59.265-2.494-1.873-2.768-9.61-1.23-3.768.748-3.822.718-2.5-1.413 1.151-1.857 1.129-2.322-.15-3.157-1.445-.943-2.206-.889-8.25.586-3.22.786-3.843-1.064-.695-2.063 4.088-1.298 1.35-2.988-4.412-2.723-6.133.281-7.108-.754-3.152-3.346 3.18-2.084 2.57-2.988-2.569-3.81-3.537-.566-3.943-.873-2.864-2.174 1.856-2.236.17-3.265-6.058-3.695-4.292-.296-4.997-.556-3.21-1.184 3.464-1.217 2.075-3.012-2.596-3.357-3.597-.266-4.12-.599-3.923-2.5.22-2.105-.076-2.182-7.271-1.92-4.834.176-7.004-.055-6.105-.65 2.49-1.645.478-4.434-2.636-3.653-1.497.376-3.152.761-3.678.857-.526.095-.984-.953-1.019-2.328-.078-3.098-2.968-3.706-9.253-1.946-4.099 1.147-4.538 1.078-6.499-1.026-3.273-3.514-12.61-2.204-26.454 3.711-17.821 7.615-28.725 6.9-39.534-2.59-4.192-3.68-5.822-3.97-5.822-1.032 0 1.727-.415 1.994-2.25 1.448-6.49-1.929-9.533-1.839-10.687.317-.624 1.165-1.981 2.119-3.017 2.119-2.833 0-5.047 1.065-5.047 2.43 0 .67-1.687 1.64-3.75 2.157-2.68.672-3.67 1.42-3.469 2.62.225 1.346-.672 1.741-4.5 1.986-4.012.257-4.78.628-4.78 2.307 0 1.424-.77 2.089-2.677 2.309-3.875.448-5.56 2.78-3.914 5.417 1.24 1.984 1.13 2.042-2.831 1.51-4.545-.609-7.078.951-7.078 4.36 0 1.383-.902 2.134-3.086 2.57-3.391.679-4.718 2.66-3.092 4.62 1.11 1.338.084 12.359-1.716 18.445-2.572 8.69-14.673 18.353-24.106 19.247-4.755.45-5.544.827-5.82 2.774-.176 1.238-1.231 2.74-2.344 3.335-1.346.72-1.852 1.745-1.51 3.055.368 1.404-.181 2.29-1.905 3.075-2.987 1.361-3.052 3.011-.264 6.781 2.608 3.528 1.285 6.002-3.208 6.002-2.833 0-5.95 2.219-5.95 4.237 0 .602-.672 1.808-1.494 2.679-3.09 3.274-6.505 7.906-6.505 8.823 0 .523-.9 1.765-2 2.76-1.1.996-2 2.592-2 3.547 0 1.004-1.023 1.993-2.423 2.345-3.066.77-5.438 6.866-3.555 9.135 1.358 1.637 1.729 1.435-7.176 3.905-3.11.863-7.143 1.569-8.963 1.569h-3.308zm37.459-49.76c3.261-1.251 8.576-9.421 7.471-11.485-2.544-4.753-9.231-.723-10.344 6.234-.844 5.281-.213 6.435 2.873 5.251zm14.293-16.623c-.715-2.207-8.568-4.16-11.45-2.847-2.07.944-2.3 1.407-1.291 2.621 1.596 1.923 13.358 2.131 12.74.225zm3.967-4.355c-.332-.332-1.195-.368-1.917-.079-.797.32-.56.557.605.605 1.054.043 1.644-.193 1.312-.526zm7.421-3.896c0-.522-.484-1.11-1.075-1.308-.591-.197-1.075.392-1.075 1.309 0 .916.484 1.505 1.075 1.308.591-.197 1.075-.786 1.075-1.309zm13.121-18.104c.744-.744-4.378-11.396-5.48-11.396-1.29 0-.903 4.487.722 8.378 1.393 3.333 3.26 4.517 4.758 3.018zm3.079-18.079c1.091-1.091-5.22-3.316-9.406-3.316-4.071 0-6.107 1.649-3.822 3.096 1.629 1.032 12.24 1.208 13.228.22zm5.65-6.216c0-1.034-8.996-2.051-10.5-1.188-.55.316.575.856 2.5 1.2 5.446.972 8 .968 8-.012zm29.656-12.651c4.064-3.1 4.207-4.217.594-4.633-2.048-.236-2.75-.865-2.75-2.464 0-2.13-8.217-10.352-10.344-10.352-3.617 0-.958 7.524 3.166 8.962 2.208.77 2.738 1.433 2.216 2.775-.815 2.095-.807 2.022-.656 5.513.155 3.602 3.21 3.68 7.774.199zm52.082-4.146c.216-.658-1.324-2.075-3.423-3.15-2.098-1.074-4.839-3.345-6.09-5.047-5.965-8.11-24.322-12.459-30.966-7.335-2.193 1.691-2.103 1.729 4.191 1.747 5.268.015 7.03.466 9.741 2.493 15.926 11.911 25.067 15.8 26.547 11.292zm15.762-3.323c0-.745-1.35-1.712-3-2.15-1.65-.439-4.35-1.89-6-3.227l-3-2.43 2.75-.695c4.429-1.12 3.246-2.997-4.968-7.885-10.79-6.422-15.053-5.946-13.376 1.49 1.37 6.071 3.463 9.28 7.545 11.57 6.517 3.654 7.555 1.365 1.829-4.037-4.237-3.998-3.985-5.125.86-3.839 2.832.752 3.317 1.297 3.086 3.472-.3 2.808 2.416 5.3 8.79 8.066 3.954 1.716 5.484 1.622 5.484-.335zm-49.638-2.596c3.707-2.597 1.224-3.845-4.781-2.404-4.88 1.17-5.855 1.912-4.414 3.353 1.251 1.251 6.883.67 9.195-.95zm62.332-1.135c.283-1.46 1.58-1.78 7.823-1.935 4.116-.101 8.833-.257 10.483-.346 1.65-.09 4.237.159 5.75.551 2.477.643 2.75.456 2.75-1.884 0-1.905-.6-2.707-2.25-3.01-13.197-2.415-20.557-3.842-22.07-4.28-1.235-.356-1.985.105-2.333 1.435-.423 1.618-1.645 2.05-7.022 2.481-5.415.435-11.746 2.738-7.525 2.738.667 0 1.2 1.334 1.2 3v3h6.427c5.324 0 6.485-.3 6.766-1.75zm-78.778-2.906c-3.288-2.632-5.416-3.01-5.416-.966 0 1.694 1.842 3.265 4.5 3.839 3.523.76 3.916-.473.916-2.873zm67.385-8.547c.2-1.037-.786-2.255-2.575-3.18-1.594-.824-4.092-3.064-5.551-4.976-3.493-4.58-8.55-6.294-13.865-4.702-4.796 1.437-4.877 4.159-.153 5.125 1.73.354 5.553 2.135 8.494 3.958 10.561 6.543 12.987 7.214 13.65 3.775zm16.634-2.772c3.348-1.273 3.27-3.75-.168-5.296-1.503-.676-6.3-3.366-10.66-5.979-10.741-6.436-14.214-6.224-9.719.595 1.057 1.602 1.64 3.745 1.336 4.908-.451 1.724-.18 1.97 1.648 1.491 1.364-.356 4.34.52 7.908 2.33 6.524 3.309 6.237 3.25 9.655 1.951zm38.168-2.347c3.362-3.912 2.08-5.066-2.841-2.556-3.422 1.745-5.805 2.09-13.895 2.005-5.37-.056-10.022.315-10.337.824-1.309 2.118 3.368 3.072 13.809 2.816 10.505-.258 10.913-.353 13.264-3.089zm-10.057-5.132c1.915-.8 3.756-2.263 4.091-3.25.335-.988 1.774-2.788 3.197-4.001 3.586-3.057 2.247-3.742-3.49-1.786-2.664.91-7.886 1.981-11.604 2.382-8.04.868-9.206 1.708-7.49 5.402 1.484 3.197 9.143 3.824 15.296 1.253zm-23.019-.59c.998-1.614-1.497-3.956-4.215-3.956-1.344 0-3.346-.482-4.449-1.073-1.95-1.044-1.959-1.003-.304 1.523 2.705 4.128 7.44 5.98 8.968 3.507zm-13.277-8.15c-1.207-1.207-2.544-1.845-2.97-1.418-.427.427.096 1.414 1.163 2.194 3.012 2.203 4.253 1.67 1.807-.776zm22.79.173c1.05-.562 4.335-1.208 7.299-1.435 11.04-.847 22.857-6.985 21.294-11.059-.631-1.643-.936-1.568-3.467.857-3.716 3.56-6.58 3.662-4.993.178.622-1.365 1.962-2.745 2.979-3.068 4.69-1.488 1.489-2.688-6.013-2.253-8.657.5-16.081 4.813-16.12 9.363-.01 1.135-1.369 3.06-3.019 4.28-4.62 3.416-3.035 5.853 2.04 3.137zm4.87-6.071c-1.202-.774-1.189-1.053.09-1.892 2.154-1.414 4-1.24 4 .378 0 1.816-2.3 2.667-4.09 1.514zm-8.875-8.45c.942-1.134.985-1.837.165-2.657-1.325-1.326-4.2.606-4.2 2.822 0 1.85 2.446 1.75 4.035-.165zm.65-8.632c2.709-2.544 3.414-7.982.75-5.77-1.465 1.214-4.435 6.168-4.435 7.395 0 1.121 1.437.488 3.686-1.625zm34.659-3.75c1.014-.041 2.067-.933 2.341-1.98.292-1.115 2.534-2.751 5.407-3.945 4.28-1.779 4.908-2.41 4.908-4.94 0-1.705.883-3.686 2.141-4.806 1.178-1.047 2.968-3.704 3.978-5.904 3.386-7.374 1.996-8.549-3.552-3-3.98 3.979-5.144 4.447-3.521 1.414 1.862-3.48.125-3.473-3.473.015-3.26 3.16-5.249 7.07-3.596 7.07.806 0 .686 5.67-.137 6.493-.248.249-5.601.583-11.896.742-11.616.294-18.72 2.28-19.723 5.516-.517 1.667 2.665 1.53 5.779-.25 2.87-1.641 11.458-2.05 10.5-.5-.34.55-1.465 1-2.5 1-1.99 0-3.432 1.492-2.655 2.75.386.624 5.962.738 15.999.325zm-24.204-15.338c.842-1.572.782-1.82-.29-1.21-2.258 1.288-5.85 4.769-5.85 5.67 0 1.34 4.967-2.267 6.14-4.46zm20.407 1.087c1.99-1.747 5.335-5.684 7.434-8.75 2.1-3.066 5.42-7.108 7.38-8.983 3.21-3.073 3.893-5.091 1.72-5.091-1.795 0-9.383 6.933-12.647 11.556-4.56 6.46-5.938 7.398-9.908 6.754-2.463-.4-4.097.052-6.43 1.777-3.928 2.904-3.49 4.482 1.133 4.084 1.963-.169 3.866.173 4.23.76 1.135 1.839 3.341 1.183 7.088-2.107zm-7.868-6.81c3.836-.017 6.335-2.244 5.614-5.002-.291-1.113-.029-2.625.582-3.361 1.212-1.461 3.129-13.464 2.438-15.272-.235-.617.301-1.401 1.193-1.743.891-.342 1.34-1.076.998-1.63-.807-1.306-9.197-1.312-10.004-.006-.349.564.47 1 1.882 1 3.068 0 4.418 1.803 1.931 2.58-.997.31-3.388 1.262-5.313 2.112-3.398 1.502-3.433 1.573-1.186 2.419 2.85 1.074 2.207 2.219-3.144 5.597-4.408 2.783-3.649 4.177 1.33 2.442 5.033-1.755 4.476.636-.932 3.998-4.416 2.746-4.846 3.293-3.408 4.345 1.02.745 1.338 1.701.836 2.512-.614.995-.23 1.155 1.598.666 1.323-.354 3.836-.65 5.585-.658zm-1.179-5.014c.34-.55 1.379-.994 2.31-.985 1.456.013 1.483.15.19.985-1.958 1.265-3.282 1.265-2.5 0zm-14.789-6.876c.984-1.032 2.801-2.187 4.039-2.568 2.386-.733 3.108-2.567 1-2.542-1.649.02-9.608 6.9-8.039 6.948.666.02 2.016-.807 3-1.838zm34.334-4.347c3.33-2.42 12.23-4.75 18.205-4.766 6.405-.016 6.641-2.605.323-3.553-9.021-1.353-26.607 6.442-24.01 10.642.608.985 1.386.656 5.482-2.323zM838 883.303c0-5.728-13.587-9.652-22.264-6.429-8.248 3.064-11.736 4.713-11.736 5.551 0 1.289 1.365 1.038 6.14-1.13 7.455-3.382 19.115-2.222 23.695 2.358 2.717 2.718 4.165 2.596 4.165-.35zm7-2.095c0-7.154-12.513-12.84-24.194-10.993-7.906 1.25-6.747 2.058 2.95 2.058 10.009 0 13.473 1.674 16.806 8.12 1.728 3.342 4.438 3.84 4.438.815zm-15.27-15.539c-.333-.332-1.196-.367-1.918-.079-.797.32-.56.557.605.605 1.054.043 1.644-.193 1.312-.526zM624.5 1090.68c-2.908-1.275-2.923-1.316-.5-1.345 2.781-.033 5.69 1.42 4.357 2.175-.471.268-2.207-.106-3.857-.83zm277.5-6.288c0-.55.45-1.278 1-1.618.55-.34 1-.167 1 .383s-.45 1.278-1 1.618c-.55.34-1 .168-1-.382zm-82.59-3.622c4.29-3.975 2.114-4.608-4.904-1.426-7.85 3.56-10.715 3.924-8.096 1.03 2.252-2.488 1.11-3.037-4.52-2.17-4.141.639-4.56.526-4.133-1.106.433-1.66-.06-1.761-5.665-1.175-5.426.567-6.067.451-5.512-.995.392-1.022.01-1.874-1.02-2.269-1.52-.583-1.522-.769-.02-2.428 2.072-2.29-.453-3.957-5.993-3.957-3.32 0-3.539-.184-2.962-2.484.765-3.047-2.996-4.904-8.023-3.961-2.25.422-3.576.134-4.499-.978-1.083-1.305-1.072-1.58.064-1.592 5.496-.06 4.135-4.47-1.72-5.568-2.971-.557-3.316-.931-2.79-3.026.486-1.938.212-2.39-1.45-2.39-2.363 0-3.742-1.744-3.335-4.217.193-1.175-.603-1.911-2.525-2.334-5.325-1.17-5.739-1.418-4.474-2.682 1.838-1.839 1.373-3.716-1.212-4.894-1.572-.716-2.221-1.687-1.914-2.862.283-1.083-.413-2.392-1.78-3.35-1.88-1.317-2.037-1.824-.964-3.117 2.044-2.463 3.71-1.831 6.722 2.547 3.295 4.79 13.3 16.577 21.815 25.703 5.466 5.857 8.01 7.761 18.378 13.753 1.858 1.074 5.683 3.513 8.5 5.42 3.558 2.409 6.8 3.683 10.622 4.175 3.025.389 6.753 1.021 8.285 1.405 1.99.5 3.335.201 4.71-1.043 1.42-1.285 2.827-1.573 5.36-1.097 1.95.365 4.551.137 6.011-.529 1.988-.905 2.909-.895 4.04.044 1.11.92 1.981.94 3.585.082 4.806-2.572 4.053-.087-1.006 3.32-5.629 3.79-8.522 4.566-9.22 2.473-.279-.837-2.14-.38-6.11 1.5-7.056 3.34-7.666 3.369-4.245.198zm-132.508-3.496c-2.93-2.75-4.836-5-4.236-5 .599 0 1.635.658 2.302 1.462.667.804 2.185 1.757 3.372 2.118 2.843.865 5.66 3.391 5.66 5.075 0 2.327-1.61 1.498-7.098-3.655zm251.098 3.5c0-.824.45-1.5 1-1.5s1 .676 1 1.5c0 .826-.45 1.5-1 1.5s-1-.674-1-1.5zm-56-6.993c0-.717 8.082-11.506 8.62-11.506 1.281 0-.06 3.28-2.704 6.612-2.938 3.703-5.916 6.167-5.916 4.894zm-231-28.67c-1.925-.54-4.159-1.625-4.964-2.41-2.788-2.716 4.516-1.723 7.658 1.042 3.04 2.675 2.655 2.87-2.694 1.368zm20.962-4.796c-3.982-3.404-3.596-3.678 2.018-1.432 2.21.885 4.02 2.235 4.02 3 0 2.222-2.304 1.624-6.038-1.568zm359.09 1.075c-1.164-.787-.968-1.08 1-1.497 1.347-.285 5.373-1.2 8.948-2.034 3.575-.834 8.525-1.812 11-2.174 24.13-3.528 36.368-10.757 53.02-31.317 10.127-12.506 23.355-26.467 23.803-25.124.502 1.507-4.126 7.455-10.916 14.03-3.123 3.025-6.518 6.867-7.543 8.537-3.184 5.187-13.48 17.838-20.438 25.114-4.017 4.2-13.123 7.447-31.437 11.209-17.898 3.676-25.483 4.576-27.437 3.256zM993 1034.98c0-.712 1.688-3.124 3.75-5.36 9.92-10.76 12.655-14.506 16.68-22.852 7.399-15.348 8.31-22.645 4.106-32.872-4.211-10.242-5.091-15.071-3.72-20.407 2.182-8.483 7.9-18.395 14.548-25.215 20.86-21.398 22.71-25.61 24.162-55 .231-4.675.792-10.784 1.246-13.575 2.103-12.936 27.041-41.573 43.674-50.151 18.558-9.57 47.064-45.226 50.586-63.274 4.622-23.685-3.52-60.64-17.718-80.42-3.42-4.762-5.852-5.948-5.05-2.46 5.062 22.008 6.926 33.858 6.607 41.99-.16 4.065.335 11.105 1.1 15.646 2.948 17.496-1.416 38.855-9.891 48.405-4.77 5.375-7.9 5.046-5.547-.584 3.101-7.424 2.233-9.999-6.01-17.814-9.938-9.423-14.902-17.1-23.445-36.263-13.123-29.432-13.934-30.701-14.223-22.25-.284 8.306.265 11.32 3.087 16.947 2.353 4.69 2.641 5.991 1.632 7.372-3.311 4.527-14.082-8.542-12.937-15.698.752-4.705-1.214-10.093-3.527-9.667-2.724.502-6.183 8.713-5.602 13.296.28 2.2.717 7.15.972 11 .332 5.005 1.47 9.375 3.992 15.33 3.891 9.187 4.232 11.341 2.076 13.13-2.683 2.227-4.814.66-7.457-5.483-1.425-3.313-3.603-7.64-4.841-9.618-1.237-1.977-2.255-5.116-2.261-6.977-.034-10.597-2.336-13.497-4.629-5.83-1.81 6.053-1.698 8.345.64 13.185 1.1 2.276 2 5.35 2 6.83 0 1.479.653 4.251 1.45 6.16 1.276 3.054 1.27 3.73-.057 5.622-3.224 4.604-6.572 2.238-7.748-5.475-.346-2.27-1.983-7.308-3.637-11.195-3.4-7.988-3.688-11.307-1.45-16.664 2.835-6.784.085-5.995-4.121 1.183-2.997 5.115-3.018 4.355.563 21.214 1.031 4.856.95 5.677-.784 8-2.703 3.622-5.628 3.422-6.035-.412-.493-4.643-3.074-12.979-4.675-15.093-.793-1.049-1.457-3.594-1.474-5.657-.037-4.335.116-4.265-4.508-2.06-5.246 2.502-6.41.797-3.723-5.448 1.636-3.805 1.968-6.08 1.518-10.434-.766-7.427 1.249-10.864 8.09-13.798 13.09-5.614 14.087-6.814 19.13-23.01 5.188-16.657 15.706-24.005 26.497-18.507 6.376 3.248 14.081 10.615 16.136 15.427 1.076 2.52 3.011 5.705 4.301 7.08 3.639 3.88 11.18 13.833 15.912 21 10.186 15.43 11.318 10.309 2.1-9.5-1.792-3.85-4.264-11.385-5.494-16.746-1.76-7.675-3.16-11.123-6.58-16.222-6.771-10.098-8.411-13.904-8.411-19.525 0-10.689 7.7-20.394 21.314-26.861 11.031-5.242 13.657-11.506 7.563-18.047-3.08-3.306-3.877-2.53-3.877 3.78 0 3.956-.482 6.276-1.473 7.1-2.096 1.738-8.328 1.512-10.417-.379-2.485-2.248-3.974-1.992-4.676.806-1.025 4.085-5.144 7.096-9.184 6.713-2.068-.196-1.413-5.63 1.238-10.266 4.02-7.032 3.024-11.853-2.448-11.853-5.979 0-9.746 6.623-8.615 15.145.715 5.393-.342 7.855-3.373 7.855-2.327 0-6.052-4.154-6.052-6.749 0-3-1.757-7.25-2.997-7.25-3.077 0-3.3 4.914-.649 14.257 4.16 14.661 3.089 18.742-4.922 18.742-4.637 0-6.161-2.438-6.597-10.552-.331-6.179-.853-7.767-4.212-12.829-4.27-6.432-5.423-11.664-3.713-16.845 1.87-5.668.286-8.274-5.031-8.274-5.414 0-7.875-3.834-7.878-12.272 0-4.704-.413-5.728-3.822-9.5-6.142-6.796-10.162-13.547-11.34-19.045-1.712-7.98-4.105-12.659-10.069-19.688-7.026-8.282-7.904-10.079-12.251-25.084-5.066-17.487-7.995-23.002-17.034-32.07-4.2-4.213-8.946-8.203-10.548-8.866-1.601-.664-2.69-1.565-2.42-2.002.69-1.117 6.193.954 11.283 4.246 2.365 1.53 4.615 2.786 5 2.791 1.177.016 12.8 13.319 14.486 16.577.87 1.682 2.264 3.625 3.098 4.317 2.87 2.383 8.175 14.962 9.196 21.808.839 5.623 3.492 12.218 5.875 14.601 2.961 2.961 3.652 1.818 1.478-2.444-1.16-2.272-3.19-8.295-4.513-13.384-4.049-15.578-9.995-26.13-21.308-37.813l-6.612-6.829 5.453 3.329c5.174 3.158 19.047 16.166 19.047 17.86 0 .436 1.543 3.137 3.429 6 1.885 2.864 3.97 7.516 4.634 10.338.663 2.822 1.82 6.346 2.57 7.83.752 1.486 1.367 3.656 1.367 4.823 0 3.244 4.726 10.593 8.979 13.961 5.279 4.181 5.933 3.768 1.61-1.016-4.302-4.762-7.481-11.318-11.138-22.968-5.912-18.835-15.758-33.01-29.584-42.591-2.25-1.56-3.631-2.987-3.071-3.174 1.393-.464 7.426 2.14 10.207 4.407 9.734 7.932 18.635 16.776 21.056 20.921 4.226 7.232 8.94 17.174 8.94 18.854 0 4.38 5.596 18.237 8.796 21.778 4.437 4.912 5.086 4.27 1.74-1.724-3.832-6.864-7.201-16.856-8.926-26.47-1.644-9.166-14.34-25.134-25.741-32.375-3.735-2.372-2.956-3.298 1.35-1.603 8.88 3.495 29.762 20.63 31.05 25.477.293 1.1 1.68 5.09 3.085 8.868 1.405 3.777 3.036 9.188 3.624 12.025 1.094 5.269 4.297 11.607 5.866 11.607 1.131 0-3.02-17.503-6.26-26.397-2.451-6.73-3.278-7.98-10.562-15.961-3.71-4.065-16.427-14.642-17.605-14.642-1.373 0-14.416-9.066-14.416-10.02 0-1.48.17-1.414 12.765 4.934 22.188 11.182 37.693 27.735 42.739 45.63 3.24 11.488 5.778 17.45 9.023 21.186 4.797 5.525 5.286 3.342 1.112-4.96-2.01-3.998-4.747-10.963-6.082-15.478-4.567-15.449-13.707-29.26-22.949-34.675-4.148-2.431-6.72-5.617-4.534-5.617 1.17 0 11.085 7.065 15.288 10.894 3.933 3.583 13.231 16.217 14.115 19.18.649 2.174 4.522 11.128 6.43 14.867.405.792 1.335 1.64 2.066 1.884 2.21.737.46-5.274-4.56-15.662-7.404-15.324-3.504-13.745 15.587 6.307a956.226 956.226 0 0 0 7.103 7.328C1089.457 504.583 1095 515 1095 521.307c0 3.978 25.99 29.966 29.97 29.966.62 0 2.451.684 4.067 1.52 4.96 2.564 11.014 2.771 14.713.503 3.91-2.398 3.94-2.925.718-12.524-3.282-9.777-2.44-13.75 4.064-19.188 2.458-2.054 4.468-4.35 4.468-5.101 0-1.207-8.348-18.617-14.246-29.71-5.209-9.797-12.335-23.493-15.089-29-1.65-3.3-8.065-13.772-14.254-23.271-14.176-21.755-15.53-26.556-10.229-36.246 5.8-10.6 20.308-10.582 30.358.035 7.113 7.515 14.904 9.781 19.957 5.806 3.482-2.74 3.113-11.571-1.02-24.33-7.161-22.116-9.82-43.262-8.054-64.07.84-9.908-.954-23.833-3.474-26.956-.458-.568-1.298-2.256-1.866-3.75-1.562-4.107 1.347-3.569 4.158.769 3.182 4.91 4 4.05 5.405-5.674 1.142-7.912 8.995-30.773 11.426-33.263 2.525-2.585 3.346 1.476 1.558 7.71-1.939 6.761-4.493 19.099-4.577 22.113-.082 2.93 2.58.21 3.296-3.366.324-1.622 2.718-7.575 5.32-13.228 4.333-9.417 4.765-11.054 5.15-19.529.495-10.907 2.573-12.965 3.731-3.695.646 5.17.501 7.02-1.169 14.945-.468 2.223-.336 2.724.509 1.935.627-.586 1.831-4.378 2.676-8.427 1.668-8.002 2.06-9.008 3.518-9.008 2.013 0 2.97 5.186 2.006 10.873-.525 3.095-1.224 7.877-1.553 10.627-.33 2.75-.97 6.881-1.421 9.18-.452 2.298-.445 4.773.016 5.5.68 1.073.84 1.076.853.016.01-.718.864-3.193 1.902-5.5 1.037-2.308 2.195-5.77 2.571-7.696 1.38-7.048 2.634-9.79 4.731-10.339 2.015-.527 2.081-.994 1.565-11.113-.297-5.81-.189-10.779.24-11.044 1.222-.755 3.172 2.156 3.493 5.216.16 1.53.582 5.48.938 8.78.356 3.3.787 13.425.959 22.5.336 17.762.706 19.413 6.205 27.7 3.71 5.59 9.164 10.434 16.515 14.668 7.783 4.482 11.484 15.665 8.67 26.19-1.284 4.796-1.217 5.044 3.289 12.192 1.147 1.82 1.18 2.63.177 4.237-.682 1.092-1.24 2.452-1.24 3.021 0 2.481 7.406 19.687 9.593 22.285 3.171 3.77 3.054 4.734-1.093 9.004-1.925 1.983-3.5 4.457-3.5 5.499 0 2.925-3.487 5.55-6.401 4.819-1.365-.343-4.645-3.174-7.29-6.291-12.512-14.748-18.309-17.045-18.309-7.257 0 4.755 2.846 8.065 8.917 10.372 5.26 2 8.562 4.466 11.738 8.772 2.851 3.864 2.871 4.263.345 6.79-2.616 2.616-3.948 2.524-8.533-.588l-3.812-2.587-3.714 2.087c-3.886 2.185-10.382 2.802-11.441 1.088-.34-.55-1.548-1-2.684-1-3.358 0-1.596 5.799 2.951 9.712 4.697 4.042 7.52 4.095 15.577.288 10.453-4.94 21.894-3.794 26.337 2.636 5.352 7.748 6.475 13.131 6.784 32.54.38 23.831 1.873 32.334 8.161 46.486 3.252 7.316 5.28 14.215 6.325 21.506 1.406 9.82 5.696 19.038 15.141 32.539 13.424 19.187 17.166 27.237 17.698 38.078.526 10.712 2.21 13.454 2.21 3.598 0-15.13-2.287-21.706-13.784-39.636-16.404-25.584-17.374-28.74-17.02-55.417.253-19.072.16-20.17-2.438-28.72-5.914-19.461-5.753-33.845.525-46.9 5.019-10.44 9.074-15.506 14.153-17.683 3.084-1.322 5.008-3.045 6.637-5.945 2.851-5.072 6.986-5.587 11.868-1.479 4.462 3.755 7.496 1.7 8.484-5.748.703-5.303 5.812-11.813 10.467-13.338.884-.29 2.625-2.1 3.867-4.022 2.788-4.313 6.195-4.64 9.153-.88l2.057 2.615-3.485 6.23c-4.29 7.674-4.908 14.214-1.234 13.075 8.439-2.615 10.684-1.053 8.353 5.812-4.453 13.115 3.487 20.796 9.463 9.153 5.627-10.962 14.905-7.332 12.779 5-.29 1.684.286 2.05 3.655 2.317 7.23.574 10.689 5.474 8.433 11.944-1.043 2.991-11.66 11.238-14.467 11.238-3.076 0-3.714 2.863-1.454 6.52 2.322 3.757 2.203 15.256-.187 18.175-1.392 1.7-.606 5.738 1.175 6.037.854.143 3.275-2.254 5.621-5.565 11.033-15.569 27.813-11.92 41.674 9.063 4.652 7.042 7.43 9.172 20.437 15.664 13.014 6.495 12.691 6.526 11.966-1.144-.874-9.232-4.066-18.36-9.18-26.25-7.467-11.516-7.608-12.017-6.916-24.73.582-10.71.483-11.543-1.985-16.77-3.126-6.618-3.27-10.778-.617-17.76 1.1-2.894 2-6.636 2-8.316 0-8.351 10.004-14.315 15.813-9.427 2.644 2.224 3.605 2.436 8.827 1.95 7.12-.663 10.86.915 10.86 4.583 0 2.285-.316 2.447-4.2 2.159-5.893-.438-7.844.977-10.264 7.445-2.895 7.737-2.143 8.583 2.466 2.775 6.04-7.61 9.314-8.906 17.179-6.796 4.933 1.323 2.641 6.746-2.47 5.843-3.069-.543-4.205.234-9.472 6.474-6.425 7.613-4.454 9.63 2.998 3.07 5.514-4.853 6.887-4.93 12.435-.699 7.587 5.787 5.753 9.42-3.672 7.275-2.597-.591-3.269-.274-5 2.36-1.1 1.673-3.238 3.474-4.75 4.001-1.513.528-2.775 1.32-2.805 1.761-.03.442-.21 3.952-.398 7.802-.19 3.909-1.315 9.65-2.545 13-2.676 7.287-2.688 11.157-.043 14.482 9.28 11.67 16.145 23.104 20.575 34.269 1.474 3.712 3.272 6.75 3.996 6.75 4.562 0 17.6-17.68 21.214-28.768 2.084-6.39 2.634-10.52 3.17-23.786.932-23.033 4.608-29.54 22.24-39.362 7.97-4.44 8.302-4.773 10.541-10.557 3.008-7.77 2.379-11.33-2.73-15.436-5.016-4.03-5.371-3.968-10.62 1.871-6.23 6.928-17.164 12.76-28.137 15.008-14.111 2.889-16.207-.286-3.918-5.935 8.577-3.943 7.156-4.894-3.896-2.609-7.969 1.648-12.651 1.983-13.658.976-1.484-1.484.915-3.536 5.789-4.953 10.98-3.192 8.849-5.412-5.216-5.436-11.16-.018-12.18-2.477-2.894-6.972 4.594-2.224 9.332-6.628 8.272-7.688-.36-.36-4.3.988-8.755 2.996-7.83 3.529-10.941 4.307-12.196 3.053-1.197-1.197.538-3.373 4.605-5.779 4.403-2.603 12.367-10.249 11.54-11.077-.27-.27-3.906 1.3-8.08 3.486-16.584 8.69-24.106 5.032-8.292-4.032 5.331-3.056 15.491-12.62 15.491-14.584 0-.647 2.046-2.852 4.546-4.9 2.5-2.049 6.264-6.04 8.364-8.87 6.357-8.565 13.365-14.915 21.558-19.536l7.783-4.39 9.125.562c12.74.784 21.454 3.983 24.055 8.83l1.931 3.6 11.924.6c17.583.884 31.658 4.228 32.91 7.82.527 1.51 2.499 3.922 4.381 5.358 7.473 5.7 1.785 11.325-14.292 14.13-10.602 1.852-13.553 3.316-16.917 8.4-2.155 3.257-2.4 4.235-1.373 5.472 2.103 2.535 4.593 1.722 10.674-3.484 9.274-7.939 25.273-10.723 28.37-4.936 2.073 3.873-3.01 8.927-8.979 8.927-3.08 0-4.449.999-11.528 8.416-8.475 8.88-10.87 10.584-14.863 10.584-2.393 0-2.451.176-2.094 6.25.202 3.438.38 6.588.396 7 .057 1.478 5.584.701 8.448-1.186 1.605-1.058 4.42-3.822 6.254-6.14 8.712-11.01 19.763-15.288 33.336-12.906 14.477 2.541 15.098 2.5 27.694-1.798 11.432-3.902 24.577-7.408 32.797-8.749 9.842-1.604 16.57-4.67 20.344-9.27 2.011-2.452 9.956-9.13 17.656-14.839 21.252-15.758 22.773-17.048 32.682-27.717 10.426-11.226 15.271-14.105 25.592-15.21 7.71-.826 12.218-4.126 14.066-10.294 1.817-6.063 6.662-9.67 15.684-11.678 11.523-2.563 13.277 1.079 3.15 6.537-5.235 2.822-8.377 5.63-7.395 6.612.769.77 5.095-1.825 8.833-5.296 3.367-3.126 12.053-3.416 19.38-.646 5.43 2.052 7.23 5.067 3.595 6.018-3.138.82-2.662 1.675 4.413 7.925 3.598 3.179 6.5 6.57 6.5 7.596 0 4.62-7.17 2.722-13.296-3.517-3.706-3.775-3.92-3.85-9-3.177-8.761 1.16-8.168 3.443 1.296 4.988 6.998 1.142 9.476 2.906 12.36 8.8 3.153 6.445 3.294 8.355.678 9.186-2.683.851-5.712-.959-7.548-4.509-3.1-5.994-13.007-9.236-20.49-6.704-5.653 1.913-5.42 3.052.79 3.844 9.083 1.158 14.21 5.08 14.21 10.869 0 2.979-1.963 3.441-4.85 1.141-4.94-3.937-9.301-5.358-13.15-4.286-13.95 3.885-19.406 3.808-27.68-.39-2.651-1.345-5.446-2.447-6.212-2.45-2.079-.005-11.886 8.715-12.678 11.274-2.792 9.028-34.183 42.382-45.47 48.313-6.887 3.62-12.185 9.01-15.782 16.06-3.566 6.991-15.411 18.35-19.135 18.35-2.595 0 1.687-8.082 6.29-11.873.917-.755 1.667-2.302 1.667-3.437 0-1.618-1.352-.669-6.25 4.39-7.313 7.551-16.353 13.716-17.879 12.19-.683-.683.61-2.273 3.982-4.891 4.792-3.722 12.603-14.833 11.585-16.48-.265-.43-2.385.077-4.71 1.127-4.584 2.07-21.721 6.112-33.728 7.955-4.125.633-10.723 2.021-14.663 3.085-3.94 1.063-7.896 1.934-8.79 1.934-7.476 0-34.59 24.658-40.33 36.678-2.416 5.057-.311 8.378 14.78 23.322 11.277 11.165 14.296 14.796 17.458 21 3.865 7.582 6.23 11 7.613 11 .416 0 2.923-3.038 5.57-6.75 2.648-3.713 7.89-10.07 11.65-14.125 7.541-8.139 13.796-16.193 17.893-23.044 4.289-7.17 12.604-14.96 17.264-16.174 19.776-5.151 26.613-8.483 32.068-15.628 6.535-8.558 8.142-9.237 20.347-8.594 11.974.63 14.546 1.552 21.539 7.71 4.862 4.283 5.425 6.605 1.601 6.605-2.72 0-3.33 1.651-1.175 3.181 2.37 1.681 4.45 5.566 3.663 6.84-1.582 2.558-11.108-1.63-15.998-7.033-2.056-2.272-8.202-2.682-13.34-.89-4.54 1.582-3.873 2.901 1.465 2.901 6.544 0 13.207 3.853 16.72 9.669 4.708 7.795 1.413 12.828-4.125 6.301-7.393-8.712-7.769-8.97-13.074-8.97-6.296 0-7.46 1.567-2.212 2.98 6.045 1.628 15.664 14.28 13.484 17.735-1.964 3.114-3.605 2.528-9.06-3.24-8.624-9.12-21.66-10.42-34.848-3.474-8.293 4.367-10.923 4.831-13.608 2.402-2.973-2.691-7.054 2.424-11.546 14.474-11.25 30.179-23.823 46.804-43.428 57.43-9.539 5.17-10.967 6.32-14.476 11.656-2.141 3.256-4.02 5.793-4.174 5.638-1.037-1.036 1.496-7.044 4.227-10.026 4.212-4.598 6.812-8.575 5.606-8.575-2.382 0-9.856 7.096-12.928 12.275-3.51 5.914-6.18 7.42-6.164 3.475.016-3.8 5.59-12.232 11.668-17.65 7.017-6.254 6.945-6.464-4.743-13.757-11.717-7.31-17.704-13.333-22.71-22.843-6.799-12.918-9.522-14.87-10.813-7.75-.931 5.139-8.485 20.87-12.363 25.75-5.388 6.779-16.857 18.228-21.312 21.275-35.002 23.94-40.14 32.46-30.07 49.866 6.068 10.488 7.908 48.415 2.51 51.75-1.39.86-2-3.702-1.438-10.727.723-9.009-1.296-20.042-5.243-28.663-9.592-20.948-7.807-34.073 6.407-47.11 5.676-5.208 21.73-17.837 26.345-20.727 2.508-1.57 11.89-12.385 15.753-18.16a635.481 635.481 0 0 1 4.146-6.12c3.473-5.03 3.223-7.585-.288-2.94-1.847 2.444-5.193 6.494-7.436 9-2.243 2.506-4.75 5.556-5.573 6.777-2.63 3.905-21.378 18.617-30.013 23.552-11.097 6.342-15.387 11.547-16.349 19.836-.544 4.695-1.376 6.834-3.671 9.449-4.58 5.215-2.851 15.98 4.13 25.73 7.898 11.03 10.792 31.61 6.686 47.543-.898 3.482-1.632 7.383-1.632 8.668 0 3.46-1.018 5.501-2.743 5.501-1.256 0-1.403-.847-.824-4.75 3.191-21.503 2.196-30.697-4.796-44.284-8.274-16.08-10.418-30.45-6.612-44.324 1.557-5.677 1.787-8.006.994-10.092-1.538-4.044-3.436-2.555-4.157 3.262-.351 2.83-1.65 7.069-2.886 9.418-3.972 7.548-3.959 20.403.03 29.77 1.757 4.125 3.712 8.85 4.344 10.5.632 1.65 2.163 4.63 3.402 6.622 3.822 6.146 6.495 19.106 5.958 28.878-.655 11.888-2.619 28.07-3.732 30.75-1.67 4.016-3.312 2.689-2.477-2 3.482-19.543 1.7-37.268-5.1-50.75-11.786-23.36-13.586-39.26-6.908-61 .254-.825.042-2.167-.47-2.983-2.35-3.747-7.059 15.312-7.414 30.01-.25 10.333-.178 10.706 3.901 20.5 6.477 15.548 10.301 25.603 11.449 30.104 1.045 4.1 1.608 27.642.696 29.118-.261.423-.724 5.04-1.028 10.26-.874 15.013-4.777 24.753-5.407 13.492-.576-10.3-3.978-6.984-4.144 4.04-.092 6.088-2.36 15.203-5.04 20.254l-1.967 3.706.215-5c.182-4.222-.057-4.979-1.534-4.862-2.177.173-2.185-1.068-.072-10.904 3.513-16.35.448-29.546-11.614-50.007-7.05-11.959-12.621-33.801-12.429-48.727.24-18.667 7.286-40.264 17.071-52.327 3.49-4.302 2.94-5.236-5.743-9.753-5.666-2.948-9.512-5.838-13.04-9.8-10.76-12.084-17.5-15.075-12.994-5.765 4.499 9.293 4.469 29.425-.056 37.88-4.212 7.871-6.624 21.58-6.128 34.83.539 14.405-.373 21.312-5.207 39.435-1.92 7.203-3.461 12.089-7.568 24-3.877 11.246-3.634 21.63.638 27.23 4.324 5.67 7.691 5.382 15.969-1.365 11.578-9.437 24.183-8.729 31.117 1.75 3.889 5.875 3.882 19.143-.016 30.885-3.146 9.477-13.734 31.138-17.108 35-1.2 1.375-3.348 4.075-4.77 6-2.389 3.232-9.258 10.264-20.235 20.715-5.641 5.37-18.736 14.236-24.568 16.633-2.473 1.016-7.197 3.14-10.497 4.72-6.458 3.09-19.128 8.452-24 10.157-18.824 6.588-29.177 13.817-36.28 25.335-6.642 10.77-7.373 14.314-6.233 30.256 1.115 15.6 1.128 15.51-4.296 28.506-5.708 13.675-14.61 23.982-25.255 29.242-4.113 2.032-7.7 4.052-7.969 4.489-.27.436-2.839 1.574-5.71 2.527-8.854 2.94-20.818 9.045-26.733 13.64-1.826 1.418-2.588 1.588-2.901.649-.598-1.794 7.671-8.87 10.366-8.87 1.227 0 3.89-1.125 5.916-2.5 2.026-1.375 4.494-2.5 5.484-2.5.99 0 2.578-.858 3.528-1.908.95-1.05 3.157-2.485 4.905-3.189 6.706-2.701 20.296-14.377 25.187-21.64 7.822-11.615 10.499-21.816 10.948-41.72.174-7.724.66-15.616 1.08-17.54.668-3.064.574-3.34-.763-2.23-2.12 1.76-3.37 7.444-5.254 23.91-3.976 34.746-10.272 43.482-41.888 58.127-23.05 10.676-37.857 22.16-46.172 35.814-3.743 6.144-6.511 8.335-5.618 4.446 2.002-8.72 25.739-32.212 39.658-39.25 1.65-.835 4.35-2.2 6-3.032 10.869-5.485 21.688-11.593 24.039-13.572 4.189-3.525 12.087-15 15.795-22.945 3.42-7.332 3.987-9.702 5.25-21.994 1.394-13.55 2.37-16.942 8.625-29.948 3.738-7.77 19.237-22.442 29.945-28.345 4.685-2.583 5.008-2.95 2.616-2.965-16.705-.111-42.71 31.024-46.33 55.47-.782 5.278-7.636 20.366-11.59 25.51-11.22 14.602-16.935 19.763-29.35 26.504-2.75 1.493-8.488 5.384-12.75 8.646-8.221 6.29-11.063 5.843-3.577-.565 4.33-3.706 20.25-14.584 21.345-14.584.732 0 10.63-8.332 14.387-12.109 5.298-5.328 7.154-7.788 8.704-11.541.875-2.117 2.266-4.611 3.093-5.542.827-.93 1.304-2.28 1.062-3-.266-.788-1.067-.115-2.014 1.693-1.9 3.625-7.75 9.378-7.75 7.62 0-.69 1.08-2.686 2.4-4.437 3.154-4.185 9.055-15.562 8.407-16.21-.279-.278-2.44 2.538-4.803 6.26-7.171 11.297-18.72 21.89-33.004 30.271-3.025 1.775-6.744 4.11-8.265 5.19-1.52 1.08-3.32 1.771-4 1.537-.68-.234 1.015-1.807 3.765-3.495 2.75-1.69 5.68-3.67 6.512-4.404.831-.733 3.667-3.093 6.302-5.246 9.274-7.576 8.474-10.052-1.017-3.145-5.008 3.644-28.961 16.68-34.68 18.875-2.357.905-.918-1.718 2.212-4.032 3.422-2.53 10.72-6.284 12.218-6.284 2.118 0 16.444-10.43 25.314-18.428 17.918-16.16 26.696-34.642 29.71-62.554 1.174-10.888 1.436-12.048 3.957-17.518 3.542-7.689 3.598-14.37.085-10.137-2.246 2.707-5.351 14.32-6.186 23.137-.47 4.95-1.558 11.925-2.42 15.5a632.064 632.064 0 0 0-2.545 11c-1.423 6.537-6.788 16.538-11.962 22.295-2.475 2.754-6.119 7.976-8.097 11.606-3.4 6.235-4.199 6.97-14.5 13.325-5.997 3.699-11.29 6.736-11.761 6.75-.472.013-5.095 2.113-10.274 4.666-15.346 7.566-12.297 3.866 3.632-4.407 7.195-3.738 23.29-14.279 22.7-14.868-.609-.61-28.116 12.694-38 18.38-8.772 5.044-10.638 4.99-5.49-.158l3.477-3.477-3.093.596-3.094.597 1.93-2.18c2.006-2.267 13.486-8.542 14.243-7.786.238.238-1.167 1.42-3.12 2.628-7.576 4.682-3.345 5.422 5.095.891 3.219-1.727 9.002-4.715 12.852-6.639 3.85-1.924 6.418-3.704 5.707-3.957-.712-.252-4.57 1.161-8.575 3.14-7.473 3.692-9.632 4.29-9.632 2.67 0-.51 2.536-2.127 5.635-3.593 12.494-5.91 28.365-18.72 28.365-22.892 0-.521-1.61.934-3.578 3.233-1.968 2.298-4.025 4.18-4.57 4.18-.547 0-3.834 2.026-7.305 4.503-3.472 2.477-10.308 6.278-15.191 8.445-19.146 8.499-32.886 17.338-38.552 24.803-9.002 11.859-17.414 25.832-19.264 31.998-.371 1.238-1.1 2.25-1.621 2.25-.52 0-.265-1.63.567-3.622.833-1.992 1.514-4.478 1.514-5.525 0-2.725 6.508-15.287 11.678-22.543 7.757-10.884 17.69-18.39 37.289-28.177 25.397-12.683 39.145-25.22 41.505-37.853.389-2.079 1.134-4.297 1.657-4.93 1.1-1.33 5.84-18 5.858-20.6.01-.962-.654-1.75-1.468-1.75-1.395 0-1.755.886-2.843 7-1.217 6.843-4.201 16.144-6.99 21.785-3.627 7.34-19.064 24.244-22.123 24.226-1.712-.01-1.604-.358.927-3 4.037-4.214 2.451-4.818-3.202-1.22-13.749 8.749-22.375 11.29-14.288 4.21 2.475-2.168 4.167-3.954 3.76-3.97-2.184-.089-22.002 12.007-26.45 16.143-6.03 5.607-8.954 6.462-4.414 1.292 3.415-3.89 3.998-6.466 1.464-6.466-1.516 0-2.796 1.245-9.765 9.5-1.95 2.312-2.54 2.6-2.564 1.253-.029-1.611 13.747-17.491 20.896-24.087 4.125-3.805 3.875-5.028-.64-3.14-4.404 1.839-5.545 2.74-15.113 11.935-7.432 7.14-12.155 13.4-16.255 21.54-2.892 5.741-2.622 5.49-4.365 4.045-1.835-1.524-6.187 7.384-7.55 15.454-1.02 6.042-1.92 8.5-3.111 8.5-2.83 0 1.262-18.375 5.804-26.064 2.35-3.977.65-5.094-2.243-1.475-1.3 1.629-2.642 2.685-2.98 2.348-1.125-1.126 8.588-21.391 12.94-26.996a493.672 493.672 0 0 0 5.52-7.338c1.89-2.558 8.699-8.663 15.133-13.567 12.683-9.666 24.527-21.44 25.51-25.363 1.33-5.299-.406-4.56-5.393 2.298-3.226 4.434-7.966 9.241-12.447 12.62-3.98 3.003-9.901 7.5-13.157 9.995-6.672 5.112-7.93 5.217-4.313.358 1.357-1.823 3.315-4.658 4.35-6.3l1.883-2.983-3.155 2.234c-5.015 3.552-7.547 2.563-3.127-1.221 1.705-1.46 1.89-2.01.8-2.373-.78-.26-1.61.101-1.843.802-.234.702-1.226 1.937-2.205 2.746-7.479 6.181-13.883 14.209-24.431 30.626-2.42 3.766-4.654 7.101-4.964 7.412-1.352 1.352 4.895-11.888 6.362-13.485 1.867-2.03 6.063-9.855 6.063-11.304 0-7.689-21.375 25.118-26.66 40.916-1.356 4.056-13.35 27.953-15.364 30.614-4.6 6.078-7.76 18.507-8.894 35-1.161 16.867-2.499 25.022-4.286 26.126-1.608.994-1.73-.023-.804-6.663.496-3.555 1.155-12.538 1.465-19.963.569-13.613 1.108-16.97 3.98-24.782 1.917-5.211 10.152-21.768 12.544-25.218.953-1.375 3.396-6.325 5.428-11 7.606-17.497 15.117-31.231 21.204-38.773 6.368-7.89 12.468-12.912 14.305-11.777.564.348 3.06-2.13 5.547-5.509 2.486-3.378 5.65-7.03 7.028-8.114 1.379-1.084 2.524-2.502 2.546-3.15.043-1.303 4.337-8.367 10.46-17.21 8.173-11.8 8.525-12.467 6.589-12.467-.807 0-7.674 8.965-12.235 15.97-.905 1.392-6.69 7.705-12.855 14.03-6.165 6.325-12.69 13.75-14.5 16.5-3.089 4.693-6.377 8.16-10.956 11.55-4.485 3.321 6.402-11.646 16.458-22.625 6.933-7.57 11.932-14.424 10.52-14.424-1.168 0-37.378 38.026-38.907 40.857-.487.903-1.669 2.543-2.625 3.643-.956 1.1-3.205 4.7-4.996 8-1.791 3.3-3.605 6.45-4.03 7-1.365 1.765-9.007 19.727-12.101 28.445-1.649 4.644-4.981 12.52-7.406 17.5-6.545 13.443-11.278 33.107-11.288 46.896-.01 13.006-4.653 30.416-10.512 39.416-3.756 5.769-5.135 3.064-1.785-3.502 5.153-10.101 6.306-15.965 7.128-36.255.968-23.88 2.993-31.15 13.866-49.767 2.224-3.81 5.311-11.47 7.108-17.639 1.747-5.997 4.493-13.691 6.102-17.096 1.61-3.406 2.926-6.548 2.926-6.983 0-1.838 9.524-16.717 13.346-20.85 2.285-2.472 7.04-7.89 10.566-12.043 3.527-4.153 10.21-11.054 14.853-15.337 12.303-11.348 23.304-24.605 36.167-43.584 10.871-16.04 17.127-47.6 14.08-71.035-.655-5.042-1.57-13.892-2.032-19.667-.97-12.111-2.897-22.774-7.043-38.978-5.79-22.624-2.73-29.076 10.94-23.076 10.149 4.455 11.577 4.095 15.658-3.946 2.873-5.66 2.342-19.854-1.028-27.5-2.276-5.16-6.357-16.697-7.439-21.023-1.266-5.066-3.101-7.844-4.354-6.59-1.196 1.195.027 5.586 4.627 16.613 5.805 13.917 7.827 29.54 4.466 34.5-3.429 5.06-7.328 5.041-17.044-.084-8.437-4.45-14.883 11.645-10.8 26.968 2.44 9.15 4.317 16.99 5.058 21.116.444 2.475 1.296 7.2 1.892 10.5.597 3.3 1.508 8.362 2.025 11.248.517 2.886 1.144 5.586 1.393 6 1.187 1.975 1.744 38.597.669 43.997-2.547 12.796-5.77 23.673-8.666 29.248-1.284 2.47-2.334 4.866-2.334 5.325 0 2.478-9.27 15.815-16.122 23.191-4.333 4.666-7.878 9.16-7.878 9.987 0 .828-.402 1.504-.893 1.504s-5.466 4.275-11.055 9.5c-5.59 5.225-10.552 9.5-11.028 9.5-1.631 0-25.52 27.743-29.074 33.763-1.952 3.308-4.36 8.653-5.348 11.876a716.448 716.448 0 0 1-4.3 13.361c-1.375 4.125-3.147 10.184-3.94 13.464-.79 3.28-2.031 6.655-2.756 7.5-.724.845-2.791 4.783-4.593 8.75-1.802 3.968-4.117 7.975-5.145 8.905-1.027.93-1.868 2.495-1.868 3.477 0 .983-.412 2.04-.915 2.352-.504.311-2.125 3.732-3.604 7.603-2.844 7.44-2.805 6.863-2.444 36.245.073 5.938-.28 11.338-.784 12-.503.662-2.147 4.65-3.651 8.86-1.505 4.21-3.606 8.443-4.67 9.405-1.062.962-1.94 2.242-1.95 2.844-.01.603-1.36 3.076-3 5.496-3.409 5.03-3.957 3.93-.965-1.935 5.529-10.837 6.996-26.142 4.022-41.966-2.146-11.424 5.713-32.842 15.387-41.93 1.416-1.33 2.574-3.085 2.574-3.9 0-.814 1.044-2.873 2.32-4.575 5.924-7.898 11.67-23.723 11.675-32.154.01-8.7 3.547-22.039 7.284-27.44 5.073-7.335 17.318-21.476 21.298-24.6 2.034-1.595 6.835-5.96 10.669-9.7 3.834-3.739 9.285-8.515 12.112-10.614 17.194-12.76 38.642-46.959 38.642-61.612 0-4.149-1.287-2.043-3.99 6.525-7.023 22.277-32.363 54.55-49.757 63.375-5.52 2.8-25.961 22.67-29.146 28.331-5.017 8.92-8.864 18.137-9.511 22.794-1.467 10.55-4.875 25.267-7.295 31.5-3.601 9.28-5.988 12.916-18.805 28.666-12.27 15.075-13.362 18.708-10.948 36.39 2.408 17.64 1.344 24.382-6.33 40.12-5.438 11.151-6.88 13.205-15.158 21.574-9.558 9.666-10.06 10.063-10.06 7.956zm140-161.324c0-.825-.45-1.221-1-.882-.55.34-1 1.294-1 2.119 0 .825.45 1.221 1 .881.55-.34 1-1.293 1-2.118zm-4-3.5c0-.55-.45-.721-1-.382-.55.34-1 1.069-1 1.619s.45.721 1 .381c.55-.34 1-1.068 1-1.618zm108.58-4.046c10.968-11.877 18.283-26.507 22.357-44.72 1.675-7.488 3.655-16.22 4.399-19.403.744-3.183 1.03-5.986.636-6.23-.893-.552-3.358 5.98-5.478 14.518-6.415 25.84-17.362 49.006-26.896 56.918-.94.78-2.163 2.269-2.72 3.31-1.558 2.91 3.757-.122 7.702-4.393zm-101.206 1.414c1.386-2.675 2.563-4.15 10.376-12.995 7.414-8.393 10.867-11.533 18.25-16.597 6.038-4.142 7.075-5.207 5.318-5.462-3.062-.445-7.104 1.869-15 8.585-3.75 3.19-8.055 6.579-9.568 7.532-1.512.954-2.75 2.336-2.75 3.073 0 .737-1.39 3.089-3.09 5.227-3.168 3.984-5.91 9.557-5.91 12.01 0 2.117.807 1.65 2.374-1.372zm78.916-4.36c11.433-5.733 34.065-36.934 29.85-41.15-1.41-1.41-3.098.48-3.125 3.497-.049 5.562-13.58 24.688-21.766 30.766-10.416 7.733-12.545 10.69-4.96 6.886zm-49.29-7.925c0-1.324-1.354-1.21-2.8.235-1.888 1.888-1.403 2.98.8 1.8 1.1-.588 2-1.504 2-2.035zm6.414-4.6c.288-.75.188-1.365-.223-1.365-1.259 0-5.191 3.057-5.191 4.036 0 1.323 4.787-1.039 5.414-2.67zm98.432-33.615c8.847-13.072 20.664-22.55 33.377-26.77 4.374-1.451 6.927-2.877 7.31-4.08.4-1.262 2.872-2.53 7.777-3.988 23.061-6.858 59.1-35.565 73.854-58.831 5.409-8.528.955-5.065-6.221 4.839-7.261 10.02-30.943 30.668-30.943 26.979 0-.647 3.263-4.625 7.25-8.84 8.33-8.805 14.079-17.817 13.547-21.237-.326-2.1-.576-1.94-2.62 1.678-7.305 12.935-17.323 21.54-36.677 31.504-13.017 6.702-25.257 14.205-34.448 21.116-8.809 6.625-11.052 7.85-11.052 6.036 0-1.853 18.34-18.246 23.258-20.789 8.372-4.33 26.616-18.265 30.91-23.611 8.477-10.553 11.791-18.061 9.41-21.319-1.28-1.75-1.461-1.584-2.506 2.295-1.93 7.17-10.132 18.198-17.735 23.85-12 8.919-15.702 11.418-16.912 11.418-.649 0-1.753.69-2.452 1.533-.7.844-4.871 4.278-9.27 7.633-11.078 8.45-18.79 17.692-25.253 30.267-2.934 5.707-5.445 8.193-5.455 5.4 0-.733 2.355-5.994 5.24-11.691 4.68-9.245 6.59-11.745 17.759-23.25 6.882-7.09 13.034-12.892 13.67-12.892 1.333 0 15.44-11.545 16.636-13.615 1.748-3.027-2.07-1.166-7.927 3.865-3.362 2.888-7.409 6.035-8.993 6.994-27.535 16.673-37.496 30.15-45.363 61.372-3.428 13.607-2.94 14.135 3.829 4.134zm-113.546-5.83c3.135-2.793 5.7-5.757 5.7-6.584 0-.908-2.575.756-6.5 4.202-6.025 5.29-7.684 7.462-5.7 7.462.44 0 3.366-2.285 6.5-5.08zm45.076-4.428c3.154-3.03 6.415-7.14 7.249-9.135.833-1.995 2.471-4.92 3.64-6.502 1.17-1.582 2.2-4.558 2.289-6.615.089-2.057.498-4.527.91-5.49.413-.962.47-2.482.126-3.376-.344-.895-.112-2.245.515-3 1.395-1.681.132-1.794-3.713-.332-2.15.817-3.068.711-4.272-.493-2.358-2.358-.018-4.279 3.346-2.746 2.2 1.003 2.933.797 5.777-1.621 1.791-1.523 4.495-3.547 6.007-4.498 1.52-.956 2.75-2.632 2.75-3.747 0-1.745 3.274-7.454 5.124-8.936 3.698-2.963 5.754-10.492 3.84-14.066-1.603-2.996-2.784-2.318-4.03 2.316-2.79 10.369-12.818 17.465-17.734 12.55-2.021-2.022-1.375-2.75 3.05-3.434 5.197-.804 11.75-6.958 11.75-11.034 0-2.352-.275-2.527-3.084-1.966-4.666.933-8.916 4.366-8.916 7.202 0 1.614-.567 2.432-1.685 2.432-4.84 0-7.9 7.32-4.783 11.44 2.84 3.755.54 10.56-3.568 10.56-4.151 0-9.773 3.124-11.014 6.12-.678 1.638-3.24 4.623-5.694 6.633-5.942 4.869-6.777 7.28-4.39 12.678 3.146 7.111 5.63 8.76 12.634 8.388 4.681-.25 6-.005 6 1.109 0 2.475-5.505 3.243-10.872 1.518-5.994-1.928-7.628-1.387-7.628 2.522 0 8.632 8.185 9.393 16.376 1.523zM1194 795.022l-2.5-1.124 3-.39c4.32-.56 4.967-1.698 2.051-3.609-4.031-2.641-3.606-7.842.77-9.425 12.311-4.451 16.961 3.306 6.892 11.498-5.643 4.59-6.332 4.796-10.213 3.05zm42.965-2.683c1.248-2.332 1.354-5.066.196-5.066-.872 0-3.161 4.38-3.161 6.048 0 1.656 1.887 1.031 2.965-.982zm82.035-1.066c0-.55-.198-1-.441-1-.242 0-.72.45-1.059 1-.34.55-.141 1 .441 1s1.059-.45 1.059-1zm-144.847-2.884c.587-1.587.493-2.164-.31-1.897-.633.212-1.532 1.411-1.996 2.666-.587 1.586-.493 2.164.31 1.897.633-.212 1.532-1.411 1.996-2.666zm96.901-3.366c1.965-4.304 14.962-23.866 18.908-28.457.57-.665 1.038-1.691 1.038-2.282 0-4.072-22.335 26.744-24.453 33.74-1.386 4.573 2.113 2.245 4.507-3zm-103.75-11.807c.343-1.308.112-1.915-.633-1.667-1.438.48-2.189 3.725-.861 3.725.526 0 1.199-.926 1.495-2.058zm21.217-1.977c1.401-2.218 4.444-5.907 6.763-8.196 6.79-6.702 7.702-8.55 7.71-15.603.01-7.47-1.729-8.007-3.714-1.148-1.7 5.872-2.477 6.448-6.136 4.556-4.326-2.237-5.28-4.565-4.52-11.034.726-6.179-.615-7.445-2.956-2.79-2.978 5.923-2.858 9.045.59 15.323 3.199 5.824 5.194 7.075 7.542 4.727.933-.934 1.2-.873 1.2.274 0 .811-2.007 3.364-4.46 5.672-4.761 4.48-8.005 9.692-7.022 11.283 1.114 1.803 2.446.987 5.003-3.064zM1358 769.213c0-1.312-3.16.343-5.082 2.66-1.336 1.61-1.23 1.612 1.832.03 1.788-.925 3.25-2.135 3.25-2.69zm-80.155-13.314c1.29-1.169 3.032-3.476 3.87-5.126 1.706-3.354-10.041 7.843-14.338 13.668-4.073 5.52-2.612 5.129 2.873-.77 2.888-3.106 6.305-6.603 7.595-7.772zm-70.967 6.471c.758-.48 1.068-1.374.69-1.987-.794-1.284-4.568.307-4.568 1.926 0 1.195 2.037 1.227 3.878.061zm-10.553-19.347c1.289-5.349-3.646-17.724-7.075-17.743-1.67-.009-1.575 1.97.312 6.488.86 2.056 1.314 4.387 1.01 5.178-.788 2.054 2.05 8.327 3.769 8.327.793 0 1.686-1.012 1.984-2.25zm107.675-2.75c.689-1.286.714-2 .07-2-.55 0-1.482.9-2.07 2-.689 1.287-.714 2-.07 2 .55 0 1.481-.9 2.07-2zm8.541-13.25c9.11-19.183 3.895-35.593-14.041-44.183-11.315-5.42-14.368-16.104-9.117-31.899 2.523-7.587 5.16-16.353 8.621-28.668 1.16-4.125 2.533-8.881 3.052-10.57 1.99-6.476 1.132-25.179-1.577-34.373-5.14-17.44-6.78-22.71-9.042-29.057-4.274-11.985-4.731-15.091-4.675-31.747.05-14.676-.537-19.043-2.197-16.358-.315.51-1.092 6.919-1.727 14.24-1.343 15.504-.272 25.315 3.641 33.365 1.337 2.75 3.345 7.475 4.462 10.5 1.118 3.025 3.624 9.683 5.57 14.794 3.873 10.168 5.308 27.939 2.658 32.892-.643 1.2-1.169 4.811-1.169 8.023 0 4.798-.99 8.245-5.545 19.316-10.385 25.235-10.913 27.868-7.927 39.515 2.05 8 3.705 9.98 12.487 14.939 18.442 10.415 23.14 25.59 13 41.996-2.284 3.697-2.461 4.526-.966 4.526.577 0 2.599-3.263 4.492-7.25zm-101.57 5.29c1.72-1.088 1.867-.955-4.166-3.77-4.131-1.927-9.651-9.36-8.244-11.1.75-.928 4.46 2.202 6.291 5.305 2.507 4.248 4.254 4.39 10.75.872 2.693-1.46 7.588-3.597 10.876-4.75 4.918-1.725 6.16-2.628 7-5.097.562-1.65 1.922-3.772 3.022-4.716 3.096-2.658.534-2.05-5 1.187-13.66 7.989-15.174 8.548-19.241 7.098-5.882-2.097-8.845-4.657-11.209-9.686-3.675-7.817.978-9 5.259-1.337 3.876 6.938 6.01 7.289 15.084 2.475 3.607-1.914 8.58-3.989 11.052-4.611 6.152-1.549 8.597-4.345 2.995-3.423l-3.94.647 2.744-2.514c1.51-1.382 5.277-3.312 8.372-4.288 3.721-1.173 6.164-2.63 7.212-4.303.871-1.39 2.886-4.057 4.477-5.926 1.59-1.868 3.761-5.424 4.823-7.901 1.062-2.477 3.238-5.993 4.836-7.813 5.297-6.033 10.426-16.388 8.118-16.388-.58 0-2.369 2.587-3.977 5.75-3.302 6.493-12.758 20.25-13.92 20.25-.42 0-2.262 2.475-4.096 5.5-3.821 6.305-5.076 6.856-5.12 2.25-.03-2.917-.169-3.07-1.361-1.5-1.692 2.228-2.608 2.225-2.608-.007 0-2.78 6.821-19.418 8.892-21.689 1.03-1.13 2.562-3.405 3.402-5.055.84-1.65 2.918-4.321 4.617-5.937 3.157-3 3.871-4.563 2.088-4.563-3.953 0-21.566 27.279-25.451 39.418-.378 1.18-.97 1.56-1.543.988-3.567-3.567 7.652-27.842 17.355-37.552 2.942-2.945 6.366-7.379 7.608-9.854 1.242-2.475 3.045-5.4 4.008-6.5 2.211-2.526 7.35-16.068 6.733-17.744-.254-.69-.812.094-1.24 1.744-1.002 3.861-8.233 17.68-9.968 19.048-1.326 1.045-10.256 12.542-18.193 23.424-4.365 5.984-7.922 14.936-8.969 22.57-.336 2.453-1.02 4.458-1.52 4.458s-.687-1.462-.414-3.25c.273-1.787.77-5.725 1.105-8.75.774-6.985 5.75-17.231 13.234-27.254 23.388-31.317 25.163-44.132 10.773-77.746l-3.639-8.5.522-14.018c.604-16.23-.678-24.345-5.388-34.11-1.656-3.435-3.022-6.611-3.034-7.059-.012-.447-.902-1.937-1.978-3.312l-1.955-2.5-.022 3.157c-.012 1.737 1.092 5.337 2.454 8 4.752 9.289 7.286 21.774 6.067 29.898-1.159 7.73-2.544 4.84-2.543-5.305 0-9.597-.072-9.894-4.606-18.908-3.46-6.878-4.798-10.862-5.375-16-1.054-9.373-2.638-14.687-5.022-16.844-2.672-2.419-3.495-1.365-1.686 2.159 1.778 3.461 3.35 11.333 4.255 21.293.56 6.158 1.25 8.284 3.975 12.246 4.647 6.756 5.754 16.529 3.66 32.304-1.061 7.988-.814 11.45 2.037 28.5 1.537 9.19 1.373 31.977-.268 37.47-2.553 8.539-5.45 15.63-13.224 32.366-7.138 15.366-8.179 18.352-9.159 26.28-1.3 10.514-2.964 11.649-3.385 2.308-.358-7.916 2.416-17.319 9.157-31.045 8.482-17.27 15.347-41.38 11.783-41.38-.629 0-1.143.147-1.143.325 0 2.089-8.35 23.358-12.038 30.665-8.367 16.575-11.923 29.782-12.255 45.514-.144 6.823-.59 9.96-1.457 10.248-.907.301-1.25-1.222-1.25-5.546 0-3.279-.678-7.583-1.506-9.566-.981-2.348-1.72-8.753-2.12-18.372l-.612-14.767 3.119-7.777c3.273-8.16 3.643-9.723 2.303-9.723-3.123 0-7.584 15.44-8.772 30.363-1.05 13.18-2.889 8.47-2.063-5.28.639-10.642 3.119-20.004 8.632-32.583 4.763-10.87 2.311-36.592-5.121-53.737-4.131-9.53-4.707-19.131-1.948-32.477 5.387-26.06 3.58-33.763-11.453-48.795-4.06-4.061-8.638-9.77-10.171-12.688-2.28-4.338-2.846-4.894-3.108-3.053-.414 2.918 7.114 16.564 10.623 19.257 1.483 1.138 3.597 3.335 4.697 4.884 7.354 10.35 7.678 11.034 8.569 18.128.907 7.223.689 8.877-2.63 19.98-3.953 13.222-3.963 13.396-1.53 26.338 1.258 6.69 3.091 14.413 4.074 17.163 6.718 18.798 7.632 37.845 2.473 51.534-7.673 20.356-9.658 32.334-8.2 49.466 1.96 23.003 2.007 29.244.258 33.822-2.52 6.603-1.48 10.459 4.624 17.138 5.19 5.68 8.964 7.026 12.833 4.579zM1222 680.98c0-6.446 5.8-22.774 10.905-30.707 19.136-29.725 22.358-43.484 14.792-63.163-3.25-8.45-6.013-23.889-5.22-29.16 1.199-7.951 1.687-9.677 2.738-9.677.681 0 .832 1.641.425 4.612-1.158 8.444 1.238 23.036 5.02 30.57 10.243 20.412 7.991 35.78-8.87 60.513-11.376 16.689-14.554 23.456-16.575 35.296-.927 5.426-3.215 6.648-3.215 1.716zm-23-8.873c0-3.641.436-3.51 1.378.417.392 1.632.246 2.75-.359 2.75-.56 0-1.019-1.425-1.019-3.167zm61.623 52.97c.476-5.474 1.451-10.176 2.596-12.52.802-1.64.765-2.598-.143-3.692-.994-1.198-.744-2.186 1.323-5.227 3.226-4.748 2.505-5.587-1.54-1.792-4.82 4.524-6.829 10.06-7.285 20.086-.22 4.847-.16 9.202.134 9.678.997 1.614 4.627-3.21 4.915-6.532zm79.404.947c1.061-2.338 1.909-5.825 1.884-7.75l-.045-3.5-1.265 4c-.696 2.2-2.016 5.44-2.933 7.2-1.951 3.744-2.031 4.3-.62 4.3.578 0 1.918-1.913 2.979-4.25zm-114.745 1.904c3.363-1.405 6.392-4.314 5.461-5.244-.809-.81-7.915 1.31-10.51 3.133-4.298 3.021-.713 4.52 5.05 2.111zm-199.25-19.775c1.248-4.632.75-6.88-1.525-6.88-1.976 0-3.05 2.93-3.854 10.5l-.637 6 2.457-2.765c1.352-1.522 2.954-4.606 3.56-6.855zm328.968 4.27c0-2.874-2.08-8.15-3.215-8.15-.58 0-.742.97-.378 2.25a99.985 99.985 0 0 1 1.242 5c.677 3.097 2.351 3.737 2.351.9zm-15.93-6.052c-1.139-1.598-2.07-3.313-2.07-3.81 0-.498-.703-1.779-1.562-2.846-2.794-3.473-.69 5.48 2.365 10.058 2.404 3.605 2.7 3.778 3.002 1.752.183-1.236-.597-3.556-1.736-5.154zm62.039 3.587c.395-1.476.323-2.684-.16-2.684-1.007 0-2.949 3.305-2.949 5.017 0 2.154 2.389.361 3.109-2.333zM1335 686.714c0-1.342-.45-2.44-1-2.44s-1 1.376-1 3.059c0 1.784.417 2.801 1 2.44.55-.34 1-1.716 1-3.059zm-86.329-12.76c-.246-.65-1.173.493-2.06 2.537-2.278 5.257-1.922 7.038.493 2.462 1.109-2.1 1.814-4.35 1.567-5zm89.934 1.685c.973-2.55 3.525-7.35 5.67-10.669 8.898-13.768 16.09-36.397 14.68-46.197l-.575-4-.767 4c-.422 2.2-1.183 5.305-1.69 6.9-.508 1.594-.923 3.85-.923 5.012 0 2.553-4.64 17.449-5.916 18.991-1.956 2.365-14.079 27.2-14.081 28.847-.01 3.244 1.82 1.783 3.602-2.884zm102.843-23.179c-1.01-4.42-4.41-13.21-8.006-20.687-15.95-33.17-16.196-52.485-1.064-83.591 4.582-9.418 5.378-11.908 3.81-11.908-2.11 0-11.188 12.22-11.188 15.06 0 .877-1.533 5.5-3.407 10.274-5.667 14.434-6.232 32.339-1.567 49.666 4.431 16.463 6.576 22.015 11.121 28.797 5.088 7.592 9.654 21.64 9.978 30.703.105 2.934.4 2.052 1.111-3.314.788-5.955.642-8.74-.787-15zm8.283 14.063c2.672-9.553.058-30.742-5.15-41.75-10.45-22.085-12.554-30.672-11.47-46.811.878-13.097 1.28-14.795 6.303-26.65 4.038-9.53 4.148-10.038 2.164-10.038-1.645 0-7.037 10.924-11.106 22.5-6.015 17.11-2.964 39.181 8.998 65.084 3.675 7.96 6.53 18.178 6.53 23.374 0 7.424 1.198 17.041 2.123 17.041.462 0 1.185-1.237 1.608-2.75zM1209 662.693c0-2.364 8.718-24.153 13.57-33.92 10.885-21.903 11.114-42.465.741-66.49-7.648-17.715-8.24-22.268-5.181-39.834 3.225-18.52-4.621-41.791-16.743-49.656-1.712-1.11-3.83-3.257-4.704-4.77-.874-1.512-2.077-2.75-2.672-2.75-1.712 0 .528 3.489 5.647 8.794 12.634 13.093 14.876 19.958 13.896 42.531-1.418 32.636-1.394 32.94 3.433 43.148 9.511 20.115 9.765 34.599 1.034 59.028-1.18 3.3-2.75 7.8-3.492 10s-2.257 6.025-3.367 8.5c-1.11 2.475-2.293 7.425-2.627 11-.335 3.575-.856 8.912-1.158 11.862-.381 3.723-.217 5.157.537 4.69.597-.369 1.086-1.329 1.086-2.134zm125.953-54.173c-.631-3.16-1.577-7.997-2.102-10.747-.525-2.75-1.801-7.25-2.836-10-6.723-17.869-8.917-23.208-13.704-33.334-6.65-14.071-10.304-24.055-11.36-31.047-.448-2.96-1.295-5.862-1.883-6.45-1.68-1.68-1.33 5.922.428 9.324.823 1.59 1.91 5.73 2.417 9.2 1.445 9.892 6.525 23.932 14.572 40.275 7.451 15.132 12.533 29.629 12.981 37.032.133 2.2.645 6.025 1.138 8.5l.896 4.5.3-5.753c.165-3.165-.216-8.34-.847-11.5zm-121.05 10.503c4.83-14.822 4.374-37.928-1.1-55.75-4.78-15.56-5.013-17.563-3.742-32.11 2.613-29.893-.108-40.921-13.7-55.528-4.024-4.324-7.323-7.412-7.332-6.862-.027 1.677 3.286 6.08 6.77 8.998 10.297 8.623 14.797 29.683 11.307 52.922-1.966 13.098-1.146 23.553 2.604 33.168 7.076 18.143 8.474 34.143 4.237 48.52-1.07 3.635-1.947 7.347-1.947 8.25 0 2.8 1.79 1.808 2.904-1.608zm143.71-16.498c-1.395-6.24-1.974-4.356-1.062 3.453.637 5.45.915 6.201 1.403 3.796.335-1.65.182-4.912-.34-7.249zm-120.681-19.752c-2.144-10.638-5.668-22.822-8.68-30.007-4.176-9.959-4.47-12.725-2.75-25.842.841-6.422 1.298-12.795 1.014-14.163l-1.035-4.988c-.962-4.631-2.188-2.548-2.797 4.75-.332 3.988-1.102 11.3-1.711 16.25-1.623 13.192-.322 20.508 6.048 34 6.93 14.678 8.893 21.397 9.498 32.5.326 5.973.842 5.764 1.24-.5.21-3.3-.163-8.7-.827-12zm117.643 4.047c-.366-1.95-1.095-3.547-1.62-3.547-1.242 0-1.213 2.19.073 5.574 1.388 3.651 2.37 2.364 1.546-2.027zm-45.49-1.651c-.881-2.203-.963-2.228-1.022-.312-.035 1.146.237 2.383.604 2.75 1.194 1.194 1.397.01.418-2.438zm-2.642-14.274c-.936-2.817-2.726-9.396-3.978-14.621a1821.07 1821.07 0 0 0-4.312-17.571c-1.12-4.44-2.35-11.515-2.73-15.725-.432-4.758-1.077-7.418-1.706-7.03-1.758 1.087-.01 26.87 2.326 34.326 4.577 14.607 7.349 22.76 9.348 27.5l2.109 5 .323-3.38c.178-1.858-.443-5.683-1.38-8.5zm-232.686 4.05c1.304-1.304 2.074-7.249 1.057-8.157-2.233-1.996-6.585-1.329-7.805 1.195-1.102 2.28-1.424 2.463-1.76.999-.285-1.239-.994-1.607-2.297-1.193-1.43.454-2.04-.019-2.527-1.959-1.137-4.531-3.374-1.84-3.411 4.105-.038 5.985 12.127 9.626 16.743 5.01zm276.272-5.416c-.712-3.165-1.878-7.78-2.592-10.256l-1.298-4.5-.07 3.967c-.038 2.182.574 5.782 1.361 8s1.709 5.324 2.049 6.901c.34 1.578.894 2.593 1.23 2.256.337-.337.03-3.202-.68-6.368zm-269.28 1.161c-.952-.953-2.863.59-2.152 1.74.422.683.981.665 1.7-.053.588-.588.792-1.348.453-1.687zm-31.418-7.748c-.345-9.886-8.357-11.665-8.316-1.847.022 5.325 1.89 7.303 6.485 6.868 1.724-.163 1.977-.856 1.831-5.021zm-9.14-16.652c.93-1.635 1.335-3.191.901-3.46-1.107-.684-5.092 3.215-5.092 4.982 0 2.48 2.412 1.604 4.19-1.522zm431.159-9.767c2.459-2.062 7.549-5.673 11.31-8.023 9.593-5.995 29.35-25.887 29.335-29.538 0-.653-2.536 1.65-5.63 5.12-5.617 6.295-14.964 13.718-25.365 20.142-12.404 7.662-17.925 12.744-16.444 15.14.956 1.547 2.164 1.042 6.794-2.84zm-303.503-3.5c.108-5.127-1.078-8.852-2.398-7.532-.88.88.533 12.782 1.518 12.782.423 0 .82-2.362.88-5.25zm107.57-2.5c-.328-3.712-.139-11.92.421-18.238 1.024-11.558.85-13.693-.893-10.983-3.768 5.862-4.526 25.333-1.252 32.174 2.38 4.972 2.419 4.906 1.724-2.953zm-197.787-.5c-.331-1.237-.609-3.712-.616-5.5-.016-3.738-1.522-4.309-2.638-1-.91 2.695-.561 5.787.844 7.5 1.656 2.02 3.063 1.436 2.41-1zm403.458-11.916c8.044-7.235 9.012-10.574 1.202-4.142-2.635 2.169-6.483 4.966-8.553 6.216-3.26 1.968-5.737 4.765-5.737 6.478 0 1.588 6.637-2.75 13.088-8.552zM1046 524.822c0-.249-2.025-1.846-4.5-3.548-5.281-3.634-5.842-3.193-1.25.984 2.855 2.598 5.75 3.888 5.75 2.564zm432.54-12.798c13.562-13.726 19.705-21.81 22.843-30.061 1.991-5.238 1.747-7.377-.337-2.938-5.946 12.67-9.742 17.113-33.385 39.078-4.52 4.2-5.944 7.17-3.437 7.17.673 0 7.115-5.962 14.316-13.25zm-8.04-1.585c7.918-7.721 15.51-16.804 15.479-18.518-.012-.631-2.6 1.553-5.75 4.853-3.151 3.3-8.541 8.543-11.979 11.652-5.442 4.921-7.89 8.857-5.5 8.843.412-.002 3.9-3.076 7.75-6.83zm-204.487 1.585c.01-1.238.907-5.103 2-8.59 2.023-6.455 2.722-18.16 1.084-18.16-2.453 0-7.334 23.333-5.747 27.47.887 2.31 2.648 1.833 2.663-.72zm-190.479-6.684c-3.43-6.632-4.655-2.981-1.32 3.934 2.052 4.253 2.19 4.352 2.538 1.816.203-1.476-.345-4.064-1.218-5.75zM1464 508.274c0-.55-.45-1-1-1s-1 .45-1 1 .45 1 1 1 1-.45 1-1zm-145.906-11.307c-.792-.791-1.094-.532-1.094.94 0 2.644 1.399 4.047 1.844 1.85.189-.933-.149-2.188-.75-2.79zm-1.41-3.881c-.32-.798-.557-.56-.605.604-.043 1.054.193 1.645.525 1.313.333-.333.368-1.195.08-1.917zm-1.684-6.845c0-3.821-2.753-8.62-9.204-16.044-3.549-4.083-8.099-10.011-10.111-13.174-3.004-4.718-6.685-7.582-6.685-5.2 0 1.461 3.09 6.271 4.337 6.75.776.297 1.723 2.206 2.104 4.24.477 2.538 2.744 6.05 7.222 11.184 3.59 4.117 7.429 9.013 8.53 10.88 2.26 3.831 3.807 4.385 3.807 1.364zm-94.368-10.947c-3.165-4.783-4.976-5.307-3.477-1.005 1.001 2.871 4.711 6.452 5.681 5.482.251-.251-.74-2.266-2.204-4.477zm-46.639-12.77c-.032-3.691-12.67-15.797-18.013-17.255a304.353 304.353 0 0 1-8.9-2.606c-2.43-.761-4.654-1.15-4.94-.863-1.273 1.273 2.943 3.525 9.695 5.178 7.652 1.873 10.738 4.11 17.514 12.688 2.658 3.367 4.66 4.598 4.644 2.858zm145.595-5.322c-2.686-6.714-15.523-20.929-18.9-20.929-1.703 0-.439 4.015 1.936 6.146 7.537 6.764 14.072 13.759 15.657 16.756 2.424 4.585 3.364 3.167 1.307-1.973zm-126.905-.116c-.32-.798-.556-.56-.604.604-.043 1.054.193 1.645.525 1.313.332-.333.368-1.195.08-1.917zm-9.364-8.005c-2.051-3.513-6.718-6.742-7.955-5.505-.725.725 8.759 9.843 9.506 9.14.203-.192-.495-1.827-1.55-3.635zm512.761-29.614c-1.594-.531-4.08.537-4.08 1.754 0 .633.973.566 2.613-.181 1.438-.655 2.098-1.363 1.467-1.573zm-394.267-6.892c.55-3.864-1.519-6.302-5.348-6.302-2.042 0-3.514.514-3.583 1.25-.576 6.072 8.088 10.973 8.93 5.052zm121.529-13.076c3.672-9.36 3.054-11.598-2.449-8.863-2.145 1.066-2.423 1.937-2.687 8.413-.387 9.524 1.51 9.69 5.136.45zm45.408-21.856c1.238-.331 2.25-1.007 2.25-1.5 0-.494 1.947-3.288 4.327-6.21 2.38-2.921 5.344-7.415 6.589-9.985 1.244-2.571 2.672-4.675 3.173-4.675.501 0 .911-.983.911-2.185 0-2.71 3.72-6.815 6.174-6.815 1.16 0 1.826-.73 1.826-2 0-3.964-7.96-1.909-12.84 3.316-1.29 1.382-3.394 6.13-4.689 10.58-2.408 8.283-5.71 13.72-10.065 16.574-3.662 2.4-2.26 4.134 2.344 2.9zm-252.634-12.824c-2.114-5.567-2.692-6.142-4.592-4.566-3.406 2.827-.246 9.02 4.602 9.02 1.573 0 1.572-.285-.01-4.454zm-6.05-10.58c3.18-1.703 2.23-4.772-3.278-10.596-4.762-5.035-5.323-5.359-6.5-3.749-2.973 4.067-1.55 8.997 3.718 12.884 3.91 2.884 3.558 2.8 6.06 1.46zm-6.066-4.406c0-.858.45-1.56 1-1.56s1 .424 1 .941c0 .518-.45 1.22-1 1.56-.55.34-1-.084-1-.941zm-33.568 3.55c.783-1.267-4.301-4.374-6.056-3.7-1.137.436-1.223 1.009-.384 2.576 1.095 2.046 5.405 2.798 6.44 1.124zm10.25-5.146c-1.687-14.242-19.273-41.13-31.57-48.27-5.928-3.441-2.237 4.94 3.873 8.797 2.161 1.364 4.47 3.5 5.13 4.745.661 1.245 2.705 4.242 4.543 6.658 1.838 2.417 3.342 5.248 3.342 6.29 0 1.787 2.376 5.792 6.119 10.316.91 1.1 2.425 4.7 3.367 8 3.065 10.735 6.314 12.9 5.196 3.464zm-14.673-3.714c0-.412-1.458-1.963-3.25-3.446-2.858-2.364-3.108-2.943-2.033-4.698 1.077-1.758.853-2.27-1.827-4.177-2.397-1.707-2.926-2.683-2.46-4.539.421-1.682-.277-3.563-2.423-6.526-1.659-2.29-3.016-4.975-3.016-5.966 0-2.8-2.174-6.897-3.66-6.897-1.892 0-1.664 3.102.66 9 1.1 2.79 2 5.894 2 6.897 0 1.003 1.125 3.481 2.5 5.507 1.375 2.027 2.509 4.227 2.519 4.89.05 3.152 6.035 10.706 8.483 10.706 1.374 0 2.502-.338 2.507-.75zm383.414-6.558c1.269-2.012-1.831-4.802-4.923-4.431-2.42.29-3.476 6.518-1.33 7.845 1.458.9 4.62-.826 6.253-3.414zm-21.383-1.712c4.172-2.128 5.124-4.769 2.502-6.944-1.71-1.42-13.542 5.225-13.542 7.607 0 2.07 6.442 1.683 11.04-.663zm-335.073-6.884c-.025-1.213-.506-1.029-2 .765-2.566 3.08-2.542 4.97.033 2.64 1.1-.996 1.985-2.528 1.966-3.405zm14.812 1.654c-.607-1.955-7.763-5.165-8.926-4.003-.65.65.317 1.694 2.83 3.054 4.41 2.386 6.65 2.735 6.096.95zm595.99-44.554c.218-.658-.344-1.196-1.251-1.196-2.361 0-5.67 1.945-5.041 2.963.717 1.16 5.79-.264 6.291-1.767zM690.523 1028.655c-.89-.891-1.411-1.827-1.157-2.082.696-.696 4.633 1.628 4.633 2.736 0 1.468-1.668 1.154-3.476-.654zM1050 1025.14c0-1.686 4.017-7.868 5.113-7.868 2.049 0 1.937 3.014-.22 5.932-2.257 3.053-4.893 4.096-4.893 1.936zm-19-8.868c0-.55.477-1 1.059-1 .583 0 .78.45.441 1-.34.55-.817 1-1.059 1-.243 0-.441-.45-.441-1zm4.033-6.639c-.018-1.176.852-3.201 1.934-4.5 1.942-2.332 1.967-2.334 2-.221.018 1.176-.852 3.201-1.934 4.5-1.942 2.332-1.967 2.334-2 .221zm25.967-2.295c0-2.79 2.147-6.066 3.975-6.066 2.776 0 2.65 3.449-.197 5.444-2.531 1.773-3.778 1.978-3.778.622zm29-3.407c0-.738 3.58-5.12 7.956-9.737 9.707-10.243 15.569-22.981 20.128-43.743 6.113-27.84 10.009-41.178 12.025-41.178 1.212 0 1.122 3.265-.184 6.684-.592 1.549-1.52 5.29-2.064 8.316-1.018 5.669-2.956 13.14-5.445 21-.784 2.475-1.424 5.872-1.42 7.549.016 10.806-9.603 29.56-23.185 45.2-6.315 7.272-7.811 8.404-7.811 5.909zm52.5-7.659c.34-.55 1.293-1 2.118-1s1.222.45.882 1c-.34.55-1.293 1-2.118 1s-1.222-.45-.882-1zm9.109-4.438c2.906-2.035 6.857-2.866 9.557-2.009 2.056.653 1.816.882-2.178 2.075-2.468.738-5.6 1.349-6.96 1.357-2.436.015-2.442-.01-.42-1.423zm-98.609-2.17c0-1.105.706-2.883 1.568-3.95 1.491-1.846 1.537-1.794.93 1.058-.795 3.73-2.498 5.701-2.498 2.892zm7-.647c0-.825.675-2.06 1.5-2.745 1.22-1.012 1.5-.964 1.5.256 0 .825-.675 2.06-1.5 2.744-1.22 1.013-1.5.965-1.5-.255zm80-2.245c.685-.825 2.147-1.5 3.25-1.5 1.104 0 4.311-1.299 7.128-2.887 3.42-1.928 5.764-2.65 7.056-2.172 2.322.858 1.705 1.263-5.434 3.57-3.025.978-6.388 2.388-7.473 3.134-2.852 1.96-6.186 1.854-4.527-.145zm-62.426-2.38c-.43-.695-.129-1.992.68-2.933 1.595-1.857 10.561-17.93 12.655-22.687 1.55-3.522 4.357-15.097 6.063-25 .663-3.85 1.814-9.7 2.557-13 .743-3.3 1.633-8.475 1.978-11.5 1.025-8.996 3.322-14.957 14.308-37.122 6.513-13.14 9.185-16.939 9.185-13.059 0 1.135-.486 2.364-1.08 2.732-.962.594-5.363 9.463-11.809 23.797-1.199 2.666-2.803 7.391-3.565 10.5s-1.834 7.003-2.382 8.653c-2.608 7.858-3.165 10.501-3.173 15.07-.013 6.516-3.324 22.65-6.617 32.241-5.883 17.136-16.694 35.715-18.8 32.309zm-13.494-4.62c0-1.65.617-4.125 1.383-5.5 2.38-4.273 3.006.196.653 4.658l-2.028 3.842-.01-3zm-178.492-3.357c-.289-.468.547-1.338 1.857-1.935 3.694-1.684 4.051-4.657 1.264-10.52-1.356-2.853-2.964-6.432-3.572-7.952-.61-1.52-2.214-3.27-3.567-3.886-3.756-1.711-3.888-3.679-.59-8.82 1.661-2.587 3.035-5.115 3.054-5.617.019-.502.903-2.713 1.966-4.913 3.476-7.195 2.813-8.314-6.5-10.968-7.831-2.231-11.915-5.434-14.046-11.014-.95-2.485-2.25-4.518-2.89-4.518-1.694 0-3.564 2.14-3.564 4.078 0 3.11-2.612 4.317-6.25 2.89-8.26-3.243-5.93-9.227 4.25-10.92 5.177-.86 4.647-3.465-.786-3.857-3.06-.22-5.292.313-7.803 1.864-1.934 1.196-3.797 1.893-4.14 1.55-.628-.628 4.095-6.355 6.534-7.926.718-.462 1.731-1.959 2.251-3.326.758-1.995 1.39-2.349 3.195-1.788 6.453 2.003 9.84 6.61 13.742 18.687 2.607 8.07 2.482 7.963 14.096 11.987 11.356 3.935 12.364 5.745 6.298 11.3l-3.764 3.448 1.693 3.55 1.693 3.551-3.007 1.706c-4.611 2.617-4.909 8.206-.436 8.206 2.151 0 4.434 4.175 4.434 8.108 0 2.803.587 4.047 2.5 5.3 2.938 1.926 3.29 5.59.75 7.817-2.796 2.451-8.089 4.845-8.662 3.918zm171.427-.893c.01-.412.434-1.411.946-2.22 1.152-1.822 2.504-.683 1.694 1.427-.598 1.559-2.668 2.18-2.64.793zm122.995-3.5c.039-4.979 7.583-16.036 18.24-26.733 3.163-3.175 5.75-6.23 5.75-6.787 0-1.137 3.01-2.552 3.784-1.779.274.274-1.703 2.674-4.393 5.333-6.108 6.038-12.051 13.302-13.396 16.375-.563 1.288-1.904 3.691-2.978 5.341-1.074 1.65-2.62 4.463-3.434 6.25-1.467 3.22-3.592 4.41-3.573 2zm-120.654-6c.311-2.337 1.062-11.45 1.669-20.25 1.109-16.088 4.723-32.186 8.587-38.25 3.343-5.244 3.083-1.494-.623 9-3.326 9.422-3.979 12.55-4.016 19.25-.024 4.4-.696 10.7-1.493 14-.797 3.3-1.456 8.551-1.464 11.669-.017 6.188-.684 8.831-2.228 8.831-.596 0-.77-1.71-.432-4.25zm36.666 2c.012-.687.872-3.12 1.91-5.408 1.038-2.287 2.409-6.787 3.045-10 .637-3.213 1.978-8.767 2.98-12.342 1.002-3.575 3.46-14.902 5.464-25.17 3.49-17.894 7.914-32.83 9.724-32.83 1.273 0 1.035 2.742-.504 5.8-.747 1.485-1.628 4.444-1.957 6.575-.33 2.13-1.242 4.605-2.028 5.5-.787.894-1.928 5.45-2.536 10.125-1.9 14.605-3.074 21.098-4.664 25.78-.845 2.49-1.792 6.595-2.106 9.124-1.133 9.148-6.342 24.097-8.397 24.097-.524 0-.943-.563-.931-1.25zm29.012-9.44c.082-1.946 3.792-16.469 4.35-17.026 1.27-1.27.555 7.54-.978 12.037-1.411 4.143-3.464 7.18-3.372 4.989zm26.026-3.97c-.102-3.696 5.886-20.58 8.528-24.044 2.066-2.709 5.412-4.496 5.412-2.892 0 1.752-13.895 28.6-13.94 26.937zM811.965 942.73c-2.32-2.794.385-3.38 4.007-.867l3.472 2.41h-3.1c-1.704 0-3.675-.695-4.38-1.543zm318.11-5.457c.01-1.925.674-4.85 1.479-6.5 1.462-2.998 1.463-2.997.964 1.822-.648 6.254-2.464 9.731-2.443 4.677zm13.956-6.5c0-1.1.436-2.675.969-3.5.803-1.243.97-1.157.97.5 0 1.1-.437 2.675-.97 3.5-.803 1.242-.97 1.156-.97-.5zm-261.531-2.5c.34-.55 1.068-1 1.618-1s.722.45.382 1c-.34.55-1.068 1-1.618 1s-.722-.45-.382-1zm293.5.118c0-.55.45-1.279 1-1.619.55-.34 1-.168 1 .382s-.45 1.279-1 1.619c-.55.34-1 .168-1-.382zm-23-1.979c0-.473 1.125-2.518 2.5-4.544 1.375-2.027 2.5-4.036 2.5-4.466 0-1.334 4.953-5.51 5.678-4.785.377.377-.655 2.141-2.292 3.92-1.638 1.78-3.737 4.923-4.666 6.986-1.52 3.377-3.72 5.086-3.72 2.89zm-35.985-16.83c.035-1.845 1.953-3.908 1.97-2.119.01.93-.435 1.97-.985 2.31-.55.34-.993.253-.985-.191zm76.482-1.304c.338-.547 1.602-1.513 2.809-2.146 2.179-1.143 2.18-1.136.289.995-1.909 2.15-4.254 3.02-3.098 1.15zM1131 905.747c0-6.748 14.251-23.776 25.85-30.887 2.618-1.606-.681 3.131-3.886 5.58-7.68 5.865-9.526 8.02-14.408 16.826-5.067 9.138-7.556 11.932-7.556 8.48zm42 .227c0-1.519 7.577-8.7 9.18-8.7 1.634 0 .754 1.668-2.43 4.606-5.618 5.182-6.75 5.87-6.75 4.094zm13-1.675c0-1.1 5.221-4.026 7.183-4.026.704 0-.374 1.125-2.398 2.5-4.039 2.745-4.785 2.983-4.785 1.526zm-34.95-1.125c-.06-1.941 5.553-9.9 6.984-9.9.561 0 3.004-2.13 5.428-4.733 2.424-2.602 4.696-4.443 5.05-4.09.352.353-1.53 2.854-4.186 5.556-2.654 2.703-6.716 7.131-9.025 9.84-2.556 2.998-4.22 4.3-4.25 3.327zm-77.043-1.19c-.011-1.307 3.89-8.529 4.966-9.194.55-.34 1.695-3.008 2.545-5.93 3.378-11.62 10.403-26.587 12.48-26.587 1.203 0 .07 3.038-3.937 10.546-1.684 3.155-3.061 6.268-3.061 6.918 0 .65-1.991 5.199-4.424 10.11-4.33 8.736-8.556 15.708-8.57 14.137zM1205 900.288c0-1.318 6.642-5.648 10.985-7.16 1.917-.668 4.167-2.024 5-3.014 2.034-2.416 9.16-5.384 8.444-3.517-.28.728-2.313 2.416-4.519 3.75-2.206 1.335-5.676 3.705-7.71 5.267-5.598 4.297-12.2 6.827-12.2 4.674zm-33-3.958c0-1.077 3.964-4.057 5.397-4.057.523 0-.105 1.125-1.397 2.5-2.429 2.586-4 3.197-4 1.557zm62-14.807c0-.412 1.575-2.006 3.5-3.542 4.18-3.335 4.67-2.203.695 1.605-2.815 2.697-4.195 3.335-4.195 1.937zm-68.512-12.463c1.094-.634 2.866-1.97 3.939-2.97 1.073-.999 2.595-1.817 3.384-1.817 2.1 0-.228 2.563-4.07 4.48-3.537 1.764-6.2 2.016-3.253.307zm11.958-6.7c.807-1.305 9.555-5.419 10.185-4.79.29.29-1.461 1.692-3.89 3.115-4.439 2.602-7.345 3.375-6.295 1.675zm-81.417-4.932c-.037-1.706 3.8-7.154 5.04-7.154 1.713 0 .958 1.939-2.04 5.234-1.634 1.796-2.984 2.66-3 1.92zm320.993-117.331c.012-.728.925-2.448 2.028-3.823l2.005-2.5-.277 3.491c-.267 3.36-3.81 6.031-3.756 2.832zm4.35-9.323c.386-1.65 1.996-5.7 3.576-9s3.565-7.688 4.411-9.75c2.03-4.945 2.816-4.75 2.023.5-.795 5.262-6.396 17.725-8.876 19.75-1.726 1.409-1.795 1.318-1.134-1.5zm-410.68-146.847c-.845-1.29-2.231-4.008-3.08-6.04-3.723-8.909-20.393-21.734-34.612-26.627-9.942-3.421-31.485-20.357-34.964-27.487-.805-1.65-2.284-4.217-3.286-5.705-1.003-1.488-2.34-4.188-2.97-6-1.617-4.645-8.983-15.705-12.944-19.438-22.454-21.156-32.514-24.62-74.863-25.778-3.04-.083-6.864-.666-8.5-1.296-1.635-.63-5.898-1.847-9.473-2.705-3.575-.857-10.325-2.92-15-4.584-12.039-4.286-23.498-6.682-38.5-8.048-15.793-1.44-13.201-1.59-36 2.095-5.899.954-14.544 3.377-17.293 4.849-1.071.573-3.694 1.484-5.827 2.024-2.134.54-7.03 1.918-10.88 3.062-8.787 2.61-16.89 4.11-26.5 4.905-8.735.722-9.615 2.032-6.055 9.012 2.736 5.363 3.172 12.928.833 14.445-2.5 1.622-3.5.134-5.127-7.628-1.414-6.746-5.952-15.26-7.594-14.245-.477.295-.205 3.071.604 6.17.93 3.56 1.122 5.983.52 6.584-1.211 1.212-3.893-2.506-5.205-7.219-1.73-6.207-4.976-8.126-4.976-2.94 0 4.476-2.669 1.662-10.942-11.535-2.724-4.346-5.506-6.883-13.343-12.168-13.006-8.77-22.864-17.238-41.845-35.949-14.157-13.954-15.96-15.408-19.125-15.408-1.921 0-5.25-.62-7.397-1.377-2.148-.757-6.593-1.626-9.88-1.931-3.286-.304-7.29-1.053-8.895-1.664-5.761-2.19-10.93.796-13.97 8.07-3.2 7.66-10.48 12.496-11.425 7.59-.417-2.166 6.9-14.928 11.136-19.423 6.948-7.37-.662-4.999-8.798 2.743-7.39 7.033-9.179 7.992-14.891 7.992-7.83 0-7.095-3.686 1.292-6.472 2.624-.872 6.091-3.03 7.72-4.805 1.627-1.772 4.399-3.99 6.16-4.926 3.032-1.612 4.324-3.797 2.246-3.797-.526 0-4.688 1.797-9.25 3.992-7.908 3.806-17.046 5.423-19.091 3.377-1.708-1.708 1.68-4.305 7.045-5.401 5.37-1.097 9.253-3.226 9.253-5.073 0-.437-2.583-.93-5.74-1.095-7.997-.417-8.41-2.813-1.08-6.277 2.926-1.383 7.303-3.642 9.727-5.019 5.119-2.908 12.786-3.352 18.823-1.092 2.073.777 5.268 1.672 7.098 1.99 3.323.579 3.32.574-1.81-3.481-5.181-4.096-5.707-5.452-2.82-7.273 1.173-.74 3.49-.052 9.015 2.678 4.09 2.021 7.823 3.674 8.296 3.674 2.772 0 9.656 4.631 12.076 8.123 2.063 2.977 4.905 5.107 10.702 8.022 6.347 3.191 10.371 6.363 20.556 16.204 13.361 12.91 22.189 19.295 34.599 25.03 8.848 4.087 19.302 10.592 31.39 19.532 7.747 5.73 9.146 6.402 13.168 6.328 4.859-.09 19.075-4.723 27.337-8.91 8.028-4.067 15.53-6.327 21.07-6.346 6.834-.023 19.448-3.393 21.909-5.854 3.051-3.051.822-7.529-4.821-9.684-7.707-2.943-11.588 1.3-5.995 6.555 1.375 1.292 2.5 2.72 2.5 3.175 0 1.338-9.297.947-17.185-.724-9.575-2.027-17.522-.771-25.49 4.029-10.475 6.31-18.897 5.684-26.298-1.952-5.105-5.266-1.558-9.276 6.995-7.908 3.05.488 6.51-.28 16.065-3.568 10.656-3.666 13.067-4.15 19.295-3.87 6.68.299 7.137.183 7.43-1.874.435-3.058-4.284-5.296-12.647-5.997-7.615-.638-19.074 1.733-32.903 6.808-11.988 4.4-17.375 2.583-12.378-4.175 2.88-3.895 1.817-5.124-3.385-3.918-14.841 3.44-28.77-2.689-15.999-7.04 6.399-2.18 13.2-6.798 21.448-14.563 8.808-8.291 15.497-12.423 20.115-12.423 3.181 0 4.028-.539 6.345-4.04 3.06-4.623 5.818-5.96 12.302-5.96 4.295 0 4.973-.394 10.883-6.333 7.192-7.227 11.968-9.848 21.907-12.021 11.282-2.467 17.858-2.844 20.075-1.153 2.663 2.033.415 3.458-5.575 3.534-5.336.067-14.174 2.995-14.811 4.907-.34 1.018.258 1.187 2.43.69 5.27-1.21 25.18-2.914 26.793-2.296 3.478 1.335 1.21 2.413-6.162 2.932-4.262.3-9.839 1.377-12.392 2.393l-4.642 1.847 20.74.234c15.288.172 22.158-.138 26.14-1.18 3.485-.91 5.755-1.069 6.392-.445 1.545 1.512-3.696 10.542-10.485 18.064-3.302 3.658-6.003 7.197-6.003 7.864 0 2.263 6.148.075 13.058-4.646 10.944-7.478 20.05-8.601 33.692-4.157 9.4 3.063 8.305 4.77-2.604 4.063-11.505-.745-14.88-.026-20.525 4.37-5.988 4.666-5.487 4.95 4.265 2.423 9.796-2.54 20.796-2.229 29.918.845 6.082 2.048 9.196 2.565 9.196 1.526 0-1.263-3.98-8.198-5.363-9.346-.83-.69-1.795-2.557-2.145-4.152-1.256-5.72-15.747-24.963-18.797-24.963-.799 0-1.987 1.292-2.641 2.87-.654 1.58-2.171 3.31-3.371 3.845-2.518 1.123-17.976-.558-21.183-2.305-2.523-1.373-13.092-5.063-16.816-5.87-1.956-.424-2.718-1.135-2.492-2.325.49-2.585 6.584-2.672 15.521-.22 7.368 2.022 12.287 2.036 12.287.037 0-.512-1.687-3.203-3.75-5.98l-3.75-5.05h-8.086c-7.753-.001-8.275.146-12.68 3.577-2.944 2.295-5.422 3.461-6.903 3.25-4.167-.593-3.255-3.385 2.271-6.961a722.375 722.375 0 0 0 7.8-5.112c1.87-1.256 4.615-1.746 9.789-1.75 8.072-.006 10.1-1.362 5.131-3.431-7.297-3.04-11.817-2.953-18.893.366-6.918 3.243-12.483 3.386-13.648.35-.875-2.28.69-3.094 10.948-5.697 8.247-2.092 10.61-2.32 15.975-1.544 10.573 1.529 10.708 1.469 6.473-2.869l-3.73-3.82-8.223.405c-9.054.445-12.654-.9-11.37-4.246.544-1.417 1.423-1.653 4.413-1.183 2.053.323 5.533.16 7.733-.363 7.912-1.878 12.286-.363 19.751 6.842 7.335 7.078 8.707 7.324 6.883 1.236-1.555-5.19-5.474-9.748-9.057-10.535-4.086-.897-7.039-4.21-4.591-5.15 6.94-2.663 18.565 3.76 19.925 11.009.327 1.744 2.835 5.86 5.572 9.148 2.738 3.287 9.323 11.505 14.634 18.262 11.915 15.16 21.249 23.395 39.054 34.462 6.335 3.938 17.675 15.54 20.312 20.78 1.237 2.46 2.779 5.148 3.425 5.973.647.825 2.02 4.2 3.053 7.5s2.702 7.403 3.709 9.118c3.916 6.67 1.064 9.202-5.357 4.752-7.55-5.232-26.27-4.083-33.554 2.06-2.63 2.218-3.054 3.083-2.248 4.59 1.767 3.302 12.79 7.647 23.989 9.455 17.732 2.863 35.488 9.208 44.1 15.76 2.42 1.84 7.1 5.106 10.4 7.256 6.12 3.988 25.659 22.837 31.029 29.935 2.875 3.8 10.337 11.227 15.471 15.4 1.756 1.427 2.188 2.35 1.45 3.103-1.382 1.41-12.03-6.274-16.032-11.569-3.295-4.36-15.672-16.36-16.873-16.36-.432 0 .843 1.988 2.835 4.418 1.99 2.43 3.62 4.908 3.62 5.506 0 .599 1.164 2.098 2.587 3.332C958.426 483.993 967 495.614 967 497c0 1.277 6.663 7.388 13.328 12.224 5.885 4.269 6.677 5.779 2.469 4.702-4.972-1.272-21.014-17.274-24.449-24.388-6.847-14.18-47.78-47.724-56.19-46.045-1.051.21 0 1.14 2.883 2.544 2.497 1.217 7.629 4.805 11.403 7.974 3.774 3.17 8.8 7.216 11.169 8.993 7.482 5.613 14.816 13.801 21.446 23.946 3.53 5.403 6.908 10.139 7.504 10.525.597.385 3.72 4.065 6.941 8.177 4.347 5.55 7.234 8.174 11.198 10.18 2.937 1.486 5.585 3.096 5.883 3.58.299.482 5.239 3.092 10.979 5.8 6.993 3.298 10.436 5.462 10.436 6.56 0 2.129-1.73 1.573-14.5-4.66-14.781-7.215-24.663-16.35-40.388-37.339-9.298-12.408-16.674-20.27-17.884-19.06-.31.308.794 2.249 2.45 4.31 1.658 2.063 3.728 5.133 4.602 6.823.873 1.69 2.33 3.688 3.236 4.44.906.753 2.982 3.87 4.613 6.928 7.766 14.562 21.218 29.961 30.256 34.637 2.813 1.455 5.826 3.27 6.694 4.034.868.764 2.27 1.389 3.115 1.389.845 0 2.61.815 3.921 1.811 1.312.997 4.624 3.1 7.361 4.675 9.851 5.668 2.324 3.499-11.797-3.399-19.01-9.286-26.346-16.219-41.228-38.962-3.273-5.002-6.288-9.101-6.701-9.11-1.482-.03-.693 2.317 2.637 7.854 1.863 3.097 4.62 8.106 6.126 11.13 6.774 13.606 14.178 20.982 27.56 27.46 5.185 2.51 13.025 7.259 17.423 10.552 4.397 3.294 8.331 5.989 8.741 5.989 1.358 0 13.763 12.736 13.763 14.13 0 .753-1.912-.614-4.25-3.037-4.516-4.682-21.129-15.233-36.113-22.934-14.753-7.584-24.47-18.676-35.79-40.857-11.551-22.636-34.332-36.151-63.597-37.73-12.945-.7-14.918.598-3.5 2.3 22.726 3.387 34.87 7.577 43.85 15.127 2.288 1.925 5.793 4.76 7.789 6.3 1.995 1.539 4.756 4.914 6.137 7.5 1.38 2.585 5.322 10.009 8.76 16.497 3.437 6.488 8.492 14.523 11.232 17.857 5.56 6.763 20.688 17.875 26.982 19.82 14.13 4.366 38.567 24.343 41.34 33.797 1.834 6.251-.912 8.822-4.147 3.883zM911 463.273c-1.958-1.265-3.282-1.265-2.5 0 .34.55 1.379.994 2.31.985 1.456-.013 1.483-.15.19-.984zm-9.923-5.802c-4.163-2.916-12.43-6.115-15.91-6.157-5.942-.072-2.925 2.345 5.654 4.528 4.486 1.142 8.462 2.38 8.835 2.754.372.372 1.39.654 2.26.625 1.14-.038.905-.528-.84-1.75zM679.5 387.274c0-1.882-5.588-2.56-8.454-1.025-3.634 1.945-2.277 3.142 3.204 2.827 3.866-.223 5.25-.698 5.25-1.802zm24.851-9.497c3.272-1.25 4.649-2.336 4.649-3.67 0-2.9-1.903-3.07-10.905-.973-9.622 2.24-11.56 3.545-8.595 5.785 2.429 1.836 8.222 1.39 14.851-1.142zM522 369.305c0-.533-.675-.71-1.5-.393-.825.316-1.5.752-1.5.968 0 .217.675.394 1.5.394s1.5-.436 1.5-.97zm215.737-1.669c2.055-.35 5.318-1.587 7.25-2.75 6.243-3.754 10.621-5.74 11.957-5.423.719.17 1.507-.235 1.752-.903 1.224-3.328-12.84-2.784-19.798.766-5.102 2.602-11.898 7.871-11.898 9.224 0 .526 1.546.673 3.5.333 1.925-.335 5.182-.896 7.237-1.247zM1006.5 549.273c-1.57-1.638-2.63-3.204-2.354-3.479.275-.275 1.784.841 3.354 2.48 1.57 1.638 2.63 3.204 2.354 3.479-.275.275-1.784-.841-3.354-2.48zm118.25-14.051c-5.096-6.861-4.724-8.321.75-2.949 2.475 2.43 4.5 5.223 4.5 6.209 0 2.892-1.263 2.108-5.25-3.26zm9.374-.774c-1.243-1.746-1.85-3.175-1.347-3.175 1.49 0 4.462 3.784 4.018 5.117-.239.715-1.358-.098-2.671-1.942zm-22.535-4.251c-2.67-3.174-3.267-4.923-1.678-4.923 1.11 0 6.089 5.787 6.089 7.076 0 1.792-1.852.888-4.411-2.153zm3.53-7.114c-1.64-1.754-4.2-5.692-5.688-8.75-1.49-3.058-3-5.784-3.356-6.06-1.086-.838-9.672-15.156-12.593-21-6.08-12.163-30.492-45.323-32.148-43.667-.506.506 6.922 12.477 12.513 20.167 4.433 6.097 12.462 19.241 16.188 26.5 1.835 3.575 4.973 8.975 6.974 12 6.23 9.419 10.152 16.927 9.794 18.75-.335 1.704-4.737-3.674-8.803-10.755-.825-1.437-4.425-6.762-8-11.834-6.749-9.574-9.231-13.51-13.386-21.223-2.965-5.504-11.596-16.289-12.396-15.489-.315.315.6 1.805 2.034 3.312 2.712 2.851 4.681 8.24 3.011 8.24-1.272 0-4.263-3.365-4.263-4.796 0-.626-2.016-3.408-4.48-6.182-2.464-2.774-5.168-6.376-6.01-8.004-1.452-2.806-5.512-5.98-5.508-4.304 0 .432 2.026 3.865 4.5 7.628 2.474 3.764 4.498 7.252 4.498 7.75 0 1.977-1.622.653-4-3.265-4.501-7.414-21.513-23.485-31.546-29.8-3.187-2.007-4.593-.246-1.457 1.824 3.444 2.275 20.102 19.383 19.478 20.006-.278.278-1.96-.847-3.74-2.501-17.576-16.338-35.985-21.72-57.735-16.877-4.943 1.1-9.29 1.45-12.75 1.023-6.039-.744-7.047.956-3.076 5.183l2.175 2.314h-2.695c-1.481 0-5.462-1.125-8.846-2.5-9.35-3.799-11.455-2.872-6.12 2.696 3.218 3.36 2.2 3.519-4.31.671-20.389-8.918-34.59-26.757-42.883-53.866-3.511-11.478-14.872-34.902-18.73-38.617-2.74-2.64-14.16-6.383-19.47-6.383-7.227 0-11.57-2.017-15.233-7.074-3.5-4.832-3.7-5.745-1.44-6.611 1.098-.422 2.629.579 4.751 3.106 2.779 3.31 3.571 3.692 7.051 3.404 6.198-.514 5.364-2.4-2.71-6.131C846.397 328.125 844 325.493 844 320.2c0-1.995-.507-5.084-1.128-6.864-.945-2.71-.853-3.505.563-4.899 2.444-2.405 6.365 2.156 6.365 7.404 0 4.703 2.764 8.407 7.494 10.045 5.12 1.772 4.8.237-1.294-6.206-5.592-5.913-6.297-9.357-3.604-17.622.768-2.356 1.689-5.972 2.046-8.034.724-4.187 2.84-4.96 4.596-1.68.818 1.528.778 4.395-.152 10.965-1.397 9.87-.84 11.385 5.362 14.593 3.286 1.699 3.34 1.443.752-3.628-1.1-2.157-2-5.414-2-7.239 0-4.062 6.54-18.082 8.18-17.535 2.55.85 3.317 3.627 1.934 6.998-4.663 11.364-4.65 11.123-.89 17.993 3.464 6.33 8.813 11.134 11.726 10.531 2.386-.494 1.654-6.27-1.344-10.596-3.308-4.773-4.481-12.181-2.226-14.053 2.444-2.029 4.021-.788 5.36 4.217.81 3.026 3.005 6.563 6.52 10.502 7.12 7.98 9.545 15.13 7.157 21.098-2.115 5.286-1.73 6.665 6.605 23.645 6.332 12.898 7.716 14.926 16.724 24.5 10.226 10.87 15.668 17.91 19.208 24.849 1.583 3.102 2.677 4.09 4.531 4.09 2.54 0 5.104-3.238 3.99-5.04-.907-1.468 1.466-7.983 4.237-11.634 2.558-3.37 6.759-5.326 11.437-5.326 7.69 0-1.074-8.265-12.9-12.167-3.06-1.01-8.44-1.833-11.969-1.833-4.317 0-8.02-.694-11.345-2.124-7.29-3.136-6.485-4.71 2.315-4.53 5.539.113 19.456-.616 25.75-1.35 3.714-.432-5.879-2.34-15.28-3.038-15.934-1.184-18.743-1.686-22.627-4.048-4.717-2.869-3.496-4.41 3.492-4.41 7.892 0 8.267-1.42.915-3.464-3.3-.917-7.463-2.437-9.25-3.378-3.737-1.966-4.445-4.247-1-3.223 6.853 2.037 15.608 1.762 14.243-.447-.324-.525-4.505-2.139-9.291-3.588-12.112-3.665-15.826-7.083-6.33-5.823 6.45.856 7.14-.656 1.862-4.08-7.813-5.07-11.651-9.497-8.234-9.497.825 0 1.5.382 1.5.85 0 1.267 12.727 6.436 13.965 5.671 1.56-.964.396-2.297-3.935-4.506-8.437-4.305-20.485-17.324-26.192-28.307-9.925-19.095-16.291-38.069-13.96-41.604 1.612-2.445 3.58-.543 8.065 7.79 4.37 8.119 6.575 10.92 7.706 9.79.33-.331-.13-2.43-1.024-4.663-3.373-8.432-.624-9.757 4.187-2.018 2.836 4.562 7.405 8.113 8.732 6.786.294-.294-.578-2.628-1.938-5.187-3.702-6.961-5.364-15.273-3.44-17.198 1.878-1.877 2.612-1.037 5.763 6.596 2.292 5.552 8.43 13 10.715 13 2.3 0 2.259-1.618-.166-6.569-4.805-9.81-2.328-13.876 3.655-5.998 4.665 6.142 13.633 10.493 26.867 13.035 21.043 4.042 43.061 16.424 41.538 23.36-.46 2.09-.23 3.258.755 3.838.778.458 1.936 1.827 2.573 3.04.737 1.405 2.518 2.458 4.896 2.896 5.016.925 13.131 4.827 17.322 8.33 3.239 2.707 3.424 3.21 3.57 9.711.083 3.771.467 8.279.85 10.018 1.69 7.665-7.326 8.012-23.491.904-12.421-5.461-20.815-4.615-17.89 1.803 1.322 2.903 2.077 3.219 9.877 4.127 12.014 1.4 20.287 5.286 19.802 9.303-.468 3.871-2.875 4.817-8.552 3.362-5.056-1.296-14.25 1.146-14.25 3.784 0 1.184 7.218 5.056 9.425 5.056.828 0 3.021 1.33 4.874 2.957 1.853 1.627 5.677 4.117 8.497 5.534 2.82 1.416 5.396 3.01 5.725 3.542 1.337 2.163 4.746 1.076 4.022-1.283-2.814-9.164-.061-19.06 7.434-26.727 7-7.162 7.519-14.199 2.474-33.614-1.348-5.19-2.451-11.593-2.451-14.23 0-6.483-1.193-7.688-10.5-10.614-14.136-4.443-24.124-11.907-40.736-30.443l-6.612-7.378-6.326 1.172c-7.208 1.334-15.377.234-19.839-2.672a904.085 904.085 0 0 1-7.509-4.982c-2.657-1.781-6.44-3.504-8.404-3.828-5.506-.91-6.074-1.224-6.074-3.368 0-4.748 6.126-5.188 14.84-1.066 6.97 3.297 9.16 3.692 9.16 1.652 0-2.4-11.782-12.666-17.374-15.14-8.122-3.591-10.655-8.944-7.336-15.504 2.395-4.734 8.548-2.484 7.258 2.656-.85 3.385.901 6.014 5.605 8.413 5.983 3.053 6.381 1.25 1.398-6.336-5.74-8.739-6.035-9.857-3.453-13.139 3.39-4.309 6.487-3.252 6.092 2.078-.269 3.632.176 4.72 3.39 8.277 4.715 5.218 5.1 4.699 2.416-3.25-2.414-7.147-1.483-11.306 3.078-13.747 3.4-1.82 5.284.447 3.4 4.09-1.977 3.823-1.856 6.26.452 9.089 1.512 1.854 2.02 2.038 2.363.86 2.157-7.387 2.233-7.498 5.352-7.803 3.514-.344 5.148 1.904 2.8 3.853-3.425 2.842-.75 13.17 4.353 16.804 4.513 3.213 9.301 10.92 8.577 13.805-.859 3.42 1.028 5.075 8.373 7.344 3.578 1.105 8.136 2.873 10.13 3.93 1.994 1.056 6.266 2.706 9.492 3.667 3.226.961 7.443 2.817 9.37 4.125 1.927 1.308 5.362 3.266 7.634 4.35 21.078 10.066 26.97 18.628 34.356 49.926 2.865 12.14 3.621 38.948 1.711 60.643-.94 10.67 1.407 19.302 6.473 23.817 12.034 10.726 19.928 18.94 24.065 25.04 8.939 13.18 18.812 30.324 23.417 40.661 2.532 5.686 6.002 13.039 7.71 16.339 1.71 3.3 4.593 8.963 6.41 12.584 1.815 3.622 4.853 9.022 6.748 12 1.896 2.979 3.986 7.067 4.645 9.086.658 2.018 1.85 4.21 2.646 4.872 1.68 1.394 1.938 3.958.398 3.958-.578 0-1.713-1.584-2.522-3.52-.808-1.936-3.037-5.573-4.952-8.082-1.916-2.509-5.343-7.787-7.617-11.73-2.274-3.943-4.94-8.342-5.922-9.777-.983-1.435-4.826-8.41-8.54-15.5-8.647-16.51-14.204-25.915-20.145-34.095-5.857-8.065-17.304-21.296-18.424-21.296-1.83 0-.636 2.044 2.665 4.561 1.98 1.51 5.291 5.972 7.645 10.301 2.284 4.2 5.18 8.763 6.435 10.138 2.6 2.848 8.911 13.746 9.959 17.197.384 1.266 1.476 3.203 2.426 4.303 2.157 2.497 8.544 14.164 9.552 17.447.647 2.108 3.881 7.942 12.991 23.435 1.1 1.87 4.137 6.84 6.75 11.045 2.612 4.204 4.75 7.94 4.75 8.304 0 1.5-7.32-6.513-9.094-9.954-1.055-2.047-3.203-5.197-4.774-7-1.57-1.802-3.604-4.74-4.519-6.527-1.705-3.33-3.613-4.325-3.613-1.885 0 .75.93 2.548 2.068 3.994 1.869 2.376 4.344 8.64 3.413 8.64-.743 0-10.193-14.647-14.838-23-7.116-12.794-19.135-29.594-28.542-39.893-8.48-9.285-13.367-13.341-11.205-9.3.577 1.077 1.731 2.22 2.566 2.54 1.35.519 4.925 5.378 11.038 15.004 1.1 1.732 3.575 4.736 5.5 6.676 1.925 1.94 4.281 4.865 5.236 6.5.954 1.635 3.526 5.674 5.715 8.974s6.496 10.812 9.572 16.695c3.075 5.882 6.691 12.315 8.034 14.294 1.344 1.98 2.443 4.22 2.443 4.978 0 .759 1.018 2.651 2.262 4.206 9.28 11.597 12.971 20.818 4.858 12.136zM1100 474.273c0-.55-.477-1-1.059-1-.583 0-.78.45-.441 1 .34.55.817 1 1.059 1 .243 0 .441-.45.441-1zm-8.684-14.75c-.342-.962-2.098-3.847-3.902-6.41-1.805-2.563-4.275-6.613-5.49-9-3.296-6.477-24.159-29.938-25.463-28.634-.563.563 3.947 6.461 10.55 13.795 9.625 10.692 15.17 17.892 18.094 23.5 1.72 3.3 3.581 6.562 4.134 7.25 1.479 1.838 2.794 1.52 2.077-.5zm-53.26-23.17c-2.36-3.315-7.746-8.08-9.133-8.08-4.45 0 5.342 9.83 10.895 10.937.175.035-.618-1.251-1.762-2.858zm16.948-10.576c-1.29-1.372-2.566-2.275-2.835-2.006-.664.664 2.883 4.503 4.16 4.503.56 0-.036-1.124-1.325-2.497zm7.996-19.444c0-.518-.45-1.22-1-1.56-.55-.34-1 .084-1 .941 0 .858.45 1.56 1 1.56s1-.424 1-.941zm-67-86.943c0-.869-3.3-2.076-5.75-2.103-.688-.008-1.25.662-1.25 1.487 0 1.047 1.056 1.5 3.5 1.5 1.925 0 3.5-.398 3.5-.884zm-55.75-2.814c1.496-.84.702-2.303-1.25-2.303-1.1 0-2-.648-2-1.44 0-2.383-1.313-2.484-5.764-.443-4.584 2.101-5.626 3.45-1.954 2.528 1.608-.404 2.646.01 3.517 1.406 1.152 1.843 4.418 1.954 7.451.252zm42.35-6.843c1.214-4.837-8.552-12.2-15.35-11.575-3.709.342 2.308 9.203 8.435 12.424 4.292 2.255 6.194 2.022 6.915-.849zm-50.6.076c0-2.569-10.366-6.164-13.028-4.518-1.842 1.139-.2 2.983 2.659 2.983 1.381 0 3.187.675 4.012 1.5 1.95 1.95 6.357 1.974 6.357.035zm-18-7.476c0-1.35-1.823-2.287-3.016-1.55-.56.346-.758 1.048-.441 1.56.75 1.214 3.457 1.206 3.457-.01zm19-5.036c0-2.245-10.63-6.67-20.25-8.428-9.096-1.664-1.478 3.712 8.589 6.06 3.242.757 6.63 1.805 7.528 2.33 2.136 1.248 4.133 1.266 4.133.038zm198.583 225.11c-.43-.696-.513-1.537-.183-1.867.895-.895 1.87.422 1.387 1.872-.339 1.016-.574 1.015-1.204-.004zm-8.735-2.883c-3.942-4.292-7.042-9.167-6.625-10.42.368-1.105 6.303 6.364 8.675 10.92 1.546 2.967 1.017 2.838-2.05-.5zm-48.119-34.855c-.4-.4-.729-1.419-.729-2.262 0-1.126.296-1.238 1.113-.421.611.612.94 1.63.729 2.263-.211.632-.712.821-1.113.42zm298.894-34.935c-2.153-5.611.686-26.212 5.15-37.373 4.488-11.216 15.308-28.102 23.606-36.837 5.752-6.056 2.96-5.256-4.81 1.377-12.455 10.631-21.82 24.114-25.203 36.28-2.052 7.38-3.882 8.096-3.065 1.201 1.116-9.426 15.074-33.536 21.67-37.432 2.388-1.41 5.056-3.676 12.529-10.636 1.65-1.536 4.125-3.373 5.5-4.08 4.488-2.311 14.974-12.245 18.151-17.196 3.403-5.303 3.358-7.692-.055-2.9-1.167 1.639-6.474 6.727-11.792 11.308-14.37 12.374-24.651 21.138-26.779 22.828-10.533 8.363-21.521 23.082-21.525 28.833 0 1.827-2.426.885-2.81-1.092-.303-1.564 1.13-4.869 5.911-13.642 2.303-4.225 28.82-29.64 38.275-36.684 8.677-6.464 20.586-22.88 18.213-25.106-.475-.445-1.067-.24-1.315.458-2.38 6.67-15.032 20.133-28.41 30.233-4.693 3.542-14.128 11.175-21.266 17.204-4.358 3.682-10.953 12.187-11.995 15.47-.988 3.11-3.603 5.14-3.603 2.794 0-4.731 11.86-20.468 15.426-20.468.3 0 3.589-2.921 7.31-6.49 3.72-3.57 7.228-6.495 7.796-6.5 3.788-.036 25.251-28.316 27.11-35.72.982-3.913-.402-2.546-4.08 4.031-6.076 10.865-18.052 23.61-32.3 34.374-4.75 3.59-10.746 8.72-17.136 14.665-1.856 1.727-5.135 5.727-7.288 8.89-3.659 5.376-5.838 7.134-5.838 4.71 0-3.651 9.613-17.65 13.548-19.73 3.073-1.623 5.412-5.52 2.725-4.538-6.025 2.202-19.225 15.854-21.327 22.058-.606 1.787-1.742 3.25-2.524 3.25-5.336 0 8.37-20.644 17.371-26.164 5.595-3.432 14.29-10.295 18.097-14.284 1.865-1.954 3.735-3.552 4.155-3.552 1.476 0 11.13-14.006 12.908-18.728a510.899 510.899 0 0 1 2.884-7.487c.598-1.493.72-2.941.27-3.219-.97-.6-3.107 3.763-3.107 6.346 0 1-.825 2.891-1.832 4.203-1.007 1.311-2.997 4.368-4.422 6.792-4.413 7.506-16.416 18.802-28.361 26.69-12.825 8.468-17.382 13.235-20.609 21.557-2.395 6.177-4.783 7.728-4.767 3.096.024-6.836 12.145-22.572 20.99-27.252 7.31-3.867 18.777-14.444 24.143-22.266 3.615-5.27 11.84-23.955 11.87-26.967.01-.696.916-4.145 2.019-7.664 1.103-3.519 1.738-6.666 1.41-6.993-.726-.727-5.898 5.27-8.1 9.392-4.653 8.706-27.333 31.5-31.344 31.5-1.794 0-1.795-.153-.03-5.161 2.283-6.485 1.347-9.668-4.154-14.126-11.027-8.936-14.01-11.683-17.15-15.795-4.489-5.88-11.303-10.678-12.899-9.083-.88.88-.436 1.945 1.84 4.413 4.791 5.193 5.36 6.197 6.927 12.209.816 3.132 2.554 7.123 3.863 8.869 2.412 3.217 4.709 19.08 3.131 21.632-2.089 3.38-7.525-5.108-7.525-11.751 0-3.748-4.92-11.995-7.25-12.156-3.005-.207.874 17.057 5.408 24.072 2.607 4.033 3.848 7.01 3.647 8.745-.435 3.75-3.866 3.526-5.66-.368-.76-1.65-2.926-5.288-4.815-8.085-2.567-3.8-3.679-6.813-4.405-11.939-.534-3.77-1.155-7.04-1.381-7.266-1.097-1.096-2.541 1.254-2.52 4.099.054 7.216 1.499 10.68 9.132 21.9 4.385 6.443.75 10.03-4.755 4.694l-3.468-3.36.23 3.007c.561 7.374-2.273 7.063-9.074-.996-7.723-9.15-9.293-14.994-6.528-24.292.482-1.621.18-2.424-1.092-2.913-2.895-1.11-4.708 2.389-3.965 7.65 1.566 11.08.284 17.492-3.357 16.79-1.693-.326-3.93-10.75-4.068-18.963-.065-3.842.525-5.465 3.319-9.125 5.3-6.943 5.602-7.94 5.602-18.487 0-11.737 1.015-15.158 6.335-21.359 8.647-10.076 15.183-10.534 27.665-1.937 3.025 2.083 10.45 6.158 16.5 9.055 6.05 2.898 12.194 6.114 13.654 7.147 3.555 2.517 3.289 2.656 7.458-3.87 2.02-3.163 5.183-7.519 7.03-9.68 3.771-4.414 12.56-20.982 15.32-28.88 1.618-4.63 3.56-8.275 10.538-19.789 1.1-1.815 2.56-4.28 3.246-5.48 3.847-6.725 16.323-12.79 25.698-12.493 8.912.283 11.77 1.842 15.237 8.312 4.572 8.53 13.04 9.938 22.319 3.709 4.971-3.338 21.969-11.86 26.157-13.115 5.757-1.724 15.442-11.747 22.068-22.834 2.793-4.675 5.842-9.4 6.775-10.5.933-1.1 3.146-4.586 4.918-7.745 7.021-12.517 18.303-22.73 30.281-27.412 6.294-2.46 11.83-6.796 15.8-12.37 4.415-6.2 9.277-9.126 11.488-6.915 1.34 1.34.909 2.125-3.921 7.15-6.009 6.254-9.131 10.56-8.277 11.414 1.07 1.07 4.203-1.492 8.197-6.698 4.92-6.414 7.892-8.622 12.764-9.484 4.941-.874 5.135 1.545.35 4.368-1.87 1.103-5.27 4.538-7.556 7.632-3.463 4.687-10.284 10.27-14.544 11.902-2.667 1.023.575 1.478 3.566.502 7.189-2.347 8.02-2.94 11.322-8.072 3.96-6.154 6.306-8.43 13.058-12.668 9.52-5.975 11.931-2.719 2.987 4.034-3.061 2.311-6.392 5.813-7.402 7.782-1.01 1.969-2.783 4.664-3.94 5.99-1.157 1.326-1.91 2.604-1.673 2.841 1.283 1.283 5.011-1.548 8.967-6.81 6.799-9.045 12.798-13.39 22.757-16.485 5.973-1.857 8.858-1.52 8.858 1.034 0 1.592-.865 2.052-9.5 5.058-3.128 1.088-6.591 3.377-9.25 6.113-5.255 5.408-5.547 7.51-.5 3.606 6.136-4.745 19.423-11.92 24.25-13.095 13.119-3.193 17-3.35 17-.688 0 1.997-2.091 3.196-7.596 4.355-8.114 1.709-16.368 5.152-19.765 8.245-3.886 3.537-2.34 3.657 5.36.416 3.268-1.375 6.517-2.503 7.22-2.507.705-.003 2.63-.737 4.28-1.632 7.87-4.264 32.902-7.086 34.144-3.849 1.145 2.983-1.59 4.488-8.159 4.488-17.067 0-35.377 7.515-44.992 18.466-4.868 5.545-9.55 8.81-15.992 11.157-1.882.685-1.861.752.352 1.135 4.096.71 6.868-.615 13.849-6.618 12.746-10.96 36.053-21.786 39.494-18.346 1.607 1.607.082 3.065-3.98 3.804-7.092 1.29-14.769 6.04-20.875 12.914-5.744 6.465-13.177 11.672-18.59 13.02-4.229 1.053-3.263 2.468 1.685 2.468 6.81 0 8.927-1.254 19.887-11.78 11.15-10.708 17.807-14.22 26.949-14.22 10.292 0 10.97 3.59.787 4.166-7.676.434-13.753 3.733-17.402 9.446a2260.024 2260.024 0 0 0-5 7.887c-4.76 7.542-11.978 10.842-25.156 11.5l-10 .5-.56 7.5c-.394 5.275-1.384 9.214-3.335 13.276-2.726 5.674-2.747 5.859-1.19 10.429 2.797 8.208 1.583 11.5-5.085 13.793-3.956 1.36-5.035 3.204-5.23 8.934-.086 2.543-6.045 18.731-9.32 25.318-1.406 2.83-4.152 2.878-6.906.124-1.927-1.927-2.064-2.819-1.459-9.5.698-7.702.134-8.742-2.915-5.374-4.43 4.895-7.983 2.133-9.003-7-.862-7.718-1.892-10-4.512-10-3.682 0-6.316 7.263-5.53 15.246.795 8.067-.09 9.754-5.118 9.754-1.903 0-4.676.93-6.257 2.1-4.623 3.418-10.08-1.007-10.08-8.173 0-4.224-1.692-9.814-3.584-11.844-1.833-1.965-23.146 4.935-26.591 8.608l-2.325 2.48 2.36 1.914c1.729 1.402 3.937 1.915 8.24 1.915 10.449 0 17.928 4.079 30.473 16.62 5.048 5.045 9.627 7.254 18.427 8.89 1.925.358 5.852 1.505 8.726 2.548l5.226 1.896 5.774-4.782c3.176-2.63 8.924-6.243 12.774-8.027 6.084-2.82 8.899-5.19 21.5-18.089 16.213-16.596 18.632-18.242 26.212-17.835l5.198.28 4.052-8c4.232-8.353 8.29-14.998 11.465-18.775 8.96-10.657 12.866-15.454 13.65-16.764 3.407-5.68 31.684-29.661 47.14-39.977 9.384-6.263 10.235-7.96 4.033-8.04-13.107-.17-23.556-1.292-27.868-2.991-3.523-1.389-6.092-1.716-9.916-1.263-8.47 1.003-9.044-2.856-1.099-7.383 5.972-3.403 8.946-6.082 10.88-9.803 2.393-4.601 13.068-15.28 19.753-19.76 3.3-2.211 7.35-5.236 9-6.72 1.65-1.486 5.13-3.913 7.732-5.394 2.602-1.481 5.24-3.645 5.863-4.808 1.086-2.03.969-2.088-2.902-1.47-7.668 1.227-9.471-1.798-4.123-6.915 1.689-1.616 4.011-4.513 5.162-6.438 1.15-1.925 2.997-4.512 4.104-5.75 1.115-1.246 1.489-2.25.838-2.25-.646 0-1.176.338-1.178.75 0 .413-2.015 1.578-4.474 2.589-4.579 1.883-8.707 5.937-11.726 11.514-2.034 3.759-5.687 5.643-9.222 4.755-3.405-.854-3.421-4.463-.034-7.644 3.459-3.25 8.677-12.964 6.963-12.964-.717 0-4.836 3.41-9.153 7.577-7.285 7.03-8.096 7.537-11.264 7.036-6.747-1.067-6.418-5.38.773-10.138 4.029-2.666 12.973-12.475 11.376-12.475-.487 0-4.192 1.125-8.235 2.5-11.243 3.824-17 2.695-17-3.334 0-5.618 2.549-7.476 9.494-6.918 7.098.57 10.964-.686 16.162-5.25 4.315-3.788 8.434-3.9 13.53-.368 4.6 3.187 17.152 4.084 24.773 1.77 6.274-1.904 8.64-1.752 13.281.85 4.07 2.283 10.243 10.47 12.232 16.224 1.513 4.377 4.848 5.73 12.404 5.033 9.154-.844 12.832 3.183 8.523 9.334-3.222 4.6-12.585 4.353-20.043-.529-3.398-2.223-7.03-.618-11.45 5.06-15.597 20.033-26.805 37.209-25.214 38.64 1.452 1.306 13.707-.656 18.092-2.897 2.356-1.205 7.981-3.532 12.5-5.171 4.519-1.64 9.116-3.382 10.216-3.872 4.348-1.935 6.168-2.122 14.285-1.463 7.114.577 9.15 1.167 13.07 3.788 5.367 3.586 11.145 11.62 11.145 15.494 0 3.92 2.584 6.94 6.575 7.69 4.695.88 5.019.284 2.59-4.778-5.05-10.532-3.295-19.88 5.274-28.09 12.891-12.351 28.781-14.18 53.577-6.163 5.871 1.898 12.588 3.45 14.928 3.45 8.176 0 13.056 4.122 13.056 11.027 0 2.446.706 3.29 4.25 5.088 7.816 3.963 26.75 17.09 26.75 18.546 0 3.028-3.062 7.165-6.081 8.218-2.705.943-3.054 1.448-2.507 3.629 2.028 8.077-5.318 9.363-17.817 3.118-11.797-5.895-17.595-5.948-17.595-.162 0 3.814 2.436 5.322 9.74 6.033 15.444 1.503 26.433 9.844 23.212 17.619-1.725 4.165-4.892 4.59-10.354 1.39-4.6-2.697-9.654-2.843-11.21-.324-2.824 4.57-14.452 5.96-19.388 2.318-1.864-1.375-3.779-2.5-4.256-2.5-.477 0-3.223-1.114-6.1-2.475-6.035-2.855-18.974-5.06-24.074-4.104-2.168.407-5.497 2.48-8.781 5.465-8.39 7.63-12.543 8.77-20.519 5.63-9.438-3.714-16.47-.386-12.93 6.12 5.17 9.498 5.055 9.103 3.836 13.17-1.738 5.804-11.598 17.746-16.156 19.57-7.546 3.019-20.975 17.234-21.012 22.24-.023 3.117 21.87 6.704 45.492 7.455 36.799 1.17 40.547 2.56 53.64 19.9 9.002 11.922 9.9 12.62 21.36 16.599 9.155 3.179 18.222 17.343 15.105 23.596-2.113 4.238-4.276 3.418-7.521-2.851-3.793-7.326-5.767-9.688-9.784-11.707-6.879-3.455-6.997-1.503-.355 5.832 5.218 5.761 6.385 8.99 6.495 17.963.107 8.773-2.89 6.95-5.496-3.343-.839-3.316-2.788-6.164-7.698-11.25-9.588-9.931-11.416-8.88-3.72 2.14 4.965 7.11 5.998 10.158 6.975 20.59.577 6.158.408 7.349-1.35 9.5-2.98 3.648-3.926 1.721-4.312-8.774-.339-9.234-.34-9.234-4.203-13l-3.864-3.766.695 3c1.582 6.835 1.703 11.16.51 18.14-1.505 8.79-3.017 11.388-5.668 9.73-1.592-.996-1.773-2.392-1.513-11.62l.297-10.488-4.67-6.88c-5.95-8.769-7.464-10.474-8.65-9.74-.904.557-.766 2.554.798 11.606.95 5.502-.128 8.752-2.903 8.752-3.41 0-7.668-11.34-7.668-20.419 0-4.074-.83-9.231-2.136-13.275-1.859-5.752-1.989-7.253-1-11.535 2.79-12.087 1.188-13.966-9.306-10.916-12.858 3.736-44.26 2.347-68.558-3.031-9.309-2.06-22.367-2.23-27.278-.355-7.785 2.973-9.182-.833-2.841-7.74 2.134-2.326 5.99-8.051 8.568-12.724 6-10.872 7.637-12.973 21.26-27.267 11.069-11.613 13.12-15.099 9.663-16.425-4.252-1.632-28.03 7.72-39.816 15.658-3.88 2.615-9.081 5.925-11.556 7.356-3.88 2.245-17.893 15.847-35.456 34.42-6.082 6.431-5.736 6.976 6.247 9.823 7.254 1.724 8.76 2.419 9.017 4.158.402 2.735-3.83 3.737-9.89 2.34-2.43-.56-4.825-1.03-5.323-1.043-1.695-.046 2.89 4.205 8.227 7.629 2.927 1.878 5.142 3.961 4.922 4.63-.72 2.185-4.253 1.852-7.784-.734-1.903-1.393-4.892-3.205-6.642-4.026-1.75-.821-3.464-1.95-3.809-2.508-.345-.559-1.096-1.016-1.67-1.016-1.238 0 7.17 8.38 12.449 12.406 4.329 3.302 5.207 7.594 1.554 7.594-2.072 0-12.5-7.178-14.13-9.728-1.127-1.76-9.686-6.631-10.4-5.917-.975.975 1.722 3.585 6.608 6.392 6.349 3.648 12.078 9.313 12.08 11.944 0 5.09-4.799 4.127-12.168-2.439-7.83-6.978-11.666-9.447-13.617-8.765-2.876 1.006-10.215 11.585-10.215 14.726 0 2.34-.516 2.94-2.938 3.425-2.067.414-6.028 3.885-13.375 11.725-21.884 23.35-50.272 48.637-54.601 48.637-4.372 0 2.145-7.835 10.414-12.52 7.06-4 49.5-47.585 49.5-50.834 0-5.093-3.152-2.886-13.36 9.354-14.405 17.277-36 38-39.597 38-1.89 0-1.089-1.8 1.705-3.835 1.512-1.1 2.407-2.343 1.99-2.76-.417-.417-2.1.526-3.738 2.095-1.638 1.57-3.285 2.548-3.66 2.174-.622-.623 13.529-16.128 16.396-17.966.68-.435 2.843-2.91 4.806-5.5 1.964-2.589 5.712-6.958 8.33-9.708 2.617-2.75 6.052-6.8 7.634-9 1.582-2.2 4.59-6.291 6.685-9.092 3.855-5.154 4.954-9.408 2.43-9.408-1.39 0-5.5 4.638-13.224 14.919-4.931 6.566-35.851 38.081-37.36 38.081-2.14 0-.74-1.796 10.138-13 20.375-20.984 36.878-41.487 35.365-43.935-1.136-1.837-3.31-1.168-5.475 1.685-13.463 17.736-24.398 30.25-25.483 29.166-.414-.414 13.114-19.517 18.706-26.416 3.454-4.262 5.712-8.985 5.712-11.95 0-4.117-2.293-2.939-5.26 2.703-4.801 9.13-27.725 36.747-30.5 36.747-1.177 0-.617-1.067 1.969-3.75 5.457-5.661 17.759-21.578 17.776-23 .03-2.473-1.687-1.097-10.768 8.624-10.99 11.767-24.426 20.643-29.717 19.634a514.24 514.24 0 0 0-8-1.423c-9.324-1.584-20.942-6.337-41.5-16.976l-20.5-10.608H1493c-12.933 0-13.697.115-18.188 2.755-7.83 4.603-13.778 13.196-18.703 27.018-9.52 26.712-17.936 39.267-36.21 54.011-27.216 21.958-40.62 45.235-42.689 74.135-.672 9.383-2.087 12.95-3.587 9.041zm15.939-98.232c-.335-.335-1.386.204-2.336 1.198-1.65 1.728-1.623 1.754.61.61 1.284-.66 2.061-1.473 1.726-1.808zm-78.553-8.56c-1.83-3.241-3.009-6.768-3.009-9 0-3.763-1.311-4.906-2.393-2.087-2.23 5.813 2.754 15.836 8.152 16.392.142.015-1.096-2.372-2.75-5.304zm302.792-9.918a182.745 182.745 0 0 1 6.212-6.114c3.752-3.477 6.476-7.48 5.651-8.306-.612-.612-17.664 15.82-17.664 17.022 0 1.67 2.981.333 5.802-2.602zm-171.42-1.302c.342-.89.174-1.292-.393-.941-.543.336-.988 1.034-.988 1.552 0 1.438.717 1.121 1.382-.611zm200.778-31.334c3.212-4.062 5.841-7.775 5.841-8.25 0-1.903-1.775-.65-4.799 3.386-1.75 2.337-6.111 7.625-9.69 11.75-3.577 4.125-6.488 8.175-6.468 9 .043 1.75 6.706-5.254 15.116-15.886zm22.737-14.65c3.272-3.726 3.864-5.877 1.944-7.063-1.25-.773-8.759 7.196-8.81 9.349-.06 2.472 3.824 1.18 6.866-2.285zm14.844-32.214c1.93-2.063 6.616-7.8 10.414-12.75s8.51-11.025 10.47-13.5c6.004-7.583 25.557-27.373 31.376-31.758 11.088-8.356 12.871-10.514 5.33-6.45-13.259 7.143-34.826 28.246-49.781 48.708-3.216 4.4-7.828 10.143-10.25 12.762-4.046 4.377-4.79 6.738-2.125 6.738.581 0 2.636-1.688 4.566-3.75zm13.39-2c1.945-2.063 4.399-4.925 5.453-6.36 7.066-9.617 11.152-14.473 18.54-22.033 10.282-10.522 23.991-22.642 29.652-26.216 5.231-3.302 5.447-4.166.475-1.9-11.986 5.466-28.595 20.703-44.829 41.128-4.647 5.847-9.793 12.288-11.435 14.313-4.958 6.116-3.364 6.91 2.144 1.068zm-15.63-12.401c11.616-17.468 28.122-36.208 37.672-42.772 3.719-2.556 7.328-6.91 6.454-7.785-2.567-2.567-32.29 26.986-41.949 41.708-1.984 3.025-5.36 7.75-7.5 10.5-5.75 7.388-7.428 10.284-6.672 11.508 1.33 2.153 3.112.198 11.995-13.16zm-15.347 3.899c1.46-2.337 4.298-7.373 6.309-11.192 2.01-3.82 5.17-8.62 7.02-10.668 1.85-2.048 4.053-4.773 4.895-6.056.841-1.283 6.726-7.683 13.077-14.223 6.35-6.54 11.546-12.316 11.546-12.834 0-2.281-12.865 9.505-19.882 18.215-1.99 2.47-4.968 5.845-6.618 7.5-4.913 4.93-22.5 30.138-22.5 32.252 0 2.788 3.652 1.01 6.153-2.994zm-8.31-6.021c1.617-2.35 3.665-5.837 4.552-7.75 1.698-3.662 4.654-7.803 10.855-15.206 2.063-2.463 3.75-4.804 3.75-5.203s3.633-4.687 8.073-9.529c8.944-9.753 11.39-12.91 10.605-13.694-.83-.83-11.553 9.686-14.94 14.655-1.689 2.475-4.937 6.53-7.22 9.01-2.283 2.48-5.815 6.98-7.85 10-4.845 7.188-8.014 11.717-11.129 15.9-1.396 1.877-2.539 4.014-2.539 4.75 0 2.717 2.988 1.217 5.843-2.933zm-78.917-.317c-.644-.776-1.566-1.41-2.048-1.41-1.354 0-1.039 2.775.372 3.281 2.003.719 2.949-.337 1.676-1.87zm13.078-12.916c1.403-1.69.637-9.018-1.17-11.195-4.19-5.047-9.193 4.888-5.277 10.478 1.8 2.57 4.647 2.886 6.447.717zm-20.188-27.156c-.351-7.275-2.312-11.338-5.471-11.338-1.796 0-1.718 3.445.113 4.964.967.803 1.26 2.199.87 4.15-.398 1.987-.058 3.527 1.05 4.75 1.53 1.691 1.44 2.102-1.352 6.223-4.158 6.137-3.76 7.03 1.055 2.365l4.08-3.952zm-24.817 1.1c0-.585.901-2.926 2.001-5.202 1.1-2.277 2-4.767 2-5.535 0-1.098 2.49-7.107 3.515-8.48.573-.767 6.039 2.124 7.23 3.826 1.728 2.466 3.255 2.51 3.255.093 0-2.44-7.694-11.144-9.835-11.127-1.13.01-2.213 1.74-3.372 5.395-.94 2.959-3.86 8.915-6.49 13.236-5.12 8.41-6.466 15.4-3.336 17.335 1.374.85 5.03-6.082 5.032-9.542zM1777 184.273c0-1.265-2.043-1.265-4 0-1.169.755-.893.972 1.25.984 1.512.008 2.75-.434 2.75-.984zm-171.5-21c.34-.55-.282-1-1.382-1-1.1 0-2.278.45-2.618 1-.34.55.282 1 1.382 1 1.1 0 2.278-.45 2.618-1zm301-48.85c0-1.78-8.995-5.149-13.75-5.15-4.502 0-4.75 1.151-.846 3.931 3.044 2.168 7.096 2.778 7.096 1.069 0-.55.675-1 1.5-1s1.5.706 1.5 1.57c0 1.055.737 1.464 2.25 1.25 1.238-.177 2.25-.928 2.25-1.67zM1750.583 75.71c3.676-5.746 3.939-6.438 2.45-6.438-1.554 0-9.271 10.806-8.55 11.972.98 1.587 2.325.368 6.1-5.534zM1254.17 408.774c-.016-1.1.357-2.9.83-4 1.095-2.549 1.095.08 0 3.5-.644 2.01-.806 2.107-.83.5zm-7.793-8.75c1.787-16.865 1.832-23.326.216-30.75-.898-4.125-2.108-9.975-2.688-13-.581-3.025-2.178-8.65-3.55-12.5-1.37-3.85-3.437-9.7-4.592-13-2.212-6.32-2.48-6.842-14.857-29-15.15-27.121-16.764-50.916-5.034-74.245 8.801-17.506 19.629-24.785 47.155-31.703 15.912-4 33.343-11.139 40.732-16.684 5.258-3.946 16.043-16.155 18.434-20.868 2.536-4.997 13.864-18.806 19.021-23.185 16.637-14.128 27.475-17.446 46.474-14.227 13.043 2.21 23.312 1.92 23.312-.656 0-.513-2.587-.943-5.75-.956-3.163-.013-7.55-.485-9.75-1.048-2.2-.564-7.004-1.69-10.676-2.503-7.886-1.746-28.09-11.117-27.547-12.776.66-2.013 5.512-1.864 8.43.258 2.643 1.923 11.293 4.03 11.293 2.751 0-.328-2.425-2.149-5.39-4.045-7.9-5.054-9.435-9.111-1.849-4.888 2.057 1.145 6.183 2.8 9.17 3.678 10.556 3.102 11.916 1.267 2.227-3.004-7.815-3.445-13.158-7.317-13.158-9.536 0-2.44.866-2.356 6.658.648 12.216 6.338 29.655 5.152 52.842-3.592 5.244-1.978 7.953-2.273 21.5-2.341l15.5-.079 8.694 4.271c9.35 4.593 12.806 7.898 12.806 12.242 0 3.47.039 3.497 15 10.506 12.775 5.984 22.456 11.905 23.464 14.35.322.782-.942 2.789-2.95 4.683-2.748 2.592-3.514 4.095-3.514 6.896 0 2.675-.823 4.444-3.25 6.99-4.887 5.125-6.708 5.244-12.1.788-11.549-9.543-35.782-10.322-40.608-1.304-4.44 8.297-.739 12.077 12.127 12.384 9.997.238 10.523 1.176 3.594 6.408-8.432 6.367-12.06 6.48-15.165.475-1.51-2.92-10.112-5.188-19.681-5.188-5.474 0-13.14-3.457-15.877-7.16-2.45-3.315-1.852-3.28-15.04-.887-13.237 2.401-28.428 13.013-18.691 13.056 7.006.031 15.691 6.945 15.691 12.491 0 3.145-5.976 16.749-7.872 17.92-2.062 1.275-13.34 15.7-12.743 16.298 1.346 1.346 6.37-2.31 19.197-13.973 16.68-15.164 19.738-16.67 33.918-16.716 12.33-.038 22.545-2.046 33.007-6.488l8.008-3.399 6.776 1.42c9.224 1.934 11.919 3.53 15.578 9.233 3.699 5.764 3.708 5.825 1.123 7.209-1.726.924-2.696.387-6.903-3.82-6.304-6.304-13.676-8-20.171-4.642-4.268 2.207-2.758 3.4 3.488 2.755 9.351-.965 18.97 9.377 16.473 17.712-2.225 7.428-5.867 7.849-5.896.681-.023-5.798-3.674-12.09-7.258-12.507-3.327-.386-3.369.078-.376 4.133 2.188 2.965 5.651 10.662 5.651 12.56 0 2.019-7.242 10.124-9.046 10.124-2.436 0-2.64-3.576-.387-6.793 3.563-5.087 1.325-12.762-4.014-13.764-7.154-1.342-8.697 1.684-3.053 5.989 5.314 4.053 4.265 7.015-5.29 14.924-7.455 6.172-10.265 1.03-3.518-6.437 4.123-4.564 3.906-6.082-1.298-9.096-2.367-1.371-3.713-1.494-7.394-.676-9.541 2.12-17.176 2.098-23.865-.073l-6.365-2.065-5.466 4.995c-3.006 2.748-5.895 4.995-6.42 4.995-1.724 0-16.28 12.685-21.384 18.636-2.75 3.206-8.207 8.88-12.126 12.606-6.36 6.049-9.838 8.78-24.874 19.532-8.684 6.21-26.823 14.503-28.36 12.966-1.409-1.408.053-4.066 5.426-9.868 6.217-6.713 20.416-38.223 18.215-40.424-.267-.267-3.814 1.16-7.883 3.172-7.15 3.534-11.407 4.586-35.398 8.745-10.99 1.906-19.16 6.696-22.243 13.043-3.398 6.995-3.56 10.73-1.214 28.092 2.529 18.714 3.6 34.466 2.244 33-1.179-1.274-10.073-37.361-10.844-44-.436-3.753.072-7.226 2.037-13.931 5.577-19.035 16.481-27.442 43.52-33.551 7.585-1.714 15.216-5.236 12.431-5.737-2.226-.4-4.52.074-19.931 4.12-23.637 6.206-35.063 15.711-39.789 33.1-2.926 10.767-1.954 18.955 6.888 58 1.523 6.725 1.879 21.5.517 21.5-.485 0-1.183-3.038-1.55-6.75-.368-3.713-1.73-10.35-3.027-14.75-9.232-31.312-9.98-35.252-10.012-52.7-.034-18.574-.988-17.954-4.532 2.946-.865 5.105.768 16.961 2.914 21.152 2.492 4.867 12.7 50.823 13.572 61.101.35 4.125 1.331 10.77 2.181 14.767.85 3.997 1.268 8.378.927 9.735-.34 1.356-.873 7.095-1.183 12.752-.673 12.274-1.527 16.953-3.194 17.51-.953.317-1.18-3.103-.989-14.926.554-34.378-2.903-54.816-16.295-96.338-4.32-13.394-5.246-17.597-5.681-25.813-.566-10.679-1.627-11.408-3.315-2.278-1.375 7.438.065 16.476 4.796 30.09 3.606 10.38 8.919 29.685 10.32 37.501.443 2.475 1.496 7.783 2.338 11.796 3.731 17.775 4.895 63.704 1.614 63.704-.994 0-1.423-.843-1.272-2.5.435-4.77.36-20.526-.123-25.5-2.495-25.76-3.5-32.043-7.594-47.531-2.083-7.88-6.332-19.984-9.987-28.448-5.823-13.488-9.613-35.462-8.007-46.428.532-3.626 1.231-8.393 1.556-10.593l.59-4-1.917 2.357c-7.711 9.486-6.625 31.946 2.811 58.143 2.675 7.425 5.542 16.436 6.373 20.025.83 3.588 2.459 9.438 3.62 13 2.03 6.227 3.077 11.129 4.903 22.975.467 3.025 1.351 8.608 1.966 12.406 1.482 9.164 1.585 40.332.143 43.594-.88 1.99-1.012.767-.648-6 .25-4.675.052-11.65-.442-15.5-.494-3.85-1.34-11.95-1.88-18-.888-9.955-3.732-21.394-9.945-40-.55-1.65-2.004-6.375-3.23-10.5-1.224-4.125-3.306-9.67-4.626-12.323-8.914-17.92-13.251-48.932-8.696-62.177 1.662-4.832 1.707-5.5.37-5.5-4.642 0-8.01 30.217-4.69 42.073.836 2.985 1.831 7.227 2.212 9.427.839 4.84 6.009 20.625 8.045 24.563.808 1.561 1.468 3.773 1.468 4.916 0 1.143 1.33 4.714 2.957 7.936 1.626 3.222 3.465 8.047 4.087 10.722.621 2.675 1.506 5.988 1.965 7.363 6.334 18.946 7.98 30.386 7.086 49.205-1.1 23.11-3.716 17.771-4.021-8.205-.147-12.443-2.338-27.752-4.638-32.403-.79-1.597-1.436-3.718-1.436-4.713 0-2.174-2.479-8.595-7.487-19.39-18.599-40.09-23.593-68.007-16.062-89.777 3.438-9.937 2.845-11.92-1.081-3.619-10.169 21.496-7.251 50.687 8.236 82.402 2.417 4.95 4.394 9.325 4.394 9.72 0 .397 1.175 3.29 2.611 6.43 4.112 8.989 8.253 22.837 9.912 33.15.838 5.206 1.804 9.92 2.147 10.476 1.08 1.748.329 30.633-.865 33.253-2.308 5.067-4.15 3.037-3.428-3.779zm98.041-194.357c1.436-.552 2.316-3.393 1.05-3.393-1.13 0-7.468 2.926-7.468 3.448 0 .741 4.443.702 6.418-.056zm158.017-82.289c.707-1.143-1.787-2.104-5.458-2.104-2.865 0-4.482 1.162-3.283 2.36.972.972 8.111.763 8.741-.256zm-32.935-10.105c.34-.55 1.69-1 3-1 6.326 0 3.585-4.215-3.818-5.871-6.025-1.349-8.682-.765-8.682 1.906 0 3.603 7.817 7.689 9.5 4.965zm-375.658 276c-.898-1.375-1.96-3.625-2.36-5-.4-1.375-5.176-11.64-10.614-22.813-5.439-11.173-10.315-22.198-10.836-24.5-.521-2.303-1.885-6.886-3.032-10.186-5.611-16.151-8.367-37.217-8.461-64.687-.043-12.477-.381-22.989-.751-23.36-.37-.37-3.888.556-7.818 2.058-8.376 3.2-21.304 3.305-25.97.21-4.12-2.732-14.819-15.78-19.057-23.24C999.7 208.522 991 190.682 991 189.162c0-1.62-7.763-18.472-10.6-23.011l-2.263-3.622-13.319.326c-7.78.19-14.857-.13-17.02-.772-4.153-1.232-10.764 1.375-19.832 7.82-5.463 3.883-9.067 4.921-11.873 3.42-3.669-1.964-2.322-3.666 7.657-9.677 8.252-4.97 9.35-5.92 7.147-6.176-2.985-.346-12.152 3.474-19.225 8.013-4.259 2.733-5.272 2.994-8.503 2.196-5.805-1.434-4.97-4.23 1.897-6.354 6.15-1.903 11.934-4.994 11.934-6.377 0-1.296-4.585.01-11.862 3.379-7.137 3.304-10.293 3.668-12.173 1.403-1.76-2.12-.347-3.26 5.362-4.326 2.61-.488 5.516-1.54 6.46-2.34.942-.799 3.846-2.24 6.453-3.2 4.402-1.624 6.506-3.18 5.569-4.116-.215-.215-3.973.58-8.35 1.77-9.855 2.674-16.769 2.873-19.094.548-2.452-2.452-.194-4.793 4.625-4.793 2.06 0 7.896-1.368 12.968-3.04 7.876-2.595 10.123-2.944 15.383-2.39l6.159.65-4.303-3.236c-6.981-5.25-3.995-10.517 3.706-6.535 1.67.864 6.538 1.832 10.817 2.151 9.284.692 13.746 1.932 17.78 4.94 3.986 2.971 12.27 7.05 16 7.88 10.165 2.259 26.992 17.393 35.667 32.08 1.625 2.75 5.166 7.925 7.87 11.5 2.703 3.575 5.89 8.3 7.083 10.5 1.192 2.2 2.927 4.534 3.855 5.188.927.653 3.58 3.641 5.893 6.64 7.3 9.463 13.827 8.168 27.2-5.398 10.217-10.364 12.063-11.29 20.664-10.369 6.688.717 13.9 5.176 17.667 10.925 3.631 5.542 16.219 2.945 23.351-4.817 7.214-7.851 4.893-9.779-6.25-5.189-10.393 4.282-15.856 2.642-15.274-4.585l.274-3.395-4.276.27c-5.371.341-8.224-1.128-8.224-4.234 0-6.74 8.65-8.321 19.236-3.516 11.755 5.336 25.449-1.726 15.396-7.939-2.619-1.618-5.017-2.081-10.777-2.081-9.876 0-14.844-3.611-10.688-7.768 1.717-1.717-1.347-2.62-6.239-1.837-7.042 1.126-12.087-3.443-9.064-8.21.459-.723 3.851-2.003 7.54-2.844 4.01-.915 9.194-3.093 12.9-5.42 9.32-5.853 12.632-7.108 16.873-6.392 3.53.597 3.797.443 5.71-3.309 2.577-5.05 5.834-6.36 16.32-6.56 8.148-.156 8.589-.294 17.507-5.44 12.123-6.998 18.91-9.26 29.286-9.758 4.675-.225 11.33-1.168 14.79-2.095 6.583-1.765 9.097-1.121 7.892 2.018-.968 2.523-8.128 6.66-14.327 8.279-3.21.838-6.965 2.138-8.345 2.89-2.423 1.318-2.337 1.373 2.49 1.588 8.291.37 10.721-.074 17.362-3.173 8.928-4.167 12.088-3.594 8.7 1.576-3.199 4.882-22.449 13.455-30.212 13.455-2.664 0-4.004 1.746-2.496 3.253 1.15 1.15 12.79-.35 18.646-2.404 10.346-3.628 9.877-1.347-1.265 6.15-10.127 6.816-10.16 6.851-7.792 8.582 3.064 2.24 12.13 1.705 20.057-1.185 11.26-4.105 13.5-4.225 13.5-.725 0 2.212-1.351 4.19-5.75 8.42-16.081 15.464-31.855 23.216-55.692 27.371-10.335 1.802-12.314 2.882-17.071 9.32-8.398 11.363-2.526 15.644 7 5.101 8.406-9.305 17.327-13.299 37.644-16.853 18.514-3.24 35.523-12.869 39.314-22.257 1.272-3.149 5.18-10.456 8.684-16.238 6.82-11.253 11.481-19.639 19.248-34.625 11.182-21.575 20.573-25.674 37.359-16.308 5.644 3.15 7.208 3.535 16.5 4.07 13.854.797 24.678 6.152 26.413 13.067 1.324 5.274-3.06 4.597-11.953-1.845-2.246-1.627-5.28-2.894-6.93-2.894-3.737 0-3.253 1.936 1.027 4.115 3.64 1.853 12.207 11.802 12.207 14.177 0 4.244-4.629 2.62-8.417-2.956-2.995-4.407-7.234-7.331-10.583-7.3-2.383.022-2.307.198 1.616 3.743 3.61 3.263 4.38 4.766 6.264 12.22 2.591 10.26 2.586 10 .193 10-2.886 0-5.806-4.42-6.565-9.938-.574-4.178-4.354-10.342-4.579-7.466-.226 2.895.258 17.223.638 18.905.986 4.353-1.372 5.246-4.582 1.734-2.705-2.96-2.985-3.909-2.985-10.115 0-8.435-1.405-10.511-9.838-14.542-9.225-4.41-11.1-2.207-6.662 7.827 1.375 3.109 2.5 6.704 2.5 7.99 0 3.062-3.627 7.605-6.073 7.605-2.169 0-2.214-.167-2.338-8.582-.072-4.917-.616-6.844-2.839-10.054-1.953-2.82-2.75-5.211-2.75-8.25 0-2.979-.38-4.154-1.25-3.865-2.276.755-8.7 17.2-10.298 26.366-.852 4.887-2.172 9.835-2.932 10.995-.76 1.161-2.152 4.761-3.093 8-4.787 16.487-11.462 25.416-25.041 33.498-7.478 4.45-33.736 16.454-42.804 19.567-45.864 15.743-66.061 42.81-65.537 87.825.096 8.25.108 15.675.025 16.5-.32 3.195-3.093-4.113-4.239-11.168-.654-4.032-1.56-7.759-2.01-8.282-2.158-2.499.377 23.582 2.96 30.45 1.607 4.275 2.377 10 1.345 10-1.811 0-6.31-17.911-8.665-34.5-.78-5.495-2.251-9.192-2.587-6.5-.63 5.074-.488 8.671.736 18.5 1.646 13.22 4.46 25.807 6.767 30.264.929 1.795 2.09 5.17 2.58 7.5.491 2.33 1.204 5.249 1.584 6.486.408 1.325.269 2.25-.337 2.25-1.078 0-7.204-15.051-7.204-17.7 0-.84-1.31-5.864-2.91-11.164s-3.431-11.592-4.07-13.983c-.637-2.39-1.397-4.109-1.689-3.817-.932.932 1.62 20.666 3.035 23.467 1.673 3.312 3.118 13.614 1.794 12.797-.512-.317-1.708-3.62-2.656-7.338-.949-3.719-2.564-9.462-3.59-12.762-2.74-8.815-7.12-34.562-8.126-47.77-.158-2.074-.738-3.65-1.288-3.5-1.537.416-.571 19.91 1.526 30.77 1.009 5.225 2.332 12.875 2.94 17 .608 4.125 2.035 10.65 3.17 14.5 1.136 3.85 2.53 8.8 3.1 11 2.798 10.818 3.995 13.976 9.28 24.5 2.845 5.663 4.065 11 2.514 11-1.59 0-7.192-12.214-12.613-27.5-10.817-30.5-15.806-51.026-18.548-76.305-.883-8.134-1.493-10.83-2.175-9.612-1.152 2.058-.113 18.527 1.918 30.417.799 4.675 1.676 10.075 1.95 12 1.608 11.326 5.18 25.5 8.515 33.798.508 1.263.923 3.423.923 4.8 0 1.376.702 3.86 1.56 5.52.859 1.659 1.377 3.774 1.153 4.7-.778 3.207-9.784-18.93-11.724-28.818-.486-2.475-1.957-7.65-3.27-11.5-3.753-11.011-8.7-39.371-8.73-50.051-.015-5.544-1.102-11.497-1.997-10.943-1.455.899-2.065 17.016-.946 24.994.616 4.4 1.27 9.443 1.451 11.206.182 1.763.603 3.647.937 4.187.333.54 1.21 4.272 1.95 8.294.739 4.022 2.582 11.363 4.096 16.313 1.513 4.95 3.107 10.35 3.541 12 .434 1.65 1.681 5.25 2.771 8 3.414 8.616 4.446 11.89 4.885 15.5.408 3.35.358 3.415-1.169 1.5-.877-1.1-1.862-3.125-2.188-4.5-.542-2.285-3.431-9.01-8.404-19.565-1.054-2.236-1.916-4.586-1.916-5.22 0-.636-1.125-3.615-2.5-6.62-1.375-3.007-2.502-5.833-2.505-6.28-.016-2.305-2.214-8.315-3.042-8.315-1.383 0-1.177 3.833.483 9 .795 2.475 2.377 7.56 3.514 11.3 1.138 3.74 2.704 7.79 3.481 9 .777 1.21 2.162 4.811 3.077 8.002.915 3.19 2.297 7.015 3.072 8.5.774 1.484 1.41 3.197 1.414 3.807 0 .61 1.806 5.961 4.006 11.891 4.127 11.124 4.613 12.997 3.14 12.087-.474-.293-2.102-4.032-3.618-8.31-2.818-7.95-9.505-23.7-12.05-28.385-2.612-4.807-7.684-19.277-11.179-31.892-3.559-12.845-4.205-16.08-6.28-31.426-.665-4.91-1.566-9.86-2.003-11-1.466-3.826-2.154 2.316-.944 8.426.599 3.025 1.443 9.1 1.876 13.5 1.075 10.92 5.02 29.232 8.715 40.443 1.782 5.409 9.65 23.938 18.59 43.776 1.045 2.32 1.75 5.244 1.565 6.5l-.335 2.281-1.634-2.5zm62.62-217.938c.319-.516-.213-1.382-1.183-1.925-1.979-1.108-2.06-1.008 2.721-3.354 5.907-2.898 11.795-4.544 14.441-4.039 3.265.625 7.814-.521 7.04-1.773-1.129-1.827-15.048-1.104-20.902 1.086-6.421 2.402-11.324 7.34-9.486 9.555 1.3 1.567 6.483 1.883 7.369.45zM1186 161.274c0-.55-.45-1-1-1s-1 .45-1 1 .45 1 1 1 1-.45 1-1zm-44.012-14.25c5.245-2.675 6.101-4.439 2.583-5.322-5.084-1.276-12.53 2.632-11.27 5.916.866 2.255 3.445 2.079 8.687-.594zM938.45 140.4c-1.35-1.24-10.222-2.492-8.95-1.263.982.948 4.088 1.73 7.95 2 1.164.08 1.567-.216 1-.737zM115.093 387.626c-5.058-2.7-8.869-2.99-11.652-.884-3.188 2.411-8.135 1.928-10.04-.98-.906-1.382-2.765-2.793-4.131-3.136-2.775-.696-5.27-5.511-5.27-10.171 0-4.603-1.97-9.277-6.386-15.16-2.263-3.013-5.124-7.288-6.36-9.5C66.723 339.68 62 329.792 62 328.421c0-.775-1.562-3.583-3.472-6.241-7.957-11.076-11.589-23.696-11.997-41.684-.17-7.547-.874-15.9-1.562-18.56-1.65-6.382-.657-18.983 2.438-30.927 2.183-8.423 3.637-16.563 5.134-28.735.304-2.476.716-13.95.915-25.5.348-20.203.476-21.342 3.37-30 3.843-11.5 5.927-16.37 8.285-19.369 2.83-3.597 2.35-4.271-2.801-3.936-4.369.284-4.866.606-7.254 4.698-6.23 10.678-13.882 5.279-7.94-5.603 4.152-7.605-2.213-6.394-6.708 1.276-5.05 8.618-9.535 9.882-10.408 2.933-.833-6.629-3.176-5.913-12.53 3.827C4.196 144.423 0 146.198 0 137.991c0-7.837 2.166-14.798 6.834-21.963 5.077-7.792 5.129-8.781.589-11.226-6.67-3.592-7.734-8.174-3.84-16.529 1.41-3.025 4.163-9.763 6.117-14.975 3.926-10.47 7.415-15.65 14.845-22.03 2.725-2.341 5.855-5.915 6.955-7.942 5.514-10.161 15.504-17.86 30.024-23.14C72.43 16.222 86.43 15.039 91.5 17.654c5.95 3.07 18.17 4.612 23.137 2.92 3.407-1.162 4.734-1.236 5.828-.329 4.069 3.377-3.206 7.43-13.254 7.384-9.985-.045-7.73 1.725 2.964 2.327 6.912.39 9.295.104 13.731-1.645 5.755-2.268 15.591-2.94 17.347-1.183 1.831 1.83-.885 3.796-6.922 5.009-3.108.624-7.491 2.207-9.74 3.517-2.25 1.31-6.004 2.7-8.341 3.09-8.23 1.368-3.235 4.168 5.876 3.292 3.32-.319 8.459-2.202 15.195-5.569 15.26-7.626 23.921-8.923 35.235-5.277 3.27 1.054 10.444 2.891 15.944 4.084 12.785 2.772 12.5 2.671 12.5 4.434 0 3.943-5.16 4.031-25.719.439-7.953-1.39-13.98-.04-24.662 5.523l-7.88 4.104-11.24-.158c-6.459-.092-13.874-.834-17.434-1.746-12.505-3.204-39.863-.968-42.613 3.482-.781 1.264.361 1.14 5.048-.549 7.696-2.772 30.425-1.315 37.357 2.395 1.526.817 7.049 1.011 18.411.649 15.327-.49 16.817-.719 26.732-4.109 11.928-4.079 18.857-4.158 29.79-.341 12.21 4.262 16.633 4.253 28.17-.062 9.471-3.542 9.724 2.052.294 6.513-7.62 3.604-11.376 3.941-21.31 1.914-11.518-2.351-15.735-2.223-27.944.85-19.846 4.996-19.622 4.993-65.644 1.084-14.02-1.19-17.632 1.378-5.1 3.626 2.885.518 7.494 1.428 10.244 2.023 2.75.594 10.395 1.384 16.989 1.755 10.056.566 12.04.943 12.307 2.34.455 2.38-1.6 2.737-17.144 2.977l-13.848.213 7.848 2.918C120.246 78 122.539 78.39 128 77.99c7.272-.531 9-.18 9 1.828 0 2.75-10.646 4.361-19.75 2.99-4.482-.676-5.25-.557-5.25.814 0 2.293 3.623 4.291 10.188 5.618 6.72 1.358 9.184.427 17.479-6.6 12.39-10.499 27.524-15.183 43.455-13.45 12.712 1.383 24.252-.89 41.11-8.098 7.58-3.24 32.775-7.753 43.268-7.75 13.275.006 30.5 7.613 30.5 13.471 0 2.126-5.734 14.32-8.26 17.566-1.62 2.082-10.571 7.783-18.472 11.765-7.396 3.727-8.412 5.967-5.39 11.889 1.119 2.194 2.47 7.492 3.001 11.773 1.29 10.396 6.99 17.467 14.078 17.467 6.301 0 8.453 6.216 2.357 6.808-4.944.48-11.343-1.683-14.594-4.933-4.132-4.133-4.393-2.998-.692 3.017 2.872 4.667 3.465 5.108 6.867 5.108 4.328 0 7.793 2.078 6.623 3.972-2.487 4.024-18.59-2.508-21.122-8.567-.783-1.872-1.867-3.405-2.41-3.405-1.526 0-1.163 1.072 2.371 7 3.405 5.71 6.374 7.945 10.643 8.008 4.043.06 7.733 3.405 6.025 5.462-.843 1.016-2.206 1.45-3.516 1.122-1.183-.297-3.786.345-5.82 1.436-6.044 3.239-15.448 1.986-19.79-2.635-4.784-5.092-9.992-23.332-8.326-29.156.431-1.505.86-7.912.952-14.237.264-17.981 1.515-20.675 14.302-30.806 4.235-3.356 5.223-5.577 2.879-6.476-1.836-.705-15.159 3.117-37.206 10.673-17.92 6.142-19.555 6.521-28.759 6.67-14.462.235-14.296.647 5.259 13.123 5.805 3.704 7.162 5.008 14.373 13.816 5.515 6.737 9.93 13.109 16.102 23.237 4.383 7.191 15.342 16.763 19.193 16.763.495 0 3.31 1.554 6.257 3.452 2.946 1.898 6.756 3.758 8.466 4.132 19.008 4.163 53.369 30.782 50.244 38.925-.993 2.588-2.42 1.655-6.214-4.062-2.028-3.054-4.772-6.317-6.098-7.25-1.326-.933-4.326-3.505-6.667-5.715-6.54-6.174-23.656-13.841-23.656-10.595 0 .487 3.13 2.745 6.956 5.018 6.048 3.593 24.044 19.647 24.044 21.45 0 1.791-2.963-.014-10.837-6.604-13.724-11.487-24.595-18.689-25.992-17.221-.369.388.177 1.215 1.213 1.838 5.337 3.209 9.848 8.632 7.18 8.632-.607 0-16.46-10.415-19.81-13.014-1.51-1.172-5.335-3.189-8.5-4.482-26.84-10.963-27.666-11.384-32.504-16.505-2.613-2.766-4.75-5.472-4.75-6.013 0-.542-.458-.985-1.017-.985-.56 0 .103 2.209 1.471 4.909 3.062 6.041 9.52 11.48 16.656 14.023 12.704 4.529 16.432 6.165 18.299 8.032 3.034 3.034 1.517 3.25-4.986.706-3.258-1.274-8.065-2.853-10.682-3.51-9.94-2.494-14.972-5.525-21.624-13.029-6.108-6.89-9.69-9.104-5.45-3.37 1.112 1.507 2.824 4.287 3.802 6.179 2.375 4.592 5.037 6.67 11.031 8.61 7.896 2.557 21.044 9.125 28.005 13.99 7.59 5.305 55.123 29.445 57.995 29.454 1.1.003 5.15-.662 9-1.477 3.85-.816 9.067-1.49 11.593-1.5 5.564-.021 14.434-2.944 19.604-6.46 3.36-2.285 9.2-4.339 24.053-8.459 6.998-1.941 4.993-6.267-4.797-10.348-4.037-1.683-8.953-7.018-8.953-9.716 0-.997-.837-2.847-1.86-4.11l-1.86-2.297-6.701 1.814c-15.743 4.261-25.586-2.218-24.122-15.88.75-7.005-.032-8.25-6.994-11.12-8.057-3.32-10.402-7.825-6.551-12.58 2.743-3.388 9.37-3.264 14.72.276 4.395 2.909 19.806 7.175 24.123 6.678 5.315-.611 2.889-3.015-6.255-6.196-16.63-5.785-23.24-11.324-18.804-15.76 2.252-2.252 4.858-2.606 10.503-1.428l3.7.772-.2-4.21c-.168-3.56.234-4.539 2.597-6.331l2.795-2.121 6.416 3.462 6.416 3.463 3.336-3.233c4.373-4.239 8.893-4.301 16.897-.234 5.265 2.676 6.88 3 14.924 3 9.947 0 12.608.917 18.733 6.45 3.015 2.725 4.701 3.417 9.19 3.774 3.023.24 8.396 1.237 11.938 2.214 7.762 2.14 24.017 1.677 35.023-.998 11.18-2.717 13.234-.269 5.286 6.3-12.184 10.07-26.746 18.881-38.25 23.146-12.32 4.566-14 5.826-14 10.495 0 2.316-1.139 4.051-5 7.62-5.96 5.508-5.966 5.549-1.345 10 2 1.924 4.357 4.649 5.24 6.054.883 1.404 3.132 4.104 5 6 3.06 3.106 6.754 8.557 14.875 21.945 4.073 6.715 14.002 16.142 20.23 19.208 13.87 6.83 25.48 7.68 51 3.739 9.73-1.503 25.913-1.614 29.605-.203 1.592.608 6.912 2.13 11.822 3.38 15.21 3.873 24.841 12.495 33.373 29.876 4.186 8.529 3.994 21.989-.401 28.152-3.707 5.198-11.011 10.403-16.742 11.928-19.331 5.148-18.837 9.682 1.843 16.91 14.34 5.01 18.02 6.168 25.296 7.947 17.576 4.299 54.027 18.175 63.19 24.054 7.816 5.016 6.457 6.922-1.85 2.596-10.48-5.458-33.39-14.587-36.608-14.587-2.632 0-1.24 2.268 2.034 3.315 1.616.517 3.86 1.776 4.986 2.797 1.127 1.022 3.602 2.153 5.5 2.514 4.325.822 6.477 1.918 11.202 5.704 5.771 4.625 3.855 4.296-7.282-1.249-5.612-2.794-10.789-5.08-11.503-5.08-.715 0-3.455-.925-6.09-2.054-2.636-1.13-11.6-4.044-19.923-6.476-8.322-2.432-16.44-5.105-18.041-5.94-1.601-.835-3.742-1.52-4.757-1.524-3.965-.014-15.977-3.946-25.45-8.331-3.645-1.687-10.12-7.612-11.737-10.739-3.011-5.823 3.173-14.708 11.828-16.994 6.638-1.753 10.044-3.74 13.21-7.71l2.942-3.686-3.973 3.105c-2.355 1.84-6.774 3.84-10.845 4.908-15.311 4.017-20.745 12.358-15.191 23.318 2.619 5.168 4.95 7.127 10.732 9.022 2.019.662 4.172 1.808 4.786 2.547.613.74 2.787 1.628 4.83 1.974 3.547.602 8.858 2.598 17.824 6.7 2.26 1.033 4.602 1.88 5.203 1.88 1.645 0 19.207 5.79 22.988 7.58 1.816.859 4.966 1.825 7 2.147 7.716 1.221 33.698 15.107 31.807 16.998-.223.222-4.613-1.372-9.756-3.544-13.349-5.636-22.132-8.466-40.55-13.066-8.91-2.225-17.91-4.774-20-5.664-2.091-.89-6.952-2.75-10.802-4.133-24.18-8.688-37.59-25.467-30.863-38.618 4.403-8.608 11.768-14.196 21.363-16.208 17.44-3.656 12.88-16.09-7.5-20.45-7.396-1.582-24.548 2.105-41.5 8.922-14.563 5.856-38.252 7.264-52 3.09-17.275-5.245-26.4-10.764-39-23.588-6.325-6.438-12.4-12.601-13.5-13.696-4.829-4.804-19.54-8.41-30.57-7.49-14.638 1.219-25.994 2.86-35.43 5.12-22.144 5.303-31.609 3.767-45.011-7.308-5.1-4.214-7.267-4.914-9.208-2.974-.825.826-1.646.086-3.127-2.816-2.323-4.554-4.622-6.75-6.106-5.832-.696.43-.581 1.536.345 3.336 1.862 3.62 5.607 16.37 5.607 19.091 0 2.966 3.325 9.263 7.256 13.744 3.33 3.796 17.037 10.914 18.854 9.79.524-.323 6.484-.98 13.244-1.46 14.455-1.024 23.085.323 30.479 4.758 2.567 1.54 5.997 3.468 7.623 4.285 4.892 2.459 13.872 12.144 16.683 17.994 4.802 9.992 6.768 14.444 8.289 18.77 1.755 4.994 8.253 14.396 11.97 17.32 14.642 11.517 49.723 19.92 82.334 19.72 14.729-.09 19.28.736 17.743 3.222-.619 1.002-30.006.345-44.975-1.005-17.297-1.56-22.298-2.51-34.027-6.465-22.51-7.59-30.151-14.569-41.26-37.687-10-20.811-27.552-30.17-61.414-32.746-21.936-1.67-33.59-12.098-37.736-33.767-3.808-19.907-7.33-24.885-28.396-40.12-1.71-1.238-6.273-3.226-10.139-4.418-3.865-1.192-9.227-3.256-11.915-4.587-3.928-1.944-5.054-2.156-5.734-1.082-1.81 2.86 2.433 5.776 11.258 7.737 2.55.566 7.436 2.733 10.856 4.815 3.42 2.081 7.408 4.401 8.863 5.155 3.814 1.976 12.147 10.284 12.13 12.092-.01.962-1.227.18-3.25-2.089-3.845-4.31-7.707-6.916-13.486-9.104-5.684-2.151-5.466-1.663 3.25 7.294 4.213 4.33 7.5 8.575 7.5 9.687 0 1.089.837 3.053 1.86 4.365 2.744 3.52 3.61 11.075 1.694 14.78-2.045 3.954-6.924 7.58-14.165 10.525-21.68 8.82-21.906 32.313-.389 40.394 16.125 6.055 25.046 7.312 55.5 7.82 45.273.753 57.11 5.246 68.43 25.972 9.765 17.883 14.225 21.29 37.77 28.86 22.289 7.165 42.045 8.848 84.8 7.224 6.832-.26 7.306 2.667.5 3.088-2.475.153-8.1 1.014-12.5 1.914-14.252 2.915-56.349 2.347-68.5-.925-5.225-1.406-11.614-3.046-14.197-3.644-15.085-3.492-28.936-15.703-33.65-29.667-4.478-13.262-15.195-17.266-54.653-20.417-24.838-1.983-33.393-3.467-50.5-8.76-19.881-6.15-28.282-11.987-33.188-23.06-6.878-15.524 2.881-34.43 19.907-38.563 9.038-2.195 12.735-5.938 12.031-12.183-.968-8.592-9.903-15.599-26.71-20.947-11.134-3.543-13.54-4.847-19.828-10.748-2.934-2.754-5.892-4.731-6.646-4.442-.747.286-3.231 1.082-5.521 1.768-7.546 2.261-11.189 9.018-6.202 11.505 5.394 2.689 4.835 6.39-.965 6.39-4.958 0-8.878-5.561-8.878-12.594v-3.465l-3.983 2.28c-6.445 3.689-6.148 6.778 1.091 11.348 4.79 3.024 4.616 4.816-.512 5.246-8.577.72-15.956-10.787-11.064-17.256 3.626-4.794.973-5.873-4.728-1.923-4.636 3.213-5.367 9.331-1.707 14.282 4.817 6.515.714 8.793-5.509 3.057-5.568-5.133-6.027-6.517-4.553-13.731 1.361-6.665 2.576-8.271 9.715-12.85 6.098-3.912 6.394-4.8 2.1-6.296-6.545-2.282-13.685.458-20.516 7.874-8.15 8.849-11.748 4.571-4.814-5.725 4.533-6.73 6.605-8.006 16.244-10l7.948-1.643 8.094 3.198c9.128 3.607 10.827 3.796 15.726 1.75 5.026-2.1 4.633-3.371-2.555-8.26-11.067-7.526-15.444-8.599-37.977-9.311l-20.5-.648-8.806-3.666c-8.859-3.689-12.129-4.39-13.104-2.812-.601.973-3.201 20.746-4.687 35.645-.548 5.5-1.651 11.993-2.45 14.429-.8 2.435-1.453 5.06-1.453 5.832 0 .772-1.35 4.48-3 8.24-1.65 3.759-2.998 7.884-2.995 9.167 0 1.283-1.636 5.57-3.641 9.525-4.067 8.025-4.39 10.83-1.973 17.147 1.351 3.53 1.556 6.58 1.1 16.346-.663 14.218.632 25.1 3.966 33.327 3.161 7.798 4.082 8.309 10.834 6.014 6.737-2.29 11.614-1.235 19.978 4.321 3.024 2.01 6.808 4.366 8.41 5.238 2.651 1.445 11.509 12.635 12.928 16.333.387 1.008-.278 1.93-1.935 2.685-3.125 1.424-8.022-1.251-12.117-6.62-3.208-4.206-7.735-6.714-11.363-6.294-4.615.535-3.817 3.366 2.842 10.076 3.402 3.429 7.572 8.16 9.266 10.513 1.694 2.353 4.007 4.465 5.14 4.693 1.133.227 3.715.679 5.739 1.003 4.755.762 8.377 3.635 7.491 5.942-1.187 3.096-18.74-.484-21.1-4.303-.984-1.592-2.57-1.375-2.57.352 0 3.428 5.775 8.068 12.898 10.363 4.364 1.405 7.495 3.037 8.14 4.242 3.26 6.092-14.552 1.054-22.743-6.432-2.95-2.696-5.56-4.707-5.8-4.467-1.273 1.273 3.447 7.443 7.097 9.275 8.008 4.02 14.355 8.96 14.382 11.197.038 3.15-1.928 3.353-6.881.71zm-15.008-9.102c-1.961-3.481-5.921-7.735-6.587-7.076-1.326 1.314.723 4.99 3.841 6.89 3.87 2.36 3.975 2.368 2.746.186zM555 334.369c0-.498-1.913-2.03-4.25-3.405-4.57-2.688-8.084-6.145-9.06-8.913-1.024-2.908 3.73-7.507 8.577-8.298 8.021-1.31 18.578-10.728 20.39-18.192 4.907-20.21-16.01-40.785-44.657-43.927-6.006-.659-37.154 3.7-43.748 6.12l-3.752 1.379 5.685.07c3.127.039 6.952-.428 8.5-1.036 1.665-.655 10.779-1.166 22.315-1.25 19.493-.143 19.502-.142 26 2.755 9.385 4.185 14.47 7.969 19.064 14.188 7.888 10.678 8.835 17.941 3.458 26.537-3.618 5.784-4.328 6.233-21.595 13.645-10.86 4.661-7.134 15.184 7.049 19.905 4.405 1.466 6.024 1.58 6.024.422zm7.661-44.394c.876-5.4-3.49-13.73-9.82-18.733-11.869-9.382-32.933-10.502-52.743-2.806-5.086 1.976-.612 3.129 5.381 1.387 3.124-.908 10.65-1.87 16.724-2.135 15.654-.686 19.584.613 28.91 9.559 7.241 6.946 7.255 6.97 7.697 13.08.5 6.92 2.704 6.718 3.851-.352zM209 207.78c0-1.152-8.339-6.415-9.26-5.845-1.272.785 3.15 4.286 5.451 4.316.93.012 1.97.473 2.309 1.023.652 1.054 1.5 1.34 1.5.506zm5.905-12.566c-.72-.444-1.717-.557-2.214-.25-.498.308-.315.924.404 1.369.72.444 1.717.557 2.214.25.498-.308.316-.924-.404-1.369zM183 181.344c0-1.23-2.881-4.07-4.13-4.07-.974 0-.485 1.302 1.408 3.75 1.134 1.465 2.722 1.653 2.722.32zm76.573-.592c-1.06-.802-2.172-1.213-2.471-.914-.628.628 1.912 2.413 3.398 2.388.55-.009.133-.672-.927-1.474zm-65.373-2.478c1.54 0 2.8-.486 2.8-1.08 0-1.937-11.983-15.797-17.65-20.413-8.38-6.826-9.273-6.06-2.577 2.21 4.417 5.455 3.79 7.306-1.145 3.384-13.48-10.713-27.636-14.864-50.98-14.95-5.418-.02-11.155-.324-12.75-.674-3.08-.676-4.072.858-1.253 1.94.905.347 8.667 1.108 17.25 1.691 17.624 1.198 30.128 4.283 36.14 8.915 1.944 1.499 5.805 3.875 8.58 5.282 3.632 1.84 6.145 4.152 8.966 8.25 3.946 5.731 7.113 7.995 8.869 6.34.523-.493 2.21-.895 3.75-.895zm-7.545-4.715c-2.781-4.35-2.605-5.455.431-2.707 2.867 2.594 4.151 5.157 2.954 5.897-.53.328-2.054-1.107-3.385-3.19zm-10.261.298c-.895-2.33-13.188-9.584-16.244-9.584-.693 0 5.718 5.425 10.283 8.701 3.544 2.544 6.782 3.023 5.96.883zm27.606.479c0-2.786-20.905-26.768-25.986-29.813-10.133-6.07-9.734-2.745.736 6.131 4.586 3.888 9.18 8.896 11.25 12.265 4.329 7.043 9.518 12.354 12.071 12.354 1.061 0 1.929-.421 1.929-.937zm28.774-7.241c-.548-1.644-3.534-3.394-4.369-2.56-.95.951 1.51 3.738 3.3 3.738.804 0 1.285-.53 1.069-1.178zm-113.505-6.477c-.677-.274-2.027-.291-3-.038-.973.254-.419.478 1.231.498 1.65.02 2.446-.187 1.77-.46zm19.731-.344c1.22-.789 1.09-.973-.69-.985-1.206-.008-2.47.435-2.81.985-.787 1.273 1.53 1.273 3.5 0zm120-5.065c-2.292-1.954-3.856-4.418-4.53-7.136-.566-2.284-1.49-4.306-2.051-4.493-1.25-.417-.595 6.467.691 7.262.49.302.89 1.397.89 2.434 0 2.24 3.622 5.014 6.473 4.957 1.721-.035 1.499-.49-1.473-3.024zm-31.608-2.92c-2.773-4.19-4.572-4.564-3.67-.764.592 2.498 2.954 4.749 4.983 4.749.878 0 .436-1.342-1.313-3.984zm-35.351-5.958c-2.138-3.003-4.041-3.99-4.041-2.098 0 1.146 5.226 6.148 5.811 5.563.224-.224-.573-1.783-1.77-3.465zM386.5 148.58c3.85-.254 7.428-.876 7.95-1.383.522-.508 1.873-.93 3-.938 2.727-.02 9.319-2.353 10.782-3.817.642-.642 2.008-1.167 3.034-1.167 1.026 0 2.79-.496 3.921-1.1 1.131-.606 4.14-1.453 6.685-1.883 4.181-.707 3.834-.794-3.601-.9-8.298-.118-15.794 1.576-26.271 5.938-2.475 1.031-7.988 2.168-12.25 2.527-4.263.359-7.75.96-7.75 1.335 0 1.798 2.687 3.157 5 2.528 1.375-.373 5.65-.887 9.5-1.14zm-203.882-11.44c-1.747-2.494-9.618-7.426-9.618-6.026 0 .756 9.584 7.956 10.807 8.12.168.022-.366-.92-1.189-2.094zm-13.673-9.431c-1.467-1.769-6.264-4.434-7.979-4.434-2.565 0 .001 2.615 4.117 4.195 5.527 2.122 5.42 2.115 3.862.239zm200.605-1.516c1.118-1.808-4.598-6.918-7.737-6.918-1.547 0-2.813.173-2.813.385 0 .44 2.11 4.492 3.314 6.364.986 1.533 6.316 1.658 7.236.17zm-292.71-7.997c6.753-3.374 7.757-4.921 3.195-4.921-2.875 0-10.035 5.068-10.035 7.103 0 1.244-.043 1.258 6.84-2.182zM25.721 98.023c2.355-2.56 7.783-15.58 6.874-16.488C30.641 79.581 18 93.44 18 97.536c0 3.463 4.71 3.76 7.721.487zM69.3 41.541c2.32-1.256 6.497-1.874 15.2-2.25 12.974-.56 16.34-2.3 5.5-2.844-9.169-.46-23.842 2.852-24.754 5.588-.553 1.66.255 1.562 4.054-.494zm2.2-12.268c1.786-.767 1.712-.866-.69-.93-1.481-.038-2.97.38-3.31.93-.738 1.194 1.222 1.194 4 0zM97 27.172c.275-.082-1.525-.51-4-.95-6.762-1.203-13.145-1.017-16.5.481-2.676 1.195-1.759 1.3 8.5.979 6.325-.199 11.725-.428 12-.51zm1009.369 355.961c-1.727-2.218-2.35-4.754-1.323-5.388.527-.325 1.422.628 1.989 2.12 1.226 3.226.827 5.186-.666 3.268zm6.233-4.017c-.881-1.258-1.582-3.2-1.558-4.315.032-1.476.596-.981 2.072 1.817 2.282 4.325 1.938 5.998-.514 2.498zM644 373.305c0-.533.675-.71 1.5-.393.825.316 1.5.752 1.5.968 0 .217-.675.394-1.5.394s-1.5-.436-1.5-.97zm480.89-4.235c-.648-1.212-1.738-4.25-2.422-6.75-.684-2.5-1.567-5.334-1.963-6.296-.437-1.063-.272-1.75.42-1.75.625 0 1.39.787 1.698 1.75.309.962 1.644 4.28 2.969 7.375 1.324 3.093 2.408 6.13 2.408 6.75 0 1.896-1.863 1.25-3.11-1.08zm-458.37-22.307c-3.29-2.47-6.273-4.49-6.63-4.49-1.255 0-18.78-20.724-21.668-25.624-5.27-8.936-6.61-14.652-6.302-26.875.66-26.179.618-26.576-3.745-35.686-7.132-14.895-16.083-23.94-31.6-31.934C583.254 215.292 569 203.98 569 200.271c0-.549-.509-.997-1.13-.997-1.15 0-.924 2.192 1.08 10.5 2.92 12.11 7.248 37.074 6.879 39.679-.664 4.682-12.398 1.512-19.379-5.236-1.677-1.62-7.977-5.129-14-7.795-17.815-7.886-21.148-9.868-28.755-17.093-6.814-6.473-14.704-18.06-21.486-31.556-7.422-14.77-14.477-22.454-12.715-13.851 1.184 5.78.795 10.341-1.618 19.009-1.201 4.313-2.452 9.867-2.78 12.342-.496 3.749-.988 4.556-2.941 4.833-1.902.269-2.216.742-1.662 2.5 3.791 12.038-5.89 6.197-12.591-7.598-2.004-4.124-2.033-4.655-.653-12.06 1.638-8.79.785-10.621-2.21-4.75-3.384 6.632-2.905 16.871.961 20.575 6.094 5.839 3.122 8.507-3.803 3.414L448 209.1v2.98c0 5.026-2.665 4.814-8.126-.647-4.15-4.15-4.876-5.451-4.89-8.767-.02-5.35-1.62-7.808-2.499-3.84-1.087 4.915-1.367 5.448-2.856 5.448-1.494 0-3.629-4.863-3.629-8.266 0-1.081-.752-4.084-1.671-6.672l-1.672-4.706 3.808-6.169c4.743-7.684 5.012-7.9 12.127-9.754 6.869-1.789 10.105-4.104 20.362-14.57 17.292-17.644 25.907-15.092 46.046 13.638 3.025 4.316 8.195 10.356 11.488 13.422 3.293 3.067 7.927 7.489 10.296 9.826 4.058 4.003 9.216 5.81 9.216 3.229 0-4.559-6.473-14.474-14.465-22.157-4.76-4.577-9.532-9.73-10.603-11.452-10.037-16.134 5.224-30.493 22.66-21.32 7.618 4.006 11.778 3.782 12.211-.66.44-4.523-3.47-8.647-10.797-11.387-7.098-2.655-11.826-2.341-22.865 1.516-10.412 3.637-12.664 3.38-17.692-2.019-2.353-2.526-5.096-4.5-6.255-4.5-5.125 0-10.095-3.545-10.162-7.25-.025-1.372.808-1.75 3.859-1.75 2.14 0 5.852-.89 8.25-1.978 2.397-1.087 5.766-1.987 7.487-2 4.57-.032 6.31-2.528 3.63-5.208-2.573-2.573-10.691-2.764-17.612-.415-7.563 2.568-10.456.539-9.675-6.786.29-2.716-1.694-3.58-8.26-3.597-6.27-.017-13.711-2.977-13.711-5.454 0-3.625 1.223-4.562 5.958-4.562 6.066 0 10.363-1.52 16.259-5.753 2.594-1.862 7.318-4.394 10.498-5.626 3.897-1.51 5.895-2.871 6.133-4.18.537-2.96 4.043-6.251 8.05-7.556 1.98-.646 6.007-2.887 8.946-4.98 14.126-10.06 30.833-8.58 47.853 4.239 8.503 6.404 39.934 7.933 52.553 2.556 4.914-2.093 4.81-2.503-2.307-9.092-7.11-6.583-7.377-6.617-16.313-2.089-7.8 3.952-13.76 4.518-18.93 1.797-1.76-.927-5.9-2.435-9.2-3.352-5.201-1.446-6-1.987-6-4.066 0-2.53 2.52-2.781 16.977-1.696 5.807.436 5.557-1.937-.678-6.442-7.174-5.183-10.445-5.605-18.63-2.404-9.55 3.736-12.486 4.173-14.196 2.112-1.252-1.508-1.102-1.953 1.307-3.873 3.368-2.686 3.433-3.595.255-3.595-5.856 0-4.932-6.077 1.223-8.048 3.691-1.182 8.242-4.547 8.242-6.095 0-.438-1.591-.736-3.537-.663-4.201.158-5.753-1.109-5.298-4.324.556-3.92 6.685-6.104 19.037-6.782 6.49-.356 11.193-1.08 11.95-1.838 4.371-4.377 15.223 1.196 19.708 10.122 3.638 7.239 7.776 11.397 14.972 15.043C612.2 29.408 622 37.813 622 39.697c0 1.23 4.256 6.256 21.5 25.392 4.95 5.494 10.681 12.014 12.736 14.49C660.834 85.119 668 99.244 668 102.767c0 6.271-12.794 12.864-32.05 16.516-7.434 1.41-20.958 8.144-23.63 11.767-9.468 12.83-9.55 26.978-.199 34.263 2.409 1.876 7.933 6.46 12.277 10.186 4.344 3.726 8.268 6.775 8.72 6.775 1.714 0 20.275 19.782 24.394 26 9.587 14.468 12.382 21.872 14.912 39.5 4.833 33.687 22.595 61.777 46.576 73.663 6.862 3.401 10 5.595 10 6.991 0 3.065-13.421-3.328-23.14-11.022-21.928-17.36-33.26-36.177-37.414-62.133a3093.28 3093.28 0 0 0-2.605-16c-1.453-8.712-13.835-32-17.014-32-1.712 0-.142 5.716 2.554 9.297 5.576 7.407 10.632 23.209 13.982 43.704 2.618 16.018 5.928 26.334 10.804 33.674 2.494 3.754 4.943 7.588 5.442 8.52 3.027 5.65 24.568 26.154 31.214 29.71 1.197.641 2.177 1.6 2.177 2.13 0 1.791-2.636.982-5-1.534-1.292-1.375-2.905-2.5-3.585-2.5-1.598 0-10.446-6.864-17.255-13.386-14.334-13.728-23.758-32.009-26.094-50.616-.917-7.304-1.534-8.998-3.275-8.998-1.307 0-.325 19.255 1.3 25.5a264.5 264.5 0 0 1 1.822 7.5c.43 1.925 2.865 6.65 5.411 10.5 11.236 16.986 11.178 16.921 28.676 32.008 7.762 6.692 7.578 6.492 5.943 6.492-3.567 0-20.104-13.913-29.486-24.807-12.21-14.178-16.97-26.726-17.901-47.193-.606-13.33-2.824-25.997-5.43-31a7428.556 7428.556 0 0 0-4.723-9.053c-6.68-12.778-21.43-26.428-38.613-35.732-13.072-7.078-15.474-8.132-14.333-6.286 1.118 1.81 12.569 9.07 14.304 9.07 1.647 0 7.728 4.586 13.924 10.5 2.305 2.2 5.996 5.711 8.202 7.802 10.252 9.716 20.265 29.245 20.61 40.199.105 3.3.529 13.65.943 23l.752 17 4.42 9c4.996 10.169 14.544 22.043 21.388 26.597 2.475 1.647 5.175 3.871 6 4.944.826 1.072 4.848 3.864 8.937 6.204 7.3 4.176 9.82 6.754 6.606 6.754-.893 0-2.843-.833-4.333-1.852a510.229 510.229 0 0 0-4.817-3.25c-12.94-8.583-30.698-25.555-35.994-34.397-5.263-8.79-6.424-14.95-6.884-36.5-.4-18.777-1.51-26.82-4.156-30.111-.614-.764-2.103-3.346-3.308-5.736-4.163-8.26-3.28-2.164 1.5 10.347 3.087 8.083 3.833 25.536 1.602 37.5-2.38 12.764 2.838 29.487 12.339 39.545 2.48 2.625 4.508 5.054 4.508 5.398 0 .344 1.463 1.468 3.25 2.498 1.788 1.03 5.54 3.94 8.34 6.466 2.8 2.526 7.863 6.131 11.25 8.011 3.388 1.88 6.16 4.043 6.16 4.805 0 2.918-13.704-5.785-24.14-15.332-16.352-14.957-19.334-18.474-22.34-26.342-1.48-3.87-3.169-7.332-3.754-7.694-1.683-1.04.074 9.748 2.044 12.544.93 1.319 2.365 3.36 3.19 4.535.825 1.174 2.4 3.652 3.5 5.504 3.747 6.31 13.75 16.55 20.884 21.374 6.734 4.555 9.373 7.7 6.44 7.677-.728-.006-4.015-2.03-7.304-4.5zm-29.442-56.811c-.77-.771-1.078-.214-1.078 1.955 0 3.947 1.403 5.36 1.828 1.84.18-1.494-.157-3.202-.75-3.795zM639 271.274c0-1.1-.45-2-1-2s-1 .9-1 2 .45 2 1 2 1-.9 1-2zm-5.588-45.25c-3.168-5.605-15.626-16.87-17.065-15.431-.709.71 15.375 16.68 16.799 16.68.535 0 .654-.562.266-1.25zm10.043-14.72c-8.723-10.797-9.832-8.691-1.289 2.448 6.352 8.284 6.27 8.207 6.644 6.27.179-.929-2.231-4.852-5.355-8.718zm-196.86-10.056c-.805-5.824-.682-7.835.722-11.75 3.037-8.476 1.554-9.77-3.407-2.974-3.792 5.193-3.628 15.292.317 19.491 3.18 3.385 3.426 2.89 2.368-4.767zm20.832 1.776c.2-.688 1.131-3.85 2.07-7.028 1.809-6.124 1.398-10.722-.957-10.722-1.98 0-2.548 1.2-4.115 8.687-.951 4.547-1.062 7.122-.362 8.43 1.153 2.155 2.829 2.47 3.364.633zm165.343-3.94c-.627-1.882-5.428-5.091-6.888-4.605-.932.311-.531 1.236 1.351 3.118 2.712 2.713 6.264 3.666 5.537 1.487zm-38.233-3.751c-.365-.59-1.985-1.757-3.6-2.592-4.014-2.076-3.788.044.267 2.51 3.261 1.984 4.527 2.015 3.333.082zM437.258 185.01c3.064-6.794 3.062-9.06-.01-7.125-4.748 2.996-6.942 9.753-4.835 14.895.643 1.57.92 1.675 1.304.493.269-.825 1.86-4.544 3.538-8.263zm158.409-12.404c-2.105-1.929-4.127-3.207-4.494-2.84-.366.366 1.056 2.244 3.16 4.173 2.105 1.929 4.127 3.207 4.494 2.84.366-.366-1.056-2.244-3.16-4.173zm-13.008-61.793c1.187-.34 4.012-3.072 6.278-6.073 6.47-8.57 9.803-9.851 26.768-10.288 17.278-.444 17.795-.776 13-8.338-1.863-2.938-5.09-8.604-7.17-12.592-4.54-8.702-5.934-9.026-11.215-2.606-10.426 12.676-27.142 24.791-39.74 28.803-4.714 1.5-8.836 3.159-9.161 3.685-1.425 2.305 4.88 6.442 11.907 7.813 4.163.812 5.25.765 9.333-.404zM540.446 86.36c.31-.503 2.475-1.225 4.81-1.606 2.334-.381 5.785-1.63 7.668-2.776s6.74-2.56 10.792-3.144c10.445-1.505 8.761-3.07-3.254-3.023-9.365.036-10.472.261-16.5 3.356-7.473 3.838-9.468 5.478-8.521 7.01.82 1.327 4.221 1.451 5.005.183zm-28.381-10.21c5.788-2.49 6.919-5.52 1.685-4.516-13.001 2.492-13.349 2.635-12.405 5.095.824 2.146 4.895 1.926 10.72-.58zm41.562-50.082c.334-.541-.407-.817-1.688-.63-1.255.184-2.456.862-2.668 1.506-.457 1.388 3.44.604 4.356-.876zm17.318-8.361c-2.88-3.47-8.128-4.878-16.895-4.531-3.579.141-1.008 2.373 3.18 2.76 1.799.167 5.295.955 7.77 1.753 6.257 2.016 7.607 2.02 5.945.018zM434 328.29c-23.14-2.376-43.21-13.995-55.197-31.955-11.048-16.553-18.278-22.4-34.524-27.921-9.841-3.344-9.245-3.304-42.279-2.835-13.08.186-21.434-4.632-27.146-15.653-2.867-5.533-1.802-5.406 3.064.364 4.158 4.932 9.81 8.488 17.392 10.943 3.142 1.018 5.931.931 15.93-.495 16.368-2.334 31.365-1.614 41.716 2.003 12.663 4.426 18.97 10.541 32.46 31.478 10.828 16.805 28.304 27.845 46.8 29.565 7.903.734 11.64 2.296 10.378 4.337-.392.633-1.023 1.08-1.403.994-.38-.086-3.616-.458-7.191-.825zm696.38-8.47c-.816-2.126.631-4.138 1.73-2.404 1.179 1.86 1.106 3.857-.141 3.857-.568 0-1.282-.654-1.589-1.453zm453.62-.053c0-.794 1.399-2.166 3.108-3.05l3.109-1.608-1.859 2.54c-2.244 3.066-4.358 4.093-4.358 2.118zm17-3.872c0-.208.787-.995 1.75-1.75 1.586-1.244 1.621-1.209.378.377-1.307 1.666-2.128 2.196-2.128 1.373zm-8.595-2.477c2.116-2.384 2.595-2.601 2.595-1.18 0 .53-1.012 1.495-2.25 2.145-2.238 1.174-2.24 1.169-.345-.965zm-762.065-3.363c-.96-1.805-2.6-4.97-3.646-7.03-2.133-4.205-15.699-19.888-28.368-32.795-4.611-4.698-10.83-11.898-13.818-16l-8.351-11.458c-4.007-5.493-12.14-22.767-12.154-25.81 0-.447-1.769-4.564-3.928-9.15-5.098-10.83-8.589-22.018-11.023-35.32-2.024-11.065-6.16-23.234-8.577-25.24-1.895-1.573-5.23-.328-6.05 2.259-1.37 4.317-.561 23.193 1.171 27.314 1.802 4.287 1.339 38.5-.637 47.017-.501 2.162-.929 6.405-.95 9.43-.072 10.138-1.049 10.187-10.072.5-18.666-20.038-30.447-37.733-35.893-53.913-4.12-12.238-7.019-18.773-8.544-19.265-.88-.284-1.028 12.56-.237 20.577.342 3.46-1.683 3.64-4.673.415-2.142-2.31-2.59-3.756-2.59-8.362 0-5.754-1.821-9.798-3.848-8.545-1.632 1.008-1.445 12.132.259 15.393.776 1.485 2.8 4.022 4.5 5.638 3.122 2.968 4.048 6.852 1.944 8.152-1.228.759-8.808-7.124-11.41-11.866-.838-1.527-1.843-5.254-2.234-8.284-.848-6.57-2.312-7.43-3.436-2.02-.74 3.566-.451 4.461 3.205 9.907 5.63 8.385 5.232 16.689-.48 10.007a1762.927 1762.927 0 0 1-5.378-6.333c-1.626-1.924-3.22-3.235-3.544-2.912-.776.776 1.34 6.988 3.064 8.99 1.454 1.691 1.87 5.921.58 5.921-2.003 0-5.481-3.578-7.662-7.882-2.944-5.809-4.837-7.482-7.508-6.634-5.162 1.638-10.926-8.985-10.497-19.344.372-8.986 2.223-11.443 10.399-13.804 7.141-2.062 7.934-2.658 13.64-10.247 5.434-7.231 10.314-10.032 17.534-10.067 11.179-.053 17.552 6.533 26.109 26.978 3.874 9.257 13.235 21.195 15.132 19.299 2.54-2.54-.715-17.517-5.775-26.563-11.97-21.406-4.936-37.288 17.38-39.242 7.85-.687 8.723-.99 11.863-4.13 3.152-3.152 3.287-3.544 1.927-5.593-3.782-5.696-5.67-6.23-24.085-6.824-26.893-.866-36.33-5.188-59.524-27.263-3.988-3.795-11.211-12.988-13.502-17.184-3.437-6.295-13.385-17.08-18.701-20.276-2.999-1.802-5.452-3.827-5.452-4.5 0-1.644 5.877-2.127 8.54-.702 1.172.627 2.357.915 2.633.64.9-.9-4.763-3.994-9.522-5.202-3.477-.883-4.651-1.658-4.651-3.07 0-4.661 15.158-1.681 20.81 4.091 1.755 1.792 5.088 4.218 7.407 5.392 2.319 1.174 4.746 3.145 5.394 4.38.648 1.236 2.575 3.827 4.283 5.756 1.709 1.93 3.852 4.63 4.763 6 1.525 2.292 1.717 2.343 2.395.644.525-1.315.025-2.467-1.736-4-1.36-1.184-3.618-3.953-5.018-6.153-4.873-7.66-10.662-13.284-15.566-15.122-7.22-2.708-8.03-5.378-1.633-5.378 4.104 0 9.603 2.616 17.987 8.556 12.407 8.79 24.132 11.254 33.997 7.147 18.87-7.858 35.8-8.73 44.917-2.314 2.1 1.479 4.649 2.144 8.5 2.22 9.19.18 9.744.305 12.818 2.891 1.915 1.612 4.2 2.5 6.427 2.5 7.37 0 12.674 4.087 10.297 7.933-.372.601 1.65 2.062 4.751 3.434 5.855 2.589 6.888 3.94 5.619 7.354-1.114 2.996-3.824 3.505-16.564 3.113l-10.848-.334v3.437c0 4.79 3.912 5.769 14.484 3.627 14.26-2.89 22.016-1.526 22.016 3.87 0 2.615-1.346 3.978-5 5.066-4.318 1.287-4.929 2.228-3.649 5.626 1.304 3.46-1.513 6.86-5.712 6.89-4.701.034-5.216 1.53-2.073 6.031 1.614 2.311 3.777 5.52 4.808 7.132 2.586 4.044 6.284 3.555 8.913-1.179 5.858-10.548 12.357-14.899 22.34-14.958 8.543-.05 12.04 1.273 20.707 7.833 3.57 2.702 8.217 5.523 10.328 6.269 4.755 1.68 33.71 1.884 35.346.248 2.422-2.422 1.407-27.357-1.486-36.484-4.641-14.645-4.327-25.17.992-33.289 4.446-6.785 17.91-6.356 30.027.956 3.277 1.978 8.659 4.706 11.959 6.062 3.3 1.356 7.35 3.094 9 3.863 1.65.77 6.484 1.611 10.742 1.872 6.26.382 8.763 1.057 13.067 3.52 8.305 4.751 9.027 5.907 8.19 13.125-1.058 9.112-4.759 9.34-7.809.481-2.263-6.573-11.108-11.417-15.626-8.558-1.863 1.179.277 4.06 3.016 4.06 6.613 0 13.57 14.552 11.022 23.055-1.392 4.645-2.091 5.35-11.475 11.555-8.708 5.76-10.497 4.886-6.214-3.032 3.185-5.889 3.2-12.468.037-17.294-2.4-3.664-3.45-1.797-3.45 6.14 0 8.705-1.7 11.57-7.976 13.451-8.234 2.467-11.304-2.527-3.807-6.191 7.206-3.522 5.364-15.306-3.065-19.606-2.209-1.127-4.298-2.505-4.643-3.063-.345-.558-1.275-1.015-2.068-1.015-2.508 0-1.565 3.663 2.059 8 4.188 5.013 4.883 11.439 1.563 14.443-2.429 2.198-3.721 1.436-4.584-2.704-1.209-5.8-9.974-18.739-12.694-18.739-1.87 0 1.483 12.358 6.511 24 5.134 11.887 5.166 38.883.051 43.127-.968.804-3.027.805-7.588.002-3.442-.605-14.359-1.022-24.259-.925-19.156.186-28.864-1.257-42.812-6.365-8.086-2.961-15.51-1.465-19.126 3.856-2.524 3.715-2.438 5.07.604 9.464 4.129 5.965 15.834 40.43 15.834 46.623 0 2.006 4.844 14.252 6.415 16.218.66.825 1.738 2.765 2.397 4.31 1.254 2.936 15.605 23.003 20.162 28.19C854.192 227.575 863 241.54 863 243.425c0 .655.762 2.033 1.694 3.062 2.363 2.611 4.43 8.789 2.938 8.78-1.39-.008-4.632-5.52-4.632-7.878 0-.948-1.62-3.274-3.6-5.17-1.98-1.895-5.355-5.92-7.499-8.946-2.144-3.025-6.381-8.425-9.417-12-12.08-14.226-18.556-22.708-20.615-27-4.62-9.626-5.865-12.692-7.307-18-.821-3.025-2.219-8.2-3.105-11.5-2.195-8.171-5.684-15.571-6.22-13.19-.223.995.307 3.592 1.179 5.77.871 2.179 1.584 5.157 1.584 6.62 0 1.462.42 4.04.935 5.73.514 1.689 1.614 5.79 2.446 9.112 1.91 7.635 11.727 28.264 14.494 30.458 10.773 8.545 51.543 65.703 43.176 60.532-1.07-.662-10.05-12.297-10.05-13.021 0-1.963-16.01-22.055-27.1-34.01-8.036-8.664-10.4-11.784-15.158-20-4.117-7.112-5.655-10.267-10.723-22l-1.295-3-.831 2.955c-.59 2.097-.425 3.405.566 4.5.769.85 2.754 5.07 4.413 9.377 1.659 4.308 4.1 9.258 5.423 11 1.325 1.742 3.201 4.742 4.17 6.667.97 1.925 2.911 4.728 4.314 6.228 1.404 1.5 3.49 4.28 4.636 6.178 1.146 1.898 6.81 8.708 12.584 15.134 17.527 19.504 21.159 24.265 20.81 27.285-.304 2.63-.366 2.6-3.566-1.734-3.24-4.387-8.176-10.2-17.784-20.951-15.898-17.787-19.474-22.301-27.632-34.89-4.106-6.335-5.463-7.363-6.421-4.866-1.553 4.046 16.205 31.569 27.647 42.85 2.64 2.604 5.106 5.754 5.478 7 .373 1.247 3.158 4.808 6.19 7.914 3.032 3.106 5.325 6.211 5.096 6.9-.24.722-2.09-.756-4.368-3.492-2.172-2.61-6.2-7.078-8.95-9.93-17.567-18.216-28.428-33.383-37.682-52.626-9.553-19.862-10.623-22.301-11.344-25.86-.844-4.163-5.021-13.742-6.351-14.564-2.277-1.407-2.067 1.702.306 4.522 1.748 2.078 2.571 4.24 2.571 6.757 0 2.035.595 4.588 1.322 5.673.727 1.085 2.32 5.074 3.54 8.866 1.22 3.791 3.089 8 4.152 9.351 1.064 1.352 2.223 4.1 2.578 6.107.975 5.524 10.047 21.81 16.33 29.31 8.493 10.143 11.56 14.055 13.591 17.338 1.021 1.65 2.75 4.011 3.843 5.247 1.092 1.235 1.696 2.535 1.343 2.888-2.22 2.221-28.47-29.84-39.255-47.946-2.56-4.297-4.862-7.603-5.117-7.348-.735.735 4.436 14.842 6.463 17.634 1.009 1.389 3.352 5.225 5.206 8.525 4.399 7.827 13.63 19.933 19.137 25.095 2.402 2.251 5.942 6.23 7.867 8.843 3.721 5.049 13.68 17.229 17.005 20.798 1.098 1.178 1.98 2.844 1.96 3.703-.026 1.077-.724.71-2.25-1.184-6.282-7.789-15.982-18.874-20.794-23.762-2.981-3.029-8.958-9.216-13.282-13.75-4.324-4.533-8.273-8.243-8.776-8.243-1.293 0 2.082 6.25 4.172 7.727.955.675 2.01 2.318 2.345 3.651.335 1.334 3.734 5.318 7.553 8.854 3.95 3.657 7.242 7.615 7.634 9.18.38 1.512 1.32 2.992 2.09 3.287.77.295 1.909 1.496 2.532 2.67 1.644 3.092-6.496-4.257-13.189-11.908-3.025-3.457-8.564-9.801-12.31-14.097-3.909-4.483-8.245-10.833-10.177-14.904-3.934-8.291-6.513-11.148-6.513-7.217 0 1.368.835 3.561 1.856 4.873 1.02 1.311 3.93 6.055 6.466 10.54 5.601 9.908 8.228 13.77 12.478 18.344l5.578 6c3.295 3.541 4.23 6.396 1.643 5.011-1.064-.57-2.292-1.67-2.728-2.445-1.661-2.956-12.727-13.762-13.062-12.756-.606 1.816 2.887 7.488 7.816 12.69 14.418 15.22 21.16 23.21 23.485 27.832 1.43 2.843 3.71 7.046 5.066 9.34 1.46 2.472 2.063 4.42 1.477 4.783-.544.336-1.775-.866-2.734-2.672zM789 223.224c0-.577-.775-2.49-1.721-4.25-1.574-2.927-1.751-3.012-2.063-1.002-.188 1.209.153 3.122.756 4.25 1.158 2.163 3.028 2.782 3.028 1.002zm-7.552-2.113c-1.399-4.408-3.447-8.72-4.433-9.328-1.806-1.117-1.081 3.6 1.17 7.604 2.35 4.184 4.385 5.258 3.263 1.724zm.136-16.041c-1.421-2.74-2.584-5.754-2.584-6.698 0-.944-.66-2.59-1.468-3.657-1.418-1.875-1.47-1.855-1.494.558-.014 1.375.572 3.645 1.302 5.044.73 1.4 1.616 3.985 1.968 5.746.352 1.761 1.44 4.427 2.416 5.925l1.776 2.722.334-2.33c.184-1.281-.828-4.57-2.25-7.31zm-8.462-2.472c-.871-1.498-1.067-1.541-1.091-.241-.032 1.684 1.019 3.2 1.727 2.491.234-.233-.053-1.246-.636-2.25zm30.878-6.89c0-1.41-.85-4.672-1.89-7.25-1.04-2.576-2.502-6.435-3.25-8.575-.748-2.14-1.81-3.715-2.36-3.5-1.58.617-.529 9.057 1.582 12.698 1.055 1.819 1.918 4.091 1.918 5.05 0 1.807 1.804 4.142 3.2 4.142.44 0 .8-1.154.8-2.564zm-39.888-18.722c-.816-.817-1.112-.705-1.112.42 0 1.989 1.345 3.333 1.842 1.842.21-.632-.118-1.65-.73-2.262zm-113.23-7.962c.075-1.741-.393-2.75-1.275-2.75-2.643 0-3.477 5.558-1.398 9.315 1.184 2.142 1.221 2.126 1.881-.815.37-1.65.727-4.238.792-5.75zm151.2-5.709c-2.741-9.022-8.191-20.899-8.814-19.205-.519 1.409 2.817 13.38 5.28 18.947.798 1.807 1.452 3.844 1.452 4.528 0 .684.78 2.356 1.734 3.716 2.691 3.836 2.847.245.347-7.986zM639.8 165.073c1.346-1.346 1.634-4.8.4-4.8-1.413 0-3.2 2.346-3.2 4.2 0 2.083 1.085 2.316 2.8.6zm75.51-91.745c2.518-.17-.994-2.055-3.83-2.055-2.18 0-4.113-.762-5.38-2.123-1.47-1.577-2.65-1.955-4.585-1.47-1.434.36-3.149.304-3.81-.126-.663-.429-2.857-.808-4.875-.842-9.54-.16-7.392-5.725 2.696-6.985 3.814-.477 5.474-1.126 5.474-2.14 0-1.192-1.047-1.324-5.75-.727-8.789 1.115-26.3.939-30.492-.308-4.909-1.46-5.966.167-2.135 3.287 3.192 2.6 23.833 9.677 35.97 12.333 6.635 1.452 9.45 1.646 16.716 1.156zm226.165-9.407c-.818-5.085-2.744-8.28-5.524-9.163-3.216-1.02-3.4.06-.63 3.7 1.388 1.823 2.846 4.665 3.24 6.315 1.501 6.292 3.947 5.577 2.913-.852zM710 57.273c0-.55-.873-1-1.94-1-1.069 0-2.22.45-2.56 1-.35.568.49 1 1.941 1 1.407 0 2.559-.45 2.559-1zm31.75-13.248c1.693-1.349 1.579-3.688-.213-4.376-1.561-.599-11.372 2.254-13.029 3.79-2.677 2.48 10.152 3.047 13.242.586zm92.867 258.698c-1.032-1.622-2.877-4.075-4.1-5.45-2.918-3.28-3.863-6-2.084-6 .753 0 2.3 1.463 3.437 3.25 1.136 1.788 2.794 4.237 3.683 5.444.888 1.206 1.463 2.983 1.277 3.95-.272 1.412-.705 1.179-2.213-1.194zm.256-13.2c-1.244-1.586-1.209-1.62.377-.377 1.666 1.306 2.196 2.127 1.373 2.127-.208 0-.996-.787-1.75-1.75zm-12.461-2.777c-1.48-1.94-2.465-3.753-2.189-4.03.695-.693 6.777 5.103 6.777 6.459 0 2.093-1.91 1.082-4.588-2.429zm26.679-4.563c-1.247-1.687-2.083-3.25-1.858-3.476.225-.225 1.43.97 2.676 2.657 1.247 1.687 2.083 3.25 1.858 3.476-.225.225-1.43-.97-2.676-2.657zm-19.591 1.09c-.34-.55-.168-1 .382-1s1.278.45 1.618 1c.34.55.168 1-.382 1s-1.278-.45-1.618-1zm8.984-13.148c-3.657-3.21-7.255-8.851-5.647-8.851 1.21 0 10.163 9.653 10.163 10.957 0 1.597-.636 1.3-4.516-2.106zm883.838-178.922c.689-5.818 1.81-7.707 3.395-5.722 1.724 2.158.121 10.201-2.118 10.632-1.736.334-1.847-.096-1.277-4.91z"/></svg>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������mitogen-0.3.9/docs/images/persistent.graphml��������������������������������������������������������0000664�0000000�0000000�00000077017�14656664731�0021174�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" standalone="no"?> <graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd"> <!--Created by yEd 3.14.4--> <key attr.name="Description" attr.type="string" for="graph" id="d0"/> <key for="port" id="d1" yfiles.type="portgraphics"/> <key for="port" id="d2" yfiles.type="portgeometry"/> <key for="port" id="d3" yfiles.type="portuserdata"/> <key attr.name="url" attr.type="string" for="node" id="d4"/> <key attr.name="description" attr.type="string" for="node" id="d5"/> <key for="node" id="d6" yfiles.type="nodegraphics"/> <key for="graphml" id="d7" yfiles.type="resources"/> <key attr.name="url" attr.type="string" for="edge" id="d8"/> <key attr.name="description" attr.type="string" for="edge" id="d9"/> <key for="edge" id="d10" yfiles.type="edgegraphics"/> <graph edgedefault="directed" id="G"> <data key="d0"/> <node id="n0"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="110.0" x="154.0" y="-296.9921875"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="41.060546875" x="34.4697265625" y="5.93359375">laptop<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="110.0" x="154.0" y="-92.9765625"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="47.072265625" x="31.4638671875" y="5.93359375">bastion<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="110.0" x="154.0" y="-266.9921875"/> <y:Fill color="#99CC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="105.537109375" x="2.2314453125" y="5.93359375">ansible-playbook<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="110.0" x="154.0" y="-62.9765625"/> <y:Fill color="#99CC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="105.537109375" x="2.2314453125" y="5.93359375">ansible-playbook<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="110.0" x="154.0" y="-236.9921875"/> <y:Fill color="#CCFFCC" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="99.513671875" x="5.2431640625" y="5.93359375">ansible_mitogen<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n5"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="110.0" x="154.0" y="-32.9765625"/> <y:Fill color="#CCFFCC" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="99.513671875" x="5.2431640625" y="5.93359375">ansible_mitogen<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n6"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="110.0" x="154.0" y="-164.984375"/> <y:Fill color="#CCFFCC" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="99.513671875" x="5.2431640625" y="5.93359375">ansible_mitogen<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n7"> <data key="d6"> <y:SVGNode> <y:Geometry height="53.24563217163086" width="65.0260009765625" x="198.9739990234375" y="-367.2275372813581"/> <y:Fill color="#CCCCFF" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" backgroundColor="#000000" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#00FF00" visible="true" width="39.33203125" x="16.680318196614678" y="8.14581955803743">bash$<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.05895077777757063" nodeRatioY="-0.3470143141172526" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:SVGNodeProperties usingVisualBounds="true"/> <y:SVGModel svgBoundsPolicy="0"> <y:SVGContent refid="1"/> </y:SVGModel> </y:SVGNode> </data> </node> <node id="n8"> <data key="d6"> <y:SVGNode> <y:Geometry height="35.484542934485205" width="32.2024545674844" x="153.99999999999997" y="-358.3469926627853"/> <y:Fill color="#CCCCFF" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="14.101227283742219" y="39.484542934485205"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:SVGNodeProperties usingVisualBounds="true"/> <y:SVGModel svgBoundsPolicy="0"> <y:SVGContent refid="2"/> </y:SVGModel> </y:SVGNode> </data> </node> <edge id="e0" source="n1" target="n1"> <data key="d10"> <y:ArcEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"> <y:Point x="209.0" y="-77.9765625"/> </y:Path> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:Arc height="0.0" ratio="1.0" type="fixedRatio"/> </y:ArcEdge> </data> </edge> <edge id="e1" source="n0" target="n0"> <data key="d10"> <y:ArcEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"> <y:Point x="209.0" y="-281.9921875"/> </y:Path> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:Arc height="0.0" ratio="1.0" type="fixedRatio"/> </y:ArcEdge> </data> </edge> <edge id="e2" source="n6" target="n1"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="15.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="10" fontStyle="bold" hasLineColor="false" hasText="false" height="4.0" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="false" width="4.0" x="-2.0" y="19.00390625"> <y:LabelModel> <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.5" segment="0"/> </y:ModelParameter> <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/> </y:EdgeLabel> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e3" source="n1" target="n3"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e4" source="n4" target="n6"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="-15.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="18.1328125" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="95.986328125" x="-47.9931640625" y="11.9375">~/.ansible/sock<y:LabelModel> <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.5" segment="0"/> </y:ModelParameter> <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/> </y:EdgeLabel> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e5" source="n7" target="n6"> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="55.0" ty="0.0"> <y:Point x="280.5" y="-340.60472119554265"/> <y:Point x="280.5" y="-149.984375"/> </y:Path> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> </graph> <data key="d7"> <y:Resources> <y:Resource id="1"><?xml version="1.0" encoding="utf-8"?> <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="65px" height="53px" viewBox="-0.811 -0.063 65 53" enable-background="new -0.811 -0.063 65 53" xml:space="preserve"> <defs> </defs> <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="220.9624" y1="824.415" x2="220.9624" y2="801.0922" gradientTransform="matrix(1 0 0 1 -195.2002 -770.8008)"> <stop offset="0.0319" style="stop-color:#808080"/> <stop offset="0.1229" style="stop-color:#939393"/> <stop offset="0.2702" style="stop-color:#ABABAB"/> <stop offset="0.4266" style="stop-color:#BCBCBC"/> <stop offset="0.5968" style="stop-color:#C6C6C6"/> <stop offset="0.8061" style="stop-color:#C9C9C9"/> </linearGradient> <path fill="url(#SVGID_1_)" d="M51.333,51.918c0.195,0.459-0.053,0.836-0.553,0.836H0.58c-0.5,0-0.604-0.272-0.232-0.605 l8.023-7.191c0.373-0.334,1.086-0.605,1.586-0.605h37.255c0.498,0,1.065,0.377,1.265,0.836L51.333,51.918z"/> <path fill="none" stroke="#8D8D8D" stroke-width="0.25" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d=" M51.333,51.918c0.195,0.459-0.053,0.836-0.553,0.836H0.58c-0.5,0-0.604-0.272-0.232-0.605l8.023-7.191 c0.373-0.334,1.086-0.605,1.586-0.605h37.255c0.498,0,1.065,0.377,1.265,0.836L51.333,51.918z"/> <path fill="#717171" d="M32.117,50.571c0,0.25-0.205,0.454-0.455,0.454H4.024c-0.25,0-0.304-0.139-0.119-0.307l5.638-5.154 c0.184-0.17,0.539-0.309,0.789-0.309h21.332c0.25,0,0.454,0.205,0.454,0.455L32.117,50.571L32.117,50.571z"/> <path fill="#717171" d="M40.738,50.598c0.086,0.236,0.359,0.428,0.609,0.428h7.465c0.25,0,0.375-0.188,0.279-0.42l-2.049-4.93 c-0.098-0.229-0.379-0.42-0.629-0.42h-7.17c-0.25,0-0.386,0.191-0.301,0.428L40.738,50.598z"/> <path fill="#717171" d="M32.89,50.571c0,0.25,0.205,0.454,0.455,0.454h6.135c0.25,0,0.382-0.189,0.293-0.426l-0.156-0.409 c-0.089-0.233-0.365-0.421-0.615-0.416l-1.045,0.021c-0.25,0.004-0.509-0.189-0.574-0.432l-0.021-0.082 c-0.065-0.242-0.321-0.439-0.571-0.439h-1.316c-0.25,0-0.444,0.205-0.432,0.453l0.002,0.059c0.016,0.25-0.181,0.455-0.431,0.459 l-1.269,0.021c-0.25,0.006-0.454,0.211-0.454,0.461L32.89,50.571L32.89,50.571z"/> <path fill="#717171" d="M32.89,47.004c0,0.25,0.205,0.455,0.455,0.455h4.845c0.25,0,0.396-0.195,0.323-0.437l-0.402-1.333 c-0.07-0.238-0.335-0.438-0.585-0.438h-4.181c-0.25,0-0.455,0.205-0.455,0.455V47.004z"/> <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="535.2017" y1="-1418.6563" x2="511.4634" y2="-1418.6563" gradientTransform="matrix(1 0 0 -1 -488 -1376.627)"> <stop offset="0" style="stop-color:#4D4D4D"/> <stop offset="1" style="stop-color:#999999"/> </linearGradient> <path fill="url(#SVGID_2_)" d="M47.048,40.514c0,0.965-6.758,1.404-12.371,1.404c-3.889,0-10.914-0.348-11.367-1.267 c0,0.446,0,1.502,0,1.661c0,0.725,4.803,1.234,11.357,1.234c6.554,0,12.381-0.643,12.381-1.361 C47.048,42.028,47.048,40.977,47.048,40.514z"/> <path fill="#808080" d="M35.179,39.307c6.556,0,11.869,0.584,11.869,1.307c0,0.721-5.313,1.42-11.869,1.42 c-6.701,0-11.869-0.697-11.869-1.42S28.625,39.307,35.179,39.307z"/> <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="525.7661" y1="-1412.6865" x2="520.77" y2="-1412.6865" gradientTransform="matrix(1 0 0 -1 -488 -1376.627)"> <stop offset="0" style="stop-color:#999999"/> <stop offset="0.0417" style="stop-color:#8D8D8D"/> <stop offset="0.1617" style="stop-color:#717171"/> <stop offset="0.2821" style="stop-color:#5D5D5D"/> <stop offset="0.4021" style="stop-color:#515151"/> <stop offset="0.5212" style="stop-color:#4D4D4D"/> <stop offset="0.6202" style="stop-color:#565656"/> <stop offset="0.7817" style="stop-color:#6E6E6E"/> <stop offset="0.9844" style="stop-color:#969696"/> <stop offset="1" style="stop-color:#999999"/> </linearGradient> <path fill="url(#SVGID_3_)" d="M37.734,40.896c0,0-1.477,0.096-2.498,0.096s-2.499-0.096-2.499-0.096v-9.768h4.997V40.896z"/> <radialGradient id="SVGID_4_" cx="415.8687" cy="-1386.5146" r="24.0778" gradientTransform="matrix(1.15 0 0 -1 -453.4719 -1376.627)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#F2F2F2"/> <stop offset="1" style="stop-color:#666666"/> </radialGradient> <path fill="url(#SVGID_4_)" d="M9.453,2.122c0-1.1,0.9-2,2-2h48.246c1.1,0,2,0.9,2,2v30.073c0,1.101-0.9,2-2,2H11.453 c-1.1,0-2-0.899-2-2V2.122z"/> <path fill="none" stroke="#666666" stroke-width="0.2436" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d=" M9.453,2.122c0-1.1,0.9-2,2-2h48.246c1.1,0,2,0.9,2,2v30.073c0,1.101-0.9,2-2,2H11.453c-1.1,0-2-0.899-2-2V2.122z"/> <radialGradient id="SVGID_5_" cx="402.1509" cy="-1378.3662" r="53.3339" fx="444.1083" fy="-1385.5538" gradientTransform="matrix(1.1935 0 0 -1 -443.5655 -1376.627)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#4D4D4D"/> <stop offset="1" style="stop-color:#999999"/> </radialGradient> <path fill="url(#SVGID_5_)" d="M10.475,3.143c0-1.1,0.9-2,2-2h46.429c1.1,0,2,0.9,2,2v27.805c0,1.1-0.9,2-2,2H12.475 c-1.1,0-2-0.9-2-2V3.143z"/> <radialGradient id="SVGID_6_" cx="402.939" cy="-1378.4502" r="34.1874" gradientTransform="matrix(1.1923 0 0 -1 -443.8286 -1376.627)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#9CD7FF"/> <stop offset="1" style="stop-color:#3C89C9"/> </radialGradient> <path fill="url(#SVGID_6_)" d="M11.043,3.598c0-1.1,0.9-2,2-2h45.294c1.1,0,2,0.9,2,2v26.895c0,1.1-0.9,2-2,2H13.043 c-1.1,0-2-0.9-2-2V3.598z"/> <path opacity="0.24" fill="#F2F2F2" d="M11.043,24.936V3.598c0-1.1,0.9-2,2-2h45.294c1.1,0,2,0.9,2,2v13.539l-23.164,4.94 c-1.064,0.273-2.836,0.547-3.935,0.609L11.043,24.936z"/> <path fill="#C9C9C9" d="M58.777,46.596c-0.003-0.002-0.005-0.002-0.007,0c-0.188-0.061-0.429-0.254-0.702-0.482 C58.335,46.268,58.578,46.436,58.777,46.596z"/> <radialGradient id="SVGID_7_" cx="450.8638" cy="1259.1514" r="6.3766" gradientTransform="matrix(1 0 0 1 -390.4004 -1211.6016)" gradientUnits="userSpaceOnUse"> <stop offset="0.1939" style="stop-color:#C9C9C9"/> <stop offset="0.3299" style="stop-color:#C6C6C6"/> <stop offset="0.4405" style="stop-color:#BCBCBC"/> <stop offset="0.5421" style="stop-color:#ABABAB"/> <stop offset="0.6378" style="stop-color:#939393"/> <stop offset="0.697" style="stop-color:#808080"/> </radialGradient> <path fill="url(#SVGID_7_)" d="M58.77,46.596c0.005,0.002,0.007,0.002,0.009,0.002c0.002,0.004,0.006,0.004,0.006,0.004 c0.084,0.023,0.153,0.021,0.213-0.021c0.017-0.008,0.026-0.021,0.037-0.041c0.604-0.119,1.329-0.154,2.197-0.086 c2.032,1.545,3.77,4.625,1.18,5.801c-2.048,0.929-3.543,0.783-4.722-0.485c-0.624-0.675-1.239-1.47-1.729-2.265 C56.226,48.369,56.855,47.061,58.77,46.596z"/> <radialGradient id="SVGID_8_" cx="603.5698" cy="1426.6348" r="3.8245" gradientTransform="matrix(0.9761 0.2173 -0.1478 0.6641 -320.0412 -1031.1759)" gradientUnits="userSpaceOnUse"> <stop offset="0.1939" style="stop-color:#C9C9C9"/> <stop offset="0.3739" style="stop-color:#C6C6C6"/> <stop offset="0.5203" style="stop-color:#BCBCBC"/> <stop offset="0.6549" style="stop-color:#ABABAB"/> <stop offset="0.7816" style="stop-color:#939494"/> <stop offset="0.8364" style="stop-color:#868787"/> </radialGradient> <path fill="url(#SVGID_8_)" d="M55.96,49.504c-0.893-1.438-1.355-2.869-0.664-3.533c0.244-0.236,0.539-0.422,0.863-0.559 c0.6,0.051,1.307,0.346,1.9,0.691c0.002,0,0.005,0.004,0.007,0.006c0.272,0.229,0.519,0.426,0.702,0.482 C56.855,47.061,56.226,48.369,55.96,49.504z"/> <radialGradient id="SVGID_9_" cx="448.7241" cy="1259.3271" r="3.928" gradientTransform="matrix(1 0 0 1 -390.4004 -1211.6016)" gradientUnits="userSpaceOnUse"> <stop offset="0.1939" style="stop-color:#C9C9C9"/> <stop offset="0.3496" style="stop-color:#C6C6C6"/> <stop offset="0.4761" style="stop-color:#BCBCBC"/> <stop offset="0.5925" style="stop-color:#ABABAB"/> <stop offset="0.702" style="stop-color:#939393"/> <stop offset="0.7697" style="stop-color:#808080"/> </radialGradient> <path fill="url(#SVGID_9_)" d="M56.16,45.414c1.353-0.564,3.287-0.266,4.963,0.955c0.035,0.025,0.073,0.055,0.109,0.084 c-0.867-0.068-1.818-0.033-2.427,0.086c-0.109-0.105-0.763-0.449-0.744-0.434C57.464,45.758,56.757,45.463,56.16,45.414z"/> <path fill="none" stroke="#717171" stroke-width="0.1136" stroke-linecap="round" stroke-miterlimit="10" d="M56.16,45.414 c1.353-0.564,3.287-0.266,4.963,0.955c0.035,0.025,0.073,0.055,0.109,0.084c2.032,1.545,3.77,4.627,1.18,5.801 c-2.048,0.93-3.543,0.785-4.722-0.484c-0.624-0.676-1.239-1.471-1.729-2.264c-0.892-1.438-1.354-2.871-0.664-3.533 C55.541,45.734,55.835,45.549,56.16,45.414z"/> <path fill="none" stroke="#717171" stroke-width="0.1136" stroke-linecap="round" stroke-miterlimit="10" d="M58.777,46.596 c0.083-0.021,0.168-0.041,0.258-0.057c0.604-0.119,1.329-0.154,2.197-0.086"/> <path fill="none" stroke="#717171" stroke-width="0.1136" stroke-linecap="round" stroke-miterlimit="10" d="M55.958,49.516 c0-0.002,0.002-0.008,0.002-0.012c0.269-1.135,0.896-2.441,2.813-2.908"/> <path fill="none" stroke="#717171" stroke-width="0.1136" stroke-linecap="round" stroke-miterlimit="10" d="M58.061,46.105 c-0.597-0.35-1.306-0.643-1.901-0.693"/> <path fill="none" stroke="#717171" stroke-width="0.1136" stroke-linecap="round" stroke-miterlimit="10" d="M58.779,46.598 c0-0.002,0-0.002-0.002-0.002c-0.199-0.16-0.441-0.328-0.709-0.482"/> <path fill="#4D4D4D" d="M58.259,45.936c0.354,0.264,0.438,0.48,0.548,0.604c-0.091,0.018-0.173,0.033-0.259,0.059 c-0.355-0.393-0.996-0.666-0.955-0.727C57.688,45.729,58.063,45.791,58.259,45.936z"/> </svg> </y:Resource> <y:Resource id="2"><?xml version="1.0" encoding="utf-8"?> <svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="57px" height="65px" viewBox="0 0 57 65" enable-background="new 0 0 57 65" xml:space="preserve"> <g> <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3398" y1="3115.7266" x2="27.5807" y2="3145.5239" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)"> <stop offset="0.2711" style="stop-color:#FFAB4F"/> <stop offset="1" style="stop-color:#FFD28F"/> </linearGradient> <path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> <path id="body_18_" fill="#ECECEC" stroke="#9B9B9B" stroke-miterlimit="10" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51 c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-11.244-6.146-11.244-6.146 c-1.771,1.655-5.61,3.802-10.063,3.802c-4.453,0-8.292-2.146-10.063-3.802c0,0-5.755,0.586-11.189,6.021 C1.378,56.689,0.5,62.768,0.5,62.768z"/> <radialGradient id="SVGID_2_" cx="22.6621" cy="21.707" r="17.7954" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#FCB57A"/> <stop offset="1" style="stop-color:#FF8C36"/> </radialGradient> <path fill="url(#SVGID_2_)" stroke="#E55E03" d="M28.106,33.486c-8.112,0-12.688,4.313-12.688,10.438 c0,7.422,12.688,10.438,12.688,10.438s14.688-3.016,14.688-10.438C42.793,38.75,36.215,33.486,28.106,33.486z M26.288,53.051 c0,0-7.135-2.093-8.805-7.201c-0.222-0.682,0.147-1.156,0.795-1.521V37.8h20.188v6.663c0.235,0.352,1.109,0.737,1.229,1.387 C40.445,49.917,26.288,53.051,26.288,53.051z"/> <radialGradient id="SVGID_3_" cx="15.2056" cy="831.1875" r="32.3071" gradientTransform="matrix(1 0 0 1 0.0801 -773.6914)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#FCB57A"/> <stop offset="1" style="stop-color:#FF8C36"/> </radialGradient> <path fill="url(#SVGID_3_)" stroke="#E55E03" d="M49.529,51.225c-2.239-2.24-5.041-3.724-7.396-4.67 c-2.854,5.51-14.021,7.807-14.021,7.807s-10.472-2.483-12.387-8.514c-2.439,0.771-5.787,2.287-8.749,5.25 c-5.592,5.592-6.47,11.67-6.47,11.67c0,1.938,1.575,3.492,3.523,3.492h48.51c1.946,0,3.521-1.558,3.521-3.492 C56.055,62.768,54.211,55.906,49.529,51.225z"/> <radialGradient id="SVGID_4_" cx="17.0723" cy="18.4907" r="11.8931" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#FCB57A"/> <stop offset="1" style="stop-color:#FF8C36"/> </radialGradient> <path fill="url(#SVGID_4_)" stroke="#E55E03" d="M13.404,44.173c1.15-1.81,2.039-3.832,3.332-5.397 c-0.514,1.027-1.669,4.084-1.669,5.148c0,5.186,10.366,9.079,14.688,10.438c-3.472,1.627-9.134-1.498-11.334-2.359 c-3.601-1.419-4.071-3.063-5.89-4.854C12.523,47.135,12.878,45,13.404,44.173z"/> <radialGradient id="SVGID_5_" cx="31.8184" cy="19.3525" r="14.63" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#FCB57A"/> <stop offset="1" style="stop-color:#FF8C36"/> </radialGradient> <path fill="url(#SVGID_5_)" stroke="#E55E03" d="M45.777,43.924c-1.317-1.568-5.11-9.424-6.604-6.617 c0.516,1.025,3.617,3.693,3.617,6.617c0,5.186-10.271,8.576-16.699,9.145c1.429,4.938,11.373,1.293,13.805-0.313 c3.563-2.354,4.563-5.133,7.854-3.705C47.754,49.045,48.006,46.574,45.777,43.924z"/> <radialGradient id="SVGID_6_" cx="30.4893" cy="4.8721" r="5.2028" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#FCB57A"/> <stop offset="1" style="stop-color:#FF8C36"/> </radialGradient> <path fill="url(#SVGID_6_)" stroke="#E55E03" d="M30.777,54.167c0.357,0.836-0.153,1.983-0.352,2.813 c-0.256,1.084-0.072,2.104,0.102,3.186c0.164,1.02,0.156,2.107,0.25,3.167c0.082,0.916,0.482,1.849,0.357,2.75"/> <radialGradient id="SVGID_7_" cx="23.2871" cy="5.3008" r="5.5143" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#FCB57A"/> <stop offset="1" style="stop-color:#FF8C36"/> </radialGradient> <path fill="url(#SVGID_7_)" stroke="#E55E03" d="M23.695,53.417c-0.508,0.584-0.476,2.209-0.398,3 c0.116,1.183,0.456,2.099,0.333,3.333c-0.192,1.943,0.154,4.479-0.436,6.333"/> <radialGradient id="face_x5F_white_1_" cx="27.5835" cy="3117.4922" r="23.425" fx="23.0139" fy="3115.0024" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#FFD28F"/> <stop offset="1" style="stop-color:#FFAB4F"/> </radialGradient> <path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 c0.086,10.2-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 C36.627,4.945,43.59,13.158,43.676,23.357z"/> <linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="6468.501" y1="-12291.5195" x2="6492.1304" y2="-12384.9688" gradientTransform="matrix(0.275 0 0 -0.2733 -1752.8849 -3351.7349)"> <stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> <stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> </linearGradient> <path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M28.415,5.625c-6.035,0.047-10.747,4.493-12.787,10.386 c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.54,13.244,36.729,5.56,28.415,5.625z"/> <path id="Hair_Young_Black_1_" fill="#5C5C5C" stroke="#353535" stroke-linecap="round" stroke-linejoin="round" d="M20.278,13.25 c3.417,4.333,9.333,6.917,9.333,6.917l-1.417-3.5c0,0,7.094,4.691,8.083,4.333c0.968-0.2-1.082-3.807-1.082-3.807 s3.138,1.795,4.854,3.969c1.803,2.28,4.285,3.504,4.285,3.504S47.027,2.719,27.289,2.744C8.278,2.709,12.058,27.678,12.058,27.678 L14.695,17c0,0,0.914,5.757,1.399,4.875C17.861,15.211,18.861,11.5,20.278,13.25z"/> </g> </svg> </y:Resource> </y:Resources> </data> </graphml> �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mitogen-0.3.9/docs/images/persistent.svg������������������������������������������������������������0000664�0000000�0000000�00000312117�14656664731�0020332�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="308.156" height="864" viewBox="0 0 231.117 648"><defs><symbol overflow="visible" id="a"><path d="M1.344 0v-15h1.843V0zm0 0"/></symbol><symbol overflow="visible" id="b"><path d="M8.469-1.344c-.68.586-1.336.996-1.969 1.235A5.666 5.666 0 0 1 4.469.25c-1.188 0-2.106-.29-2.75-.875C1.07-1.207.75-1.953.75-2.859c0-.532.117-1.016.36-1.454.25-.445.566-.8.952-1.062.395-.27.836-.473 1.329-.61.363-.093.91-.187 1.64-.28 1.489-.176 2.582-.383 3.282-.626.007-.257.015-.421.015-.484 0-.75-.172-1.281-.515-1.594-.481-.414-1.184-.625-2.11-.625-.867 0-1.508.156-1.922.469-.406.305-.71.84-.906 1.61l-1.797-.25c.156-.77.422-1.391.797-1.86.375-.477.914-.844 1.625-1.094.719-.258 1.54-.39 2.469-.39.926 0 1.68.109 2.265.328.582.219 1.008.496 1.282.828.27.324.46.742.578 1.25.062.312.094.875.094 1.687v2.47c0 1.71.035 2.792.109 3.25.082.448.238.882.469 1.296H8.844a3.678 3.678 0 0 1-.375-1.344zm-.156-4.11c-.668.274-1.668.509-3 .704-.762.105-1.297.227-1.61.36-.312.136-.558.34-.734.609-.168.261-.25.547-.25.86 0 .5.187.913.562 1.233.375.325.914.485 1.625.485.707 0 1.336-.149 1.89-.453.552-.313.958-.739 1.22-1.282.195-.414.296-1.03.296-1.843zm0 0"/></symbol><symbol overflow="visible" id="c"><path d="M1.375 4.156v-15.015h1.688v1.406c.394-.55.835-.961 1.328-1.235.5-.28 1.101-.421 1.812-.421.938 0 1.758.242 2.469.718.707.48 1.238 1.157 1.594 2.032.363.867.546 1.812.546 2.843 0 1.118-.203 2.121-.609 3.016-.398.887-.976 1.57-1.734 2.047C7.707.016 6.91.25 6.079.25a3.49 3.49 0 0 1-1.657-.39 3.658 3.658 0 0 1-1.203-.985v5.281zm1.672-9.531c0 1.398.281 2.434.844 3.11.57.667 1.257 1 2.062 1 .82 0 1.524-.344 2.11-1.032.582-.695.874-1.773.874-3.234 0-1.383-.289-2.422-.859-3.11-.574-.687-1.258-1.03-2.047-1.03-.781 0-1.476.37-2.078 1.108-.605.731-.906 1.793-.906 3.188zm0 0"/></symbol><symbol overflow="visible" id="d"><path d="M5.406-1.64l.266 1.624a7.413 7.413 0 0 1-1.39.157c-.669 0-1.188-.106-1.563-.313A1.792 1.792 0 0 1 1.938-1c-.149-.352-.22-1.082-.22-2.188v-6.25H.376v-1.421h1.344v-2.704l1.828-1.093v3.797h1.86v1.421h-1.86v6.36c0 .523.031.86.094 1.015.07.149.18.266.328.36.144.086.351.125.625.125.207 0 .476-.02.812-.063zm0 0"/></symbol><symbol overflow="visible" id="e"><path d="M.703-5.438c0-2.007.555-3.5 1.672-4.468.938-.801 2.078-1.203 3.422-1.203 1.488 0 2.707.492 3.656 1.468.945.98 1.422 2.329 1.422 4.047 0 1.407-.215 2.512-.64 3.313A4.453 4.453 0 0 1 8.405-.406a5.315 5.315 0 0 1-2.61.656c-1.523 0-2.75-.488-3.687-1.469C1.172-2.195.703-3.602.703-5.437zm1.89 0c0 1.399.302 2.446.907 3.141.602.688 1.367 1.031 2.297 1.031.906 0 1.66-.347 2.266-1.046.613-.696.921-1.758.921-3.188 0-1.344-.308-2.36-.921-3.047-.606-.695-1.36-1.047-2.266-1.047-.93 0-1.695.352-2.297 1.047-.605.688-.906 1.727-.906 3.11zm0 0"/></symbol><symbol overflow="visible" id="f"><path d="M3.078 0H1.375v-15h1.844v5.36c.77-.977 1.758-1.47 2.969-1.47.664 0 1.296.137 1.89.407a3.933 3.933 0 0 1 1.485 1.14c.382.481.687 1.07.906 1.766.219.688.328 1.422.328 2.203 0 1.867-.465 3.309-1.39 4.328C8.487-.254 7.382.25 6.093.25c-1.282 0-2.29-.535-3.016-1.61zm-.015-5.516c0 1.305.175 2.246.53 2.829.571.949 1.352 1.421 2.345 1.421.812 0 1.507-.347 2.093-1.046.582-.696.875-1.739.875-3.126 0-1.425-.281-2.472-.844-3.14-.562-.676-1.242-1.016-2.03-1.016-.813 0-1.512.352-2.095 1.047-.585.7-.874 1.711-.874 3.031zm0 0"/></symbol><symbol overflow="visible" id="g"><path d="M.64-3.25l1.829-.281c.101.73.383 1.293.844 1.687.468.387 1.124.578 1.968.578.844 0 1.469-.171 1.875-.515.414-.344.625-.75.625-1.219 0-.414-.183-.742-.547-.984-.25-.157-.882-.364-1.89-.625C4-4.941 3.066-5.234 2.547-5.484c-.524-.25-.918-.594-1.188-1.032a2.756 2.756 0 0 1-.406-1.468c0-.477.11-.922.328-1.329.219-.414.52-.765.907-1.046.289-.207.68-.383 1.171-.532a5.713 5.713 0 0 1 1.594-.218c.852 0 1.602.125 2.25.375.645.242 1.117.574 1.422 1 .3.418.516.976.64 1.671l-1.812.25c-.086-.562-.324-1-.719-1.312-.386-.313-.937-.469-1.656-.469-.844 0-1.45.14-1.812.422-.356.281-.532.61-.532.985 0 .23.07.445.22.64.155.2.39.36.702.484.188.075.735.231 1.64.47 1.302.355 2.208.64 2.72.859.507.218.91.543 1.203.968.3.418.453.946.453 1.579 0 .617-.184 1.195-.547 1.734-.355.543-.871.965-1.547 1.266-.68.289-1.437.437-2.281.437C3.879.25 2.8-.04 2.063-.625 1.32-1.219.847-2.094.64-3.25zm0 0"/></symbol><symbol overflow="visible" id="h"><path d="M1.39-12.875V-15h1.844v2.125zM1.39 0v-10.86h1.844V0zm0 0"/></symbol><symbol overflow="visible" id="i"><path d="M1.375 0v-10.86h1.656v1.532c.801-1.188 1.957-1.781 3.469-1.781a4.42 4.42 0 0 1 1.797.359c.55.23.96.54 1.234.922.27.375.461.828.578 1.36.063.343.094.937.094 1.78V0H8.375v-6.61c0-.75-.074-1.304-.219-1.671a1.786 1.786 0 0 0-.765-.89 2.389 2.389 0 0 0-1.282-.345c-.78 0-1.46.25-2.03.75-.575.5-.86 1.446-.86 2.829V0zm0 0"/></symbol><symbol overflow="visible" id="j"><path d="M8.813-3.5l1.906.234c-.305 1.118-.86 1.98-1.672 2.594-.805.617-1.84.922-3.11.922-1.585 0-2.843-.488-3.78-1.469C1.226-2.195.765-3.57.765-5.344c0-1.82.468-3.238 1.406-4.25.945-1.008 2.172-1.515 3.672-1.515 1.445 0 2.629.496 3.547 1.484.925.992 1.39 2.383 1.39 4.172 0 .105-.008.266-.015.484H2.672c.062 1.2.394 2.117 1 2.75.613.637 1.375.953 2.281.953.676 0 1.254-.175 1.734-.53.477-.352.852-.923 1.125-1.704zM2.766-6.469h6.078c-.086-.914-.32-1.601-.703-2.062-.586-.707-1.344-1.063-2.282-1.063-.843 0-1.558.29-2.14.86-.574.562-.89 1.32-.953 2.265zm0 0"/></symbol><symbol overflow="visible" id="k"><path d="M.672-4.5v-1.86h5.656v1.86zm0 0"/></symbol><symbol overflow="visible" id="l"><path d="M1.297 4.188l-.203-1.735c.406.113.758.172 1.062.172.406 0 .727-.074.969-.219.25-.136.453-.324.61-.562.113-.188.3-.649.562-1.375.031-.106.082-.258.156-.453L.343-10.86h1.985l2.25 6.28c.29.806.555 1.641.797 2.516a23.73 23.73 0 0 1 .75-2.468l2.328-6.328h1.844L6.157.187c-.438 1.188-.782 2.008-1.032 2.47-.324.6-.7 1.046-1.125 1.327-.43.282-.934.422-1.516.422-.355 0-.75-.074-1.187-.218zm0 0"/></symbol><symbol overflow="visible" id="m"><path d="M1.39 0v-15h1.844v8.547l4.36-4.406h2.375l-4.14 4.03L10.39 0H8.125L4.531-5.563l-1.297 1.25V0zm0 0"/></symbol><symbol overflow="visible" id="n"><path d="M-.313 4.156V2.828h12.204v1.328zm0 0"/></symbol><symbol overflow="visible" id="o"><path d="M1.375 0v-10.86h1.656v1.516a3.924 3.924 0 0 1 1.36-1.281c.562-.32 1.207-.484 1.937-.484.8 0 1.457.168 1.969.5.52.336.883.804 1.094 1.406.863-1.27 1.984-1.906 3.359-1.906 1.07 0 1.898.296 2.484.89.582.594.875 1.516.875 2.766V0h-1.843v-6.844c0-.738-.059-1.27-.172-1.593a1.53 1.53 0 0 0-.656-.782 2.029 2.029 0 0 0-1.094-.297c-.774 0-1.414.258-1.922.766-.5.512-.75 1.324-.75 2.438V0H7.844v-7.063c0-.812-.153-1.421-.453-1.828-.305-.414-.797-.625-1.485-.625-.511 0-.992.137-1.437.407-.438.273-.758.671-.953 1.203-.2.523-.297 1.277-.297 2.265V0zm0 0"/></symbol><symbol overflow="visible" id="p"><path d="M1.047.906l1.781.266c.082.55.29.953.625 1.203.457.344 1.082.516 1.875.516.852 0 1.508-.172 1.969-.516.469-.344.785-.824.953-1.438.094-.375.133-1.16.125-2.359C7.57-.472 6.57 0 5.375 0c-1.5 0-2.664-.535-3.484-1.61C1.078-2.69.67-3.987.67-5.5c0-1.031.188-1.984.563-2.86.375-.874.914-1.55 1.625-2.03.72-.477 1.555-.72 2.516-.72 1.29 0 2.348.516 3.172 1.547v-1.296h1.703v9.39c0 1.688-.172 2.883-.516 3.594-.343.707-.89 1.266-1.64 1.672-.742.406-1.656.61-2.75.61-1.305 0-2.356-.294-3.157-.876-.792-.586-1.171-1.46-1.14-2.625zm1.516-6.531c0 1.43.28 2.469.843 3.125a2.73 2.73 0 0 0 2.14.969c.845 0 1.552-.32 2.126-.969.57-.656.86-1.676.86-3.063 0-1.332-.298-2.335-.891-3.015-.586-.676-1.293-1.016-2.125-1.016-.825 0-1.524.336-2.094 1-.574.668-.86 1.656-.86 2.969zm0 0"/></symbol><symbol overflow="visible" id="q"><path d="M1.375 0v-15h1.844v5.39c.863-1 1.945-1.5 3.25-1.5.812 0 1.515.165 2.11.485.593.313 1.015.75 1.265 1.313.258.554.39 1.359.39 2.421V0H8.391v-6.89c0-.915-.204-1.583-.61-2-.398-.426-.96-.641-1.687-.641a2.91 2.91 0 0 0-1.532.437c-.48.281-.824.668-1.03 1.156-.212.481-.313 1.149-.313 2V0zm0 0"/></symbol><symbol overflow="visible" id="r"><path d="M5.219 2.156V.312C4.3.196 3.55-.004 2.969-.296c-.574-.3-1.074-.781-1.5-1.437C1.05-2.398.812-3.207.75-4.156l1.844-.36c.144.993.398 1.72.765 2.188.52.656 1.141 1.023 1.86 1.094v-5.86c-.762-.144-1.54-.441-2.328-.89a3.384 3.384 0 0 1-1.36-1.344c-.312-.582-.468-1.242-.468-1.985 0-1.312.46-2.374 1.39-3.187.625-.54 1.547-.875 2.766-1v-.875h1.078v.875c1.07.105 1.922.418 2.547.938.812.667 1.297 1.585 1.453 2.75l-1.89.296c-.118-.726-.345-1.285-.688-1.671-.344-.383-.82-.633-1.422-.75v5.296c.926.243 1.539.422 1.844.547.57.25 1.039.559 1.406.922.363.367.64.797.828 1.297.195.492.297 1.027.297 1.61 0 1.273-.406 2.335-1.219 3.187C8.641-.223 7.586.234 6.297.297v1.86zm0-16.125c-.719.117-1.29.406-1.703.875a2.4 2.4 0 0 0-.61 1.64c0 .626.172 1.153.516 1.579.351.418.953.75 1.797 1zM6.297-1.234a2.776 2.776 0 0 0 1.781-.938c.469-.531.703-1.187.703-1.969 0-.664-.168-1.203-.5-1.609-.336-.406-.996-.77-1.984-1.094zm0 0"/></symbol><symbol overflow="visible" id="s"><path d="M.89-5.703v-2.094c.72-.82 1.665-1.234 2.844-1.234.407 0 .832.062 1.282.187.457.117 1.101.352 1.937.703.469.2.817.329 1.047.391.238.063.477.094.719.094.437 0 .89-.13 1.36-.39.476-.27.905-.602 1.28-1v2.155c-.437.418-.882.72-1.328.907-.449.18-.953.265-1.515.265-.407 0-.797-.047-1.172-.14-.367-.094-.953-.32-1.766-.688-.805-.363-1.476-.547-2.016-.547-.437 0-.851.094-1.234.282-.387.187-.867.558-1.437 1.109zm0 0"/></symbol><symbol overflow="visible" id="t"><path d="M0 .25l4.344-15.5h1.484L1.484.25zm0 0"/></symbol><symbol overflow="visible" id="u"><path d="M1.906 0v-2.094H4V0zm0 0"/></symbol><symbol overflow="visible" id="v"><path d="M8.469-3.984l1.812.234c-.199 1.25-.703 2.23-1.515 2.938-.813.71-1.813 1.062-3 1.062-1.493 0-2.688-.484-3.594-1.453C1.266-2.18.812-3.578.812-5.391c0-1.175.192-2.203.579-3.078.394-.883.988-1.547 1.78-1.984a5.32 5.32 0 0 1 2.595-.656c1.187 0 2.156.296 2.906.89.75.594 1.226 1.446 1.437 2.547l-1.796.281c-.168-.726-.47-1.273-.907-1.64-.43-.375-.949-.563-1.562-.563-.93 0-1.684.336-2.266 1-.574.656-.86 1.711-.86 3.156 0 1.461.274 2.524.829 3.188.562.656 1.289.984 2.187.984.727 0 1.332-.218 1.813-.656.488-.445.797-1.133.922-2.062zm0 0"/></symbol><clipPath id="w"><path d="M274.441 77H388v93H274.441zm0 0"/></clipPath><image id="x" width="950" height="778" xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAA0JCgsKCA0LCwsPDg0QFCEVFBISFCgdHhghMCoyMS8qLi00O0tANDhHOS0uQllCR05QVFVUMz9dY1xSYktTVFH/2wBDAQ4PDxQRFCcVFSdRNi42UVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVH/wAARCAMKA7YDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD06iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKbJIkUbSSMFRAWYnsBQBHd3cFlbtPcSCONe57+wrkL7xPf3zmPTk8iLpvPLH/CqOo30uu35kYlbWM4RPb/E1IihFCqAAO1AFV7We4bfdXUkje5J/nSDTIv77/pV0UoFAFL+zIv77/pR/ZcX/PR/0q+BSgUAUP7Ki/56P+lL/ZUX/PR/0q+BSgUAUP7Jh/56P+lH9kQ/89H/AErRxSgUAZ39kQ/89H/Sl/seH/npJ+laNKBQBm/2ND/z0k/Sl/saH/nrJ+laWKXFAGZ/YsH/AD1k/Sl/sWD/AJ6yfpWnilxQBl/2JB/z1k/Sl/sSD/nrJ+lamKXFAGV/YcH/AD1k/Sl/sOD/AJ6yfpWrijFAGV/YcH/PWT9KP7Dg/wCesn6VrYoxQBlf2FB/z1k/Sj+woP8AnrJ+la2KMUAZP9hQf89ZP0o/sKD/AJ6yfpWvijFAGR/YUH/PWT9KP7Bg/wCesn6Vr4oxQBkf2DB/z1k/Sj+woP8AnrJ+la+KMUAZH9hQf89ZP0o/sKD/AJ6yfpWvijFAGR/YUH/PWT9KP7Cg/wCesn6VrYoxQBkf2HB/z1k/Sj+w4P8AnrJ+la2KMUAZP9hwf89ZP0pP7Eg/56yfpWtikxQBlf2JB/z1k/Sk/sSD/nrJ+la2KTFAGV/YsH/PWT9KT+xYP+esn6Vq4pMUAZf9jQ/89JP0pP7Hh/56SfpWpikxQBl/2PD/AM9H/Sj+yIf+ej/pWmRSUAZn9kQ/89H/AEpP7Jh/56P+laZFNxQBnf2VF/z0f9KT+yov+ej/AKVokUhFAGd/ZcX/AD0f9KT+zIv77/pWiRTSKAKH9mRf33/Sk/s2P++/6VfpDQBQ/s6P++1J/Z8f99qvEUhoApf2fH/fak+wR/32q7TTQBT+wx/3mpPsSf3mq4aaaAKn2NP7zUn2NP7zVbNIaAKn2RP7zUfZV/vGrJpDQBW+zL/eNJ9nX1NWDSGgCv5C+ppPIX1NTmkNAEHkj1NJ5Q9TUxpDQBD5Y9TSbB61KaaaAGbBSbaeaaaAG4pKcabQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABVy01W/smBt7qRQP4Scr+R4qnRQB2+j+LYrhlg1BVhkPAkH3T9fSun615DXW+EdcYSLpt0+VPELHsf7v+FAHY0UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXOeNb1odPjtEPzXDc4/uj/wCviujrivFzGTxDbRn7qxg/jkn/AAoApQRCKJUHbr9alFIKd0oAQkKMk4FV5LrtGPxNRTymRsD7o6U2ONpXCoMmjcNhWmlPVz+HFIHkPRmP41ow2MaAGT52/SrSgKMAAD2rdUW9zCVdLYxf3/8A00/WjM//AE0/WtulqvYLuT7d9jDzP/00/WjNx6yfrW5S0ewXcPbvsYWbj1k/WjNx6y/rW7S0ewXcPbvsYObn1l/WjNz6y/rW9RR7Bdw9u+xg5ufWX9aM3PrL+tb9LR7DzD277HP7rr1l/Wjddesv610FFHsPMPbvsc/uuvWb9aTddes3610VLS9j5h7d9jnN116zfrS7rv1m/WuipaPY+Ye3fY5vdd+s360brv1m/WukFLR7HzD277HNbrv1m/Wjdd+s3610tLR7HzD277HM7rv1m/Wk3XnrP+Zrp6Wj2PmP2z7HL7rz1n/Wjdees/611ApaPY+Ye2fY5bdees/60ZvPWf8AWuppaPY+Ye2fY5XN56z/AK0mbz1n/Wusoo9j5h7Z9jk83nrP+tGbz1n/AFrrKWj2PmHtvI5LN56z/rRm89Z/1rraWj2PmHtvI5HN5/03/Wk/0z/pv+tdfS0vY+Ye28jj/wDTP+m/60f6Z/03/WuwpaPY+Ye28jjcXn/Tf9aMXn/Tf9a7Klo9j5h7byOMxeek/wCtGLz0n/WuzpaPY+Ye28ji8XnpP+tJtvPSf9a7aij2XmHtvI4nbef3Z/yNG28/uzfka7eij2XmHtvI4fbd/wB2b8jRtu/7s35Gu4oo9l5h7byOH2Xf92b8jSbLv+7N+RruKSj2XmHtvI4jZd/3ZvyNGy6/uzfka7eko9j5h7byOI2XX92b8jRsuv7k35Gu2oo9j5h7byOJ8u6/uTfkaTy7r+5L+RrtqKPY+Ye28jifLuf7kv5Gjy7n+5L+RrtqSj2PmHtvI4ny7n+5L+Ro8u5/uS/ka7akp+x8w9t5HE+Vc/8APOX8jR5Vx/zzl/I12tFHsfMPbeRxXlXH/POT8jSeVcf885PyNdtSUex8w9t5HFeVcf8APOT8jR5M/wDzzk/75NdoaKPY+Ye2fY4ryZ/+ecn/AHyaPJn/AOeUn/fJrtaSj2PmHtn2OL8mf/nlJ/3yaTyZ/wDnlJ/3ya7Sij2PmHtn2OL8ib/nlJ/3yaPIm/55P/3ya7Oij2PmL277HF+RN/zyf/vk0eRN/wA8n/75NdpSUex8w9u+xxnkTf8APJ/++TR5E3/PJ/8Avk12dJR7HzD277HG+RN/zyf/AL5NJ5M3/PJ/++TXZUUex8w9u+xxvkzf88n/AO+TR5M3/PJ/++TXY0U/YeYe3fY47yZv+eT/APfJpPJm/wCeT/8AfJrsaKPYeYe3fY47yZv+eT/98mjyZv8Ank//AHya7Cij2C7h7d9jj/Jm/wCeT/8AfJo8mb/nk/8A3ya6+ij2C7h7d9jjWVlOGBH1FJk+tdkVDDDAEehqhdaTbzglB5T+q9PyqXRfQpV11OdDetOzmnXVtLaybJVx6EdDUIOKxatubJ32JKVWZGDKSGByCOxpKKQz1LSLz7fpdvdfxOvzf7w4P6irlc54HkLaPKh/gmOPoQK6OgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK4nxR/yM8P8A1yH9a7auJ8Uf8jPD/wBch/WgCAVFdNtiwOrVMKrXn3lHtQBWALEADJPFa9tAIIwP4j1NUdPj3T7j0UZ/GtSumjHTmOatLXlClpKWug5wpaSloAKWkpaAClpKWkAUUUUALS0lLQAUUUUDFpaSlpAFLSUtAAKWkFLQAUtJS0AFLSUUALS0lLQMKWkpaAFooooAKWkopALS0lLQAUtJS0AFLSUUALS0lFAC0tJRSAWlpKKBjqKSigBaKSigApKKKBCUUUUwEooooASiiigBKKKKACkpaQ0AJRRRQAUlLSUwENFBooAKSlpKAEooooEJRRRQAUlLSUAFJS0lAhKKKKYxKKKKBCUUUUAJRRRQAlFFFACUUUUwILu2S6hMbj6H0NctNE0MrRuMMpwa6+sPX4QsscwH3hg/hWFaN1zG9GVnymWh7U6mL1p9cp1HceBf+QZcf9dv6CumrmfAv/IMuP8Art/QV01ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVxPij/AJGiH/rkP6121cT4n/5GiH/rkP60ARCqt799fpVsVUvfvr9KAJdMHEh+lX6o6Z92T6ir1dtL4EcVX42FLSUtaGYUtJRQAtFFFAC0tJS0gCiiigBaWkooAWiiigBaKKKBi0tJS0gAUtJS0AFFFFAC0UUUALS0lLQMKUUlFAC0tJS0AFFFFIBaWkooAWiiigBaKKKAFopKWgBaKSloAKWkopALRSUUALRSUUALSUUUAFJRRTAKSlpKACiikoAKKKKAEoopKACiiimAUlLSUAJRRRQAlFFFAhKKKKAEooooAKSiigApKKKAEpKWkpgFFFFAhKKKKAEooooASiiigBKKKKYCVma+P9DjP/TQfyNadZmvf8eSf9dB/I1nU+Fl0/iRgr1p9MX71PriO47jwL/yDLj/AK7f0FdNXM+Bf+QZcf8AXb+grpqACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArifE//ACNEP/XIf+zV21cT4n/5GiH/AK5D/wBmoAYKp3331+lXBVS+/wBYv0oAl0z7sn1FXqo6Z92T6irtdtL4EcVX42LS0lLWhmFFFFAC0UUUALRRRSAWiiigBaKKKAFooooAWikpaBi0tJRSAWlpKBQAtFFFAC0UUUALRSUtAC0UUUDFpaaKWgBaKKKAClpKWkAtFJS0AFLSUUALRRRQAtFJS0AFLSUUALRSUUALRSUUAFFFFABRSUUAFFFFABSUUUAFJS0lABSUUUAFFFFMBKQ0tJQAUUUlABSUtJQIKSlpKACiiigBDRRRQAlFFJQAUlLSUwCiiigQlJS0lABRRRQAlFFFMBKKKKAErM17/jyT/roP5GtOszXv+PJP+ug/kazqfCy6fxIwU+9T6Yn3qfXEdx3HgX/kGXH/AF2/oK6auZ8C/wDIMuP+u39BXTUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXFeJv+Roh/65D/ANmrta4rxN/yNMP/AFyH/s1ADBVO/wD9Yv0q6KpX/wDrF+lAEum/dk+oq7VHTfuyfUVertpfAjiq/GxaWkorQzFooooAWiiigBaKSloAWiiikAUtJS0ALRSUtABS0lLQMKWkpaQC0UUUALRRRQAUtJS0AFLSUUALS0lLQMKWkooAdRSUtABRRRQAtFJS0gFopKWgApaSigBaKSloAKKKKAClpKKAFpKKKACiiigAopKKACiiigAoopKACkoooAKKKKYBSUUUAIaKKKACkoooAKSiigQUlFFABRRSGgAoopKACkpaSgApKKKYBSUtJQIKSlpKACiikoAKSlpKYBSUtJQAVma//wAeSf8AXQfyNadZmv8A/Hkn/XQfyNZ1PhZdP4kYKfep9MT71PriO47jwL/yDLj/AK7f0FdNXM+Bf+QZcf8AXb+grpqACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArivE3/ACNMP/XIf+zV2tcV4m/5GmH/AK5D/wBmoAaKpX/+sX6VeFUr/wD1ifSgB+m/dk+oq9VLTfuyfUVdrtpfAjiq/GxaKSlrQzFooooAKWkpaAClpKWgApaSlpAFLSUUALS0lLQAUUUUALS0lFAxaWkpaQAKWkooAWiiigBaKSloAWikpaAFopKWgYUtJRQA6ikpaACiiigBaKSikA6ikooAWikpaACiiigAooooAKKKKACiiigAoopKAFpKM0UAFJRRQAUUUUwCkoooAKSiigAoopKACkpaSgQUUUlABRRRQAUlBooAKSiigBKKKSmAUUUUCCkoooASiiigApKWkoAKSiimAUlLSUAFZmv/APHkn/XQfyNadZmv/wDHkn/XQfyNRU+Fl0/iRgp96n0xPvU+uE7juPAv/IMuP+u39BXTVzPgX/kGXH/Xb+grpqACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArivE3/I0w/9ch/7NXa1xXiX/kaYf+uQ/wDZqAEFUtQ/1ifSroqlqH+sT6UASab92T6irtUtN+7J9RV2u2l8COKr8bClpKWtDMKWkpaAClpKKAFooooAWlpKKQDZporeJpZ5UijXq7sFA/E1U/tnSf8AoJ2f/f8AX/GqPjT/AJFW9/4B/wChrXldYzqOLsbU6akrnsf9s6T/ANBSz/7/AK/40f21pP8A0FLP/v8Ar/jXjlFR7d9jT2C7nsn9taT/ANBSz/7/AK/40f21pP8A0FLP/v8Ar/jXjdFHt32D2C7nsn9taT/0FLP/AL/r/jS/21pP/QUs/wDv+n+NeNUUe2fYPYLuey/21pP/AEFLP/v+n+NL/bWk/wDQUsv+/wCn+NeM0Ue2fYPYLuezf21pP/QUsv8Av+n+NH9taT/0FLL/AL/p/jXjNFHtn2D2C7ns/wDbekf9BSy/7/p/jR/bekf9BSy/7/p/jXjFFHtn2D2C7ns/9t6R/wBBSy/7/p/jS/23pH/QVsv/AAIT/GvF6KPbPsHsV3PaP7b0j/oK2X/gQn+NH9t6R/0FbL/wIT/GvF6KPbPsHsV3Paf7b0j/AKCtl/4EJ/jR/bekf9BWy/8AAhP8a8Woo9s+wexXc9q/tvSP+grZf+BCf40f23pH/QVsv/AhP8a8Voo9s+wexXc9q/tzSP8AoK2X/gQn+NL/AG5pH/QVsv8AwIT/ABrxSil7Z9g9iu57X/bmj/8AQVsv/AhP8aP7c0f/AKCtl/4EJ/jXilFHtn2D2K7ntf8Abmj/APQVsv8AwIT/ABpf7c0f/oK2X/gQn+NeJ0Ue2fYPYrue2f25o/8A0FbL/wACE/xo/tzR/wDoK2X/AIEJ/jXidFHtn2D2K7ntn9uaP/0FbL/wIT/Gj+3NH/6Ctl/4EJ/jXidFHtn2D2K7ntv9uaP/ANBWy/8AAhP8aP7c0f8A6Ctl/wCBCf414lRR7Z9g9iu57b/bmj/9Bay/8CE/xo/tzR/+gtZf+BCf414lRR7Z9g9iu57b/bmj/wDQWsv/AAIT/Gj+3NH/AOgtZf8AgQn+NeJUUe2fYPYrue2/25o//QVsv/AhP8aP7c0f/oK2X/gQn+NeJUUe2fYPYrue2f25o/8A0FbL/wACE/xo/tzR/wDoK2X/AIEJ/jXidFHtn2D2K7ntn9uaP/0FbL/wIT/Gj+3NH/6Ctl/4EJ/jXidFHtn2D2K7ntn9uaP/ANBWy/8AAhP8aT+3NH/6Ctl/4EJ/jXilFHtn2D2K7ntf9uaP/wBBWy/8CE/xo/tzSP8AoK2X/gQn+NeKUUe2fYPYrue1/wBuaR/0FbL/AMCE/wAaT+29I/6Ctl/4EJ/jXitFP2z7B7Fdz2r+29I/6Ctl/wCBCf40f23pH/QVsv8AwIT/ABrxWij2z7B7Fdz2n+29I/6Ctl/4EJ/jR/bekf8AQVsv/AhP8a8Woo9s+wexXc9o/tvSP+grZf8AgQn+NH9t6R/0FbL/AMCE/wAa8Xoo9s+wexXc9o/tvSP+grZf+BCf40n9t6R/0FLL/v8Ap/jXjFFHtn2D2K7ns/8Abekf9BSy/wC/6f40f23pH/QUsv8Av+n+NeMUUe2fYPYLuezf21pP/QUsv+/6f40f21pP/QUsv+/6f414zRR7Z9g9gu57N/bWk/8AQUs/+/6f40n9taT/ANBSz/7/AKf4141RR7Z9g9gu57J/bWk/9BSz/wC/6/40f21pP/QUs/8Av+v+NeN0Ue2fYPYLueyf21pP/QUs/wDv+v8AjT4dT0+4mWKC/tpZG6IkqsT+ANeMVueC/wDkarL/AIH/AOgNTVZt2sKVFJXueq0lLSV0HMFFFFACUUUUwEooooASiiigArL17/jyT/roP5GtSsvXv+PJP+ug/kaip8LLp/EjCT71Ppifep9cJ3HceBf+QZcf9dv6CumrmfAv/IMuP+u39BXTUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXFeJf+Rph/65D/2au1rivEv/ACNMH/XIf+zUAAqjqH+sT6VeFUdQ/wBYn0oAfp33ZPqKvVR077sn1FXa7aXwI4qvxsWiiitDMWlpKKAFooooAWikpaAClpKWgDE8Z/8AIq3v/AP/AENa8rr1Pxn/AMire/8AAP8A0Na8srkrfEddH4QooorE2CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArc8F/8jVZf8D/APQGrDrc8F/8jVZf8D/9Aaqh8SJn8LPVKKKK7jgCkpaSgApKWkpgFJS0lABRRRQAlZmvf8eSf9dB/I1p1ma9/wAeSf8AXQfyNRU+Fl0/iRhJ96n0xPvU+uE7juPAv/IMuP8Art/QV01cz4F/5Blx/wBdv6CumoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACuK8S/8AI0wf9ch/7NXa1xXiX/kaYf8ArkP/AGagAFUdQ/1ifSrwqjqH+sT6UAP077sn1FXapad92T6irtdtL4EcVX42LRRRWhmFLSUtAC0UlLQAUtJRQAtFFFAGJ4z/AORVvP8AgH/oa15ZXqfjP/kVbz/gH/oa15ZXJW+I66PwhRRRWJsFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABW54L/5Gqy/4H/6A1Ydbngv/AJGqy/4H/wCgNVQ+JEz+FnqlFFJXccAUUUlMAooooASiiigApKWkoAKzNd/48k/66D+RrSrN13/jyT/roP5GoqfCy6fxIwk+9T6Yv3qfXCdx3HgX/kGXH/Xb+grpq5nwL/yDLj/rt/QV01ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVxXiX/kaYf+uQ/9mrta4rxL/wAjTD/1yH/s1ACCqWof6xPpV0VS1D/WJ9KAH6d91/qKu1S077r/AFFXK7qXwI4qvxsWlpKKszFooooAWiiigBaKKKAClpKWgDE8Z/8AIrXn/AP/AENa8sr1Pxn/AMitef8AAP8A0Na8srkrfEddD4QooorE2CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArc8F/8jVZf8D/APQGrDrc8F/8jVZf8D/9Aaqh8SJn8LPVKSiiu44ApKKKYBSUUUAFFFJQAUUUlABWbrv/AB5J/wBdB/I1pVm67/x5J/10H8jUVPhZdP4kYS9afTF60+uE7juPAv8AyDLj/rt/QV01cz4F/wCQZcf9dv6CumoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACuK8Tf8jTD/ANch/wCzV2tcV4m/5GmH/rkP/ZqAEFUtQ/1ifSroqlf/AOsX6UAO0/7r/UVdqlp/3X+oq5XdS+BHDV+Ni0tJS1oQLRSUtIApaSigBaWkooAWiiigDE8Z/wDIrXn/AAD/ANDWvLa9S8Zf8itef8A/9DWvLa5K3xHXQ+EKKKKxNgooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiuk8OaBaarYSTzyTKyylAEIAxgHuD61lVqxpR5pbGNevChDnnsc3RW74m0a20j7N9neVvN3bvMIPTHTAHrWFTp1I1YqcdmOjVjWgpw2YUUUVoahRRRQAUUUUAFbngz/karP/gf/oDVh1ueDP8AkarP/gf/AKA1VD4kTP4Wep0lFFd5wBRRSUAFFFFABSUUUAFJRRQAVm67/wAeSf8AXQfyNaVZmu/8eaf9dB/I1FT4WXT+JGGvWn0xetPrhO47jwL/AMgy4/67f0FdNXM+Bf8AkGXH/Xb+grpqACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArivE3/I0w/wDXIf8As1drXFeJv+Rph/65D/2agBoqnf8A+sX6VbFU77/WL9KAH6f91/wq5VOw+6/4VcrupfAjhq/GxaKSlrQzFopKWkMWiiigBaKSloAWikpaAMTxl/yK15/wD/0Na8tr1Lxl/wAitef8A/8AQ1ry2uSt8R10PhCiiisTYKciNI6oilmY4CgZJPpTauaR/wAhix/67x/+hCpk7RbJnLli32D+ytS/6B91/wB+W/wpkun3sEZkms7iNB1Z42AH44r1SsfxX/yLl1/wD/0Na8mnmMpzUeXdnh0c2nUqRg4rVpHnVFFFewe8FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFWYtPvZ4xJDZ3EiHoyRsQfxxVavRfCn/ACLlr/wP/wBDauXF13QgpJX1OLG4l4amppX1scN/ZWpf9A+6/wC/Lf4VVdGjdkdSrKcFSMEH0r1uvLtX/wCQxff9d5P/AEI1lhMXLESaatYxwOOlipNNWsU6KKK7z0wooooAKKKKACiiigAooooAK0tN0S/1LDQRbYj/AMtZOF79PXpjjNb/AIe8MIIxdalFudsFIW/h92Hr7fn7dZXlYjMFB8tLV9zxcXmqg3Cjq+/Q5C08F/ca7vPXckS/lhj+Hauj0zTrfS7X7Pb7ypYsS5yST/8AqFXKarqxYKwJU4YA9DjOD+BH515lXE1aqtN6HjVsXWrq05aFHVtHtdWSNbgyKYySrIcHnqOc+g/KsC78F/fa0vPTakq/nlh+PautLqHCFhuIJC55IGMn9R+dOop4mrSVovQKOMr0UlCWh5fqOlXumvi5hIXOBIOVbr3/AA6HmqVetSxRzxmOaNZEPVXGQfwrhPEfh9tNc3NsC1ox+pjPofb0P4H39fC45VXyT0Z7uCzJV3yVNJfgzAooor0T1gooooAK3PBn/I02f/A//QGrDrc8Gf8AI02f/A//AEBqqHxImfws9SoopK7zgCiiigApKKKACkoooAKKKSgArN1z/jzT/roP5GtKs3XP+PNP+ug/kaip8LLp/EjDXrT6YvWn1wncdx4F/wCQZcf9dv6CumrmfAv/ACDLj/rt/QV01ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVxPib/kaIf8ArkP/AGau2rifE/8AyNEP/XIf+zUANFU77/WL9Ktiql7/AKxfpQA+w+6/4VcqnYfdf8Kt13UvgRw1fjYtFFFaGYtLSUUDFpaSikAtFFFAC0UlLQBieMv+RWvP+Af+hrXl1eo+Mv8AkVrz/gH/AKGteXVyV/iOuh8IUUUVibBVzSP+QxY/9d4//QhVOrmkf8hix/67x/8AoQqKnwP0M6vwS9Geo1j+K/8AkXLr/gH/AKGtbFY/iv8A5Fy6/wCAf+hrXzGH/iw9V+Z8bhf48PVfmedUUUV9UfbBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXovhT/kXLX/gf/obV51XovhT/kXLX/gf/obV5uZ/wl6/ozyM4/gL1/RmxXl2r/8AIYvv+u8n/oRr1GvLtX/5DF9/13k/9CNc2V/HL0OTJv4kvQp0UUV7Z9EFFFFABRRRQAUUUUAFdH4Q0n7Xdfbph+5gb5MNjMgwR+A6/l15rnK9K8OWy2uh2qrgl0EjELjJbnn6AgfhXDj6zp0rLd6Hm5nXdKjaO70NOqGr6rb6Va+dMdztxHGDy5/w9TV+vOfE2oSX2ryow2pbs0SKDnoeT9T/AIeleRhKHt6lnstzwsDhfrFW0tluM1PX7/UJHzM8UJyBFG2Bg9j/AHvx9+ldN4H/AOQPN/13P/oK1wtd14H/AOQPN/13P/oK16eOhGGHtFW2PZzGnCnheWCsroq+OnaN9PdGKspchgcEH5eapaH4nuLaZYb+V5rc8b25ZPfPUj/I9Db8ef8ALh/20/8AZa5GnhaUKuGjGa7/AJseDoU62DjGa7/mz1tHWRFdGDKwyGByCPWh0WRGR1DKwwVIyCPSuX8E6g0kMunyMP3Q3xDHOCfm5+pH5/l1VeNWpOjUcH0PnsRReHqum+h5fq9g2m6lLbHO0HKMf4lPQ9PwPuDVKuu8dWv/AB63ap6xO2fxUY/76rka+iw1X2tJSZ9Zg63tqMZvcKKKK6DqCtzwZ/yNNn/wP/0Bqw62/Bv/ACNNn/wP/wBAaqh8SJn8LPUqKKK7zgCkoooAKSlpKACiiigBKKKSgArO1z/jzT/roP5GtGs3W/8AjzT/AK6D+RqKnwsun8SMVetOpq9adXCdx3HgX/kGXH/Xb+grpq5nwL/yDLj/AK7f0FdNQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFcT4n/wCRoh/65D/2au2rifE//I0Q/wDXIf1oAjFVL3/WL9Ktiql599fpQBJYfdf8Kt1UsPuv+FW67qXwI4avxsWikpa0MwpaSigBaWkooGLS0lFIBaKKKAMXxl/yK95/wD/0Na8ur1Hxl/yK95/wD/0Na8urkr/EddD4QooorE2Crmkf8hix/wCu8f8A6EKp1c0j/kMWP/XeP/0IVFT4H6GdX4JejPUax/Ff/IuXX/AP/Q1rYrH8V/8AIuXX/AP/AENa+Yw/8WHqvzPjcL/Hh6r8zzqitrQ/D1xqm2dz5VruwW/ib12/yz/PGK7PT9F0/TiHt7ceaAB5j/M3TGeemc9sV7tfHU6L5d2fS4nMaVBuO7PN4Lee5cpBDJKwGSqKWOPXimyxSQSGOaN43HVXGCPwr1qiuP8AtR3+H8f+AcH9tO/waev/AADyKivTrrRtNu8+dZREltxZRtYn3IwTXIa14ZudPDT25NxbAFmOMMgz3HfjuPfgV10cdTqvlejO7D5lRrPlej8zAoooruPSCiiigAoorc0rwze6gizSEW8DDIdhksOeQv8Ajjrxms6lSFNc03Yyq1oUY81R2Rh0V6PZ+HNKtAMWwmbBBab588+nT9K04oo4IxHDGsaDoqDAH4V508zgvhjf8DyZ5zBfBFv8P8zyyCyu7lC8FrNKoOCyRlhn04qOWKSCQxzRvG46q4wR+FetUVn/AGo7/D+Jks5lfWGnr/wDyKivVbqytb1NlzbxyjBA3LkjPXB7fhWFqPhCzmTdYsbeQDhSSyt19eR25/St6eZU5aTVjppZvSnpNW/Ff18jh6Ks39jcafdNbXKbXXkEdGHqPaq1eimpK6PWjJSXNHYKKKKYwopyI0jqiKWZjgKBkk+ldZpfg/7suoy+h8mM/Tgt+YwPzrGtXhRV5s56+Jp4dXqM5GnxRSTyCOGN5HPRUGSfwr0230jTrYIIrKEFDlWKBmBznOTzV2vOlmi+zE8qecx+xD72eUXFrc2237Rbyw7vu+YhXP0zUNeu1DcWttc7ftFvFNt+75iBsfTNKOafzR/EmOc/zQ/E8oorutR8JWU0I+w/6NKuepLK3scnj6j8jXHX9jcafdNbXKbXXkEdGHqPau+hiqdf4Xr2PUw+MpYj4Hr2e5WooorpOsK9F8Kf8i5a/wDA/wD0Nq86r0Xwp/yLlr/wP/0Nq83M/wCEvX9GeRnH8Bev6M2K8u1f/kMX3/XeT/0I16jXmV/BLdeILuCCMySPcOFUd/mNcuWO0pN9jjydpTm32M+iuz0rwhEqLLqLF3IyYVOAvXgkde3TH410lra29nCIbaFYkHZR17ZPqeOtdVXMacHaCudlbNqUHaC5vwR5etldvB56WszQ4J8wRkrgdTmoK9dpksUc8ZjmjWRD1VxkH8KwWad4/ic8c5d9Yfj/AMA8lor0C98Kabc7miV7Zzk5jPy5PqD2HoMVxOoafdadOYrmIryQrY+V/cHv1Fd9DFU6+kdz08NjaWI0jv2ZVooorqOwK9YtoVtraKBCSsSBAT1wBivJ69Q0V1fRbIowYeQgyDnkAAj868nNE+WLPDzlPkg/Uu15Reed9sn+0/6/zG8zp97PPTjrXq9ebeJLN7PW7gMciVjMp9QxJ/Q5H4Vllkkpyj3MMmmlUlHujLruvA//ACB5v+u5/wDQVrha7rwP/wAgeb/ruf8A0Fa7Mx/gfM9DNf8Ad36op+PP+XD/ALaf+y1yNdd48/5cP+2n/stcjV4H/d4/P82aZb/usfn+bL+jak+lX4uVTeNpVkzjcD74OOcH8K1bjxlfOXEEEMSkYXOWZeOuen6VzdFazw9KpLmlG7N6mFo1J8843Zdv9Wv9RREu7gyKhyFwFGfXgVSoorWMYxVoqxtGEYLlirIKKKKooK2/Bv8AyNNn/wAD/wDQGrErb8G/8jTZ/wDA/wD0BqqHxImfws9SpKKK7zgCiikoAKKKKACkoooAKSikpiCs/W/+PNP+ug/ka0Kztb/480/66D+RrOp8LNKfxIxV606mr1p1cJ3HceBf+QZcf9dv6CumrmfAv/IMuP8Art/QV01ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVxPij/AJGeH/rkP6121cT4o/5GeH/rkP60ARCqt599fpVkVVu/vr9KAJbD7r/hVuqdj91/wq3XdS+BHDV+Ni0UUVoZi0UlLQAUtJRQAtLSUUDFpaSikBi+Mf8AkV7z/gH/AKGteX16h4x/5Fe8/wCAf+hrXl9clf4jrofCFFFFYmwVc0j/AJDFj/13j/8AQhVOrmkf8hix/wCu8f8A6EKip8D9DOr8EvRnqNV720ivrVracExMQWAOM4IOP0qxRXyabTuj4eMnFprcaiLGioihVUYCgYAHpVa/1Gz05Ee7nEQc4Xgkn8BVXXtYTSLUNt3zyZEanpx1J9hkf55HnlxPLdTvPPIZJHOWY9678LgnX9+Wi/M9PBZe8T783aP5nX3HjS2Xb9ns5ZP73mMEx9MZzU9v4w06UosqTQkj5mKhlU49jk/lXCUV6Ty+g1a34nrvKsM1az+89ailjnjEkMiyIejIcg/jT6840HW5dJnwcyWzn95H6e49/wCf5EeiQypPCk0bbkkUMpxjIPIrx8ThpUJeR4GMwcsNKz1T2Zw3izRlsJ1u7ZAltKcFQfuvycAehA/n04rnq9Xu7aO8tZbaYZSRSp9vce4615dd20lndS20ww8bFT7+49j1r1sBiPaw5Jbo9zLMU60OSW6/IhoopyI0jqiKWZjgKBkk+legeqdD4T0aO/ke7uV3QxMAqHo7defYccd8/UV3VV7G2WysYbZMERIFyFxk9zj3PNWK+XxNd1qjl06HxuMxLxFVy6dBrusaM7sFVRksTgAetYl14s0u3mMamWfHVolBXP1JGfw4rlde1uXVp8DMdsh/dx+vuff+X5k5NejQy1WvV37Hq4bKY8vNWevY7STxpbCZRHZytEcbmZgGHrgc5/MVOnjHTGdVMdygJwWKDA9+DXCUV0vL6D6fidbyrDNbP7z1e1ure8hE1tMsqHup6d8H0PPSpq8rsL640+6W5tn2uvBB6MPQ+1el6feJf2EN1GMCRc49D0I/A5FeVisI6Gqd0zxMbgXhmmneLKHiTSf7UsP3YzcxZMXzYBzjI/HH549686r12vLtXi8jV7uPy/LAmbauMYGeMD0xiuzLKradN9D0MnrNqVJ7LVFOiip7GFbm/t4HJCyyqhI64JAr1m7K7Pck+VNs7bwjpQs7AXkgzNcKDyB8qdsH34P5eldBRWZ4h1BtN0mSaJgszEJHkZ5P/wBbJ59K+XlKWIq36s+LlKeKrX6yY/UNa0/TiUuLgeaAT5aDc3TOOOmc98Vky+M7IRkw21w79g+1Qfxyf5VxTu0js7sWZjksTkk+tNr2IZdSS97Vnv08poxS57tnbQeNLRkJntJo2zwEIcY+pxWrput2GpYWCXbKf+WUnDd+nr0zxmvNKcjtG6ujFWU5DA4IPrRPLqUl7ujCplNCSfJoz1us3XNKTVbBosKsy8xOw+6f8D0/XtUHhrV21WxbzsfaISFfA+8D0b8cH8q2a8VqdCpbZo+faqYarbaUTyR0aN2R1KspwVIwQfSm1v8AjGzW21jzY0KrOm8nGBuzg4/Qn6+9YFfT0qiqQU11PsaFVVaaqLqFei+FP+Rctf8Agf8A6G1edV6L4U/5Fy1/4H/6G1cOZ/wl6/ozzc4/gL1/RmxVCw0q3sbi5uVG+e4kZ2cjoCc7R7fz/LF+qmpX0WnWMlzKR8o+VScb27AfWvEg5P3I9T52m5v3IdfxLEsscEZkmkWNB1ZzgD8awpfF+lxyFVW4lA/jRBg/mQf0rj9U1S61WcS3LD5RhUXhV9cD3qlXsUctileo9T3qGUQUb1nd+R3Fv4ysXCCeCaJicNjDKvPXPX9K3bO8tr6AT2sokjyRkcYPoQeleVVZsL640+6W5tn2uvBB6MPQ+1OrlsGr09GVXymnJXpOz/A9UqhrOnJqmnPbtw4+aM5xhwDjPtzU2n3iX9hDdRjAkXOPQ9CPwORVmvGTlTnfZo+fTnSnfZo8kdGjdkdSrKcFSMEH0pta3ie0NprlwMHbKfNUkg53df1yPwrJr6qnNTgpLqfa0pqpBTXUK7bwTfGWzlsXIzCdycjJU9ePY9/9quJqW3nltZ0ngkMciHKsO1ZYmj7am4GOLw6xFJw69D1iqGr6Vb6ra+TMNrrzHIByh/w9RUGi67a6pEqbxHcgANG3G44ySvPI6+/rWtXzjU6M+zR8k1Uw9TXSSPL9R0q9018XMJC5wJByrde/4dDzXW+B/wDkDzf9dz/6CtdC6LIjI6hlYYKkZBHpUdta29qrrbwrErtuKoMDOAOnboK662NdalySWp3YjMXiKPs5rU5bx5/y4f8AbT/2WuRr0HxLos+rpbmCWNGiLZD5AIOO4z6frXJXXh7VrbJa0eRd20GL58++Bzj6iu/A1qaoxg5a/wDBPTy7EUlQjBySev5sy6KKK9E9YKKKKACiiigArb8G/wDI0Wf/AAP/ANAasStvwb/yNFn/AMD/APQGqofEiZ/Cz1GkoorvOAKKKKACkoooAKSiimAUlFIWA6kCgQtZ2tf8eaf9dB/I1dMyDvn6VnatKJLZQBj5wf0NRUT5GXTa50ZK9adTR1p1cB3nceBf+QZcf9dv6CumrmfAv/IMuP8Art/QV01ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVxHij/AJGeH/rkP6129cR4p/5GaL/rkP60AQiq1199fpVgVXuvvL9KAJLH7r/hVuqll0f8KtV3UvgRw1fjYtLSUVoZi0UUUALRSUtABS0lFAC0tJRQMxvGP/Ir3n/AP/Q1ry+vT/GP/Ir3n/AP/Q1rzCuSv8R10PhCiiisDYKuaR/yGLH/AK7x/wDoQqnVzSP+QxY/9d4//QhUVPgfoZ1fgl6M9RoorN8Qz/Z9BvH27sx7MZx975c/rXykI88lFdT4mnBzmoLrocDq9+2palLcnO0nCKf4VHQdfxPuTVKiivrIxUUorZH3EIqEVGOyCiiiqKCu28E3xls5bFyMwncnIyVPXj2Pf/aria6PwP8A8hib/rgf/QlrkxsFKhK/Q4Mxgp4aV+mp3VcT44tljvre5XAMyFWAXHK45J78ED8K7auf8axPJoisq5Ecys3PQYI/mRXi4KfJXj56Hz+XVOTER89PvOCqa0uDa3UVwqK7RsGUPnGR06EVDRX0jV1Zn1zSaszrv+E2/wCod/5G/wDsaNW8V2t1pk9vbJcJLIu0F1XGCee57ZrkaK5FgaCaaWxwrLcMpKSja3mwooorsO8KKmt7W5ud32e3lm2/e8tC2PritGHwzq8uw/Zdivjl3UbQfUZz+mazlVhD4mkZTrU6fxyS+ZkV3vgqV5NEZWbIjmZV46DAP8yaz7PwW2Qb27AGT8kIzkY/vHpz7V09hY2+n2q21sm1F5JPVj6n3rysdiqVSHJF3Z4uZYyjVp+zg7u5ZrznxX/yMd1/wD/0Ba9GrznxX/yMd1/wD/0Bayyz+K/T9UYZP/Hfp+qMitDQZmg1yzdACTKE59G+U/oaz6K9yceaLi+p9HOPPFxfU9dqnq1l/aGmT2m7aZF+U5xyDkZ9sgVBoGprqempIXBnQBZV7g+v49f07Vp18q1KlOz3R8U1OhUs9HFnlF1a3FnMYbmF4nHZh17ZHqOOtQ16pe2FpfxiO6gWUDoT1H0PUdKw7zwdZTEtazSW5JHyn51Ax2zz+tezSzKnJWqKz/A+go5vSkrVFZ/h/mcPRW7e+FNSttzRKtygycxn5sD1B7n0GaxZYpIJDHNG8bjqrjBH4V306sKmsHc9OnXp1VeErlzSdVudJmeS32tvXayvkqffAI5/xNXZ/FerSuGSWOEYxtSMEH3+bNYdFKVCnKXNKKbJlhqM5c8opss3t/d38gkup3lI6A9B9B0HSq1FFaJKKsjaMVFWirIK9F8Kf8i5a/8AA/8A0Nq86r0Xwp/yLlr/AMD/APQ2rzsz/hL1/Rnk5x/AXr+jNiuD8aXZm1ZbYE7bdAMED7zckj8Nv5V3leY65K82t3rSNkiZl6dgcD9AK48theq5dkcGUQ5qzk+iKFFFFe8fTBRRRQB2ngWfdZ3VvtxskD7s9dwxj/x39a6muQ8B/wDL/wD9s/8A2auvr5rHK1eVv60PkMxSWKnby/JHC+OP+QxD/wBcB/6E1c5XR+OP+QxD/wBcB/6E1c5XuYT+BH0PpMD/ALvD0Ciiiuk6xyO0bq6MVZTkMDgg+tdFpPiy5tysV/m4hAxvA/eDjj6/jzz1rm6Kyq0YVVaaMa1CnXXLUVz1Cz1bT74hba7jdiSAh+VjxngHmrteRV3vguWSXR38yR32TFV3HO0BVwB7V42KwSox54vQ+fxuXLDw9pGWh0FFY+ua1/Y81ruh8yKbduwcMMbeR69Tx+tS6fr2nX4AjnEchIHly4Vsk4AHr+Ga4vYVORTtoef9Xq+zVRR0ZY1DT7XUYDFcxBuCFbHzJ7g9ugride8Oy6WPPiYzWxOC2OU54B/x9fTivQaa6LIjI6hlYYKkZBHpWuHxU6D027GuFxtTDvTWPY8korZ8S6QulXy+Tn7PMCyZP3SOq/hkfnWNX0dOpGpFTjsz62lVjVgpx2YUUUVZoFbfg3/kaLP/AIH/AOgNWJW34O/5Giz/AOB/+gNVQ+JEz+FnqFFMMiDqwphuFHQE16FmefdEtFVzcN2AFRmVz/Efwp8rFzItkgdTimGVB/F+VVCc9aKrlJ5iw1wOyk1GZ3PTAqKinyoXMxxkdurGmUUUxBVTUf8AUL/vf0NWqq6j/qF/3v6Gs6vwM0pfGjOHWnU0dadXmHpnceBf+QZcf9dv6CumrmfAv/IMuP8Art/QV01ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVxHin/AJGaL/rkP6129cR4q/5GaL/rkP60AVxVe5+8v0qcVBcfeH0oAlsuj/hVqqtl0f8ACrVd1L4EcNX42FLSUVoZi0tJRQAtFFFAC0UlLQAUtJRQBjeMP+RYvP8AgH/oa15hXp3jD/kWLz/gH/oa15jXJX+I66HwhRRRWBuFXNI/5DFj/wBd4/8A0IVTq5pH/IYsf+u8f/oQqKnwP0M6vwS9Geo1geM5mi0PYoBEsqo2ew5bj8VFb9Y3ixFbw9cFlBKlCpI6HcBkfgT+dfM4ZpVo37o+PwjSxEL90ed0UUV9SfaBRRRQAVr+FP8AkY7X/gf/AKA1ZFbng+FpdfjdSAIkZ2z3GNvH4sKwxDtRl6M58W7UJ37P8j0GsfxX/wAi5df8A/8AQ1rYrG8WOq+HrgMwBYoFBPU7gcD8Afyr5zD/AMaHqvzPksL/AB4eq/M87oopyI0jqiKWZjgKBkk+lfVH2osUUk8gjhjeRz0VBkn8K6TT/B1zKA99MIBkfu0+ZiM889B+vWug0HRItJgycSXLj95J6ew9v5/kBrV4mIzGTfLS27nzuKzWTbjQ0Xcybfw3pNuUYWgkZRjMjFs8YyQeP0q9BZWls5eC1hiYjBZIwpx6cUXV7a2Sb7m4jiGCRubBOOuB3/Csq48WaVFt2PLPnr5aYx9d2K4kq9buzz0sTiNVeX3m7RXGT+NZ2QCCyjjbPJdy4x9ABVGfxXq0rhkljhGMbUjBB9/mzW8curvey/ryOiGVYiW6S+f+VzvpZY4IzJNIsaDqznAH4023niuYRLBIJIySAw6HBwf1FeWT3E9y4eeaSVgMBnYscenNegeFP+Rctf8Agf8A6G1GJwfsKak3d3DF5f8AVqSm5Xd7fmbFec+K/wDkY7r/AIB/6AtejV5z4r/5GO6/4B/6AtXln8V+n6o0yf8Ajv0/VGRRRRXvH0xZsL640+6W5tn2uvBB6MPQ+1d1pniWwvo/30i2swzlJG4x7NwD/PrXnlFcuIwsK+st+5x4rBU8TrLR9z12ivL7PVtQsQFtruRFAICH5lHOeAeK2bXxleR4FzbxTALjKkoxPqeo/SvKnltWPw6niVMorR+Bp/h/X3nb1FPbwXKBJ4Y5VByFdQwz681kWvirSrh9jPJAcgDzVwDn3GcfjitmKWOeMSQyLIh6MhyD+NcU6dSk/eTR586VWi/eTRi3vhTTbnc0SvbOcnMZ+XJ9Qew9BiuY1bw5e6cWdFNxbgZ81F6cc5HbGOvSvRKK6aOOq093deZ1UMxr0nq7rz/zPIqK6DxZpCWF0lxbR7LebOQOiv6ewPYfWufr36VRVYKcep9RRrRrQVSOzCvRfCn/ACLlr/wP/wBDavOq9F8Kf8i5a/8AA/8A0Nq4cz/hL1/Rnm5x/AXr+jNivLtX/wCQxff9d5P/AEI16jXl2r/8hi+/67yf+hGubK/jl6HJk38SXoU6KKK9s+iCiiigDrvAf/L/AP8AbP8A9mrr65DwH/y//wDbP/2auvr5vHf7xL5fkj5HMv8AepfL8kcL44/5DEP/AFwH/oTVzldH44/5DEP/AFwH/oTVzle3hP4EfQ+jwP8Au8PQKKKciNI6oilmY4CgZJPpXSdY2irUum30MDTy2c0caEAs6FcZ6df89PWqtJSUtmTGSl8LuFd14H/5A83/AF3P/oK1wtd14H/5A83/AF3P/oK1w5j/AAPmedmv+7v1RT8ef8uH/bT/ANlrka67x5/y4f8AbT/2WuRq8D/u8fn+bNMt/wB1j8/zZ1vhfxBK062F7IZN5/dyu3IPoSeue3fPH07CvJEdo3V0YqynIYHBB9a9Vs5/tNnBcbdvmxq+3OcZGcV52Y0FTkpx6nk5rho0pqpBWT/MoeJLNLzRLgMcGJTMp9CoJ/UZH415vXrteRV0ZZNuMo9jqyabcJQ7W/H/AIYKKKK9U9sK1/Cn/Ix2v/A//QGrIrX8K/8AIxWv/A//AEBqun8aIqfAz0Wikor1DywoopKACiikoAWkoooAKSiigAqpqH+oX/e/oatVV1D/AFC/739DWdX4GaUvjRQHWlpBS15h6Z3HgX/kGXH/AF2/oK6auZ8C/wDIMuP+u39BXTUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXD+Kv+Rli/65D+tdxXD+K/+Rli/wCuQ/rQBWqC4+8PpUoNRT/eH0oAmsuj/hVmq1l0f8Ks13UvgRw1fjYtFJS1oZhS0lFAC0tJRQAtFJS0AFLSUUAY3jD/AJFi8/4B/wChrXmNeneMP+RYvP8AgH/oa15jXJX+I66HwhRRRWBuFXNI/wCQxY/9d4//AEIVTq5pH/IYsf8ArvH/AOhCoqfA/Qzq/BL0Z6jWb4hg+0aDeJu24j35xn7vzY/StKivlIS5JKS6HxNObhNTXTU8iorT1/TG0zUnjCEQOS0TdiPT8On696zK+shNTipR2Z9vTqRqRU47MKKKKosK6bwNE51K4mC/IsO0nPQkgj+Rrma9E8L6a2naWPNAE0x8xvlwVGOFP0/mTXDj6ihRa6s87M6qp0HHq9DZrlvHU+2ztbfbnfIX3Z6bRjH/AI9+ldTXnfiu7F3rkoUgrCBECAR065/EkV5eAp89ZPtqeLldLnxCfRamNXSeCbQTalLdMARAmBychm4z+Qb865uu28CrELC5cY84ygNzztA44+pavWx0nGhKx7mYzcMNK3XQ6es/XNSGlaa9wAGkJCRqc4LH/wCtk/hWhXLeOvO+x2u3/UeYd/T72Pl9+m6vCw0FUqxjLY+awlONWvGEtjkLieW6neeeQySOcsx71FRRX1CVtEfZpJKyCiiimMK9H8LoyeHrQOpU4Y4IxwWJB/KuC02xl1G+jtogfmPzMBnYvcn6V6hDEkEKQxrtSNQqjOcAcCvJzOouVU+u54ecVVyxpddx9efeMIWi1+R2IIlRXXHYY28/ipr0GuF8cf8AIYh/64D/ANCauXLnat8jiyltYi3dM5yiit3wiLaTVWt7qKKRZIzsWSMN8w54yOON3+cV7lWfs4Odr2PpK1T2VNztexjwW89y5SCGSVgMlUUscevFOubK6tBGbm3ki8wErvXGcHB/z9PWvVq5rxtaGbTYrpQSYHweRgK3GfzC/nXnUswdSooNWTPJoZq6taMHGyZw9FFFeqe2FSwXE9s5eCaSJiMFkYqcenFRUUmr6MTSejO28OeJDduLPUHAnY/u5cAB/Y+h9PX69enry/RUZ9asgilj56HAGeAQSfyr1Cvn8fRhSqLk6ny2Z0IUaq5NL9DM8R2y3Wh3StgFEMikrnBXnj6gEfjXmteo6v8A8ge+/wCuEn/oJry6u3LG+SS8z0Mnb9nJeYV6L4U/5Fy1/wCB/wDobV51XovhT/kXLX/gf/obVWZ/wl6/oy84/gL1/RmxXl2r/wDIYvv+u8n/AKEa9Rry7V/+Qxff9d5P/QjXNlfxy9Dkyb+JL0KdFFFe2fRBRRRQB13gP/l//wC2f/s1dfXIeA/+X/8A7Z/+zV19fN47/eJfL8kfI5l/vUvl+SOF8cf8hiH/AK4D/wBCaucro/HH/IYh/wCuA/8AQmrnK9vCfwI+h9Hgf93h6F3Rio1i0DxRyq8qoUkXcCCcdPxr02KKOCMRwxrGg6KgwB+FeTo7RuroxVlOQwOCD616raXMd5axXMJykihh7ex9x0rz80i7xl0PKzmLvGXQp+IYPtGg3ibtuI9+cZ+782P0rzSvW3RZEZHUMrDBUjII9K8x1ewbTdSltjnaDlGP8Snoen4H3BqssqK0qfzKyeqrSpP1KVd14H/5A83/AF3P/oK1wtd14H/5A83/AF3P/oK10Zj/AAPmdea/7u/VFPx5/wAuH/bT/wBlrka67x5/y4f9tP8A2WuRq8D/ALvH5/mzTLf91j8/zYV6rYwtbWFvA5BaKJUJHTIAFedaHpp1XUktySsYBeRhjIUf/XwPxr02uLM5puMEednNRNxprpr/AJBXkVena5c/ZNGu5suCIyqlOoJ4B/MivMavK4vllL0NMmi1Gcu9vw/4cKKKK9Y9wK1/Cv8AyMVr/wAD/wDQDWRWv4V/5GK1/wCB/wDoBq6fxoip8DPRKKSivUPLCiikoAKKKSgAoopKYC0lFFABVW//ANSP97+hqzVa/wD9SP8Ae/xrKr8DNKXxooClpBS15h6Z3HgX/kGXH/Xb+grpq5nwL/yDLj/rt/QV01ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVw/iv8A5GSL/rkv9a7iuH8Wf8jJF/1yX+tAFMGo5uop+ajl6igCez6P+FWaq2fRvwqzXdS+BHDV+Ni0UUVoZhS0lFAC0UUUALRSUtAC0UlLQBi+MP8AkWLz/gH/AKGteZV6b4v/AORYvP8AgH/oa15lXJX+I66HwhRRRWBuFXNI/wCQxY/9d4//AEIVTq5pH/IYsf8ArvH/AOhCoqfA/Qzq/BL0Z6jRRWT4i1KXSrSC5iAb9+FdT/Eu1sjPbpXysIOpJRjuz4mnTlVkoR3ZZ1bTYtVsWtpSV53Iw/hbscd+tefanpF5pcm24jyhxiVMlDntn14PFei2F9b6harc2z7kbgg9VPoferNdVDFVMM3FrTsduGxtXCNwauux5FTkRpHVEUszHAUDJJ9K9P8A7K03/oH2v/flf8Kmt7W2tt32e3ih3fe8tAufriu15pG2kT0XnMbaQOV0Dwu29LvUlG3AZYD1z/tf4fn6V2FFZ+rava6VAzyuGlx8kIPzN6fQcda82pUqYmeur7HkVatbGVNdX0RX8Sat/Zdh+7OLmXIi+XIGMZP4Z/PHvXnVWb++uNQumubl9ztwAOij0HtVavewuHVCFur3PpsFhVhqdnu9wrp/A9ysd9cWzYBmQMpLY5XPAHfgk/hXMVNaXMlndRXMJw8bBh7+x9j0rSvT9rTcO5tiaPtqUqfc9XrP1zTRqumvbghZAQ8bHOAw/wDrZH40ukarb6ra+dCdrrxJGTyh/wAPQ1fr5n36M+zR8d79Cp2kjyi6tbizmMNzC8Tjsw69sj1HHWoa9Ynt4LlAk8Mcqg5CuoYZ9eazP+EZ0b/nz/8AIj/4168Mzhb346+R7tPOIW/eRd/I86q5YaZeahIq20DsrNtMhB2L9TXf2+g6Vb7tljEd3XzBv/LdnFaCIsaKiKFVRgKBgAelTUzNW9yP3k1c4VrU4/eZmiaJb6RG21vNnfhpSMcegHYf59MatUNT1ez0uPdcSZc4xEmC5z3x6cHmsjw7rt3qmr3EcoVYfLLogH3MEDGe/XnP6V57p1a0ZVpHlujXrxlXlsur/Q6auF8cf8hiH/rgP/Qmruq5PxxYlo4L5Ezs/dyEZ6HlfbGc/mK0wElGur9TXLJqOJV+px1T2Ny1lfQ3KZJicNgNjI7jPuOKgor6JpNWZ9XJKSaZ6xbzxXUCTwSCSJxlWHenuiyIyOoZWGCpGQR6VxHhTXFsnNldyEQOf3bE8Rnv9Af0/Emu3R1kRXRgysMhgcgj1r5jEUJUJ26dD43FYaWGqOL26M4rWfClxDI82nr5sHXys/OvXOPUfrz361zNeu1FPbwXKBJ4Y5VByFdQwz6812UcylFWmrnfQzecFy1FfzPJ6fFFJPII4Y3kc9FQZJ/CvTv7K03/AKB9r/35X/Cp4LeC2QpBDHEpOSqKFGfXitpZpG2kTolnMbe7DU5/wx4fksHN5eACcgqkfB2D1z6n27fXjpaKz9W1e10qBnlcNLj5IQfmb0+g4615k51MRUvu2eNUnVxdW71bMzxre+RpiWgXJuG5JHQKQfzzj9a4WrN/fXGoXTXNy+524AHRR6D2qtX0GFo+xpqL3PqsHh/q9JQe/UK9F8Kf8i5a/wDA/wD0Nq86r0Xwp/yLlr/wP/0Nq5sz/hL1/RnHnH8Bev6M2K8u1f8A5DF9/wBd5P8A0I16jXl2r/8AIYvv+u8n/oRrmyv45ehyZN/El6FOiiivbPogooooA67wH/y//wDbP/2auvrkPAf/AC//APbP/wBmrr6+bx3+8S+X5I+RzL/epfL8kcL44/5DEP8A1wH/AKE1c5XR+OP+QxD/ANcB/wChNXOV7eE/gR9D6PA/7vD0Cux8E6ihhk0+R8OG3xBm6juB9MZ/E+hrjqfDK8EyTRtteNgynGcEciqxFFVqbgysVh1iKTps9aqhq+lW+q2vkzDa68xyAcof8PUVW0PXbfVIVV2WK6HDRZ+97r6jj8P1OxXzbU6E9dGj5GUamHqa6SR5ZqGn3WnTmK5iK8kK2Plf3B79RXYeB/8AkDzf9dz/AOgrXQuiyIyOoZWGCpGQR6VDaWdtZI6W0QiV3LlR0yf5dOgrrrY321LkktTvxGY/WKHs5KzOY8ef8uH/AG0/9lrmrCxuNQultrZNztySeij1PtXpN5p1nfPE91AJTESUyTgZx279B1qxFFHBGI4Y1jQdFQYA/CrpY5UqKhFalUMyVDDqnGN2r+m5n6Jo0WjwOiSGWWQ5dyMZx0AHbrWnRXO6/wCJIrJHtrNxJd5Kk4yI/wDE+359MHjjGpiKnds4Iwq4urpq2ZfjPU1nnSwhcMkJ3SEc/P0x+Az+ftXMUUV9JRpKjBQR9fh6MaFNU49AooorU2Ctfwr/AMjFa/8AA/8A0A1kVr+Fv+Ritf8Agf8A6Aaun8a9SKnwP0PQ6SiivUPLCikooAKKKSmAUUUlAC0lFJQIKr33+pH+9Viq17/qR/vVnW+BmtL40UaWiivLPTO48C/8gy4/67f0FdNXM+Bf+QZcf9dv6CumoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACuG8Wf8jJH/1yX+tdzXDeLf8AkY4/+uS/1oAo02TqKXNNfrQBPadGqzVa06N+FWK7qXwI4avxsWlpKK0MxaKKKAClpKKAFooooAWikooAx/F//Is3n/AP/Q1rzKvTPF//ACLN3/wD/wBDWvM65K/xHXQ+EKKKKwNwqazn+zXkFxt3eVIr7c4zg5xUNFJq6sxNJqzOu/4Tb/qHf+Rv/saztc8Rf2vZpb/ZPJ2yB93mbuxGOg9awqK5oYOjCSlGOq82clPAYenJTjHVeb/zJ7O8ubGcT2spjkwRkc5HoQetdTZ+NFwBe2hBwfnhOcnP909OPeuPoq6uHp1vjRdfCUa/xrU9F/4SbRv+fz/yG/8AhTZfFOkRxlluHlI/gSNsn8wB+teeUVyf2bR7v+vkcSyeh3f4f5HT6h4xuZQUsYRAMn94/wAzEZ446D9etc3LLJPIZJpHkc9Wc5J/GmUV20qFOkrQVjvo4elQVqasFFFFam4UUUUATWt1cWcwmtpnicd1PXvg+o46V1Fj4z6i/tvo0H8sE/XnP4VyNFYVcPTrfGjmr4WlX+NHocXinSJIwzXDxE/wPG2R+QI/Wnf8JNo3/P5/5Df/AArzqiuT+zaPd/18jieT0O7/AA/yO9uvF2mw5EIluDtyCq7Vz6HOD+hrCv8Axbf3Ksluq2yHuvL4xz83+ABrn6K2p4GjT1tf1N6WXYelra78/wCrDndpHZ3YszHJYnJJ9an0+8ewv4bqMZMbZx6joR+IyKrUV1uKa5XsdsoqUXF7HXf8Jt/1Dv8AyN/9jVfUPFaX9hNayadgSLjPndD1B6djg1zNFcqwVCLuo/i/8zjjl2Gi1JR1Xm/8wooorrO4K0tN1u/03CwS7oh/yyk5Xv09OueMVm0VM4RmrSV0ROnGouWaujtLXxnbGEfa7aVZR18rBU+/JGPpz9a0E8UaOyKxuihIyVMbZHtwK87orhll1GW10edPKcPLa69H/mei/wDCTaN/z+f+Q3/wqrceMNOiLrEk0xA+VgoVWOPc5H5VwlFJZbRW92KOUYdPVt/P/gHQ3ni/UJiRbLHbLkEYG9unQk8fpWA7tI7O7FmY5LE5JPrTaK7KdGFJWgrHfSoU6KtTjYKKKK1Ngro9K8U/2dp0Vp9i8zy8/N5uM5JPTHvXOUVlVpQqrlmroxrUKdePLUV0dd/wm3/UO/8AI3/2NcveT/abye427fNkZ9uc4yc4qGippYenRd4KxFHC0aDbpq1/UKKKK3OkKKKKANfQdb/sbz/9G87zdv8AHtxjPsfWtf8A4Tb/AKh3/kb/AOxrkaK5qmEo1Jc0lr8zkq4GhVk5zjdvzf8AmaWuap/a94lx5Hk7Ywm3du7k56D1rNooreEFCKjHZHRThGnFQjsgoooqixyO0bq6MVZTkMDgg+tb1h4tv7ZVS4VblB3bh8Y4+b/EE1z9FZ1KUKqtNXMatCnWVqiuegW/izSpd295YMdPMTOfptzWxBcQXKF4Jo5VBwWRgwz6cV5PXdeB/wDkDzf9dz/6CteRi8HTpQ54s8LH5fToU/aQbNe/1Oy07y/tc3l+Znb8pOcYz0HuKy7rxdpsORCJbg7cgqu1c+hzg/oaoePP+XD/ALaf+y1yNXhcFSqU1UlfX/M0wWXUa1KNSd7u/wCZu6l4pv7zKQH7LF6Rn5j06t+HbHXvWFRRXqU6UKatBWPapUadFctNWCiiitDUKKKKACtbwt/yMNr/AMD/APQDWTWt4W/5GG1/4H/6Aaun8a9SKnwP0PQ6SiivUPLCkoopgFFJRQAUUUlAgoopKAFqte/6kf71WKr3n+qH+9Wdb4Ga0vjRSoooryz0zuPAv/IMuP8Art/QV01cz4F/5Blx/wBdv6CumoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACuG8W/8AIxR/9cl/rXc1wvi7/kYo/wDrkv8AWgCgDSNSZoNAFi16NViq9r0ap67qXwI4avxsWiiitTMWlptLQAtFJS0gCiiigBaKSloAxvF//Is3f/AP/Q1rzOvTPF//ACLN3/wD/wBDWvM65K/xHXQ+EKKKKwNwooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACus8K6xp+n6bJDd3HluZiwGxjxgDsPauTorGtRjWjySMMRQjiIcktjo/Fup2Wo/ZPsk3meXv3fKRjO3HUexrnKKKdKkqUFCOyHQoxoU1TjsgooorU2CiiigAooooAK1vC//Iw2v/A//QDWTWt4X/5GG1/4H/6Aaun8a9SKnwP0PQaKKSvVPLFpKKKACkoooEFFJRQAUUUlABUF5/qh/vVPVe7/ANUPrWdb4GaUfjRTopTSV5Z6h3HgX/kGXH/Xb+grpq5nwL/yDLj/AK7f0FdNQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFcL4v/wCRij/65L/Wu6rhfF//ACMMf/XJf5mgDNBpaZmnCgCxa9GqxVWB1QNuOKkNxH6k/hXfRT5EcFVrnZNS1X+0p2BpPtXon61rysy5kWaKq/aW7AUhuJD3A/CnysOZFyiqJmkP8RpC7nqx/OjlFzF/PrSF1HVh+dUM5oo5Q5i8ZYx/EKaZ4x3J/CqlFPlQuZlLxZOr+HLtQDzs/wDQ1rziu/8AE/8AyL9z/wAB/wDQhXAVw4lWmd2Gd4hRRRXOdAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFa3hf/kYLX/gf/oBrJrW8Mf8AIwWv/A//AEA1dP416kVPgfoegUUlFeqeUFFFJQAtJRRQAUlFFABSUUUwCoLv/VD61PUF1/qx9ayrfAzSj8aKhpKU0leWeodx4F/5Blx/12/oK6auZ8C/8gy4/wCu39BXTUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXC+MP8AkYE/65L/ADNd1XCeMP8AkYE/65L/ADNAGWDT16VFmpE6UADUlK/akr06H8NHmV/4jFopKWtjEWikpaBi0UlFAC0tJRQAtLTaWkBl+J/+Rfuf+A/+hCuArvvE3/IAuf8AgP8A6EK4GuDE/GvQ78N8D9QooormOkKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACtXwx/wAjBa/8D/8AQTWVWr4Y/wCRgtv+Bf8AoJq6fxr1IqfA/Q9ApKKK9U8oKKKSgAoopKACiiimAUlFFABUNz/qx9alqK5/1Y+tZVvgZpR+NFQ0lOPSm15Z6h3HgX/kGXH/AF2/oK6auZ8C/wDIMuP+u39BXTUAFFUtR1Wy01M3MwVsZEY5Zuvb8Op4rmdQ8ZSuSlhAI1wRvl5bp1AHAxz610UsLVq/CtDOVSMd2dnRXlF1dXF5MZrmZ5ZD3Y9O+B6DnpRXoLK3bWf4f8Ew+s+R6vRRRXjnWFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXCeMf+RgT/riv8zXd1wnjL/kPp/1xX+ZoAyM1JH0NQ5qaL7poAV+1NpX7U2vTofw0eZX/AIjFpaSitjEWlpKKAFpaSigYtFJS0ALRSUtAGX4m/wCQBc/8B/8AQhXA16lRXPVo+0d7m9Kt7NWseW0V6lS1l9V8zX615HllFep0tH1XzD615HldFeqUUfVfMPrXkeV0V6rRR9V8w+teR5VRXqtFH1XzD615HlVFeq0tH1XzD615HlNFerUUfVfMPrXkeU0V6vRR9V8w+teR5RRXq9FH1XzD615HlFFer0UfVfMPrXkeUUV6vS0fVfMPrXkeT0V6xRR9V8w+teR5PRXrFFH1XzD615Hk9FesUUfVfMPrXkeT0V6xRR9V8w+teR5PRXrNFH1XzD615Hk1Fes0UfVfMPrXkeTUV6zRR9V8w+teR5NRXrNJR9V8w+teR5PRXrFFH1XzD615Hk9FesUUfVfMPrXkeT0V6xRR9V8w+teR5PRXrFFH1XzD615Hk9FesUlH1XzD615HlFFer0UfVfMPrXkeUUV6vRR9V8w+teR5RRXq9JR9V8w+teR5TRXq1FH1XzD615HlNFerUlH1XzD615HlVFeq0UfVfMPrXkeVUV6rSUfVfMPrXkeV0V6pRR9V8w+teR5XWr4Y/wCQ/bf8C/8AQTXf0lVHDcrTuTLE8yasLSUZpK6jlFpKKKYBRSUUAFFFJQAtJRSUCFqG4+4PrUtRT/cH1rKt8DNaPxorN0ptObpTa8s9Q7jwL/yDLj/rt/QVX1+fxLH5rbfKtR3tjnA65J+8PQngce9WPAv/ACDLj/rt/QV01bUavspc3Kn6kTjzK17HkVFelahoOm6gCZIBHIST5kWFbJOST6/jmua1HwheQvusWFxGTwpIVl6+vB7c/pXuUsfSqaPR+ZxyoSjtqc1RT5YpIJDHNG8ci9VcEEfhRXde5getUUUV8eesFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXB+Mv+Q8n/AFxX+ZrvK4Pxn/yHl/64r/M0AY2amh+6frVfNWIPun60ALJ2ptOk7UyvTofw0eZX/iMWiiitjEWikpaAFopKWgBaKSigB1FJRQMWlpKKAFopKWgApaSigBaWm0uaQC0UlFAC0tJRQAtFJRQAtFFFAC0UlFAC0UlFADqKSigBaKSigYtFJS0AFFFFABS0lFAC0UlFAC0UlFAC0UlFAC0UlFAC0UlFAC0UlFABRRRQAUUUUAFFJRQAtFJRQAtJRRQIKKSigBaKSigAooooAKKSigBaSiigAopKKACikooAXNJRRTAKKSigAoopKAFpKKM0AFJRRQIKKSigAqOf7g+tPqOb7g+tZVvgZrR+NFdulNp7dKZXlnqHceBf+QZcf9dv6CumrmfAv/IMuP8Art/QV01ABRRRQBHPbwXKBLiGOVQchXUMM+vNFSUVSnJaJismFFFFSMKKKKACiiigAooooAKKKKACiiigAooooAKKKKACuC8af8h1f+uK/wAzXe1wXjT/AJDq/wDXFf5mgDEzVi2+6frVXNWrX7jfWgB0vUUzNPm6io69Sh/DR5lf+IxaKTNLWxiLRSUtIApaSigBaWm0tAC0UlLQAtFJRQA6ikooGLRRRQAtFJRQAtFFFAC5opKKQC0tNpc0ALRSUUALS0lFAC0UlFAC0UlFAC0UUUAFLSUUALRSUUALRSUUALRSUUALRSUUALRSUUDFopKKAFopKKBC0UlFAC0UlFAC0UlFAC0lFFABRRRQAUUlFAC0UlFABRRRQAUUlFAC0lGaSgBaM0lFABRRRTAKKSigAoopKAFpKKM0AFGaSigQUUlFABRRSUAFFFFABUcv3R9afTJfu/jWdb4Ga0fjRA/SmU9/u0yvKPUO48C/8gy4/wCu39BXTVzPgX/kGXH/AF2/oK6agAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK4Lxr/wAhxf8Ariv8zXe1wPjb/kOL/wBcV/maAMHNW7T7jfWqeat2f3G+tAEk3UVHUk3UVHXqUP4aPMr/AMRhRRRWxiGaWkooAWlpM0UALRSUtIApaSigBaWm0tAC0UlLQAuaKSigBaWkzRQMWikooAWlpKKAFopKKAFooooAXNFJRQAtFJRSAdRSZozQAtFJRQAtFJRQAtFFFABS0lFAC0UlFAC0UlFAC0UlFAC0UlFAC0UlFAC0UlFAC0lFFABRRRQAUUlFAC0UlFAC0UmaSgBaKSigBc0ZpKKYBRRRQAUUlFAC0lFFABRSUUALSUZpKBC0ZpKKACikooAKKKSgBaSiigAoopKACiikzTAWmSfdp1Nf7tZVv4bNaPxohf7tR1I/3ajryj1DuPAv/IMuP+u39BXTVzPgX/kGXH/Xb+grpqACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArgfG3/IcX/riv8AM131cD42/wCQ4v8A1xX+ZoA5+rll9xvrVOrdkfvr+NAEsw6Go6nddykVBXo4aV4W7HnYmNp37hRRRXSc4UUUUAFFFFAC5opKKAFpaTNFIBaKSloAKWkooAWikooAdRSUUALS5pKKAFopKKAFpaTNFAxaKSigBaKKKAFopKKAFopKKAFopKWgAooooAXNGaSigBc0ZpKKQC0UlFAC0UlFAC0UlFAC0UlFAC0UlFAC0UlFAC5ozSUUALmkzRRTAKKKKACiikoAWikooAWikooAKKKSgBaKSigBaSjNJmgBaKSigQZoopKAFopKKACikooAKKKKACikooAWkopM0wFpM0UUAFFFFABTX6U6mMcmsMRK0LdzfDxvO/Yik+7UdSSfdFR15h6R3HgX/kGXH/Xb+grpq5nwL/yDLj/rt/QV01ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVwPjb/kOL/1xX+Zrvq4PxuhXWY27NCMfmaAOdqSCTy5Q3boajooA1aikT+IVBb3G0bH6dj6Vc68jmrp1HB3RFSCmrMrUVM0Yb2NMMTdiK9COIhLfQ4JYecdtRlFO8tqPLar9rDuR7KfYbRTvLajy2o9rDuHsp9htFO8tqPLaj2sO4eyn2G0U7y2o8tqPaw7h7KfYbmlpfLajY1HtYdw9lPsJRS7Gpdho9rDuHsp9hKKXaaNppe1h3D2U+wlFLtNG00e1h3D2U+wUUbTRg0e1h3D2U+wUtJg0YNHtYdw9lPsLRRg0Yo9rDuHsp9gooxRR7WHcPZT7C5opKKPaw7h7KfYWikozR7WHcPZT7C0tNzRmj2sO4eyn2HUU3NGRR7WHcPZT7DqKbmlzR7WHcfsp9haKTdSbhR7WHcPZT7DqKTcKNwo9rDuHsp9haKbuFG4Ue1h3D2U+w+im7hSbhR7WHcPZT7D6KZvFG8Ue1h3D2U+w+imbxRvFHtYdw9lPsPopm8UbxR7WHcPZT7DqKbvFG8Ue1h3D2U+w6im7xRvFHtYdw9lPsOopu8UbxR7WHcPZT7DqKZvFG8Ue1h3F7KfYfRTN4o3ij2sO4eyn2H0lN3ijeKPaw7h7KfYdRTd4pN4o9rDuHsp9h9GaZvFG8Ue1h3D2U+w6im7xRvFHtYdw9lPsOopm8UbxR7WHcPZT7DqKbuFG4Ue1h3D2U+w6kpNwo3Cj2sO4eyn2Fopu4UbhR7WHcPZT7DqKbuFG4Ue1h3D2U+wtFJuFJuFP2sO4eyn2HUmaTcKNwo9rDuHsp9haKTcKNwo9rDuHsp9haKTcKNwo9rDuHsp9haKTcKaSTUSrwj1uVGhOXSwpNNoqN37CuCpUdR3Z306apqyGuct7U2iiszQ7jwL/wAgy4/67f0FdNXN+BkI0mZz0aY4/IV0lABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVy/jizMtnDeKMmFtrfQ9/wA/511FR3EMdzA8Eq7o3Uqw9qAPJaKv6xpc2lXjQyAmM8xv2Yf41QoAKfHK8f3W49KZRQBaF4f4kB+hpftg/uH86qUUAW/tg/uH86Ptg/uH86qUUAW/tg/uH86Ptg/uH86qUUAW/tg/uH86T7WP7h/OqtFAFr7WP7h/Oj7WP7h/OqtFAFr7WP7n60v2of3D+dVKKALf2of3P1o+1D+5+tVM0uaALX2kf3f1o+0j+7+tVc0ZoAtfaR/d/Wj7SP7v61WzRmgCz9oH939aPtA/u/rVbNGaALP2gf3f1o+0D+7+tVs0ZoAs/aB/d/Wjzx/d/Wq2aM0AWfPH939aPPH939arZozQBY88f3f1o88f3f1qvmjNAFjzx/do88f3f1qvmjNAFjzx/d/Wjzx/d/Wq+aM0AT+eP7v60eeP7v61XzRmgCx54/u/rR9oH939ar5pM0AWftA/u/rSfaB/d/Wq9FAFj7QP7v60n2gf3f1qCigCf7QP7v60faB/d/WoKKAJ/tA/u/rR9oH939agooAn+0D+7+tH2gf3f1qCigCf7QP7v60faB/d/WoKKAJ/PH939aPPH939agooAn88f3f1o88f3f1qCigCbzx/d/Wjzx/d/WoaKAJvP/2f1o8//Z/WoaKAJvP/ANn9aPPH939ahooAm84f3f1o87/Z/WoaKAJvO/2f1o84f3ahooAm84f3f1o87/ZqGigCbzv9mjzv9moaKAJfOH92jzh/dqKigCXzv9mjzv8AZqKigCXzv9mjzv8AZqKigCXzv9mjzh/dqKigCXzR/do832qKigCXzf8AZo83/ZqKigCXzf8AZo83/ZqKigCXzf8AZo80f3aiooAl83/Zo832qKigCXzfajzfaoqKAJfN9qQy+gqOigBzOW6mm0UUAFAGTgUV0/hPQ2nmXULlMQocxqf429foKAOo0OyNhpFvbsMOF3P/ALx5P+FX6KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAr31jb6hbmC5jDoenqD6g1xep+Er22Yvaf6TF6Dhx+Hf8ACu8ooA8lmgmgbbNE8bejqRUdevEAjBGRTPKj/wCeaflQB5JRXrflR/8APNPyo8qP/nmn5UAeSUV635Uf/PNPyo8qP/nmn5UAeSUV635Uf/PNPyo8qP8A55p+VAHklFet+VH/AM80/Kjyo/8Anmn5UAeSUV635Uf/ADzT8qPKj/55p+VAHklFet+VH/zzT8qPKj/55p+VAHklFet+VH/zzT8qPKj/AOeaflQB5JRXrflR/wDPNPyo8qP/AJ5p+VAHklFet+VH/wA80/Kjyo/+eaflQB5JRmvW/Kj/AOeaflR5Uf8AzzT8qAPJM0Zr1vyo/wDnmn5UeVH/AM80/KgDyTNGa9b8qP8A55p+VHlR/wDPNPyoA8kzRmvW/Kj/AOeaflR5Uf8AzzT8qAPJM0Zr1vyo/wDnmn5UeVH/AM80/KgDySivW/Kj/wCeaflR5Uf/ADzT8qAPJKK9b8qP/nmn5UeVH/zzT8qAPJKK9b8qP/nmn5UeVH/zzT8qAPJKK9b8qP8A55p+VHlR/wDPNPyoA8kor1vyo/8Anmn5UeVH/wA80/KgDySivQfE8aLaQ4RR8/Ye1clKB6CgDLoqxLVSSgB9FVHJ9aYCfWgC9RVVSfWp46AH0VYhrZ0RVOp2wIB+cdqAOeor1vyo/wDnmn5UeVH/AM80/KgDySivW/Kj/wCeaflR5Uf/ADzT8qAPJKK9b8qP/nmn5UeVH/zzT8qAPJKK9b8qP/nmn5UeVH/zzT8qAPJKK9b8qP8A55p+VHlR/wDPNPyoA8kor1vyo/8Anmn5UeVH/wA80/KgDySivW/Kj/55p+VHlR/880/KgDySivW/Kj/55p+VHlR/880/KgDySivW/Kj/AOeaflR5Uf8AzzT8qAPJKK9b8qP/AJ5p+VHlR/8APNPyoA8kor1vyo/+eaflR5Uf/PNPyoA8kor1vyo/+eaflR5Uf/PNPyoA8kor1vyo/wDnmn5UeVH/AM80/KgDySivW/Kj/wCeaflR5Uf/ADzT8qAPJKK9b8qP/nmn5UeVH/zzT8qAPJKK9b8qP/nmn5UeVH/zzT8qAPJKK9b8qP8A55p+VHlR/wDPNPyoA8kor1vyo/8Anmn5UeVH/wA80/KgDySivW/Kj/55p+VHlR/880/KgDySivW/Kj/55p+VHlR/880/KgDySrdppd/eMBb2srg/xbcD8zxXqIjjByEUH2FOoA5TSPCCRMs2osJGHIiX7v4nvXVKAqhVAAHAA7UtFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAGJ4o/49If9/wDpXIy113ij/j0h/wB/+lcjLQBSlqpJVuWqklAFd6YKe9MFAD0qxHVdKsR0AW4a2tD/AOQpbf74rFhra0P/AJClt/vigDvKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAMTxR/wAekP8Av/0rkZa67xR/x6Q/7/8ASuRloApS1Ukq3LVSSgCu9MFPemCgB6VYjqulWI6ALcNbWh/8hS2/3xWLDW1of/IUtv8AfFAHeUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAYnij/j0h/3/wClcjLXXeKP+PSH/f8A6VyMtAFKWqklW5aqSUAV3pgp70wUAPSrEdV0qxHQBbhra0P/AJClt/visWGtrQ/+Qpbf74oA7yiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDE8Uf8ekP+/wD0rkZa67xR/wAekP8Av/0rkZaAKUtVJKty1UkoArvTBT3pgoAelWI6rpViOgC3DW1of/IUtv8AfFYsNbWh/wDIUtv98UAd5RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUE45NABRWfda3p1rkNcB2H8Mfzf/AFqy5/FkYyILVm93bH6DNAHSUVxc3ifUH+55UQ/2Vz/OqcusalL968lH+6dv8qAPQKhku7aP/WXESf7zgV51JNLL/rJXf/eYmmUAegPrGmp1vIj/ALpz/KoH8RaWvSdm+iN/hXDUUAdk/inT16JO30Uf41E3iy2H3baU/UgVyVFAHUN4uH8NiT9ZP/rVE3i2b+G0QfVya5yigDfbxXefw28A+uT/AFph8U6gekcA+in/ABrDooA2T4m1I94h/wAApp8Samf+WqD/AIAKyKKANKXVLy/XZcyh1XkDaBz+FUpaW2+830pJaAKUtVJKty1UkoArvTBT3pgoAelWI6rpViOgC3DWjbTSW7CaI7XTkHGeazoaur/q2+lAGiPEmpj/AJbIf+ACnjxNqQ/ijP8AwCsaigDcHinUB1SA/VT/AI08eK73+KCA/QEf1rAooA6NfFk/8VrGfoxFSL4u/vWP5Sf/AFq5iigDrF8WQH71rIPowNSr4qsD96Kdf+Aj/GuOooA7hPEmmN1ldfqh/pUya3pj9LxB/vZH864GigD0ZL6zk+5dQt9JAasAgjIII9q8xpySPGco7KfY4oA9Morz2LVNQi+5eTfQsSP1q5F4l1KP7zxy/wC+g/pigDtqK5eDxaek9oD7o39DWnbeIdNnwDKYmPaQY/XpQBq0UiOkih0YMp6EHINLQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFcT4h1C6mv5rdnKwo20IOAfc+tdtXE6qobUbkEZ/eGgDHoqw1uP4TiozC47Z+lAEdFKQR1BFJQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQBNbfeb6UktRhivQkUEk9TmgCtLVSStEordRTDbxHqv60AZL0wVrGygP8J/Ok+wweh/OgDNSrEdWxZwD+E/nTxbxL0X9TQAyGrq/6tvpUARV6Cn5OMZoASiiigAooooAKKKKACiiigAooooAKKKKACiikLBRkkD60ALRUL3UCdXB+nNV5NRA/wBWmfdqANez1C40+TzYZSqjllJ+U/UV6FC/mQpJjG5Qcema8amuJZvvtx6DpXsdr/x6Q/7i/wAqAJaKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACuK1P/kJXP/XQ/wA67WuL1UEancgjHzk0AU6SlpKAENNKqeqinGkoAjMa+mKaYh2JqU0lAERi96Tyz7VKaQ0ARbD6Um0+lS0lAEWD6UVIaSgBlFOptABRSUUALRTcmkyfWgB9FR7j60m4+tAEtFRb29aTe3rQBNRUG9vWk8xvWgCxRVbzH/vGkMj/AN40AWqKqF3/ALx/Oml2/vH86ALtFUCx9TSGgC/uA7ikMiDq6/nWeaSgC+Zoh/GKabmIfxZ/CqJpDQBdN5GOzH8KYb0dkJ/GqlJQBZa+fsij61G15MehA+gqE0lAD2nlbrI351ESTyTmlpKAENIaU0hoASvZ7X/j0h/3F/lXj9nZXN/cLBaxNJI3YDp7n0FexQoY4Y0PJVQKAH0UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFVL3Tra9H71MOOjrwRVuigDmrjw5OuTBMrj0bg1nTaZfQ/ftnx6qN38q7aigDz5lKnDAg+hpteguiSDDorD0IzVaTTLCT71rH+Ax/KgDhjSV2L6Bpz9I3T/dc/wBarv4ZtT9yeZfrg/0oA5U0hrpH8Lf3Lz84/wD69Qv4Xuf4biI/UEUAYFJW03hq/HRoW+jH/Com8PakOkKt9HFAGSaStJtC1NetqfwZT/Wom0fUV62cn4DNAFGm1cbTNQH/AC5T/hGTTDYXo62k4/7ZmgCqaSpzaXI628o/4AaabeYdYZB/wE0AQ0hqQxSf882/KmlG/un8qAGGkpxUjqCKbQAhpKU0bW/un8qAG0lO2Of4T+VL5Mp6Ruf+AmgCOkNS/Zpz0gkP/ATThZXh6Wsx+kZoAr0lWxpuoN0sbk/SJv8ACnjRtTbpYXH4xkUAZ5pK1BoGrN0sZfxwKevhnWW/5cyPrIo/rQBjmkreXwlq7dYo1+sgqVfBmpt1ktl+rn/CgDmzSGurTwRdn795Cv0Un/Cp08Cj/lpqJ+ixf/XoA4ykrvY/A9iP9ZdXDf7u0f0NWY/B+jp96OWT/ekP9MUAecGkr1OLw5o0X3bCM/7xLfzNXIrCyg/1NpBH/uxgUAeSw2lzcf6i3ll/3ELfyq/B4Z1m4+7Yuo9ZCF/nXqdFAHAW3gW+kwbi6hhH+zlz/T+dbNn4J0yAhrh5blvQnav5Dn9a6aigCG1tLazi8q2gjhT0RcZqaiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAorLvdds7UlEJmkHZOg/GsqTXNTnP7iNIl7cZP60AdTRXIG81c8m6P6f4Ufa9X/5+j+n+FAHX0VyH2vV/wDn6P6f4Ufa9X/5+j+n+FAHX0VyH2vV/wDn6P6f4Ufa9X/5+j+n+FAHX0VyH2vV/wDn6P6f4Ufa9X/5+j+n+FAHX0VyH2vV/wDn6P6f4Ufa9X/5+j+n+FAHX0VyH2vV/wDn6P6f4Ufa9X/5+j+n+FAHX0VyH2vV/wDn6P6f4Ufa9X/5+j+n+FAHX0VyH2vV/wDn6P6f4Ufa9X/5+j+n+FAHX0VyH2vV/wDn6P6f4Ufa9X/5+j+n+FAHX0VyH2vV/wDn6P6f4Ufa9X/5+j+n+FAHX0VyH2vV/wDn6P6f4Ufa9X/5+j+n+FAHX0VyH2vV/wDn6P6f4Ufa9X/5+j+n+FAHX0VyH2vV/wDn6P6f4Ufa9X/5+j+n+FAHX0VyH2vV/wDn6P6f4Ufa9X/5+j+n+FAHX0VyH2vV/wDn6P6f4Ufa9X/5+j+n+FAHX0VyH2vV/wDn6P6f4Ufa9X/5+j+n+FAHX0VyH2vV/wDn6P6f4Ufa9X/5+j+n+FAHX0VyH2vV/wDn6P6f4Ufa9X/5+j+n+FAHX0VyH2vV/wDn6P6f4Ufa9X/5+j+n+FAHX0VyH2vV/wDn6P6f4Ufa9X/5+j+n+FAHX0VyH2vV/wDn6P6f4Ufa9X/5+j+n+FAHX0VyH2vV/wDn6P6f4Ufa9X/5+j+n+FAHX0VyH2vV/wDn6P6f4Ufa9X/5+j+n+FAHX0VyH2vV/wDn6P6f4Ufa9X/5+j+n+FAHX0VyH2vV/wDn6P6f4Ufa9X/5+j+n+FAHX0VyH2vV/wDn6P6f4Ufa9X/5+j+n+FAHX0VyH2vV/wDn6P6f4Ufa9X/5+j+n+FAHX0VyH2vV/wDn6P6f4Ufa9X/5+j+n+FAHX0VyH2vV/wDn6P6f4Ufa9X/5+j+n+FAHX0VyH2vV/wDn6P6f4Ufa9X/5+j+n+FAHX0VyH2vV/wDn6P6f4Ufa9X/5+j+n+FAHX0VyH2vV/wDn6P6f4Ufa9X/5+j+n+FAHX0VyH2vV/wDn6P6f4Ufa9X/5+j+n+FAHX0VyH2vV/wDn6P6f4Ufa9X/5+j+n+FAHX0VyH2vV/wDn6P6f4U5b/WIzkT7/AGIBoA62isGx8RKziK+j8pum8dPxHat0EMoKkEHkEUALRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRUVzcRWsLTTOFQUAPlkSKNpJGCooySe1ctqOqz6jIYLYmO3HU9C31/wqK+vp9WmxzHbKeF/x96ERY1CqMCgBsNvHFyBlvU1LmkzUF1dx2yZblj0UdTQBYzRmsGbUrmQ/K2xfRf8ah+13P8Az3k/76NAHSZozXN/a7n/AJ7yf99Gj7Xc/wDPeT/vo0AdJmjNc39ruf8AnvJ/30aPtdz/AM95P++jQB0maM1zf2u5/wCe8n/fRo+13P8Az3k/76NAHSZozXN/a7n/AJ7yf99Gj7Xc/wDPeT/vo0AdJmjNc39ruf8AnvJ/30aPtdz/AM95P++jQB0maM1zf2u5/wCe8n/fRo+13P8Az3k/76NAHSZozXN/a7n/AJ7yf99Gj7Xc/wDPeT/vo0AdJmjNc39ruf8AnvJ/30aPtdz/AM95P++jQB0maM1zf2u5/wCe8n/fRo+13P8Az3k/76NAHSZozXN/a7n/AJ7yf99Gj7Xc/wDPeT/vo0AdJmjNc39ruf8AnvJ/30aPtdz/AM95P++jQB0maM1zf2u5/wCe8n/fRo+13P8Az3k/76NAHSZozXN/a7n/AJ7yf99Gj7Xc/wDPeT/vo0AdJmjNc39ruf8AnvJ/30aPtdz/AM95P++jQB0maM1zf2u5/wCe8n/fRo+13P8Az3k/76NAHSZozXN/a7n/AJ7yf99Gj7Xc/wDPeT/vo0AdJmjNc39ruf8AnvJ/30aPtdz/AM95P++jQB0maM1zf2u5/wCe8n/fRo+13P8Az3k/76NAHSZozXN/a7n/AJ7yf99Gj7Xc/wDPeT/vo0AdJmjNc2Lu5Bz57/8AfVbOn3RuYMv99Tg+9AFvNGaZI4jjZz0UEmsGa+uJXLeayDsFOMUAdDmjNc19puP+e8v/AH2aPtNx/wA95f8Avs0AdLmjNc19puP+e8v/AH2aPtNx/wA95f8Avs0AdLmjNc19puP+e8v/AH2aPtNx/wA95f8Avs0AdLmjNc19puP+e8v/AH2aVby5Rsidz9TmgDpM0ZqpYXf2qI7hh16gVazQAuaM1z017cvKx81l56A4xTPtdz/z3k/76NAHSZozXN/a7n/nvJ/30aPtdz/z3k/76NAHSZozXN/a7n/nvJ/30aPtdz/z3k/76NAHSZozXN/a7n/nvJ/30aPtdz/z3k/76NAHSZozXN/a7n/nvJ/30aPtdz/z3k/76NAHSZozXN/a7n/nvJ/30aPtdz/z3k/76NAHSZozXN/a7n/nvJ/30aPtdz/z3k/76NAHSZozWLaanIjhZm3oe/cVsg5GRQA2WJJVww+h9KtaFfva3IsJ2zG5+Qnsf8DVfNVrxSUEi8Mh60AdvRVbTroXljFP3YfN7HvVmgAooooAKKKKACiiigAooooAKKKKACimTSxwRNLK6oi8lmOAK5y/8UE5j0+Ld/01kGB+A/xoA6aoJb20gOJbqGM+jOBXCXNzqV4SZ7h5FP8AAG2j8hxUUaxIQJI/LPqw4/OgDuTrOmA4+3Qf99U9NT0+Q4S9tyfTzBmuRjgRlBAUj2p5tYz1jU/UUAdqrK65Vgw9Qc0tcQtosbboS8TesbFT+lWodR1S2+7cCdR/DMuf1HNAHW0ViWviO3YhLyJ7Zv7x+ZPzFbMciSoHjdXQ8hlOQaAHUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUVS1LUodPh3Od0h+6g6n/61AEt9ew2MBlmbHoo6sfauTubmfVJ/NmO2IfdQdB/n1pkjz385uLps+i9gPb2qYcDAoAFAVQAMAUuaTNU72+WAbEwZP5UASXl4lsuBhpD0X/GsOSR5XLu2WNIzM7FmJJPUmkoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArW0b/AFUn+8Kya1dH/wBVJ/vCgC7dH/RZv9xv5VztdDdH/RZv9w/yrnqACiiigAooooAKKKKACiiigC5pcvl3YU9HGK281zKMUdXHVTkV0aOHRWHQjIoAxdSi8q7YgcP8w/rVWtjVYt9uJB1Q/pWPQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVuabP5tqFJ+ZPlP9Kw6t6bN5V0FJ+V+D9e1AG5mggMpB6GkzRmgC54ZuTFcS2TnhvmX6jr+n8q6WuIeRra6iuo/vIwNdpDIs0KSocq4DCgB9FFFABRRRQAUUUUAFFFFABTJpUgheaVtqICzH2p9Yni2Ux6SsYP+tlVT9OT/SgDnNS1GfVbjfJlYQf3cXYD1PqabFFTIFzzV6JKABIqmEIIwRkVIi1Kq0AZl1pZkjP2WZ7Z/wDYJAP1rF+26ppNwEu90if7ZyGHs1dhtqpfSWTxm3uMSbv+WYGW/TpQAlncQ3tus0Jyp6juD6GpGjrG0zTr6zvJHthtt342z9fbIHetb7Ndufnuwo9EjH9c0ARyRAjBFQQyXFhIZLOUx55KdUb6irf9n5+9d3B+jAf0pDpkR6z3B/4HQBraZ4ggu2WC5At7g8AE/K30P9K2a4x9GgcYM034sD/Sr1pd3Wl4EjyXVp33cvH7j1HtQB0tFMgmjuIVlhcPGwyGHen0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFY+sa0tpm3tiHuDwT1Cf/AF6AJtW1aLT02Lh7gjhfT3NcziS4mNxcsXdueaaiMzmWVi8jHJJ5qXNADs0Zpuaz72+6xwn6sP6UASXt8I8xxHL9z6VkkkkknJNFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABWppH+qk+tZdaekn93J9aAL0yl4ZEHVlIFc8QQSCMEV0WajkghkOXjUn1xQBg0VufZLf8A55LR9kt/+eS0AYdFbn2S3/55LR9kt/8AnktAGHRW59kt/wDnktH2S3/55LQBh0VufZLf/nktH2S3/wCeS0AYdbenljZpu98fSlFrbj/lktTDgYHAoAV1DoyN0YYNc9IhjkZD1U4roM1lanHtnEg6OP1oApUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUA4ORRRQBv203nQJJ3I5+tS5rL0qbDNETweRWlmgAkXfGV9a2vDF35lq9q5+aI5H0P/wBesXNLY3H2HVY5s4jb5X+h6/40AdpRRRQAUUUUAFFFFABRRRQAVg+L0J0yFx/DMufyIreqhrlsbvR7mJRltu5fqOR/KgDjoO1X4qzLZ8qDWjE1AFxBSyzRwRGSRgqj9aiaZIYmkc4VRk1STfcyiecdPuJ2Uf40ATFri8PJaCH+6Pvt9T2qxbwRQLiNAv8AM0iVMtADxS0lLQAUUUUAFFFFAEUMsumTGe3UvAxzLCP/AEJff+ddFbzxXMCTQuHjcZBFYVRW9w2lXJlGTaSH96g/gP8AeH9aAOmopFYOoZSCpGQR3paACiiigAooooAKKKKACiiigAooJABJOAOpNczrGttOWtbJiE6NIP4vp7UAT6xre0ta2TZfo0g7ew/xrDjj2/M3LHvSRoEHv60/NADs0E4GTTCwUEk4A71mXd2ZconCfzoAfeXpfMcRwvc+tUqKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArS0s/u5PrWbWjph/dv8AWgC/mjNNzRmgB2aM03NGaAHZozTc1C93CjbWfn2GaALGaM1V+22/9/8AQ0fbbf8Av/oaALWaM1BHcRSnCOCfSpc0AOzRmm5ozQA7NV76PzLZvVfmFTZpM5oAwqKfPH5UzJ6HimUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAOicxyK46qc1uq4ZQw6EZFYFaWnS7oTGeq/yoAvZqOdd0Z9RzTs0ZoA6jQrv7Xpqbjl4/kb8On6Vo1yXh65+y6mYGOI5uPx7f4fjXW0AFFFFABRRRQAUUUUAFFFFAHA6lanT9UmgAwmd6f7p/w6U6GWt7xXYmazW8jXMkH3sd0PX8uv51ynmmNSwoAtTS/aLgJ/yzj6+7f/Wq1EazbbhQO/U1fiagC4hqZaroanU0ASilpoNLQAtFFFABRRRQAU1gCpBGQe1LTWNAE2iXRtp/7OlP7s5aBj+q/h2rerkrpGeMFG2yoQyN6MOldHpt4t9Yx3AGCwwy/wB1h1FAFqiiigAooooAKKKKACmySJFG0kjBUUZJPam3E8VtC0szhEXqTXIapqkupSbRlLdTwvr7mgCbVtYkv2MFuSluOp7v9fb2rPUBRgU0YAwKXNADs0juqKWY4ApkkixqWY4FZs87TNzwo6CgB1zctMcDhB29agoooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAq/px/dv9aoVe08/I/1oAu5ozTc1We9RWwoLe9AFvNGapfbx/wA8z+dJ9vH/ADz/AFoAtzsVhcg4IBrHqxPdNKu0Davf3qvQAUUUUAAJUgg4IrYhk8yJX7kc1j1LDO8J+XkHsaANbNGaofbz/wA8x+dJ9vb/AJ5j86ANDNGaopfAnDpgeoq2GBAIOQaAKmopysg+hqlWrOnmQsvftWVQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVLayeVOp7Hg1FRQBt5ozUFtL5kKk9RwalzQAkhKlZFOGU5Brt7C5F5ZRTj+Icj0PeuJPIxW14Wutry2bnr86f1oA6SiiigAooooAKKKKACiiigBGUMpVgCCMEHvXn2s2DadqBtx/qid8Z/2fT8K9CrN13TRqViVUATx/NGff0/GgDh4mwauxNWeMqxDAqwOCD1BqzE9AGlG1To1UY3qyjUAWgaeDUCtTw1AEtGaYGpd1ADqKbupC1ACk0wmgtUbNQAjtVnw9P5Woz2pPyTDzV/3hwf6H8Kou1RQT+TqdnN/dlCn6Hg/zoA7aiiigAooooAKr3t5DYwGWZsDsB1Y+gqPUtRh0+HdIdzn7qDqf/rVx15dzX05mnbJ7AdAPQUAS6hqE2ozb5DtjH3UHQVWBxTc0ZoAfmmSyrEuWP0HrRmqcsUzyEkZ9OaAIpZWlbLfgPSmVL9nl/u/rR9nl/u/rQBFRUv2eX+7+tH2eX+7+tAEVFS/Z5f7v60fZ5f7v60ARUVL9nl/u/rR9nl/u/rQBFRUv2eX+7+tH2eX+7+tAEVFS/Z5f7v60fZ5f7v60ARUVL9nl/u/rR9nl/u/rQBFRUv2eX+7+tH2eX+7+tAEVFS/Z5f7v60fZ5f7v60ARUVL9nl/u/rR9nl/u/rQBFRUv2eX+7+tH2eX+7+tAEVFS/Z5f7v60fZ5f7v60ARUVL9nl/u/rR9nl/u/rQBFRUv2eX+7+tH2eX+7+tAEVFS/Z5f7v60fZ5f7v60ARUVL9nl/u/rR9nl/u/rQBFRUv2eX+7+tH2eX+7+tAEVFS/Z5f7v60fZ5f7v60ARUVL9nl/u/rR9nl/u/rQBFRUv2eX+7+tH2eX+7+tAEVFS/Z5f7v60fZ5f7v60ARUVL9nl/u/rR9nl/u/rQBFRUv2eX+7+tH2eX+7+tAEVFS/Z5f7v60fZ5f7v60ARUVL9nl/u/rR9nl/u/rQBFV2xPyP8AWq/2aX+7+tW4YxEm3OT1NAEkpxE+P7prLrTOCCD0NUntnDfL8woAhoqX7PL/AHf1o+zy/wB39aAIqKl+zy/3f1o+zy/3f1oAioqX7PL/AHf1o+zy/wB39aAIqKl+zy/3f1o+zy/3f1oAioqX7PL/AHf1o+zy/wB39aAIqu2UmUKHtyKr/Z5f7v61NbQtGxZuOMYoAuZrNuU2TMOx5FX81FPEJV9GHQ0AUKKlNtKD0B/Gj7PL/d/WgCKipfs8v939aPs8v939aAIqKl+zy/3f1o+zy/3f1oAioqX7PL/d/Wj7PL/d/WgCKipfs8v939aPs8v939aAIqKl+zy/3f1o+zy/3f1oAioqX7PL/d/Wj7PL/d/WgB9lJtkKno386v5qhFbyCRS3ABz1q5mgB+adbzta3cVwnVGz9R3FRZpCcigD0KN1kjWRDlWAIPtTqxfDN351ibdj88J4/wB09P61tUAFFFFABRRRQAUUUUAFFFFAHK+KtK2MdRgX5T/rlHb/AGv8a51Gwa9LdFkRkdQysMEHoRXB63pbaXdYXJtpOY29P9k0ARRyVaSSstHK1ZjloA0lepFeqKSVKslAFwPS7qqiSneZQBY3UheoPMppkoAmZ6iZ6iaSonkoAfJJVWRyXQDrvXH5ikklp2lwtd6taxAZHmBm+g5P8qAPQqKKKACs7VtWi0+PaMPOR8qenuah1rWFsVMMOGuCPwT6+9chLK8sjO7FmY5JPU0ASXFxLczNLM5d26k1HmmZozQA/NGaZmjNAD80ZpmaM0APzRmmZozQA/NGaZmjNAD80ZpmaM0APzRmmZozQA/NGaZmjNAD80ZpmaM0APzRmmZozQA/NGaZmjNAD80ZpmaM0APzRmmZozQA/NGaZmjNAD80ZpmaM0APzRmmZozQA/NGaZmjNAD80ZpmaM0APzRmmZozQA/NGaZmjNAD80ZpmaM0APzRmmZozQA/NGaZmjNAD80ZpmaM0APzRmmZozQA/NGaZmjNAD80ZpmaM0APzRmmZozQA/NGaZmjNAD80ZpmaM0APzRmmZozQA/NGaZmjNAD80ZpmaM0APzRmmZozQA/NGaZmjNAD80ZpmaM0APzRmmZozQA/NGaZmjNAD80ZpmaM0APzRmmZozQA/NGaZmjNAD80ZpmaM0APzRmmZozQA/NGaZmjNAD80ZpmaM0APzRmmZozQBpaLd/Y9SjcnCN8j/Q129ebg813ej3BudLgkblsbT9RxQBdooooAKKKKACiiigAooooAKgvbSG+tXt51yjfmD6ip6KAPOtQsZtOuzbzc90fs49argkV6FqenQalamGYYI5Rx1U+tcLf2Nxp1x5NwuM/dcfdYe1ADFlxUqy+9VKXJFAF4S+9O82qAcil8w0AXvN96aZfeqfmGkLk0AWWlqFpc1FnNOhikuJRFBG0sh/hUZoAazdya6/wtpbWsLXk67ZZRhVPVV/+vUejeGxA63N/teQcrEOVU+/qa6OgAooooA8/wBQWYXkwmBEm8ls1V2tXoN7bwyxkywxuR0LKDisn7Lbf8+8X/fAoA5Ta1G1q6v7Lbf8+8X/AHwKPstt/wA+8X/fAoA5Ta1G1q6v7Lbf8+8X/fAo+y23/PvF/wB8CgDlNrUbWrq/stt/z7xf98Cj7Lbf8+8X/fAoA5Ta1G1q6v7Lbf8APvF/3wKPstt/z7xf98CgDlNrUbWrq/stt/z7xf8AfAo+y23/AD7xf98CgDlNrUbWrq/stt/z7xf98Cj7Lbf8+8X/AHwKAOU2tRtaur+y23/PvF/3wKPstt/z7xf98CgDlNrUbWrq/stt/wA+8X/fAo+y23/PvF/3wKAOU2tRtaur+y23/PvF/wB8Cj7Lbf8APvF/3wKAOU2tRtaur+y23/PvF/3wKPstt/z7xf8AfAoA5Ta1G1q6v7Lbf8+8X/fAo+y23/PvF/3wKAOU2tRtaur+y23/AD7xf98Cj7Lbf8+8X/fAoA5Ta1G1q6v7Lbf8+8X/AHwKPstt/wA+8X/fAoA5Ta1G1q6v7Lbf8+8X/fAo+y23/PvF/wB8CgDlNrUbWrq/stt/z7xf98Cj7Lbf8+8X/fAoA5Ta1G1q6v7Lbf8APvF/3wKPstt/z7xf98CgDlNrUbWrq/stt/z7xf8AfAo+y23/AD7xf98CgDlNrUbWrq/stt/z7xf98Cj7Lbf8+8X/AHwKAOU2tRtaur+y23/PvF/3wKPstt/z7xf98CgDlNrUbWrq/stt/wA+8X/fAo+y23/PvF/3wKAOU2tRtaur+y23/PvF/wB8Cj7Lbf8APvF/3wKAOU2tRtaur+y23/PvF/3wKPstt/z7xf8AfAoA5Ta1G1q6v7Lbf8+8X/fAo+y23/PvF/3wKAOU2tRtaur+y23/AD7xf98Cj7Lbf8+8X/fAoA5Ta1G1q6v7Lbf8+8X/AHwKPstt/wA+8X/fAoA5Ta1G1q6v7Lbf8+8X/fAo+y23/PvF/wB8CgDlNrUbWrq/stt/z7xf98Cj7Lbf8+8X/fAoA5Ta1G1q6v7Lbf8APvF/3wKPstt/z7xf98CgDlNrUbWrq/stt/z7xf8AfAo+y23/AD7xf98CgDlNrUbWrq/stt/z7xf98Cj7Lbf8+8X/AHwKAOU2tRtaur+y23/PvF/3wKPstt/z7xf98CgDlNrUbWrq/stt/wA+8X/fAo+y23/PvF/3wKAOU2tRtaur+y23/PvF/wB8Cj7Lbf8APvF/3wKAOU2tRtaur+y23/PvF/3wKPstt/z7xf8AfAoA5Ta1G1q6v7Lbf8+8X/fAo+y23/PvF/3wKAOU2tRtaur+y23/AD7xf98Cj7Lbf8+8X/fAoA5Ta1G1q6v7Lbf8+8X/AHwKPstt/wA+8X/fAoA5Ta1G1q6v7Lbf8+8X/fAo+y23/PvF/wB8CgDlNrUbWrq/stt/z7xf98Cj7Lbf8+8X/fAoA5Ta1G1q6v7Lbf8APvF/3wKPstt/z7xf98CgDlNrUbWrq/stt/z7xf8AfAo+y23/AD7xf98CgDlNrUbWrq/stt/z7xf98Cj7Lbf8+8X/AHwKAOU2tRtaur+y23/PvF/3wKPstt/z7xf98CgDlNrUbWrq/stt/wA+8X/fAo+y23/PvF/3wKAOU2tRtaur+y23/PvF/wB8Cj7Lbf8APvF/3wKAOU2tRtaur+y23/PvF/3wKPstt/z7xf8AfAoA5iGGSWRURSzk4Cjkmu70u1Nnp8UDHLAZb6nmn2dvDDEDFDGhPUqoGasUAFFFFABRRRQAUUUUAFFFFABRRRQAVFc20F3C0NxGskZ7GpaKAOS1DwtPGS9jIJU/55ucMPoehrCngntm23EMkR/21I/WvSqCAwwQCD2NAHmG4eooyPUV6HPp1iylmsrct6mJf8KZBpthkn7Dbf8Afpf8KAOAX52CoCzHoFGTWhbaJqd0RttWjX+9L8uPw613kcccS7Y0VF9FGKdQBzdn4TiXDXtw0h/uR/Kv59T+lb1taW9pH5dvCkS+ijr9fWpqKACiiigAooooA//Z"/><clipPath id="y"><path d="M196 92.398h56v62.16h-56zm0 0"/></clipPath><image id="z" width="470" height="518" xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAA0JCgsKCA0LCwsPDg0QFCEVFBISFCgdHhghMCoyMS8qLi00O0tANDhHOS0uQllCR05QVFVUMz9dY1xSYktTVFH/2wBDAQ4PDxQRFCcVFSdRNi42UVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVH/wAARCAIGAdYDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD06iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAorB1rxZpekFo2kM9wP+WUXJB9z0H864XVvGur6gWSGQWcJ/hh+9+LdfyxQB6Zfapp+nLm8u4ofZm+Y/QdTXOXvxB0uHK2sE1y3rjYp/E8/pXmhLyyFiWd25JPJNSpaSt1AUe9AHVXXxD1KTItrW3hH+1lz/QfpWXP4w1+frqDIPREVf5Cs9bFf4nJ+lSC0hH8JP1NADZNb1aX7+p3Z9vObH86ga+vH+9dzt9ZDVwQRD/lmv5U7y0H8C/lQBn/a7n/n4l/77NPXUb5Pu3twv0lb/GruxP7i/lSeVGf+Wa/lQBHHr2sRfc1S7+hmYj9TV2Hxjr8PS/Lj0dFP9M1VMER/5ZrTDaQn+Ej6GgDoLb4h6nHgXFrbTD2BU/zI/Stmz+ImnyYF1aTwH1UhwP5H9K4JrFf4XI+vNRNZyjphvpQB7FYeINI1AgW1/EznojHa35HBrSrwVkdPvKR9a09N8R6vpmBb3jmMf8s5PmX8j0/CgD2eiuJ0n4hW0pWPU7cwN/z1iyy/iOo/Wuwtbq3vIBNazJNGejIcigCaiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoorI8ReILXQrXfKfMncfu4QeW9z6D3oAu6jqNppdqbm8mWKMdM9WPoB3NebeIPGt7qRaCyLWlr04PzuPc9voP1rE1bVrzWLs3F5KWb+FRwqD0AqOC0LYaTgenegCukbyNhQTVuKyUcyHJ9BVpVVFwoAFLQA1VVBhVAHtTqKKACiiigAooooAKKKKACiiigAooooACMjB5qCS1ifoNp9qnooAzpbWROQNw9qfp+o3mmXAmsrh4X74PB+o6Gr1QzW6S84w3qKAO48P+O7a8K2+qBbaY8CUf6tvr/d/lXZAhgCCCDyCK8HlheI/MOPUVv+G/Ft3ozLBNuuLL/nmTyn+6f6dPpQB6zRVawv7bUrRLq0lEkTdx2PoR2NWaACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooqpquowaVp8t5cthIxwO7HsB7mgCl4k1+30Kx818PcPxFFn7x9T7CvI768udRvHubmQyTSHk/0HtUur6nc6vqEl5ctlm4VR0QdgKda2+wb3HzHp7UAFtbBMO4y3p6VZoooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAQgMMEZBqjcWpTLJyvp6VfooAj0HXLvQ7wTW7bo2/wBZET8rj+h969b0nVLXV7FLu1fKnhlPVD6GvG7q2xmSMcdxVrw9rlxoeoCeLLRNxLFnhx/j6UAez0VBY3kF/ZxXVs4eKQZU/wBPrU9ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXk/jXXjq+pGCB82duSqY6O3dv8AD2+tdh471r+zdJ+ywti5ugVGOqp3P9Px9q8uhjMsgXt3oAns4Nx8xhwOlXqQAKoAGAKWgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACqF3B5Z3qPlP6VfpGUMpUjINAGh4J8QnSb77Jcv/AKFO3Of+Wbdm+nr/APWr1WvB5ojFIVPTsa9M8Ba6dQ082Fw+bm2A2k9XTsfw6flQB1lFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUjMFUsxAAGST2pa5rx5qf8AZ+gPCjYmuj5Q9l/iP5cfjQB554k1VtY1qe6yfKzsiB7IOn59fxqO0i2Rbj95uap28fmTBe3U1qUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAEN1F5sXA+ZeRUWj6jLpOqQXsXJjb5l/vL3H5VbrOu4/LlyOjcigD3G2njuraK4hbdHIodT6g1JXFfDfVfPsZdMlbLwfPHn+4TyPwP8AOu1oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACvKviBqP2zxA0CtmO1Xyx/vdW/w/CvT7y5Szsp7qT7kKM5/AZrw2aWS5uJJpDuklcsx9STmgC1YpiMuerdKtU1F2IqjsMU6gAooooAKjlmSJcsfoKc7BFLHoKzT5lzOAqlnchVUfoKALIvhnmMgexqyjq6hlOQam1TwxeabYrdF1lH/LRVH3P8RWRbzGF+eVPUVMZKSuhuLjozTopAQwBByDS1QgooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAqG7j3wnHVeRU1FAEXhzUjpWuW12TiMNtk/3Twf8fwr2kHIyORXg0yeXKy+h4r17wfqH9o+G7WRmzJGPKf6rx/LB/GgDbooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA5n4g3n2bw08QOGuHWP8Op/lj8a8vtF33C+g5rsfibd776ysweI4zIfqxx/wCy/rXKWC/fb8KALlFFFABRRRQBTvpOBGPqa2vBGni41B7x1yluML/vH/AZ/SucmfzJWb1NeleGLL7DocCkYeQea/1P/wBbFYV5csfU1pRvI1GVXQo6hlYYIPQivPPE2gtpc5ngUtaSHj/YPof6V6LTJoY7iF4ZkDxuMMp6EVyU6jg7nTOCkjya2uDEdrfcP6VoAggEHINS+IvD8ukymWIF7Rj8rd09j/jWVb3BiODynp6V6EZKSujiaadmaNFIrB1DKcg0tUIKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooApX6YZX9eDXYfDK9xPeWDHhlEyj6cH+Y/KuVu13W59uas+D7v7H4nsnJwrv5Tf8C4/mRQB7FRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB5B41uftPim8IOVjIjH4AA/rmqdmu23HvzVa/n+1ahc3HXzZWf8yTV2IbYkHoBQA5mCKWY4ApkU8cpIU8jsahv2xGq+pzVa1bbcL78UAadQ3T7IGPc8VNVK/f5lT05oAXSbT7dqltbYyHcbv8AdHJ/TNergADAGBXDeA7TzL64u2HESbF+p/8ArD9a7quHESvK3Y6qKtG4UUUtc5sMliSaNo5UDowwysMgiuC8R+GJLAtdWQaS16svVo/8R716BRitITcHoRKCktTx6GZoWyvI7itCKZJVyp57j0rpfEHhJJ911pqhJerQ9Fb6eh9ulcS6y28xR1aORDggjBBrvhNTWhySi47mrRVWC7Vvlk+U+vY1aqyRk0gijLkZ9qrx3iscONvuKnmTzImXv2rLoA1wQRkHIpay4pniPynj0NXobhJeM4b0NAE1FFFABRRSHODjrQAZGcZGaWsgllc8kMDVqG8/hl/76oAu0UgIYZByKWgAooooAKKKKAEYblK+oxWVG7QzLIpw6MGH1Fa1ZU67ZnHvQB7rbzLcW8U6fdkQOPoRmpKx/CNx9p8L6e+c4j2f98kr/StigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACquqTfZ9KvJ/+ecLv+Sk1arH8XS+V4X1BvWLb+ZA/rQB44o3MB6nFa9ZcAzOn1rUoAz71t0+P7oxUCNtcN6HNLI2+Rm9TSzRPDK0cgwy9RQBq1l3D752PviryyYtA/ov61Rt4WuLiOFPvyMFH1JxQB6J4PtPs2gxMRhpiZD+PA/QCtymQRLBBHCgwqKFH0AxUleXJ8zbO9KysFFFFIAopaKACsvWNCs9Xj/ersmA+WVeo+vqK1KKpNp3Qmk9GeV6vod7pMn75N0RPyyr90/4GqcNy8XH3l9DXr0kaSxtHIiujDBVhkEVyWs+DEk3TaYwRuphY/Kfoe3411Qrp6SOeVK2qOcimSUfKefQ9ao3ceyYkdG5ouba4s5zFcRPFIvZhimvM0iBX5I6HvXSYmtoujRazZzJDL5V5CcgN911P8uf6Vm3tjdafOYbqFo37Z6H3B71b8O3/wDZ2swTMcRsfLk/3T/hwfwr0u7s7e9gMNzCssZ7MOn09K551HTlrsbRgpx03PKobtk4f5h696upIsi5U5rV1jwdNBum05jNH18pvvD6etcuRJBIVIaN1OCCMEVtGakrozlFx3NWiqkV4DxKMe4q0rBhlSCPaqJKV7FtYSDoeD9aqgEnABNasqeZGy+tZ0Er21xHMnDxsGH1FABDM8R+U5HcVoQzJKuVPPcVv6p4bg1K0TUdKAjeRA/ldFbPp6H9K49llt5irK0ciHBBGCDUQmp7FSg47mrRUFvcCUbW4f8AnU9WSFFFFABWdeDFwfcA1o1Rvx+8U+1AHpHw5m8zw2U/55Tsv6A/1rqq4f4YSZsr+L+7IrfmD/hXcUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVzvj19nhO5H99kX/x4H+ldFXK/EZtvhoD+9Og/Qn+lAHmdoM3Kfj/Kr07bIHPtiqVn/wAfA+hqe/bEar6mgCLTrf7XqNvb4yHkAP0zz+lafjC38nW2kAwsyK/49P6U/wAGW/m6wZiOIUJ/E8f1Na3je18yxgulHMT7W+h/+uP1rllUtWUTeML0mzkPN/0Ty++79K1vB1r9p1+JiMrCpkP8h+pFYddx4Btdtpc3ZHMjhB9Byf5/pWtWXLBmdNXkjrKWiivPO0KWiloEFFFFMQUUtJQAUUUUAVb6wtdQh8q6gWVe2eo+h7Vx+q+C5ot0unSecnXynOGH0PQ/pXc0VcakobEygpbnjs8E1vKYp4njkHVWGDXqmjGdtHtDcgiXyhuz1/GrbxRyMrPGrFeVJGcU6qqVedJWFCHKxKz9U0ax1RMXEX7zHEi8MPx7/jWjSVim1qjRpPc861bwpfWO6SAfaoR3QfMPqP8ACsJHeJvlJB9K9hrM1PQdP1PLTQ7ZT/y1j4b/AOv+NdMMR0kYyo/ynnkd6DxIuPcVWnKmZihyDzXRX/gy+hJa0kS4T0Pyt+vH61mR+HtXkmEYsZVPq3A/OulVINXuYuEl0Ox8GzNLoEat/wAs3ZB9M5/rUuvaDBq0RcYjulHyyevsfarOi6cNL0yK13BnGWdh3Y9av158p2m5ROxRvG0jyS6tp7K6aCdDHKh5H9RVq2uPNG1vvj9a7vXtFi1e1xwlwg/dyf0PtXnE0UtrcNFIpjljOCD2Nd1Kqqi8zkqU3BmpRUNvMJk9GHUVNWpmFU9QH+rP1q5VS/8Aup9TQB13wvfE+op6rGfyLf416DXnHwxP/EzvR/0xH869HoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArkfiUceHYPe6X/ANBauurkfiX/AMi9b/8AX0v/AKA9AHnNl/r/AMKL1t02P7oosf8AX/hUMrb5Gb1NAHaeCLfZp89wRzLJtH0A/wASa3r61S9spraT7si4z6Hsfzqvodv9l0a1ixg7Ax+p5P8AOtCvHqTvUckelCNoJHmUui6lFdG3NpKz5wCqkqffPSvRNDtDp2lwWrY3KMsR/ePJq0KWtKleVRJMiFJQdyeimI3Y0+pTuN6C0tJS1RIUtFFMQUUtJQAUlLSUhhSUtJQMSilpKQBSUtJSGJRRRQMSiiikAlFFFIYlYHifQRqUX2i3AF2g/wC/g9Pr6Vv0VUZOLuhSipKzPIv3kEpBBR1OCCOR7VoQTrMvow6ius8ReHU1JTc2wCXYHI6CT6+/vXCOkttOyOrRyIcEEYINelTqKotDhnBwepqVUv8A7qfWnQXSyYV/lb9DTb/7qfjWhB03wyH/ABOLs/8ATD/2YV6TXnHwxX/iZXrekIH616PQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXJfEoZ8Own0uVP8A461dbXLfERd3hkn+7Mh/mP60AeYQvsLn/ZNSWEH2q/t7ftJIqn6Z5qvWz4Vh36wkhHEQ3fj0/rUVJckHIunHmkkehAYGBS0gpa8U9MUUtIKWmSLUiNng9ajpRVJ2E1cmpaYrZ4PWn1qmZsKWkpaYhaSiigQlFFFAwpKWkpDCkoooAKSlpKQxKKKKBiUUUUgEooopDEoopKBhWVrWh2urR5ceXOB8soHP0PqK1aShScXdCaTVmeW6lpl1ps5juI8D+FxyrfQ1VaRnVVY5C9K9N1CKOe0eOVFdG7EVyk3hWW4uAmnMCWziNzjHfg12UsUpPlloznqYZxXNHY2PhemZdSk9BGv57v8ACvQK57wdoEuhWEq3Lq08zBmCchQOgz+ddDXYcoUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXPePE3+E7s/3Sjf+Pgf1roayfFUXneGNQX0hLflz/SgDxmun8KxbLWWfHLuAPoP/wBdcxXcaXbm106CJhhguSPc8/1rjxsrU7dzrwkbzv2OjHNLUcLboUPsKkrzkdbFFLTadTEFLSUtMQtSK2eD1qOlqk7EtE1FRq/Y1JWidyGgooopiCikooGFFFJSAKKKKAEoopKQwoopKQwpKWkoGFFFJSAKSlpKQwpDwDS0xz8tJjRTvDiED1NS6Cu7UlP91Sf6f1qven7g/Gr/AIbTM80nooH5n/61TQV60UXVdqTOgooor3DyAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACobyAXVnPbMcCWNkJ+oxU1FAHk9p4L1h9US2ntSkIcb5tw27c8ketddrUQi1JwBhWAYD8K6qsLxJFzDMPdD/Mf1rkxkealfsdOFlapbuU7JswY9DirNULFsOy+ozV6vMjsd8lqLS0lLVEC0tJRTELS0lFMQtOViKbRRcRKCD0paiBxTg/rVqRLQ+ikoqhBRRRQAUlFFIYUlFFAwpKKKQBSUtJQMSiiikMKSiikAlRucmnO2OB1qOok+hcUUbtszY9Bitzw7HtsnkP8b/oP8muekbfIzeprrtOi8iwhjIwduT9TzW2Cjeo5diMU7U0u5Zooor1jzAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAqlq8Pn6dKAMlfnH4f/WzV2ggEYPINTOPNFxfUqMuWSZxML7JlbtnmtWs28gNtdywn+FuPp2q7bv5kKnuODXhK6biz2JapSRNRSUtWZi0tNpaBC0tJRTELRSUUAOopKKYhQSOlODjvTKKE7BYlznpRUWcUoc/Wq5hcpJSU3eKXcD3p3FYWkoooAKM0lFAwoopKQBRSFh600uKVx2HUxnx0ppYmm1Dl2LSCo7h9kLHv0qSqd6+WCDtyazbLSuxtlD9ovIouzNz9O9dlXP8Ahy33TSXBHCjaPqf8/rXQV6eChyw5u5w4ud527BRRRXacgUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAYXiK25juVH+w39KzLKTbIUPRv511d3AtzbSQt/EOvoe1cayvDKVYbXQ4PsRXk4unyT511PTw0+eHK+hq0tMicSRhh3p9YFsWikpaYhaKSloAWikopiFooooAKKKKACikooAKKKSkMXNGT6mkooAXcfWk3H1pKKLhYNx9TSUUUhhSUtJSGFJRRQMQkKCT0FZrsXcse5q1eSYUIOp60/RrX7TfKWGUj+Y/0FJRc5KKKuoRcmdBptt9lsY4yMNjc31NWqKK92MVFJI8aTcndhRRRVCCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArA8QWeyQXSDhuH+vY1v0yeJJ4XikGVYYNZVqftYOJrSqezlzHI2cux9h6N/Or9Zt1bva3Dwv1U9fUetXLabzUwfvDrXiq6fKz1ZWa5kT0UlFUZjqKSigBaKKKYhaKSigBaKSigAooooAKKKSgBaSiikMKSiigAoopKQwpKWkoGFIzBVLHoKWqV1LubYvQdaTdhpXIXYyOWPU11WlWn2SzVWGJG+Zvr6VkaHZefcfaHH7uM8e7V0ld+CpW/eM5MXV+wgooor0DhCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAM7WLD7XB5kY/fR9P9oelczG7ROGHUV29YGt6dtJu4V+U/fUdvevPxdC/wC8j8zuwta3uSIo3EiBl706s2CYxN6qeorQVgyhgcg1wJ3OuUbDqWkoqiRaKSigQtFJS0ALSUUUAFFFJQAtFJRQAUUUUDCikopAFFJRQMKKKimlES+pPQUgG3M3lrtX7x/Sq9pbvd3Cwx9T1PoPWoXfOXY+5NUWvZlm3wSvHjoVOKjmV/e2No021aJ6HbwJbwJDGMKo/OpK5bSPEzblh1Agg8CYDp9R/WuoBDKGUgg8gjvXuUasKkfcPHrUZ0pWmLRRRWxiFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFc14o1cxg2Fu2GI/esOw/u1p63qi6Zabhhp34jU/zPtXCZkuJySS8kjZJPcmvPxlflXs47s9LBYfmftJbIuW1x5g2Mfn/nV2CcxN6qeorOvoRbGJF6hck+pqa1laWPLdQcZry1dOx6E4prmWxtq4dQynIpazIpWibI6dxV+KZZRlTz3Fap3OZxsS0UlFMkWikooAWikooAWikooAWikooAKKKSgBaSiigYUUVXmuQnypy38qTY0rj5pliHq3YVQdyxLMaCSxJJyTVXUMpHFg8PkkfSobuawjrYhubjzDtX7n86ktPJmTyZEXd2Pc022hE0Einrng1XIaOTByGU1HmdVlayJLm3aBvVT0NbfhvWjbyLZXLfuWOEY/wH0+lUoJUu4Crj5v4h/Ws+eFoZCp6dj61pCbpS54mc4KrFwmemUVgeGdWN1D9jnbM0Y+Un+Jf8RW/Xu06iqRUonz9WnKlJxkFFFFaGYUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFMnmSCF5pW2ogyTT65XxbqOWWwibgYaXH6D+v5VlWqqlByZtQpOrNRRh6lfSahevcPwDwq/3R2FT6TBlmmI6cL/Ws7rXQ20XkwJH6Dn614UbzlzM96doQUUZ2sf66P8A3aZY/wCqb60/WP8AXR/7tNsf9U3+9Sl8TD/l2XY4TKjFeo7Uz5kburCrVj91/wAKnkiSQfMOfWqtoc7lZkEV32k/MVZVgwyCCKoy2zpyPmX2qNHZDlSRRdrcXKnsadFVEu+zr+Iqwk0b9GH0qrolpofS0lFMQUUUUAFFFFIAopCQBknFRPcxr33H2ouOxNTJJUjHzH8KqSXTtwvyj9ahAZ24yxNS5FKPclluGfhflWmRxNK2FH41PFaHrIfwFW1UKMKMChJvcHJLYzZo/Lk25zxVTU/9Xb/Rv51eu/8AXn6CqOp/6u3+jfzpPZmtP4kJp33H+tPu4PNXco+cfrTNO+4/1FW6nobN2ZkxSNFIHXqK0pUS7twy9eo9jVS9h2t5ijg9frRYz+XJsY/K36GktNGU9dUQwyy2twssZKSRnI+teg6ZfR6hZJcJwTwy/wB09xXEahB/y2Uf73+NT+H9T/s+9CyH9xL8r+3oa6sLW9lPlezOTF0fbQ5o7o7uijrRXtnhBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQBX1C7SxspLh/wCAcD1PYV51NK88zyyHc7ksT71ueK9Q8+6FnGf3cPLe7f8A1v8AGsCvFxlbnnyrZHu4Gj7OHM92WLCPzLxAegO4/hW9WTpC5mkb0XH+fyrWrKmtDSs/eMnWP9dH/u02x/1Tf71O1j/XR/7tNsf9U3+9WcviZf8Ay7Rq2P3X/CrVVbD7r/hVutI7HJLcSo5II5OowfUVLRTsTcovZuPuEMPyqBkdPvKRWrRU8pamzKWR1+6xH41ILmUdwfqKutBE3VB+HFMNnEem4fQ0uVj5kVxdyd1Wj7Y/90VKbJOztR9iX++fyotILxITdyHsoppuJT/Fj6VZFlH3ZjTxaQj+En6mizDmiZ5Yt1JP1p6QSv0Q49TxWisaJ91APwp1PkFz9ipHZd5Gz7CrKRqgwqgU6iqSsS5NhRRS0xGdef8AHwfoKoan/q7f6N/Or95/x8H6CqGp/wCrt/o386yfU6KW6E077j/UVbNVNO+4/wBRVs1K2N5bjXUOpU9DWVIhjkKnqK16pX6crIPoaTHFlq3kE9uN3J6NWbcRGGUr26g+1WNNfEjJ2IzVm7h86I4+8ORT3Ql7srG94X1P7Va/ZJWzLCOM/wAS/wD1v8K3a81s7qSyu47iI4ZDnHr6ivRLS5jvLWO4iOUcZ+ntXr4Otzx5XujyMbQ9nPnWzJqKKK7TgCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKoazqC6dYPLkea3yxj3/APrVfrhPEd8bzVHVTmKH5F/qfzrmxVb2ULrdnVhKPtalnsjNRXnmAyWdz1NNcBZGA6A4rV0m22p57DluF+lZky7Z5F9GIrw3Gyue8pXk0uhoaOPllPuP61p1maOeJR9P61ennW3iMjfgPU1tB2ic9RXmZ2sf66P/AHf602x/1Tf71Vbid7iTe5+gHarVkrCM5GATkVk3d3NZLlhZmtYfdf8ACrdVNP8Auv8AUVcraOxxS3EopaKZImKKWimAlFLRQAlFLRQAlFLRQAlFLRQITFGKWigBKXFFFAGbe/8AHwfoKoan/q7f6N/Or97/AMfB+grP1JgUgA/hBz+dZNbnVTesQ077j/UVbNZ1pcCElWHyt39K0QQwBByDUI3ktQqC8GbZvbBqeoLw4tm98UMS3KdmcXSfXFa1ZNoM3Uf1zWtRHYc9zOvoNjeao+Vuvsa0PDerCxuPs8zYt5T1P8Dev0pHUOpVhkGsmeEwybTyOxqozdOSnEmUY1YOEj0yiud8LaqZ4/sM7ZkQfuyf4l9Pwroq96lUVSKkjwKtJ0puMgooorQyCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigCrqdz9j06e4zgoh2/XoP1rzuNTLKqDqxxXWeMLpVs47VWG933MAecD/AOuf0rndKj33W7sgzXkY2XNVUOx7WBjyUnPubKKEQKvAAwKxdUi8u8LY4cbhW4Kq6jb+fb5UZdOR7+orCcbxNacuWWpmabL5d0FPR+Ks6wTiIduf6VmAlSCOCK1rnF3p4kX7y/Nj+dZRd4tG8laSkUrGAzM7Ku7yxuI9vWranB9R6VV0u7+xX8cx+7nDfQ9a6W+0pJh51thWPO3s30r08FyzpODR5WOUoVVK5DaSQtHti4PcHrU9YrLJBJtYMjr+Bq3Bf4wsw/4EKKmFa1gZQrp6SL9FCOsi7kYMPanYrktY6LjaWlopDEopaKAEopaKAEoxS0UxCUUtFACUUtFACUHAGScCoZ7qKHgnc390Vmz3Uk5wThf7orenQlPXZGU6sYjryVXnJQ5HrUMdu903lpGXPXFWbLT5rshsbI+7H+ldDbW0VrHsiXHqe5rvhShBWSOSVWUnds4i7sprVv3kbKp6Ein2Ep3GM9OorofE8irpoQ/edxgfSuasgTcA+gNePiacadW0T3MNUlVpc0jSqjfyZKxjtyatTSiGMsevYetZZLSSZ6sxrnZvFdS3pseZGk7KMfjWhUdvEIYQnfqfrUlWlZESd2JUNxEJoyvfsampDSYIyYJpLW4SWM7ZI2yK9FsbpL2ziuI+jjOPQ9xXn99HtkDjo3863vB15801kx4P7xP5H+ldeCq8k+R7M5sdS56fOt0dTRRRXsHiBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFZer63b6apQfvbjHEYPT6+lTKcYK8mVCEpvlirs0LieK2iMs8ixoOpNctqniiSTMViDGnTzD94/T0rFvr+5v5vMuJC3oo6L9BTrWwlnwzfInqepry6uMlP3aeh61HBQprmq6lV3eRy7sWY8kk5NTWdybaXOMqfvCtmC1hgXCJz3J5JrM1Cz8hvMjH7s/wDjtcbjJe8dsZxl7prxusiB1OVPQ1IKwrC7Nu+xz+7b9PetsEEZByK1jLmRhOHKzJ1Oz8tzNGPkb7w9DUFldfZ3KtzG3UenvW8QGUqwyDwQaxL6xNuxePmI/wDjtZzjZ8yNac1JcsiG6iEUvynMbcqR6V0XhzURND9jlb95GPkz3X0/CuZEh8vYeV6j2NEUjwyrJGxV1OQRTo1nSnzIK1FVocr3O8ubWG6TbKmfQjqKxLvSZ4ctF+9T26j8K09K1KPUIM8LMv31/qPar1e9CSmuaOx89ODhLllucgjvE2VYqauRaiRxKufda27myt7n/WRjd/eHBrLuNElXJgcOPRuDUzpxn8SHGco7EsVxDL91xn0PBqWsSWCaA4ljZPqKI7iaP7sjAenWuaWE/lZvHEd0bdFZiajKPvKrfpUq6kv8URH0OaxeHqLoaKtB9S9RVQajB/dcfhS/2hB/tflUexn2K9pHuWqKqHUoR0Rz+VRtqf8Adi/M01QqPoJ1YLqX6CQoyxAHqayXv526EL9BUDO8hyzFj7nNbRwsn8TM3iF0RqS30KcKd59ulUZr2aXgHYvoKdBp11PysRVfV+BWnbaLEmGnYyH0HArphQhAxlVlIxoLea4fbEhY9/QVs2ejxx4e4Ikb+72H+NaaIkahUUKo7AYpa2MgAAGAMCmTSxwRNLK4RFGSTVe/1K2sEzK+X7IvU1yepanPqEmXO2MfdjHQf4muWviY0lbdnXh8LOs7vRBq2oNqF1v5Ea8Ivt60QbbaEySfeboO9VUKp8zDc3Zf8aR3eV8sSxNeLKTk3J7nuxgoxUY7IWWVpX3N+A9KvWNrsHmyD5uw9KLSy24klHPZfSrtOMerIlLohDSUpprEAZJwKohBTTVeS9jXhQXP6VAb5z0RRUNotRZZu0327eo5qDR7j7Nq1tLnA3hT9Dwf50gvSQQyAg+hqoDg5FClyyUkVy3i4vqeoUUyF/Mgjk/vKD+Yp9fSbnzD0CiiigAooooAKKKKACiiigAooooAKKKKACiiigAopGIVSzEADkk9q5DXtfNzutbNiIejOOr+30rGtWjSjeRtRoSrStEt634jCbrawYFujTDoPp/jXLqsk8uBl3Y59zTra2kuH2oOO57Ctu2to7dNqDnux6mvHnOdd3lse1CEMPHljuV7TTkiw8uHf07Cr1FLVJJbGcpOTuwpGVXUqwyDwRS0UxGDe2jW0nHMZ+6f6VNp975WIpT8nY+la0sSTRlHGVNYV3aPavzyh6NWEouDujpjJVFyyN4HPSg4IIIyDWJZ3zwYR8tH+orXilSVN0bBhWkZKRjKDiZ15pxXMkAyO6en0rOrpc1UurKOfLD5H9R3+tRKHVGsKttJGTbzy20yywuVdehrr9K1aLUECnCTgcp6+4rkJoJIG2yLj0PY0xWZGDIxVgcgjqKqhXlRfkKvh4V159z0Oiue0zxCDiK+4PQSgfzroFZXUMrBlPIIOQa9qlVhVV4s8KrRnSdpIUgEYIyKqy6daS9YQp9V4q1RWpkZUmhxH/VzOv1Garvocw+5LGfrkVu0UAc8dGux/cP0ak/se8/ur/31XRUUAc+ui3R6tGPqT/hUyaE5+/OB9FzW1RQBnR6Napy5d/qcD9KuRW0EP+riVT6gc/nUtDEKCWIAHUmgAorMu9dsbfIV/Of0j5H59KxLzxBeT5WLECf7PLfnXNUxVKn1v6HVTwlWp0svM6a7vrazXM8qqey9Sfwrn7/xHNLlLRfKX++eW/8ArViMzOxZmLMepJyTSV51XGznpHRHp0sDThrLViuzOxZ2LMeSSck0lOjiklbailjWhBpwGGmOT/dFciTZ2OSiUYYJJ2wi8dz2FalvaRwDP3n9TU6qqqAoAA7Cg1aikYym2FJRVW6ulhG1eX9PSm2JK4+edIVy3J7Csyad5m+Y8dgOlNJeV8nLMavW9mEw0gy3p2FZ3bNUlEqxW0koyBhfU1P9gGOZDn6VdpKdhczMmaF4Www47GmVsMoZSrDINULi1MeWTlf5VLRalc7+wlhlsomgkEkYUKGHsKsV53pmp3Gmz+ZEcofvxnow/wAfeu60+/g1C3E0DZ/vKeqn0Ne5h8RGqrbM8HE4aVF33RaooorqOQKKKKACiiigAooooAKKKKACiiigAoJAGScAUVyniXWi5awtW+UcSuO/+yPb1rKrVjSjzM2o0ZVpcsSDxDrhu2a1tWxbg4Zh/Gf8KyLS1e5fA4QdWpLW2e5k2jhR94+lbsUSRRhEGFFeK5SrS5pHtpRoR5IBFEkMYRBgCpKKK0MWwopaKYgooooAKR0WRSrqGU9QaWloAxrvTHTLwZZf7vcf41RSSSF8oxVhXT1XuLOG4++uG/vDg1lKl1RvGt0kUINT6CZf+BL/AIVejmjlGY3DfSs2fS5o8mMiRfyNUyHifncjD8CKjmlHcvkjLWJvuqupVgCD2NZ1xp3VoT/wE1HDqMqcSDeP1q9DdQzfdbB9Dwad1IVpQMZ0ZG2upU+hq1Y6ldWLfunyndG5BrSkjSVcOoYVQm08jmJs/wCyalc0HeLKbjNcskdFYa7aXWFkPkyejHg/Q1qV546MjYdSp96t2eq3llgRSkoP4H5H/wBau+lj2tKiOGrl6etNncUViWniS3kwtyjRN6jlf8avvqunogc3cZB9Dk/kK7o16cldSPOlh6sXZxZcorEn8S2qZEMTyn1Pyis248RXsuRHshH+yMn9aznjKUetzWGCrT6W9TrGZUUszBQOpJxWfc63YW+R5vmt6RjP69K5Ca4nuGzNK8h/2jmo65J4+T+BHbDLor42btz4lmfIt4VjH95vmNZFxeXN0czzO/sTx+VQgFjgAk+1WI7K4k/g2j1biuOdWpU+JnZCjSpfCrFeitKPTFHMkhPstW4reGL7kYB9epqFBlOolsZMVnPL0TA9W4q7DpsacyMXPp0FXc0Zq1BIzdRsRVVF2qoUegoopM1RIUhpksqRLl2A/rWbc3jzZVflT07mpcrFRi2T3V6BlITk92qiiPK+FBZjT4Ld52+UYXua04YUhXCj6n1rPWRrdR0RHb2ywjPV+5qeiiqIvcSkpaKAEooooGUrq1xl4x9Vpmn302n3KzQn2ZezD0NaFUru2xmRB9RSTcXzRHpJcsju9PvodQtVnhPB4Ze6n0NWa880rUpdNuxKnzIeHTsw/wAa762uIrq3SeFtyOMg17WGxCrR13R4mKwzoy02ZLRRRXUcgUUUUAFFFFABRRRQAUUVT1S/j06yed+W6Iv95qUpKKuxxi5OyM7xJq/2OH7Lbvi4kHJH8C/4muPgheeUIg5Pf0pZpZbq4aWQl5JDkn1NbNlbC2i55dvvH+leHVqOvO72PfpU1h6dluSwQpBEI0HA6n1qSilpoybuFLSUtMQUUUtMAooopiCiiloASilpKACo5YY5lxIgYe9SUUgTsZU+k9TA/wDwFv8AGs6WGWFsSIVPvXS0jKrqVZQwPYispUk9jeNZrc5+K7mi43bh6NVuO/jbhwUP5ip59LhfmMmM/mKzrmymthucArnG4Gs2pRNVKEy5HPFcgoVGfQ1FLYqeY22n0PSqAJByDgirCXky9SGHuKm99y+VrYjlgki+8vHr2qMAsQACSewq214skZR0Iz6VUBwcg0ilfqTLaXDdIj+PFSrp0x6lV/GrNreLIAshAf8AnVvNWopmUpyRRTTF/jkJ+gxU6WVun8G4/wC0anzUVxcpbqCwJJ6AVVkiOaTJlVUGFUKPYYpc1VtLo3DOCoXHSrNNO5LTT1FzRmkzUck8Uf35FHtTuFiSiqMmooP9Wpb3PFVJbyeTjdtHovFS5otU2zUlnii++4B9O9UZtQY8RLtHqetVFR5Gwqlj7Vbi09zzK20eg61F29i+WMdymS8j8ksx/GrlvYk4abgf3auxQxxDCKB796fTUe4nPsNChVAUAAdhS0UVRAlFFFIYlFLSUhiUUUUDCiiigDPu7fy23qPlP6Vf8O6t/Z9z5UrH7PIef9k+v+NDKGUqRkGsueIwyFe3Y0Qm6clKISgqsXCR6YDkZFFc74W1TzovsMzfvIx+7JP3l9Pw/l9K6KvfpVFUipI+eq03Sm4sKKKK0MwooooAKKKKAAkAEk4A71wOvakdRviVP7iP5Yx/X8a6DxVqP2a0FpG2JJh82Oy//X6fnXJ2kBuJwn8PVj7V5eNrXfso/M9bA0bL2svkXdLtf+Xhx/u/41p0igKoUDAHAFLXNFWVjeUuZ3ClpKWqJFooopiCloopiClpKWgQUUtFMBKKWigBtFLSUgCkpaSgYVQ1g/6Ko/2x/I1fqhrAzaL7OP5Gs5/CzSn8SKGmxpLclZFDLtPBq9JpcDcozJ+oqnpRxeY9VNbVRCKcdTWpJxloZD6VKPuSK314qFtPuh/yzz9CK3aSm6aEqsjnZYZYTiRCv1p0dzNFwrnHoea32AYEMAR6Gqslhbv/AAFT/smodNrYtVU/iRRXUZB95FP04qO5ujcKoKbce9W20pP4ZWH1Gaz54xDM0Ybdt4zjFS+ZblxcW9B1vO1uxZQCSMc1I1/O3Qqv0FSWtiJ4RIzlcngAVZXTYB1LN9TQoysJyhfUzHnlf70jH8aRI3kOEQt9BW0lrAn3Yl/HmpMY6U+TuL2i6Iyo9Pmb72EHvVqPT4U5bLn34FW6KpRSJc2xqqqLhVAHoKKWkpkhSUtJSAKSlpKBhSUtJSGFJS0lIYlFFFABRRRQMKiuIhNGR/EORUtFIDKhlktrhJYyVkjbIPoa9C069jv7KO4TjcMMv909xXCX0OD5qjg9av8AhjUfsl95EjYhn4+jdj/SurCVvZz5XszmxlH2sOZbo7aiiivaPDCiiigApssiRRPLIdqICzH0Ap1c94uvvKtEs0PzS/M3+6P8T/Ks6tRU4OTNKVN1JqC6nMahdvfXsty/G88D0HYVp6db+Tb5I+d+TWZYQedcgEfKvJrdrw4Xk3JnvVLRSggpaKK0MApaSlpgLRRRTELRRRTELRRRQIWlpKWmIKSlpKAEooopDEooooGJVTU13WL+2D+tW6hu13Wso/2TUy1RcXZoxdPbbexn1OP0rernIG2zxt6MD+tdHWVLY2rLVMKSlpK0MQpKWkoAQnAzXOuxd2Y9Sc10E3+pf/dNc+nLr9axqHRR6m9CnlwonoMU+g0VoYiUUUUhiUUUUDEpKWkpAFJS0lIYUlLSUDCkpaSkMKSlpKQxKKKKACiiigYUUUUANdQ6FT0NZToY5Cp6g1r1Tv4sqJB24NSyos7HQdQ/tDTUdjmVPkk+vr+P+NaVcL4bv/sepqjnEU3yN7Hsfz/nXdV7mFq+1p3e6PCxdH2VRpbMKKKK6TlCvPNYvPt2pTTg5TO1P90dP8fxrstfuvsmkTMDh3Hlr9T/APWzXBwRmWZIx/Ea8zH1NqaPVy+nZOozW02Hy7YMR8z8/h2q5TQAAAOgp1cqVlY6JO7uFLSUtMQUtJS0xC0UUUxC0UlLTEFLSUtAhaKSimAtFJRQAUlLSUgCkpaSgYUyXmN/oafUdwdtvIfRT/KpZS3ObH3hXTVzcYzKg9SK6SsaXU6K/QKSlpK1MApKKKAEYblI9RXOdD710dYFwuy4kX0Y1jUOij1N4HcAR35oqK0bfaxn/ZxUtaGNrCUUUlIYUUUUDEpKWkpAFJS0lIYUlLSUDCkpaSkMKSlpKQxKKKKACiiigYUUUUAFIyh1KnoeKWikBjupjcqeoNegaLe/b9MimJzIPkf/AHh/nP41xN/HhlkHfg1qeEbzyr57Vj8swyv+8P8A62a6sHU5KnK9mc+Np+0pcy3R2NFFFe0eEcp4yuczW9qDwoMjfjwP5H86ydJjzK8h/hGBS69P5+s3LdlfYPw4/pVnTU2WinuxJrwqsues2e/Sj7OgkW6KKKZAtLSUtABS0lFMQtLSUtAgpaSimAtFFFMQUtJRQIWkoooGFFFFABSUUUhhUN3/AMek3+4f5VLUV1/x6Tf7h/lSew47mBB/x8R/7w/nXR1zkH/HxH/vD+ddHWNI3rboKSiitTESiiikAlYmoDF5J74P6Vt1j6mMXf1UVnU2NqXxF3TjmzUehIq1VPSzm1Psx/pVyqjsTL4mJSUtJQIKSlpKBhSUtJSAKSlpKQxKKKKBiUUUUhhSUUUhiUUUUDCiiigAooooAKKKKAI508yFl79qzreZ7e4jmT70bBh+FatZd0mydh2PIqXpqio66M9IhlWeCOZPuuoYfQ0VjeE7sTaZ5BYb4WIx32nkf1or6GnPngpdz5yrD2c3HscbKSZnLcsWOa3bfAt48dNo/lWbrUBttXuYyMAuWH0PI/nVzTpRJahe6cGvCS5ZtM9+T5oKSLdFJS1oYi0UlLTELRRRQIWikpaYC0UlLTEFFFFAC0UlFAC0UlFABRRRQAUUUlABUVzzbS/7h/lUtQ3Rxay/7h/lUvYpbmDD/ro/94V0dc5AMzxj/aH866KsqXU3rboKSlpK1MAoopKQwrJ1Uf6Sp/2f6mtaszVl+aN/qKiexpT+Ik0o/uXH+1V2s7SXw0ieoBrRojsOfxBSUUUyApKWkpDEooooGFJRRSGJRRRQAlFFFIYlFFJSGFFFFAwooooAKKKKACiiigAqlqAHyHvyKu1nXr7pto6KMUmOO5seDc/2hP6eV/UUVc8G25W3uLgjh2CD8Ov8xRXtYNWoq54mNles7B4ws1aCK9Bw6ny29wen+feuZtbhreXcOVPBHrRRXnYxWrXR6WCfNRszdByAfWlooqQCloopiCloooAKKKKYhaKKKACloooEFFFFMAooooAKSiikAUlFFAwqvfHFnKfbFFFTLYqO6Ma0GbuIf7QroKKKzp7GtbdCUUUVqYhSUUUhiVU1Nd1rn+6QaKKmWxcPiRR09tt4nvkVsUUVENi6u4lFFFWZiUUUUhiUUUUDEooopDEooopDEooopAJSUUUDCiiigYUUUUAFFFFABRRRQBDczeTHkDk8Cs1FMkirnljjJooqepa2PSLG1Sys4rZOQgxn1Pc/nRRRX0iSSsj5htt3Z//Z"/></defs><path d="M0 0h231.117v648H0zm0 0" fill="#fff"/><path d="M5.277 127.922H197.88v52.437H5.277zm0 0" fill="#ffca00"/><use xlink:href="#a" x="263.4" y="234.36" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#b" x="268.057" y="234.36" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#c" x="279.714" y="234.36" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#d" x="291.242" y="234.36" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#e" x="297.065" y="234.36" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#c" x="308.722" y="234.36" width="100%" height="100%" transform="translate(-190.441 -72)"/><path d="M5.277 126.96H198.72v54.36H4.32v-54.36zm0 1.802v-.84h.84v52.437h-.84v-.84H197.88v.84h-.84v-52.437h.84v.84zm0 0"/><path d="M5.277 485.16H197.88v52.559H5.277zm0 0" fill="#ffca00"/><use xlink:href="#f" x="258.12" y="591.72" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#b" x="269.777" y="591.72" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#g" x="281.305" y="591.72" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#d" x="291.995" y="591.72" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#h" x="297.818" y="591.72" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#e" x="302.475" y="591.72" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#i" x="314.132" y="591.72" width="100%" height="100%" transform="translate(-190.441 -72)"/><path d="M5.277 484.32H198.72v54.239H4.32V484.32zm0 1.68v-.84h.84v52.559h-.84v-.84H197.88v.84h-.84V485.16h.84v.84zm0 0"/><path d="M5.277 180.36H197.88v52.562H5.277zm0 0" fill="#97ca00"/><use xlink:href="#b" x="213.12" y="286.92" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#i" x="224.777" y="286.92" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#g" x="236.305" y="286.92" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#h" x="246.995" y="286.92" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#f" x="251.652" y="286.92" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#a" x="263.18" y="286.92" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#j" x="268.001" y="286.92" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#k" x="279.529" y="286.92" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#c" x="286.509" y="286.92" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#a" x="298.166" y="286.92" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#b" x="302.823" y="286.92" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#l" x="314.351" y="286.92" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#f" x="324.831" y="286.92" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#e" x="336.488" y="286.92" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#e" x="348.145" y="286.92" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#m" x="359.673" y="286.92" width="100%" height="100%" transform="translate(-190.441 -72)"/><path d="M5.277 179.52H198.72v54.242H4.32V179.52zm0 1.8v-.96h.84v52.562h-.84v-.844H197.88v.844h-.84v-52.563h.84v.961zm0 0"/><path d="M5.277 537.719H197.88v52.562H5.277zm0 0" fill="#97ca00"/><use xlink:href="#b" x="213.12" y="644.28" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#i" x="224.777" y="644.28" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#g" x="236.305" y="644.28" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#h" x="246.995" y="644.28" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#f" x="251.652" y="644.28" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#a" x="263.18" y="644.28" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#j" x="268.001" y="644.28" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#k" x="279.529" y="644.28" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#c" x="286.509" y="644.28" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#a" x="298.166" y="644.28" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#b" x="302.823" y="644.28" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#l" x="314.351" y="644.28" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#f" x="324.831" y="644.28" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#e" x="336.488" y="644.28" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#e" x="348.145" y="644.28" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#m" x="359.673" y="644.28" width="100%" height="100%" transform="translate(-190.441 -72)"/><path d="M5.277 536.879H198.72v54.242H4.32V536.88zm0 1.68v-.84h.84v52.562h-.84v-.96H197.88v.96h-.84V537.72h.84v.84zm0 0"/><path d="M5.277 232.922H197.88v52.558H5.277zm0 0" fill="#caffca"/><use xlink:href="#b" x="215.52" y="339.48" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#i" x="227.177" y="339.48" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#g" x="238.705" y="339.48" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#h" x="249.395" y="339.48" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#f" x="254.052" y="339.48" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#a" x="265.58" y="339.48" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#j" x="270.401" y="339.48" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#n" x="281.929" y="339.48" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#o" x="293.586" y="339.48" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#h" x="311.192" y="339.48" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#d" x="315.849" y="339.48" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#e" x="321.673" y="339.48" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#p" x="333.201" y="339.48" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#j" x="344.858" y="339.48" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#i" x="356.515" y="339.48" width="100%" height="100%" transform="translate(-190.441 -72)"/><path d="M5.277 232.078H198.72v54.242H4.32v-54.242zm0 1.684v-.84h.84v52.558h-.84v-.84H197.88v.84h-.84v-52.558h.84v.84zm0 0"/><path d="M5.277 590.281H197.88v52.559H5.277zm0 0" fill="#caffca"/><use xlink:href="#b" x="215.52" y="696.72" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#i" x="227.177" y="696.72" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#g" x="238.705" y="696.72" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#h" x="249.395" y="696.72" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#f" x="254.052" y="696.72" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#a" x="265.58" y="696.72" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#j" x="270.401" y="696.72" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#n" x="281.929" y="696.72" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#o" x="293.586" y="696.72" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#h" x="311.192" y="696.72" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#d" x="315.849" y="696.72" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#e" x="321.673" y="696.72" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#p" x="333.201" y="696.72" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#j" x="344.858" y="696.72" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#i" x="356.515" y="696.72" width="100%" height="100%" transform="translate(-190.441 -72)"/><path d="M5.277 589.32H198.72v54.36H4.32v-54.36zm0 1.801v-.84h.84v52.559h-.84v-.961H197.88v.96h-.84v-52.558h.84v.84zm0 0"/><path d="M5.277 359.04H197.88v52.562H5.277zm0 0" fill="#caffca"/><use xlink:href="#b" x="215.52" y="465.6" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#i" x="227.177" y="465.6" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#g" x="238.705" y="465.6" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#h" x="249.395" y="465.6" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#f" x="254.052" y="465.6" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#a" x="265.58" y="465.6" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#j" x="270.401" y="465.6" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#n" x="281.929" y="465.6" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#o" x="293.586" y="465.6" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#h" x="311.192" y="465.6" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#d" x="315.849" y="465.6" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#e" x="321.673" y="465.6" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#p" x="333.201" y="465.6" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#j" x="344.858" y="465.6" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#i" x="356.515" y="465.6" width="100%" height="100%" transform="translate(-190.441 -72)"/><path d="M5.277 358.2H198.72v54.241H4.32V358.2zm0 1.679v-.84h.84v52.563h-.84v-.84H197.88v.84h-.84v-52.563h.84v.84zm0 0M115.559 19.078h64.199V51.84h-64.2zm0 0"/><use xlink:href="#f" x="309.48" y="115.8" width="100%" height="100%" fill="#0f0" transform="translate(-190.441 -72)"/><use xlink:href="#b" x="321.137" y="115.8" width="100%" height="100%" fill="#0f0" transform="translate(-190.441 -72)"/><use xlink:href="#g" x="332.665" y="115.8" width="100%" height="100%" fill="#0f0" transform="translate(-190.441 -72)"/><use xlink:href="#q" x="343.355" y="115.8" width="100%" height="100%" fill="#0f0" transform="translate(-190.441 -72)"/><use xlink:href="#r" x="354.883" y="115.8" width="100%" height="100%" fill="#0f0" transform="translate(-190.441 -72)"/><path d="M101.52 302.16c.48 0 .96.36.96.84s-.48.84-.96.84a.82.82 0 0 1-.84-.84c0-.48.36-.84.84-.84zm0 6.961c.48 0 .96.36.96.84s-.48.96-.96.96-.84-.48-.84-.96.36-.84.84-.84zm0 6.957c.48 0 .96.48.96.961 0 .48-.48.84-.96.84a.82.82 0 0 1-.84-.84c0-.48.36-.96.84-.96zm0 7.082c.48 0 .96.36.96.84s-.48.84-.96.84a.82.82 0 0 1-.84-.84c0-.48.36-.84.84-.84zm0 6.961c.48 0 .96.36.96.84 0 .598-.48.96-.96.96s-.84-.362-.84-.96c0-.48.36-.84.84-.84zm0 7.078c.48 0 .96.36.96.84s-.48.84-.96.84a.82.82 0 0 1-.84-.84c0-.48.36-.84.84-.84zm0 0" fill="#3063ff"/><path d="M101.52 285.48l-8.762 21 8.762-5.28 8.757 5.28zm0 0M101.52 359.04l8.757-21.118-8.757 5.277-8.762-5.277zm0 0" fill="#3063ff"/><path d="M28.2 305.879h146.64v32.762H28.2zm0 0" fill="#fff"/><use xlink:href="#s" x="222.24" y="402.48" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#t" x="234.397" y="402.48" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#u" x="240.22" y="402.48" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#b" x="246.299" y="402.48" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#i" x="257.827" y="402.48" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#g" x="269.484" y="402.48" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#h" x="279.964" y="402.48" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#f" x="284.785" y="402.48" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#a" x="296.313" y="402.48" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#j" x="300.97" y="402.48" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#t" x="312.627" y="402.48" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#g" x="318.45" y="402.48" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#e" x="329.14" y="402.48" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#v" x="340.668" y="402.48" width="100%" height="100%" transform="translate(-190.441 -72)"/><use xlink:href="#m" x="351.358" y="402.48" width="100%" height="100%" transform="translate(-190.441 -72)"/><path d="M101.52 428.281c.48 0 .96.36.96.84s-.48.84-.96.84a.82.82 0 0 1-.84-.84c0-.48.36-.84.84-.84zm0 6.957c.48 0 .96.364.96.84 0 .48-.48.961-.96.961s-.84-.48-.84-.96c0-.477.36-.84.84-.84zm0 6.961c.48 0 .96.48.96.961 0 .48-.48.84-.96.84a.82.82 0 0 1-.84-.84c0-.48.36-.96.84-.96zm0 7.082c.48 0 .96.36.96.84s-.48.84-.96.84a.82.82 0 0 1-.84-.84c0-.48.36-.84.84-.84zm0 6.957c.48 0 .96.364.96.84 0 .48-.48.961-.96.961s-.84-.48-.84-.96c0-.477.36-.84.84-.84zm0 6.961c.48 0 .96.48.96.961 0 .48-.48.84-.96.84a.82.82 0 0 1-.84-.84c0-.48.36-.96.84-.96zm0 7.082c.48 0 .96.36.96.84s-.48.84-.96.84a.82.82 0 0 1-.84-.84c0-.48.36-.84.84-.84zm0 0" fill="#3063ff"/><path d="M101.52 411.602l-8.762 21 8.762-5.282 8.757 5.282zm0 0M101.52 485.16l8.757-21-8.757 5.281-8.762-5.28zm0 0M211.797 50.64c.48 0 .96.36.96.84s-.48.84-.96.84a.822.822 0 0 1-.84-.84c0-.48.363-.84.84-.84zm7.082 0c.48 0 .84.36.84.84s-.36.84-.84.84-.961-.36-.961-.84.48-.84.96-.84zm6.96 0c.481 0 .84.36.84.84s-.359.84-.84.84a.82.82 0 0 1-.839-.84c0-.48.36-.84.84-.84zm.958 6c.48 0 .84.481.84.962 0 .476-.36.84-.84.84-.477 0-.957-.364-.957-.84 0-.48.48-.961.957-.961zm0 7.079c.48 0 .84.36.84.84s-.36.84-.84.84c-.477 0-.957-.36-.957-.84s.48-.84.957-.84zm0 6.96c.48 0 .84.36.84.962 0 .48-.36.84-.84.84-.477 0-.957-.36-.957-.84 0-.602.48-.961.957-.961zm0 7.083c.48 0 .84.36.84.84 0 .476-.36.84-.84.84-.477 0-.957-.364-.957-.84 0-.48.48-.84.957-.84zm0 6.957c.48 0 .84.36.84.84s-.36.96-.84.96c-.477 0-.957-.48-.957-.96s.48-.84.957-.84zm0 6.96c.48 0 .84.481.84.962 0 .48-.36.84-.84.84-.477 0-.957-.36-.957-.84s.48-.961.957-.961zm0 7.083c.48 0 .84.36.84.84 0 .476-.36.84-.84.84-.477 0-.957-.364-.957-.84 0-.48.48-.84.957-.84zm0 6.957c.48 0 .84.36.84.84s-.36.96-.84.96c-.477 0-.957-.48-.957-.96s.48-.84.957-.84zm0 6.96c.48 0 .84.481.84.962 0 .48-.36.84-.84.84-.477 0-.957-.36-.957-.84s.48-.961.957-.961zm0 7.083c.48 0 .84.36.84.84 0 .476-.36.84-.84.84-.477 0-.957-.364-.957-.84 0-.48.48-.84.957-.84zm0 6.957c.48 0 .84.48.84.96 0 .481-.36.84-.84.84-.477 0-.957-.359-.957-.84 0-.48.48-.96.957-.96zm0 7.082c.48 0 .84.36.84.84s-.36.84-.84.84c-.477 0-.957-.36-.957-.84s.48-.84.957-.84zm0 6.96c.48 0 .84.36.84.84 0 .477-.36.958-.84.958-.477 0-.957-.48-.957-.957 0-.48.48-.84.957-.84zm0 6.958c.48 0 .84.48.84.96 0 .481-.36.84-.84.84-.477 0-.957-.359-.957-.84 0-.48.48-.96.957-.96zm0 7.082c.48 0 .84.36.84.84s-.36.84-.84.84c-.477 0-.957-.36-.957-.84s.48-.84.957-.84zm0 6.96c.48 0 .84.36.84.84 0 .477-.36.958-.84.958-.477 0-.957-.48-.957-.957 0-.48.48-.84.957-.84zm0 7.079c.48 0 .84.36.84.84s-.36.84-.84.84c-.477 0-.957-.36-.957-.84s.48-.84.957-.84zm0 6.96c.48 0 .84.36.84.84 0 .481-.36.84-.84.84-.477 0-.957-.359-.957-.84 0-.48.48-.84.957-.84zm0 6.962c.48 0 .84.476.84.957 0 .48-.36.84-.84.84-.477 0-.957-.36-.957-.84s.48-.957.957-.957zm0 7.078c.48 0 .84.36.84.84s-.36.84-.84.84c-.477 0-.957-.36-.957-.84s.48-.84.957-.84zm0 6.96c.48 0 .84.36.84.84 0 .481-.36.962-.84.962-.477 0-.957-.48-.957-.961 0-.48.48-.84.957-.84zm0 6.962c.48 0 .84.476.84.957 0 .48-.36.84-.84.84-.477 0-.957-.36-.957-.84s.48-.957.957-.957zm0 7.078c.48 0 .84.36.84.84s-.36.84-.84.84c-.477 0-.957-.36-.957-.84s.48-.84.957-.84zm0 6.96c.48 0 .84.36.84.84 0 .481-.36.962-.84.962-.477 0-.957-.48-.957-.961 0-.48.48-.84.957-.84zm0 7.079c.48 0 .84.36.84.84s-.36.84-.84.84c-.477 0-.957-.36-.957-.84s.48-.84.957-.84zm0 6.96c.48 0 .84.36.84.84 0 .481-.36.962-.84.962-.477 0-.957-.48-.957-.961 0-.48.48-.84.957-.84zm0 6.962c.48 0 .84.48.84.96 0 .477-.36.84-.84.84-.477 0-.957-.363-.957-.84 0-.48.48-.96.957-.96zm0 7.078c.48 0 .84.36.84.84s-.36.84-.84.84c-.477 0-.957-.36-.957-.84s.48-.84.957-.84zm0 6.96c.48 0 .84.36.84.84 0 .481-.36.962-.84.962-.477 0-.957-.48-.957-.961 0-.48.48-.84.957-.84zm0 6.962c.48 0 .84.48.84.96 0 .477-.36.84-.84.84-.477 0-.957-.363-.957-.84 0-.48.48-.96.957-.96zm0 7.078c.48 0 .84.36.84.84s-.36.84-.84.84c-.477 0-.957-.36-.957-.84s.48-.84.957-.84zm0 6.96c.48 0 .84.36.84.84 0 .602-.36.962-.84.962a.946.946 0 0 1-.957-.961c0-.48.48-.84.957-.84zm0 7.083c.48 0 .84.36.84.84 0 .476-.36.84-.84.84-.477 0-.957-.364-.957-.84 0-.48.48-.84.957-.84zm0 6.957c.48 0 .84.36.84.84s-.36.96-.84.96c-.477 0-.957-.48-.957-.96s.48-.84.957-.84zm0 6.96c.48 0 .84.481.84.962 0 .48-.36.84-.84.84-.477 0-.957-.36-.957-.84s.48-.961.957-.961zm0 7.083c.48 0 .84.36.84.84 0 .476-.36.84-.84.84-.477 0-.957-.364-.957-.84 0-.48.48-.84.957-.84zm0 6.957c.48 0 .84.36.84.84s-.36.96-.84.96c-.477 0-.957-.48-.957-.96s.48-.84.957-.84zm0 6.96c.48 0 .84.481.84.962 0 .48-.36.84-.84.84-.477 0-.957-.36-.957-.84s.48-.961.957-.961zm0 7.083c.48 0 .84.36.84.84 0 .476-.36.84-.84.84-.477 0-.957-.364-.957-.84 0-.48.48-.84.957-.84zm0 6.957c.48 0 .84.36.84.96 0 .481-.36.84-.84.84-.477 0-.957-.359-.957-.84 0-.6.48-.96.957-.96zm0 7.082c.48 0 .84.36.84.84s-.36.84-.84.84c-.477 0-.957-.36-.957-.84s.48-.84.957-.84zm0 6.96c.48 0 .84.36.84.84 0 .477-.36.958-.84.958-.477 0-.957-.48-.957-.957 0-.48.48-.84.957-.84zm0 6.958c.48 0 .84.48.84.96 0 .481-.36.84-.84.84-.477 0-.957-.359-.957-.84 0-.48.48-.96.957-.96zm0 7.082c.48 0 .84.36.84.84s-.36.84-.84.84c-.477 0-.957-.36-.957-.84s.48-.84.957-.84zm0 6.96c.48 0 .84.36.84.84 0 .477-.36.958-.84.958-.477 0-.957-.48-.957-.957 0-.48.48-.84.957-.84zm0 6.958c.48 0 .84.48.84.96 0 .481-.36.84-.84.84-.477 0-.957-.359-.957-.84 0-.48.48-.96.957-.96zm0 7.082c.48 0 .84.36.84.84s-.36.84-.84.84c-.477 0-.957-.36-.957-.84s.48-.84.957-.84zm-1.559 5.52c.48 0 .961.359.961.84 0 .48-.48.84-.96.84a.82.82 0 0 1-.84-.84c0-.481.359-.84.84-.84zm-6.96 0c.48 0 .84.359.84.84 0 .48-.36.84-.84.84a.82.82 0 0 1-.84-.84c0-.481.359-.84.84-.84zm0 0" fill="#3063ff"/><path d="M194.277 51.48l21.121 8.758-5.28-8.758 5.28-8.761zm0 0M197.879 385.32l21 8.758-5.281-8.758 5.28-8.761zm0 0" fill="#3063ff"/><g clip-path="url(#w)" transform="translate(-190.441 -72)"><use xlink:href="#x" transform="matrix(.12 0 0 .12 274.44 76.8)" width="100%" height="100%"/></g><g clip-path="url(#y)" transform="translate(-190.441 -72)"><use xlink:href="#z" transform="matrix(.12 0 0 .12 195.72 92.4)" width="100%" height="100%"/></g></svg>�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mitogen-0.3.9/docs/images/pipe.graphml��������������������������������������������������������������0000664�0000000�0000000�00000364534�14656664731�0017734�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" standalone="no"?> <graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd"> <!--Created by yEd 3.14.4--> <key attr.name="Description" attr.type="string" for="graph" id="d0"/> <key for="port" id="d1" yfiles.type="portgraphics"/> <key for="port" id="d2" yfiles.type="portgeometry"/> <key for="port" id="d3" yfiles.type="portuserdata"/> <key attr.name="url" attr.type="string" for="node" id="d4"/> <key attr.name="description" attr.type="string" for="node" id="d5"/> <key for="node" id="d6" yfiles.type="nodegraphics"/> <key for="graphml" id="d7" yfiles.type="resources"/> <key attr.name="url" attr.type="string" for="edge" id="d8"/> <key attr.name="description" attr.type="string" for="edge" id="d9"/> <key for="edge" id="d10" yfiles.type="edgegraphics"/> <graph edgedefault="directed" id="G"> <data key="d0"/> <node id="n0"> <data key="d5"/> <data key="d6"> <y:SVGNode> <y:Geometry height="35.484542934485205" width="32.2024545674844" x="192.89877271625778" y="-191.43019130345562"/> <y:Fill color="#CCCCFF" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="138.666015625" x="-53.23178052875781" y="39.484542934485205">Bob, employee #11841<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:SVGNodeProperties usingVisualBounds="true"/> <y:SVGModel svgBoundsPolicy="0"> <y:SVGContent refid="1"/> </y:SVGModel> </y:SVGNode> </data> </node> <node id="n1"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="100.0" x="216.25" y="114.05435163102959"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="50.01953125" x="24.990234375" y="5.93359375">rack12c<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="100.0" x="159.0" y="-65.94564836897041"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="47.072265625" x="26.4638671875" y="5.93359375">bastion<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="100.0" x="216.25" y="-5.94564836897041"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="50.5" x="24.75" y="5.93359375">rack12a<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="100.0" x="159.0" y="-125.94564836897041"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="45.912109375" x="27.0439453125" y="5.93359375">Jenkins<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n5"> <data key="d5"/> <data key="d6"> <y:GenericNode configuration="com.yworks.flowchart.dataBase"> <y:Geometry height="30.0" width="26.0" x="377.5" y="-125.94564836897041"/> <y:Fill color="#E8EEF7" color2="#B7C9E3" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="124.943359375" x="38.2783203125" y="5.93359375">packages.debian.org<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="-0.5" labelRatioY="0.0" nodeRatioX="0.5" nodeRatioY="0.0" offsetX="12.2783203125" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> </y:GenericNode> </data> </node> <node id="n6"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="100.0" x="282.5" y="-65.94564836897041"/> <y:Fill color="#99CC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="49.029296875" x="25.4853515625" y="5.93359375">forward<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n7"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="100.0" x="-34.75" y="-5.94564836897041"/> <y:Fill color="#99CC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="92.41796875" x="3.791015625" y="5.93359375">apt-get update<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n8"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="100.0" x="97.75" y="-5.94564836897041"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="50.5" x="24.75" y="5.93359375">rack11a<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n9"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="100.0" x="97.75" y="54.05435163102959"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="51.42578125" x="24.287109375" y="5.93359375">rack11b<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n10"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="100.0" x="-34.75" y="54.05435163102959"/> <y:Fill color="#99CC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="92.41796875" x="3.791015625" y="5.93359375">apt-get update<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n11"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="100.0" x="348.75" y="114.05435163102959"/> <y:Fill color="#99CC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="92.41796875" x="3.791015625" y="5.93359375">apt-get update<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n12"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="100.0" x="97.75" y="114.05435163102959"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="50.01953125" x="24.990234375" y="5.93359375">rack11c<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n13"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="100.0" x="-34.75" y="114.05435163102959"/> <y:Fill color="#99CC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="92.41796875" x="3.791015625" y="5.93359375">apt-get update<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n14"> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="100.0" x="216.25" y="54.05435163102959"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="51.42578125" x="24.287109375" y="5.93359375">rack12b<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n15"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="100.0" x="348.75" y="-5.94564836897041"/> <y:Fill color="#99CC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="92.41796875" x="3.791015625" y="5.93359375">apt-get update<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n16"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="100.0" x="348.75" y="54.05435163102959"/> <y:Fill color="#99CC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="92.41796875" x="3.791015625" y="5.93359375">apt-get update<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n17"> <data key="d5"/> <data key="d6"> <y:SVGNode> <y:Geometry height="30.0" width="30.0" x="317.5" y="-125.94564836897041"/> <y:Fill color="#CCCCFF" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="13.0" y="34.0"> <y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:SVGNodeProperties usingVisualBounds="true"/> <y:SVGModel svgBoundsPolicy="0"> <y:SVGContent refid="2"/> </y:SVGModel> </y:SVGNode> </data> </node> <edge id="e0" source="n2" target="n2"> <data key="d10"> <y:ArcEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"> <y:Point x="209.0" y="-50.945648193359375"/> </y:Path> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:Arc height="0.0" ratio="1.0" type="fixedRatio"/> </y:ArcEdge> </data> </edge> <edge id="e1" source="n4" target="n4"> <data key="d10"> <y:ArcEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"> <y:Point x="209.0" y="-110.94564819335938"/> </y:Path> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:Arc height="0.0" ratio="1.0" type="fixedRatio"/> </y:ArcEdge> </data> </edge> <edge id="e2" source="n6" target="n17"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e3" source="n4" target="n2"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e4" source="n2" target="n6"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e5" source="n2" target="n3"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e6" source="n3" target="n14"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e7" source="n2" target="n8"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e8" source="n3" target="n15"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e9" source="n14" target="n16"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e10" source="n8" target="n9"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e11" source="n8" target="n7"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e12" source="n9" target="n10"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e13" source="n1" target="n11"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e14" source="n12" target="n13"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e15" source="n3" target="n1"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="-43.863669958563634" sy="14.9921875" tx="-43.863669958563634" ty="-15.020771131556558"> <y:Point x="209.0" y="49.55435163102959"/> <y:Point x="209.0" y="88.55435163102959"/> </y:Path> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="true"/> </y:PolyLineEdge> </data> </edge> <edge id="e16" source="n8" target="n12"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="42.85528831480789" sy="15.017222708103716" tx="42.85528831480789" ty="-15.0390625"> <y:Point x="202.0" y="50.55435163102959"/> <y:Point x="202.0" y="89.55435163102959"/> </y:Path> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="true"/> </y:PolyLineEdge> </data> </edge> <edge id="e17" source="n17" target="n5"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#3366FF" type="dotted" width="1.0"/> <y:Arrows source="standard" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> </graph> <data key="d7"> <y:Resources> <y:Resource id="1"><?xml version="1.0" encoding="utf-8"?> <svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="57px" height="65px" viewBox="0 0 57 65" enable-background="new 0 0 57 65" xml:space="preserve"> <g> <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3398" y1="3115.7266" x2="27.5807" y2="3145.5239" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)"> <stop offset="0.2711" style="stop-color:#FFAB4F"/> <stop offset="1" style="stop-color:#FFD28F"/> </linearGradient> <path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> <radialGradient id="face_x5F_white_1_" cx="27.5835" cy="3117.4922" r="23.425" fx="23.0139" fy="3115.0024" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#FFD28F"/> <stop offset="1" style="stop-color:#FFAB4F"/> </radialGradient> <path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 c0.086,10.2-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 C36.627,4.945,43.59,13.158,43.676,23.357z"/> <linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="6468.501" y1="-12291.5195" x2="6492.1304" y2="-12384.9688" gradientTransform="matrix(0.275 0 0 -0.2733 -1752.8849 -3351.7349)"> <stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> <stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> </linearGradient> <path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M28.415,5.625c-6.035,0.047-10.747,4.493-12.787,10.386 c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.54,13.244,36.729,5.56,28.415,5.625z"/> <path fill="#CC9869" stroke="#99724F" stroke-width="0.9271" stroke-linecap="round" stroke-linejoin="round" d="M28.02,31.921 c-6.78,0-6.717,3.708-6.717,3.708c0,8.133,2.985,8.788,6.955,8.788c4.243,0,6.792-0.926,6.792-8.595 C35.051,35.822,35.881,31.921,28.02,31.921z M23.989,35.678c0-0.556,1.838-1.005,4.107-1.005c2.27,0,4.107,0.449,4.107,1.005 C32.204,36.232,23.989,36.232,23.989,35.678z"/> <path id="hair_x5F_gray_2_" fill="#CC9869" stroke="#99724F" stroke-linecap="round" stroke-linejoin="round" d="M20.278,13.25 c0,0,5.321,7.25,15,3.75c2.729-0.563,9.058,1.035,9.058,1.035S40.68,1.865,27.289,2.744C9.403,4.125,12.058,25.678,12.058,25.678 s2.768-0.684,5.036-4.802C18.068,19.106,20.278,13.25,20.278,13.25z"/> <radialGradient id="collar_x5F_body_1_" cx="14.9609" cy="3148.9336" r="32.4004" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#B0E8FF"/> <stop offset="1" style="stop-color:#74AEEE"/> </radialGradient> <path id="collar_x5F_body_3_" fill="url(#collar_x5F_body_1_)" stroke="#5491CF" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494 h48.51c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-11.244-6.146-11.244-6.146 c-1.771,1.655-5.61,2.802-10.063,2.802c-4.453,0-8.292-1.146-10.063-2.802c0,0-5.755,0.586-11.189,6.021 C1.378,56.689,0.5,62.768,0.5,62.768z"/> <radialGradient id="collar_x5F_r_1_" cx="31.2998" cy="3139.0605" r="9.2823" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#80CCFF"/> <stop offset="1" style="stop-color:#74AEEE"/> </radialGradient> <path id="collar_x5F_r_3_" fill="url(#collar_x5F_r_1_)" stroke="#5491CF" d="M38.159,41.381c0,0-0.574,2.369-3.013,4.441 c-2.108,1.795-5.783,2.072-5.783,2.072l3.974,6.217c0,0,2.957-1.637,5.009-3.848c1.922-2.072,1.37-5.479,1.37-5.479L38.159,41.381z "/> <radialGradient id="collar_x5F_l_1_" cx="18.9375" cy="3139.1016" r="9.2843" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#80CCFF"/> <stop offset="1" style="stop-color:#74AEEE"/> </radialGradient> <path id="collar_x5F_l_3_" fill="url(#collar_x5F_l_1_)" stroke="#5491CF" d="M18.63,41.422c0,0,0.576,2.369,3.012,4.441 c2.109,1.793,5.785,2.072,5.785,2.072l-3.974,6.217c0,0-2.957-1.637-5.007-3.85c-1.922-2.072-1.37-5.48-1.37-5.48L18.63,41.422z"/> <radialGradient id="Knob2_1_" cx="27.6895" cy="2375.2871" r="0.9669" gradientTransform="matrix(1 0 0 1 0.2402 -2319.0742)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#80CCFF"/> <stop offset="1" style="stop-color:#74AEEE"/> </radialGradient> <circle id="Knob2_3_" fill="url(#Knob2_1_)" stroke="#5491CF" cx="28.258" cy="56.254" r="0.584"/> <radialGradient id="Knob1_1_" cx="27.7275" cy="2381.5283" r="0.9669" gradientTransform="matrix(1 0 0 1 0.2402 -2319.0742)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#80CCFF"/> <stop offset="1" style="stop-color:#74AEEE"/> </radialGradient> <circle id="Knob1_3_" fill="url(#Knob1_1_)" stroke="#5491CF" cx="28.297" cy="62.499" r="0.584"/> <path id="path5135_5_" fill="#D54A30" stroke="#B51A19" d="M27.442,55.23c0,0-1.852,2.057-2.082,6.543c-0.23,4.488,0,4.488,0,4.488 h6.546c0,0,0.23,0.063-0.154-4.367c-0.4-4.604-2.389-6.668-2.389-6.668L27.442,55.23L27.442,55.23z"/> <path id="path5131_5_" fill="#D54A30" stroke="#B51A19" d="M28.325,48.688h0.125L31,52.691c0.516,0.953-1.207,1.797-1.457,2.547 l-2.277-0.018c-0.242-0.761-2.26-1.369-1.477-2.584L28.325,48.688z"/> </g> </svg> </y:Resource> <y:Resource id="2"><?xml version="1.0" encoding="utf-8"?> <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="43px" height="43px" viewBox="-0.751 -0.597 43 43" enable-background="new -0.751 -0.597 43 43" xml:space="preserve"> <defs> </defs> <radialGradient id="SVGID_1_" cx="216.2563" cy="775.959" r="29.184" gradientTransform="matrix(1 0 0 1 -195.2002 -770.8008)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#D9F1FF"/> <stop offset="1" style="stop-color:#3C89C9"/> </radialGradient> <circle fill="url(#SVGID_1_)" cx="20.86" cy="20.86" r="19.593"/> <path fill="#3C89C9" d="M38.507,16.634C38.525,16.57,38.364,16.662,38.507,16.634L38.507,16.634z"/> <path fill="#3C89C9" d="M38.466,21.362C38.209,21.355,38.466,21.42,38.466,21.362L38.466,21.362z"/> <path fill="#3C89C9" d="M36.857,22.39C36.86,22.637,37.057,22.428,36.857,22.39L36.857,22.39z"/> <path fill="#3C89C9" d="M38.532,22.418C38.281,22.42,38.547,22.477,38.532,22.418L38.532,22.418z"/> <path fill="#3C89C9" d="M37.04,22.552C37.179,22.552,37.117,22.351,37.04,22.552L37.04,22.552z"/> <path fill="#3C89C9" d="M36.619,22.174C36.93,22.26,36.62,22.031,36.619,22.174L36.619,22.174z"/> <path fill="#3C89C9" d="M37.475,17.291c0.146,0.041,0.333-0.183,0.185-0.461C37.503,16.822,37.458,17.181,37.475,17.291z"/> <path fill="#3C89C9" d="M38.587,22.519c-0.186,0.027-0.663,0.254-0.667,0.385C37.996,22.947,38.585,22.616,38.587,22.519z"/> <path fill="#3C89C9" d="M37.983,19.059C37.96,19.217,38.281,19.116,37.983,19.059L37.983,19.059z"/> <path fill="#3C89C9" d="M35.4,20.837C35.4,20.886,35.476,20.837,35.4,20.837L35.4,20.837z"/> <path fill="#3C89C9" d="M35.104,20.764c0.009,0.016,0.014,0.031,0.022,0.047C35.158,20.82,35.189,20.78,35.104,20.764z"/> <path fill="#3C89C9" d="M25.319,21.403C25.344,21.473,25.464,21.428,25.319,21.403L25.319,21.403z"/> <path fill="#3C89C9" d="M9.57,4.919C9.548,4.922,9.371,4.981,9.409,4.962C9.39,5.075,9.682,4.93,9.737,4.928 C9.731,4.949,9.575,5.02,9.543,5.025c-0.019,0.07-0.005,0.205-0.005,0.224c0.242-0.014,0.913-0.323,0.974-0.583 c0.016,0,0.135,0.18,0.143,0.146c-0.102,0.05-0.121,0.044-0.12,0.035c-0.002,0.003,0,0.003-0.007,0.012 c0.061-0.024,0.112-0.029,0.161-0.027c-0.191,0.034-0.607,0.277-0.596,0.274c-0.021,0.168,0.354-0.094,0.41-0.101 c-0.047,0.197-0.105,0.218,0.145,0.189c-0.059,0.05-0.074,0.072-0.042,0.066c-0.023,0.097-0.432-0.044-0.573-0.013 c0.001,0.075,0.069,0.069,0.061,0.155C9.934,5.447,9.88,5.506,9.745,5.568C9.74,5.632,9.766,5.625,9.76,5.689 c0.207-0.025,0.48-0.019,0.7-0.237c-0.03,0.134,0.19,0.126,0.229-0.048c0.073-0.007,0.118,0.117,0.107,0.217 c0.103-0.023,0.322-0.142,0.41-0.251c-0.056-0.038-0.152-0.108-0.252-0.099c0.081-0.078,0.633-0.297,0.523-0.286 c-0.003,0.016,0.242-0.141,0.275-0.154c-0.002-0.216-0.331,0.016-0.438,0.027c0.033-0.062,0.113-0.108,0.088-0.121 c-0.067,0.005-0.126,0.009-0.124,0c0.082-0.009,0.113-0.007,0.125,0c0.081-0.007,0.174-0.017,0.195-0.024 c0.001-0.03-0.01-0.046-0.027-0.057c0.05,0.003,0.102,0,0.118-0.035c-0.084-0.01-0.156-0.02-0.222-0.027 c-0.152,0.01-0.854-0.096,0,0c0.032-0.001,0.042-0.008,0.01-0.022c0.242,0.03,0.637-0.005,0.68-0.221 c0.015,0.002,0.027-0.01,0.034-0.035c0.022,0.005,0.947-0.321,0.975-0.477c-0.01,0.004-0.012,0-0.007-0.01 c-0.124,0.049-0.191,0.092-0.304,0.104c0.022-0.115,0.643-0.165,0.684-0.396c-0.437,0.042-0.484-0.047-0.947,0.118 c-0.005,0.03-0.025-0.003-0.024-0.008c0.051-0.005,0.289-0.131,0.325-0.223c-0.037-0.008-0.251-0.05-0.268,0.029 c-0.013-0.004-0.986,0.199-1,0.229c0.039,0.011,0.159,0.06,0.1,0.133c-0.021,0.007-0.023-0.011-0.005-0.05 c-0.226,0.026-0.243-0.071-0.444,0.034c-0.016,0.1,0.146,0.045,0.133,0.096c-0.019-0.007-0.027-0.003-0.029,0.013 c-0.056,0.027-0.146-0.065-0.23-0.095c-0.018,0.01-0.036,0.02-0.054,0.029c0.005,0.045,0.016,0.091,0.002,0.152 c-0.022-0.026-0.065-0.057-0.116-0.085c-0.09,0.052-0.183,0.103-0.272,0.156c-0.01,0.017-0.021,0.032-0.026,0.054 c-0.027,0.004-0.043,0-0.053-0.007c-0.008,0.004-0.015,0.009-0.022,0.014c-0.002,0.01-0.001,0.014-0.005,0.035 c-0.008,0-0.015-0.01-0.022-0.018c-0.181,0.112-0.359,0.228-0.535,0.342c0.319,0.066,1.335-0.34,1.671-0.431 c-0.026,0.027-0.404,0.144-0.076,0.102c0.001-0.005-0.292,0.117-0.319,0.12c0.005,0.041,0.026,0.06,0.061,0.057 c-0.176,0.034-0.438,0.044-0.457,0.125c-0.041,0.005,0.067,0.119,0.134,0.146c-0.005,0.006-0.011,0.008-0.015,0.025 c-0.18-0.022-0.416-0.498-0.694,0.044c0.023,0.005-0.128-0.086-0.318-0.179c-0.196,0.129-0.388,0.262-0.58,0.399 C9.516,4.896,9.58,4.888,9.57,4.919z M10.568,5.502C10.443,5.479,10.604,5.349,10.568,5.502L10.568,5.502z M12.911,3.832 C12.975,3.853,12.859,3.887,12.911,3.832L12.911,3.832z M11.537,4.263c-0.007,0.035-0.069,0.056-0.148,0.071 C11.425,4.331,11.474,4.309,11.537,4.263z M10.835,5.203C10.819,5.276,10.826,5.201,10.835,5.203L10.835,5.203z M10.788,4.857 c-0.004,0.006-0.008,0.013-0.012,0.019c0-0.009-0.002-0.017-0.006-0.022C10.776,4.855,10.783,4.854,10.788,4.857z M10.681,5.087 C10.709,5.083,10.659,5.182,10.681,5.087L10.681,5.087z M9.824,5.109C9.845,5.107,9.805,5.186,9.824,5.109L9.824,5.109z"/> <path fill="#3C89C9" d="M22.877,13.599c-0.002,0.004,0,0.021-0.002,0.029c0.021,0.008,0.046,0.008,0.069,0.014 C22.923,13.623,22.898,13.599,22.877,13.599z"/> <path fill="#3C89C9" d="M38.163,15.469C38.018,15.492,38.151,15.559,38.163,15.469L38.163,15.469z"/> <path fill="#3C89C9" d="M23.071,13.667c-0.049-0.002-0.085-0.017-0.126-0.025c0.041,0.035,0.082,0.079,0.105,0.079 C23.045,13.698,23.052,13.681,23.071,13.667z"/> <path fill="#3C89C9" d="M38.328,19.411c-0.005-0.083-0.022-0.19-0.141-0.206C38.189,19.229,38.276,19.411,38.328,19.411z"/> <path fill="#3C89C9" d="M38.1,19.458C38.352,19.487,38.105,19.348,38.1,19.458L38.1,19.458z"/> <path fill="#3C89C9" d="M32.675,5.392c0.043,0.005,0.083,0,0.122-0.011c-0.049-0.039-0.1-0.079-0.148-0.117 c-0.023,0.055-0.043,0.102-0.043,0.108C32.647,5.354,32.668,5.36,32.675,5.392z"/> <path fill="#3C89C9" d="M33.923,19.841C33.863,19.84,33.925,19.907,33.923,19.841L33.923,19.841z"/> <path fill="#3C89C9" d="M33.796,18.986C33.765,18.904,33.762,18.986,33.796,18.986L33.796,18.986z"/> <path fill="#3C89C9" d="M35.792,33.473c-0.732-0.174-2.688,0.27-3.082,0.358c-0.462-0.809-2.413,1.048-2.82,1.086 c0.2-0.318-0.476-0.212-0.422-0.609c-0.585,0.04-1.163-0.022-1.713,0.006c0.363-0.542-0.656-0.427-0.901,0.196 c-0.521,0.024-1.257,0.736-1.423,0.741c0.051-0.705-1.72,0.104-2.083,0.192c-0.215-0.503-3.248,0.069-3.243-0.117 c-0.965-0.005-2.046,1.027-2.925,0.992c0.005,0.064,0.275,0.136,0.329,0.166c-0.005,0.047-0.005,0.092,0,0.143 c0.039,0.036-2.074,1.139-2.086,0.885c-0.713-0.035-2.41-0.384-2.775-1.193c0.029,0.005,0.032-0.021,0.008-0.074 c0.01,0.005,0.013,0.001,0.008-0.009c0.176,0.04,0.09-0.013,0.257-0.066c-0.032-0.221-0.046-0.104,0.017-0.411 c-0.01,0-0.013-0.003-0.013-0.014c-0.03-0.005-0.064,0.038-0.099,0.047c0.009-0.223-0.124-0.259-0.134-0.331 c0.215,0.013-0.251-0.668-0.293-0.977c-0.68,0.207-0.108-0.348-0.131-0.541c0.066,0.005,0.089,0.143,0.148,0.146 c-0.03-0.067,0.009-0.207,0.083-0.346c-0.325,0.19-0.681,0.394-0.652,0.597c-0.347-0.025,0.169,1.254,0.092,1.247 c0.092,0.563-1.257-0.149-1.343-0.155c0.026,0.064-0.029,0.104-0.006,0.229c-0.654-0.216-1.712-0.505-2.4-0.579 c-0.054-0.22-0.437-0.093-0.815,0.047c2.657,2.501,6.011,4.269,9.741,4.978c2.446,0.125,4.89,0.126,7.336,0.007 C28.972,39.259,32.942,36.854,35.792,33.473z"/> <path fill="#3C89C9" d="M9.213,16.624c0.006-0.081-0.001-0.156-0.016-0.229C9.16,16.555,9.156,16.652,9.213,16.624z"/> <path fill="#3C89C9" d="M33.774,18.734C33.738,18.838,33.814,18.735,33.774,18.734L33.774,18.734z"/> <path fill="#3C89C9" d="M13.362,21.16c0.061,0.003,0.154,0.031,0.264,0.072C13.688,20.874,13.424,21.025,13.362,21.16z"/> <path fill="#3C89C9" d="M13.027,33.633c0.05-0.102-0.064-0.098-0.102-0.188c-0.007,0-0.006,0.007-0.012,0.007 c0.048-0.049,0.082-0.098,0.078-0.141c-0.15-0.049-0.37,0.195-0.493,0.432c0.15-0.091,0.288-0.178,0.38-0.256 C12.892,33.531,12.981,33.606,13.027,33.633z"/> <path fill="#3C89C9" d="M31.865,19.384C31.684,20.603,32.432,19.389,31.865,19.384L31.865,19.384z"/> <path fill="#3C89C9" d="M28.391,24.749C28.24,24.758,28.445,24.963,28.391,24.749L28.391,24.749z"/> <path fill="#3C89C9" d="M28.705,24.551C28.541,24.592,28.711,24.82,28.705,24.551L28.705,24.551z"/> <path fill="#3C89C9" d="M29.854,6.451c-0.051-0.005-0.034,0.042,0.017,0.111c-0.009-0.034-0.014-0.069-0.022-0.101 C29.855,6.466,29.859,6.462,29.854,6.451z"/> <path fill="#3C89C9" d="M34.813,21.535C34.787,21.461,34.763,21.523,34.813,21.535L34.813,21.535z"/> <path fill="#3C89C9" d="M34.423,20.78C34.426,21.062,34.449,20.78,34.423,20.78L34.423,20.78z"/> <path fill="#3C89C9" d="M21.765,10.061c0,0.001-0.002,0.003-0.004,0.003C21.765,10.145,21.818,10.05,21.765,10.061z"/> <path fill="#3C89C9" d="M34.658,21.243C34.596,21.243,34.689,21.583,34.658,21.243L34.658,21.243z"/> <path fill="#3C89C9" d="M21.849,13.405c0.01-0.033,0.055-0.198,0.04-0.291c-0.018-0.012-0.04-0.019-0.062-0.03 C21.781,13.188,21.6,13.332,21.849,13.405z"/> <path fill="#3C89C9" d="M34.179,20.558C34.237,20.662,34.267,20.579,34.179,20.558L34.179,20.558z"/> <path fill="#3C89C9" d="M23.202,10.672c-0.028,0-0.051,0.005-0.022,0.019c0.009,0,0.012,0,0.019-0.001 C23.2,10.687,23.2,10.683,23.202,10.672z"/> <path fill="#3C89C9" d="M11.086,31.362c0.108,0.042,0.24,0.061,0.217-0.073c-0.022-0.002-0.042-0.004-0.063-0.005 C11.165,31.295,11.066,31.318,11.086,31.362z"/> <path fill="#3C89C9" d="M10.205,29.578c0.014-0.014,0.014-0.026,0.022-0.038c-0.006,0-0.01-0.006-0.016-0.006 C10.238,29.572,10.235,29.586,10.205,29.578z"/> <path fill="#3C89C9" d="M28.144,18.871C28.18,18.92,28.375,18.911,28.144,18.871L28.144,18.871z"/> <path fill="#3C89C9" d="M37.663,21.013c-0.012,0.104,0.002,0.161,0.024,0.198c0.081-0.09,0.164-0.171,0.244-0.242 C37.837,20.997,37.742,21.019,37.663,21.013z"/> <path fill="#3C89C9" d="M38.016,22.536c-0.322-0.191-0.343,0.067-0.343,0.063c0.126-0.014,0.223-0.012,0.32-0.014 C37.985,22.563,37.994,22.547,38.016,22.536z"/> <path fill="#3C89C9" d="M38.351,16.566C38.361,16.65,38.402,16.568,38.351,16.566L38.351,16.566z"/> <path fill="#3C89C9" d="M37.823,19.911c0.174,0.002,0.458-0.098,0.469,0.241c0.011-0.003,0.014,0,0.011,0.01 c0.113-0.025,0.042-0.118,0.029-0.172c0.084,0,0.031,0.051,0.077,0.052c-0.012-0.269,0.065-0.163-0.009-0.498 c0.023,0.102-0.041-0.008,0,0C38.345,19.534,37.76,19.749,37.823,19.911z"/> <path fill="#3C89C9" d="M38.298,19.217c0.153,0.086-0.125-0.194-0.035-0.193C38.265,19.045,38.183,19.021,38.298,19.217z"/> <path fill="#3C89C9" d="M37.465,19.2c-0.035,0.011-0.331,0.417-0.329,0.476C37.334,19.679,37.498,19.334,37.465,19.2z"/> <path fill="#3C89C9" d="M38.086,18.97c-0.016-0.031-0.013-0.046,0.01-0.04c0.002,0.044-0.261-0.34-0.381-0.636 c0.02,0.268,0.162,0.426,0.165,0.488C37.969,18.783,37.985,18.943,38.086,18.97z"/> <path fill="#3C89C9" d="M37.715,18.293c-0.011-0.095,0-0.2,0.033-0.321C37.621,17.968,37.642,18.115,37.715,18.293z"/> <path fill="#3C89C9" d="M39.622,22.269c0.002-0.044,0.061-0.151,0.06-0.151C39.698,21.87,39.491,22.27,39.622,22.269z"/> <path fill="#3C89C9" d="M39.155,23.009C39.124,23.085,39.255,23.03,39.155,23.009L39.155,23.009z"/> <path fill="#3C89C9" d="M38.772,21.577c0,0.019-0.04,0.015-0.056,0.051c0.035-0.014,0.048-0.011,0.045,0.008 c0.051,0.034,0.339,0.047,0.317-0.029C38.958,21.6,38.881,21.587,38.772,21.577z"/> <path fill="#3C89C9" d="M39.195,22.332C39.016,22.375,39.19,22.557,39.195,22.332L39.195,22.332z"/> <path fill="#3C89C9" d="M39.167,21.282c-0.068,0,0.24,0.206,0.346,0.226c-0.008,0.002-0.029-0.004-0.025,0.008 c-0.07-0.015-0.117,0.042-0.211,0.008c0.005,0.011,0,0.013-0.013,0.011c0.105,0.296,1.003,0.173,0.991,0.86 c-0.064-0.047-0.157-0.024-0.188,0.071c0.091-0.014,0.173-0.015,0.254-0.015c0.02-0.256,0.039-0.512,0.048-0.77 c-0.486-0.253-0.896-0.429-0.896-0.448C39.383,21.214,39.203,21.18,39.167,21.282z"/> <path fill="#3C89C9" d="M9.458,12.874C9.449,12.946,9.527,12.894,9.458,12.874L9.458,12.874z"/> <path fill="#3C89C9" d="M35.872,17.875c0.03,0.501,0.385-0.059,0.388-0.06C36.208,17.613,35.945,17.848,35.872,17.875z"/> <path fill="#3C89C9" d="M40.204,22.265C40.135,22.283,40.202,22.347,40.204,22.265L40.204,22.265z"/> <path fill="#3C89C9" d="M38.046,14.887C38.034,14.804,37.997,14.885,38.046,14.887L38.046,14.887z"/> <path fill="#3C89C9" d="M33.053,5.581c-0.102,0.018-0.14,0.064-0.085,0.273c-0.103-0.02-0.215-0.093-0.314-0.061 c0.008,0.016,0.23,0.231,0.091,0.214c-0.064-0.246-0.266-0.035-0.365-0.046c-0.011-0.038,0.06-0.05,0.045-0.106 c-0.399-0.22-0.721,0.084-1.114,0.042c0.02,0.087,0.133,0.203-0.083,0.126c-0.018,0.109,0.209,0.218,0.185,0.412 c-1.408-0.312-0.102,0.526,0.02,1.112c-0.103-0.009-0.412-0.195-0.556-0.208c0.04-0.11,0.022-0.347,0.112-0.407 c-0.067-0.227-0.586-0.213-0.684-0.221c0-0.006,0.089,0.045,0.104,0.052c-0.011,0.165-0.153-0.003-0.247-0.012 c0.009,0.04,0.005,0.079-0.008,0.115c0,0,0,0,0.001,0c0.066,0.014,0.273,0.155,0.287,0.225c-0.033-0.019-0.044-0.015-0.038,0.007 c0.008,0.006-0.115-0.103-0.249-0.231c-0.001,0-0.001-0.001-0.001-0.001l0,0c-0.109-0.104-0.222-0.221-0.283-0.304 c0.08,0.304,0.063,0.628,0.109,0.901c0.321,0.025,0.756,0.272,0.807,0.55c-0.071,0.006-0.258-0.139-0.235-0.009 c0.013-0.003,0.018,0.005,0.015,0.022c-1.013-0.796,0.219,0.163-0.735,0.09c-0.001-0.014,0.133,0.155,0.143,0.222 c-0.02,0-0.45-0.222-0.477-0.31c0.766-0.027,0.171-0.873,0.158-1.521c-0.848-0.071-0.482,0.516-0.39,1.134 c-0.017-0.005-0.026,0.004-0.023,0.029C29,7.653,28.047,6.642,28.173,7.587c-0.069-0.05-0.091-0.115-0.085-0.198 c-0.309-0.006-0.465,0.096-0.739,0.139c0-0.075,0.008-0.104,0.005-0.214c-0.271,0.06-0.653,0.6-0.902,0.589 c-0.018-0.193-0.115-0.297,0.12-0.285c-0.063-0.157-0.276-0.349-0.443-0.357C26.163,7.536,26.141,7.679,26.167,8 c-0.315-0.014-0.353-0.208-0.312,0.302c-0.291-0.064-0.171-0.117-0.41-0.212c-0.017,0.069,0.026,0.11-0.031,0.107 c0.028,0.115,0.14,0.167,0.15,0.299c-0.534-0.018-0.244-0.533-0.716-0.622c-0.007-0.09-0.125-0.1-0.138-0.289 c0.016-0.007,0.956,0.131,1.127,0.14c-0.064-0.403-0.878-0.732-1.156-0.74c-0.004-0.029,0.054-0.064,0.08-0.063 c-0.12-0.149-0.387,0.083-0.438-0.09c0.073,0.002,0.106-0.051,0.198-0.049c-0.024-0.099-0.146-0.191-0.244-0.226 c-0.019,0.057,0,0.174-0.061,0.15C24.215,6.57,24.213,6.641,24.204,6.5c-0.034,0.011-0.052-0.023-0.096-0.025 c0.008,0.126-0.114,0.139-0.118,0.292c-0.027-0.001,0.014-0.186,0.009-0.208c-0.045-0.002-0.164,0.236-0.177,0.312 c-0.007-0.009-0.017-0.012-0.03-0.011c0.038-0.118,0.058-0.129,0.087-0.226c-0.011,0.002-0.014,0-0.012-0.012 c-0.142,0.077-0.258,0.133-0.528,0.051c0.002,0.039-0.015,0.05-0.057,0.032c0.021,0.139,0.05-0.091,0.104,0.145 c-0.104-0.033-0.195-0.059-0.19,0.05c-0.085-0.106-0.16-0.109-0.15,0.128c0.017,0-0.326,0.075-0.319,0.313 c0.043-0.036,0.089-0.042,0.138-0.021c-0.052,0.121-0.095-0.055-0.083,0.141c0.001,0-0.102-0.188-0.129-0.045 c0.257-0.094-0.723,0.902-0.727,0.999c0.045,0,0.014,0.008,0.014,0.027c0.042-0.007,0.089-0.024,0.139-0.052 c-0.043,0.021-0.114,0.059-0.142,0.059c-0.002-0.003,0.003-0.004,0.003-0.007c-0.106,0.017-0.183,0.014-0.179,0.181 c-0.108-0.034-0.047-0.012-0.211-0.013c0.037,0.102,0.085,0.117-0.089,0.12c0.014,0.034,0.012,0.048-0.01,0.043 c0,0.036,0.109-0.013,0.11,0.067c-0.018,0-0.02,0.015-0.02,0.032c-0.021,0.004-0.026-0.014-0.012-0.053 c-0.099,0.004-0.124,0.032-0.229,0.031c0.002,0.117,0.071,0.022,0.132,0.087c-0.061-0.002-0.121,0.001-0.181,0.011 c0,0.078,0.011,0.021,0,0.076c0.007,0.027,0.225,0.055,0.26,0.056c0.018-0.009,0.032-0.018,0.032-0.032 c-0.021-0.008-0.032,0.003-0.03,0.032h-0.002c-0.063,0.037-0.225,0.034-0.26,0.021c0,0.019,0.138,0.121-0.007,0.121 c0.079,0.173,0.147,0,0.292,0.001c-0.021,0.084-0.143,0.218-0.221,0.23c0,0.03-0.02,0.008-0.02,0.055 c0.043-0.009,0.061,0.006,0.051,0.044c0.021,0,0.062-0.077,0.101-0.077c-0.16,0.702,0.364,0.126,0.647,0.092 c0.007,0.338,0.24,0.488,0.198,0.835c0.011-0.003,0.016,0,0.014,0.011c0.021-0.011,0.033-0.007,0.03,0.012 c0.216,0.002,0.189-0.31,0.454-0.215c0.029-0.038,0.043-0.083,0.036-0.13c-0.189,0.121,0.169-0.425-0.061-0.429 c0-0.043,0.637-0.323,0.091-0.623c-0.079-0.216,0.334-0.793,0.481-0.79c0.231-1.268,0.322,0.951,0.34,0.947 c0.004,0.073-0.059,0.065-0.097,0.064c0.019,0.057,0,0.006,0,0.065c0.012-0.003,0.014,0,0.012,0.01 c0.157-0.032,0.412-0.139,0.715-0.203c0.004,0.056,0.199,0.235,0.305,0.237c-0.186,0.446-0.616-0.031-0.839,0.692 c-0.111,0.023-0.224-0.044-0.209-0.158c-0.156,0.055-0.327,0.652-0.363,0.778c0.039,0,0.082,0.01-0.006,0.017 c0,0.002-0.005,0.01-0.005,0.01c-0.009-0.003-0.01-0.005-0.013-0.008c-0.032,0.002-0.073,0.004-0.13,0.006 c-0.027-0.134,0.04,0.003,0.038-0.065c-0.136-0.068-0.938,0.188-0.941,0.176c-0.48-0.076-0.011-0.779-0.237-0.78 c0-0.023,0.103-0.076,0.1-0.198c-0.1,0.06-0.291,0.132-0.333,0.262c0.026,0.011,0.056-0.007,0.084-0.028 c-0.002-0.002-0.002-0.001-0.002-0.004c0.004-0.001,0.004,0.001,0.005,0c0.057-0.044,0.106-0.097,0.11,0.077 c0.118,0-0.428,1.146-0.434,0.776c-0.38,0.015-0.725,0.683-1.118,0.735c0.015,0.064,0.096,0.171,0.063,0.242 c-0.078,0-0.435-0.042-0.459,0.055c0.111,0.026,0.029,0.087-0.012,0.1c0.077,0.173,1.219,0.896-0.04,0.9 c0.005-0.563-0.431,0.343-0.497,0.49c0.002,0,0.004-0.006,0.006-0.006c-0.021,0.043-0.019,0.033-0.006,0.006 c-0.101,0.027-0.059,0.717-0.068,0.784c0.155-0.029,1.15,0.357,1.151-0.168c0.063,0,0.489-1.053,0.658-1.053 c0-0.184,0.342-0.115,0.709,0.087c0.006-0.011,0.016-0.022,0.016-0.031c0.03,0,0.041,0.025,0.046,0.061 c0.396,0.232,0.808,0.62,0.816,1.02c0.24,0.044,0.146-0.387,0.169-0.507c-0.375-0.13-0.453-0.611-0.465-0.891 c0.007,0.016,0.019,0.029,0.038,0.036c-0.002-0.011,0-0.014,0.013-0.01c0-0.068,0.039-0.031,0.063-0.142 c0.392,0.189,0.849,1.486,1.225,1.491c-0.038,0.079-0.177-0.133-0.224,0.02c0.047,0,0.009,0.158,0.08,0.176 c0-0.045,0.27-0.129,0.306-0.118c-0.002-0.13-0.111-0.1-0.111-0.199c-0.015,0.005-0.017-0.002-0.012-0.021 c0.092,0.057,0.149,0.1,0.228,0.168c-0.003-0.012,0-0.016,0.01-0.012c0.015-0.18-0.265-0.156-0.279-0.156 c0.003-0.015-0.005-0.019-0.022-0.011c0-0.034,0.183-0.261-0.027-0.263c0.022-0.066,0.031-0.037,0.029-0.098 c0.014,0.002,0.022-0.003,0.021-0.022c0.011,0.044,0.06,0.131,0.099,0.132c0.008,0.012,0.019-0.116,0.017-0.186 c0.198,0.001,0.336-0.042,0.343,0.147c0.122-0.041,0.22-0.16,0.354-0.159c-0.003-0.014,0.005-0.021,0.022-0.021 c-0.011-0.318,0.27-0.793,0.322-1.024c0-0.004-0.005-0.004-0.005-0.008c0.005,0,0.003-0.001,0.008-0.001 c0.007-0.024,0.021-0.057,0.018-0.076c0.07,0.07,0.078,0.077-0.018,0.076c0,0.002,0,0.005-0.003,0.009 c0.024,0.138,0.294-0.052,0.316,0.129c-0.054-0.013-0.169,0.017-0.186,0.094c0.127,0.003,0.149,0.029,0.136,0.189 c0.149-0.038,0.248-0.137,0.401-0.133c0-0.019,0.014-0.025,0.019-0.066c-0.01,0.003-0.015,0-0.01-0.011 c-0.123,0.019-0.35-0.013-0.356-0.192c0.276,0.055,0.43-0.199,0.724-0.191c-0.005,0.014,0.004,0.02,0.02,0.012 c0.005,0.064-0.238,0.147-0.261,0.156c0.181,0.242-0.111,0.104-0.104,0.281c0.341-0.111,0.579,0.649,0.586,0.765 c-0.366-0.009-1.502-0.317-1.491,0.047c-0.209,0.038-0.396,0.218-0.456,0.342c0-0.01,0.005-0.013,0.001-0.032 c-0.048,0.01-0.036,0.05-0.019,0.06c-0.016,0.048-0.015,0.083,0.025,0.093c0.173,0.669,0.731,0.316,1.307,0.326 c0.121,0.57-0.042,1.127-0.608,1.039c-0.061-0.602-3.05,0.836-2.803-1.088c-0.443,0.063-1.353,0.293-1.844,0.294 c0.006-0.668-1.23,0.815-1.122,0.815c-0.006,0.609-0.829,0.848-0.837,1.386c-0.213,0.002-0.131,1.342-0.181,1.557 c-0.814,0.243,2.428,3.111,2.432,1.575c0.15,0.057,0.122-0.007,0.122,0.088c1.028-0.129,0.973,0.24,1.194,0.999 c0.021,0,0.654,1.646,0.613,2.149c-0.566,0,0.195,3.079,0.488,3.387c0.511,0.34,0.002,1.001,1.266,0.56 c0.005-0.288,1.141-1.609,1.271-1.708c0.09-0.465-0.266-1.297,0.536-1.301c0.01-0.658,0.107-1.17,0.008-1.984 c0.325-0.004,1.642-2.644,1.741-3.105c-0.291-0.143-0.696,0.373-1.056,0.133c-0.033-0.125-0.521-1.115-0.654-1.116 c0.113-0.65-0.854-1.5-0.977-2.235c0.013,0.003,0.018-0.004,0.009-0.022c0.102,0.001,0.198,0.144,0.297,0.146 c0.002-0.032,0.164,0.253,0.169,0.253c0.004,0.16,0.665,1.48,0.767,1.48c0.018,0.914,0.403,1.04,1.01,0.946 c0.35,0.044,0.898-0.622,1.19-0.766c-0.005-0.163,0.389-0.419,0.378-0.664c0.094-0.19-0.494-0.434-0.507-0.753 c-0.409,0.106-0.438,0.696-0.692,0.008c-0.024,0-0.104,0.102-0.103,0.14c-0.231-0.069-0.38-0.934-0.384-0.962 c0.451,0.01,1.052,0.917,1.63,0.996c0.794,0.017,1.154,0.401,1.644,0.411c-0.071,0.161-0.145,0.161-0.264,0.198 c0.188,0.613,0.431,0.16,0.453-0.033c0.216,0.054,0.23,2.487,0.836,2.491c-0.009-0.781,1.272-2.552,1.72-2.533 c0.004,0.044,0.576,1.16,0.625,1.237c0.15-0.004,0.242,0.002,0.284-0.183c0.479,0.011,0.359,1.584,0.707,2.311 c-0.197-0.24-0.462-0.422-0.841-0.425c0.012,0.558,1.058,1.425,1.307,1.909c0.021,0.017,0.013-0.574-0.231-1.104 c0.011,0.026-0.033,0.055-0.034-0.022c0.02,0.004,0.029,0.013,0.034,0.021c-0.01-0.014-0.014-0.031-0.021-0.045 c-0.013-0.005-0.023-0.017-0.023-0.048c0,0,0,0,0.002,0c-0.01-0.019-0.017-0.039-0.026-0.059c0.061,0.057,0.129,0.102,0.212,0.121 c0.013-0.054,0.049-0.072,0.11-0.051c-0.039-0.649-0.478-1.309-0.64-1.938c0.024,0.007,0.031,0,0.021-0.021 c0.256,0.004,0.627,0.572,0.654,0.783c0.045,0.003,0.051,0.023,0.014,0.063c0.225-0.039,0.106-0.132,0.103-0.247 c-0.017,0.003-0.02-0.004-0.014-0.022c0.061,0.034,0.044,0.104,0.125,0.106c0.02-0.095-0.112-0.066-0.116-0.158 c0.884,0.113,0.237-0.651,0.212-1.054c-0.698-0.342,0.215-1.186,0.297-0.603c-0.026,0.002,0.534-0.4,0.527-0.456 c0.792,0.025,1.004-0.899,0.852-1.262c0.176-0.068,0.073-0.22-0.06-0.228c0.007,0.065-0.073-0.027-0.066-0.023 c0.047-0.051,0.111,0.005,0.159,0.007c-0.013-0.12-0.255-0.648-0.288-0.746c0.063-0.15,0.347-0.104,0.354-0.273 c-1.095-0.159-0.562-0.756-0.136-0.604c-0.025,0.202-0.104,0.205-0.082,0.358c0.574-0.075,0.843,0.152,0.789,0.856 c0.672,0.205-0.369-1.703,0.523-1.634c0.035,0.157,0.182,0.08,0.354-0.107c-0.995-2.479-2.477-4.711-4.335-6.569 c-0.006,0.029-0.013,0.058-0.018,0.095c0.006,0.016,0.012,0.037,0.013,0.037c0.002-0.017-0.005-0.024-0.014-0.022 c0-0.008,0.003-0.008,0.003-0.014c-0.01-0.032-0.025-0.091-0.042-0.152C34.51,6.871,34.432,6.8,34.357,6.728 c-0.03-0.001-0.056-0.007-0.138-0.039c-0.094,0.064-0.195,0.126-0.305,0.175c-0.146,0.103-0.306,0.191-0.331,0.093 c0.121-0.009,0.229-0.046,0.331-0.093c0.143-0.098,0.271-0.211,0.267-0.191c0.016,0.009,0.024,0.011,0.038,0.016 c0.02-0.012,0.04-0.022,0.06-0.036C33.888,6.281,33.478,5.923,33.053,5.581z M31.25,6.407C31.323,6.416,31.214,6.534,31.25,6.407 L31.25,6.407z M21.661,8.688c0.02,0.007,0.012,0,0.02,0.013C21.661,8.692,21.674,8.7,21.661,8.688z M22.392,7.937 C22.357,7.937,22.39,7.864,22.392,7.937L22.392,7.937z M22.375,9.67c-0.071-0.026,0.014,0.024-0.123,0.021 C22.248,9.57,22.361,9.55,22.357,9.44C22.524,9.442,22.371,9.61,22.375,9.67z M22.537,9.694C22.595,9.694,22.523,9.789,22.537,9.694 L22.537,9.694z M22.678,7.614c0.02,0.006,0.01-0.001,0.02,0.011C22.678,7.618,22.69,7.626,22.678,7.614z M22.873,9.435 C23.062,9.488,22.895,9.522,22.873,9.435L22.873,9.435z M22.812,9.435C22.879,9.435,22.812,9.473,22.812,9.435L22.812,9.435z M21.06,11.242C21.199,11.266,21.08,11.32,21.06,11.242L21.06,11.242z M21.841,10.829c0.02,0.007,0.008-0.002,0.02,0.011 C21.841,10.833,21.854,10.84,21.841,10.829z M22.408,12.624c0-0.04,0-0.07,0-0.082c0.001,0.018,0.007,0.025,0.021,0.022 C22.419,12.577,22.412,12.598,22.408,12.624z M24.253,9.799C24.187,9.392,24.341,9.801,24.253,9.799L24.253,9.799z M24.613,8.967 c-0.007-0.127,0.279,0.145,0.304,0.274C24.837,9.195,24.326,8.949,24.613,8.967z M25.031,8.478 C25.295,8.55,25.097,8.698,25.031,8.478L25.031,8.478z M25.119,8.928c0.236-0.007,0.023-0.131,0.021-0.175 c-0.013,0.004-0.014,0-0.013-0.01c0.227,0.059,0.188,0.259,0.199,0.431C25.32,9.174,25.122,8.957,25.119,8.928z M25.444,9.265 C25.66,9.271,25.45,9.377,25.444,9.265L25.444,9.265z M25.731,9.786c-0.043-0.028-0.055-0.017-0.04,0.031 c-0.063,0.001-0.205-0.064-0.211-0.159c0.202,0.036,0.018-0.098,0.064-0.097c0.005-0.027,0.202,0.157,0.2,0.148 C25.707,9.712,25.698,9.737,25.731,9.786z M21.798,20.317C21.772,20.469,21.68,20.317,21.798,20.317L21.798,20.317z M22.633,24.561 C22.592,24.561,22.635,24.486,22.633,24.561L22.633,24.561z M22.723,18.607c-0.012-0.02-0.021-0.029-0.033-0.041 c-0.04-0.025-0.091-0.051-0.121-0.059c0,0.012,0.063-0.007,0.121,0.059C22.745,18.599,22.781,18.627,22.723,18.607z M24.549,22.683 C24.479,22.443,24.79,22.683,24.549,22.683L24.549,22.683z M25.807,19.003C26.031,18.981,25.812,19.187,25.807,19.003L25.807,19.003 z M25.7,20.269c0.064,0.021,0.122,0.283,0.122,0.35C25.653,20.57,25.7,20.352,25.7,20.269z M25.126,15.669 C25.152,15.669,25.132,15.805,25.126,15.669L25.126,15.669z M25.011,20.704C24.946,20.988,24.904,20.704,25.011,20.704 L25.011,20.704z M24.716,21.163C24.716,21.068,24.721,21.162,24.716,21.163L24.716,21.163z M24.652,21.468 C24.644,21.18,24.823,21.439,24.652,21.468L24.652,21.468z M25.088,22.572c-0.047,0-0.096,0.002-0.143,0.002 c-0.018,0.006-0.278-0.795-0.263-0.788c0.033-0.157,0.3,0.51,0.416,0.776C25.088,22.559,25.083,22.563,25.088,22.572z M25.242,22.42 C25.242,22.363,25.39,22.418,25.242,22.42L25.242,22.42z M25.531,23.511c-0.024-0.035-0.051-0.04-0.078-0.021 c0.003-0.276-0.024-0.486-0.06-0.774C25.538,22.749,25.533,23.354,25.531,23.511z M25.583,21.731 C25.549,21.862,25.473,21.731,25.583,21.731L25.583,21.731z M25.144,20.802C25.162,20.728,25.331,20.824,25.144,20.802 L25.144,20.802z M25.331,20.988c0,0,0.219,0.224,0.219,0.153c-0.112,0.038-0.19,0.326-0.041,0.328 c-0.03,0.116-0.091,0.017-0.091,0.153c-0.011-0.004-0.014,0-0.011,0.012c-0.033,0-0.229-0.213-0.229-0.022 C24.801,21.611,25.352,20.884,25.331,20.988z M25.549,15.381C25.544,15.208,25.607,15.381,25.549,15.381L25.549,15.381z M26.517,13.96C26.53,14.203,26.358,13.958,26.517,13.96L26.517,13.96z M27.902,7.41C27.964,7.415,27.905,7.446,27.902,7.41 L27.902,7.41z M26.723,13.66C26.897,13.681,26.784,13.762,26.723,13.66L26.723,13.66z M26.93,14.394 c-0.092-0.001-0.198-0.266-0.207-0.318c0.089,0.01,0.245,0.217,0.251,0.266C26.948,14.337,26.932,14.354,26.93,14.394z M28.036,13.653c-0.12,0-0.15-0.092-0.207-0.093c0,0.001,0.002,0.189-0.029,0.206c0.024,0.003,0.036,0.014,0.033,0.032 c0.047,0.001,0.083-0.041,0.156-0.038c0.004,0.039,0.094,0.479,0.02,0.637c-0.916-0.022-0.507-0.315-0.535-0.75 c-0.551-0.013-0.584-1.176-0.283-1.167c0.209-0.933,1.076,0.798,0.557,0.462c0.002-0.018-0.009-0.022-0.035-0.012 c0.006-0.01,0-0.015-0.01-0.011c-0.002-0.013,0.184-0.061,0.179-0.134c-0.292-0.122-0.154,0.092-0.344,0 c0.003,0.011,0,0.015-0.013,0.011c0.014,0.05,0.03,0.076,0.044,0.089c-0.021-0.003-0.057-0.001-0.131,0.039 c0.109,0.31,0.338,0.166,0.362,0.54c0.17,0.005,0.027-0.139,0.291,0.074C28.098,13.922,28.013,13.435,28.036,13.653z M28.743,13.061 c-0.063-0.002-0.022,0.139-0.063,0.138c-0.082-0.147-0.282-0.753,0.205-0.69C28.952,12.681,28.751,13.167,28.743,13.061z M31.058,13.368C31.105,13.137,31.521,13.5,31.058,13.368L31.058,13.368z M30.788,12.624c-0.09,0.076-0.154,0.169-0.143,0.279 C30.355,12.825,30.541,12.708,30.788,12.624c0.193-0.166,0.511-0.231,0.495-0.104C31.196,12.513,30.974,12.559,30.788,12.624z M35.015,20.699C35.066,20.7,35.017,20.785,35.015,20.699L35.015,20.699z M37.291,15.826C37.284,15.731,37.46,15.834,37.291,15.826 L37.291,15.826z M38.519,13.325C38.634,13.339,38.701,13.672,38.519,13.325L38.519,13.325z M36.948,16.116 C36.934,16.205,36.748,16.127,36.948,16.116L36.948,16.116z M36.312,16.168C36.341,16.159,36.284,16.276,36.312,16.168 L36.312,16.168z M35.538,19.34C35.391,19.385,35.531,19.194,35.538,19.34L35.538,19.34z M34.66,17.915 C34.568,17.942,34.655,17.829,34.66,17.915L34.66,17.915z M35.108,11.012c0.094,0.008-0.093,0.92-0.56,0.887 c0-0.025-0.019-0.033-0.055-0.025C34.507,11.891,35.106,11.153,35.108,11.012z M34.444,14.623 C34.584,14.63,34.459,14.76,34.444,14.623L34.444,14.623z M34.25,6.785C34.27,6.788,34.249,6.859,34.25,6.785L34.25,6.785z M34.079,11.833C34.148,11.838,34.077,12.034,34.079,11.833L34.079,11.833z M33.114,11.963 C32.973,11.99,33.128,11.817,33.114,11.963L33.114,11.963z M33.109,6.245c0-0.01-0.004-0.012-0.014-0.011 c0.003-0.054-0.011-0.042-0.066-0.049c-0.002-0.012-0.007-0.023-0.016-0.033c0.033-0.017,0.002-0.062-0.007-0.091 c0.119,0.016,0.274,0.076,0.234-0.07c0.032,0.006,0.032,0.009,0.023,0.009C33.395,6.05,33.152,6.235,33.109,6.245z M33.44,6.963 C33.685,6.947,33.46,7.044,33.44,6.963L33.44,6.963z"/> <path fill="#3C89C9" d="M27.862,13.907C27.93,13.892,27.875,13.8,27.862,13.907L27.862,13.907z"/> <path fill="#3C89C9" d="M36.572,25.586c0.003-0.032-0.015-0.065-0.028-0.103c-0.018-0.027-0.04-0.049-0.058-0.049 C36.484,25.492,36.507,25.583,36.572,25.586z"/> <path fill="#3C89C9" d="M36.788,21.607c0.583,0.182,0.247-0.67,0.654-0.686c-0.195-0.356-0.303-0.515,0.04-0.696 c-0.04-0.106-0.26-0.26-0.303-0.261c0.021,0.128-0.887,0.678-0.825,0.848C35.311,20.643,36.791,21.896,36.788,21.607z M36.387,20.822c-0.022-0.006-0.009,0.001-0.022-0.012C36.387,20.818,36.375,20.81,36.387,20.822z"/> <path fill="#3C89C9" d="M9.104,5.205c0-0.014-0.012-0.028-0.029-0.041C9,5.22,8.929,5.281,8.854,5.338 C8.921,5.492,9.335,5.126,9.104,5.205z"/> <path fill="#3C89C9" d="M3.835,12.353c0-0.008-0.003-0.008-0.004-0.014c-0.013-0.01-0.024-0.026-0.04-0.035 C3.787,12.325,3.793,12.352,3.835,12.353z"/> <path fill="#3C89C9" d="M3.382,12.197c0.001,0,0.001,0.001,0.003,0.001c-0.03-0.002-0.059-0.004-0.086,0.007 c-0.034,0.136,0.431,0.404,0.661,0.385c0.005-0.026-0.008-0.042-0.016-0.061c0.011,0.034,0.023,0.057,0.035,0.104 C3.987,12.637,4,12.64,4,12.646c-0.013,0.001-0.009,0.012-0.014,0.019c0.005,0.025,0.011,0.043,0.016,0.071 c-0.027,0.002-0.039-0.046-0.016-0.071c-0.003-0.011-0.006-0.021-0.008-0.031c-0.051-0.024-0.228-0.013-0.289-0.02 c-0.034,0.225-0.379,1.93-0.042,1.962c0.012-0.073-0.007-0.04,0.06-0.044c-0.083,0.09,0.897,1.763,0.723,1.771 c0.054,0.288,0.631,0.44,0.596,0.835c0.062-0.002,0.008-0.023,0.068-0.043c0.121-0.463-0.635-1.013-0.576-1.478 c0.619-0.025,0.979,2.242,1.331,2.237c0.175,0.377,1.95,0.87,2.337,0.865c0.046,0.212,0.247,0.416,0.238,0.662 C8.6,19.379,8.73,19.659,8.949,19.73c-0.003-0.002-0.008-0.003-0.021-0.008c0.008,0.03,0.002,0.025,0.032,0.033 c-0.004-0.014-0.004-0.021-0.008-0.024c0.05,0.015,0.102,0.023,0.162,0.011c-0.003-0.025,0.017-0.04,0.056-0.042 c-0.002-0.152,0.09-0.095,0.094-0.235c0.565,0.294,0.003,1.677-0.271,2.038c0.23,0.049,0.031,0,0.176,0 c0,0.445-0.345,0.505,0.191,0.957c0.004,0.366,0.381,1.012,0.595,1.283c0.902,0.009,0.623,1.492,0.622,1.972 c-0.079,1.125,0.152,3.233-0.141,3.766c-0.108-0.005-0.067-0.119-0.228-0.063c0.05,0.031,0.046,0.074,0.017,0.121 c0.313,0.032,0.09,0.487,0.256,0.494c-0.088,0.196,0.162,0.548-0.035,0.539c0.031,0.011,0.047,0.023,0.047,0.047 c0.098,0.018,0.1-0.067,0.159-0.064c-0.003,0.034,0.019,0.041,0.064,0.023c0.011,0.096-0.118,0.08-0.167,0.087 c0.086,0.282,0.18,0.154,0.33,0.348c0.06-0.007,0.07-0.09,0.101-0.169c0.023,0.021,0.103,0.044,0.109,0.112 c-0.116,0.038-0.09,0.147,0.073,0.188c-0.019,0.015-0.17-0.096-0.122,0.015c-0.012-0.003-0.022,0-0.03,0.007 c-0.004-0.03-0.02-0.16-0.081-0.164c0.009,0.085-0.005,0.042-0.065,0.062c0.008-0.05-0.014-0.063-0.065-0.033 c0.025,0.159,0.081,0.059,0.141,0.061c0.012,0.106-0.059,0.038-0.136,0.075c0.012,0.057,0.219,0.101,0.435,0.118 c0.025-0.004,0.048-0.006,0.063-0.006c0.001,0.006-0.001,0.006,0,0.011c0.218,0.016,0.425,0.002,0.419-0.056 c-0.219-0.053-0.555-0.347-0.58-0.472c-0.071,0.019-0.111,0.037-0.137,0.049c0.037-0.069,0.097-0.127,0.244-0.109 c-0.086-0.26-0.052-0.206-0.083-0.503c0.083,0.003,0.28-0.131,0.383-0.371c-0.526-0.324-0.004-0.622,0.104-1.043 c-0.034-0.013-0.08-0.013-0.097-0.014c-0.002-0.035,0.182,0.007,0.202,0.008c-0.004-0.069,0.012,0.009,0.005-0.074 c-0.017,0.002-0.024-0.011-0.024-0.035c-0.133-0.005-0.168-0.136-0.245-0.139c0.028-0.064,0.025-0.086,0.053-0.146 c0.467,0.016,0.135-0.027,0.304-0.387c0.542,0.018,0.656-0.47,0.632-0.808c-0.062-0.054-0.108-0.143-0.118-0.307 c0.055,0,0.104,0.136,0.118,0.307c0.174,0.161,0.502-0.066,0.687-0.344c-0.004,0.004-0.007,0.008-0.018,0.012 c-0.001-0.033,0.022-0.031,0.025-0.021c0.08-0.12,0.134-0.252,0.13-0.364c0.034,0.055,0.066,0.058,0.098,0.013 c-0.003,0.011,0.001,0.013,0.011,0.011c-0.006,0.136-0.04,0.124-0.066,0.215c0.041,0.002,0.019-0.041,0.053-0.041 c-0.004-0.107,0.105-0.427,0.241-0.472c-0.001-0.096,1.733-2.791,1.35-2.798c-0.003-0.314,0.518-0.862,0.516-1.426 c-0.326,0-0.858-0.782-1.218-0.424c0.019,0.001-0.371-0.201-0.668-0.314c-0.001,0.009,0,0.012-0.001,0.021 c-0.259,0.067-0.302-0.009-0.262-0.093c-0.038-0.001-0.066,0.004-0.066,0.028c-0.146,0-0.036,0.227-0.133,0.227 c0.03-0.114,0.038,0.059,0.013-0.194c-0.268,0.013-0.299,0.208-0.604,0.208c0-0.046,0.943-0.436,0.856-0.423 c-0.002-0.011,0-0.015,0.011-0.011c0.001-0.182-0.024,0.032,0.023-0.174c-0.147,0.006-0.003,0.065-0.11,0.065 c0.417-0.783-0.935-0.969-1.153-0.967c0.001-0.076-0.012-0.012-0.044-0.01c-0.066-0.442-0.031-0.324-0.497-0.319 c0.032-0.053,0.16-0.145,0.219-0.193c-0.038-0.022-0.143-0.178-0.171-0.227c-0.173-0.006-1.139-0.2-1.137-0.2 c0.001,0.152-0.162,0.276-0.167,0.515c-0.206,0.002,0.047-0.519,0.047-0.534c-0.033,0-0.046-0.011-0.043-0.032 c-0.018,0.008-0.026,0.003-0.021-0.01c-0.31,0.005-0.654,0.775-0.755,0.775c0.011-0.388-1.209-0.058-0.965-0.633 c0.025-0.689,0.151-0.722-0.702-0.706c0.009-0.176,0.127-0.342,0.138-0.53c-0.014,0,0.016,0.095,0.059,0.093 c-0.095-1.071,0.012-0.283-0.659-0.057c-0.046,0.698-0.997-0.961-0.724-0.835c-0.387-1.162,1.034-1.04,1.346-1.052 c0.114-0.135-0.096-0.147-0.142-0.214c0.49-0.164,1.108,0.105,1.217,0.646c0.127-0.546,0.696-1.87,0.678-1.659 c0.103,0.028,0.078-0.002,0.171-0.006c0.018-0.218-0.328-0.518,0.087-0.821c0,0-0.116,0.325-0.119,0.355 c0.053-0.001,0.081-0.078,0.07,0.04c0.177-0.097,0.067-0.161,0.095-0.333c-0.002-0.001,0.614-0.515,0.777-0.521 c-0.187-0.278,0.509-0.629,0.648-0.753c0.088,0.131-0.031-0.05,0.198-0.094c-0.017,0.169-0.23,0.118,0.146,0.111 c-0.008,0.087-0.26,0.323-0.27,0.418c0.011,0.005,0.413-0.403,0.54-0.407c-0.024-0.103-0.07,0.069-0.03-0.116 c-0.157,0.024-0.174,0.038-0.297,0.044c0.001-0.017-0.177-0.388-0.055-0.394c-0.009-0.016-0.014-0.034-0.016-0.053 c-0.058,0.006-0.116,0.05-0.173,0.062c0.003-0.036,0.055-0.071-0.012-0.084c0.021-0.013,0.037-0.033,0.047-0.056 c0.058,0.196,0.224-0.155,0.243-0.15c0.022-0.492-1.027,0.497-0.996,0.495c0.496-0.604,0.687-0.748,1.397-0.781 c1.021-0.212,0.604-0.658,0.342-0.735c-0.066,0.024-0.128,0.045-0.159,0.051c0.006-0.066,0.076-0.076,0.159-0.051 c0.128-0.048,0.279-0.117,0.285-0.185c0.007,0.008-0.578-0.368-0.602-0.367c0.006,0.016-0.005-0.131-0.008-0.106 c0.068,0.005,0.098,0.005,0.131,0.004c0.105-0.352-0.426-0.389-0.284-0.891c-0.147,0.036-1.038,1.066-0.605-0.09 c-0.196,0.013-0.639-0.552-1.112-0.185c-0.033,0.521-0.044,0.853,0,1.38c-0.42,0.108-0.429,0.66-0.464,0.926 c-0.13,0.007-0.46-0.413-0.4-0.416c0.063-0.201-0.902-0.685-1.198-0.591c-0.009-0.04-0.166-0.462-0.183-0.367 c-0.38,0.033,0.291-0.711,0.291-0.696c-0.05,0.005,0.885-0.672,0.907-0.795c-0.14-0.015-0.275-0.006-0.439,0.01 C9.045,8.472,9.108,8.608,9.14,8.453c0.089-0.047,0.256,0.11,0.319,0.104c0.059-0.093,0.047-0.144,0.063-0.233 C9.683,8.251,9.703,8.37,9.85,8.335c0-0.009,0.004-0.016,0.014-0.022C9.808,8.293,9.796,8.2,9.737,8.22 c0.023-0.01,0.036-0.024,0.037-0.044c0.425-0.184,0.961-0.912,0.118-0.83c0.123,0.313-0.177,0.357-0.244,0.687 c-0.525,0.051,0.043-0.47-0.18-0.52C9.352,7.638,9.265,7.709,9.232,7.866C9.294,7.871,8.979,7.475,8.978,7.46 c0.237-0.153,0.031-0.043,0.109-0.196C9.126,7.286,9.188,7.322,9.21,7.221C9.2,7.226,9.198,7.222,9.203,7.212 C9.062,7.26,8.921,6.938,8.817,6.978c0.05-0.202,0.901-0.654,0.487-0.648C9.264,6.413,8.924,6.266,8.81,6.734 C8.648,6.863,8.551,7.378,8.513,7.552c0.029-0.011,0.065-0.077,0.049-0.005C8.57,7.546,8.858,7.445,8.946,7.475 C8.918,7.601,8.763,7.605,8.678,7.657C8.655,7.808,8.634,7.775,8.731,7.756c-0.08,0.076-0.293,0.497-0.29,0.487 c-0.206,0.074-0.14-0.145-0.11-0.273C8.25,8.032,8.297,7.991,8.313,7.92c-0.102,0.011-0.037,0.044-0.18-0.04 c-0.391,0.75-1.09-0.359-1.382,0.26c0.037,0.01,0.044-0.012,0.085-0.001c0.039-0.069,0.261-0.168,0.326-0.158 C7.01,8.273,6.807,8.15,6.723,8.514C6.66,8.461,6.68,8.371,6.698,8.277c0.077-0.073-0.505,0.082-0.738,0.071 c0.05-0.185,0.119-0.071,0.181-0.181C6.071,8.153,6,8.136,5.926,8.119c-0.161,0.188-0.319,0.38-0.474,0.574 c0.053-0.009,0.104-0.019,0.138-0.002C5.507,8.755,5.481,8.815,5.514,8.868c-0.058,0.007-0.15,0.009-0.22,0.027 C5.288,8.903,5.282,8.91,5.276,8.918C5.268,8.99,5.381,8.933,5.359,9.015C5.298,8.987,5.23,9.02,5.165,9.059 c-0.667,0.88-1.256,1.82-1.769,2.807C3.412,11.949,3.417,12.041,3.382,12.197z M3.885,12.865C3.91,12.736,4.033,12.817,3.885,12.865 L3.885,12.865z M11.391,31.242C11.507,31.245,11.397,31.289,11.391,31.242L11.391,31.242z M10.955,24.225 C11.074,24.225,10.975,24.438,10.955,24.225L10.955,24.225z M10.815,30.891C10.79,30.668,10.974,30.899,10.815,30.891L10.815,30.891 z M10.842,30.767c-0.022,0.021-0.07-0.005-0.085-0.025C10.78,30.749,10.817,30.76,10.842,30.767z M10.696,30.854 C10.705,30.742,10.825,30.837,10.696,30.854L10.696,30.854z M10.578,23.662C10.839,23.602,10.606,24.051,10.578,23.662 L10.578,23.662z M8.36,19.022C8.362,19.004,8.689,19.017,8.36,19.022L8.36,19.022z M8.277,18.896 C8.252,18.807,8.457,18.935,8.277,18.896L8.277,18.896z M11.98,10.99C12.145,11.006,11.977,11.182,11.98,10.99L11.98,10.99z M11.773,10.671C11.814,10.681,11.803,10.752,11.773,10.671L11.773,10.671z M11.469,10.997C11.407,11,11.494,10.72,11.469,10.997 L11.469,10.997z M11.319,11.143C11.406,11.203,11.123,11.438,11.319,11.143L11.319,11.143z M10.898,11.569 C11.028,11.536,10.86,11.675,10.898,11.569L10.898,11.569z M10.885,10.553C10.869,10.674,10.794,10.581,10.885,10.553L10.885,10.553 z M10.713,11.643C10.704,11.646,10.741,11.572,10.713,11.643C10.793,11.433,10.855,11.59,10.713,11.643z M10.768,10.518 C10.591,10.529,10.784,10.391,10.768,10.518L10.768,10.518z M10.571,12.997C10.625,12.734,10.602,12.996,10.571,12.997 L10.571,12.997z M10.501,12.777C10.468,12.865,10.483,12.776,10.501,12.777L10.501,12.777z M8.843,6.717 C8.973,6.669,8.827,6.809,8.843,6.717L8.843,6.717z M10.241,12.96c-0.053,0.216-0.795,0.652-1.08,0.666c0,0,0.049-0.094-0.058-0.049 c0.023-0.08,0.121-0.138,0.13-0.218c0.071-0.003-0.03,0.079-0.037,0.139c0.239-0.012,0.659-0.384,0.772-0.425 C9.9,13.051,10.26,12.959,10.241,12.96z M9.747,12.985C9.821,12.982,9.627,13.166,9.747,12.985L9.747,12.985z M9.778,11.277 C9.772,11.317,9.524,11.215,9.778,11.277L9.778,11.277z M9.624,12.612C9.875,12.598,9.613,12.704,9.624,12.612L9.624,12.612z M8.606,12.011C8.599,11.826,8.831,11.997,8.606,12.011L8.606,12.011z M8.671,12.144c0.233,0.053,1.04,0.757,0.986,0.888 c-0.276,0.001-0.137-0.064-0.366,0.282c-0.138-0.154,0.034-0.245-0.176-0.117c0.017,0.023-0.027-0.363-0.053-0.417 c-0.322,0.056-0.255,0.602-0.443,0.811c-0.262-0.001,0.053-0.543,0.068-0.643c-0.028,0.079-0.07,0.117-0.129,0.112 c0.051-0.291,0.372-0.335,0.533-0.345c-0.011,0.03,0.006,0.04,0.048,0.028c0-0.153-0.481-0.2-0.593-0.153 c0.005-0.011,0.002-0.014-0.01-0.01c0.012-0.018,0.024-0.037,0.037-0.052c-0.145,0.044-0.418,0.087-0.446,0.099 c0.006-0.021-0.008-0.024-0.041-0.007C8.286,12.384,8.654,12.268,8.671,12.144z M7.956,15.896C8.1,15.891,7.872,16.037,7.956,15.896 L7.956,15.896z M7.76,15.81C7.816,15.807,7.772,15.929,7.76,15.81L7.76,15.81z M7.458,11.162c-0.002-0.052,0.21,0.537,0.191,0.676 c-0.044-0.005-0.064,0.011-0.059,0.046C7.613,11.881,7.117,11.173,7.458,11.162z M7.269,11.784 C7.281,11.521,7.519,11.854,7.269,11.784L7.269,11.784z M7.217,11.325c-0.014,0.045-0.013,0.238-0.013,0.299 c0-0.05-0.025-0.024-0.02-0.007c-0.072-0.021-0.07-0.177-0.101-0.228C7.167,11.351,7.167,11.309,7.217,11.325z M7.127,10.513 c-0.254,0.096-0.093,0.167-0.028-0.161C7.195,10.232,7.13,10.495,7.127,10.513z M7.035,10.226 C7.116,10.282,6.892,10.41,7.035,10.226L7.035,10.226z M6.87,10.751C6.891,10.649,6.959,10.742,6.87,10.751L6.87,10.751z M5.078,13.742C5.352,13.723,4.966,14.072,5.078,13.742L5.078,13.742z M6.52,10.042c-0.001,0.003,0.003,0.002,0.003,0.006 c0.022-0.003,0.042-0.007,0.076-0.003c-0.056,0.029-0.079,0.027-0.076,0.003c-0.012,0.002-0.028,0.001-0.04,0.002 c-0.151,0.045-0.56,0.41-0.531,0.28c0.291-0.089,0.303-0.26,0.531-0.28C6.496,10.046,6.511,10.041,6.52,10.042z M5.716,9.574 C5.845,9.305,5.464,9.458,5.8,9.355C5.798,9.753,6.251,9.186,6.467,9.241C6.436,9.388,5.196,10.148,5.304,9.71 C5.455,9.725,5.55,9.571,5.716,9.574z M5.107,9.347c0.011-0.019,0.203,0,0.264-0.011C5.292,9.482,4.849,9.384,5.107,9.347z M3.791,12.304c0.005-0.029,0.03-0.041,0.04,0.035c0.039,0.03,0.072,0.083,0.099,0.152c-0.07-0.074-0.227-0.093-0.209-0.179 c-0.063-0.008-0.154-0.062-0.245-0.094C3.617,12.251,3.722,12.271,3.791,12.304z"/> <path fill="#3C89C9" d="M28.827,12.569C28.832,12.605,28.898,12.596,28.827,12.569L28.827,12.569z"/> <path fill="#3C89C9" d="M9.284,12.757C9.364,12.754,9.275,12.808,9.284,12.757C9.255,12.915,9.726,12.745,9.284,12.757z"/> <path fill="#3C89C9" d="M35.885,20.362C35.889,20.49,35.976,20.363,35.885,20.362L35.885,20.362z"/> <path fill="#3C89C9" d="M35.856,21.629C36.056,21.629,35.856,21.414,35.856,21.629L35.856,21.629z"/> <path fill="#3C89C9" d="M39.982,23.137c-0.071,0.022-0.031-0.031-0.031-0.06c-0.265,0.137-0.521-0.145-0.698-0.082 c0.089,0.021,0.139,0.07,0.148,0.149c-0.033,0.006-0.048,0.02-0.046,0.039c-0.04,0.022-0.274-0.02-0.293-0.024 c-0.008,0.2-0.105,0.207-0.119,0.445c-0.178-0.015-0.136,0.023-0.265,0.055c0.047-0.521-0.615,0.099-0.627,0.319 c-0.063,0.002-0.038-0.137-0.091-0.152c-0.031,0.61-1.219,0.717-1.298,0.963c-0.011,0.005-0.013,0.002-0.01-0.01 c-0.169,0.003-0.029,0.629-0.04,0.722c-0.085-0.019-0.038-0.071-0.081-0.07c-0.002,0.02,0.005,0.035,0.012,0.051 c0.167,0.231,0.328,1.302,0.06,1.312c0.09,0.799,2.969-1.344,2.808,0.007c0.021-0.006,0.035,0,0.042,0.018 c0-0.003,0.015-0.015,0.024-0.024c0.318-1.008,0.558-2.052,0.714-3.126C40.078,23.52,39.964,23.542,39.982,23.137z M39.496,26.29 C39.423,26.293,39.5,26.253,39.496,26.29L39.496,26.29z M39.55,26.376C39.584,26.1,39.631,26.38,39.55,26.376L39.55,26.376z M39.962,23.378C39.929,23.575,39.834,23.361,39.962,23.378L39.962,23.378z"/> <path fill="#3C89C9" d="M35.56,21.431C35.554,21.46,35.883,21.431,35.56,21.431L35.56,21.431z"/> <path fill="#3C89C9" d="M36.855,22.503c-0.028-0.15-0.559-0.54-0.586-0.389c-0.425,0.002-0.371-0.172-0.768,0.045 C35.551,22.26,36.613,22.506,36.855,22.503z"/> <path fill="#3C89C9" d="M8.574,12.528c0.055-0.018,0.095-0.034,0.092-0.05C8.62,12.48,8.595,12.502,8.574,12.528z"/> <path fill="#3C89C9" d="M37.74,19.033c-0.005-0.049-0.009-0.044-0.009-0.031c0-0.127-0.059-0.189-0.188-0.168 C37.544,18.875,37.751,19.03,37.74,19.033z"/> <path fill="#3C89C9" d="M38.129,19.367C38.086,19.187,37.9,19.416,38.129,19.367L38.129,19.367z"/> <path fill="#3C89C9" d="M39.064,23.09C39.054,22.968,38.961,23.092,39.064,23.09L39.064,23.09z"/> <path fill="#3C89C9" d="M38.109,18.776C38.112,18.876,38.175,18.778,38.109,18.776L38.109,18.776z"/> <path fill="#3C89C9" d="M37.548,19.079C37.399,19.04,37.548,19.097,37.548,19.079L37.548,19.079z"/> <path fill="#3C89C9" d="M37.753,21.607c0,0.147,0.076,0.165,0.074,0.305c0.026-0.01,0.038-0.007,0.033,0.012 c0.105-0.005,0.028-0.103,0.177-0.103c0-0.139-0.284-0.265-0.284-0.378c0.063-0.034,0.151-0.055,0.225-0.099 c-0.036,0.019,0.114,0.09,0.114,0.008c-0.065-0.013-0.099-0.013-0.114-0.008c0.04-0.024,0.075-0.055,0.091-0.104 c-0.203,0.013-0.331,0.056-0.382-0.029c-0.321,0.353-0.579,0.789-0.134,0.787C37.555,22.012,37.725,21.607,37.753,21.607z"/> <path fill="#3C89C9" d="M37.174,22.521c0,0.014-0.042,0.064-0.048,0.104c0.279-0.046,0.269,0.063,0.2-0.136 C37.268,22.479,37.337,22.519,37.174,22.521z"/> <path fill="#3C89C9" d="M37.783,19.002C37.802,19.071,37.877,19.026,37.783,19.002L37.783,19.002z"/> <path fill="#3C89C9" d="M38.013,22.015C38.189,22.008,37.956,21.672,38.013,22.015L38.013,22.015z"/> <path fill="#3C89C9" d="M37.691,22.834C37.72,22.614,37.21,22.841,37.691,22.834L37.691,22.834z"/> <path fill="#3C89C9" d="M37.811,19.156C37.796,19.525,38.032,19.178,37.811,19.156L37.811,19.156z"/> <path fill="#3C89C9" d="M38.281,22.513C38.121,22.525,38.278,22.546,38.281,22.513L38.281,22.513z"/> <path fill="#3C89C9" d="M38.192,21.382C38.164,21.46,38.492,21.408,38.192,21.382L38.192,21.382z"/> <path fill="#3C89C9" d="M38.263,20.813c0.028-0.115-0.134-0.021-0.332,0.155C38.129,20.909,38.309,20.813,38.263,20.813z"/> <path fill="#3C89C9" d="M37.846,19.402C37.853,19.55,38.298,19.357,37.846,19.402L37.846,19.402z"/> <path fill="#3C89C9" d="M38.8,16.037C38.881,16.015,38.809,15.971,38.8,16.037L38.8,16.037z"/> <path fill="#3C89C9" d="M39.188,21.133C38.855,21.072,39.188,21.2,39.188,21.133L39.188,21.133z"/> <path fill="#3C89C9" d="M39.047,21.403C39.047,21.314,38.957,21.386,39.047,21.403L39.047,21.403z"/> <path fill="#3C89C9" d="M39.177,15.369c-0.082,0.005-0.243,0.067-0.252,0.165c0.054,0.002,0.047,0.039,0.052,0.073 c0.039,0,0.064,0.023,0.085,0.074C39.125,15.471,39.261,15.602,39.177,15.369z"/> <path fill="#3C89C9" d="M38.705,21.13c-0.017-0.059,0.205-0.366-0.017-0.437c-0.031,0.117-0.132,0.398,0.051,0.476 C38.739,21.207,38.758,21.13,38.705,21.13z"/> <path fill="#3C89C9" d="M38.609,21.585C38.243,21.625,38.609,21.756,38.609,21.585L38.609,21.585z"/> <path fill="#3C89C9" d="M38.683,21.201C38.565,21.169,38.685,21.237,38.683,21.201L38.683,21.201z"/> <path fill="#3C89C9" d="M38.763,20.634C38.767,20.847,38.917,20.676,38.763,20.634L38.763,20.634z"/> <path fill="#3C89C9" d="M39.062,15.173C38.986,15.167,39.05,15.224,39.062,15.173L39.062,15.173z"/> <path fill="#3C89C9" d="M39.31,15.347c-0.016,0.113-0.055,0.073,0.029,0.19c0.12,0.003,0.207-0.044,0.284-0.102 c-0.042-0.15-0.085-0.302-0.131-0.451c-0.005,0.001-0.009,0.004-0.016,0.007c-0.009-0.016-0.021-0.024-0.036-0.022 c-0.01-0.055,0.007-0.053,0.021-0.074c-0.005-0.016-0.012-0.031-0.015-0.046c-0.167,0.058-0.247,0.267-0.406,0.4 c0.007,0.006,0.014,0.017,0.018,0.042c-0.026-0.001-0.036-0.013-0.038-0.025c-0.082,0.061-0.174,0.101-0.315,0.093 C38.741,15.425,39.221,15.342,39.31,15.347z"/> <path fill="#3C89C9" d="M38.634,15.676c0.084-0.016,0.047-0.107,0.071-0.106c0.051,0.133-0.087,0.176-0.034,0.289 c0.057,0.014,0.069-0.018,0.073-0.039c0,0.014,0,0.04,0.008,0.093c0.271,0.014,0.007-0.52,0.007-0.5 c-0.125-0.01-0.125,0.083-0.214,0.078C38.655,15.646,38.59,15.558,38.634,15.676z"/> <path fill="#3C89C9" d="M39.09,21.243C39.09,21.265,39.2,21.243,39.09,21.243L39.09,21.243z"/> <path fill="#3C89C9" d="M39.13,23.07C39.164,22.982,39.041,23.07,39.13,23.07L39.13,23.07z"/> <path fill="#3C89C9" d="M39.09,21.293C39.092,21.384,39.209,21.268,39.09,21.293L39.09,21.293z"/> <path fill="#3C89C9" d="M23.898,14.594c-0.014,0.019-0.03,0.025-0.052,0.022c0.001,0.109,0.357,0.161,0.353,0.014 C24.154,14.638,23.901,14.664,23.898,14.594z"/> <path fill="#3C89C9" d="M8.016,7.312C7.954,7.318,7.973,7.486,8.016,7.312L8.016,7.312z"/> <path fill="#3C89C9" d="M7.97,7.73C7.818,7.749,7.92,7.849,7.97,7.73L7.97,7.73z"/> <path fill="#3C89C9" d="M7.927,6.159C7.898,6.168,7.902,6.369,7.927,6.159L7.927,6.159z"/> <path fill="#3C89C9" d="M7.949,7.936C7.945,8.064,7.997,7.932,7.949,7.936L7.949,7.936z"/> <path fill="#3C89C9" d="M7.927,6.159C7.86,6.184,7.923,6.19,7.927,6.159L7.927,6.159z"/> <path fill="#3C89C9" d="M8.526,6.359c-0.059,0.11-0.149,0.108-0.18,0.164c-0.102-0.01-0.154-0.095-0.26,0.115 c0.026,0.023,0.096,0.047,0.136,0.042c-0.03,0.076-0.035,0.048-0.037,0.104C8.052,6.783,7.996,6.789,7.889,6.763 c0,0.011-0.004,0.014-0.013,0.012c-0.075,0.28,0.416,0.3,0.566,0.282c0.291-0.434,0.043-0.21,0.191-0.579 C8.338,6.461,8.57,6.354,8.526,6.359z"/> <path fill="#3C89C9" d="M7.891,7.67c0,0.027-0.003,0.023,0.022,0.027C7.911,7.67,7.916,7.673,7.891,7.67z"/> <path fill="#3C89C9" d="M8.071,7.781c0.14-0.053,0.182,0.057,0.459-0.021c0.028-0.125-0.207-0.25-0.203-0.263 C8.266,7.508,8.072,7.703,8.071,7.781z"/> <path fill="#3C89C9" d="M19.85,10.422C19.852,10.293,19.816,10.422,19.85,10.422L19.85,10.422z"/> <path fill="#3C89C9" d="M20.45,9.181C20.384,9.454,20.495,9.18,20.45,9.181L20.45,9.181z"/> <path fill="#3C89C9" d="M19.801,10.235C19.786,10.372,19.813,10.245,19.801,10.235L19.801,10.235z"/> <path fill="#3C89C9" d="M8.92,5.966C8.963,5.868,8.71,5.993,8.92,5.966L8.92,5.966z"/> <path fill="#3C89C9" d="M8.282,6.02C8.187,6.096,8.132,6.003,8.09,6.155c0.021-0.009,0.025-0.003,0.014,0.018 C8.229,6.129,8.31,6.082,8.438,6.039C8.421,6.103,8.332,6.116,8.297,6.228c0.678-0.03,0.424-0.477,0.25-0.455 C8.541,5.5,8.471,5.852,8.434,5.988c-0.049-0.023-0.042-0.236-0.15-0.197C8.28,5.794,8.275,5.797,8.271,5.801 C8.237,5.888,8.27,5.935,8.282,6.02z"/> <path fill="#3C89C9" d="M10.293,4.948C10.386,4.915,10.326,4.873,10.293,4.948L10.293,4.948z"/> <path fill="#3C89C9" d="M9.835,9.082c-0.06,0.021-0.159,0.057-0.218,0.102C9.578,9.272,9.796,9.155,9.835,9.082z"/> <path fill="#3C89C9" d="M10.025,8.879c-0.011-0.049,0-0.07,0.032-0.065c-0.003,0.007-0.411-0.31-0.394-0.31 c0.079-0.162-0.273,0.417-0.275,0.43C9.646,8.912,9.524,8.788,9.819,8.72C9.803,8.83,9.848,8.99,10.025,8.879z"/> <path fill="#3C89C9" d="M10.095,10.415C10.044,10.785,10.128,10.421,10.095,10.415L10.095,10.415z"/> <path fill="#3C89C9" d="M20.647,11.012c-0.045-0.185-0.143-0.226-0.009-0.209c0-0.548-0.504-0.283-0.303-0.921 c-0.101-0.058-0.153-0.012-0.294,0.023c-0.004-0.118,0.175-0.17,0.114-0.296c-0.35-0.125-0.312,0.542-0.313,0.715 c0.083-0.001,0.012-0.087,0.103-0.055c-0.011,0.089-0.054,0.182-0.055,0.263c0.011-0.004,0.013,0,0.011,0.011 c0.044-0.017,0.18-0.051,0.277-0.013c0,0.122,0.019,0.112,0.018,0.307c-0.085,0-0.109,0.026-0.175-0.043 c-0.013,0.023-0.03,0.035-0.051,0.033c0.05,0.229-0.056,0.14-0.097,0.396c0.08,0,0.02-0.002,0.019,0.032 c0.147-0.005,0.204-0.035,0.343-0.057c-0.024,0.167-0.457,0.095-0.46,0.375c0.056-0.017,0.08-0.007,0.073,0.032 c0.316-0.088,0.565-0.182,0.904-0.255c0.007-0.084-0.077-0.019-0.104-0.11c0.104,0,0.188-0.084,0.186-0.229 C20.714,10.905,20.718,10.988,20.647,11.012z M20.367,11.429C20.434,11.428,20.367,11.465,20.367,11.429L20.367,11.429z"/> <path fill="#3C89C9" d="M10.3,9.12C10.176,9.161,10.228,9.374,10.3,9.12L10.3,9.12z"/> <path fill="#3C89C9" d="M10.045,10.554c-0.03,0.01-0.024,0.004-0.036,0.035C10.038,10.579,10.033,10.584,10.045,10.554z"/> <path fill="#3C89C9" d="M9.647,8.391C9.651,8.49,9.781,8.403,9.647,8.391L9.647,8.391z"/> <path fill="#3C89C9" d="M9.835,9.082c0.05-0.018,0.074-0.024,0.009-0.01C9.844,9.075,9.837,9.079,9.835,9.082z"/> <path fill="#3C89C9" d="M7.956,6.084C7.917,6.23,8.218,5.968,8.177,5.973c0.036-0.077,0.017-0.081-0.003-0.088 c-0.05,0.042-0.097,0.085-0.147,0.128C8.072,6.02,8.032,6.073,7.956,6.084z"/> <path fill="#3C89C9" d="M8.668,6.24C8.59,6.269,8.647,6.319,8.668,6.24L8.668,6.24z"/> <path fill="#3C89C9" d="M7.376,7.913C7.206,7.954,7.351,8.017,7.376,7.913L7.376,7.913z"/> <path fill="#3C89C9" d="M7.485,6.965c0.025-0.099-0.038-0.284-0.136-0.271C7.31,6.833,7.291,7.06,7.485,6.965z"/> <path fill="#3C89C9" d="M8.679,6.594C8.701,6.507,8.582,6.606,8.679,6.594L8.679,6.594z"/> <path fill="#3C89C9" d="M7.709,7.832C7.692,7.898,7.859,7.797,7.709,7.832L7.709,7.832z"/> <path fill="#3C89C9" d="M6.477,7.5c0.107-0.014,0.187-0.014,0.182,0.011c-0.05,0.007-0.051,0.007-0.054,0.057 C6.528,7.605,6.43,7.634,6.328,7.657C6.254,7.737,6.185,7.82,6.113,7.901C6.208,7.975,6.27,8.079,6.5,8.018 c0.3,0.025,0.48-0.33,0.812-0.371C7.264,7.83,7.756,7.91,7.807,7.699c-0.035,0.014-0.041,0-0.019-0.039 C7.75,7.665,7.521,7.762,7.615,7.6C7.657,7.598,7.79,7.73,7.82,7.606C7.713,7.619,7.803,7.598,7.765,7.603 C7.796,7.475,7.904,7.647,7.96,7.61c0.042-0.36-0.528-0.612-0.862-0.415c0.02-0.04,0.018-0.056-0.005-0.05 c0.01-0.104,0.014-0.201-0.01-0.268C6.876,7.08,6.675,7.289,6.477,7.5z"/> <path fill="#3C89C9" d="M27.432,3.613C27.423,3.677,27.51,3.62,27.432,3.613L27.432,3.613z"/> <path fill="#3C89C9" d="M27.341,3.882C27.09,3.862,27.373,3.986,27.341,3.882L27.341,3.882z"/> <path fill="#3C89C9" d="M27.415,3.729C27.451,3.815,27.459,3.733,27.415,3.729L27.415,3.729z"/> <path fill="#3C89C9" d="M27.394,3.888c-0.006-0.012-0.004-0.015,0.008-0.011c-0.008-0.05-0.201-0.132-0.234-0.126 C27.194,3.829,27.319,3.88,27.394,3.888z"/> <path fill="#3C89C9" d="M27.134,4.134C27.148,4.22,27.217,4.14,27.134,4.134L27.134,4.134z"/> <path fill="#3C89C9" d="M27.416,3.462C27.619,3.48,27.417,3.417,27.416,3.462L27.416,3.462z"/> <path fill="#3C89C9" d="M27.379,4.131C27.215,4.373,27.568,4.146,27.379,4.131L27.379,4.131z"/> <path fill="#3C89C9" d="M27.294,3.591C26.977,3.559,27.317,3.728,27.294,3.591L27.294,3.591z"/> <path fill="#3C89C9" d="M27.311,3.646C27.292,3.72,27.388,3.652,27.311,3.646L27.311,3.646z"/> <path fill="#3C89C9" d="M27.399,3.578C27.373,3.415,27.233,3.598,27.399,3.578L27.399,3.578z"/> <path fill="#3C89C9" d="M27.252,3.727C27.319,3.906,27.595,3.754,27.252,3.727L27.252,3.727z"/> <path fill="#3C89C9" d="M27.125,3.888C27.219,3.864,27.073,3.759,27.125,3.888L27.125,3.888z"/> <path fill="#3C89C9" d="M10.035,10.481c-0.029,0.01-0.024,0.004-0.035,0.034C10.029,10.505,10.023,10.512,10.035,10.481z"/> <path fill="#3C89C9" d="M27.479,3.799C27.371,3.825,27.5,3.931,27.479,3.799L27.479,3.799z"/> <path fill="#3C89C9" d="M27.613,4.129C27.239,4.034,27.647,4.348,27.613,4.129L27.613,4.129z"/> <path fill="#3C89C9" d="M29.404,6.18C29.201,6.103,29.432,6.509,29.404,6.18L29.404,6.18z"/> <path fill="#3C89C9" d="M30.468,6.476C30.483,6.235,30.271,6.456,30.468,6.476L30.468,6.476z"/> <path fill="#3C89C9" d="M30.295,6.501C30.202,6.782,30.461,6.552,30.295,6.501L30.295,6.501z"/> <path fill="#3C89C9" d="M31.667,4.669c0.066,0.008,0.139,0.022,0.216,0.039c-0.052-0.037-0.103-0.074-0.158-0.109 C31.69,4.629,31.665,4.656,31.667,4.669z"/> <path fill="#3C89C9" d="M29.765,6.369C29.78,6.456,29.846,6.384,29.765,6.369L29.765,6.369z"/> <path fill="#3C89C9" d="M31.859,4.909c0.009,0.01,0.006,0.012-0.004,0.008c0.031,0.116,0.291,0.133,0.491,0.123 c-0.104-0.077-0.21-0.152-0.318-0.226C31.955,4.854,31.863,4.909,31.859,4.909z"/> <path fill="#3C89C9" d="M31.828,4.884c-0.031-0.104-0.22-0.174-0.275-0.179c0.051,0.202,0.008,0.164,0.236,0.193 C31.781,4.875,31.792,4.869,31.828,4.884z"/> <path fill="#3C89C9" d="M32.425,5.743C32.134,5.705,32.459,5.887,32.425,5.743L32.425,5.743z"/> <path fill="#3C89C9" d="M27.764,6.877C27.69,6.846,27.773,6.931,27.764,6.877L27.764,6.877z"/> <path fill="#3C89C9" d="M27.697,4.263C27.503,4.264,27.788,4.505,27.697,4.263L27.697,4.263z"/> <path fill="#3C89C9" d="M27.073,3.711C27.09,3.833,27.259,3.724,27.073,3.711L27.073,3.711z"/> <path fill="#3C89C9" d="M27.89,4.014c-0.033-0.155-0.217,0.037-0.199,0.153C27.884,4.184,27.976,3.995,27.89,4.014z"/> <path fill="#3C89C9" d="M27.046,6.629c0.093,0.005,0.251,0.055,0.321,0.04c0.012,0.093-0.093,0.104-0.082,0.199 c0.009-0.003,0.012,0.001,0.011,0.013c0.292,0.022,0.354-0.044,0.551-0.031c-0.003-0.012,0-0.015,0.008-0.01 c-0.003-0.026-0.029-0.007-0.031-0.033c-0.405-0.026-0.22-0.818-0.472-0.696c-0.003-0.029-0.02-0.01-0.024-0.055 c-0.056-0.032,1.572-0.583,1.466-0.827c-0.458-0.095-1.621,0.383-1.681,0.695c0.069,0.037,0.103,0.014,0.173,0.032 c0.002,0.027-0.193,0.094-0.026,0.105c0.026,0.183-0.266,0.307-0.225,0.556C27.045,6.614,27.05,6.618,27.046,6.629z M27.261,5.782 C27.328,5.81,27.268,5.817,27.261,5.782L27.261,5.782z"/> <path fill="#3C89C9" d="M27.968,6.953c0.024,0.063,0.156,0.182,0.16,0.204c0.268,0.019-0.055-0.206-0.152-0.212 C27.98,6.954,27.976,6.958,27.968,6.953z"/> <path fill="#3C89C9" d="M28.137,4.1c0.019,0.001,0.046,0.01,0.051,0.037c0.034,0.015,0.177-0.166,0.174-0.175 c-0.124-0.047-0.146,0.029-0.265,0.018c0.021,0.045,0.055,0.047-0.012,0.041C28.097,4.076,28.128,4.054,28.137,4.1z"/> <path fill="#3C89C9" d="M11.907,18.457C11.933,18.614,12.008,18.456,11.907,18.457L11.907,18.457z"/> <path fill="#3C89C9" d="M10.877,34.785c-0.051,0.077-0.162,0.074-0.074,0.245C10.993,35.021,11.246,34.813,10.877,34.785z"/> <path fill="#3C89C9" d="M11.921,33.813C11.731,33.737,11.91,33.951,11.921,33.813L11.921,33.813z"/> <path fill="#3C89C9" d="M11.769,34.281C11.679,34.274,11.792,34.442,11.769,34.281L11.769,34.281z"/> <path fill="#3C89C9" d="M10.615,30.859c-0.019,0.12,0.04,0.214,0.169,0.223c-0.004-0.012-0.001-0.016,0.009-0.012 C10.762,30.995,10.749,30.899,10.615,30.859z"/> <path fill="#3C89C9" d="M10.895,31.224C10.897,31.254,10.964,31.251,10.895,31.224L10.895,31.224z"/> <path fill="#3C89C9" d="M11.284,31.385C11.34,31.54,11.388,31.404,11.284,31.385L11.284,31.385z"/> <path fill="#3C89C9" d="M11.413,31.431C11.438,31.489,11.523,31.46,11.413,31.431L11.413,31.431z"/> <path fill="#3C89C9" d="M11.659,35.646c0.457,0.038-0.057-0.872-0.143-1.087c-0.095-0.007-0.167,0.733-0.173,0.695 C10.168,35.063,11.678,35.746,11.659,35.646z"/> <path fill="#3C89C9" d="M12.597,33.14C12.354,33.093,12.603,33.184,12.597,33.14L12.597,33.14z"/> <path fill="#3C89C9" d="M12.268,30.555C12.32,30.916,12.427,30.595,12.268,30.555L12.268,30.555z"/> <path fill="#3C89C9" d="M12.572,30.575c-0.099-0.014-0.193,0.14-0.137,0.218C12.734,30.809,12.572,30.577,12.572,30.575z"/> <path fill="#3C89C9" d="M12.326,33.551C12.502,33.56,12.292,33.284,12.326,33.551L12.326,33.551z"/> <path fill="#3C89C9" d="M11.948,31.224C11.723,31.214,11.929,31.31,11.948,31.224L11.948,31.224z"/> <path fill="#3C89C9" d="M12.258,33.493C12,33.413,12.344,33.845,12.258,33.493L12.258,33.493z"/> <path fill="#3C89C9" d="M12.852,32.981C12.526,32.957,12.872,33.159,12.852,32.981L12.852,32.981z"/> <path fill="#3C89C9" d="M10.299,29.371c0.01-0.006,0.014,0,0.012,0.01c0.116,0.058,0.094-0.162,0.087-0.196 C10.313,29.2,10.293,29.314,10.299,29.371z"/> <path fill="#3C89C9" d="M10.359,29.118C10.352,29.036,10.301,29.1,10.359,29.118L10.359,29.118z"/> <path fill="#3C89C9" d="M10.328,29.01C10.299,29.126,10.383,29.014,10.328,29.01L10.328,29.01z"/> <path fill="#3C89C9" d="M10.421,28.64c-0.022-0.253-0.21,0.198-0.032,0.234C10.386,28.833,10.456,28.642,10.421,28.64z"/> <path fill="#3C89C9" d="M12.603,34.9C12.619,34.578,12.489,34.895,12.603,34.9L12.603,34.9z"/> <path fill="#3C89C9" d="M3.359,11.939c-0.003,0.006-0.007,0.012-0.01,0.019C3.354,11.97,3.367,11.948,3.359,11.939z"/> <path fill="#3C89C9" d="M7.338,21.032C7.336,21.431,7.514,21.031,7.338,21.032L7.338,21.032z"/> <path fill="#3C89C9" d="M10.396,30.308C10.433,30.463,10.555,30.353,10.396,30.308L10.396,30.308z"/> <path fill="#3C89C9" d="M10.349,30.539c0.076,0.003,0.134-0.12,0.08-0.126C10.346,30.191,10.347,30.521,10.349,30.539z"/> <path fill="#3C89C9" d="M10.309,30.366C10.28,30.295,10.241,30.389,10.309,30.366L10.309,30.366z"/> <path fill="#3C89C9" d="M10.271,30.301C10.452,30.358,10.27,30.125,10.271,30.301L10.271,30.301z"/> <path fill="#3C89C9" d="M10.293,30.22c0.076-0.038,0.022,0.011,0.085,0.013c0.046-0.156-0.02-0.241-0.046-0.427 C10.121,29.798,10.276,30.065,10.293,30.22z"/> <path fill="#3C89C9" d="M10.594,30.856c-0.123-0.037-0.048-0.362-0.269-0.267C10.335,30.626,10.561,31.011,10.594,30.856z"/> <path fill="#3C89C9" d="M11.634,34.103c-0.016-0.229-0.128,0.073-0.069,0.205C11.642,34.313,11.67,34.114,11.634,34.103z"/> <path fill="#3C89C9" d="M10.111,17.823c0.091,0.026,0.353,0.058,0.389,0.057c0.009-0.204,0.362-0.064,0.364-0.115 c0.21-0.004-0.068-0.129-0.135-0.136c-0.028-0.116-0.353-0.088-0.463-0.086c0.031,0.051,0.111,0.161,0.108,0.221 c-0.064,0.04-0.204-0.039-0.27-0.037c0.002,0.02-0.013,0.028-0.044,0.022C10.06,17.829,10.113,17.784,10.111,17.823z"/> <path fill="#3C89C9" d="M11.845,18.307C11.867,18.437,11.888,18.307,11.845,18.307L11.845,18.307z"/> <path fill="#3C89C9" d="M12.083,18.713C12.081,18.802,12.116,18.734,12.083,18.713L12.083,18.713z"/> <path fill="#3C89C9" d="M11.882,18.167C11.744,18.169,11.88,18.237,11.882,18.167L11.882,18.167z"/> <path fill="#3C89C9" d="M11.851,19.243C11.976,19.258,11.858,18.982,11.851,19.243L11.851,19.243z"/> <path fill="#3C89C9" d="M27.032,4.04C26.944,4.022,27.023,4.104,27.032,4.04L27.032,4.04z"/> <path fill="#3C89C9" d="M11.506,19.107C11.504,19.142,11.575,19.106,11.506,19.107L11.506,19.107z"/> <path fill="#3C89C9" d="M11.945,19.467C11.943,19.517,12.046,19.476,11.945,19.467L11.945,19.467z"/> <path fill="#3C89C9" d="M11.917,12.382c-0.203,0.068,0.204,0.203,0.223,0.172c-0.051-0.04-0.055-0.057-0.016-0.052 C12.134,12.403,11.88,12.608,11.917,12.382z"/> <path fill="#3C89C9" d="M12.244,12.679c0.033-0.002,0.007,0.011,0.052,0.009c0.016-0.18,0.146-0.219,0.187-0.341 C12.489,12.348,12.069,12.529,12.244,12.679z"/> <path fill="#3C89C9" d="M9.806,8.22C9.796,8.27,9.875,8.214,9.806,8.22L9.806,8.22z"/> <path fill="#3C89C9" d="M12.478,12.52C12.31,12.527,12.519,12.718,12.478,12.52L12.478,12.52z"/> <path fill="#3C89C9" d="M11.32,17.768C10.962,17.774,11.314,17.917,11.32,17.768L11.32,17.768z"/> <path fill="#3C89C9" d="M12.268,12.195C12.112,12.245,12.26,12.275,12.268,12.195L12.268,12.195z"/> <path fill="#3C89C9" d="M11.924,11.756c-0.004,0.003-0.026,0.006-0.026-0.004c-0.01,0.092,0.234,0.214,0.33,0.209 C12.24,11.857,12.039,11.766,11.924,11.756z"/> <path fill="#3C89C9" d="M9.635,17.759C9.558,17.736,9.621,18.048,9.635,17.759L9.635,17.759z"/> <path fill="#3C89C9" d="M13.343,26.738c-0.041,0-0.045,0-0.052,0.033C13.332,26.771,13.336,26.774,13.343,26.738z"/> <path fill="#3C89C9" d="M13.219,26.846C13.418,26.85,13.214,26.745,13.219,26.846L13.219,26.846z"/> <path fill="#3C89C9" d="M27.608,23.781c0.041-0.015,0.058,0.017,0.058,0.081c0,0,0.001,0.005,0.007,0.005 c0.007-0.038,0.034-0.456-0.026-0.454c-0.021-0.657-1.45,1.846-0.965,1.843c-0.029,1.099,0.971-0.946,0.984-1.394 C27.635,23.854,27.608,23.788,27.608,23.781z"/> <path fill="#3C89C9" d="M13.184,33.342C13.191,33.251,13.139,33.345,13.184,33.342L13.184,33.342z"/> <path fill="#3C89C9" d="M10.128,14.291C10.065,14.427,10.175,14.289,10.128,14.291L10.128,14.291z"/> <path fill="#3C89C9" d="M13.119,32.834C13.257,32.811,13.118,32.821,13.119,32.834L13.119,32.834z"/> <path fill="#3C89C9" d="M9.555,16.688C9.521,16.889,9.725,16.683,9.555,16.688L9.555,16.688z"/> <path fill="#3C89C9" d="M9.084,16.965c-0.106,0.002-0.384,0.03-0.359,0.201c-0.019-0.007-0.034-0.002-0.044,0.012 c0.004,0.007,0.094,0.008,0.214,0.018c0.011-0.018,0.035-0.032,0.08-0.026c-0.004,0.019-0.009,0.019-0.014,0.032 c0.251,0.026,0.59,0.102,0.665,0.356c0.152-0.02,0.349-0.083,0.471-0.085C9.999,17.264,9.108,17.097,9.084,16.965z"/> <path fill="#3C89C9" d="M10.009,10.452C10.12,10.444,10.024,10.353,10.009,10.452L10.009,10.452z"/> <path fill="#3C89C9" d="M13.014,33.429C12.991,33.378,12.914,33.425,13.014,33.429L13.014,33.429z"/> <path fill="#3C89C9" d="M8.959,17.2c-0.024-0.001-0.043-0.003-0.065-0.004C8.863,17.246,8.921,17.318,8.959,17.2z"/> <path fill="#3C89C9" d="M9.905,14.884C9.879,14.928,9.985,14.88,9.905,14.884L9.905,14.884z"/> <path fill="#3C89C9" d="M11.022,13.424C10.922,13.453,11.018,13.474,11.022,13.424L11.022,13.424z"/> <path fill="#3C89C9" d="M10.695,13.65C10.348,13.768,10.69,13.665,10.695,13.65L10.695,13.65z"/> <path fill="#3C89C9" d="M8.988,6.2C9.007,6.2,9.102,5.752,8.988,6.2L8.988,6.2z"/> <path fill="#3C89C9" d="M9.736,5.243C9.624,5.577,9.846,5.274,9.736,5.243L9.736,5.243z"/> <path fill="#3C89C9" d="M9.42,5.325C9.305,5.365,9.193,5.41,9.076,5.411c-0.004,0.022-0.02,0.038-0.048,0.046 C9.067,5.666,9.414,5.354,9.42,5.325z"/> <path fill="#3C89C9" d="M10.567,7.548C10.542,7.682,10.754,7.538,10.567,7.548L10.567,7.548z"/> <path fill="#3C89C9" d="M10.999,5.579C10.77,5.621,10.946,5.749,10.999,5.579L10.999,5.579z"/> <path fill="#3C89C9" d="M10.822,5.929C10.807,6.011,10.915,5.923,10.822,5.929L10.822,5.929z"/> <path fill="#3C89C9" d="M11.085,6.142c-0.311,0.03-0.283,0.146-0.534,0.293C10.521,6.632,11.039,6.437,11.085,6.142z"/> <path fill="#3C89C9" d="M9.704,7.299C9.663,7.493,9.845,7.403,9.704,7.299L9.704,7.299z"/> <path fill="#3C89C9" d="M10.551,9.026C10.544,8.932,10.465,9.032,10.551,9.026L10.551,9.026z"/> <path fill="#3C89C9" d="M9.799,7.247C9.708,7.225,9.787,7.303,9.799,7.247L9.799,7.247z"/> <path fill="#3C89C9" d="M10.516,8.945C10.609,8.946,10.54,8.891,10.516,8.945L10.516,8.945z"/> <path fill="#3C89C9" d="M11.843,4.625C11.514,4.734,11.82,4.734,11.843,4.625L11.843,4.625z"/> <path fill="#3C89C9" d="M9.601,7.938C9.55,7.96,9.585,8.018,9.601,7.938L9.601,7.938z"/> <path fill="#3C89C9" d="M10.899,5.829c-0.086-0.303-1.293-0.009-1.329,0.005c0.057-0.051,0.056-0.072-0.001-0.06 c0.034-0.069,0.134,0.011,0.158-0.092C9.58,5.627,9.501,5.558,9.321,5.642c0.028-0.193-0.277-0.067-0.369-0.003 C8.95,5.599,9.31,6.167,9.346,6.239C9.86,6.179,10.45,5.875,10.899,5.829z"/> <path fill="#3C89C9" d="M9.706,5.512C9.57,5.549,9.647,5.731,9.706,5.512L9.706,5.512z"/> <path fill="#3C89C9" d="M17.683,7.794C17.985,7.745,17.687,7.777,17.683,7.794L17.683,7.794z"/> <path fill="#3C89C9" d="M17.368,6.1c0.04-0.018,0.062-0.003,0.063,0.04c0.387-0.063,0.187,0.203,0.542,0.191 c0-0.012,0.003-0.022,0.013-0.033c-0.088-0.047-0.019-0.114-0.084-0.138c-0.037,0.007-0.071,0.012-0.071-0.01 c0.039-0.001,0.055,0.004,0.071,0.01c0.025-0.006,0.054-0.013,0.063-0.013c-0.014-0.025-0.009-0.047,0.014-0.066 c-0.065-0.015-0.106-0.017-0.131-0.015c0.013-0.01,0.028-0.026,0.039-0.06C17.827,6.009,17.386,5.86,17.368,6.1z"/> <path fill="#3C89C9" d="M18.098,5.651C17.774,5.589,18.09,5.777,18.098,5.651L18.098,5.651z"/> <path fill="#3C89C9" d="M18.611,15.901C18.609,16.122,18.644,15.901,18.611,15.901L18.611,15.901z"/> <path fill="#3C89C9" d="M11.949,5.126C11.818,5.109,11.934,5.201,11.949,5.126L11.949,5.126z"/> <path fill="#3C89C9" d="M19.26,11.304c0.424-0.123,0.74-0.78,0.375-0.881c-0.001,0.111-0.234,0.211-0.331,0.212 c-0.003,0.148-0.075,0.12-0.077,0.241c0.083,0.004,0.125-0.023,0.165-0.024c0.049,0.18-0.18,0.279-0.183,0.407 C19.351,11.227,19.262,11.226,19.26,11.304z M19.399,11.018C19.368,11.114,19.323,11.019,19.399,11.018L19.399,11.018z"/> <path fill="#3C89C9" d="M18.373,15.979C18.371,16.109,18.48,15.979,18.373,15.979L18.373,15.979z"/> <path fill="#3C89C9" d="M18.213,5.451C18.207,5.449,18.203,5.635,18.213,5.451L18.213,5.451z"/> <path fill="#3C89C9" d="M14.677,3.683C14.679,3.673,14.594,3.674,14.677,3.683L14.677,3.683z"/> <path fill="#3C89C9" d="M18.302,5.001C18.191,5.234,18.509,5.078,18.302,5.001L18.302,5.001z"/> <path fill="#3C89C9" d="M12.021,5.129C12.03,5.151,12.099,5.145,12.021,5.129L12.021,5.129z"/> <path fill="#3C89C9" d="M14.42,3.564c0.102-0.009,0.187,0.03,0.257,0.119C14.685,3.629,14.425,3.41,14.42,3.564z"/> <path fill="#3C89C9" d="M18.402,5.249C18.386,5.567,18.452,5.232,18.402,5.249L18.402,5.249z"/> <path fill="#3C89C9" d="M18.335,3.447C18.345,3.279,18.297,3.449,18.335,3.447L18.335,3.447z"/> <path fill="#3C89C9" d="M18.213,15.948C18.211,16.033,18.388,15.929,18.213,15.948L18.213,15.948z"/> <path fill="#3C89C9" d="M13.137,12.246C13.055,12.219,13.125,12.418,13.137,12.246L13.137,12.246z"/> <path fill="#3C89C9" d="M14.864,9.424C14.822,9.531,14.987,9.45,14.864,9.424L14.864,9.424z"/> <path fill="#3C89C9" d="M16.485,7.265c0.319-0.013,1.149,0.046,1.419-0.505c-0.248-0.004-0.334-0.012-0.589-0.004 c0.003-0.045-0.001-0.07-0.02-0.083c0.089-0.017,0.18-0.064,0.177-0.106c-0.121,0.003-0.235,0.046-0.345,0.033l-0.001,0.002 c-0.001,0.027,0.018,0.04,0.037,0.052c-0.025,0-0.046,0.001-0.081,0.002c0.008-0.024,0.028-0.038,0.044-0.054 c0-0.001-0.002-0.001-0.002-0.002c0.001,0,0.002,0,0.003,0c0.088-0.084,0.28-0.075,0.376-0.078c-0.001-0.02-0.009-0.028-0.016-0.037 c-0.018-0.014-0.036-0.026-0.053-0.038c-0.097,0.002-0.216-0.002-0.309,0c0.004-0.011,0-0.014-0.009-0.011 c0.004-0.044,0.03-0.017,0.037-0.111c0.087-0.001,0.184,0.053,0.282,0.122c0.009,0,0.019,0,0.026,0c0,0.007,0.015,0.017,0.027,0.038 c0.185,0.136,0.369,0.301,0.486,0.221c0.013-0.228-0.126-0.489-0.442-0.479c0.002-0.047,0.075-0.018,0.09-0.068 c-0.086-0.089-0.333,0.121-0.315-0.122c0.083-0.004,0.297-0.228,0.385-0.23C17.61,6.153,18.183,5.758,18.14,5.76 c-0.146-0.164-0.206,0.201-0.188-0.192c0.104,0.027,0.269,0.135,0.374,0.067c0-0.083-0.251-0.089-0.304-0.109 c-0.007,0.043-0.013,0.062-0.01-0.003c0.001,0,0.007,0,0.01,0.003c0.007-0.046,0.016-0.121,0.019-0.177 c-0.013-0.004-0.025-0.009-0.037-0.012c0.035-0.099,0.042-0.06,0.037,0.012c0.069,0.019,0.14,0.05,0.194,0.048 c-0.002-0.011,0.001-0.016,0.011-0.012c0.016-0.303-0.064-0.313-0.22-0.279c0.002-0.035,0.033-0.088,0.03-0.044 c0.124-0.004,0.047-0.128,0.057-0.154c0.1,0.047,0.204,0.065,0.313,0.056c-0.003-0.011,0.001-0.015,0.009-0.012 c-0.031-0.263-0.09-0.104-0.241-0.168c0.004-0.075,0.02-0.038,0.006-0.099c0.032,0,0.09,0.041,0.14-0.016 c-0.12-0.028-0.182-0.071-0.292-0.067c0.002-0.011,0-0.015-0.01-0.011c0.015-0.026,0.023-0.055,0.024-0.088 c0.159,0.015,0.533-0.323,0.542-0.508c-0.378-0.085-0.093,0.058-0.333,0.064c0.003-0.051-0.031-0.079-0.029-0.108 c0.009,0,0.03,0.001,0.057,0.002c0.014-0.056,0.063-0.012,0.014,0.001c0.152,0.009,0.484,0.019,0.494-0.195 c-0.096,0.004-0.177,0.01-0.27,0.016c-0.073,0.022-0.123,0.03-0.122,0.005c0.048-0.001,0.083-0.004,0.122-0.005 c0.206-0.063,0.598-0.243,0.66-0.245c-0.098-0.423-1.189,0.165-1.43,0.175c0.003-0.01,0.001-0.015-0.009-0.01 c0.007-0.095,0.333-0.08,0.31-0.307c-0.371,0.042-0.938,0.283-1.364,0.202c0.16-0.341,1.611-0.193,1.565-0.406 c-0.035-0.011-0.308-0.102-0.453-0.099c-0.013,0.028-0.041,0.042-0.087,0.044c0.002-0.031,0.037-0.043,0.087-0.044 c0.012-0.025,0.011-0.063-0.013-0.123c0.03,0.006-0.555,0.095-0.167-0.015c-0.055,0.015,0.008-0.027,0,0 c0.05-0.181-1.729,0.053-1.472,0.1c-0.046,0.047-0.067,0.061-0.085,0.07c0.005,0.012,0.012,0.027,0.005,0.075 c-0.071,0.005-0.063-0.083-0.132-0.078c0.051,0.113-0.306,0.043-0.388-0.005c-0.01,0.024-0.026,0.131-0.029,0.152 c0.009-0.005,0.013-0.001,0.007,0.011c0.076-0.006,0.311,0.007,0.291,0.163c0.018-0.001-0.514-0.226-0.375-0.06 c0.029-0.002,0.033,0.019,0.029,0.05c-0.16-0.083-0.163-0.056-0.33-0.062c-0.032,0.227,0.375,0.258,0.357,0.394 c-0.146-0.052-0.533-0.382-0.708-0.367c-0.016,0.2-0.018,0.181-0.042,0.346c-0.018,0.004-0.025,0.015-0.023,0.034 c-0.127-0.016-0.29-0.237-0.395,0.01c0.013-0.004,0.015,0.002,0.006,0.022c-0.05,0.003-0.388-0.12-0.772-0.071 c0.002,0.055,0.044,0.101,0.033,0.167C13.597,3.9,13.497,3.714,13.493,3.73c-0.245,0.061-0.086,0.199-0.098,0.266 c-0.02-0.008-0.028-0.004-0.029,0.013c-0.296,0.027-0.442,0.017-0.722,0.28c-0.009,0.093,0.339-0.012,0.416-0.019 c-0.103,0.161-1.114,0.655-1.114,0.647c0.211-0.021,0.424,0.125,0.754,0.095c-0.007,0.024-0.003,0.035,0.013,0.029 c-0.031,0.017-0.048,0.039-0.049,0.068c-0.1-0.023-0.511,0.114-0.453,0.126c0.005-0.003-0.211,0.002-0.24,0.013 c-0.103,0.558,1.641-0.276,1.664,0.542c0.044-0.02,0.097-0.021,0.001,0.014c0.001,0.034,0.017,0.054,0.011,0.095 c0.384-0.152,0.063,0.686,0.062,0.701c0.151-0.01,0.359-0.001,0.55-0.057c-0.005,0.01-0.002,0.015,0.008,0.01 c-0.006,0.053-0.087,0.01-0.095,0.071c0.037-0.003,0.135-0.055,0.14,0.034c-0.135,0.009-0.027,0.138-0.038,0.228 c-0.185-0.015-0.254-0.123-0.472-0.12c-0.003,0.025-0.03,0.026-0.045,0.045c0.037,0.037,0.126,0.069,0.109,0.122 c-0.2-0.026-0.1,0.153-0.229,0.208c-0.002,0.116,0.146,0.034,0.178,0.032c0.006,0.077-0.035,0.098-0.123,0.062 c0.032,0.23,0.495-0.127,0.396-0.268c-0.102-0.008-0.205-0.023-0.201-0.055c0.121-0.009,0.174,0.017,0.201,0.055 c0.085,0.007,0.169,0.008,0.186,0.007c-0.03,0.074-0.358,0.566-0.358,0.569c0.131-0.007,0.206-0.01,0.259-0.011 c-0.049-0.003-0.084-0.015,0.01-0.048c0.005,0.025-0.004,0.034-0.007,0.047c0.141-0.002,0.065,0.005,0,0.001 c-0.026,0.083-0.195,0.004-0.254,0.031c-0.012,0.057,0.021,0.078,0.099,0.07c-0.037,0.034-0.207-0.065-0.229,0.13 c0.21-0.07,0.325-0.151,0.417-0.14c-0.023,0.027-0.057,0.032-0.016,0.055c0.007,0.062-0.464,0.058-0.417,0.153 c0.137-0.008,0.037,0.227-0.021,0.248c0.077,0.174,0.077-0.074,0.056,0.115c0.057-0.013,0.115-0.05,0.163-0.052 c-0.019,0.16-0.051,0.155-0.038,0.336c0.098-0.033,0.106-0.123,0.199-0.107c-0.029,0.113-0.162,0.203-0.19,0.203 c0.093,0.207,0.166,0.39,0.377,0.38c-0.022,0.115-0.051,0.153,0.065,0.148c-0.088,0.114,0.013,0.062,0.001,0.184 c0.101-0.005,0.154-0.092,0.257-0.174c0.065,0.101-0.039,0.092-0.043,0.143c0.132-0.006,0.112-0.005,0.221-0.01 c-0.007,0.071-0.067,0.078-0.072,0.132c0.078-0.024,0.13,0.006,0.137-0.07c0.007,0-0.003,0.125,0.121,0.103 c-0.019-0.039-0.041-0.031,0.034-0.035c-0.019-0.095-0.053-0.074-0.098-0.147c0.285-0.111,0.358-0.797,0.365-0.859 c0.209-0.01,0.104-0.063,0.088-0.21C15.771,8.111,16.443,7.854,16.485,7.265z M17.249,6.757C17.327,6.756,17.128,6.898,17.249,6.757 L17.249,6.757z M17.925,5.374C17.993,5.371,17.914,5.565,17.925,5.374L17.925,5.374z M17.62,3.747 C17.669,3.745,17.594,3.8,17.62,3.747L17.62,3.747z M17.581,3.78c0.001-0.015-0.229,0.14-0.229,0.14 C17.366,3.843,17.526,3.782,17.581,3.78z M17.097,3.093c0.013-0.013,0.016-0.015,0.033-0.033c0.001,0,0.003,0,0.004,0 c0.156-0.132,0.375-0.277,0.352-0.005c-0.117,0.002-0.233,0.003-0.352,0.005c0,0,0,0,0,0c0.099-0.001-0.009,0.021-0.002,0.002 C17.119,3.074,17.109,3.083,17.097,3.093C16.942,3.254,16.987,3.193,17.097,3.093z M16.946,3.125 c-0.006,0.064-0.216,0.064-0.223-0.086C16.73,3.038,16.882,3.11,16.946,3.125z M16.513,3.192C16.517,3.18,16.706,3.196,16.513,3.192 L16.513,3.192z M13.922,7.874C14.012,7.894,13.917,7.928,13.922,7.874L13.922,7.874z M14.3,7.81 C14.253,7.974,14.034,7.877,14.3,7.81L14.3,7.81z M14.705,9.193C14.725,9.191,14.673,9.273,14.705,9.193L14.705,9.193z M15.836,7.932C15.821,7.784,16,7.888,15.836,7.932L15.836,7.932z"/> <path fill="#3C89C9" d="M15.608,31.381C15.42,31.376,15.637,31.498,15.608,31.381L15.608,31.381z"/> <path fill="#3C89C9" d="M13.626,12.099c-0.118,0.039-0.06,0.083-0.023-0.097c-0.051,0.016-0.082,0.105-0.083,0.143 c-0.012-0.019-0.033-0.022-0.061-0.009c0.002-0.011,0-0.013-0.01-0.011c0.007-0.085,0.081-0.1,0.089-0.207 c-0.026,0.03-0.037,0.034-0.031,0.013c-0.03,0-0.088,0.047-0.129,0.048c0.003-0.007,0.013-0.186-0.011-0.236 c-0.151,0.006-0.324,0.152-0.302-0.085c-0.05,0.002-0.066,0.122-0.125,0.124c0.017-0.182,0.12-0.406,0.123-0.435 c-0.383,0.095-0.076,0.563-0.384,0.576c0.002,0.011-0.001,0.014-0.011,0.012c0.005-0.056-0.045,0.21-0.042,0.227 c0.018-0.007,0.024-0.004,0.021,0.01c0.271-0.066,0.482-0.074,0.672-0.081c-0.02,0.062-0.12,0.124-0.131,0.188 c0.105-0.013,0.141-0.188,0.224-0.191c0,0.098,0.001,0.105-0.005,0.195C13.471,12.276,13.594,12.292,13.626,12.099z"/> <path fill="#3C89C9" d="M13.975,6.669C13.993,6.531,13.899,6.673,13.975,6.669L13.975,6.669z"/> <path fill="#3C89C9" d="M14.084,6.629C14.057,6.679,14.182,6.623,14.084,6.629L14.084,6.629z"/> <polygon fill="#3C89C9" points="17.134,3.061 17.13,3.061 17.131,3.063 "/> <path fill="#3C89C9" d="M26.165,22.102C26.165,22.225,26.248,22.156,26.165,22.102L26.165,22.102z"/> <path fill="#3C89C9" d="M27.644,24.063C27.616,24.146,27.673,24.063,27.644,24.063L27.644,24.063z"/> <path fill="#3C89C9" d="M18.703,7.881c0.013-0.201-0.416-0.075-0.416,0.052c-0.111-0.03-0.358-0.142-0.372,0.138 c-0.007-0.008-0.018-0.011-0.029-0.009c-0.005-0.069,0.035-0.278-0.096-0.238c0.002,0.022-0.012,0.022-0.04,0.001 c-0.02,0.058,0.045,0.036,0.053,0.119c-0.064-0.019-0.093-0.03-0.112-0.107c-0.098,0.035-0.009,0.198-0.168,0.202 c0.033,0.081,0.2-0.056,0.268-0.019c0-0.006-0.135,0.101,0.007,0.066c-0.009,0.011-0.013,0.021-0.013,0.034 c0.022-0.014-0.277,0.062-0.22,0.061c0,0.02,0.23,0.088,0.243,0.082c-0.028,0.001,0.018,0.033,0.039,0.032 c-0.065,0.078-0.078,0.036-0.153,0.079C17.809,8.858,19.272,8.083,18.703,7.881z"/> <path fill="#3C89C9" d="M26.99,4.123C26.674,4.026,26.985,4.252,26.99,4.123L26.99,4.123z"/> <polygon fill="#3C89C9" points="14.173,7.53 14.175,7.53 14.175,7.529 "/> <path fill="#3C89C9" d="M13.602,5.817c0.02-0.007,0.021-0.009,0.034-0.013c0-0.005,0-0.01-0.001-0.014 C13.617,5.798,13.604,5.807,13.602,5.817z"/> <path fill="#3C89C9" d="M11.243,7.741C11.312,7.585,11.049,7.757,11.243,7.741L11.243,7.741z"/> <path fill="#3C89C9" d="M10.64,8.966C10.648,9.074,10.712,8.961,10.64,8.966L10.64,8.966z"/> <path fill="#3C89C9" d="M11.067,7.325C10.945,7.343,11.05,7.416,11.067,7.325L11.067,7.325z"/> <path fill="#3C89C9" d="M10.959,7.66C10.804,8.09,11.261,7.577,10.959,7.66L10.959,7.66z"/> <path fill="#3C89C9" d="M10.704,7.378C10.675,7.39,10.708,7.47,10.704,7.378L10.704,7.378z"/> <path fill="#3C89C9" d="M10.755,7.312C10.708,7.409,10.839,7.303,10.755,7.312L10.755,7.312z"/> <path fill="#3C89C9" d="M11.275,7.612C11.299,7.448,11.199,7.619,11.275,7.612L11.275,7.612z"/> <path fill="#3C89C9" d="M10.728,7.251C10.391,7.332,10.674,7.435,10.728,7.251L10.728,7.251z"/> <path fill="#3C89C9" d="M12.166,9.146C12.007,9.156,12.14,9.228,12.166,9.146L12.166,9.146z"/> <path fill="#3C89C9" d="M12.786,7.987c0-0.011,0.002-0.015,0.012-0.012c0.087-0.15-0.063-0.104-0.042-0.253 c-0.018,0.022-0.112,0.146-0.157,0.149c0.026-0.039,0.042-0.079,0.046-0.12c-0.17,0.177-0.258-0.094-0.249-0.152 c-0.011,0.004-0.013,0.001-0.008-0.009c-0.138,0.045-0.067,0.121-0.222,0.133c0.024-0.1-0.067-0.266-0.241-0.257 c0.013-0.074,0.07-0.074,0.088-0.187c0.027,0.005,0.135,0.019,0.141,0.021c0-0.012,0.003-0.015,0.012-0.012 c-0.01-0.127-0.208-0.018-0.191-0.123c0.051-0.003,0.159-0.076,0.166-0.076c0.02-0.131-0.142-0.063-0.21-0.057 c0.014-0.078,0.079-0.068,0.116-0.063c-0.018-0.147-0.286-0.018-0.283-0.018c0.016-0.087,0.066-0.051,0.078-0.123 c-0.009,0.005-0.012,0-0.006-0.01c-0.072,0.044-0.061,0.023-0.164,0.067c0.064-0.156,0.061,0-0.009-0.167 c-0.044,0.012-0.071,0.024-0.089,0.034c0-0.005,0-0.01-0.008-0.017c-0.009,0.015-0.01,0.022-0.01,0.029 c-0.032,0.023-0.03,0.038-0.156,0.049c0.195-0.323-0.101-0.38-0.454-0.376c-0.004,0.032-0.028,0.049-0.076,0.05 c-0.02,0.098,0.154,0.03,0.136,0.123c-0.016,0.001-0.026-0.018-0.029,0.002c-0.16,0.04-0.163-0.031-0.197,0.144 c-0.061-0.012-0.002-0.131,0.007-0.177c0.042-0.026-0.379,0.17-0.293,0.195c0.001-0.024-0.01-0.028-0.034-0.018 c0.022-0.109,0.075-0.305,0.148-0.491c-0.14-0.066-0.235-0.048-0.306,0.007c0,0.01,0.004,0.014,0.003,0.025 c-0.009-0.002-0.013,0.001-0.012,0.011c-0.016,0.001-0.021,0.003-0.035,0.005c-0.101,0.123-0.121,0.335-0.109,0.413 c-0.054-0.047-0.009-0.054-0.133-0.038c-0.031,0.089,0.038,0.129,0.016,0.278C9.936,6.951,9.895,6.979,9.817,6.988 c0.014-0.07,0.118-0.391,0.198-0.568c0.106-0.047,0.062-0.086,0.24-0.107c0.014-0.016,0.029-0.028,0.044-0.042 c-0.02-0.334-1.555,0.843-0.628,0.743c-0.014,0.061-0.053,0.021-0.093,0.04c-0.025,0.226,0.52,0.257,0.803,0.229 c0-0.009,0.003-0.017,0.013-0.021c-0.014-0.009-0.109-0.12-0.106-0.126c0.109-0.008,0.126,0.186,0.211,0.179 C10.495,7.297,10.5,7.29,10.512,7.292c0.012-0.065-0.071-0.093-0.025-0.164c0.044,0.028,0.067,0.022,0.069-0.017 c0.074-0.003,0.238,0.195,0.244-0.038c-0.003,0-0.004-0.001-0.006-0.001c-0.058,0.05-0.081,0.05-0.058-0.007 c0.022-0.006,0.038,0.006,0.058,0.007c0.003-0.002,0.003-0.001,0.007-0.004c0,0.003-0.001,0.003-0.001,0.005 c0.074,0.007,0.134,0.047,0.12,0.171c0.105-0.01,0.122-0.032,0.255-0.043c-0.004,0.011-0.002,0.013,0.009,0.01 c-0.016,0.087-0.092,0.185-0.091,0.291c0.048-0.018,0.057,0.002,0.028,0.062c0.084-0.019,0.172-0.133,0.23-0.167 c-0.005,0.012-0.002,0.015,0.008,0.011c-0.029,0.177,0.169,0.745-0.228,0.775c-0.01,0.088,0.121,0.16,0.125,0.254 c-0.917,0.379-0.374,0.413-0.285,0.189c0.202-0.015,0.23,0.332,0.433,0.317c-0.041,0.07-0.082,0.023-0.113,0.093 c0.229-0.009,0.534,0.091,0.778,0.031c0.013-0.246-0.361-0.107-0.394-0.367c0.154-0.155,0.414,0.1,0.539,0.091 c0-0.01,0.003-0.017,0.013-0.022c-0.007-0.016-0.021-0.016-0.039,0.002c-0.047-0.211,0.021-0.077,0.072-0.239 c-0.005,0-0.389-0.234-0.362-0.398c0.023,0.012,0.049,0.028,0.093,0.024c0.004-0.059-0.043-0.104-0.035-0.157 c0.055-0.004,0.007,0.074,0.068,0.07c0.003-0.04-0.017-0.086-0.014-0.104c0.136,0.028,0.082,0.22,0.281,0.139 c-0.028,0.076,0.025,0.264,0.209,0.252c-0.004-0.022,0.004-0.029,0.022-0.023c0.031-0.071-0.037-0.112-0.014-0.18 C12.676,8.142,12.6,8,12.786,7.987z M11.77,6.961C11.855,6.973,11.751,7.067,11.77,6.961L11.77,6.961z M11.556,8.582 c-0.167,0.013-0.12,0.014-0.116-0.14C11.394,8.43,11.608,8.248,11.556,8.582z M11.608,8.176c-0.086-0.018-0.04-0.24-0.027-0.315 c0.008,0.003,0.013,0,0.01-0.01C11.664,7.889,11.771,8.004,11.84,8c-0.008,0.02-0.003,0.03,0.015,0.031 C11.813,8.14,11.668,8.021,11.608,8.176z M11.862,7.142C12.099,7.124,11.824,7.207,11.862,7.142L11.862,7.142z"/> <path fill="#3C89C9" d="M12.192,8.39C12.189,8.413,12.265,8.384,12.192,8.39L12.192,8.39z"/> <path fill="#3C89C9" d="M12.274,8.788C12.252,8.952,12.436,8.8,12.274,8.788L12.274,8.788z"/> <path fill="#3C89C9" d="M11.693,9.409C11.683,9.485,11.789,9.403,11.693,9.409L11.693,9.409z"/> <path fill="#3C89C9" d="M11.389,9.102C11.397,9.178,11.515,9.115,11.389,9.102L11.389,9.102z"/> <path fill="#3C89C9" d="M11.072,8.723C11.062,8.795,11.108,8.72,11.072,8.723L11.072,8.723z"/> <path fill="#3C89C9" d="M18.295,3.963c0.01,0,0.011-0.004,0.017-0.006c-0.005,0-0.01-0.001-0.014-0.001 C18.298,3.959,18.296,3.959,18.295,3.963z"/> <path fill="#3C89C9" d="M21.718,8.458C21.889,8.442,21.739,8.353,21.718,8.458L21.718,8.458z"/> <path fill="#3C89C9" d="M23.41,6.653C23.413,6.705,23.5,6.655,23.41,6.653L23.41,6.653z"/> <path fill="#3C89C9" d="M23.48,6.502C23.171,6.507,23.451,6.753,23.48,6.502L23.48,6.502z"/> <path fill="#3C89C9" d="M23.57,6.603C23.412,6.645,23.567,6.755,23.57,6.603L23.57,6.603z"/> <path fill="#3C89C9" d="M23.188,6.669C23.165,6.78,23.246,6.671,23.188,6.669L23.188,6.669z"/> <path fill="#3C89C9" d="M23.613,6.506C23.64,6.602,23.653,6.507,23.613,6.506L23.613,6.506z"/> <path fill="#3C89C9" d="M23.131,6.713C23.109,6.555,23.033,6.711,23.131,6.713L23.131,6.713z"/> <path fill="#3C89C9" d="M23.562,4.875c-0.009-0.018-0.007-0.026,0.008-0.021c0,0.026-0.243-0.145-0.268-0.15 c-0.033,0.142-0.178-0.038-0.174,0.226c0.151-0.016,0.24-0.037,0.417-0.032C23.541,4.882,23.546,4.876,23.562,4.875z"/> <path fill="#3C89C9" d="M22.223,4.034c-0.058-0.001-0.101,0.02-0.165,0.02c-0.171,0.563,0.608,0.305,0.615,0.481 c-0.184,0.128-0.445-0.087-0.421,0.168c-0.001-0.001,0.249-0.069,0.251-0.018c-0.095,0.098-0.075,0.135-0.22,0.084 c-0.143,0.632,0.514,0.085,0.731-0.159c-0.009-0.01-0.013-0.012-0.024-0.024c0.011,0.003,0.014,0,0.011-0.011 c0.013,0,0.034-0.007,0.058-0.015c0.027-0.034,0.041-0.058,0.029-0.059c-0.011-0.061-0.469-0.537-0.52-0.538 c-0.023,0.177-0.081,0.188-0.05,0.381c0.014-0.003,0.016,0.004,0.011,0.021c-0.02,0-0.154-0.26-0.157-0.297 c-0.069,0-0.095,0.028-0.107,0.055c0.003-0.018,0.008-0.034,0.005-0.079C22.237,4.063,22.221,4.059,22.223,4.034z"/> <path fill="#3C89C9" d="M23.118,3.856c-0.183-0.005-0.051,0.145-0.322,0.069c0.021,0.267,0.14,0.101,0.393,0.218 c-0.02,0.095-0.186,0.03-0.226,0.061c0.046,0.29,0.918,0.127,0.95-0.169c-0.172-0.006-0.382-0.007-0.4-0.144 C23.588,3.894,23.137,4.186,23.118,3.856z"/> <path fill="#3C89C9" d="M23.252,4.625c-0.021-0.13-0.121-0.09-0.193-0.064c-0.013,0.014-0.028,0.033-0.044,0.05 C23.128,4.734,23.153,4.664,23.252,4.625z"/> <path fill="#3C89C9" d="M19.583,9.93C19.581,10.048,19.636,9.93,19.583,9.93L19.583,9.93z"/> <path fill="#3C89C9" d="M23.876,6.534C23.876,6.52,23.809,6.533,23.876,6.534L23.876,6.534z"/> <path fill="#3C89C9" d="M23.906,4.461C23.861,4.477,23.931,4.617,23.906,4.461L23.906,4.461z"/> <path fill="#3C89C9" d="M23.057,6.733C22.921,6.712,23.026,6.876,23.057,6.733L23.057,6.733z"/> <path fill="#3C89C9" d="M24.236,4.43C23.87,4.415,24.236,4.459,24.236,4.43L24.236,4.43z"/> <path fill="#3C89C9" d="M22.368,7.324C22.337,7.458,22.455,7.325,22.368,7.324L22.368,7.324z"/> <path fill="#3C89C9" d="M26.57,3.952c-0.022-0.001-0.083,0.014-0.153,0.03c0.004,0.009,0.015,0.015,0.016,0.024 c-0.024-0.013-0.038-0.019-0.049-0.019c0.011-0.003,0.021-0.003,0.033-0.005c-0.095-0.139-0.77-0.149-0.748,0.051 c0.071-0.005,0.367,0.022,0.367,0.022c0.058-0.008,0.098-0.02,0.141-0.028c0-0.002-0.003-0.001-0.003-0.006 c0.067-0.002,0.141-0.019,0.208-0.033c-0.012,0.002-0.014,0.009-0.012,0.025c-0.085-0.007-0.139,0.002-0.193,0.014 c0.011,0.047,0.038,0.022,0.046,0.105c0.147,0.01,0.318,0.068,0.474-0.054C26.677,3.961,26.579,4.021,26.57,3.952z"/> <path fill="#3C89C9" d="M22.923,6.807C22.931,6.987,23.074,6.785,22.923,6.807L22.923,6.807z"/> <path fill="#3C89C9" d="M26.749,4.212C26.525,4.196,26.825,4.473,26.749,4.212L26.749,4.212z"/> <path fill="#3C89C9" d="M26.899,7.116C26.574,7.099,26.99,7.421,26.899,7.116L26.899,7.116z"/> <path fill="#3C89C9" d="M26.625,4.16C26.458,4.194,26.661,4.279,26.625,4.16L26.625,4.16z"/> <path fill="#3C89C9" d="M22,4.271C22.043,4.666,22.129,4.273,22,4.271L22,4.271z"/> <path fill="#3C89C9" d="M22.511,7.249C22.477,7.221,22.39,7.501,22.511,7.249L22.511,7.249z"/> <path fill="#3C89C9" d="M22.737,7.011C22.714,7.094,22.762,7.011,22.737,7.011L22.737,7.011z"/> <path fill="#3C89C9" d="M22.874,7.069C22.912,6.831,22.65,7.066,22.874,7.069L22.874,7.069z"/> <path fill="#3C89C9" d="M22.717,7.044C22.697,7.126,22.745,7.044,22.717,7.044L22.717,7.044z"/> <path fill="#3C89C9" d="M22.619,7.316c0-0.069,0.198-0.205,0.003-0.208C22.597,7.21,22.504,7.315,22.619,7.316z"/> <path fill="#3C89C9" d="M22.564,7.13C22.446,7.156,22.569,7.237,22.564,7.13L22.564,7.13z"/> <path fill="#3C89C9" d="M23.34,3.917C23.318,3.849,23.298,3.917,23.34,3.917L23.34,3.917z"/> <path fill="#3C89C9" d="M23.409,14.053C23.41,14.131,23.544,14.065,23.409,14.053L23.409,14.053z"/> <path fill="#3C89C9" d="M22.683,14.068c-0.14,0.027-0.284-0.019-0.393,0.008C22.301,14.357,22.652,14.375,22.683,14.068z"/> <path fill="#3C89C9" d="M21.3,13.657C21.158,13.654,21.325,13.794,21.3,13.657L21.3,13.657z"/> <path fill="#3C89C9" d="M21.859,13.439c-0.279-0.09-0.034,0.581,0.004,0.417C22.116,13.856,21.859,13.507,21.859,13.439z"/> <path fill="#3C89C9" d="M23.705,14.428C23.701,14.338,23.653,14.427,23.705,14.428L23.705,14.428z"/> <path fill="#3C89C9" d="M24.218,14.182C24.22,14.234,24.294,14.183,24.218,14.182L24.218,14.182z"/> <path fill="#3C89C9" d="M24.206,14.072C24.177,13.985,24.172,14.072,24.206,14.072L24.206,14.072z"/> <path fill="#3C89C9" d="M19.764,10.005C19.809,10.018,19.711,9.764,19.764,10.005L19.764,10.005z"/> <path fill="#3C89C9" d="M24.254,14.335C24.254,14.36,24.333,14.337,24.254,14.335L24.254,14.335z"/> <path fill="#3C89C9" d="M19.594,9.865C19.609,9.923,19.7,9.863,19.594,9.865L19.594,9.865z"/> <path fill="#3C89C9" d="M19.742,10.138C19.766,10.31,19.789,10.138,19.742,10.138L19.742,10.138z"/> <path fill="#3C89C9" d="M19.747,9.819C19.808,9.473,19.57,9.821,19.747,9.819L19.747,9.819z"/> <path fill="#3C89C9" d="M21.046,13.81C21.126,13.478,20.944,13.81,21.046,13.81L21.046,13.81z"/> <path fill="#3C89C9" d="M20.792,13.777C20.684,13.913,20.828,13.777,20.792,13.777L20.792,13.777z"/> <path fill="#3C89C9" d="M23.555,9.632C23.663,9.605,23.505,9.425,23.555,9.632L23.555,9.632z"/> <path fill="#3C89C9" d="M23.118,9.866c-0.014,0.076-0.225,0.101-0.072,0.261C23.062,10.068,23.179,9.867,23.118,9.866z"/> <path fill="#3C89C9" d="M23.158,9.231C23.212,9.423,23.282,9.277,23.158,9.231L23.158,9.231z"/> <path fill="#3C89C9" d="M22.552,10.439C22.559,10.592,22.737,10.511,22.552,10.439L22.552,10.439z"/> <path fill="#3C89C9" d="M22.021,10.522C22.045,10.314,21.812,10.476,22.021,10.522L22.021,10.522z"/> <path fill="#3C89C9" d="M24.373,14.349c0.013,0.032,0,0.012,0.033,0.012C24.392,14.328,24.406,14.347,24.373,14.349z"/> <path fill="#3C89C9" d="M23.66,9.688C23.298,9.644,23.616,9.971,23.66,9.688L23.66,9.688z"/> <path fill="#3C89C9" d="M23.504,9.838C23.505,9.913,23.541,9.84,23.504,9.838L23.504,9.838z"/> <path fill="#3C89C9" d="M25.32,14.646c-0.078,0.018-0.218,0.05-0.252,0.063C25.125,14.9,25.322,14.723,25.32,14.646z"/> <path fill="#3C89C9" d="M21.418,10.858C21.287,10.887,21.418,10.905,21.418,10.858L21.418,10.858z"/> <path fill="#3C89C9" d="M25.32,14.646L25.32,14.646C25.382,14.632,25.409,14.627,25.32,14.646z"/> <path fill="#3C89C9" d="M22.268,10.589C22.283,10.533,21.897,10.681,22.268,10.589L22.268,10.589z"/> <path fill="#3C89C9" d="M22.17,10.261c0.002,0.113-0.027,0.11-0.131,0.109c0.01,0.099,0.166,0.188,0.166,0.12 C22.261,10.476,22.303,10.241,22.17,10.261z"/> <path fill="#3C89C9" d="M22.012,10.632C22.065,10.615,22.077,10.418,22.012,10.632L22.012,10.632z"/> <linearGradient id="hl_2_" gradientUnits="userSpaceOnUse" x1="215.9331" y1="792.7061" x2="215.9331" y2="774.8809" gradientTransform="matrix(1 0 0 1 -195.2002 -770.8008)"> <stop offset="0" style="stop-color:#F2F2F2;stop-opacity:0"/> <stop offset="1" style="stop-color:#F2F2F2"/> </linearGradient> <path id="hl_1_" opacity="0.63" fill="url(#hl_2_)" enable-background="new " d="M33.147,14.728 c-0.033,2.735-2.54,7.178-12.287,7.178c-9.354,0-12.835-3.199-12.521-7.656c0.273-3.87,3.254-10.169,12.521-10.169 C29.365,4.081,33.195,10.393,33.147,14.728z"/> <path fill="#9CD7FF" d="M30.042,3.613c0.906,0.484,1.782,1.047,2.618,1.683c0.924,0.401,1.758,0.949,2.468,1.66 c4.808,4.808,2.37,15.068-5.431,22.871c-7.801,7.802-18.062,10.239-22.87,5.431c-0.772-0.772-1.354-1.685-1.761-2.701 c-0.604-0.816-1.139-1.666-1.6-2.544c0.242,2.34,1.108,4.396,2.659,5.947c5.196,5.195,16.086,2.76,24.275-5.43 c8.19-8.191,10.626-19.08,5.431-24.277C34.315,4.74,32.315,3.878,30.042,3.613z"/> <path fill="#9CD7FF" d="M11.46,37.931c-0.906-0.483-1.782-1.046-2.62-1.684c-0.923-0.4-1.756-0.948-2.466-1.659 c-4.808-4.809-2.372-15.07,5.431-22.873c7.802-7.801,18.062-10.238,22.871-5.429c0.771,0.772,1.354,1.684,1.759,2.702 c0.604,0.815,1.141,1.665,1.602,2.543c-0.242-2.34-1.107-4.397-2.658-5.948c-5.195-5.196-16.086-2.759-24.275,5.43 c-8.19,8.188-10.627,19.078-5.43,24.275C7.186,36.805,9.186,37.666,11.46,37.931z"/> <path fill="#9CD7FF" d="M29.887,38.302c0.908-0.484,1.783-1.047,2.621-1.684c0.923-0.4,1.755-0.95,2.465-1.659 c4.809-4.809,2.373-15.07-5.428-22.873C21.742,4.285,11.481,1.851,6.672,6.658C5.902,7.43,5.32,8.342,4.913,9.361 c-0.604,0.815-1.139,1.665-1.6,2.543C3.555,9.563,4.421,7.505,5.97,5.957c5.196-5.196,16.088-2.76,24.276,5.429 c8.189,8.19,10.625,19.079,5.429,24.277C34.163,37.176,32.161,38.037,29.887,38.302z"/> <path fill="#9CD7FF" d="M11.707,3.429C10.8,3.914,9.924,4.477,9.086,5.113c-0.922,0.401-1.756,0.949-2.466,1.66 c-4.807,4.809-2.373,15.068,5.43,22.873c7.803,7.803,18.061,10.236,22.87,5.429c0.771-0.771,1.354-1.683,1.761-2.7 c0.604-0.817,1.139-1.666,1.6-2.545c-0.241,2.34-1.106,4.398-2.656,5.946c-5.198,5.195-16.087,2.763-24.276-5.428 C3.158,22.157,0.723,11.266,5.919,6.069C7.433,4.555,9.433,3.694,11.707,3.429z"/> <path fill="#9CD7FF" d="M40.425,19.836c0.015,0.264,0.02,0.532,0.021,0.799c0.195,0.077,0.354,0.152,0.432,0.225 c-0.829,0.76-8.186,1.813-20.019,1.813c-11.833,0-19.188-1.052-20.02-1.813c0.079-0.073,0.236-0.148,0.433-0.225 c0.003-0.267,0.007-0.535,0.021-0.8C0.481,20.122,0,20.459,0,20.859c0,2.582,20.008,2.611,20.86,2.611 c0.851,0,20.859-0.029,20.859-2.611C41.719,20.46,41.239,20.122,40.425,19.836z"/> <path fill="#9CD7FF" d="M22.304,40.427c-0.265,0.013-0.53,0.018-0.799,0.021c-0.078,0.195-0.152,0.353-0.224,0.432 c-0.763-0.832-1.812-10.28-1.812-20.021c0-11.833,1.049-19.188,1.812-20.02c0.071,0.08,0.146,0.237,0.224,0.433 c0.267,0.003,0.534,0.007,0.799,0.021C22.018,0.48,21.68,0,21.282,0c-2.583,0-2.612,20.008-2.612,20.859 c0,0.852,0.029,20.861,2.612,20.861C21.68,41.721,22.016,41.238,22.304,40.427z"/> </svg> </y:Resource> </y:Resources> </data> </graphml> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������mitogen-0.3.9/docs/images/pipe.png������������������������������������������������������������������0000664�0000000�0000000�00000224503�14656664731�0017055�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR�������D$;T�) IDATxtfz7ǻ?dz'q'vlƀiB&z TPu@ uP]-ͽ# 5$!yFwy ������C������#'�@RJE_{SmMINYfBޕ I>v'.$٧gFF^/LoVr���pI��<`TJekCMENJfoy@kV3j<d\OS=OsLnK(>Ui0��`I��<0TJE㍲Đh #k]>g} CG[s0+F⟱' Yzb==M纚[g_u ��!'��PT- Iaw7gA!)6+lW=RmVş\rhnJz8KPpl��0Q$��;fYSn{̹oQqqT#zEѥ>湘ZFvup��0!$��1(-򩝮&s.9n84d$Y>T0#»# ��#'�0]=m1^VozdiʻoI>np~INuo���9 �iIےxЋ>a0U!VQ]owςs;%:7r��0$��P%ŚNyKGWӅI=y���9 �iGwѵ%I#w|3"}}����VoVۛE-Inj8 ���9 �饷#-iOKҮ̽*渁v=5Tp���0r��ӈR)ܿSw땡]Ϗ\���`4$��VgĘ}-IIV+,pݵDs���02r��ӅJ)9S%i.y]kn]/ʸ3����.z:ΎejRfѽ-⳦2|X���#"'�0-ꦚr͖ҒVƜ0ܻ0-TĆƛ��� GN�`ZP;lvh|v?wӢbYE^��� GN�`Zjk<wD/r ]g{nw~^ T{UX,w73©��$��cї4ZmN w/p>7dhK\vFpr���09 �OTT9nv|<`ia:w#} .l 8j<E' Sm>*i&C:U*9A���EN�eVI:yIg- KՓ#Vyi:7)㞩$>aQҸbadbHoeSM'���I��MGΙ襌4(jzuafBa%dZ3:g{n :f(~c܋YkniC#,`i{@|̥|v?CӅz޻/n 9ylY +".u1] ��.r��_[M}vݙ١ UW-L+!Zḛn>%bEz۳/[{Us, >,|yQIÐcK/\kk9>]ܿҾN[\ۡR)9G�����ꦚ /]9ʪ؋])٦iI!I4YI'Jv|eQ}-gǎy^{-ۿ8A4o|#vw%|gm}f: "oәn[vfWw6q��� #'�pTʚMF\;c\$)$rN>NO\>T,pG϶-緖\)r_Oa qQ!툐zDH9$68Oa+;[9M�����ϔҌ+:a4|#KϾzv7mKlI@WZm4Js}fѥ5tLH;IrN/$ fBͧojk��@9 �;'/bN ];)y,l;t[KҔ3BJE)K(Y %)' LP:|p '%̈́+;U!_N��� '�puw^ r<+&%δL5q=-GBC2PNk)iR(ir&'eҥ JIRN$N#\٭ _~RAPs����}ٞ|Y +䖔j*rOӹ{5F0\&${mKr򝄂!]r[Q:$MPNPʰ='5;iHNJحas���]$��8o!9)jEޅ._fLMmpjR&!: g: ڨ䨝tfp%;mQm 'pMZ><x[nunOZPp����}6<'X 9˨{b5g 'LMZRP( )*IstjXNN!'oI{[}s���]$��!9)zE!sf_<0>V!yfVQݭ+ " i7i`N\"gIYjݎjo&4$'V6s���]$��?{MN0J4|`%Wu~I"$5=(W{O3rRfh)М$夓CsRKq9)zk$��� GN�>jO :K|w52W irҕB6!ipm}+'HqVے$I:Kq_mHN^&$RGm97r���#'�pteF/v؜BrRv!yp ivX謶%9mp)<neI9IZ8II I E#���"'�p)5.G;}vBԷB`N"$krR!ep툐ctnNK&9jU45ihNt[NڣIWv#u|<KY9��.r��Jli-hc̡9銱f$S!yG3G)z( ͤ-m4p[uX{:ڜo ]AjE/'���I��LʖV癝g? nI &v)E鐐mYGIRXҙ-)G%It;iI4pIrN2Bvm���`r��Ӆm{B7A(o|4AI*JW B&!ICnoI RKҙtUn&I9.!f2`q?wq^���09 �Boj{U mNZ?EiW8 F9v$-֒Iږ;5IMӒ[.r / ��� '�0]-.}$yM*J4B"IcĖ4-&%JSvߩ {?oqF:���C��.j.OOwS4WIQIJcxe5­4׸Ցn&-­iIUmXi���`r��ӈ#`]?VLPҮ[u<v 5])\^4Z2IjI) v &Bw}C+~+|g���Ñ��F]=^-6/4(D$m=;cvvǛ'WGtXs&$v ;mB&!rR]28#����tV)Z>tXF;AIY[7}W6 ˓ X/K5H;"yMR tEw 0$-+kn$ZjIBnN���#'�0;QdVQV"o|o5G}s=M\wq=s-H/>gvkM\U_ kB*!T ZNs����fqE)n:nSg؆,'Lf{wy#Kę^0GcD]rhӹw̉?J%}=bQي\N���FDN�`Quw\ڬt@{ɛTu61uO=ef2gc˒WٮFJ񟉖+Wجfe<:r%IS4-I;5in˩?wFP����VŶS-n/J \\ ػ0rE$ XwaB= į^ܷ(~Աe+~Dcq Ta_\s7s8 ��� 9 �H 5ӈ"Q)֋_ڡd"zee~f <M^9Lҁy!|h^>=s/->n d.2Jԗzl9d{A���`4$��%RY6/E)U7׽V8n"~ͪƳOoː ^dd,vI_s/ӹIkRWZf2PnIBa^ߪ:8���9 �iJٓusC5BW8n"愡6'q5{z?/kNs۶/. .\鿨s9���9 �KsO=ԡ+55%.˜6cn8 \޿EEAZ~diZMh1hI]>iq'ݍ��pG$��1JTqykݟzVBWWkf'E 4ёlۿ7 \>i9awC��;"'�0U e]~GVw{f2pEIV+.Eo2e.i+K&��`I��Lwje6e-ֿyO.'%Y;g>z]N3t- ���GN�Nsn:f;5vy 0[8hisNЮO;k|ᓾ+a���9 �#;ǿ޴|^s'\ay_NJ͕a���9 �@{gw|X`|g'YFmI6+#.uY>ڽ~��`I��LwJUjiɩB/+.r2+ВI,o6{Еm]X# ��q"'�0ն([jmmX"n0o$ul/- _V5_?g}Mc~%S���0.$��~Upf<޵_ _)t^j<+kI͗_إ{NJ!uؚ +;9s^vUG���AN�`Rŵ] 2JvR+D|yiM}rhIQJY}w|s# *fyZ.>].n���wDN�`jR8VϷY߰9б`mDFA![U1 v3?~ Fw0Ky37?|N^jl:&+F.s"r ���wDN�`R(UY-+r\˷En]wyl3K̈́ud19<l=]|vݣ_^ة{n^+넘 k:lK} L/7us��06r��ӍZ]{jFŜy69/5m߿-vǜJ 1߉C7+N-XubQEG]m(J?BFiFoZ:və -[:68wtvhV=��`l$�� Jܘ_z9|m["_Q&hƶ55KOev H 4o.n2滞 ]a[ֵܠm*nKc 3D//\װ5kKpK_yYovwPQާPqR���09 �OR7g8dGN_Z| vy[zLI*Pn}S1^9AZv q[Vq(k"&\>~եN%kwo ҹr7Xd,9/Ug^V[Pݧ��@9 �IR55$d.Щ`݅]auǓڭuoTԵ#I#Y#E*&^lZvl]v0g?@9U(;r,#<ud�gsk;1m[TqDqX֐͗ۿ9*[kW\zh].lԚ~%t��`�9 �?)$gN5f8tvкy69߅irRzg3U#Ye4OKbvY+ןv瀝![#]1>s A-b{MbEnI.t>:{oipM~kܮ/;So|fH&N���r��Zjjn M)yʲYVo>X00\io@NJ4T ~-a]W{,wX|PX; =ˬV*WrNLWMbtg'mغ̩tmK-mۃL._l۸\ՒvVY7{��9 �B(q Ymƭ,TvcI .C׻%i&m<({k& -w*Y#<u_gͳ]ܪW54k'wkZhgX3}GH6'mj|uK@ ˝˗lqJ Jlhd��9 �UNaqﴥ6UHnC8gu}n.7&(z~$dֽ9+Gg#~ŧrjvOP1uMWVͳ^f ' NPvuk`떀֍Mkܪ*0y&���/9\}֎j9$iQf+!nHk_\ԱhShxv IB!]3~kگ_}. {9?}d<Ž4szS7u|usmr-BwI J߲ɯ[egJڤ%VTsB��~I��|Oz\+1oOX}n߭IRE* ۇsae%ZLbLbna]/:p^wox_a{mљMa[qfNŧ )ذ;}W&'Z6lmYUoX:r��9 �C__FNt'% TR87l8E8; l4u%mX^8A<^_#/Ǿk>dl&{mQ򎚖)}GB<CǢ-f{$_vɯ;u;Wdr ��CCN�ӮTlCz~yIҤ$m9*SI\ukh8iXRľ+!kºtiXluSܲr?յw_ {y?}*im&)$m ltrmsɥf{ '_>II}5Ei(-ͰK���� EiEADYf7t%+H6]ɥXq,ϲEUhܹ!ec-!3_$߾o->ԩtSpkŽq0 nݹ7J":v|ҐtЩ|M٠6N4��9 �{HV74%ۦ 퓧& iIRHGSgJ#m2:7^_搯hGkBS<uL^VN|ן{K|Ygp­jѩg 6TE-'#}+'IEiٙ#<R�� '�puue/JWnkjKm-II^UP ͱootW% r*_y^kx+o_z] mb Ze/:ڭrNqH9inN\>iո$uvΤdq��~ I��+rJŭq+H< OM*YI;/i%_:čCKZ.Hnw,P8a?yAنYO\¥d1mGt؁Y>d:RNV羚n,P__I��! '�pOƖCgk׬$$y$$%] !](WT^%;Yw:*1s/x&ߟ gE,Ӻ-zNKz4hB I㼹XqJt4E?��GN� KYbfPq:VNJ7ijԒnk!E[EIZDL\Jg5&>cnsXϜ?֋W˔߽ >~hZ.$ǒ椘}ѓI|ӅkSr J9���=r��SORUTY2>sRJ}C{SOpa( LP^&+><RNr~LHus>|#^}`N9}u[N9inIKkm2Nx%p7��9 �&swȍS}c椁+ݼoh*_;An9lx_? .-W^7y+,RI49inI%oNeFvb3���x��bjSѫ]-vOaNyvsv"_[8z̫Њ{g=1���x��b==W2d rD.v9P.v&tv 7>lƟ_I9_/3ցb[kr;W^ ʏ��C�kjas2SI×>[-'U ,-OP0]K0t[f|k|/}.-uY\��0#'�02 *Yl-IgTp.$M:w(I׸֒&Z8l¹R_yCs*ϯsޟ/rrA)'Ew9'L0'Iۦť���"'�0][ds0FIYr_S$VKP NMpRn9?sR_^/|ɤRNJ+'IAwToa��C�v:lS^>jڜXw'(,YDIӏӒ,­$>UVwϟI{sR__{yeXpI9)f 'iNsRHi$ݜ?Br&���P"'�0ŖY%o<_l+礡'4Ai(QipxH% iI&9*x?2k|exN߾eum`ny9inN 5'msNRga���x(��b lwZ]I|Ei`@H%9*ħJm492?r>|#)apknv@NNr[%usҺyO2; ��DN�`-`uw%~ J#%mTJREB(-ITڜg297~r+;tI:p䤁&_h4t,<��9 �)*eJ˫=9Ig%oEIR@W5[\GiIN) [♬8u)'I:|E{h 'Mn֫~]Β0���<I��LCnqrv5X%oʁJF@HҬ=%i*k9)W/CtI㻭J7z#r4+~���J$��إȤJ'u $i[ )JUoӔQimIgIWnz4VNkA\!'mnڭfMג��p"'�����`I�������r������&����� '�����`I�������r������&����� '�����`I�������r������&����� '�����`I�������r������&����� '�����`I�������r������&����� '�����`I�������r������&����� '�����`I�sppX<:##GT)k׮BDњ5kš??я~ӟnV}Qqx̙iiiK|1V={Y-[3o'&^mG��`j�!ghhq~fgg7__'?-s"詧B6{l̜9SwcZZtWzKMǿWdd36=nnn_z/^'��Y!7Μ$ٰa~kr҄{gbllU#=.))hp^AAA$)O<1sٳgK/X2Syɽ;��CNI}Y"##ŏoV8Uߚ4!!:::뫻}ٲe_c+?O8_|_1ݟp=)x~ɽ;��)CNIk֬a~w}w59iBICJVwo-nm}=#\&{oW7l0<g~ɽ;��Cn9)??_R1Ur&4Fyn''ǿrgyg\&x{{jqqTc|_{{{a .ONܻ��oV�xȍ3')cԟ///sss1pHNw 466J/-;;{tttȷ}qur.5gߋP|=c9i<_|o.&HшgB.UI;⟺㥣$I[Ń#~:::zw .k̙c<F㏏ GcɽN��{�q$B!=}ջx㍠wIw-_7[SSp!I/266v]}Ǐ?Q*=_we7߸qSOeW2FNOJJsύq-O>䐨78齆gJfqxF\o;==]>#.zK|3Ɠ&:��r�<ƙ?Ë]LLL%$v҇anw?O;MJJ~"|/ss{9iժU5 7$9I~O?͟?9i_'$$x"##|w�'׽InnnFFF-=F<ں3$f͒jjj:;w ɽN���r�^$tţ}r|ZK''ҥUD2l s,_&~?|G[F?eG3XYY566۳%E/Ž=*]&ȵhJS]c+'233ON?pH&Mvp҇}DK풎3f?!!!c<8כo$mU4 :36o,mONw��0%I�ss=7sc<婧 / 6 c=V]]=bNzG_$}'Sk,[lW.͗_Ґ#!u/wOIIB҆H O8Dz%kkk҈9iF_J|RyW�Nߑt7oGz³g޻2)W!#3Z⏺(y*r��x�!'礱=#~Dϋ/8ڷ9'[nw+**B-A-_&$ψF… <?|&I><'M3i Ç�a#)T͚5Kw).K<AߦW^ye%M rss$��!'Cn9I^9t[_Zw)zH5(++ (00pu#>`^r5kH_#4="M{Gjjj�a#ݻwn.') fΜ)#sssms}]i?CN(9 ��<pI�sҪUnU[[+~ݹsq<e$%H⟺ۥdڤ'g=.\PzccQȟ؇OUUgs҈圤'y]C}xN7J裏gY._'x.s'-K?%{NwylQcc<ewߕVII��CN8V__/-2nkO?QJ '0{ѓƾcT7ƈ/駟֐%tN2҂;Ct7ڵFyJ>ws&Ϯ2GiݪUip^򛪨�Dד/†Kr��x�!7Μ$\裏ʋKV[E4d"̈aEwY<1$]ݣ$1^|=ԈPr7?33S{_{5~sx7}էIKq6_̘1cʃ:~srr#/fWiKBBݿN��{�$J%oIJ[܆l9|v )'0Ǝm=d>{'ޣo ),s|9PM4|vG{).wK^|$c -avy7��`J�!7A!!!Җ1&S(#^vǵG\{^0{l('0䂸1NK=zT 2x7}Dk:ktD6ݍ#ޏOvrhhO"O $��!'Cn9);;[4+-7!%.me{/>yo1g'>xW;<'577KӠy<_~y1ȑq1ֽvQNM۷ohO.=FZx[ ��<pI�N5kp쌶<fHs;[C&CMNaa4rMM͈111]Fvrwߕ}xN?䜆I133x7} :ܺ+˱+$UMQT#>FN7nwd)n��!'Cn<9T~Gdgg7&ӟT$sc=6|!e566mC2Hag$鲬 YXXr|<wIzy:>c !|혗׽.^EFFJo\Sw$'�9 �rrN1cümm<CvvO~*4##33S^Xdoo?dG9'IK&KKJ;>cIII#iN8fUU~3ԸIuf߾}.\8d{san^jGFI>5nܻ<>c[͟?_wŊup^r)裏J祢DW"'�9 �rZX__QXXؐKlnn>|/)'.[lkr9IOďݽI3g]{{{sҤX~5) ySҲc,>e{˥O\&!'�9 �rc$O<tzժUC>0?#3gq9' K*{o8$jll\v?>m>sCݻ$>O?t<ZNp4Lws�'׈JKKG\NKZ>гӜ$*..BHzkBˁ����J%~ЬB!!~xmf9Y^{III/,,>ѐ>%kxbrpJ%7!EN)O ,��<I�Hy;}v-{���r�`کx~OR}Yżk\��`��Kss~<==A|='ɗuttHK��T!'� ~Z9)!!{'%_~e6��� '�0{Nҽ5'���` ��Jkܛ4{'x駟/--���`j������0$������L�9 ������@N�����������0$������L�9 ������@N�����������0$������L�9 ������@N�����������0$������L�9 ������@N�����������0$������L�9 ������@N�����������0$������L�9 ������@N�������o>o�� '�~pď?0)��I�hNz`0;_r&|P& ��9 �0-sXHc0 9 SNT7 .EGρ���$ # jq(ʺNehʭHiT]Q{T]cP3]P(ʵFR\\,=c� '1$`ԊR ]6Ev]oʞت}΅jRRݫ~'7OԦ(4ёq+W~o֌3~OhEկ~'cff&>gzzzOO�9 �@Nb0IU$Dnen}_tyWHIgXiWxYwd%U^MX T*n'''JU=ѕ=e]]9u} ]JJӔJ߳`?߾g̘'wttp ���$I4IU"K;/v\. *k;{=9+z꾤J!"N3Rkoj\*zʻK} /_-kW7JAĬ{APDEE}wկX{ޟ5w8 [zXfsh~ٛ{O]_Ö-[Wũ@N� r$H ] CnP_.s={.!}ǯxo/_nM.S; )ukqNZH鏬R)U.3(íXr>mW|L(}}?߷kLw<r!$*9C5qC3JGq8Q$Q(ւܲƈ l=8p[O?SkKLL4 '�I 9 "U k&GZC%lMue4T^,/Q_kPe66"+ j <cҵPV%%9_/>LT% &+MVOOω'^z3~7V=䑚URQQ~(1ޖt}$ʁW"6΋z׿}䑿^}UKKKVY@N� r jAPzT2ߕjwF[^\W~77nH?_KTq7 Jez]HҹVBr-T)C*QU}QnA%!%>9>m[3s]|%rf"8B}駇B̹Һ cK*xKCnKG85#%%3|>'o$f''' �r�`0[RI*3iC,qͯ#Q7?h%hcY`sb͹YN.as,AάU](mʮN.Ry#]I-n y*y zOŵo㒟VnkG7Z+:+k;GmI5h{{KҌl(?f?yJJ�$��9 'a:R B M9SR>a5EXvָտL9 یw|b'l|Gb<.$WeVWh&IMJ :zsWeSWE8::j;wt%o ,s֬\596(JTY cp??!iؤJi $mHXK%5-IY(Ռȴ?#ǮP�$��9 'azS VZFV>9o[jFfϬ ٭ym'WR;<| gCʭXMKŪ7**;QYRQ\sƁ [>;hԍ|JMx:4+T <s(1Giw7&+PUyǖT6$q$IILh,irkn<giii@N� r icZN4 :Qտlzme6 MY-!r\*W9SvJ7 CPW{Vqt *](Q6t7v5v6tw׶hOlX~!+#<F>R9?N\qBTyB78%XSvu4bIQo6ےJ$qd4]-b"yUxx8'�9 �@Nb0I-I-Djqs2TG6+=UsfU+"%z[F7c*Ϥ5i -P]+kT-Jz[5'߭H|7vet׋3fGTAC֜Ng\bp;K5#fˣRQJ  ū*%u4t相U&nwݒ4)io3c n� '1$-v: ş[gv/8ucm~ek< B*8p89z[Vu[LQ˕4ڮn2"uI&$I'0Cj}RR;5#9-%986tLF-vʝm%N;K/) Kn*ŗ茶%M܆ZRӈ-IiIoE���$L<J4|+fAsOe}Yſ99t/u13s|[bUtaCzU[D^؊S II )W+[㋛rjϗ(KTō=M҈/n.w)~:>Os7~il#5Tt96$$hxvqBחʋw@nHo7MFkIZRzqF[gM}b�$��9 '~JլX(^qpS<Ó~(N%5'U;U֧U_o(hr$3Ųº^)72݊TeʢƞkNTF7.(M;#MSVXGaU[y4䓓Wŗ1bNS gT3Jf( V?wֻٍiIS}%iFj~o}S � '1$7j^YBa׆wl (y3>5U351-ýPZba{捎yu]]E]΅2Ea}wIcwlq]tEXwZ Rq~*[;MImhyWcMP_}V4A5e/MqpqO$9$-Ig/Jo8�I��rAN}S"8 g[`@>-2Crz2+e-Q]g (/6Wgtdtʭʯ*Ωq.PWw55ZF:^ʮ.ji,7-=Zf|:W36<f㭱%)%=\loMb??K孷_Z*xq.=JKZw)@N� r˕I&a Lexh̬=Rr,tL{F E?{ՙWLfYg\7&nvs7"K-F Qc1 wi* m:04 H3g<fafy/^8333S2J2K7)r&q̊fߜ攢Ҫf^qÍZqMFIcZUj|}bNZ_+&u**+>2Onv'UR]xI{~26m56qcKfI># �'��$ q<NrS=]<тgҌC)qU+,?uEn\ #.n7K3J*k.o?T<U>H-k5˨"HES +,RV DIF`d>(t8 : қoiıdĭW&n"6qfIy<YղO<;�8 ��'Po(̶|0<ﲨfrj:Kv  O-V/iL/i,m,kbr[%-s$ ֱE qEJnZ\X\)pͤRr-hcJ6O)UJa'~Kl1Kz%F0f/2$�@��P(I8 'you:7=ɒ^zE#Y:9f 57(C;MP)ΉUBhD.urS&0ZrčWPʹԼ15'_휽Ǝ} -\"иX�AQt΂c<ʹ7y_/I�8 ��'Pq/i?C\ibkiP]3眊%u MI.]v#^b~Pm&W VZ#oH,9r1IGD9"aMNe|VEgOIEMQoN3<?NMܴgIRmYᛸeU6.'Og$o}x>:sq� N��I($xE2jù;zISEG/坼V!v[Wy'^߽,$S'K'O*\p"T]ܘZ]@I7 \-8xAv LCȵ-8\zR.\{&Q|9~sf_V]Ev O'1,*{s~czZ[% &neIw,O`?$��q�� NB'cA5-5r=Ɋ [JdPc}XYu7'O*lH.lUԘR)ouy$ϵ-<k}*@Xξ2R!镡Uw\1ο(kSpRBr %C^I^)uvtqX 6?ǿ֬ȓ 0Ku{Sd֛?cXVۻH+$I�8 ��'PϫM)^G4՚w4]NLw< <=R1{WeuWPFnM"WO( ՐTGI?^*H,M,%u!=t1ف 9gyi2r"Ewb "g";?$ p?1,p8{q۟ olq7.^>?iBn_.]vs7ߐnɒnJ®$;y9xrVzw/Ybz]8Yq� N��I($xlX$+$8+L^39hy($*\p7BxeQeqmXEtM+]ϫ)O*N~?,[CX+{Hjn{U(*>XQY9'ɹqOXSV:toKDSS'J[EIVi?].jjպ/JWԲ$v⺠ 1vF:xw/?l^6OQ7ؼGEݼ5m xko6H_yo:3J$dI2R5��q�� NB'cS|uυ <$C}z4C:e&"4|VͅpA"T^܋ܻ"+=ʕ_ϭiu;'N)(ȯrM(9UM~J, W\+Z3X-P;Tz '~(puxɨVLְ7PrL :|[I5ew= 髶:`Hg&n9g.i3^c?yo^WK%ղ$I�8 ��'Pq Ͼ\ޱ5.2:D.)?˯ Ψͬ>U}Ea-):TܻLO"cs u((6;,r?Srs0Rwq'iBoDM'T.%~{XC\w좒V{#S/x?ו΂w;qz&nyUxtXk2u?ʌƎxensw2j`Βjϒ'�$��@kVU2]8aUٌ!<8 MRdw0]Ctdtn43I)>]%PTϫ L'Uje ˦+\(Wߋ߻,ȕHZ݄[Elm ]`s+#'! f~)@sJ1vqҏѕ uHWxZ:(j>e Dj^Xj񑞻rHU A_WI+.q5-:!;:!+3Z&neIKfIennJaSSSҁk׮{۾}^GI��8iT磕/~81ce3n)(IЯڦ6,qwn\#fO2Kjv[nS UZVϫ WWeJ ^Ԇ k/j#HtGݶ)@PKገƒ64InMoG-"/]uz9rt o7YOT,@w%WÏ7R?Qifh]x[&nɒ )MJ$Mֆ0 / {{ xE:"N��I'!N(I^%$lΖ|7Qcd}D :Q.r-uM*wY\}tjՙ*?^?l:!YwC+Ն #?59eK֞jQ[|yT_WȭŞb6/_uI WB6Hw4Njk.&S+O>Lm␷;_x 3|n6N1K?K%{L,)qbI8 ��'!Nҥ͟L&!NAt:bٜdsZdeI/<ԉՇ__X\nWVIC�~YRLYˮ=Uhٺx@K?1Eۂk|G.2 .ru[ISm&Y2[=e )e�'1lМ0È X[]mGU~KҐ%= ɒ%qtݲG8 1ē'9rd&!N��I0q #1eL|S}8jK|Mkw%]6{# (<pȂyv7J\ܒ=nUxުJ]ZVyT^#Xv}Ԧ>YkGl -/{*Uq<pY OYkHy%t\9:Ēpgx)mkh@:);tAk=̶2xnuZJ庹qY$%qAʒZx[%KB8 �q�� NB8 q ;м5gkd+])o +ru: :L33Tdq._b\ݒݓJە>US|SϤUHkL$$߷ݴ[=K{3|#,PXN< y;g<->YcD"oSv;iJu#׫=$ngs˾;+k5ne@V֘aqR/Iɒ$eIK/Kw$-F8 q N��I.Nanes~Q #QHG5%_vE'Z4 >i$7$N"w{s+(F^S$'=A>hxVWt,D&tvl?_`ovS51kC-X(++u/sL(sN,wMpK#3+E-ݮI"߯jݴSkfe$]%X!Bs.IXG" evQHs hS`΁56˷[Kt]!0�Z?)yv:2Zj+pS_[K\7'NIzdIRmYRY ojM=KzqRKKKSS*88'""ByI"(44bnnN{VEE9ˋ<yPDb@ްx???{{{U&q;rbmm-y@@>Vzzz@@�Z:AwLItjJTSSC:<"9ڵk]]]ZiZ:PK}KިJβ&(҇; ro@ܷyaaa+ B��~8"h,1Os fF߫8sQ=⤵_)r/saTԽ!NC9UKW|G'J=?պK. M` Qpr#W,(+SJΉ.IP=GJgJ*S ej7.",7;wNpr(䟿nl΁ȢEX圜^IFm -v>E!]�=o*_ NCG߫qk_f[K Z[KiY' &nC,ILXC3f_~Vۛ2ؘ`V!H̙X'|dh֮]=꫹oXhh(6w̪*333/+**VX>Dokaaak4EKd@˹qѣGy䧎złX̽͞=|Nި鎼3ɉ IKS{'��_;NJ5z奞_c>-3Nڳʨ/'=I8i<obT)=:)#?3uqraro1(rt:=w [984@6!KnjΙ;BN]+Yjs.>}+H9JtM.1vB쯜2tnY]2OŗŕQjqhtBwsy.3^,^@ZJ:Oת7Mr3"ϋ<k e i_[Ki\%KuM=KJ8iѢEl4CȀXls̙M.^xkRPPrVTTf!0a{K ~z7(..xN<=2vX6"!}5jj+'ر)*-T9Ec"U {o h97Nb3Sj*$^,6NڳgO5Zmm}̾LoZ$?3[$��@kI%Q={ff$zfG*YhHy}oUAʳ?2]qtctdأ\3z^7ܺxa`gIک5gKE+|̔M|7/ݶ\myL\N[>rH7 rtWj钢܅m6n_9g>-Z)1}ZsZl[%K)Xł=;˷8eef;dzJ]X-]4%-׷tw=2ۿ tY[{$]6q,IOtw4L$f n d1n8WUNd)N^^^lHvZY2͒.\a�cSSSUDְ(njPWGE% *Q'={6;1FZ>Yd<` {e r/"fY }W�['1񟽽=3)|eqm_G^,ޘ93s쀩؇Zh;$c y+Vعs9s7|k!N��I!N?Y_i>jtk%)dC[Qxz-ǔ@+f){qZ:? <\yZSMۼd`-!y[C󶟓</cbTS,ySmmgec_+9uZR:]A*+].h)p96lp [1|aw1j c1w~BI/Lp!Βvo?7>s.rWq*?zj_zy^ }s-}::dyܪ<v8QV}M~~D?M܊t7qSϒI Q!'?<w-r1^k\Y87ns2Ŏv9zb֭߳o]QQFb'[RSSÝDr?"t)Ӂ�nWWSVX׿9GGl&'r8I{&::/+w;S}򯦷ҷwڥPUб8$��@kIő=+q֦Y.rИeCl?9&H{ףWxBY<?z9&+qZA_u6ni7%^e)oB][67QZ%2IL[w:|Xt;'c颓%EK݄mn٭qV7J]4>f)Y-<]|4Ĭ3mׅI&V9.}kzWHH-/vHc~WY;E< 2Ő/ B;?Hե}7%%e%鵉JDꖸ 8i֭`9;;7d7xc̘13g랙Q**vIf \.g0aB_1%;5M@LX Ak6mR ƍ֯_Od3O>Dqa-Wvܩ%K0xyyi {TmϞ=guuu1OԈ}7U_ǬY1N 28 ��'=8Y9NNv:7z34:QzuizV2L{ף,w'Q~OȺ-R싩6;_LӒ.ibzϞ s6Ӊ-T$kLE-{ G)9}X ]c-qdrՒ_u$h-26MA9SmSw$ J֐<ܯ=83qջ˼%=嘝/Yv"SGI3@?gG'4b&U=IzoV۽$6q3 KŔjI}׮]c禩_kL@-a着*-lkk۹s'4`64; vY{G)VYk%''ܵkHqF8ɰI}hk$}_,{x";&H Ҳcck4.n[ q�� Nz q;kZk.+ܪg zSwӐD6?GGoNa|xE]S"! -ey-])&ħwKBƠMAM0MVSU/\|8RwHڜZŖ}crҘb͟5g"^.$)VJh\ҎɷB6˷/9C1ٍ<N̓"ȊPm'1Wg,DQ8in⦞% 8I+{oxWWWv| 7`/gx4HÌ[Tbqىi6[aG477s4"/=rX[k$1ʫlX˹qs=544'bMGa߼ySKFɤr*#8IFr'��'16scߣM땗4lL?j<edFUW'!Nz"_)\!Z7v0%HyJ)7QSVxbk#+F .ZTL9fg9 H-QtrQwrnsj9+wD+kl5ؒ7IQ_:eXX]*>SSLҟVVI؍c7k~IK=&;C*WaTEk눷Ln[B2oB7AUn6w<$ ; nۺqeIC%鲉[O5w}W1}M8slmm-[6am\l:i@+hߴKdaW ^sw%ONȎkfbbB2>K;1kDN8qeCiwztLtO8)3T;=4y ~k!N��I!Nq8{¬E~8TE wR>O1EO\ b%]bk;w]Ixb/8d:fS$^%U"(/)F<LCM-gA]Fmz+nC[T)1Նl~DBuZ3ц zމ˼-rW<Ԃ'jk'Kp~L7;_3BlJ+o□&ndI$N={cҹ7+sgsSSSvk0vF_>6Yh ha;#~ώjOC***cȑ#:gh # ۀoI|ǀk($6~Ʈfoxo-I��8qNN 0N2=Ŭ"gP'kttє)f='ݦ%9YLdJNR[ĖF].@_]l9x%  dߜYu6u!E[#N&3OH`}:.7Q6Ɏ!|<~olY"s^ZՇc*DRbѮ-!~ss7&m :HS?*t/wɞilɛl_󰫻[>lnɀA~QX7*Mr$}7q &n9zo⦞%% ^q|fUcL+V g)˖-$cccr]QQ ?0]ZJ$KKLRjjѣGLnoݭ[G1Ǘu… d@˙8iZZn=18^}ԉ;H{d[ q�� Nh})|G\^/=~58!Ayס)o84:_{(qFjYs;ۗH{ x]&ttl9#]']/#_+<RY/ 'SvTb![!gmP6|5KnmDnzΒOtHt:{݄<J]s^ݢro$Ńr7̶.8iP6q &n,Ie7,)ixI~555̯8vq܌]NH$*l.n+2a착~S-5?;}/88xEGGGhhwv.H2k„ *q@ZIeeeV;XC'c!y-g'B��Zc>KmW޾fNw[ew(H4hq)6m$QvͧDOI0x!KَY߅:%)Z.\!\):)>_l鷊Dib#q9l[|9RJl:FPӒI$O:B:/=1,8wk( iώ;nNrebc){J&Y)9.^8r݃&w+p,m@4ɇj7 YP% 8I.]ߪkְ72]kkkg1s/ٻZjU_O+v6<Ҙ L2E7vI斃j<\Cꝣ/""B 0D6kiiy7}?}4SGG2Z΍b 49K_G^=11&L=N28 ��' ?ZR@## =lWhۃ,>$qRA}My8?+o$.qr7|5!s wq+_  V$J: -Ҷ>#]+aB6隆&en 54o)m8}wx2fRzJ4Ś98okH.fh3"q 0/Ko!1jOi3.qu\uZ1^wAY[ }-W$Ֆ% &nz$&q5`bb>b̙ڧ۳A�jLMM 3_x\RR\fXÊW>|0{幹b?9,anyw 4_(wx29xG3/dXU$-Z2A"66Vh؋5qRrr2ۇ}ώ`RI'��⤁֪G+E1V^KW=]>#zOS|A\;I,_ꔷAqd D(QzF]<I0ݐݛ5>{nӐy.y R1}fܕ%|%}%SF'[=#ݤG1)&Nyp993f!y*f9Ё格E 9^#I=H"m -a 5-uɚ$ptXN`2s}e ڗ/Nq¡mYR'KJ 8gQ_ё;ýW1Px`k]Ч\=7fjjg\cm4^m611ޡ2ZMIaיfMϟȂfʋ/D=2ŏmW^yE\%N"wHS9-2:Ik qR_}.AWwO{4$��@4 -m_J#ʍ?@/> Q eTctҌ:X1k0NR?]H%8Z3'tSFlS㛱7~5Mm \?MP,9tSWŹDiV#ѱU>bIjkuo $R9X.Y4:go?_%$[3'Z(aM:;MS ab7qkCH7"fP<,c bY=g6jM_*+p̶qᛸ?MԳ'1ʖuuZV2]h̘1*/{=;(ѣ̮^,4 6011INNRHMMeWkVe\gͼ|oN.mmm?L_, 5II y@& ɓx+VUM ̙3o޼FAٰ㪁#*Kw8{lfLi68ɀIv(/@Hs͚5cT{c58>Dx &/@ `AT ~k!N��I-v�:i>G'MZ̜:pi$Ih0C7j{oBҦ�mynَ_҉rn2Ǭ6/+liroJ4&}d?= L<tDBk|&-bk٣h[yZbTR~R ix?\K]TElb9CdML{NrY^l'%ɒϒn%1AҰ5U>\XXlM:;d׮]䲙^tnơb*;i $ ;&00p #jl=;IxicL5lxww5G!b(2e I׵kQu48vZ_}4 8i o-I��8isgIi?z-^7qL/Fķ^0?n($n6wFUWjg7Iz+;} Nzy%ttt8d},aI9[;LikWb(PhRo1'N")Z}F,rlD|,DΤEܚil#_hHV= yHN&7;4Oi\-Y&Jvc|aq*kz\kr3+p̶^q,i6qK7E 8\us/sD79~Ϟ=*{ۓKnrmEy&;^Fܪ*333s?oΌ=8`'74uuu9;;G|=\jH$*G[;P"qXw(0Œ%KwH'WdX8RLmc148R ڴiz{H2o⤁'��AT_zY^f}^]<0 z?m]DiqAʭzK,Lm5.c}"Q5Liwqcvy)VoD 8fY5r%nt,6˙rk"3b}{,;i7$-:x^21}_;(*wIihviE;u[_od}beč%e% &nJ,)!{Ib0rFk׮*uY{͛7sccc5.#m4LKj0fAjjjXXӁ-iXtt4i$sJ_{鮮7e@˹]ͼgZW~$Q5tyk!N��I($Z߇幊:,Қg8dMI6 :Tʜ SR4Up<龇*Jlś딽S[4$fs%&Zb%f- ō)b8^"@x w^*uw:,p0A:H#m&-z>f;k|ō-OˍdIK%鶉6q%e?'svv֒aF[,<$��@B!N!uKeCdkTE2Lis"uCOiivs.~Ig=!o=-1?.dv`e`RLԓ"ȣ,n)tvl M@ns%rTdIͤ[8i;gnWw=/.'M͒+'=vZv8;֯]B��P(I0vQmeX'[щw*-9-Q{].ZFȝz\i2Zbӥ}ѕ.L`GQO~DHS$z6w|vOi1U݄s8H y5KxkҪ'Iʒ}7, qp,C&''466]ZYk!N��I($Zgsd4;z$K*q)qCes3Z=eԡ뵋<E] \G-)%O3Cm[v#n1")VuRdI%I_< HkIIDWKR=|&q-CMRz8iX8x 2Ç{yyٳؘ}޽zk!N��I($Z)oYWn<f6fҔsfgNM_)unQn.tuɞJ/=U+)%we0-"N*YH{*#'l@"钽Wf)>P?U AISHk'Y-xo+Kvtblң85N4 &n$:HϢ$IWg1vXkkk|1'��$ q Jt:ݵ'TR$Jl46}Eڪ�Nި]&ʙ^Ε8ђ2]rl:W&>| z7?#$r~Ƚul3.Xy¾$NG- <5UU%6'Ky*MԳ'ۛ) j#TnnM6nܸ^xW_?yUU:[ q�� NB'ʩR?ߛlItd*1ɱWt<a^[b7-)%o]E*vWMʚ(<b#rV( _Ŷ HpvtΡ-T$=6q&n)z-w$�'��$ q mu:{}&7NR o)VmKODIJ`t#lk2]RLs]E?Vϧ1dFlqVX)Y{ù"r{՚/sH$1* O"NRvM=K8 �'��$ q (oeX;&]=QbB%vM%v\wEj>m_,Lfnf)V^)rvqo z},Y_pwyJ"HŶ5I&ZlyY(,í' &n̒tM%HRT9$�@��P(In&i kk*MJ7Swm<gcջ3t8 :~E0Ͱg>9eܛMIm]&"1ÑŶj,oUJan8I{7q3 K8 �'��$ q ]TQ ;dO;NVbr)GU:nޛ"VSNStq{ R+CiCV۲3Sm{R$ )|_q:_nfIgI[?Y$�@��P(I0\|rpὙ(WZXJ.u_vS͉=I81z}na^,tV\w13MXV?KF7P]_~w/fV[%v,)߾;ȳK ����q 8 n*T1@bį6]D/~N.={fSdt+[3&3S䬔{ƥ/Ont]*j׃[d4 Me޼yF ~fIMԳ$;pIY/1� N��I($x̊-޼dTr%X _Dio;Yn۠?{HgS$KTe̠$k~b#q$ iD~b\UCK@@�[+Km7M%KQ??eyvx�q�� NB'REOyQՔK|4%R3ܸ&gJ}p4C=]<QMHd_}66S.Y16CG1H(ZI-T'¤ZZZ哈o7x\%AJj.{x�q�� NB'p%J'[(Zg~H],bnl[r&fi7I sEdI{WYr 4~O?D0Lϩ7KzqXޝ˾cyFIIIxq�q�� NB'pEEQ&Jgr(ˤY$>&Ygy*%6vO)E"y-Zz:QK6C_{\[T3Y1Y{տ]6K:<^V�@��P(I0tvS ԙ\[*yKV9Li%où;n"z}n&ToKn\z&Ěol+"#lVܕOq<l4kW}n3T%"Kx9njQo, �'��$ q _z*PN1 s|YƖt�4Qc~ĉ&Ym(L}!S$enbe$8p޷xr.>纉c' ɧʛ>C# X8NV6'Ky*6qʻs瓉 ^Pdx)�q�� NB'A柫%>mP^ٓ,yLt, 9񾋰Όnt:Q%i ߅&PC,ؚm *djc؝Qz+@9%:0M*7Tf~褍gBf oYRTrO_Y_6 ko�$��@B!N*eRao.=L;G9 N")#$WaMv*۷MX/]}v3-It[Q>9)VFU6S]4�---NNNQoc<-]'2.W-z1ӋWmcUZ??vvvx��q�� NB'tʽOݮ ܄YmYm.?'uj}hOd^яWKg8 Z:+7JwśKTY~fMRi[ ۷oY_6^;<n{jz\K&n)oeѯ?'By-../� N��I($U*ϛa12m% )vu~s:ǸL}aw!XGGGRRҏ?R_~‹| 9k7LXul}i՛f?~Ryaqqq����q 8 FήHA?ttKbnՐhEرB$MÑYm~D5mXqhjj~ǿ7|h/7ocbb��$��@B!N'<ppCSߛf1Ilśl͟aKxJaFqCVENZZZ?q/?|7~i2g}'̘1܏9O>ԄN�I��8 BKMc1..F|7X[*<iȼX^҅h*Rqd2�L[�I��01Oї(J"I0tRr/ Χ��@��1Nag_F' [`$ߡB F c���q�� ;&L Wy~!0کM��@���;@/,@}dJI��0'��*ԧf%dte1=��Cq��x$: ",P~?5;<�� 1I���KJR�<{>W��0'��)IR%�O,WC��B��0zr'a 7gT��Cq��(Q]G}Q\dEܫᄎ�!8 ��`pz=y!�0gk*E��PA��0SwkĜmϾy �� I���A,_$)r �UQeA3��P@��01TI5z`tُLA�@��0hĜѪ2١: ��$��d@?qĜ',>)I1 ��$��ԬKʋ*f?G|O��0'��lĜGXgS3 �� q��ȶN'�<u_Eo� C��0u$u0J64˕9a��0'��`\0`O*I>�8 ��`>ި%%W't�� &I���#'9/B�Fl?ks��0h'��Hm݆\Rb HސϾy�� I���#R,ߐIRB�FJ?Sch��A8 ��`DZcn%%jHebg?2��q��ȓ[q ꘟU1`jkLvh[墶���$��dkEr@7+sDÜ|5~?5$sM p̯DIR^�A8 ��`il/կ$-ˬt1^0E`r;�8Ki^M}~_"�� I���#Lu Xȥ#k-}#hlG3}Ü|ggy|g=Ieۧf��` '��0 n#\o+Xu7omک}󿊾�B��05nw!ot'Q3U6sCw�@!N��Ivhݦv� 1nӎ;-I�A��0bTcgF.P`#yVDE3sv8S�`@'��AO&C�u:n3G B* ��O2I�����':N#�� N���� [W��8 ��������8 ��`����R���F)+����P@��0l$����`( N��mꛨ+����P@��������z@��������z@����0`+��j'����X��~5�����FtD�� 5I�����As+"�� 5I��������I��� F(����B��0pO!_����$��#KNU'ڵS|t*P^K9DWR��� q��QDMJ9^g"9,2E|65gNvй�I5>O(�� $��7=h^T+w+a S3;E� У��0 ���FrH.d7uH_2 BwͭwA]L~<}1t'�� $��f剞D}c0I嗣/FSA>sq+3{bX�� q��s1וasmwn�n*U?*s6*-22فE�` N��aȥ ;[sTfqF:`a#b11J-"�� I���#y W*sg5}7م^yndhP3sJ>?GuvZp ��/���F>o0.:x_OPIevK���8 ��`DR_I" ?;>l�� I���#Ry�#XmG-b+�� I���#,ki$핞yA�A��0RC}'AxYr?a+�� &I���#U}}%eH `4X|D>O�� &I���#!o=''n[g�AX~q�}�� q��F.u<%[)~C� C��0<%e~9z `8g?,�� q��v1YIS+tRTgd֎�A8 ��`d#ym6ٷA?�C��0ٝzrn 0?N*D?�C��0Ts=N:{}ڣ��`H N�� Ec_דojC�w8)>=��Cq��h$z7tU@G?3b+�� I���hO%ez.`4�8 ��` דc�F,f ��Cq��(QD_@\Rġc�FGT?<+��0'��{]ONJ5W�F8IX^�!8 ��` SA'Bs+e糿��$��Qe剞KrTPg?,��C q��r1Yy=ij�xU*?&;v�� -I��� d@g�<Y6ҟ}�� 9I���yjn =dAIE ��r��&L Wo3革a||ه߻� N�aMlScE' [>೏?��$��xB1O(J"'=BB����q⒒\S(J"'kct GᏈ��q�� NBB!NBP��q���$ q$ q��$��@B!NBB!N�@��P(IP(I�����q 8 q 8 ��q�� NBPP(I��q�� NBB!NBP��q���$ q$ q��$��@B!NBB!N�@��P(IP(I�����q 8 q 8 ��q�� NBPP(I��q�� NBB!NBP��q���$ q$ q��$��@B!NBB!N�@��P(IP(I�����q 8 q 8 ��q�� NBPP(I��q�� NBB!NBP��q���$ q$ q��$��@B!NBB!N�@��P(IP(I�����q 8 q 8 ��q�� NBPP(I��q�� NBB 8q 8 ��q�� NB'鬱2VI($��I��8 BGTUT8 B�8 ��'PƜNdKȠ:'P��'��aPۗMWGk֑rISoIHKyGQ 3ctF/J߂ĤF q$�@��'F÷?Zz㴏G@' ɀ^qSoyRYrI>FO DF}ֳt$I�8 ��'!NqRIM7o<IO\LM^C#.׍8ԟQ~|?k:$I�8 ���qhS͟L&8z&2`nIn<jFQ' ߿%x! HO!D.*ވ B1ek d-!+juU  (UP C( ))N!%-3s|[[0<}; ���� NB`'==]7v+au]O|"$$�N��NNByg'vIԽ?>vv�`'��`'%m'gJ~kN9;B"*?VˆG lLys<eJ?RN~^B7hxʿ6V[._n8x^;ZIKOny.d;iQl>7W)ORF+)3I`Q kJ(Nz 㔄^xzdB?j׵{7?̖<5W; ; ����<%ymc$]8uWg(ݮP^5uW9rs7iE-|ɣ|޷Ra_] /ewGI==خ*nYJz可8KN|tnr^;_.wWw;ٱNe.纞ތJ(H0JPII���`'=r_kw" OqCvz˅c0{5T^%c';Oig ܞ{N8z[UVԓ {ro׍m'M'Mv3I/;!1i<Zcn:ǝSaGiS=m?HQkj7vv�`'��`'9I0FigMiʈ[za鰬^`{9SܱuBEu. c;O֏b77;i;z>sԿ7Ki.@."5o6&m=;;)<Ѣ678vuj NQ ~]/nnݦY§}46K3`Ttt7WM88VH[香M2ٚ|k,ŭɧ0mPZkƃEpUJN1vv�`'��vvi')R>\lo"Kѹݦa؍0t.s_pk`نJ_O*+Lʺx8څe7(^oԟvvRL= ݩs5}orϾ7xqev[?t5[q5|cqM~TR04A_qQ ٧_3ÜdF ;NƟej^<vv�`'��`'9I<cޜ?regi? zXmZmPueRm,o' ]]mP}YqۭOP#(g'd$oW_?yW}585wvkdىbz|c0l?Jg?=Ä˱��; ���;Nr뜽Z`=vea/mc ;:vҤ0.ַWth:-N8`IL,s;{Ό}x;9u785\?{=Woi(-zL"wXGfxa'a'�v��`'a'vRvo-P?^0'4줖JK_^.ݟ2!ջnuq9}#9줴r:4>vRԽ- +G3Vܦn֡y. 6ʻ֞}vȰՏ Wzֹb'a'�v���vRH3_ڝoPlhJ}#3K[ %I]1s:y*acoll$TW+b;)N2zN{NY׼y{TY7-TmTҞV?G(ہ~@~ϵx$ӻlwYNII���IIt_omFH5I;mJ.r$>niJ%*~z/Ҙvґfd.Rb@Nڷϫ{nX3UVo+ӋIOjn7?\FN#ގ٤{NN�$��NN2$ta{oEpUl5erٚq4ca?iPf(ܦw6:JA$F4ziu2!a'e4.@~c;)N>;v7\'LvRn}ϯ73']Y=f?M*7?%bb3&+֞yvv�`'��`' ok"Ia-oQ2\н:jk/|;);$?m>vGZ}_ܔ:dLiVz&cBbϯR0[w#LhM>tpmbvҭw'~NN�$���줸;jt`ik]7~{G^|&Anr=׾oݾ5>\Nz%oowC;)$܎mytck\#d.Uzc׶n<c:N<KH;q֟Zji�I���IqvҬ]`"A}Gkw-7+soZ{;v;i0_%Wuq}LV ;) $mO.퓌L6ɏp>1z?>NX>]{~G5Lq~і#w;vv�`'��vvR|-mMWKcf:MHl;|OoӋLʘI$^ԧӫ ʸ! H;)~lc'%c'Y->+/ll' e|Ikڙaљf\g'=8Kcx9qAw#vv�`'��`'9I/&WmIKCs rv8qcl4}4ۨe\Rg_6w9<JU|n+M}{ww$xsf0;)b;ځm$0{]C'|Gk q3]oZ$6mc& =:|g[rs& rT�7=}”6,KȉwjxIII���c')o簨X&k"iYg$ML{7-2GZ9G&wԙU<kEIQIFm֙J<EElj˧4yz.:Ӗyo2NFuFcJ:No7~m)$$�N��$;I[va"b:q4M3g`[xĶユ6Ef9ց5Y�_envRdv3sCNJNL~7z7-/9NpQlN8q&seU]b<`�I���Ia~<y mL:ee+"6+rGZz_9K+;b/ PINoBLqTimL+]rqnnéfl4q<r I���P ; !$��$��NB; ; !$��$��NB; ; !$��$��NBa'!��; ���; !$$�����; !$$�����; !$$�����; !$$�����; !$$�����; !N�$���$N�N��$N�N��$N�N��$N�N��$N�N��$vB; ����NNB; ��; ��NNB; ��; ��NNB; ��; ��NNB; ��; ��NNB; ��; ��BI!$�N��NB; ; !$��$��NB; ; !$��$��NB; ; !$��$��ƒM,B>%B&?줢"Y#; ����;ǒ v�`�`'�@۷+8o{{?=kM~}���; ��9{Nh:uڻDUn@a||cv����O���wF$}\ƺ8 ,W֩����I���aMGacK)Ҙ3YlP:W��� N��Ft${rdAOeWۿ���`'��c:U3@95>ßS/'1���@���H6;Ā#g%SWG*���; ��ӑ_ŰI6.1l&����-���dզO<I�s����r$���ӑX>(a 1  9���@N��~:UuH_>yo|���d/I��P$98#3˓ZK��� N�B$%ӑ^ϠyyU vTz��� $��(8NQT+';}*nO7ߦlx-k ���%`'�@Aaur͎1sHgWNNqPvA���<I���Խ%mgr0cN12-%'>�������>گ.\#'$=`*}\i9`W dǥ_ ��� N��DŘ *ɋʆئ{��� I���,_NMzy"68Py@3Yr:���� I���L~d77dZ㔘\p~30N����9v��3{uXۿ0 iqJLFfIb7�������3 9Eq極 ���@N��5+>``2u�.����$I���{d-lN���`'��$9Y0*p`y�����*I��� )qCa ˫b!���U��ydm3zHocMzm|;uTD #���u`'�@͚0U.`~ h/UzOkl7����v��:-y-LЊnn=>7'ZrA3 ���@ց��mr M)y:��� N��˫> N+F��� N��/9Ks@NPb ���@N��-Wdyyc����`'�@rJ}Q9#a ���`'�@l~[# Fzl_ F��� `'�@^w:h9ʤi,g$����2 v��riuX���0I���������$���������v���������; ����������Ʊji:u]����v��M^BM_2ss>] ���(N�|IZTBn .\`����Dv���<+>P-}%�����$���������v���������; ����������9L)D �����)I��y݂:\~A\Zge ��� I��y, Wï!nO.Pe����N� ­Y[C}Q=}Qm ǯݥڻD]���; ��2%#)`P|D���N�Lr\$ xQdyo>`������a^b0 п ����W�� c='Wi{wHF y$C��� v��dջЮ[~uX)l \!���p; ��2FquLzf-;J6�ʑf|!GU2N����`'�@fHL.T\e)26Hsʯi9ݵjAF ���$�� - bm9=3H csc+RH|K��� $���'Z>w&@|}D]FR yGz ���`; ��2Jw dU&���v��d9�'Z-���� $��2<6}:|���; ��֫t_6�95���@ I��)z)v7$9"խ (M4o#���@ I��)/H\7*UmG�#꺝je:roUe���L�� :ZNH!yWbuoEe۵_]^uVMgD���L�� :V|lU/4B1ilR33|4.Qd\���t�� :FU3GN?pM|OR}[���N�ص?5U꼷}QݛVoT% �����|=\>c a8|T[iAF���@��Qp;}HqNekf*!����I�� 0 ԭ;0x����I��~D~oӑ {PX`\cc�����gN#AVs;9n_jF ����; ��s93ԑ|]e���N� ӑ h:Kp #���v��LG#ꜥjo7���@!��i1ӑ 8vR]^X5h/��� v��Q3 g c ���4JW�K߾}I"b&[ϯF~H#7:M=:uu2i4k'@hD'A�n2Fj?p�\F�H#PvRQ�QC^2)R!@m5SDg0Pb D}o'!HD z(BYm'GDg0Pb D}I!='BI!$$/�"Sy"DIP#�vB{*O(> jh$/�"c'!DIP#DDc'!D}; !O$h$`'!DNBa'!DDsm@`'!HTa'!�NBtO'AvvB�I<$"�NBt'A�vB{$(>"B; !͵%B"Sy"NNB�; !='B5BIIQ_�`'!DDⓠFNB�; !=vB5BD4vB�INBNBQ_�vB{$vBD4Q_�vBtOvB; ; ! �$HTQ|a'a'!D}!O!"; ! �$HIQ|IQ_�`'!DNB; !"; !D}IBI\Pb D}I!='BI!$$/�tnzL u<ԑf*O(> jr5%jӗ9ںճ簓NNB(/ҽWKu.R?KvAP.E7ߪ/PLUGJ|\p uzo$�t;i ,Ish~de%*Oj6ϞS꿾vOe/_?lb�vBI�I(r1B}o> pz3ſJqKRB}& y*όT7D]I w+-b/'oRޝPOy|2Z>Etqa:d]8ő~:2%WP[Na'! $?B?@~ڞ_@c|?Ѣ@N\^ivZNCUjDq[8q6{!$=]["őCD{Jۨd/;J,攳Åw ;\n#E v`'e+W^/Zg\dGa$. -NS:8| xїWlM' 6텰PDth<Qy.9;惿G)l;Zac}T]w^I9tݞ%Fj$N AYCs<L2&!ҽͶR؁;'Bs[}Pvʞ^@ߦ};YvC.=ƈ6l{jNanDžuޯ]w^I9tݞ%Fj$N"b'a'ٱPj;p;@<s7YiSŏ1n/*YH8<{xra{}8l{(1zr{(hn$N; ; H'vRR>ͶZ;pc!<sܹD.c10f"xCBI("z*}׺6U,l{(-[Onl׍ĩb'a'vRZJq,eD9ZeurQʇ6+)^OaإuvߡփҴ7?VF˟ϯ9+!^*ߔ8ISsMyj{!mL. ~ӽ=И {6JSx|9g<O~(} ++;6 [=ϵ/ __^oΔwYzwoeS;OT5tlC)1n; ;NyD0mpCM":fCicOn%l俾qI E%F"%%F*1�;Kcf(]|zM?^Q)E/D)."92`TSWGq(d`\yR8)޻F ;?xZ%p.1##}AHnuǣ':.X;pHY*o4en KSNp<3i_"/$7afi]p/c +qNN"?쒮jeR1)2m,>P:pѓCn!.3[_DVb/,1]_VIqgL ]X}97OߦC'{咟{~ ~}yD!^ZcsrqGs/xG֔4<[$i衧}Ϙ(ӽ6ۙOžuc'eyme9m3һx{#OTb&MZqiXregPcSrԏ1n〝DD5ΞAVVa"OLuv\TuGf'/B\gHN ZbDP_VI9L% q37!7i照O=rA}/R8XX+RM>(NX<n{5W7SȞ31'~^u8g2vR'*;1)-7=hҽ6 ;pCW\;)7ȵg`R\}'vn']R󕱃gU ! Y@.1&9Sޓ[c0{Cy?[̉ vP&(>EmiP$\gp〝DDGѶfL'?Dv,~k:Cl ĕzC\u %u~zrlqI"#I;)hM}[%v`'9HĹF|ږjt49~aR3n^O@Zj̜l[bfcZw'H|~LN 1?,^_֗ {IAN_ [Ͷv׍M?9\ O ĕSp}&<rɍk'igjQbeq}f%i}<w%^g)Wv-2Bz#w̵l3 Ft/*m=4޼u]m ~@\oX7ԓۻ] *]b }I}}qt</rN$=J[n8榻G;uGHWoy)ҽHyN7ߵnN@inݝ]CnczӗU w oQڕb?6^ߧO N], zvKEGY?8xN]mZӨ<o*g@pQvv}n1=}MAmz#$^޲d\IwR3%qE%Fv񌸾ȕ; ;]5hr罦'5v쬳4m2_^dF*4ap@yXGA$ GwELfҠ﹛Ząc~II _&X[͹5K[C�%:"kTN+<W<Ӻ-8`'a'h!ѹ0˿$9MicNJ]D;)ĥfKK$q}+%v`'ЫKgmMK>>7yRAo15vuuc>3Xd.5Z]3l'_Nm+Mpdۘ}M4+'2+Ok 7*G-!`<;_Kg8Qo vj'$$":#ݼUΓ2fT9.g#GtMLuU 1k$[HR3%qE%FvR񌸾ȕ; 4Q'5=|O|n1-2n`S/ym+fO $v^z^گtCwЃq}7q5ͷ)vQ|kCfۏ= ]BبkV:wiq;)8`'a'G/[[w$׵ѩзx4_eN z8"#I;)xF\_JIZ$CzEPg~|nƍ!Sb'ȸM@{֞~ČIAx`{pۘLIM"ϞS{L}yzӵ?p@$Q0da<ky{wޏܗvRqN"#m"y5&CG3r-ؘ9,u;bN#.1]j$HN 4Rb`'vn\uJ*U& `ϳ{]yב{Rb-_%^(^qۺeq4rlK2l'Ϯ7Uuxj 'AAl?Ѣ }vs^c'%,>5uWۍהɶ,RO.=\;{y:( WVeN 1IDtLmy[7n.T=\fdhp/#//1gEI s[6;o1;]{#Woͮ mJ_]F7Ng'9lqn;^r?t1 =Y}NwOn?m<Co1y鴲or|sug<.Cci'vYDהYfcc":]w{rmm?}8"#\}n<#/rN$WkY~y^ϯrQ~ݡiOw]LjMʜOêf+O|'v'dχZ켗8.?t1 =YNkOnm<C#[Cg78áȻ1(JA׽m盥-4IƁ;&_0Oih?ړۻc,B_j$W_ψ\)1�;Aգtrȷ.*6rӠ ;^7EaikqE>}iN4OHטlt>q絿wsó"zISbg^.6&9 ӽwf3t9oE.0gE.{^rCWۊ|Ϝ#gLp@DDG0͙FN_D{N_OnmN }8"#\}n<#/rN$\lҘrSKU?OT!^:1BWT[flkEM32;YH4W_V[p!~A^Bcn9ݻNGOn lSy&?aDgw/MSc{Mg00%A)$1npLg'O$":-~U};JDt#ڣ]w:zr;vNf;f' }I}}q=QRb`'vW=toP`$i֮lVMjG [5w`eD\g+^{,?4썛}Z}z3\)^NKF 6 ƽ ɤ<Y(2~by2.U{K~w] en0nm/Cpޱ]w{r:plMl@mynPfȅ-V7FEc@/e~Od\K:ӭΌz(>FϘ'<2mDtd߮;=m;)fK니KpE񌲾ȕ; us3E6j?VfUfv1[%r@SEN+eNҖE4n-} 9}mx~@˅н$ JNmOnw6T귖hS$;Zn?m25V/efU]ƽ羕 ̝B'vuS{c[VQF]wj{r;)KЗ!d3"'J $Nr֫+ǙM Rse9#Jcǝ4Rkpne y"J$пmf;O9/ �89r=uߕN 1oAvٞ'8`̭>܇pLB rn{]w {rW,f3S_ٳ\n5#}Y<ʾQ| ͚hމI6z;)qN"mBIDtmNaO}_µ;)fKA$Kꋜ(1�;KR)UR-7iD:{%yI?XCʕflH[9,Җǯ?7HG\;kxkiCMxjub/8>$ V׎[?Ob4q6gaNuc}豯(̴}7-2ו8P|b'D4خ;U f;{ЗI^gT_Ĉ; R)o>s eRkcq&}~Y:hY5y,='BI JB/(1/�;ܤkrIpɠ%דBIIvI%`'t>Siչz=I!$vvRaDn25I8'U\3z=!$vvR!DnHE.w<i{3zDD; !T%`'eiD.zmW/={3HtP;tQ93TǓtNBN*K⼬/(1/�;EtO'AvRIQ_�`'!DDⓠFNB�; !=vB5BD4vB�IBII! NBtOD; !`'!HTa'a'a'!D}!O!$$/�"Sy"DIP#DDc'!D}; !O!"; ! �$HI!$h$`'!D'Sy"NNBB{*Oj�NBtO'AvvB�I<$"�NBt'A�vB{$vBD4vB"ݓ<NBa'a'!D}I!='BI5BIIQ_�`'!DDⓠF; ; ! �$HTQ|IQ_�dN**]![/+i)j;F(?":i! ; �A7. oA i4N �aׯIo߾|�)�\F�H#�$�����������������N�[Nۿ?!|uX}rpM!SQ3| h���(,��ZW ie;r,7ްQ- ��N�[&S:r:gic'^� ���v�@rE)Kc�h�����������N��������`'�������@��������� �I���������$���3/c' ���B; �� ި֪[TUC���(t��Sjӗ'DFqi']e|k#g9���P`'�-?!J׫f{[k9nDZf@D��@�Lŧ �D4���@ N�[Th @D���$���������v���������; ����������������N���g~Y~-#����1`'��GՊz}&;Ӌ�����`; �� ]{[1B'ZrթKu;$��� $� Bjimgh����;I��yEr^ �D4���@ N�[e)~� ���B��c'&�h�����������N��������`'�������@����@rE_P�����/���"I|<KOoy0;���� $��(h>5/3<{N}qZXNS�����; �� ΞS.Q?`����@n�>~ Y����`'�-*�h����WS�"��� `'�-G?���H!I���������$��e!f����@`��� &ًRD ����N���ՅkԏfV| %d�������^\[9tuA> ����v��@H����@��A�����9v�@rW'�����); � 'J?L˩�ҁyjD4���dI��ljYR>`jY|;$ƪ+ zngj"nS���v�@N2gg,= N]CtD:mys1q� |+U т_C+{˘���; � '5(>D( )kN^*'ZldR>iU '���$�\e|^: 227}b^XMҰ_�6~nFe׾hL6w?p��@zN�U6|bVB ׾mwg,3Ԏ@bl9uЌ^n5uc ���i; � W9}F_f7cuU#g1z\Q9,YoPomV}���,\PLƯ}njbi>  ɃkWY e���N�a4;7m*6wҕ9+ZN1V,vVc[6mf�� ��r\ ˄6]9>L ���8I��Mӗϯ0~�YǨʐ]��@D`'�<ß Sy>FVi'% ���@N�ymSynFZN2r���I��9ω{<yh`z#'İ��@t`'�s<1fD) bͷ"2 ���; � w(@ٻD=cV@lD?` j˫0���$�<a|sz=9 }m{YZ![sb$���D v�@`@I],e 2 W&j߇��N�NSV#g1TKbHdz_vk�� z��kW+>`֣Aq;V0N�����# ;J-@ΠMXв ���d�$�b"sی@.WDt6��� I��yEӗ^G!cTkDW60<�����9WO.`l�r;\}��� I��ƲΕOD rSꀩ\���2v�@qEvTUճw҆_f;vRc���; � ^y֭cT }O' FnͷL=}���>%r 7R^ evŏLL&˫���$I��*^x ܑft~c'���̂�lĬ<wg<rGTW0`r:hS1���a��gdwQy`�KvG{ ���0I��yfj@>|\AZH���@Q@XK7!k~='5 A22D4�I�I"b&d3!4BP vO.ch �H#�Ya')~ 5{%c"/B&[AP>Et%BvB(DԐJZ !@]ӟFV=BP#'sQ_�vBtOP[?-j�NBtg"mvRy;0!$$/�"c'!օgM_a'a'!D}; (>'ȹEa'a'!D}; !+Z]F; ; ! �$HI.> j�NBtO'AvvB�I<$"�NBt'A�vB{$vBD4vB"ݓ<9yogj�NBtŧ*^jq5AvvB�IEN3F; ; ! �$HILz:h0y줺H3AvvB�I*sЌ j�NBtPvJ/i~!$$/�"c'!$NNB�; !='B5BIIQ_�`'!DDⓠFNB�; !=vB5BD4vB�IBII! NBtOD(ϳԽO!$$/�"c'!DjbF; ; ! �$HIQ|&N? j�NBtPwC+iV/a'a'!D}PԦ/gRpc'ϾNB(QrGvw'ZJص_=тv�vByT6) /H1Ɋtj)*Or:JNB/{9ރjꜥCIa'`'!^\\"/zSg#a(U翣~}!e{D+#gB)dR fB4vBIP01B}o> nNU&qaZ9~q76U*H+<;Ayne)kʘԜ'vIywR<By>e=kʔkLFWyo 425L5opMȆkI; MNWyF\ Hm/1II?|T}yUŜp7cJhZ B9Oq[8q6{]'v-W~zwۈH#ZV~_ 9`_*Kԩ:<n#E v`'e+W^/Zg\dsG{ZEJ. ա+N߮3O/l'܋; emD6ͣ_k>>47%i vqAbmhs祝CQbNʉ1N줬Pi~94W3t+c.m/4w<^:\n*\/>Mi'ߋ; egD^oӾ,!uU Z%LMYx0ݮ;/nϏ#vRN v`'C/׌6Jmx ڮ3y6E1[ÏtL;:, =^WkGͶRہ;'NT�;tyb'%l{(vT9Z|\"3{Q|fN^/XN"߿Jߠ|jkDt*#:Ͷvv:Quc'qIIeR\<1KQ*NkY\Ԥyʨ2/)rE<(v)iw 4 bJm7%NR\~S~AtG˷6tC4&~9ޭͶс=aʻ]wV'?InӕUc|YMj/r7gʻ,;Oٷ2L񩝧qa tR!Ӕ y1VbɡLGk|O$"U NRߦxhtt''N__$Ά"#\}#}EnI13ˮp{u=|jO㔢]"m0*ةrAn+8F|2]Q`y ^)_]#b<Yc] \> g${8KSxzr{[.1 uͯbvJ[fP=ǃ:sE+B_|NfV*K 7qz]?P弶1H<+ QOohnekƐ.̠.atV+IM~ic"ڻͶԁqy~uGi'/B\gW_$Ybȭ; \Θ4!D1*snuMNJ%?3@1LC8t^b)ityICO?,㭉@1 4{?m3Ձ;܁uc'e(D9m3һx{#OTb&MZqiXregPcSrԏ1n/|侘8pӂ.b N*N;{YYEDm=xڮ;2;)D}8E%FvR#"J $Nr)f,Y6'iFoaM[=/<5|闔 :{LɨZ'mAqqjE9)TZ#ʼn<g<8QݡIqmaͼ| $ G}`nǙ ɜ]wIZe|e`d)mk@~%Wtn Ms=rl1'&\AiޚB2pg ;IkhPS&NCӆ.FN"h[3xClgw<~zrlqI"#I;)hM}[%v`'9HĹF|ږjt49~aR3n^O@Zj̜l[bfcZw'H|~LN 1?,^_֗ {IAN_/jM19ܭdiuwN9vRn0uQ jR; ]_Em N*"4˿7JCw94+1dL]U|n}lג*c(I;Mb{EŔIhCm3x2mw}-~kI6[m oj +5HO_KЗ//".1gEIW)vqxK_mٞbthhcݘztmLYE3&vyws2o'O#/wrtCwЃtz؞##MilآȺ[˄lT`Sg޻De :$Q95βڟ6#ެSe.ֶmkiT7t3 Rh %i'=7xs&vvɈ}n1=h.:.DxU,MQ4:!6 ΞSINmZKЗ/#//1gEIe/@;;5Nߠ=dgi1H"3zP5+3e'>:.g%ć6&9>nw|+nծۜ\Cj5 P/jTN+*h$.b�@IIDt#ZHA:wthED'pwpg'"R3%qE%Fv񌸾ȕ; Տ3 嶁%<n)7;?^㺍1H?2hLzuZ'w&8mLBr4^\۩&M[ɬtם[?,Z|sCD} sR럿pL3f1ޚNju;IIDt#y'ęr\GD,|UidVi ܬnA/5C_G\_D_b$i'ψ\)1�;K}"{?\CG˻y3Ђ) 6<"vbato@Bka;)x5JpLA?t1 =m6кPlIH%4ք)>t7vR+IIDt"Z嗭-tr|DDdrGٍ;\nk4MR3%qE%FvR񌸾ȕ; In:)FԽבCN2qxnOƭ=`͉Z7.5)r>t1 =IN ա^\QO .N?gRxy'cXۻ2,IzGk:s^[ϔqnjCIz7wjMD/%~*Gރ. LӾC HKp/#//1gEI䬛,F Gy7l^W^ud힔v"sxܶncEC\g'"{k IAdzMkUwݫ=^} tt3E!^Ӂ?)h|׻NJX|Zk뮒)]E4cHj.Ý=孔Dh+NK LnIDtߜid#o1dDN ߮{撴_?.ۜx>u4vRKЗїII3"WJ $NrЄ9-ꝷԮ둫{fWiu|%.#t' r鳓]pi8[aۘlHuk=3:pm<Co1y ~:[)[884lߛI׸ϔ?h-kڬxl7=Ԯ{ρ^mm?}8"#\}n<#/rN$WkY~y^ϯrQ~ݡiOw]LjMʜOêf+O|'v'dχZ켗8.?t1 =ٓ}NkOmm<C#[Cgt]oJbۊk` d"ۡF D1~(g Mߊ9,Z;Dt^0Oi5NkOlgR3%qE%F"xF\_JIk7]nFuQMp^f/ O[+K[6xpyFl϶`<N 4F.ο]>r?t1 =Yu'Gn6TA},r1?[E"?H.rz}:Vx{\ ? d"fM*Q| jHoLEDcavсۭvI/5C_G\_D_b/gEI+㟭XӐQCnjagq)4K=;FjӌqmHַi[f8 }^ٟ o nvR4]8/ȋ;:\cL r֦{vi؁ۻ6gs+Kc }^/LIP| m~'\ |-mMWW1sBNN"cS.6=`._ukם܎ζIA/5C_G__D\b/BgEIf`.7a%!X'IZ{k/lZAn{9k3XQ<5يt.12ˏ*3 {ft_z"WӒтrq/q2)9i(_X̳dn^뒟%]h<'B{+ik˅=$ gywlםܶ>lSy.>,!P[nz%m 7FEc@/e9A"׸t+>nA3o' D-FC[#f]* gT3  %:8":vlם};)fK니KpE񌲾ȕ; us3E6j?VfUfv1[%r@SEN+eNҖE4n-} 9}mx~@˅н$ DNmOnk@m<o-!ЦHv_6V2.rcsJMfN?' s~G'v|D)S":]wj{r;)KЗ!d3"'J $Nr֫+ǙM Rse9#Jcǝ4Rkpne y"J$пmf;O9/ �89r=uߕN 1oAvٞ'8`̭>܇pLB r{k:phML)J?S΋ Q Y.7۾ެLeWWԫ(>fM4H%A;I[sa7um1S9(>h"MQvYDSؓ[vI/5C_gZ_$YbDV_DI^zm2N)*uNnI]%/My2T7cKFa<~UA:ک^^KRmhZS+{}iC9&!9ރrRP)_=S?RֹBs=E\1SVu@N"h"?ZT!Z3|챓B_j&yI"#P}#"K $NJ}tHd13IծřheWdexHTa'!?3F(1 Ġ�$r5+>$'"\ONBEV|=~mu15BII�IʇZ\\NYdVI$*OlO!$^w}AA}I&S4[xp]qu=cnm@'ݓ<S/~a'a'e8 J N"7H$";=_yr="Sy"⳱I3G 'AvvR6\k}AA}IYQ}"^K^# *G*/l $c'!#gF'AvvR\e}AA}.=>EpTBQH EXDz-EDهRz[kh44*5 b /5Mi*{*fҒF63={Yk^̞7g337,v%UD:i5;D�ID=;H)D4;H}{vⓝD$ID�;Hg';HD(1`'t$b';D�IDҽʓH)I$"N"UDw5;D�ID=;HY>-D$v`'I$"g,-& j"v;H}{vQk~pM,ƛіmN"R_�$"鞝D3Y N"R_�$"鞝DDu>uUiAMNb'/�vtN".>5;D�IDҽʓH)I$"N"UDOAM$ID D$ݳHD�;Hg';HDH}vt/ݫ<:|uG4SPID D$ݳue[4/mD$v`'I$"pDl'm{UPID vҘ1gW|8vL<&5fyhڂhCcsh񭂚h#7J "F }qioih,A �Бv8�Y9$'$�MO#>M$A �B;������~I������H; ������)`'����� $�������e@U���&N�`thR4/zY��fN�`thNZ`�����,0&<ՖmѽOD{T���4v��Ţ%EAv ���t"$��:^W'N#�������������v������RN�����@ I������H; �QΞuk] ����; �Q3/Dbd0���I��t =>ݵ;:wa4enk���M�@Gx3\��N�@Gp4��N�@GgoF���; ������)`'����� $�������������-a���@vI��E] ���2N�`'��qI��vG,ΏE]��a'�0bl~>^+n���@N�`س7ZxK4f��`'����� $�����������������v��N]��v��=sDG���)`'�Уlx: ���RN�hmFH<=��@:I��- k}`���+a'�Vx327<+z5�������������v������RN�Qڋgu<��@N�!x3:wagh8Gk\.X��QI��4h|_uD&LeCovc��^�@C ӻ]Sfa|��"$��Wbc%hw|4oeN?ыۇl-S޲��Ћ��h- J/L欫G/Z2wK)?��@/N�! ӓ ]{{]{Fw#��^�@ClxdԾmA'; �� $��bݦAKukFxЁx��zv�� 1N=\yW.��"$��)so|i���H ; �%S?ծݝujk7F,y!=u~k���@CT6?_R5 /s򌸫wGtɲt'˼���; �nMU;9ٴ܅)3n9?^vFWDVF V~V8[;@TsmgoYmjG>ʮ��@=��hZ-ujz̯-NY >#���s��hcs~+qcFXPU��s`'�W.ҳbw7j'=���@N�!f4b.Zm&Ln'#���s��hlvaKqlvo���$��܅-ko /)ώ׳HТ|���zv�� 1en:e=oe5{���@N�!귓&LV?駳|m:;o���@N�!NY8{&k'u���@N�!\&G煉zzs<G���`'�.gŷN:vF?.Gڊ��հ��ZNZܛ ���$��}2u~Ƨan\{��F`'�vEK7%賵s?��`'�';,3nMl{5p/dmA���-I��dg˶{eͣ; r��@oN� ;C֌}h:e��� �@v:X8UEzJ��ނ�@vm*X*Gk7Љ?Ԝo��@oN� ;y;iR;GSƧ?u��@oN� ;w={IϼУ?3hI4y��@o +'ND $ sєF>~gN'0107� 3!K"a|єF5`b �P4fLQ ˧c}RhlAM4"zӈH}o'oQ ˧a&m!Ꮆ5L#J "ID$ݫ<IDNb'/�vt$R| j"v;H}{'SPhv`'I$"ŧ&$"N"IDOvf'$"鞝DD$"mn R_DDҽʓDD$v`'I*O"ŧ&b'�;HWy)>5f'/�vtN"R| j"N"R_�$"鞝Dd'hv/N"IDN"J "ID$ݫ<IDNb'/�vt$R| j"v;H}{'SPhv`'I$"ŧ&$"N"IDOvf'$"鞝DD$"mn R_DDҽʓDD$v`'I*O"ŧ&b'�;HWy)>5f'/�vtN"R| j"N"R_�$"鞝Dd'hv/N"IDN"J "ID4~w:yTD$"وٜyMv; `'thmѕ˛l{F-~yg}@INDѻߊz, RspeцI;;݇)Ohך̛3hƍ[UD$AM&<#_xK3s6'ZiID$iٹȝptGFgL_P{sɧ̍n}i U#ψ͍>O/}竹-c/b'Q}빩__z x/F,썗]}&_+oW'g^`'fqlAi{hL7?^QuڜxY{sz4Ы|hx6v}}B.iyYZx7|/b'QؼaVޛK)5v˅L+;ǚn|i j|2.w{DŽvRGhħvY}I~h#Ӹ%Ѿ5ѺMu<GGĪJm eۋI꠮?6)GWI~QjSD?BD7u+)3^v\t?*.vRW ; 줎P 9Pn9vn>fbP.Y֪h3jVPPfk׭+MʶA]l޵́0Ґ:£?՛ˆ.ٮԬCYfn=*.vRW ; $9NJrmk}�u<\tYnAc eۋINUHw-Ixv`amw{_mk]Cu*;vt8ImkRޓo׭s2"ŕl{;Zic;  4Ҵfށ{(=kUnvCe'Nj~&׷8^45q7~͌Mv  L߷x{˟$]GWΙw:j{]!>pa_oӏ3qcH xV͎O{MƤAtfMhoոԮB?{s;KM,%z_wYsw<Y<΢9ܣ41mgd'rDg oZPئl݄fZс{(C{rP=o'__dwB}ц#[}єuEw$j9~4!<Oө ^yb9yZC ЏT>g'1<Ut}/^y#ͺ=O*;?x+dCKxp!HuI<RvjQT]C5uw#cKmCiU% N:.^ *rRE+BRyYq-F\xs }v1^lA!69vY{clfI<OD75lmEĩKbO˦jn0%m%FEw$s' J!ApX Oɹi |hsPi 6?ݟu٠}qD't8tUR+Ψ<%3Sdzo_ZfO-<atMgLR rmkwl{rPbnvR(>e[mEAwPIT̡ lK&M<WqXu/xAy9Z1mgd'rDg ̱Y['Wx;,]O==Ӷn0%%FvR Ew$5R$畢3r yהA QN(+~O(OחRpȞn/- }Sp`M9FT9tLuq cҷ8(ϼÎIAn[vN/Vf'};=wj3#/EA%3Eߓ;υgV64)iSVxo&|Zg(,S'sY^iψNnVP7n'm\`:#6#؁{(䮿]w{lE)Hm.1Җ/`'.gyBEso)xXH@Z Z\9+]՘ _>!/M8F ;p~^֕$_.^cL rKQ:6vzԷ4ry5e7ތ7qcՆaKE7T`u]?ЫEBY,/ ?RUoVU+s->2lDc(^iψNnVP7h'p难9?F>~tmk_J_ _ىzu œ!ma63nyyJ%FvRlg}-%; n_IM_='yI~;wNsUabߘC+.rIƳ:6ysf%oz1<ȭK.|14nݦnٖ 6{ Ƴ׃>{N ^⒜#/9mbg8`%3ſ O{c./ܳ%WŲS52I^fu#v7.sQz~=vݺvk] |g 7*6hdu>͕e~--12O53O\_hN<\_tKN;1U-:Љ{X^ฯ5N*&U*.,kР˖%\9<RvRy?~ovջ<=.jcy[?vٺn5uRocu=Kn+싂(˔*++_I%NpF$vR/Gt:Nx�R JD[_W|a'G/mog*n[ SS6/16RbNJ%v',!3:_;~CN/ tKq#l'[΢ڎ0\^mL2r{+/;>J[#g)U;)+ԇ.wʢ%~zX00?NpF$vR/Gt:[DlW OD;6'ܛ{foүY[کf)q IƳE$jiѺ>NB>j=g 7P|o/7m'Y/0,9`ϳ{}7ژdvG[)]}a;qۣ͒*~d'foS"}Uq"],uYa";)I = |}"޳7&rϷ/W?P4Ҟ#T3EKT[J vIɺqSw[,rbk=sƐMx:t_g=Ҏg޸O/M6&>nlS/_ЭTCG~|VHe(T;tw.j <ҍ̿2;ݬN(]6"ע֤ L}lr;)T3EKT[J vIt#Uf2cj=s]-_^h+[qEgT]4m^9vRk-^_uVUS7}؟M&;3;efM):Cg⳼&Ɨ͌۲/).m(SN:fޡ,քw,y;))>I Ty%_oVmKHDN|Eع S6kG[.Ymxz=vRf)q IƳE$t-gHަK,U2MSn~5WW1/ӽxQke☄џ|oz1<#woםR\ro])ʳ󶅥?"ykK%T?ʰxuLՔIgd'rD7+e3KYqDt'd:;plןFZZbdjfh6m/`'TZi_ ;/܌vJsl.+xEU2Ϥ~(]ܼۛi'%^} 2/-qJ_^~d~ӫIAt_OVwEmg#}Qp|,a(Ǿ;oۿPUS<}11-2ⓝݬ3o[:j&[uniOz:pW;)T3EKlEls}-%; }vb!J/[9J_~Qq17vanjO63S7_6ťC-.g[r_3<_܄ĿvɪGCm'ŐÓ]ie~ӫIAt?l݁;Ͷʳ\rCY%'"{˧ժ<_SiDWǴNpFOvR/Gt~wcFID7=iݺ5:pWk!vRf)ql[J vI~=rsoԐM i~ ~ov򡐪N{.RjEՃ%^e)5q'8WzC?[Smv<g7'C^.^cL rg[ԓZmUMY0Ge=yؔת<Ż}suL gd'rD7+G^檋R nQDhݢ:pniN53O__V_dvRbNJ J}ά}3W |dy-{geߥ!CW{J;~_Sц8#rO97f >rex|2Zr_x/p0M9+~N 8_w]OP98YopYW\7ƘdO[ѓ{hzl<)>WE J{sWO/)/n+AO[T3UA_T|u$gd'rD7+(isgXKFtvݭ=w=m;N<<%n}#[}y<Y_tKN;)Yr)C6 <yqV3}IBn*vk= ھ\!jib)9*C*N"݇$XqC"`xg> V}oB5;)x^Y OXrcm;?mol>P,c</w(kɠZֆr$TQ[kFNJ{FOvR/GtzǮX$ޓw6b'52<%n}#C}xvR~KM) ΫV\Q2榰Es'UwǕ͓>tܹs/vHU!lMQUu8Ug(M?ΩW&C/ܕa<߂!W{Ź51g{Ӈ Eخ=3Vy6X|R{('Yo(?]6r^w3hťQ);))>I acsvn[DnbOb m;N<<%%FmEW$j͹s}cߐ.a.>d=xcqNYpGe3Fr8_?Y;CgC_#/ ۇ¾ᰛ9&}]˛lo-f[csqܠPץ�$ XGc;IDh.nVO5do9vRfS/Yb/RbvR3UۧoB<wNU#hZG(V};6z$b'шDt37PbB}`'$7tٲ+0L{P^<ID4ĀԓC}vTЯ\7>X6u\/K"*O"vIY_(1`'M%~QZ8o]߮rO7rt/ݫ<IDNb'r}P_$7 RHcds߽B'^IN""v; %sf is_Br<x<?8CxJ$"b'hvR/OGe}P_$z{'SPFD�IDҽʓH)D4;H}{vSPhv`'I$"b'hv/N"{';I$"ID$ݫ<IN"R_�$"^ID$v`'I*O"ŧ&$"N"IDOAM$ID D$ݳD$ID�;HUD$"b'`'t$b' j"v;H}{'SPID D$ݫ<HD�;Hg')>5f'/�vtN""vf'$"^WyN"R_DDҽʓ$I$"N"UDOAMNb'/�vt$R| j"N"R_�#a'v~˧c3i"_ct$FGD`Qb/0$�ِSF�&j@`x;ip ĉ}єF5`b �0d������P?sl׀ $����IENDB`���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mitogen-0.3.9/docs/images/route.graphml�������������������������������������������������������������0000664�0000000�0000000�00000072302�14656664731�0020122�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" standalone="no"?> <graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd"> <!--Created by yEd 3.14.4--> <key attr.name="Description" attr.type="string" for="graph" id="d0"/> <key for="port" id="d1" yfiles.type="portgraphics"/> <key for="port" id="d2" yfiles.type="portgeometry"/> <key for="port" id="d3" yfiles.type="portuserdata"/> <key attr.name="url" attr.type="string" for="node" id="d4"/> <key attr.name="description" attr.type="string" for="node" id="d5"/> <key for="node" id="d6" yfiles.type="nodegraphics"/> <key for="graphml" id="d7" yfiles.type="resources"/> <key attr.name="url" attr.type="string" for="edge" id="d8"/> <key attr.name="description" attr.type="string" for="edge" id="d9"/> <key for="edge" id="d10" yfiles.type="edgegraphics"/> <graph edgedefault="directed" id="G"> <data key="d0"/> <node id="n0"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="303.75" y="0.0"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="44.03125" x="13.484375" y="5.93359375">master<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n1"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="303.75" y="50.0"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="47.072265625" x="11.9638671875" y="5.93359375">bastion<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n2"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="121.5" y="100.0"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="25.287109375" x="22.8564453125" y="5.93359375">dc1<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n3"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="486.0" y="100.0"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="25.287109375" x="22.8564453125" y="5.93359375">dc2<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n4"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="40.5" y="150.0"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="43.873046875" x="13.5634765625" y="5.93359375">rack11<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n5"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="202.5" y="150.0"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="43.873046875" x="13.5634765625" y="5.93359375">rack12<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n6"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="81.0" y="200.0"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="54.859375" x="8.0703125" y="5.93359375">node11a<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n7"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="0.0" y="200.0"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="55.78515625" x="7.607421875" y="5.93359375">node11b<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n8"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="162.0" y="200.0"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="54.859375" x="8.0703125" y="5.93359375">node12a<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n9"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="243.0" y="200.0"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="55.78515625" x="7.607421875" y="5.93359375">node12b<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n10"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="526.5" y="200.0"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="54.859375" x="8.0703125" y="5.93359375">node21a<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n11"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="607.5" y="200.0"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="55.78515625" x="7.607421875" y="5.93359375">node21b<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n12"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="445.5" y="200.0"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="54.859375" x="8.0703125" y="5.93359375">node22a<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n13"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="364.5" y="200.0"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="55.78515625" x="7.607421875" y="5.93359375">node22b<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n14"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="567.0" y="150.0"/> <y:Fill color="#FFFF99" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="43.873046875" x="13.5634765625" y="5.93359375">rack21<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n15"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="71.0" x="405.0" y="150.0"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="43.873046875" x="13.5634765625" y="5.93359375">rack22<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n16"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="152.0" x="202.5" y="250.0"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="137.083984375" x="7.4580078125" y="5.93359375">sudo:node12b:webapp<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <node id="n17"> <data key="d5"/> <data key="d6"> <y:ShapeNode> <y:Geometry height="30.0" width="152.0" x="405.0" y="250.0"/> <y:Fill color="#FFCC00" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="136.158203125" x="7.9208984375" y="5.93359375">sudo:node22a:webapp<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> <y:Shape type="rectangle"/> </y:ShapeNode> </data> </node> <edge id="e0" source="n0" target="n1"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e1" source="n1" target="n3"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e2" source="n1" target="n2"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e3" source="n2" target="n4"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e4" source="n4" target="n7"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e5" source="n4" target="n6"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e6" source="n5" target="n9"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e7" source="n5" target="n8"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e8" source="n2" target="n5"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e9" source="n15" target="n13"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e10" source="n15" target="n12"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e11" source="n3" target="n14"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e12" source="n14" target="n10"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e13" source="n14" target="n11"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e14" source="n9" target="n16"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e15" source="n3" target="n15"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e16" source="n12" target="n17"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#000000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="false"/> </y:PolyLineEdge> </data> </edge> <edge id="e17" source="n16" target="n9"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"> <y:Point x="345.5" y="215.0"/> </y:Path> <y:LineStyle color="#339966" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="true"/> </y:PolyLineEdge> </data> </edge> <edge id="e18" source="n9" target="n5"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="33.5" ty="0.0"> <y:Point x="344.25" y="165.0"/> </y:Path> <y:LineStyle color="#339966" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="true"/> </y:PolyLineEdge> </data> </edge> <edge id="e19" source="n5" target="n2"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"> <y:Point x="339.25" y="115.0"/> </y:Path> <y:LineStyle color="#008000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="true"/> </y:PolyLineEdge> </data> </edge> <edge id="e20" source="n2" target="n1"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"> <y:Point x="339.25" y="94.5"/> </y:Path> <y:LineStyle color="#008000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="true"/> </y:PolyLineEdge> </data> </edge> <edge id="e21" source="n1" target="n3"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"> <y:Point x="384.5" y="115.0"/> </y:Path> <y:LineStyle color="#008000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="true"/> </y:PolyLineEdge> </data> </edge> <edge id="e22" source="n3" target="n15"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"> <y:Point x="374.5" y="140.5"/> <y:Point x="374.5" y="165.0"/> </y:Path> <y:LineStyle color="#008000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="true"/> </y:PolyLineEdge> </data> </edge> <edge id="e23" source="n15" target="n12"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"> <y:Point x="500.5" y="165.0"/> </y:Path> <y:LineStyle color="#008000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="true"/> </y:PolyLineEdge> </data> </edge> <edge id="e24" source="n12" target="n17"> <data key="d9"/> <data key="d10"> <y:PolyLineEdge> <y:Path sx="0.0" sy="0.0" tx="40.5" ty="-5.5"> <y:Point x="521.5" y="240.5"/> </y:Path> <y:LineStyle color="#008000" type="line" width="1.0"/> <y:Arrows source="none" target="standard"/> <y:BendStyle smoothed="true"/> </y:PolyLineEdge> </data> </edge> </graph> <data key="d7"> <y:Resources/> </data> </graphml> ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mitogen-0.3.9/docs/images/route.svg�����������������������������������������������������������������0000664�0000000�0000000�00000074446�14656664731�0017302�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="624" height="259.521" viewBox="0 0 468 194.641"><defs><symbol overflow="visible" id="a"><path d="M.547 0v-4.281h.64v.593c.133-.207.313-.374.532-.5.226-.132.488-.203.781-.203.313 0 .566.07.766.204.207.136.351.324.437.562.344-.508.785-.766 1.328-.766.426 0 .754.121.985.36.226.242.343.605.343 1.093V0h-.734v-2.703c0-.29-.027-.5-.078-.625a.544.544 0 0 0-.25-.297.718.718 0 0 0-.422-.125c-.305 0-.559.102-.766.297-.199.2-.296.523-.296.969V0h-.72v-2.781c0-.32-.062-.563-.187-.719-.117-.164-.308-.25-.578-.25-.2 0-.387.055-.562.156a.912.912 0 0 0-.391.469c-.074.21-.11.512-.11.906V0zm0 0"/></symbol><symbol overflow="visible" id="b"><path d="M3.344-.531c-.274.23-.531.39-.781.484a2.25 2.25 0 0 1-.797.14C1.296.094.93-.02.672-.25a1.13 1.13 0 0 1-.375-.875c0-.207.047-.398.14-.578.094-.176.22-.317.376-.422.156-.102.332-.18.53-.234.134-.04.348-.079.641-.11.582-.07 1.016-.156 1.297-.25v-.187c0-.301-.07-.508-.203-.625-.187-.164-.465-.25-.828-.25-.344 0-.602.062-.766.187-.156.117-.273.324-.343.625l-.72-.094c.063-.3.165-.546.313-.734a1.52 1.52 0 0 1 .641-.437c.281-.102.61-.157.984-.157.364 0 .66.047.891.141.227.086.395.195.5.328.113.125.191.29.234.485.02.124.032.351.032.671v.97c0 .679.015 1.105.046 1.28.032.18.094.352.188.516h-.766a1.447 1.447 0 0 1-.14-.531zM3.28-2.156c-.261.117-.656.21-1.187.281-.305.043-.516.09-.64.14a.689.689 0 0 0-.282.235.659.659 0 0 0-.094.344c0 .199.07.367.219.5.144.125.36.187.64.187.282 0 .532-.062.75-.187a1.17 1.17 0 0 0 .485-.5c.07-.164.11-.41.11-.735zm0 0"/></symbol><symbol overflow="visible" id="c"><path d="M.25-1.281l.719-.11c.039.293.156.516.344.672.187.149.44.219.765.219.332 0 .578-.066.735-.203a.611.611 0 0 0 .25-.485.441.441 0 0 0-.204-.375c-.105-.07-.355-.156-.75-.25-.53-.132-.902-.25-1.109-.343a1.073 1.073 0 0 1-.469-.406 1.098 1.098 0 0 1-.156-.579c0-.195.04-.375.125-.53.094-.165.21-.302.36-.407.113-.082.269-.156.468-.219.195-.062.406-.094.625-.094.332 0 .625.055.875.157.258.093.445.226.563.39.125.168.21.387.265.656l-.719.11c-.03-.227-.124-.399-.28-.516C2.5-3.719 2.28-3.78 2-3.78c-.336 0-.574.058-.719.172-.136.105-.203.23-.203.375 0 .093.031.18.094.25a.52.52 0 0 0 .266.203c.07.023.289.086.656.187.508.137.863.25 1.062.344.207.086.367.21.485.375.113.168.171.371.171.61 0 .25-.074.484-.218.702-.137.211-.34.372-.61.485a2.222 2.222 0 0 1-.89.172C1.53.094 1.102-.02.813-.25.52-.477.332-.82.25-1.281zm0 0"/></symbol><symbol overflow="visible" id="d"><path d="M2.125-.656l.11.64c-.212.051-.391.079-.547.079-.262 0-.465-.043-.61-.126A.703.703 0 0 1 .766-.39C.703-.523.672-.812.672-1.25v-2.469H.14v-.562h.53v-1.063l.735-.437v1.5h.719v.562h-.719v2.5c0 .211.008.344.032.407.03.062.07.109.125.14a.56.56 0 0 0 .25.047c.082 0 .187-.008.312-.031zm0 0"/></symbol><symbol overflow="visible" id="e"><path d="M3.484-1.375l.75.094c-.125.437-.351.777-.671 1.015-.313.243-.72.36-1.22.36-.624 0-1.124-.192-1.5-.578C.478-.867.298-1.41.298-2.11c0-.72.187-1.274.562-1.672.375-.406.852-.61 1.438-.61.582 0 1.05.2 1.406.594.363.387.547.934.547 1.64v.204H1.047c.031.469.164.828.406 1.078.238.25.535.375.89.375.27 0 .5-.066.688-.203.188-.145.336-.367.453-.672zm-2.39-1.188h2.39c-.03-.351-.12-.617-.265-.796a1.146 1.146 0 0 0-.906-.422c-.336 0-.618.117-.844.344-.23.218-.356.511-.375.874zm0 0"/></symbol><symbol overflow="visible" id="f"><path d="M.531 0v-4.281h.656v.64c.165-.3.317-.5.454-.593a.824.824 0 0 1 .484-.157c.238 0 .484.079.734.235l-.25.687a1.077 1.077 0 0 0-.53-.156.686.686 0 0 0-.423.14.756.756 0 0 0-.265.391 2.688 2.688 0 0 0-.125.844V0zm0 0"/></symbol><symbol overflow="visible" id="g"><path d="M1.219 0H.547v-5.922h.719v2.11c.312-.383.703-.579 1.171-.579.27 0 .52.059.75.172.239.106.43.258.579.453.156.188.273.418.359.688.094.273.14.562.14.875 0 .73-.183 1.297-.546 1.703-.367.398-.805.594-1.313.594-.511 0-.906-.207-1.187-.625zm-.016-2.172c0 .512.07.883.219 1.11.226.375.535.562.922.562.32 0 .597-.133.828-.406.226-.281.344-.692.344-1.235 0-.562-.118-.972-.344-1.234-.219-.27-.485-.406-.797-.406-.313 0-.59.14-.828.422-.23.273-.344.668-.344 1.187zm0 0"/></symbol><symbol overflow="visible" id="h"><path d="M.547-5.078v-.844h.734v.844zM.547 0v-4.281h.734V0zm0 0"/></symbol><symbol overflow="visible" id="i"><path d="M.281-2.14c0-.79.219-1.38.656-1.766.364-.32.813-.485 1.344-.485.594 0 1.078.2 1.453.594.375.387.563.918.563 1.594 0 .555-.086.992-.25 1.312a1.797 1.797 0 0 1-.734.735C3 .008 2.655.094 2.28.094c-.594 0-1.078-.192-1.453-.578C.461-.867.281-1.422.281-2.141zm.735 0c0 .554.117.964.359 1.234.238.273.54.406.906.406.364 0 .664-.133.906-.406.239-.281.36-.703.36-1.266 0-.531-.121-.93-.36-1.203a1.168 1.168 0 0 0-.906-.406c-.367 0-.668.136-.906.406-.242.273-.36.684-.36 1.234zm0 0"/></symbol><symbol overflow="visible" id="j"><path d="M.547 0v-4.281h.656v.61c.313-.477.766-.72 1.36-.72.257 0 .492.047.703.141.218.094.379.219.484.375.113.148.191.324.234.531.032.137.047.371.047.703V0h-.734v-2.61c0-.288-.031-.507-.094-.656a.667.667 0 0 0-.297-.343.866.866 0 0 0-.5-.141c-.304 0-.57.102-.797.297-.23.187-.343.558-.343 1.11V0zm0 0"/></symbol><symbol overflow="visible" id="k"><path d="M3.328 0v-.547c-.273.43-.672.64-1.203.64-.344 0-.664-.093-.953-.28A1.85 1.85 0 0 1 .516-.97 2.802 2.802 0 0 1 .28-2.14c0-.425.067-.812.203-1.156.145-.351.36-.625.641-.812.29-.188.613-.282.969-.282.258 0 .488.059.687.172.207.106.375.246.5.422v-2.125H4V0zM1.031-2.14c0 .554.114.964.344 1.234.227.273.504.406.828.406.313 0 .578-.129.797-.39.227-.258.344-.657.344-1.188 0-.582-.117-1.008-.344-1.281-.23-.282-.512-.422-.844-.422-.324 0-.594.136-.812.406-.211.262-.313.672-.313 1.234zm0 0"/></symbol><symbol overflow="visible" id="l"><path d="M3.344-1.563l.719.079c-.086.5-.29.89-.61 1.171-.324.274-.719.407-1.187.407C1.68.094 1.21-.094.859-.47.504-.852.33-1.406.33-2.125c0-.469.07-.875.218-1.219.156-.344.39-.601.703-.781a2.069 2.069 0 0 1 1.031-.266c.457 0 .832.121 1.125.36.301.242.492.574.578 1l-.703.11c-.062-.282-.183-.493-.36-.642a.924.924 0 0 0-.624-.218c-.367 0-.664.133-.89.39-.231.262-.345.68-.345 1.25 0 .575.11.993.329 1.25.226.262.52.391.875.391a.973.973 0 0 0 .703-.266c.195-.175.32-.441.375-.796zm0 0"/></symbol><symbol overflow="visible" id="m"><path d="M3.078 0H2.36v-4.625c-.18.168-.414.336-.703.5a4.767 4.767 0 0 1-.75.375v-.703c.406-.195.758-.43 1.063-.703.3-.27.515-.532.64-.782h.47zm0 0"/></symbol><symbol overflow="visible" id="n"><path d="M4.156-.703V0H.25a1.132 1.132 0 0 1 .078-.5 2.58 2.58 0 0 1 .484-.781 7.6 7.6 0 0 1 .954-.907c.644-.53 1.078-.945 1.296-1.25.227-.312.344-.601.344-.874a.983.983 0 0 0-.312-.735 1.13 1.13 0 0 0-.797-.297c-.356 0-.637.11-.844.328-.21.211-.312.496-.312.86l-.75-.078c.05-.551.242-.973.578-1.266.332-.29.781-.438 1.344-.438.562 0 1.007.157 1.343.47.332.312.5.702.5 1.171 0 .242-.054.477-.156.703-.094.23-.258.469-.484.719-.22.25-.59.594-1.11 1.031-.437.375-.719.633-.844.766-.125.125-.226.25-.296.375zm0 0"/></symbol><symbol overflow="visible" id="o"><path d="M.547 0v-5.922h.734v3.375L3-4.28h.938L2.296-2.703 4.094 0h-.89L1.78-2.188l-.5.485V0zm0 0"/></symbol><symbol overflow="visible" id="p"><path d="M3.36 0v-.625c-.337.48-.79.719-1.36.719-.262 0-.5-.047-.719-.14-.218-.095-.383-.212-.484-.36a1.425 1.425 0 0 1-.219-.547 3.471 3.471 0 0 1-.047-.672v-2.656h.719v2.375c0 .375.016.633.047.765.05.188.148.34.297.454a.906.906 0 0 0 .547.156c.218 0 .421-.051.609-.156a.909.909 0 0 0 .406-.454c.082-.195.125-.476.125-.843v-2.297H4V0zm0 0"/></symbol><symbol overflow="visible" id="q"><path d="M.75-3.453v-.828h.828v.828zM.75 0v-.828h.828V0zm0 0"/></symbol><symbol overflow="visible" id="r"><path d="M1.328 0L.031-4.281h.75l.672 2.468.266.922c.008-.039.082-.336.218-.89l.672-2.5h.75L4-1.797l.219.813.25-.829.734-2.468h.703L4.563 0h-.75l-.688-2.563-.156-.734L2.094 0zm0 0"/></symbol><symbol overflow="visible" id="s"><path d="M.547 1.64V-4.28h.656v.547c.156-.22.332-.38.531-.485.196-.113.438-.172.72-.172.362 0 .687.102.968.297.281.188.488.453.625.797.144.344.219.719.219 1.125 0 .438-.079.836-.235 1.188-.156.343-.386.609-.687.796a1.79 1.79 0 0 1-.953.282c-.243 0-.461-.047-.657-.14a1.528 1.528 0 0 1-.468-.392v2.079zm.656-3.765c0 .555.11.965.328 1.234.227.262.5.391.813.391.32 0 .597-.133.828-.406.226-.27.344-.692.344-1.266 0-.55-.118-.96-.344-1.234-.219-.27-.485-.406-.797-.406-.305 0-.574.148-.813.437-.242.281-.359.7-.359 1.25zm0 0"/></symbol></defs><path d="M0 0h468v194.64H0zm0 0" fill="#fff"/><path d="M209.52 1.441h48.601v20.52H209.52zm0 0" fill="#ffff97"/><use xlink:href="#a" x="293.28" y="313.56" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#b" x="300.164" y="313.56" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#c" x="304.627" y="313.56" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#d" x="308.842" y="313.56" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#e" x="311.138" y="313.56" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#f" x="315.683" y="313.56" width="100%" height="100%" transform="translate(-72 -298.68)"/><path d="M209.52 1.082h48.96V22.32h-49.32V1.082zm0 .598V1.44h.359v20.52h-.36v-.36h48.602v.36h-.36V1.44h.36v.239zm0 0"/><path d="M209.52 35.64h48.601v20.52H209.52zm0 0" fill="#ffca00"/><use xlink:href="#g" x="292.56" y="347.88" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#b" x="297.105" y="347.88" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#c" x="301.651" y="347.88" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#d" x="305.866" y="347.88" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#h" x="308.162" y="347.88" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#i" x="309.998" y="347.88" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#j" x="314.543" y="347.88" width="100%" height="100%" transform="translate(-72 -298.68)"/><path d="M209.52 35.281h48.96V56.52h-49.32V35.28zm0 .719v-.36h.359v20.52h-.36v-.238h48.602v.238h-.36V35.64h.36V36zm0 0"/><path d="M84.602 69.96h48.718v20.52H84.602zm0 0" fill="#ffca00"/><use xlink:href="#k" x="174.36" y="382.08" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#l" x="178.905" y="382.08" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#m" x="183.12" y="382.08" width="100%" height="100%" transform="translate(-72 -298.68)"/><path d="M84.602 69.602h48.957V90.84h-49.32V69.602zm0 .597v-.238h.359v20.52h-.36v-.36h48.72v.36h-.36V69.96h.36v.238zm0 0"/><path d="M334.441 69.96h48.598v20.52h-48.598zm0 0" fill="#ffca00"/><use xlink:href="#k" x="424.08" y="382.08" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#l" x="428.625" y="382.08" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#n" x="432.84" y="382.08" width="100%" height="100%" transform="translate(-72 -298.68)"/><path d="M334.441 69.602h48.957V90.84h-49.32V69.602zm0 .597v-.238h.239v20.52h-.239v-.36h48.598v.36h-.36V69.96h.36v.238zm0 0"/><path d="M29.16 104.16h48.602v20.52H29.16zm0 0" fill="#ffff97"/><use xlink:href="#f" x="113.16" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#b" x="115.912" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#l" x="120.457" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#o" x="124.672" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#m" x="128.887" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#m" x="133.432" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><path d="M29.16 103.8h48.961v21.24h-49.32V103.8zm0 .72v-.36h.36v20.52h-.36v-.239h48.602v.239h-.364v-20.52h.364v.36zm0 0"/><path d="M140.16 104.16h48.602v20.52H140.16zm0 0" fill="#ffca00"/><use xlink:href="#f" x="224.16" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#b" x="226.912" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#l" x="231.457" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#o" x="235.672" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#m" x="239.887" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#n" x="244.432" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><path d="M140.16 103.8h48.961v21.24h-49.32V103.8zm0 .72v-.36h.36v20.52h-.36v-.239h48.602v.239h-.364v-20.52h.364v.36zm0 0"/><path d="M56.879 138.48h48.601V159H56.88zm0 0" fill="#ffff97"/><use xlink:href="#j" x="137.16" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#i" x="141.705" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#k" x="146.251" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#e" x="150.847" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#m" x="155.392" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#m" x="159.938" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#b" x="164.483" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><path d="M56.879 138.121h48.96v21.238H56.52v-21.238zm0 .598v-.239h.36V159h-.36v-.36h48.601v.36h-.242v-20.52h.242v.239zm0 0"/><path d="M1.32 138.48h48.72V159H1.32zm0 0" fill="#ffff97"/><use xlink:href="#j" x="81.72" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#i" x="86.265" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#k" x="90.811" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#e" x="95.407" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#m" x="99.952" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#m" x="104.498" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#g" x="109.043" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><path d="M1.32 138.121h49.078v21.238H1.078v-21.238zm0 .598v-.239h.36V159h-.36v-.36h48.72v.36h-.36v-20.52h.36v.239zm0 0"/><path d="M112.32 138.48h48.72V159h-48.72zm0 0" fill="#ffff97"/><use xlink:href="#j" x="192.72" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#i" x="197.265" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#k" x="201.811" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#e" x="206.407" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#m" x="210.952" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#n" x="215.498" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#b" x="220.043" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><path d="M112.32 138.121h49.078v21.238h-49.32v-21.238zm0 .598v-.239h.36V159h-.36v-.36h48.72v.36h-.36v-20.52h.36v.239zm0 0"/><path d="M167.879 138.48h48.601V159H167.88zm0 0" fill="#ffca00"/><use xlink:href="#j" x="248.16" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#i" x="252.705" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#k" x="257.251" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#e" x="261.847" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#m" x="266.392" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#n" x="270.938" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#g" x="275.483" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><path d="M167.879 138.121h48.96v21.238h-49.32v-21.238zm0 .598v-.239h.36V159h-.36v-.36h48.601v.36h-.242v-20.52h.242v.239zm0 0"/><path d="M362.16 138.48h48.602V159H362.16zm0 0" fill="#ffff97"/><use xlink:href="#j" x="442.44" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#i" x="446.985" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#k" x="451.531" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#e" x="456.127" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#n" x="460.672" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#m" x="465.218" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#b" x="469.763" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><path d="M362.16 138.121h48.961v21.238h-49.32v-21.238zm0 .598v-.239h.36V159h-.36v-.36h48.602v.36h-.364v-20.52h.364v.239zm0 0"/><path d="M417.602 138.48h48.718V159h-48.718zm0 0" fill="#ffff97"/><use xlink:href="#j" x="498" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#i" x="502.545" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#k" x="507.091" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#e" x="511.687" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#n" x="516.232" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#m" x="520.778" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#g" x="525.323" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><path d="M417.602 138.121h49.078v21.238h-49.442v-21.238zm0 .598v-.239h.359V159h-.36v-.36h48.72v.36h-.36v-20.52h.36v.239zm0 0"/><path d="M306.602 138.48h48.718V159h-48.718zm0 0" fill="#ffca00"/><use xlink:href="#j" x="387" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#i" x="391.545" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#k" x="396.091" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#e" x="400.687" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#n" x="405.232" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#n" x="409.778" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#b" x="414.323" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><path d="M306.602 138.121h49.078v21.238h-49.442v-21.238zm0 .598v-.239h.359V159h-.36v-.36h48.72v.36h-.36v-20.52h.36v.239zm0 0"/><path d="M251.16 138.48h48.602V159H251.16zm0 0" fill="#ffff97"/><use xlink:href="#j" x="331.44" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#i" x="335.985" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#k" x="340.531" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#e" x="345.127" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#n" x="349.672" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#n" x="354.218" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#g" x="358.763" y="450.6" width="100%" height="100%" transform="translate(-72 -298.68)"/><path d="M251.16 138.121h48.961v21.238h-49.32v-21.238zm0 .598v-.239h.36V159h-.36v-.36h48.602v.36h-.364v-20.52h.364v.239zm0 0"/><path d="M389.879 104.16h48.601v20.52H389.88zm0 0" fill="#ffff97"/><use xlink:href="#f" x="473.88" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#b" x="476.632" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#l" x="481.177" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#o" x="485.392" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#n" x="489.607" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#m" x="494.152" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><path d="M389.879 103.8h48.96v21.24h-49.32V103.8zm0 .72v-.36h.36v20.52h-.36v-.239h48.601v.239h-.242v-20.52h.242v.36zm0 0"/><path d="M278.879 104.16h48.601v20.52H278.88zm0 0" fill="#ffca00"/><use xlink:href="#f" x="362.88" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#b" x="365.632" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#l" x="370.177" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#o" x="374.392" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#n" x="378.607" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#n" x="383.152" y="416.4" width="100%" height="100%" transform="translate(-72 -298.68)"/><path d="M278.879 103.8h48.96v21.24h-49.32V103.8zm0 .72v-.36h.36v20.52h-.36v-.239h48.601v.239h-.242v-20.52h.242v.36zm0 0"/><path d="M140.16 172.68h104.16v20.52H140.16zm0 0" fill="#ffca00"/><use xlink:href="#c" x="222.6" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#p" x="226.815" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#k" x="231.36" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#i" x="235.906" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#q" x="240.451" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#j" x="242.747" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#i" x="247.292" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#k" x="251.838" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#e" x="256.434" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#m" x="260.979" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#n" x="265.525" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#g" x="270.07" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#q" x="274.666" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#r" x="276.898" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#e" x="282.866" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#g" x="287.329" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#b" x="291.925" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#s" x="296.47" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#s" x="301.016" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><path d="M140.16 172.32h104.52v21.239H139.8V172.32zm0 .72v-.36h.36v20.52h-.36v-.24h104.16v.24h-.36v-20.52h.36v.36zm0 0"/><path d="M278.879 172.68h104.16v20.52H278.88zm0 0" fill="#ffca00"/><use xlink:href="#c" x="361.32" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#p" x="365.535" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#k" x="370.08" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#i" x="374.626" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#q" x="379.171" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#j" x="381.467" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#i" x="386.012" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#k" x="390.558" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#e" x="395.154" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#n" x="399.699" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#n" x="404.245" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#b" x="408.79" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#q" x="413.386" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#r" x="415.618" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#e" x="421.586" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#g" x="426.049" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#b" x="430.645" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#s" x="435.19" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><use xlink:href="#s" x="439.736" y="484.92" width="100%" height="100%" transform="translate(-72 -298.68)"/><path d="M278.879 172.32h104.52v21.239h-104.88V172.32zm0 .72v-.36h.36v20.52h-.36v-.24h104.16v.24h-.36v-20.52h.36v.36zm0 0M234.121 21.96v8.161h-.601v-8.16zm0 0"/><path d="M233.879 35.64l3.36-8.16-3.36 2.04-3.48-2.04zm0 0M209.64 52.922l-71.038 19.437-.122-.597 70.918-19.442zm0 0"/><path d="M133.32 73.559l8.758 1.082-2.879-2.762 1.082-3.84zm0 0"/><path d="M133.2 77.16l93.84-10.558v.359l-.118-.36 5.156-1.203v.364l-.117-.242 1.2-.84.237.242-.359-.121.48-.961.36.12h-.36v-2.28h.602v2.402l-.36.957-.12.121v.121l-1.32.84h-.122l-5.16 1.078-93.719 10.563zm0 0" fill="#007f00"/><path d="M233.879 56.16l-3.48 8.281 3.48-2.043 3.36 2.043zm0 0" fill="#007f00"/><path d="M258.238 52.32l70.922 19.442-.12.597-70.919-19.437zm0 0"/><path d="M334.441 73.559l-7.082-5.52 1.082 3.84-2.882 2.762zm0 0"/><path d="M243.36 55.922l17.16 18.957-.239.242.117-.242 5.16 3.723-.117.359v-.36l6.36 1.2-.121.36v-.36h57.242v.719h-57.363l-6.239-1.32h-.12l-5.16-3.84-17.161-18.962zm0 0" fill="#007f00"/><path d="M334.441 80.16l-8.28-3.36 2.038 3.36-2.039 3.48zm0 0" fill="#007f00"/><path d="M92.52 90.719L75 101.64l-.36-.602 17.52-10.918zm0 0"/><path d="M70.078 104.16l8.762-1.441-3.48-1.797-.122-3.961zm0 0M125.762 90.121l17.52 10.918-.36.602-17.524-10.922zm0 0"/><path d="M147.84 104.16l-5.281-7.2v3.962l-3.598 1.797zm0 0"/><path d="M185.16 103.922l42.36-21 .12.36-.12-.36 2.28-1.32.122.238-.242-.121.601-.957.239.238-.122.242-.957-.601.118-.243v.364l-2.637-.242v-.36.36h-88.203v-.72h88.32l2.52.24h.242l.96.6.118.481-.598.961-.12.117-2.282 1.32-42.48 21zm0 0" fill="#007f00"/><path d="M133.32 80.16l8.16 3.48-2.039-3.48 2.04-3.36zm0 0" fill="#007f00"/><path d="M62.04 124.559l7.679 9.363-.598.476-7.562-9.476zm0 0"/><path d="M72.84 138.48l-2.52-8.64-1.32 3.84-3.96.48zm0 0M45.36 124.922l-7.68 9.476-.48-.476 7.679-9.363zm0 0"/><path d="M34.078 138.48l7.8-4.32-3.956-.48-1.442-3.84zm0 0M156.36 124.922l-7.56 9.476-.6-.476 7.679-9.363zm0 0"/><path d="M145.078 138.48l7.8-4.32-3.956-.48-1.442-3.84zm0 0M173.04 124.559l7.679 9.363-.598.476-7.562-9.476zm0 0"/><path d="M183.84 138.48l-2.52-8.64-1.32 3.84-3.96.48zm0 0"/><path d="M205.559 138.121l26.043-19.8.238.238-.238-.239 1.918-1.8.242.242-.364-.121.48-1.2h.243l-.121.36-1.078-.84.117-.242v.363l-2.64-.242v-.36.36H194.28v-.719h36.117l2.641.238h.121l.121.121 1.078.72.243.12-.122.239-.359 1.32L234 117l-1.922 1.8v.122h-.117l-26.04 19.797zm0 0" fill="#309763"/><path d="M188.762 114.48l8.277 3.36-2.039-3.36 2.04-3.48zm0 0" fill="#309763"/><path d="M375.48 90.121l17.641 10.918-.36.602-17.64-10.922zm0 0"/><path d="M397.559 104.16l-5.16-7.2-.118 3.962-3.48 1.797zm0 0M406.2 124.922l-7.68 9.476-.598-.476 7.68-9.363zm0 0"/><path d="M394.8 138.48l7.802-4.32-3.961-.48-1.32-3.84zm0 0M422.762 124.559l7.68 9.363-.481.476-7.68-9.476zm0 0"/><path d="M433.68 138.48l-2.52-8.64-1.441 3.84-3.957.48zm0 0M342.238 90.719l-17.52 10.922-.359-.602 17.52-10.918zm0 0"/><path d="M319.8 104.16l8.88-1.441-3.602-1.797V96.96zm0 0"/><path d="M334.441 84.719l-69.601 12.12-.121-.359.12.36-3 .96v-.359l.122.239-2.04 1.68-.241-.239.242.121-1.203 2.399-.36-.243.36.122-.36 3H258h.36v3.12H258l.36-.12.359 3-.36.12.36-.242 1.32 2.16-.36.122.243-.239 2.039 1.32-.121.239v-.36l3 .481v.36-.36h8.52v.719h-8.52l-3-.48h-.121l-2.16-1.32h-.118v-.118l-1.32-2.16v-.121l-.48-3v-3.121l.48-3.122v-.117l1.2-2.402h.12v-.117l2.16-1.563v-.117h.118l2.883-.96h.117l69.601-12zm0 0" fill="#007f00"/><path d="M278.879 114.48l-8.277-3.48 2.16 3.48-2.16 3.36zm0 0" fill="#007f00"/><path d="M295.2 124.922l-7.68 9.476-.598-.476 7.68-9.363zm0 0"/><path d="M283.8 138.48l7.802-4.32-3.961-.48-1.32-3.84zm0 0M311.762 124.559l7.68 9.363-.481.476-7.68-9.476zm0 0"/><path d="M322.68 138.48l-2.52-8.64-1.441 3.84-3.957.48zm0 0"/><path d="M327.48 114.121h10.079l2.761.36h.121l.118.12 1.68 1.2.12.12.48 2.04v.121l-.718 2.879-4.8 12.48-.72-.242 4.919-12.48.359.12-.36-.12.602-2.758.36.121h-.36l-.48-1.922.359-.12-.238.241-1.684-1.199.242-.242v.36l-2.879-.36v-.36.36h-9.96zm0 0" fill="#007f00"/><path d="M334.922 138.48l6.238-6.48-3.96.719-2.4-3.239zm0 0" fill="#007f00"/><path d="M192.602 159v8.16h-.723V159zm0 0"/><path d="M192.238 172.68l3.364-8.16-3.364 2.039-3.476-2.04zm0 0"/><path d="M205.8 172.441l26.641-19.921.118.242-.118-.242 1.918-1.801.243.242h-.364l.48-1.32.36.12-.238.239-1.078-.719.117-.36v.36l-2.64-.242v-.36.36H222v-.719h9.238l2.762.36h.121l1.078.718.242.243-.12.238-.36 1.203-.121.117v.121l-2.04 1.801-26.64 19.8zm0 0" fill="#309763"/><path d="M216.48 148.68l8.282 3.48-2.043-3.48 2.043-3.36zm0 0" fill="#309763"/><path d="M331.32 159v8.16h-.718V159zm0 0"/><path d="M330.96 172.68l3.481-8.16-3.48 2.039-3.48-2.04zm0 0"/><path d="M347.52 158.64l5.64 3.602v.117l5.762 4.082.117.118v.601h-.719v-.48h.36l-.121.242-5.758-4.082.238-.238-.238.238-5.762-3.598zm0 0" fill="#007f00"/><path d="M358.68 172.68l3.48-8.282-3.48 2.16-3.36-2.16zm0 0" fill="#007f00"/></svg>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mitogen-0.3.9/docs/images/sponsors/�����������������������������������������������������������������0000775�0000000�0000000�00000000000�14656664731�0017272�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������mitogen-0.3.9/docs/images/sponsors/a.html�����������������������������������������������������������0000664�0000000�0000000�00000000104�14656664731�0020373�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<body bgcolor=black> <img src="cgi.svg" style="background: white"> ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mitogen-0.3.9/docs/images/sponsors/cgi.svg����������������������������������������������������������0000664�0000000�0000000�00000001312�14656664731�0020552�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<svg xmlns="http://www.w3.org/2000/svg" viewBox="65 4.5 302 141"><defs><style>.a{fill:#e31937;}</style></defs><title>CGI_Logo_color_v2 mitogen-0.3.9/docs/images/sponsors/grx.svg000066400000000000000000000061151465666473100206160ustar00rootroot00000000000000 mitogen-0.3.9/docs/images/sponsors/seantis.svg000066400000000000000000000225701465666473100214670ustar00rootroot00000000000000logomitogen-0.3.9/docs/images/sponsors/securelink.svg000066400000000000000000000104411465666473100221570ustar00rootroot00000000000000 mitogen-0.3.9/docs/images/topogit.graphml000066400000000000000000001535321465666473100204560ustar00rootroot00000000000000 rack12c bastion rack12a laptop git-http-backend git-fetch-pack git-http-backend git-fetch-pack rack11a git-fetch-pack rack11b git-fetch-pack git-fetch-pack rack11c git-fetch-pack rack12b git-http-backend git-http-backend git-fetch-pack git-fetch-pack (300ms) (250μs) (250μs) iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACz0lEQVR42s1Xv2sUQRSexIAW6rne vDe7S4gnXGHrL1AQBQv/B0FUjKKdhQpi4R9gk9JCksomisFOLNU0dtHiChMS1CZomktIAkmIvre7 ZzZzb+72V8CBd9ztzPu+b2fee/NOqYwjDENtwIwaxJcG8CvZCtmfxFaiZ9GcGeW1qqoBACcJdJII NlOE/WyTfdi3MLHneTUD8ILAtnMQ27bNGIxV4K1xvgSxbfOZd8PUzWVyaFdI3rE2Y/ckD7Q+vUfk /0Qwh0g+Uqt5tGBhtwO0fMA3BUW1Y19oWc8XmKt768FM2CCIeI3nms3m/igFARfTaYeAH9istFzk tezDvozRLc5M2Ft/RnqLUOtTdmaE9foJ+joobOIgz9kRzxgSNnOm3h6npEV+3T9bto4whuOIpjop 59OPLVEAwI3SAgjDIWCLuRVqvCstoLP9OXx4+GhZAYxBgfhD5CBulZRZQSHcqqqcM5bMYSaVkCbR 9uQun33LunTM0OIAXOuaQPyuKh6MKbzomnIEyGzlAgDnJC6XgOU9ELDsEiBOGGOwMnLCcr4ofcyI KYJ4vSoBjOUQMMNpOO6Y/EK+QxXwDzGWIw3HldHmqvtGg7EKasCYE5+4ldb6EP1YdS2iivg6Kpk5 B+EG7Nvjul5l7rhea3yeKo/PfK0vkfPH1OIN2q5XpPhOcovtk7aazvo82b3kctvo1S8w586V6YUj 9HC900iSiAdRD4D42XGLDQgCBozGtxmblXXm3B2pGp9aaXiO7Lh9kdBxXHC2dAAXswhgLle0TqcW vueHR2jE3ZB5Qtt7xbH98VH6PmQQMO3MrqQ3SJVMcz9P4MVie5LP9Q3oIAiO8V2w05TgJx/xETUW N+k4HjcajQMFBcwyduYmgojfSUBMklcAYxVpbiiqzW0C+FVCwG9OXUfWZP6bdpDTksC+kS112m1p xO07LvFaCtiH7Kv+9/EXeaNEH9weDloAAAAASUVORK5CYII= <?xml version="1.0" encoding="utf-8"?> <svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="57px" height="65px" viewBox="0 0 57 65" enable-background="new 0 0 57 65" xml:space="preserve"> <g> <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3398" y1="3115.7266" x2="27.5807" y2="3145.5239" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)"> <stop offset="0.2711" style="stop-color:#FFAB4F"/> <stop offset="1" style="stop-color:#FFD28F"/> </linearGradient> <path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> <path id="body_18_" fill="#ECECEC" stroke="#9B9B9B" stroke-miterlimit="10" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51 c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-11.244-6.146-11.244-6.146 c-1.771,1.655-5.61,3.802-10.063,3.802c-4.453,0-8.292-2.146-10.063-3.802c0,0-5.755,0.586-11.189,6.021 C1.378,56.689,0.5,62.768,0.5,62.768z"/> <radialGradient id="SVGID_2_" cx="22.6621" cy="21.707" r="17.7954" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#FCB57A"/> <stop offset="1" style="stop-color:#FF8C36"/> </radialGradient> <path fill="url(#SVGID_2_)" stroke="#E55E03" d="M28.106,33.486c-8.112,0-12.688,4.313-12.688,10.438 c0,7.422,12.688,10.438,12.688,10.438s14.688-3.016,14.688-10.438C42.793,38.75,36.215,33.486,28.106,33.486z M26.288,53.051 c0,0-7.135-2.093-8.805-7.201c-0.222-0.682,0.147-1.156,0.795-1.521V37.8h20.188v6.663c0.235,0.352,1.109,0.737,1.229,1.387 C40.445,49.917,26.288,53.051,26.288,53.051z"/> <radialGradient id="SVGID_3_" cx="15.2056" cy="831.1875" r="32.3071" gradientTransform="matrix(1 0 0 1 0.0801 -773.6914)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#FCB57A"/> <stop offset="1" style="stop-color:#FF8C36"/> </radialGradient> <path fill="url(#SVGID_3_)" stroke="#E55E03" d="M49.529,51.225c-2.239-2.24-5.041-3.724-7.396-4.67 c-2.854,5.51-14.021,7.807-14.021,7.807s-10.472-2.483-12.387-8.514c-2.439,0.771-5.787,2.287-8.749,5.25 c-5.592,5.592-6.47,11.67-6.47,11.67c0,1.938,1.575,3.492,3.523,3.492h48.51c1.946,0,3.521-1.558,3.521-3.492 C56.055,62.768,54.211,55.906,49.529,51.225z"/> <radialGradient id="SVGID_4_" cx="17.0723" cy="18.4907" r="11.8931" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#FCB57A"/> <stop offset="1" style="stop-color:#FF8C36"/> </radialGradient> <path fill="url(#SVGID_4_)" stroke="#E55E03" d="M13.404,44.173c1.15-1.81,2.039-3.832,3.332-5.397 c-0.514,1.027-1.669,4.084-1.669,5.148c0,5.186,10.366,9.079,14.688,10.438c-3.472,1.627-9.134-1.498-11.334-2.359 c-3.601-1.419-4.071-3.063-5.89-4.854C12.523,47.135,12.878,45,13.404,44.173z"/> <radialGradient id="SVGID_5_" cx="31.8184" cy="19.3525" r="14.63" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#FCB57A"/> <stop offset="1" style="stop-color:#FF8C36"/> </radialGradient> <path fill="url(#SVGID_5_)" stroke="#E55E03" d="M45.777,43.924c-1.317-1.568-5.11-9.424-6.604-6.617 c0.516,1.025,3.617,3.693,3.617,6.617c0,5.186-10.271,8.576-16.699,9.145c1.429,4.938,11.373,1.293,13.805-0.313 c3.563-2.354,4.563-5.133,7.854-3.705C47.754,49.045,48.006,46.574,45.777,43.924z"/> <radialGradient id="SVGID_6_" cx="30.4893" cy="4.8721" r="5.2028" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#FCB57A"/> <stop offset="1" style="stop-color:#FF8C36"/> </radialGradient> <path fill="url(#SVGID_6_)" stroke="#E55E03" d="M30.777,54.167c0.357,0.836-0.153,1.983-0.352,2.813 c-0.256,1.084-0.072,2.104,0.102,3.186c0.164,1.02,0.156,2.107,0.25,3.167c0.082,0.916,0.482,1.849,0.357,2.75"/> <radialGradient id="SVGID_7_" cx="23.2871" cy="5.3008" r="5.5143" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#FCB57A"/> <stop offset="1" style="stop-color:#FF8C36"/> </radialGradient> <path fill="url(#SVGID_7_)" stroke="#E55E03" d="M23.695,53.417c-0.508,0.584-0.476,2.209-0.398,3 c0.116,1.183,0.456,2.099,0.333,3.333c-0.192,1.943,0.154,4.479-0.436,6.333"/> <radialGradient id="face_x5F_white_1_" cx="27.5835" cy="3117.4922" r="23.425" fx="23.0139" fy="3115.0024" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#FFD28F"/> <stop offset="1" style="stop-color:#FFAB4F"/> </radialGradient> <path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 c0.086,10.2-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 C36.627,4.945,43.59,13.158,43.676,23.357z"/> <linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="6468.501" y1="-12291.5195" x2="6492.1304" y2="-12384.9688" gradientTransform="matrix(0.275 0 0 -0.2733 -1752.8849 -3351.7349)"> <stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> <stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> </linearGradient> <path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M28.415,5.625c-6.035,0.047-10.747,4.493-12.787,10.386 c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.54,13.244,36.729,5.56,28.415,5.625z"/> <path id="Hair_Young_Black_1_" fill="#5C5C5C" stroke="#353535" stroke-linecap="round" stroke-linejoin="round" d="M20.278,13.25 c3.417,4.333,9.333,6.917,9.333,6.917l-1.417-3.5c0,0,7.094,4.691,8.083,4.333c0.968-0.2-1.082-3.807-1.082-3.807 s3.138,1.795,4.854,3.969c1.803,2.28,4.285,3.504,4.285,3.504S47.027,2.719,27.289,2.744C8.278,2.709,12.058,27.678,12.058,27.678 L14.695,17c0,0,0.914,5.757,1.399,4.875C17.861,15.211,18.861,11.5,20.278,13.25z"/> </g> </svg> mitogen-0.3.9/docs/images/topogit.png000066400000000000000000002613011465666473100176020ustar00rootroot00000000000000PNG  IHDR _bIDATxXSYVfj,el%  CQT8Qs3W+seF{?we><{pߑpn߾rPWWV:={}J3g,Z(,,O>;wvqqwppptttrrjӦ m!رc"""6lpլ,}]vm۶-ۆ&/rut $<}tĈ[.גI򲳳>|xff&zFt^kd2ٙ3g\]]{U8۷o۶0"Zŋp//Iݺustt|eгgۻ:t}c: /r|ݺu]t==zСS77={\$d޽{F:ޱevO'ťO>zFt^_,--]\\O׮]mmm' k],-(yxxmٲ=: /{555;[_X?RvenYAۓڷo_N:aҤIT~ann5."3jwu3>^.塓w4pǏSPNKǎmmm UMzKsk liaܣG===uVr\wwwrsΡSPNkT*mժ3[^K.=m۶OQt$"F Q3Gqvppڵ+GD;;; wwwD6ݻM;wn߾;/@'5%66UVlXu.]vjgg7=gKA]wdK v,ھmwޫW/r%}v^Ν;E!۶m˗rt *9IxM9w\VC9ZZZvT`og}@KR$Ҽk/nչS6 ZطЦUv턱Kl6+++3S++0%j5*ޭe yg IĶmnݺyyyXk׮g7VsIH\Dsc``!2xʰ^lm[oˋ P"mmmѫSvm:uT(ǍStͫ yz: 7oҳgΝ;XZ:88ѩj.I)nP$ELýA3=bxNv:t֭ma7 rI(݆ #tͫV|= enN: B?~YϞ=۵s1ܼI~:i%-.;+mI=;Оڴvzxhw#:Q!8nӦmO;G_\nkczr}tͫgॗ)|tI-,,zƮO'3I{gKC9nPXU4wRI~{E9GWpb6=Ƣ )r@hmZrs̿ʲCZEnݺNB: $H``MYN~qUP/׿vWMZB]m$^$)Bˌb?=@~s =F4wc!w}A9xxi)~W>c*wi&wq?{Fbi2J={tuur : A$*#~~~[ҥK[=3x`NcѾ9g~2tJ*Uf ww wg5onPT^X1@$|ZT9;?4880m#;XZZv : : A$>}nխCr~{wv,w%?*&TKZ__OFi5JE劊ݚ:Iyܕ9ټN@u{ۇptwwѣtt I@'Tj|}}Nr:A܉aܩܙp<5t=`@iIKP*tRNΝ"?˓}nNNN7oD@'!t@efNP0N:;8@pjNZpI:i%w'FN')tlNRLvO979Ș=" tI dx7t~w"Ųn:|7e;Tt3HM'ͣ:2I35tҹ_39ԥqqq$AN9|2#w|0wrN04MJjEU.2M@ i:ik\lH|t tIiӦkSNs tq"wy5JՊaJV*u2Z[} L7udN  tIUVa=V;:B'ŝ͝˝]E.On*(JI+ n,ljknKR}_MQ8^'1Fﳘ6ٿOC@'!t@ȑ# 3ʏp'('NT P:tit}.uFC-rin &j[MᒮQV MIa=2WNNB: $˓'OƌsPtzWE5n6ߍ$sՌd,B*n/Sfڂn4]e:i6IL75NoX)!t t I@'TjRSS n/э$:mrfT<6J[KHbs4jܮ4U54PAߜ36.HNB: $ʎEZzϬ5+)( JFZJDH|Eb"IdҕܕH74/}fw|wO֪e;N: SԼeC?q Jci%*^V]N]/.ݔ.PH w_wƊ/-AW@'!t1 ?u6OnCF4V)4s^QD/ܥiܕYT!]温s3?FqLJrB.);藻S/+N: 8e%e yIvdb0mr[R*BWӣSjqLJtBK:ҟ; ߳m #N: Hڕ*ogwA u4\s+i$0P$ 'KL/{,-mw4$emronG'@'!tQ [en+;fP%A*dR$3tr%AI$64ɟ;,)ccOy3tt I@'?/EP5JF*&)["I咆+.iwl I*MJ$$AN0J鏞XGauN(/^I;a"I9(q=DԦI_bG tIF\DƚeS 0%*^IPK?E$t`< tIF+r3_\\㒳C~$Pa0J+ Q% QX$H"ahNsꑶ*IlP1e \A^mRgۢ'rr9{";ˇNB$tHO-:2sMnto 7敨ZR)?X{7KS|4fRqϻsFrȸ-\lt@'"QS¿|:ym]jT*)J-E>(I%%sMH~ք?N{ORq!2&$;q &$N@' M;}e! 3&H8uwі/6vS WR%(k$#1cuIC?T+^"y`ŽOW*&Hn!.5:I;#WJ–K&l)k.<+*q!iE&eק+Nxeg4a@1Mr]S~< *-V9ꮨJbQY$H9}&'~|L}fo=A L*Ym(s%$!K?`%+|dܦb_pFIu{y%kz_J$tN]Od_L뼘)C?KZ͝2d,^R7D+_Yi[i+Dlo3&Wx%cͳ㓆}=~δ3F6J"ABbI $d_4Ī#U kIUIެBG*aitt: /2~W鈯Wz:i~ҽ}7,3[?_唷Sv[iHH}wv^.s |s{zg.u҄ofy3LSI)M}QyʸSčmhuz:Fm!~grnOH2qŒ4mNN@'JGvMM~ȟ;HJy>}UBVY1]sxm뚿{vϼm/ֻ?_唱:}9Ik]w I{AM's&?I{Ԗ?$L<5rݯI)_ZI!}lq\߷J,!,rmS GL`A}>{~Ww!H?qIf-KlCΔI527@T 庍E'-@-L4#W&-:G>m!ǫ3W9䰀}k_YȤ:L5D}+V&n/ʮh4K\[FW#$W^psݑfmfR+yuN: 5E>o}+uȧk߂խfkxᄲHFK'g|\3)ٖ֙Lu4]SyU[ODuW~͟VNC%Cau:aLEn ;m=Uǐ5Jz H>Zr3uҜc3WohOSĮInmàΛU$N}$ ϊuV]>F2"F M=:Iw?wI@'H$~߯Z\7SB-(蓳cc%$!4'g(pг6{& H3n|$~7R!FNs{pN.w*ޚzU$MLTҡVKެen#Tߪ*-틧hGFmϡtY^E]'0q{ItR35QL(EU57D#mVWKdcacmIAA#MI 4c}hb'4~+yPݜ.9\So`)?髰EC4rRWtHpNn Ǥ9pM3Z}4NQ>6gRkJ?zHJ6Frɝ)75-ةҳT[ ]dV&fY'S oıѣʩvP9\_5wu 6 >w8LcaS=I;%MەD'1L]4N^עNO?@>[J"]q$tS%o bkӚ/|Rz0,vvM<^0 3!fry$L lJ=Ԕ}vt\ 1MɑF[ym G$]ҩ?&VM +_IvY%~sy7!t!4(t/*0yY޸T~ᄈCJeh>ViI3~ǡi!, s`" J4 :Rt>_xT9Xk~ ;9"6d:HY%anڔ=a4n.^郏;*mAyD.nHy&$NN4}Ob`3"ZTM3kmٰ揭?9;5BdӣF=}}Sl\c]v֪{7wbga |eOn.n+_ͷYLk:࣌~x.|G'=NeK,oTICx?UYYI. )2{KW]j itVV;*R' H!ju҇>2K%M4oGu$Sn-I@'(3^u"de[.H\?y`_%OEXY{r4wzw:ܠ-;=:ֹ;6o?tay|7ߖg1 49qr= UIS7i%rNbsxCc6dQuT06o4{zR„5ïU30o[vŽM G]լKFUUus!T*(Kn*'iP>0*e5KWʅ4?䚤_lNX;glkfsJI`xwN:}]mREǝ'/t3nڱa}{/]ѿ))))'_RI~ʛc#_⢩,^#TϹ^:':Y'1PzJ' G}N\;UKaFuPDn{եSvM3W/ʪng+w!zSS%v^Ԡ1{?߯I'N/}jI@'(ƥdW)>lIJhܥeۂ 6ej4v~uIyp=!!ݻgΜٳg+m\p|˻#Ȕc>9/S?9GDްh|?FZhq)4j5l_K uRt9"xLcI$ʆLC a[G^Qhk^?>!kzʶȶJX.1FFt~/6~+>(R$$$<~w͛7\rIk>yHT$%#qUHȦ}+ѿz֤ФٖO~戆y898V,x{RVm:kIIAQ#[!*$8٭;eT_UM+kK_孪2֣Jq~[%NX{&:));'~)u=91Vҍ>1]4N{MS\L-DJJJrrr -N&.(>xN(/A|EG:4ii9Vk%T|7\iO~׿Kdy9辗 e 2$arc$l^N)nxh W.q)nzEg)N2PQ'Q'kdoio7Y͋][6ELy3P'&pC9ψRK!_IE֪$) kBtTKz@=D5(gi! g!Eنҵ=_̵OP3[q56JMNJ5&횞0$~"ԡ̵$L]nslkЪۓ~ϳYqs,9lS׎}4WKAWn2ƮkO*Mګ'|-_iHzjvW?*?DrDK1pLȣtRqoS+5C~o{ENIW-mx(G4+Wt.i[,w˛Ҝߚ:i.If\)7UƐz}ܝ F]!Z[OmcIK.Ex2>|&GS:idJd/y @n|eW,uOv3P'Z9tWk 7X N6uu0ϮzJ:@$q[ST_8 tNNW4G4Ϊ n%1d*;Brc|F~E-u.n9I{IC%)M}w)K?/a}{T9{'ާj!uM)|||eWy|E'2w颶~VrGy3LvJd͵TH!e)}.~#_ ܆6vD2lҳug*wB$]bp8?itb%I6->-H [$_Tmz&ņ琯TRTNbFI4xQ W߶/f7 #Jht%M]]Ib_^;)=K;aY: ZI/bT"I=B YIwP.s&X$ ZxqpI ktWFv]#cOI? gi|Y#H0Z|'#inMDI?L-9WyW{*%ut-s/X=erpwӇ6γ/W(j>N{ Q~#_e_Ħ.EObƯƄ0u_tWƺf~}FAj5TWU~:Ac*zvVS5M/L?oB1_ԣȭ~S^d{_: $$x$>ovĠg6C]R$]do޺-C'|\3u'#M)+~#ʊ1':otyꏨBRX͵˚<%9%%vEb:ɂcVH̖ijK=J.-@es/ѯAHTl:d: NCZtDLq%AzDL+!EV'^$Pĥ߆3k>\uo[i4AcH~lO>+誙mmJ(d:qj8Gǖ8n\R-ڏBnOɗɗw.qK({ D'/X6omԟ3F}\3)!OQ^VF:VS'$j< ).fY/ٹ%)$]F'ͤK2lƂtH]ז G06liNʜ{!!M"i!i'i-i^mNrC_,D/tII*!$Vo 4&KR0͐-F)Dc`Ί IuZ7)|^oa=J\/srJ9ɗ/vV$'N:P ո5t7Uox4'&ot<5tbMhDR0ǧ!5ɸq} TuKb JTq0^_.2@)KJ+Wݿddܚ6mZV-I 'ӝ͛G. ttG=>{醾T'mIlh`KRM.i@8=ovvn9ʏGK'tRN͇ꤑtҠ >52"$?N=:Eβ5I'ȦЯlAC'mVWӯiAk J'-Og+R'6..]4v͛Q?u50ѭg[Bjî g"k61gqXĀ!mڬEOy 33I: : ^/o_ϲutKߦ6( IYSM.II'Nl4fž IQgıĥd؍e,}zƍ Q[ǰQ㗭|썿&dCO!KܳyI&}'|<θ̝G>L{ܼ%kԮ'~o6222%%tNNWظ?$ #][\'mIlM7&Ia*SeʹI ҫd7LNZ)/d7 :I>g#<׶_O_:buuw\1Dw*U4~y~KVltΈY$ (DR1] -׿,yk<{|RWC-;+kX )ct ]WT}"T"zK/CG@xqgQ#$}ypZmgtۀT'tJqNz>"$"tܢuIj-u4~~#_:߼q\r}.X.;K5wM  yGI%>\?'mժ]G]*EDD $yz$Z5ݩuB'PMI()/]$Utn z6݂L'm'tR|x/9tJ:ɗw/I%YM&w ׳ǯ=LNBIϲ;9]ˈ%I֫o'.$.-WK&b]ҮOhϦVBSIYrHNҪ]X'y*tbNrQ6:)F,:TNhZ!ߠ:lp(Hb1 .Ӿ`llz{8IAI%qIKnMsc5jxK@$}+uė+RZ$a[6 JZFi"I%@G'ܬQ8IWdtY7uB')pt>4۬HDl7@C'!tRYDP$ q R5'-8;;3#3dhՠ$MQ,,q+Kz(⒮D's&bl<ċqIWZ9h޼9bٸaI$//Ђ-DB'!tKwgq]6FK& OVc2~L$dHeQ,]}K2B[[[7@'$$(Yw3_:Ҿs8+QUީUJc:ztwK*E tIqSTutV\ެo6tNIINBr֖?ї+֗"nJfKx 6\~NI(d1dY4LX \N_t= Q$3 sW~}3a|ie޾i"n$F-RhM:r%tNIINB褊I YwM6jwSC[_hUz p;$ IX .u5wu.)m⸤މ\Kwoa^7wvwS.)g Y[Z`7"P1v[|kI!֫!,|=wԲZ꽤}.[~1?QW'CQt/EpII: @'A'餪g`AJn22_OV4af-̭l;u?`БΎ^aVoYŲqJEˬE$!C r,|Ӥ߀avF-"HHr: @'LLY*퍘2a1+eQ"q;s~tFḼ}~t^f}|D;vޕ{$\;?A'$5Rw1jDx{{cI]RE܎dӻgmo|T㒙}&6m:jz>] uI):\R2$cgZe L- ֨,t' nKlkp昍{Iv>ꋸtIw]t: ʗ}RioDh!tP2PD@%IuIe[\ t/$t0&^gt14}Zy:;…Dq|H/yϲKt}\B.)M|;\@$wLnX4`΋NH{:{{Rib%ϊ\!<Qb-K#=B.R! f=ɍ<.ȣvB>ё'%rE?l/x& AO8Ot0^Rt/pc6;]b{u}#O%D -Gt}&'>Ɠݤ> <.<:]颟WI7>Ɠ&{I NH)t.1^_&?aMhx7SX}>TހI Ho@0.1(]}mtHtN2JI>atRa0:I1:1:"߀$0:v)]C%=e.麶KJvIE-vK:tNIFƈNҹ۷]R.IT N:w; :  {[;uX lpzN*KSxf n^ĭKNZ@'c: `\:ɐbIw^"n$$t0&BcZے(y-d`E`tRi%V"n]?IN:%.V\.X:IN, N*EtTQgbvIgLjԀN;Y 1,Ǝey-P pq/t Iz oUEܴ]ҽ"\RtV"tP: I2'/k{\W餒.v+vm-Ntl.c|btR..E I@$`Ld),Ų3|YkSW,V;I ̑ʸuG8@Hw˫$cYĭKNZ@'c: P&ĥrHb)nN*E"nz\I@$`΢ea&FL$9{ K{$eͧ,REvIj%>}IKW$CGPz pI˭6̬%^MK2`7NSI@$`@'Jln T3n>"V:$C]Eܮz$$t0J=eK*ۙnAsC :"nJfK;- q+NLh3tPH S'$ыY8mˢ0 D"WPda}{a)6 vwhʄ|nvqTnqt\vݧ_͗I.I@$`@' cd.3ݼӳfl2`uTqKNZ@'&rV$.;sY#%-7g=b5ٳ,e퐠gxn(S o@p\IlYyt.г6V0͛7;v,i ZIt@'A'!tq{0[[իKVVVȋ4@'!tt@'77o^``sӦMkժU2sDN$ 8022\\$: A: 66:thu!޹sɓ' @'I@'!Z$$A*Nz| I$: A"qnr!Qm( I$:r[(IYC{82fryWN4r$ld–ڈZr6lb: $@'0:ٽ\\+ *뤛q1y0/HzOÔ^λI`%+|dܦ]:?^m(AJ56-I@':uI$~BG:)/}#" )۪IFX)~Cz: : @'A'bINzN#I$זۿr^cc$]U6@'A'$$$ tPf["ynIRo!tVm`b)>Uuެ"q#Yx:iƯqAm_:I_Ͼ?kɧ_kO(pA:Iw?QEss֢f]I:ozT/ݸ#nR.}jl,{ ORj"tRP$/}Ƚݨ}n#TuUɷ$Wml/~&ΒO>W(].Ig<ϾQ5I0YI@':r${~{'$l|@jjk.bs=%Y9IS]kk=#iHj%hbN2K]:ɥj\0Yi^FN*IPA;U&Faڮ_ęޠwWZw)a[:F?yiw'$l~>Oi)>|L( ͧC(2{dޠHYu_5wu q&ȍ $mĐΟ1aNybN: IN'+ѪxU9."upO:)>ѺZ1ȩkK dd`V~DԺ#ogXM 344BuҌ_y/P(<(t3"safJ'5)##nfkts.Siȏ7RO3Eﯦ^VPN#/A'Jhnk1cL qo*>ٷ*Z'uhoOϫ/ܦ3 I+̇F'}Lg1r&5mUf³ ]*;pmz[7 BׄFj֥D(ҹZ>QukbN[ .~-NtRIp[%hRR7rx+_:هuu -)N$2iG$3Ww*d[3E^6"_u0mTZbotb ,.tpk9핅;}΢aRFm'YxΠUZMg.N: IN'](NCN ,bL[UIEP_ wBJ+R3Շ8I:Nb@!Z* ul=fC[^٠BH,c7!Q_/qh]|8>xRhWݡ׏;~@㤑WӲ<&{\CuCHc[S0gK;yn;0z^Ytgka9?mt?:zN}( I)N_یir4'i&2c\MjdDLo=ZM't/q\[z';uj{uXJ,{Ӫ z7O}] H8jyHopTEIm$5qWfʻ r'z.?נ7nnnQ.fpY:UjGժO=kNwt%lW5k"g[ܧ[ⅳv+'qjgzv2.P'ij/ptגkR.syo 3sd!J+';%.,}F[$/ʓ#E+2VWK&OxH.?lk򚨊8T88 N8($$@DQIIE'$"N"N($8 'QqqE' N8(8 qIEDDQIIqIE'QE'$"N"N($8 'QqqE'I8(8 qIEDDQI N($$"N"N N(8($8 'QqqE'I8(8 NIEDDQI N($$"N@qE''Qqq@@lI`YT⤚;0EQ寚Iq''͟q(Ԏ :<$UbIJqqPr82@$v8 X KR%vqu.&'18 ĺ%;8$F!N;8$ӎ !KR%eI 68Iˈ@*Hr$,$w%,$d[K@EbTAsT4mؘq򟎻bqQ S3GGG͗[ğ(,MI 7:ntٽ<#9Clc$18 ĢmYǾ $s.]6zMn &Nb#@趐oT8 Ĝw;?qq*XC' Iq? !Np }6I2W8I $.?`C' IqB@' IqB@' IqB@"ŋ۵kWNtC ֭Umϴ4ǧ i1e;!@d)..Yԩu{~\>;wӻOH;WMא[D$YUl21//O<ݻw߲eKvv]wݥ7>|XܪU+^zoSo+..>]H;W={سg Q@)))Q^pAo=zV5k?qҪU7kjcaa8}t}ڐvdWVгgO '2|ۺk֬IOOס?gѢEjƳguݻ\TTW;gff'99y̘1Q7|3y+ZLiĉSRRDn;ww7 .n'N8 D.]gw^l߯68PmYuuYjР֭[իge)>>~7tu{\\ܦMg?~\rPwqꋴah;H)YYYbŧ荺R׮]Ֆ1c:tP:uTd[KN?xFQ 55p,~I vkj 2u:usNf[ғy yyylLܰan3;77Wo뭷Ɔ -z:z9??yoRՉ.ֱcG~I vvիW[3(;;[=g/뮻Gc¡CB':&>˖-O8ٻ~YhB4yÆ %%%--((;oݺwHtI5]M[RO'7dy'C 6T{n6%!!uZii8i׮]q+yI5j_qqqݺu۳guϟw̰P$xPM8 NIW޽{yȚ5klwzyM7Y]E'ճ={?۹s3ԝWٳǺ&.CGf1("N|j׮Q?a>dee N(8 NI/6uXjX_ZΟ?ϻ8($8 -[oM4;p25$$`ڵK)6l;0p@5k?8($8 7xc׮]+WN N(8 N("N'Qq@8'IE8 N($IqEQIq@DQq@8$IE8 N($IqE' N1?$"N@bɒ1ڧ?* Z㤉+]^^s.w>\zqյl +y)$"ט}>:($/pqq* fo_[%:<ڐO8y-.~yekUgIFǑFX#{qrȇCāpqq*8ɺqWb_=}A'wT3W]T*Å'8X.Dzzjqh!Xq 㤺ndAF9טzkƥrae$$I>cߌ۬G'7=<0e5$$I Ȇ}ӣ۬0F9JDD'D񐯱omQ'O0æɚ=쵏eYG-b>0g;b,Ϭk2u:UΩ[HI2Vf~2Omkڤ79ř8VNZ]:Dܐ$8Iq@)6{t+88i~#V -uwg|v;4x[w<ɹ_kxv붻'Uz*s" Vq]=;`|(C~yd3IuF8 N9uNT`+l%,Nz}EGwРK⪛|-㤁/7֨麷F-mhqR!ljV׽Že8{#^MGk&6%NjUٜ6w'Js/Z5kFKbw|3}I k8 c|FKDYkMs=̒Ƀ8 N-;> 9NQ'=nF #f:gjdVIkRaG0z5$'ָFd8Q8IF7;732LKB"5t̩J+7/' @P.]6zM !K;C(Ԙj<nV&NJ𼶨KF x lnnaOΏygknbvv6R]b ;FE*8y` 'T!Ibg $&O2'1NYId-9_8NғٟHqRsvIլ:>:}٨3]^&h*I6'S_BqGtǑ2W@PJo dIb772NRDԈ劓|sfY_qBIRz:_{lFd 8)fR/^$HJ*I$q8&NRSJW#@YT8.SxJ܍e#gmcԸ\cN>rVU'T$qZ=+Q}-W4jsYgqT"ɱ`-U紮fu%?_Xa>Kߎ3sn4Yku[.c N4 3@$v5N=\պ뵙[O>vg.TiIgo+cdDuΏ.mn-æ9ҼmSqۚR>Ldt83O/@){w8IDke_Z3s̾*'9[+c9Ӑ5u cylw6@')O8֜FI6g;/ qm:(GTR3_h͍̙27ϦS(` $CUnY>_}N@ k啱^J=ήvdt鲱C*Za~I'(D{NW`"8i,sOҴ,ɶ'YOX:9M^^ﺻ͇ԗ9L r+#NRSibC{Ol-&=sEGOL_/y=IzL0Μ@pձS>$q}|f둘3s'unca[ ֳju,oUqqR2QDsjƻ/7=3B^Ĥ*l7O$ψ8)9/3d'8 Q$8IԌ-CJ&r61C^[wAJQs'/_ks&,S3k 9r]v͝Gjjq989lRTw8SOD]Ϗ4'*=c?PU$_{'9NXSv[*;ׄ2F͑K^ÜrP &NӜ@q:Պk5lfUhfvȑ#_}UqZb&'YA%A1E|-؜g;sq3ܫ[vК8)e9fU-msyQX'o7okk45ᬅ{d-VDzTXl<5CJ$Q}''|2ym~nmܩ˃}S1z)_]*/?6z?zJze26'꒘t_vok):uꔙ).8 UB+ UXC*>3]H9O%Q'Qq#?qKB>S7o4c?eݮϿc.C7?_]΋Rf*߿_#/׶_]zė{<6~{wΜ9~-8 HO"UQ[Jɒ>'IQkĴQe$8 F?D- )55zJyে/}?>9x rו ),mY>WjLJ_]0 _/.Ap N Z-)*oR}?sjr\ }ȁ8 $"N L-zvB"qEExT|ƽcʺr1% ~zxQq$;%%KY?|fI%+`q>ԕ׭[@qE'* YRrnNH/ 8awqG}T%2$w$,cp,Zt!KLUxvD~qIEإ8;FQ']I#㌓%?C<ңSE|eIW$,霏,T*(RUҥ#|΁8 $"N ceJ4q?qEEZwr^f(*0o%i7,+,oE%kR9r$΁8 $"Nķw:?Z|Σeg댼IJ4:iX6~̂L/oZy֭[W~hYR苸̒xO/eչ&~qIE$}sևBDQUqe7 6c[rƔ)2,OF~=~Pr.f,;K~cՊ&M NX/5lZo+x'zM v”|$Bq/%獂"٥qE1mL3&Cm۶:$(*Ve9]X;16*U/?qEEA@9O/0%OZ*I~E.,/Yҿ*))_@qEEOtRھ#дe3|{"N؉%=ܣZիWWqLߔ:%c $ߋ]͒JYLJNTu5j\G$(*$<5#.*HՍ>'QqRRRΖ/T.s͖V.v5K:d8Q&onаe@qEE[̒|M]Tfk>xaqh$8S?ek=jLlY/̒ C̒L}0E>9rz׶Rnqߦmw5q N(Vv ʀLus%$"N򎓎ߎ0fuRsK_BζHXm; v/˻fԴ1'8 $"N YR9n>Iq,ig_PIHO=o~ɑ̒>?2g_~dצUO~bֿ>o?RI N82- qri|kEħjIE:1eƝvyIѣLeo( "n+%$~$$'@DQIA4֝%er Rcܸ&n91_A#}~ėg]?6ZjZ_+U~MT3x}_[Gy}ßf2ER:H/q N( ARrHyϖ@ :Iq߾\b3\Ή7ԪUI 7j۾ӐgF[}%?r~$'@DQI1:4^()@9$Y,K"n;.]~RfL~=-տlQz77En=>5|܋S._ήKۧd,鬨}I N8*>c<5(,0ItyY%],i[T p[gyMkӵu+[n;չ̒%'8 $"N 9e~hSP/Zt#KI N8r$K$3KGeI{@qE'@I*?KҞ%%%'8 $"Nʎ|N],ΒGeIٳ{h}^Y:t!NqIE'\ۇYҹ $J/uLJ'8 $"Nʌ'2K3An^;K"NqIZy+\{2]0q\8)rq "K"NqIZ5@H]osC^0qD\Yґ/@qqRU5IIP8.jd T'8 $`덗\w(t#NqRXq%8fI~qﴈw/δ#NqII叓($2N$owqgItC@qqqqTnTE'޶eII N8jIֻp5͵eߵwkCkTY |H bu3d;}=ÌeXD}/NN.ϕՁ7 N%qR, oUQygIyI N8)ﺺM|CQwm.osjP׾ͮt~I6ސvQ5ɔ +ǁ[8,*G'qRUY;K"NqI'[:B\5$'Jgjb>*o#Z{Qq8䶆C(WSj˓׻ѽòӓc=QOTwq'U"nEa[Ow8 I'Ep."myǔ{>z즤ʔGo{uq?dX4;;N9ܹ-\l:%n;8 @U:%VH{7YR,)ϒ%}D$"E֨.;8 @͒|/Yq %Y;%]͒@qRI:0֪LQ=с7]Cz4g{>E$"7No{[w75_o&8~9ђvZ63ٳ<8IWyFuqI1'Ռw5mIQTJ|VTEYRa,),ygI@qR$I5˹,dni`nqB[Dg5}ã=gv>'n$/;@QTT8$*"nx;,ig'8 ȍ:c.֠;UQ9l)C!JFQ;{ h˼qR9vdC*5N(XCDDQTIAMUD,%}#8 I'Ev$&(PNft?iscopB5_inwkwϦߛyȽstmr3Ns=N@Ngql8qRI]0 N(pI,C$'@qRrW3<&GLOu3s2=:r˞q8V|jD$;x#!%:ٝzDI']8Ph,zxj>8'UZqYm7=MgII N8)}]Ź =r;!*?bg58ҿ YYjmCj=K66'ں=OkaqRINk>0Iղ(*f`$ߋ̒½Β>,pq Nu-K7$'@DQ'],Dz-lf9DHN(8 J~Ggqww[ɵZmW=K'u&NqICqұSe#X6_%dE}(*3FǑqRZ+K:) q N/5v|*Dz%g 'QT, v;|((2&Qމ+=KRv+uǝ'8 $8enY˦zZn؏?qET#GT+*lU-"ndIޭZ/ NhٻK@8b!N:YRIT뮏\-,;H 5K5;KTVV|:$(jI_ݻ剐t^8;N:|\-?2GɩJLLTŸg;/eEە,)/`YYҐGw9'@DQQ;i'!Od#Is(*.8sU>%͟;> sQQQݺuU"ӻO~O,0@T͒ɿ{J]yBB±c]I'QT̝t'cEnms̞9'8&NtH_ ?匓%#!G%$$\旷1{_o $,iRgIG9'@DQQ8sK+BΒ:v;%{-=D8"!NZc~'믿n۶z¿SmsƂmw֗*.@qEEg<*Wv )Qk޹gf;/qE]8i' ?Cff_4|qk6}X%acnŭĥ?38 $8IywcBqҨΟb㫓}w<6{g5ߗ'QTDIgəՍAZFNJMMJBÄF)S?[YEܬYe^6z"ť N%X`?k>c뾻iwQ$qҥNr%~_ 9s{./ u$8iǧ tԩ͛7O0!))vڮ &"11Q#gqͱcyW_}uȑ>}נA%G@q??qΜ9V$(8)Xߗ)xN1qEEOTn8)'_΃v\]رcEEE^;G9_ N(qR|VIDQQ')I*_JqIE]8IwH iI%q<ӥie9S3ʲ#@(*$ʄJ?4ƺd($N*'I NIq}Zs%IU$;_$*c qIET._4F͗R؊&tMXzy}xŠp*2/;/MTy͢a4~I,IUXc"$(8\>:(Tt NJtx(c륵u>|=W U˾V/MVU涠$]}';>78 $"Nԏp%Tx.| I1'VCgf{ @qE''Wuo<6y *!N\e،J=&%K d IDZk0EQ,Q"N"N"NZqҥrdI:6,q}R-z.IIII’aȒt=2NΡ,q!55#οzl֯Ȯ..[\h/cX :8ɱ^'SadM\in\Dz_jߺ2Pyeef55tkL}=Wk]7ųZ83SOpq/rekP1GiyաI`+q΋ku X_ _8zKI_3Kݔ.'h 6Lgﮒ/.[\hhbGeIKэa׸2)P2 '&\fWޮj.xx,e}%cw/GI'Ke:oL[m5~b4@vS۳rTX:~ͲBH%PCK#nw6zyr9lm>wCU$)AC]}>qtXYqүv(5X.'-a"$8 Ē?w0*(qfƂ8<ʻf.аG)$[f$j_F Wt_ }8[B]-#;yefRęz547.Z֨և<̒ęf'`xN77z6{w\|:7=Jng /1^(gY#?o$۶~b$g8YYnxFƊ&8DM~LC 8)+߲_ցc剓#=#Blk`+5|Taqқrr(q߬qGt>qs$uxi[h^d&|b>W{9ݳ/UnL7sjl%.2`%[nVޕ'թ'NUqo. 'plnynaPg/%fǮ WΉ}^\[!^!OZR8iTvK<'ujlѴ < FO_;z_^爙rv-NYLӄTN}9fz%YgRX[w{̠-ԯfk/1q@PJ4l6::ϊ*XфB!N TX+5bf$_c*3NJgP\`< UDH&]x7''|Pg Cl_/8I]L{8 N.]9 Ƃ&Xq[aM"Gl5ks3b%NR'8bpjY:[1gVMNݾܞաGDzvV|k뿬'{B'TƓӂV"h{:?%nQ N_ja/k[y\qҨ9eͧ2$tծk͍[^Xa^^ߎ3sۦSqs[2K|yN}sپfA'H˻$JR|8HEU(ihHmK4'*q3QVTܕ'u,mx.EGGgo3O(ؾq4B;9MFzgt|iP2!o:g3lq~9.g}'Ia}1w( !ehi։$J2?>Q_/qh]|8>xRhWݡ׏;PHGm'YlnyI˸I$vKdǓg6hBN5$9yIq@]l0q^:Y%B47A@qP8VK1W& |U'y'z.?נ]Hvq_c1Z֭v]WSpB=MX~nnd>JM>уXï%|uP N,{rS9mח8 N}'=C2%nhNy▂8Z'@ db'e)9-cI5G%Jz 1-CF)%<НXSQ=6ZfXz{9hOݏonS_6JB6c\/I=椌qX/7W~'Yc>[V'IUXl)WtꕵQu[DsOčI!oַG2WHX̕S8sqspÍr57ҩuW3:oTW3yB ]=9pޡqs -8*SCB'Iһ{Fuz? [-kmq+ IA^*)]j8"N@Ad۾ǣբQ35Q- N fo%kvj5㤗'QI@TX%㕒FǑxqQp4[cEMBܐETqD{j 2pVW,Iq$m.',ˣiƊ85|{yZGG@D'Iv>',9QX4[cEATiNuu$65yMTE ZOBD'\ucGr\6V4Rp|'QE'Ս%eJ7V4P7V4IE'I!;v*kv&$$5? OjwC4PT4?qĭqE''I vSsTwm\)ohhfRM@'Qqq@bwƓӌKV`1j~LLXd?7M:qADQIIqiUDKE3EcADQq@P.1RLC@DQq@'QE' N($8 qE' NGcsqwB+n%@DQI@UF}\AXq{MqE' NQ"'_/,NTqc7IE8 DK^$$"N'Qq@8'IE8 RqRx4'I z7r1'/$8 D)rUs'qK ^DԎmСx@T|mΒYFn5#nx vI J4 טx vIqB@' IqB@' IqB@' IqB@'.^خ]:uꤧ*((4hfݻ·-[xĉsN4Isܹs)))./ ;w!99CFl;[VZ*SLn,oJ{\W7Uqf͚uNۓ|%4aΝ#qqqy+ p_}T!IDt}~ٲez ggg5JoLJJ;={VoiӦ֧kժڳ^zo8"䋯={gܳgo|D«8 URRRF Zy]r?ާO_ϡi&~n:wxBqիWٳ'oJ{Dȫ8 5|wmڴQgݾrJ_ ӧOW[.OΞ=.*ݻwW[7:z$![xO81%%E4'99ysr5Iy  $"V.]7{?zEk2;_mÈzHu>C:uq~uYw~7A?~\믫@o {ro3!T ]vU[ƌΝ;'N7@>o`'uoCM^7ɓ'ݖ-[|rϞ=tRSS5kxk 7t]N5k֬L8xm/qj87@y8 T\\i[V7,Pkf8qVZzcrrQZj?z>}SRRtlѴiSǩsjbiii:5uNiӦޘe˖ٳgm7III* IDf͚/zciig4A_}߳gO5ƕIM4޳F;wtL iѣGm4h`CI&7@>o`'yZEouA ƕrm_333Mg8@j*??Wr.]l5uΨQlŋg߿ШQ#yyT W70X?{o%Eu_Ip!w1!.B$D(JEW_ЉCDED% E A'〘1  NkUU=|>{@/u>ߺu9_rVRݻ׿Ο?ڵ?\]]MxW'Yp?eE>~##h>`P/ ; 9sڜ0;HtB׷<|p..NsiG}4{*n>mGg..N:K͛g.MXvm'\\v@Vl2=9sfR܄oQ4端s@ւ̞=_lYw}AlgS / %]~=' $v;~(..n a#5HH;)?>aSTTDϱᑟ AR%@ )`', ZP/%n&/}͑4"\fr)BI@,AXt諵R}!\fr)BI@,AX<8Ak[H@ L.3!R$ D, @%KH"$b B @%!b  H%%@ "Nb Bl`Fm} RHX {Y[h8PE(\rY)BI@,AXlۡ]GTzF.B傔H"Nb B}a@.EMRHX!R$ D, @%KH"$b BX`'KB@?am%rV.]R)vK"Ö>>MOh rE+n*)BD,AK^I1H@ "N"K"0wVTyvnRRH @`'K%Kl(nL^0 B)B;XB,AX`C*s:#` A*T R)vX [Uڬkm5@URH @`'K%Kb4?9Ox`V !R$b !b @ =FD3vm&[traTf @ "N"K"dE%Y4{ygn>lG –;!aC @`'K* x!R:1Ȍ09"rHǛ#^}idz.ビ/cJb njښ9F{brIN-U R)@~`'AŒÎP5Wm*<M4>>bEJ*{l7jC2\N% {)>sm5-+䒖 ;jORMH5O @ CDwU{' $ @ݩov c諡(PORMH5O @ Kڠs/yF<ێf|QʈƋ ow;X1d΢+O e/m@ )RR$(Xn;{nn`'K2FܔV-Y၂C.{8E=)@IHXB;k;%K%P<81yR =;OWfh'ra-\reT#_ @; *c=_-zt:o,ʦx '#Dw $qE{hڔlP6$ߕI}ֿ"$/z)K,ώȿXkV@%6=Fh7 ѶdwI-IܕZeV ۑKT.T\墕KW.`]#[Iea6zHjSSwXUlRWla^R_oz; ; ?HSuj<+'4uP:ѱ2ođwϹG?#{ʙ8I䖇KĘOdc8$rՑCߠoP65u1X9Amjo]:M~rZ)pcIsԩ4>{W tIpB"\\Re>1[Qp<,OJc8?)vv九Le̢hs\3VJsan|0Fh9i~/Hl]?BJm]{?_Κ4:5A,߱%cե/ꟷ'#ߊ3ָ"/&6iK$SvuдͷjejӽF8GKtT뛆PrM*IG)Q>VC9\re*# %w鼫F48,L3c'Ko8?)vv/sNѾ=̾҇efN2K\yJFݴ &Id:i}W|aO;3ZkNw [oC*ŴJ $NJ@6/uhe\VK Ob729@+y/;S`IR}7O V;ImI;)ߐ+[D}k6IC_4gb'I{gƬt7~}4~V=n-gCo߹+<}\i* ehR2İ]=F01rI˅"HȌʃR~dm ;)X ~ơIg'I-$NMH r;IoJpf`;I_2QmN̆Rn+' dlϴ:3$-A NO' T*|~\, PL07(tԒ\%_|9U p oWu v(o<)@ X?p 'H_ xi;){I~r6IzshJNr^kN IN\%Vá b^4M=m$@1SiӦc.g/ 2|e١6y` \.u ~GI"G)@ X?p 'Hk $݀d7p?Z?v>D(]; v̦hL5zUcIj s:9f' U;{bMd˓_C`qBa!\Io H^NE6kS`IRH;pZs6I N+Eޓ$VӹDoXT_%-A qjXOAAoKԴ|qœ/$aܰ1+K$'5$(W$(Pwod }-qM}Sz-i1INvR@}!N2m۵D-/)w4xST~\so8~qcxҦʝCҢyx*]]b |qoVldijӚATlK!=/bבSX ';IsI%Ug1K7W|lJ8Sdn#H(];)603o'l[lq\gK|[7L?MvObn9ݜVԘ$@1OlS呣D+%>5DZoK{ " uRdU*m. ,u<\ <)yGne֦No>; vz M}ѷgii/,L[$JWcl'Ix' Dqfx$3*;J^ yWNqyݐbx,|f&vKll8X።4 AS+Tl5^bď Qw/wSs&dBhC{,F#UC*HPSDa!!K X?N 8߾q$R ?&Iz1$3db'}k2yA~4$QӼI+#{0Z%vRRҞc N JhȌim5=: {WBgNÉL4CYxQu gŜ?͊뷘Rԡs.X"}Ar:ǯo8fd'ڃx: Q<㒻i2RqĀ>>HYBvƓZ%لfmH,ե{{)ղ T<ۇs(ln8R= O٠K3b-&?+ @?KR} ( II1 kCIIU$KJ'F:ݦ0ZJjE;Pfbɲ jи@^ cF-GB#1;PʪI$I`:cv>A&f;\m;x._Ē<% rۣd2&[kkB!/sN#/VnO1"Odm @`$$IIi>ӪoLN`555۶m|}u{fj&gBf;Eai}US NE,ɟXͷڰ'N#D7rv-%kSIޟlHt?WFNx/$#G{\sg}q{Y(_ܹsIIɘ1cdiNISe] W;It]9jD:oXgdEU'N#TPFopETf?)vR }ŶL(Cz/>]v͝;}5Jz:tݱ#c8g'/ N54$OSrK54}OIb2x|h=_SIց;I4uQh?+Kr;i͚5 jݺ79^ܵۍwݻ3A˯N5z/eبgJԳp;f'7w/\v&RY`p:kb>|x-Sv5]K>UUT?ikV0߀G:]u'5MO?cȑv p5t*u<4=זvBKUhI8kDzI.vcyx/Ͻhx/Kxѽ̟]3HDl S\\ܠA!?9k6n~ٗm; y>P$чOе/^y?w'6)a&;} jˉNBXB>$!?)B.* =F{ɐy^F^bni'5mv-;"銖REIIǻ?[z'zvXyyW_}XMb~b槜'6YbQzkqb BIa'!BYݧ嶢.mnlc5^t'&MދmfzI~WMmo/O^6{/ify/W_]qMMM:߉N5"E%a'O"D>IG;\If,ծO:fʶmL/閃K6э KƆΝ;t#`yl̞ēJ%mUEǝ>c{S7 Iu?b BIORN"@(WRMZS5oz/^:4^R7^{{iYt+:]W^R?y /B/ŋSTO'%%a'O"D>IGO Pv0*Ԥ-G__sxz/Yo\{K"Mm^M|c # D>$!?)BHmZe}hd 5u}DZl):c\n?YY,R^$яD#i{]Gm#̦D,A;|!$vB(KRi!S^cnz'\O۹[m^ "nɼb^"M6ս.{I "^J/EͿVuhܡ)8eIN]-\mjxb BIOR T )@m'ڒufzb֡b\ijKz/VZpCSK|O/iGu_I/E֭''9]ʴ#kltX|!I?BTRHLVͯTIR?W=s2ܟ2Ez/[A<H"gRK>SMtH>~M?T]?յ_K"O"D>IGO )@=wz"UKnhd D%j'uvO8QS6y.q]yNf}>jy^$b BI'QI"4^,^bI\x˳Z#~T;_S禷9"sWO;Wۦ"$%IOR D vd KNڶ˿oC f~N} %,O(s|c]?ISs~ذaq+?ܱﻰ"`'!D>IGO )@6IrA`{c[v%[7''N=}.q}]:KZH$"L|0#|Vd NBYxUߒ/[/D; {9_^,{/e\^X^%U&IE 2[+uPg9#q#OP $-D>O(a'@I;GiN';q.zI%'sH߬R:wz'3''GJsַnZ޼{\_ VjIiZ_uEj(ϲm|i@Y2gmR/xzISs[1$Ndrx5O=U}Ju=DeqbR,y1Ifr+M2_dR2I}Ij ^soW|g-@ @w7_9; NJ 5Kdk'6KT-@? @]r3OU$`'@aI9;o>rj.'s.8 ȿ ?~qi9W>II ͭpZ<{$/&N ?o-_r_%`'@I7^1KOR^-}yVb'vR.'#|f455JLIs(:ֿI5Fkk:=?v䜝"nS\- KıH ?%|I %/+l[cV'NjȚn-c5Z8.J4nLL&eSgjldz|;)Z T[տc\zsIvRYD<))yIov%3m5l4^M-[f:dq?Ide1>-v九xD_^"\6KL|2oYӅ-jeu,jVy ~nᗿ#?n^v[2)P}չtIJM>g-@-{]xv.z!Z$(,;)x&</N^Ts{`v'N1@_͙ۨ*kr<ьK~Ϲ,<'_64vRROR@Op˿hmW`'@I;A7vEk/ON?Ÿ_;q\IyR]|dR4ltd9qoTJM>Iϧ ?.x7D m'8#Zh'"\.Eʉ+-,|UjH$'||WuH|OO v)@!V%-x2b,`'}.Pr*R%.қ$D;PIKYNǹW,ҲܴY$ ; !I?BTRHrNA<{/rl.I$<1EʡX"ٵ_b'!D>՟!R0^1xmm )/K6KNBX$!?)BYn'/S\-3xDKI)TE⋴>H%OR D vE֧[xw6\G"`'!D>IGO )@I/4N yzIIK"#D'@ Z-xq{.Ezx;i%b BI'QI"IGO )@=PL;Iy/a aOeɺ0HIII{f[Cs,vH/^b%OR D =ˌKxֻyIV%xb?]rE%n,wKtҤgqv6 B6E,AXB>$!?)BR֓3"nqKRo^φ$!?)B9ѮPX**Q&;){aȕAIGO PVP$9/^ xI %bO?mݺu mοhē/g%"nc)t:555t;Ict4h ;)b^ǘۻءVXv$BTe] m(ژonOmrݍǾ 3 ?{8l׮]#G<3" H.M1/;_ayIKվz~GvO~-Z>|xF}%}6kQtmrNZ_z@6c&D|PW  H`} vB9H^{M(*Qv} x/,a YHҲY .8sRyV.덷u= 4ɱe s5iΓ5vLhز!cw Zwu$U"[4hLZ;yrqxC+N>,bc̽ QRLjp<&I8keCs$KF HIA P61>yiR^z=0h)%xyrDסz/e۱cܹsKKK;tШQHh߾]Sh'f/' w%^a/iSi6|!$?BYW%@K`-![8(Q X_~ @ PSu|,- \m۶cƌ)))ܹg}q{|k{G)glN**6B,A(N(%I<&I8k':GFн$R+X[m̒y񟔔7#kH:ZSS{,X09cݪO?4'K]ou v1tXPLQrG4!D; !z*5(3^)BHb41Nd_^_޽KD۸5u%na9J:;N0B(uIm-;P_BjM1LK"@()=F8V8;I}I%w<;ɇhRIK;)DGC_5^o \rNЫW % n}ǒ𒰓2$F,A(P[jԦ l9PW%JZ/ oNRVci`'{i'%IvK;)EGiKn@H^)BLlOo3Ӣ̀r2ڢیX2H#3ڃZ&{Ɍg}凝$c(VNN}jPjhs^:!,\9]ʸJ{${M{ H@f'es'L0g/N cfizد$al%WmֹǼx`E@8q>c ' i <("sW\]r ^|II  +?)Jީ?i>Bbmr~!,;ک4jv<|IDZ& $}ޭ{ ?&]+N?v)@()d]ʘ;)e*_1X ; ;XRvR&dRI]̠ڝG&ξf eC8-* TH; ;~S!&,R)!^Q?J9Di ƋލoʌQ5#Dzha6nCSW䷞ZN8ydF䮡?]ہ#=}w9OΗMKq!N摗}sڇXW$/_=Z"N;IbTƾ4@N[ikv\'0K5ϛ\itnc'om*{iLiL5%Ҵ]sw+'4 "q yC % rHFN93&nҡ{dkZ9AmqcoF~qn6nͱfWrZ|$D|ZKxQ6BN8i!RˑuUIΗ3yKu:NriF:8Yme=,Gf^t*\'Y;$K\=d?)~RS|󭳗 lHNJu{ hS)òxi^j{ɍ%TF,V㚩@W dNJhFG~O±Z^1?hiui %v-X8&c?UCwҩџn:~#ߊS>/M|kh ?&rd+ҽ_X"Do샦orFȱM\[RuxJ|/kȫzi2l'<;//vJ?y{H x dMS*;FbT#9#O "]m;) 3+qj^1s6_|IˇlS7`\|}YK{hNhӺ%:cƨ%/]줳/yD: {$Vhs͋mC]٬?E-3NC;5o@"[N|6[6~LvG4"Ҭӏ/)u YϗMm1e'ܭX]K1,f7`Ϙ3c IHD%d'yh'd X?S[?ySϜVVjƋdu}j|0N;i|9FSl\5ws3`XU\n+ٜqp_WdinH P&~%#lӺ/ :D}rj?/|:Lhx5g?7|@_H<ܶ@0P 2G4z &;{?E;) d#}T清LI;I`Hslj*v[:NFhgN۔o3ޅ̅!~}_o9+ba@}kWFrU;m&bƭF_$/s θ?1͕v$t ;W?;) HsWf'`&-b'Itt*>ClSYھ;bɻ童֛pb64O5ӣ$^8J/uy)΃X?ӥL mX?@lC>۩N}II;I!5'$$鍅SS..; LI'3ph{Mt{z4[G"f81[|_ss@3&=_D%[zO,uJ mjC! !^N}II;BL2Ok O II5+5P$_.A+SX]nlMqT[/MԬz&ٜ_d͇dwez,1Iǒ=H})Lj'M2Ok O II6'󞭺^#e}7vRJӗ?.]ulSN2 #-Q3=nNŗnUKa܀1uLszrޥ =, #]%e'%HgN 1@?)@?)`'KldNc$CSqgNŹ2v-iE>ئd6Wv7T]zs$-g1Ǒ&w5]zK#UjǦquvq&k D?SqgN 1@?)@?)`'KlsRNmӌ<{m`3Gt9 i%Y%-6OlS}0\d4NeSZXrǣ+llXxjN&r3֙W@ NI!5'$b|lҐIWvʣd6J{8q-_+pԱٛ{.M$֗uh8M9:3mfjZ=A65F&~ˌ4_vjA3LZkpqyX"Gcx~%=3GL @ m?3sٍS Ӛv^N 'MR׿ n'0>)sx̔աrzlpb>,ͱY? Zf3}ߓfvE%HYs4+n>D-+[৷绝QFιIY c0Hk"f1&)@R~f&.?5'$bېWu+j}l,iͫ˃rzKY &8*[#xH˯4@S~f&.?5'$bXyKitj4[j4twl2Emct{.{(4|OQlkui|ؖWv.3،q1NhM}w0)9#f}tN rv_V B.?z)@&iM|I;XD kIJor3{.V\ 8ljDvf\(+i%IxǜOHK'ƥeSu~%PB@ȏ .?zS ӚdO KJ'F:ݦ0ZzvR AH;g穿@ȉp;XFKEͻ}G# b d-_|z[.o tm$o9I)vԷ">Z }ƪtO' b d/ǎJյMmR; N]':/1MTk+җg# b d-?Ѻ= @+=8A5g?)"N,Dw .!ilvD,ȧ;X!Nhjy;DM˫vwUФK%@ RD D,AK!D %`'!b je_ D I%5Z.! v՝_F9)B; %K xsvUߡMjEkQH"$b BIG~7TFؕr RH;XrZnO7jpHBI@,AX@ )vK" D I%v!b H"$b BXNqRHX k_~vֺ=M**6iE%ZA"?)BI@,AX6=_~S'K.vl^ګ}? D I%Ǧ|RBN7jkYT $s*>ct0xZLI#Ӳ!S'sNN`'ػOvОUrDNBdFm}MٻO4_#VT gZhj!V\ #u@a_jzk'4PZR9\:E%JuSsW?c)5'j+Op`D $(P$lSW-۵#׋Ju\V[[a(tƢTdξB i:Ҍ&IPlܪA]m}ۣ^?|i>5c@$RyZ,Y*uܳo_6i.̦C; [FB}5{?^(M۬_QIZrܳo_i@ $(\殌I}{jzE|ͪ89TJm>f֧۬`NomRDo{?fEBFpb6}{j=KP`'@A3fMh>en,4Taȶ\*T۬Nvc!S8x9T`-4 v:}I&7‘+\m`I㲨D^( K[]; [d8@!_o)DuJ&+6q$ R[왻R:PHFlN@H͢0)C8 Ԟ5w9Eq,B.MQQ--GUO3__%thh~bI#?= !6\o#Eg!BБZյڰ_?B[I"l>ӪoLN`555۶m+d;I*kB!觿̽ޤt6wZ?B[I* vȑ#k> N/;w\RR2flL'NBa'!r{a'ڵkܹ۷oԨQС;BI!$vB(\^Ik֬4hP֭]~I.n< :m꥿c)-S\w.l4;O\p3I!$vB; !R|{//jk$x/78I;v>|x-Sv5]K>RHIׇ|k'_j;NlS;Lv2w# D>vB; !Tvk!%c'}wO۞UO?; !b vB@U}e v)B^.4A<7ǣ?Ryދa'UUU5i[5};kI/^<)"mܪO<=)Q5ib $%IOzdMOFo_?BI%{e^1/oe'm۶,ϭUi3*ikLUk7NBXORƐZRv)Bz/~WMmg~Ƌ{QvRΝWCK c'E%[/҆o; !b vB^VI#D )@0\^j⽗ҥKwte$?9zI[b5J^r^ŋK"`'!D>IGO )@`z/Wt2Ӄx/:8p+]$?9zI?9zc"M}^b BI'QI"⼗lA$!?)BCxɆA<%ҪU+?.uйԛ/뤗u%OR D =y/4G.{t!r> gUsۡHuV/}4 ! D,!D|՟!R!{ɭA<NjР﮿q:7lb}b'!D,NB|2|󭶶Z#D )_;^vz/xij{1줳nu 'r?Ry.qjy.vB$'=2w֥LIZ/!$RHIKZ^R2ebI\xY-͑K/NqZS禷9"sWO;Wۦ"$%IOzhe __OVߒTH"k')DeG/Kf$^vҶ_]}Kj0ǟpbhe6%>sbaW~cwa'!D,NB|;յڰ__?mܪRN"@ {/z/7;X;IfrÖk&'5㞛bMU&Z\Q5ro*6Vzh.ݸoVZ]k"`'!D>IGO )@IdItKdjwݼG;:MEhrRW_[Z'U~\"nHUd /?9_>lIFy"`'!D>IGO )@Iq֪Խvt^[8IN?>męf'7?9w 7}{b /ϝ[W-Pg'mܪMf/' Tpv}ڌZa'Q*/A_BtD NJ3y/m,ދ2^Ꜽw>?Nk%'LPoqGslo|-N;sw_u]x/^HaoUWMC.˃OI,A(cɖjދ:a'Q/_: ΀t H*;IIi26|;Kҍ,{yc{KRh'ɳ2Y[+u8g5W&M{]4wE+?pKܗTm C_u Z_í$Btbans\Ea7G.>\'_99K$~,\Iտx8d;#Hi#?6yfh_Y9)"NBhW*oɇ-q$-@6TH ˤIrIߡ2NRދ%{98YҢˋcx/ `'ŗgQ %HUEJ%\A36z<#TMU{ʦDOA"qR%vê?t,c>Tw,ٹ[?WTSJ͟O~5u6rc'CJWI(-rRcQCb:6NL./X{ItHҔ'ȞSOUvA*ὴxKʃxlm2^*?L,E)O潤⋴6i>)RZG@r@.vRhԒH>c}o$ @ݩovR!Ē* ]F]^"$LFcNJ յ~ŴŪo 1^MnH ntantHBOdT'q%SWPA0 {A<~Nr|f/"m5o"չ{I?UZA$}vm.]Kڠs/yF<ێf|QʈƋ ow;)c>vŸ|2ɧD$/_!@>k(fKRg7>p\3e/1z64ҼF vt3O.I;VvLm^rtj;ɷd-OLv{I.)uSmԜs(P^uHjtDH-4~*CMZ,}UE&O Cv9'|Mmz/ j87'{$/s{\ۘ荥<<7h'%Ng&xTxpB, -$NtM>O_~Ѷ';WH&; em .3`ID uNny?)@Iqsrt%%%xs_-xYe^"NErƪe'E5Ͷ1wŒg*U|/D>J:TE>oʌvQ|?eSQQG}~TZOdĂ/hMU fZR4)W$E/t%ٱ=YKlvQf&7]D="cIɑ)*:cqe|awK&4vOa}-! ^ymTr;WfE.BkTSqz^G ?qNnOם)X)>$'-;vNnO}{iok UvRܚKܥHާv1wi[́g~J':6@ 89CgwO934} ݐsip 'D.:rH,K~A)`NR5vzF6j5S^LXb#E[i]']|G=gu:̞jn]眮Lݲ]._4)|5Q*uMTgb'L%;v vR!iZ_uEj(ϲwno;'})麳<+x}9g'9"M%{^ ?TlN4+șE{g%5y"J- "VjaAQQR~ ]E*jUYBQQ" 7+b WZd23I&dfuf'u$F&-ԱRF7 ]NċWN4nxyK'2(ͻ^5boM` 9ʇysIniҶk>]j:^$JyE^L=iK$hS:fVVf,UFO:ɪ!jZ34&x*iA)I[ʋ)vW!M3IQږMRJ=y `c=lVFic =T#@GwV1;v`J0K|I%6>GDNrr %:{IfE >CrC-/2^+pH]6smMB8*\W{N^9WqkJe;)G}2{ 8ewgh:wNTwm\6pgWҞ<ҺLK< z0N~Iq~"֬L^H5ȱلU禥7؍CK\Z;#zҬ~?:XJHnPkL{5\%3◽(Ixr6{s\TROoC']I>"w<^9XГIE3g?dc'@owIpJKd-)QI%\w%v OsHI9vSDt-ߒu-7\瓽.EKm tvna> s.K ݴehnrN^u5s=}DFiZcВ͐T-ygcO,So,h|䒶]-6}!he 3嫔%9g K~pqg^)N.=|)q+޲v^Nbr\Sy,_ZLԔMq\I}Jd[X(vRyُo֩qix =&i|mX$}K$!iFk7t%??v? `sHIVm˶wɚE<,ni'D->jۆt^Kn,]:./eb}Tx륛0 >d͕C"eO;;#[X~ޚ(׹!oX!0_$-¶g_v:;z_V'ALk?ƙjQzvl]ZrZkbRQuZN$fLGCvC~m']v~`3J!_- VcI6x>GDquׂv%wڸ`b[IjHxl$U'{>u>+ԕn$mAn`sI2Y1s3VflƅYd4K6H` Ojg[ QMtJGoߝؽGW9t~f]* ~̿Epc#c%Q _:YiP_/kW77vRvֿj^%}z=dZq lm;ՙݍM>G#/͉B&g3i&_C+c'vm:7|b-uW$=,wNʷL~bd %V^3K}xۜ9aazX:p.[ϑ =D:g,JГƂObʨ};;VAOzMVNW*eH-C+bO^_?Cg`vR}v|ۮ=VW/o=w/YُS%E~'~;Inf2iL6(c'᱓|~V`x/]ijօzE-UK|G/iUHn.u{]_vuJegk'Ite:VCv,nNhR! )h{'B-˗Qu_*)JsV?u:|a zWMFO_O?tS-AjZi.&\8f^rg'd[ikzr a'?;>=|,a FHK'|N>GDNrRf ދxٚ&n$+NrSK|[œ׫Ĺ\wjrNT9Fu$mf?f2Y6I<~sd'i%7Ƒ͙ꥉ%>L*lǞG."%sT=Nj7~T_G`֓/OʰSxvzbRN&~ϭ*tH=/bK;hG1{6jc;fWނSvDv [\;5ѓO^h:uhf˾i>Rט.{M%Y"bהtӥ.rpP9;GȚfw?vP) ryd禶Vryô*Cj9a"%Fkr'IZ.o^d[4Wd^״.I ĤpQMbeQ7vj;ƾQI Y>Bw9g?8+ai'1kSJ sIHJ>l:v."]{IvRrH7qے&nkN2udG:xN>Eul$;'A3mFRuE7vyt5@iSZ+mvીa W~*힯Vu <R9PD4| GTa[O\ApvNKH6 v2^.Y"T$줷%?׵BEa%#Tzި>`27hvFGHT:᱓x¢ԓ#~7[=J~!YעH< {)" vuVSrH`'Ec3Λ}%$֓?=@Ax?I$#KH^ːVK|U&/ ;)@>D}XZ e!5j 7 f"KГ'#/#G+;)ZĵVXD.ɞIj;: %5hU \=I_? g;)ƋN]K|cƐ $/iyrH@8plbKH3;YfE.!'!DO!`@Nʛ6E"A.io{/zދj'5jH{eW?Y^-}7h-?fvN\=I 6(\z/Y. xqKfhQZJ^~w|zlZkKH=>Y /6K NBOB!Ny/佄|ϲMIKf E1ڳgOYYGش|#/iZK6cl͌Mm߾.)K NBOB!Ny/'{/g_6q^ʒW_}UYYy衇nܤۇϚ?wg_ZГ}X[^zHij, @; B!,A;)RU3mΛeۼr{E lէr ~_Մy Z6~f>:m{qiOH[D.\;o B$aIދGvϲM~1[Eۆ *++;wǷ9cn^s;o6f؉5ˤ{&|>X#xǨ+qkj^I1cHcbEr II 'Y;?]X19ֿ*'t"acV^,2:\m߾}9rd6l'ݿ@.; = a9Cbf z7b'! D\$wvZp ***zնm&Mk(_zwqGuuVN+jK NBOBX@=ٿ*epl]^Ug/cdžľ'̋U; b y}k|8IR`' tR0? \U~wp- N@b^uhG!t~7r@]s3CMqt`' D(᤼;Ymgc^qzϖćwL..`' ,{@K%No0^}}S#3fk{?dLDjٵ/6زMN4\ MPܬ<*֭$@"`'XS=A%iJ( V PxL_jhUK=GZ|ӹL`'8Y!X:?jɤewb@(#T/.\`x7CvsTRgiPH8'酄F?Yû{cߣmbm.I(.vU{6؄yT ظ#6AC(,P0Ydh=)n={bA kpP``'0X ab_>/ZCsd}P<8Û"`xԵ!vϿTK e"]`9[F_'lZ=*; yfdl,m@ݽM,cҀ\S(?  ;vǦ.R?۲M\V7'gȧXXϑ֟[1os@^|X"XH}%Ks N* 4g1Zyt3xȎ/ 3{{ :|@Ho4&L`Ia\ htԉp4:ǎYRxz42K NBOB!N hҍ{yԣd'}7FwGۼŝYr?>?>T%)=^;)!ROp/*+++$%I'";eI{q0^_ēb[%a'ՙr9ӟSIK>xSCҸG~gMfٳ; Br vI?t$H0#{j^/1@˶>w{9{f͚kf?pGޭI^R:}Ye%IHv|s'~zV'5[jv$ѓtHD2oREBkyy9v$I?t$H^\/v^Rx0^ԥz/˵y\%?Cvv+B.\=I q% xrG3^0{/ʨQ,_9cH&nDH_\EQQQA.\=I x/X\.Rw`s݁/$]v#<*%eQK<$ iI Br zB$B?B$@x`^</!Yģ/fEi޼-u%}sjQlْ\!= !z! ! YICc}ѿ̅}^BryG m0;~v|8ddxIIK DO!# DNJm[kǽ,6qӽ2{8y/[IviGQGZmwz?[o6_{xS̟*g/i^|j֋SC|[WyTio1W68Iv!r %Ko/Г'D/; Ҕ k;ɦs^ۆ&y/ E7^Ҽ OދNr-= !v%@I/ &%&noλA^ּ%},<#N%?lͶ)[YuӽO~ȣk}#>M/憁G=0ًVl6KK2+s#c%~[-6F[ѓb'!,/_d@21@@X:wEK9R5\x-=/!%gM:'4ol߯28:E%o,YþtC)y۱c*,">vR2Is<5ʭ)^\=R51=5K䫌P.ű>#ѓE5O)=5>^,QQ; Fwf/OR,u7* eb Ӄ|G0GDNovFLV-${%9KZ^K佼z//6vR^R=w>26XC㸧yp:3=Lɧ[j ٞO8f$'UJ6- 36bWYܹd}Sc]'uo ѓ!{?5=3 *GA$`TG'6OVW }V S0 r$#S>uө@U/ŗd^`BJ*^]'cz$  )\2'qƙmNxcN^፽2ۖyBc84:Z8?q|,@I*/NYmTܹD+}m3:'CL׽1(8̭ФhfUZ6"e`~=2Z  ͝v2 |6{/y[ij5"K i9{I!޲ ^Of/I cWv̶%d=~T?]lvRQ撔2 7zWkThcQ; FwHK|aFMn/׍`dvr݆"M$kދ7Vr*P/2EnrKVxrI`$̶=t_'*?m-?jwN^{2> :órQ mws en$$@$sMngMn"mZI~jd2EשC-Ģ߯Ui^}"7qG7Ae7ݟzf"\ oLW-cyQML~Noxq+cQ.C@Ob'1;9[4GDN@rq<x,lڴܗv`*pG(Puj <3TOI:dHAƿ{yv*ڤfޗphNN}DZ16]j:^$JyE^L=iK$hS:fVVf,X=GѓbjZ M}TO4 U$,E3+ӕx+Ĥ(ImKG)[f%rZXqГIN~F;N?|n?߹&SuYNr/ܴ8? rvRƚux/Q\ij$E "OVK !,!5KlVNWکPo{4PN^9WqkJe;)G}2{ 8ewgh:wNTwm\6pgWҞ<ҺLK< z0N~Iq~"֬L^H5ȱلU禥7؍CK̶ ܹГ)b;tԌT~'g+G^? uI=߬z\#t l[1F9ުs3ߟxГINAF/??/VݍaIӒ%eە͖D/w753ةsh%v OsHI|S16{/n"hPAkUN$ZBҴji1$[B& YN3d"ӕJI$]΍#rj'nX-ߩ"'4K/d[xNZHnlbIwt*IǗ[YXڲI}o>bMfZM2SJy_j2]˧s-,?KoM[ͷe,ېMRHIHDa[K2sK &&ӅƙjyvUl-]ZuZkbRs/fNbw 2/;W?z%rW' مVJc)c'vm:7|l~0J)%,6q{+MvdeևVvRx?e2>R"qν c'xg̩XƷe/#ƂU'q?%ӸJ}dY$sɧ_Ħ/S;S}ddzt~XoqʐU LN2|ƃiQNbw<șrZT//;{$D"$o `'C΍#"g'ߩB ּmDbteZ?nE>wNw  vP,$;k-ӉAF 02; I0]Bo5\/1ԇ͙#F.桇%Coy}hg|Ivo2K-7IƂObAIÕ= i'y =s{>Q]yɫttx+Vm9ߓ7-d׹q$@Tݶ{ "$[;)Zs-qKZUٻ ~l$mio80vVON]ǞbGNj5^N%F@/`.iZ`(X1>DzyngMEOEL>||ғPhGlN}_6AF-L \ދi|7ϏODNBNzF*jp~^gcpx e6+;)7笖K e\eMVW /=[;I%s-Ӊ6 cvvB )lHOAS?qH}gjY¨×JWIQH俿߰Q+Q%2ʻ,mY=g1:~7|qfRZs!v=uUj?nIt0v0J0N0f;n*pke7$}KB=1L$@줌7e@^:ggkE<^* ;)?ădMdۖ{ u+L)nɶZW 5Rƞ^Ӊ3[R?={?h}H2uL*/>rIrݹɍt/&_O?h}ͶRܕ:7V>\bMpwJI$F}'# ? SlGZ? w8? Bvs2^t%E<2{I/vRjBq(םaUnNiQ;xfۼg y͸kR3Oj0IyeMqdwszi1r0ӿJ9۱'ˣrsFO-}ʒ/I/OʰvvzbR&~ϭ*5$v#モ`S$fmtt ܖe#-c'vm:7ΝdWۮ̶';"mZc2^VmwivRj1ko&B}ؕEM0I2hd`(,׆v$ ?:u[<5 qsʹg3s.e.tie,6L0EV46lYr9ɍt/&;/s |:H-@C VLi(/Nbwr:H Se1&Hen2ۑJ;;ɟk׹q$$@ e}I3^ދ!lVᙽ^R v]\$D7edpR\9LI頪t҉qBݕ1=G9CoͮM)k޼T$#yբ|IZ:1!1:n_.x]DNI_o%~5L˯R*vILR8&,.\떩d5ѓ prYeV݋*v_%u).I,z;;}I$F}'w#wH%{-]?X شXyQF}7\!vzB$!v$'6q"?^׿s`͚i P-qW}ekCOFcmzI#h\!vzB$!vKʹ˷syK5ދbO9% <7g^x>ӲMyqo6`='֭[WUUEH"@H.AOBķ!v$WK$%E<6~:kEۆ *++;wǷ9cn^s;o6f؉5ˤ{&|>X#xǨ+qkj^I1cHcbEr II I^n6foUx{/˅z/7#Gv޽aÆJ!\NJ Гb'A I^ڵk…&LիW۶m4ir~饗qrZ9yA.; = !v; BQEEuuu˿ŋAZvϞ=B$$IB$!vRD%%KГ'"vR$rIjfOMM@C "f'!,%v2Ef0P|d\eIENDB`mitogen-0.3.9/docs/index.rst000066400000000000000000000265151465666473100160110ustar00rootroot00000000000000 Mitogen ======= .. raw:: html .. image:: images/mitogen.svg :class: mitogen-right-180 mitogen-logo-wrap Mitogen is a Python library for writing distributed self-replicating programs. There is no requirement for installing packages, copying files around, writing shell snippets, upfront configuration, or providing any secondary link to a remote machine aside from an SSH connection. Due to its origins for use in managing potentially damaged infrastructure, the **remote machine need not even have free disk space or a writeable filesystem**. It is not intended as a generic RPC framework; the goal is to provide a robust and efficient low-level API on which tools like `Salt`_, `Ansible`_, or `Fabric`_ can be built, and while the API is quite friendly and comparable to `Fabric`_, ultimately it is not intended for direct use by consumer software. .. _Salt: https://docs.saltproject.io/en/latest/ .. _Ansible: https://docs.ansible.com/ .. _Fabric: https://www.fabfile.org/ The focus is to centralize and perfect the intricate dance required to run Python code safely and efficiently on a remote machine, while **avoiding temporary files or large chunks of error-prone shell scripts**, and supporting common privilege escalation techniques like `sudo`, potentially in combination with exotic connection methods such as WMI, `telnet`, or console-over-IPMI. Automatic Bootstrap ################### Mitogen's main feature is enabling your Python program to bootstrap and communicate with new copies of itself under its control running on remote machines, **using only an existing installed Python interpreter and SSH client**, something that by default can be found on almost all contemporary machines in the wild. To accomplish bootstrap, Mitogen uses a single 400 byte SSH command line and 8KB of its own source code sent to stdin of the remote SSH connection. .. command-output:: python ../preamble_size.py Once bootstrapped, the remote process is configured with a customizable **argv[0]**, readily visible to system administrators of the remote machine using the UNIX **ps** command: .. code:: 20051 ? Ss 0:00 \_ sshd: dmw [priv] 20053 ? S 0:00 | \_ sshd: dmw@notty 20054 ? Ssl 0:00 | \_ /usr/bin/python(mitogen:dmw@Eldil.home:22476) 20103 ? S 0:00 | \_ tar zxvf myapp.tar.gz The example context was started by UID ``dmw`` on host ``Eldil.home``, process ID ``22476``. IO Multiplexer ############## The bootstrap includes a compact IO multiplexer (like Twisted or asyncio) that allows it to perform work in the background while executing your program's code. For example, the remote context can be used to **connect to a new user on the remote machine using sudo**, or as an intermediary for extending the program's domain of control outward to other machines, enabling your program to **manipulate machines behind a firewall**, or enable its **data plane to cohere to your network topology**. .. image:: images/billing.svg :class: mitogen-right-150 .. code:: bastion_host = router.ssh( hostname='jump-box.mycorp.com' ) docker_host = router.ssh( via=bastion_host, hostname='docker-a.prod.mycorp.com' ) sudo_account = router.sudo( via=docker_host, username='user_with_magic_ssh_key', password='sudo password', ) internal_box = router.docker( via=sudo_account, container='billing0', ) internal_box.call(subprocess.check_call, ['./run-nightly-billing.py']) The multiplexer also ensures the remote process is terminated if your Python program crashes, communication is lost, or the application code running in the context has hung. Module Forwarder ################ Slaves are configured with a custom `PEP-302 importer`_ that forwards requests for unknown Python modules back to the host program. When your program asks a context to execute code from an unknown module, all requisite modules are transferred automatically and imported entirely in RAM without need for further configuration. .. _PEP-302 importer: https://www.python.org/dev/peps/pep-0302/ .. code-block:: python import myapp.mypkg.mymodule # myapp/__init__.py, myapp/mypkg/__init__.py, and myapp/mypkg/mymodule.py # are transferred automatically. print(context.call(myapp.mymodule.my_function)) As the forwarder reuses the import mechanism, it should integrate cleanly with any tool such as `py2exe`_ that correctly implement the protocols in PEP-302, allowing truly single file applications to run across multiple machines without further effort. .. _py2exe: https://www.py2exe.org/ Common sources of import latency and bandwidth consumption are mitigated: * Modules need only be uploaded once per directly connected context. Subsequent requests for modules from children of that context will be served by the child itself. * Imports by threads within a context triggering a load are deduplicated and joined with any identical requests triggered by other threads in the same context and children in the context's subtree. * No roundtrip is required for negative responses due to Python 2's import statement semantics: children have a list of submodules belonging to a package, and ignore requests for submodules that did not exist on the master. * Imports are extracted from each module, compared to those found in memory, and recursively preloaded into children requesting that module, minimizing round-trips to one per package nesting level. For example, :py:mod:`django.db.models` only requires 3 round-trips to transfer 456KiB, representing 1.7MiB of uncompressed source split across 148 modules. Message Routing ############### .. image:: images/route.svg :class: mitogen-full-width Slaves may communicate autonomously without direct interaction with the master, allowing a wide variety of complex data and control flows to be expressed using the links between the processes. Logging Forwarder ################# The bootstrap configures the remote process's Python logging package to forward all logs back to the local process, enabling management of program logs in one location. .. code:: 18:15:29 D mitogen.ctx.k3: mitogen: Importer.find_module('mitogen.zlib') 18:15:29 D mitogen.ctx.k3: mitogen: _dispatch_calls((1002L, False, 'posix', None, 'system', ('ls -l /proc/self/fd',), {})) Stdio Forwarder ############### To ease porting of crusty old infrastructure scripts to Python, the bootstrap redirects stdio for itself and any child processes back into the logging framework. This allows use of functions as basic as **os.system('hostname; uptime')** without further need to capture or manage output. .. code:: 18:17:28 D mitogen.ctx.k3: mitogen: _dispatch_calls((1002L, False, 'posix', None, 'system', ('hostname; uptime',), {})) 18:17:56 I mitogen.ctx.k3: stdout: k3 18:17:56 I mitogen.ctx.k3: stdout: 17:37:10 up 562 days, 2:25, 5 users, load average: 1.24, 1.13, 1.14 Detached Subtrees ################# .. image:: images/detached-subtree.svg :class: mitogen-full-width Contexts may detach from and outlive the running program, while maintaining communication with descendents in their subtree. This enables persistent background tasks that reuse Mitogen features. .. code:: @mitogen.core.takes_econtext def become_monitoring_master(children, econtext): kill_old_process('/var/run/mydaemon.pid') write_pid_file('/var/run/mydaemon.pid') econtext.detach() while True: for child in children: if child.call(get_cpu_load) > 0.9: alert_operator('Child is too busy! ' + str(child)) time.sleep(1) dc1.call_async(become_monitoring_master, children) Blocking Code Friendly ###################### Within each process, a private thread runs the I/O multiplexer, leaving the main thread and any additional application threads free to perform useful work. While Mitogen is internally asynchronous, it hides this asynchrony from consumer code. This is since writing asynchronous code is mostly a foreign concept to the target application of managing infrastructure. It should be possible to rewrite a shell script in Python without significant restructuring, or mind-bending feats of comprehension to understand control flow. Before: .. code-block:: sh #!/bin/bash # Install our application. tar zxvf app.tar.gz After: .. code-block:: python def install_app(): """ Install our application. """ subprocess.check_call(['tar', 'zxvf', 'app.tar.gz']) context.call(install_app) Or even: .. code-block:: python context.call(subprocess.check_call, ['tar', 'zxvf', 'app.tar.gz']) Exceptions raised by function calls are propagated back to the parent program, and timeouts can be configured to ensure failed calls do not block progress of the parent. Scatter/Gather Calls #################### Functions may be invoked asynchronously, with results returned as they become available. .. code-block:: python def usage(path): return sum((os.path.getsize(os.path.join(dirpath, name)) for dirpath, dirnames, filenames in os.walk(path) for name in dirnames + filenames), 0) total = 0 for msg in Select(c.call_async(usage, '/tmp') for c in contexts): usage = msg.unpickle() print('Context %s /tmp usage: %d' % (recv.context, usage)) total += usage print('Total /tmp usage across all contexts: %d' % (total,)) Single File Programs #################### Programs that are self-contained within a single Python script are supported. External contexts are configured such that any attempt to execute a function from the main Python script will correctly cause that script to be imported as usual into the slave process. .. literalinclude:: ../examples/install_app.py Event-driven IO ############### Code running in a remote context can be connected to a *Channel*. Channels are used to send data asynchronously back to the parent, without further need for the parent to poll for changes. This is useful for monitoring systems managing a large fleet of machines, or to alert the parent of unexpected state changes. .. code-block:: python def tail_log_file(channel, path='/var/log/messages'): """ Forward new lines in a log file to the parent. """ size = os.path.getsize(path) while channel.open(): new_size = os.path.getsize(path) if new_size == size: time.sleep(1) continue elif new_size < size: size = 0 fp = open(path, 'r') fp.seek(size) channel.send(fp.read(new_size - size)) fp.close() size = new_size Compatibility ############# Mitogen is compatible with **Python 2.4** released November 2004, making it suitable for managing a fleet of potentially ancient corporate hardware, such as Red Hat Enterprise Linux 5, released in 2007. Every combination of Python 3.x/2.x parent and child should be possible, however at present only Python 2.4, 2.6, 2.7 and 3.6 are tested automatically. Zero Dependencies ################# Mitogen is implemented entirely using the standard library functionality and interfaces that were available in Python 2.4. mitogen-0.3.9/docs/internals.rst000066400000000000000000000151231465666473100166720ustar00rootroot00000000000000 Internal API Reference ********************** .. note:: Internal APIs are subject to rapid change even across minor releases. This page exists to help users modify and extend the library. Constants ========= .. currentmodule:: mitogen.core .. autodata:: CHUNK_SIZE Pollers ======= .. currentmodule:: mitogen.core .. autoclass:: Poller :members: .. currentmodule:: mitogen.parent .. autoclass:: KqueuePoller .. currentmodule:: mitogen.parent .. autoclass:: EpollPoller .. currentmodule:: mitogen.parent .. autoclass:: PollPoller Latch ===== .. currentmodule:: mitogen.core .. autoclass:: Latch :members: Logging ======= See also :class:`mitogen.core.IoLoggerProtocol`. .. currentmodule:: mitogen.core .. autoclass:: LogHandler :members: .. currentmodule:: mitogen.master .. autoclass:: LogForwarder :members: .. currentmodule:: mitogen.core .. autoclass:: PidfulStreamHandler :members: Stream, Side & Protocol ======================= .. currentmodule:: mitogen.core .. autoclass:: Stream :members: .. currentmodule:: mitogen.core .. autoclass:: BufferedWriter :members: .. currentmodule:: mitogen.core .. autoclass:: Side :members: .. currentmodule:: mitogen.core .. autoclass:: Protocol :members: .. currentmodule:: mitogen.parent .. autoclass:: BootstrapProtocol :members: .. currentmodule:: mitogen.core .. autoclass:: DelimitedProtocol :members: .. currentmodule:: mitogen.parent .. autoclass:: LogProtocol :members: .. currentmodule:: mitogen.core .. autoclass:: IoLoggerProtocol :members: .. currentmodule:: mitogen.core .. autoclass:: MitogenProtocol :members: .. currentmodule:: mitogen.parent .. autoclass:: MitogenProtocol :members: .. currentmodule:: mitogen.core .. autoclass:: Waker :members: Connection & Options ==================== .. currentmodule:: mitogen.fork .. autoclass:: Options :members: .. autoclass:: Connection :members: .. currentmodule:: mitogen.parent .. autoclass:: Options :members: .. autoclass:: Connection :members: .. currentmodule:: mitogen.ssh .. autoclass:: Options :members: .. autoclass:: Connection :members: .. currentmodule:: mitogen.sudo .. autoclass:: Options :members: .. autoclass:: Connection :members: Import Mechanism ================ .. currentmodule:: mitogen.core .. autoclass:: Importer :members: .. currentmodule:: mitogen.master .. autoclass:: ModuleResponder :members: .. currentmodule:: mitogen.parent .. autoclass:: ModuleForwarder :members: Module Finders ============== .. currentmodule:: mitogen.master .. autoclass:: ModuleFinder :members: .. currentmodule:: mitogen.master .. autoclass:: FinderMethod :members: .. currentmodule:: mitogen.master .. autoclass:: DefectivePython3xMainMethod :members: .. currentmodule:: mitogen.master .. autoclass:: PkgutilMethod :members: .. currentmodule:: mitogen.master .. autoclass:: SysModulesMethod :members: .. currentmodule:: mitogen.master .. autoclass:: ParentEnumerationMethod :members: Routing Management ================== .. currentmodule:: mitogen.parent .. autoclass:: RouteMonitor :members: Timer Management ================ .. currentmodule:: mitogen.parent .. autoclass:: TimerList :members: .. currentmodule:: mitogen.parent .. autoclass:: Timer :members: Context ID Allocation ===================== .. currentmodule:: mitogen.master .. autoclass:: IdAllocator :members: .. currentmodule:: mitogen.parent .. autoclass:: ChildIdAllocator :members: Child Implementation ==================== .. currentmodule:: mitogen.core .. autoclass:: ExternalContext :members: .. currentmodule:: mitogen.core .. autoclass:: Dispatcher :members: Process Management ================== .. currentmodule:: mitogen.parent .. autoclass:: Reaper :members: .. currentmodule:: mitogen.parent .. autoclass:: Process :members: .. currentmodule:: mitogen.parent .. autoclass:: PopenProcess :members: .. currentmodule:: mitogen.fork .. autoclass:: Process :members: Helper Functions ================ Subprocess Functions --------------------- .. currentmodule:: mitogen.parent .. autofunction:: create_child .. autofunction:: hybrid_tty_create_child .. autofunction:: tty_create_child Helpers ------- .. currentmodule:: mitogen.core .. autofunction:: has_parent_authority .. autofunction:: io_op .. autofunction:: pipe .. autofunction:: set_block .. autofunction:: set_cloexec .. autofunction:: set_nonblock .. autofunction:: to_text .. currentmodule:: mitogen.parent .. autofunction:: create_socketpair .. currentmodule:: mitogen.master .. autofunction:: get_child_modules .. currentmodule:: mitogen.minify .. autofunction:: minimize_source .. _signals: Signals ======= Mitogen contains a simplistic signal mechanism to decouple its components. When a signal is fired by an instance of a class, functions registered to receive it are called back. .. warning:: As signals execute on the Broker thread, and without exception handling, they are generally unsafe for consumption by user code, as any bugs could trigger crashes and hangs for which the broker is unable to forward logs, or ensure the buggy context always shuts down on disconnect. Functions --------- .. currentmodule:: mitogen.core .. autofunction:: listen .. autofunction:: unlisten .. autofunction:: fire List ---- These signals are used internally by Mitogen. .. list-table:: :header-rows: 1 :widths: auto * - Class - Name - Description * - :py:class:`mitogen.core.Stream` - ``disconnect`` - Fired on the Broker thread when disconnection is detected. * - :py:class:`mitogen.core.Stream` - ``shutdown`` - Fired on the Broker thread when broker shutdown begins. * - :py:class:`mitogen.core.Context` - ``disconnect`` - Fired on the Broker thread during shutdown (???) * - :py:class:`mitogen.parent.Process` - ``exit`` - Fired when :class:`mitogen.parent.Reaper` detects subprocess has fully exitted. * - :py:class:`mitogen.core.Broker` - ``shutdown`` - Fired after Broker.shutdown() is called, but before ``shutdown`` event fires. This can be used to trigger any behaviour that relies on the process remaining intact, as processing of ``shutdown`` races with any parent sending the child a signal because it is not shutting down in reasonable time. * - :py:class:`mitogen.core.Broker` - ``shutdown`` - Fired after Broker.shutdown() is called. * - :py:class:`mitogen.core.Broker` - ``exit`` - Fired immediately prior to the broker thread exit. mitogen-0.3.9/docs/pickle-substitutes.ods000066400000000000000000000542711465666473100205220ustar00rootroot00000000000000PKlLl9..mimetypeapplication/vnd.oasis.opendocument.spreadsheetPKlL[:[3[3Thumbnails/thumbnail.pngPNG  IHDRXBÛPLTE  #'4-2)3&:7'!%+2<3)'4/:?0$:6:9R ޜ0~7F2|ٜ5}h ޖ[ӧ_%,B'1Qh &cFߑ Y5 F D~\"qC-TkWNsSOwx}{B+t$U3>ah[xz|:>**:JFQ4=Q̎tl4  6I+>8-}ԛf C2Vv'mqI<$i@P,َ-Y_8;e="Y&HEyJ*@]h>ƪ]gzڹI9Џ_ /`rā'.g02]=P^ߓ'j G?#âr-=1_jvxu }X?O ƠuNa^uFеX ,E"UU ~WQ}u7HЧA"\^򄩖ebG*֗|j $" զSfI5f <1DCud%2MmWo޻K& kMȘ3>ֽĎ&u+2[nyY8Aơ#b ʹn/nHqgӆ4|=/M>^׍n4i!8P&hȁ *GOFoSavZVvK 2J UiW&1:t|{NyO>*z*~j!}D s"0aP@Us߻ZF4cTKu0\ЇU؋=r[GչI+]oH^T7łq GQ5SDh#6 &ƶe$~qeiƒhuvO\竱n U#y;TM 2aMF2KUw;-5-[PgTxZ0 HDia{'!\xԤI]Tւeε f "߫8 kFbe6]cZ(I%iJ(S QBakv>֘؛d}`8&f_) Qy.@sOhY}*<Beڢm9A]k-57] WL 6'/\!cl]ft_5b,*W1CQ~mwF3~mqlK?>:]1,mw F-c=#"y{?ڶ` B2́~]W #ѷӀ5 |XD({03e{h&1[7yg\xL]=B$.߱b=I6Ř(!lkjbͼ1rK֪XJ,vޯ kڞ!6 tBʇ<ۋE*Rtc[GvA,v`43 aK*Ɯ5DԅjWo b0ljc_VrӦ.]T[g?[OD%, R_(X"W7Cy!kyzR;@lxL&9- ˛Ǔ/v QIZ[Sp\_FQkKI`\N r}2lM4?bG՜1uέ(J3t-gW řx72=J݋wi}HܡRMNKԎt:C2HpǢƄlKO D6&%p9 ugUkqOd (s+tѿ;+ u)Mh+ܶI;almiIֵv.ŕEgluD%mo AꑒjIxH|Ҳ!h30`8m&Q3¶Sw  c9M@iK?k8FLjݡ#MA8iLz6ܠNG`FE#Da"Lq%|;!]9m??w1|\:DQ_#Å{ܥGMj'C,n3lq>@ $6k`gNrҵ@/ݴcAȨ0.MN0D}{Qx&NMȸ2)muڈ;dmDüĭW I>V̜$5M%(J,#>UrƢ`lU {SWLm&Jnu滒j R@ Y5%}:0W"TfEUU F뙜G?- u(1c=ך~nmB'- ;F.nޚ+  ^kt:D;Tv_Y!QEu#q,Nj2Y=Ⱦ 0q6# F8Эa`̈ޭW;{٤L&seIUg{ݠhln.*ۣl01&u$*C& L(]*nqStbZԧ&]&kvg`DɎv5dx &ͭ%A)+ppV \b>zvx,]:}#|X=*1Ĕ/K큤F@jڬs򰒓d_h* oV,t֪ufr{w#SMM=W{0) UERN@ ;I \hf<15GAF4i,׾w ٺiHF=i+I(`0xsX۔` W{&|Ju>YU!iRs ݨ_rukj*q-p}U }u':i7Jpuk&;Z*arSjV7A%(1+6 yЇ4Zz heIk{(~HhJ>m )3FA!k.(O//idy|++ci]kg4:;K# rбE2p=zg]ѵv\pNq'q՜a"_k46mO7BHUsxZ3׾Bp|*A{;{F3 =끑 z :ʮ #N;g6}HҪIFŖ=fpӣumGIE4J Gמ~0B4&/FGfĈ(:Lv:7wAYv5{a [C(B[? + %tX ()h(;$ՄV{ ^W!Gӭ5 )kD7aĚw4ꪉ0] QT°GLƐCzɩxg:%&d N 8N oX#f{OQ%9LNԧQVۑ֘"9kO8ymO%'M<|iوpt_{ !zAZND=C&?.&} bgZlTfί1 q ӲHD,Fd''9Ku}i X3 W{?XaQ aulGo*K<Z t%2Qb0$z5L8$#Sшlo'q-l~} y_'ްG;.P Ֆq`MG$dXCtrd;[6DvG[ӿMgX#ڦ!Ȝ-&"Qm7 \Cc׮>&huwDR@3!sUPu,WPdYkd5AT{^A܀:uZiJQ 5[m%uu(D- qҮwyΐsOO=TDJc=4jͪѣbL[=7朜1[%a}u#դp-hM ) #'`aBE \ԍ_)4L3|y/S24D<ӱ#rs>m 6n]TQDaWwFByXp7$7k?&g'8.VB"Z壸2󜞲-*'V  * FǬֹXbZ1W Z!-HYX-bF*j q}YSqs6 )YWò-F?Zaؓ7ct`DҏQV` BOa?7&FxZrlS. FnL/tԐ`ѹ < aj(SW<,.TѶ(;ngҺVd*Z`J&)e2Ǣ s6^1 SFirfA~Δ#!EP_6@l,B;.8[wJv5~ {2wTGMwk͉>||X=S(b Ƅbk?N-Ś0 J\΍~^+vx"m F4=bXq#/F("-=, 0m'YrGzIyҢaE?mݵZ'>X--O~$KjK{꿤bҭ~qoU=˿2œtd (!xbZϻ /\qymlQRƿgt5 *'@koz.Nv,=MPKCd$ A~<td3Aۘ,<:n?v"#J̜GqB߮=lG:Br"7k!i_vm{֩7`x+?xaRJiEyRi< /4.s +3 )#Rf[fW·ÃoOooC<Qdvsy,./ΓxvA~V.Ra] sf?d.+ˀ8:XFآ++J%Io#{VVVkniXxOdeFC7*2aR|9ʊم4pqB]ˡ>V󂈊m8t/DPr^{Klڟyp?-RVءK!7|С8,p=*+|8*D?uwid2+d;g#*V>c 2x.RbO._Z/pv!.7~ 8'riAE)`9exz Ұ}~a+Z|>ͰZ «9=_zr6DmZPDV>W{vUDC ZGl}*Zy8| J  \z+ar"0hcṇ#+s}[#gwr(Ww0" ,;<2О/#+"_,Tysȃ9Ҽz}؇iLT̡ܻNCw/!wKT0'*'ΘhNzy>+,~hθAw}es|/۲xnY[m|_TVBVe˦eѯm`[[=0/ "+۳2 WVdΆ ۴oyYʲJ {^yhϖf(πWoELS.e|}G .ȞFS Hiȟ|:#22l~C죕 ĵ "Ykye>E^9$҂l_]!ZI_*%VFl|>M9L8xix4r_ĴP?W¤ #&=ȯܷߊ3ka# "itx!</ǡ/W\ л1Ј͢l:y(aad䗗(Ȯ̓8 FlY]";0,PBiMxd^DFYid.#+##=+# a }9pWdHs""JeGFtY1wfⳙ߷{?!D2s,t=#;w^_\r  r3id)1%2ϙ?eF/P'a. 2BPhoZ[*W64%}ij_-n9D_k[%{:u G|3./d&̷X-\* py8g$N^VwtԮM9%gM?fcQ-zQW[g[Z3+YE%Xs%'߂VPh/\bqUP,jf#3{:ڀ _f 2~iik,f\um[JzWQY=ݬ^|'r橒F8+~ eEQW;cSdFd+:u[I|䄹*/f_a gfV]=*'QsnQhqZVyTbƊSjR.khJ܂ U#m@X ffq:[7P~3B?ODZO!FMQ4ם*ߙJ NvOtf~2@t`Q#F FkS{\9&:d6JOOC! h)ICGE`{clhN qhaz}`qkVUiU8O|r|i\]Z7E񼜻pF{%}Mcbګ[oVmN\ou{fNZף X9mGKYY"vM'L9B%FM{$RtY4ð ]2(mkA$Y|gd<ZjDf\Hd zB Ezڝu82d#t{UGh@SDSf%q¯~DXQ)k[Wפ6/f@*zkM4AI&TU =5qzzrrcb:`mpxI[{4]]ߏ f+EMG{Xʃ:ݠqF.17#A> /a;pd:vj(CzL6 Au $%t?cj _)hZp(L. U&=g%ٍy*#И%L75.ep!wCR+Oh^4c KֶEF;5)'+~üG9o\> 4βqW'9I%{q Z'#m}:Msd,l99KFKGvLBhz=,Z'dhNO&R} '2+|}!NFBgqWUeM/ d(} B{- /$/ ^_ D3k#S3,D/)=Q_rf;N %~"ac ?Y(Js*WĀk=Q:ϯ4b "W6Gq3aݾ(o=,d4[C_kliwq\U'$g&id7Ӂq29aQj^<߄P&v֌NV "wk}II]NjmګMPbHٽi5A*ڎXJľ",j#iH<(jڇUF DHfnu{ԋel.4dv0 KWS"Z4 qہ$4D=4EƏ^Lmӂ25a,,DHx *؆aõb_Z/%ZkK hVtO" ,Lu_槪@ૣcح[9FԔkP7uhDɔWk&;A F 7vhonдt {|o|dh5n7 :h 1=a!FAi}a#Ѡ|3WGS?xD݂+8hz ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !BXT IENDB`PKlLConfigurations2/toolbar/PKlLConfigurations2/images/Bitmaps/PKlLConfigurations2/floater/PKlLConfigurations2/popupmenu/PKlLConfigurations2/statusbar/PKlLConfigurations2/progressbar/PKlLConfigurations2/accelerator/PKlLConfigurations2/menubar/PKlLConfigurations2/toolpanel/PKlL content.xml][o8~_ax}%q.$E `>DIl(Q _X%WeY ML~<<7E@zψqLÛ50=w \㚺.ġ,@6 ٓC>{o3N(OB >F(LGM=WŒTZX8>&ΏvWhP]ZuR) oX>}!a|43+Cf.1@ɸa ,# U)gX #wېؙiP$4Igg)AC#ΈS_lpEM p WajJW:6(`W0拀՛zq I%!݈4b5ߺ[ M;Xh2۽rKgXh!U$zdC^ 2i9k#ZB6KeJOInz`;q79nH Tؔ!). innd  md~{VowX - IG,oڠ5֊x(1ktϐa}nhl7MHK.Pp;ca=9\^3v9i3Ae6|ŦV6Y]{,|#6#&0=N '0ER%C5u1!cG: ?gakجhQ[,kp'] mܚخ] F{ZEk0/< `%*R>ž/:]-ۍw$ ?؅}pxam܂-`@HC gDl)h`L$@A@ɉ0 P:I" Y?Y"zISB:.3 ȣJ J򊧋C8EgӨb8CZCvdžJyܩOcZxVUqCRD4)IK%Fe#x3'%U2>y.~˴joYճ _ѪBX޽yW[@y4;p޿?uй|@! 98bJFmRfT'u'H>ݝ2ю§aoFM1TJv* :VfpQ #U4.`48@5jjݡYѦ˨[Nb^uW~BB{x ]S6͸!,`]Vt+ J56lկ<};V\NCPd<8yq:8ڠf0/p\I&ԯ6:{7{yٲUcw<Zv_0 0t 5N+n8:B6x)[VKҐן6&g.=V݄I/Ė=,ʋ21=#*a8 rEfσWSDzW!ފS߫GU]ݕ +;,nED ļZSxOomi*cHE4~q֊ݪp}wCٛo\][W{9Tu1 ˛rpyNPIߘiucOl&_K%QɓLMsiBݙFOX[n`[:{.%q!!-5fw[3VyRb[zOuî`x'"ۉ(w18!q~g~0׼R}ȐcA3:q{E#/_UmV1 Ph<4m0cv/tw33i XGSȑӓ5 @-eo+Sڽ:ީ'/躃hSԁSuoiU 5GM{/۽RtR:NC2*&dvK hG0aӼ0u4FY1% { ~㮙ecT|İ,Ck D͸^I-W0.eOGvyA'?C1M`[ٔ`dq/Pk6=JJo[t'w|" qm.FE;2+$m%:Y.XyXc|KW_k/NMҿPKJn +PKlLmeta.xmlA0lEXj"bRƎY_0n=7\ܟ;ASkR54q<w.-%x5*9T=Wbz-O aUC´TC3Bo`V˴;)!j(rGʲ(`z"NTn]{Eoe`tS ǧwlMoQRj޹c\v" jU[UDRb ;/h '&@܄y)WT$[BtRhŹDPo_]̂(閭vjȗuR~웕0ׇ 75nTc4@LoUKkD4;YSFr5sW جGk}{2xꡗ =U)< jj98mBhSLlOy\]/` 8)!Ӈ6J;L5 WwS}t n򏊽;^ɏ>8}DG^ ۾de[9htXBS'R#\QGpM{m6iXK8dֳSO~_ է7Du`J\$\Լ)*=2er"S^ 2.FpDjX<:)Уgc"!Q4d<$!  M?2։܋m "iցۭH;&*&)Z{FmmA6gOJ mǦ-V~ r5zqLYUj`TlP^bp, 3TՐ1[PZ:tjVĦ_(c^]a%):$t]b{Z e뭇OK +ϐ\MH?6jWJ0Oľ+Z~ " ?iBx#QǪ^K؍5 gF%{"O)yDSٯ(/D@LD|])4Ra !6Wǡjw, ^^f80#)A "B ?܁")rtZ-߂h/9Md{) àhTB(!聞# ߋ  XO9gG73F~aޑN1!'Qt6'>DQL4*h7EMf`Ru% Z8 ʄ$ $2d#n\b>EH"ouD:㔵oD 8R^ Ԩ1e]5R݀*\2n ^٨НzF꺻m[ٮBtxe=Vj ѽ'XYȿ5 ܟK5]dz\c d4 gPւsH|-GmU굵͜%9Mٜ\9̑pu`ԥMa=Աuls;^mjLuc(FѸugVlٳ4?2lO<(1-2\YMTmitogen-0.3.9/docs/requirements.txt000066400000000000000000000002601465666473100174210ustar00rootroot00000000000000docutils<0.18 Jinja2<3 MarkupSafe<2.1 Sphinx==2.1.2; python_version > '3.0' sphinxcontrib-programoutput==0.14; python_version > '3.0' alabaster==0.7.10; python_version > '3.0' mitogen-0.3.9/docs/services.rst000066400000000000000000000054311465666473100165170ustar00rootroot00000000000000 .. currentmodule:: mitogen.service .. _service: Service Framework ================= .. warning:: This section is incomplete. Mitogen includes a simple framework for implementing services exposed to other contexts, with some built-in subclasses to capture common designs. This is a work in progress, and new functionality will be added as common usage patterns emerge. Overview -------- Service * User-supplied class with explicitly exposed methods. * May be auto-imported/constructed in a child from a parent simply by calling it * Identified in calls by its canonical name (e.g. mypkg.mymod.MyClass) by default, but may use any naming scheme the configured activator understands. * Children receive refusals if the class is not already activated by a aprent * Has an associated Select instance which may be dynamically loaded with receivers over time, on_message_received() invoked if any receiver becomes ready. Invoker * Abstracts mechanism for calling a service method and verifying permissions. * Built-in 'service.Invoker': concurrent execution of all methods on the thread pool. * Built-in 'service.SerializedInvoker': serialization of all calls on a single thread borrowed from the pool while any request is pending. * Built-in 'service.DeduplicatingInvoker': requests are aggregated by distinct (method, kwargs) key, only one such method ever executes, return value is cached and broadcast to all request waiters. Waiters do not block additional pool threads. Activator * Abstracts mechanism for activating a service and verifying activation permission. * Built-in activator looks for service by fully.qualified.ClassName using Python import mechanism, and only permits parents to trigger activation. Pool * Manages a fixed-size thread pool, mapping of service name to Invoker, and an aggregate Select over every activate service's Selects. * Constructed automatically in children in response to the first CALL_SERVICE message sent to them by a parent. * Must be constructed manually in parent context. * Has close() and add() methods. Example ------- .. literalinclude:: ../examples/service/self_contained.py Reference --------- .. autoclass:: mitogen.service.Policy .. autoclass:: mitogen.service.AllowParents .. autoclass:: mitogen.service.AllowAny .. autofunction:: mitogen.service.arg_spec .. autofunction:: mitogen.service.expose .. autofunction:: mitogen.service.Service .. autoclass:: mitogen.service.Invoker .. autoclass:: mitogen.service.SerializedInvoker .. autoclass:: mitogen.service.DeduplicatingInvoker .. autoclass:: mitogen.service.Service :members: .. autoclass:: mitogen.service.Pool :members: Built-in Services ----------------- .. autoclass:: mitogen.service.FileService :members: .. autoclass:: mitogen.service.PushFileService :members: mitogen-0.3.9/docs/svg-boxify.py000066400000000000000000000006661465666473100166160ustar00rootroot00000000000000 # Add viewBox attr to SVGs lacking it, so IE scales properly. import lxml.etree import glob for name in glob.glob('images/*.svg') + glob.glob('images/ansible/*.svg'): doc = lxml.etree.parse(open(name)) svg = doc.getroot() if 'viewBox' not in svg.attrib: svg.attrib['viewBox'] = '0 0 %(width)s %(height)s' % svg.attrib open(name, 'w').write(lxml.etree.tostring(svg, xml_declaration=True, encoding='UTF-8')) mitogen-0.3.9/docs/toc.rst000066400000000000000000000003741465666473100154620ustar00rootroot00000000000000 Table Of Contents ================= .. toctree:: :maxdepth: 2 index Mitogen for Ansible changelog contributors howitworks api getting_started examples internals .. toctree:: :hidden: services mitogen-0.3.9/examples/000077500000000000000000000000001465666473100150255ustar00rootroot00000000000000mitogen-0.3.9/examples/install_app.py000066400000000000000000000007271465666473100177130ustar00rootroot00000000000000#!/usr/bin/env python """ Install our application on a remote machine. Usage: install_app.py Where: Hostname to install to. """ import subprocess import sys import mitogen def install_app(): subprocess.check_call(['tar', 'zxvf', 'my_app.tar.gz']) @mitogen.main() def main(router): if len(sys.argv) != 2: print(__doc__) sys.exit(1) context = router.ssh(hostname=sys.argv[1]) context.call(install_app) mitogen-0.3.9/examples/mitogen-fuse.py000066400000000000000000000154411465666473100200060ustar00rootroot00000000000000#!/usr/bin/env python # # pip install fusepy # # This implementation could improve a /lot/, but the core library is missing # some functionality (#213) to make that easy. Additionally it needs a set of # Python bindings for FUSE that stupidly require use of a thread pool. from __future__ import absolute_import, division from __future__ import unicode_literals import errno import logging import threading import sys import time import fuse import mitogen.master import mitogen.utils import __main__ import os LOG = logging.getLogger(__name__) def to_text(p): """ On 3.x, fusepy returns paths as bytes. """ if isinstance(p, bytes): return p.decode('utf-8') return p def errno_wrap(modname, func, *args): try: return getattr(globals()[modname], func)(*args), None except (IOError, OSError): e = sys.exc_info()[1] if e.args[0] == errno.ENOENT: LOG.error('%r(**%r): %s', func, args, e) else: LOG.exception('While running %r(**%r)', func, args) return None, to_text(errno.errorcode[e.args[0]]) def errno_call(context, func, *args): result, errname = context.call( errno_wrap, func.__module__, func.__name__, *args ) if errname: raise fuse.FuseOSError(getattr(errno, errname)) return result def _create(path, mode): fd = os.open(path, os.O_WRONLY) try: os.fchmod(fd, mode) finally: os.close(fd) def _stat(path): st = os.lstat(path) keys = ('st_atime', 'st_gid', 'st_mode', 'st_mtime', 'st_size', 'st_uid') dct = dict((key, getattr(st, key)) for key in keys) dct['has_contents'] = os.path.exists(os.path.join(path, 'Contents')) return dct def _listdir(path): return [ (name, _stat(os.path.join(path, name)), 0) for name in os.listdir(path) ] def _read(path, size, offset): fd = os.open(path, os.O_RDONLY) try: os.lseek(fd, offset, os.SEEK_SET) return os.read(fd, size) finally: os.close(fd) def _truncate(path, length): fd = os.open(path, os.O_RDWR) try: os.truncate(fd, length) finally: os.close(fd) def _write(path, data, offset): fd = os.open(path, os.O_RDWR) try: os.lseek(fd, offset, os.SEEK_SET) return os.write(fd, data) finally: os.close(fd) def _evil_name(path): if not (os.path.basename(path).startswith('._') or path.endswith('.DS_Store')): return raise fuse.FuseOSError(errno.ENOENT) def _chroot(path): os.chroot(path) class Operations(fuse.Operations): # fuse.LoggingMixIn, def __init__(self, host, path='.'): self.host = host self.root = path self.ready = threading.Event() if not hasattr(self, 'encoding'): self.encoding = 'utf-8' def init(self, path): self.broker = mitogen.master.Broker(install_watcher=False) self.router = mitogen.master.Router(self.broker) self.host = self.router.ssh(hostname=self.host) self._context = self.router.sudo(via=self.host) #self._context.call(_chroot , '/home/dmw') self._stat_cache = {} self.ready.set() def destroy(self, path): self.broker.shutdown() @property def context(self): self.ready.wait() return self._context def chmod(self, path, mode): path = path.decode(self.encoding) _evil_name(path) return errno_call(self._context, os.chmod, path, mode) def chown(self, path, uid, gid): path = path.decode(self.encoding) _evil_name(path) return errno_call(self._context, os.chown, path, uid, gid) def create(self, path, mode): path = path.decode(self.encoding) _evil_name(path) return errno_call(self._context, _create, path, mode) or 0 def getattr(self, path, fh=None): _evil_name(path) if path in self._stat_cache: now = time.time() then, st = self._stat_cache[path] if now < (then + 2.0): return st basedir = os.path.dirname(path) if path.endswith('/Contents') and basedir in self._stat_cache: now = time.time() then, st = self._stat_cache[basedir] if now < (then + 2.0) and not st['has_contents']: raise fuse.FuseOSError(errno.ENOENT) return errno_call(self._context, _stat, path) def mkdir(self, path, mode): path = path.decode(self.encoding) _evil_name(path) return errno_call(self._context, os.mkdir, path, mode) def read(self, path, size, offset, fh): path = path.decode(self.encoding) _evil_name(path) return errno_call(self._context, _read, path, size, offset) def readdir(self, path, fh): _evil_name(path) lst = errno_call(self._context, _listdir, path) now = time.time() for name, stat, _ in lst: self._stat_cache[os.path.join(path, name)] = (now, stat) return lst def readlink(self, path): _evil_name(path) return errno_call(self._context, os.readlink, path) def rename(self, old, new): old = old.decode(self.encoding) new = new.decode(self.encoding) return errno_call(self._context, os.rename, old, new) # TODO return self.sftp.rename(old, self.root + new) def rmdir(self, path): path = path.decode(self.encoding) _evil_name(path) return errno_call(self._context, os.rmdir, path) def symlink(self, target, source): target = target.decode(self.encoding) source = source.decode(self.encoding) _evil_name(path) return errno_call(self._context, os.symlink, source, target) def truncate(self, path, length, fh=None): path = path.decode(self.encoding) _evil_name(path) return errno_call(self._context, _truncate, path, length) def unlink(self, path): path = path.decode(self.encoding) _evil_name(path) return errno_call(self._context, os.unlink, path) def utimens(self, path, times=None): path = path.decode(self.encoding) _evil_name(path) return errno_call(self._context, os.utime, path, times) def write(self, path, data, offset, fh): path = path.decode(self.encoding) _evil_name(path) return errno_call(self._context, _write, path, data, offset) @mitogen.main(log_level='DEBUG') def main(router): if len(sys.argv) != 3: print('usage: %s ' % sys.argv[0]) sys.exit(1) kwargs = {} if sys.platform == 'darwin': kwargs['volname'] = '%s (Mitogen)' % (sys.argv[1],) fuse.FUSE( operations=Operations(sys.argv[1]), mountpoint=sys.argv[2], foreground=True, **kwargs ) mitogen-0.3.9/examples/mitop.py000066400000000000000000000171331465666473100165340ustar00rootroot00000000000000""" mitop.py is a version of the UNIX top command that knows how to display process lists from multiple machines in a single listing. This is a basic, initial version showing overall program layout. A future version will extend it to: * Only notify the master of changed processes, rather than all processes. * Runtime-reconfigurable filters and aggregations handled on the remote machines rather than forcing a bottleneck in the master. """ import curses import subprocess import sys import time import mitogen.core import mitogen.master import mitogen.select import mitogen.utils class Host(object): """ A target host from the perspective of the master process. """ #: String hostname. name = None #: mitogen.parent.Context used to call functions on the host. context = None #: mitogen.core.Receiver the target delivers state updates to. recv = None def __init__(self): #: Mapping of pid -> Process() for each process described #: in the host's previous status update. self.procs = {} class Process(object): """ A single process running on a target host. """ host = None user = None pid = None ppid = None pgid = None command = None rss = None pcpu = None rss = None def child_main(sender, delay): """ Executed on the main thread of the Python interpreter running on each target machine, Context.call() from the master. It simply sends the output of the UNIX 'ps' command at regular intervals toward a Receiver on master. :param mitogen.core.Sender sender: The Sender to use for delivering our result. This could target anywhere, but the sender supplied by the master simply causes results to be delivered to the master's associated per-host Receiver. """ args = ['ps', '-axwwo', 'user,pid,ppid,pgid,%cpu,rss,command'] while True: sender.send(subprocess.check_output(args).decode()) time.sleep(delay) def parse_output(host, s): prev_pids = set(host.procs) for line in s.splitlines()[1:]: bits = line.split(None, 6) pid = int(bits[1]) new = pid not in prev_pids prev_pids.discard(pid) try: proc = host.procs[pid] except KeyError: host.procs[pid] = proc = Process() proc.hostname = host.name proc.new = new proc.user = bits[0] proc.pid = pid proc.ppid = int(bits[2]) proc.pgid = int(bits[3]) proc.pcpu = float(bits[4]) proc.rss = int(bits[5]) / 1024 proc.command = bits[6] # These PIDs had no update, so probably they are dead now. for pid in prev_pids: del host.procs[pid] class Painter(object): """ This is ncurses (screen drawing) magic, you can ignore it. :) """ def __init__(self, hosts): self.stdscr = curses.initscr() curses.start_color() self.height, self.width = self.stdscr.getmaxyx() curses.cbreak() curses.noecho() self.stdscr.keypad(1) self.hosts = hosts self.format = ( '%(hostname)10.10s ' '%(pid)7.7s ' '%(ppid)7.7s ' '%(pcpu)6.6s ' '%(rss)5.5s ' '%(command)20s' ) def close(self): curses.endwin() def paint(self): self.stdscr.erase() self.stdscr.addstr(0, 0, time.ctime()) all_procs = [] for host in self.hosts: all_procs.extend(host.procs.values()) all_procs.sort(key=(lambda proc: -proc.pcpu)) self.stdscr.addstr(1, 0, self.format % { 'hostname': 'HOST', 'pid': 'PID', 'ppid': 'PPID', 'pcpu': '%CPU', 'rss': 'RSS', 'command': 'COMMAND', }) for i, proc in enumerate(all_procs): if (i+3) >= self.height: break if proc.new: self.stdscr.attron(curses.A_BOLD) else: self.stdscr.attroff(curses.A_BOLD) self.stdscr.addstr(2+i, 0, self.format % dict( vars(proc), command=proc.command[:self.width-36] )) self.stdscr.refresh() def master_main(painter, router, select, delay): """ Loop until CTRL+C is pressed, waiting for the next result delivered by the Select. Use parse_output() to turn that result ('ps' command output) into rich data, and finally repaint the screen if the repaint delay has passed. """ next_paint = 0 while True: msg = select.get() parse_output(msg.receiver.host, msg.unpickle()) if next_paint < time.time(): next_paint = time.time() + delay painter.paint() @mitogen.main() def main(router): """ Main program entry point. @mitogen.main() is just a helper to handle reliable setup/destruction of Broker, Router and the logging package. """ argv = sys.argv[1:] if not len(argv): print('mitop: Need a list of SSH hosts to connect to.') sys.exit(1) delay = 2.0 select = mitogen.select.Select(oneshot=False) hosts = [] # For each hostname on the command line, create a Host instance, a Mitogen # connection, a Receiver to accept messages from the host, and finally # start child_main() on the host to pump messages into the receiver. for hostname in argv: print('Starting on', hostname) host = Host() host.name = hostname if host.name == 'localhost': host.context = router.local() else: host.context = router.ssh(hostname=host.name) # A receiver wires up a handle (via Router.add_handler()) to an # internal thread-safe queue object, which can be drained through calls # to recv.get(). host.recv = mitogen.core.Receiver(router) host.recv.host = host # But we don't want to receive data from just one receiver, we want to # receive data from many. In this case we can use a Select(). It knows # how to efficiently sleep while waiting for the first message sent to # many receivers. select.add(host.recv) # The inverse of a Receiver is a Sender. Unlike receivers, senders are # serializable, so we can call the .to_sender() helper method to create # one equivalent to our host's receiver, and pass it directly to the # host as a function parameter. sender = host.recv.to_sender() # Finally invoke the function in the remote target. Since child_main() # is an infinite loop, using .call() would block the parent, since # child_main() never returns. Instead use .call_async(), which returns # another Receiver. We also want to wait for results from it -- # although child_main() never returns, if it crashes the exception will # be delivered instead. call_recv = host.context.call_async(child_main, sender, delay) call_recv.host = host # Adding call_recv to the select will cause mitogen.core.CallError to # be thrown by .get() if startup of any context fails, causing halt of # master_main(), and the exception to be printed. select.add(call_recv) hosts.append(host) # Painter just wraps up all the prehistory ncurses code and keeps it out of # master_main(). painter = Painter(hosts) try: try: master_main(painter, router, select, delay) except KeyboardInterrupt: # Shut down gracefully when the user presses CTRL+C. pass finally: painter.close() mitogen-0.3.9/examples/ping_pong.py000066400000000000000000000025631465666473100173650ustar00rootroot00000000000000# Wire up a ping/pong counting loop between 2 subprocesses. from __future__ import print_function import mitogen.core import mitogen.select @mitogen.core.takes_router def ping_pong(control_sender, router): with mitogen.core.Receiver(router) as recv: # Tell caller how to communicate with us. control_sender.send(recv.to_sender()) # Wait for caller to tell us how to talk back: data_sender = recv.get().unpickle() n = 0 while (n + 1) < 30: n = recv.get().unpickle() print('the number is currently', n) data_sender.send(n + 1) @mitogen.main() def main(router): # Create a receiver for control messages. with mitogen.core.Receiver(router) as recv: # Start ping_pong() in child 1 and fetch its sender. c1 = router.local() c1_call = c1.call_async(ping_pong, recv.to_sender()) c1_sender = recv.get().unpickle() # Start ping_pong() in child 2 and fetch its sender. c2 = router.local() c2_call = c2.call_async(ping_pong, recv.to_sender()) c2_sender = recv.get().unpickle() # Tell the children about each others' senders. c1_sender.send(c2_sender) c2_sender.send(c1_sender) # Start the loop. c1_sender.send(0) # Wait for both functions to return. mitogen.select.Select.all([c1_call, c2_call]) mitogen-0.3.9/examples/select_loop.py000066400000000000000000000074371465666473100177220ustar00rootroot00000000000000 # # This demonstrates using a nested select.Select() to simultaneously watch for # in-progress events generated by a bunch of function calls, and the completion # of those function calls. # # We start 5 children and run a function in each of them in parallel. The # function writes the numbers 1..5 to a Sender before returning. The master # reads the numbers from each child as they are generated, and exits the loop # when the last function returns. # from __future__ import absolute_import from __future__ import print_function import time import mitogen import mitogen.select def count_to(sender, n, wait=0.333): for x in range(n): sender.send(x) time.sleep(wait) @mitogen.main() def main(router): # Start 5 subprocesses and give them made up names. contexts = { 'host%d' % (i,): router.local() for i in range(5) } # Used later to recover hostname. A future Mitogen will provide a better # way to get app data references back out of its IO primitives, for now you # need to do it manually. hostname_by_context_id = { context.context_id: hostname for hostname, context in contexts.items() } # I am a select that holds the receivers that will receive the function # call results. Selects are one-shot by default, which means each receiver # is removed from them as a result arrives. Therefore it means the last # function has completed when bool(calls_sel) is False. calls_sel = mitogen.select.Select() # I receive the numbers as they are counted. status_recv = mitogen.core.Receiver(router) # Start the function calls for hostname, context in contexts.items(): calls_sel.add( context.call_async( count_to, sender=status_recv.to_sender(), n=5, wait=0.333 ) ) # Create a select subscribed to the function call result Select, and to the # number-counting receiver. Any message arriving on any child of this # Select will wake it up -- be it a message arriving on the status # receiver, or any message arriving on any of the function call result # receivers. # Once last call is completed, calls_sel will be empty since it's # oneshot=True (the default), causing __bool__ to be False both_sel = mitogen.select.Select([status_recv, calls_sel], oneshot=False) # Internally selects store a strong reference from Receiver->Select that # will keep the Select alive as long as the receiver is alive. If a # receiver or select otherwise 'outlives' some parent select, attempting to # re-add it to a new select will raise an error. In all cases it's # desirable to call Select.close(). This can be done as a context manager. with calls_sel, both_sel: while calls_sel: try: msg = both_sel.get(timeout=60.0) except mitogen.core.TimeoutError: print("No update in 60 seconds, something's broke") break hostname = hostname_by_context_id[msg.src_id] if msg.receiver is status_recv: # https://mitogen.readthedocs.io/en/stable/api.html#mitogen.core.Message.receiver # handle a status update print('Got status update from %s: %s' % (hostname, msg.unpickle())) elif msg.receiver is calls_sel: # subselect # handle a function call result. try: assert None == msg.unpickle() print('Task succeeded on %s' % (hostname,)) except mitogen.core.CallError as e: print('Task failed on host %s: %s' % (hostname, e)) if calls_sel: print('Some tasks did not complete.') else: print('All tasks completed.') mitogen-0.3.9/examples/service/000077500000000000000000000000001465666473100164655ustar00rootroot00000000000000mitogen-0.3.9/examples/service/self_contained.py000066400000000000000000000023361465666473100220200ustar00rootroot00000000000000import mitogen import mitogen.service class FileService(mitogen.service.Service): """ Simple file server, for demonstration purposes only! Use of this in real code would be a security vulnerability as it would permit children to read any file from the master's disk. """ @mitogen.service.expose(policy=mitogen.service.AllowAny()) @mitogen.service.arg_spec(spec={ 'path': str }) def read_file(self, path): with open(path, 'rb') as fp: return fp.read() def download_file(source_context, path): s = source_context.call_service( service_name=FileService, # may also be string 'pkg.mod.FileService' method_name='read_file', path=path, ) with open(path, 'w') as fp: fp.write(s) def download_some_files(source_context, paths): for path in paths: download_file(source_context, path) @mitogen.main() def main(router): pool = mitogen.service.Pool(router, services=[ FileService(router), ]) remote = router.ssh(hostname='k3') remote.call(download_some_files, source_context=router.myself(), paths=[ '/etc/passwd', '/etc/hosts', ] ) pool.stop() mitogen-0.3.9/examples/the_basics.py000066400000000000000000000277571465666473100175250ustar00rootroot00000000000000 # # This program is a stand-in for good intro docs. It just documents various # basics of using Mitogen. # from __future__ import absolute_import from __future__ import print_function import hashlib import io import os import spwd import mitogen.core import mitogen.master import mitogen.service import mitogen.utils def get_file_contents(path): """ Get the contents of a file. """ with open(path, 'rb') as fp: # mitogen.core.Blob() is a bytes subclass with a repr() that returns a # summary of the blob, rather than the raw blob data. This makes # logging output *much* nicer. Unlike most custom types, blobs can be # serialized. return mitogen.core.Blob(fp.read()) def put_file_contents(path, s): """ Write the contents of a file. """ with open(path, 'wb') as fp: fp.write(s) def streamy_download_file(context, path): """ Fetch a file from the FileService hosted by `context`. """ bio = io.BytesIO() # FileService.get() is not actually an exposed service method, it's just a # classmethod that wraps up the complicated dance of implementing the # transfer. ok, metadata = mitogen.service.FileService.get(context, path, bio) return { 'success': ok, 'metadata': metadata, 'size': len(bio.getvalue()), } def get_password_hash(username): """ Fetch a user's password hash. """ try: h = spwd.getspnam(username) except KeyError: return None # mitogen.core.Secret() is a Unicode subclass with a repr() that hides the # secret data. This keeps secret stuff out of logs. Like blobs, secrets can # also be serialized. return mitogen.core.Secret(h) def md5sum(path): """ Return the MD5 checksum for a file. """ return hashlib.md5(get_file_contents(path)).hexdigest() def work_on_machine(context): """ Do stuff to a remote context. """ print("Created context. Context ID is", context.context_id) # You don't need to understand any/all of this, but it's helpful to grok # the whole chain: # - Context.call() is a light wrapper around .call_async(), the wrapper # simply blocks the caller until a reply arrives. # - .call_async() serializes the call signature into a message and passes # it to .send_async() # - .send_async() creates a mitogen.core.Receiver() on the local router. # The receiver constructor uses Router.add_handle() to allocate a # 'reply_to' handle and install a callback function that wakes the # receiver when a reply message arrives. # - .send_async() puts the reply handle in Message.reply_to field and # passes it to .send() # - Context.send() stamps the destination context ID into the # Message.dst_id field and passes it to Router.route() # - Router.route() uses Broker.defer() to schedule _async_route(msg) # on the Broker thread. # [broker thread] # - The broker thread wakes and calls _async_route(msg) # - Router._async_route() notices 'dst_id' is for a remote context and # looks up the stream on which messages for dst_id should be sent (may be # direct connection or not), and calls Stream.send() # - Stream.send() packs the message into a bytestring, appends it to # Stream._output_buf, and calls Broker.start_transmit() # - Broker finishes work, reenters IO loop. IO loop wakes due to writeable # stream. # - Stream.on_transmit() writes the full/partial buffer to SSH, calls # stop_transmit() to mark the stream unwriteable once _output_buf is # empty. # - Broker IO loop sleeps, no readers/writers. # - Broker wakes due to SSH stream readable. # - Stream.on_receive() called, reads the reply message, converts it to a # Message and passes it to Router._async_route(). # - Router._async_route() notices message is for local context, looks up # target handle in the .add_handle() registry. # - Receiver._on_receive() called, appends message to receiver queue. # [main thread] # - Receiver.get() used to block the original Context.call() wakes and pops # the message from the queue. # - Message data (pickled return value) is deserialized and returned to the # caller. print("It's running on the local machine. Its PID is", context.call(os.getpid)) # Now let's call a function defined in this module. On receiving the # function call request, the child attempts to import __main__, which is # initially missing, causing the importer in the child to request it from # its parent. That causes _this script_ to be sent as the module source # over the wire. print("Calling md5sum(/etc/passwd) in the child:", context.call(md5sum, '/etc/passwd')) # Now let's "transfer" a file. The simplest way to do this is calling a # function that returns the file data, which is totally fine for small # files. print("Download /etc/passwd via function call: %d bytes" % ( len(context.call(get_file_contents, '/etc/passwd')) )) # And using function calls, in the other direction: print("Upload /tmp/blah via function call: %s" % ( context.call(put_file_contents, '/tmp/blah', b'blah!'), )) # Now lets transfer what might be a big files. The problem with big files # is that they may not fit in RAM. This uses mitogen.services.FileService # to implement streamy file transfer instead. The sender must have a # 'service pool' running that will host FileService. First let's do the # 'upload' direction, where the master hosts FileService. # Steals the 'Router' reference from the context object. In a real app the # pool would be constructed once at startup, this is just demo code. file_service = mitogen.service.FileService(context.router) # Start the pool. pool = mitogen.service.Pool(context.router, services=[file_service]) # Grant access to a file on the local disk from unprivileged contexts. # .register() is also exposed as a service method -- you can call it on a # child context from any more privileged context. file_service.register('/etc/passwd') # Now call our wrapper function that knows how to handle the transfer. In a # real app, this wrapper might also set ownership/modes or do any other # app-specific stuff relating to the file that was transferred. print("Streamy upload /etc/passwd: remote result: %s" % ( context.call( streamy_download_file, # To avoid hard-wiring streamy_download_file(), we want to pass it # a Context object that hosts the file service it should request # files from. Router.myself() returns a Context referring to this # process. context=router.myself(), path='/etc/passwd', ), )) # Shut down the pool now we're done with it, else app will hang at exit. # Once again, this should only happen once at app startup/exit, not for # every file transfer! pool.stop(join=True) # Now let's do the same thing but in reverse: we use FileService on the # remote download a file. This uses context.call_service(), which invokes a # special code path that causes auto-initialization of a thread pool in the # target, and auto-construction of the target service, but only if the # service call was made by a more privileged context. We could write a # helper function that runs in the remote to do all that by hand, but the # library handles it for us. # Make the file accessible. A future FileService could avoid the need for # this for privileged contexts. context.call_service( service_name=mitogen.service.FileService, method_name='register', path='/etc/passwd' ) # Now we can use our streamy_download_file() function in reverse -- running # it from this process and having it fetch from the remote process: print("Streamy download /etc/passwd: result: %s" % ( streamy_download_file(context, '/etc/passwd'), )) def main(): # Setup logging. Mitogen produces a LOT of logging. Over the course of the # stable series, Mitogen's loggers will be carved up so more selective / # user-friendly logging is possible. mitogen.log_to_file() just sets up # something basic, defaulting to INFO level, but you can override from the # command-line by passing MITOGEN_LOG_LEVEL=debug or MITOGEN_LOG_LEVEL=io. # IO logging is sometimes useful for hangs, but it is often creates more # confusion than it solves. mitogen.utils.log_to_file() # Construct the Broker thread. It manages an async IO loop listening for # reads from any active connection, or wakes from any non-Broker thread. # Because Mitogen uses a background worker thread, it is extremely # important to pay attention to the use of UNIX fork in your code -- # forking entails making a snapshot of the state of all locks in the # program, including those in the logging module, and thus can create code # that appears to work for a long time, before deadlocking randomly. # Forking in a Mitogen app requires significant upfront planning! broker = mitogen.master.Broker() # Construct a Router. This accepts messages (mitogen.core.Message) and # either dispatches locally addressed messages to local handlers (added via # Router.add_handle()) on the broker thread, or forwards the message # towards the target context. # The router also acts as an uglyish God object for creating new # connections. This was a design mistake, really those methods should be # directly imported from e.g. 'mitogen.ssh'. router = mitogen.master.Router(broker) # Router can act like a context manager. It simply ensures # Broker.shutdown() is called on exception / exit. That prevents the app # hanging due to a forgotten background thread. For throwaway scripts, # there are also decorator versions "@mitogen.main()" and # "@mitogen.utils.with_router" that do the same thing with less typing. with router: # Now let's construct a context. The '.local()' constructor just creates # the context as a subprocess, the simplest possible case. child = router.local() print("Created a context:", child) print() # This demonstrates the standard IO redirection. We call the print # function in the remote context, that should cause a log message to be # emitted. Any subprocesses started by the remote also get the same # treatment, so it's very easy to spot otherwise discarded errors/etc. # from remote tools. child.call(print, "Hello from child.") # Context objects make it semi-convenient to treat the local machine the # same as a remote machine. work_on_machine(child) # Now let's construct a proxied context. We'll simply use the .local() # constructor again, but construct it via 'child'. In effect we are # constructing a sub-sub-process. Instead of .local() here, we could # have used .sudo() or .ssh() or anything else. subchild = router.local(via=child) print() print() print() print("Created a context as a child of another context:", subchild) # Do everything again with the new child. work_on_machine(subchild) # We can selectively shut down individual children if we want: subchild.shutdown(wait=True) # Or we can simply fall off the end of the scope, effectively calling # Broker.shutdown(), which causes all children to die as part of # shutdown. # The child module importer detects the execution guard below and removes any # code appearing after it, and refuses to execute "__main__" if it is absent. # This is necessary to prevent a common problem where people try to call # functions defined in __main__ without first wrapping it up to be importable # as a module, which previously hung the target, or caused bizarre recursive # script runs. if __name__ == '__main__': main() mitogen-0.3.9/mitogen/000077500000000000000000000000001465666473100146515ustar00rootroot00000000000000mitogen-0.3.9/mitogen/__init__.py000066400000000000000000000100611465666473100167600ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # !mitogen: minify_safe """ On the Mitogen master, this is imported from ``mitogen/__init__.py`` as would be expected. On the slave, it is built dynamically during startup. """ #: Library version as a tuple. __version__ = (0, 3, 9) #: This is :data:`False` in slave contexts. Previously it was used to prevent #: re-execution of :mod:`__main__` in single file programs, however that now #: happens automatically. is_master = True #: This is `0` in a master, otherwise it is the master-assigned ID unique to #: the slave context used for message routing. context_id = 0 #: This is :data:`None` in a master, otherwise it is the master-assigned ID #: unique to the slave's parent context. parent_id = None #: This is an empty list in a master, otherwise it is a list of parent context #: IDs ordered from most direct to least direct. parent_ids = [] import os _default_profiling = os.environ.get('MITOGEN_PROFILING') is not None del os def main(log_level='INFO', profiling=_default_profiling): """ Convenience decorator primarily useful for writing discardable test scripts. In the master process, when `func` is defined in the :mod:`__main__` module, arranges for `func(router)` to be invoked immediately, with :py:class:`mitogen.master.Router` construction and destruction handled just as in :py:func:`mitogen.utils.run_with_router`. In slaves, this function does nothing. :param str log_level: Logging package level to configure via :py:func:`mitogen.utils.log_to_file`. :param bool profiling: If :py:data:`True`, equivalent to setting :py:attr:`mitogen.master.Router.profiling` prior to router construction. This causes ``/tmp`` files to be created everywhere at the end of a successful run with :py:mod:`cProfile` output for every thread. Example: :: import mitogen import requests def get_url(url): return requests.get(url).text @mitogen.main() def main(router): z = router.ssh(hostname='k3') print(z.call(get_url, 'https://example.org/'))))) """ def wrapper(func): if func.__module__ != '__main__': return func import mitogen.parent import mitogen.utils if profiling: mitogen.core.enable_profiling() mitogen.master.Router.profiling = profiling mitogen.utils.log_to_file(level=log_level) return mitogen.core._profile_hook( 'app.main', mitogen.utils.run_with_router, func, ) return wrapper mitogen-0.3.9/mitogen/buildah.py000066400000000000000000000051711465666473100166370ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # !mitogen: minify_safe import logging import mitogen.parent LOG = logging.getLogger(__name__) class Options(mitogen.parent.Options): container = None username = None buildah_path = 'buildah' def __init__(self, container=None, buildah_path=None, username=None, **kwargs): super(Options, self).__init__(**kwargs) assert container is not None self.container = container if buildah_path: self.buildah_path = buildah_path if username: self.username = username class Connection(mitogen.parent.Connection): options_class = Options child_is_immediate_subprocess = False # TODO: better way of capturing errors such as "No such container." create_child_args = { 'merge_stdio': True } def _get_name(self): return u'buildah.' + self.options.container def get_boot_command(self): args = [self.options.buildah_path, 'run'] if self.options.username: args += ['--user=' + self.options.username] args += ['--', self.options.container] return args + super(Connection, self).get_boot_command() mitogen-0.3.9/mitogen/compat/000077500000000000000000000000001465666473100161345ustar00rootroot00000000000000mitogen-0.3.9/mitogen/compat/__init__.py000066400000000000000000000000001465666473100202330ustar00rootroot00000000000000mitogen-0.3.9/mitogen/compat/pkgutil.py000066400000000000000000000476661465666473100202100ustar00rootroot00000000000000"""Utilities to support packages.""" # !mitogen: minify_safe # NOTE: This module must remain compatible with Python 2.3, as it is shared # by setuptools for distribution with Python 2.3 and up. import os import sys import imp import os.path from types import ModuleType __all__ = [ 'get_importer', 'iter_importers', 'get_loader', 'find_loader', 'walk_packages', 'iter_modules', 'get_data', 'ImpImporter', 'ImpLoader', 'read_code', 'extend_path', ] def read_code(stream): # This helper is needed in order for the PEP 302 emulation to # correctly handle compiled files import marshal magic = stream.read(4) if magic != imp.get_magic(): return None stream.read(4) # Skip timestamp return marshal.load(stream) def simplegeneric(func): """Make a trivial single-dispatch generic function""" registry = {} def wrapper(*args, **kw): ob = args[0] try: cls = ob.__class__ except AttributeError: cls = type(ob) try: mro = cls.__mro__ except AttributeError: try: class cls(cls, object): pass mro = cls.__mro__[1:] except TypeError: mro = object, # must be an ExtensionClass or some such :( for t in mro: if t in registry: return registry[t](*args, **kw) else: return func(*args, **kw) try: wrapper.__name__ = func.__name__ except (TypeError, AttributeError): pass # Python 2.3 doesn't allow functions to be renamed def register(typ, func=None): if func is None: return lambda f: register(typ, f) registry[typ] = func return func wrapper.__dict__ = func.__dict__ wrapper.__doc__ = func.__doc__ wrapper.register = register return wrapper def walk_packages(path=None, prefix='', onerror=None): """Yields (module_loader, name, ispkg) for all modules recursively on path, or, if path is None, all accessible modules. 'path' should be either None or a list of paths to look for modules in. 'prefix' is a string to output on the front of every module name on output. Note that this function must import all *packages* (NOT all modules!) on the given path, in order to access the __path__ attribute to find submodules. 'onerror' is a function which gets called with one argument (the name of the package which was being imported) if any exception occurs while trying to import a package. If no onerror function is supplied, ImportErrors are caught and ignored, while all other exceptions are propagated, terminating the search. Examples: # list all modules python can access walk_packages() # list all submodules of ctypes walk_packages(ctypes.__path__, ctypes.__name__+'.') """ def seen(p, m={}): if p in m: return True m[p] = True for importer, name, ispkg in iter_modules(path, prefix): yield importer, name, ispkg if ispkg: try: __import__(name) except ImportError: if onerror is not None: onerror(name) except Exception: if onerror is not None: onerror(name) else: raise else: path = getattr(sys.modules[name], '__path__', None) or [] # don't traverse path items we've seen before path = [p for p in path if not seen(p)] for item in walk_packages(path, name+'.', onerror): yield item def iter_modules(path=None, prefix=''): """Yields (module_loader, name, ispkg) for all submodules on path, or, if path is None, all top-level modules on sys.path. 'path' should be either None or a list of paths to look for modules in. 'prefix' is a string to output on the front of every module name on output. """ if path is None: importers = iter_importers() else: importers = map(get_importer, path) yielded = {} for i in importers: for name, ispkg in iter_importer_modules(i, prefix): if name not in yielded: yielded[name] = 1 yield i, name, ispkg #@simplegeneric def iter_importer_modules(importer, prefix=''): if not hasattr(importer, 'iter_modules'): return [] return importer.iter_modules(prefix) iter_importer_modules = simplegeneric(iter_importer_modules) class ImpImporter: """PEP 302 Importer that wraps Python's "classic" import algorithm ImpImporter(dirname) produces a PEP 302 importer that searches that directory. ImpImporter(None) produces a PEP 302 importer that searches the current sys.path, plus any modules that are frozen or built-in. Note that ImpImporter does not currently support being used by placement on sys.meta_path. """ def __init__(self, path=None): self.path = path def find_module(self, fullname, path=None): # Note: we ignore 'path' argument since it is only used via meta_path subname = fullname.split(".")[-1] if subname != fullname and self.path is None: return None if self.path is None: path = None else: path = [os.path.realpath(self.path)] try: file, filename, etc = imp.find_module(subname, path) except ImportError: return None return ImpLoader(fullname, file, filename, etc) def iter_modules(self, prefix=''): if self.path is None or not os.path.isdir(self.path): return yielded = {} import inspect try: filenames = os.listdir(self.path) except OSError: # ignore unreadable directories like import does filenames = [] filenames.sort() # handle packages before same-named modules for fn in filenames: modname = inspect.getmodulename(fn) if modname=='__init__' or modname in yielded: continue path = os.path.join(self.path, fn) ispkg = False if not modname and os.path.isdir(path) and '.' not in fn: modname = fn try: dircontents = os.listdir(path) except OSError: # ignore unreadable directories like import does dircontents = [] for fn in dircontents: subname = inspect.getmodulename(fn) if subname=='__init__': ispkg = True break else: continue # not a package if modname and '.' not in modname: yielded[modname] = 1 yield prefix + modname, ispkg class ImpLoader: """PEP 302 Loader that wraps Python's "classic" import algorithm """ code = source = None def __init__(self, fullname, file, filename, etc): self.file = file self.filename = filename self.fullname = fullname self.etc = etc def load_module(self, fullname): self._reopen() try: mod = imp.load_module(fullname, self.file, self.filename, self.etc) finally: if self.file: self.file.close() # Note: we don't set __loader__ because we want the module to look # normal; i.e. this is just a wrapper for standard import machinery return mod def get_data(self, pathname): return open(pathname, "rb").read() def _reopen(self): if self.file and self.file.closed: mod_type = self.etc[2] if mod_type==imp.PY_SOURCE: self.file = open(self.filename, 'rU') elif mod_type in (imp.PY_COMPILED, imp.C_EXTENSION): self.file = open(self.filename, 'rb') def _fix_name(self, fullname): if fullname is None: fullname = self.fullname elif fullname != self.fullname: raise ImportError("Loader for module %s cannot handle " "module %s" % (self.fullname, fullname)) return fullname def is_package(self, fullname): fullname = self._fix_name(fullname) return self.etc[2]==imp.PKG_DIRECTORY def get_code(self, fullname=None): fullname = self._fix_name(fullname) if self.code is None: mod_type = self.etc[2] if mod_type==imp.PY_SOURCE: source = self.get_source(fullname) self.code = compile(source, self.filename, 'exec') elif mod_type==imp.PY_COMPILED: self._reopen() try: self.code = read_code(self.file) finally: self.file.close() elif mod_type==imp.PKG_DIRECTORY: self.code = self._get_delegate().get_code() return self.code def get_source(self, fullname=None): fullname = self._fix_name(fullname) if self.source is None: mod_type = self.etc[2] if mod_type==imp.PY_SOURCE: self._reopen() try: self.source = self.file.read() finally: self.file.close() elif mod_type==imp.PY_COMPILED: if os.path.exists(self.filename[:-1]): f = open(self.filename[:-1], 'rU') self.source = f.read() f.close() elif mod_type==imp.PKG_DIRECTORY: self.source = self._get_delegate().get_source() return self.source def _get_delegate(self): return ImpImporter(self.filename).find_module('__init__') def get_filename(self, fullname=None): fullname = self._fix_name(fullname) mod_type = self.etc[2] if self.etc[2]==imp.PKG_DIRECTORY: return self._get_delegate().get_filename() elif self.etc[2] in (imp.PY_SOURCE, imp.PY_COMPILED, imp.C_EXTENSION): return self.filename return None try: import zipimport from zipimport import zipimporter def iter_zipimport_modules(importer, prefix=''): dirlist = zipimport._zip_directory_cache[importer.archive].keys() dirlist.sort() _prefix = importer.prefix plen = len(_prefix) yielded = {} import inspect for fn in dirlist: if not fn.startswith(_prefix): continue fn = fn[plen:].split(os.sep) if len(fn)==2 and fn[1].startswith('__init__.py'): if fn[0] not in yielded: yielded[fn[0]] = 1 yield fn[0], True if len(fn)!=1: continue modname = inspect.getmodulename(fn[0]) if modname=='__init__': continue if modname and '.' not in modname and modname not in yielded: yielded[modname] = 1 yield prefix + modname, False iter_importer_modules.register(zipimporter, iter_zipimport_modules) except ImportError: pass def get_importer(path_item): """Retrieve a PEP 302 importer for the given path item The returned importer is cached in sys.path_importer_cache if it was newly created by a path hook. If there is no importer, a wrapper around the basic import machinery is returned. This wrapper is never inserted into the importer cache (None is inserted instead). The cache (or part of it) can be cleared manually if a rescan of sys.path_hooks is necessary. """ try: importer = sys.path_importer_cache[path_item] except KeyError: for path_hook in sys.path_hooks: try: importer = path_hook(path_item) break except ImportError: pass else: importer = None sys.path_importer_cache.setdefault(path_item, importer) if importer is None: try: importer = ImpImporter(path_item) except ImportError: importer = None return importer def iter_importers(fullname=""): """Yield PEP 302 importers for the given module name If fullname contains a '.', the importers will be for the package containing fullname, otherwise they will be importers for sys.meta_path, sys.path, and Python's "classic" import machinery, in that order. If the named module is in a package, that package is imported as a side effect of invoking this function. Non PEP 302 mechanisms (e.g. the Windows registry) used by the standard import machinery to find files in alternative locations are partially supported, but are searched AFTER sys.path. Normally, these locations are searched BEFORE sys.path, preventing sys.path entries from shadowing them. For this to cause a visible difference in behaviour, there must be a module or package name that is accessible via both sys.path and one of the non PEP 302 file system mechanisms. In this case, the emulation will find the former version, while the builtin import mechanism will find the latter. Items of the following types can be affected by this discrepancy: imp.C_EXTENSION, imp.PY_SOURCE, imp.PY_COMPILED, imp.PKG_DIRECTORY """ if fullname.startswith('.'): raise ImportError("Relative module names not supported") if '.' in fullname: # Get the containing package's __path__ pkg = '.'.join(fullname.split('.')[:-1]) if pkg not in sys.modules: __import__(pkg) path = getattr(sys.modules[pkg], '__path__', None) or [] else: for importer in sys.meta_path: yield importer path = sys.path for item in path: yield get_importer(item) if '.' not in fullname: yield ImpImporter() def get_loader(module_or_name): """Get a PEP 302 "loader" object for module_or_name If the module or package is accessible via the normal import mechanism, a wrapper around the relevant part of that machinery is returned. Returns None if the module cannot be found or imported. If the named module is not already imported, its containing package (if any) is imported, in order to establish the package __path__. This function uses iter_importers(), and is thus subject to the same limitations regarding platform-specific special import locations such as the Windows registry. """ if module_or_name in sys.modules: module_or_name = sys.modules[module_or_name] if isinstance(module_or_name, ModuleType): module = module_or_name loader = getattr(module, '__loader__', None) if loader is not None: return loader fullname = module.__name__ else: fullname = module_or_name return find_loader(fullname) def find_loader(fullname): """Find a PEP 302 "loader" object for fullname If fullname contains dots, path must be the containing package's __path__. Returns None if the module cannot be found or imported. This function uses iter_importers(), and is thus subject to the same limitations regarding platform-specific special import locations such as the Windows registry. """ for importer in iter_importers(fullname): loader = importer.find_module(fullname) if loader is not None: return loader return None def extend_path(path, name): """Extend a package's path. Intended use is to place the following code in a package's __init__.py: from pkgutil import extend_path __path__ = extend_path(__path__, __name__) This will add to the package's __path__ all subdirectories of directories on sys.path named after the package. This is useful if one wants to distribute different parts of a single logical package as multiple directories. It also looks for *.pkg files beginning where * matches the name argument. This feature is similar to *.pth files (see site.py), except that it doesn't special-case lines starting with 'import'. A *.pkg file is trusted at face value: apart from checking for duplicates, all entries found in a *.pkg file are added to the path, regardless of whether they are exist the filesystem. (This is a feature.) If the input path is not a list (as is the case for frozen packages) it is returned unchanged. The input path is not modified; an extended copy is returned. Items are only appended to the copy at the end. It is assumed that sys.path is a sequence. Items of sys.path that are not (unicode or 8-bit) strings referring to existing directories are ignored. Unicode items of sys.path that cause errors when used as filenames may cause this function to raise an exception (in line with os.path.isdir() behavior). """ if not isinstance(path, list): # This could happen e.g. when this is called from inside a # frozen package. Return the path unchanged in that case. return path pname = os.path.join(*name.split('.')) # Reconstitute as relative path # Just in case os.extsep != '.' sname = os.extsep.join(name.split('.')) sname_pkg = sname + os.extsep + "pkg" init_py = "__init__" + os.extsep + "py" path = path[:] # Start with a copy of the existing path for dir in sys.path: if not isinstance(dir, basestring) or not os.path.isdir(dir): continue subdir = os.path.join(dir, pname) # XXX This may still add duplicate entries to path on # case-insensitive filesystems initfile = os.path.join(subdir, init_py) if subdir not in path and os.path.isfile(initfile): path.append(subdir) # XXX Is this the right thing for subpackages like zope.app? # It looks for a file named "zope.app.pkg" pkgfile = os.path.join(dir, sname_pkg) if os.path.isfile(pkgfile): try: f = open(pkgfile) except IOError: msg = sys.exc_info()[1] sys.stderr.write("Can't open %s: %s\n" % (pkgfile, msg)) else: for line in f: line = line.rstrip('\n') if not line or line.startswith('#'): continue path.append(line) # Don't check for existence! f.close() return path def get_data(package, resource): """Get a resource from a package. This is a wrapper round the PEP 302 loader get_data API. The package argument should be the name of a package, in standard module format (foo.bar). The resource argument should be in the form of a relative filename, using '/' as the path separator. The parent directory name '..' is not allowed, and nor is a rooted name (starting with a '/'). The function returns a binary string, which is the contents of the specified resource. For packages located in the filesystem, which have already been imported, this is the rough equivalent of d = os.path.dirname(sys.modules[package].__file__) data = open(os.path.join(d, resource), 'rb').read() If the package cannot be located or loaded, or it uses a PEP 302 loader which does not support get_data(), then None is returned. """ loader = get_loader(package) if loader is None or not hasattr(loader, 'get_data'): return None mod = sys.modules.get(package) or loader.load_module(package) if mod is None or not hasattr(mod, '__file__'): return None # Modify the resource name to be compatible with the loader.get_data # signature - an os.path format "filename" starting with the dirname of # the package's __file__ parts = resource.split('/') parts.insert(0, os.path.dirname(mod.__file__)) resource_name = os.path.join(*parts) return loader.get_data(resource_name) mitogen-0.3.9/mitogen/compat/tokenize.py000066400000000000000000000422441465666473100203440ustar00rootroot00000000000000"""Tokenization help for Python programs. generate_tokens(readline) is a generator that breaks a stream of text into Python tokens. It accepts a readline-like method which is called repeatedly to get the next line of input (or "" for EOF). It generates 5-tuples with these members: the token type (see token.py) the token (a string) the starting (row, column) indices of the token (a 2-tuple of ints) the ending (row, column) indices of the token (a 2-tuple of ints) the original line (string) It is designed to match the working of the Python tokenizer exactly, except that it produces COMMENT tokens for comments and gives type OP for all operators Older entry points tokenize_loop(readline, tokeneater) tokenize(readline, tokeneater=printtoken) are the same, except instead of generating tokens, tokeneater is a callback function to which the 5 fields described above are passed as 5 arguments, each time a new token is found.""" # !mitogen: minify_safe __author__ = 'Ka-Ping Yee ' __credits__ = ('GvR, ESR, Tim Peters, Thomas Wouters, Fred Drake, ' 'Skip Montanaro, Raymond Hettinger') from itertools import chain import string, re from token import * import token __all__ = [x for x in dir(token) if not x.startswith("_")] __all__ += ["COMMENT", "tokenize", "generate_tokens", "NL", "untokenize"] del token COMMENT = N_TOKENS tok_name[COMMENT] = 'COMMENT' NL = N_TOKENS + 1 tok_name[NL] = 'NL' N_TOKENS += 2 def group(*choices): return '(' + '|'.join(choices) + ')' def any(*choices): return group(*choices) + '*' def maybe(*choices): return group(*choices) + '?' Whitespace = r'[ \f\t]*' Comment = r'#[^\r\n]*' Ignore = Whitespace + any(r'\\\r?\n' + Whitespace) + maybe(Comment) Name = r'[a-zA-Z_]\w*' Hexnumber = r'0[xX][\da-fA-F]+[lL]?' Octnumber = r'(0[oO][0-7]+)|(0[0-7]*)[lL]?' Binnumber = r'0[bB][01]+[lL]?' Decnumber = r'[1-9]\d*[lL]?' Intnumber = group(Hexnumber, Binnumber, Octnumber, Decnumber) Exponent = r'[eE][-+]?\d+' Pointfloat = group(r'\d+\.\d*', r'\.\d+') + maybe(Exponent) Expfloat = r'\d+' + Exponent Floatnumber = group(Pointfloat, Expfloat) Imagnumber = group(r'\d+[jJ]', Floatnumber + r'[jJ]') Number = group(Imagnumber, Floatnumber, Intnumber) # Tail end of ' string. Single = r"[^'\\]*(?:\\.[^'\\]*)*'" # Tail end of " string. Double = r'[^"\\]*(?:\\.[^"\\]*)*"' # Tail end of ''' string. Single3 = r"[^'\\]*(?:(?:\\.|'(?!''))[^'\\]*)*'''" # Tail end of """ string. Double3 = r'[^"\\]*(?:(?:\\.|"(?!""))[^"\\]*)*"""' Triple = group("[uUbB]?[rR]?'''", '[uUbB]?[rR]?"""') # Single-line ' or " string. String = group(r"[uUbB]?[rR]?'[^\n'\\]*(?:\\.[^\n'\\]*)*'", r'[uUbB]?[rR]?"[^\n"\\]*(?:\\.[^\n"\\]*)*"') # Because of leftmost-then-longest match semantics, be sure to put the # longest operators first (e.g., if = came before ==, == would get # recognized as two instances of =). Operator = group(r"\*\*=?", r">>=?", r"<<=?", r"<>", r"!=", r"//=?", r"[+\-*/%&|^=<>]=?", r"~") Bracket = '[][(){}]' Special = group(r'\r?\n', r'[:;.,`@]') Funny = group(Operator, Bracket, Special) PlainToken = group(Number, Funny, String, Name) Token = Ignore + PlainToken # First (or only) line of ' or " string. ContStr = group(r"[uUbB]?[rR]?'[^\n'\\]*(?:\\.[^\n'\\]*)*" + group("'", r'\\\r?\n'), r'[uUbB]?[rR]?"[^\n"\\]*(?:\\.[^\n"\\]*)*' + group('"', r'\\\r?\n')) PseudoExtras = group(r'\\\r?\n|\Z', Comment, Triple) PseudoToken = Whitespace + group(PseudoExtras, Number, Funny, ContStr, Name) tokenprog, pseudoprog, single3prog, double3prog = map( re.compile, (Token, PseudoToken, Single3, Double3)) endprogs = {"'": re.compile(Single), '"': re.compile(Double), "'''": single3prog, '"""': double3prog, "r'''": single3prog, 'r"""': double3prog, "u'''": single3prog, 'u"""': double3prog, "ur'''": single3prog, 'ur"""': double3prog, "R'''": single3prog, 'R"""': double3prog, "U'''": single3prog, 'U"""': double3prog, "uR'''": single3prog, 'uR"""': double3prog, "Ur'''": single3prog, 'Ur"""': double3prog, "UR'''": single3prog, 'UR"""': double3prog, "b'''": single3prog, 'b"""': double3prog, "br'''": single3prog, 'br"""': double3prog, "B'''": single3prog, 'B"""': double3prog, "bR'''": single3prog, 'bR"""': double3prog, "Br'''": single3prog, 'Br"""': double3prog, "BR'''": single3prog, 'BR"""': double3prog, 'r': None, 'R': None, 'u': None, 'U': None, 'b': None, 'B': None} triple_quoted = {} for t in ("'''", '"""', "r'''", 'r"""', "R'''", 'R"""', "u'''", 'u"""', "U'''", 'U"""', "ur'''", 'ur"""', "Ur'''", 'Ur"""', "uR'''", 'uR"""', "UR'''", 'UR"""', "b'''", 'b"""', "B'''", 'B"""', "br'''", 'br"""', "Br'''", 'Br"""', "bR'''", 'bR"""', "BR'''", 'BR"""'): triple_quoted[t] = t single_quoted = {} for t in ("'", '"', "r'", 'r"', "R'", 'R"', "u'", 'u"', "U'", 'U"', "ur'", 'ur"', "Ur'", 'Ur"', "uR'", 'uR"', "UR'", 'UR"', "b'", 'b"', "B'", 'B"', "br'", 'br"', "Br'", 'Br"', "bR'", 'bR"', "BR'", 'BR"' ): single_quoted[t] = t tabsize = 8 class TokenError(Exception): pass class StopTokenizing(Exception): pass def printtoken(type, token, srow_scol, erow_ecol, line): # for testing srow, scol = srow_scol erow, ecol = erow_ecol print("%d,%d-%d,%d:\t%s\t%s" % \ (srow, scol, erow, ecol, tok_name[type], repr(token))) def tokenize(readline, tokeneater=printtoken): """ The tokenize() function accepts two parameters: one representing the input stream, and one providing an output mechanism for tokenize(). The first parameter, readline, must be a callable object which provides the same interface as the readline() method of built-in file objects. Each call to the function should return one line of input as a string. The second parameter, tokeneater, must also be a callable object. It is called once for each token, with five arguments, corresponding to the tuples generated by generate_tokens(). """ try: tokenize_loop(readline, tokeneater) except StopTokenizing: pass # backwards compatible interface def tokenize_loop(readline, tokeneater): for token_info in generate_tokens(readline): tokeneater(*token_info) class Untokenizer: def __init__(self): self.tokens = [] self.prev_row = 1 self.prev_col = 0 def add_whitespace(self, start): row, col = start if row < self.prev_row or row == self.prev_row and col < self.prev_col: raise ValueError("start ({},{}) precedes previous end ({},{})" .format(row, col, self.prev_row, self.prev_col)) row_offset = row - self.prev_row if row_offset: self.tokens.append("\\\n" * row_offset) self.prev_col = 0 col_offset = col - self.prev_col if col_offset: self.tokens.append(" " * col_offset) def untokenize(self, iterable): it = iter(iterable) indents = [] startline = False for t in it: if len(t) == 2: self.compat(t, it) break tok_type, token, start, end, line = t if tok_type == ENDMARKER: break if tok_type == INDENT: indents.append(token) continue elif tok_type == DEDENT: indents.pop() self.prev_row, self.prev_col = end continue elif tok_type in (NEWLINE, NL): startline = True elif startline and indents: indent = indents[-1] if start[1] >= len(indent): self.tokens.append(indent) self.prev_col = len(indent) startline = False self.add_whitespace(start) self.tokens.append(token) self.prev_row, self.prev_col = end if tok_type in (NEWLINE, NL): self.prev_row += 1 self.prev_col = 0 return "".join(self.tokens) def compat(self, token, iterable): indents = [] toks_append = self.tokens.append startline = token[0] in (NEWLINE, NL) prevstring = False for tok in chain([token], iterable): toknum, tokval = tok[:2] if toknum in (NAME, NUMBER): tokval += ' ' # Insert a space between two consecutive strings if toknum == STRING: if prevstring: tokval = ' ' + tokval prevstring = True else: prevstring = False if toknum == INDENT: indents.append(tokval) continue elif toknum == DEDENT: indents.pop() continue elif toknum in (NEWLINE, NL): startline = True elif startline and indents: toks_append(indents[-1]) startline = False toks_append(tokval) def untokenize(iterable): """Transform tokens back into Python source code. Each element returned by the iterable must be a token sequence with at least two elements, a token number and token value. If only two tokens are passed, the resulting output is poor. Round-trip invariant for full input: Untokenized source will match input source exactly Round-trip invariant for limited intput: # Output text will tokenize the back to the input t1 = [tok[:2] for tok in generate_tokens(f.readline)] newcode = untokenize(t1) readline = iter(newcode.splitlines(1)).next t2 = [tok[:2] for tok in generate_tokens(readline)] assert t1 == t2 """ ut = Untokenizer() return ut.untokenize(iterable) def generate_tokens(readline): """ The generate_tokens() generator requires one argument, readline, which must be a callable object which provides the same interface as the readline() method of built-in file objects. Each call to the function should return one line of input as a string. Alternately, readline can be a callable function terminating with StopIteration: readline = open(myfile).next # Example of alternate readline The generator produces 5-tuples with these members: the token type; the token string; a 2-tuple (srow, scol) of ints specifying the row and column where the token begins in the source; a 2-tuple (erow, ecol) of ints specifying the row and column where the token ends in the source; and the line on which the token was found. The line passed is the logical line; continuation lines are included. """ lnum = parenlev = continued = 0 namechars, numchars = string.ascii_letters + '_', '0123456789' contstr, needcont = '', 0 contline = None indents = [0] while 1: # loop over lines in stream try: line = readline() except StopIteration: line = '' lnum += 1 pos, max = 0, len(line) if contstr: # continued string if not line: raise TokenError("EOF in multi-line string", strstart) endmatch = endprog.match(line) if endmatch: pos = end = endmatch.end(0) yield (STRING, contstr + line[:end], strstart, (lnum, end), contline + line) contstr, needcont = '', 0 contline = None elif needcont and line[-2:] != '\\\n' and line[-3:] != '\\\r\n': yield (ERRORTOKEN, contstr + line, strstart, (lnum, len(line)), contline) contstr = '' contline = None continue else: contstr = contstr + line contline = contline + line continue elif parenlev == 0 and not continued: # new statement if not line: break column = 0 while pos < max: # measure leading whitespace if line[pos] == ' ': column += 1 elif line[pos] == '\t': column = (column//tabsize + 1)*tabsize elif line[pos] == '\f': column = 0 else: break pos += 1 if pos == max: break if line[pos] in '#\r\n': # skip comments or blank lines if line[pos] == '#': comment_token = line[pos:].rstrip('\r\n') nl_pos = pos + len(comment_token) yield (COMMENT, comment_token, (lnum, pos), (lnum, pos + len(comment_token)), line) yield (NL, line[nl_pos:], (lnum, nl_pos), (lnum, len(line)), line) else: yield ((NL, COMMENT)[line[pos] == '#'], line[pos:], (lnum, pos), (lnum, len(line)), line) continue if column > indents[-1]: # count indents or dedents indents.append(column) yield (INDENT, line[:pos], (lnum, 0), (lnum, pos), line) while column < indents[-1]: if column not in indents: raise IndentationError( "unindent does not match any outer indentation level", ("", lnum, pos, line)) indents = indents[:-1] yield (DEDENT, '', (lnum, pos), (lnum, pos), line) else: # continued statement if not line: raise TokenError("EOF in multi-line statement", (lnum, 0)) continued = 0 while pos < max: pseudomatch = pseudoprog.match(line, pos) if pseudomatch: # scan for tokens start, end = pseudomatch.span(1) spos, epos, pos = (lnum, start), (lnum, end), end if start == end: continue token, initial = line[start:end], line[start] if initial in numchars or \ (initial == '.' and token != '.'): # ordinary number yield (NUMBER, token, spos, epos, line) elif initial in '\r\n': if parenlev > 0: n = NL else: n = NEWLINE yield (n, token, spos, epos, line) elif initial == '#': assert not token.endswith("\n") yield (COMMENT, token, spos, epos, line) elif token in triple_quoted: endprog = endprogs[token] endmatch = endprog.match(line, pos) if endmatch: # all on one line pos = endmatch.end(0) token = line[start:pos] yield (STRING, token, spos, (lnum, pos), line) else: strstart = (lnum, start) # multiple lines contstr = line[start:] contline = line break elif initial in single_quoted or \ token[:2] in single_quoted or \ token[:3] in single_quoted: if token[-1] == '\n': # continued string strstart = (lnum, start) endprog = (endprogs[initial] or endprogs[token[1]] or endprogs[token[2]]) contstr, needcont = line[start:], 1 contline = line break else: # ordinary string yield (STRING, token, spos, epos, line) elif initial in namechars: # ordinary name yield (NAME, token, spos, epos, line) elif initial == '\\': # continued stmt continued = 1 else: if initial in '([{': parenlev += 1 elif initial in ')]}': parenlev -= 1 yield (OP, token, spos, epos, line) else: yield (ERRORTOKEN, line[pos], (lnum, pos), (lnum, pos+1), line) pos += 1 for indent in indents[1:]: # pop remaining indent levels yield (DEDENT, '', (lnum, 0), (lnum, 0), '') yield (ENDMARKER, '', (lnum, 0), (lnum, 0), '') if __name__ == '__main__': # testing import sys if len(sys.argv) > 1: tokenize(open(sys.argv[1]).readline) else: tokenize(sys.stdin.readline) mitogen-0.3.9/mitogen/core.py000066400000000000000000004472531465666473100161720ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # !mitogen: minify_safe """ This module implements most package functionality, but remains separate from non-essential code in order to reduce its size, since it is also serves as the bootstrap implementation sent to every new slave context. """ import sys try: import _frozen_importlib_external except ImportError: pass else: class MonkeyPatchedPathFinder(_frozen_importlib_external.PathFinder): """ Meta path finder for sys.path and package __path__ attributes. Patched for https://github.com/python/cpython/issues/115911. """ @classmethod def _path_importer_cache(cls, path): if path == '': try: path = _frozen_importlib_external._os.getcwd() except (FileNotFoundError, PermissionError): return None return super()._path_importer_cache(path) if sys.version_info[:2] <= (3, 12): for i, mpf in enumerate(sys.meta_path): if mpf is _frozen_importlib_external.PathFinder: sys.meta_path[i] = MonkeyPatchedPathFinder del i, mpf import binascii import collections import encodings.latin_1 import encodings.utf_8 import errno import fcntl import itertools import linecache import logging import os import pickle as py_pickle import pstats import signal import socket import struct import syslog import threading import time import traceback import types import warnings import weakref import zlib try: # Python >= 3.4, PEP 451 ModuleSpec API import importlib.machinery import importlib.util except ImportError: # Python < 3.4, PEP 302 Import Hooks import imp # Absolute imports for <2.5. select = __import__('select') try: import cProfile except ImportError: cProfile = None try: import thread except ImportError: import threading as thread try: import cPickle as pickle except ImportError: import pickle try: from cStringIO import StringIO as BytesIO except ImportError: from io import BytesIO try: BaseException except NameError: BaseException = Exception try: ModuleNotFoundError except NameError: ModuleNotFoundError = ImportError # TODO: usage of 'import' after setting __name__, but before fixing up # sys.modules generates a warning. This happens when profiling = True. warnings.filterwarnings('ignore', "Parent module 'mitogen' not found while handling absolute import") LOG = logging.getLogger('mitogen') IOLOG = logging.getLogger('mitogen.io') IOLOG.setLevel(logging.INFO) # str.encode() may take import lock. Deadlock possible if broker calls # .encode() on behalf of thread currently waiting for module. LATIN1_CODEC = encodings.latin_1.Codec() _v = False _vv = False GET_MODULE = 100 CALL_FUNCTION = 101 FORWARD_LOG = 102 ADD_ROUTE = 103 DEL_ROUTE = 104 ALLOCATE_ID = 105 SHUTDOWN = 106 LOAD_MODULE = 107 FORWARD_MODULE = 108 DETACHING = 109 CALL_SERVICE = 110 STUB_CALL_SERVICE = 111 #: Special value used to signal disconnection or the inability to route a #: message, when it appears in the `reply_to` field. Usually causes #: :class:`mitogen.core.ChannelError` to be raised when it is received. #: #: It indicates the sender did not know how to process the message, or wishes #: no further messages to be delivered to it. It is used when: #: #: * a remote receiver is disconnected or explicitly closed. #: * a related message could not be delivered due to no route existing for it. #: * a router is being torn down, as a sentinel value to notify #: :meth:`mitogen.core.Router.add_handler` callbacks to clean up. IS_DEAD = 999 try: BaseException except NameError: BaseException = Exception PY24 = sys.version_info < (2, 5) PY3 = sys.version_info > (3,) if PY3: b = str.encode BytesType = bytes UnicodeType = str FsPathTypes = (str,) BufferType = lambda buf, start: memoryview(buf)[start:] long = int else: b = str BytesType = str FsPathTypes = (str, unicode) BufferType = buffer UnicodeType = unicode AnyTextType = (BytesType, UnicodeType) try: next except NameError: next = lambda it: it.next() # #550: prehistoric WSL did not advertise itself in uname output. try: fp = open('/proc/sys/kernel/osrelease') IS_WSL = 'Microsoft' in fp.read() fp.close() except IOError: IS_WSL = False #: Default size for calls to :meth:`Side.read` or :meth:`Side.write`, and the #: size of buffers configured by :func:`mitogen.parent.create_socketpair`. This #: value has many performance implications, 128KiB seems to be a sweet spot. #: #: * When set low, large messages cause many :class:`Broker` IO loop #: iterations, burning CPU and reducing throughput. #: * When set high, excessive RAM is reserved by the OS for socket buffers (2x #: per child), and an identically sized temporary userspace buffer is #: allocated on each read that requires zeroing, and over a particular size #: may require two system calls to allocate/deallocate. #: #: Care must be taken to ensure the underlying kernel object and receiving #: program support the desired size. For example, #: #: * Most UNIXes have TTYs with fixed 2KiB-4KiB buffers, making them unsuitable #: for efficient IO. #: * Different UNIXes have varying presets for pipes, which may not be #: configurable. On recent Linux the default pipe buffer size is 64KiB, but #: under memory pressure may be as low as 4KiB for unprivileged processes. #: * When communication is via an intermediary process, its internal buffers #: effect the speed OS buffers will drain. For example OpenSSH uses 64KiB #: reads. #: #: An ideal :class:`Message` has a size that is a multiple of #: :data:`CHUNK_SIZE` inclusive of headers, to avoid wasting IO loop iterations #: writing small trailer chunks. CHUNK_SIZE = 131072 _tls = threading.local() if __name__ == 'mitogen.core': # When loaded using import mechanism, ExternalContext.main() will not have # a chance to set the synthetic mitogen global, so just import it here. import mitogen else: # When loaded as __main__, ensure classes and functions gain a __module__ # attribute consistent with the host process, so that pickling succeeds. __name__ = 'mitogen.core' class Error(Exception): """ Base for all exceptions raised by Mitogen. :param str fmt: Exception text, or format string if `args` is non-empty. :param tuple args: Format string arguments. """ def __init__(self, fmt=None, *args): if args: fmt %= args if fmt and not isinstance(fmt, UnicodeType): fmt = fmt.decode('utf-8') Exception.__init__(self, fmt) class LatchError(Error): """ Raised when an attempt is made to use a :class:`mitogen.core.Latch` that has been marked closed. """ pass class Blob(BytesType): """ A serializable bytes subclass whose content is summarized in repr() output, making it suitable for logging binary data. """ def __repr__(self): return '[blob: %d bytes]' % len(self) def __reduce__(self): return (Blob, (BytesType(self),)) class Secret(UnicodeType): """ A serializable unicode subclass whose content is masked in repr() output, making it suitable for logging passwords. """ def __repr__(self): return '[secret]' if not PY3: # TODO: what is this needed for in 2.x? def __str__(self): return UnicodeType(self) def __reduce__(self): return (Secret, (UnicodeType(self),)) class Kwargs(dict): """ A serializable dict subclass that indicates its keys should be coerced to Unicode on Python 3 and bytes on Python<2.6. Python 2 produces keyword argument dicts whose keys are bytes, requiring a helper to ensure compatibility with Python 3 where Unicode is required, whereas Python 3 produces keyword argument dicts whose keys are Unicode, requiring a helper for Python 2.4/2.5, where bytes are required. """ if PY3: def __init__(self, dct): for k, v in dct.items(): if type(k) is bytes: self[k.decode()] = v else: self[k] = v elif sys.version_info < (2, 6, 5): def __init__(self, dct): for k, v in dct.iteritems(): if type(k) is unicode: k, _ = encodings.utf_8.encode(k) self[k] = v def __repr__(self): return 'Kwargs(%s)' % (dict.__repr__(self),) def __reduce__(self): return (Kwargs, (dict(self),)) class CallError(Error): """ Serializable :class:`Error` subclass raised when :meth:`Context.call() ` fails. A copy of the traceback from the external context is appended to the exception message. """ def __init__(self, fmt=None, *args): if not isinstance(fmt, BaseException): Error.__init__(self, fmt, *args) else: e = fmt cls = e.__class__ fmt = '%s.%s: %s' % (cls.__module__, cls.__name__, e) tb = sys.exc_info()[2] if tb: fmt += '\n' fmt += ''.join(traceback.format_tb(tb)) Error.__init__(self, fmt) def __reduce__(self): return (_unpickle_call_error, (self.args[0],)) def _unpickle_call_error(s): if not (type(s) is UnicodeType and len(s) < 10000): raise TypeError('cannot unpickle CallError: bad input') return CallError(s) class ChannelError(Error): """ Raised when a channel dies or has been closed. """ remote_msg = 'Channel closed by remote end.' local_msg = 'Channel closed by local end.' class StreamError(Error): """ Raised when a stream cannot be established. """ pass class TimeoutError(Error): """ Raised when a timeout occurs on a stream. """ pass def to_text(o): """ Coerce `o` to Unicode by decoding it from UTF-8 if it is an instance of :class:`bytes`, otherwise pass it to the :class:`str` constructor. The returned object is always a plain :class:`str`, any subclass is removed. """ if isinstance(o, BytesType): return o.decode('utf-8') return UnicodeType(o) # Documented in api.rst to work around Sphinx limitation. now = getattr(time, 'monotonic', time.time) # Python 2.4 try: any except NameError: def any(it): for elem in it: if elem: return True def _partition(s, sep, find): """ (str|unicode).(partition|rpartition) for Python 2.4/2.5. """ idx = find(sep) if idx != -1: left = s[0:idx] return left, sep, s[len(left)+len(sep):] def threading__current_thread(): try: return threading.current_thread() # Added in Python 2.6+ except AttributeError: return threading.currentThread() # Deprecated in Python 3.10+ def threading__thread_name(thread): try: return thread.name # Added in Python 2.6+ except AttributeError: return thread.getName() # Deprecated in Python 3.10+ if hasattr(UnicodeType, 'rpartition'): str_partition = UnicodeType.partition str_rpartition = UnicodeType.rpartition bytes_partition = BytesType.partition else: def str_partition(s, sep): return _partition(s, sep, s.find) or (s, u'', u'') def str_rpartition(s, sep): return _partition(s, sep, s.rfind) or (u'', u'', s) def bytes_partition(s, sep): return _partition(s, sep, s.find) or (s, '', '') def _has_parent_authority(context_id): return ( (context_id == mitogen.context_id) or (context_id in mitogen.parent_ids) ) def has_parent_authority(msg, _stream=None): """ Policy function for use with :class:`Receiver` and :meth:`Router.add_handler` that requires incoming messages to originate from a parent context, or on a :class:`Stream` whose :attr:`auth_id ` has been set to that of a parent context or the current context. """ return _has_parent_authority(msg.auth_id) def _signals(obj, signal): return ( obj.__dict__ .setdefault('_signals', {}) .setdefault(signal, []) ) def listen(obj, name, func): """ Arrange for `func()` to be invoked when signal `name` is fired on `obj`. """ _signals(obj, name).append(func) def unlisten(obj, name, func): """ Remove `func()` from the list of functions invoked when signal `name` is fired by `obj`. :raises ValueError: `func()` was not on the list. """ _signals(obj, name).remove(func) def fire(obj, name, *args, **kwargs): """ Arrange for `func(*args, **kwargs)` to be invoked for every function registered for signal `name` on `obj`. """ for func in _signals(obj, name): func(*args, **kwargs) def takes_econtext(func): """ Decorator that marks a function or class method to automatically receive a kwarg named `econtext`, referencing the :class:`mitogen.core.ExternalContext` active in the context in which the function is being invoked in. The decorator is only meaningful when the function is invoked via :data:`CALL_FUNCTION `. When the function is invoked directly, `econtext` must still be passed to it explicitly. """ func.mitogen_takes_econtext = True return func def takes_router(func): """ Decorator that marks a function or class method to automatically receive a kwarg named `router`, referencing the :class:`mitogen.core.Router` active in the context in which the function is being invoked in. The decorator is only meaningful when the function is invoked via :data:`CALL_FUNCTION `. When the function is invoked directly, `router` must still be passed to it explicitly. """ func.mitogen_takes_router = True return func def is_blacklisted_import(importer, fullname): """ Return :data:`True` if `fullname` is part of a blacklisted package, or if any packages have been whitelisted and `fullname` is not part of one. NB: - If a package is on both lists, then it is treated as blacklisted. - If any package is whitelisted, then all non-whitelisted packages are treated as blacklisted. """ return ((not any(fullname.startswith(s) for s in importer.whitelist)) or (any(fullname.startswith(s) for s in importer.blacklist))) def set_cloexec(fd): """ Set the file descriptor `fd` to automatically close on :func:`os.execve`. This has no effect on file descriptors inherited across :func:`os.fork`, they must be explicitly closed through some other means, such as :func:`mitogen.fork.on_fork`. """ flags = fcntl.fcntl(fd, fcntl.F_GETFD) assert fd > 2, 'fd %r <= 2' % (fd,) fcntl.fcntl(fd, fcntl.F_SETFD, flags | fcntl.FD_CLOEXEC) def set_nonblock(fd): """ Set the file descriptor `fd` to non-blocking mode. For most underlying file types, this causes :func:`os.read` or :func:`os.write` to raise :class:`OSError` with :data:`errno.EAGAIN` rather than block the thread when the underlying kernel buffer is exhausted. """ flags = fcntl.fcntl(fd, fcntl.F_GETFL) fcntl.fcntl(fd, fcntl.F_SETFL, flags | os.O_NONBLOCK) def set_block(fd): """ Inverse of :func:`set_nonblock`, i.e. cause `fd` to block the thread when the underlying kernel buffer is exhausted. """ flags = fcntl.fcntl(fd, fcntl.F_GETFL) fcntl.fcntl(fd, fcntl.F_SETFL, flags & ~os.O_NONBLOCK) def io_op(func, *args): """ Wrap `func(*args)` that may raise :class:`select.error`, :class:`IOError`, or :class:`OSError`, trapping UNIX error codes relating to disconnection and retry events in various subsystems: * When a signal is delivered to the process on Python 2, system call retry is signalled through :data:`errno.EINTR`. The invocation is automatically restarted. * When performing IO against a TTY, disconnection of the remote end is signalled by :data:`errno.EIO`. * When performing IO against a socket, disconnection of the remote end is signalled by :data:`errno.ECONNRESET`. * When performing IO against a pipe, disconnection of the remote end is signalled by :data:`errno.EPIPE`. :returns: Tuple of `(return_value, disconnect_reason)`, where `return_value` is the return value of `func(*args)`, and `disconnected` is an exception instance when disconnection was detected, otherwise :data:`None`. """ while True: try: return func(*args), None except (select.error, OSError, IOError): e = sys.exc_info()[1] _vv and IOLOG.debug('io_op(%r) -> OSError: %s', func, e) if e.args[0] == errno.EINTR: continue if e.args[0] in (errno.EIO, errno.ECONNRESET, errno.EPIPE): return None, e raise class PidfulStreamHandler(logging.StreamHandler): """ A :class:`logging.StreamHandler` subclass used when :meth:`Router.enable_debug() ` has been called, or the `debug` parameter was specified during context construction. Verifies the process ID has not changed on each call to :meth:`emit`, reopening the associated log file when a change is detected. This ensures logging to the per-process output files happens correctly even when uncooperative third party components call :func:`os.fork`. """ #: PID that last opened the log file. open_pid = None #: Output path template. template = '/tmp/mitogen.%s.%s.log' def _reopen(self): self.acquire() try: if self.open_pid == os.getpid(): return ts = time.strftime('%Y%m%d_%H%M%S') path = self.template % (os.getpid(), ts) self.stream = open(path, 'w', 1) set_cloexec(self.stream.fileno()) self.stream.write('Parent PID: %s\n' % (os.getppid(),)) self.stream.write('Created by:\n\n%s\n' % ( ''.join(traceback.format_stack()), )) self.open_pid = os.getpid() finally: self.release() def emit(self, record): if self.open_pid != os.getpid(): self._reopen() logging.StreamHandler.emit(self, record) def enable_debug_logging(): global _v, _vv _v = True _vv = True root = logging.getLogger() root.setLevel(logging.DEBUG) IOLOG.setLevel(logging.DEBUG) handler = PidfulStreamHandler() handler.formatter = logging.Formatter( '%(asctime)s %(levelname).1s %(name)s: %(message)s', '%H:%M:%S' ) root.handlers.insert(0, handler) _profile_hook = lambda name, func, *args: func(*args) _profile_fmt = os.environ.get( 'MITOGEN_PROFILE_FMT', '/tmp/mitogen.stats.%(pid)s.%(identity)s.%(now)s.%(ext)s', ) def _profile_hook(name, func, *args): """ Call `func(*args)` and return its result. This function is replaced by :func:`_real_profile_hook` when :func:`enable_profiling` is called. This interface is obsolete and will be replaced by a signals-based integration later on. """ return func(*args) def _real_profile_hook(name, func, *args): profiler = cProfile.Profile() profiler.enable() try: return func(*args) finally: path = _profile_fmt % { 'now': int(1e6 * now()), 'identity': name, 'pid': os.getpid(), 'ext': '%s' } profiler.dump_stats(path % ('pstats',)) profiler.create_stats() fp = open(path % ('log',), 'w') try: stats = pstats.Stats(profiler, stream=fp) stats.sort_stats('cumulative') stats.print_stats() finally: fp.close() def enable_profiling(econtext=None): global _profile_hook _profile_hook = _real_profile_hook def import_module(modname): """ Import `module` and return the attribute named `attr`. """ return __import__(modname, None, None, ['']) def pipe(): """ Create a UNIX pipe pair using :func:`os.pipe`, wrapping the returned descriptors in Python file objects in order to manage their lifetime and ensure they are closed when their last reference is discarded and they have not been closed explicitly. """ rfd, wfd = os.pipe() return ( os.fdopen(rfd, 'rb', 0), os.fdopen(wfd, 'wb', 0) ) def iter_split(buf, delim, func): """ Invoke `func(s)` for each `delim`-delimited chunk in the potentially large `buf`, avoiding intermediate lists and quadratic string operations. Return the trailing undelimited portion of `buf`, or any unprocessed portion of `buf` after `func(s)` returned :data:`False`. :returns: `(trailer, cont)`, where `cont` is :data:`False` if the last call to `func(s)` returned :data:`False`. """ dlen = len(delim) start = 0 cont = True while cont: nl = buf.find(delim, start) if nl == -1: break cont = not func(buf[start:nl]) is False start = nl + dlen return buf[start:], cont class Py24Pickler(py_pickle.Pickler): """ Exceptions were classic classes until Python 2.5. Sadly for 2.4, cPickle offers little control over how a classic instance is pickled. Therefore 2.4 uses a pure-Python pickler, so CallError can be made to look as it does on newer Pythons. This mess will go away once proper serialization exists. """ @classmethod def dumps(cls, obj, protocol): bio = BytesIO() self = cls(bio, protocol=protocol) self.dump(obj) return bio.getvalue() def save_exc_inst(self, obj): if isinstance(obj, CallError): func, args = obj.__reduce__() self.save(func) self.save(args) self.write(py_pickle.REDUCE) else: py_pickle.Pickler.save_inst(self, obj) if PY24: dispatch = py_pickle.Pickler.dispatch.copy() dispatch[py_pickle.InstanceType] = save_exc_inst if PY3: # In 3.x Unpickler is a class exposing find_class as an overridable, but it # cannot be overridden without subclassing. class _Unpickler(pickle.Unpickler): def find_class(self, module, func): return self.find_global(module, func) pickle__dumps = pickle.dumps elif PY24: # On Python 2.4, we must use a pure-Python pickler. pickle__dumps = Py24Pickler.dumps _Unpickler = pickle.Unpickler else: pickle__dumps = pickle.dumps # In 2.x Unpickler is a function exposing a writeable find_global # attribute. _Unpickler = pickle.Unpickler class Message(object): """ Messages are the fundamental unit of communication, comprising fields from the :ref:`stream-protocol` header, an optional reference to the receiving :class:`mitogen.core.Router` for ingress messages, and helper methods for deserialization and generating replies. """ #: Integer target context ID. :class:`Router` delivers messages locally #: when their :attr:`dst_id` matches :data:`mitogen.context_id`, otherwise #: they are routed up or downstream. dst_id = None #: Integer source context ID. Used as the target of replies if any are #: generated. src_id = None #: Context ID under whose authority the message is acting. See #: :ref:`source-verification`. auth_id = None #: Integer target handle in the destination context. This is one of the #: :ref:`standard-handles`, or a dynamically generated handle used to #: receive a one-time reply, such as the return value of a function call. handle = None #: Integer target handle to direct any reply to this message. Used to #: receive a one-time reply, such as the return value of a function call. #: :data:`IS_DEAD` has a special meaning when it appears in this field. reply_to = None #: Raw message data bytes. data = b('') _unpickled = object() #: The :class:`Router` responsible for routing the message. This is #: :data:`None` for locally originated messages. router = None #: The :class:`Receiver` over which the message was last received. Part of #: the :class:`mitogen.select.Select` interface. Defaults to :data:`None`. receiver = None HEADER_FMT = '>hLLLLLL' HEADER_LEN = struct.calcsize(HEADER_FMT) HEADER_MAGIC = 0x4d49 # 'MI' def __init__(self, **kwargs): """ Construct a message from from the supplied `kwargs`. :attr:`src_id` and :attr:`auth_id` are always set to :data:`mitogen.context_id`. """ self.src_id = mitogen.context_id self.auth_id = mitogen.context_id vars(self).update(kwargs) assert isinstance(self.data, BytesType), 'Message data is not Bytes' def pack(self): return ( struct.pack(self.HEADER_FMT, self.HEADER_MAGIC, self.dst_id, self.src_id, self.auth_id, self.handle, self.reply_to or 0, len(self.data)) + self.data ) def _unpickle_context(self, context_id, name): return _unpickle_context(context_id, name, router=self.router) def _unpickle_sender(self, context_id, dst_handle): return _unpickle_sender(self.router, context_id, dst_handle) def _unpickle_bytes(self, s, encoding): s, n = LATIN1_CODEC.encode(s) return s def _find_global(self, module, func): """ Return the class implementing `module_name.class_name` or raise `StreamError` if the module is not whitelisted. """ if module == __name__: if func == '_unpickle_call_error' or func == 'CallError': return _unpickle_call_error elif func == '_unpickle_sender': return self._unpickle_sender elif func == '_unpickle_context': return self._unpickle_context elif func == 'Blob': return Blob elif func == 'Secret': return Secret elif func == 'Kwargs': return Kwargs elif module == '_codecs' and func == 'encode': return self._unpickle_bytes elif module == '__builtin__' and func == 'bytes': return BytesType raise StreamError('cannot unpickle %r/%r', module, func) @property def is_dead(self): """ :data:`True` if :attr:`reply_to` is set to the magic value :data:`IS_DEAD`, indicating the sender considers the channel dead. Dead messages can be raised in a variety of circumstances, see :data:`IS_DEAD` for more information. """ return self.reply_to == IS_DEAD @classmethod def dead(cls, reason=None, **kwargs): """ Syntax helper to construct a dead message. """ kwargs['data'], _ = encodings.utf_8.encode(reason or u'') return cls(reply_to=IS_DEAD, **kwargs) @classmethod def pickled(cls, obj, **kwargs): """ Construct a pickled message, setting :attr:`data` to the serialization of `obj`, and setting remaining fields using `kwargs`. :returns: The new message. """ self = cls(**kwargs) try: self.data = pickle__dumps(obj, protocol=2) except pickle.PicklingError: e = sys.exc_info()[1] self.data = pickle__dumps(CallError(e), protocol=2) return self def reply(self, msg, router=None, **kwargs): """ Compose a reply to this message and send it using :attr:`router`, or `router` is :attr:`router` is :data:`None`. :param obj: Either a :class:`Message`, or an object to be serialized in order to construct a new message. :param router: Optional router to use if :attr:`router` is :data:`None`. :param kwargs: Optional keyword parameters overriding message fields in the reply. """ if not isinstance(msg, Message): msg = Message.pickled(msg) msg.dst_id = self.src_id msg.handle = self.reply_to vars(msg).update(kwargs) if msg.handle: (self.router or router).route(msg) else: LOG.debug('dropping reply to message with no return address: %r', msg) if PY3: UNPICKLER_KWARGS = {'encoding': 'bytes'} else: UNPICKLER_KWARGS = {} def _throw_dead(self): if len(self.data): raise ChannelError(self.data.decode('utf-8', 'replace')) elif self.src_id == mitogen.context_id: raise ChannelError(ChannelError.local_msg) else: raise ChannelError(ChannelError.remote_msg) def unpickle(self, throw=True, throw_dead=True): """ Unpickle :attr:`data`, optionally raising any exceptions present. :param bool throw_dead: If :data:`True`, raise exceptions, otherwise it is the caller's responsibility. :raises CallError: The serialized data contained CallError exception. :raises ChannelError: The `is_dead` field was set. """ _vv and IOLOG.debug('%r.unpickle()', self) if throw_dead and self.is_dead: self._throw_dead() obj = self._unpickled if obj is Message._unpickled: fp = BytesIO(self.data) unpickler = _Unpickler(fp, **self.UNPICKLER_KWARGS) unpickler.find_global = self._find_global try: # Must occur off the broker thread. try: obj = unpickler.load() except: LOG.error('raw pickle was: %r', self.data) raise self._unpickled = obj except (TypeError, ValueError): e = sys.exc_info()[1] raise StreamError('invalid message: %s', e) if throw: if isinstance(obj, CallError): raise obj return obj def __repr__(self): return 'Message(%r, %r, %r, %r, %r, %r..%d)' % ( self.dst_id, self.src_id, self.auth_id, self.handle, self.reply_to, (self.data or '')[:50], len(self.data) ) class Sender(object): """ Senders are used to send pickled messages to a handle in another context, it is the inverse of :class:`mitogen.core.Receiver`. Senders may be serialized, making them convenient to wire up data flows. See :meth:`mitogen.core.Receiver.to_sender` for more information. :param mitogen.core.Context context: Context to send messages to. :param int dst_handle: Destination handle to send messages to. """ def __init__(self, context, dst_handle): self.context = context self.dst_handle = dst_handle def send(self, data): """ Send `data` to the remote end. """ _vv and IOLOG.debug('%r.send(%r..)', self, repr(data)[:100]) self.context.send(Message.pickled(data, handle=self.dst_handle)) explicit_close_msg = 'Sender was explicitly closed' def close(self): """ Send a dead message to the remote, causing :meth:`ChannelError` to be raised in any waiting thread. """ _vv and IOLOG.debug('%r.close()', self) self.context.send( Message.dead( reason=self.explicit_close_msg, handle=self.dst_handle ) ) def __repr__(self): return 'Sender(%r, %r)' % (self.context, self.dst_handle) def __reduce__(self): return _unpickle_sender, (self.context.context_id, self.dst_handle) def _unpickle_sender(router, context_id, dst_handle): if not (isinstance(router, Router) and isinstance(context_id, (int, long)) and context_id >= 0 and isinstance(dst_handle, (int, long)) and dst_handle > 0): raise TypeError('cannot unpickle Sender: bad input or missing router') return Sender(Context(router, context_id), dst_handle) class Receiver(object): """ Receivers maintain a thread-safe queue of messages sent to a handle of this context from another context. :param mitogen.core.Router router: Router to register the handler on. :param int handle: If not :data:`None`, an explicit handle to register, otherwise an unused handle is chosen. :param bool persist: If :data:`False`, unregister the handler after one message is received. Single-message receivers are intended for RPC-like transactions, such as in the case of :meth:`mitogen.parent.Context.call_async`. :param mitogen.core.Context respondent: Context this receiver is receiving from. If not :data:`None`, arranges for the receiver to receive a dead message if messages can no longer be routed to the context due to disconnection, and ignores messages that did not originate from the respondent context. """ #: If not :data:`None`, a function invoked as `notify(receiver)` after a #: message has been received. The function is invoked on :class:`Broker` #: thread, therefore it must not block. Used by #: :class:`mitogen.select.Select` to efficiently implement waiting on #: multiple event sources. notify = None raise_channelerror = True def __init__(self, router, handle=None, persist=True, respondent=None, policy=None, overwrite=False): self.router = router #: The handle. self.handle = handle # Avoid __repr__ crash in add_handler() self._latch = Latch() # Must exist prior to .add_handler() self.handle = router.add_handler( fn=self._on_receive, handle=handle, policy=policy, persist=persist, respondent=respondent, overwrite=overwrite, ) def __repr__(self): return 'Receiver(%r, %r)' % (self.router, self.handle) def __enter__(self): return self def __exit__(self, _1, _2, _3): self.close() def to_sender(self): """ Return a :class:`Sender` configured to deliver messages to this receiver. As senders are serializable, this makes it convenient to pass `(context_id, handle)` pairs around:: def deliver_monthly_report(sender): for line in open('monthly_report.txt'): sender.send(line) sender.close() @mitogen.main() def main(router): remote = router.ssh(hostname='mainframe') recv = mitogen.core.Receiver(router) remote.call(deliver_monthly_report, recv.to_sender()) for msg in recv: print(msg) """ return Sender(self.router.myself(), self.handle) def _on_receive(self, msg): """ Callback registered for the handle with :class:`Router`; appends data to the internal queue. """ _vv and IOLOG.debug('%r._on_receive(%r)', self, msg) self._latch.put(msg) if self.notify: self.notify(self) closed_msg = 'the Receiver has been closed' def close(self): """ Unregister the receiver's handle from its associated router, and cause :class:`ChannelError` to be raised in any thread waiting in :meth:`get` on this receiver. """ if self.handle: self.router.del_handler(self.handle) self.handle = None self._latch.close() def size(self): """ Return the number of items currently buffered. As with :class:`Queue.Queue`, `0` may be returned even though a subsequent call to :meth:`get` will succeed, since a message may be posted at any moment between :meth:`size` and :meth:`get`. As with :class:`Queue.Queue`, `>0` may be returned even though a subsequent call to :meth:`get` will block, since another waiting thread may be woken at any moment between :meth:`size` and :meth:`get`. :raises LatchError: The underlying latch has already been marked closed. """ return self._latch.size() def empty(self): """ Return `size() == 0`. .. deprecated:: 0.2.8 Use :meth:`size` instead. :raises LatchError: The latch has already been marked closed. """ return self._latch.empty() def get(self, timeout=None, block=True, throw_dead=True): """ Sleep waiting for a message to arrive on this receiver. :param float timeout: If not :data:`None`, specifies a timeout in seconds. :raises mitogen.core.ChannelError: The remote end indicated the channel should be closed, communication with it was lost, or :meth:`close` was called in the local process. :raises mitogen.core.TimeoutError: Timeout was reached. :returns: :class:`Message` that was received. """ _vv and IOLOG.debug('%r.get(timeout=%r, block=%r)', self, timeout, block) try: msg = self._latch.get(timeout=timeout, block=block) except LatchError: raise ChannelError(self.closed_msg) if msg.is_dead and throw_dead: msg._throw_dead() return msg def __iter__(self): """ Yield consecutive :class:`Message` instances delivered to this receiver until :class:`ChannelError` is raised. """ while True: try: msg = self.get() except ChannelError: return yield msg class Channel(Sender, Receiver): """ A channel inherits from :class:`mitogen.core.Sender` and `mitogen.core.Receiver` to provide bidirectional functionality. .. deprecated:: 0.2.0 This class is incomplete and obsolete, it will be removed in Mitogen 0.3. Channels were an early attempt at syntax sugar. It is always easier to pass around unidirectional pairs of senders/receivers, even though the syntax is baroque: .. literalinclude:: ../examples/ping_pong.py Since all handles aren't known until after both ends are constructed, for both ends to communicate through a channel, it is necessary for one end to retrieve the handle allocated to the other and reconfigure its own channel to match. Currently this is a manual task. """ def __init__(self, router, context, dst_handle, handle=None): Sender.__init__(self, context, dst_handle) Receiver.__init__(self, router, handle) def close(self): Receiver.close(self) Sender.close(self) def __repr__(self): return 'Channel(%s, %s)' % ( Sender.__repr__(self), Receiver.__repr__(self) ) class Importer(object): """ Import protocol implementation that fetches modules from the parent process. :param context: Context to communicate via. """ # The Mitogen package is handled specially, since the child context must # construct it manually during startup. MITOGEN_PKG_CONTENT = [ 'buildah', 'compat', 'debug', 'doas', 'docker', 'kubectl', 'fakessh', 'fork', 'jail', 'lxc', 'lxd', 'master', 'minify', 'os_fork', 'parent', 'podman', 'select', 'service', 'setns', 'ssh', 'su', 'sudo', 'utils', ] ALWAYS_BLACKLIST = [ # 2.x generates needless imports for 'builtins', while 3.x does the # same for '__builtin__'. The correct one is built-in, the other always # a negative round-trip. 'builtins', '__builtin__', # On some Python releases (e.g. 3.8, 3.9) the subprocess module tries # to import of this Windows-only builtin module. 'msvcrt', # Python 2.x module that was renamed to _thread in 3.x. # This entry avoids a roundtrip on 2.x -> 3.x. 'thread', # org.python.core imported by copy, pickle, xml.sax; breaks Jython, but # very unlikely to trigger a bug report. 'org', ] if PY3: ALWAYS_BLACKLIST += ['cStringIO'] def __init__(self, router, context, core_src, whitelist=(), blacklist=()): self._log = logging.getLogger('mitogen.importer') self._context = context self._present = {'mitogen': self.MITOGEN_PKG_CONTENT} self._lock = threading.Lock() self.whitelist = list(whitelist) or [''] self.blacklist = list(blacklist) + self.ALWAYS_BLACKLIST # Preserve copies of the original server-supplied whitelist/blacklist # for later use by children. self.master_whitelist = self.whitelist[:] self.master_blacklist = self.blacklist[:] # Presence of an entry in this map indicates in-flight GET_MODULE. self._callbacks = {} self._cache = {} if core_src: self._update_linecache('x/mitogen/core.py', core_src) self._cache['mitogen.core'] = ( 'mitogen.core', None, 'x/mitogen/core.py', zlib.compress(core_src, 9), [], ) self._install_handler(router) def _update_linecache(self, path, data): """ The Python 2.4 linecache module, used to fetch source code for tracebacks and :func:`inspect.getsource`, does not support PEP-302, meaning it needs extra help to for Mitogen-loaded modules. Directly populate its cache if a loaded module belongs to the Mitogen package. """ if PY24 and 'mitogen' in path: linecache.cache[path] = ( len(data), 0.0, [line+'\n' for line in data.splitlines()], path, ) def _install_handler(self, router): router.add_handler( fn=self._on_load_module, handle=LOAD_MODULE, policy=has_parent_authority, ) def __repr__(self): return 'Importer' @staticmethod def _loader_from_module(module, default=None): """Return the loader for a module object.""" try: return module.__spec__.loader except AttributeError: pass try: return module.__loader__ except AttributeError: pass return default def builtin_find_module(self, fullname): # imp.find_module() will always succeed for __main__, because it is a # built-in module. That means it exists on a special linked list deep # within the bowels of the interpreter. We must special case it. if fullname == '__main__': raise ModuleNotFoundError() # For a module inside a package (e.g. pkg_a.mod_b) use the search path # of that package (e.g. ['/usr/lib/python3.11/site-packages/pkg_a']). parent, _, modname = str_rpartition(fullname, '.') if parent: path = sys.modules[parent].__path__ else: path = None # For a top-level module search builtin modules, frozen modules, # system specific locations (e.g. Windows registry, site-packages). # Otherwise use search path of the parent package. # Works for both stdlib modules & third-party modules. # If the search is unsuccessful then raises ImportError. fp, pathname, description = imp.find_module(modname, path) if fp: fp.close() def find_module(self, fullname, path=None): """ Return a loader (ourself) or None, for the module with fullname. Implements importlib.abc.MetaPathFinder.find_module(). Deprecrated in Python 3.4+, replaced by find_spec(). Raises ImportWarning in Python 3.10+. Removed in Python 3.12. fullname Fully qualified module name, e.g. "os.path". path __path__ of parent packge. None for a top level module. """ if hasattr(_tls, 'running'): return None _tls.running = True try: #_v and self._log.debug('Python requested %r', fullname) fullname = to_text(fullname) pkgname, _, suffix = str_rpartition(fullname, '.') pkg = sys.modules.get(pkgname) if pkgname and getattr(pkg, '__loader__', None) is not self: self._log.debug('%s is submodule of a locally loaded package', fullname) return None if pkgname and suffix not in self._present.get(pkgname, ()): self._log.debug('%s has no submodule %s', pkgname, suffix) return None # #114: explicitly whitelisted prefixes override any # system-installed package. if self.whitelist != ['']: if any(fullname.startswith(s) for s in self.whitelist): return self try: self.builtin_find_module(fullname) _vv and self._log.debug('%r is available locally', fullname) except ImportError: _vv and self._log.debug('we will try to load %r', fullname) return self finally: del _tls.running def find_spec(self, fullname, path, target=None): """ Return a `ModuleSpec` for module with `fullname` if we will load it. Otherwise return `None`, allowing other finders to try. fullname Fully qualified name of the module (e.g. foo.bar.baz) path Path entries to search. None for a top-level module. target Existing module to be reloaded (if any). Implements importlib.abc.MetaPathFinder.find_spec() Python 3.4+. """ # Presence of _tls.running indicates we've re-invoked importlib. # Abort early to prevent infinite recursion. See below. if hasattr(_tls, 'running'): return None log = self._log.getChild('find_spec') if fullname.endswith('.'): return None pkgname, _, modname = fullname.rpartition('.') if pkgname and modname not in self._present.get(pkgname, ()): log.debug('Skipping %s. Parent %s has no submodule %s', fullname, pkgname, modname) return None pkg = sys.modules.get(pkgname) pkg_loader = self._loader_from_module(pkg) if pkgname and pkg_loader is not self: log.debug('Skipping %s. Parent %s was loaded by %r', fullname, pkgname, pkg_loader) return None # #114: whitelisted prefixes override any system-installed package. if self.whitelist != ['']: if any(s and fullname.startswith(s) for s in self.whitelist): log.debug('Handling %s. It is whitelisted', fullname) return importlib.machinery.ModuleSpec(fullname, loader=self) if fullname == '__main__': log.debug('Handling %s. A special case', fullname) return importlib.machinery.ModuleSpec(fullname, loader=self) # Re-invoke the import machinery to allow other finders to try. # Set a guard, so we don't infinitely recurse. See top of this method. _tls.running = True try: spec = importlib.util._find_spec(fullname, path, target) finally: del _tls.running if spec: log.debug('Skipping %s. Available as %r', fullname, spec) return spec log.debug('Handling %s. Unavailable locally', fullname) return importlib.machinery.ModuleSpec(fullname, loader=self) blacklisted_msg = ( '%r is present in the Mitogen importer blacklist, therefore this ' 'context will not attempt to request it from the master, as the ' 'request will always be refused.' ) pkg_resources_msg = ( 'pkg_resources is prohibited from importing __main__, as it causes ' 'problems in applications whose main module is not designed to be ' 're-imported by children.' ) absent_msg = ( 'The Mitogen master process was unable to serve %r. It may be a ' 'native Python extension, or it may be missing entirely. Check the ' 'importer debug logs on the master for more information.' ) def _refuse_imports(self, fullname): if is_blacklisted_import(self, fullname): raise ModuleNotFoundError(self.blacklisted_msg % (fullname,)) f = sys._getframe(2) requestee = f.f_globals['__name__'] if fullname == '__main__' and requestee == 'pkg_resources': # Anything that imports pkg_resources will eventually cause # pkg_resources to try and scan __main__ for its __requires__ # attribute (pkg_resources/__init__.py::_build_master()). This # breaks any app that is not expecting its __main__ to suddenly be # sucked over a network and injected into a remote process, like # py.test. raise ModuleNotFoundError(self.pkg_resources_msg) if fullname == 'pbr': # It claims to use pkg_resources to read version information, which # would result in PEP-302 being used, but it actually does direct # filesystem access. So instead smodge the environment to override # any version that was defined. This will probably break something # later. os.environ['PBR_VERSION'] = '0.0.0' def _on_load_module(self, msg): if msg.is_dead: return tup = msg.unpickle() fullname = tup[0] _v and self._log.debug('received %s', fullname) self._lock.acquire() try: self._cache[fullname] = tup if tup[2] is not None and PY24: self._update_linecache( path='master:' + tup[2], data=zlib.decompress(tup[3]) ) callbacks = self._callbacks.pop(fullname, []) finally: self._lock.release() for callback in callbacks: callback() def _request_module(self, fullname, callback): self._lock.acquire() try: present = fullname in self._cache if not present: funcs = self._callbacks.get(fullname) if funcs is not None: _v and self._log.debug('existing request for %s in flight', fullname) funcs.append(callback) else: _v and self._log.debug('sending new %s request to parent', fullname) self._callbacks[fullname] = [callback] self._context.send( Message(data=b(fullname), handle=GET_MODULE) ) finally: self._lock.release() if present: callback() def create_module(self, spec): """ Return a module object for the given ModuleSpec. Implements PEP-451 importlib.abc.Loader API introduced in Python 3.4. Unlike Loader.load_module() this shouldn't populate sys.modules or set module attributes. Both are done by Python. """ self._log.debug('Creating module for %r', spec) # FIXME Should this be done in find_spec()? Can it? self._refuse_imports(spec.name) # FIXME "create_module() should properly handle the case where it is # called more than once for the same spec/module." -- PEP-451 event = threading.Event() self._request_module(spec.name, callback=event.set) event.wait() # 0:fullname 1:pkg_present 2:path 3:compressed 4:related _, pkg_present, path, _, _ = self._cache[spec.name] if path is None: raise ImportError(self.absent_msg % (spec.name)) spec.origin = self.get_filename(spec.name) if pkg_present is not None: # TODO Namespace packages spec.submodule_search_locations = [] self._present[spec.name] = pkg_present module = types.ModuleType(spec.name) # FIXME create_module() shouldn't initialise module attributes module.__file__ = spec.origin return module def exec_module(self, module): """ Execute the module to initialise it. Don't return anything. Implements PEP-451 importlib.abc.Loader API, introduced in Python 3.4. """ name = module.__spec__.name origin = module.__spec__.origin self._log.debug('Executing %s from %s', name, origin) source = self.get_source(name) try: # Compile the source into a code object. Don't add any __future__ # flags and don't inherit any from this module. # FIXME Should probably be exposed as get_code() code = compile(source, origin, 'exec', flags=0, dont_inherit=True) except SyntaxError: # FIXME Why is this LOG, rather than self._log? LOG.exception('while importing %r', name) raise exec(code, module.__dict__) def load_module(self, fullname): """ Return the loaded module specified by fullname. Implements importlib.abc.Loader.load_module(). Deprecated in Python 3.4+, replaced by create_module() & exec_module(). """ fullname = to_text(fullname) _v and self._log.debug('requesting %s', fullname) self._refuse_imports(fullname) event = threading.Event() self._request_module(fullname, event.set) event.wait() # 0:fullname 1:pkg_present 2:path 3:compressed 4:related _, pkg_present, path, _, _ = self._cache[fullname] if path is None: raise ModuleNotFoundError(self.absent_msg % (fullname,)) mod = sys.modules.setdefault(fullname, imp.new_module(fullname)) mod.__file__ = self.get_filename(fullname) mod.__loader__ = self if pkg_present is not None: # it's a package. mod.__path__ = [] mod.__package__ = fullname self._present[fullname] = pkg_present else: mod.__package__ = str_rpartition(fullname, '.')[0] or None if mod.__package__ and not PY3: # 2.x requires __package__ to be exactly a string. mod.__package__, _ = encodings.utf_8.encode(mod.__package__) source = self.get_source(fullname) try: code = compile(source, mod.__file__, 'exec', 0, 1) except SyntaxError: LOG.exception('while importing %r', fullname) raise if PY3: exec(code, vars(mod)) else: exec('exec code in vars(mod)') # #590: if a module replaces itself in sys.modules during import, below # is necessary. This matches PyImport_ExecCodeModuleEx() return sys.modules.get(fullname, mod) def get_filename(self, fullname): if fullname in self._cache: path = self._cache[fullname][2] if path is None: # If find_loader() returns self but a subsequent master RPC # reveals the module can't be loaded, and so load_module() # throws ImportError, on Python 3.x it is still possible for # the loader to be called to fetch metadata. raise ModuleNotFoundError(self.absent_msg % (fullname,)) return u'master:' + self._cache[fullname][2] def get_source(self, fullname): if fullname in self._cache: compressed = self._cache[fullname][3] if compressed is None: raise ModuleNotFoundError(self.absent_msg % (fullname,)) source = zlib.decompress(self._cache[fullname][3]) if PY3: return to_text(source) return source class LogHandler(logging.Handler): """ A :class:`logging.Handler` subclass that arranges for :data:`FORWARD_LOG` messages to be sent to a parent context in response to logging messages generated by the current context. This is installed by default in child contexts during bootstrap, so that :mod:`logging` events can be viewed and managed centrally in the master process. The handler is initially *corked* after construction, such that it buffers messages until :meth:`uncork` is called. This allows logging to be installed prior to communication with the target being available, and avoids any possible race where early log messages might be dropped. :param mitogen.core.Context context: The context to send log messages towards. At present this is always the master process. """ def __init__(self, context): logging.Handler.__init__(self) self.context = context self.local = threading.local() self._buffer = [] # Private synchronization is needed while corked, to ensure no # concurrent call to _send() exists during uncork(). self._buffer_lock = threading.Lock() def uncork(self): """ #305: during startup :class:`LogHandler` may be installed before it is possible to route messages, therefore messages are buffered until :meth:`uncork` is called by :class:`ExternalContext`. """ self._buffer_lock.acquire() try: self._send = self.context.send for msg in self._buffer: self._send(msg) self._buffer = None finally: self._buffer_lock.release() def _send(self, msg): self._buffer_lock.acquire() try: if self._buffer is None: # uncork() may run concurrent to _send() self._send(msg) else: self._buffer.append(msg) finally: self._buffer_lock.release() def emit(self, rec): """ Send a :data:`FORWARD_LOG` message towards the target context. """ if rec.name == 'mitogen.io' or \ getattr(self.local, 'in_emit', False): return self.local.in_emit = True try: msg = self.format(rec) encoded = '%s\x00%s\x00%s' % (rec.name, rec.levelno, msg) if isinstance(encoded, UnicodeType): # Logging package emits both :( encoded = encoded.encode('utf-8') self._send(Message(data=encoded, handle=FORWARD_LOG)) finally: self.local.in_emit = False class Stream(object): """ A :class:`Stream` is one readable and optionally one writeable file descriptor (represented by :class:`Side`) aggregated alongside an associated :class:`Protocol` that knows how to respond to IO readiness events for those descriptors. Streams are registered with :class:`Broker`, and callbacks are invoked on the broker thread in response to IO activity. When registered using :meth:`Broker.start_receive` or :meth:`Broker._start_transmit`, the broker may call any of :meth:`on_receive`, :meth:`on_transmit`, :meth:`on_shutdown` or :meth:`on_disconnect`. It is expected that the :class:`Protocol` associated with a stream will change over its life. For example during connection setup, the initial protocol may be :class:`mitogen.parent.BootstrapProtocol` that knows how to enter SSH and sudo passwords and transmit the :mod:`mitogen.core` source to the target, before handing off to :class:`MitogenProtocol` when the target process is initialized. Streams connecting to children are in turn aggregated by :class:`mitogen.parent.Connection`, which contains additional logic for managing any child process, and a reference to any separate ``stderr`` :class:`Stream` connected to that process. """ #: A :class:`Side` representing the stream's receive file descriptor. receive_side = None #: A :class:`Side` representing the stream's transmit file descriptor. transmit_side = None #: A :class:`Protocol` representing the protocol active on the stream. protocol = None #: In parents, the :class:`mitogen.parent.Connection` instance. conn = None #: The stream name. This is used in the :meth:`__repr__` output in any log #: messages, it may be any descriptive string. name = u'default' def set_protocol(self, protocol): """ Bind a :class:`Protocol` to this stream, by updating :attr:`Protocol.stream` to refer to this stream, and updating this stream's :attr:`Stream.protocol` to the refer to the protocol. Any prior protocol's :attr:`Protocol.stream` is set to :data:`None`. """ if self.protocol: self.protocol.stream = None self.protocol = protocol self.protocol.stream = self def accept(self, rfp, wfp): """ Attach a pair of file objects to :attr:`receive_side` and :attr:`transmit_side`, after wrapping them in :class:`Side` instances. :class:`Side` will call :func:`set_nonblock` and :func:`set_cloexec` on the underlying file descriptors during construction. The same file object may be used for both sides. The default :meth:`on_disconnect` is handles the possibility that only one descriptor may need to be closed. :param file rfp: The file object to receive from. :param file wfp: The file object to transmit to. """ self.receive_side = Side(self, rfp) self.transmit_side = Side(self, wfp) def __repr__(self): return "" % (self.name, id(self) & 0xffff,) def on_receive(self, broker): """ Invoked by :class:`Broker` when the stream's :attr:`receive_side` has been marked readable using :meth:`Broker.start_receive` and the broker has detected the associated file descriptor is ready for reading. Subclasses must implement this if they are registered using :meth:`Broker.start_receive`, and the method must invoke :meth:`on_disconnect` if reading produces an empty string. The default implementation reads :attr:`Protocol.read_size` bytes and passes the resulting bytestring to :meth:`Protocol.on_receive`. If the bytestring is 0 bytes, invokes :meth:`on_disconnect` instead. """ buf = self.receive_side.read(self.protocol.read_size) if not buf: LOG.debug('%r: empty read, disconnecting', self.receive_side) return self.on_disconnect(broker) self.protocol.on_receive(broker, buf) def on_transmit(self, broker): """ Invoked by :class:`Broker` when the stream's :attr:`transmit_side` has been marked writeable using :meth:`Broker._start_transmit` and the broker has detected the associated file descriptor is ready for writing. Subclasses must implement they are ever registerd with :meth:`Broker._start_transmit`. The default implementation invokes :meth:`Protocol.on_transmit`. """ self.protocol.on_transmit(broker) def on_shutdown(self, broker): """ Invoked by :meth:`Broker.shutdown` to allow the stream time to gracefully shutdown. The default implementation emits a ``shutdown`` signal before invoking :meth:`on_disconnect`. """ fire(self, 'shutdown') self.protocol.on_shutdown(broker) def on_disconnect(self, broker): """ Invoked by :class:`Broker` to force disconnect the stream during shutdown, invoked by the default :meth:`on_shutdown` implementation, and usually invoked by any subclass :meth:`on_receive` implementation in response to a 0-byte read. The base implementation fires a ``disconnect`` event, then closes :attr:`receive_side` and :attr:`transmit_side` after unregistering the stream from the broker. """ fire(self, 'disconnect') self.protocol.on_disconnect(broker) class Protocol(object): """ Implement the program behaviour associated with activity on a :class:`Stream`. The protocol in use may vary over a stream's life, for example to allow :class:`mitogen.parent.BootstrapProtocol` to initialize the connected child before handing it off to :class:`MitogenProtocol`. A stream's active protocol is tracked in the :attr:`Stream.protocol` attribute, and modified via :meth:`Stream.set_protocol`. Protocols do not handle IO, they are entirely reliant on the interface provided by :class:`Stream` and :class:`Side`, allowing the underlying IO implementation to be replaced without modifying behavioural logic. """ stream_class = Stream #: The :class:`Stream` this protocol is currently bound to, or #: :data:`None`. stream = None #: The size of the read buffer used by :class:`Stream` when this is the #: active protocol for the stream. read_size = CHUNK_SIZE @classmethod def build_stream(cls, *args, **kwargs): stream = cls.stream_class() stream.set_protocol(cls(*args, **kwargs)) return stream def __repr__(self): return '%s(%s)' % ( self.__class__.__name__, self.stream and self.stream.name, ) def on_shutdown(self, broker): _v and LOG.debug('%r: shutting down', self) self.stream.on_disconnect(broker) def on_disconnect(self, broker): # Normally both sides an FD, so it is important that tranmit_side is # deregistered from Poller before closing the receive side, as pollers # like epoll and kqueue unregister all events on FD close, causing # subsequent attempt to unregister the transmit side to fail. LOG.debug('%r: disconnecting', self) broker.stop_receive(self.stream) if self.stream.transmit_side: broker._stop_transmit(self.stream) self.stream.receive_side.close() if self.stream.transmit_side: self.stream.transmit_side.close() class DelimitedProtocol(Protocol): """ Provide a :meth:`Protocol.on_receive` implementation for protocols that are delimited by a fixed string, like text based protocols. Each message is passed to :meth:`on_line_received` as it arrives, with incomplete messages passed to :meth:`on_partial_line_received`. When emulating user input it is often necessary to respond to incomplete lines, such as when a "Password: " prompt is sent. :meth:`on_partial_line_received` may be called repeatedly with an increasingly complete message. When a complete message is finally received, :meth:`on_line_received` will be called once for it before the buffer is discarded. If :func:`on_line_received` returns :data:`False`, remaining data is passed unprocessed to the stream's current protocol's :meth:`on_receive`. This allows switching from line-oriented to binary while the input buffer contains both kinds of data. """ #: The delimiter. Defaults to newline. delimiter = b('\n') _trailer = b('') def on_receive(self, broker, buf): _vv and IOLOG.debug('%r.on_receive()', self) stream = self.stream self._trailer, cont = mitogen.core.iter_split( buf=self._trailer + buf, delim=self.delimiter, func=self.on_line_received, ) if self._trailer: if cont: self.on_partial_line_received(self._trailer) else: assert stream.protocol is not self, \ 'stream protocol is no longer %r' % (self,) stream.protocol.on_receive(broker, self._trailer) def on_line_received(self, line): """ Receive a line from the stream. :param bytes line: The encoded line, excluding the delimiter. :returns: :data:`False` to indicate this invocation modified the stream's active protocol, and any remaining buffered data should be passed to the new protocol's :meth:`on_receive` method. Any other return value is ignored. """ pass def on_partial_line_received(self, line): """ Receive a trailing unterminated partial line from the stream. :param bytes line: The encoded partial line. """ pass class BufferedWriter(object): """ Implement buffered output while avoiding quadratic string operations. This is currently constructed by each protocol, in future it may become fixed for each stream instead. """ def __init__(self, broker, protocol): self._broker = broker self._protocol = protocol self._buf = collections.deque() self._len = 0 def write(self, s): """ Transmit `s` immediately, falling back to enqueuing it and marking the stream writeable if no OS buffer space is available. """ if not self._len: # Modifying epoll/Kqueue state is expensive, as are needless broker # loops. Rather than wait for writeability, just write immediately, # and fall back to the broker loop on error or full buffer. try: n = self._protocol.stream.transmit_side.write(s) if n: if n == len(s): return s = s[n:] except OSError: pass self._broker._start_transmit(self._protocol.stream) self._buf.append(s) self._len += len(s) def on_transmit(self, broker): """ Respond to stream writeability by retrying previously buffered :meth:`write` calls. """ if self._buf: buf = self._buf.popleft() written = self._protocol.stream.transmit_side.write(buf) if not written: _v and LOG.debug('disconnected during write to %r', self) self._protocol.stream.on_disconnect(broker) return elif written != len(buf): self._buf.appendleft(BufferType(buf, written)) _vv and IOLOG.debug('transmitted %d bytes to %r', written, self) self._len -= written if not self._buf: broker._stop_transmit(self._protocol.stream) class Side(object): """ Represent one side of a :class:`Stream`. This allows unidirectional (e.g. pipe) and bidirectional (e.g. socket) streams to operate identically. Sides are also responsible for tracking the open/closed state of the underlying FD, preventing erroneous duplicate calls to :func:`os.close` due to duplicate :meth:`Stream.on_disconnect` calls, which would otherwise risk silently succeeding by closing an unrelated descriptor. For this reason, it is crucial only one file object exists per unique descriptor. :param mitogen.core.Stream stream: The stream this side is associated with. :param object fp: The file or socket object managing the underlying file descriptor. Any object may be used that supports `fileno()` and `close()` methods. :param bool cloexec: If :data:`True`, the descriptor has its :data:`fcntl.FD_CLOEXEC` flag enabled using :func:`fcntl.fcntl`. :param bool keep_alive: If :data:`True`, the continued existence of this side will extend the shutdown grace period until it has been unregistered from the broker. :param bool blocking: If :data:`False`, the descriptor has its :data:`os.O_NONBLOCK` flag enabled using :func:`fcntl.fcntl`. """ _fork_refs = weakref.WeakValueDictionary() closed = False def __init__(self, stream, fp, cloexec=True, keep_alive=True, blocking=False): #: The :class:`Stream` for which this is a read or write side. self.stream = stream # File or socket object responsible for the lifetime of its underlying # file descriptor. self.fp = fp #: Integer file descriptor to perform IO on, or :data:`None` if #: :meth:`close` has been called. This is saved separately from the #: file object, since :meth:`file.fileno` cannot be called on it after #: it has been closed. self.fd = fp.fileno() #: If :data:`True`, causes presence of this side in #: :class:`Broker`'s active reader set to defer shutdown until the #: side is disconnected. self.keep_alive = keep_alive self._fork_refs[id(self)] = self if cloexec: set_cloexec(self.fd) if not blocking: set_nonblock(self.fd) def __repr__(self): return '' % ( self.stream.name or repr(self.stream), self.fd ) @classmethod def _on_fork(cls): while cls._fork_refs: _, side = cls._fork_refs.popitem() _vv and IOLOG.debug('Side._on_fork() closing %r', side) side.close() def close(self): """ Call :meth:`file.close` on :attr:`fp` if it is not :data:`None`, then set it to :data:`None`. """ _vv and IOLOG.debug('%r.close()', self) if not self.closed: self.closed = True self.fp.close() def read(self, n=CHUNK_SIZE): """ Read up to `n` bytes from the file descriptor, wrapping the underlying :func:`os.read` call with :func:`io_op` to trap common disconnection conditions. :meth:`read` always behaves as if it is reading from a regular UNIX file; socket, pipe, and TTY disconnection errors are masked and result in a 0-sized read like a regular file. :returns: Bytes read, or the empty string to indicate disconnection was detected. """ if self.closed: # Refuse to touch the handle after closed, it may have been reused # by another thread. TODO: synchronize read()/write()/close(). return b('') s, disconnected = io_op(os.read, self.fd, n) if disconnected: LOG.debug('%r: disconnected during read: %s', self, disconnected) return b('') return s def write(self, s): """ Write as much of the bytes from `s` as possible to the file descriptor, wrapping the underlying :func:`os.write` call with :func:`io_op` to trap common disconnection conditions. :returns: Number of bytes written, or :data:`None` if disconnection was detected. """ if self.closed: # Don't touch the handle after close, it may be reused elsewhere. return None written, disconnected = io_op(os.write, self.fd, s) if disconnected: LOG.debug('%r: disconnected during write: %s', self, disconnected) return None return written class MitogenProtocol(Protocol): """ :class:`Protocol` implementing mitogen's :ref:`stream protocol `. """ #: If not :data:`False`, indicates the stream has :attr:`auth_id` set and #: its value is the same as :data:`mitogen.context_id` or appears in #: :data:`mitogen.parent_ids`. is_privileged = False #: Invoked as `on_message(stream, msg)` each message received from the #: peer. on_message = None def __init__(self, router, remote_id, auth_id=None, local_id=None, parent_ids=None): self._router = router self.remote_id = remote_id #: If not :data:`None`, :class:`Router` stamps this into #: :attr:`Message.auth_id` of every message received on this stream. self.auth_id = auth_id if parent_ids is None: parent_ids = mitogen.parent_ids if local_id is None: local_id = mitogen.context_id self.is_privileged = ( (remote_id in parent_ids) or auth_id in ([local_id] + parent_ids) ) self.sent_modules = set(['mitogen', 'mitogen.core']) self._input_buf = collections.deque() self._input_buf_len = 0 self._writer = BufferedWriter(router.broker, self) #: Routing records the dst_id of every message arriving from this #: stream. Any arriving DEL_ROUTE is rebroadcast for any such ID. self.egress_ids = set() def on_receive(self, broker, buf): """ Handle the next complete message on the stream. Raise :class:`StreamError` on failure. """ _vv and IOLOG.debug('%r.on_receive()', self) if self._input_buf and self._input_buf_len < 128: self._input_buf[0] += buf else: self._input_buf.append(buf) self._input_buf_len += len(buf) while self._receive_one(broker): pass corrupt_msg = ( '%s: Corruption detected: frame signature incorrect. This likely means' ' some external process is interfering with the connection. Received:' '\n\n' '%r' ) def _receive_one(self, broker): if self._input_buf_len < Message.HEADER_LEN: return False msg = Message() msg.router = self._router (magic, msg.dst_id, msg.src_id, msg.auth_id, msg.handle, msg.reply_to, msg_len) = struct.unpack( Message.HEADER_FMT, self._input_buf[0][:Message.HEADER_LEN], ) if magic != Message.HEADER_MAGIC: LOG.error(self.corrupt_msg, self.stream.name, self._input_buf[0][:2048]) self.stream.on_disconnect(broker) return False if msg_len > self._router.max_message_size: LOG.error('%r: Maximum message size exceeded (got %d, max %d)', self, msg_len, self._router.max_message_size) self.stream.on_disconnect(broker) return False total_len = msg_len + Message.HEADER_LEN if self._input_buf_len < total_len: _vv and IOLOG.debug( '%r: Input too short (want %d, got %d)', self, msg_len, self._input_buf_len - Message.HEADER_LEN ) return False start = Message.HEADER_LEN prev_start = start remain = total_len bits = [] while remain: buf = self._input_buf.popleft() bit = buf[start:remain] bits.append(bit) remain -= len(bit) + start prev_start = start start = 0 msg.data = b('').join(bits) self._input_buf.appendleft(buf[prev_start+len(bit):]) self._input_buf_len -= total_len self._router._async_route(msg, self.stream) return True def pending_bytes(self): """ Return the number of bytes queued for transmission on this stream. This can be used to limit the amount of data buffered in RAM by an otherwise unlimited consumer. For an accurate result, this method should be called from the Broker thread, for example by using :meth:`Broker.defer_sync`. """ return self._writer._len def on_transmit(self, broker): """ Transmit buffered messages. """ _vv and IOLOG.debug('%r.on_transmit()', self) self._writer.on_transmit(broker) def _send(self, msg): _vv and IOLOG.debug('%r._send(%r)', self, msg) self._writer.write(msg.pack()) def send(self, msg): """ Send `data` to `handle`, and tell the broker we have output. May be called from any thread. """ self._router.broker.defer(self._send, msg) def on_shutdown(self, broker): """ Disable :class:`Protocol` immediate disconnect behaviour. """ _v and LOG.debug('%r: shutting down', self) class Context(object): """ Represent a remote context regardless of the underlying connection method. Context objects are simple facades that emit messages through an associated router, and have :ref:`signals` raised against them in response to various events relating to the context. **Note:** This is the somewhat limited core version, used by child contexts. The master subclass is documented below this one. Contexts maintain no internal state and are thread-safe. Prefer :meth:`Router.context_by_id` over constructing context objects explicitly, as that method is deduplicating, and returns the only context instance :ref:`signals` will be raised on. :param mitogen.core.Router router: Router to emit messages through. :param int context_id: Context ID. :param str name: Context name. """ name = None remote_name = None def __init__(self, router, context_id, name=None): self.router = router self.context_id = context_id if name: self.name = to_text(name) def __reduce__(self): return _unpickle_context, (self.context_id, self.name) def on_disconnect(self): _v and LOG.debug('%r: disconnecting', self) fire(self, 'disconnect') def send_async(self, msg, persist=False): """ Arrange for `msg` to be delivered to this context, with replies directed to a newly constructed receiver. :attr:`dst_id ` is set to the target context ID, and :attr:`reply_to ` is set to the newly constructed receiver's handle. :param bool persist: If :data:`False`, the handler will be unregistered after a single message has been received. :param mitogen.core.Message msg: The message. :returns: :class:`Receiver` configured to receive any replies sent to the message's `reply_to` handle. """ receiver = Receiver(self.router, persist=persist, respondent=self) msg.dst_id = self.context_id msg.reply_to = receiver.handle _v and LOG.debug('sending message to %r: %r', self, msg) self.send(msg) return receiver def call_service_async(self, service_name, method_name, **kwargs): if isinstance(service_name, BytesType): service_name = service_name.encode('utf-8') elif not isinstance(service_name, UnicodeType): service_name = service_name.name() # Service.name() _v and LOG.debug('calling service %s.%s of %r, args: %r', service_name, method_name, self, kwargs) tup = (service_name, to_text(method_name), Kwargs(kwargs)) msg = Message.pickled(tup, handle=CALL_SERVICE) return self.send_async(msg) def send(self, msg): """ Arrange for `msg` to be delivered to this context. :attr:`dst_id ` is set to the target context ID. :param Message msg: Message. """ msg.dst_id = self.context_id self.router.route(msg) def call_service(self, service_name, method_name, **kwargs): recv = self.call_service_async(service_name, method_name, **kwargs) return recv.get().unpickle() def send_await(self, msg, deadline=None): """ Like :meth:`send_async`, but expect a single reply (`persist=False`) delivered within `deadline` seconds. :param mitogen.core.Message msg: The message. :param float deadline: If not :data:`None`, seconds before timing out waiting for a reply. :returns: Deserialized reply. :raises TimeoutError: No message was received and `deadline` passed. """ receiver = self.send_async(msg) response = receiver.get(deadline) data = response.unpickle() _vv and IOLOG.debug('%r._send_await() -> %r', self, data) return data def __repr__(self): return 'Context(%s, %r)' % (self.context_id, self.name) def _unpickle_context(context_id, name, router=None): if not (isinstance(context_id, (int, long)) and context_id >= 0 and ( (name is None) or (isinstance(name, UnicodeType) and len(name) < 100)) ): raise TypeError('cannot unpickle Context: bad input') if isinstance(router, Router): return router.context_by_id(context_id, name=name) return Context(None, context_id, name) # For plain Jane pickle. class Poller(object): """ A poller manages OS file descriptors the user is waiting to become available for IO. The :meth:`poll` method blocks the calling thread until one or more become ready. Each descriptor has an associated `data` element, which is unique for each readiness type, and defaults to being the same as the file descriptor. The :meth:`poll` method yields the data associated with a descriptor, rather than the descriptor itself, allowing concise loops like:: p = Poller() p.start_receive(conn.fd, data=conn.on_read) p.start_transmit(conn.fd, data=conn.on_write) for callback in p.poll(): callback() # invoke appropriate bound instance method Pollers may be modified while :meth:`poll` is yielding results. Removals are processed immediately, causing pending events for the descriptor to be discarded. The :meth:`close` method must be called when a poller is discarded to avoid a resource leak. Pollers may only be used by one thread at a time. This implementation uses :func:`select.select` for wider platform support. That is considered an implementation detail. Previous versions have used :func:`select.poll`. Future versions may decide at runtime. """ SUPPORTED = True #: Increments on every poll(). Used to version _rfds and _wfds. _generation = 1 def __init__(self): self._rfds = {} self._wfds = {} def __repr__(self): return '%s' % (type(self).__name__,) def _update(self, fd): """ Required by PollPoller subclass. """ pass @property def readers(self): """ Return a list of `(fd, data)` tuples for every FD registered for receive readiness. """ return list((fd, data) for fd, (data, gen) in self._rfds.items()) @property def writers(self): """ Return a list of `(fd, data)` tuples for every FD registered for transmit readiness. """ return list((fd, data) for fd, (data, gen) in self._wfds.items()) def close(self): """ Close any underlying OS resource used by the poller. """ pass def start_receive(self, fd, data=None): """ Cause :meth:`poll` to yield `data` when `fd` is readable. """ self._rfds[fd] = (data or fd, self._generation) self._update(fd) def stop_receive(self, fd): """ Stop yielding readability events for `fd`. Redundant calls to :meth:`stop_receive` are silently ignored, this may change in future. """ self._rfds.pop(fd, None) self._update(fd) def start_transmit(self, fd, data=None): """ Cause :meth:`poll` to yield `data` when `fd` is writeable. """ self._wfds[fd] = (data or fd, self._generation) self._update(fd) def stop_transmit(self, fd): """ Stop yielding writeability events for `fd`. Redundant calls to :meth:`stop_transmit` are silently ignored, this may change in future. """ self._wfds.pop(fd, None) self._update(fd) def _poll(self, timeout): (rfds, wfds, _), _ = io_op(select.select, self._rfds, self._wfds, (), timeout ) for fd in rfds: _vv and IOLOG.debug('%r: POLLIN for %r', self, fd) data, gen = self._rfds.get(fd, (None, None)) if gen and gen < self._generation: yield data for fd in wfds: _vv and IOLOG.debug('%r: POLLOUT for %r', self, fd) data, gen = self._wfds.get(fd, (None, None)) if gen and gen < self._generation: yield data def poll(self, timeout=None): """ Block the calling thread until one or more FDs are ready for IO. :param float timeout: If not :data:`None`, seconds to wait without an event before returning an empty iterable. :returns: Iterable of `data` elements associated with ready FDs. """ _vv and IOLOG.debug('%r.poll(%r)', self, timeout) self._generation += 1 return self._poll(timeout) class Latch(object): """ A latch is a :class:`Queue.Queue`-like object that supports mutation and waiting from multiple threads, however unlike :class:`Queue.Queue`, waiting threads always remain interruptible, so CTRL+C always succeeds, and waits where a timeout is set experience no wake up latency. These properties are not possible in combination using the built-in threading primitives available in Python 2.x. Latches implement queues using the UNIX self-pipe trick, and a per-thread :func:`socket.socketpair` that is lazily created the first time any latch attempts to sleep on a thread, and dynamically associated with the waiting Latch only for duration of the wait. See :ref:`waking-sleeping-threads` for further discussion. """ #: The :class:`Poller` implementation to use. Instances are short lived so #: prefer :class:`mitogen.parent.PollPoller` if it's available, otherwise #: :class:`mitogen.core.Poller`. They don't need syscalls to create, #: configure, or destroy. Replaced during import of :mod:`mitogen.parent`. poller_class = Poller #: If not :data:`None`, a function invoked as `notify(latch)` after a #: successful call to :meth:`put`. The function is invoked on the #: :meth:`put` caller's thread, which may be the :class:`Broker` thread, #: therefore it must not block. Used by :class:`mitogen.select.Select` to #: efficiently implement waiting on multiple event sources. notify = None # The _cls_ prefixes here are to make it crystal clear in the code which # state mutation isn't covered by :attr:`_lock`. #: List of reusable :func:`socket.socketpair` tuples. The list is mutated #: from multiple threads, the only safe operations are `append()` and #: `pop()`. _cls_idle_socketpairs = [] #: List of every socket object that must be closed by :meth:`_on_fork`. #: Inherited descriptors cannot be reused, as the duplicated handles #: reference the same underlying kernel object in use by the parent. _cls_all_sockets = [] def __init__(self): self.closed = False self._lock = threading.Lock() #: List of unconsumed enqueued items. self._queue = [] #: List of `(wsock, cookie)` awaiting an element, where `wsock` is the #: socketpair's write side, and `cookie` is the string to write. self._sleeping = [] #: Number of elements of :attr:`_sleeping` that have already been #: woken, and have a corresponding element index from :attr:`_queue` #: assigned to them. self._waking = 0 @classmethod def _on_fork(cls): """ Clean up any files belonging to the parent process after a fork. """ cls._cls_idle_socketpairs = [] while cls._cls_all_sockets: cls._cls_all_sockets.pop().close() def close(self): """ Mark the latch as closed, and cause every sleeping thread to be woken, with :class:`mitogen.core.LatchError` raised in each thread. """ self._lock.acquire() try: self.closed = True while self._waking < len(self._sleeping): wsock, cookie = self._sleeping[self._waking] self._wake(wsock, cookie) self._waking += 1 finally: self._lock.release() def size(self): """ Return the number of items currently buffered. As with :class:`Queue.Queue`, `0` may be returned even though a subsequent call to :meth:`get` will succeed, since a message may be posted at any moment between :meth:`size` and :meth:`get`. As with :class:`Queue.Queue`, `>0` may be returned even though a subsequent call to :meth:`get` will block, since another waiting thread may be woken at any moment between :meth:`size` and :meth:`get`. :raises LatchError: The latch has already been marked closed. """ self._lock.acquire() try: if self.closed: raise LatchError() return len(self._queue) finally: self._lock.release() def empty(self): """ Return `size() == 0`. .. deprecated:: 0.2.8 Use :meth:`size` instead. :raises LatchError: The latch has already been marked closed. """ return self.size() == 0 def _get_socketpair(self): """ Return an unused socketpair, creating one if none exist. """ try: return self._cls_idle_socketpairs.pop() # pop() must be atomic except IndexError: rsock, wsock = socket.socketpair() rsock.setblocking(False) set_cloexec(rsock.fileno()) set_cloexec(wsock.fileno()) self._cls_all_sockets.extend((rsock, wsock)) return rsock, wsock COOKIE_MAGIC, = struct.unpack('L', b('LTCH') * (struct.calcsize('L')//4)) COOKIE_FMT = '>Qqqq' # #545: id() and get_ident() may exceed long on armhfp. COOKIE_SIZE = struct.calcsize(COOKIE_FMT) def _make_cookie(self): """ Return a string encoding the ID of the process, instance and thread. This disambiguates legitimate wake-ups, accidental writes to the FD, and buggy internal FD sharing. """ return struct.pack(self.COOKIE_FMT, self.COOKIE_MAGIC, os.getpid(), id(self), thread.get_ident()) def get(self, timeout=None, block=True): """ Return the next enqueued object, or sleep waiting for one. :param float timeout: If not :data:`None`, specifies a timeout in seconds. :param bool block: If :data:`False`, immediately raise :class:`mitogen.core.TimeoutError` if the latch is empty. :raises mitogen.core.LatchError: :meth:`close` has been called, and the object is no longer valid. :raises mitogen.core.TimeoutError: Timeout was reached. :returns: The de-queued object. """ _vv and IOLOG.debug('%r.get(timeout=%r, block=%r)', self, timeout, block) self._lock.acquire() try: if self.closed: raise LatchError() i = len(self._sleeping) if len(self._queue) > i: _vv and IOLOG.debug('%r.get() -> %r', self, self._queue[i]) return self._queue.pop(i) if not block: raise TimeoutError() rsock, wsock = self._get_socketpair() cookie = self._make_cookie() self._sleeping.append((wsock, cookie)) finally: self._lock.release() poller = self.poller_class() poller.start_receive(rsock.fileno()) try: return self._get_sleep(poller, timeout, block, rsock, wsock, cookie) finally: poller.close() def _get_sleep(self, poller, timeout, block, rsock, wsock, cookie): """ When a result is not immediately available, sleep waiting for :meth:`put` to write a byte to our socket pair. """ _vv and IOLOG.debug( '%r._get_sleep(timeout=%r, block=%r, fd=%d/%d)', self, timeout, block, rsock.fileno(), wsock.fileno() ) e = None try: list(poller.poll(timeout)) except Exception: e = sys.exc_info()[1] self._lock.acquire() try: i = self._sleeping.index((wsock, cookie)) del self._sleeping[i] try: got_cookie = rsock.recv(self.COOKIE_SIZE) except socket.error: e2 = sys.exc_info()[1] if e2.args[0] == errno.EAGAIN: e = TimeoutError() else: e = e2 self._cls_idle_socketpairs.append((rsock, wsock)) if e: raise e assert cookie == got_cookie, ( "Cookie incorrect; got %r, expected %r" % (binascii.hexlify(got_cookie), binascii.hexlify(cookie)) ) assert i < self._waking, ( "Cookie correct, but no queue element assigned." ) self._waking -= 1 if self.closed: raise LatchError() _vv and IOLOG.debug('%r.get() wake -> %r', self, self._queue[i]) return self._queue.pop(i) finally: self._lock.release() def put(self, obj=None): """ Enqueue an object, waking the first thread waiting for a result, if one exists. :param obj: Object to enqueue. Defaults to :data:`None` as a convenience when using :class:`Latch` only for synchronization. :raises mitogen.core.LatchError: :meth:`close` has been called, and the object is no longer valid. """ _vv and IOLOG.debug('%r.put(%r)', self, obj) self._lock.acquire() try: if self.closed: raise LatchError() self._queue.append(obj) wsock = None if self._waking < len(self._sleeping): wsock, cookie = self._sleeping[self._waking] self._waking += 1 _vv and IOLOG.debug('%r.put() -> waking wfd=%r', self, wsock.fileno()) elif self.notify: self.notify(self) finally: self._lock.release() if wsock: self._wake(wsock, cookie) def _wake(self, wsock, cookie): written, disconnected = io_op(os.write, wsock.fileno(), cookie) assert written == len(cookie) and not disconnected def __repr__(self): return 'Latch(%#x, size=%d, t=%r)' % ( id(self), len(self._queue), threading__thread_name(threading__current_thread()), ) class Waker(Protocol): """ :class:`Protocol` implementing the `UNIX self-pipe trick`_. Used to wake :class:`Broker` when another thread needs to modify its state, by enqueing a function call to run on the :class:`Broker` thread. .. _UNIX self-pipe trick: https://cr.yp.to/docs/selfpipe.html """ read_size = 1 broker_ident = None @classmethod def build_stream(cls, broker): stream = super(Waker, cls).build_stream(broker) stream.accept(*pipe()) return stream def __init__(self, broker): self._broker = broker self._deferred = collections.deque() def __repr__(self): return 'Waker(fd=%r/%r)' % ( self.stream.receive_side and self.stream.receive_side.fd, self.stream.transmit_side and self.stream.transmit_side.fd, ) @property def keep_alive(self): """ Prevent immediate Broker shutdown while deferred functions remain. """ return len(self._deferred) def on_receive(self, broker, buf): """ Drain the pipe and fire callbacks. Since :attr:`_deferred` is synchronized, :meth:`defer` and :meth:`on_receive` can conspire to ensure only one byte needs to be pending regardless of queue length. """ _vv and IOLOG.debug('%r.on_receive()', self) while True: try: func, args, kwargs = self._deferred.popleft() except IndexError: return try: func(*args, **kwargs) except Exception: LOG.exception('defer() crashed: %r(*%r, **%r)', func, args, kwargs) broker.shutdown() def _wake(self): """ Wake the multiplexer by writing a byte. If Broker is midway through teardown, the FD may already be closed, so ignore EBADF. """ try: self.stream.transmit_side.write(b(' ')) except OSError: e = sys.exc_info()[1] if e.args[0] not in (errno.EBADF, errno.EWOULDBLOCK): raise broker_shutdown_msg = ( "An attempt was made to enqueue a message with a Broker that has " "already exitted. It is likely your program called Broker.shutdown() " "too early." ) def defer(self, func, *args, **kwargs): """ Arrange for `func()` to execute on the broker thread. This function returns immediately without waiting the result of `func()`. Use :meth:`defer_sync` to block until a result is available. :raises mitogen.core.Error: :meth:`defer` was called after :class:`Broker` has begun shutdown. """ if thread.get_ident() == self.broker_ident: _vv and IOLOG.debug('%r.defer() [immediate]', self) return func(*args, **kwargs) if self._broker._exitted: raise Error(self.broker_shutdown_msg) _vv and IOLOG.debug('%r.defer() [fd=%r]', self, self.stream.transmit_side.fd) self._deferred.append((func, args, kwargs)) self._wake() class IoLoggerProtocol(DelimitedProtocol): """ Attached to one end of a socket pair whose other end overwrites one of the standard ``stdout`` or ``stderr`` file descriptors in a child context. Received data is split up into lines, decoded as UTF-8 and logged to the :mod:`logging` package as either the ``stdout`` or ``stderr`` logger. Logging in child contexts is in turn forwarded to the master process using :class:`LogHandler`. """ @classmethod def build_stream(cls, name, dest_fd): """ Even though the file descriptor `dest_fd` will hold the opposite end of the socket open, we must keep a separate dup() of it (i.e. wsock) in case some code decides to overwrite `dest_fd` later, which would prevent break :meth:`on_shutdown` from calling :meth:`shutdown() ` on it. """ rsock, wsock = socket.socketpair() os.dup2(wsock.fileno(), dest_fd) stream = super(IoLoggerProtocol, cls).build_stream(name) stream.name = name stream.accept(rsock, wsock) return stream def __init__(self, name): self._log = logging.getLogger(name) # #453: prevent accidental log initialization in a child creating a # feedback loop. self._log.propagate = False self._log.handlers = logging.getLogger().handlers[:] def on_shutdown(self, broker): """ Shut down the write end of the socket, preventing any further writes to it by this process, or subprocess that inherited it. This allows any remaining kernel-buffered data to be drained during graceful shutdown without the buffer continuously refilling due to some out of control child process. """ _v and LOG.debug('%r: shutting down', self) if not IS_WSL: # #333: WSL generates invalid readiness indication on shutdown(). # This modifies the *kernel object* inherited by children, causing # EPIPE on subsequent writes to any dupped FD in any process. The # read side can then drain completely of prior buffered data. self.stream.transmit_side.fp.shutdown(socket.SHUT_WR) self.stream.transmit_side.close() def on_line_received(self, line): """ Decode the received line as UTF-8 and pass it to the logging framework. """ self._log.info('%s', line.decode('utf-8', 'replace')) class Router(object): """ Route messages between contexts, and invoke local handlers for messages addressed to this context. :meth:`Router.route() ` straddles the :class:`Broker` thread and user threads, it is safe to call anywhere. **Note:** This is the somewhat limited core version of the Router class used by child contexts. The master subclass is documented below this one. """ #: The :class:`mitogen.core.Context` subclass to use when constructing new #: :class:`Context` objects in :meth:`myself` and :meth:`context_by_id`. #: Permits :class:`Router` subclasses to extend the :class:`Context` #: interface, as done in :class:`mitogen.parent.Router`. context_class = Context max_message_size = 128 * 1048576 #: When :data:`True`, permit children to only communicate with the current #: context or a parent of the current context. Routing between siblings or #: children of parents is prohibited, ensuring no communication is possible #: between intentionally partitioned networks, such as when a program #: simultaneously manipulates hosts spread across a corporate and a #: production network, or production networks that are otherwise #: air-gapped. #: #: Sending a prohibited message causes an error to be logged and a dead #: message to be sent in reply to the errant message, if that message has #: ``reply_to`` set. #: #: The value of :data:`unidirectional` becomes the default for the #: :meth:`local() ` `unidirectional` #: parameter. unidirectional = False duplicate_handle_msg = 'cannot register a handle that already exists' refused_msg = 'refused by policy' invalid_handle_msg = 'invalid handle' too_large_msg = 'message too large (max %d bytes)' respondent_disconnect_msg = 'the respondent Context has disconnected' broker_exit_msg = 'Broker has exitted' no_route_msg = 'no route to %r, my ID is %r' unidirectional_msg = ( 'routing mode prevents forward of message from context %d to ' 'context %d via context %d' ) def __init__(self, broker): self.broker = broker listen(broker, 'exit', self._on_broker_exit) self._setup_logging() self._write_lock = threading.Lock() #: context ID -> Stream; must hold _write_lock to edit or iterate self._stream_by_id = {} #: List of contexts to notify of shutdown; must hold _write_lock self._context_by_id = {} self._last_handle = itertools.count(1000) #: handle -> (persistent?, func(msg)) self._handle_map = {} #: Context -> set { handle, .. } self._handles_by_respondent = {} self.add_handler(self._on_del_route, DEL_ROUTE) def __repr__(self): return 'Router(%r)' % (self.broker,) def _setup_logging(self): """ This is done in the :class:`Router` constructor for historical reasons. It must be called before ExternalContext logs its first messages, but after logging has been setup. It must also be called when any router is constructed for a consumer app. """ # Here seems as good a place as any. global _v, _vv _v = logging.getLogger().level <= logging.DEBUG _vv = IOLOG.level <= logging.DEBUG def _on_del_route(self, msg): """ Stub :data:`DEL_ROUTE` handler; fires 'disconnect' events on the corresponding :attr:`_context_by_id` member. This is replaced by :class:`mitogen.parent.RouteMonitor` in an upgraded context. """ if msg.is_dead: return target_id_s, _, name = bytes_partition(msg.data, b(':')) target_id = int(target_id_s, 10) LOG.error('%r: deleting route to %s (%d)', self, to_text(name), target_id) context = self._context_by_id.get(target_id) if context: fire(context, 'disconnect') else: LOG.debug('DEL_ROUTE for unknown ID %r: %r', target_id, msg) def _on_stream_disconnect(self, stream): notify = [] self._write_lock.acquire() try: for context in list(self._context_by_id.values()): stream_ = self._stream_by_id.get(context.context_id) if stream_ is stream: del self._stream_by_id[context.context_id] notify.append(context) finally: self._write_lock.release() # Happens outside lock as e.g. RouteMonitor wants the same lock. for context in notify: context.on_disconnect() def _on_broker_exit(self): """ Called prior to broker exit, informs callbacks registered with :meth:`add_handler` the connection is dead. """ _v and LOG.debug('%r: broker has exitted', self) while self._handle_map: _, (_, func, _, _) = self._handle_map.popitem() func(Message.dead(self.broker_exit_msg)) def myself(self): """ Return a :class:`Context` referring to the current process. Since :class:`Context` is serializable, this is convenient to use in remote function call parameter lists. """ return self.context_class( router=self, context_id=mitogen.context_id, name='self', ) def context_by_id(self, context_id, via_id=None, create=True, name=None): """ Return or construct a :class:`Context` given its ID. An internal mapping of ID to the canonical :class:`Context` representing that ID, so that :ref:`signals` can be raised. This may be called from any thread, lookup and construction are atomic. :param int context_id: The context ID to look up. :param int via_id: If the :class:`Context` does not already exist, set its :attr:`Context.via` to the :class:`Context` matching this ID. :param bool create: If the :class:`Context` does not already exist, create it. :param str name: If the :class:`Context` does not already exist, set its name. :returns: :class:`Context`, or return :data:`None` if `create` is :data:`False` and no :class:`Context` previously existed. """ context = self._context_by_id.get(context_id) if context: return context if create and via_id is not None: via = self.context_by_id(via_id) else: via = None self._write_lock.acquire() try: context = self._context_by_id.get(context_id) if create and not context: context = self.context_class(self, context_id, name=name) context.via = via self._context_by_id[context_id] = context finally: self._write_lock.release() return context def register(self, context, stream): """ Register a newly constructed context and its associated stream, and add the stream's receive side to the I/O multiplexer. This method remains public while the design has not yet settled. """ _v and LOG.debug('%s: registering %r to stream %r', self, context, stream) self._write_lock.acquire() try: self._stream_by_id[context.context_id] = stream self._context_by_id[context.context_id] = context finally: self._write_lock.release() self.broker.start_receive(stream) listen(stream, 'disconnect', lambda: self._on_stream_disconnect(stream)) def stream_by_id(self, dst_id): """ Return the :class:`Stream` that should be used to communicate with `dst_id`. If a specific route for `dst_id` is not known, a reference to the parent context's stream is returned. If the parent is disconnected, or when running in the master context, return :data:`None` instead. This can be used from any thread, but its output is only meaningful from the context of the :class:`Broker` thread, as disconnection or replacement could happen in parallel on the broker thread at any moment. """ return ( self._stream_by_id.get(dst_id) or self._stream_by_id.get(mitogen.parent_id) ) def del_handler(self, handle): """ Remove the handle registered for `handle` :raises KeyError: The handle wasn't registered. """ _, _, _, respondent = self._handle_map.pop(handle) if respondent: self._handles_by_respondent[respondent].discard(handle) def add_handler(self, fn, handle=None, persist=True, policy=None, respondent=None, overwrite=False): """ Invoke `fn(msg)` on the :class:`Broker` thread for each Message sent to `handle` from this context. Unregister after one invocation if `persist` is :data:`False`. If `handle` is :data:`None`, a new handle is allocated and returned. :param int handle: If not :data:`None`, an explicit handle to register, usually one of the ``mitogen.core.*`` constants. If unspecified, a new unused handle will be allocated. :param bool persist: If :data:`False`, the handler will be unregistered after a single message has been received. :param mitogen.core.Context respondent: Context that messages to this handle are expected to be sent from. If specified, arranges for a dead message to be delivered to `fn` when disconnection of the context is detected. In future `respondent` will likely also be used to prevent other contexts from sending messages to the handle. :param function policy: Function invoked as `policy(msg, stream)` where `msg` is a :class:`mitogen.core.Message` about to be delivered, and `stream` is the :class:`mitogen.core.Stream` on which it was received. The function must return :data:`True`, otherwise an error is logged and delivery is refused. Two built-in policy functions exist: * :func:`has_parent_authority`: requires the message arrived from a parent context, or a context acting with a parent context's authority (``auth_id``). * :func:`mitogen.parent.is_immediate_child`: requires the message arrived from an immediately connected child, for use in messaging patterns where either something becomes buggy or insecure by permitting indirect upstream communication. In case of refusal, and the message's ``reply_to`` field is nonzero, a :class:`mitogen.core.CallError` is delivered to the sender indicating refusal occurred. :param bool overwrite: If :data:`True`, allow existing handles to be silently overwritten. :return: `handle`, or if `handle` was :data:`None`, the newly allocated handle. :raises Error: Attemp to register handle that was already registered. """ handle = handle or next(self._last_handle) _vv and IOLOG.debug('%r.add_handler(%r, %r, %r)', self, fn, handle, persist) if handle in self._handle_map and not overwrite: raise Error(self.duplicate_handle_msg) self._handle_map[handle] = persist, fn, policy, respondent if respondent: if respondent not in self._handles_by_respondent: self._handles_by_respondent[respondent] = set() listen(respondent, 'disconnect', lambda: self._on_respondent_disconnect(respondent)) self._handles_by_respondent[respondent].add(handle) return handle def _on_respondent_disconnect(self, context): for handle in self._handles_by_respondent.pop(context, ()): _, fn, _, _ = self._handle_map[handle] fn(Message.dead(self.respondent_disconnect_msg)) del self._handle_map[handle] def _maybe_send_dead(self, unreachable, msg, reason, *args): """ Send a dead message to either the original sender or the intended recipient of `msg`, if the original sender was expecting a reply (because its `reply_to` was set), otherwise assume the message is a reply of some sort, and send the dead message to the original destination. :param bool unreachable: If :data:`True`, the recipient is known to be dead or routing failed due to a security precaution, so don't attempt to fallback to sending the dead message to the recipient if the original sender did not include a reply address. :param mitogen.core.Message msg: Message that triggered the dead message. :param str reason: Human-readable error reason. :param tuple args: Elements to interpolate with `reason`. """ if args: reason %= args LOG.debug('%r: %r is dead: %r', self, msg, reason) if msg.reply_to and not msg.is_dead: msg.reply(Message.dead(reason=reason), router=self) elif not unreachable: self._async_route( Message.dead( dst_id=msg.dst_id, handle=msg.handle, reason=reason, ) ) def _invoke(self, msg, stream): # IOLOG.debug('%r._invoke(%r)', self, msg) try: persist, fn, policy, respondent = self._handle_map[msg.handle] except KeyError: self._maybe_send_dead(True, msg, reason=self.invalid_handle_msg) return if respondent and not (msg.is_dead or msg.src_id == respondent.context_id): self._maybe_send_dead(True, msg, 'reply from unexpected context') return if policy and not policy(msg, stream): self._maybe_send_dead(True, msg, self.refused_msg) return if not persist: self.del_handler(msg.handle) try: fn(msg) except Exception: LOG.exception('%r._invoke(%r): %r crashed', self, msg, fn) def _async_route(self, msg, in_stream=None): """ Arrange for `msg` to be forwarded towards its destination. If its destination is the local context, then arrange for it to be dispatched using the local handlers. This is a lower overhead version of :meth:`route` that may only be called from the :class:`Broker` thread. :param Stream in_stream: If not :data:`None`, the stream the message arrived on. Used for performing source route verification, to ensure sensitive messages such as ``CALL_FUNCTION`` arrive only from trusted contexts. """ _vv and IOLOG.debug('%r._async_route(%r, %r)', self, msg, in_stream) if len(msg.data) > self.max_message_size: self._maybe_send_dead(False, msg, self.too_large_msg % ( self.max_message_size, )) return parent_stream = self._stream_by_id.get(mitogen.parent_id) src_stream = self._stream_by_id.get(msg.src_id, parent_stream) # When the ingress stream is known, verify the message was received on # the same as the stream we would expect to receive messages from the # src_id and auth_id. This is like Reverse Path Filtering in IP, and # ensures messages from a privileged context cannot be spoofed by a # child. if in_stream: auth_stream = self._stream_by_id.get(msg.auth_id, parent_stream) if in_stream != auth_stream: LOG.error('%r: bad auth_id: got %r via %r, not %r: %r', self, msg.auth_id, in_stream, auth_stream, msg) return if msg.src_id != msg.auth_id and in_stream != src_stream: LOG.error('%r: bad src_id: got %r via %r, not %r: %r', self, msg.src_id, in_stream, src_stream, msg) return # If the stream's MitogenProtocol has auth_id set, copy it to the # message. This allows subtrees to become privileged by stamping a # parent's context ID. It is used by mitogen.unix to mark client # streams (like Ansible WorkerProcess) as having the same rights as # the parent. if in_stream.protocol.auth_id is not None: msg.auth_id = in_stream.protocol.auth_id if in_stream.protocol.on_message is not None: in_stream.protocol.on_message(in_stream, msg) # Record the IDs the source ever communicated with. in_stream.protocol.egress_ids.add(msg.dst_id) if msg.dst_id == mitogen.context_id: return self._invoke(msg, in_stream) out_stream = self._stream_by_id.get(msg.dst_id) if (not out_stream) and (parent_stream != src_stream or not in_stream): # No downstream route exists. The message could be from a child or # ourselves for a parent, in which case we must forward it # upstream, or it could be from a parent for a dead child, in which # case its src_id/auth_id would fail verification if returned to # the parent, so in that case reply with a dead message instead. out_stream = parent_stream if out_stream is None: self._maybe_send_dead(True, msg, self.no_route_msg, msg.dst_id, mitogen.context_id) return if in_stream and self.unidirectional and not \ (in_stream.protocol.is_privileged or out_stream.protocol.is_privileged): self._maybe_send_dead(True, msg, self.unidirectional_msg, in_stream.protocol.remote_id, out_stream.protocol.remote_id, mitogen.context_id) return out_stream.protocol._send(msg) def route(self, msg): """ Arrange for the :class:`Message` `msg` to be delivered to its destination using any relevant downstream context, or if none is found, by forwarding the message upstream towards the master context. If `msg` is destined for the local context, it is dispatched using the handles registered with :meth:`add_handler`. This may be called from any thread. """ self.broker.defer(self._async_route, msg) class NullTimerList(object): def get_timeout(self): return None class Broker(object): """ Responsible for handling I/O multiplexing in a private thread. **Note:** This somewhat limited core version is used by children. The master subclass is documented below. """ poller_class = Poller _waker = None _thread = None # :func:`mitogen.parent._upgrade_broker` replaces this with # :class:`mitogen.parent.TimerList` during upgrade. timers = NullTimerList() #: Seconds grace to allow :class:`streams ` to shutdown gracefully #: before force-disconnecting them during :meth:`shutdown`. shutdown_timeout = 3.0 def __init__(self, poller_class=None, activate_compat=True): self._alive = True self._exitted = False self._waker = Waker.build_stream(self) #: Arrange for `func(\*args, \**kwargs)` to be executed on the broker #: thread, or immediately if the current thread is the broker thread. #: Safe to call from any thread. self.defer = self._waker.protocol.defer self.poller = self.poller_class() self.poller.start_receive( self._waker.receive_side.fd, (self._waker.receive_side, self._waker.on_receive) ) self._thread = threading.Thread( target=self._broker_main, name='mitogen.broker' ) self._thread.start() if activate_compat: self._py24_25_compat() def _py24_25_compat(self): """ Python 2.4/2.5 have grave difficulties with threads/fork. We mandatorily quiesce all running threads during fork using a monkey-patch there. """ if sys.version_info < (2, 6): # import_module() is used to avoid dep scanner. os_fork = import_module('mitogen.os_fork') os_fork._notice_broker_or_pool(self) def start_receive(self, stream): """ Mark the :attr:`receive_side ` on `stream` as ready for reading. Safe to call from any thread. When the associated file descriptor becomes ready for reading, :meth:`BasicStream.on_receive` will be called. """ _vv and IOLOG.debug('%r.start_receive(%r)', self, stream) side = stream.receive_side assert side and not side.closed self.defer(self.poller.start_receive, side.fd, (side, stream.on_receive)) def stop_receive(self, stream): """ Mark the :attr:`receive_side ` on `stream` as not ready for reading. Safe to call from any thread. """ _vv and IOLOG.debug('%r.stop_receive(%r)', self, stream) self.defer(self.poller.stop_receive, stream.receive_side.fd) def _start_transmit(self, stream): """ Mark the :attr:`transmit_side ` on `stream` as ready for writing. Must only be called from the Broker thread. When the associated file descriptor becomes ready for writing, :meth:`BasicStream.on_transmit` will be called. """ _vv and IOLOG.debug('%r._start_transmit(%r)', self, stream) side = stream.transmit_side assert side and not side.closed self.poller.start_transmit(side.fd, (side, stream.on_transmit)) def _stop_transmit(self, stream): """ Mark the :attr:`transmit_side ` on `stream` as not ready for writing. """ _vv and IOLOG.debug('%r._stop_transmit(%r)', self, stream) self.poller.stop_transmit(stream.transmit_side.fd) def keep_alive(self): """ Return :data:`True` if any reader's :attr:`Side.keep_alive` attribute is :data:`True`, or any :class:`Context` is still registered that is not the master. Used to delay shutdown while some important work is in progress (e.g. log draining). """ it = (side.keep_alive for (_, (side, _)) in self.poller.readers) return sum(it, 0) > 0 or self.timers.get_timeout() is not None def defer_sync(self, func): """ Arrange for `func()` to execute on :class:`Broker` thread, blocking the current thread until a result or exception is available. :returns: Return value of `func()`. """ latch = Latch() def wrapper(): try: latch.put(func()) except Exception: latch.put(sys.exc_info()[1]) self.defer(wrapper) res = latch.get() if isinstance(res, Exception): raise res return res def _call(self, stream, func): """ Call `func(self)`, catching any exception that might occur, logging it, and force-disconnecting the related `stream`. """ try: func(self) except Exception: LOG.exception('%r crashed', stream) stream.on_disconnect(self) def _loop_once(self, timeout=None): """ Execute a single :class:`Poller` wait, dispatching any IO events that caused the wait to complete. :param float timeout: If not :data:`None`, maximum time in seconds to wait for events. """ _vv and IOLOG.debug('%r._loop_once(%r, %r)', self, timeout, self.poller) timer_to = self.timers.get_timeout() if timeout is None: timeout = timer_to elif timer_to is not None and timer_to < timeout: timeout = timer_to #IOLOG.debug('readers =\n%s', pformat(self.poller.readers)) #IOLOG.debug('writers =\n%s', pformat(self.poller.writers)) for side, func in self.poller.poll(timeout): self._call(side.stream, func) if timer_to is not None: self.timers.expire() def _broker_exit(self): """ Forcefully call :meth:`Stream.on_disconnect` on any streams that failed to shut down gracefully, then discard the :class:`Poller`. """ for _, (side, _) in self.poller.readers + self.poller.writers: LOG.debug('%r: force disconnecting %r', self, side) side.stream.on_disconnect(self) self.poller.close() def _broker_shutdown(self): """ Invoke :meth:`Stream.on_shutdown` for every active stream, then allow up to :attr:`shutdown_timeout` seconds for the streams to unregister themselves, logging an error if any did not unregister during the grace period. """ for _, (side, _) in self.poller.readers + self.poller.writers: self._call(side.stream, side.stream.on_shutdown) deadline = now() + self.shutdown_timeout while self.keep_alive() and now() < deadline: self._loop_once(max(0, deadline - now())) if self.keep_alive(): LOG.error('%r: pending work still existed %d seconds after ' 'shutdown began. This may be due to a timer that is yet ' 'to expire, or a child connection that did not fully ' 'shut down.', self, self.shutdown_timeout) def _do_broker_main(self): """ Broker thread main function. Dispatches IO events until :meth:`shutdown` is called. """ # For Python 2.4, no way to retrieve ident except on thread. self._waker.protocol.broker_ident = thread.get_ident() try: while self._alive: self._loop_once() fire(self, 'before_shutdown') fire(self, 'shutdown') self._broker_shutdown() except Exception: e = sys.exc_info()[1] LOG.exception('broker crashed') syslog.syslog(syslog.LOG_ERR, 'broker crashed: %s' % (e,)) syslog.closelog() # prevent test 'fd leak'. self._alive = False # Ensure _alive is consistent on crash. self._exitted = True self._broker_exit() def _broker_main(self): try: _profile_hook('mitogen.broker', self._do_broker_main) finally: # 'finally' to ensure _on_broker_exit() can always SIGTERM. fire(self, 'exit') def shutdown(self): """ Request broker gracefully disconnect streams and stop. Safe to call from any thread. """ _v and LOG.debug('%r: shutting down', self) def _shutdown(): self._alive = False if self._alive and not self._exitted: self.defer(_shutdown) def join(self): """ Wait for the broker to stop, expected to be called after :meth:`shutdown`. """ self._thread.join() def __repr__(self): return 'Broker(%04x)' % (id(self) & 0xffff,) class Dispatcher(object): """ Implementation of the :data:`CALL_FUNCTION` handle for a child context. Listens on the child's main thread for messages sent by :class:`mitogen.parent.CallChain` and dispatches the function calls they describe. If a :class:`mitogen.parent.CallChain` sending a message is in pipelined mode, any exception that occurs is recorded, and causes all subsequent calls with the same `chain_id` to fail with the same exception. """ _service_recv = None def __repr__(self): return 'Dispatcher' def __init__(self, econtext): self.econtext = econtext #: Chain ID -> CallError if prior call failed. self._error_by_chain_id = {} self.recv = Receiver( router=econtext.router, handle=CALL_FUNCTION, policy=has_parent_authority, ) #: The :data:`CALL_SERVICE` :class:`Receiver` that will eventually be #: reused by :class:`mitogen.service.Pool`, should it ever be loaded. #: This is necessary for race-free reception of all service requests #: delivered regardless of whether the stub or real service pool are #: loaded. See #547 for related sorrows. Dispatcher._service_recv = Receiver( router=econtext.router, handle=CALL_SERVICE, policy=has_parent_authority, ) self._service_recv.notify = self._on_call_service listen(econtext.broker, 'shutdown', self._on_broker_shutdown) def _on_broker_shutdown(self): if self._service_recv.notify == self._on_call_service: self._service_recv.notify = None self.recv.close() @classmethod @takes_econtext def forget_chain(cls, chain_id, econtext): econtext.dispatcher._error_by_chain_id.pop(chain_id, None) def _parse_request(self, msg): data = msg.unpickle(throw=False) _v and LOG.debug('%r: dispatching %r', self, data) chain_id, modname, klass, func, args, kwargs = data obj = import_module(modname) if klass: obj = getattr(obj, klass) fn = getattr(obj, func) if getattr(fn, 'mitogen_takes_econtext', None): kwargs.setdefault('econtext', self.econtext) if getattr(fn, 'mitogen_takes_router', None): kwargs.setdefault('router', self.econtext.router) return chain_id, fn, args, kwargs def _dispatch_one(self, msg): try: chain_id, fn, args, kwargs = self._parse_request(msg) except Exception: return None, CallError(sys.exc_info()[1]) if chain_id in self._error_by_chain_id: return chain_id, self._error_by_chain_id[chain_id] try: return chain_id, fn(*args, **kwargs) except Exception: e = CallError(sys.exc_info()[1]) if chain_id is not None: self._error_by_chain_id[chain_id] = e return chain_id, e def _on_call_service(self, recv): """ Notifier for the :data:`CALL_SERVICE` receiver. This is called on the :class:`Broker` thread for any service messages arriving at this context, for as long as no real service pool implementation is loaded. In order to safely bootstrap the service pool implementation a sentinel message is enqueued on the :data:`CALL_FUNCTION` receiver in order to wake the main thread, where the importer can run without any possibility of suffering deadlock due to concurrent uses of the importer. Should the main thread be blocked indefinitely, preventing the import from ever running, if it is blocked waiting on a service call, then it means :mod:`mitogen.service` has already been imported and :func:`mitogen.service.get_or_create_pool` has already run, meaning the service pool is already active and the duplicate initialization was not needed anyway. #547: This trickery is needed to avoid the alternate option of spinning a temporary thread to import the service pool, which could deadlock if a custom import hook executing on the main thread (under the importer lock) would block waiting for some data that was in turn received by a service. Main thread import lock can't be released until service is running, service cannot satisfy request until import lock is released. """ self.recv._on_receive(Message(handle=STUB_CALL_SERVICE)) def _init_service_pool(self): import mitogen.service mitogen.service.get_or_create_pool(router=self.econtext.router) def _dispatch_calls(self): for msg in self.recv: if msg.handle == STUB_CALL_SERVICE: if msg.src_id == mitogen.context_id: self._init_service_pool() continue chain_id, ret = self._dispatch_one(msg) _v and LOG.debug('%r: %r -> %r', self, msg, ret) if msg.reply_to: msg.reply(ret) elif isinstance(ret, CallError) and chain_id is None: LOG.error('No-reply function call failed: %s', ret) def run(self): if self.econtext.config.get('on_start'): self.econtext.config['on_start'](self.econtext) _profile_hook('mitogen.child_main', self._dispatch_calls) class ExternalContext(object): """ External context implementation. This class contains the main program implementation for new children. It is responsible for setting up everything about the process environment, import hooks, standard IO redirection, logging, configuring a :class:`Router` and :class:`Broker`, and finally arranging for :class:`Dispatcher` to take over the main thread after initialization is complete. .. attribute:: broker The :class:`mitogen.core.Broker` instance. .. attribute:: context The :class:`mitogen.core.Context` instance. .. attribute:: channel The :class:`mitogen.core.Channel` over which :data:`CALL_FUNCTION` requests are received. .. attribute:: importer The :class:`mitogen.core.Importer` instance. .. attribute:: stdout_log The :class:`IoLogger` connected to :data:`sys.stdout`. .. attribute:: stderr_log The :class:`IoLogger` connected to :data:`sys.stderr`. """ detached = False def __init__(self, config): self.config = config def _on_broker_exit(self): if not self.config['profiling']: os.kill(os.getpid(), signal.SIGTERM) def _on_shutdown_msg(self, msg): if not msg.is_dead: _v and LOG.debug('shutdown request from context %d', msg.src_id) self.broker.shutdown() def _on_parent_disconnect(self): if self.detached: mitogen.parent_ids = [] mitogen.parent_id = None LOG.info('Detachment complete') else: _v and LOG.debug('parent stream is gone, dying.') self.broker.shutdown() def detach(self): self.detached = True stream = self.router.stream_by_id(mitogen.parent_id) if stream: # not double-detach()'d os.setsid() self.parent.send_await(Message(handle=DETACHING)) LOG.info('Detaching from %r; parent is %s', stream, self.parent) for x in range(20): pending = self.broker.defer_sync(stream.protocol.pending_bytes) if not pending: break time.sleep(0.05) if pending: LOG.error('Stream had %d bytes after 2000ms', pending) self.broker.defer(stream.on_disconnect, self.broker) def _setup_master(self): Router.max_message_size = self.config['max_message_size'] if self.config['profiling']: enable_profiling() self.broker = Broker(activate_compat=False) self.router = Router(self.broker) self.router.debug = self.config.get('debug', False) self.router.unidirectional = self.config['unidirectional'] self.router.add_handler( fn=self._on_shutdown_msg, handle=SHUTDOWN, policy=has_parent_authority, ) self.master = Context(self.router, 0, 'master') parent_id = self.config['parent_ids'][0] if parent_id == 0: self.parent = self.master else: self.parent = Context(self.router, parent_id, 'parent') in_fd = self.config.get('in_fd', 100) in_fp = os.fdopen(os.dup(in_fd), 'rb', 0) os.close(in_fd) out_fp = os.fdopen(os.dup(self.config.get('out_fd', 1)), 'wb', 0) self.stream = MitogenProtocol.build_stream( self.router, parent_id, local_id=self.config['context_id'], parent_ids=self.config['parent_ids'] ) self.stream.accept(in_fp, out_fp) self.stream.name = 'parent' self.stream.receive_side.keep_alive = False listen(self.stream, 'disconnect', self._on_parent_disconnect) listen(self.broker, 'exit', self._on_broker_exit) def _reap_first_stage(self): try: os.wait() # Reap first stage. except OSError: pass # No first stage exists (e.g. fakessh) def _setup_logging(self): self.log_handler = LogHandler(self.master) root = logging.getLogger() root.setLevel(self.config['log_level']) root.handlers = [self.log_handler] if self.config['debug']: enable_debug_logging() def _setup_importer(self): importer = self.config.get('importer') if importer: importer._install_handler(self.router) importer._context = self.parent else: core_src_fd = self.config.get('core_src_fd', 101) if core_src_fd: fp = os.fdopen(core_src_fd, 'rb', 0) try: core_src = fp.read() # Strip "ExternalContext.main()" call from last line. core_src = b('\n').join(core_src.splitlines()[:-1]) finally: fp.close() else: core_src = None importer = Importer( self.router, self.parent, core_src, self.config.get('whitelist', ()), self.config.get('blacklist', ()), ) self.importer = importer self.router.importer = importer sys.meta_path.insert(0, self.importer) def _setup_package(self): global mitogen mitogen = types.ModuleType('mitogen') mitogen.__package__ = 'mitogen' mitogen.__path__ = [] mitogen.__loader__ = self.importer mitogen.main = lambda *args, **kwargs: (lambda func: None) mitogen.core = sys.modules['__main__'] mitogen.core.__file__ = 'x/mitogen/core.py' # For inspect.getsource() mitogen.core.__loader__ = self.importer sys.modules['mitogen'] = mitogen sys.modules['mitogen.core'] = mitogen.core del sys.modules['__main__'] def _setup_globals(self): mitogen.is_master = False mitogen.__version__ = self.config['version'] mitogen.context_id = self.config['context_id'] mitogen.parent_ids = self.config['parent_ids'][:] mitogen.parent_id = mitogen.parent_ids[0] def _nullify_stdio(self): """ Open /dev/null to replace stdio temporarily. In case of odd startup, assume we may be allocated a standard handle. """ for stdfd, mode in ((0, os.O_RDONLY), (1, os.O_RDWR), (2, os.O_RDWR)): fd = os.open('/dev/null', mode) if fd != stdfd: os.dup2(fd, stdfd) os.close(fd) def _preserve_tty_fp(self): """ #481: when stderr is a TTY due to being started via tty_create_child() or hybrid_tty_create_child(), and some privilege escalation tool like prehistoric versions of sudo exec this process over the top of itself, there is nothing left to keep the slave PTY open after we replace our stdio. Therefore if stderr is a TTY, keep around a permanent dup() to avoid receiving SIGHUP. """ try: if os.isatty(2): self.reserve_tty_fp = os.fdopen(os.dup(2), 'r+b', 0) set_cloexec(self.reserve_tty_fp.fileno()) except OSError: pass def _setup_stdio(self): self._preserve_tty_fp() # When sys.stdout was opened by the runtime, overwriting it will not # close FD 1. However when forking from a child that previously used # fdopen(), overwriting it /will/ close FD 1. So we must swallow the # close before IoLogger overwrites FD 1, otherwise its new FD 1 will be # clobbered. Additionally, stdout must be replaced with /dev/null prior # to stdout.close(), since if block buffering was active in the parent, # any pre-fork buffered data will be flushed on close(), corrupting the # connection to the parent. self._nullify_stdio() sys.stdout.close() self._nullify_stdio() self.loggers = [] for name, fd in (('stdout', 1), ('stderr', 2)): log = IoLoggerProtocol.build_stream(name, fd) self.broker.start_receive(log) self.loggers.append(log) # Reopen with line buffering. sys.stdout = os.fdopen(1, 'w', 1) def main(self): self._setup_master() try: try: self._setup_logging() self._setup_importer() self._reap_first_stage() if self.config.get('setup_package', True): self._setup_package() self._setup_globals() if self.config.get('setup_stdio', True): self._setup_stdio() self.dispatcher = Dispatcher(self) self.router.register(self.parent, self.stream) self.router._setup_logging() _v and LOG.debug('Python version is %s', sys.version) _v and LOG.debug('Parent is context %r (%s); my ID is %r', self.parent.context_id, self.parent.name, mitogen.context_id) _v and LOG.debug('pid:%r ppid:%r uid:%r/%r, gid:%r/%r host:%r', os.getpid(), os.getppid(), os.geteuid(), os.getuid(), os.getegid(), os.getgid(), socket.gethostname()) sys.executable = os.environ.pop('ARGV0', sys.executable) _v and LOG.debug('Recovered sys.executable: %r', sys.executable) if self.config.get('send_ec2', True): self.stream.transmit_side.write(b('MITO002\n')) self.broker._py24_25_compat() self.log_handler.uncork() self.dispatcher.run() _v and LOG.debug('ExternalContext.main() normal exit') except KeyboardInterrupt: LOG.debug('KeyboardInterrupt received, exiting gracefully.') except BaseException: LOG.exception('ExternalContext.main() crashed') raise finally: self.broker.shutdown() mitogen-0.3.9/mitogen/debug.py000066400000000000000000000150531465666473100163150ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # !mitogen: minify_safe """ Basic signal handler for dumping thread stacks. """ import difflib import logging import os import gc import signal import sys import threading import time import traceback import mitogen.core import mitogen.parent LOG = logging.getLogger(__name__) _last = None def enable_evil_interrupts(): signal.signal(signal.SIGALRM, (lambda a, b: None)) signal.setitimer(signal.ITIMER_REAL, 0.01, 0.01) def disable_evil_interrupts(): signal.setitimer(signal.ITIMER_REAL, 0, 0) def _hex(n): return '%08x' % n def get_subclasses(klass): """ Rather than statically import every interesting subclass, forcing it all to be transferred and potentially disrupting the debugged environment, enumerate only those loaded in memory. Also returns the original class. """ stack = [klass] seen = set() while stack: klass = stack.pop() seen.add(klass) stack.extend(klass.__subclasses__()) return seen def get_routers(): return dict( (_hex(id(router)), router) for klass in get_subclasses(mitogen.core.Router) for router in gc.get_referrers(klass) if isinstance(router, mitogen.core.Router) ) def get_router_info(): return { 'routers': dict( (id_, { 'id': id_, 'streams': len(set(router._stream_by_id.values())), 'contexts': len(set(router._context_by_id.values())), 'handles': len(router._handle_map), }) for id_, router in get_routers().items() ) } def get_stream_info(router_id): router = get_routers().get(router_id) return { 'streams': dict( (_hex(id(stream)), ({ 'name': stream.name, 'remote_id': stream.remote_id, 'sent_module_count': len(getattr(stream, 'sent_modules', [])), 'routes': sorted(getattr(stream, 'routes', [])), 'type': type(stream).__module__, })) for via_id, stream in router._stream_by_id.items() ) } def format_stacks(): name_by_id = dict( (t.ident, t.name) for t in threading.enumerate() ) l = ['', ''] for threadId, stack in sys._current_frames().items(): l += ["# PID %d ThreadID: (%s) %s; %r" % ( os.getpid(), name_by_id.get(threadId, ''), threadId, stack, )] #stack = stack.f_back.f_back for filename, lineno, name, line in traceback.extract_stack(stack): l += [ 'File: "%s", line %d, in %s' % ( filename, lineno, name ) ] if line: l += [' ' + line.strip()] l += [''] l += ['', ''] return '\n'.join(l) def get_snapshot(): global _last s = format_stacks() snap = s if _last: snap += '\n' diff = list(difflib.unified_diff( a=_last.splitlines(), b=s.splitlines(), fromfile='then', tofile='now' )) if diff: snap += '\n'.join(diff) + '\n' else: snap += '(no change since last time)\n' _last = s return snap def _handler(*_): fp = open('/dev/tty', 'w', 1) fp.write(get_snapshot()) fp.close() def install_handler(): signal.signal(signal.SIGUSR2, _handler) def _logging_main(secs): while True: time.sleep(secs) LOG.info('PERIODIC THREAD DUMP\n\n%s', get_snapshot()) def dump_to_logger(secs=5): th = threading.Thread( target=_logging_main, kwargs={'secs': secs}, name='mitogen.debug.dump_to_logger', ) th.setDaemon(True) th.start() class ContextDebugger(object): @classmethod @mitogen.core.takes_econtext def _configure_context(cls, econtext): mitogen.parent.upgrade_router(econtext) econtext.debugger = cls(econtext.router) def __init__(self, router): self.router = router self.router.add_handler( func=self._on_debug_msg, handle=mitogen.core.DEBUG, persist=True, policy=mitogen.core.has_parent_authority, ) mitogen.core.listen(router, 'register', self._on_stream_register) LOG.debug('Context debugging configured.') def _on_stream_register(self, context, stream): LOG.debug('_on_stream_register: sending configure() to %r', stream) context.call_async(ContextDebugger._configure_context) def _on_debug_msg(self, msg): if msg != mitogen.core._DEAD: threading.Thread( target=self._handle_debug_msg, name='ContextDebuggerHandler', args=(msg,) ).start() def _handle_debug_msg(self, msg): try: method, args, kwargs = msg.unpickle() msg.reply(getattr(self, method)(*args, **kwargs)) except Exception: e = sys.exc_info()[1] msg.reply(mitogen.core.CallError(e)) mitogen-0.3.9/mitogen/doas.py000066400000000000000000000115361465666473100161570ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # !mitogen: minify_safe import logging import re import mitogen.core import mitogen.parent LOG = logging.getLogger(__name__) password_incorrect_msg = 'doas password is incorrect' password_required_msg = 'doas password is required' class PasswordError(mitogen.core.StreamError): pass class Options(mitogen.parent.Options): username = u'root' password = None doas_path = 'doas' password_prompt = u'Password:' incorrect_prompts = ( u'doas: authentication failed', # slicer69/doas u'doas: Authorization failed', # openbsd/src ) def __init__(self, username=None, password=None, doas_path=None, password_prompt=None, incorrect_prompts=None, **kwargs): super(Options, self).__init__(**kwargs) if username is not None: self.username = mitogen.core.to_text(username) if password is not None: self.password = mitogen.core.to_text(password) if doas_path is not None: self.doas_path = doas_path if password_prompt is not None: self.password_prompt = mitogen.core.to_text(password_prompt) if incorrect_prompts is not None: self.incorrect_prompts = [ mitogen.core.to_text(p) for p in incorrect_prompts ] class BootstrapProtocol(mitogen.parent.RegexProtocol): password_sent = False def setup_patterns(self, conn): prompt_pattern = re.compile( re.escape(conn.options.password_prompt).encode('utf-8'), re.I ) incorrect_prompt_pattern = re.compile( u'|'.join( re.escape(s) for s in conn.options.incorrect_prompts ).encode('utf-8'), re.I ) self.PATTERNS = [ (incorrect_prompt_pattern, type(self)._on_incorrect_password), ] self.PARTIAL_PATTERNS = [ (prompt_pattern, type(self)._on_password_prompt), ] def _on_incorrect_password(self, line, match): if self.password_sent: self.stream.conn._fail_connection( PasswordError(password_incorrect_msg) ) def _on_password_prompt(self, line, match): if self.stream.conn.options.password is None: self.stream.conn._fail_connection( PasswordError(password_required_msg) ) return if self.password_sent: self.stream.conn._fail_connection( PasswordError(password_incorrect_msg) ) return LOG.debug('sending password') self.stream.transmit_side.write( (self.stream.conn.options.password + '\n').encode('utf-8') ) self.password_sent = True class Connection(mitogen.parent.Connection): options_class = Options diag_protocol_class = BootstrapProtocol create_child = staticmethod(mitogen.parent.hybrid_tty_create_child) child_is_immediate_subprocess = False def _get_name(self): return u'doas.' + self.options.username def stderr_stream_factory(self): stream = super(Connection, self).stderr_stream_factory() stream.protocol.setup_patterns(self) return stream def get_boot_command(self): bits = [self.options.doas_path, '-u', self.options.username, '--'] return bits + super(Connection, self).get_boot_command() mitogen-0.3.9/mitogen/docker.py000066400000000000000000000060151465666473100164740ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # !mitogen: minify_safe import logging import mitogen.core import mitogen.parent LOG = logging.getLogger(__name__) class Options(mitogen.parent.Options): container = None image = None username = None docker_path = u'docker' def __init__(self, container=None, image=None, docker_path=None, username=None, **kwargs): super(Options, self).__init__(**kwargs) assert container or image if container: self.container = mitogen.core.to_text(container) if image: self.image = mitogen.core.to_text(image) if docker_path: self.docker_path = mitogen.core.to_text(docker_path) if username: self.username = mitogen.core.to_text(username) class Connection(mitogen.parent.Connection): options_class = Options child_is_immediate_subprocess = False # TODO: better way of capturing errors such as "No such container." create_child_args = { 'merge_stdio': True } def _get_name(self): return u'docker.' + (self.options.container or self.options.image) def get_boot_command(self): args = ['--interactive'] if self.options.username: args += ['--user=' + self.options.username] bits = [self.options.docker_path] if self.options.container: bits += ['exec'] + args + [self.options.container] elif self.options.image: bits += ['run'] + args + ['--rm', self.options.image] return bits + super(Connection, self).get_boot_command() mitogen-0.3.9/mitogen/fakessh.py000066400000000000000000000363311465666473100166550ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # !mitogen: minify_safe """ :mod:`mitogen.fakessh` is a stream implementation that starts a subprocess with its environment modified such that ``PATH`` searches for `ssh` return a Mitogen implementation of SSH. When invoked, this implementation arranges for the command line supplied by the caller to be executed in a remote context, reusing the parent context's (possibly proxied) connection to that remote context. This allows tools like `rsync` and `scp` to transparently reuse the connections and tunnels already established by the host program to connect to a target machine, without wasteful redundant SSH connection setup, 3-way handshakes, or firewall hopping configurations, and enables these tools to be used in impossible scenarios, such as over `sudo` with ``requiretty`` enabled. The fake `ssh` command source is written to a temporary file on disk, and consists of a copy of the :py:mod:`mitogen.core` source code (just like any other child context), with a line appended to cause it to connect back to the host process over an FD it inherits. As there is no reliance on an existing filesystem file, it is possible for child contexts to use fakessh. As a consequence of connecting back through an inherited FD, only one SSH invocation is possible, which is fine for tools like `rsync`, however in future this restriction will be lifted. Sequence: 1. ``fakessh`` Context and Stream created by parent context. The stream's buffer has a :py:func:`_fakessh_main` :py:data:`CALL_FUNCTION ` enqueued. 2. Target program (`rsync/scp/sftp`) invoked, which internally executes `ssh` from ``PATH``. 3. :py:mod:`mitogen.core` bootstrap begins, recovers the stream FD inherited via the target program, established itself as the fakessh context. 4. :py:func:`_fakessh_main` :py:data:`CALL_FUNCTION ` is read by fakessh context, a. sets up :py:class:`IoPump` for stdio, registers stdin_handle for local context. b. Enqueues :py:data:`CALL_FUNCTION ` for :py:func:`_start_slave` invoked in target context, i. the program from the `ssh` command line is started ii. sets up :py:class:`IoPump` for `ssh` command line process's stdio pipes iii. returns `(control_handle, stdin_handle)` to :py:func:`_fakessh_main` 5. :py:func:`_fakessh_main` receives control/stdin handles from from :py:func:`_start_slave`, a. registers remote's stdin_handle with local :py:class:`IoPump`. b. sends `("start", local_stdin_handle)` to remote's control_handle c. registers local :py:class:`IoPump` with :py:class:`mitogen.core.Broker`. d. loops waiting for `local stdout closed && remote stdout closed` 6. :py:func:`_start_slave` control channel receives `("start", stdin_handle)`, a. registers remote's stdin_handle with local :py:class:`IoPump` b. registers local :py:class:`IoPump` with :py:class:`mitogen.core.Broker`. c. loops waiting for `local stdout closed && remote stdout closed` """ import getopt import inspect import os import shutil import socket import subprocess import sys import tempfile import threading import mitogen.core import mitogen.parent from mitogen.core import LOG, IOLOG SSH_GETOPTS = ( "1246ab:c:e:fgi:kl:m:no:p:qstvx" "ACD:E:F:I:KL:MNO:PQ:R:S:TVw:W:XYy" ) _mitogen = None class IoPump(mitogen.core.Protocol): _output_buf = '' _closed = False def __init__(self, broker): self._broker = broker def write(self, s): self._output_buf += s self._broker._start_transmit(self) def close(self): self._closed = True # If local process hasn't exitted yet, ensure its write buffer is # drained before lazily triggering disconnect in on_transmit. if self.transmit_side.fp.fileno() is not None: self._broker._start_transmit(self) def on_shutdown(self, stream, broker): self.close() def on_transmit(self, stream, broker): written = self.transmit_side.write(self._output_buf) IOLOG.debug('%r.on_transmit() -> len %r', self, written) if written is None: self.on_disconnect(broker) else: self._output_buf = self._output_buf[written:] if not self._output_buf: broker._stop_transmit(self) if self._closed: self.on_disconnect(broker) def on_receive(self, stream, broker): s = stream.receive_side.read() IOLOG.debug('%r.on_receive() -> len %r', self, len(s)) if s: mitogen.core.fire(self, 'receive', s) else: self.on_disconnect(broker) def __repr__(self): return 'IoPump(%r, %r)' % ( self.receive_side.fp.fileno(), self.transmit_side.fp.fileno(), ) class Process(object): """ Manages the lifetime and pipe connections of the SSH command running in the slave. """ def __init__(self, router, stdin, stdout, proc=None): self.router = router self.stdin = stdin self.stdout = stdout self.proc = proc self.control_handle = router.add_handler(self._on_control) self.stdin_handle = router.add_handler(self._on_stdin) self.pump = IoPump.build_stream(router.broker) self.pump.accept(stdin, stdout) self.stdin = None self.control = None self.wake_event = threading.Event() mitogen.core.listen(self.pump, 'disconnect', self._on_pump_disconnect) mitogen.core.listen(self.pump, 'receive', self._on_pump_receive) if proc: pmon = mitogen.parent.ProcessMonitor.instance() pmon.add(proc.pid, self._on_proc_exit) def __repr__(self): return 'Process(%r, %r)' % (self.stdin, self.stdout) def _on_proc_exit(self, status): LOG.debug('%r._on_proc_exit(%r)', self, status) self.control.put(('exit', status)) def _on_stdin(self, msg): if msg.is_dead: IOLOG.debug('%r._on_stdin() -> %r', self, msg) self.pump.protocol.close() return data = msg.unpickle() IOLOG.debug('%r._on_stdin() -> len %d', self, len(data)) self.pump.protocol.write(data) def _on_control(self, msg): if not msg.is_dead: command, arg = msg.unpickle(throw=False) LOG.debug('%r._on_control(%r, %s)', self, command, arg) func = getattr(self, '_on_%s' % (command,), None) if func: return func(msg, arg) LOG.warning('%r: unknown command %r', self, command) def _on_start(self, msg, arg): dest = mitogen.core.Context(self.router, msg.src_id) self.control = mitogen.core.Sender(dest, arg[0]) self.stdin = mitogen.core.Sender(dest, arg[1]) self.router.broker.start_receive(self.pump) def _on_exit(self, msg, arg): LOG.debug('on_exit: proc = %r', self.proc) if self.proc: self.proc.terminate() else: self.router.broker.shutdown() def _on_pump_receive(self, s): IOLOG.info('%r._on_pump_receive(len %d)', self, len(s)) self.stdin.put(s) def _on_pump_disconnect(self): LOG.debug('%r._on_pump_disconnect()', self) mitogen.core.fire(self, 'disconnect') self.stdin.close() self.wake_event.set() def start_master(self, stdin, control): self.stdin = stdin self.control = control control.put(('start', (self.control_handle, self.stdin_handle))) self.router.broker.start_receive(self.pump) def wait(self): while not self.wake_event.isSet(): # Timeout is used so that sleep is interruptible, as blocking # variants of libc thread operations cannot be interrupted e.g. via # KeyboardInterrupt. isSet() test and wait() are separate since in # <2.7 wait() always returns None. self.wake_event.wait(0.1) @mitogen.core.takes_router def _start_slave(src_id, cmdline, router): """ This runs in the target context, it is invoked by _fakessh_main running in the fakessh context immediately after startup. It starts the slave process (the the point where it has a stdin_handle to target but not stdout_chan to write to), and waits for main to. """ LOG.debug('_start_slave(%r, %r)', router, cmdline) proc = subprocess.Popen( cmdline, # SSH server always uses user's shell. shell=True, # SSH server always executes new commands in the user's HOME. cwd=os.path.expanduser('~'), stdin=subprocess.PIPE, stdout=subprocess.PIPE, ) process = Process(router, proc.stdin, proc.stdout, proc) return process.control_handle, process.stdin_handle # # SSH client interface. # def exit(): _mitogen.broker.shutdown() def die(msg, *args): if args: msg %= args sys.stderr.write('%s\n' % (msg,)) exit() def parse_args(): hostname = None remain = sys.argv[1:] allopts = [] restarted = 0 while remain and restarted < 2: opts, args = getopt.getopt(remain, SSH_GETOPTS) remain = remain[:] # getopt bug! allopts += opts if not args: break if not hostname: hostname = args.pop(0) remain = remain[remain.index(hostname) + 1:] restarted += 1 return hostname, allopts, args @mitogen.core.takes_econtext def _fakessh_main(dest_context_id, econtext): hostname, opts, args = parse_args() if not hostname: die('Missing hostname') subsystem = False for opt, optarg in opts: if opt == '-s': subsystem = True else: LOG.debug('Warning option %s %s is ignored.', opt, optarg) LOG.debug('hostname: %r', hostname) LOG.debug('opts: %r', opts) LOG.debug('args: %r', args) if subsystem: die('-s is not yet supported') if not args: die('fakessh: login mode not supported and no command specified') dest = mitogen.parent.Context(econtext.router, dest_context_id) # Even though SSH receives an argument vector, it still cats the vector # together before sending to the server, the server just uses /bin/sh -c to # run the command. We must remain puke-for-puke compatible. control_handle, stdin_handle = dest.call(_start_slave, mitogen.context_id, ' '.join(args)) LOG.debug('_fakessh_main: received control_handle=%r, stdin_handle=%r', control_handle, stdin_handle) process = Process(econtext.router, stdin=os.fdopen(1, 'w+b', 0), stdout=os.fdopen(0, 'r+b', 0)) process.start_master( stdin=mitogen.core.Sender(dest, stdin_handle), control=mitogen.core.Sender(dest, control_handle), ) process.wait() process.control.put(('exit', None)) def _get_econtext_config(context, sock2): parent_ids = mitogen.parent_ids[:] parent_ids.insert(0, mitogen.context_id) return { 'context_id': context.context_id, 'core_src_fd': None, 'debug': getattr(context.router, 'debug', False), 'in_fd': sock2.fileno(), 'log_level': mitogen.parent.get_log_level(), 'max_message_size': context.router.max_message_size, 'out_fd': sock2.fileno(), 'parent_ids': parent_ids, 'profiling': getattr(context.router, 'profiling', False), 'unidirectional': getattr(context.router, 'unidirectional', False), 'setup_stdio': False, 'version': mitogen.__version__, } # # Public API. # @mitogen.core.takes_econtext @mitogen.core.takes_router def run(dest, router, args, deadline=None, econtext=None): """ Run the command specified by `args` such that ``PATH`` searches for SSH by the command will cause its attempt to use SSH to execute a remote program to be redirected to use mitogen to execute that program using the context `dest` instead. :param list args: Argument vector. :param mitogen.core.Context dest: The destination context to execute the SSH command line in. :param mitogen.core.Router router: :param list[str] args: Command line arguments for local program, e.g. ``['rsync', '/tmp', 'remote:/tmp']`` :returns: Exit status of the child process. """ if econtext is not None: mitogen.parent.upgrade_router(econtext) context_id = router.allocate_id() fakessh = mitogen.parent.Context(router, context_id) fakessh.name = u'fakessh.%d' % (context_id,) sock1, sock2 = socket.socketpair() stream = mitogen.core.Stream(router, context_id) stream.name = u'fakessh' stream.accept(sock1, sock1) router.register(fakessh, stream) # Held in socket buffer until process is booted. fakessh.call_async(_fakessh_main, dest.context_id) tmp_path = tempfile.mkdtemp(prefix='mitogen_fakessh') try: ssh_path = os.path.join(tmp_path, 'ssh') fp = open(ssh_path, 'w') try: fp.write('#!%s\n' % (mitogen.parent.get_sys_executable(),)) fp.write(inspect.getsource(mitogen.core)) fp.write('\n') fp.write('ExternalContext(%r).main()\n' % ( _get_econtext_config(econtext, sock2), )) finally: fp.close() os.chmod(ssh_path, int('0755', 8)) env = os.environ.copy() env.update({ 'PATH': '%s:%s' % (tmp_path, env.get('PATH', '')), 'ARGV0': mitogen.parent.get_sys_executable(), 'SSH_PATH': ssh_path, }) proc = subprocess.Popen(args, env=env) return proc.wait() finally: shutil.rmtree(tmp_path) mitogen-0.3.9/mitogen/fork.py000066400000000000000000000203641465666473100161710ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # !mitogen: minify_safe import errno import logging import os import random import sys import threading import traceback import mitogen.core import mitogen.parent from mitogen.core import b LOG = logging.getLogger(__name__) # Python 2.4/2.5 cannot support fork+threads whatsoever, it doesn't even fix up # interpreter state. So 2.4/2.5 interpreters start .local() contexts for # isolation instead. Since we don't have any crazy memory sharing problems to # avoid, there is no virginal fork parent either. The child is started directly # from the login/become process. In future this will be default everywhere, # fork is brainwrong from the stone age. FORK_SUPPORTED = sys.version_info >= (2, 6) class Error(mitogen.core.StreamError): pass def fixup_prngs(): """ Add 256 bits of /dev/urandom to OpenSSL's PRNG in the child, and re-seed the random package with the same data. """ s = os.urandom(256 // 8) random.seed(s) if 'ssl' in sys.modules: sys.modules['ssl'].RAND_add(s, 75.0) def reset_logging_framework(): """ After fork, ensure any logging.Handler locks are recreated, as a variety of threads in the parent may have been using the logging package at the moment of fork. It is not possible to solve this problem in general; see :gh:issue:`150` for a full discussion. """ logging._lock = threading.RLock() # The root logger does not appear in the loggerDict. logging.Logger.manager.loggerDict = {} logging.getLogger().handlers = [] def on_fork(): """ Should be called by any program integrating Mitogen each time the process is forked, in the context of the new child. """ reset_logging_framework() # Must be first! fixup_prngs() mitogen.core.Latch._on_fork() mitogen.core.Side._on_fork() mitogen.core.ExternalContext.service_stub_lock = threading.Lock() mitogen__service = sys.modules.get('mitogen.service') if mitogen__service: mitogen__service._pool_lock = threading.Lock() def handle_child_crash(): """ Respond to _child_main() crashing by ensuring the relevant exception is logged to /dev/tty. """ tty = open('/dev/tty', 'wb') tty.write('\n\nFORKED CHILD PID %d CRASHED\n%s\n\n' % ( os.getpid(), traceback.format_exc(), )) tty.close() os._exit(1) def _convert_exit_status(status): """ Convert a :func:`os.waitpid`-style exit status to a :mod:`subprocess` style exit status. """ if os.WIFEXITED(status): return os.WEXITSTATUS(status) elif os.WIFSIGNALED(status): return -os.WTERMSIG(status) elif os.WIFSTOPPED(status): return -os.WSTOPSIG(status) class Process(mitogen.parent.Process): def poll(self): try: pid, status = os.waitpid(self.pid, os.WNOHANG) except OSError: e = sys.exc_info()[1] if e.args[0] == errno.ECHILD: LOG.warn('%r: waitpid(%r) produced ECHILD', self, self.pid) return raise if not pid: return return _convert_exit_status(status) class Options(mitogen.parent.Options): #: Reference to the importer, if any, recovered from the parent. importer = None #: User-supplied function for cleaning up child process state. on_fork = None def __init__(self, old_router, max_message_size, on_fork=None, debug=False, profiling=False, unidirectional=False, on_start=None, name=None): if not FORK_SUPPORTED: raise Error(self.python_version_msg) # fork method only supports a tiny subset of options. super(Options, self).__init__( max_message_size=max_message_size, debug=debug, profiling=profiling, unidirectional=unidirectional, name=name, ) self.on_fork = on_fork self.on_start = on_start responder = getattr(old_router, 'responder', None) if isinstance(responder, mitogen.parent.ModuleForwarder): self.importer = responder.importer class Connection(mitogen.parent.Connection): options_class = Options child_is_immediate_subprocess = True python_version_msg = ( "The mitogen.fork method is not supported on Python versions " "prior to 2.6, since those versions made no attempt to repair " "critical interpreter state following a fork. Please use the " "local() method instead." ) name_prefix = u'fork' def start_child(self): parentfp, childfp = mitogen.parent.create_socketpair() pid = os.fork() if pid: childfp.close() return Process(pid, stdin=parentfp, stdout=parentfp) else: parentfp.close() self._wrap_child_main(childfp) def _wrap_child_main(self, childfp): try: self._child_main(childfp) except BaseException: handle_child_crash() def get_econtext_config(self): config = super(Connection, self).get_econtext_config() config['core_src_fd'] = None config['importer'] = self.options.importer config['send_ec2'] = False config['setup_package'] = False if self.options.on_start: config['on_start'] = self.options.on_start return config def _child_main(self, childfp): on_fork() if self.options.on_fork: self.options.on_fork() mitogen.core.set_block(childfp.fileno()) childfp.send(b('MITO002\n')) # Expected by the ExternalContext.main(). os.dup2(childfp.fileno(), 1) os.dup2(childfp.fileno(), 100) # Overwritten by ExternalContext.main(); we must replace the # parent-inherited descriptors that were closed by Side._on_fork() to # avoid ExternalContext.main() accidentally allocating new files over # the standard handles. os.dup2(childfp.fileno(), 0) # Avoid corrupting the stream on fork crash by dupping /dev/null over # stderr. Instead, handle_child_crash() uses /dev/tty to log errors. devnull = os.open('/dev/null', os.O_WRONLY) if devnull != 2: os.dup2(devnull, 2) os.close(devnull) # If we're unlucky, childfp.fileno() may coincidentally be one of our # desired FDs. In that case closing it breaks ExternalContext.main(). if childfp.fileno() not in (0, 1, 100): childfp.close() mitogen.core.IOLOG.setLevel(logging.INFO) try: try: mitogen.core.ExternalContext(self.get_econtext_config()).main() except Exception: # TODO: report exception somehow. os._exit(72) finally: # Don't trigger atexit handlers, they were copied from the parent. os._exit(0) mitogen-0.3.9/mitogen/jail.py000066400000000000000000000047511465666473100161510ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # !mitogen: minify_safe import mitogen.core import mitogen.parent class Options(mitogen.parent.Options): container = None username = None jexec_path = u'/usr/sbin/jexec' def __init__(self, container, jexec_path=None, username=None, **kwargs): super(Options, self).__init__(**kwargs) self.container = mitogen.core.to_text(container) if username: self.username = mitogen.core.to_text(username) if jexec_path: self.jexec_path = jexec_path class Connection(mitogen.parent.Connection): options_class = Options child_is_immediate_subprocess = False create_child_args = { 'merge_stdio': True } def _get_name(self): return u'jail.' + self.options.container def get_boot_command(self): bits = [self.options.jexec_path] if self.options.username: bits += ['-U', self.options.username] bits += [self.options.container] return bits + super(Connection, self).get_boot_command() mitogen-0.3.9/mitogen/kubectl.py000066400000000000000000000050011465666473100166500ustar00rootroot00000000000000# Copyright 2018, Yannig Perre # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # !mitogen: minify_safe import mitogen.parent class Options(mitogen.parent.Options): pod = None kubectl_path = 'kubectl' kubectl_args = None def __init__(self, pod, kubectl_path=None, kubectl_args=None, **kwargs): super(Options, self).__init__(**kwargs) assert pod self.pod = pod if kubectl_path: self.kubectl_path = kubectl_path self.kubectl_args = kubectl_args or [] class Connection(mitogen.parent.Connection): options_class = Options child_is_immediate_subprocess = True # TODO: better way of capturing errors such as "No such container." create_child_args = { 'merge_stdio': True } def _get_name(self): return u'kubectl.%s%s' % (self.options.pod, self.options.kubectl_args) def get_boot_command(self): bits = [ self.options.kubectl_path ] + self.options.kubectl_args + [ 'exec', '-it', self.options.pod ] return bits + ["--"] + super(Connection, self).get_boot_command() mitogen-0.3.9/mitogen/lxc.py000066400000000000000000000054451465666473100160210ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # !mitogen: minify_safe import mitogen.parent class Options(mitogen.parent.Options): container = None lxc_attach_path = 'lxc-attach' def __init__(self, container, lxc_attach_path=None, **kwargs): super(Options, self).__init__(**kwargs) self.container = container if lxc_attach_path: self.lxc_attach_path = lxc_attach_path class Connection(mitogen.parent.Connection): options_class = Options child_is_immediate_subprocess = False create_child_args = { # If lxc-attach finds any of stdin, stdout, stderr connected to a TTY, # to prevent input injection it creates a proxy pty, forcing all IO to # be buffered in <4KiB chunks. So ensure stderr is also routed to the # socketpair. 'merge_stdio': True } eof_error_hint = ( 'Note: many versions of LXC do not report program execution failure ' 'meaningfully. Please check the host logs (/var/log) for more ' 'information.' ) def _get_name(self): return u'lxc.' + self.options.container def get_boot_command(self): bits = [ self.options.lxc_attach_path, '--clear-env', '--name', self.options.container, '--', ] return bits + super(Connection, self).get_boot_command() mitogen-0.3.9/mitogen/lxd.py000066400000000000000000000054341465666473100160200ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # !mitogen: minify_safe import mitogen.parent class Options(mitogen.parent.Options): container = None lxc_path = 'lxc' python_path = 'python' def __init__(self, container, lxc_path=None, **kwargs): super(Options, self).__init__(**kwargs) self.container = container if lxc_path: self.lxc_path = lxc_path class Connection(mitogen.parent.Connection): options_class = Options child_is_immediate_subprocess = False create_child_args = { # If lxc finds any of stdin, stdout, stderr connected to a TTY, to # prevent input injection it creates a proxy pty, forcing all IO to be # buffered in <4KiB chunks. So ensure stderr is also routed to the # socketpair. 'merge_stdio': True } eof_error_hint = ( 'Note: many versions of LXC do not report program execution failure ' 'meaningfully. Please check the host logs (/var/log) for more ' 'information.' ) def _get_name(self): return u'lxd.' + self.options.container def get_boot_command(self): bits = [ self.options.lxc_path, 'exec', '--mode=noninteractive', self.options.container, '--', ] return bits + super(Connection, self).get_boot_command() mitogen-0.3.9/mitogen/master.py000066400000000000000000001534601465666473100165270ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # !mitogen: minify_safe """ This module implements functionality required by master processes, such as starting new contexts via SSH. Its size is also restricted, since it must be sent to any context that will be used to establish additional child contexts. """ import dis import errno import inspect import itertools import logging import os import pkgutil import re import string import sys import threading import types import zlib try: # Python >= 3.4, PEP 451 ModuleSpec API import importlib.machinery import importlib.util from _imp import is_builtin as _is_builtin except ImportError: # Python < 3.4, PEP 302 Import Hooks import imp from imp import is_builtin as _is_builtin try: import sysconfig except ImportError: sysconfig = None if not hasattr(pkgutil, 'find_loader'): # find_loader() was new in >=2.5, but the modern pkgutil.py syntax has # been kept intentionally 2.3 compatible so we can reuse it. from mitogen.compat import pkgutil import mitogen import mitogen.core import mitogen.minify import mitogen.parent from mitogen.core import b from mitogen.core import IOLOG from mitogen.core import LOG from mitogen.core import str_partition from mitogen.core import str_rpartition from mitogen.core import to_text imap = getattr(itertools, 'imap', map) izip = getattr(itertools, 'izip', zip) try: any except NameError: from mitogen.core import any try: next except NameError: from mitogen.core import next RLOG = logging.getLogger('mitogen.ctx') # there are some cases where modules are loaded in memory only, such as # ansible collections, and the module "filename" doesn't actually exist SPECIAL_FILE_PATHS = { "__synthetic__", "" } def _stdlib_paths(): """ Return a set of paths from which Python imports the standard library. """ attr_candidates = [ 'prefix', 'real_prefix', # virtualenv: only set inside a virtual environment. 'base_prefix', # venv: always set, equal to prefix if outside. ] prefixes = (getattr(sys, a, None) for a in attr_candidates) version = 'python%s.%s' % sys.version_info[0:2] s = set(os.path.realpath(os.path.join(p, 'lib', version)) for p in prefixes if p is not None) # When running 'unit2 tests/module_finder_test.py' in a Py2 venv on Ubuntu # 18.10, above is insufficient to catch the real directory. if sysconfig is not None: s.add(sysconfig.get_config_var('DESTLIB')) return s def is_stdlib_name(modname): """ Return :data:`True` if `modname` appears to come from the standard library. """ # `(_imp|imp).is_builtin()` isn't a documented part of Python's stdlib. # Returns 1 if modname names a module that is "builtin" to the the Python # interpreter (e.g. '_sre'). Otherwise 0 (e.g. 're', 'netifaces'). # # """ # Main is a little special - imp.is_builtin("__main__") will return False, # but BuiltinImporter is still the most appropriate initial setting for # its __loader__ attribute. # """ -- comment in CPython pylifecycle.c:add_main_module() if _is_builtin(modname) != 0: return True module = sys.modules.get(modname) if module is None: return False # six installs crap with no __file__ modpath = os.path.abspath(getattr(module, '__file__', '')) return is_stdlib_path(modpath) _STDLIB_PATHS = _stdlib_paths() def is_stdlib_path(path): return any( os.path.commonprefix((libpath, path)) == libpath and 'site-packages' not in path and 'dist-packages' not in path for libpath in _STDLIB_PATHS ) def get_child_modules(path, fullname): """ Return the suffixes of submodules directly neated beneath of the package directory at `path`. :param str path: Path to the module's source code on disk, or some PEP-302-recognized equivalent. Usually this is the module's ``__file__`` attribute, but is specified explicitly to avoid loading the module. :param str fullname: Name of the package we're trying to get child modules for :return: List of submodule name suffixes. """ mod_path = os.path.dirname(path) if mod_path != '': return [to_text(name) for _, name, _ in pkgutil.iter_modules([mod_path])] else: # we loaded some weird package in memory, so we'll see if it has a custom loader we can use loader = pkgutil.find_loader(fullname) return [to_text(name) for name, _ in loader.iter_modules(None)] if loader else [] def _looks_like_script(path): """ Return :data:`True` if the (possibly extensionless) file at `path` resembles a Python script. For now we simply verify the file contains ASCII text. """ try: fp = open(path, 'rb') except IOError: e = sys.exc_info()[1] if e.args[0] == errno.EISDIR: return False raise try: sample = fp.read(512).decode('latin-1') return not set(sample).difference(string.printable) finally: fp.close() def _py_filename(path): """ Returns a tuple of a Python path (if the file looks Pythonic) and whether or not the Python path is special. Special file paths/modules might only exist in memory """ if not path: return None, False if path[-4:] in ('.pyc', '.pyo'): path = path.rstrip('co') if path.endswith('.py'): return path, False if os.path.exists(path) and _looks_like_script(path): return path, False basepath = os.path.basename(path) if basepath in SPECIAL_FILE_PATHS: return path, True # return None, False means that the filename passed to _py_filename does not appear # to be python, and code later will handle when this function returns None # see https://github.com/dw/mitogen/pull/715#discussion_r532380528 for how this # decision was made to handle non-python files in this manner return None, False def _get_core_source(): """ Master version of parent.get_core_source(). """ source = inspect.getsource(mitogen.core) return mitogen.minify.minimize_source(source) if mitogen.is_master: # TODO: find a less surprising way of installing this. mitogen.parent._get_core_source = _get_core_source LOAD_CONST = dis.opname.index('LOAD_CONST') IMPORT_NAME = dis.opname.index('IMPORT_NAME') def _getarg(nextb, c): if c >= dis.HAVE_ARGUMENT: return nextb() | (nextb() << 8) if sys.version_info < (3, 0): def iter_opcodes(co): # Yield `(op, oparg)` tuples from the code object `co`. ordit = imap(ord, co.co_code) nextb = ordit.next return ((c, _getarg(nextb, c)) for c in ordit) elif sys.version_info < (3, 6): def iter_opcodes(co): # Yield `(op, oparg)` tuples from the code object `co`. ordit = iter(co.co_code) nextb = ordit.__next__ return ((c, _getarg(nextb, c)) for c in ordit) else: def iter_opcodes(co): # Yield `(op, oparg)` tuples from the code object `co`. ordit = iter(co.co_code) nextb = ordit.__next__ # https://github.com/abarnert/cpython/blob/c095a32f/Python/wordcode.md return ((c, nextb()) for c in ordit) def scan_code_imports(co): """ Given a code object `co`, scan its bytecode yielding any ``IMPORT_NAME`` and associated prior ``LOAD_CONST`` instructions representing an `Import` statement or `ImportFrom` statement. :return: Generator producing `(level, modname, namelist)` tuples, where: * `level`: -1 for normal import, 0, for absolute import, and >0 for relative import. * `modname`: Name of module to import, or from where `namelist` names are imported. * `namelist`: for `ImportFrom`, the list of names to be imported from `modname`. """ opit = iter_opcodes(co) opit, opit2, opit3 = itertools.tee(opit, 3) try: next(opit2) next(opit3) next(opit3) except StopIteration: return if sys.version_info >= (2, 5): for oparg1, oparg2, (op3, arg3) in izip(opit, opit2, opit3): if op3 == IMPORT_NAME: op2, arg2 = oparg2 op1, arg1 = oparg1 if op1 == op2 == LOAD_CONST: yield (co.co_consts[arg1], co.co_names[arg3], co.co_consts[arg2] or ()) else: # Python 2.4 did not yet have 'level', so stack format differs. for oparg1, (op2, arg2) in izip(opit, opit2): if op2 == IMPORT_NAME: op1, arg1 = oparg1 if op1 == LOAD_CONST: yield (-1, co.co_names[arg2], co.co_consts[arg1] or ()) class ThreadWatcher(object): """ Manage threads that wait for another thread to shut down, before invoking `on_join()` for each associated ThreadWatcher. In CPython it seems possible to use this method to ensure a non-main thread is signalled when the main thread has exited, using a third thread as a proxy. """ #: Protects remaining _cls_* members. _cls_lock = threading.Lock() #: PID of the process that last modified the class data. If the PID #: changes, it means the thread watch dict refers to threads that no longer #: exist in the current process (since it forked), and so must be reset. _cls_pid = None #: Map watched Thread -> list of ThreadWatcher instances. _cls_instances_by_target = {} #: Map watched Thread -> watcher Thread for each watched thread. _cls_thread_by_target = {} @classmethod def _reset(cls): """ If we have forked since the watch dictionaries were initialized, all that has is garbage, so clear it. """ if os.getpid() != cls._cls_pid: cls._cls_pid = os.getpid() cls._cls_instances_by_target.clear() cls._cls_thread_by_target.clear() def __init__(self, target, on_join): self.target = target self.on_join = on_join @classmethod def _watch(cls, target): target.join() for watcher in cls._cls_instances_by_target[target]: watcher.on_join() def install(self): self._cls_lock.acquire() try: self._reset() lst = self._cls_instances_by_target.setdefault(self.target, []) lst.append(self) if self.target not in self._cls_thread_by_target: self._cls_thread_by_target[self.target] = threading.Thread( name='mitogen.master.join_thread_async', target=self._watch, args=(self.target,) ) self._cls_thread_by_target[self.target].start() finally: self._cls_lock.release() def remove(self): self._cls_lock.acquire() try: self._reset() lst = self._cls_instances_by_target.get(self.target, []) if self in lst: lst.remove(self) finally: self._cls_lock.release() @classmethod def watch(cls, target, on_join): watcher = cls(target, on_join) watcher.install() return watcher class LogForwarder(object): """ Install a :data:`mitogen.core.FORWARD_LOG` handler that delivers forwarded log events into the local logging framework. This is used by the master's :class:`Router`. The forwarded :class:`logging.LogRecord` objects are delivered to loggers under ``mitogen.ctx.*`` corresponding to their :attr:`mitogen.core.Context.name`, with the message prefixed with the logger name used in the child. The records include some extra attributes: * ``mitogen_message``: Unicode original message without the logger name prepended. * ``mitogen_context``: :class:`mitogen.parent.Context` reference to the source context. * ``mitogen_name``: Original logger name. :param mitogen.master.Router router: Router to install the handler on. """ def __init__(self, router): self._router = router self._cache = {} router.add_handler( fn=self._on_forward_log, handle=mitogen.core.FORWARD_LOG, ) def _on_forward_log(self, msg): if msg.is_dead: return context = self._router.context_by_id(msg.src_id) if context is None: LOG.error('%s: dropping log from unknown context %d', self, msg.src_id) return name, level_s, s = msg.data.decode('utf-8', 'replace').split('\x00', 2) logger_name = '%s.[%s]' % (name, context.name) logger = self._cache.get(logger_name) if logger is None: self._cache[logger_name] = logger = logging.getLogger(logger_name) # See logging.Handler.makeRecord() record = logging.LogRecord( name=logger.name, level=int(level_s), pathname='(unknown file)', lineno=0, msg=s, args=(), exc_info=None, ) record.mitogen_message = s record.mitogen_context = self._router.context_by_id(msg.src_id) record.mitogen_name = name logger.handle(record) def __repr__(self): return 'LogForwarder(%r)' % (self._router,) class FinderMethod(object): """ Interface to a method for locating a Python module or package given its name according to the running Python interpreter. You'd think this was a simple task, right? Naive young fellow, welcome to the real world. """ def __init__(self): self.log = LOG.getChild(self.__class__.__name__) def __repr__(self): return '%s()' % (type(self).__name__,) def find(self, fullname): """ Accept a canonical module name as would be found in :data:`sys.modules` and return a `(path, source, is_pkg)` tuple, where: * `path`: Unicode string containing path to source file. * `source`: Bytestring containing source file's content. * `is_pkg`: :data:`True` if `fullname` is a package. :returns: :data:`None` if not found, or tuple as described above. """ raise NotImplementedError() class DefectivePython3xMainMethod(FinderMethod): """ Recent versions of Python 3.x introduced an incomplete notion of importer specs, and in doing so created permanent asymmetry in the :mod:`pkgutil` interface handling for the :mod:`__main__` module. Therefore we must handle :mod:`__main__` specially. """ def find(self, fullname): """ Find :mod:`__main__` using its :data:`__file__` attribute. """ if fullname != '__main__': return None mod = sys.modules.get(fullname) if not mod: return None path = getattr(mod, '__file__', None) if not (path is not None and os.path.exists(path) and _looks_like_script(path)): return None fp = open(path, 'rb') try: source = fp.read() finally: fp.close() return path, source, False class PkgutilMethod(FinderMethod): """ Attempt to fetch source code via pkgutil. In an ideal world, this would be the only required implementation of get_module(). """ def find(self, fullname): """ Find `fullname` using :func:`pkgutil.find_loader`. """ try: # If fullname refers to a submodule that's not already imported # then the containing package is imported. # Pre-'import spec' this returned None, in Python3.6 it raises # ImportError. loader = pkgutil.find_loader(fullname) except ImportError: e = sys.exc_info()[1] LOG.debug('%r: find_loader(%r) failed: %s', self, fullname, e) return None if not loader: LOG.debug('%r: find_loader(%r) returned %r, aborting', self, fullname, loader) return try: path = loader.get_filename(fullname) except (AttributeError, ImportError, ValueError): # - get_filename() may throw ImportError if pkgutil.find_loader() # picks a "parent" package's loader for some crap that's been # stuffed in sys.modules, for example in the case of urllib3: # "loader for urllib3.contrib.pyopenssl cannot handle # requests.packages.urllib3.contrib.pyopenssl" e = sys.exc_info()[1] LOG.debug('%r: %r.get_file_name(%r) failed: %r', self, loader, fullname, e) return path, is_special = _py_filename(path) try: source = loader.get_source(fullname) except AttributeError: # Per PEP-302, get_source() is optional, e = sys.exc_info()[1] LOG.debug('%r: %r.get_source() failed: %r', self, loader, fullname, e) return try: is_pkg = loader.is_package(fullname) except AttributeError: # Per PEP-302, is_package() is optional, e = sys.exc_info()[1] LOG.debug('%r: %r.is_package(%r) failed: %r', self, loader, fullname, e) return # workaround for special python modules that might only exist in memory if is_special and is_pkg and not source: source = '\n' if path is None or source is None: LOG.debug('%r: path=%r, source=%r, aborting', self, path, source) return if isinstance(source, mitogen.core.UnicodeType): # get_source() returns "string" according to PEP-302, which was # reinterpreted for Python 3 to mean a Unicode string. source = source.encode('utf-8') return path, source, is_pkg class SysModulesMethod(FinderMethod): """ Attempt to fetch source code via :data:`sys.modules`. This was originally specifically to support :mod:`__main__`, but it may catch a few more cases. """ def find(self, fullname): """ Find `fullname` using its :data:`__file__` attribute. """ try: module = sys.modules[fullname] except KeyError: LOG.debug('%r: sys.modules[%r] absent, aborting', self, fullname) return if not isinstance(module, types.ModuleType): LOG.debug('%r: sys.modules[%r] is %r, aborting', self, fullname, module) return try: resolved_name = module.__name__ except AttributeError: LOG.debug('%r: %r has no __name__, aborting', self, module) return if resolved_name != fullname: LOG.debug('%r: %r.__name__ is %r, aborting', self, module, resolved_name) return try: path = module.__file__ except AttributeError: LOG.debug('%r: %r has no __file__, aborting', self, module) return path, _ = _py_filename(path) if not path: LOG.debug('%r: %r.__file__ is %r, aborting', self, module, path) return LOG.debug('%r: sys.modules[%r]: found %s', self, fullname, path) is_pkg = hasattr(module, '__path__') try: source = inspect.getsource(module) except IOError: # Work around inspect.getsourcelines() bug for 0-byte __init__.py # files. if not is_pkg: raise source = '\n' if isinstance(source, mitogen.core.UnicodeType): # get_source() returns "string" according to PEP-302, which was # reinterpreted for Python 3 to mean a Unicode string. source = source.encode('utf-8') return path, source, is_pkg class ParentImpEnumerationMethod(FinderMethod): """ Attempt to fetch source code by examining the module's (hopefully less insane) parent package, and if no insane parents exist, simply use :mod:`sys.path` to search for it from scratch on the filesystem using the normal Python lookup mechanism. This is required for older versions of :mod:`ansible.compat.six`, :mod:`plumbum.colors`, Ansible 2.8 :mod:`ansible.module_utils.distro` and its submodule :mod:`ansible.module_utils.distro._distro`. When some package dynamically replaces itself in :data:`sys.modules`, but only conditionally according to some program logic, it is possible that children may attempt to load modules and subpackages from it that can no longer be resolved by examining a (corrupted) parent. For cases like :mod:`ansible.module_utils.distro`, this must handle cases where a package transmuted itself into a totally unrelated module during import and vice versa, where :data:`sys.modules` is replaced with junk that makes it impossible to discover the loaded module using the in-memory module object or any parent package's :data:`__path__`, since they have all been overwritten. Some men just want to watch the world burn. """ @staticmethod def _iter_parents(fullname): """ >>> list(ParentEnumerationMethod._iter_parents('a')) [('', 'a')] >>> list(ParentEnumerationMethod._iter_parents('a.b.c')) [('a.b', 'c'), ('a', 'b'), ('', 'a')] """ while fullname: fullname, _, modname = str_rpartition(fullname, u'.') yield fullname, modname def _find_sane_parent(self, fullname): """ Iteratively search :data:`sys.modules` for the least indirect parent of `fullname` that's from the same package and has a :data:`__path__` attribute. :return: `(parent_name, path, modpath)` tuple, where: * `modname`: canonical name of the found package, or the empty string if none is found. * `search_path`: :data:`__path__` attribute of the least indirect parent found, or :data:`None` if no indirect parent was found. * `modpath`: list of module name components leading from `path` to the target module. """ modpath = [] for pkgname, modname in self._iter_parents(fullname): modpath.insert(0, modname) if not pkgname: return [], None, modpath try: pkg = sys.modules[pkgname] except KeyError: LOG.debug('%r: sys.modules[%r] absent, skipping', self, pkgname) continue try: resolved_pkgname = pkg.__name__ except AttributeError: LOG.debug('%r: %r has no __name__, skipping', self, pkg) continue if resolved_pkgname != pkgname: LOG.debug('%r: %r.__name__ is %r, skipping', self, pkg, resolved_pkgname) continue try: path = pkg.__path__ except AttributeError: LOG.debug('%r: %r has no __path__, skipping', self, pkg) continue if not path: LOG.debug('%r: %r.__path__ is %r, skipping', self, pkg, path) continue return pkgname.split('.'), path, modpath def _found_package(self, fullname, path): path = os.path.join(path, '__init__.py') LOG.debug('%r: %r is PKG_DIRECTORY: %r', self, fullname, path) return self._found_module( fullname=fullname, path=path, fp=open(path, 'rb'), is_pkg=True, ) def _found_module(self, fullname, path, fp, is_pkg=False): try: path, _ = _py_filename(path) if not path: return source = fp.read() finally: if fp: fp.close() if isinstance(source, mitogen.core.UnicodeType): # get_source() returns "string" according to PEP-302, which was # reinterpreted for Python 3 to mean a Unicode string. source = source.encode('utf-8') return path, source, is_pkg def _find_one_component(self, modname, search_path): try: #fp, path, (suffix, _, kind) = imp.find_module(modname, search_path) # FIXME The imp module was removed in Python 3.12. return imp.find_module(modname, search_path) except ImportError: e = sys.exc_info()[1] LOG.debug('%r: imp.find_module(%r, %r) -> %s', self, modname, [search_path], e) return None def find(self, fullname): """ See implementation for a description of how this works. """ if sys.version_info >= (3, 4): return None #if fullname not in sys.modules: # Don't attempt this unless a module really exists in sys.modules, # else we could return junk. #return fullname = to_text(fullname) modname, search_path, modpath = self._find_sane_parent(fullname) while True: tup = self._find_one_component(modpath.pop(0), search_path) if tup is None: return None fp, path, (suffix, _, kind) = tup if modpath: # Still more components to descent. Result must be a package if fp: fp.close() if kind != imp.PKG_DIRECTORY: LOG.debug('%r: %r appears to be child of non-package %r', self, fullname, path) return None search_path = [path] elif kind == imp.PKG_DIRECTORY: return self._found_package(fullname, path) else: return self._found_module(fullname, path, fp) class ParentSpecEnumerationMethod(ParentImpEnumerationMethod): def _find_parent_spec(self, fullname): #history = [] debug = self.log.debug children = [] for parent_name, child_name in self._iter_parents(fullname): children.insert(0, child_name) if not parent_name: debug('abandoning %r, reached top-level', fullname) return None, children try: parent = sys.modules[parent_name] except KeyError: debug('skipping %r, not in sys.modules', parent_name) continue try: spec = parent.__spec__ except AttributeError: debug('skipping %r: %r.__spec__ is absent', parent_name, parent) continue if not spec: debug('skipping %r: %r.__spec__=%r', parent_name, parent, spec) continue if spec.name != parent_name: debug('skipping %r: %r.__spec__.name=%r does not match', parent_name, parent, spec.name) continue if not spec.submodule_search_locations: debug('skipping %r: %r.__spec__.submodule_search_locations=%r', parent_name, parent, spec.submodule_search_locations) continue return spec, children raise ValueError('%s._find_parent_spec(%r) unexpectedly reached bottom' % (self.__class__.__name__, fullname)) def find(self, fullname): # Returns absolute path, ParentImpEnumerationMethod returns relative # >>> spec_pem.find('six_brokenpkg._six')[::2] # ('/Users/alex/src/mitogen/tests/data/importer/six_brokenpkg/_six.py', False) if sys.version_info < (3, 4): return None fullname = to_text(fullname) spec, children = self._find_parent_spec(fullname) for child_name in children: if spec: name = '%s.%s' % (spec.name, child_name) submodule_search_locations = spec.submodule_search_locations else: name = child_name submodule_search_locations = None spec = importlib.util._find_spec(name, submodule_search_locations) if spec is None: self.log.debug('%r spec unavailable from %s', fullname, spec) return None is_package = spec.submodule_search_locations is not None if name != fullname: if not is_package: self.log.debug('%r appears to be child of non-package %r', fullname, spec) return None continue if not spec.has_location: self.log.debug('%r.origin cannot be read as a file', spec) return None if os.path.splitext(spec.origin)[1] != '.py': self.log.debug('%r.origin does not contain Python source code', spec) return None # FIXME This should use loader.get_source() with open(spec.origin, 'rb') as f: source = f.read() return spec.origin, source, is_package raise ValueError('%s.find(%r) unexpectedly reached bottom' % (self.__class__.__name__, fullname)) class ModuleFinder(object): """ Given the name of a loaded module, make a best-effort attempt at finding related modules likely needed by a child context requesting the original module. """ def __init__(self): #: Import machinery is expensive, keep :py:meth`:get_module_source` #: results around. self._found_cache = {} #: Avoid repeated dependency scanning, which is expensive. self._related_cache = {} def __repr__(self): return 'ModuleFinder()' def add_source_override(self, fullname, path, source, is_pkg): """ Explicitly install a source cache entry, preventing usual lookup methods from being used. Beware the value of `path` is critical when `is_pkg` is specified, since it directs where submodules are searched for. :param str fullname: Name of the module to override. :param str path: Module's path as it will appear in the cache. :param bytes source: Module source code as a bytestring. :param bool is_pkg: :data:`True` if the module is a package. """ self._found_cache[fullname] = (path, source, is_pkg) get_module_methods = [ DefectivePython3xMainMethod(), PkgutilMethod(), SysModulesMethod(), ParentSpecEnumerationMethod(), ParentImpEnumerationMethod(), ] def get_module_source(self, fullname): """ Given the name of a loaded module `fullname`, attempt to find its source code. :returns: Tuple of `(module path, source text, is package?)`, or :data:`None` if the source cannot be found. """ tup = self._found_cache.get(fullname) if tup: return tup for method in self.get_module_methods: tup = method.find(fullname) if tup: #LOG.debug('%r returned %r', method, tup) break else: tup = None, None, None LOG.debug('get_module_source(%r): cannot find source', fullname) self._found_cache[fullname] = tup return tup def resolve_relpath(self, fullname, level): """ Given an ImportFrom AST node, guess the prefix that should be tacked on to an alias name to produce a canonical name. `fullname` is the name of the module in which the ImportFrom appears. """ mod = sys.modules.get(fullname, None) if hasattr(mod, '__path__'): fullname += '.__init__' if level == 0 or not fullname: return '' bits = fullname.split('.') if len(bits) <= level: # This would be an ImportError in real code. return '' return '.'.join(bits[:-level]) + '.' def generate_parent_names(self, fullname): while '.' in fullname: fullname, _, _ = str_rpartition(to_text(fullname), u'.') yield fullname def find_related_imports(self, fullname): """ Return a list of non-stdlib modules that are directly imported by `fullname`, plus their parents. The list is determined by retrieving the source code of `fullname`, compiling it, and examining all IMPORT_NAME ops. :param fullname: Fully qualified name of an *already imported* module for which source code can be retrieved :type fullname: str """ related = self._related_cache.get(fullname) if related is not None: return related modpath, src, _ = self.get_module_source(fullname) if src is None: return [] maybe_names = list(self.generate_parent_names(fullname)) co = compile(src, modpath, 'exec') for level, modname, namelist in scan_code_imports(co): if level == -1: modnames = [modname, '%s.%s' % (fullname, modname)] else: modnames = [ '%s%s' % (self.resolve_relpath(fullname, level), modname) ] maybe_names.extend(modnames) maybe_names.extend( '%s.%s' % (mname, name) for mname in modnames for name in namelist ) return self._related_cache.setdefault(fullname, sorted( set( mitogen.core.to_text(name) for name in maybe_names if sys.modules.get(name) is not None and not is_stdlib_name(name) and u'six.moves' not in name # TODO: crap ) )) def find_related(self, fullname): """ Return a list of non-stdlib modules that are imported directly or indirectly by `fullname`, plus their parents. This method is like :py:meth:`find_related_imports`, but also recursively searches any modules which are imported by `fullname`. :param fullname: Fully qualified name of an *already imported* module for which source code can be retrieved :type fullname: str """ stack = [fullname] found = set() while stack: name = stack.pop(0) names = self.find_related_imports(name) stack.extend(set(names).difference(set(found).union(stack))) found.update(names) found.discard(fullname) return sorted(found) class ModuleResponder(object): def __init__(self, router): self._log = logging.getLogger('mitogen.responder') self._router = router self._finder = ModuleFinder() self._cache = {} # fullname -> pickled self.blacklist = [] self.whitelist = [''] #: Context -> set([fullname, ..]) self._forwarded_by_context = {} #: Number of GET_MODULE messages received. self.get_module_count = 0 #: Total time spent in uncached GET_MODULE. self.get_module_secs = 0.0 #: Total time spent minifying modules. self.minify_secs = 0.0 #: Number of successful LOAD_MODULE messages sent. self.good_load_module_count = 0 #: Total bytes in successful LOAD_MODULE payloads. self.good_load_module_size = 0 #: Number of negative LOAD_MODULE messages sent. self.bad_load_module_count = 0 router.add_handler( fn=self._on_get_module, handle=mitogen.core.GET_MODULE, ) def __repr__(self): return 'ModuleResponder' def add_source_override(self, fullname, path, source, is_pkg): """ See :meth:`ModuleFinder.add_source_override`. """ self._finder.add_source_override(fullname, path, source, is_pkg) MAIN_RE = re.compile(b(r'^if\s+__name__\s*==\s*.__main__.\s*:'), re.M) main_guard_msg = ( "A child context attempted to import __main__, however the main " "module present in the master process lacks an execution guard. " "Update %r to prevent unintended execution, using a guard like:\n" "\n" " if __name__ == '__main__':\n" " # your code here.\n" ) def whitelist_prefix(self, fullname): if self.whitelist == ['']: self.whitelist = ['mitogen'] self.whitelist.append(fullname) def blacklist_prefix(self, fullname): self.blacklist.append(fullname) def neutralize_main(self, path, src): """ Given the source for the __main__ module, try to find where it begins conditional execution based on a "if __name__ == '__main__'" guard, and remove any code after that point. """ match = self.MAIN_RE.search(src) if match: return src[:match.start()] if b('mitogen.main(') in src: return src self._log.error(self.main_guard_msg, path) raise ImportError('refused') def _make_negative_response(self, fullname): return (fullname, None, None, None, ()) minify_safe_re = re.compile(b(r'\s+#\s*!mitogen:\s*minify_safe')) def _build_tuple(self, fullname): if fullname in self._cache: return self._cache[fullname] if mitogen.core.is_blacklisted_import(self, fullname): raise ImportError('blacklisted') path, source, is_pkg = self._finder.get_module_source(fullname) if path and is_stdlib_path(path): # Prevent loading of 2.x<->3.x stdlib modules! This costs one # RTT per hit, so a client-side solution is also required. self._log.debug('refusing to serve stdlib module %r', fullname) tup = self._make_negative_response(fullname) self._cache[fullname] = tup return tup if source is None: # TODO: make this .warning() or similar again once importer has its # own logging category. self._log.debug('could not find source for %r', fullname) tup = self._make_negative_response(fullname) self._cache[fullname] = tup return tup if self.minify_safe_re.search(source): # If the module contains a magic marker, it's safe to minify. t0 = mitogen.core.now() source = mitogen.minify.minimize_source(source).encode('utf-8') self.minify_secs += mitogen.core.now() - t0 if is_pkg: pkg_present = get_child_modules(path, fullname) self._log.debug('%s is a package at %s with submodules %r', fullname, path, pkg_present) else: pkg_present = None if fullname == '__main__': source = self.neutralize_main(path, source) compressed = mitogen.core.Blob(zlib.compress(source, 9)) related = [ to_text(name) for name in self._finder.find_related(fullname) if not mitogen.core.is_blacklisted_import(self, name) ] # 0:fullname 1:pkg_present 2:path 3:compressed 4:related tup = ( to_text(fullname), pkg_present, to_text(path), compressed, related ) self._cache[fullname] = tup return tup def _send_load_module(self, stream, fullname): if fullname not in stream.protocol.sent_modules: tup = self._build_tuple(fullname) msg = mitogen.core.Message.pickled( tup, dst_id=stream.protocol.remote_id, handle=mitogen.core.LOAD_MODULE, ) self._log.debug('sending %s (%.2f KiB) to %s', fullname, len(msg.data) / 1024.0, stream.name) self._router._async_route(msg) stream.protocol.sent_modules.add(fullname) if tup[2] is not None: self.good_load_module_count += 1 self.good_load_module_size += len(msg.data) else: self.bad_load_module_count += 1 def _send_module_load_failed(self, stream, fullname): self.bad_load_module_count += 1 stream.protocol.send( mitogen.core.Message.pickled( self._make_negative_response(fullname), dst_id=stream.protocol.remote_id, handle=mitogen.core.LOAD_MODULE, ) ) def _send_module_and_related(self, stream, fullname): if fullname in stream.protocol.sent_modules: return try: tup = self._build_tuple(fullname) for name in tup[4]: # related parent, _, _ = str_partition(name, '.') if parent != fullname and parent not in stream.protocol.sent_modules: # Parent hasn't been sent, so don't load submodule yet. continue self._send_load_module(stream, name) self._send_load_module(stream, fullname) except Exception: LOG.debug('While importing %r', fullname, exc_info=True) self._send_module_load_failed(stream, fullname) def _on_get_module(self, msg): if msg.is_dead: return stream = self._router.stream_by_id(msg.src_id) if stream is None: return fullname = msg.data.decode() self._log.debug('%s requested module %s', stream.name, fullname) self.get_module_count += 1 if fullname in stream.protocol.sent_modules: LOG.warning('_on_get_module(): dup request for %r from %r', fullname, stream) t0 = mitogen.core.now() try: self._send_module_and_related(stream, fullname) finally: self.get_module_secs += mitogen.core.now() - t0 def _send_forward_module(self, stream, context, fullname): if stream.protocol.remote_id != context.context_id: stream.protocol._send( mitogen.core.Message( data=b('%s\x00%s' % (context.context_id, fullname)), handle=mitogen.core.FORWARD_MODULE, dst_id=stream.protocol.remote_id, ) ) def _forward_one_module(self, context, fullname): forwarded = self._forwarded_by_context.get(context) if forwarded is None: forwarded = set() self._forwarded_by_context[context] = forwarded if fullname in forwarded: return path = [] while fullname: path.append(fullname) fullname, _, _ = str_rpartition(fullname, u'.') stream = self._router.stream_by_id(context.context_id) if stream is None: LOG.debug('%r: dropping forward of %s to no longer existent ' '%r', self, path[0], context) return for fullname in reversed(path): self._send_module_and_related(stream, fullname) self._send_forward_module(stream, context, fullname) def _forward_modules(self, context, fullnames): IOLOG.debug('%r._forward_modules(%r, %r)', self, context, fullnames) for fullname in fullnames: self._forward_one_module(context, mitogen.core.to_text(fullname)) def forward_modules(self, context, fullnames): self._router.broker.defer(self._forward_modules, context, fullnames) class Broker(mitogen.core.Broker): """ .. note:: You may construct as many brokers as desired, and use the same broker for multiple routers, however usually only one broker need exist. Multiple brokers may be useful when dealing with sets of children with differing lifetimes. For example, a subscription service where non-payment results in termination for one customer. :param bool install_watcher: If :data:`True`, an additional thread is started to monitor the lifetime of the main thread, triggering :meth:`shutdown` automatically in case the user forgets to call it, or their code crashed. You should not rely on this functionality in your program, it is only intended as a fail-safe and to simplify the API for new users. In particular, alternative Python implementations may not be able to support watching the main thread. """ shutdown_timeout = 5.0 _watcher = None poller_class = mitogen.parent.PREFERRED_POLLER def __init__(self, install_watcher=True): if install_watcher: self._watcher = ThreadWatcher.watch( target=mitogen.core.threading__current_thread(), on_join=self.shutdown, ) super(Broker, self).__init__() self.timers = mitogen.parent.TimerList() def shutdown(self): super(Broker, self).shutdown() if self._watcher: self._watcher.remove() class Router(mitogen.parent.Router): """ Extend :class:`mitogen.core.Router` with functionality useful to masters, and child contexts who later become masters. Currently when this class is required, the target context's router is upgraded at runtime. .. note:: You may construct as many routers as desired, and use the same broker for multiple routers, however usually only one broker and router need exist. Multiple routers may be useful when dealing with separate trust domains, for example, manipulating infrastructure belonging to separate customers or projects. :param mitogen.master.Broker broker: Broker to use. If not specified, a private :class:`Broker` is created. :param int max_message_size: Override the maximum message size this router is willing to receive or transmit. Any value set here is automatically inherited by any children created by the router. This has a liberal default of 128 MiB, but may be set much lower. Beware that setting it below 64KiB may encourage unexpected failures as parents and children can no longer route large Python modules that may be required by your application. """ broker_class = Broker #: When :data:`True`, cause the broker thread and any subsequent broker and #: main threads existing in any child to write #: ``/tmp/mitogen.stats...log`` containing a #: :mod:`cProfile` dump on graceful exit. Must be set prior to construction #: of any :class:`Broker`, e.g. via:: #: #: mitogen.master.Router.profiling = True profiling = os.environ.get('MITOGEN_PROFILING') is not None def __init__(self, broker=None, max_message_size=None): if broker is None: broker = self.broker_class() if max_message_size: self.max_message_size = max_message_size super(Router, self).__init__(broker) self.upgrade() def upgrade(self): self.id_allocator = IdAllocator(self) self.responder = ModuleResponder(self) self.log_forwarder = LogForwarder(self) self.route_monitor = mitogen.parent.RouteMonitor(router=self) self.add_handler( # TODO: cutpaste. fn=self._on_detaching, handle=mitogen.core.DETACHING, persist=True, ) def _on_broker_exit(self): super(Router, self)._on_broker_exit() dct = self.get_stats() dct['self'] = self dct['minify_ms'] = 1000 * dct['minify_secs'] dct['get_module_ms'] = 1000 * dct['get_module_secs'] dct['good_load_module_size_kb'] = dct['good_load_module_size'] / 1024.0 dct['good_load_module_size_avg'] = ( ( dct['good_load_module_size'] / (float(dct['good_load_module_count']) or 1.0) ) / 1024.0 ) LOG.debug( '%(self)r: stats: ' '%(get_module_count)d module requests in ' '%(get_module_ms)d ms, ' '%(good_load_module_count)d sent ' '(%(minify_ms)d ms minify time), ' '%(bad_load_module_count)d negative responses. ' 'Sent %(good_load_module_size_kb).01f kb total, ' '%(good_load_module_size_avg).01f kb avg.' % dct ) def get_stats(self): """ Return performance data for the module responder. :returns: Dict containing keys: * `get_module_count`: Integer count of :data:`mitogen.core.GET_MODULE` messages received. * `get_module_secs`: Floating point total seconds spent servicing :data:`mitogen.core.GET_MODULE` requests. * `good_load_module_count`: Integer count of successful :data:`mitogen.core.LOAD_MODULE` messages sent. * `good_load_module_size`: Integer total bytes sent in :data:`mitogen.core.LOAD_MODULE` message payloads. * `bad_load_module_count`: Integer count of negative :data:`mitogen.core.LOAD_MODULE` messages sent. * `minify_secs`: CPU seconds spent minifying modules marked minify-safe. """ return { 'get_module_count': self.responder.get_module_count, 'get_module_secs': self.responder.get_module_secs, 'good_load_module_count': self.responder.good_load_module_count, 'good_load_module_size': self.responder.good_load_module_size, 'bad_load_module_count': self.responder.bad_load_module_count, 'minify_secs': self.responder.minify_secs, } def enable_debug(self): """ Cause this context and any descendant child contexts to write debug logs to ``/tmp/mitogen..log``. """ mitogen.core.enable_debug_logging() self.debug = True def __enter__(self): return self def __exit__(self, e_type, e_val, tb): self.broker.shutdown() self.broker.join() def disconnect_stream(self, stream): self.broker.defer(stream.on_disconnect, self.broker) def disconnect_all(self): # making stream_by_id python3-safe by converting stream_by_id values iter to list for stream in list(self._stream_by_id.values()): self.disconnect_stream(stream) class IdAllocator(object): """ Allocate IDs for new contexts constructed locally, and blocks of IDs for children to allocate their own IDs using :class:`mitogen.parent.ChildIdAllocator` without risk of conflict, and without necessitating network round-trips for each new context. This class responds to :data:`mitogen.core.ALLOCATE_ID` messages received from children by replying with fresh block ID allocations. The master's :class:`IdAllocator` instance can be accessed via :attr:`mitogen.master.Router.id_allocator`. """ #: Block allocations are made in groups of 1000 by default. BLOCK_SIZE = 1000 def __init__(self, router): self.router = router self.next_id = 1 self.lock = threading.Lock() router.add_handler( fn=self.on_allocate_id, handle=mitogen.core.ALLOCATE_ID, ) def __repr__(self): return 'IdAllocator(%r)' % (self.router,) def allocate(self): """ Allocate a context ID by directly incrementing an internal counter. :returns: The new context ID. """ self.lock.acquire() try: id_ = self.next_id self.next_id += 1 return id_ finally: self.lock.release() def allocate_block(self): """ Allocate a block of IDs for use in a child context. This function is safe to call from any thread. :returns: Tuple of the form `(id, end_id)` where `id` is the first usable ID and `end_id` is the last usable ID. """ self.lock.acquire() try: id_ = self.next_id self.next_id += self.BLOCK_SIZE end_id = id_ + self.BLOCK_SIZE LOG.debug('%r: allocating [%d..%d)', self, id_, end_id) return id_, end_id finally: self.lock.release() def on_allocate_id(self, msg): if msg.is_dead: return id_, last_id = self.allocate_block() requestee = self.router.context_by_id(msg.src_id) LOG.debug('%r: allocating [%r..%r) to %r', self, id_, last_id, requestee) msg.reply((id_, last_id)) mitogen-0.3.9/mitogen/minify.py000066400000000000000000000117451465666473100165260ustar00rootroot00000000000000# Copyright 2017, Alex Willmer # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # !mitogen: minify_safe import sys try: from io import StringIO except ImportError: from StringIO import StringIO import mitogen.core if sys.version_info < (2, 7, 11): from mitogen.compat import tokenize else: import tokenize def minimize_source(source): """ Remove comments and docstrings from Python `source`, preserving line numbers and syntax of empty blocks. :param str source: The source to minimize. :returns str: The minimized source. """ source = mitogen.core.to_text(source) tokens = tokenize.generate_tokens(StringIO(source).readline) tokens = strip_comments(tokens) tokens = strip_docstrings(tokens) tokens = reindent(tokens) return tokenize.untokenize(tokens) def strip_comments(tokens): """ Drop comment tokens from a `tokenize` stream. Comments on lines 1-2 are kept, to preserve hashbang and encoding. Trailing whitespace is remove from all lines. """ prev_typ = None prev_end_col = 0 for typ, tok, (start_row, start_col), (end_row, end_col), line in tokens: if typ in (tokenize.NL, tokenize.NEWLINE): if prev_typ in (tokenize.NL, tokenize.NEWLINE): start_col = 0 else: start_col = prev_end_col end_col = start_col + 1 elif typ == tokenize.COMMENT and start_row > 2: continue prev_typ = typ prev_end_col = end_col yield typ, tok, (start_row, start_col), (end_row, end_col), line def strip_docstrings(tokens): """ Replace docstring tokens with NL tokens in a `tokenize` stream. Any STRING token not part of an expression is deemed a docstring. Indented docstrings are not yet recognised. """ stack = [] state = 'wait_string' for t in tokens: typ = t[0] if state == 'wait_string': if typ in (tokenize.NL, tokenize.COMMENT): yield t elif typ in (tokenize.DEDENT, tokenize.INDENT, tokenize.STRING): stack.append(t) elif typ == tokenize.NEWLINE: stack.append(t) start_line, end_line = stack[0][2][0], stack[-1][3][0]+1 for i in range(start_line, end_line): yield tokenize.NL, '\n', (i, 0), (i,1), '\n' for t in stack: if t[0] in (tokenize.DEDENT, tokenize.INDENT): yield t[0], t[1], (i+1, t[2][1]), (i+1, t[3][1]), t[4] del stack[:] else: stack.append(t) for t in stack: yield t del stack[:] state = 'wait_newline' elif state == 'wait_newline': if typ == tokenize.NEWLINE: state = 'wait_string' yield t def reindent(tokens, indent=' '): """ Replace existing indentation in a token steam, with `indent`. """ old_levels = [] old_level = 0 new_level = 0 for typ, tok, (start_row, start_col), (end_row, end_col), line in tokens: if typ == tokenize.INDENT: old_levels.append(old_level) old_level = len(tok) new_level += 1 tok = indent * new_level elif typ == tokenize.DEDENT: old_level = old_levels.pop() new_level -= 1 start_col = max(0, start_col - old_level + new_level) if start_row == end_row: end_col = start_col + len(tok) yield typ, tok, (start_row, start_col), (end_row, end_col), line mitogen-0.3.9/mitogen/os_fork.py000066400000000000000000000147401465666473100166730ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # !mitogen: minify_safe """ Support for operating in a mixed threading/forking environment. """ import os import socket import sys import weakref import mitogen.core # List of weakrefs. On Python 2.4, mitogen.core registers its Broker on this # list and mitogen.service registers its Pool too. _brokers = weakref.WeakKeyDictionary() _pools = weakref.WeakKeyDictionary() def _notice_broker_or_pool(obj): """ Used by :mod:`mitogen.core` and :mod:`mitogen.service` to automatically register every broker and pool on Python 2.4/2.5. """ if isinstance(obj, mitogen.core.Broker): _brokers[obj] = True else: _pools[obj] = True def wrap_os__fork(): corker = Corker( brokers=list(_brokers), pools=list(_pools), ) try: corker.cork() return os__fork() finally: corker.uncork() # If Python 2.4/2.5 where threading state is not fixed up, subprocess.Popen() # may still deadlock due to the broker thread. In this case, pause os.fork() so # that all active threads are paused during fork. if sys.version_info < (2, 6): os__fork = os.fork os.fork = wrap_os__fork class Corker(object): """ Arrange for :class:`mitogen.core.Broker` and optionally :class:`mitogen.service.Pool` to be temporarily "corked" while fork operations may occur. In a mixed threading/forking environment, it is critical no threads are active at the moment of fork, as they could hold mutexes whose state is unrecoverably snapshotted in the locked state in the fork child, causing deadlocks at random future moments. To ensure a target thread has all locks dropped, it is made to write a large string to a socket with a small buffer that has :data:`os.O_NONBLOCK` disabled. CPython will drop the GIL and enter the ``write()`` system call, where it will block until the socket buffer is drained, or the write side is closed. :class:`mitogen.core.Poller` is used to ensure the thread really has blocked outside any Python locks, by checking if the socket buffer has started to fill. Since this necessarily involves posting a message to every existent thread and verifying acknowledgement, it will never be a fast operation. This does not yet handle the case of corking being initiated from within a thread that is also a cork target. :param brokers: Sequence of :class:`mitogen.core.Broker` instances to cork. :param pools: Sequence of :class:`mitogen.core.Pool` instances to cork. """ def __init__(self, brokers=(), pools=()): self.brokers = brokers self.pools = pools def _do_cork(self, s, wsock): try: try: while True: # at least EINTR is possible. Do our best to keep handling # outside the GIL in this case using sendall(). wsock.sendall(s) except socket.error: pass finally: wsock.close() def _cork_one(self, s, obj): """ Construct a socketpair, saving one side of it, and passing the other to `obj` to be written to by one of its threads. """ rsock, wsock = mitogen.parent.create_socketpair(size=4096) mitogen.core.set_cloexec(rsock.fileno()) mitogen.core.set_cloexec(wsock.fileno()) mitogen.core.set_block(wsock) # gevent self._rsocks.append(rsock) obj.defer(self._do_cork, s, wsock) def _verify_one(self, rsock): """ Pause until the socket `rsock` indicates readability, due to :meth:`_do_cork` triggering a blocking write on another thread. """ poller = mitogen.core.Poller() poller.start_receive(rsock.fileno()) try: while True: for fd in poller.poll(): return finally: poller.close() def cork(self): """ Arrange for any associated brokers and pools to be paused with no locks held. This will not return until each thread acknowledges it has ceased execution. """ current = mitogen.core.threading__current_thread() s = mitogen.core.b('CORK') * ((128 // 4) * 1024) self._rsocks = [] # Pools must be paused first, as existing work may require the # participation of a broker in order to complete. for pool in self.pools: if not pool.closed: for th in pool._threads: if th != current: self._cork_one(s, pool) for broker in self.brokers: if broker._alive: if broker._thread != current: self._cork_one(s, broker) # Pause until we can detect every thread has entered write(). for rsock in self._rsocks: self._verify_one(rsock) def uncork(self): """ Arrange for paused threads to resume operation. """ for rsock in self._rsocks: rsock.close() mitogen-0.3.9/mitogen/parent.py000066400000000000000000002772511465666473100165320ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # !mitogen: minify_safe """ This module defines functionality common to master and parent processes. It is sent to any child context that is due to become a parent, due to recursive connection. """ import binascii import errno import fcntl import getpass import heapq import inspect import logging import os import re import signal import socket import struct import subprocess import sys import termios import textwrap import threading import zlib # Absolute imports for <2.5. select = __import__('select') try: import thread except ImportError: import threading as thread import mitogen.core from mitogen.core import b from mitogen.core import bytes_partition from mitogen.core import IOLOG LOG = logging.getLogger(__name__) # #410: we must avoid the use of socketpairs if SELinux is enabled. try: fp = open('/sys/fs/selinux/enforce', 'rb') try: SELINUX_ENABLED = bool(int(fp.read())) finally: fp.close() except IOError: SELINUX_ENABLED = False try: next except NameError: # Python 2.4/2.5 from mitogen.core import next itervalues = getattr(dict, 'itervalues', dict.values) if mitogen.core.PY3: xrange = range closure_attr = '__closure__' IM_SELF_ATTR = '__self__' else: closure_attr = 'func_closure' IM_SELF_ATTR = 'im_self' try: SC_OPEN_MAX = os.sysconf('SC_OPEN_MAX') except ValueError: SC_OPEN_MAX = 1024 BROKER_SHUTDOWN_MSG = ( 'Connection cancelled because the associated Broker began to shut down.' ) OPENPTY_MSG = ( "Failed to create a PTY: %s. It is likely the maximum number of PTYs has " "been reached. Consider increasing the 'kern.tty.ptmx_max' sysctl on OS " "X, the 'kernel.pty.max' sysctl on Linux, or modifying your configuration " "to avoid PTY use." ) SYS_EXECUTABLE_MSG = ( "The Python sys.executable variable is unset, indicating Python was " "unable to determine its original program name. Unless explicitly " "configured otherwise, child contexts will be started using " "'/usr/bin/python'" ) _sys_executable_warning_logged = False def _ioctl_cast(n): """ Linux ioctl() request parameter is unsigned, whereas on BSD/Darwin it is signed. Until 2.5 Python exclusively implemented the BSD behaviour, preventing use of large unsigned int requests like the TTY layer uses below. So on 2.4, we cast our unsigned to look like signed for Python. """ if sys.version_info < (2, 5): n, = struct.unpack('i', struct.pack('I', n)) return n # If not :data:`None`, called prior to exec() of any new child process. Used by # :func:`mitogen.utils.reset_affinity` to allow the child to be freely # scheduled. _preexec_hook = None # Get PTY number; asm-generic/ioctls.h LINUX_TIOCGPTN = _ioctl_cast(2147767344) # Lock/unlock PTY; asm-generic/ioctls.h LINUX_TIOCSPTLCK = _ioctl_cast(1074025521) IS_LINUX = os.uname()[0] == 'Linux' SIGNAL_BY_NUM = dict( (getattr(signal, name), name) for name in sorted(vars(signal), reverse=True) if name.startswith('SIG') and not name.startswith('SIG_') ) _core_source_lock = threading.Lock() _core_source_partial = None def get_log_level(): return (LOG.getEffectiveLevel() or logging.INFO) def get_sys_executable(): """ Return :data:`sys.executable` if it is set, otherwise return ``"/usr/bin/python"`` and log a warning. """ if sys.executable: return sys.executable global _sys_executable_warning_logged if not _sys_executable_warning_logged: LOG.warn(SYS_EXECUTABLE_MSG) _sys_executable_warning_logged = True return '/usr/bin/python' def _get_core_source(): """ In non-masters, simply fetch the cached mitogen.core source code via the import mechanism. In masters, this function is replaced with a version that performs minification directly. """ return inspect.getsource(mitogen.core) def get_core_source_partial(): """ _get_core_source() is expensive, even with @lru_cache in minify.py, threads can enter it simultaneously causing severe slowdowns. """ global _core_source_partial if _core_source_partial is None: _core_source_lock.acquire() try: if _core_source_partial is None: _core_source_partial = PartialZlib( _get_core_source().encode('utf-8') ) finally: _core_source_lock.release() return _core_source_partial def get_default_remote_name(): """ Return the default name appearing in argv[0] of remote machines. """ s = u'%s@%s:%d' s %= (getpass.getuser(), socket.gethostname(), os.getpid()) # In mixed UNIX/Windows environments, the username may contain slashes. return s.translate({ ord(u'\\'): ord(u'_'), ord(u'/'): ord(u'_') }) def is_immediate_child(msg, stream): """ Handler policy that requires messages to arrive only from immediately connected children. """ return msg.src_id == stream.protocol.remote_id def flags(names): """ Return the result of ORing a set of (space separated) :py:mod:`termios` module constants together. """ return sum(getattr(termios, name, 0) for name in names.split()) def cfmakeraw(tflags): """ Given a list returned by :py:func:`termios.tcgetattr`, return a list modified in a manner similar to the `cfmakeraw()` C library function, but additionally disabling local echo. """ # BSD: github.com/freebsd/freebsd/blob/master/lib/libc/gen/termios.c#L162 # Linux: github.com/lattera/glibc/blob/master/termios/cfmakeraw.c#L20 iflag, oflag, cflag, lflag, ispeed, ospeed, cc = tflags iflag &= ~flags('IMAXBEL IXOFF INPCK BRKINT PARMRK ' 'ISTRIP INLCR ICRNL IXON IGNPAR') iflag &= ~flags('IGNBRK BRKINT PARMRK') oflag &= ~flags('OPOST') lflag &= ~flags('ECHO ECHOE ECHOK ECHONL ICANON ISIG ' 'IEXTEN NOFLSH TOSTOP PENDIN') cflag &= ~flags('CSIZE PARENB') cflag |= flags('CS8 CREAD') return [iflag, oflag, cflag, lflag, ispeed, ospeed, cc] def disable_echo(fd): old = termios.tcgetattr(fd) new = cfmakeraw(old) flags = getattr(termios, 'TCSASOFT', 0) if not mitogen.core.IS_WSL: # issue #319: Windows Subsystem for Linux as of July 2018 throws EINVAL # if TCSAFLUSH is specified. flags |= termios.TCSAFLUSH termios.tcsetattr(fd, flags, new) def create_socketpair(size=None): """ Create a :func:`socket.socketpair` for use as a child's UNIX stdio channels. As socketpairs are bidirectional, they are economical on file descriptor usage as one descriptor can be used for ``stdin`` and ``stdout``. As they are sockets their buffers are tunable, allowing large buffers to improve file transfer throughput and reduce IO loop iterations. """ if size is None: size = mitogen.core.CHUNK_SIZE parentfp, childfp = socket.socketpair() for fp in parentfp, childfp: fp.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, size) return parentfp, childfp def create_best_pipe(escalates_privilege=False): """ By default we prefer to communicate with children over a UNIX socket, as a single file descriptor can represent bidirectional communication, and a cross-platform API exists to align buffer sizes with the needs of the library. SELinux prevents us setting up a privileged process to inherit an AF_UNIX socket, a facility explicitly designed as a better replacement for pipes, because at some point in the mid 90s it might have been commonly possible for AF_INET sockets to end up undesirably connected to a privileged process, so let's make up arbitrary rules breaking all sockets instead. If SELinux is detected, fall back to using pipes. :param bool escalates_privilege: If :data:`True`, the target program may escalate privileges, causing SELinux to disconnect AF_UNIX sockets, so avoid those. :returns: `(parent_rfp, child_wfp, child_rfp, parent_wfp)` """ if (not escalates_privilege) or (not SELINUX_ENABLED): parentfp, childfp = create_socketpair() return parentfp, childfp, childfp, parentfp parent_rfp, child_wfp = mitogen.core.pipe() try: child_rfp, parent_wfp = mitogen.core.pipe() return parent_rfp, child_wfp, child_rfp, parent_wfp except: parent_rfp.close() child_wfp.close() raise def popen(**kwargs): """ Wrap :class:`subprocess.Popen` to ensure any global :data:`_preexec_hook` is invoked in the child. """ real_preexec_fn = kwargs.pop('preexec_fn', None) def preexec_fn(): if _preexec_hook: _preexec_hook() if real_preexec_fn: real_preexec_fn() return subprocess.Popen(preexec_fn=preexec_fn, **kwargs) def create_child(args, merge_stdio=False, stderr_pipe=False, escalates_privilege=False, preexec_fn=None): """ Create a child process whose stdin/stdout is connected to a socket. :param list args: Program argument vector. :param bool merge_stdio: If :data:`True`, arrange for `stderr` to be connected to the `stdout` socketpair, rather than inherited from the parent process. This may be necessary to ensure that no TTY is connected to any stdio handle, for instance when using LXC. :param bool stderr_pipe: If :data:`True` and `merge_stdio` is :data:`False`, arrange for `stderr` to be connected to a separate pipe, to allow any ongoing debug logs generated by e.g. SSH to be output as the session progresses, without interfering with `stdout`. :param bool escalates_privilege: If :data:`True`, the target program may escalate privileges, causing SELinux to disconnect AF_UNIX sockets, so avoid those. :param function preexec_fn: If not :data:`None`, a function to run within the post-fork child before executing the target program. :returns: :class:`Process` instance. """ parent_rfp, child_wfp, child_rfp, parent_wfp = create_best_pipe( escalates_privilege=escalates_privilege ) stderr = None stderr_r = None if merge_stdio: stderr = child_wfp elif stderr_pipe: stderr_r, stderr = mitogen.core.pipe() mitogen.core.set_cloexec(stderr_r.fileno()) try: proc = popen( args=args, stdin=child_rfp, stdout=child_wfp, stderr=stderr, close_fds=True, preexec_fn=preexec_fn, ) except: child_rfp.close() child_wfp.close() parent_rfp.close() parent_wfp.close() if stderr_pipe: stderr.close() stderr_r.close() raise child_rfp.close() child_wfp.close() if stderr_pipe: stderr.close() return PopenProcess( proc=proc, stdin=parent_wfp, stdout=parent_rfp, stderr=stderr_r, ) def _acquire_controlling_tty(): os.setsid() if sys.platform in ('linux', 'linux2'): # On Linux, the controlling tty becomes the first tty opened by a # process lacking any prior tty. os.close(os.open(os.ttyname(2), os.O_RDWR)) if hasattr(termios, 'TIOCSCTTY') and not mitogen.core.IS_WSL: # #550: prehistoric WSL does not like TIOCSCTTY. # On BSD an explicit ioctl is required. For some inexplicable reason, # Python 2.6 on Travis also requires it. fcntl.ioctl(2, termios.TIOCSCTTY) def _linux_broken_devpts_openpty(): """ #462: On broken Linux hosts with mismatched configuration (e.g. old /etc/fstab template installed), /dev/pts may be mounted without the gid= mount option, causing new slave devices to be created with the group ID of the calling process. This upsets glibc, whose openpty() is required by specification to produce a slave owned by a special group ID (which is always the 'tty' group). Glibc attempts to use "pt_chown" to fix ownership. If that fails, it chown()s the PTY directly, which fails due to non-root, causing openpty() to fail with EPERM ("Operation not permitted"). Since we don't need the magical TTY group to run sudo and su, open the PTY ourselves in this case. """ master_fd = None try: # Opening /dev/ptmx causes a PTY pair to be allocated, and the # corresponding slave /dev/pts/* device to be created, owned by UID/GID # matching this process. master_fd = os.open('/dev/ptmx', os.O_RDWR) # Clear the lock bit from the PTY. This a prehistoric feature from a # time when slave device files were persistent. fcntl.ioctl(master_fd, LINUX_TIOCSPTLCK, struct.pack('i', 0)) # Since v4.13 TIOCGPTPEER exists to open the slave in one step, but we # must support older kernels. Ask for the PTY number. pty_num_s = fcntl.ioctl(master_fd, LINUX_TIOCGPTN, struct.pack('i', 0)) pty_num, = struct.unpack('i', pty_num_s) pty_name = '/dev/pts/%d' % (pty_num,) # Now open it with O_NOCTTY to ensure it doesn't change our controlling # TTY. Otherwise when we close the FD we get killed by the kernel, and # the child we spawn that should really attach to it will get EPERM # during _acquire_controlling_tty(). slave_fd = os.open(pty_name, os.O_RDWR|os.O_NOCTTY) return master_fd, slave_fd except OSError: if master_fd is not None: os.close(master_fd) e = sys.exc_info()[1] raise mitogen.core.StreamError(OPENPTY_MSG, e) def openpty(): """ Call :func:`os.openpty`, raising a descriptive error if the call fails. :raises mitogen.core.StreamError: Creating a PTY failed. :returns: `(master_fp, slave_fp)` file-like objects. """ try: master_fd, slave_fd = os.openpty() except OSError: e = sys.exc_info()[1] if not (IS_LINUX and e.args[0] == errno.EPERM): raise mitogen.core.StreamError(OPENPTY_MSG, e) master_fd, slave_fd = _linux_broken_devpts_openpty() master_fp = os.fdopen(master_fd, 'r+b', 0) slave_fp = os.fdopen(slave_fd, 'r+b', 0) disable_echo(master_fd) disable_echo(slave_fd) mitogen.core.set_block(slave_fd) return master_fp, slave_fp def tty_create_child(args): """ Return a file descriptor connected to the master end of a pseudo-terminal, whose slave end is connected to stdin/stdout/stderr of a new child process. The child is created such that the pseudo-terminal becomes its controlling TTY, ensuring access to /dev/tty returns a new file descriptor open on the slave end. :param list args: Program argument vector. :returns: :class:`Process` instance. """ master_fp, slave_fp = openpty() try: proc = popen( args=args, stdin=slave_fp, stdout=slave_fp, stderr=slave_fp, preexec_fn=_acquire_controlling_tty, close_fds=True, ) except: master_fp.close() slave_fp.close() raise slave_fp.close() return PopenProcess( proc=proc, stdin=master_fp, stdout=master_fp, ) def hybrid_tty_create_child(args, escalates_privilege=False): """ Like :func:`tty_create_child`, except attach stdin/stdout to a socketpair like :func:`create_child`, but leave stderr and the controlling TTY attached to a TTY. This permits high throughput communication with programs that are reached via some program that requires a TTY for password input, like many configurations of sudo. The UNIX TTY layer tends to have tiny (no more than 14KiB) buffers, forcing many IO loop iterations when transferring bulk data, causing significant performance loss. :param bool escalates_privilege: If :data:`True`, the target program may escalate privileges, causing SELinux to disconnect AF_UNIX sockets, so avoid those. :param list args: Program argument vector. :returns: :class:`Process` instance. """ master_fp, slave_fp = openpty() try: parent_rfp, child_wfp, child_rfp, parent_wfp = create_best_pipe( escalates_privilege=escalates_privilege, ) try: mitogen.core.set_block(child_rfp) mitogen.core.set_block(child_wfp) proc = popen( args=args, stdin=child_rfp, stdout=child_wfp, stderr=slave_fp, preexec_fn=_acquire_controlling_tty, close_fds=True, ) except: parent_rfp.close() child_wfp.close() parent_wfp.close() child_rfp.close() raise except: master_fp.close() slave_fp.close() raise slave_fp.close() child_rfp.close() child_wfp.close() return PopenProcess( proc=proc, stdin=parent_wfp, stdout=parent_rfp, stderr=master_fp, ) class Timer(object): """ Represents a future event. """ #: Set to :data:`False` if :meth:`cancel` has been called, or immediately #: prior to being executed by :meth:`TimerList.expire`. active = True def __init__(self, when, func): self.when = when self.func = func def __repr__(self): return 'Timer(%r, %r)' % (self.when, self.func) def __eq__(self, other): return self.when == other.when def __lt__(self, other): return self.when < other.when def __le__(self, other): return self.when <= other.when def cancel(self): """ Cancel this event. If it has not yet executed, it will not execute during any subsequent :meth:`TimerList.expire` call. """ self.active = False class TimerList(object): """ Efficiently manage a list of cancellable future events relative to wall clock time. An instance of this class is installed as :attr:`mitogen.master.Broker.timers` by default, and as :attr:`mitogen.core.Broker.timers` in children after a call to :func:`mitogen.parent.upgrade_router`. You can use :class:`TimerList` to cause the broker to wake at arbitrary future moments, useful for implementing timeouts and polling in an asynchronous context. :class:`TimerList` methods can only be called from asynchronous context, for example via :meth:`mitogen.core.Broker.defer`. The broker automatically adjusts its sleep delay according to the installed timer list, and arranges for timers to expire via automatic calls to :meth:`expire`. The main user interface to :class:`TimerList` is :meth:`schedule`. """ _now = mitogen.core.now def __init__(self): self._lst = [] def get_timeout(self): """ Return the floating point seconds until the next event is due. :returns: Floating point delay, or 0.0, or :data:`None` if no events are scheduled. """ while self._lst and not self._lst[0].active: heapq.heappop(self._lst) if self._lst: return max(0, self._lst[0].when - self._now()) def schedule(self, when, func): """ Schedule a future event. :param float when: UNIX time in seconds when event should occur. :param callable func: Callable to invoke on expiry. :returns: A :class:`Timer` instance, exposing :meth:`Timer.cancel`, which may be used to cancel the future invocation. """ timer = Timer(when, func) heapq.heappush(self._lst, timer) return timer def expire(self): """ Invoke callbacks for any events in the past. """ now = self._now() while self._lst and self._lst[0].when <= now: timer = heapq.heappop(self._lst) if timer.active: timer.active = False timer.func() class PartialZlib(object): """ Because the mitogen.core source has a line appended to it during bootstrap, it must be recompressed for each connection. This is not a problem for a small number of connections, but it amounts to 30 seconds CPU time by the time 500 targets are in use. For that reason, build a compressor containing mitogen.core and flush as much of it as possible into an initial buffer. Then to append the custom line, clone the compressor and compress just that line. A full compression costs ~6ms on a modern machine, this method costs ~35 usec. """ def __init__(self, s): self.s = s if sys.version_info > (2, 5): self._compressor = zlib.compressobj(9) self._out = self._compressor.compress(s) self._out += self._compressor.flush(zlib.Z_SYNC_FLUSH) else: self._compressor = None def append(self, s): """ Append the bytestring `s` to the compressor state and return the final compressed output. """ if self._compressor is None: return zlib.compress(self.s + s, 9) else: compressor = self._compressor.copy() out = self._out out += compressor.compress(s) return out + compressor.flush() def _upgrade_broker(broker): """ Extract the poller state from Broker and replace it with the industrial strength poller for this OS. Must run on the Broker thread. """ # This function is deadly! The act of calling start_receive() generates log # messages which must be silenced as the upgrade progresses, otherwise the # poller state will change as it is copied, resulting in write fds that are # lost. (Due to LogHandler->Router->Stream->Protocol->Broker->Poller, where # Stream only calls start_transmit() when transitioning from empty to # non-empty buffer. If the start_transmit() is lost, writes from the child # hang permanently). root = logging.getLogger() old_level = root.level root.setLevel(logging.CRITICAL) try: old = broker.poller new = PREFERRED_POLLER() for fd, data in old.readers: new.start_receive(fd, data) for fd, data in old.writers: new.start_transmit(fd, data) old.close() broker.poller = new finally: root.setLevel(old_level) broker.timers = TimerList() LOG.debug('upgraded %r with %r (new: %d readers, %d writers; ' 'old: %d readers, %d writers)', old, new, len(new._rfds), len(new._wfds), len(old._rfds), len(old._wfds)) @mitogen.core.takes_econtext def upgrade_router(econtext): if not isinstance(econtext.router, Router): # TODO econtext.broker.defer(_upgrade_broker, econtext.broker) econtext.router.__class__ = Router # TODO econtext.router.upgrade( importer=econtext.importer, parent=econtext.parent, ) def get_connection_class(name): """ Given the name of a Mitogen connection method, import its implementation module and return its Stream subclass. """ if name == u'local': name = u'parent' module = mitogen.core.import_module(u'mitogen.' + name) return module.Connection @mitogen.core.takes_econtext def _proxy_connect(name, method_name, kwargs, econtext): """ Implements the target portion of Router._proxy_connect() by upgrading the local process to a parent if it was not already, then calling back into Router._connect() using the arguments passed to the parent's Router.connect(). :returns: Dict containing: * ``id``: :data:`None`, or integer new context ID. * ``name``: :data:`None`, or string name attribute of new Context. * ``msg``: :data:`None`, or StreamError exception text. """ upgrade_router(econtext) try: context = econtext.router._connect( klass=get_connection_class(method_name), name=name, **kwargs ) except mitogen.core.StreamError: return { u'id': None, u'name': None, u'msg': 'error occurred on host %s: %s' % ( socket.gethostname(), sys.exc_info()[1], ), } return { u'id': context.context_id, u'name': context.name, u'msg': None, } def returncode_to_str(n): """ Parse and format a :func:`os.waitpid` exit status. """ if n < 0: return 'exited due to signal %d (%s)' % (-n, SIGNAL_BY_NUM.get(-n)) return 'exited with return code %d' % (n,) class EofError(mitogen.core.StreamError): """ Raised by :class:`Connection` when an empty read is detected from the remote process before bootstrap completes. """ # inherits from StreamError to maintain compatibility. pass class CancelledError(mitogen.core.StreamError): """ Raised by :class:`Connection` when :meth:`mitogen.core.Broker.shutdown` is called before bootstrap completes. """ pass class Argv(object): """ Wrapper to defer argv formatting when debug logging is disabled. """ def __init__(self, argv): self.argv = argv must_escape = frozenset('\\$"`!') must_escape_or_space = must_escape | frozenset(' ') def escape(self, x): if not self.must_escape_or_space.intersection(x): return x s = '"' for c in x: if c in self.must_escape: s += '\\' s += c s += '"' return s def __str__(self): return ' '.join(map(self.escape, self.argv)) class CallSpec(object): """ Wrapper to defer call argument formatting when debug logging is disabled. """ def __init__(self, func, args, kwargs): self.func = func self.args = args self.kwargs = kwargs def _get_name(self): bits = [self.func.__module__] if inspect.ismethod(self.func): im_self = getattr(self.func, IM_SELF_ATTR) bits.append(getattr(im_self, '__name__', None) or getattr(type(im_self), '__name__', None)) bits.append(self.func.__name__) return u'.'.join(bits) def _get_args(self): return u', '.join(repr(a) for a in self.args) def _get_kwargs(self): s = u'' if self.kwargs: s = u', '.join('%s=%r' % (k, v) for k, v in self.kwargs.items()) if self.args: s = u', ' + s return s def __repr__(self): return '%s(%s%s)' % ( self._get_name(), self._get_args(), self._get_kwargs(), ) class PollPoller(mitogen.core.Poller): """ Poller based on the POSIX :linux:man2:`poll` interface. Not available on some Python/OS X combinations. Otherwise the preferred poller for small FD counts; or if many pollers are created, used once, then closed. There there is no setup/teardown/configuration system call overhead. """ SUPPORTED = hasattr(select, 'poll') _readmask = SUPPORTED and select.POLLIN | select.POLLHUP def __init__(self): super(PollPoller, self).__init__() self._pollobj = select.poll() # TODO: no proof we dont need writemask too def _update(self, fd): mask = (((fd in self._rfds) and self._readmask) | ((fd in self._wfds) and select.POLLOUT)) if mask: self._pollobj.register(fd, mask) else: try: self._pollobj.unregister(fd) except KeyError: pass def _poll(self, timeout): if timeout: timeout *= 1000 events, _ = mitogen.core.io_op(self._pollobj.poll, timeout) for fd, event in events: if event & self._readmask: IOLOG.debug('%r: POLLIN|POLLHUP for %r', self, fd) data, gen = self._rfds.get(fd, (None, None)) if gen and gen < self._generation: yield data if event & select.POLLOUT: IOLOG.debug('%r: POLLOUT for %r', self, fd) data, gen = self._wfds.get(fd, (None, None)) if gen and gen < self._generation: yield data class KqueuePoller(mitogen.core.Poller): """ Poller based on the FreeBSD/Darwin :freebsd:man2:`kqueue` interface. """ SUPPORTED = hasattr(select, 'kqueue') def __init__(self): super(KqueuePoller, self).__init__() self._kqueue = select.kqueue() self._changelist = [] def close(self): super(KqueuePoller, self).close() self._kqueue.close() def _control(self, fd, filters, flags): mitogen.core._vv and IOLOG.debug( '%r._control(%r, %r, %r)', self, fd, filters, flags) # TODO: at shutdown it is currently possible for KQ_EV_ADD/KQ_EV_DEL # pairs to be pending after the associated file descriptor has already # been closed. Fixing this requires maintaining extra state, or perhaps # making fd closure the poller's responsibility. In the meantime, # simply apply changes immediately. # self._changelist.append(select.kevent(fd, filters, flags)) changelist = [select.kevent(fd, filters, flags)] events, _ = mitogen.core.io_op(self._kqueue.control, changelist, 0, 0) assert not events def start_receive(self, fd, data=None): mitogen.core._vv and IOLOG.debug('%r.start_receive(%r, %r)', self, fd, data) if fd not in self._rfds: self._control(fd, select.KQ_FILTER_READ, select.KQ_EV_ADD) self._rfds[fd] = (data or fd, self._generation) def stop_receive(self, fd): mitogen.core._vv and IOLOG.debug('%r.stop_receive(%r)', self, fd) if fd in self._rfds: self._control(fd, select.KQ_FILTER_READ, select.KQ_EV_DELETE) del self._rfds[fd] def start_transmit(self, fd, data=None): mitogen.core._vv and IOLOG.debug('%r.start_transmit(%r, %r)', self, fd, data) if fd not in self._wfds: self._control(fd, select.KQ_FILTER_WRITE, select.KQ_EV_ADD) self._wfds[fd] = (data or fd, self._generation) def stop_transmit(self, fd): mitogen.core._vv and IOLOG.debug('%r.stop_transmit(%r)', self, fd) if fd in self._wfds: self._control(fd, select.KQ_FILTER_WRITE, select.KQ_EV_DELETE) del self._wfds[fd] def _poll(self, timeout): changelist = self._changelist self._changelist = [] events, _ = mitogen.core.io_op(self._kqueue.control, changelist, 32, timeout) for event in events: fd = event.ident if event.flags & select.KQ_EV_ERROR: LOG.debug('ignoring stale event for fd %r: errno=%d: %s', fd, event.data, errno.errorcode.get(event.data)) elif event.filter == select.KQ_FILTER_READ: data, gen = self._rfds.get(fd, (None, None)) # Events can still be read for an already-discarded fd. if gen and gen < self._generation: mitogen.core._vv and IOLOG.debug('%r: POLLIN: %r', self, fd) yield data elif event.filter == select.KQ_FILTER_WRITE and fd in self._wfds: data, gen = self._wfds.get(fd, (None, None)) if gen and gen < self._generation: mitogen.core._vv and IOLOG.debug('%r: POLLOUT: %r', self, fd) yield data class EpollPoller(mitogen.core.Poller): """ Poller based on the Linux :linux:man7:`epoll` interface. """ SUPPORTED = hasattr(select, 'epoll') _inmask = SUPPORTED and select.EPOLLIN | select.EPOLLHUP def __init__(self): super(EpollPoller, self).__init__() self._epoll = select.epoll(32) self._registered_fds = set() def close(self): super(EpollPoller, self).close() self._epoll.close() def _control(self, fd): mitogen.core._vv and IOLOG.debug('%r._control(%r)', self, fd) mask = (((fd in self._rfds) and select.EPOLLIN) | ((fd in self._wfds) and select.EPOLLOUT)) if mask: if fd in self._registered_fds: self._epoll.modify(fd, mask) else: self._epoll.register(fd, mask) self._registered_fds.add(fd) elif fd in self._registered_fds: self._epoll.unregister(fd) self._registered_fds.remove(fd) def start_receive(self, fd, data=None): mitogen.core._vv and IOLOG.debug('%r.start_receive(%r, %r)', self, fd, data) self._rfds[fd] = (data or fd, self._generation) self._control(fd) def stop_receive(self, fd): mitogen.core._vv and IOLOG.debug('%r.stop_receive(%r)', self, fd) self._rfds.pop(fd, None) self._control(fd) def start_transmit(self, fd, data=None): mitogen.core._vv and IOLOG.debug('%r.start_transmit(%r, %r)', self, fd, data) self._wfds[fd] = (data or fd, self._generation) self._control(fd) def stop_transmit(self, fd): mitogen.core._vv and IOLOG.debug('%r.stop_transmit(%r)', self, fd) self._wfds.pop(fd, None) self._control(fd) def _poll(self, timeout): the_timeout = -1 if timeout is not None: the_timeout = timeout events, _ = mitogen.core.io_op(self._epoll.poll, the_timeout, 32) for fd, event in events: if event & self._inmask: data, gen = self._rfds.get(fd, (None, None)) if gen and gen < self._generation: # Events can still be read for an already-discarded fd. mitogen.core._vv and IOLOG.debug('%r: POLLIN: %r', self, fd) yield data if event & select.EPOLLOUT: data, gen = self._wfds.get(fd, (None, None)) if gen and gen < self._generation: mitogen.core._vv and IOLOG.debug('%r: POLLOUT: %r', self, fd) yield data POLLERS = (EpollPoller, KqueuePoller, PollPoller, mitogen.core.Poller) PREFERRED_POLLER = next(cls for cls in POLLERS if cls.SUPPORTED) # For processes that start many threads or connections, it's possible Latch # will also get high-numbered FDs, and so select() becomes useless there too. POLLER_LIGHTWEIGHT = PollPoller.SUPPORTED and PollPoller or PREFERRED_POLLER mitogen.core.Latch.poller_class = POLLER_LIGHTWEIGHT class LineLoggingProtocolMixin(object): def __init__(self, **kwargs): super(LineLoggingProtocolMixin, self).__init__(**kwargs) self.logged_lines = [] self.logged_partial = None def on_line_received(self, line): self.logged_partial = None self.logged_lines.append((mitogen.core.now(), line)) self.logged_lines[:] = self.logged_lines[-100:] return super(LineLoggingProtocolMixin, self).on_line_received(line) def on_partial_line_received(self, line): self.logged_partial = line return super(LineLoggingProtocolMixin, self).on_partial_line_received(line) def on_disconnect(self, broker): if self.logged_partial: self.logged_lines.append((mitogen.core.now(), self.logged_partial)) self.logged_partial = None super(LineLoggingProtocolMixin, self).on_disconnect(broker) def get_history(streams): history = [] for stream in streams: if stream: history.extend(getattr(stream.protocol, 'logged_lines', [])) history.sort() s = b('\n').join(h[1] for h in history) return mitogen.core.to_text(s) class RegexProtocol(LineLoggingProtocolMixin, mitogen.core.DelimitedProtocol): """ Implement a delimited protocol where messages matching a set of regular expressions are dispatched to individual handler methods. Input is dispatches using :attr:`PATTERNS` and :attr:`PARTIAL_PATTERNS`, before falling back to :meth:`on_unrecognized_line_received` and :meth:`on_unrecognized_partial_line_received`. """ #: A sequence of 2-tuples of the form `(compiled pattern, method)` for #: patterns that should be matched against complete (delimited) messages, #: i.e. full lines. PATTERNS = [] #: Like :attr:`PATTERNS`, but patterns that are matched against incomplete #: lines. PARTIAL_PATTERNS = [] def on_line_received(self, line): super(RegexProtocol, self).on_line_received(line) for pattern, func in self.PATTERNS: match = pattern.search(line) if match is not None: return func(self, line, match) return self.on_unrecognized_line_received(line) def on_unrecognized_line_received(self, line): LOG.debug('%s: (unrecognized): %s', self.stream.name, line.decode('utf-8', 'replace')) def on_partial_line_received(self, line): super(RegexProtocol, self).on_partial_line_received(line) LOG.debug('%s: (partial): %s', self.stream.name, line.decode('utf-8', 'replace')) for pattern, func in self.PARTIAL_PATTERNS: match = pattern.search(line) if match is not None: return func(self, line, match) return self.on_unrecognized_partial_line_received(line) def on_unrecognized_partial_line_received(self, line): LOG.debug('%s: (unrecognized partial): %s', self.stream.name, line.decode('utf-8', 'replace')) class BootstrapProtocol(RegexProtocol): """ Respond to stdout of a child during bootstrap. Wait for :attr:`EC0_MARKER` to be written by the first stage to indicate it can receive the bootstrap, then await :attr:`EC1_MARKER` to indicate success, and :class:`MitogenProtocol` can be enabled. """ #: Sentinel value emitted by the first stage to indicate it is ready to #: receive the compressed bootstrap. For :mod:`mitogen.ssh` this must have #: length of at least `max(len('password'), len('debug1:'))` EC0_MARKER = b('MITO000') EC1_MARKER = b('MITO001') EC2_MARKER = b('MITO002') def __init__(self, broker): super(BootstrapProtocol, self).__init__() self._writer = mitogen.core.BufferedWriter(broker, self) def on_transmit(self, broker): self._writer.on_transmit(broker) def _on_ec0_received(self, line, match): LOG.debug('%r: first stage started succcessfully', self) self._writer.write(self.stream.conn.get_preamble()) def _on_ec1_received(self, line, match): LOG.debug('%r: first stage received mitogen.core source', self) def _on_ec2_received(self, line, match): LOG.debug('%r: new child booted successfully', self) self.stream.conn._complete_connection() return False def on_unrecognized_line_received(self, line): LOG.debug('%s: stdout: %s', self.stream.name, line.decode('utf-8', 'replace')) PATTERNS = [ (re.compile(EC0_MARKER), _on_ec0_received), (re.compile(EC1_MARKER), _on_ec1_received), (re.compile(EC2_MARKER), _on_ec2_received), ] class LogProtocol(LineLoggingProtocolMixin, mitogen.core.DelimitedProtocol): """ For "hybrid TTY/socketpair" mode, after connection setup a spare TTY master FD exists that cannot be closed, and to which SSH or sudo may continue writing log messages. The descriptor cannot be closed since the UNIX TTY layer sends SIGHUP to processes whose controlling TTY is the slave whose master side was closed. LogProtocol takes over this FD and creates log messages for anything written to it. """ def on_line_received(self, line): """ Read a line, decode it as UTF-8, and log it. """ super(LogProtocol, self).on_line_received(line) LOG.info(u'%s: %s', self.stream.name, line.decode('utf-8', 'replace')) class MitogenProtocol(mitogen.core.MitogenProtocol): """ Extend core.MitogenProtocol to cause SHUTDOWN to be sent to the child during graceful shutdown. """ def on_shutdown(self, broker): """ Respond to the broker's request for the stream to shut down by sending SHUTDOWN to the child. """ LOG.debug('%r: requesting child shutdown', self) self._send( mitogen.core.Message( src_id=mitogen.context_id, dst_id=self.remote_id, handle=mitogen.core.SHUTDOWN, ) ) class Options(object): name = None #: The path to the remote Python interpreter. python_path = get_sys_executable() #: Maximum time to wait for a connection attempt. connect_timeout = 30.0 #: True to cause context to write verbose /tmp/mitogen..log. debug = False #: True to cause context to write /tmp/mitogen.stats...log. profiling = False #: True if unidirectional routing is enabled in the new child. unidirectional = False #: Passed via Router wrapper methods, must eventually be passed to #: ExternalContext.main(). max_message_size = None #: Remote name. remote_name = None #: Derived from :py:attr:`connect_timeout`; absolute floating point #: UNIX timestamp after which the connection attempt should be abandoned. connect_deadline = None def __init__(self, max_message_size, name=None, remote_name=None, python_path=None, debug=False, connect_timeout=None, profiling=False, unidirectional=False, old_router=None): self.name = name self.max_message_size = max_message_size if python_path: self.python_path = python_path if connect_timeout: self.connect_timeout = connect_timeout if remote_name is None: remote_name = get_default_remote_name() if '/' in remote_name or '\\' in remote_name: raise ValueError('remote_name= cannot contain slashes') if remote_name: self.remote_name = mitogen.core.to_text(remote_name) self.debug = debug self.profiling = profiling self.unidirectional = unidirectional self.max_message_size = max_message_size self.connect_deadline = mitogen.core.now() + self.connect_timeout class Connection(object): """ Manage the lifetime of a set of :class:`Streams ` connecting to a remote Python interpreter, including bootstrap, disconnection, and external tool integration. Base for streams capable of starting children. """ options_class = Options #: The protocol attached to stdio of the child. stream_protocol_class = BootstrapProtocol #: The protocol attached to stderr of the child. diag_protocol_class = LogProtocol #: :class:`Process` proc = None #: :class:`mitogen.core.Stream` with sides connected to stdin/stdout. stdio_stream = None #: If `proc.stderr` is set, referencing either a plain pipe or the #: controlling TTY, this references the corresponding #: :class:`LogProtocol`'s stream, allowing it to be disconnected when this #: stream is disconnected. stderr_stream = None #: Function with the semantics of :func:`create_child` used to create the #: child process. create_child = staticmethod(create_child) #: Dictionary of extra kwargs passed to :attr:`create_child`. create_child_args = {} #: :data:`True` if the remote has indicated that it intends to detach, and #: should not be killed on disconnect. detached = False #: If :data:`True`, indicates the child should not be killed during #: graceful detachment, as it the actual process implementing the child #: context. In all other cases, the subprocess is SSH, sudo, or a similar #: tool that should be reminded to quit during disconnection. child_is_immediate_subprocess = True #: Prefix given to default names generated by :meth:`connect`. name_prefix = u'local' #: :class:`Timer` that runs :meth:`_on_timer_expired` when connection #: timeout occurs. _timer = None #: When disconnection completes, instance of :class:`Reaper` used to wait #: on the exit status of the subprocess. _reaper = None #: On failure, the exception object that should be propagated back to the #: user. exception = None #: Extra text appended to :class:`EofError` if that exception is raised on #: a failed connection attempt. May be used in subclasses to hint at common #: problems with a particular connection method. eof_error_hint = None def __init__(self, options, router): #: :class:`Options` self.options = options self._router = router def __repr__(self): return 'Connection(%r)' % (self.stdio_stream,) # Minimised, gzipped, base64'd and passed to 'python -c'. It forks, dups # file descriptor 0 as 100, creates a pipe, then execs a new interpreter # with a custom argv. # * Optimized for minimum byte count after minification & compression. # The script preamble_size.py measures this. # * 'CONTEXT_NAME' and 'PREAMBLE_COMPRESSED_LEN' are substituted with # their respective values. # * CONTEXT_NAME must be prefixed with the name of the Python binary in # order to allow virtualenvs to detect their install prefix. # # macOS tweaks for Python 2.7 must be kept in sync with the the Ansible # module test_echo_module, used by the integration tests. # * macOS <= 10.14 (Darwin <= 18) install an unreliable Python version # switcher as /usr/bin/python, which introspects argv0. To workaround # it we redirect attempts to call /usr/bin/python with an explicit # call to /usr/bin/python2.7. macOS 10.15 (Darwin 19) removed it. # * macOS 11.x (Darwin 20, Big Sur) and macOS 12.x (Darwin 21, Montery) # do something slightly different. The Python executable is patched to # perform an extra execvp(). I don't fully understand the details, but # setting PYTHON_LAUNCHED_FROM_WRAPPER=1 avoids it. # * macOS 12.3+ (Darwin 21.4+, Monterey) doesn't ship Python. # https://developer.apple.com/documentation/macos-release-notes/macos-12_3-release-notes#Python # # Locals: # R: read side of interpreter stdin. # W: write side of interpreter stdin. # r: read side of core_src FD. # w: write side of core_src FD. # C: the decompressed core source. # Final os.close(2) to avoid --py-debug build from corrupting stream with # "[1234 refs]" during exit. @staticmethod def _first_stage(): R,W=os.pipe() r,w=os.pipe() if os.fork(): os.dup2(0,100) os.dup2(R,0) os.dup2(r,101) os.close(R) os.close(r) os.close(W) os.close(w) if os.uname()[0]=='Darwin'and os.uname()[2][:2]<'19'and sys.executable=='/usr/bin/python':sys.executable='/usr/bin/python2.7' if os.uname()[0]=='Darwin'and os.uname()[2][:2]in'2021'and sys.version[:3]=='2.7':os.environ['PYTHON_LAUNCHED_FROM_WRAPPER']='1' os.environ['ARGV0']=sys.executable os.execl(sys.executable,sys.executable+'(mitogen:CONTEXT_NAME)') os.write(1,'MITO000\n'.encode()) C=zlib.decompress(os.fdopen(0,'rb').read(PREAMBLE_COMPRESSED_LEN)) fp=os.fdopen(W,'wb',0) fp.write(C) fp.close() fp=os.fdopen(w,'wb',0) fp.write(C) fp.close() os.write(1,'MITO001\n'.encode()) os.close(2) def get_python_argv(self): """ Return the initial argument vector elements necessary to invoke Python, by returning a 1-element list containing :attr:`python_path` if it is a string, or simply returning it if it is already a list. This allows emulation of existing tools where the Python invocation may be set to e.g. `['/usr/bin/env', 'python']`. """ if isinstance(self.options.python_path, list): return self.options.python_path return [self.options.python_path] def get_boot_command(self): source = inspect.getsource(self._first_stage) source = textwrap.dedent('\n'.join(source.strip().split('\n')[2:])) source = source.replace(' ', ' ') source = source.replace('CONTEXT_NAME', self.options.remote_name) preamble_compressed = self.get_preamble() source = source.replace('PREAMBLE_COMPRESSED_LEN', str(len(preamble_compressed))) compressed = zlib.compress(source.encode(), 9) encoded = binascii.b2a_base64(compressed).replace(b('\n'), b('')) # Just enough to decode, decompress, and exec the first stage. # Priorities: wider compatibility, faster startup, shorter length. # `import os` here, instead of stage 1, to save a few bytes. # `sys.path=...` for https://github.com/python/cpython/issues/115911. return self.get_python_argv() + [ '-c', 'import sys;sys.path=[p for p in sys.path if p];import binascii,os,zlib;' 'exec(zlib.decompress(binascii.a2b_base64("%s")))' % (encoded.decode(),), ] def get_econtext_config(self): assert self.options.max_message_size is not None parent_ids = mitogen.parent_ids[:] parent_ids.insert(0, mitogen.context_id) return { 'parent_ids': parent_ids, 'context_id': self.context.context_id, 'debug': self.options.debug, 'profiling': self.options.profiling, 'unidirectional': self.options.unidirectional, 'log_level': get_log_level(), 'whitelist': self._router.get_module_whitelist(), 'blacklist': self._router.get_module_blacklist(), 'max_message_size': self.options.max_message_size, 'version': mitogen.__version__, } def get_preamble(self): suffix = ( '\nExternalContext(%r).main()\n' % (self.get_econtext_config(),) ) partial = get_core_source_partial() return partial.append(suffix.encode('utf-8')) def _get_name(self): """ Called by :meth:`connect` after :attr:`pid` is known. Subclasses can override it to specify a default stream name, or set :attr:`name_prefix` to generate a default format. """ return u'%s.%s' % (self.name_prefix, self.proc.pid) def start_child(self): args = self.get_boot_command() LOG.debug('command line for %r: %s', self, Argv(args)) try: return self.create_child(args=args, **self.create_child_args) except OSError: e = sys.exc_info()[1] msg = 'Child start failed: %s. Command was: %s' % (e, Argv(args)) raise mitogen.core.StreamError(msg) def _adorn_eof_error(self, e): """ Subclasses may provide additional information in the case of a failed connection. """ if self.eof_error_hint: e.args = ('%s\n\n%s' % (e.args[0], self.eof_error_hint),) def _complete_connection(self): self._timer.cancel() if not self.exception: mitogen.core.unlisten(self._router.broker, 'shutdown', self._on_broker_shutdown) self._router.register(self.context, self.stdio_stream) self.stdio_stream.set_protocol( MitogenProtocol( router=self._router, remote_id=self.context.context_id, ) ) self._router.route_monitor.notice_stream(self.stdio_stream) self.latch.put() def _fail_connection(self, exc): """ Fail the connection attempt. """ LOG.debug('failing connection %s due to %r', self.stdio_stream and self.stdio_stream.name, exc) if self.exception is None: self._adorn_eof_error(exc) self.exception = exc mitogen.core.unlisten(self._router.broker, 'shutdown', self._on_broker_shutdown) for stream in self.stdio_stream, self.stderr_stream: if stream and not stream.receive_side.closed: stream.on_disconnect(self._router.broker) self._complete_connection() eof_error_msg = 'EOF on stream; last 100 lines received:\n' def on_stdio_disconnect(self): """ Handle stdio stream disconnection by failing the Connection if the stderr stream has already been closed. Otherwise, wait for it to close (or timeout), to allow buffered diagnostic logs to be consumed. It is normal that when a subprocess aborts, stdio has nothing buffered when it is closed, thus signalling readability, causing an empty read (interpreted as indicating disconnection) on the next loop iteration, even if its stderr pipe has lots of diagnostic logs still buffered in the kernel. Therefore we must wait for both pipes to indicate they are empty before triggering connection failure. """ stderr = self.stderr_stream if stderr is None or stderr.receive_side.closed: self._on_streams_disconnected() def on_stderr_disconnect(self): """ Inverse of :func:`on_stdio_disconnect`. """ if self.stdio_stream.receive_side.closed: self._on_streams_disconnected() def _on_streams_disconnected(self): """ When disconnection has been detected for both streams, cancel the connection timer, mark the connection failed, and reap the child process. Do nothing if the timer has already been cancelled, indicating some existing failure has already been noticed. """ if self._timer.active: self._timer.cancel() self._fail_connection(EofError( self.eof_error_msg + get_history( [self.stdio_stream, self.stderr_stream] ) )) if self._reaper: return self._reaper = Reaper( broker=self._router.broker, proc=self.proc, kill=not ( (self.detached and self.child_is_immediate_subprocess) or # Avoid killing so child has chance to write cProfile data self._router.profiling ), # Don't delay shutdown waiting for a detached child, since the # detached child may expect to live indefinitely after its parent # exited. wait_on_shutdown=(not self.detached), ) self._reaper.reap() def _on_broker_shutdown(self): """ Respond to broker.shutdown() being called by failing the connection attempt. """ self._fail_connection(CancelledError(BROKER_SHUTDOWN_MSG)) def stream_factory(self): return self.stream_protocol_class.build_stream( broker=self._router.broker, ) def stderr_stream_factory(self): return self.diag_protocol_class.build_stream() def _setup_stdio_stream(self): stream = self.stream_factory() stream.conn = self stream.name = self.options.name or self._get_name() stream.accept(self.proc.stdout, self.proc.stdin) mitogen.core.listen(stream, 'disconnect', self.on_stdio_disconnect) self._router.broker.start_receive(stream) return stream def _setup_stderr_stream(self): stream = self.stderr_stream_factory() stream.conn = self stream.name = self.options.name or self._get_name() stream.accept(self.proc.stderr, self.proc.stderr) mitogen.core.listen(stream, 'disconnect', self.on_stderr_disconnect) self._router.broker.start_receive(stream) return stream def _on_timer_expired(self): self._fail_connection( mitogen.core.TimeoutError( 'Failed to setup connection after %.2f seconds', self.options.connect_timeout, ) ) def _async_connect(self): LOG.debug('creating connection to context %d using %s', self.context.context_id, self.__class__.__module__) mitogen.core.listen(self._router.broker, 'shutdown', self._on_broker_shutdown) self._timer = self._router.broker.timers.schedule( when=self.options.connect_deadline, func=self._on_timer_expired, ) try: self.proc = self.start_child() except Exception: LOG.debug('failed to start child', exc_info=True) self._fail_connection(sys.exc_info()[1]) return LOG.debug('child for %r started: pid:%r stdin:%r stdout:%r stderr:%r', self, self.proc.pid, self.proc.stdin.fileno(), self.proc.stdout.fileno(), self.proc.stderr and self.proc.stderr.fileno()) self.stdio_stream = self._setup_stdio_stream() if self.context.name is None: self.context.name = self.stdio_stream.name self.proc.name = self.stdio_stream.name if self.proc.stderr: self.stderr_stream = self._setup_stderr_stream() def connect(self, context): self.context = context self.latch = mitogen.core.Latch() self._router.broker.defer(self._async_connect) self.latch.get() if self.exception: raise self.exception class ChildIdAllocator(object): """ Allocate new context IDs from a block of unique context IDs allocated by the master process. """ def __init__(self, router): self.router = router self.lock = threading.Lock() self.it = iter(xrange(0)) def allocate(self): """ Allocate an ID, requesting a fresh block from the master if the existing block is exhausted. :returns: The new context ID. .. warning:: This method is not safe to call from the :class:`Broker` thread, as it may block on IO of its own. """ self.lock.acquire() try: for id_ in self.it: return id_ master = self.router.context_by_id(0) start, end = master.send_await( mitogen.core.Message(dst_id=0, handle=mitogen.core.ALLOCATE_ID) ) self.it = iter(xrange(start, end)) finally: self.lock.release() return self.allocate() class CallChain(object): """ Deliver :data:`mitogen.core.CALL_FUNCTION` messages to a target context, optionally threading related calls so an exception in an earlier call cancels subsequent calls. :param mitogen.core.Context context: Target context. :param bool pipelined: Enable pipelining. :meth:`call`, :meth:`call_no_reply` and :meth:`call_async` normally issue calls and produce responses with no memory of prior exceptions. If a call made with :meth:`call_no_reply` fails, the exception is logged to the target context's logging framework. **Pipelining** When pipelining is enabled, if an exception occurs during a call, subsequent calls made by the same :class:`CallChain` fail with the same exception, including those already in-flight on the network, and no further calls execute until :meth:`reset` is invoked. No exception is logged for calls made with :meth:`call_no_reply`, instead the exception is saved and reported as the result of subsequent :meth:`call` or :meth:`call_async` calls. Sequences of asynchronous calls can be made without wasting network round-trips to discover if prior calls succeed, and chains originating from multiple unrelated source contexts may overlap concurrently at a target context without interference. In this example, 4 calls complete in one round-trip:: chain = mitogen.parent.CallChain(context, pipelined=True) chain.call_no_reply(os.mkdir, '/tmp/foo') # If previous mkdir() failed, this never runs: chain.call_no_reply(os.mkdir, '/tmp/foo/bar') # If either mkdir() failed, this never runs, and the exception is # asynchronously delivered to the receiver. recv = chain.call_async(subprocess.check_output, '/tmp/foo') # If anything so far failed, this never runs, and raises the exception. chain.call(do_something) # If this code was executed, the exception would also be raised. if recv.get().unpickle() == 'baz': pass When pipelining is enabled, :meth:`reset` must be invoked to ensure any exception is discarded, otherwise unbounded memory usage is possible in long-running programs. The context manager protocol is supported to ensure :meth:`reset` is always invoked:: with mitogen.parent.CallChain(context, pipelined=True) as chain: chain.call_no_reply(...) chain.call_no_reply(...) chain.call_no_reply(...) chain.call(...) # chain.reset() automatically invoked. """ def __init__(self, context, pipelined=False): self.context = context if pipelined: self.chain_id = self.make_chain_id() else: self.chain_id = None @classmethod def make_chain_id(cls): return '%s-%s-%x-%x' % ( socket.gethostname(), os.getpid(), thread.get_ident(), int(1e6 * mitogen.core.now()), ) def __repr__(self): return '%s(%s)' % (self.__class__.__name__, self.context) def __enter__(self): return self def __exit__(self, _1, _2, _3): self.reset() def reset(self): """ Instruct the target to forget any related exception. """ if not self.chain_id: return saved, self.chain_id = self.chain_id, None try: self.call_no_reply(mitogen.core.Dispatcher.forget_chain, saved) finally: self.chain_id = saved closures_msg = ( 'Mitogen cannot invoke closures, as doing so would require ' 'serializing arbitrary program state, and no universal ' 'method exists to recover a reference to them.' ) lambda_msg = ( 'Mitogen cannot invoke anonymous functions, as no universal method ' 'exists to recover a reference to an anonymous function.' ) method_msg = ( 'Mitogen cannot invoke instance methods, as doing so would require ' 'serializing arbitrary program state.' ) def make_msg(self, fn, *args, **kwargs): if getattr(fn, closure_attr, None) is not None: raise TypeError(self.closures_msg) if fn.__name__ == '': raise TypeError(self.lambda_msg) if inspect.ismethod(fn): im_self = getattr(fn, IM_SELF_ATTR) if not inspect.isclass(im_self): raise TypeError(self.method_msg) klass = mitogen.core.to_text(im_self.__name__) else: klass = None tup = ( self.chain_id, mitogen.core.to_text(fn.__module__), klass, mitogen.core.to_text(fn.__name__), args, mitogen.core.Kwargs(kwargs) ) return mitogen.core.Message.pickled(tup, handle=mitogen.core.CALL_FUNCTION) def call_no_reply(self, fn, *args, **kwargs): """ Like :meth:`call_async`, but do not wait for a return value, and inform the target context no reply is expected. If the call fails and pipelining is disabled, the exception will be logged to the target context's logging framework. """ LOG.debug('starting no-reply function call to %r: %r', self.context.name or self.context.context_id, CallSpec(fn, args, kwargs)) self.context.send(self.make_msg(fn, *args, **kwargs)) def call_async(self, fn, *args, **kwargs): """ Arrange for `fn(*args, **kwargs)` to be invoked on the context's main thread. :param fn: A free function in module scope or a class method of a class directly reachable from module scope: .. code-block:: python # mymodule.py def my_func(): '''A free function reachable as mymodule.my_func''' class MyClass: @classmethod def my_classmethod(cls): '''Reachable as mymodule.MyClass.my_classmethod''' def my_instancemethod(self): '''Unreachable: requires a class instance!''' class MyEmbeddedClass: @classmethod def my_classmethod(cls): '''Not directly reachable from module scope!''' :param tuple args: Function arguments, if any. See :ref:`serialization-rules` for permitted types. :param dict kwargs: Function keyword arguments, if any. See :ref:`serialization-rules` for permitted types. :returns: :class:`mitogen.core.Receiver` configured to receive the result of the invocation: .. code-block:: python recv = context.call_async(os.check_output, 'ls /tmp/') try: # Prints output once it is received. msg = recv.get() print(msg.unpickle()) except mitogen.core.CallError, e: print('Call failed:', str(e)) Asynchronous calls may be dispatched in parallel to multiple contexts and consumed as they complete using :class:`mitogen.select.Select`. """ LOG.debug('starting function call to %s: %r', self.context.name or self.context.context_id, CallSpec(fn, args, kwargs)) return self.context.send_async(self.make_msg(fn, *args, **kwargs)) def call(self, fn, *args, **kwargs): """ Like :meth:`call_async`, but block until the return value is available. Equivalent to:: call_async(fn, *args, **kwargs).get().unpickle() :returns: The function's return value. :raises mitogen.core.CallError: An exception was raised in the remote context during execution. """ receiver = self.call_async(fn, *args, **kwargs) return receiver.get().unpickle(throw_dead=False) class Context(mitogen.core.Context): """ Extend :class:`mitogen.core.Context` with functionality useful to masters, and child contexts who later become parents. Currently when this class is required, the target context's router is upgraded at runtime. """ #: A :class:`CallChain` instance constructed by default, with pipelining #: disabled. :meth:`call`, :meth:`call_async` and :meth:`call_no_reply` use #: this instance. call_chain_class = CallChain via = None def __init__(self, *args, **kwargs): super(Context, self).__init__(*args, **kwargs) self.default_call_chain = self.call_chain_class(self) def __ne__(self, other): return not (self == other) def __eq__(self, other): return ( isinstance(other, mitogen.core.Context) and (other.context_id == self.context_id) and (other.router == self.router) ) def __hash__(self): return hash((self.router, self.context_id)) def call_async(self, fn, *args, **kwargs): """ See :meth:`CallChain.call_async`. """ return self.default_call_chain.call_async(fn, *args, **kwargs) def call(self, fn, *args, **kwargs): """ See :meth:`CallChain.call`. """ return self.default_call_chain.call(fn, *args, **kwargs) def call_no_reply(self, fn, *args, **kwargs): """ See :meth:`CallChain.call_no_reply`. """ self.default_call_chain.call_no_reply(fn, *args, **kwargs) def shutdown(self, wait=False): """ Arrange for the context to receive a ``SHUTDOWN`` message, triggering graceful shutdown. Due to a lack of support for timers, no attempt is made yet to force terminate a hung context using this method. This will be fixed shortly. :param bool wait: If :data:`True`, block the calling thread until the context has completely terminated. :returns: If `wait` is :data:`False`, returns a :class:`mitogen.core.Latch` whose :meth:`get() ` method returns :data:`None` when shutdown completes. The `timeout` parameter may be used to implement graceful timeouts. """ LOG.debug('%r.shutdown() sending SHUTDOWN', self) latch = mitogen.core.Latch() mitogen.core.listen(self, 'disconnect', lambda: latch.put(None)) self.send( mitogen.core.Message( handle=mitogen.core.SHUTDOWN, ) ) if wait: latch.get() else: return latch class RouteMonitor(object): """ Generate and respond to :data:`mitogen.core.ADD_ROUTE` and :data:`mitogen.core.DEL_ROUTE` messages sent to the local context by maintaining a table of available routes, and propagating messages towards parents and siblings as appropriate. :class:`RouteMonitor` is responsible for generating routing messages for directly attached children. It learns of new children via :meth:`notice_stream` called by :class:`Router`, and subscribes to their ``disconnect`` event to learn when they disappear. In children, constructing this class overwrites the stub :data:`mitogen.core.DEL_ROUTE` handler installed by :class:`mitogen.core.ExternalContext`, which is expected behaviour when a child is beging upgraded in preparation to become a parent of children of its own. By virtue of only being active while responding to messages from a handler, RouteMonitor lives entirely on the broker thread, so its data requires no locking. :param mitogen.master.Router router: Router to install handlers on. :param mitogen.core.Context parent: :data:`None` in the master process, or reference to the parent context we should propagate route updates towards. """ def __init__(self, router, parent=None): self.router = router self.parent = parent self._log = logging.getLogger('mitogen.route_monitor') #: Mapping of Stream instance to integer context IDs reachable via the #: stream; used to cleanup routes during disconnection. self._routes_by_stream = {} self.router.add_handler( fn=self._on_add_route, handle=mitogen.core.ADD_ROUTE, persist=True, policy=is_immediate_child, overwrite=True, ) self.router.add_handler( fn=self._on_del_route, handle=mitogen.core.DEL_ROUTE, persist=True, policy=is_immediate_child, overwrite=True, ) def __repr__(self): return 'RouteMonitor()' def _send_one(self, stream, handle, target_id, name): """ Compose and send an update message on a stream. :param mitogen.core.Stream stream: Stream to send it on. :param int handle: :data:`mitogen.core.ADD_ROUTE` or :data:`mitogen.core.DEL_ROUTE` :param int target_id: ID of the connecting or disconnecting context. :param str name: Context name or :data:`None`. """ if not stream: # We may not have a stream during shutdown. return data = str(target_id) if name: data = '%s:%s' % (target_id, name) stream.protocol.send( mitogen.core.Message( handle=handle, data=data.encode('utf-8'), dst_id=stream.protocol.remote_id, ) ) def _propagate_up(self, handle, target_id, name=None): """ In a non-master context, propagate an update towards the master. :param int handle: :data:`mitogen.core.ADD_ROUTE` or :data:`mitogen.core.DEL_ROUTE` :param int target_id: ID of the connecting or disconnecting context. :param str name: For :data:`mitogen.core.ADD_ROUTE`, the name of the new context assigned by its parent. This is used by parents to assign the :attr:`mitogen.core.Context.name` attribute. """ if self.parent: stream = self.router.stream_by_id(self.parent.context_id) self._send_one(stream, handle, target_id, name) def _propagate_down(self, handle, target_id): """ For DEL_ROUTE, we additionally want to broadcast the message to any stream that has ever communicated with the disconnecting ID, so core.py's :meth:`mitogen.core.Router._on_del_route` can turn the message into a disconnect event. :param int handle: :data:`mitogen.core.ADD_ROUTE` or :data:`mitogen.core.DEL_ROUTE` :param int target_id: ID of the connecting or disconnecting context. """ for stream in self.router.get_streams(): if target_id in stream.protocol.egress_ids and ( (self.parent is None) or (self.parent.context_id != stream.protocol.remote_id) ): self._send_one(stream, mitogen.core.DEL_ROUTE, target_id, None) def notice_stream(self, stream): """ When this parent is responsible for a new directly connected child stream, we're also responsible for broadcasting :data:`mitogen.core.DEL_ROUTE` upstream when that child disconnects. """ self._routes_by_stream[stream] = set([stream.protocol.remote_id]) self._propagate_up(mitogen.core.ADD_ROUTE, stream.protocol.remote_id, stream.name) mitogen.core.listen( obj=stream, name='disconnect', func=lambda: self._on_stream_disconnect(stream), ) def get_routes(self, stream): """ Return the set of context IDs reachable on a stream. :param mitogen.core.Stream stream: :returns: set([int]) """ return self._routes_by_stream.get(stream) or set() def _on_stream_disconnect(self, stream): """ Respond to disconnection of a local stream by propagating DEL_ROUTE for any contexts we know were attached to it. """ # During a stream crash it is possible for disconnect signal to fire # twice, in which case ignore the second instance. routes = self._routes_by_stream.pop(stream, None) if routes is None: return self._log.debug('stream %s is gone; propagating DEL_ROUTE for %r', stream.name, routes) for target_id in routes: self.router.del_route(target_id) self._propagate_up(mitogen.core.DEL_ROUTE, target_id) self._propagate_down(mitogen.core.DEL_ROUTE, target_id) context = self.router.context_by_id(target_id, create=False) if context: mitogen.core.fire(context, 'disconnect') def _on_add_route(self, msg): """ Respond to :data:`mitogen.core.ADD_ROUTE` by validating the source of the message, updating the local table, and propagating the message upwards. """ if msg.is_dead: return target_id_s, _, target_name = bytes_partition(msg.data, b(':')) target_name = target_name.decode() target_id = int(target_id_s) self.router.context_by_id(target_id).name = target_name stream = self.router.stream_by_id(msg.src_id) current = self.router.stream_by_id(target_id) if current and current.protocol.remote_id != mitogen.parent_id: self._log.error('Cannot add duplicate route to %r via %r, ' 'already have existing route via %r', target_id, stream, current) return self._log.debug('Adding route to %d via %r', target_id, stream) self._routes_by_stream[stream].add(target_id) self.router.add_route(target_id, stream) self._propagate_up(mitogen.core.ADD_ROUTE, target_id, target_name) def _on_del_route(self, msg): """ Respond to :data:`mitogen.core.DEL_ROUTE` by validating the source of the message, updating the local table, propagating the message upwards, and downwards towards any stream that every had a message forwarded from it towards the disconnecting context. """ if msg.is_dead: return target_id = int(msg.data) registered_stream = self.router.stream_by_id(target_id) if registered_stream is None: return stream = self.router.stream_by_id(msg.src_id) if registered_stream != stream: self._log.error('received DEL_ROUTE for %d from %r, expected %r', target_id, stream, registered_stream) return context = self.router.context_by_id(target_id, create=False) if context: self._log.debug('firing local disconnect signal for %r', context) mitogen.core.fire(context, 'disconnect') self._log.debug('deleting route to %d via %r', target_id, stream) routes = self._routes_by_stream.get(stream) if routes: routes.discard(target_id) self.router.del_route(target_id) if stream.protocol.remote_id != mitogen.parent_id: self._propagate_up(mitogen.core.DEL_ROUTE, target_id) self._propagate_down(mitogen.core.DEL_ROUTE, target_id) class Router(mitogen.core.Router): context_class = Context debug = False profiling = False id_allocator = None responder = None log_forwarder = None route_monitor = None def upgrade(self, importer, parent): LOG.debug('upgrading %r with capabilities to start new children', self) self.id_allocator = ChildIdAllocator(router=self) self.responder = ModuleForwarder( router=self, parent_context=parent, importer=importer, ) self.route_monitor = RouteMonitor(self, parent) self.add_handler( fn=self._on_detaching, handle=mitogen.core.DETACHING, persist=True, ) def _on_detaching(self, msg): if msg.is_dead: return stream = self.stream_by_id(msg.src_id) if stream.protocol.remote_id != msg.src_id or stream.conn.detached: LOG.warning('bad DETACHING received on %r: %r', stream, msg) return LOG.debug('%r: marking as detached', stream) stream.conn.detached = True msg.reply(None) def get_streams(self): """ Return an atomic snapshot of all streams in existence at time of call. This is safe to call from any thread. """ self._write_lock.acquire() try: return itervalues(self._stream_by_id) finally: self._write_lock.release() def disconnect(self, context): """ Disconnect a context and forget its stream, assuming the context is directly connected. """ stream = self.stream_by_id(context) if stream is None or stream.protocol.remote_id != context.context_id: return l = mitogen.core.Latch() mitogen.core.listen(stream, 'disconnect', l.put) def disconnect(): LOG.debug('Starting disconnect of %r', stream) stream.on_disconnect(self.broker) self.broker.defer(disconnect) l.get() def add_route(self, target_id, stream): """ Arrange for messages whose `dst_id` is `target_id` to be forwarded on a directly connected :class:`Stream`. Safe to call from any thread. This is called automatically by :class:`RouteMonitor` in response to :data:`mitogen.core.ADD_ROUTE` messages, but remains public while the design has not yet settled, and situations may arise where routing is not fully automatic. :param int target_id: Target context ID to add a route for. :param mitogen.core.Stream stream: Stream over which messages to the target should be routed. """ LOG.debug('%r: adding route to context %r via %r', self, target_id, stream) assert isinstance(target_id, int) assert isinstance(stream, mitogen.core.Stream) self._write_lock.acquire() try: self._stream_by_id[target_id] = stream finally: self._write_lock.release() def del_route(self, target_id): """ Delete any route that exists for `target_id`. It is not an error to delete a route that does not currently exist. Safe to call from any thread. This is called automatically by :class:`RouteMonitor` in response to :data:`mitogen.core.DEL_ROUTE` messages, but remains public while the design has not yet settled, and situations may arise where routing is not fully automatic. :param int target_id: Target context ID to delete route for. """ LOG.debug('%r: deleting route to %r', self, target_id) # DEL_ROUTE may be sent by a parent if it knows this context sent # messages to a peer that has now disconnected, to let us raise # 'disconnect' event on the appropriate Context instance. In that case, # we won't a matching _stream_by_id entry for the disappearing route, # so don't raise an error for a missing key here. self._write_lock.acquire() try: self._stream_by_id.pop(target_id, None) finally: self._write_lock.release() def get_module_blacklist(self): if mitogen.context_id == 0: return self.responder.blacklist return self.importer.master_blacklist def get_module_whitelist(self): if mitogen.context_id == 0: return self.responder.whitelist return self.importer.master_whitelist def allocate_id(self): return self.id_allocator.allocate() connection_timeout_msg = u"Connection timed out." def _connect(self, klass, **kwargs): context_id = self.allocate_id() context = self.context_class(self, context_id) context.name = kwargs.get('name') kwargs['old_router'] = self kwargs['max_message_size'] = self.max_message_size conn = klass(klass.options_class(**kwargs), self) try: conn.connect(context=context) except mitogen.core.TimeoutError: raise mitogen.core.StreamError(self.connection_timeout_msg) return context def connect(self, method_name, name=None, **kwargs): if name: name = mitogen.core.to_text(name) klass = get_connection_class(method_name) kwargs.setdefault(u'debug', self.debug) kwargs.setdefault(u'profiling', self.profiling) kwargs.setdefault(u'unidirectional', self.unidirectional) kwargs.setdefault(u'name', name) via = kwargs.pop(u'via', None) if via is not None: return self.proxy_connect(via, method_name, **mitogen.core.Kwargs(kwargs)) return self._connect(klass, **mitogen.core.Kwargs(kwargs)) def proxy_connect(self, via_context, method_name, name=None, **kwargs): resp = via_context.call(_proxy_connect, name=name, method_name=method_name, kwargs=mitogen.core.Kwargs(kwargs), ) if resp['msg'] is not None: raise mitogen.core.StreamError(resp['msg']) name = u'%s.%s' % (via_context.name, resp['name']) context = self.context_class(self, resp['id'], name=name) context.via = via_context self._write_lock.acquire() try: self._context_by_id[context.context_id] = context finally: self._write_lock.release() return context def buildah(self, **kwargs): return self.connect(u'buildah', **kwargs) def doas(self, **kwargs): return self.connect(u'doas', **kwargs) def docker(self, **kwargs): return self.connect(u'docker', **kwargs) def kubectl(self, **kwargs): return self.connect(u'kubectl', **kwargs) def fork(self, **kwargs): return self.connect(u'fork', **kwargs) def jail(self, **kwargs): return self.connect(u'jail', **kwargs) def local(self, **kwargs): return self.connect(u'local', **kwargs) def lxc(self, **kwargs): return self.connect(u'lxc', **kwargs) def lxd(self, **kwargs): return self.connect(u'lxd', **kwargs) def setns(self, **kwargs): return self.connect(u'setns', **kwargs) def su(self, **kwargs): return self.connect(u'su', **kwargs) def sudo(self, **kwargs): return self.connect(u'sudo', **kwargs) def ssh(self, **kwargs): return self.connect(u'ssh', **kwargs) def podman(self, **kwargs): return self.connect(u'podman', **kwargs) class Reaper(object): """ Asynchronous logic for reaping :class:`Process` objects. This is necessary to prevent uncontrolled buildup of zombie processes in long-lived parents that will eventually reach an OS limit, preventing creation of new threads and processes, and to log the exit status of the child in the case of an error. To avoid modifying process-global state such as with :func:`signal.set_wakeup_fd` or installing a :data:`signal.SIGCHLD` handler that might interfere with the user's ability to use those facilities, Reaper polls for exit with backoff using timers installed on an associated :class:`Broker`. :param mitogen.core.Broker broker: The :class:`Broker` on which to install timers :param mitogen.parent.Process proc: The process to reap. :param bool kill: If :data:`True`, send ``SIGTERM`` and ``SIGKILL`` to the process. :param bool wait_on_shutdown: If :data:`True`, delay :class:`Broker` shutdown if child has not yet exited. If :data:`False` simply forget the child. """ #: :class:`Timer` that invokes :meth:`reap` after some polling delay. _timer = None def __init__(self, broker, proc, kill, wait_on_shutdown): self.broker = broker self.proc = proc self.kill = kill self.wait_on_shutdown = wait_on_shutdown self._tries = 0 def _signal_child(self, signum): # For processes like sudo we cannot actually send sudo a signal, # because it is setuid, so this is best-effort only. LOG.debug('%r: sending %s', self.proc, SIGNAL_BY_NUM[signum]) try: os.kill(self.proc.pid, signum) except OSError: e = sys.exc_info()[1] if e.args[0] != errno.EPERM: raise def _calc_delay(self, count): """ Calculate a poll delay given `count` attempts have already been made. These constants have no principle, they just produce rapid but still relatively conservative retries. """ delay = 0.05 for _ in xrange(count): delay *= 1.72 return delay def _on_broker_shutdown(self): """ Respond to :class:`Broker` shutdown by cancelling the reap timer if :attr:`Router.await_children_at_shutdown` is disabled. Otherwise shutdown is delayed for up to :attr:`Broker.shutdown_timeout` for subprocesses may have no intention of exiting any time soon. """ if not self.wait_on_shutdown: self._timer.cancel() def _install_timer(self, delay): new = self._timer is None self._timer = self.broker.timers.schedule( when=mitogen.core.now() + delay, func=self.reap, ) if new: mitogen.core.listen(self.broker, 'shutdown', self._on_broker_shutdown) def _remove_timer(self): if self._timer and self._timer.active: self._timer.cancel() mitogen.core.unlisten(self.broker, 'shutdown', self._on_broker_shutdown) def reap(self): """ Reap the child process during disconnection. """ status = self.proc.poll() if status is not None: LOG.debug('%r: %s', self.proc, returncode_to_str(status)) mitogen.core.fire(self.proc, 'exit') self._remove_timer() return self._tries += 1 if self._tries > 20: LOG.warning('%r: child will not exit, giving up', self) self._remove_timer() return delay = self._calc_delay(self._tries - 1) LOG.debug('%r still running after IO disconnect, recheck in %.03fs', self.proc, delay) self._install_timer(delay) if not self.kill: pass elif self._tries == 2: self._signal_child(signal.SIGTERM) elif self._tries == 6: # roughly 4 seconds self._signal_child(signal.SIGKILL) class Process(object): """ Process objects provide a uniform interface to the :mod:`subprocess` and :mod:`mitogen.fork`. This class is extended by :class:`PopenProcess` and :class:`mitogen.fork.Process`. :param int pid: The process ID. :param file stdin: File object attached to standard input. :param file stdout: File object attached to standard output. :param file stderr: File object attached to standard error, or :data:`None`. """ #: Name of the process used in logs. Set to the stream/context name by #: :class:`Connection`. name = None def __init__(self, pid, stdin, stdout, stderr=None): #: The process ID. self.pid = pid #: File object attached to standard input. self.stdin = stdin #: File object attached to standard output. self.stdout = stdout #: File object attached to standard error. self.stderr = stderr def __repr__(self): return '%s %s pid %d' % ( type(self).__name__, self.name, self.pid, ) def poll(self): """ Fetch the child process exit status, or :data:`None` if it is still running. This should be overridden by subclasses. :returns: Exit status in the style of the :attr:`subprocess.Popen.returncode` attribute, i.e. with signals represented by a negative integer. """ raise NotImplementedError() class PopenProcess(Process): """ :class:`Process` subclass wrapping a :class:`subprocess.Popen` object. :param subprocess.Popen proc: The subprocess. """ def __init__(self, proc, stdin, stdout, stderr=None): super(PopenProcess, self).__init__(proc.pid, stdin, stdout, stderr) #: The subprocess. self.proc = proc def poll(self): return self.proc.poll() class ModuleForwarder(object): """ Respond to :data:`mitogen.core.GET_MODULE` requests in a child by forwarding the request to our parent context, or satisfying the request from our local Importer cache. """ def __init__(self, router, parent_context, importer): self.router = router self.parent_context = parent_context self.importer = importer router.add_handler( fn=self._on_forward_module, handle=mitogen.core.FORWARD_MODULE, persist=True, policy=mitogen.core.has_parent_authority, ) router.add_handler( fn=self._on_get_module, handle=mitogen.core.GET_MODULE, persist=True, policy=is_immediate_child, ) def __repr__(self): return 'ModuleForwarder' def _on_forward_module(self, msg): if msg.is_dead: return context_id_s, _, fullname = bytes_partition(msg.data, b('\x00')) fullname = mitogen.core.to_text(fullname) context_id = int(context_id_s) stream = self.router.stream_by_id(context_id) if stream.protocol.remote_id == mitogen.parent_id: LOG.error('%r: dropping FORWARD_MODULE(%d, %r): no route to child', self, context_id, fullname) return if fullname in stream.protocol.sent_modules: return LOG.debug('%r._on_forward_module() sending %r to %r via %r', self, fullname, context_id, stream.protocol.remote_id) self._send_module_and_related(stream, fullname) if stream.protocol.remote_id != context_id: stream.protocol._send( mitogen.core.Message( data=msg.data, handle=mitogen.core.FORWARD_MODULE, dst_id=stream.protocol.remote_id, ) ) def _on_get_module(self, msg): if msg.is_dead: return fullname = msg.data.decode('utf-8') LOG.debug('%r: %s requested by context %d', self, fullname, msg.src_id) callback = lambda: self._on_cache_callback(msg, fullname) self.importer._request_module(fullname, callback) def _on_cache_callback(self, msg, fullname): stream = self.router.stream_by_id(msg.src_id) LOG.debug('%r: sending %s to %r', self, fullname, stream) self._send_module_and_related(stream, fullname) def _send_module_and_related(self, stream, fullname): tup = self.importer._cache[fullname] for related in tup[4]: rtup = self.importer._cache.get(related) if rtup: self._send_one_module(stream, rtup) else: LOG.debug('%r: %s not in cache (for %s)', self, related, fullname) self._send_one_module(stream, tup) def _send_one_module(self, stream, tup): if tup[0] not in stream.protocol.sent_modules: stream.protocol.sent_modules.add(tup[0]) self.router._async_route( mitogen.core.Message.pickled( tup, dst_id=stream.protocol.remote_id, handle=mitogen.core.LOAD_MODULE, ) ) mitogen-0.3.9/mitogen/podman.py000066400000000000000000000052521465666473100165050ustar00rootroot00000000000000# Copyright 2019, David Wilson # Copyright 2021, Mitogen contributors # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # !mitogen: minify_safe import logging import mitogen.parent LOG = logging.getLogger(__name__) class Options(mitogen.parent.Options): container = None username = None podman_path = 'podman' def __init__(self, container=None, podman_path=None, username=None, **kwargs): super(Options, self).__init__(**kwargs) assert container is not None self.container = container if podman_path: self.podman_path = podman_path if username: self.username = username class Connection(mitogen.parent.Connection): options_class = Options child_is_immediate_subprocess = False # TODO: better way of capturing errors such as "No such container." create_child_args = { 'merge_stdio': True } def _get_name(self): return u'podman.' + self.options.container def get_boot_command(self): args = [self.options.podman_path, 'exec'] if self.options.username: args += ['--user=' + self.options.username] args += ["--interactive", "--", self.options.container] return args + super(Connection, self).get_boot_command() mitogen-0.3.9/mitogen/profiler.py000066400000000000000000000124201465666473100170440ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # !mitogen: minify_safe """ mitogen.profiler Record and report cProfile statistics from a run. Creates one aggregated output file, one aggregate containing only workers, and one for the top-level process. Usage: mitogen.profiler record [args ..] mitogen.profiler report [sort_mode] mitogen.profiler stat [args ..] Mode: record: Record a trace. report: Report on a previously recorded trace. stat: Record and report in a single step. Where: dest_path: Filesystem prefix to write .pstats files to. sort_mode: Sorting mode; defaults to "cumulative". See: https://docs.python.org/2/library/profile.html#pstats.Stats.sort_stats Example: mitogen.profiler record /tmp/mypatch ansible-playbook foo.yml mitogen.profiler dump /tmp/mypatch-worker.pstats """ from __future__ import print_function import os import pstats import shutil import subprocess import sys import tempfile import time def try_merge(stats, path): try: stats.add(path) return True except Exception as e: print('%s failed. Will retry. %s' % (path, e)) return False def merge_stats(outpath, inpaths): first, rest = inpaths[0], inpaths[1:] for x in range(1): try: stats = pstats.Stats(first) except EOFError: time.sleep(0.2) continue print("Writing %r..." % (outpath,)) for path in rest: #print("Merging %r into %r.." % (os.path.basename(path), outpath)) for x in range(5): if try_merge(stats, path): break time.sleep(0.2) pstats.dump_stats(outpath) def generate_stats(outpath, tmpdir): print('Generating stats..') all_paths = [] paths_by_ident = {} for name in os.listdir(tmpdir): if name.endswith('-dump.pstats'): ident, _, pid = name.partition('-') path = os.path.join(tmpdir, name) all_paths.append(path) paths_by_ident.setdefault(ident, []).append(path) merge_stats('%s-all.pstat' % (outpath,), all_paths) for ident, paths in paths_by_ident.items(): merge_stats('%s-%s.pstat' % (outpath, ident), paths) def do_record(tmpdir, path, *args): env = os.environ.copy() fmt = '%(identity)s-%(pid)s.%(now)s-dump.%(ext)s' env['MITOGEN_PROFILING'] = '1' env['MITOGEN_PROFILE_FMT'] = os.path.join(tmpdir, fmt) rc = subprocess.call(args, env=env) generate_stats(path, tmpdir) return rc def do_report(tmpdir, path, sort='cumulative'): stats = pstats.Stats(path).sort_stats(sort) stats.print_stats(100) def do_stat(tmpdir, sort, *args): valid_sorts = pstats.Stats.sort_arg_dict_default if sort not in valid_sorts: sys.stderr.write('Invalid sort %r, must be one of %s\n' % (sort, ', '.join(sorted(valid_sorts)))) sys.exit(1) outfile = os.path.join(tmpdir, 'combined') do_record(tmpdir, outfile, *args) aggs = ('app.main', 'mitogen.broker', 'mitogen.child_main', 'mitogen.service.pool', 'Strategy', 'WorkerProcess', 'all') for agg in aggs: path = '%s-%s.pstat' % (outfile, agg) if os.path.exists(path): print() print() print('------ Aggregation %r ------' % (agg,)) print() do_report(tmpdir, path, sort) print() def main(): if len(sys.argv) < 2 or sys.argv[1] not in ('record', 'report', 'stat'): sys.stderr.write(__doc__.lstrip()) sys.exit(1) func = globals()['do_' + sys.argv[1]] tmpdir = tempfile.mkdtemp(prefix='mitogen.profiler') try: sys.exit(func(tmpdir, *sys.argv[2:]) or 0) finally: shutil.rmtree(tmpdir) if __name__ == '__main__': main() mitogen-0.3.9/mitogen/select.py000066400000000000000000000300451465666473100165040ustar00rootroot00000000000000# Copyright 2019, David Wilson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # !mitogen: minify_safe import mitogen.core class Error(mitogen.core.Error): pass class Event(object): """ Represents one selected event. """ #: The first Receiver or Latch the event traversed. source = None #: The :class:`mitogen.core.Message` delivered to a receiver, or the object #: posted to a latch. data = None class Select(object): """ Support scatter/gather asynchronous calls and waiting on multiple :class:`receivers `, :class:`channels `, :class:`latches `, and :class:`sub-selects