Full Code of ipsingh06/seedsync for AI

master ff2a1039935b cached
337 files
2.1 MB
569.4k tokens
1608 symbols
1 requests
Download .txt
Showing preview only (2,328K chars total). Download the full file or copy to clipboard to get everything.
Repository: ipsingh06/seedsync
Branch: master
Commit: ff2a1039935b
Files: 337
Total size: 2.1 MB

Directory structure:
gitextract_tfp7f5p4/

├── .github/
│   └── workflows/
│       └── master.yml
├── .gitignore
├── LICENSE.txt
├── Makefile
├── README.md
├── doc/
│   ├── CodingGuidelines.md
│   ├── DeveloperReadme.md
│   └── assets/
│       ├── logo.ai
│       └── logo_with_name.ai
└── src/
    ├── angular/
    │   ├── .angular-cli.json
    │   ├── .editorconfig
    │   ├── .gitignore
    │   ├── e2e/
    │   │   ├── app.e2e-spec.ts
    │   │   ├── app.po.ts
    │   │   └── tsconfig.e2e.json
    │   ├── karma.conf.js
    │   ├── package.json
    │   ├── protractor.conf.js
    │   ├── src/
    │   │   ├── app/
    │   │   │   ├── app.module.ts
    │   │   │   ├── common/
    │   │   │   │   ├── _common.scss
    │   │   │   │   ├── cached-reuse-strategy.ts
    │   │   │   │   ├── capitalize.pipe.ts
    │   │   │   │   ├── click-stop-propagation.directive.ts
    │   │   │   │   ├── eta.pipe.ts
    │   │   │   │   ├── file-size.pipe.ts
    │   │   │   │   ├── localization.ts
    │   │   │   │   └── storage-keys.ts
    │   │   │   ├── pages/
    │   │   │   │   ├── about/
    │   │   │   │   │   ├── about-page.component.html
    │   │   │   │   │   ├── about-page.component.scss
    │   │   │   │   │   └── about-page.component.ts
    │   │   │   │   ├── autoqueue/
    │   │   │   │   │   ├── autoqueue-page.component.html
    │   │   │   │   │   ├── autoqueue-page.component.scss
    │   │   │   │   │   └── autoqueue-page.component.ts
    │   │   │   │   ├── files/
    │   │   │   │   │   ├── file-list.component.html
    │   │   │   │   │   ├── file-list.component.scss
    │   │   │   │   │   ├── file-list.component.ts
    │   │   │   │   │   ├── file-options.component.html
    │   │   │   │   │   ├── file-options.component.scss
    │   │   │   │   │   ├── file-options.component.ts
    │   │   │   │   │   ├── file.component.html
    │   │   │   │   │   ├── file.component.scss
    │   │   │   │   │   ├── file.component.ts
    │   │   │   │   │   ├── files-page.component.html
    │   │   │   │   │   └── files-page.component.ts
    │   │   │   │   ├── logs/
    │   │   │   │   │   ├── logs-page.component.html
    │   │   │   │   │   ├── logs-page.component.scss
    │   │   │   │   │   └── logs-page.component.ts
    │   │   │   │   ├── main/
    │   │   │   │   │   ├── app.component.html
    │   │   │   │   │   ├── app.component.scss
    │   │   │   │   │   ├── app.component.ts
    │   │   │   │   │   ├── header.component.html
    │   │   │   │   │   ├── header.component.scss
    │   │   │   │   │   ├── header.component.ts
    │   │   │   │   │   ├── sidebar.component.html
    │   │   │   │   │   ├── sidebar.component.scss
    │   │   │   │   │   └── sidebar.component.ts
    │   │   │   │   └── settings/
    │   │   │   │       ├── option.component.html
    │   │   │   │       ├── option.component.scss
    │   │   │   │       ├── option.component.ts
    │   │   │   │       ├── options-list.ts
    │   │   │   │       ├── settings-page.component.html
    │   │   │   │       ├── settings-page.component.scss
    │   │   │   │       └── settings-page.component.ts
    │   │   │   ├── routes.ts
    │   │   │   ├── services/
    │   │   │   │   ├── autoqueue/
    │   │   │   │   │   ├── autoqueue-pattern.ts
    │   │   │   │   │   └── autoqueue.service.ts
    │   │   │   │   ├── base/
    │   │   │   │   │   ├── base-stream.service.ts
    │   │   │   │   │   ├── base-web.service.ts
    │   │   │   │   │   └── stream-service.registry.ts
    │   │   │   │   ├── files/
    │   │   │   │   │   ├── mock-model-files.ts
    │   │   │   │   │   ├── model-file.service.ts
    │   │   │   │   │   ├── model-file.ts
    │   │   │   │   │   ├── screenshot-model-files.ts
    │   │   │   │   │   ├── view-file-filter.service.ts
    │   │   │   │   │   ├── view-file-options.service.ts
    │   │   │   │   │   ├── view-file-options.ts
    │   │   │   │   │   ├── view-file-sort.service.ts
    │   │   │   │   │   ├── view-file.service.ts
    │   │   │   │   │   └── view-file.ts
    │   │   │   │   ├── logs/
    │   │   │   │   │   ├── log-record.ts
    │   │   │   │   │   └── log.service.ts
    │   │   │   │   ├── server/
    │   │   │   │   │   ├── server-command.service.ts
    │   │   │   │   │   ├── server-status.service.ts
    │   │   │   │   │   └── server-status.ts
    │   │   │   │   ├── settings/
    │   │   │   │   │   ├── config.service.ts
    │   │   │   │   │   └── config.ts
    │   │   │   │   └── utils/
    │   │   │   │       ├── connected.service.ts
    │   │   │   │       ├── dom.service.ts
    │   │   │   │       ├── logger.service.ts
    │   │   │   │       ├── notification.service.ts
    │   │   │   │       ├── notification.ts
    │   │   │   │       ├── rest.service.ts
    │   │   │   │       └── version-check.service.ts
    │   │   │   └── tests/
    │   │   │       ├── mocks/
    │   │   │       │   ├── mock-event-source.ts
    │   │   │       │   ├── mock-model-file.service.ts
    │   │   │       │   ├── mock-rest.service.ts
    │   │   │       │   ├── mock-storage.service.ts
    │   │   │       │   ├── mock-stream-service.registry.ts
    │   │   │       │   ├── mock-view-file-options.service.ts
    │   │   │       │   └── mock-view-file.service.ts
    │   │   │       └── unittests/
    │   │   │           └── services/
    │   │   │               ├── autoqueue/
    │   │   │               │   └── autoqueue.service.spec.ts
    │   │   │               ├── base/
    │   │   │               │   ├── base-stream.service.spec.ts
    │   │   │               │   ├── base-web.service.spec.ts
    │   │   │               │   └── stream-service.registry.spec.ts
    │   │   │               ├── files/
    │   │   │               │   ├── model-file.service.spec.ts
    │   │   │               │   ├── model-file.spec.ts
    │   │   │               │   ├── view-file-filter.service.spec.ts
    │   │   │               │   ├── view-file-options.service.spec.ts
    │   │   │               │   ├── view-file-sort.service.spec.ts
    │   │   │               │   └── view-file.service.spec.ts
    │   │   │               ├── logs/
    │   │   │               │   ├── log-record.spec.ts
    │   │   │               │   └── log.service.spec.ts
    │   │   │               ├── server/
    │   │   │               │   ├── server-command.service.spec.ts
    │   │   │               │   ├── server-status.service.spec.ts
    │   │   │               │   └── server-status.spec.ts
    │   │   │               ├── settings/
    │   │   │               │   ├── config.service.spec.ts
    │   │   │               │   └── config.spec.ts
    │   │   │               └── utils/
    │   │   │                   ├── connected.service.spec.ts
    │   │   │                   ├── dom.service.spec.ts
    │   │   │                   ├── notification.service.spec.ts
    │   │   │                   ├── rest.service.spec.ts
    │   │   │                   └── version-check.service.spec.ts
    │   │   ├── assets/
    │   │   │   └── .gitkeep
    │   │   ├── environments/
    │   │   │   ├── environment.prod.ts
    │   │   │   └── environment.ts
    │   │   ├── index.html
    │   │   ├── main.ts
    │   │   ├── polyfills.ts
    │   │   ├── styles.scss
    │   │   ├── test.ts
    │   │   ├── tsconfig.app.json
    │   │   ├── tsconfig.spec.json
    │   │   └── typings.d.ts
    │   ├── tsconfig.json
    │   └── tslint.json
    ├── debian/
    │   ├── changelog
    │   ├── compat
    │   ├── config
    │   ├── control
    │   ├── postinst
    │   ├── postrm
    │   ├── rules
    │   ├── seedsync.service
    │   ├── source/
    │   │   └── format
    │   └── templates
    ├── docker/
    │   ├── build/
    │   │   ├── deb/
    │   │   │   ├── Dockerfile
    │   │   │   └── Dockerfile.dockerignore
    │   │   └── docker-image/
    │   │       ├── Dockerfile
    │   │       ├── Dockerfile.dockerignore
    │   │       ├── run_as_user
    │   │       ├── scp
    │   │       ├── setup_default_config.sh
    │   │       └── ssh
    │   ├── stage/
    │   │   ├── deb/
    │   │   │   ├── Dockerfile
    │   │   │   ├── compose-ubu1604.yml
    │   │   │   ├── compose-ubu1804.yml
    │   │   │   ├── compose-ubu2004.yml
    │   │   │   ├── compose.yml
    │   │   │   ├── entrypoint.sh
    │   │   │   ├── expect_seedsync.exp
    │   │   │   ├── id_rsa
    │   │   │   ├── id_rsa.pub
    │   │   │   ├── install_seedsync.sh
    │   │   │   └── ubuntu-systemd/
    │   │   │       ├── ubuntu-16.04-systemd/
    │   │   │       │   ├── Dockerfile
    │   │   │       │   └── setup
    │   │   │       ├── ubuntu-18.04-systemd/
    │   │   │       │   ├── Dockerfile
    │   │   │       │   └── setup
    │   │   │       └── ubuntu-20.04-systemd/
    │   │   │           ├── Dockerfile
    │   │   │           └── setup
    │   │   └── docker-image/
    │   │       └── compose.yml
    │   ├── test/
    │   │   ├── angular/
    │   │   │   ├── Dockerfile
    │   │   │   └── compose.yml
    │   │   ├── e2e/
    │   │   │   ├── Dockerfile
    │   │   │   ├── chrome/
    │   │   │   │   └── Dockerfile
    │   │   │   ├── compose-dev.yml
    │   │   │   ├── compose.yml
    │   │   │   ├── configure/
    │   │   │   │   ├── Dockerfile
    │   │   │   │   └── setup_seedsync.sh
    │   │   │   ├── parse_seedsync_status.py
    │   │   │   ├── remote/
    │   │   │   │   ├── Dockerfile
    │   │   │   │   └── id_rsa.pub
    │   │   │   ├── run_tests.sh
    │   │   │   └── urls.ts
    │   │   └── python/
    │   │       ├── Dockerfile
    │   │       ├── compose.yml
    │   │       └── entrypoint.sh
    │   └── wait-for-it.sh
    ├── e2e/
    │   ├── .gitignore
    │   ├── README.md
    │   ├── conf.ts
    │   ├── package.json
    │   ├── tests/
    │   │   ├── about.page.spec.ts
    │   │   ├── about.page.ts
    │   │   ├── app.spec.ts
    │   │   ├── app.ts
    │   │   ├── autoqueue.page.spec.ts
    │   │   ├── autoqueue.page.ts
    │   │   ├── dashboard.page.spec.ts
    │   │   ├── dashboard.page.ts
    │   │   ├── settings.page.spec.ts
    │   │   └── settings.page.ts
    │   ├── tsconfig.json
    │   └── urls.ts
    ├── pyinstaller_hooks/
    │   └── hook-patoolib.py
    └── python/
        ├── __init__.py
        ├── common/
        │   ├── __init__.py
        │   ├── app_process.py
        │   ├── config.py
        │   ├── constants.py
        │   ├── context.py
        │   ├── error.py
        │   ├── job.py
        │   ├── localization.py
        │   ├── multiprocessing_logger.py
        │   ├── persist.py
        │   ├── status.py
        │   └── types.py
        ├── controller/
        │   ├── __init__.py
        │   ├── auto_queue.py
        │   ├── controller.py
        │   ├── controller_job.py
        │   ├── controller_persist.py
        │   ├── delete/
        │   │   ├── __init__.py
        │   │   └── delete_process.py
        │   ├── extract/
        │   │   ├── __init__.py
        │   │   ├── dispatch.py
        │   │   ├── extract.py
        │   │   └── extract_process.py
        │   ├── model_builder.py
        │   └── scan/
        │       ├── __init__.py
        │       ├── active_scanner.py
        │       ├── local_scanner.py
        │       ├── remote_scanner.py
        │       └── scanner_process.py
        ├── docs/
        │   ├── faq.md
        │   ├── index.md
        │   ├── install.md
        │   └── usage.md
        ├── lftp/
        │   ├── __init__.py
        │   ├── job_status.py
        │   ├── job_status_parser.py
        │   └── lftp.py
        ├── mkdocs.yml
        ├── model/
        │   ├── __init__.py
        │   ├── diff.py
        │   ├── file.py
        │   └── model.py
        ├── pyproject.toml
        ├── scan_fs.py
        ├── seedsync.py
        ├── ssh/
        │   ├── __init__.py
        │   └── sshcp.py
        ├── system/
        │   ├── __init__.py
        │   ├── file.py
        │   └── scanner.py
        ├── tests/
        │   ├── __init__.py
        │   ├── integration/
        │   │   ├── __init__.py
        │   │   ├── test_controller/
        │   │   │   ├── __init__.py
        │   │   │   ├── test_controller.py
        │   │   │   └── test_extract/
        │   │   │       ├── __init__.py
        │   │   │       └── test_extract.py
        │   │   ├── test_lftp/
        │   │   │   ├── __init__.py
        │   │   │   └── test_lftp.py
        │   │   └── test_web/
        │   │       ├── __init__.py
        │   │       ├── test_handler/
        │   │       │   ├── __init__.py
        │   │       │   ├── test_auto_queue.py
        │   │       │   ├── test_config.py
        │   │       │   ├── test_controller.py
        │   │       │   ├── test_server.py
        │   │       │   ├── test_status.py
        │   │       │   ├── test_stream_log.py
        │   │       │   ├── test_stream_model.py
        │   │       │   └── test_stream_status.py
        │   │       └── test_web_app.py
        │   ├── unittests/
        │   │   ├── __init__.py
        │   │   ├── test_common/
        │   │   │   ├── __init__.py
        │   │   │   ├── test_app_process.py
        │   │   │   ├── test_config.py
        │   │   │   ├── test_job.py
        │   │   │   ├── test_multiprocessing_logger.py
        │   │   │   ├── test_persist.py
        │   │   │   └── test_status.py
        │   │   ├── test_controller/
        │   │   │   ├── __init__.py
        │   │   │   ├── test_auto_queue.py
        │   │   │   ├── test_controller_persist.py
        │   │   │   ├── test_extract/
        │   │   │   │   ├── __init__.py
        │   │   │   │   ├── test_dispatch.py
        │   │   │   │   └── test_extract_process.py
        │   │   │   ├── test_model_builder.py
        │   │   │   └── test_scan/
        │   │   │       ├── __init__.py
        │   │   │       ├── test_remote_scanner.py
        │   │   │       └── test_scanner_process.py
        │   │   ├── test_lftp/
        │   │   │   ├── __init__.py
        │   │   │   ├── test_job_status.py
        │   │   │   ├── test_job_status_parser.py
        │   │   │   └── test_lftp.py
        │   │   ├── test_model/
        │   │   │   ├── __init__.py
        │   │   │   ├── test_diff.py
        │   │   │   ├── test_file.py
        │   │   │   └── test_model.py
        │   │   ├── test_seedsync.py
        │   │   ├── test_ssh/
        │   │   │   ├── __init__.py
        │   │   │   └── test_sshcp.py
        │   │   ├── test_system/
        │   │   │   ├── __init__.py
        │   │   │   ├── test_file.py
        │   │   │   └── test_scanner.py
        │   │   └── test_web/
        │   │       ├── __init__.py
        │   │       ├── test_handler/
        │   │       │   └── test_stream_log.py
        │   │       └── test_serialize/
        │   │           ├── __init__.py
        │   │           ├── test_serialize.py
        │   │           ├── test_serialize_auto_queue.py
        │   │           ├── test_serialize_config.py
        │   │           ├── test_serialize_log_record.py
        │   │           ├── test_serialize_model.py
        │   │           └── test_serialize_status.py
        │   └── utils.py
        └── web/
            ├── __init__.py
            ├── handler/
            │   ├── __init__.py
            │   ├── auto_queue.py
            │   ├── config.py
            │   ├── controller.py
            │   ├── server.py
            │   ├── status.py
            │   ├── stream_log.py
            │   ├── stream_model.py
            │   └── stream_status.py
            ├── serialize/
            │   ├── __init__.py
            │   ├── serialize.py
            │   ├── serialize_auto_queue.py
            │   ├── serialize_config.py
            │   ├── serialize_log_record.py
            │   ├── serialize_model.py
            │   └── serialize_status.py
            ├── utils.py
            ├── web_app.py
            ├── web_app_builder.py
            └── web_app_job.py

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/workflows/master.yml
================================================

name: CI

on:
  push:
    branches: [ master ]
    tags:
      - v[0-9]+.[0-9]+.[0-9]+
  pull_request:
    branches: [ master ]

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

jobs:

  unittests-python:
    name: Python unit tests
    runs-on: ubuntu-latest
    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - name: Checkout
        uses: actions/checkout@v2

      # Build package
      - name: Run Python unit tests
        run: make run-tests-python


  unittests-angular:
    name: Angular unit tests
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      # Build package
      - name: Run Angular unit tests
        run: make run-tests-angular


  build-deb:
    name: Build Deb
    runs-on: ubuntu-latest
    needs: [ unittests-python, unittests-angular ]
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      # Sets up build environment
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v1
      - name: Set up Docker Buildx
        id: buildx
        uses: docker/setup-buildx-action@v1
        with:
          driver-opts: |
            image=moby/buildkit:master
            network=host
      - name: Show buildx builder instance name
        run: echo ${{ steps.buildx.outputs.name }}
      - name: Show buildx available platforms
        run: echo ${{ steps.buildx.outputs.platforms }}

      # Build package
      - name: Build deb package
        run: make deb

      # Upload package
      - name: Publish artifact
        uses: actions/upload-artifact@v2
        with:
          path: ${{ github.workspace }}/build/*.deb
          name: deb-${{ github.run_number }}

      # Post build steps
      - name: List built packages
        if: ${{ success() }}
        run: ls -l $GITHUB_WORKSPACE/build/

  build-docker-image:
    name: Build Docker Image
    runs-on: ubuntu-latest
    needs: [ unittests-python, unittests-angular ]
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      # Sets up build environment
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v1
      - name: Set up Docker Buildx
        id: buildx
        uses: docker/setup-buildx-action@v1
        with:
          driver-opts: |
            image=moby/buildkit:master
            network=host
      - name: Show buildx builder instance name
        run: echo ${{ steps.buildx.outputs.name }}
      - name: Show buildx available platforms
        run: echo ${{ steps.buildx.outputs.platforms }}

      # Login using a PAT with write:packages scope
      - name: Log into GitHub Container Registry
        run: echo "${{ secrets.CR_PAT }}" | docker login https://ghcr.io -u ${{ github.actor }} --password-stdin
      # Set staging registry
      - name: Set staging registry env variable
        run: echo "staging_registry=ghcr.io/${{ github.repository }}" >> $GITHUB_ENV

      # Build docker image
      - name: Build docker image
        run: make docker-image STAGING_REGISTRY=${{ env.staging_registry }} STAGING_VERSION=${{ github.run_number }}

  e2etests-deb:
    name: End-to-end tests on Deb
    runs-on: ubuntu-latest
    needs: [ build-deb ]
    strategy:
      matrix:
        oscode: [ ubu1604, ubu1804, ubu2004 ]
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Download deb package artifact
        uses: actions/download-artifact@v2
        with:
          name: deb-${{ github.run_number }}
          path: build/

      # Run e2e test
      - name: Run e2e test
        run: make run-tests-e2e SEEDSYNC_DEB=`readlink -f build/*.deb` SEEDSYNC_OS=${{ matrix.oscode }}

  e2etests-docker-image:
    name: End-to-end tests on Docker Image
    runs-on: ubuntu-latest
    needs: [ build-docker-image ]
    strategy:
      matrix:
        arch: [ amd64, arm64, arm/v7 ]
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      # Sets up build environment
      - name: Enable Docker experimental features
        run: |
          echo $'{\n    "experimental": true\n}' | sudo tee /etc/docker/daemon.json
          sudo service docker restart
          docker version
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v1
      - name: Set up Docker Buildx
        id: buildx
        uses: docker/setup-buildx-action@v1
        with:
          driver-opts: |
            image=moby/buildkit:master
            network=host
      - name: Show buildx builder instance name
        run: echo ${{ steps.buildx.outputs.name }}
      - name: Show buildx available platforms
        run: echo ${{ steps.buildx.outputs.platforms }}

      # Login using a PAT with write:packages scope
      - name: Log into GitHub Container Registry
        run: echo "${{ secrets.CR_PAT }}" | docker login https://ghcr.io -u ${{ github.actor }} --password-stdin
      # Set staging registry
      - name: Set staging registry env variable
        run: echo "staging_registry=ghcr.io/${{ github.repository }}" >> $GITHUB_ENV

      # Run e2e test
      - name: Run e2e test
        run: make run-tests-e2e \
          STAGING_REGISTRY=${{ env.staging_registry }} \
          STAGING_VERSION=${{ github.run_number }} \
          SEEDSYNC_ARCH=${{ matrix.arch }}

  publish-docker-image:
    name: Publish Docker Image
    if: startsWith(github.ref, 'refs/tags/v')
    runs-on: ubuntu-latest
    needs: [ e2etests-deb, e2etests-docker-image ]
    steps:
      - name: Set release env variable
        run: echo "RELEASE_VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV
      - name: Checkout
        uses: actions/checkout@v2

      # Sets up build environment
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v1
      - name: Set up Docker Buildx
        id: buildx
        uses: docker/setup-buildx-action@v1
        with:
          driver-opts: |
            image=moby/buildkit:master
            network=host
      - name: Show buildx builder instance name
        run: echo ${{ steps.buildx.outputs.name }}
      - name: Show buildx available platforms
        run: echo ${{ steps.buildx.outputs.platforms }}

      # Login to GHCR using a PAT with write:packages scope
      - name: Log into GitHub Container Registry
        run: echo "${{ secrets.CR_PAT }}" | docker login https://ghcr.io -u ${{ github.actor }} --password-stdin
      # Login to Dockerhub
      - name: Log into Dockerhub registry
        run: echo "${{ secrets.DOCKER_PASSWORD }}" |
          docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
      # Set staging registry
      - name: Set staging registry env variable
        run: echo "staging_registry=ghcr.io/${{ github.repository }}" >> $GITHUB_ENV

      # Push image to dockerhub
      - name: Push to Dockerhub (tag vX.X.X)
        run: make docker-image-release \
          STAGING_REGISTRY=${{ env.staging_registry }} \
          STAGING_VERSION=${{ github.run_number }} \
          RELEASE_REGISTRY=docker.io/ipsingh06 \
          RELEASE_VERSION=${{ env.RELEASE_VERSION }}
      - name: Push to Dockerhub (tag latest)
        run: make docker-image-release \
          STAGING_REGISTRY=${{ env.staging_registry }} \
          STAGING_VERSION=${{ github.run_number }} \
          RELEASE_REGISTRY=docker.io/ipsingh06 \
          RELEASE_VERSION=latest

  publish-deb:
    name: Publish Deb package
    if: startsWith(github.ref, 'refs/tags/v')
    runs-on: ubuntu-latest
    needs: [ e2etests-deb, e2etests-docker-image ]
    steps:
      - name: Set release env variable
        run: echo "RELEASE_VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV
      - name: Download deb package artifact
        uses: actions/download-artifact@v2
        with:
          name: deb-${{ github.run_number }}
          path: build/
      - name: Set deb file path and name env variable
        run: |
          echo "DEB_PATH=$(readlink -f ./build/*.deb)" >> $GITHUB_ENV
          echo "DEB_NAME=$(basename $(readlink -f ./build/*.deb))" >> $GITHUB_ENV
      - name: Create Release
        id: create_release
        uses: actions/create-release@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: ${{ github.ref }}
          release_name: Release ${{ github.ref }}
          body: ${{ github.event.head_commit.message }}
          draft: false
          prerelease: false
      - name: Upload Release Asset
        id: upload-release-asset
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ steps.create_release.outputs.upload_url }}
          asset_path: ${{ env.DEB_PATH }}
          asset_name: ${{ env.DEB_NAME }}
          asset_content_type: application/x-deb


================================================
FILE: .gitignore
================================================
.idea
*.pyc
/build
.venv
package-lock.json
src/python/build
src/python/site

================================================
FILE: LICENSE.txt
================================================
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

================================================
FILE: Makefile
================================================
# Copyright 2017, Inderpreet Singh, All rights reserved.

# Catch sigterms
# See: https://stackoverflow.com/a/52159940
export SHELL:=/bin/bash
export SHELLOPTS:=$(if $(SHELLOPTS),$(SHELLOPTS):)pipefail:errexit
.ONESHELL:

# Color outputs
red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0`

ROOTDIR:=$(shell realpath .)
SOURCEDIR:=$(shell realpath ./src)
BUILDDIR:=$(shell realpath ./build)
DEFAULT_STAGING_REGISTRY:=localhost:5000

#DOCKER_BUILDKIT_FLAGS=BUILDKIT_PROGRESS=plain
DOCKER=${DOCKER_BUILDKIT_FLAGS} DOCKER_BUILDKIT=1 docker
DOCKER_COMPOSE=${DOCKER_BUILDKIT_FLAGS} COMPOSE_DOCKER_CLI_BUILD=1 DOCKER_BUILDKIT=1 docker-compose

.PHONY: builddir deb docker-image clean

all: deb docker-image

builddir:
	mkdir -p ${BUILDDIR}

scanfs: builddir
	$(DOCKER) build \
		-f ${SOURCEDIR}/docker/build/deb/Dockerfile \
		--target seedsync_build_scanfs_export \
		--output ${BUILDDIR} \
		${ROOTDIR}

deb: builddir
	$(DOCKER) build \
		-f ${SOURCEDIR}/docker/build/deb/Dockerfile \
		--target seedsync_build_deb_export \
		--output ${BUILDDIR} \
		${ROOTDIR}

docker-buildx:
	$(DOCKER) run --rm --privileged multiarch/qemu-user-static --reset -p yes

docker-image: docker-buildx
	@if [[ -z "${STAGING_REGISTRY}" ]] ; then \
		export STAGING_REGISTRY="${DEFAULT_STAGING_REGISTRY}"; \
	fi;
	echo "${green}STAGING_REGISTRY=$${STAGING_REGISTRY}${reset}";
	@if [[ -z "${STAGING_VERSION}" ]] ; then \
		export STAGING_VERSION="latest"; \
	fi;
	echo "${green}STAGING_VERSION=$${STAGING_VERSION}${reset}";

	# scanfs image
	$(DOCKER) buildx build \
		-f ${SOURCEDIR}/docker/build/deb/Dockerfile \
		--target seedsync_build_scanfs_export \
		--tag $${STAGING_REGISTRY}/seedsync/build/scanfs/export:$${STAGING_VERSION} \
		--cache-to=type=registry,ref=$${STAGING_REGISTRY}/seedsync/build/scanfs/export:cache,mode=max \
		--cache-from=type=registry,ref=$${STAGING_REGISTRY}/seedsync/build/scanfs/export:cache \
		--push \
		${ROOTDIR}

	# angular html export
	$(DOCKER) buildx build \
		-f ${SOURCEDIR}/docker/build/deb/Dockerfile \
		--target seedsync_build_angular_export \
		--tag $${STAGING_REGISTRY}/seedsync/build/angular/export:$${STAGING_VERSION} \
		--cache-to=type=registry,ref=$${STAGING_REGISTRY}/seedsync/build/angular/export:cache,mode=max \
		--cache-from=type=registry,ref=$${STAGING_REGISTRY}/seedsync/build/angular/export:cache \
		--push \
		${ROOTDIR}

	# final image
	$(DOCKER) buildx build \
		-f ${SOURCEDIR}/docker/build/docker-image/Dockerfile \
		--target seedsync_run \
		--build-arg STAGING_VERSION=$${STAGING_VERSION} \
		--build-arg STAGING_REGISTRY=$${STAGING_REGISTRY} \
		--tag $${STAGING_REGISTRY}/seedsync:$${STAGING_VERSION} \
		--cache-to=type=registry,ref=$${STAGING_REGISTRY}/seedsync:cache,mode=max \
		--cache-from=type=registry,ref=$${STAGING_REGISTRY}/seedsync:cache \
		--platform linux/amd64,linux/arm64,linux/arm/v7 \
		--push \
		${ROOTDIR}

docker-image-release:
	@if [[ -z "${STAGING_REGISTRY}" ]] ; then \
		export STAGING_REGISTRY="${DEFAULT_STAGING_REGISTRY}"; \
	fi;
	echo "${green}STAGING_REGISTRY=$${STAGING_REGISTRY}${reset}";
	@if [[ -z "${STAGING_VERSION}" ]] ; then \
		export STAGING_VERSION="latest"; \
	fi;
	echo "${green}STAGING_VERSION=$${STAGING_VERSION}${reset}";
	@if [[ -z "${RELEASE_REGISTRY}" ]] ; then \
		echo "${red}ERROR: RELEASE_REGISTRY is required${reset}"; exit 1; \
	fi
	@if [[ -z "${RELEASE_VERSION}" ]] ; then \
		echo "${red}ERROR: RELEASE_VERSION is required${reset}"; exit 1; \
	fi
	echo "${green}RELEASE_REGISTRY=${RELEASE_REGISTRY}${reset}"
	echo "${green}RELEASE_VERSION=${RELEASE_VERSION}${reset}"

	# final image
	$(DOCKER) buildx build \
		-f ${SOURCEDIR}/docker/build/docker-image/Dockerfile \
		--target seedsync_run \
		--build-arg STAGING_VERSION=$${STAGING_VERSION} \
		--build-arg STAGING_REGISTRY=$${STAGING_REGISTRY} \
		--tag ${RELEASE_REGISTRY}/seedsync:${RELEASE_VERSION} \
		--cache-from=type=registry,ref=$${STAGING_REGISTRY}/seedsync:cache \
		--platform linux/amd64,linux/arm64,linux/arm/v7 \
		--push \
		${ROOTDIR}

tests-python:
	# python run
	$(DOCKER) build \
		-f ${SOURCEDIR}/docker/build/docker-image/Dockerfile \
		--target seedsync_run_python_devenv \
		--tag seedsync/run/python/devenv \
		${ROOTDIR}
	# python tests
	$(DOCKER_COMPOSE) \
		-f ${SOURCEDIR}/docker/test/python/compose.yml \
		build

run-tests-python: tests-python
	$(DOCKER_COMPOSE) \
		-f ${SOURCEDIR}/docker/test/python/compose.yml \
		up --force-recreate --exit-code-from tests

tests-angular:
	# angular build
	$(DOCKER) build \
		-f ${SOURCEDIR}/docker/build/deb/Dockerfile \
		--target seedsync_build_angular_env \
		--tag seedsync/build/angular/env \
		${ROOTDIR}
	# angular tests
	$(DOCKER_COMPOSE) \
		-f ${SOURCEDIR}/docker/test/angular/compose.yml \
		build

run-tests-angular: tests-angular
	$(DOCKER_COMPOSE) \
		-f ${SOURCEDIR}/docker/test/angular/compose.yml \
		up --force-recreate --exit-code-from tests

tests-e2e-deps:
	# deb pre-reqs
	$(DOCKER) build \
		${SOURCEDIR}/docker/stage/deb/ubuntu-systemd/ubuntu-16.04-systemd \
		-t ubuntu-systemd:16.04
	$(DOCKER) build \
		${SOURCEDIR}/docker/stage/deb/ubuntu-systemd/ubuntu-18.04-systemd \
		-t ubuntu-systemd:18.04
	$(DOCKER) build \
		${SOURCEDIR}/docker/stage/deb/ubuntu-systemd/ubuntu-20.04-systemd \
		-t ubuntu-systemd:20.04

	# Setup docker for the systemd container
	# See: https://github.com/solita/docker-systemd
	$(DOCKER) run --rm --privileged -v /:/host solita/ubuntu-systemd setup

run-tests-e2e: tests-e2e-deps
	# Check our settings
	@if [[ -z "${STAGING_VERSION}" ]] && [[ -z "${SEEDSYNC_DEB}" ]]; then \
		echo "${red}ERROR: One of STAGING_VERSION or SEEDSYNC_DEB must be set${reset}"; exit 1; \
	elif [[ ! -z "${STAGING_VERSION}" ]] && [[ ! -z "${SEEDSYNC_DEB}" ]]; then \
	  	echo "${red}ERROR: Only one of STAGING_VERSION or SEEDSYNC_DEB must be set${reset}"; exit 1; \
  	fi

	# Set up environment for deb
	@if [[ ! -z "${SEEDSYNC_DEB}" ]] ; then \
		if [[ -z "${SEEDSYNC_OS}" ]] ; then \
			echo "${red}ERROR: SEEDSYNC_OS is required for DEB e2e test${reset}"; \
			echo "${red}Options include: ubu1604, ubu1804, ubu2004${reset}"; exit 1; \
		fi
	fi

	# Set up environment for image
	@if [[ ! -z "${STAGING_VERSION}" ]] ; then \
		if [[ -z "${SEEDSYNC_ARCH}" ]] ; then \
			echo "${red}ERROR: SEEDSYNC_ARCH is required for docker image e2e test${reset}"; \
			echo "${red}Options include: amd64, arm64, arm/v7${reset}"; exit 1; \
		fi
		if [[ -z "${STAGING_REGISTRY}" ]] ; then \
			export STAGING_REGISTRY="${DEFAULT_STAGING_REGISTRY}"; \
		fi;
		echo "${green}STAGING_REGISTRY=$${STAGING_REGISTRY}${reset}";
		# Removing and pulling is the only way to select the arch from a multi-arch image :(
		$(DOCKER) rmi -f $${STAGING_REGISTRY}/seedsync:$${STAGING_VERSION}
		$(DOCKER) pull $${STAGING_REGISTRY}/seedsync:$${STAGING_VERSION} --platform linux/$${SEEDSYNC_ARCH}
	fi

	# Set the flags
	COMPOSE_FLAGS="-f ${SOURCEDIR}/docker/test/e2e/compose.yml "
	COMPOSE_RUN_FLAGS=""
	if [[ ! -z "${SEEDSYNC_DEB}" ]] ; then
		COMPOSE_FLAGS+="-f ${SOURCEDIR}/docker/stage/deb/compose.yml "
		COMPOSE_FLAGS+="-f ${SOURCEDIR}/docker/stage/deb/compose-${SEEDSYNC_OS}.yml "
	fi
	if [[ ! -z "${STAGING_VERSION}" ]] ; then \
		COMPOSE_FLAGS+="-f ${SOURCEDIR}/docker/stage/docker-image/compose.yml "
	fi
	if [[ "${DEV}" = "1" ]] ; then
		COMPOSE_FLAGS+="-f ${SOURCEDIR}/docker/test/e2e/compose-dev.yml "
	else \
  		COMPOSE_RUN_FLAGS+="-d"
	fi
	echo "${green}COMPOSE_FLAGS=$${COMPOSE_FLAGS}${reset}"

	# Set up Ctrl-C handler
	function tearDown {
		$(DOCKER_COMPOSE) \
			$${COMPOSE_FLAGS} \
			stop
	}
	trap tearDown EXIT

	# Build the test
	echo "${green}Building the tests${reset}"
	$(DOCKER_COMPOSE) \
		$${COMPOSE_FLAGS} \
		build

	# This suppresses the docker-compose error that image has changed
	$(DOCKER_COMPOSE) \
		$${COMPOSE_FLAGS} \
		rm -f myapp

	# Run the test
	echo "${green}Running the tests${reset}"
	$(DOCKER_COMPOSE) \
		$${COMPOSE_FLAGS} \
		up --force-recreate \
		$${COMPOSE_RUN_FLAGS}

	if [[ "${DEV}" != "1" ]] ; then
		$(DOCKER) logs -f seedsync_test_e2e
	fi

	EXITCODE=`$(DOCKER) inspect seedsync_test_e2e | jq '.[].State.ExitCode'`
	if [[ "$${EXITCODE}" != "0" ]] ; then
		false
	fi

run-remote-server:
	$(DOCKER) container rm -f seedsync_test_e2e_remote-dev
	$(DOCKER) run \
		-it --init \
		-p 1234:1234 \
		--name seedsync_test_e2e_remote-dev \
		seedsync/test/e2e/remote

clean:
	rm -rf ${BUILDDIR}


================================================
FILE: README.md
================================================
<p align="center">
    <img src="https://user-images.githubusercontent.com/12875506/85908858-c637a100-b7cb-11ea-8ab3-75c0c0ddf756.png" alt="SeedSync" />
</p>


<p align="center">
  <!--<a href="https://travis-ci.com/ipsingh06/seedsync">
    <img src="https://img.shields.io/travis/com/ipsingh06/seedsync" alt="Build">
  </a>-->
  <a href="https://github.com/ipsingh06/seedsync">
    <img src="https://img.shields.io/github/stars/ipsingh06/seedsync" alt="Stars">
  </a>
  <a href="https://hub.docker.com/r/ipsingh06/seedsync">
    <img src="https://img.shields.io/docker/pulls/ipsingh06/seedsync" alt="Downloads">
  </a>
  <a href="https://hub.docker.com/r/ipsingh06/seedsync">
    <img src="https://img.shields.io/docker/v/ipsingh06/seedsync?color=blue" alt="Version">
  </a>
  <a href="https://hub.docker.com/r/ipsingh06/seedsync">
    <img src="https://img.shields.io/docker/image-size/ipsingh06/seedsync/latest?style=flat" alt="Size">
  </a>
  <a href="https://github.com/ipsingh06/seedsync/blob/master/LICENSE.txt">
    <img src="https://img.shields.io/github/license/ipsingh06/seedsync" alt="License">
  </a>
</p>

SeedSync is a tool to sync the files on a remote Linux server (like your seedbox, for example).
It uses LFTP to transfer files fast!

## Features

* Built on top of [LFTP](http://lftp.tech/), the fastest file transfer program ever
* Web UI - track and control your transfers from anywhere
* Automatically extract your files after sync
* Auto-Queue - only sync the files you want based on pattern matching
* Delete local and remote files easily
* Fully open source!

## How it works

Install SeedSync on a local machine.
SeedSync will connect to your remote server and sync files to the local machine as
they become available.

You don't need to install anything on the remote server.
All you need are the SSH credentials for the remote server.

## Supported Platforms

* Linux
* Raspberry Pi (v2, v3 and v4)
* Windows (via Docker)
* MacOS (via Docker)


## Installation and Usage

Please refer to the [documentation](https://ipsingh06.github.io/seedsync/).


## Report an Issue

Please report any issues on the [issues](../../issues) page.
Please post the logs as well. The logs are available at:
* Deb install: `<user home directory>/.seedsync/log/seedsync.log`
* Docker: Run `docker logs <container id>`


## Contribute

Contributions to SeedSync are welcome!
Please take a look at the [Developer Readme](doc/DeveloperReadme.md) for instructions
on environment setup and the build process.


## License

SeedSync is distributed under Apache License Version 2.0.
See [License.txt](https://github.com/ipsingh06/seedsync/blob/master/LICENSE.txt) for more information.



![](https://user-images.githubusercontent.com/12875506/37031587-3a5df834-20f4-11e8-98a0-e42ee764f2ea.png)


================================================
FILE: doc/CodingGuidelines.md
================================================
# Coding Guidelines

## Python
1. Try not to throw exceptions in constructors.
Delay exceptions until after the web service is up and running.
This allows us to notify the user about the error.

2. Try to keep constructors short and passive.
Try not to start any threads or processes in constructors.

3. Do not rely on timing constraints in tests.
That is, don't use `time.sleep()` to wait for something to happen.
Actually wait for the condition and use a watchdog timer to check for failure.

## Angular
1. Keep constructor of Immutable.Record blank.
Any pre-processing that is needed to convert a JS object to Record should be put in a factory function.
This ensures that the Record object can be easily constructed for tests without having to know the JS object translations.


================================================
FILE: doc/DeveloperReadme.md
================================================
[TOC]



# Environment Setup

## Install dependencies
1. Install [nodejs](https://joshtronic.com/2019/04/29/how-to-install-node-v12-on-debian-and-ubuntu/) (comes with npm)

2. Install [Poetry](https://python-poetry.org/docs/#installation):

3. Install docker and docker-compose:
https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/#install-docker-ce
https://docs.docker.com/compose/install/

4. Install docker buildx
   
    1. https://github.com/docker/buildx/issues/132#issuecomment-582218096
    2. https://github.com/docker/buildx/issues/132#issuecomment-636041307
    
5. Build dependencies

   ```bash
   sudo apt-get install -y jq
   ```

6. Install the rest:
   ```bash
   sudo apt-get install -y lftp python3-dev rar
   ```

## Fetch code
```bash
git clone git@gitlab.com:ipsingh06/seedsync.git
cd seedsync
```

## Setup Poetry project
```bash
cd src/python
poetry install
```

## Setup angular node modules
```bash
cd src/angular
npm install
```

## Setup end-to-end tests node modules
```bash
cd src/e2e
npm install
```

# Build

1. Set up docker buildx for multi-arch builds

   ```bash
   docker buildx create --name mybuilder --driver docker-container --driver-opt image=moby/buildkit:master,network=host
   docker buildx use mybuilder
   docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
   docker buildx inspect --bootstrap
   # Make sure the following architectures are listed: linux/amd64, linux/arm64, linux/arm/v7 
   ```

2. Multi-arch docker images can only be stored in a registry.
   Create local docker registry to store multi-arch images

   ```bash
   docker run -d -p 5000:5000 --restart=always --name registry registry:2
   ```

3. Run these commands inside the root directory.
   ```bash
   make clean
   make
   ```

4. The .deb package will be generated inside `build` directory.
   The docker image will be pushed to the local registry as `seedsync:latest`. See if using:

   ```bash
   curl -X GET http://localhost:5000/v2/_catalog
   ```
   
   To inspect the architectures of image:
   
   ```bash
   docker buildx imagetools inspect localhost:5000/seedsync:latest
   ```
   
   To use a different registry during the build process, use `STAGING_REGISTRY=`.
   For example:
   
   ```bash
   make STAGING_REGISTRY=another-registry:5000
   ```
   
   To build a tag other than `latest`, use `STAGING_VERSION=`.
   For example:
   
   ```bash
   make STAGING_VERSION=0.0.1
   ```
   
   



## Python Dev Build and Run

### Build scanfs

```bash
make scanfs
```

### Run python

```bash
cd src/python
mkdir -p build/config
poetry run python seedsync.py -c build/config --html ../angular/dist --scanfs build/scanfs
```



## Angular Dev Build and Run

```bash
cd src/angular
node_modules/@angular/cli/bin/ng build
node_modules/@angular/cli/bin/ng serve
```

Dev build will be served at [http://localhost:4200](http://localhost:4200)



## Documentation

### Preview documentation in browser

```bash
cd src/python
poetry run mkdocs serve
```

Preview will be served at  [http://localhost:8000](http://localhost:8000)

### Deploy documentation

```bash
poetry run mkdocs gh-deploy
git push github gh-pages
```



# Setup dev environment

## PyCharm
1. Set project root to top-level `seedsync` directory

2. Switch interpreter to virtualenv

3. Mark src/python as 'Sources Root'

4. Add run configuration

   | Config      | Value                                                        |
   | ----------- | ------------------------------------------------------------ |
   | Name        | seedsync                                                     |
   | Script path | seedsync.py                                                  |
   | Parameters  | -c ./build/config --html ../angular/dist --scanfs ./build/scanfs |

   

# Run tests

## Manual

### Python Unit Tests

Create a new user account for python tests, and add the current user to its authorized keys.
Also add the test account to the current user group so it may access any files created by the current user.
Note: the current user must have SSH keys already generated.

```bash
sudo adduser -q --disabled-password --disabled-login --gecos 'seedsynctest' seedsynctest
sudo bash -c "echo seedsynctest:seedsyncpass | chpasswd"
sudo -u seedsynctest mkdir /home/seedsynctest/.ssh
sudo -u seedsynctest chmod 700 /home/seedsynctest/.ssh
cat ~/.ssh/id_rsa.pub | sudo -u seedsynctest tee /home/seedsynctest/.ssh/authorized_keys
sudo -u seedsynctest chmod 664 /home/seedsynctest/.ssh/authorized_keys
sudo usermod -a -G $USER seedsynctest
```

Run from PyCharm

OR

Run from terminal

```bash
cd src/python
poetry run pytest
```

### Angular Unit Tests

```bash
cd src/angular
node_modules/@angular/cli/bin/ng test
```

### E2E Tests

[See here](../src/e2e/README.md)

## Docker-based Test Suite

```bash
# Python tests
make run-tests-python

# Angular tests
make run-tests-angular

# E2E Tests
# Docker image (arch=amd64,arm64,arm/v7)
make run-tests-e2e STAGING_VERSION=latest SEEDSYNC_ARCH=<arch code>
# Debian package (os=ubu1604,ubu1804,ubu2004)
make run-tests-e2e SEEDSYNC_DEB=`readlink -f build/*.deb` SEEDSYNC_OS=<os code>
```

By default images are pulled from `localhost:5000`. To test image from a registry other than the local, use `STAGING_REGISTRY=`.
For example:

```bash
make run-tests-e2e STAGING_VERSION=latest SEEDSYNC_ARCH=arm64 STAGING_REGISTRY=ipsingh06
```



# Release

## Continuous Integration

This method uses Github Action to post releases.

1. Do all of these in one change
   1. Version update in `src/angular/package.json`
   2. Version update and changelog in `src/debian/changelog`.
      Use command `LANG=C date -R` to get the date.
   3. Update `src/e2e/tests/about.page.spec.ts`
   4. Update Copyright date in `about-page.component.html`
2. Tag the commit as vX.X.X
3. Push tag to Github



## Manual Method

This manual method is deprecated in favour of the Github Actions based CI.

### Checklist

1. Do all of these in one change
    1. Version update in `src/angular/package.json`
    2. Version update and changelog in `src/debian/changelog`.
       Use command `LANG=C date -R` to get the date.
    3. Update `src/e2e/tests/about.page.spec.ts`
    4. Update Copyright date in `about-page.component.html`
2. Tag the commit as vX.X.X
3. Deploy documentation to github
4. make clean && make
5. Run all tests
6. Upload deb file to github
7. Tag and upload image to Dockerhub (see below)

### Docker image upload to Dockerhub

```bash
make docker-image-release RELEASE_VERSION=<version> RELEASE_REGISTRY=ipsingh06
make docker-image-release RELEASE_VERSION=latest RELEASE_REGISTRY=ipsingh06
```



# Development

## Remote Server

Use the following command to run the docker image for the remote server for development testing.
This is the same image used by the end-to-end tests.

```bash
make run-remote-server
```

The connection parameters for the remote server are:

| Option         | Value                             |
| -------------- | --------------------------------- |
| Remote Address | localhost or host.docker.internal |
| Remote Port    | 1234                              |
| Username       | remoteuser                        |
| Pass           | remotepass                        |
| Remote Path    | /home/remoteuser/files            |



## Run Docker Image

Use the following command to run the docker image locally:

```bash
docker run --rm -p 8800:8800 localhost:5000/seedsync:latest
```



================================================
FILE: doc/assets/logo.ai
================================================
%PDF-1.5
%
1 0 obj
<</Metadata 2 0 R/OCProperties<</D<</ON[5 0 R 32 0 R 58 0 R 84 0 R 110 0 R 136 0 R 162 0 R 188 0 R 214 0 R 240 0 R]/Order 241 0 R/RBGroups[]>>/OCGs[5 0 R 32 0 R 58 0 R 84 0 R 110 0 R 136 0 R 162 0 R 188 0 R 214 0 R 240 0 R]>>/Pages 3 0 R/Type/Catalog>>
endobj
2 0 obj
<</Length 53343/Subtype/XML/Type/Metadata>>stream
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        ">
   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <rdf:Description rdf:about=""
            xmlns:dc="http://purl.org/dc/elements/1.1/">
         <dc:format>application/pdf</dc:format>
         <dc:title>
            <rdf:Alt>
               <rdf:li xml:lang="x-default">Print</rdf:li>
            </rdf:Alt>
         </dc:title>
      </rdf:Description>
      <rdf:Description rdf:about=""
            xmlns:xmp="http://ns.adobe.com/xap/1.0/"
            xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/">
         <xmp:MetadataDate>2017-12-20T16:27:36-08:00</xmp:MetadataDate>
         <xmp:ModifyDate>2017-12-20T16:27:36-08:00</xmp:ModifyDate>
         <xmp:CreateDate>2017-12-20T15:03:31-08:00</xmp:CreateDate>
         <xmp:CreatorTool>Adobe Illustrator CS5</xmp:CreatorTool>
         <xmp:Thumbnails>
            <rdf:Alt>
               <rdf:li rdf:parseType="Resource">
                  <xmpGImg:width>256</xmpGImg:width>
                  <xmpGImg:height>240</xmpGImg:height>
                  <xmpGImg:format>JPEG</xmpGImg:format>
                  <xmpGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA&#xA;AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA8AEAAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7&#xA;FXYq7FXYq7FXYq7FVC9v7GxgNxfXMVrANjNM6xoD/rMQMSUEgc2Faz+eP5a6XyU6qL2ZTT0rNHmr&#xA;8pABF/w+RMw4s9fhj/F8t2Gap/zlFo8bMNL0O4uRT4XuZUg3/wBVBP8AryPiOJPtaA+kEsWv/wDn&#xA;JvzpLyWz0+wtVPRmWWVx9JdV/wCFwcZcaXa0+gASG7/Pr80bgELqqwKRQiK3tx9xZGYffg4i0y7S&#xA;zHrXwSif81fzGnar+Yb0Gtf3cpjH3JxwWWs67Mf4kvn87+c5wBPr+oyhfs87udqV8KvjbV+Yyfzp&#xA;fMoN9e1x2LvqN0zHcsZpCT9JOBHjz/nH5qDX98zFmuZSxNSS7Ekn6caY+LLvLX129/5aJP8Ag2/r&#xA;jS+JLvKk7u7FnYsx6sxqfvOLEknmtxQ7FXYqr/Xbz/f8n/Bt/XGmfiS7yokkmp3J6nFg1ir3f8lf&#xA;yW9b6v5n8zQfuNpdM02Qfb7rNMp/Z7qp69Tt1nGNu70Gg/jn8A+gctdy7FXYq7FXYq7FXYq7FXYq&#xA;7FXYq07qil3IVFBLMTQADqScVec+bfz68i6CXgtZm1i+Wo9GzoYgR/NOfg/4HlkDMODm7QxQ2uz5&#xA;PIPMv/ORHnrVS8emmLRrVqgCAepNQ9jLIDv7oq5AyLq8vamSX0+l5xqWrapqdwbnUrua8uD1lnka&#xA;Rt/dici4E8kpG5G0Jiwdiq+OKWQ0jRnPgoJP4YoJRUei6tJ9mzl+ZQr+umNsTkj3ohPK+uNv9WoP&#xA;d0H/ABtgtgc8e9WXyhrLdVjX5v8A0rjaPzEVRfJerEVMkA9izfwXHiR+ZivHknUqbzQ1+bf8048S&#xA;PzI7nf4J1H/f8P3t/wA048S/mR3Lh5Ivab3EYPsGP8MeJfzI7m/8EXn/AC0x/c2PEv5kdzv8EXn/&#xA;AC0x/c2PEv5kdzv8EXn/AC0x/c2PEv5kdyC1Py1dafbNcSzRsgYKFXlyJPzGILOGYSNJPhbntH5A&#xA;/ldY62z+Z9Zj9aytJvTsLRhVJZUALSOD9pUqKDoT16UM4xt2/ZukEvXL4PpDLXeuxV2KuxV2KuxV&#xA;2KuxV2KuxV2KvNfPv56+VvLRls7EjV9XSqmCFqQxsP8Afku4qD+ytT40yBm4Oo18Me3OT5884/md&#xA;5w82yMuqXpSyJqmn29Y7de4qgNXI8XJOVk26PPrMmXmdu5imBxVSGCaZwkMbSOeioCx+4YoJA5pz&#xA;aeUNUmo03G3Q/wAxq33L/E4LaZaiI5JxbeS9OjoZ5JJ27jZFP0Cp/HBxNJ1EuiZwaLpMA/d2sdR0&#xA;LLyP3tU4LajkkeqMVVUBVAAHQDYYsG8VdirsVRFpY3V0xEKcgOrHYD6cabMeGU+QRUugajGvIKr+&#xA;ynf8aYabpaPIPNL2VlYqwKsNiDsRgcUiua3FXYq7FXYqxrzxKRbWsPZ3Zz/sBT/jbDFydMNyw/JO&#xA;Y+0Pyv0lNK/L7QbRRQmzjnkH/FlwPWf/AIaQ5dHk9bpYcOOI8mUZJvdirsVdirsVdirsVdirsVSr&#xA;zL5p0Ly1pj6jrN0ttbrsoO7yN/JGg3ZvlgJpryZYwFyNB81/mN+eev8Amcy2Gl89K0Q1BjRqTzL0&#xA;/euvQH+RdvEnKjK3Q6rtGU9o+mP2vMMi61EWdheXsnp20TSN3I6D5k7DFjKYjzZPp3kyFKPfyeo3&#xA;++kqF+lup/DI8Tiz1B6Mit7W3to/TgjWJPBQB9+BxzInmqYodirsVdirsVdiqpBE00yRJ9pyFH04&#xA;soRMiAGZW1vHbwrDGKKop8z4nJu+hARFBVwskHqGmW94nxDjKB8Mg6j5+IwENObBGY35sWu7Sa1m&#xA;MUooR0PYjxGQdNkxmBoqOLB2KuxVifnkn1bMdgrkfSVwxcvTcixbJOU+7NGjSPR7GNBREt4lUeAC&#xA;ADrl45PZx5IzCl2KuxV2KuxV2KuxV2KsH/Mr819D8lWhial5rUq1ttOQ0Ir0eY/sJ+J7dyIylTia&#xA;rVxxDfeXc+WPNXm7XvNOqPqWs3JnmO0UY2iiT+SNOir+vvU5US85nzyym5JOqszBVBLHYAbknA0s&#xA;l0jyhJJxm1AmNOogH2j/AKx7fr+WAlxcmo6BldvbwW8QigjWONeiqKDIuKSTzVMUOxV2KuxV2Kux&#xA;V2KuxVNfLsPO+MhG0Skj5nb+uGLmaKFzvuZNk3bOxV2Koa+sYbyExyCjDdHHVTgIasuITFFid3aT&#xA;WsxilFCOh7EeIyDpcmMwNFRxYOxViXnn++tP9V/1jDFy9NyLF8k5T7u0r/jl2f8Axgj/AOIDLxye&#xA;zHJFYUuxV2KuxV2KuxV2KvLfzc/Oe08qpJo+jlbnzE6jkxo0VqG7yeMlPsp9J8DCUnX6zXDF6RvL&#xA;7nzDfX97f3kt7ezvc3c7F5p5WLOzHuScqednMyNncusrG5vZxBboXc7nwA8Sewxa5SERZZvo3l61&#xA;05RI1JbrvKRsK9kHb55ElwcmUy9ybYGp2KuxV2KtgEmg3J6DFUbDouoyjkIuKnu5C/gd8aciGlyS&#xA;6NXOkX9uvN4+SDqy/FT50xpGTTTjuQgsWh2KuxVkHlmOkU8n8zBfuFf45KLs9BHYlO8k57sVdirs&#xA;VYB5t85QvdJaWKrLHA1ZpzvyPQqh8Pf/ADNZLr9VMS2W2l3DdQiWI1U9R3B8DgdcRSthQxTzyo5W&#xA;TdyJAfo44YuVpjzYrknLfc/luYz+XdLmLcjLZwOW8eUSmuXx5PZQNgJjhZOxV2KuxV2KuxV5F+c/&#xA;5yL5dSXy/oMgbXZFpc3I3FqrCu3jKQdv5euQlJ1uu13h+mP1fc+Z5ZZZpXlldpJZCWkkclmZiakk&#xA;nck5U88STuUXpWkXWpT+nEOMa/3kpHwqP6+2JLVkyCIZ7p2m2unwCG3Wnd3P2mPiTkLcCczI2UVi&#xA;xdirsVdirsVZHoGnokAupFrLJ9iv7K/25IB2ujwgDiPMpxknNdiqUapoaTAzWwCS9WToG/ociQ4W&#xA;o0glvHmxxlZWKsKMNiD1ByLqiKaxVk/l1eOn1/mdj+ofwyUXb6IVjTTJOW7FXYq8+85ecvW56bpr&#xA;/ud1uLhT9vxRD/L4nv8ALrAlws+foGE5FxETYX81nN6ke6nZ0PRhixlG2W2l1DdQrNEaqeo7g+Bx&#xA;aCKY/wCeErb2r+DsPvA/pkouRpuZYhknMfbP5f3AuPInl6YHkW0205EbfEIVDf8ADDL48nrtObxx&#xA;PkE/wtzsVdirsVdirzn85PzQj8n6QLOwYNr9+p+rLsRDH0MzD8EHc+wyEpU4Wt1YxR2+ovlGeeae&#xA;aSeeRpZpWLyyuSzMzGpZidyScqeZJJNlG6No0+p3HBTwhTeWXw9h7nAS1ZMgiGfWdnb2dutvbrxj&#xA;X7ye5J8ci6+UiTZVsUOxV2KuxV2Kr4ozJKka9XYKPmTTFMY2QGbIioiouyqAoHsNsm9ABQpdhS7F&#xA;XYqlWsaQLlTNCKXA6j+cf1yJDianTce4+pjRBBodiOoyLqGV6EKaXD78j/wxyQdzpP7sfjqj8k5L&#xA;sVefecvOXrc9N01/3O63Fwp+34oh/l8T3+XWBLhZ8/QMJyLiOxV2Ko3StQazuATvC+0q+3j9GLGU&#xA;bR3nQK+lQyLuBMtCOlCrZKK6f6mF5JzX2P8Ak9OZ/wAs9AckmluY9/8AiuRk/wCNcuhyer0ZvFH3&#xA;MxyTkuxV2KuxVKfNXmTT/LWgXmtX5/cWiFglaNI52SNfd2IGAmmvLkEImR5B8Y+ZfMWpeYtbutY1&#xA;KTndXT8iB9lFGyoo7Kq7DKXlM2U5JGRQ2madNqF2lvFtXd37Ko6k4C485iIt6HY2VvZWyW8C0RO/&#xA;cnuT7nIOulIk2VfFDsVdirsVdirsVRujx89SgHYEt/wIJxDfpReQMuyx3bsVdirsVdiqR67pXIG7&#xA;gHxDeVR3H8w/jkSHX6vT36h8Ufo3/HMg+R/WcIcnTf3YRuFvefecvOXrc9N01/3O63Fwp+34oh/l&#xA;8T3+XWBLhZ8/QMJyLiOxV2KuxV2KppqhaXynGzbmN1AJ8AxUfgcMUYvrYlk3MfW35CXHq/lbpK71&#xA;he5jJO9f9JkYfg1Muhyen7ON4Y/H73oWSc12KuxV2Kvmn/nIvzy2p6/H5atJK2OknldcTs90w6Ht&#xA;+6U8fmWyqZ3dD2pqLlwDkOfvePAEmg3J6DIOpegeXtJXT7Icx/pMtGmPh4L9GQJdflycR8k0xanY&#xA;q7FXYq7FXYq7FU08urXUCf5UY/iB/HDFzNCPX8GT5N2zsVdirsVdirsVWRRRwxiNBxQVoPCprgRG&#xA;IAoMB85ecvW56bpr/ud1uLhT9vxRD/L4nv8ALrElw8+foGE5FxHYq7FXYq7FUZY6ZdXbjgpWL9qU&#xA;jYD28cWMpAJv5gto4fLk0MY+GMJSvX+8WpwhjiPrDA8m576m/wCccJQ/5c8d/wB1ezoa+4Rtv+Cy&#xA;2HJ6Xsw/uR8XqWTc92KuxVJfOnmSHy15W1LWpaE2kJaFG6NM3wxL2+07AYJGg1ZsohAyPR8TXNzP&#xA;dXMtzcOZJ53aSaRtyzueTMfck5Q8jKRJspx5S036zf8A1iQVitqMPdz9n7uuAlx886Fd7OMi4LsV&#xA;dirsVdirsVdirsVTjy0B9blPf0/+Nhhi52g+o+5keTdo7FXYq7FXYq7FXn3nPzl63PTdNf8Ac/Zu&#xA;blT9vxRD/L4nv8usCXCz5+gYfbWz3EgjRlDn7IY0r8si4ZKOHlzUSP2B7Fv7MWPGF6+Wb3vJGPpY&#xA;/wAMUeIFVPK8n7dwB8lJ/iMUHIiI/LNoP7yV3+VFH6jig5EZBpGnQ7rCpPi/xfrxYmZRnTCxS7zG&#xA;obRLsH+UH7mBxDZi+oPO8m7F9Pf84zSM3kC8U9I9TmVfl6EDfxy2HJ6Lso3i+P6nrWTdk7FXYq8K&#xA;/wCcnvMpjtdK8txNQzMb66H+SlY4R8ixcn5DK5l1Ha2WoiHfu+fMrdE9E8vWP1PSoUIpJIPUk/1m&#xA;3/AUGQLrssrkmOLWirDT57yTjGKKPtuegxAbsOCWQ7J0vlqz4/FLIW7kcQPuoclwueNBDvKHuPLT&#xA;gE28ob/JcUP3jBwtU9Af4SlFxbT278JkKN2r0PyOBwp45RNEKWLB2KuxVOvLP9/P/qj9eGLsNBzL&#xA;Icm7J2KuxV2KuxV595y85etz03TX/c7rcXCn7fiiH+XxPf5dYEuFnz9AwnIuI3iqe6TrxHGC8bbo&#xA;kx/42/ri1Sh3J9hanYq7FXYq7FUv8w/8cW7/ANT+IxDZi+oPOsm7F9N/84x/8oFf/wDbVl/6h7fL&#xA;YcnoOyf7o/1v0B67k3aOxV2Kvj/86NcOr/mRrEgasNpILKEVrQW44PT5yBj9OUSO7zHaGTiyny2Y&#xA;npFp9b1K3gIqruOY/wAlfib8BgLr8kqiS9JyDrV8UTyyrGgq7kBR7nFMYmRoMxs7SO1t1hTt9o+J&#xA;7nJgO+xYxCNBXws3YqsmhimQxyoHQ9QcDGURIUWP6joEkVZbWskfUx/tD5eORIdbn0ZG8dwk+BwX&#xA;YqnXln+/n/1R+vDF2Gg5lkOTdk7FXYq7FXn3nLzl63PTdNf9zutxcKft+KIf5fE9/l1gS4WfP0DC&#xA;ci4jsVdirsVTjSNaMFILg1h6K/df7MWuULZICCKjcHocWl2FXYq7FUv8w/8AHFu/9T+IxDZi+oPO&#xA;sm7F9N/84x/8oFf/APbVl/6h7fLYcnoOyf7o/wBb9Aeu5N2jsVUL+8isrG5vZf7q2ieaT/VjUsfw&#xA;GAlBNC3wpd3Mt1dTXUx5TTu0sjeLOSxP3nKHjpS4iSeqeeSrfnqEs5FRDHQHwZz/AEBwScXUnamZ&#xA;5Fwk48t2we5ecjaIUX/Wb+zDFztDC5GXcyPJu0dirsVdirsVSrVNFjuaywUSfqR0DfP3yJDiajSi&#xA;e45sbkjeNyjqVddip6jIuplEg0U28tf71S/6n8Rhi5ug+o+5keTdo7FXYq8+85ecvW56bpr/ALnd&#xA;bi4U/b8UQ/y+J7/LrAlws+foGE5FxHYq7FXYq7FXYqnmg6qVZbSY/AdomPY/y/0xapx6sgwtTsVd&#xA;iqV+ZzTQrr5IPvdcIbMP1B59knYvqP8A5xti4fl5I1APVv5329kjXf8A4HLcfJ6TswfufiXquTdg&#xA;7FWJfmzftYflv5gnU0LWjQV/5iCIf+ZmRlycfVyrFI+T40yl5NmXkiHjZXE3d5Av0Itf+NsjJwtS&#xA;dwyPA47J/LsfGwLd3cn7tv4ZKLt9FGoe9NMk5bsVdirsVdirsVQOp6XFeJUfBOo+F/H2PtgIcfPp&#xA;xkHmlegxSQanJFKpVxGQR/slORDh6OJjkIPcyLJu0dirz7zl5y9bnpumv+53W4uFP2/FEP8AL4nv&#xA;8usCXCz5+gYTkXEdirsVdirsVdirsVb6bjFWZabcNcWMMzfaZaMfcGh/Vi40hRROFDsVSTzjJx0f&#xA;j/vyRV/W3/GuEN+n+pguSc59cfkNafV/yu0ljs1w1xMw273DqP8AhVGXQ5PT9nxrDH8dXoGSc12K&#xA;vNf+chrtoPyzu4gaC6uLeI+4Egl/5l5CfJwe0j+5Pw+98o5U8yz3ylHw0SJv9+M7f8MV/wCNciXA&#xA;zn1JxgaWXaOvHTYB/kk/eScmHd6YVjCNwt7sVdirsVdirsVdiqmYYzMs1P3igqG9j2wMeEXfVUws&#xA;nn3nLzl63PTdNf8Ac7rcXCn7fiiH+XxPf5dYEuFnz9AwnIuI7FXYq7FXYq7FXYq7FW+uwxVmlhAY&#xA;LOGI/aVRy+Z3P44uNI2VfCh2KsY88TUhtYf5mZyP9UAD/iWGLlaYcyxHJOW+1/y7079HeRNBtP2k&#xA;sYGf/XkQO/8AwzHLo8nrtPHhxxHkGQ5JudiryX/nJmRk8gWailJNThU/L0J2/wCNchPk63tU1i+P&#xA;63zDlTzr0Py4vHRLUf5JP3sTkC67L9RTLFrZnpwpYW//ABjQ/eBkw77D9A9yIwtjsVdirsVdirsV&#xA;dirXTFXnvnHzobgvp2mPS33W4uF/b8VQ/wAvie/y6wJcLPnvYMLyLiOxV2KuxV2KuxV2KuxVVgtr&#xA;iduMMbOfYbfScUEp7pegmGRZ7oguu6RjcA+JOLVKfcnWFrdirsVYN5wufV1f0wdoEVPpPxH/AIlk&#xA;g52nFRQWhaZLqut2GmRCsl9cRW6/OVwv8cLl4ocUxHvL7oREjRUQBUQBVUdABsBmQ9g3irsVeM/8&#xA;5Ps3+FNJWp4m/qR2qIXp+vK5ur7W/ux/W/QXzblbz70fQgBo9oB/vpT9++QLrsv1FHYtbNbMAWkA&#xA;HQRr/wARGTDv8X0j3K2Fm7FXYq7FXYq7FWiQBU9MVeeecvORui+naa/+jfZuLhf92eKqf5fE9/l1&#xA;gS4OfPewYZkXFdiqb6bb6Refu5FaK47ANs3+rWv3YsJEhMD5asD0eUfIr/FcWvxCtPlmzrtLIB7l&#xA;f6Yp8Qtf4ZtP9+yf8L/TFfEXDy1YA/blPtVf+acUeIVRPL+mr1Rm+bH+FMV8QoiPS9Pj+zbp82HL&#xA;/iVcUcRRQAUUAoB0AxYuwq7FXYq07qiM7GiqCWPgBirzK8uWubua4brK7NTwBOwybs4ihT0P/nH7&#xA;QTqn5i21y68oNKiku5K9OVPTj+nnIG+jJRG7s+zMfFlv+a+rsuejdirsVeM/85QA/wCFdIPb68f+&#xA;TL5XN1Xa392P636C+bcrdA9I0P8A45Fn/wAYl/VkC63L9RRuLBmtp/vLD/xjX9QyYd/j+ke5Wws3&#xA;Yq7FXYq7FWiQBU9MVeeecvORui+m6a/+jfZuLhf92eKqf5fE9/l1gS4OfPewYZkXFdirsVbBINRs&#xA;R0OKp/pGucuNvdtRuiSnv7N/XFqlDuTzC1OxV2KuxV2KuxV2KuxV2KpL5sv/AKtphiU0luTwH+r+&#xA;2fu2+nCG7BG5e5gmSc99Mf8AONflg2HlW61yZKTavNxhJG/1e3qoI/1pC/3DLIB6HsvDw4+L+c9g&#xA;yx2bsVdiryP/AJybVj5BsSBULqkJb2H1ecfxyE+TrO1R+6H9b9b5jyp556J5dIOi2hH8lPuJGQLr&#xA;sv1FMcWtmtp/vLD/AMY1/UMmHf4/pHuVsLN2KuxV2KtEgCp6Yq8885ecjdF9N01/9G+zcXC/7s8V&#xA;U/y+J7/LrAlwc+e9gwzIuK7FXYq7FXYq7FU+0TWTVbW5bbpFIf8AiJ/hi1Th1CfYWp2KuxV2KuxV&#xA;2KuxV2KvPfMOp/X9Rd0NYI/gh9wOrfSckA7DFDhCzy/ot5rmt2WkWYrc30ywoT0Xkd2Pso3Pthcn&#xA;FjM5CI6vtzRtKtNI0mz0uzXjbWUKQRDvxRQtT7nqffLwHroREQAOQRmFk7FXYq8s/wCckI+f5dBq&#xA;09O+gb5/C6/8bZDJydf2mP3J94fLWVPNvQfK7V0K29uY+52yBdfmHqKaYtTNLEk2VuT1MSV/4EZM&#xA;O+w/QPcFfC2OxV2KtEgCp6Yq8885ecjdF9N01/8ARvs3Fwv+7PFVP8vie/y6wJcHPnvYMMyLiuxV&#xA;2KuxV2KuxV2KuxVk2hambiP6vKazRj4SerL/AFGLTONbptha3Yq7FXYq7FXYqx/zZrItrc2ULfv5&#xA;h+8I/ZQ/xbCA5GDHZssKyTmvoH/nG3yI0UU/m++io0oa30oMP2K0lmFfE/AD/reOWQHV3nZenocZ&#xA;68nu+WO4dirsVdirz38/Lf1fyt1V60ML20lAK1/0mNP+Nq5GfJwu0R+5l8PvfJOUvMM78oPy0ZR/&#xA;JI4/Gv8AHIlwNR9SdYGlmWmmthb/APGNf1ZMO9wfQPcicLa7FWiQBU9MVeeecvORui+m6a/+jfZu&#xA;Lhf92eKqf5fE9/l1gS4OfPewYZkXFdirsVdirsVdirsVdirsVVbad7edJk+0hqPf2+nFBFs1ikWW&#xA;JJF+y6hh8iK4uMQuwq7FXYq7FUv1rWIdNtubUad6iGPxPifYYgNmPGZF59cTzXEzzTMXlkNWY+OT&#xA;dgBQpk/5beRL3zl5lh06MMljFSXUbkdI4QdwD/M/2V99+gOEC3L0mmOWddOr7GsbG0sLKCys4lgt&#xA;LZFighT7KogooH0Ze9TGIAoK+KXYq7FXYqw784oDP+WevoATS3Em3/Fciv3/ANXIz5ONrBeKXufH&#xA;GUvKM18lNXS5V7rMfuKrkZOFqR6mQYHHZfpJrpsB/wAmn3GmTDvNOf3YRmFuaJAFT0xV555y85G6&#xA;L6bpr/6N9m4uF/3Z4qp/l8T3+XWBLg5897BhmRcV2KuxV2KuxV2KuxV2KuxV2KuxVl+iljpcHLrQ&#xA;/dyNMXHnzRuFi7FXYql+s6zb6bb8n+OZv7qLuT4n2xAbMeMyLAr29uL24a4uG5O33AdgB4ZNz4xE&#xA;RQRPl/QNV1/V7fSdLhM95ctxRegAG7Mx7Ko3Jwt2LFLJLhjzfYP5e+RNN8meX49NtaSXL0kvrylG&#xA;mlp19lXoo7D3rlsY09Tp9OMUeEMmyTe7FXYq7FXYqkH5g263PkTzDCRyLabdlRWnxLCxX/hgMEuT&#xA;TqI3jkPIvibKHkWX+R3rb3SeDqfvB/pkZOHqeYZNgcZlmhtXS4fbkP8Ahjkw7rSH92EcSAKnphch&#xA;555y85G6L6bpr/6N9m4uF/3Z4qp/l8T3+XWBLg5897BhmRcV2KuxV2KuxV2KuxV2KuxV2KuxVfFF&#xA;JNKsUY5O5ooxQzW2hEEEcI6RqFr4074uOTZVMKHYqlOt+YLfTkMaUluyPhj7L7t/TEBtx4jL3MFu&#xA;bqe6naedy8r/AGmOTc6MQBQRmgeX9X1/VYdL0m3a5vJz8KLsAB1ZmOyqO5OFuxYpZJcMeb6z/LL8&#xA;stK8k6VwTjc6xcqPr9/Tr39OOu6xqfv6nsBbGNPTaXSxxRoc+pZpknKdirsVdirsVdiqW+ZovV8t&#xA;6tFxL+pZ3C8B1PKJhTbBLkxmNi+GcoeNZX5GP+9q1/32QP8AgsjJxNT0ZVgcVlHl9gdNFeisw3+/&#xA;+OSi7jRn92w7zl5yN0X03TX/ANG+zcXC/wC7PFVP8vie/wAuoJa8+e9gwzIuK7FXYq7FXYq7FXYq&#xA;7FXYq7FVaO0upP7uF2+Sk4oJRtv5f1CUjmoiXxY7/cK4sTMJ5p2k29kKr8cxFGkP6gO2LVKdo3Cx&#xA;cSACSaAdTirGdb82JHyt9OId+jXHVR/qePzwgOTiwdSxJ3d2LuSzMasxNSSfHJOWAnXlDydrvmzV&#xA;00zSIDJIaGaZtooU7vI3Yfie2EC3IwaeWWVRfWH5e/lxofkrTPq9mPXv5gPruoOKSSkb0AqeCDso&#xA;+mp3y2Maek02mjijQ597LMk5LsVdirsVdirsVdiqF1X/AI5d5/xgk/4gcB5IPJ8I5Q8YyjyN/fXf&#xA;+qn6zkZOLqeQZbgcRq8kvZtNbT4J/q8UjFpmC1ZgQBxrUUG2/jjbfDOYx4QkX+Fv+Xr/AIT/AJuw&#xA;MfEXDyuve5JPslP44r4jv8Lx/wDLQf8AgR/XFfEXf4Yg/wB/t9wxXxF3+GLT/fsn/C/0xR4i4eWr&#xA;Cv25T7VX/mnFHiFePLunDrzPzb+gxXxCvXQNLHWIn5s38DiviFUXRtMXpAPpJP6zijjKounWC9Le&#xA;P58Qf14o4irJFEn2EVfkAP1Yra7Ch2KuxVA6lrVhp6n15KyU+GFd3P0dvpxAZwxmXJhur+Yr3USU&#xA;r6Nt2hU9f9Y98kA5mPCI+9KsLczv8t/yk8wec51nANloiNSfUZB9qnVYVP22/Ad/DJCNubpdDLLv&#xA;yj+OT6l8reUtC8r6Wmm6PbCCEUMjneSV6U5yP+03+Yy0Cno8WKOMVEJxhbHYq7FXYq7FXYq7FXYq&#xA;l3mO4+reXtUuK09G0nkqdx8MTHt8sEuTGZoF8MZQ8ayryMu963h6YH/DZGTiak8mV4HFdirsVdir&#xA;sVdirsVdirsVdirsVdirsVdiqXX3mHSrOoeYSSD/AHXH8TfhsPpONNkcUixrUfN9/cVS2H1aI/tD&#xA;dz/su30ZIByYacDnukTMzsWYlmO5YmpJwt6tYaffajdx2dhbyXV3MeMUEKl3Y+yjfFnCBkaAsveP&#xA;y5/5x1SMxan5yId9mj0iNqqD/wAXyL1/1V28T2ywQ73daXswDfJ8nusEEFvDHBBGsUEShIokAVFV&#xA;RQKqjYAZY7gBfirsVdirsVdirsVdirsVdirCPzo1uPSfy31hy3GW8j+pQr3Y3B4MP+RfI/RkZnZx&#xA;dbPhxS91fN8fZS8qzPyVBxsJpiP7ySg+SgfxJyMnC1J3ZFgcd2KuxV2KuxV2KuxV2KuxVbJLFGKy&#xA;OqDxYgfrxSAShJdc0iL7d3F8lYMfuWuNMhjkeiAn846RH/d+pMe3FaD/AIan6sNNg08krufO1021&#xA;tbpH/lOS5/Djh4W2OmHUpPd6zqd3UT3Dsh6oDxX/AIFaDDTdHHEcggsWarb21xczpBbRPNPIeMcU&#xA;al3YnsqipOKYxJNB6t5K/wCcdvM+rmO519/0NYH4vSID3TDw9PpH/szUfy5MQJdng7LnLefpH2vf&#xA;fKPkLyv5StfR0azWKRhxmu3+OeTv8ch3pXsKD2ywRAd1h08MYqIZBhbnYq7FXYq7FXYq7FXYq7FX&#xA;YqoX9/ZafZTXt7MlvaW6GSaaQ0VVHUk4olIAWXyh+b35oy+ddUSC0Uw6FYM31ONtnlc7GZx2qPsj&#xA;sPmcplK3m9drPFND6Q89yLgI621rVLaFYYJzHEteKgL3NT1GNMDjidyFX/Emt/8ALU33L/TBTHwY&#xA;9zv8Sa3/AMtTfcv9MaXwY9za+ZtcU1F0fpVD+tcaXwY9y7/FOu/8tX/CR/8ANONL4EO5Z/iTW/8A&#xA;lqb7l/pjS+DHud/iTW/+WpvuX+mNL4Me5Yde1k1/0uTf3pjSfCj3KZ1jVj1vJvokYfqOGk+HHuUX&#xA;vLuTZ55H/wBZmP6zinhCkSTueuLJrFXYquRHkcIil3Y0VVFST7AYpAJ5Mv0D8ovzD1sq1ro80EDA&#xA;H6xdj6snE9x6nFmH+qDhALlY9Dln0r3vT/LP/OMMKlZfMuqGQ9WtLAcV6d5pBX7kHzyYg7HF2SB9&#xA;Zv3PXfLfknyr5ai9PRdNhtGIo04HKZh/lSvyc/KuTEQHZ4sEMY9IpO8La7FXYq7FXYq7FXYq7FXY&#xA;q7FXYq7FXgX5uWn5t+cb1rCx0K5t/Lts/wC5h5xBp2XpLLR/+BXt88qlZdPrY58p4Yx9Hw3ecf8A&#xA;KmvzO/6sE/8AwcX/ADXkeEuv/k/N/N+53/KmvzO/6sE//Bxf8148JX+T83837nf8qa/M7/qwT/8A&#xA;Bxf8148JX+T83837nf8AKmvzO/6sE/8AwcX/ADXjwlf5Pzfzfud/ypr8zv8AqwT/APBxf8148JX+&#xA;T83837lkv5P/AJlxLyby/ckE0+Dg5+5WJxor+QzfzfuU1/Kb8yGYKPL13UmgqgA38STTGij8hm/m&#xA;q/8Aypr8zv8AqwT/APBxf8148JT/ACfm/m/c7/lTX5nf9WCf/g4v+a8eEr/J+b+b9yJX8ivzVZQw&#xA;0M0IqK3NoDv7GauHhKf5OzfzftH60VH/AM4+/me7UbT4YxTq1zDT/hWbHhLYOy8vkmFt/wA41/mD&#xA;NT1ZtPtxQE+pNITv2/dxPvh4CyHZWXvj+Pgm9p/zi7rrsPrmuWsK/tGGKSUjfsGMWPAW0dkHrL7E&#xA;/wBP/wCcXfL8bA6hrd3cL3EEccFdvF/Xw+G3R7Jh1JZRpf5CflnYbvpz3z7Ue6mkan+xQxp964eA&#xA;OTDs/DHozLSvLnl/SFA0vTbWxoKVt4UjJHuVAJ+nJAByoY4x5ABMcLN2KuxV2KuxV2KuxV2KuxV2&#xA;KuxV2KuxV2KuxV//2Q==</xmpGImg:image>
               </rdf:li>
            </rdf:Alt>
         </xmp:Thumbnails>
      </rdf:Description>
      <rdf:Description rdf:about=""
            xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
            xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#"
            xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#">
         <xmpMM:InstanceID>uuid:92c58e1a-0e41-446e-95bc-d00422909d30</xmpMM:InstanceID>
         <xmpMM:DocumentID>xmp.did:57893048C9E5E7118238DD4578CC24E0</xmpMM:DocumentID>
         <xmpMM:OriginalDocumentID>uuid:5D20892493BFDB11914A8590D31508C8</xmpMM:OriginalDocumentID>
         <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass>
         <xmpMM:DerivedFrom rdf:parseType="Resource">
            <stRef:instanceID>xmp.iid:56893048C9E5E7118238DD4578CC24E0</stRef:instanceID>
            <stRef:documentID>xmp.did:56893048C9E5E7118238DD4578CC24E0</stRef:documentID>
            <stRef:originalDocumentID>uuid:5D20892493BFDB11914A8590D31508C8</stRef:originalDocumentID>
            <stRef:renditionClass>proof:pdf</stRef:renditionClass>
         </xmpMM:DerivedFrom>
         <xmpMM:History>
            <rdf:Seq>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:55893048C9E5E7118238DD4578CC24E0</stEvt:instanceID>
                  <stEvt:when>2017-12-20T13:03:52-08:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Illustrator CS5</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:56893048C9E5E7118238DD4578CC24E0</stEvt:instanceID>
                  <stEvt:when>2017-12-20T15:03:24-08:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Illustrator CS5</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:57893048C9E5E7118238DD4578CC24E0</stEvt:instanceID>
                  <stEvt:when>2017-12-20T15:03:32-08:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Illustrator CS5</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
            </rdf:Seq>
         </xmpMM:History>
      </rdf:Description>
      <rdf:Description rdf:about=""
            xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/">
         <illustrator:Type>Document</illustrator:Type>
         <illustrator:StartupProfile>Print</illustrator:StartupProfile>
      </rdf:Description>
      <rdf:Description rdf:about=""
            xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/"
            xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#"
            xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/">
         <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint>
         <xmpTPg:HasVisibleTransparency>False</xmpTPg:HasVisibleTransparency>
         <xmpTPg:NPages>1</xmpTPg:NPages>
         <xmpTPg:MaxPageSize rdf:parseType="Resource">
            <stDim:w>500.000000</stDim:w>
            <stDim:h>500.000000</stDim:h>
            <stDim:unit>Pixels</stDim:unit>
         </xmpTPg:MaxPageSize>
         <xmpTPg:PlateNames>
            <rdf:Seq>
               <rdf:li>Cyan</rdf:li>
               <rdf:li>Magenta</rdf:li>
               <rdf:li>Yellow</rdf:li>
               <rdf:li>Black</rdf:li>
            </rdf:Seq>
         </xmpTPg:PlateNames>
         <xmpTPg:SwatchGroups>
            <rdf:Seq>
               <rdf:li rdf:parseType="Resource">
                  <xmpG:groupName>Default Swatch Group</xmpG:groupName>
                  <xmpG:groupType>0</xmpG:groupType>
                  <xmpG:Colorants>
                     <rdf:Seq>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>White</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>0.000000</xmpG:cyan>
                           <xmpG:magenta>0.000000</xmpG:magenta>
                           <xmpG:yellow>0.000000</xmpG:yellow>
                           <xmpG:black>0.000000</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>Black</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>0.000000</xmpG:cyan>
                           <xmpG:magenta>0.000000</xmpG:magenta>
                           <xmpG:yellow>0.000000</xmpG:yellow>
                           <xmpG:black>100.000000</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>CMYK Red</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>0.000000</xmpG:cyan>
                           <xmpG:magenta>100.000000</xmpG:magenta>
                           <xmpG:yellow>100.000000</xmpG:yellow>
                           <xmpG:black>0.000000</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>CMYK Yellow</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>0.000000</xmpG:cyan>
                           <xmpG:magenta>0.000000</xmpG:magenta>
                           <xmpG:yellow>100.000000</xmpG:yellow>
                           <xmpG:black>0.000000</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>CMYK Green</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>100.000000</xmpG:cyan>
                           <xmpG:magenta>0.000000</xmpG:magenta>
                           <xmpG:yellow>100.000000</xmpG:yellow>
                           <xmpG:black>0.000000</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>CMYK Cyan</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>100.000000</xmpG:cyan>
                           <xmpG:magenta>0.000000</xmpG:magenta>
                           <xmpG:yellow>0.000000</xmpG:yellow>
                           <xmpG:black>0.000000</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>CMYK Blue</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>100.000000</xmpG:cyan>
                           <xmpG:magenta>100.000000</xmpG:magenta>
                           <xmpG:yellow>0.000000</xmpG:yellow>
                           <xmpG:black>0.000000</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>CMYK Magenta</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>0.000000</xmpG:cyan>
                           <xmpG:magenta>100.000000</xmpG:magenta>
                           <xmpG:yellow>0.000000</xmpG:yellow>
                           <xmpG:black>0.000000</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=15 M=100 Y=90 K=10</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>14.999998</xmpG:cyan>
                           <xmpG:magenta>100.000000</xmpG:magenta>
                           <xmpG:yellow>90.000004</xmpG:yellow>
                           <xmpG:black>10.000002</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=0 M=90 Y=85 K=0</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>0.000000</xmpG:cyan>
                           <xmpG:magenta>90.000004</xmpG:magenta>
                           <xmpG:yellow>84.999996</xmpG:yellow>
                           <xmpG:black>0.000000</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=0 M=80 Y=95 K=0</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>0.000000</xmpG:cyan>
                           <xmpG:magenta>80.000001</xmpG:magenta>
                           <xmpG:yellow>94.999999</xmpG:yellow>
                           <xmpG:black>0.000000</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=0 M=50 Y=100 K=0</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>0.000000</xmpG:cyan>
                           <xmpG:magenta>50.000000</xmpG:magenta>
                           <xmpG:yellow>100.000000</xmpG:yellow>
                           <xmpG:black>0.000000</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=0 M=35 Y=85 K=0</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>0.000000</xmpG:cyan>
                           <xmpG:magenta>35.000002</xmpG:magenta>
                           <xmpG:yellow>84.999996</xmpG:yellow>
                           <xmpG:black>0.000000</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=5 M=0 Y=90 K=0</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>5.000001</xmpG:cyan>
                           <xmpG:magenta>0.000000</xmpG:magenta>
                           <xmpG:yellow>90.000004</xmpG:yellow>
                           <xmpG:black>0.000000</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=20 M=0 Y=100 K=0</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>19.999999</xmpG:cyan>
                           <xmpG:magenta>0.000000</xmpG:magenta>
                           <xmpG:yellow>100.000000</xmpG:yellow>
                           <xmpG:black>0.000000</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=50 M=0 Y=100 K=0</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>50.000000</xmpG:cyan>
                           <xmpG:magenta>0.000000</xmpG:magenta>
                           <xmpG:yellow>100.000000</xmpG:yellow>
                           <xmpG:black>0.000000</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=75 M=0 Y=100 K=0</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>75.000000</xmpG:cyan>
                           <xmpG:magenta>0.000000</xmpG:magenta>
                           <xmpG:yellow>100.000000</xmpG:yellow>
                           <xmpG:black>0.000000</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=85 M=10 Y=100 K=10</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>84.999996</xmpG:cyan>
                           <xmpG:magenta>10.000002</xmpG:magenta>
                           <xmpG:yellow>100.000000</xmpG:yellow>
                           <xmpG:black>10.000002</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=90 M=30 Y=95 K=30</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>90.000004</xmpG:cyan>
                           <xmpG:magenta>30.000001</xmpG:magenta>
                           <xmpG:yellow>94.999999</xmpG:yellow>
                           <xmpG:black>30.000001</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=75 M=0 Y=75 K=0</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>75.000000</xmpG:cyan>
                           <xmpG:magenta>0.000000</xmpG:magenta>
                           <xmpG:yellow>75.000000</xmpG:yellow>
                           <xmpG:black>0.000000</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=80 M=10 Y=45 K=0</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>80.000001</xmpG:cyan>
                           <xmpG:magenta>10.000002</xmpG:magenta>
                           <xmpG:yellow>44.999999</xmpG:yellow>
                           <xmpG:black>0.000000</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=70 M=15 Y=0 K=0</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>69.999999</xmpG:cyan>
                           <xmpG:magenta>14.999998</xmpG:magenta>
                           <xmpG:yellow>0.000000</xmpG:yellow>
                           <xmpG:black>0.000000</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=85 M=50 Y=0 K=0</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>84.999996</xmpG:cyan>
                           <xmpG:magenta>50.000000</xmpG:magenta>
                           <xmpG:yellow>0.000000</xmpG:yellow>
                           <xmpG:black>0.000000</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=100 M=95 Y=5 K=0</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>100.000000</xmpG:cyan>
                           <xmpG:magenta>94.999999</xmpG:magenta>
                           <xmpG:yellow>5.000001</xmpG:yellow>
                           <xmpG:black>0.000000</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=100 M=100 Y=25 K=25</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>100.000000</xmpG:cyan>
                           <xmpG:magenta>100.000000</xmpG:magenta>
                           <xmpG:yellow>25.000000</xmpG:yellow>
                           <xmpG:black>25.000000</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=75 M=100 Y=0 K=0</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>75.000000</xmpG:cyan>
                           <xmpG:magenta>100.000000</xmpG:magenta>
                           <xmpG:yellow>0.000000</xmpG:yellow>
                           <xmpG:black>0.000000</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=50 M=100 Y=0 K=0</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>50.000000</xmpG:cyan>
                           <xmpG:magenta>100.000000</xmpG:magenta>
                           <xmpG:yellow>0.000000</xmpG:yellow>
                           <xmpG:black>0.000000</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=35 M=100 Y=35 K=10</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>35.000002</xmpG:cyan>
                           <xmpG:magenta>100.000000</xmpG:magenta>
                           <xmpG:yellow>35.000002</xmpG:yellow>
                           <xmpG:black>10.000002</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=10 M=100 Y=50 K=0</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>10.000002</xmpG:cyan>
                           <xmpG:magenta>100.000000</xmpG:magenta>
                           <xmpG:yellow>50.000000</xmpG:yellow>
                           <xmpG:black>0.000000</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=0 M=95 Y=20 K=0</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>0.000000</xmpG:cyan>
                           <xmpG:magenta>94.999999</xmpG:magenta>
                           <xmpG:yellow>19.999999</xmpG:yellow>
                           <xmpG:black>0.000000</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=25 M=25 Y=40 K=0</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>25.000000</xmpG:cyan>
                           <xmpG:magenta>25.000000</xmpG:magenta>
                           <xmpG:yellow>39.999998</xmpG:yellow>
                           <xmpG:black>0.000000</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=40 M=45 Y=50 K=5</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>39.999998</xmpG:cyan>
                           <xmpG:magenta>44.999999</xmpG:magenta>
                           <xmpG:yellow>50.000000</xmpG:yellow>
                           <xmpG:black>5.000001</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=50 M=50 Y=60 K=25</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>50.000000</xmpG:cyan>
                           <xmpG:magenta>50.000000</xmpG:magenta>
                           <xmpG:yellow>60.000002</xmpG:yellow>
                           <xmpG:black>25.000000</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=55 M=60 Y=65 K=40</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>55.000001</xmpG:cyan>
                           <xmpG:magenta>60.000002</xmpG:magenta>
                           <xmpG:yellow>64.999998</xmpG:yellow>
                           <xmpG:black>39.999998</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=25 M=40 Y=65 K=0</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>25.000000</xmpG:cyan>
                           <xmpG:magenta>39.999998</xmpG:magenta>
                           <xmpG:yellow>64.999998</xmpG:yellow>
                           <xmpG:black>0.000000</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=30 M=50 Y=75 K=10</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>30.000001</xmpG:cyan>
                           <xmpG:magenta>50.000000</xmpG:magenta>
                           <xmpG:yellow>75.000000</xmpG:yellow>
                           <xmpG:black>10.000002</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=35 M=60 Y=80 K=25</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>35.000002</xmpG:cyan>
                           <xmpG:magenta>60.000002</xmpG:magenta>
                           <xmpG:yellow>80.000001</xmpG:yellow>
                           <xmpG:black>25.000000</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=40 M=65 Y=90 K=35</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>39.999998</xmpG:cyan>
                           <xmpG:magenta>64.999998</xmpG:magenta>
                           <xmpG:yellow>90.000004</xmpG:yellow>
                           <xmpG:black>35.000002</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=40 M=70 Y=100 K=50</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>39.999998</xmpG:cyan>
                           <xmpG:magenta>69.999999</xmpG:magenta>
                           <xmpG:yellow>100.000000</xmpG:yellow>
                           <xmpG:black>50.000000</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=50 M=70 Y=80 K=70</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>50.000000</xmpG:cyan>
                           <xmpG:magenta>69.999999</xmpG:magenta>
                           <xmpG:yellow>80.000001</xmpG:yellow>
                           <xmpG:black>69.999999</xmpG:black>
                        </rdf:li>
                     </rdf:Seq>
                  </xmpG:Colorants>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <xmpG:groupName>Grays</xmpG:groupName>
                  <xmpG:groupType>1</xmpG:groupType>
                  <xmpG:Colorants>
                     <rdf:Seq>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=0 M=0 Y=0 K=100</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>0.000000</xmpG:cyan>
                           <xmpG:magenta>0.000000</xmpG:magenta>
                           <xmpG:yellow>0.000000</xmpG:yellow>
                           <xmpG:black>100.000000</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=0 M=0 Y=0 K=90</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>0.000000</xmpG:cyan>
                           <xmpG:magenta>0.000000</xmpG:magenta>
                           <xmpG:yellow>0.000000</xmpG:yellow>
                           <xmpG:black>89.999402</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=0 M=0 Y=0 K=80</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>0.000000</xmpG:cyan>
                           <xmpG:magenta>0.000000</xmpG:magenta>
                           <xmpG:yellow>0.000000</xmpG:yellow>
                           <xmpG:black>79.998797</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=0 M=0 Y=0 K=70</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>0.000000</xmpG:cyan>
                           <xmpG:magenta>0.000000</xmpG:magenta>
                           <xmpG:yellow>0.000000</xmpG:yellow>
                           <xmpG:black>69.999701</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=0 M=0 Y=0 K=60</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>0.000000</xmpG:cyan>
                           <xmpG:magenta>0.000000</xmpG:magenta>
                           <xmpG:yellow>0.000000</xmpG:yellow>
                           <xmpG:black>59.999102</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=0 M=0 Y=0 K=50</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>0.000000</xmpG:cyan>
                           <xmpG:magenta>0.000000</xmpG:magenta>
                           <xmpG:yellow>0.000000</xmpG:yellow>
                           <xmpG:black>50.000000</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=0 M=0 Y=0 K=40</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>0.000000</xmpG:cyan>
                           <xmpG:magenta>0.000000</xmpG:magenta>
                           <xmpG:yellow>0.000000</xmpG:yellow>
                           <xmpG:black>39.999402</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=0 M=0 Y=0 K=30</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>0.000000</xmpG:cyan>
                           <xmpG:magenta>0.000000</xmpG:magenta>
                           <xmpG:yellow>0.000000</xmpG:yellow>
                           <xmpG:black>29.998803</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=0 M=0 Y=0 K=20</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>0.000000</xmpG:cyan>
                           <xmpG:magenta>0.000000</xmpG:magenta>
                           <xmpG:yellow>0.000000</xmpG:yellow>
                           <xmpG:black>19.999701</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=0 M=0 Y=0 K=10</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>0.000000</xmpG:cyan>
                           <xmpG:magenta>0.000000</xmpG:magenta>
                           <xmpG:yellow>0.000000</xmpG:yellow>
                           <xmpG:black>9.999102</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=0 M=0 Y=0 K=5</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>0.000000</xmpG:cyan>
                           <xmpG:magenta>0.000000</xmpG:magenta>
                           <xmpG:yellow>0.000000</xmpG:yellow>
                           <xmpG:black>4.998803</xmpG:black>
                        </rdf:li>
                     </rdf:Seq>
                  </xmpG:Colorants>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <xmpG:groupName>Brights</xmpG:groupName>
                  <xmpG:groupType>1</xmpG:groupType>
                  <xmpG:Colorants>
                     <rdf:Seq>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=0 M=100 Y=100 K=0</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>0.000000</xmpG:cyan>
                           <xmpG:magenta>100.000000</xmpG:magenta>
                           <xmpG:yellow>100.000000</xmpG:yellow>
                           <xmpG:black>0.000000</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=0 M=75 Y=100 K=0</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>0.000000</xmpG:cyan>
                           <xmpG:magenta>75.000000</xmpG:magenta>
                           <xmpG:yellow>100.000000</xmpG:yellow>
                           <xmpG:black>0.000000</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=0 M=10 Y=95 K=0</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>0.000000</xmpG:cyan>
                           <xmpG:magenta>10.000002</xmpG:magenta>
                           <xmpG:yellow>94.999999</xmpG:yellow>
                           <xmpG:black>0.000000</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=85 M=10 Y=100 K=0</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>84.999996</xmpG:cyan>
                           <xmpG:magenta>10.000002</xmpG:magenta>
                           <xmpG:yellow>100.000000</xmpG:yellow>
                           <xmpG:black>0.000000</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=100 M=90 Y=0 K=0</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>100.000000</xmpG:cyan>
                           <xmpG:magenta>90.000004</xmpG:magenta>
                           <xmpG:yellow>0.000000</xmpG:yellow>
                           <xmpG:black>0.000000</xmpG:black>
                        </rdf:li>
                        <rdf:li rdf:parseType="Resource">
                           <xmpG:swatchName>C=60 M=90 Y=0 K=0</xmpG:swatchName>
                           <xmpG:mode>CMYK</xmpG:mode>
                           <xmpG:type>PROCESS</xmpG:type>
                           <xmpG:cyan>60.000002</xmpG:cyan>
                           <xmpG:magenta>90.000004</xmpG:magenta>
                           <xmpG:yellow>0.003099</xmpG:yellow>
                           <xmpG:black>0.003099</xmpG:black>
                        </rdf:li>
                     </rdf:Seq>
                  </xmpG:Colorants>
               </rdf:li>
            </rdf:Seq>
         </xmpTPg:SwatchGroups>
      </rdf:Description>
      <rdf:Description rdf:about=""
            xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
         <pdf:Producer>Adobe PDF library 9.90</pdf:Producer>
      </rdf:Description>
   </rdf:RDF>
</x:xmpmeta>
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                           
<?xpacket end="w"?>
endstream
endobj
3 0 obj
<</Count 1/Kids[7 0 R]/Type/Pages>>
endobj
7 0 obj
<</ArtBox[47.9487 58.0 456.267 438.254]/BleedBox[0.0 0.0 500.0 500.0]/Contents 242 0 R/LastModified(D:20171220162736-07'00')/MediaBox[0.0 0.0 500.0 500.0]/Parent 3 0 R/PieceInfo<</Illustrator 243 0 R>>/Resources<</ColorSpace<</CS0 244 0 R>>/ExtGState<</GS0 245 0 R>>/Properties<</MC0 240 0 R>>>>/Thumb 246 0 R/TrimBox[0.0 0.0 500.0 500.0]/Type/Page>>
endobj
242 0 obj
<</Filter/FlateDecode/Length 608>>stream
HԔnT1y
@\qUAU<"J ޞd3ʒE&|nnBo(=%*~|N{9IW#csz"ݨ
:>pS<f%>&XZ֬)m6.'Ke~il#j<T1r$<r5 Jn|sqz.X}.GaXVv-e~NgWd919]ʵ֕]M=
nHk!
2Ӑ~HqM&+gczYC_SrA&,(
U/r1Vp 
T%$,9˴HhpV6_/7W+QA/Ay]P
jD:6h&IS?jG+X!MѣX'Bj(W]H3pHɄNp}!޻#ŇW)XMUԢ|F*AQ4rPp.G'AЌSjnptzBĕ`qt	K5w-I
endstream
endobj
246 0 obj
<</BitsPerComponent 8/ColorSpace 247 0 R/Filter[/ASCII85Decode/FlateDecode]/Height 62/Length 635/Width 62>>stream
8;Z]!c#!S,%#$4i1_es`;b9^u_fiQW"De/uCI;,_-!Dj87`di>5+_Rq5!S)bNhFCQ
'Ms9mk'OM%n\4]$N3daW@cAfrmA0/lE2T0\5AK]b8^(0XN@_UD]l2GYOe^FKKrXTW
P;kuG\U5,ck4Z_aghB^K`TJIeK_i/=,J2*h(0M#QD2p+lE,26$TVZ;CE5gaUCPN.3
9MBkg(63_2GgZXV+i"8!QfD_^*m]YMDPYuUEQ(WM<CFjRW,(,9VO1S#1G'n-[n)gr
;;[!%c4:LXgp6ni9Qa`H-C;rAGg;+BS#M7-\0j-HNu;re=;`QMHVcM<T+O_Ue<<kE
1[tW2,DP+>[IcD\50$\ESD%gSQc3Ir1OAHTCZorm*c%CqCO:K=M%lNZl8'd\J[)q'
5KR\Z%q80'g\u/Zl^1T`@s\"je^i7/Q'l7>:q$p8bY0NJ+4L&VV#;@AEaQ;fr$f5t
F/A84mL=Ti41.Ks*OjF7[;R!J]@=4+VVf5\RD!c%e1gfLnJUK3G1GF;`TKh\h\pH^
9:o5XFhKegaDXd(f(JIFdb"4cN4EL@gt?/NH?\gRrT^kd(#=;LUTHHiR>8YMgPUIS
3f*GX-6,3`q<W9GYPm"BF<`su5N?[Amf<FZ<:`u~>
endstream
endobj
247 0 obj
[/Indexed/DeviceRGB 255 248 0 R]
endobj
248 0 obj
<</Filter[/ASCII85Decode/FlateDecode]/Length 428>>stream
8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0
b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup`
E1r!/,*0[*9.aFIR2&b-C#s<Xl5FH@[<=!#6V)uDBXnIr.F>oRZ7Dl%MLY\.?d>Mn
6%Q2oYfNRF$$+ON<+]RUJmC0I<jlL.oXisZ;SYU[/7#<&37rclQKqeJe#,UF7Rgb1
VNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j<etJICj7e7nPMb=O6S7UOH<
PO7r\I.Hu&e0d&E<.')fERr/l+*W,)q^D*ai5<uuLX.7g/>$XKrcYp0n+Xl_nU*O(
l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~>
endstream
endobj
240 0 obj
<</Intent 249 0 R/Name(Layer 1)/Type/OCG/Usage 250 0 R>>
endobj
249 0 obj
[/View/Design]
endobj
250 0 obj
<</CreatorInfo<</Creator(Adobe Illustrator 15.0)/Subtype/Artwork>>>>
endobj
245 0 obj
<</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 1.0/op false>>
endobj
244 0 obj
[/ICCBased 251 0 R]
endobj
251 0 obj
<</Filter/FlateDecode/Length 389757/N 4>>stream
HuTKtKKJI,t(݋4K%ҹH4J#Ғ(H
wqyy~3̙g<3Y9El
@ ]!O-@\+BVKK
:OX~WCaiHKL0qY	`5ck
X]x=8	XĿ׽>.f#aPn		D^{y8	dpH	st:Y׬cxc
IV?S!:_9[YbQP~+rA
ShHht^
'0߅™kYXY9Yqqpl'WzEE$%D>,^|t*K)%/`\ҫ:&D[7dplDa5|mb4,yy{e5
3⚅,t+whlA

	mk
xYUH&%Ȥ
qO'Mz3KT@v[NUnn^\o]abTrtlmE]e~U+jאZ:zaqi5};CS[\_ۆwCaQ1;>L$Lz}4:%8M7l̎Χ/}XT^]X>\Ym[n!ycskkƶʷ;v{pIs0Xݯ3s󝋒&$WWW*)!$$%!e$cHNOAKIMEqƕ;KLw@YX;ؚ8^+DspfKOTCPpJ%D=++O%$*8IZ\Z^UK_wL"dx]}>9=;s_G8/̹N!Gz[<=2|B}PQzlH0Wc(Een|Pds::5&89yFT"od䳔i/ZK^&gd:fgQl
kJХeJ*+篍kj5U[ZUh0|em6]B@`PpH?QM1Msψ*iϛ.Z[JYZ)X-]R޸Ѻپw?@?5 ǖ'vNg
W3gLC#u!MMMEvAms˔FVNA̝GLwA̬,llؿsݛnͽ+!B²"<b4$݇kRғedk*JY*/TS'<SV҈ԌЊЎԉЍЋЏ042?M4I~fs-,󡅰"+uMm]}CcSQ\RZsvGiH3GFFaGDƬč&$V''g$FLG˰4͂djikhCf%VNeAqYUڪG^/Ճ[Z{Vڱ:;`=c}nK
Fv(ރ> 'R&k?3?4+:6oT\ұڿ6VʝoF?LT;:>::>:;eqvx^sawݥʕ'_EFO\DKLtAnFF)F|ԭ6\`@z?m+F;LwiAhy͖)Mgw~_
@ZH_XA,"F)%/*9aZ:Q,\B^_AU񡒀2
*'[jo5[uR1uh`fm$1xJgBdrltlyyEe$feg-g#`dGbwj0TOC9; ܨݿxz6zx8IP=A!.aAxۑϊ}bG-ޒēx`G/Ԝq_O?0"۬խЮ˯ǰı²µŶȷ͸ӹۺ 0@RfzƏǦȾ*GcЀџҿ'LsٛFsM6+1MZ:{T?~ò~i~L}~cbA~Dad~ty~W~O>~\/~|~`Cx}%H}1X}%z}K}
{N}׋<_~7A~-ψ||Dz|+E|[s|z}^}wO@}-~ċ	{Gu{Dz{]Ĭ{f{Zx|[]|ϕM?}R<}Ǝz]YzHħz|z={LNw{\|=>|v|ېI8z/r
z;bz'sMzd6zɬqv{D[{0>|;|yyaIy?yazYvzݮ[{^=c{ФI{R*y߄yfUy`VyyuKzZi{<{z%zȎ~+~}͇}W0}3}HtЄ}Zk}=~zɇ}!~Єd*s}Y<9wpSwuuVrUW؈|;,뇔{RsѲ;:8q)PCV:4.8Ȅ2񡂡?UpVu9ScbփR.ՁNn	U388A/ͬδz6߆өn1T\e7݀tXT)$̯̕6;eCʷˆ	imw3SƀV7M
\lGNػځNāa5tNzlߴS<H6*<a|kz|CV|Ǎ||Ik|Ru}26'~2F-B*ojQ^@5zI`ٳ$ĝ"cߘ&Uij|PJˇv4vyVG.2{萾hS掼O[3Œ(Jьx&$Ԟs҉h
~2gK>-N}o2ن
N%է>w֣A}⇤\fXMݘ2,KԐ3g°[}
0e6M_1?1ӣǾI^I|B̯dܪwLe1$:rW]
1S{z|diL
g0\U{[G{!{	ޔ`{&yE{xbie{Jr|/c5}~
~:f#MKx+Ca|uI~.yW	ώәߎ%¡唘[w!^T`^H*-	5GȨ瘎=Π4rv_ҍRGf,ދ̋|,ƕ{Ҙtٕ^1Fő,;'<!_Yl~JJtS#]'FA4+;ۊLPf&ɔޝըs@夏]0E+:ևSS	𧠨jVPp,<XQ)XVl(Js&J!K{@BE.eWqQ䆓~37FHI^\ӡ+j&YbdML{#)FA;qT0_
^9IݤxֺƢYFh9ՅhX;Jln+jġ(m,ּJ(VaV/aؑ@Q~.8_]7]g|F)-/MH|P8%oFxC<RlA^QlzrJAUUd*N$i܏
#v
b7F*4ނ

pvix֖IoJ۱#
Whԉl"kxwVjGDz*ߜxW:ƩdP$j4WM[,]ʫ$W$I&N}7¨
s1@9TɎ.EzNDf*uwr 	*#,h؅"8=N
%=(pQu9sLӓ(&wھ?ERAHi.R~	Ԅ6:*tД3*۱x#m?r~32+wp6yXaTO#
U¼<_)I(}W2SX Uw
Mf_T)?kYYFK8u;J$þ*1T>,#h%T,Qۥ{[s:9󅼓&^!Փa@!"y
.Jl6mHju,bU6+shܸd-ʥ}wi-sun=0Ľi-_*)U_ˈb$na+;ϧT;ppA7C4.*Iߥa8Mm.ACi7\j|fiԫ)]ޭjʄU]3(íwhJch-4x7h׿*P0H됎L랇ڡuÂ,{Bz}8vggҲd[!XTZZ.vlAg
{;Sm`vؿ`~?ga.
3Ì{L^WYe4]L<pq޴k!G]lv:DeHXqEK4kHoS|XֽO7o**+2h`?k6ݤg,M{ST3`b5XE#*і}z#C//7}V;9T)?ވ2[ُ]n$~fЌ,dp,BAdrH]`uPVkaEVvYNU5/yfD.ݡ\ 1Qa#KE:|N[k=&[],1$ξB0Y(ߊq$]!{Ik5U3j=Or)<V
A8H:YjD!L_|OlxE{EY[9#Evx2Eas=[RQi*i66`ώ,+#,i1A2@ƪWmHXJNP+)̧+=l$zUkb]i[:<旰Ar)<+e.
%ӂBsWď[~}F.+}Wt= 
Ke&,^-va(0ttzSw0D6jtl.\lVդ)-g	[ѭ'x||DDߵvwi8ư=݋bY
TC7jKIX7оs{W|}&饷MRQrs%5ԯ1G*=VDM鶢l`JYKe\+kl=ּsr͌
_L\E܋ʮܤH)B"nĕ)Jۙ3gYi&M{&MʹIB+!%,O=Y>7ok!wI~Ira^=C#Zh`Wu}p)"z7ff&3$FJ8Ҷ5m
uR_,^VS&aR~PfLL_Dw*`\-9]qTI6)>u6	D`e͢/xqY%9ʜ;åOd\˾P&eRz;].R<oΡ]P{?:r̨\ʻb	Ҥ3|m s؟W9oZt]RnÅ\cW#+nI&gyAjsN06HiD'@J+a5V~cRI̫vwtUc[3+?F|l(iU^+O?Rs1Hqil$Wþh=(RE
1BvџnF/
BsGMY9>ܖ3ȗqI
ڣ5V_1ȣβiJiX0WVH[8g_/
n3`	38A.|f|ј0I6bv%& ;Y㿜҄#dD.).p'3J12K[Duɥ$s8I<RimJ8}f DJƀ຃ws!ʫrRX-\y^*̏Ld'雲9?)
"q^5/<4i
Q<
;/ԱJB"7t͚,mXdھ^;촞&s`Y"Y{>Ɗ.z^48e!R6}vcMiozo0'=~i,3:?-?oS,9w#ROa;	?pB
֞IOݟe#}ԯN$\l?],y,>&Рq]yh0AqK)ĝBFҍcH:-h-ǟcf)K9T127]qEjL<>h;|U
dpG
ƫ`&!8al`83>.qɂnA9
;`HBygKB*k㰗2fF=#OM eT?
mTm_OBۊV<ɆF('n3uG~Ȯ#7Њ9[١`Ns.P..콤'KnpF\?
B>-`NWOOWBlfxW^<x==Z/~4/.*g™Pʲ<*V-}&ٟwzWq=g?:;[-(Z6*<Ȉ`p?2eQyў>b-_x&*/(j_=߆󑊢zF`LdE:SNʔ@S 03|TOKokto}bFz$4-,.m'j*J|)J6BP^3ewܫpX.*,07xPڳ:2XOT21|"7=<J}|wl\}vGicQS]<Cjȹ*	@8-f݂={ñ(
]xѨn?ϑ]qOˏExyUc0tM]u3j o)(Co~2sЃlx֙
{L7z<"!s[Ha*{1l1,V&I*[v$#1/5Zp(3]8i2|(2| zD5 Ns֬viV`D0Û]R)L!'n" <v~x)~if
wnKܑQVB"Խp *+تED* (o	B'{pwH؆ʴ*JѪmA-nWjGEޯy~~?rI^WO@l)ƶWgiX"C#knA˻r)b!UڲIb=>0ߴy}ĸB)H[FsV+̯+Y(I(x&9JAI'tXmyG=X[8TK)2<TSRvxlȓGO|g/{>4/gRFȶ&A52uЯ*B<i0gr+OA,0-bug[\~-4:I>幃AuFǞѧuD)B,*?n`	'qQIzK֗4{B_g68#ʉ2.A$69!̒ub1&D3Qx">ɏnνxVG&TۨÓ)sxd-5KxߣD&1±jdGjJ|J{Z޲f6/vTp̄ub
PmBU#gBg˷)-*E
ar>>Ƶrn[ɭF-IByѸP=ĶKUC
wGD}"vN.p]]Q8uY{#qCv}sax_oyiNr(
d8aw2CQ}V8UWO\g\yk@dcZt9$u
p-1z(=f)
vě92 w	u煼ת#{P6+Dq3HIi%BCb!kc5&U	):X$܎[b2*@PkcӘdoTB_L1Uwi")=2#pI9,RO>T@>;bnDPuCfk^^\G~
 oLRcHqܮ=-8^5Ońy*9:-\g8:T<?*C;[yX+I;lRL߭$DvYTQ6DyVmfy%/sIsmXP1Lռȭvow)QBb_LVwupeėO*|+](uHװ4WU.{ 4\m.QwR~MAiRz+%BKz?'{k҉aa{H]sX}da~3_auQz	VM\ĵv5I0LM)DŽp1:5,&4%!$}ocޤA]R^xT◬M&/B:DwA24?cd&g]5b4a?iǐ  Ĉ.OA
6vfvsd(5yTH/P=(a;zUsbWxDa)Eʼ	$sgPJreY3w`cFo0|U[j5k.5J&eTor	È´}I	lpjC8c5J=g%Uo|L58E"
ِ[Ak]J͆VBM"{NrQihЦ@Y?6^߫ZWٯ]ذc؋hKSLj:>O
ɲ.ݰQ{5mm<ٷ?^v"}ъw9O&vX7km[	,70nΒ7|eP\I;<u^`u!$PB
ET9ٲFWcm$="G
}Ke6~֔G_MDԿs` g]vp-9\Nd{::gvH_3fC;}ƓPNpHdU9u;9$8w3r#AFiD1n-}teDH!5$,IQ:ȖR13<7j1[ЊTmWwzUx|վ+ք{W>p:ʤJRqY^`ǯ<~j!mr.B+'OyY+fN*żt
W$W\2M_c[gjj%WuU{{,_pWn%}PI^W|nˆ;c!pucʨN!k#)ksd5nŽ6Q{H10U
-"{⠇TZG R,ɇjࣶZw8j	ICF:b[	\+?
oA
n'a

Oj0`%|^/si_XǣLqiw]IέD"J!y!Զn0R	zWCcchūK_R
[*)!
OSouOշ܌WzeWCaϝL/QBo_k/cg&MV?֫5z !g"?wP͚IQ"PAdtE)q4jGsn{"}eUMrkzvi89C}XLB1W".ꕝ^Mt?WKLwDP]tU揊1rJոKVGM;phշm v>-wgFNcIP#qWI;NٶA)H~7i thl~~dzY
Cx2>*c&mb{9f1X*L	#>

V@g蒼]7n249=MK%
;,F\j1klZi؊ΐ.|Q9а$_.!;̿lE,ɥDi}D3^a`Y5g{J=mɳy3CM'jM-iЦmn5?	SJE+U~ ;q.tXd~~p*QeS%.Ћ"ưBsZ6-6[\d;^z4`;64藸ͱw;|+&AfLU3XTm)lF'l
VɺgcGObbɜ9;v\CL,>B?KGCe"z-@EH</s=/ᑍY{Pw\L1A|U{_"҉w+Gm
$#noxN+}M9MbΥ_@Tܲ'1 ,q$;!헁h1kbBo
\wJuY/|ϕd<wΤc~ώx¡#dg3~g‡ xT2ȵ6s3i75ƻZE\1\ɺWA' ײ M	}?;ʂ8|R0S#❣CۿUb0L7ֽ`hcEkT\m+	6&=B9)곌
\@^jkaƚPh<=T6K^MK͋=݊$Q-U&>ILp<5'҉$>8#gL2m	c1
cFw)P+rkC
qp/u8#!*g°Pa`vu@oH`"Ž:z_Q<,D>'ӅWP .`xW3|!6	
5El[",0	e[Oz0~lUO+&xkPc|u$k.?{Qp""kr6isVa=~@W_
.<7
2#h?c~m'rE_xs6aG+K14L^kUp^^_mS^dШ'>}5$:τ!E[bJx&n t(m;ZsF5uqX.ՂBqKP *l%{ٓ{'f';,TT,bhUq2Z3;}T9vwRR;GD
K*/@hUv$j!@
vyבm,W|-͢	^
~D_􆭍"ĉ#c禘*X/Ϝe>|XH;:)d9gƖ4aBQ4Ew,C
ۯBU#>SV$L-5gV	ϯ*B#}npþtdU$Db&$^\^&Z"/˺+-}%Z:}9AYu	rTlP0"~!	͚*@5K?߫Z-P=j>܈[O?)a5
?WUsy5^(ge${Cm>	"Gգ+$踿ϫ&
Xw8?g,'ō="/xNM)'EFqrf
CįQ9ZY$r!6m<YZС.<V^z{US=P
kX%3xfjn%^i𴵻s30qh$`kܯD&!M1W}훌1r=2NSdkb\ŀpdW}^'S^}+P0iC1R 0hDz[P&!v@B]P]V< SܒGLONgK]+&-A
2#sL4j&Dib&,AMSUD9y
v98jc7MI~(sL#}3(M^NiEKE8mi	uzI$Nr|}*+'4w{y%F $8@Nz^G.g-1Vfk)G]u6K"K1pΛP8r>)4
V9kJ$#FьX٥Cp[ģ)CS;rFP#ImKG<h/U-,COkOKYY;MH-t%^NξB7"
OajX_84V(N-{D)F0$!oJdv/_(ǀUH8Bc1fb5u&*ҽn2sG40:\=Y2߯	$bi8亵M$ҙ:utN)EhDhdj21|*TV˰T5ȮM7-^S84TehRҨj[UGU1K{Nh6vg֨+G?`
lݔ$Rq-.ަ2Se8pSՖk!XC\z00	nlhj<~I,KrL)IM9M_c+"vҜݤL$>ɺzj>>X9,ZL-jIbkȉ8˚?vtxPIO}_ay@:|Ve6ubd/e3<֭ztea'cLaM
lz&,f^_!?l2x2Xyń3D)\?ye~4O+9$

EVD<O0Vbj&mLB2Z܈b9U;n6L0	+oˇCrE.~>TSؓ7X?MM!ԼuOtPCbt;iްa@gW#@4c9.Doz2>M5i~u0qswQ9ǸLt삟Mz)>kɝI;io"U)]$YL
>$$T:gUo$UK,C`sCMAJMÄKC(g]ٮ9sUG0?L5QM%0Ol5&`Ƒ1,x'{k+mY}-Js#\d:i/NK\8HstQ#-ND).s*Zymnf\1l{(E=VGW9s:?wǟQZsC6A1ƃ6K@8OUY^`7j6@9?,yt4&}"T-
\Y&kVx녣391ٵqQ=beMq\`/nņ|2͌JkzDmͫIR4\~5NlօKɁZ]TC3l̅D3jSS)tWw$IX[wV
WTUw^PeUhWE^ؓ~WchssIg`wgs
(5mr]B`7JfAaA3ƓG?{O[?xj/Z*7exXz
Ά})C?`KcMՌ&)Y5J]q':]$؞]Yvx(ıH1eU>_0b?*񸨎b¤،D;Wxm]|N7U13*;.=>SÜj)CM>.eI1/QvН6Tkk+Ɯn\\FFV#Xde&~WE7"bju^I@j@bQWk8w_D^z
xZKA_`T}]
x}ЁM0S,rV+	KO&ƈ`;E{irf0F] w86ffm_8c3V<)r1p +hs|p!QP'Ղʛ2rӤej4Y
r,
r?4! Uq]f(*&umM+;1
-c8CjL=L1TDJ7>)BH*cHY}~xI,{7WjWާʇhg_YovMKiN>QRǧ}AQj^GsyJG"?txt,L>֍p_>Po$^<%}KDS4
*S<ܖyd;éIJ~JMn>ȸcI6uɖژ䩊i77_5W2'	9t^}/8%wd0k)ͦF9kih3ShPBULzs'0$Y/L3ol|fɪ\AW#siS-O^I+36xas @M
Ahm45V-'ѵ1S+~*%~k˝ʉl
*
lك=3_2~OgPs
Ccd[aے{<ХjA	{! ߲ۓ;O'9+wEHE&JV?fiӺ j05瀶bhWZxo=ƺ0zhK5mov(YOut;e=R*yMVn,$v:QڳE.yVl;svn,Wi.[@34SD_!MF>J柣ND @$Y~-CMu(+lBpБ^#$~2è
/@̣6 3nh
;۪.3Fq3\َvZnZ"/vNFNJ2V{#ΚVse_쑮Ta8C¢!Η>FL\M{5eH~7;F		AB?VY=۩Q i9J.sӿc%FVbdեiL`a)kD=W \ne>NX7Ƒ†2IYf-to7/~Uas[`W*v3_`~:kjR("E
*
e)DDIss,f_n6":hmh+]AqñQqSa9{~8|~bh6GZĠםN\h+(E30~kTMGβ1:zka'LG2>,gtX&@?e%
=@Ihs)HUOeX^m7R7~,,\jJԌfͬ8!*]JR:WR]MɚPZ;JN.8ɦ,[r*Α]MM"waX)Lbjd`>:?|:?u>^G$fa.
ʥ_S%ED8J=ĕK{6rzGG Ui<Kg"^ q
I6vPWy^,uc/5@:ǹ+[N+li{P#^yv,ñ-NѳH⺣<֡gxV</nb6󴳜Ρ +nhB˾PoT(W##ĉTwZU} w-vT-9O᭺HIz) z9R'dI5aZGS˟agW=.P1ٜ y?2X)r4VaGXBe`9Q1͚@85$W?D}z2*
pt+;Br\ܕ'>-vCNeʔL-ʌqKHr7I
d<BgNelB^փRγF2AqCR&t7߄{"D9u)Cw1t}?"'[7o̩~1{>Ru*ʖdClutqf2[l~{S4>J$.nQnlP#x])By`r+wLH?VD:|iUG~ժ+&+Rb gP>}WԹkQǖ]WSkqwZ
DQdVd24KGMvU35KJ~4&jwJ*y;X߉˔O@5hw)񘴕o-9E:_̂o&6#V(ѽS-te$פp}4%4mrnzhe4KX*KÃ29ʩ~'Ǥl|O5ÍB
;^j㛑Q`exH;J\*`l˴Khk
&tF|(8VǡܷR:ϳoG*UjSKknRglޅ-6&Nŗ7O4rGmO[du_TvY{̏Iy\aRKy&P7ݪJ)l"W5{K S_j0WSW;wixF1^lО伴^'1b%OAXhq)L7j}=9PX=n`ɗKX#CùA
*7{ jWܴTByufכd=Af]F=_u*`q+_i݋\^`BaE|S&%Za8+QgQ[IK-jIKr2Tcju=AʧQ"7{ٮם*X|,Yzѽ}ƈf:jCo[>]x^hlhNrϳEDkcCǪ
ת9c	Ht<)}z!hE~DBӳ2S͆i{;ouIp??砃46ٺ^"1R<-65sjpCSjqi6dzھİ紈41.$5EG9:=ob쾄v#[xﯦAF+T(C@RQF772I$^a$Eq>.AEbiO0]ТK5ΫPÛG
ZdJ*$d^}E*֤>?Ƅ$dO	_tl%$^7[KSECqz"$]*B]}W
zT[Rk"n]EUYvFUW\B6-RB^Me2B4<ZRVjVy~O
W>/wͺh4Ek5˖<1U[tD>Q!.kR涧7uJc>c
l/i^3;iڐ0sĀZnS
qW7Np:([568ViAFޜ~h9Pldüj2dO
+61--1Ewv	=JCHW34܏&x8,&#Rc3Dvz6RSyu_N/nmكvT֥Y˼?RFװKzn9Q4gC^5l`P\ܲG&ޫ`
9PҞٲXr6
V4,{a؄\tcY`]lǿԾar鴯؏=b!&Yb

^[\aYt$w	
[R)i[{$7f"oXp
zBz'hO|Ō4ǐ|-j
:}̴a%Tv5Y9QK d0?$ćH|#uD3phrd@,@XmVKY@ou([8#!OM~.7SoJn%<IdZ=1D3!P#4(|:]SYd_kGRh+OtB%/e䱖&]hr5slorQ"F,bՓ*2~:ʼi[t˦~M
U6DUe"udPO:]x+GB]q:ʥ':-ML3\F$7K3C*s2zFs'Ô̼KsӚwER	!`%aTHvRWSPƅT}FVArB[SS &}p`	~_1{,yo{30[bK:w3Mne6sz/0<x&3nj@_d
KBٓ! tr!6<rƕKjT;ҽ.Z.,68MUl{D6v@)tmpy_.>OG"
Ü3N|/'O-R_1Vh&׺NPz8de
勊ZTH;XQ6}+'h_|ȋCcuHjBA,NOS{3	L`]1> A
rxӴ*E^.ؐ`Q5v{`=W6뼟\9avGOXc&
v1w~0W:ʎ~f:
0/˵%mKRKAcR%	P#CSߥfmD5oEx17B0<&Yd8"1wܡ5 TaaJ3p57A>+yIMcu
Zd?Bk1x-rsV9sH6p]DGgO|y5S$aE`$Ls
[Ym
~u8p`6*Iߕ`S88sn9O3nXOE/7f^lbN[PBFO.9Z_.5>F	S̉R'}ΪѬ`_dX|{dHXԾ3QlZe7PRqشO5OkZrx5u`aǂ:*`T),
DPQʮdߓJRk=H+
*#u)h) )B6s9߹瞏HZGzGT"93hDͺsr|b4y	$TK	"$I~$v(B#].qi?CN~ޱ|ܷLcOnT~vxj̦5<.f\K<2p:CpSy,66>|zC
E
T)f/:X1}J+>_~Q;^ㆪvs&۸>.k7yZS:˩㜍rݖۜaKa!l.g57Kv0!;ڗfe%]"XTJ3aժlwVj=v姠αe=bI/gH&:g,(y	27>aba88fVVqɌT0NɉB`(_"fo!t}Wg_0}HX9,Qx=~Jٹx>ӱe9M2mFS)Vk-eZFF٥btg0O?Dǐ%7eyښ6WSCyeUS}l`a8i	g"1лJ"|PKڝc,$+&PvꖴGBoj_t4Ivqf熚(eC!b׼^SbYi1¨;2W`/7uh?4
!z@#(T6^!R	S#>E/Sq9z_ /G%ӈ0C9[ۼ@(٩P,}XTOkpQȫUG6
x2e,>
-?ϭQެYz/T5FL^`tީ3\#̬D:,vw[mDW)TBZ`0Ֆ`3tBQ˟kks41y	`\޸cV#z`XHhwA0چFTyqӵܫ*F˪%*/>9
gS'"b'zL=N)cs*bR)W<#S	癛)K
&L\9WtW!Y17i*%wJ_閥nWJ!p-0T`:K6B+SzlL,~J#ZLHBEe߈Eq1
ڸTD}bB;*OTCnՍl$OYQ0mz7o9NŻ|hDV[Ve֩b7YZÖHl~I)ܻJ5oOݑ%(,hZGҼmRd!/NEWutV57z;jjs^^lDǾ0-a_aL؁w44簍b^ppi&nX	uƻ-݂
-cY4_g	?jGIfH%J҂[%ϩC6OzvWzoZtA$?z;ؼFT2/+0@@S<@>0bSuqw;j4S'/4sEթ(P[V^5ƊHkg/ۄw0*֭ ajyB5TCJ(_F4!m,RN
?S9
:״OfOV"յڇ1,V)S@._
#Q`K|ͨ%cj/&\:
[Ft^Z"q٤Jm뙊jMarח`VCg
w"~><
8i}XT8dzQVY<<J=Eۏ7G8v6Z:%hBò94^ԥm!1OD>p%HG/Û`rq;Nm~Ms\/Zh:(MXа^F.꜋.Ys}5`a((X0T+JS4&~|iB!!
!)$)ʰWFY]E븎3x,˽}|dc
|i-0Ws
Q_GpRjy0׿tjT̎ԍD1څڍ›N:ka?7ek_%]a;זF=9-b=&Mm0-vD'^j+/5(er^+EL
F1$1KWE|fOFMKm::1`ڥfXЩM*i9
l?+Lw?-Nx͈wɳ\C0瑃f	sM;iđ`$O0z*RٹB9@"k5v~.lB?ug]ed8JAj͹um.DO^^v:y;ske+,L¶vŝҼخd_5Z;q#k> MU\J{l*͟ґ3Doy"UDcu#H)BPit/	v`_Sʝ{e5mpPpy=-2[m+v6*.WۿSǔ]
^DMk,2.#ɲ\!{^I4Ԉ.~çlDcBU\b"c
jvJG|H`_2rHѥ
tHHBaG	:Bf{'9
[jaЧe
&hz6Fdy?>gۑx&l$^:^nx-'-]O 5@S Uڏy]Tu _,zWPT|BJ,ɕ}`8ߴy?p7gˢu\JO(_vOUue4+Qbi?A.jCxyRJ駥Pt㸲rTfdd$ֺFR>PaL'v2M*׵T]`W*cD*hAe#"ɆKO9JKL2J(KgK3jԉfZnL5oM(_>FOӹGi}<@w#Ndhoo4Y̾Fٸ2YAz$W֜5Copli\32l;a<;S?B><AarL>zprjsm1tZc̥{s/J{c*#3ހfϡneh->Bc9SJ"չO8'8ހ `yHϤu-*`	x[c')Oy\x!QS9q<ocWSR^[H{eU!.$,](1
oe*
p}%
K"G*
yE%S\#V9ۦ24=ZHW}dUU$U>*;$;d'=NY,|ܶ34qT=ka%hs䬺UX7Fl[o1apuxf9QGk4;e
˸7荇5xB:yZdͫ,`2?_a[0~9iYFs3g	Ë9u<,yx87 1Ja,O@/gO㔛94 |.]16'^@1'p:XtwL,jVQv@wl{έ̱\?R^UV\GI+9D03oyd[R<"""
.2}"!<4tH~(-r25DH@l"K濣,/S}"+~wF}V
dRz,:w&?C~FqJ}JݢJirjzEgU#p]ZF%+[PjewVjlW7wR/*C%%jGx@EFH)&0_Օ|Xu
DRNXA\0JSH307͛73CWc+U#r#aQOL4Eљ?s~{sIy?y>ҒLָKd-ޣJ1v*fH
6hz+~BO:IQqZUՍP[UD#BM	>$	z|?^!J0W8N	WzXfщ@'h<
%sdR۔e[$z,Z2H5[&Ht	L
UO췯<uɎrEᾀ{i,8+ןwM2O\7I8il2ewkv"9kr6±U\R*qoGCxxy;:jYE)aΰ!Xidj
q(8S=l(P9Iue&k)W1=kZb;8zBC4ڕav?suUuP\Vf>+52j&P6uRɮ!
a+rk!o4	`ܗP)f%VQTF(Z]s,TR|O)O?ho# ]6yл)OU,F٠E})gsٴGyҘp/kw~˖I'Y;TdgYU'I8@F*	8$I+A2((+y8OϋWȗE
{բbW"@}@C׌teYgvֈHofE`ea<oV	FCk2* ]v%녦Ly|KJ3PnW(<yiBVOhP|q'9["<c-p!pw5ϔr)􁢮^.,8Loқr7ȶǫ.@Pp"XSI3IkTGmWVbu6Gބ`]OZQ&'lTR&"N!vG{%^}T1v:Ȉ\(IWf*ڮʃu*lgw\Wd?'~|S6|ɖ)ݹE< K7b%J\*\D)e
2G2ћBjx$Z-aV#s/h"K6WZ,ɳL90~G"~45"[K4hqɕFa1U_KĪ)P
?Q΢9ޒ"zܮi$5I0]xoܬUJ&]:QS{%Kz<~m댋/7ƣi_y
I<Gdk~xkے1e'w7۲Uyʪ\PxVnL"N6tĦ>gbN_4!/e%O;mhtWv6[iyFy4ʔatV]
au
#QYm3rM/q{~tjD
7fiɷ
 .=[n`4qShBrx_5wԐ%nQ~x'G[	`+qb]Q2Ըi=UGn~ڋJ(AݪdE7Kz
+M]!}jnh-Cզ_魺a٭Dfrj6$-4nUZF)Zpux'@]U/ٳۿ3Ug`iU}ڰULWu+SU[;uXJPvOŀ{$KF,qQruH.}imfZh~atMBb0*iWC䶧jZmn[nKfic+.&oV.&ʭ{5_s9dmIA. *s5:	1Ů
m!|fl'6#N
Z>\oMkCZ8)*bEE@(27{I"	$!0a=+vUZŁ`-xEJUǺ
~~7<NzQT!wB,C)kE++#6-)p*㪝A Aocc~\_xb5ӼzgQu}޵zGeX~	>TSsV6i1=2J眆Jh@ Uu;7!0
߽\醮%-;=.e/T7D$v{.ʫ|ZѮmcDֲ+-Cu_{>1H1]"D^nR
ٺ:E3[h97TJOW+3vœLimc
@6'[c`Ǧ8v!bR{1_ӵuoPE2\@;4"mOm{ߺE1dA}C=WB}[3']\PJG5VmnYGXyahd'J[U~	vWۅWo]WnGnR9H7ѨAu1vZm]lUrTVA
sj6lhm,My4A*0vJR? Ĵ>2C!*#q0MJ!:ŏCR|dFa?2݂ch3dBzSIt?%LmF[AxYGҏ0m;GY1űh%[sጒ@9
q_8G>rWn)jodEzC.qJviN&If8bg

v|sd%:uTf&L0~p.(RU
;_)w%$/t#
~#u`u[w.qsY_-*'̳ɩk/)2*
i9$7fUzflc9}],툏WYCIkS-ty7>T!<v`tFWV")'U!<^DV"_W퇖6!{9JJji_U(홽c4*j>26Kݲ	m&c<kQJln'IyT>ӣh'..+upC6&@j5tdP0=I˂Ė
</BིY%V(q/ܦ,Ǘ	9(B0jtI4	S:qԙ1Kh^ChhCF( ||y0%o:TABQyPI\;hVʓ2J
ĥ[Qr_k`9h "?7<18~Щ
t]Z*7֡^%Anj#7L{Lu77]ČY	LL;
i\WkISy!KC:31hZPf:߄0C>C{޶$tR:(ϭuOR4$=jluq1?פ9Si|cqF!_z^SK}`d%DT	wV>;<'V=(5H%jWMV#9YD2֓p~~J}D]gNSsjJmn->,vg&SLl#>^i8ʞ%4'RJDhRN0hBA0(r0K+aMY|"EGE_R^v4/?m[˨yN`K/5[71[Gؒ' '铯RGhqꭁ]>iIX
5'\GB	ćd^ux+[^%e	֪pxE
 6%!Itި@Ҿ#%:*h$r7שׁ55׈Ց'I+6*ЮwȰ%U#zD+Jt BaUؕ	6}uOr7dPCu}FEua7RV"KST20EN{^lkƕ$vW(,F7bˢÞOy<"_).kh[n 9W?gڈ7yș*ӼuA@ OpIRrP($e[i<H/\t/GinQa@qIa{Yʒ]e?D98ߙydx,8?Pe1NWwAiN,B=%PK~҈G!OʽR=e"!]::BI\MJ1jGK)b'xL"W?D\GԝC{AA
?u#UUJǹ	H{F[5h[N6){((%>VYR
n#(aFq&mq3%\g?%ӆM5XD3b$ʁW ƿ5&͔D4®KcᏊ.
1Zo
^`~¿`6z	qaXǰ)Ӽ܄'84n"Db.yC<Kd},{*h
ڸh>wMv^c8Iƻ(~j?
eoyl/Dl5Żרpy1ܣܵ^004{.%CA22dWuQ>okL<5.ſȠiffh7S-|^TjX[wCY*sG^1Ve֗+˃L3
/2y{+.;CtJ }
->٫y6q<<bs
bk*ĉ_VTm}D51oUQu*nҹDU4|>WxA_PZ?	Q	y1>yK\.!OqM
0Cl];Sk)=RZ@[ɷ5JBeǐ$Ni"0-úR4H~9.☫|Dϸah-)r~"eoMK%4	_7"‘e
QD~0T.>"x*O>酧.Ey+HVy55RWsEk*PxEGB;(JX(8hiqmh^0`}_APWDLZ‹]<4zG֦`oyZR|u^gCF#nr)Va5ƪw9njyIt
xI1bIy>}-AگOShKFx6xqqQ
3SU\ka椚̩Di~?{>J3mtߐZt]YNju]ɒQYlZZsNѴѷW>Sݥ0Bj+7q҄fU7m	:8^;#eտ+*,_CY3MSU*LX.jQȖg_IWJ5a"9R'C\y׳qH)VU-Z.\+Ѥ/aen/|F[?SPkr"
^Y>VH9&yaIxQ<zU1\
ٽl*7}hu;Twfa^cnYS
q;)oZuG!uTUOrlk;HF-x/,u	sm>fd}+]
U.o.=q-y][viRgk*`/pLBu+A@[)&PYQ?im/K,Y*gu(i2`؀V"fJSs=RU@7+>dْsmY)w=U?ο3Dqjv8<!zg)b^[$zRYjT)Ԭ1c?M2q=@?ܣ5ew?SIfqD7k\L24A<D1` (T@@+7{dI؁	3*8:@-mq*8r><uݹ\idXmmJJ"Ujb'm_z$b"uObMq_'isͼ?M#mp_=~m=İ+ȡ:L;48lmb3埒-m$Y|Hn]ckk{>3׽}1r@vy:{Eͩԡ.޸,珈~CH{ksv_l毁@"lOR."0Fl]]C˧Mfi nq˶Q{56ef
el[IuY_(i&;to
5kZ/
jjp~Ch⨿䦿iRs!G-֠5
&wa7WAƫXUr8+}E)oVӃIÌ}qZlh<gw
A?=$6-ޡ|,)!<*ǘ*z!8߀ϸuPpD|Ŝe=sm4'ҢؽYaPOZ(vj?VGgxI=V-̹uMCJH_-C]B~2A\8*E8PTΔTo
9/whaߣby\'F,Ռo%wU/ժnM*T Ƌ{5NJԢT9L;y_fXD\uַA:x")V%V/*]1#)ԋ@X"SVӅ4u.f?Uչk%Nj;c~?]Pۺ˄WҌ=V듍1
E	ֻqd{q׉;
NYHdfttc#&vPtQjd1o
­R)ʽ@}<7	&8wyybH04͂@>o`
~M<a9(nc9̼4<o/E1:ɕ7e.{ՇPi	WEYxޝr
EJ7T|4'r41 ns#?Cśhk6/ϻ7n
HITc6߱=zz!?z_)c)ueT}nS3&iq4rEUYX\K88IX`}7yIi
SiGr38Eiօ$f
l+n.*d}0Qe:FSS퍆֯SȺ8~%;[ژl0~{^KbV+T
sIx)oeqra5),kxUQ"YNפܾWu8GQd!H92'31cC\!Q-;U9
dZo8CNT1+hڟl-?63z,=]Aw7!z6*HH*[|C_@ms2Ur]^9n0"PuTt$#:H@бjyb~=噛*kuUQm9]'pudSۖHgi۬6r->`Oi#T2"-!NSn\ z$SC%Q%;OzcT)!M.wf.Po1U=Bl1F#F0HD\u̞rڜ*ujQO5u8E$7:"І(UuANgulWYE*Z"cT\kTxlx)$<hT',ʷ
y={V?$N)DPVl]:|d̏"w1*=3*gB'|'#sBFS^PR8?
$	m:@l(蕉9Ea,_܎iǀ/O	I4aS8!%UJ8C(&2J:;{Mጫ~JdmrFW	jgY?;s8ҀZ6\FqD,H	Y'{$a@Qk^жrh"j}+mjysәMD]_CJQw)/ʹ5״2s7v}7
TVS6~GoLFYHKmkv~U.+jpo8Ɖ$5)\R(gHm}w5jN)
+pvO[nHj͌%=h4^"lq:i%S,P=ƋGT	BULR8LW$GxLcLS},?E;8QE$?\.e!&KKJG7|_Ҟl8!>8(YBIY`[}.BbT$=U8OŧyP-x$]0_
j(sOH|/=wKR`ptl>f*ӡuU<=Ts(&zpKA?sLo`N0Mq+~*m-~F7^5惬H]${|-Ҷ9Y&=X'Vu+^ϖEm
Y/0X cAdPc_X
VRx6b|C6^FeC]o-F?f7Q3V>͝yFsy]ݯMF͊k^NնI#FZ.7ƆQfeϫCJn;AjBJFw
mԗ6t(I5beElXQ͌i,)6QS 1zJezVBf
۹ʹ/	HQ89SnE%o-4NJ``,)~utyQN]vحp+e"xN6y*,7$'x\CQL[8.d@}CɏE)1D?@晹b$?7
	YMN|
_Td'wa}0Z<9|3閗3~o=Y>l0Wb=P1jmE XR[louv:.C=;.a.BřS[nWJ3ǟN1='\Xr8۲:KXj6e	g΀ap%z"K1.c1ɇzɭGTRiVBe-)K@iͬ!u@_`&2qup%P
SЧ|NWP !o-t_nyV|ؤ賐e`HʏE=>\Tǀ|cҎkIST!%Gu,%[IR'+#T}m3\/df)`n2#\M(CQd6flqGv첵).Z&wITe{JQܕQE\m`p`Ҵ\z[v7OVo9ݜQ}$SSFMWdnyuя:	*o[3 O	FRJ0ոl+L+&oE+d-
@?^fEkoo\fyJ8zΰXmi-Nw}OYpz&@>gݪHc.]7Mz#fe"g\a@\qyºJc\3ܔr'WQVE
D|PLs\h_h#9Z-TdL>˼!WS/bniA3.1Fx@Ǡ3UNN^nPOZdt<jGLys=>vWO&-8ךshveSȉ`wPU_cař=շ}m`<<$+UV66do88{ηzkG}ڻ<<7\jvg!5M!w&GmpfSgO3x?
wZsLRq/~lK]QV:om<Q'R]AMXyu^ȩ$}! 9LHaH8hʡrTtD-*fY]]wuu[bgg޼ߛ"ȹ I7HR7HBHudt
*Ჲ=eJtj|	#TI/W?{ΝO^'`v'$^E=7ITF2˵7-^'Z"[x;[U7,QyWrr9E6cy'I gIRm2ZQ
{0K,^H/>>G@l`T=FZnZH	ѳ$m¯鵩KA3D;w7ŏw^J<`i$M_x8wU-,/h!pbP1|*k_U;N45j<?>X_:]$
%ͫX+éMiwzz{7`fOE5FohX}fL}k%Jq_b_A54WK'h?:lTHmm.	m&"X7rV7l̨b]r+OpK[{0EuwrfӵFajCCPktMݻVw[FR(Y-VE8	P?)p>͛5	#TtF%3	qhk
;`LVOpZۓ.
j&\C<GPJqzKmd
A>ʡ	<*g!r)J;ȁ&xK0N\B&Գ$bԍ7fpt(0H23ӲG1d?ź
bVֆ|\[w+tjj?b7hwJCmm#b.^VBDRb8E]4J
7LGc.Xd/a&ڎ@顢zQuֈ4Tqi˽èb˕ 43~,ymoθ[0 
l}	TCuLBt2ZW>Eh@+[Řy0=
sU"r];û](̏{e E=ma^2'FKv~.Оm0Oj(esߺ
Pk*!3IBЦs4{^|{6k\*
}XYǠD=A%$hǹWǂORV
UBꯪr+Ca6 Kԣe :Zڿu6&?W&k).]%],lb7MX][H"}WL)RIrfr?AƁY&I~_IB${XlZXE&|w#؆`_vߢfu3fm89?9
̟NՎ`jz1*.@爎܋`oْJ_+-4α6@/DWEjE}HRDl;Y+z/1Dѓ(z)oι&;.4aZ#gsbZ+XWi;<~n"(	M'b6!GlP<^\nM8--aG+dyXP^s:0q
\p3bWu.,R&rm#<HeĸvQl.ˍJ>қs)lej(^ ,=/FV6fj;ex%Dk%!FW@ao2QTvs
5h0B{UHiGCOzL'pbIq+'_1Lv
QA%$[H~}{1fKٲ:HmWS
ëd}2w7j< O7i2G;SWݒ!@YsZ~*PƐ6xQܡ/9i7cGHVf3R>K2jZxH"Z")vHD}
@}	YJ64T(P_(*C]miSJqOZgA(ny8}wν37;?߇*x"D6HaeZ
5K	e
tE=H\ƒW8
72ym]Ly	1N<8͍@:>>6pӹ<AМ*쵮5M
N5gܿ]7cD!\O6N(bHֲrt1guN'wߢeGrubJ1a#gi|Gc"
'x&YH;4T1}Ϯ;cV*ܲwf|H2;Rl{K*GZPg׸z*ۿ?ʗ
ד:N9uL7o|jBjEVQR!Ū;~;ZZxٲ
(񆜦qE蠟V7:bg3h\yg.:O07Ңb4=NHdto{<WZgHNRRZ\sW*Zx ƻQͮl<ITs|X)c?p\B Kue|0|/ahB|樕sEGMsMd?*G,HRg[)|3CQ{0bIט%9*XRMU)+^P,py*~uRHw,r~L;_vN"ۿ]//S{̑Ͷ^0X
74㊈#ޒ{Y<mg$5`Vs-*lۻgri˕[LX#DEhgq!N-_c	YPa
!w|Em"PDOUHSr5a+[
m
Wh*¥{I/1YwûJy׸jk@p[z3*ReRXwq30u%BAŒ%\NC)W'5꡵
&F+U,d5gR
"JrVDBSDO]V[EסdyVӃ1,+Iev"`WrwKaG|`%+TVRCF{Ys*Z5߬Res Q3
jQA4Ӌ<>$.7$C$pA)hJewT*FmKg-lm*{{v\ܲsJa>3_*ݑہ>V5|WG_>RR_YL!RFjz	S5fځO2< `}I\:XiZkRH*4[(xX$u|I9̺TkVzl_׼gC%*wXRnY)N.9+wZ[E9ľWJ%wp`Nj[.b|JOsdW,R~#*	ĽyFdwCp*L(8OelL˞)AvfFʹ.Knd~A򥾺]Di(i]YʯJߟ?>w[侾7KK6w"!eDp5V*
3VEa{:KoEDcɾJ#oOU44lTjFk,>{S?ýSk>Su=|j}T
SU.nk.mcŮ)RxbT<TV*yÙ<+`RC;S^0-itp<ȗ2IZ_0ȡVVKHWol9=fdjb%}DCy{sI*{ZL1r`n}+D_*Uz3}i779_kjxL+u	;FxL.mmQ`sKzK#>&ޗxiBV^\s3_XX_رC+ҭj|S	kϽ|j|[X
ΆBL.?\DCqߢ7nO(M&JOiݖw0IJLM,NCOYPoQRSTUVX
Y#Z:[Q\f]x^_`abcdfgh#i3jBkRl^mgnqozpqrstuvwxyz{|}~ˀɁǂф{pdXL@3&֜ȝ|jWE3 תū}kYG6$ڷȸ~kYG5"ŵƣǑ~lYD.оѧҐyaI1ڲۘ}bG,{W3qHvU3sIa)\Z,

 !"#$%&'()*+,-./0123456789:;~<|=|>|?}@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`acdeefghijklmnopqrstuvwxyz{|z}o~dXMA5)ۈʉq`N=,
ٖɗmZH6%ؤʥwog`ZTOLIFEDEFHJNRW]cjr{ĄŊƐǖȝɥʭ˶̿*7DQ^kyކߔ ,8CNYcjnoldVD/h	2
Rer
xzzzyuph^RE7)4=@?:4 ,!#"#$$%&'()*+,-./|0p1d2Y3M4A566+7!89::;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{||}v~oiaZQH>5+!؎͏Ðxpjc^YURPOOPRUY_fnx̰߱	 8Ql»!Ceª9^ɂʦ2TtҔӲ6Lat݇ޘߧoX\[VL=*b/fMq	T	

p_L7!	}tfUA,  !"#$%z&d'N(9)%**+,-./01y2g3U4D526"7889:;<=>?@}AoBbCUDIE<F0G#HIIJKLMNOPQRSTzUmV_WQXCY5Z&[\	\]^_`abcdxeffTgBh0ijjklmnopqlrVs@t)uuvwxyz{n|V}>~%
ہ‚rW; ϊ}bG-ޒēx`G/Ԝq_O?0"۬խЮ˯ǰı²µŶȷ͸ӹۺ 0@RfzƏǦȾ*GcЀџҿ'LsٛFsM6+1MZ:{OX͙~ʹ~y~eL~j~Qc=9~|4~cl@~]̳~nf~C~لOiZ/gP8v}6q}0}>ϲ:}i^},~׉_LpK-~~,*~&E()D9vyowy=TS3wI!D)J%OBvwN<i_ΝDgA]3w^|<~]
bʀ}SW?CN<-Y4 BYpzS)j"{%>64;>FVWm
S^Di*bPkpة?%"1#!ϼK`L<n-e2*+)	X䥂C@v2lQ?(=0q
MzǃIz7MEY;Y@K (-\U&>rI^2IMe;Ya"VN,S;o_%sD;fƎ.R?l;0Dq>8zDKG)3o+&<4@n͗0EO94#ҐnW9b_7}B2yːv/ąJH삻Ȧp$ȫވy;Æǘfo虔F¨LsI,KhW2!AjHE^τ _wdlXggΩr!jU)[%B\DCfp
<_\?k,.wȲirJRݐ=>0+cvZ{HllLVAc۠^{6oCҏSمbȏ:sz
7jP@Q;[wg|z30Uq`!P-~|X3+z2lIђ:_<aXS5\}E^G
XJ4^Ƭw/I!5
bn#FO`.ܙ-J\!gZ0
)ݥq AßOkV^Bf8KĈza>p-FOJ*Yr(".O'qäfrCRJ'dc~h!€?`}WzBd;hѲGϲmTSAij9< 
ߨ%@`8xLTqė=,Mk
$hJdx_r̰gʱhtG,KytomVK0X?R<J%mq<UG]IX't9E
$Vtܛ8i(GT+tԃ]6kN*d$m[w_L-hk,Ȭ&º^>=Џ]ٛa`sʠ7g&Grŀ?>r&z`b>&z%sxbw&{~څ]"WR%c"zDzA rs!֝=jcf]rmANJl$ے#ؑ>wTfGFF699<׵.'SZ*˺#-Jl.ZZx%m*|
o	2ӝ_TWK4eRsu33'jRFBWl|
Fgml0L1,y+Hu2f;[T0BE{:qntoT]okI,
LgV_R:Kϋ0dP?=	vE̷փ(M4m\Tk׉o,H=Zw/EI-LQ[8F/g֖'$?[u~fghXjݚ-	VImKՀ,%ibQ*e97WKMYiHtXTBUDw-49#iԗ/r]hGވ/

lD2h‘%TTT*Fdw">GY?"[f
r5ʊ4`TAo4H5rWS8Xy;$Yr'q vUPV&4m/5LJE:S7Hvy.. kPXAl`
,e:E$@BKr.!{A$A,CY[EA;|TJkU>41aƜdcT.UsR&BchR)
 Pd;ʟHbl?1;_:i^mMh9Ӝ+,x+(‡j3=P6u>a}&b(0=.À<2&m%u9_~zL!S`(6͟>թVlW䨸m5ypg!2<	PR%wC>ubvbF.0UK$K;؂P,!rA5%\v"
[2gwdxJ:_'Eښ_+^Cژ I!	v,V72UJLNITUKɎIy/R+=+(֨v6!M	@PB%R--3|4-)#ͯw.ܘ<;b#;*>$eG
>3"و~AZ$xOUxf𜓜x;٥QhX(Zx=`dš
8b†id, ϐ!enZ
b/޲І2P0~+1baktT	?g)˧9С`.ޓ`>'4\DRdPaxԗ?i|9,tĴq]"m-9OD'Ex>#Bz6Nk%tm6BDzVQGq,2O:y{iHcy[]vaZT5 ȨR345N@qG!fYXr{3^M7HX1ey87ҙ;NP9tn/D=}*I:2s̋%G{<IedXw395Iot=ޓ*̸'(#^s{\dYdSj	V΢T>7abTBm6ۺ4JZmI׶Fהz\FD*rEyք̣V-8ˉi#7XmZLW:2
$Iⷱd`U+z38"}Y\E^\Qܵ)<&uZ!FM)V"ڟ}&à/
ď5O546PW눤0fGlEbdc
'ƪrӬ[{K("M/y%0=zFBx}{w6{Y50%,40R}ԓvTp>K@fR$7HU(	/10f<,1BS>٨RI3#&&pa5j19#yTH9cI[էjU̟~?+7NzM`k|-kqJ}(Ҙ2SaӼGi ; b:`uǤayU}T	2Ftm̔%OpuDU0m~L-_:qWg0~huw-]NVrP
=<]x;Y1iw@8,n\(zqb!$zB&5dn61Q& &
CuЎy#c%$7]w'z\0Lk{8<Oz	o%4P˗
9hz͊$LmxEFGO$Dcn:0td#*vT2.q06vgAԡn3l'H:<@I˞8!mRSs^UgfBu2L> ;fGSFx¬P~Km%t3MccM(bCB$
_ J,@՜ %ӸZ;.6B)PT~~:_tHNITScΤ5_3bO6-[o7$cn:zNqnE2~7\NT'"[fTT^2F&+c5r~ԕ(jl48mWDC]X#<n_	T 45	C0
V~m&AGA7w@w;Q8Q
?d9#1yʕq_eS]y|d*&6Q30J(WG>HN vAg+[o:y1ډGmUV'pJ{"M@3X|*oƙޞ%sfJ<ߔ[-0R'Gi++qNPF\&XT~ykPx>–~u2LX'P
MOW	rة
Z?qU\+w>-q}y/sRQQJ@737Ka[t̷E8X,Tp!PVK$`Κ׵bu~*LlBz-<R&,+?AP]oLKِ'y
Y?
~t-"Xnv&?VAG+7WhKDYZ%4YFg[ C_M6ЅLJ!)9!6-l?@W?t`k;p}
P>f{i8DbMp/ŲF_<`w[Uq.Y!'i7L' Rz$v]c-ީ%HY~ٕ鞀ws{)Wa˹ԑ`{[zϡZ&z
-U@uBP.8jzB{GtϤ1ޕq#
^o2N*`DZm錞c@QY@Oy`ŕ^ )H??s	%J@f-H%{#}řPKn@u5w:=YX9(5#p9#Av(~-"]Qb'䠡ya
'£	+vO@%7_*Z-r*~z Ց4!wBpG-q.a+c"wmqk=WfB
+k^0>npu5㞃= m]0o-1:ǒ~%ui;pVO/a3;0oKܼL6Ed@ZU%{
^ͰyOVNHLmu?uMBEQ1\IُOui@L7Nk\dd[i|lRܰ3"rW^ 
19~(VZQjsfb5~Nl,$LAE \Yv3k"*Ie.gj4uDk"*T~~g^~<|1cPx7kF84K(/AI\%HG;'6`kK
ZJAFqKq$5GT#.a<C]szO9@yQђ-DRPGD{no^7PvUvT_F"Te
^9^9(Zi*J|1"].g:ETIFzN%T|k&JlI3ʌ+r^qfSNMXe$v{ꢫ?IB--Oi0iXo
葚T\.%kR&-?(m=?~3Jncu/mS<Ð,LeH:i_+MSVak@\Ѓ*+wqDS!he
49"(hd}+ɗ7)T	bǪԪhm`Yջs<-,@͋SCgZwN	CUcW-JGm\QA]Q]h&D0Zvnw%0zMTXI:l<7a`	5P`ݰDhk?(b	?`Fgűy=4EJ0	GvQO4Wd SAnMC
ұ|`7ø_vYIoRyYqE,D;&Q\BxWrvt[\"]Uˋ
w髐<|Mc+
Z9(WZʳͰft~X)Ui?m<P	;G-_k&ڞI&ML<::͹7KƒKXѪW[5P7WttbE6ռz~0iWűہi4
[$kil$VRc4ӫGk~ʿYQ:ٮHbFGX~Nu.kfc`m
f4걳qVP~:U#/bE7K*W0]q=$ܭ XQM52ymBS<lU
ZҸLeD׊=BkLBRY^#zA%ڥ`r^'UIoFg>;1p't.t-SSUn;QY(sў*M8=
BHZ#
GcDS{d',Utl=,}*vcr+](_1rØ@?A[KDlv'”o>=ԏ[?Qôn!ܘeoiB]u3PzP'ߧ%44Qw 	L7@?;gSVjgohop7syR\7V%xL|
3n|2Q|-GotuV֘Gk}fd'̐yQ/;^+b#&~ي2(<c 3;n`92[Lqzt.)<lJanX>ɚpTֆ)$Dru:5zj,|~0T\~>*,6Y
]7E9!7;au*8Y?Ң#WfiA~\mB\$OwDhE16:_JqBR%*X3!O:`Iok2+}Y'1%Y
GPMJ{rKw_L&NNyA'ճmﺾo4gz"v;L	je%Ɯ{NS6U'*@djNcvo^=Bi795l€Aⶫ627ICkyV_}B.I=YR2U^c<z+w@b
"8ۺ?pGZ:Oȿ7ÝTԐI
JAx߹rxn?(؁wh?FOGj{D"LaWe}j w*62y3r3O(1;LSPpa?U}cqT/+~3Mҫy$=IQRS$@դ@&\l+fEI1kڸvx}_nϐMfBy"m
9nQpϼϺe\I2Gt3y)w%u$w[6o@&zܞY^Zw;<\bm"{3=sSNӐov(D"idM֬Lใj9ZK7_<ېø974P60,R?Dm6.Dthe3
>~o\Ƙa3Ƹ2@eU*Tlmcӱ~ xnNU)o`Iχa]PFŚVTC&ϣ࿋Y=d]/..FBXs+$=}buM>RWm6Ŗ6ᢐFX 5x{v*j;zv<_~AVUJϐ^IjQxシuQo=lK_ՑEkZ\4sqU7vOa J?Q)4C^\k[{3y~M|J'g4Ay,$0( jHl:Q"V҉1X&e
s)MZ(W|Ϲ\88&tcpҔa͔CCGU$^fb|8u̸&A֍9ke7;㥦koAvՏ0o5y'<!HP4|yC{_2elTrs*Idg_'V
Fvz|"ƞҩn2=3["st	}N8`1`Xi]x(U2\o[v1d%JOO&rؗ0ܵ9Yxݨ \Dm]=Hjovfd):tbdH9\ϛY?8
<%}dVەhnuӻkV3+(+$-#ՋQҰЖX@h-Nd$a>M3q"y$[Y@SgÓ=ݎP1)L<d"drՕsW	DJ
tbcj*!Aq
hG|3j zO|N
*π%2#ǓH7!
;v';O~hĥ%,v6BբTxDv"LtïK"N#.ec}f˺d&TRAS;Yq!E,AAm?~[7[>
\!B;U!)/C$N$A³ueuU},3Y'/Jc	.8_[ON-<"NawGm_+yj~P]ſ^\yX,r-|㒒ܳ<L^T},^eDR,nkqց%|r,!gJx=~p{"\eeEN;Þ=${q@Q_\?/иLe>u#Mp'Yn_e<q㼅Ra8pLB=(YK[l`BKB#4;c;HS^OA<J~I4,$",B\HV'&fಀ/pO_*__#&lWcK	BZ(|Zb+|KpT
Ar3v*>>Ʉx\+0lkOԼ`Fcfup.wlCnKJIi]&fXPAn1کFTKBoI!ӮZ f)~Xhy9ݨOC5&|T2ӲnSLB5eD0:yP;(w9mΪnWhKu{`wk
kH>*ڲ1wp5Q݌$;LvvJ1f3n*Tg@oO#9|}?V0M5.ۀz{"NK?C_$
P&B̆e>(qIu`|ob|_0l2WꂝsCܴLTIa?f(/+PIwBWhgšHEiŮ(G6
" 
"(H2̙dfr	$xZEP>ţC~EF:}<
\{
%rH6N$(߫Nᷘ_%1]2:$o-8ȥ I-qt;'kTjJW^}kfQUr\ulNkHn᫂H*Wd6M2	*{`V%VRoJJ`+"yO|s86Vy8:+;9ɨ=.qqѝ=ɥ^ӏwldG;<bSh	(%]
N}uAܹ`MV?g=&o:R(tWS-{66CSUfoEIhzE'ܜ&Q8,g]-2t%F@}S|QJĜh&S콧bor
2wq|o/$
Ĭ7AңIMXIc>fH^2`zBȳ	ŞO*{M2MoR0i:T~%$9ED~cj<}${.-+P]c=Vzpwz\S;!?C:GFIױqYŞ݇>;]mS)yrEz_n˕aI"l|sGvmߵ_7e]֭>ГU)i:D΂G}V W5*{f?
($p\)9D$ZYr|(4D܁OHʳ;ܫv۱jxLr_r
;Wi
nV|Rudܦ;@YN<qIȗscE^M|Kƿ6#Q쀫Hl6\rEjJK-β+x=j1(~ǒ)C[vQn1򑾪xVauI[8mYGeLV(X/%W}%
M]4ǽAߗnװQԈXtGdƇD\wQyR>l-QnJȲc/14C:'K&̕BOJ{ߴzfsW|F-q2?}Y[pXdY<\v+M{ir8~LJޯ
vlL:	?@o[g`}>?UrǛI2Lk.}GpI8QRV%܂L0/PUE
?ɹTcۼfHs^QMC!)$;ej
uIy	W6#LMi9ĦͱP*HʘFg]mߝn+|X$Z6K'OQJq m(B~ljSuZťbhWP"z@UVJ΂\,<\HA5Oaf΍C75O
<x5MKQe%Tfʤ6
SsFtTOUt(2[
ES!.?Ӕ#C:[6$ߴR2G[DUcbDx(M<}|y%}ђHmzyEy)9Didh(CpKoY9_\niQsƚӮkX36R7U&"cT4Eʈ0X,t	:T/>Uݮx7F>QL~:ʥ#][eTS2%c
Æ~EWg9i%3W4ފ:}޼0_X|-ƣµVu8H{YF"qĔ-F95E!L/3zLw@"FRmOQ&[#ZO/xˤr~9T00bܬ4Pߋb>_nMFY%<ip
;Rx@|qj#lj?Ape[ۊx{
sHt-bM#t8f5}sc0f0
CcBKRmcEkץJH[ۢŚ<!)NoOCI}52
09tMب7B0؋0zDKYeRUJѐ:N::,#D~6ž4o1l`q5XU5G"Z4tX cVu{_<9SN}h%{nԾ"V}V"Cw}t)b3zFjoKj2'Q9
]\Bȫr1.8C|.x8~pGm<ϰ"iS˨ڠu[)Ek+WE8x5
qg<k~[0n&
ˊڮcAaJúg":"].ff5
	RuBTu6u|;4R
'hNp\@I!Bq":*pX'%O$K#(}vW&$nxTeحkU^IkKlY+H;"^\#G_KmR2yfbI-ب:ݐ$;8$N(Ӊxa
 1"*.d8>MOaN$ʡ˖~&($~>tBM%^i3ϐEf8UB	'`-icIaͨ+	دR=ZȾŁ=5U#5HR>njky/s6H؃EoLyCG/?QE%FvMMz)=ZB.ϡƋ/•3O85&YKլ(ST eҝZVx'xaV4Ë*H]z~h~
i0d,K8CZy{jCF')b|xNJ>V{0e#|SE1b狛*_R"37Boξ(p3_<ݥ%-tɫBetƓpx HuRuɵ)H?mf@Iz͂qrgM_D|Ce
ӯ_wCՄYK/Ԩ	佨/Y0y̸7.]*ѳa !d[m9#{-;W[	U$mb?ci3ؘsq6ĂT
t֠}dlv{Fyt/ټt̰KQ8N"4ʻc'׸Ns6I<fWϚvЕ*҇T 9
I#{	mVx@.\EyT}W*fҿSѵ:'hPofħ/7nu3֭FcȶT5yŴѪLiӔ%vIG	ɒ3m?PH-k;?vbkkՉy^4o B[*BoR9^FtbIydW$ګږNT3VYzl((m"Ua.\vzC5H8H$?sZ6=:hhB!É8
`,g6$cN!Lp<b<Nz;0y%
)"
DB@;.a$G=W+vFv-|d%ݿǁgOŨ;$KFlbu#^$(b	,jdM[skxv͆c?sBflSkMe͈Lyi3TZugv#V'{F,8+5%\Y`kY oC,VQ"Bk5Wjؚ
axhk"	Aƛ/dX!xJ(}~&|	h?.XSqX}|#CichKVF @ dw^NH L
jkujVJE)swm^VQe^*7cSu5.:5!{3A/u@v?aDUNCkH2)1z%9U鱛v򹰗!k0>][#?wsb,4U_	f)Eď*	uä6Go76ɵ{'CGa+RUA=@5_rgs1OUG*ʚO&Q͡4%nlc=%Z vY
Zeਝ4?eC`_wvĦ10KB/*Brv4όwM	0r `$CܝGa6;g-N_&ɰ.`	`0M/s\PMf`p3$A7	i	c(y
<N6e/cPOjm+YЪCzXa-T`aott._
,qgOI]@f"	?4|T]T7[r5+D4UffN]Ϭ'MddY%A'-:x>jӍ5!UiMSD-rBFL&^:OF-T4w
T3cq]2Rd/3U\;?Up=@b
TYRJ3O)*+sWu.[L6ǼA. 귒hoN_=C|HW	Gz}w\2h{?Ur_ס,[<4DmD〷C/Fl
Mr_򑹾g"P\TMIiDw$=`IӐ}6.jYx^h}]"]l
8"ӽ΃ǐL"Hڝk:^֖Tm.^@1~qxTlU#U75:LE|4&W25exz*̖̆;M0do^lpmaIS7kD#'͊$"lL?bADINmEh8Ԍ*"vұE݌5Z5
`z~x[MN&a|b(ǁ$ch|cq)M_Ɔw>bSО$	Dpz!G@o3a]PnN2);K4 U"p+q
7bLay$04iCc9(6>E3a{ R䏡0`?s07y9'`Lq`ScLr&MP.ڽ,_ru/F=܏=1ltŜ
9>1lם
KX_t+	=#ثL
uuWK̹u)F@jR_$YuBśGbQl+$,o8qlg!)n2QήU>Ytw(^'Y! %GU9, &>YcwUMj"Zo6VWF9=almynqA/2AI̐i
qAN?!9NxlbO{eiYQ̶>SZ	.&sbj?1_ǡPkٟx`дY!n6fVJ?ffon06l)7BuyMAѢ&m>>Nj#4J%&|E]ۊ:i2g0io*6zXh+҂3;1"2ҍ+O?KjaY|nMHpA/LsI5cu*ΐDx!W{|mpq%qehrYbBtM7uA-
w%5,x+z!Ί}|%wpȩxeXx|Yy$M}yAz5{+=}5"6~{άq~p^Q~Md~*XŸ~,LU~S@~5
~+f2T"P{pUIp<dGX]'LzJ@ς5)+gI"ۇ{~oec,dX؈	L;o@}5^E+#zЩגoycơzWܝL@E5+#NzOoK/cWK՘$B@W|5%+׊#xAqzt&oMɜ9clWK×@V5+@)#qhfj[Ű1lmPʪnpEХip;
s0Xu'xzŒr{qDofp[ԯqP䩪sNEt;=%v15x(
z WW}
q(vsfv[wLP̨OxE뢳y
;Nz11c{v(_| ׊b~mqC|fLo|[y[|P|Eҡt};O}1~/(~!Ep޵f&Bp[Q/PtہgES;P1ƀ(Ā!ހp,RfO6[B5PcE`;U1*)^!Hpy`f[>f	P[AE;Z1ٓ0U)Fj"0΂op~7f
![BPY_EE;T\1撠C)k"djpmfr=[M,1P\ǑES;`Ћ1')}"Ρmfni=pkqr^mtolVurX wtDyw'0|Yz>̾jqźjlr`ntpu0rnvgkbtgwWIv~yCtxz0b{x|bh|~j|l|^n|~pp|j\s}AVtu[}Bw}0z~l;fׇ
i
9kDmh5})oviNqꂿUtXBEv=/yVǧeP{qgi卞|l{nohLp(TsuSAv@Z/ryX_dִ2f}}hƖMk/zmtLgdojT3rxAKuI/8xσ[c&5e[}gܞrQj.xylfoDSrd@u/x\ębp vdܫg%iwy3kyenbSq@to.wUad`RfWh-xkkemn)Rq\@?t@.wZtf4uhvjxxm0xyosekz.qR|{itP?|w-~zK'rp{sqԜu#svFtgwwtudxw*Qz%x?E{zb-}|Xpzr'zssj{@(t{vxv|cwy|Qy
}>z}-R|~H(oYpq݃^s=uPt;bvSPPx<>Ay-|0m{opzrt?s^auQOw+T=y>,{¹luSmoou{psGrlatqOvk?=txj,{
@kmܖnlprxqؔM`WsNuȌ=&x,zj׫4lgmomqq0_s*9N uI_<w6,z@ja観k)m\|2nq)p _<r`Mtړl<wJ),zy}!eu}Dh,9}j}lpp~.o^~qL!t";w+zU{oKj{ipϒ{r>|2so|u]}@vLO}xT;"~z-*|Ly(x*yyr
z$ygWTaˢĮkTd@D\dPPp-HG&]30;sCg( 1DE*n6ܵaz*&<//6
O?Q}0$	8_{[w /!fUmxrIWB5()2.$5Uo}Z!OOqm>>P3ĸg|,X񦁓`S$>BGDǕu#i#܌-`xJ!wم:(`[HWeQ2UFD`|:Cd2~TvkdEeUb2<o]^jj'{@sJɻuiWŷoWs%PFUV6[fruOCU(5?"//b;H-O
o_%{"bHk&9q\W:r&G%2.i6D1%~F+~ZC?8V
2#⮪ui^#v
NL؏SEZLnÖ`=lva;(>̽p ʠ~[@QdF!7H$	#dLt!BOK*G-iCrB.UlmO>
,B2W<+367ߛ@)۠&KO
0ޏO
igm82=D 4FB[!AIb4~Z	*fz\OtF&ӝN&3xF[Hjz&3n14bM zB!
|+
/hw{V\lsTjg?қ۟u 깮D}û.5ʺ(wM	ұ=Ljeo(u\yPXƢ8p2232"uh0
;(3-ybݷ3WdsF@w	,8#!H*9)iF^
P7Dg3I33D_)JQNdOm2ta':=J.۱
s`d+uu- ǵiȵ\L
kw/i&G1|91:H^gW@-Eif?QF?/KvřMkz݈uN0:ӎ3BJ]PU@׊VVzDPC9>RTl{=EY^ScyjN96b~mwj[
Zl'd}[YގM:tU9WI-#d=sѣS
IKuƷ6i/JO{s{c@6oPU,'9cV~M6IQ1WwoT+mlF0\Od?oi4M4MC%HfM[r0p[p|R’/Ld/_c8]׍YpFKM(Ewo@jjI0/kad[H>|/ѓL
|00SVRׂV2Cæav4x,'L82'7&n&CĿf]9-f]i<?h_]ǿ"a5!	+CQO}D{p՛xէɰiX1kt́KMw:h_Id)[`m:'1f%s7^V6,0|33~+䔓*o؜wPPK
W
{W0.^Mq'r>{Ta4EeNٟή"V_ǔ3tf65ҷ, jP6Ex)ͻUSu@6M6dFVSˬGŦwƠuy@>.TȆVOdj?#驺sycA)w,zl<ـB*7ij,\P#;}}~r4fxO"ZhNMBe@(78,iA#FaN}qǖ*lfZۋM2HB-7߅,yY#p9|qeےNYƐ*M}"A튘6؈U,ۅ#||(qW,esY!MANJje6Ç,}#5tPcjOf=_`rhTkHm=op2s(Hv "zbtu5k#jl_-$nnSjpDHrB=tytn2ݑOv)yL |triIs
^ٟtSuSHt#v=_.x02y)B{!
}~s<xi'y?^WLySVzOH-{=:{2|)p}!g~s@|hg]ORr:GA=^2)$!Urhn]RyGƒZ<23 )h!r7h/ۋu]jRRhGv:<ِA2v)҈ƃ*"-=rYg<"]2$R1GDT<2䆡)?"Yׂr+0gȖ]/&R`G;<42^u*څ"|/j	cj_eU᪹h
K$jA+mX7pM.=tsk%v\z`ij@_׭kU֩imKoxAq7ts.vp&(y(60{i[p_`qUrK5t7A<u7˙wz.yQ&c{V+}di$w_OwU_vxKkxAvy7͗z.ݒ|&̍\}[ 'K~hꭢ}9_}AU-)}TK4}wAd}7Ζ~..~'v6 hc_zU{KoAO7ԕL/'A ӆhʉ[^񧞈~U0jKEACą17ה1/7D'r	b!khn/^UuK
ʊEA87͔9/AO7'!HAhZ^bUؐK'A<g7ۓ$/L͆'!rh`JjNcQlyfniMyplfsnSurq@x u</{,yeEkgmEj*olpxnreqdtRt
v|@Uvx.z={9)bv"evhwlEjx6wm0ydoyRrz?u|.ye}Si`Yjcf6̈hvRkycngQNqY?KtS.JxL^يaɉYqd%vgfu/jObmfPp>t(o.w]^`cCcHlVf+;t)i0aldOȯ>tsw[-wnw\-_AMb0ke#SsShA!a7kO|o>#r-v0[Dn^aaShdL%rg{`j哟On-=rfv-vm3Zp]­`܄cr
f؝C` jRNnb=q-vBw~o`^q&ccrfBtiquk_wInN1yq<{u8,-}pymjynlpptnRrp/qsr_;utMwv2<Tyx,|~{6jtnlufntvTpEwFor+xF^Jt8yZLvkz;x{+{}6h~4lj~F(l~LFn~Qnp~e]er~L:uM~;sw~+zf
ik<~m*Rmo_n\qǃKtU;w&+z@ɮoe~giю}k:lnH[[pʈ~Ks:vw+yQdXfh•}jՇ_SVNu1XDYd0@/y{e`@=P8

x+OpOT+gxjZ@c}9`k`cTnw?+^5j䤢T&o
lEx9{XfPg@C_[G=/5g4ʥ^E*z	5#p&XsY>>@?nC)HKс#Eu$%`^>[
(?`~^x0_+OËv&"YD>s5x']~-if~>NF"
P^OG#ǖ0<7ӆ7
:sXL!kݱrx{6Rt"+@q*7k1U誘Y}(~\H`J䞂\
52[{F;Onݦ
*C{2H<N-S2UruUKm5ųBu
}3!JH$#h^Qv0qUY:ʫaZ=V.}VZfsy֧MP8:x-kն(+rީGSIЭOwiι9јy&z8,k.$x=rmRMRuMb;dw0y2֤T{WƊ6m|+8EC`Gd]Mm"WrS禜D~AS	+G6W#jnA>puw0D(MHOB$vKѻX{'V'5c

sh]T4IDGãTD(2BNlz9eB_ ݫ.#JUbGɰ	Pc36߅!3?o/˼	4Ta1l-vKWZApɾ<>\Щހka8Z5$GdW#{{ߢ!	e8l&Vlu4ʚ@ԸQWJ"쎛)9(6gfy'1?JL)b쭢l]4LkۘPpuﲹ)nCA Ŷ+2dEH'Hm&Y3uѷkѽӭ1n]_Z<ڮRvӛpjm9G݂#j}dA-uڠ
0\C"dhK>مٸ:IFq\BVhF'$[I&3BtK\ D'`;I["%#N\I
|?a8+ş3"-Aש_ZZKO%u6`X{cͯw1$+OM{'E],jz6+~Qk	a=_/E	qbVk&S7<R5|m[NS<T['c֝"16`fi+mԂEh6=2%w	\Ww3/VWxGk	(+K6\Gk6ygfp86,W	C	~8yq'
Sk3vIժ*/kffԛ]_M5Ɵ$Ϲv3\2e*^\?|_cj1xڶ+em[8@Ńr1346=v׶+f5RjWuM!\7c{1'a`&y[8#H3Ci\OR<y0mOy3lN2'\N`́QSL'})R찧R3Iw('gV!pGJeضR.u.jO[GCd5aL!_sd݂F\nMͳ&ֹj~*A%y2[\f-:HLeyby 
 }s-j5+ڲkEZ5׺ֵޛc[GSJoŤ+unRƉoQ'j
9y<i;MB]
Y5SA*bPW#X~$u2ξ/1a+` cv&L/0̰;t)H܄|E91ݎjɆ'u/qvC|\lWjaCm^~nc==7Em+O^	|vd,<8LOj%=Y0o}ďvCBW[K&I>fg\"&]KOÑ:%ijeB>%j:l=T1e~/ߪg
I0^YV)<^ϑ%
զՏQS-WGpaθD8ߠ9D֑ՃXM'
UJ]I"mteuuE)-3`Ҍ SoO6Ju@$ZZǚ;oam>݄92)@m{>-V|WU>r$Ӳ]qّ¸zEYuɔ>GT@蚩\'}њG9mp.d.@L4c&,r;b
ӂdlt3ݦ]Q<b-w
Nk	kbK%H@j"W4sf|Aa{8c%J@bW\E':Ehsř=}9fǹTW!3ߔ% פԘ]YzĀ&XIkWdPيb]9gbIi$ O1wu_)xS$P)m/UI.mpsf5Uwl}oyh 4;=DUIKSDSjj:?2*w0P4o+G4O6jeuHW)ϛ=ݮȆs51
okaIӽ֒Wo0%>#}?V5N_r}%7
Լ{!`D}K_4
!Q\HҽzȔHN>uA-^Ჰbg%+k58W	#wi+q0khcuTT[`5Z[`J	&-v**cs0:-7o3G(Z!dz	Q}vx'E}aQ#*'viƷ|'in˵Y;eR{E1vikYT24o/;K|O	c
Rr_T'UtKyγzaL=zs#k)|OĀ܇:axim&&^cŽoIѓ`
W82K/ױϬ˽^ipuO:JD:WtG<Z2]uyy+0H5W?16א	~u[4')BrjXG><8YJ]
ՄyiZP-|xm4rQe`dZH;4SX1̚`wpu>7<dE,]5J!T%"7%:	-+6\wO1=zs[ITNX)bOIUq~JY鮦t ͆/?wU[j+ϖQzUR'd(_XqByg5mVeq}Jsg[\[>	H2<?\`L8n/j?*BgKߩd}d"KK{	LTka(·t=no4iHA-:s0JַYa<Sebv]
%;8;2/+BMqvs$`ىY4/\ssi iUcdUafh6uaP&>%Cd>zES?+&e{\Q>+)
^T9ZPFV+@l@A	B
r3L2$$x *,^-ڷ[]<**RI<E|NBj*K=׌Aua2%V/.RCv(ݴܥKp\	t!w-<ar[fA72:%E;),Aj&%yޑ$xPME@AfWxxM%|zW6Ji,oV^>npdkŻΫ
:C>KXi<_TTՖqcs.JmZEŒ:^΄hsVIbm8tSX&^ a*Ɋn^m=A2s^mICca|k`K{"Y١:nf,ڱW	x_n~	
!f睥#
Aɧo(u
gįVg攷E)?n/ؠbdSu3QQIB`\C!d
P,2QC[Pһn`RXYU^',|Y5G4-}<kCfގoۆ37%R/4!=a'mfUgL(CfU]@::&
wo߿D[D$<H׽kU*I#;He6i*80CTN/h%uhvL5'ƭs*=%s+:V9˲O%(LWӖswn0~~I`F嵃v&K^U*^6U>,V{:T5zGFdx|4Zٲ u'ʦ"Ww[f^'0Xcx2rKJJDJmB|CÁ=55oc/hNL9'0jI. =$!_3s^>pX0]ScԹ`gi9Q?+,O|ekkC)6bf!),MjQZF_Y[-ۈfiv&mH!`5oIxudP#F
P&h_2nnmMsC?wOt[Pk+jnA	ǐHځY*zל`L﵋TL01|w:44o(%j̨5YJ_|fyl00DO+/.5T"$8[g)T`MH?Ɠ\<f\o-1by^QEE*׺eU._3P}7&^lXxVMCG|0A~%_oÀc`4]~rf5o{/DRe)R'2:(FQKLUDu49%O'EGtsӺ|U[nlMӴ
/8*;,a8sk
~!!@)֧&Ñs<-sZ•2EbTb~AA}Dʺ0S{{GaoqB͝$F8z*d:ٟЕLza:Jeaq
T*1"}!@k˳߬B/lEy~eK\5$O=hZ͓ނ9`_ݎ[9Ĥu2B\s
u5=@Όp@z	t;*+.Za]1lRSo
КrHYKg<`7/|+4A*K֨81%-1w?Ɩ)r~K0;h+fg:"&6)rpcyB6 b#&l:w>fިÕyL/\Zj@Ν(Wڢud>P"Yd'$$ʗVJ+W>pG[^Gڻ2|M5kci{ZJbILF<fB>PCR7<]'wKÍQXb*
$f»~	^̈́:)]}pA(+RXzE;b1t!9ݠBj`d>!L7gh%<d:@dAC<@߈@.Zj@pC䂻Qab!Mbqqzbە3;@AK$˰ENTۢH=jon_a|1r('mrQ˰lp;Ա{qe=^ՐYcI$ۖ(o%\-Kч޻ΑvKW0dngXgIF~XQHl8'KrgJ
*XcZ3}EٓDsjd9FK䛉J 
I1{V!xnK-e>7nׅ_Qg1R2Ǽĸ:@n\KX)'WIC0hݤ!XL}4l5 Vh2,?bLb#(sÀytk]:ibP_"2S&F ߆*:/~5l6fݻ	Ӡv<NE"AMBI܆=ӰD!5oG]Ml[UZ~$g"HU(>(l1u;8qi7mL[@Wxl<Rs\]1^>g	Y<#nMDyYZOEX;/C<_IfGuROM++c7S
4ƊaZԃu	Mߊ]>]o/m^&=Nh̕.g*>d_$
]koj-]wz`g`@XRSZ^6uV^og~XQ	濮a%{s
Tp4{HLydW)YU&R?FD/'gH7yOG
S0᪄g
:po)-.XF:e*diG{.㯙nwn.tY<"`7dsSC!x$g:SX9Y%r_']4K.q cYv.㏢Mrm*ADbW냊M1Dqby9mT'buq7Or}yXK8`微.;~1K}wҭrB;ҏޒ&6	Rr*?j䆑lugICkM|vhZYHn8VzQ3N??֫zGP5|No(RGJ[5&Hs)qq}^&2n:zǰkFmP03;7Nsi+ZiӍ	^zs7Tm ,
zb@p22{96ʄ/=4)c	x
t&83B-(;^SedSy7yG^H@Es7<AQ|h[\jeZҎy1|i-<C^ow5pcP_<.&n;ˌpa[yy$۫j!ѫ$E42˚v?ݴ^wnYg?G9cK+%<qWŔz^}NV]QvS{q8ڷu)?WV1l%Wyjp0#>M']|k!3h{&m5&[KiK%}UEk̀uhT[*FkkOZ e ev]Gؼ;GLW[d;oo3xY{OEk[@|l2섐^򒼗F6a	9uUQ[Em'*uWAw:^WfAw:Rc$DZ9-N7~c

?;A34VfO	5*DvUe_Rqr_pMv]{қ[;f4(c5ڑGdxEjO-n
|g8
KٶŲ]{r3J(?ұqlu;S7qWA}ǰ=o
nxg|GCTpTaH͗O0U`llڤClt0jh~pڱY_,x',IUjn\[MzDBb<Ô]T7S0Co}2%sF͘MQś!7fSѕ&.!mFk(+OOȏ@W1fG0JZ-#=qb>@@gIxFz|޴\E=Yg6atҺ*SY5T9vh	%2{}n}I90v zRf8kOʼjVo:*xH3_	6WWx4\;5juK::i7rʶYAd~X:J1<;e
(;MsrlڪU[y5vw(k
-OlHWeG㐣݆L9sŠFp6i&xИp0C2}TxmCH#ѽZyڇm{+EAaWdVSy%ې8bש"SLL14$Bs&Bj&d@Y?O+82}-D^ݒD(PR{Ѭ.s!$4Pڣo\i(#u"D8
:]C>6ڒ׶*m@1GQmlìOrusg# tk-ۤ<v+lUw
]@V99'3ի	P?#0eDaS#[%LYƉUU_nFη4F/V[&+;k+4e[D7\~YCm[D4Mn/90:/[o`K(
TorM8FECwLhTl
;=Lt^r%|TXNdR3O>^G)
yۂ2b+PgDWB;T+4Qv{9輵;!f6~/ė|@r~EM$,<`2+oMҿ$ȵk뤆)<$\nnu|LX+z-]:r"Xꗺ.KW;–YFC	:Aǔ+IUu+U>.+͋;SN@]
LUXKx6͑8=*U4^qݗۥ>S韒+ŻeLsf	v?m!'粈Yv0zْ2GwT1e{BHM,
&fr(y)%
PEhl%
$EVDĶto\~6-s//E2<뤪t:mbpVn(Q7:ziZNl*3miИ`
snX
U\Пbi0^Kc=!!{pwpyKH&Ș/UDg#M@1&yf_sIrŔ\Bc7HexXltbu!hI
&) ֩ršbps;CuGFq~~c6RbO'l"<͖z
[T0}5y V|EWrф\2aAA0	/ɷW&aA
AK]מq\kPU"Jѻ?W{j#'rG^$U)~VHDTup7eÊ⚊R"I^w0^+mOXiMi-T5ȝ'N]~{er5Ճ-wA-VYF~UgBOJt8y0.{KO(vlJ	uS0փyk^?6Wc+
Cl]Eko%ݼ脦g}<p?j~t7Q|/y	u"-Q߽{ޥwiN1j2Fc߀9uTEڵ粎t
;HC;osTH#d}[aT*ЧހGX;Ppit$V.xP
C_">h0[[tVۃw,U^|}X?4:a<X
s%هU)<@ZQ/[6.	0A=fxIҗQl3\PBoJ]Դ\>[3?,ЛMOyIOi>
'|2kxo6<Jc^|5ܲZz;*,1M;]U DQ$6*ړXz#UfZ,ku)jFR6:*hyYpI~KSpMnQjm-+yɽM4q,t0L$th!f_yb
qX𖠕@Fb/rhfZ`;k4<a% KEb}9v_Փ
Ukw3H/usk`Ǚ;3$B4\+;jKD Z
FFvEu{qcʰSTKk
rS4,FSQ?D "u%Zi^,[U6Pw԰S7ž$!E.H7^üum[E^)@YMSP)'b^Eqc?'Fxmuym.͇$|OKb1cwWln~BXfOyDz2MӅBQWci2 [b},1Ew^kb)k,]wHߦ4UmϪKc`C!Zʎ5ICW  fQ9Q|Uά2=-Id	2_M4 /ڨB>oy*Zo9XYifNP?1k𾠣 *_BupֲB[
4Xφ}P73d"dٮ&<ăT>x4Y"GXF%Ngt2S8.hpq܏#~2Hl<hކ
aG-?J1pm"2Vz|Raw~l8
4EZKݸUG|B1&T6;wWٝ]8XyWG-%r9PvX7ix*L(u==ϲ͓mqqZe&߰n=jcio@x/{Y/rpՓ-kb(nJ;7N]Ğ	|ט9^R,qi-j5I~Wfǒ;*~xFMuò~7S.0.rm4PMX
d6͵N|b*4uvv#3֬ަqV`i2d%507Ӝjx9x!KhF	bLb4EzclX>eҢ(j=~n$
Y9PKC‰/q䢘&lrS1|8+ۺp5q Z(QӸAX!\$$$CsrL2$L%,*OQuOłBuUX뵊]xV~n,[|nC
-bY@X?(e92"կ)fm6@>_|Xȼ
LN+VJ2v&ǂga:y*=>C,꽅zqwΣaVbP$Ԇ3H*
|tc^7CvfCUʆN\AX)MȊQrK{Fۏe"j%hCi24.$ҲɹDӮ?2]HMtaPZ+C9J*_r%QNH4r{W)	|em}^eٻ
.v_.e'T)V4(FoUgzf0=rƣ[(hGjKҢy}%]ʟ%(y쭬0L1sR1w^NJO7نyoxõO`i0)¿6T@JJL#״C[!)9!w+@,&TQ0GU5a
5\1(<U~ڌxݷ:vRȆqVt.	d7J<LUS0ݠLwk^Ip2Z#*͚i1.~xE \M;.7vD5枤Bl4 &ɷ͉Qsrkd
B2iNğ':da9<o=:O8Zq]\(p/@ΓH+nind`gAد0iJ*eW}o߶x"omzrQu_p==n_%!w~~S]Jѯ5VQz<L/8#+>-9]s41y3yʍ/	G䇫~IĴ41_35g%@.1N§N̡Pi'74@rz8Z?
 i;f
cENOri@Du{A6.ѱ>1_:, Jf?/LCNN*E]٭!mq=p)ݍ
cFMH?b;t%
7r~L&3>ﰞ~6slD'9?6T­ϙ^5;
k[}gX0^hq$WKJm3qV/f̔&|}31sO[9"6ε69K+|dj8a&kɐ=9wUͩ?|0,lugzeU,}*e-^uGSoy77bC#Qşn[,(l^	6!ʌ>":j<rBa̪ NfEkI8<*͒"e[,Av:ksCl.\șc+5*W&ŀ~\K4sR^?ӕx0v>biq2$V1\$ǕwkGԣQ%[`ѐJΉ	`]+Y)u!*5(HIdaoElw17hYxЈrMyA39ScLYgBل*dlQ
P/Džml)IR`i?ĞAY訌:et/
ysn琸M>dSG&HPe*p:vFӫ}9|%*CdڌTm ؍θSVkq~VQ<f
CB'LH? 6ǍZWzjxA|+cshi#a43KZr?'H:m2AĽeЭdcM^k^Cj#,@DL2I~tHGǫJ̀e	W`_qZb
"pp߄CH 	I&d2L)xʪ*jXEtJJ]EZ_=@XY#>(UT#tgE	UO4E]cDix`Ffw0b(U
Y]sAvjfhw@A,bx#iu+E_Xx˼U-EW'_@ce2b1(h^EN
`V[@-kbn_Pe:60lu-'\j|Dme;tHGD˪&աD!ߪ@M?B=rΕt<GH8Jd	lMilv>Swo2Y!;DLž]򮆁˶Rf;˷-r0ۏ첸R}"?5#mk+3((.RxP{K$
~?uX m(U$C[KIl9vL"F]C2q.OI61Qx	1iQZxle_)O&uZCj7$6} A~8zXmb|n^i>]fQBchJDj^k]rou#Ih
8ЂTc1)üW+-*kxueI~PE:LR]
&t-¬^*$M4-bBc鎳A9ZuKDۄT}pp;dzx0w
7
? rlJU/3BK3hf@jm1RזD*p֓2O(Vv
ndmMAO;1S`M-a6)N˛,_
l[c.Hі%Ŗش+#]lcٶ$ s~&b~In^Y6-쪸ʟ/FRa`	Ei|o$Գh:)=kZv6g|V'E;R^t\"ZW
YnN'⢒LiK[!6bjnf$=+*.ӃKvIchP*%zډ,1-pGsD8DC7x&X8e!j5kL4Y
&XqYLA)$]s_g^.[fx́{sHq	o݌ KFaa)1$PoגיDO̐Ńwq?0$װޮxYZN8$8_ُ$`lcZ6ݐ?ȇY+0H5zቔkQ}Ö<i|>!~QQ2&P{BcH|7gz9^sylu^A;RckU>)vQ8:oVcsK68#7>^nNk_<w*>mڹ3"ΨŢl`D#ޣ7W-#h<Lqf66@0}كih ӛR$0apsT9˟	sJЫlOIw7±A8j^Տorkl17x&eoUd!SQ2b+(km\5/>D:G"DxA4>X( 6b-X>*'qkxOOX+{5|fP|~NEzEy?|S-2<3}=`[~#ltGPj_
_߷,cn$kaM=UlMQ"gɆ5iЉ5M%7R%qvLSG[]]M	vKsw>q|
7pL=#.[CjϨ^wUOlTvCe]j20uuFfձʪ:AƆ"E*S'_
!Z:Qpt47rv윽Ys9{<Fr׃d+G1	F~ /bm1&&x,^LtZnD<t"74"ף.9m-6Iq55.1g)j!0OD<%n{?ns8YF<p	rwPqD!\ FKA^ZŨˍ
R휃EᏥla?aZ뵘ltUtWzs1͘iea1M1g͞vwxeWmOVum6lǦmavovumw8m^wO/o}?tcN:|s/\	
u9:&J\|B"D1X IdJԴkYyBzbs<D(K2T*+RWkjj봺z}CcSsKk[{[}w>z4g?x7o߽06m3fB|=ksΛ
4|K5~Xp%&(*,.0<664^?|X@`PsB#b$ PX<1A͹O3l.O IrOS#?UBP'
BPT;}*~>22
EOL_~[ g,v,cy]zFl(}FVύPq㫪J6A$*H$Ρ`v0;f×9zL2ٞQC|QM5xzAR+Ԕ k*xGjsH%Ť^Vaݼr~Lȡ3h5$؋#2'$
,FP].V!foDc&2`* _'ǹ{#	ݰw%{2>aQ*XSV*5r1V/\2dL9x~dE]0
^z[AKm<L!
|t䳁,&p#Ae* aʁ'pBr	}1zwAj$
,9Kͅ|-7\cL
SyrRꈼ_bl؞ҰUKTU|YB[3@SJӸ!C2)gO|dgسuzw2PW^Rd\=M4
zOh'7@nOPJ-yV;Lg]fΓ'Rj^[(Ā
yCBI@l3o? qMzۨ{6Tև*?]FW^V|.G2 T!YHl"	Iͦ
~]tˑն:6^m5+)U
&G͒ҥU	>ILŤSK``;m\ojc{.]w{]}A][UT5䄚T9"#֑$-QJ֙
(R;7n^윆a:VVTST@e&
PkLlvw6ԷU8{`>5#8-Eʦhc5IjɱUx(EUu=XU=ux}{tjG
4a(=Gr(nËqZTivU肝F7
:&|ؾĮȬ8CLNlG\nt{Bvx~T2?]ъ?:B':nAS+w."nG%PBRBz^MLpz&*T@ mHh؇Dc΢&ZT_Wj5yI5LOї5m
  һE/`v0;fˡp;ϙ־A}UlK8SQC#kדtYFUVErAF̾!b7E|{ewY쓌E8T@V4U4<7IIiA(R@:
j:8vug*tE@EQ*r 럄B; !rIC@V@]_ӇQ5<n.>UW/)aY/-Ry%F2"
	InK/i"tY{p8d|Q\Đxi'6ĩ/UUi5gԧyebLY(ke&\1q(h-Ev;wΛ6 !5kC(xH@m՝N&וy
UFeaf5n\+#$,۾.wAڐ&T%_}ؗY6"s9G&j
ơR9aWLt~-m
ANv$&!	2p0t{z$?5Z uTj]Ġ`9t&	f,h؈!%gS$&T<6ncK /'z&bp`F*8b(@H3x!}': yo8IP&\P{C@Rt(ɓʌ*rH1𵐗&dx'McČ`$f>m|S~䃱ؕ$x0mq]Pe&	i#eF6AWB~8QChiTɞ <|]z[u*nz!bg9Ԓr3lq
Xr3"	>4SPh=m@A8{Ͼ+\Ǖ--F3a@4M6;ҩ'Z8JԐpjj6 DzQ0'չ=;Qv(X
N#0-z#}2Ң>ƾ#Ahw8Vw5C/[r:mU5fYH7H)N6SPX'>}<5ӽe~y'NNdtOݗdjM
Z̓x3YAdECM&-ڀjGož>ْm\-u ZTS#%xG;Ѣ8]0^`#Hƺb~ںnA-9*ViTR8
`'yM>aATm#GђZVZ˪ݐETD_l	}mϒdo8zPc)VdjGT
*:YϪz*MSqKP}W7K۫Ov*om;Czzqt}JeVl|eryItV2j)kb腳h?|lIlN^mzQr}\E+ݫl([Xp1ٔZ[m@_Xi䮠pvfy?q)?GZ3=@W	=T2lvsdrڰP챢ށzE




q5YTp
yOCŻReb
&l[Ghmb9M%>]8!p~{gkl’B42?ȩVnI6
e%2G-8o
QP6ncN/J/FQ&=	}-9>#,
+>nƙ,Πz,>3'ЏԍI6Mo$GWdosfܐT:jGyhKڻ)k[Leٓ#ceA>Vl
oiEǪ2p˪lMe.{J~IT"Cvnc53}-"ÐhI'ِ,kHM"D[YjsUZCM:fD˂+)U
Naa␽Zfk@	0,"IBLtrAlĐ N9Vr:#Q1hax!coDjԀE_dLqi&]8NLSNIS/)WKlƜ5==\[jTv]٨@(WKsm!fwO)iiLڤ?鑓#tɕOL=?ٯ9,o9̳t2UAP@C6-!d!@ BB6BĂQDkop94Mre9*ӍRMd0W:rB5*G1GRBd;
ib"P'dh8^`B5yϕJ\L΄*nW2b߭L)3t*E&'	sdr* i@s?/=:Vh,~ߗ;{u15k}6EnA;xobhS$u,N%ɕ8j
'q/qO=`S)г,Tרs=@o5-z$^˚Fk3(lUA?5(!4v(_uw1ff:w-}hXKvzqAOQ NϜ@:&z$B/$Gc*8?z0;ߗ]/ZZV#sY]X&qzlKNCdP<dՋc1ƶؽPҸ=Ӷ1So<X8/%3Y<IXs:Hsoevn$GH7G8`ݗ$1]\?2^OdJtJz}eb8B!v@YN݅4wBT_DՁ}`0KwͮGfGUl,&3=m2)(ʼn'qvcF+c>¶GFޜ=;èj!,z5ϥ+D`C^n"NJf902?}ɉ=yΝi*mJnL6M$_e
A ($eEUȀӏ^9,>IoGs}YEHBWh֯յYTwL3rS1MOeS-)*d`[hh%؝jӣ͓\$|[XRK@-_JoЌ+כŋ8V"]?/&{d_$]B?,kʯ2xF5xun#s
[oyDs?{how1,8	fL?CVAyE%
K.?)-amU[5[ڜȺMtM0o?s}*Ϝ|-.̩ {JZVu(lIneC6%FQnj̍;\M{w
564q@p${{bKXQVx&\^fA{O򒻭m.B0b
@ħ/d?4m/o
y0wA6kloz=vVtbd.RC{,DŽ4]@ГzӁ4#L#y,xK|}]XÿC>A𵲇i6pD1|܎,HψP(@cii@Rq2[eaU^FR6Jz!`
{v'fQm)0}^(6Rc$5
(r~P,y9wM:(^։gDHDϡyl"0A4t!5F5bl
”#@
)ۚ+Ou`;\
mqׂZ4++'8bqu2ǬN Gt$
F7
G,)O
'6bgSo/+WuQ.mlc`rj($oQM
0rIF?i#@I_S>8Z7gW-[ܫ
J?&[1Ck\B"mф;[
 7qD
$fØt;Sj͖%qzfg,;-^Q`-}"ҘGHv-
35Sl.J7oÉ@5pNgmwٱٙmu*ꊸ/#7H NH 	@HB\$77!PxE.ov[O8bD>Π)Q6AY-aWjLGU-oF<B844N_ 
T%wO_@9{q/ߔ`PɥXh{j*hZ;0TJ5R+
4x|_O 9g.mΦ	^p܀bFlY\u\,RՍRJ	K5dA䉆Hl^jslx9:c6:-
?y{"38\n,9"ARU+J_ʆQ$e6W}HNSA[2:7<v7=DU٭٭ڀSt$K\`˓lV+hO{/y@6N.
DOFNeئ#2z
FifD_h$iK8uyZEA(9pekoR 8ygLWm|!S~q``l*7aڲ+QR%_E6̌VY:+B+5-M@1uqgq;s'/9?lRěa$sihIQAAt>7k1Fj@3\=ۉ <'#Gޙ?<tczЏCC-K4v"b$Sjѭ^M;ڑR%R1Wiu%|ϻ{<k})_=MV6(ƆkF[
Źmzw,Fp	h9voZͯwxpo=3b
$ʨ!Gl03DhvYv s)Fh)-܀nWK/o>uߎo
qxeP IÉh1nzY=WuMզgԥ'(e]-gCGi.];^ɹ>~o[?) oOP^M!=aǠtRl69m^rU4\	O%%-,O]TB*s;?Mw+Pmv{ւC)#HܥO)ih\LC.!K'b1HQs.w{ϟ/2Tp	c6#s6"bI)i+˰exVz:;9sYAnSKG?vOW{$a R*ը1o7l	˯WC^kh+qf7	:B|J+*u}B2#PCѦˋS%e*:g
cCh܁li)
`Fm5{kï

5!>s^sUXt9UJ厓7YΆ-P7 $*gz0W]yl`\:XA>s97<5'&cE=ffӕDdyix	M8ZH<WaT6TچhAgEt
L1
ACc#VEvr}fNt
1I#7ܤ	Gۆ
r;at)ChH^0
uΆcp.]
~x^Lޓ(qUv&ro(JeP<_ׇ{Q
c7Rg4tFZgaCCQx!)(04e)
T12Υf8E‘6G	V^؃R(E֘Yՙ>6."4Fm	Iz9)d1ź 	F+)mju@a7gDfFiUcԝRڊXxi>6|XG/@@+$kaQbќ0/nMҋ]%:c!רZTxYjq4Fּ]Xyw?=5a'v:u]㌵u=,"@n9 $$!+E@AHGBBpEA."(hAP뷙ӗ}Їw
oPEiԑ9qͩ[
q)Q<\Uh.gY}WS(35QEJYj)zS
h/Pk<^~'?aS| A:8}F/R+|cha

4Y^HjZU7
[C1 ?w<}Aw{_Kyē]Pmp\+ؐ-
TźˠRVYĐ[tX;-i(i7[9GPq4zg6@0=4kֈ\c-MANTij*A+7V	|ZQ4fmld/ 5@
ݽ#]w̋Usri07mNwˌ|!WQRQIc	fWlerU:Gg&{ q?
n.|f0rg$u͚B869A$Vˊ:bVoi
L,EUJ@!Og)Л@v4>4=A[+g $fy4"nv,9r1gJc:5J-AYL
:J匞Y*ϗȭy5Zg!W6@@6,GDOMBӆF`+٘^-+*uj/iuUcnC9K)7hsz 5]Nٰ;Td~><lt&aK]VTUu_;#;stxm-&ls{^i

g9yNnZϮ^sws9qq.54̨&Jld2zY.dؓj0t=#ۀ{:y?ڈ-w~B=wB(z?1GEAR#Rƙ6TPfkG5^C s#?9z	%g^t!̛a2Rxc,ip?TЛVNW#E~j7 sZo_;wf	.U/`
c( N`+GD+:%Z}E2u>TJ4&
*ow}
u?zXcΑggS+~P2u.3MV&*1Z,_e%I#\iPpYRg/PphmsY}~'kGs4Tj`ޅX~>3en؈24"y'ʸq~tZh/5kofصOa8s߸F_$@3q˰<R	d%'nQq4fM+Ҩ|׆n|qjpCh#/ⳟ_cbQG0l
%=+>>'n9;7^^^=1.5?jD'_X,D,Qn?t/J\p
&w!ב0؋gTStZ*j|	D„=bCB3WYx{ot}5[,w$	4LBA#oaQQ\xąʈ}IHNKȇߠKe's}*_};v$p;$p\,1~ ?$ 

!
9~|?}SRwp^@YH{VDrqQ"Ş'VpoTU$VdDױJtzt
*BM"{i1a=~oضR[ Q!q/eUV.yVH[(`IʪYL<SJ0MuV~٫@(C[=着0#?/0S.2sC -3)bg$395t2C!6+ӵkhC5Iu?F;;?z{w]-SUԧU ""{*(CF
DF$L@	;/d:!Zu]{wT*ʇF9xɉY9EG4v؊?Ƹ@ֱBJ|/7)˜b@Ջ<*@;€ fe> 1KWiE2c9rg0]DgQ])ܚd]ѯWiMU}:o@:vN?ćѱ@Fq?.[cT(y1oM70œh~8Jh.#lQDҭWF[3j;E#@O<~.;YKhk&qtd=rT}J+zPUX}Ψ9gTz<#8:<1)y/%O$yevUm:>Cn^!R$,@P18Qr
.eFҺs&o|<#AD1@q47剜_NJ5yvAT<Phx0,w*\^j45]ͪD;:UqZWs~,0PDugڴ‡lIJ}8Ma)BU,QdRbn&8mpZ9.7>8a@Â*2
hc^3~13JEi颸r!:Aj$U^NMrs!&xt~8ۀ>4@sWѴm)9PV-kQŸiP8SYFR4c4Kl]
IC4<Q	zás!{2 ЅfNxfKH~JμΟuF^4܊prfJ@г:6BRBd
Am-[[ꍏm@Ch[kd+>~r`vS!CkBD+Y]d=a&JD;Dlw؛7c_so`
	y툈z6tk46֗7Z*-Kآ&%ת#qfB׆cʡ2 GMTC?.X
[ZH5:Wt6譥dUEFIҬŋ(ZǗkxZ,z0= >=P~?Y9=1y~4tV$aix%A!jLsLdEԶrV!tZQ<s`i	,{߸?xQ#/Ne`%zyx+UnGz)xVY'iNCV`k"|FyT&`y'_z>#n/F\Lz2Cs/)Tb%Ӌ\8yU	B+|Ȫ/: {7Ӟ޸ho;A[,8N(V'O7*xUzjޝ;Wd(aCV%l`PPyp<}捑^gՕBkQG5wa…g7pkŭYlhd˿L^b/IİK(9w}
ۿy7S[Zh=(L0~l.}-ZYn@."@P
gSDFd{W5d˸:n8 \o3K>^=ݻ_%%4$&8 j%|	A
oմĶ^Ƿî:fԌ&6-LzH|b?ӑu[}U
^^_b6QYU82Tݘi-434o'iͩZRn
ZoH͟sӹ?}W>ߪm7
b#1en?#s"*aQ{u5k
ixtJK}
LjH
0}0:[gAM vtv3tљvZuծ]uC;rCDD @	!`BBHHBr;\BZPXnŋu؇}f~/76ذQ@Bbh\Yuun^R!lQwLs6H-M{#RpRʒKʓ7k׌MrM'?gİkS!"	q8@& xw3KsޖG!禼:􊑟 %X~H<齾vmWkaİu~AD
(Dh>F,AC~I)o|J"&xŭԤǮ03bgF}PM}3-z[6|ǓoK@C' 룐A	PtD`#c{xʢHjl80bÀ!s'<jc/q/Ӄ@|
8-QMxFeU>iHR|/1{.K<['-<+AIgPW7Kg
 NH]iD/X"IYEMo(
g]Ytd_6]8|pR~
=)L}Uz{@yf4HsRA:VPRX[CYqDu*ܹr. Y%3XlsZ~=*UN^i\U^,t{gP5y
- AEr(ӣAeQq>IY`<<)`?5Y^2]b+0gnϪn]T_\Vc/=˚%>x[@A#I=,-B-	g
Vm<Ǿ_%߭PfZewJ-۸?{5#	%SryUC ݠ>Ф'XʂRlFyCrsTI<MlQ[Tpo|s^7׍/.v?Abw& 4'Y4yhs	1bU
II0k&K;tWp}Qh 켡Ep 0'#@%'U<Ft]]"JQIeVƟ5
L:cmvҘRUo=HB?Mh>0%ŭҐǞ݌!Wi
KFMvWZfC?]>jqF-VTyl?d^6b#Sl0bYKO̹4KftDuE5spx!DGSvWLv|j'mmcUZգ_E&Ѕmc~0
֑ܙy<wΆ4*&ԔZ?ȯ5LA׵YNZSv}ՐCW=bPG*Ǧy
M5*`#Tr+'{]x\Z1RR=bzScnamZˡ;tS^v#6)UkPo࿂9KpD+1v'=~oPK6m 24Ny&j<dnLCqN!hdؽ|<5mám`	p官z"
AN)@2FWgWeF[5YҠ5rN{s;n;~U
Ơ:98p8tޝ55:ї_{mL5XIf;Kc%t6u1NmgF||A54nS_B{<|p!-'+EKV+P-Uj$nl52*mwVK\'%n'M4bGl :tVhÙC{3݉${/$8p4R$b]ՠg0u&Vi[*sTnG|NylZ5HZ~f<m?p3OخW;oO&g$
*nB,k8N9Ei՞VO:cw+MX	$aEО  *EYdHeJq .{1wRX%*UXʄ3W7j5W3K]L8(L6@շPvj{5m;n2IXKg(Q{8$NQ#S~-I!-P%_e^*(֔Tj5
UږJrJjnm(vOnصЮQWGC6{}:#/aDzj vB&ɸR1<sx{a9nm(1̷C;vNwo=ce߽1_ơ di7NHQƋ化|r+FUhueI\yQiGgtmù[6_My>Wk:nv}þvsv$4y4A֏K磻2nuJUaDG222qwQ؃RpaWPgM/uLnmXivu:3_0%yN䍡I/ɴQ:8nj	%bP,|Tv@<x֍6yPNPljLdas&ۯ-Z^.wv+F4DM2gfhɘ	7(-bL}Q(UFE##׵v@W6{ꅿol`btq|ɒMx'L\@SߡE"3OGkYNb )tZ
RMLp'ʸ~<xNPm
zc\c]Ofylş]]HG$;zO'DM
{BYLy\QFє{V%ܰIe'_eP[OÏs,r1F\!}!C
+&woF|,earq^Twgt\w@~``S6%#䀣mI눁`(@z;@F}
`Ox|u,sswY9k:蕏9"0.2\-Ps$mC >^@q;$8ΐBOGhOtP___r:!͆i`=li_(x1ra q#Ь$ 
$v@mdx8$ F{8
;("a)^STS
7
Ә>ɟAdLbc!3쨠bUom`kRS2i@1ȏlr>>^@=͚#K+ڴW+lc4`}_81CQ~u6hxF 0l?	y;H !?)|$Y"3?iV徊H!fLSI̝Itx#{vMH!!M@0cr?H+e.%fNMcH͐/dLk	
V-<IϥA=j2!}APt<dFd20)䷩B$9KTr_KӔrdlMN2Yے۝=$d>I9wȫ_G 7^P6P%Ȩea-\`XL)jYFX|ך3"紒jro/&ꀣmjv;!NzA1
1+d)VasYV.o*X0N?'Tg<'TZs{ZI=yw)=?S4О\	p|*N{?(ы
Q#eMeXqiJѳRSFz9XFRwOMnUzwOqKqOV<mC!v9~(>gKx}E5qcu(:ʢ2 R^P)R @JHC"BE0	A\gnև}99? 
^!HyYz@-F*#1KcH9}b_Rh2/s/gf97y7
HPa 0WRX3aA
*v=A)%(j*5ybf?7+@\MH@2	P7]APeB<*#q
r|h%x\N/bz|VViè-
5(n@
^$k
$ub
wk<sS߉MAn#6kHfǸHTAtVUհ	b@)ŶeK	Db.n\Pbjun@if?Z_xw))J_zUB];ŔF2]KDHHhR~DVMIDIԋq9@>d߁zf0]1>F)\d7KheRUr:[Dx%2Q5I%euaYI+tJ^%(G-il	\~NSyU0.FyaM𔋵dCPq	d&؜L,QdJ)BJ)dB֋$SCwNyߧ6Ʈ6/>
qJhMIlm"Y+q&WQ%+ŕm
Tbs@@ӞEoܭ-~b0䤶2'rą>UepKyBBc^3XVVIqUz1>7O;AtzB;~ICțF-LZ,8GK(^4#J]cz9@YA}O_\;nzGPLh%%lƲ.I*\Y(ؼX%mK$ik^-!Bs@i
?lu?ov9цwD%HS2{31|
n)c!5*!/Q)Hj&I
A 
|sPsp3F>M/Gl|tĺκ>mw3ȭUNӑ98żbt,Bw2IjVs:L&9Z&9&^MaݕɤvOeq'Ey+_hbh'GDzCȺB(kAzE*f5Ό0"4ӌ)ftPnjXo]+o?سB쨅手e36M$Po(u
v02`Ry=0^G/z*TN
k㷩a#3
sr%ۿ
Ve
˴?si1ߓAԇaqIw3SY*v5(Y51讆to40xQ9rl|Wӆus^Y~mKw|NQ^#Bqsғi1s̈9Zn0/GϷ`{|{cn[:6-2vk-oVZm-FCq4Fcqƴ(cj&Rߕ}L{#}9,Wϼ3, S!VCfi}ؼþMGNK?z8O.{—`bc?[BD/b>bSPo93){J<#}Yw:W@F4 WAZY۾[hΪ8,v
]#xA7̀}@a zZ`C?	O-"ܖ#>65ڷ;2"{+vM%\-ypI^vq2_gQMg9=ǥ=Gg>(*(Ȏ;Hd%|	,심@EERVOU0l*wo{_;Ci zCg н|_H)Om;ݠ0ʃ]ʬ_Y4("65p`63q'	ܭc~3!>G P~؎wr+ ..:rN@uᎅEc*lظ
zHMQxzAԾDkW pN8t8@`s$@fka;PYln	"b
HQƺ<vR# 9;PN@<G{w>oc.᮳cً9ܹ11?`
v뀍5}wG!Bj/YD}鈿S
+5wqY.棇xcy/q14o(v7kHx AAn8x|A
<A$5yKiFb\g]nyyʟM	Sḗi9Xd^
gAF/SB3QSJ*bBgx7ۖ)
_ឋ&QKQO”`}vAl	!Oہ*2| v$S	ؙd}һ"Rb%{Tϛȟk%S1(q7a2`c
,A
(==H'PAI#DB§6i^\suYbMׄ^aT8.}"4!OnQe]f|i`Yi'lm`w=	ADx"S޲L7R+jp$yt23mx#>e=1ı.${5pנq
&+0ȋ9	55l	eԄJtJ{UK?Mj>"k>G>EOsE7ڙ+2<b
)׃א{A1(rhH<=fDϠH:XNKS2jdК2SBQw)봑6HV+c$i:F-P,SYr	g2mGkq#(BC8zB]NEz7ܒIN/3au#kX]y2xV:ȶyΛk?T9>k1`0)쉑KxP{
]D#؄t
J2:xՙ&V"_8Cj71RuӲ
6YPsMҹ>jY,BOz;[Rd:MRhg75V]={__Зsbc
kAENBv?k|?0j78H89PE
-aoPoꤜYB#k
5*a\pP&k,
E|>O<3KbXC㟡m+y~oߛ`b<&Uȥ\59颦lY€VɋTg*uũ
6cdJ3Ft@6cv`^GKq;}^]
h;c;HN]/eSVUfRe $7eMZYWF0W-3|@oΗl1a
؜um%]V;B=vB\pW-%\gKERSy*ʐU(E_0}&79 @͟
S߮\tncuO:>hp{+!Z#9RM2Ǫ*KH)T*mN6M2յ4\DgB9_2?B
p%MumwuL@#pBA^	ST::8iQimlY"YY9}^Pd9(R6 D)LI3	%8)|'r2$E9)yWro?(}Sӑ)
֩ COǥ]%c7M5Y,iY!iFy-_RM-ϻR?{9,Rl|RRF$5tYqE7)ɏ<ޑ)

Y4PSF5;/xWg-^f72.ԊU!AyW2*R/}8Bfzc%9gʥAgjĥ:NwJCrgECzu6Wzsmsw~a5eJmN qȈԪkRbWH:&*_V/+w_rDgfIkU[4Pe1vGO}MO@ٛK_omϕY'	YwFHNM?x=G_sb:Uݔɬyɮ|ɭRAb/+զtU|J
WmR}mNW)6'|cDŽ6%ňw3\Heܩ%w_J{1GV(d2*uTnVyxիE5.vmyN5ҏ.b<>oDrZc}[-U$rD$j {.TB2/^#.SjПS3gi{ݒ>'Oqb_B]\~gݑ&ft{wt\ꨎltz9)z68D	WoZ?u#ꇗT
,iCzҏNF<,iQL?ЛO`S,W}ueyUL+vS;3$~S' j#*eߩ]o^T,7Y+O;'=#e4@ӑ/rdbO,B&xȏYhuX#wvݗ
C3깢L<F{FxA\T:۴|O'w7Sx[ׁ>!rL:{NFN&&%ST˴}P<4Mt
/fVwWkS%*4ҩǡ;Ra:6p`F~ 0cFnuF##G!
E$Ks@9]0DTe8v,`X`N70I>~ r>ę["fȱ2E>ރwf6uw	 r3W)˕0b
WS
$x9[LkpXBA{c7$;C#@!MO/	X/AbAh)c52
E0"Z+l<Wz/kL^u!Xw"u
~R6lE8zo*XF[h"n9"\tEق.- 0	#nyYL<>xj=ir$5w«/Urc3\嬃hD1w!av%8?)b|Jؠs~S6$
o=OQ3MAdpm:f2ɷ@Hq$KˡS
YeLT~Sz7I}t	_(Âh#t!	NuM5exuH،x1bCp	= Ȣ{v)Ki5)Zޤw=@0A}N7PF,`Ȅݾr<`&OlX+m$9CiFg#Zd= ̠W5o*oQ+~(F{.0F0Lw$sD%lggEw:v/@2ڿ.bϰ=l.R-:{RUp#V$BB	Y$9Y$0Baod(PW+^!,E^y>9/yw}qzP!qO(CT=gdW	o#oŸ_F M"#Q/IѯȷP(7b5.
0w~B~`9PXT?9; <q
'jp1Ƙ0oEר*F< ~L!f(#QQP/i1sk99= nmqb5_4!ۀ?P(}cyJMKB$gsf2dLeNEFc~cDϲ1vK}76'P^4cA-Bǔ}7bj6Ö#qr&)DQacn .{=p3VsnCsn>@X\V?, !tǻ4̡Y%ԴjH#uz:~CCoX}:No\{5MU?ͯO+r3nwfB`
9HY}LpuD(09ZMF5M.t+y&A	?,'L2򤨈2%`uM%;Ěsy~QC|
%'bzjb72zjRXMI\I-)'KbmB\@ḨOH8Ww~rCsk
3s63Q64r6[!¶K&~˙F"D]?L49.5%Y	=7pH`1],Y1W|rTMOweC/0m|L"H
Qo\JhKٍU}_6HϵIӹ{n
 OO?|{e/ʏU{Pu''L٠KT2^fq OhgK^\RQ?&
lLjwxѬw݂{"YMв֞\;Tw}˄nʦD֤ctB5YN7)S92 C'NEEC,PGI1YR
PJ[rY¹}'}K5Uv Y/Ηg1c|I'SCR(NYd*R!Z2_ɞ*!hTAc2px3H]}=@]_Y0^}gwt#cOU	EttAVJNSrY&U+UJJE1HaU@5ikwxN|ҹk5zC'KԘ<^-j3$/K5u&-Qp5
J暒Qr4rn,Am@7dK[>Tluٰ}sëotxՕ`ߦ*P'B2p5	(\<af(+et}VRQ9#uL {>R'
G&w5\gZ׻^<|}WwVPr9꘩{.+a%R!(Pq9<c952|N<>g83mRa.	$rt
>SWV:rk>WX}rKEGK2؀9ZG@$Ub\TDc+شB-h.YK}6(E[%XӸ$.wBly;
OU+ڼGr꽳ݳҚ7y(n)(A=Ǯ52:ZVf$+̂J]#EOP)=@/q֯/qxpoӡrΟ}=K+3FNȺ	:VMi	ӒLC5vDS7<]~QmP.rF/Pm`C߽yݏ:6Žў%GVg
 uDЏ
fB)7^^Lu)6Z2>u䝆c	Ъh](VED$
*d/FI
Œb#ngT-.uGܷ0n
B39+r?%RC]9˻RzU.y;w;l`Wqy-g?cS_iy=*|	BKZJO6>b)MSXT*4VUj^cu:ZvctWn`>ӳ~˴[9N;W/9'%j:f8#mϲLviTv:^֚ۖǔ.[Wd1uV#eߴj%?Pbv$k4mv!&2yҶ]7tG۝8/t)]8IWN0׵^bvWrRsLyc?=*˷	/m$KQ	TL
eP`F80+c_ĴŦXJU$&U%
J>=r25j"#C##KnD]=q=ɑgDGw>ѝW!p|!ݲ7=^Jp|Rq^>(9!Q(HaY1!;BG.;QȞX?2n
)~c3:Q/H&Ãr"d(|!/1B?T`GMG	b
 ֶj+}<Aw#`'p3nI`ǃѴ(ȦG@=#:dRy=[9}Ʀ߷ V|aStD}Hp
GP''C>i>ԓ}<9S|P6%_z=P5uv1 ġP/r.
ܙIH@Z^(%Q|DJ/&8X`a:$I!a
xa;{K!Ȉra93aӡ@
eqqu1Syn-\Hnlf裆XT?go"aHi9C
crY3aaH@FVҖECm<$ 1n&x k&i}V3#~{Pi
	کaa5,
>.AC+Ĺ!<20DC:oe@XuQS|pS\(nD{;rPo,'!6@f Ac8Lש( _6hLj]
䛙āh'#NwY<L[ȧ򍤏염̒v"k[6A>3a)X<,a&Fc42Q)mkD,Bg_ ܒZTO.P&6+%_e- /
_'E}4pR4Bo`,L\jV[x~IvX%=!+9x-7+__)[T-=YsSn\V/*G5f.
9sPl8PY^X#*EP.r`i^|onI)k-筮EҗvElSecM셦Y֓~G>A^W֯;8"߇UcPwGs-}5bc)pڳS2$kw[4UՇ5wtO7T]Kzuᔦp<p,ctPY3dz;/J?G	ʔC9}~kUaO^i[+h2VJn57^KYEspI}%낺)3==ƣc'ݨ6^(aS+6LX4}7oFyP:}oKVq.[#B~5wsڥ
{S]_QMiPXP2*:
 қR	ɗ Ih%t!Q"ʂhxw#IYfo:^OERS"HN
8LAȲ5,2_*\7{|Ž%a?<ˏ=? 
JI
EޢĨȥۅow:f0E4(7*Hw #jc\	[YX-Tylf"n(<=ŷ?|#jd7+'TJ5krZCK&<K:Z%IO78+69(8.?b\̺:M/꼷,
Ք]r`\sH3A]iȶ+&vAB,IF"Irj%^N(P)5TLх4=M@[~̦#3+}Xlp\J~Z#ʈ꒸sB<+Ԛ)SMJ)WŤ2f=Pzgd1P.SGai!p2o;:ڭX?fk:a1vz͓f7~V+9,PsX2^Z$=+AS+ȅ)V(b#,^&/YLAzXHf}g!mG͞whs:6^IK([^L
0"Ĺ1eYaf>?VM63rz\?YBrs9z!p2;ik#|r[a[!g=,Ʈlׂw1XWef	ƫVD)tL^Nn?Γ8rFJF7qxg3Pr|UO3& S5`їƽ}/0~_5t<᳷9h[C䙆xO$_TN
r0<AvRZt%OLc4@Pv'fQr9Z-K::I=mB(j;jykNmxgSzl8h8]Q.	ȡbrN<K..$2ʩTAT3Z@4Ra09+\!ۊznzycY
ɪVuayLɭ˖d$+22^$% LY/C'i"=+46?^r߳F
ݵ[٧>󖻍\g'9YߎAZ-՘MOd%LM59U}v!5J@XĖ1fGyPdв<SV#AӞ!u̓neK8/NWE5JIh$dc⚋QMR|PBF/EbD-BfYk'j0ua3pG4L~źrg`0h:‰{;<CIǫ!	91=K¸nIBRtGaZ
3Xd	f+`%PɵcrqQKE=s`
G%'#`BS"BՂ <o7W=F1ap6m`De
M@ϘhZ
i$:d^ici&C)Q'q㘳?ܢ~"ƮC4< O#(B|4c#^c!^߆y9av۷r4Oڹ@<gc\4{<{q=5W=b_<Cp
0;aZ{{M+|<gzχEO/ݦ:lЌM5J1P<4UÓHUބ=juiݬ	Z]Qv1)~lG|iZ9]~Yy!;Q@هa# 4Es@޻wM[R;nHz%K./C߇;dヤzuę?O9~R:<t˄g-Amt @A)c
,[1<*OQu
cK_ࠝ>p.O80v9f<
smOvcb8fZp(%-$T,,5K34HDuQP"KٗdZN<9\vupdi}{>Q`>7ZNHM$RCÆGda+2ZB'pĂp2SHr]
j yhC_K^hyb5b=lО#pQ,[8XG*cE_ODNCVNš)i8GU;ۈ&_HfPHZ!I!q"EmB"~>"pg#!(Ohg3aNQ4NB8kC{-!v,t5Jd	@T~|p7c1?#HKAo*V"t@'@P{}dY7`
b u:	Z34b(@,i!֡%`D(0~N}G69?CL  [(B[=	q.Ш=4Bqq%xg`]y=;{5x5,k  2)Blp'0\Wx@c2;U ._QM;#tp[\6scc~pG{ÜʘTe0} 5alZ(~'gYb.cny8=לOO11v
{*D̿D[!އ-L쑾hhśH 1%:K谺8|H!rP6 ca=,(^%~wBx/[bE܋=!9agrܑN6C=ڵQTUnE/?%'bW/wsᓸےRȬCAIɃL;8bXɜ!|n>sZzs~Ē7	ѯ4[؝>sQSYr_?ߓߑǷKWҋayu!CNF
;ڢ0xǡ<T[({*#7UMkOUG:n=uS]	-yM5YGqI98R6k'4C
k %D+t@1rwƺwVt{z?u7iC̯?	WmӊK˪[V곚fnPs8aPݤrLdSo
_+XɜzkglA
RڳVR6^Jwc\~qusBd
'#Cݾ^nf {&c𦐑=N_lN{Z!Fxv f)`_)\גYz*eyExŰxh21v&	uA3lQfJo`MEo"=ƚ*zU5ŗҩ+,e'sG*e35hS$N>ؐ|Ѹ#i{KcmJqkjobMZ:Oo
tgw%;y}w,p>zݭB/M6小\!8D߲^7ZՐUPq̸%5:=iszGRUgcefobEf
b,g":z_Jמ 獡#NvF:unrsԱLvSQpxWZy}&6K&w*簩2yCgu9Irr{A"rYLtފ#oserɁ`{&^ɛu6LfJSdSy:qMP\Tee`KBE~Cb2isjrqؤϷ&,%!T ; (]@{:!PRB(R'DD H*" 
qwPagȇ99ߒs9I$(BVK	S%> ~"^=7y^as`&ETSYAʨcGq'y3좂s‚nÔ/.w-XOlDde1%PD _*s:bhqИvN~Vqt`~xv>ǵ6Ç_TSq4Һ"މDnW49z)p}8EGדrlD@`VFExߡ³JdT=bH2`#7>"ak{?~л>;0y&6)!3)l09l:`9e̒
(FPyyX햅#`\/X˜pQ<cr9Ut(PZ=/2*PmC|zu;+lrJ'&I̩ZgTn$VlDt_$X'ڤEmۓJper7ujRzdYgg穾P3Qֵ]S<xm~y-EYMQqmID$;DXb?Q̒%Tx)	+pwBnL+e|j	m缴Z"-+d7 '3'0дHv[}tָ֞,fuDfĨbEi-k#tX99d*%a(Nyh'EFcmClgqzKFFwDEvwdžWB*x!6]4n5
fp4_$zlϻWLpOS]8Yђ@HuHHsxȰ`9fH5'f`hȓxE!q<7AϭDMZ㲵LJu_-LR.e:Gf|GC|Bgx_\
5-LObV/Q`bkTܣC%hxZw4	9p;Ґ}+4&2j96b)TX8}qG_k'+>NA&&t.C#I.^hz-;XO#v>c>N6nkRlrk}xg.+98=7Q;pa``4ݣARP.F}CycJO$]ㅾjQPpav:MaC/ao,lfʹ%?wHo,
ןDY\$o4(^U5"kUfJglYsVXV^R
x_md-;]:fֳ{l`^`h>jd~rgc"t^hXx@@!`CӘJ*䣃t'w9O~[=>*~fnsK;jZ|[=8t#42B/kd@su:pPQD-JSь6t7t䌞[_Ce!S
"gf(`*`Tݍ=.ne4.OH"Q(D'P\ЈhCFG	t}JaFK!k.<y'lba&6j`鬜:<GW

3)fhH1E3ZQN|:렻6о@&1FB
$T0tE,+`HcHdHA'S*z|,hgKwiRDXUNہyZNzx]F7FQLvtm^~1G
gsEo/vh.:Pń^$?sc4*b`*hw6zvk>:7ict5A=Ș0EƬ_lWXi?M12qJ$ވ:&$*eQyPEY+:긺(#~|G E	3N:8ͺ;8Oz@5!8&cǴ
|5;Gk:{nq#x9g8fӸ/<.ou[@1?s!p@3	if o^9-j
y;Rf5@nrv' tR/2}e_^S\?zqfLxÞ7$>hpANAF\2r6hjіI,[t;RZq3~.Ӿg\^3E&$ߑN_%|
,@`iRkCٽV@8y5l 9H:ff
(wĬMқ\?'?z
u:Lw~v{S?xJ;oe;5CB"/oSlKlYk3)Nd;9ut3{ܟ1N|ʸI/WIs	>@e@>AngkJXO]%i2Bӟ֯eǤ鎣2Մ!n	1!ktkk:K7J?(}\[0G}Eb=lAd<L0R׼?8/":<n($_A{w^f-q
^5^?e{z;B#Zh]>HQ@[!Mڮ{W{zn4yX)(6~;aj<ⵠ*+6EI>9?nj3qfK10$H 0<_^ꝉh4]\ܒ\w,_!5{omwrqqQ{/3=.iH}!徽jϾ&)id`Oˬc6'vMUE]sz=H٤[
<E!~鰆d[6AZr܅ngc<{r}Ŕa:߂XnNIv {ƫ=V*8P~$=Q4XhpybUw
he-/#{(ܺɞq
5~4&A~]ɭ	;˯
&h'ey^|[-ӃH7P\lқ(ݢJ]wr>ע/Kj{FܕXRgkܴ?ZWLdUE7pQ=’_DőEQoQ3C:~AW=
1%ޙhFIiV
V\-[SOxgWVS{zTg*|$1ZpqXqU_-khbOc/scs^r⦅sx!!n꽫QZM}y6Tvnj
Ҁ';#=T>)2U>(I*ي.Q$]qWVS4)u߀`_vP@cMjM給`:IkOk[
lZ
ϗΉ#j3I%iCibVvr/]$8)NI</Q%JTIcH4+T%	 CJ2D	6Ҹ{вlepimZuCԡ(U!%49,zfF!+M]MNk$'(Ro""Y2uN$~A	t6td)yvhfpyFOcVsTHvUDk
9dZj& )07!N.Dg\Dg YaL vGcZcq^f)vBqɉ&ʏuum5"*Np.J/MM)V'1RNl~T~PwF7#EyByΜ
b˱CK߫a+'t0n?F0ml?upJPaTd@B BB"$@Xª(.
UQPȠ(
n 
P
#Z*KMyONz;պTxl6yoqBi~W5+y;)-4,^h[E|fI)xҜ9?[bؔQ4u,̱,%4xPɄ۵LRτ6p{zS{aam_{swfUn\茝S/Tޓݧұ06Q
Aޞ8H&+hhqh2N8r(jr+lקVPt5smLa0UW&m0=g{6v1nX	϶ܫ{@4h:AVl{x(&njM]ds}[$^ؘ-װ24h*~6LgsPfuGQQР?8Pm(pI.Ov?֦K2+GOi3q㵠u3SO17i.U#굺ڈmDSV{?B{uWjN4$6
T^e@	PtˍRxˇzō΋%LC7j R˹~
훂#۷KuU2M{\~x%W]W(/`<*UԞDL(?
8|Z ֲaϞqڙ29בōXΏKQ(vl
h
Tt
Pt
$3,cܮ8_p(&'ϒ4ik~y)mP̲qifm9zbc7/r$Mk^V7x(\'7˞gr?sa#_jpFW6ܥª^9SRӻ|.	+Keexih:e<UGEw{Tifא27qO7|sۿF]gH2YϘ?Pz9Ը^'fei5Tz+@| V:0.dp_&Oa)>C5Cǝ/:	;/1n&K`ŏX4jFtM@-
aPBzVYaLYㅘk|kObX3ٱ~&6r6ȻOOG6ɠDW9i"ӽQEhƜ,0b*e9,'aՖS3c3{DQ4H0)ځPqE!
<Q=0i`
4LOt=.a.ʰ"aDCE4TQDU8cPf([
.Rn(ASxX9xGr09ACڗZ1Jj
֨IGբ8hJ*\'8(>M\'o<GQ`GB't>tb`8dLT;YR6*q~uF.J=QrNި?(KGyR$%zQQţGC10Vg်Qf@e;b/CxbQި$D*,,]彂w9zЧ[0OE-z
c	LZ`
c16\0j
#ڭaMzo0|?@uDЧj*[>*/x}P~|ݣ|ݥBY0<}c%	\*fS1wM\Htdrtqƽ7jCd	n]7{G}^kNtiD/5D/4Dj=|f~Rc5uԙqIDQ⊈ȾCHrsH };

#xZʴiZԱuZ>sx9||񐊵n.<o{`Z$kT":-~*?"Xu9"Z{JSķ䱓3_:'/:._;}N<G0d6,I{0t'FY!"	G2vw
oiv`w/FFJ?	W<*^Zty2~z}zm1Bk(BQrbmc1Iؿ]7<_ӗMNm"s7bDGr~~.Bx+lXˍ.A!c!z]k<H;!g(\-i8Hǚ3a֝;ڇSxK3a#^=.cvҁ9lnp]rj^:qjdhDaIKßO+q0=V<m!ڍ{}Jfk(s^(BgVӜTI8+q4^r9V~)B|T_}0~5MB	3%BS$a`
il8;2-̶Ľ8r՗roو
Q?z<cs˷Hy	*λ+ί=5Ghb\!cfH
1Hujc'BbU`9K|^=(5/XO9qˤ4t(zXh3KKNs-lϹj9BXͼDBeF.cA&+8z`x(Ֆ`AmcpSfr]I|Ul9$3dg8$n<zʷ&<c4A4qJGѢwHQ$r YɁ`4vּ;rB3,mxB鲒ɀ<r_,h[D s*yڴujmJ.L$[Լg</y%5/kNz1oQ<ԙJsp ~JfT񂊲W=q\N]]vcXJ=5|_U:l1ׄ{ќ4mM{JxQ$<`K8luJLOkC1Wak6kx!YCI}N:^⨕]J<|D(IF7*ʸLf|Jd<e
^S3R2Y	db`<)2kjcp~#߇7]N֢	]_B?TUo-8(x.r"''GZ-EY
@܉C4h.35]."Kl:|2\07=F;:m
ڮȃZu(9O!͗d)2eA:r.RS4>5YMAJ"KA	5
*#pL6#-pͶz7ӦJWn]Rc&S٥";H+,%pjHVJbe)Qa^b(,D y)|Z)qn3כX)a	zmVoRG,K)kȫvٕɎ|3LV&V%XU?@Uw(1ſ!1Ő(ZeW0Wi
x6}=A{a.'M6eKȞ&!>6!$.ݙ[+tOfUUFW#ȑWy{R"wypьÝs8>Zﵡ7"fi-hgMoKKiIuHl7Iz7QCi
n
\+k{'B>p6?7{qevCd]@?ߓv> eЛbw8Gv廝xw{S;|)W[E?r/~V迒g9jfjk`s@=aSN3w1_3"ܑН]QM^i@AH ,!!			 aȢѶNjkkGfܵ"hE
.qj3/s{{sfW/=4rl4:&eUԉU'br(PV_}P#>NW8,9u>K~i]ԅ܋/a坟ÝyDUD^Rj<hh.2A>NOD{Z\oO#"V7ЊwXN)iQOͿjr˹jʺZ\25/$7'6}&o 7}״Gm:i=ic l:;wP^Ս
Ϳ㌊|QMD[}fpNۊ<zǷ1tmk|cm_blԶݜǸv
?6OvwP;;ye*pALdRԩ3vΰOJuvuO*vt/v^^ٳK޳[s.=͐^cHzak=U>GhùwK[w@9(+JcԾ"_L+)qZ;@U=h̦E;ȇ#J$ëpKi
נZV7n7ˁp;8]~QBi8c>H7'""zBJ*'T"}kC]dR!EBXd/48pܑ~p֑
͎,xx5quoC('u"4c)d  $L.9t?$\0Q ‚̷C|n	Pݠ}f>g#Ѕf!8w

W(|!g5q
̤+$a.9N	)Br=H$$(H-@TPiwgpZwl!_t1 b
v{
cbh01dU!$Ą	Va8*Ĥ@=	>re(>/}K_2AR]`O!tZ
WR`HR~E$bP
ev0CKq'@7'
-r\>&@~aأ+{X>߀8rɀ7(qVH pIj*$&9f̙!vh7z+bMDbGd*FU'9oTת+-Πӧ<S@?IH䓐0)IO0M_=_3[|5略3h5gx/4x57xk}10=c ֟.)~HEnZ{4:ML5y$҇V'c0l{nj]^An}SwQDMЮ$M|[:A8n@,ҘHB>#/~|qĒ2U<}̷;u
3+ޣ&Op/Bh3Pxtp_t=ᙨ*рK_걺I& (NBQ(e(:\ Ź77ǽ#g={	U[Zm7SH!zʿE-!ƚ+ƛ9ji&"N}}	{o7sYRʳj)s\ΞMoBVkNŲZД!cR֐ȧ̻$VqSmDcYi@~<4VJ' s<0,bK%!dW"fŹbR~]ʀs>*SINf패';Q̨<Ѡ<qOy0jjo&`@9=	y>s,AeԽ"xBBZuh)MְBXRȶ[ȯ)\.<9q]QMi$((H*"@V,f5@	!LK@(h5x92NGǶsȇ߹~z}<gS*}.1UGf5L%w]H҇%MFÆo_{{bw2Nft)hcQho;;<57h~8fq|^BÓRq$M42Kcw3.Gt2";ImoI-#uL$9@@a}/}
(r9#'v<lYes$aL	NXk];]ЛYܕڑХMɍi)
Jr=!է#w"6ClR7%xxQ
<<rU`E)zLi,a>c)̓*u96Ϝ e^*3WuZM?YP2r}mobZfkVPa~RM|%Qz|Ǹ$~(ŵO%n
%ZnUSOPj8=G`ߡ_ҥhܟ)<fA%z)U#%ܫefeE䶉ò3.ҼMBZ P+ڰ¦9$P%+2-%&DqlZ`ߗ+	ks9l3k2"Z*?﯊"you@+a{6}jKKKbA*huE!j	iTo5&#YP>e~L`C&ZSXQr5\k޸qM>ʮSkMmeCJ)׻_V&	*W"5QXN<@>Bsoh\!B-"y3$0T`½z5:<̶ɖøPFm[ÉZUGJ>EMʪ|oHY8T*Wy-$W6Ec-sFF*"odRJ,48X`f:` -ؼbt̡Bpק{+y~š@~,6<_ɮdUL2dtt[Z?tBɐ!䭐\oJީr1p{@0uָ]r]Ky뀨1dzX]ksTu
BV&*)LU*CqP|Ce¬Aȿ!mpLp~Wyz{ô1){˻O9w&)HWԖu㕧4K3!i03"Y3JJTϑ+
r|ȭ^:OuW)
{hshF}p|f+<X?pe`{~䎆v™+m3bl뿈-b}Fqջ,v\DG<e
ݠVLMR1N;';g\GR*J=;շzlNhИӋ>iZ@՜#H1\%wc홗.:3.f$p㦥NNzj5y˟>?}?Oq$6nfDgpGp
=I=@+B;D7xxK>ؼ04+6g|`rŁfڵCk3eO=IW_zFοC#fwv~Qir
os+ k cLV-&۞˲?f`;Dx;ejgA'зhv	7|fkg/]	zٿկ{x`),@
[ߙ@C8`64f1ƳGm4c5ȵ4W+jv8NZ] _;<Bvm5ߍ=Z4h=/pf'ZñNG1gD,YIfl|ˠrZ6k?:jJ8I%@Xe		A
AvdqڣcRBQ,r V+]Zƥ֭+&g.gA8;~p+Y',YUGG;}-mhCc3X
$r+ϓ~CA!^	`Z;e0RuM]Z;.N{`x֓l1V3]ޞf:me:{tc:?p`#q`=m@`@1(ȆdXM?Sni#q4Tڤ?̣~\C~ǰCKldx:NqM}0) dh:=`*)[BYbe(̰Bfi&xh".SߢM>{zLpA8"4```"pP,RFC`
l¥zb'&jA'^R
4TxPQHG</chm6F&Vjr
l&e
#n#D
eSNCCC@:*"=S,kP%;LQRBlt$js_%nsFΐـ޻9sG^x<RH?1YL)ބ/A}uWW赍ElkUGɷԛΘ]2k/69h72!KXߙB51UHC'OcqJ:2STeoG?}?(s!E
oPq7hW4^#^5πZ>WSo<UuxOP@aY%3H}$31pŬfS6pO//XQUU]SN9+U!ÿXoզB~hwS8eoKFuhrQ0=92~	ZҬvN+a|j12ua:vYA]+vգ8tl8ַ$}"֎x
lg齍bvEf?$t5=+~[V?>-Tj}'润
MuyVMg/hF5DӠDdEa0$L!g*Si=j0DG3t9G.ߌzFZd-tm%mӅZ!?9rNGؠq;EQ=QGNZ(M4LfΙIJz{zX[3ح	ټkqyVcW\YgCSǟ"8(s9~P~Tx>좸6xx!IM8JEo`iǒ7g`Yûl;x
ʩg[at5#}!UgєPp6i
6-)>$VG7yTE_UF?UcP=LxI	ds0<Z@{-ΑR.¸j8]ECF.-D
ǣ_:N N&!Ƚ2~"RVws܏^ZqO%(ߓok"!dc@13E4wкXD]c[lظ ]lq|,úՙ3
\+ֹM.}7מEIRN+g^3?*I1ބS8Ä́!9&1<&_b7r2Wi1_ì͍dIUTfgT6k^QIɷ<^3{{j϶:-畅w_u+7nJG騘=C<R}ZVry^).jpdI*/Wy`vs-q-[ 5gdBV.YMY2O(g6yK.omZ>a"^.#NzK\
g8@U+beV%y:Ewn_Bu.Ϩ<PD H)#LQA,"tІFpF  RD *1XQp]f%'nf=G}s=WR*x-^nAIܐ84wQSQQ;aQP_B61xCTT0^,p̕_-]Qךnܔm^`UfWH+v)OmRIޒ)ܤ޹oEDBLH$oA26.98]pfnt.*[;hQ]&8+e6lDzBY[Q+HouSEg|2R>H{-H#BK&E20\ߖpQ)qXt)*+4W֕V"ҭ&ۖg:J$\IN^vNWFv -h[i	Q^R"<Lny3:dpR
讶gګ<9;ΩWҩ.1P7b,e%6EyRsN-PVP_wH \DM/!BKH,SC!pYW#4{
ԲѻKuL.wvCzMu2X_`,۱٢"Z=>K0T꺭bQ#U+,-}).$)"
&{d1pq5k7٨&+46r5
j:^q:(X̝),dEK9wkE5/snAph}OQQQF_,Õ2ڃJwfm4Յlț5{V5d7DbRd+>6)uSu墈&ކ.uCq~hН)
Sxgz7.^܃ZZi>5Pt:2e^iRuI*Knm7rKs=M2
JnHC{p OpCpC:=zW?
-4
]@e*{磤ϖ)sg.VY97[pp֮(f):v!;ikw۪n{B.^R=lRMPzA]H-u̕IrbVύ>u4BcuGLBd.XPWvﰢqy7N}7{;s&9:t}C@HĶQc$:2%@`u#BF6_s*ppqp5~'[-<l{底V"6>LjL.7h2h1=D[!b܍Y?.b/Qߪr<E,g޲}߱*>#icؤ#7&s,17]Կ+_6dǁ\DU#c$&3+Y+&lU}'|2爦4SJM&-m):S]{ýqwx+}P2
d.W)6ncmm,m
<xF0YwbX;)l\nNՅT_xj~4g&}t˨?-_
gZZ|hC+?r'J8?3NO3Og,grFlLP͞d={?6u@GS&=`\^Ws8j\`֯?,^ٛPb&2rMއּ#,߯PSb PNP}$}-o8>ib191	qBG|KV@E1aɂ:3jQ!9N,vP>'Sߨ־XԤN]O}&gI}D]\wa%	R)i~=>BO͂82ٙ!.g.CX~خe6JlQ*\iTS@H.!y`b
FdA@A
4aJ"cD'(
(
Pϱ+߱}`:{uI,c`#ց]{I|OdE?Xc{<
8b¯37*535.ClU4-B8۰::paQpڱX'v1e|2F9#a[ lA{̷Sɥ,s0\;
"_
h@	|9
fрW2:pb5a|'&Gq	b{̽D|^'Fa7BMhXt'=o) <<yb*œ 
ph¬$8*u&#@~'8="heN27n{ssr79zJ´'$c}$M63
oqy-p1qևo3go7jq|\|T©Ig΀S93~V3^i;N0	~.܍,+w{>u[c}[kk*tΫf=btS|lùdߟ{#׻-~C<fx]Fb0Y&]Sc:O82x!o#%0<ӵ{=tf_aon=nֿ4.]:\7ٵר%O`vagz9CC˅yK}4z~a%3*uo׽Km44èӳ<Nǯ<l1u
½X.P\GH41=wNvcY$ϺD_mر_|kO6Xli:suO!N/pm>;P,IF/
Pݓ-;j13":wjY<㶠UǗ3k]RaXmu8`~Vg	xk;`bƮ@jƹ7GhPXCt3bR/IF?mo
)M̚C-oڷfopm}P]];Nrk~-*x5x[w@;M4V;AݓLu%١I2Z{| *
=~stQtU]xΰmwUoͭ
im	io)CC?€1fNKh(h?/2*I[tԝF6\DiKulI#eY=FuRimbGtUd5g
v*gTD#"	G'F"K#k"?JA0M@iBSpUhtdXLҒ>_YؗڝW(5ܞdZnQcU!-[j!.z5{%-dp_jI:Pw1 d_hwWеL*D:臕fJ>Y)hץ(Sc+e&Ir2j}S_l_W-TC|)<i(WD;dnP=wp3+)#NX1:ǣ4؝NߡgVe70(WęfZ'qՉ[y:AvBPpR%Lx$ʔ
;fʾ3e@b gxqR"tg3V@GU;{TriU17eO+SFN_%5.H4+JOT(vZ2#ecZrH9K,y[<eB(ORɾD!DsgW|*7Ukh*[sZvmRho,X6/\8'ƨ0;L[e)m3UvYk|Ez 519(Qqy,F6.LLaRûW2CBW߮8{\MA
lm+R7ϧ-"VC*Q~AiN^27:#'V]M]Y>3I]':&ͺ(f^zLd/.<s?=|ƸĽ3bf0FQPI.]))B[(%]ەnvDmvT[UJ:꼴5|{yL2,9l#(J@r=,u!SMӣW/I[`IRbW8[]9'yjsɭIO\g&
D'g|IPQ
<'*;o$.gn A҆0efYsDYg.en
7'];<zm"*L5=9"Kx55[TL%ʡ:3a9E<'q9&5x>XBVJ/)y+nd)˼hYh=w2٬
)vQ,yvi%)YaYYWCoadbτd`Π6AfҊ`u؋M,hSbE	nU/*H,X%%.ls>abAǐSN7=pw
%!9kųx)-vbE8{`u,=
*̃/ŖŔ	fL7=[+"|WhW+BwK',:}mDss^R(shRX\)wPCTffU*'EL;mV1$bل-mWC_^!S~\[~	uI}q-vP߻`G)@N9@ΡKհSk
km N3<:fjm0ormڹ55K֤Uk|YxWWENѨQ?<D:{P__a~~C88,~֋ ^
n0
n7Ldcubu}
F#5v`o7֜~av	"Df/8`~vkOXt`n=:σFh
;i@ʻ)j=0MeyyKs;tGOLOt#'G0o|m@
=@fG|rG<a5Spoܮk@}\[u"AC9XD9XE9EC/gPm{1mi%P_9z `w!?:.]ۅK_`
d@pt`u/r)Qw	ey2;e2N4_r`y̿|`
4	X`X
zE?g`l<<BbbLW@W}u݈~c~q6D
`t6Lދ?p`A@x@!YNd209aӱV[jvlI7ƄC1<3<1qHܑ
B_
|ozr3^AkDC+_C(b9&41[Ba
Bh;ڍJTFѷt ~gFWf4^MxpXD&drQ!ډ~tբG9惨2{+Sx~*&LzĄ7q(9w.qE&&vhbOrmf>Jw0%wrf@Rɼe%ǘג3Ly)<v2OCݗ?ET6@\$+^ZFRُ"ʉ4qADf@ye2\+d^r}grG^NGv{[v9MN	_Wֈ(Ykt@#q?4witBjӫLc(#e>P@w_wOqץu*N:ڕyw[6~_U%1/;{xb ؅>K=c.Ul&׮VsǭX[-uMu^uY~%U4uyqx"*ʡvlC5ިxxŃJs`Vm\clTf3iwNl׶ݴMnc3w<>]لmqN
`TRiyFxs.q|r۵yyo띭}w8>9|nrolʖҵ-ˤe=UΧ䋜o)`"&#3<#“QZ2\b$D+	mk	ݾKvxr~Kqf(/]p6Q43`	(;e/r*<EŸyûq[Ljfa9
W})j&-Z)=gGN%<4IK:4t!x&i5XÐ䧡GH\ȑ5)XKX7`\wr>x>	].K<^9e>gx:,fٌM`tWDL+p`_+ǐ5|U"wxP
w`EĄ+͸EQ"\!dAל8#P܆Vk=!㼽ay4gTh֩ȑtG] ;z6&
,}sQD%IV%~pYJFii~Nu?V,'ZBsS`	9}yt{\T_b޼1zDw5Q]_Z|#x~sKn)$U9	48U*婄\C"⁒RX?"ZB=zOᨮFgyfG*˒V{3f{OBlMz4eεFO>pZ`JUD/y:Ľr	y̿_
#
C{-4k-C<LƣDYV,me*ƘcA@p/Uޫ8[	Z*LnƍW&*2<jπJL+SzrCpgiC&lDIV4NcS+}U+Ř`*ʿGpp0nnLmXaz4E
S
tA*chsY3ͤlPأ1F( ?_ߏɿRR`,?>F(^ԽfjppQ0f|7\^a3d{wUҕiM
դ	0ь]}QNbWT.ŪUV^+1\"h:еg=Փp>j
-b oЫ*CH׵Gh(M<Rifc
;JͿJ
ZS/}tZE3rϠ7.g&)7x9nz67ME:
ԅijZ#ʫe!BUc%g{
cɪ0zO2FZ`mg}-ԚВcl. $,Ҥ
V7ֆ54뭑hIf[d\)2D>Acj1:QLtwxBOg tZf݈kVߙ^b]jP!SXIsGN/l7O3y|-0?a	LYB6b>@p-3(.7RFvsնD7ó2?YWyĪw6vXhŽ]ٖeɳ<fdnâ_'tΣϡ6g]H<@Am8`[`r K_#闐2Jm.ƳDdڎFrmo#=_ӻwarZV4hÃ!ƽ{n,4N&;7mx3P2!x}r߼_Hf*p’Ohh?'c6:hPQqCP@H~Ů7pEr]AQgw/v]]@VPXYa9[11dZjh5DQpXa=c*Q^[Q1zib|fvyzMMΖ̓'|LY^i~b6]TVCdaLjZr1")b|DxƯP3i(,`e.(Gmo
m1hfZ<f	4K8jeɖ)Be82WkIN*Zd]\YN^EZzBAjr.x}5A~J(?wj6󁥅ԋ)RJ%\Ab+ʽWX,ښYBu(̺@b]&	Z7w[l[~s6~eqCq%\{WGh(?#ƾ#@j%W+^CXh`BmkM@`4au_"[S~hl>јJgg]ȳfPQ%L^`}a`aQ PD0÷Q	)Fal7Ls:q&3sޜ0e
\[%%I8ù	s>pٴi
]ʞQK
@	?IoUWp㠻6DC{=7ff:47BsP	u~ڪ`v? lo>mnVGA	'&:n1ߒBӡCU(|YO"$=3!Q2
@ׄBz=HfX0IF)_u@wPlP( PC2hM?	tB"A
kSRsӚEs@a=2`8Ȩl3q}JCHb >$L$)^>8qZt^wK-uD'3Ÿ2q'vABpaRNH^ɛB~CXHPCnnDOZu	T52^HF"$W셺=W3uЯGn<PWYgkJH܉gswq2m`/t_glHj؀6km1{`5F
uu݁\?mp/#8{QciMƘ&3Փ>j6{ΆF.f#W'~#{;֫e=֥?:CןdNvå_…VW.D.rah+i	8Jc=a}Xa2bak7lcwݿfwܳm<vnJ5Cpj(Z<N{r)O.iQICفмyɄGQ9o:kYn,g׌keBKqp޸[Oc謱@l<,:m5čfI߇:W_nsg|DAJPx8ሡ1#8mAqwعBipƴRdZ+jL|2`DN{$
{EڀRiM1FYjz(3qeώÃm)_
%#mE9=
#BdZ"SىBCBQ}ĵaT(.tې]6!Y|yy!EiH$AYrIy0۶(0NPW{I'Ij\脳1h
	66M8I+'.G^V'MCmʃ[9WUh.RDk-v{?j7$
<Q>ЗH=_2p5YIr4'jqbjQ<UL*%''9@fȦ0n n2?ۼ/T{cvdjb3c{b1taG,wlx0O~g4JCSG(&	ii)sS߷;e<'y2kJUfZCu5}qKo\ZH! @‘+9T]īu{tm׵ٱ?>3o7>xDxG#G퍼y13K~{ԷofÆ_$TT.nTwR7\v43g7p$I42w7yY<=Aߎ~m1[b~(h-hHh\`%li<?"ﻝAtWΰ)83Aq^aQYpZӀ4ۥWsN)LjK$4%Ygu	煵Dğ	|1SPk_yd`ZT[0VFr2zeN
K<׭EhJ3y5YxS}k]|tDP%VHEfuIcQؘo1}c%殺9Us0clƐfӧveٷ͙.J[}FG]z%WPt!A|BT*˗$S^X`EаtP7)r>0Ocm@o6Sm9`ߨIvV8ת\+Urg̬-l/VʣBYNxBKdń3_ܣگ逋"`~ǸCBGGAӢñG%8XrӜ+wcNg3de7}|aQ$G}%@~HJQbB'Ry"es8Ba+z|tٰ֠iEU9H.%:!_YW˫mks{H=%Qi/dj )Բb-in({HWFG'5ԗ25e;8a\sI}iqp)2t|b
~VA `T;!V.J亻r'?$
K߱!u="!<Jйd&7|#*ʷ1Pn9^oJt,0ɜ*WmYGv+SK/iOER=K>{KsH_[p"$bP[*(	bݜB~xmuSv%2MYY^aS̃$0(8qKQ[Q&']%3ZZ:WtCY?֠ȺYwrpnvC}V}^8vw֕z&Vk}j15,(-aW¨/U	V]uTz>+C4-(lA~*h7#};jdEqmim2Gi9%5\y볿_x,?:_/aa
ճ`>GSʹ-]=m]]@^7^/dٿA0Xnb>/!W[cv幷%ޮB:B:㦉fz~t.tV.=Q7![@$oGx(3͉OF"Ʋ9u5ctmim##?r>o<Y,Q}hPv	ec@¤b=%F:ފ]	gBgb=3)ΙmU?nqxkzq	7/ޜS'Xc@
v>ʵ	 sH:D&u9_[sc>oχ`|mq2oTh3q6٬܍~Ivl?ᮝn9~Wc2	Ng9ឋ@e.,x piq6.a]xj_Ǻ%,e%V/YUKʥ#LyFr6#Y,/<爯1E#T{'trcIICm׀759`w
ﮃ^ł_9}PV)x=χ_u1>FH}oM+@lzx> չleD((`W%	1`A,H@Dņ(<	C-O1D!ODQDĂg0;=;{9F9PY0s C Yҿ#DHNb:D X
ACFr<(g3J,Z=X=OZ8`]h%+"6!j&;@:5ͣ1n@hm
}k7jGK(]48Zw }0`W.e@~5Gn+jM	:kRsG?:=@ON}DoG=b{}`]$7bu)bѽ5t?+f
5(F?C?b>`hUŗ`RwŮ`0o4H%$"H>)kxCxjth(m0k0QLɼLDcOWI%KrW߀|ExNyn@߅BV5ջ<RM)OHDɿ#3Z>]x)[,<:t6ᑬt7J+&BZ7pC]h2ehTsE9塡|(T7Tj
:U3PŸ@7QMVen)wr{q]yMWՌCkp^øZsƝ{=fKm`f9/c<Bwm"nh6
MehԮZ\n%6\Ԗ^,4jpWEwϰ~f`}`v`*j
|vCu!^+9[Z貸iz;U۔qmٜz_۶l_*m`_&ۇ	+>)QDyP+Kz?'\z?#qnU듸c>;sC
V}ҮBܾUXfLXD%L3lw`φ1H6G[g\qǜqy,wy"y_sW8-q;-v\#,s:Jvv:;9:wlqfLm|N:h{uA!8bnqm*
[u_epKؐ**2,m7֛l1l5)0.7TJ6W\:dk\^V2Yg`(vF#9.	%
}#cwJFscS[ŋ6-X f%YZ=_ڽXU9

֥t'+mZ#PM88>(cEV~O8qT oDѺk6+Y"ʐ-ʑg{fzmS,maeye//L:}?>4sЬD}>͟Po
;`k@xry`A1Zѓ٣L2eit,ET-RBg}[~=h(1:ӑ (X2
d3lj2|/N&II?Wbиlqr1_5׸S3Xe<e<&R}p˴Sh`o[tơ \Xad{q¿
F/
$Y'MN'-P	J7Jܠ<>jf<.iSGCp"
80(ٯ[u^ȉ̘AȈҢ}QXqR9Ӥ'SE]|j)ǻMk"-&1sT?pjPEq췍Ҽ3NZ,ҿqBj;(v<.@0wlpvL8!f)xy\ԨLȵ"uyGEuqwgfd`.誈i*e60URUZb2XYK(nQ@M\)GO-hknQ999s{}b<31=uO\u]D1D[~:s[<ס='ˍykP0e	P0I(HҜy2s&3.N#56CiuXShvNޠGGp>36o_kE
QY|7jdYc?4bIQ4I\tl-4
6)1D")!ΐc/T+b۵\z/NFŋ~>\3T`'ٔuy%&G,5E^rR!+ea򗤚a6IѶE	
$}LR¤r'Vaܦ	7w	3wY`%Rf5Q|'&`_ԥ<JҀtf9c(23=9Y0eJ2J
e(۸xyLZri+ubQӆ|
NNl
1ԄDuh;Zle鵚.fI?9YJ,6k=QX%rfْitvMTvm٨7ʵ*U/^x=̣9ߐ{_: ]t~Y]%9@!yF%Hw#v]/I#
da6KRAKrP5+w/onw/~9;N1\,k+x\BҖIU+ҡ*@dd!G_ 	-'
.KmJmgd)W)/0hʻ09.^\Tfzor
63eBRL/c߱P"RU1j$B' [)TIfWKfVH2Li)&WTzU"g^?)VZ!{-w}u<,3[_
D=
]c'ŜaU灙uW9uu:ɴɔT\6kkl=k4=j"k)<V
UxAJ
GRRНLwL
{MV{تVOLL$,h	[bO"bIFYVIGZ,&̭mS6nطӻmXk2-\>;I
2ۭ^8cGbt8Nşi
kܭza5_b[7W`=.Z
׆]4T[]Mo:`+@.
Lp? f'iA̓08	׃S
{t{Ȁ>-fn)Eϖ:4@ro9tXr0y	TO&`R3`Q19*hZ]nusp2NmU{0C{2OAy
vP7A%PJ^uqW}@w&cN7sG80u
p>-*ka{l(H/xArA$upup}DwPA;6yDt3=S-iw8O.ձ]#Zr_`HD)PY^K:_KFn )kp9}5O=G; pKŦ@
؋+p
By:xy<KId;B$gcM|W
"sO^-/r#mPAaNkɳ!1/Y$^b]LzWs70"DKBII&YUx5xx-
{?|3<E<:q>DM?} :[KWO21F.~EG+#<C-]c젫Ojǘ370uw͑nѥ7硅m!ʦ0/3n4YJdLZGfvѵf}7"ٹ(.KD|;	LyTSgƟ{$$7n#VjFzXl$&	@v(nR(.ԵxlqL;TtZyOw{?=#r
O4~%<JLRj|%cI=r
ׂ&|\]8p%'.W.+\E0TICQm@0x|ͧ	G|>ɗKq_po-~#nT]:˪^nb
8K!N>C<O}'iǠd[[k;ϯEf\	wNrgũ!p/394L`""}*/@%Spk6\KÍ8†NQp:
jp2`9Nű	yy9t>`:G}vm(/cH?5'Ip?P;2z4.c:	'i8ڍVW0.bfzWt[=h/
n{h˸_E	zyɓTb5O7?OEOHhq`tDg)`Cʘ!]Zv{*vkphsѦŭ!CΉׇ7OZ4gI{Y*w}?A/zPg&2S:QhMP3}:5<@SnT6hZ4uuqUҠ%YVkNq+5WSHOQZ*HyYITꩤމ&8biޡ'H}1
"'b{d86Gji`6D3-vv]m/
%^^%^DR[-&
+[v\^'_H {BWG7&3ҿ| )-F{lM16ͱhIbƤ2l}C<@,L\5G$jW3NpZzfyմyQG}*.*D=P̎NQ-xyO|JOi:D'mxZѬSQ7uOgx$>[TujZ*W+F^kSRΌUighUjPyj9n/L]ns!I!X2)!K	CmJ,S,HNe'e%9ĕىeܬJiybLR^[(TĻ|~$A&\9 4{IF ǪXnZ㻨1b12h![\npI%\BZ_ +/7+)ەN}?&zAI(^s?dN~7_mSJ<ñ TMAeZ$Sa2s
[jfKS\q7K]*Ӵ'Ԥ1n},)F??2	J/W<hH]S۳5i禋P13߃'#e1LIF"[nd3DӒ/ɵIs,sevKOAaMgu-K\'Qn4A۴؁&W)6s`VۘҬPeE1Y	f`lÖ-\l[)gΑeZ[(ҬxsUddʔ3)Bu̙KP\K|gv9~(uDc<
r5pF2y-pvY尉9ybΒS!3,F{`ۏR엉*'^-(_ar<?E>袙h!kS.s(N9]Q;yIq#IlĦ3Ein8U(1<RZ\ܠHt)uΣ|Q\A8/H4Kis>}
$pGn?cUk(b,%	J,v-I..	Eu݊#ʘOʘA'GHotE,9g0@X<ah`D2O
1IHqK%q\LRi.(+لafaQA׺<T5ڨEA	EEqA&.TD0j]S4VmXZc4DM'>3}9ݓT84ɬOOZqIP/y_,*ʷ8o{PzN-gߑn1>c	ӧ#%	iJ-,KRĦwIp^4;D!:gk{Re܋$$ӻ0
Lg6)C8cl7FgaTV?xB\,Il|ଥҨղYeY&rM"<'"*WB[+XIYIoR٢M^s=\wD\C5`0D"83ƹBqfL7JHCvKCviH#iȆe!Ԧ.e.I
^	̦{~F`8[֘B99c@"u(AxI$%_2JF_Tf!شzS۴Ne*Kv
PrQ?
_H
\
lad5i!݉tOR r+ZJWޕeE9X	0e,sòb 3КB[m(xuQ!b#IY}XLa[8l5N
/xF6#n7LŖ-lڶ*	joAe}u͏Dt##s*g16Jҿ<	pnPBUNP6t>2 kgBCfQttR@Z|01O'06 z? 
'Q@86!=Õx-~	0h兠V>xڸ\[
9/G0+"<5`#Ha 8iAu#y㼖➼ŜG;/"WX_B_-'{9ȍN2I{F(;޾^S@y\|N u'^5Mw6'݁t$jV; .={\\ry=f
0^-z~I8m|E&w͜<P]Gc;==>>ɤDtح;DM"P2$ydIOKexJ<Eߢ'xxx7w3Q
Q	Q;@b C2ӹtqL<z<LtmB.z8Sv'n79FBtqvp(\GBHI{-cG">Vғ;؀DW!-tUU񭸆2Gq?"G@ο\!/"o™89iͦ=zГQ3pkMrpqUFjFgъSm$3‘O"%Cpb.đh8!x ܒNuY"o$[TY:Sf*/G|6Eр&E:=؝~@JDd j|<\5x]7\uK18
Ψ)<Gzi8^&͇8و#"َ֔F8|\ڱln/`uQ.b>ؐ<޷=||E>86pc<yLaٰ{
P=q@
ا{&ؼ*`n:T{7aET܁ŧPEy"r]Yt.:ଗ+Z|pG{(M^Dޅ=/F2vlTb{@,eByaP;+~#	APD
@d!XjY?e=)P ƞ>QgvǡJ?
`>eTNXI(ћ`Pl67HCNI6ܒCHrCEIίx̲\fimc?p}a2lEa$&4lLY(6COBao/}\)A55J.{]8..]nr[ۊ(%*XԱmSӦi3δv!mӴt2M3Mil/2f9ߞ>f&mJ`OfO-'_Ʌɍˍ
"ܱj}6p/{Vp\qz܊5)hF+"	ӚjLjIMs"fÙ!v43gNsCܠ"\4wYSe}~@DPCܦ+;t/m"hUc*7'sMέdFNfXa젶
i{~0ק=hgnK.UEg_		yyBrpeCmnNSgcDǐނA}ۘ~#ۥ悺\noӝQ	~+BY_٤+Ш>BIN1@QD,60aL@ش
æ4g"dGٌt*t<lm5vr~c?lS4#BEk7~A|3GYg*=1aV4(Pg|(1Zc$ך#V-V:V"1i&Khi|^pD)ܖrYUcEE*ߘ7tY.,B~&EǡO܄nq':Td! "I,aJ+:z[kc
xJpsjqYeoğTsTM
ܧ9:ި@WYL1Q[`KR,eQʃO2^*br%ZuJ͜C
QE4!ҬB*#Io"IQeyCUQjy9FzK"	hQ~^Y
|n0jelcek9Y+E<.g( ތ)#ʟʨrʨϨHXt<SO?M@Su<՛˞G69J!3cm\aE`د
?&#>UVG5U~B$Zʜ5!M^Z{&Mpݵ6W&dw*&]g]]
+"\F5uWep2CiJi
zE{RpqbS#uEuSnCw}jwςb_c٘B5Y3xwZ.	
וywy_sjJ`&FOy]7Gif-PO՟
f"1j=d\?_T䴼n"[n~i~-J#0GLQ;;ZPŽ0wn)j2@eE~W9tYV2s܁wyu65WGyu7HJxZ)st~P@1лoA^nhRqp@P>CfdJ	U!#:¤zq65<o`M>qMMKr)=kJu.ӞF D5-ʞ[
d!st#2ƶc8ia=R|+,a_؉pH0ç]M&)|II74eָLZqhcq=dLO ej=N'$$O`fbI"qH+FB3sH\3oFH28O1p#Mύ!Z-v87	dRLL=e\,'`f<)H\8شhlX|s/#~qxqo n=<9) Ch_$uh
ПfIH^6]p)	D"\ށX"vŌu+XEJʕA|-p~I|gėPG@pS%gi9i%ҿL/וP1M}SQQB_CRJSNhHER
!|dB29>eȲZfǚ550żmw\]繟њ@ҚCeSeSE؈xxu`ED994|Cݬ`@c\	0^_o
!(`$'NRp>ٜ69mV<Z[9ɭu;yr)ɘ+ƫf0jRӢ	P676
}@R;Nl_lL:X;:8u'F7yۀ܋ouQ`=
PSy
*_6XAEl<sDw'L7;0x0ZSלV/R"ȭN'w97?=G3sǼBOٌ<݋*%_꺑aуBFqd$$o+%9V)6	*5	Gp-'.o
Y]>C+"/NyYG(2ꬢ:lΧq&9[<`_Gz)s	1'#`uQ/Z)ʤN`uSJY1ks4r.f~/Ȣ!ӝ7:WGP3ٌV"uC.b,lN%3_gpqoZ躙Y<8I + ᧾dJQϟ0ԊhI>K\P\͜E140M\ts:k42JC斒e.F`
J.$A"gѦV84%^:e^.R/NZ*4؉zzuuawc3vE= 2,wwȍ>6^X㴱;MI(M"pX2
ʏqPze6>WNbOr۱t?63/QmvU揱-xN,+?
bIaJ.l?=*q|]?o쵘ݖѨ)nyfQ%*W`U56YQ1
^GXmnzxj3%Gyg{GFhh:!m3;m}PcjQevlMv`7v9Xgka}9VoE{X^nA+'C%bY(zԿ=}bi}z556t38zc?*ð1ӱ#9JYXR<,u*BSP<ldXP8^($,'!JuYЅ,t`GH7PK/W\~]ݱ+\PQ!-n(p/,t+J\uBja:1{\b{B!x_P>ۓ
C%(Cg(
<'bg$<c뙈TaW'dy^kJqq):2wNo/y̔3'+G`3NX4y*,PbJl$UE!SUJfr41EU&&6KI>LCRimE/R.aǜ|+W㬰@=ծL?2ԡHWO,TcNiB:[H+~vHZENһ\b͡\l{Jza|7[ +Θ_!90IB|B\`/.>\/E(TL:<&JAigV29Rz)d>rIv!cv
RC⎙!c1#	!aؐHĄ
ѡIBTh0=4W-mSL
'-kzaRYA#[]dK3f	H0$h\FFhM04ᘮiBdx0%|09<G/>_#M273(Bj+7&
"0#2L*8y2T2E$\Ct2_ۮfFmo^R=|yߔ-}ԋRR-)>Ϝ"3*{$efEim4%wW^zQM		ʶ&fPndXVL#1Z[W,2Z2cI>&6j!<@<MsL).gf2˞U9Y,[2m#e%)ݖd;ӍbSRה<&{ytv%!>ۖh!Y>q4M`,e,x	9*#fT{RclO8MI<ceq1QJsc9q8o20~(P8P
0=}6Oּ@uRʤJΏԸ(%Xg85ڙQNF:YFsi\oq2u1G;ϙ4<tH|yZƀ2X`*˝D&<5@Sk촮]S
kdAFF(ޕ8Wr뚬Woq]U(N !8cTp4hw3EM}~Z-謄%P3 2OEQ)aFR\a)b4=L
qn'i{K~5F_v~ψ,nDgj	7UOl3CW(%
LmxI
.骨y=5p^
7D=IT_OxLSoExYj#ܳN%
Fx	@!'=o4hk)z/Žs@Q
&+kSwoے겤Rz_PwB'BJ+tO
}g4	g怋p"h'23YR)̬gXyKyTh TĪshuL#XRyj_Y
ܣ7X񱂞i̧i>E,%eF+amڭku!u
j[5Vm8պʭVU_Z-mߺC[[7䷦A-Vsy\۾HJ1eRl4^kЯBnfsnԢ:D~aj^)K`eổf+]M"ˁ샓4(-wZ^;ir)	㞓nwF[Zi&sMk.:⽏B8jijpkxju-HN~spRb]05g9#э܆AV
xE{M\0pvƎ4Gh
1.::6zIù:bQG,
r/ֱ>[#>AVG%h8ٜh[mӝihml҉GccPϡ_ONIt=.9_9%tzuR glf13] &;Jw>%}iBPWf2PWIU̫8rf`Db405nt;xZj~yl	ҧp>HKo[ȝkrf>7vߐ@a5쇃L 
B,$B&'fѿHi5\Buz}M=żtC:~5V)@C(M44sћ4棱XׯuSDg-:XsE]>c}X+]`F>/jh
 <t
b4o񉖑
R
*ߨ9z˓x6*&|ޚXoC1Hw*>M@'_\h(Ac{)ezO<z߬M7tT~kaG)3͉sv0X\ 穋cgh<<Sot8DN*~DF4cQl/[~n(10dtŁSXy:n]W%,W-5ZCNv]zI;bfV
U[f>=lK59cnE鄩zj>^TPnBHȅ@B.@!B-	!"BAQDTRuκεgzvvnݥ]9o|=y2|k1;nmmW׆p%f.Ōb^pe^wqbpGX}qQ,<s<N>MB!R}[;q+67Dĕ8.n0np̆vr|'p"~b!MX‘8p1Slӛ+,ejwѽW6\ڔsxiXJ$+܂d'wc.#2-޺[b_77
I}O0vG1QݟP{WH{1jm<OYΤdKBF3׈nNLq=${219ؕ5Ѭel{mc}~a ;_QDHB`,uml.^`**08ߎ1~Fw"Pn;r`  λPm
~(zBEtI2St,RCہ5ΏǤ 9UPQ#JChB7> }=]8c,Pxub'k&j~GIF(}Ls1.è(	Qv0 .E!qbz]BgNtW2)ZXKM於C~ʚ%X$|@5敏)pS=e勔Ǡd#$Jr#K*C@ZԂvenx:)-f$sSk48?&"fE9OO5_{Hcq2Kc^2F9)_<Ay)(ѡ]QVE9*(Mp+Фtl
;|Us^lcQQfU=|ƌsdL3NY)GQF@:,xphRRW€
WzPW	[jƙEsjN1Ǩ}|H@1jO'Pݛz49D&N7@9z_ЦG	t|4jJQU*;,:7:?L>fԏ/1*Go6Gg!=GrO4\Q|̒մoѽ =?eiѬ_>
Tx
`5\@mj#5uiBuc:NVefZq1^Tr*L#NKT֬`o+&&uh<͔zS<l-0`͇VZ
VTYZڠaj~,r%(? (-I)QVNZ/#dDHSfZse58mQmˀƇ:	4u*TPQ_u*.(C'̾~IOLZeҺ(+#h!sd7$]CA]m4jH!<rܩҩiU
k	Vgb9&rJG~Dο33čOݰ'ɋdIirP}ɍN@ݳ9*w<d[2!kERJV.>y(CCxIe_3LVe(%dtSV@uʹ[hUIѶ
X6#
D(ЯvB	/
?02xmY/sd?q5iݧg&#?E^`!!	rB*dlnFf2SH/!-|H	}z+NRi2Bz'6@m W7Dd;<GDHȐDJĄ$#iGb"6F\yTd"\\T.j:ZS:* +\\REG'rIsL:Fsq<z:p{-{\-2=3LVáhG5֢]2PŀYO~+y8u<
e*{a
#Z~/c`˹hfɱL52}'2|#ÜLyV-J!
wdbR,)r'?WXXb''-&%PKG[̲ZZF%Y65'Rvv̒+4ĻxBMJ̐&l.@藢cl+eS0w/qƪxhU4j:qj>灼i06@0{]1K%5edX+aXo/m` ƣP;612@:Xvp
{KO"ޣbrϯ.˥*4q~d%dԳճ|$$;G؍=g~Iރs{Ecpnk*>'͓|]%5!qw4V
BB%}lN:PBp$aIvg9s~DD$<Ɂ'=Q%_BfjDd{=YpN')|FLN3,19%]`aB.(}INPWʤ8xd8Du:1>J;돟Ч[opp	p&t;1({@}>np/p_b?'v5Q5M+[4[Rjcr}Ǯ{GﱷEsS{^
=9כ	`.AFhC+qrCH_i!eWk2[EB ;ɳtUvZ+~~vuGMD]쟀F3A#bÎZ̙m
e|??[#(FXI5hHKS?(4HИ9hb4qR<_Zق5b.@dP+^?jFؤsbguC
|h4)ڏ$/{;vk.rrkmOqR-Yۤk#ވ?;@_e.hza}DBc>رlÎر;ꔏ<-zUv5ZVJ*T)Wx+>hv@Iy_bh4ICgV)B^fUllF-n~TTj{OĎ\봷hh{NC-U'5vk}?UV0īܐe-5LbCfaJh*w\*v:"*p~9.ϔbUnܜoGEچ{hsVDh_wTb-pM<I*v"j[VjFtoPG6]T}e~֟h<w{am~-*eAKM&Y<u6kg/{U<X^땪leSFJo[mk4ջ^S|)v?U8Bˆ=@ev
)
`|o|jo|5]7{MR@e
U_%j_OS&*%`q*9݆J
4ci3TBl)Ɩ'z(+_AJҴGi498FG(%8^B5.$U!Jz@EvZþU\؏`}ɩHLE1cllwpӔPokRXguWc(%v1iFwJW\<\*E܄cI`
,b%ұeJ&w6jBƅ؈0%FDjLD%Do+."FWlS5,jF-;

6oRQ1ѧ
kPVb
UPs Qlz4>D(9IQ&1S9DqpŚjdt/
a44ztc-Mh`yн\g̣:0+*"EPEaeXT7(
.ǚb&Zq_c5֥1xXҨZMD?	\{0t^>|߂3s1TG9y%41W1~PŌV1V$ٍ6es[2͔-WJ3-WAMJ`?fr1
6k`T78bEqgO9+h`U9Kq&(%a,pFIJHc0'+

	?:cx#%S3=|K!1'tTN쉽/[P%5)J)Iq$[d-`.s\ŧ<+SJM2ZbSI	Qg[)#Si)ZdQ5DJH5ʜ4LiK+Rm9-QtzƦoԘТKj0;1Ue
v~ۘ7m]Č~2gV|F2-cY1YVEg56@cehKoPxve
G
r+^eti)̇߶L<G3L^魘Eilnr4:/NyEe*ܑ0GF9HGB+FoCN#w4"'V3uJEHg$Oɕإv;SQ}9"
V0\
50F4NHaFjxDkX
-QP
,ڬ!E,V`
,`rȡ0&2F75C1A

)%
.	ҰP
-RPiKS4ԮB
.AeUzl~ej@~~75
,v)̃r4!Rr:W^A<5dӠz<Xad3A~N;,U_g8^|[~]=^ܭԡK8"E;
ms=&(UtV9^7TwezUoE>UvyWMP*սj4ʳrUS99~nբf@	p<dvt)2K
.ϕ.|\`
Q7We+_]5W\0P}Anw)a9Ssl)
}tF?\I]j<ձGk]5|krRKS?`L5`?u]	<τ2G3ND;z4j4t1].<Jɣ3{AO<j5Dk6o@5<l}rNUYM-\n\34l+>WKXN/`^
@8)a3/ffl^˹-~**uv4{Wnuٕ-thFt2K`Py;Nn{7M.v77\ĵ7TN(WRjgpG˽_&h'?mM^!A918P~!0qGBAlp.|7ݾ\Gx`K:9:A$'1
Gf:GMhI
ކ* ]{.CvyH8ZZg8U|J}'|/Fk~Eo#v{n;tk`3?M—Nñ=]|m--M<
W8/t?úB9sIm|y=C魇
ЏF{ok:KkOB<u:=K[Dp\џDlAOЕp@F=+1ɤI	*!q|@#q8մNjB)odJOXWGta(V2:h䳣:FGqK]k!*WmWxvjgvBm1<{/H.ΐ}"1++YO䱜LYvNATúuLM&آMG2ӤO<JpW0`6``6`
$&!IsM4I&kf]zd=Uuӎv6դQҺN:mkUv޷dz{>I}R/xW%^սŋ7Zʥc:\G&dQqX<pz}^ݐs:Dv)^VY
=HӨ5KH:ҩ	.fƨ4&$^KcEi;:p\'zL}L5iTx{Y<򔞯+='$eKDY5ί g850wk8vǢ}'GuW9IXc~ξ[c_,oS)z(]Qx!˷'&sy[Ʃ
՜-
p8nCqS7ρEl8yn7<R_ga4~c+Th)_43	17r|S+"-4:8bB	~&;aYLfWN#(ۓ2tיItLǶOJ|kzJA.=yJ-爼J6p 9\vXJb1RYH#-si#̦M2>tS	gb"㙏5;e2|+
O	=.V%?{ewV,Y	,de#l33a*pN79nek4yg((FsP;."7)R.JŎ].%Yˏg mK(dXѢV2X4Lq턶GIPݦ2=Ke6ҿ7Q׾H_Ny5K/Ib$SCrM6MNJ)&X:@w8]eos[<7C_kҝ6GYyҾLh_Fͱ3k6Tmqeioi⧣"D{(Uh:D,xlO}fۯ_\DVyFWf/k\2,'XL5v
IM[aS4,d+48/QxKEDd'{VwQi> f<aQS@M5xK+q4;\49pvX;HC$u;p:S<Emq^?pFLWuJ뗏_ڜF<T49P_C}}Ά6hǮƵL$M5}kwůğĿ"\FŢKyzKq䊧ѕL}SΦBjp4[7Q݁݋=FgJ*ZciO<[~/,*JR:M%Ҩ>ѩ6n5zqmIޚNuk>VֶJTzx#f(-Q[仗G~C(7_eJ"(YRZ
X;TvPљN3eՔ1[(80EQ`#.xO~S
U..HgI*1'k*j;ʃ(`KO>=&z(쭥z
MIv Y=DFۤ~&~OF'dDwK렴ĔDPKINA?L!w("d
U9@pA҆GI#ydGΈ$
?KŻ$
}*wJkYEHM%ZcUVQ[cȘ06HD:)y$OyZ'$bcxMćOb_O7xG?#~<Ši1"ѡ5UIJQ٘U!}z
I$m8Ms`/68e|/Hu^dD~@cL<0""2
*5"(Ȧ((	(8*
+˩₩1n&DQc%i[5ǦMjԨI44>99=Ǚg}T:++Hϖs<r0K5}ŀyoԣMYj%H.rDCf\2`]xkت頫gȇ,IF;9X2n@5kErA1x-XޟfʋgȭԊ!+Zp^9
"҄9a	9Hx<:W0\ht6|6҈)m4yx8l0fa[o=oUfdI;}ȚM
Q'fRgxmvh?vpM᳇BC,1̬nsZsItJk9r9k_/7K4v'
>''-<hiHi?:^m䤍k#m#HG&4xO!މKypz5$/#0\!K:NL^'&'I;M4oi3tΰϒ賋X%g۹O]J6e%9X'nL%x
^B@H+P༫t\"7eP?.Ӕ}ċ
yd_AzNyerr^_j`}sà_2|W܀N'r1| G|`y;x`<g̘)WߨٴD_3=a{Ĝ%s&LttS]???'ܽouwp.]N ǧ|iq衦2)s˻̗V>ŏ;q?>Əq)S&ժt"_u~uyzYWz+TXGO~>/~طb-v7R(=zB>C,N)V|^)<R"f v'Bk(:hL~Q6OIaToS~-]vف>P+[]G9DFx!Ngu%yab
Qh@#`52yi>ZUƏq@Vf*%cDuX;;M,$ǩW5Ġ1
㱟LV<Hf؅;I+o[m${
_v'lS#8iatNr
3l4?6ᇍl>UG$oV*V[rcգ_Ks4g[{/^g	A'
hEc)hdc)E
ZV,""[.v._iswr#kG>>wpelwUSVw	JhYG%Vu.ZꚢZL-q"|Y܊TVjZ֤y-*s?RwTcx<Q9;đz㽅WMظn
Vziew/wRZ1HCF$LUUxjg<KT5_^K5ǫAE^Tc
_,w5}yJ'm|^-,]dtBoxۤy8Z%x'jO|T蓧"PbJ{nUNSMe
~{''y0
@Cm
S/]TK%~4ׯ*5XNPg(?GPMcUfM%ئJ
AsmױĀ6lE泊r)Ɨ92;C(?feTV8M
JԔTeRz<+e@lФJ2J4]Qbȗ\Ն.ڍiTCs_/2#r{hZSfp2LQJ7
Si&+4I!8RBjQ杊;4.
zn]Ff*`nˣ5!.Yfez*=W>J1lD%G(1,V	aAي/иrF,؈lCuR#~=;iAom
1
ǽl09C"J	(EӸъQ)5UkTtFF[4b0dǼa1|`!vS\7ya&po
K#.M	̣>0dQvMvD}}GEepcĠ`Ԉ\Ƹ5qiFkUظ/MjzbNs5MSTk7IOsf`f{{K9YeIPfRIIHJWzrҒR%SJMJM]j%7)MG`A,W}́z@y>9JTqd2јTI)&
`ҧ)1ݮEXgޭX`>x7e8نV7m\30*ǔ.SR3(<NI(%'*!3U񙙚IePXM,TS+:k+2,=E[l"*3k65C!X!Y7%ey)jP5PqpZ'hBvb5>;[9%ʩVdLE(<wrWhpH!yBsC8hEchTB	*'cW|_/WTA"QB
-
-,THQ5(YAE
,zN;uE_
Q`CEĪB9<\*1U2R
+3(,H"\dP'
1M]&C3xQ*IV|QwW@2zhKUPy0	"_:FbUB*]4Sվ[=VcC4:Zx1ȣj)Z4ʻvjY~ <kC,d
(bjP*%;&KQS)N2L!z/ @޶0yqyڒ!S۪46Cn:b땳m\%ܕjGqـ^5Bkvj%{]+amly=4r)gD
dj v~dVjĨ6b3|9wZV#5YoXh'QXэ7I]NPJ[)^lX=m|!3]rȣzf`>}t
jK4l)w)We7v2l{Emg6k|m~sn0(z8E
BװH~Rr_&,K8p.+*.]tqíAaa=
Gw1]_5ͩPFs([\!k\>ZiJɩm*si-䱎<S
Q
zt!aGO>jb`;6{[
Vf6SDEVFr{	6xh$2.c}cc}ǹ}7TGKH1Ia1y5빑oz	v^x2
 3#jrKy36Y+0;g6~K8N[u?E\vih2@o!ނ18I59͌#</W/RKե
e_&*F;Djǒ7pjY`\
U
\eN>aFї2glMVżuؠu	<=w'-]U'mu}ruvxa}k}Ӹ_C<ω<74}tWE/JD3|t*Ш-6KANw}eE|y\Y"qyW(29?9<{=;BDzQDJ^Gt<ΐ))y|<NBi~NCُ<8$S%^
^8=t2a$J*"yI_k[Xk
z
*CoBݺ](Dux8}hșyk!~2f]ʶ$vmĞ=j".fkVj;ًd*[j37ѥ^}':<ZGH|?ÉG|#-t9إĮV棏9ݬYĞK]B'bBYzZ7DfV-7м8=vj=EE⛈ja_BJRz"~1[R:ҩr|.t}lc+78vce+ڼQ蹡MEǠFJB!_I4&QKј<vTC	"RiOǛf8͑vu>X5<\i0w|G'X4HG#|4J=ͫO[;i$Nb''sqbױsqiRM6Z:umU]K+T(L\Mh	B6&BĆm0ډ3??~:w}~{cc/V0]b
-|Q_75O op}$1s4WG
:kѡ\i5ϫ~j%?LFX0i*\ъvif/hGɋ*ɒ5Q&>d
eEi׸?-Ye,-5jԪJ-ЬyC=ij׌!ƔiM5a<NjĮ1]ר鞒ה0F,Yڬ^FzЧ}c~,lZsLf1;5mnДEami21˘F-Jn\U
c>nzRqU
Zju~?>./8l>Xz{f,3qږ)Q)&iU֦-,xwnm~LъksxUa
WާyEit-<3M2s36{f
5dw*nנݧG=9bVr\Ym(TO5wU:koÇgZI"r=I8ce^FːH_mUPY^g8[R&Au׎*X;EuTo͉[=?kh=Rioޡyd,}<E]E\]VU.W:p^ߧ@}BI5RgZOxQ͍o;|BVW94c@
Fjg{xr)QcRǦvCO<jmlS7oT!57<'o}']P["ww\i4`?[0e,aBGsF6W!ϩ&_->TckDָTߖۿG.Ljj7T2|[/iW?ճ@su~NB/]m|5jRC%w{jc@霑sE՝GT*^eٻހ_p7ά濏YjN~#?yJ
ZUVnTTeOLCS-isCO,|
$[[&[=>Vy54ИVA:R#Շ}…rn1*bQe\HnUCe٢CFS]C;'Ḵ{Mb?9WY73hzϣ3N Aۄ%n໣RU_*KT>`RـUA6
j`#e)>s2/]_SIǴ0:tf|0^B-'F)ՃRuPAED6$dLeHKɘJ	'w([*H^T^r*7C%~(cFgJ D H~hObl3ɘ*QIʤ&*Lժ ըT@aتuL.EL%*Pl܎3%Ce{ˇvLJm<I
6b3KO$f4/	xi4ETi8+{@+A$Vbs8cF,ڵ^ԖK%2~Ppg3,l?
Em$Pf>ϳ?ݿ}"	JH%:bv̠RѰ$H@phĈ`ּ>5&ymxyX{g(b5s/w)1WΣ0JWAJc6ԔG1	#uơK?C"<˚eße.o-q3<{>Mzmx_ShB?ʹ|5[By=g®r'oϳ.0gK2{9	2{2r{	8|oa<!j
]q8zlk=?4WӘ녘r
D6B4-qEUswJ21sgt@5yq_!1&@p7"  V}ZV[;SnUu^ZYٺ^9gtksZ5aw/>ׄnZr1xvfK04&{CYi>>椏 ~q>J%?A۹B>zƸ%9j]cF2ur9ACa?/~곟B;i8'U9@mcAg|FW(ćW$^~Ea{3ظ!'}q=/XRl$Ip.G&&
ҝjKt>oKOlH1ӝS{7$ۘ~S M̫2ґZv>Ϫ@VOS;tF=ğI
|ݞpOѩye	\0]׹<w2\R@w^62R[(דb=z	/|Q|axiRr_GKVLv,trSkƐ2CK@b~M!t(ޣl"?ZI;ηq2n?Wѽg@Yk@njci}ɼl>i"'kL>RXf)'Z:%t,ev+-H|';!.'v5LqTa'&3iB/mt9.hXIdn9L?Ev(,r5^qOCr1/$v9u&q'-[|c!.yds.3:
On1.̓ي
U2E|$E/"|,||\q7˺LOgTT2CeO8[S6[.R^/i8:4D#<4(GJ31yJ}P\M曓Tp$:`v [6
jV^?!=8-:qHCh(fSwԫMԡAS4>.Y2a
ݩЃj
=!vA@{ql5[=0fO53\6;ܠICtgUaɚR{Xi
Tkh79|uq5D,P}JEn<jI\hn8z`fB7]<K^:Cn0j!Fx58lP!G1X:cjmUeTiڨ
I߇4k#[c#;zy\s,k4GFI
8ՙ5j9KfUQUլE3G%1Tl,T{^/=
hZWLZ1yހ:ƆbT%Z#-6UZUaq̒X*RqƍSYg+JUmr);%8:0Z+МQt*Nh1my>GBTaT,5VŶDٜ*e/Hy&)7U9]N%}Ik2*#\gsó֣T=W|$^h)Ub{
Fʳ'+מle'I.;FY)LTc|Pr:#x>3zhL9eHc_#yVR!:qq)ˑLS,yJO-QZZRL#}R\z@IGeǕ6|W<h5ћ<XuPu9~/^NI.W\6Rpɑ"%gV*)AJt(=OUy/G	}U6w@+јfyPPϼLCD)3BIiJ(!ۧrrjemӈ)˝X}xQw7U
ؽhN%iUPE<r{ H%o-?A|Fg*ΗX__b
*KQ2.T^pQC@KПDڑPP>ȅL|}^d+
W\QhŔX]tȑ_$4(c,J*t=TO\K%7MEF4 gR]AQg]wEЪ(*
-, 
BmăD3iFUi;1&ͤNkNc̴L56i֣c,d?Y罾}FL+`WJQdv|dȕQJv\*C	~;+ιOcqX^8V±`>( *id_+;IFYIJdT'[y*u)ڋ'/ыp| <<_h&q;(@1τ;~$J~dʼnJ**@0 :3"$ * !yURxP	JlL_qÿ~Llu1JXbPt|R.Fz#ìCH	Njų#aKgpK-/p
PH9ĜE̓}O?/Q_µEgKOF+k+:w%KF.(\/Qu`;ϰ-DMT\~vPBsy&1O	_?f4`9VAZM.?Ppxs{Ez3r
[d!m\@̳p}jΫ)$C7XlaX?X6N`LM6s6U|RMySpw+TQ"͡|ի^3uK	a·A?XWY<e0":1%7	p;q|'qL~xԹ|Ӊ9c5=mp>
q/O=r,w}qKCM~'q~g<>,Oڙzb/ku?#|agD:a/Caq0&Xku7F4(8!8G䠿&MsA";`4"hu&x`x?NsfO8)w	/:r΄;M6HhD9pɈH#88rpu\,b%%
~O
y.!MwAQj@|ν:+OQ8|H❧I~E?"sphBp;C->Un3o>$}|QX5=:7j~{=Hj=k?
Ux3z]W]Rt+pk>\P\fFi3[GP'^uz|:z:~CE0-{/J'i:A ƸE+Zd$,%ض㷋\DKè!A6]Tyxscu9/pޏ#N[f|a
Gb]m;V]a;l/nvS<7v#drEA+|2;17bۊtf.v#ʎ^DZ=B]F yBz}d%,ã%2vb\lQ*'a{:sυ.#U{~=7QBy5df'ީ~.=$8#`;
ۓ=beد~?:CZEKo
rzSL9q,Ǭ`#vpFHo~:b&'2B".
8p@wtұkuԣj .3HxU32_	Vq
G-*3VÑG&ȃceT<xk1Q舅Kyt7͉w3	ùsW;#k#w3p5&Ū1>Y
1GT5Ii
De=G(\jycm+U5qr
?'L84^zJKXk'/SIF-6X3k,!K.l-HWMbHQuOzU&.UUfRqJL/tBEp|'6\p-^~w[62UcJӔjTM3Te|S**7WUV㖫hjͳUk}Eso*!=pm`cmzk.|q⛃SbUeMRŢ
MI*NS5[ֹ*ZS;IyW)7urR٩O+fL9p{HC
U|w*_ԖTRST:A575Kslʳ*VDEʞT5#}2.5-cD55,!
¿4`$|e}oJx b	I5AI*;œVYKfnVbUQyUۺuն]ﶹ]n9	d'y^z|*|̍W%Yety-Y*R OGrjU(Ek
&-V_vl4~PVg~<mYmj8!:h0
LܫJ)JA (ͤB[6pUJkRAsR~Y;|Vf)e;ו%?
zX]p
U[(p9&HQ#]vGlNN(V^OSkr\m2{^,&ezvyF=V2hoh*ցSJ|wIcTnI"re.r+\Yŵ,	TҪ)ݻQio'}ܔRSp @)>”߬8Ki̥*PfYI(/TzT)
jhQjE'Uo@ɾA%;Ċs2T\*>W?a;Rԃ|ǤJpϊ|THپx&')ʨLiԪP*JnRbuDŚXFwlU|^U	կ+|DUݬmo
W
<wLFjVJe۔wiL@أ+,X#,~o?c-bf6WBQ9(.ÝW
-RZ N)S24`⢇X$H)ZBhB6)B&ȖD$4>TP*1Q
<|.HF3ńٴF4P(NiO;JN3X3.kᡖ&lAĵ)0(41{$f[3K7E,^mfv)##ψvl/dx:4z0^oQ&R1&J	ȵ	Ny=/亭Mԃ>!g}6blS|s>imd7yp.]6E,`c	5YQ>9fq/r9br9c/[yfg0% <RIFxK-Ƃ+j'kcmteg3~i 'җ_c6QaRk̫WFx
K(&ρu`= ,k	,AR0/AAn>.mm,o:HCYk7f-Pl,`'&'ߡOQ!zt~"'(~sbϫ5*]Msv,!{_3hl<&Bh-TlDŽ0 ň2=r?F(8
a:tPuVr4%-|4.F&1BJg蓳q\E?OAr3!pFpvR#<+;<au:Qx\(.A]6}fJ#+{^8i=syS~}=*:+G/P]Wiԟ%.~J~B.i\:ops0^/c_>Q\f
4G5t̻jL?~ʹy-J<Cs?DP@LÜ:	tk#DwQ};1?R1<eد%Sue2~ƏS(X'P84F~6fs0>CxЙOEh47jvP}hũ߄3,ji0)('
L5{ #u̼M`pEWhT՟W<~`;۹v0Ŵi%mx}%rǘas9jj=7{L`eR5:%.Z;}Q`O#6Zm/u؞{݌VlEݥTe е/iVқbX1\G.t욱k.l{]Z쇰V+#]Lb
Y<H0g?>:1~6ktv
5bׄEg?RX a2)snM?ӳٮ:e05&9(Fd}{\,XH.&=Fڍc~t!셱ۦv,n/f:z43UaKH}$A+oX&fp:9/:jQ6LC8JdRruaĉc;ǗN8NvlDZs:M$m״	K֭bBJAVSV1Dm0؀A	h*h6&.ZQPG'e=:3Hì1V*f젗c%Xz>A4lsGX
㰔gKH	;;Ѩ$:u42to>.&	zg=;6%ʯc³x/U|8fwcniL".|5ը\nsL]:Yuv0-WxZ(m٣fA,ǔVr	vM{RaG^{jSWKVZliDҸZJJ[;lWʺPɲ1%(n۬mjS"
ۧ:\G8N
6
CC7]'caVDY]-vJ~%uJأjw)UԱ@
1E(llVG!~*h<G
W^k[KBzN<Y޵K3JV%K1çF##Ѥ3zgC
(ZpV>Uy9-粼u7;\MZL3v@gi%r1O5m

ջ+rW]'OWT]HU+ީJ.Uq}\Kryr{oj'荓@.pm4$x#FE[תסץjWU DJ[զ~UT㟐ۿA|EFpJ偋rPOtk#Z!kR]'D~vy*婩&.W0#gGڅ2j<4)Gh/òRYcm݆]h44O#"YePP\u9rWɨUy}4t'[d"kdlUidJ%#DN*\d	ԿEسA,$!=P
<wGr6.G){RhʢaY	T%Hű*oRa^d?**vt#	ihY#ԣY~}<`1%%m&
$=$USQ2&sET
R^Ҽ{7;IƔ|fR("P5Pų
l3A4lQiM
h6xVLk+yt+^oJf%b2cfF{1u簆	Gcr_ͳʤ¶cmfFcoՍƸvD=d/û,Ӯa6h&5@{?M &|nc }1Gxa)rem3h)mx7d!s_C}Y5:%UIE4O8؇9\0}1B_2yGQ>ˀ91B4B6Lֺ"og4t@mM@mݍ>T𚱮ib8d6cLll&qc|-0'3/<~w4\|tzFaɪ{Yנ6t-#Hb3ı8VjXCc1dOT
3oce}~z.hE75L\=5-Ch,I5$so%{sIFMı817v0&;XTVfH3׆A!s++z))"ö[/:@ndwt/ıv?~ޗ}S)
kyR{꣯s"!Rt{^sk^nh
Ƃz8K!Lt?I!q8feep#TxplCN.a0UXR|e>oH])a0K$SgX'0ٟq%=y2ղ1@ۏk#VR+{ @^y3xޔT'Y{.o?$%KE&<{ŋsgW ml}y`}ò{ސ͚:Lm`VKs%O,~ccl:W {ś4썓dŧpO/yC/s/d"oGG,~~ͤyIKLWW^/}_%Կ,jg'ހUfyw?6sZ)
:2qӺ{Esxq~&̳gcۼ8m~v|;׉8iM鑶뵵)F=Cݠ$@cL	ILHCC􏩈C$PP}~{<$%<t~n+k|>
ݜ73
0(_fѯ=MgP^ <?QR$gHGHXx<	r/0{
>O߰yކ!$=~7V!Rdcse	e:#h$>+xyK+Dgt*sB?Lm*у_u]S25t,v#Wȑq?>2S{R#aCdC/6k*<	3ϋJ\;-[Cw6Н@wY4:0Gt7)T 2d	V9-hm[=c0g!X=GGxl'[p<Sx<:Gϟ#~)|{6o
'hVtaE.UF&1KT0{l9O.:H:7Ŏv9V ]7&Dn,n_Gqɐ9ߏG5,N	2ix11v1vq|Xc3g9򎳥-s]yl.G;QgYlQz
t']CóYIȠopͳU=spQZyֲQM:,6rce4ԁ6ب76f~fHՈjx2{?]>3=ѲЄqQϰǦ![[-&v؉c'vة`;fL$GS\VY<:ށ(Na <e4[)3,y[TuuUj--n[^%{*8ةsI91uVu]Ru]i׋RηRu'kc0}{/eMeånW%_EOPwTr.ux*ʶԕiU;w}GwIquUE}o{z?
6`oRc%A=R]	_L:M~O9_@Y_X_\i#WQVWZ1c)l^Q|NA#__Kq{sQrrP後/EuK!ARGdTŒ(n&3;5Kkj
(l*ZT0tDfhEfgᦌk2Boz?u
7K3A)<}Pᾄ/Z+r**5R8W(Q0ܥ`k֭
D=$#zZcƮ%Uyߓ;&ܒ'rW{;i`Rʵ|.Zz2cAbQc2eu&o;K~yNʕ g9_;\ğdO1פ5j@*P<dy—6-ĭ
%2.>|ayjiȓ*ʝʕ3ݔ=$[愬epf(Hicc{SP2(:x$!(*n?/UK/w6$gGL*)rF%O9s*rg}-ckl<KJY_Ro(fg2r.tz,LYH.E_"SDsVY( 9/woK}>@%!4
AhߌM-]N9K-uma*$MG+],ljj@iCePPo)CН$PnNS!6J@e4U6]?MS'hu>[w4qu:@zJʱ{-hAz<2Lrr®Y~ΚE~A!ah66@A<0ǀfq&m&Аឦ	]`ta/)qĮQ<Hr2ā?B;ꐶq3dhM5I<4ɉI	w&VB{ƛ!]a6)h8w76b,xesnYݙw]w4Ս*a75I{Su5@Q4L)te?~,abra0sqq8S$'}jNk)eA>aE{HYaNaV63]Qg6{9d7l[
PbF
*e(P*SS
J/Pʥj-2 ʴ:ڱj3Hm-ɞt;oel?V~YpYKbr5c̉ջc,NY{&Μ&38]p~ᣴX,k:gHL6}?ѯ'	v?mI[-~x;gr!q68wsΕΒmQQ]·˨#rs[  7c?}&{vdVĻH"8sIKi&xA;.Gd##h^e~WN0?HH3(qe3~VpNEj'[ٜ;nG<$H9X<
WU~H<^W^ef\.euqDINۿ^p᳹ϏU6K<`,D$+5>>ɿJKb&>f-|
Ol.>IQAaM2z2zQ{u΢k~8	p޿z]uq-l$.%~u9Gem~<GHOQ0'Hqoqtx=;xyWVw3v/!^D-<8~89:ΰzA4
)w&>~|?D~bz":'~BiUh
^VXe]SNڟ&hq48Zj%v؝lj~>^n.NC)u}v!~D_v<mv\pǝ;vd`IЈ"v;;eZu&v;#bl/"Vc(p<
4z"%kЙcp_/;muiG:ў؊@ENA{;ӱ;arXeQÛ rW+b f8Sa@䩾";=}ll>B~	*YoaT1v|*8=ط{Lcz\cQlz+۱ݍ>l`o6;s:>GNU
QuCt~1lEоkپTc	~o~;@VdjYdg:YG-e:5c_	;~σaWuMC,lr2ژT2c^y;u£)TEG7Y.wmkUh9WJ4f<iS&Tr2ژJGhvMnYm' dvQnKt\iUd~E&q	6qݏr-e/`53znzWnAAI8p4Q^'tUR Tx'y&@#5ThG<BVa֟Y:l<*jUTtGꊂ
]9x
Lf]e\suu2U`Үt<x}FuaVB/|)n5|j
jE5&(̓N}J|T	7+T,Y˲<e{X|xgqɠxWM|(*+
*+*TH**((lW,8EVp<%Lc"ƣ¡3UZE
5xn}d#QΣ_H@pH1#,ˈL##3ܤ(B1T82,Q7P&뾭@ݓj#U#7/74IhE̻e@ҬQ*ˊdpE@ht)d4oW\Zn
Yߒ:(uRnpE5
-|9H.
<7%aLf@ufPa3$Ê(d
Z	b
X>y$;B5ur%X|	EΊ}ṗs&o/E̻,HK}ܥx#+iժDb񠂉jO˓˝lSMG;lqf܆i	I|HbxSGdQh- ϻ|Iy"QX+3SD~
&
y24Xr5
9gϢ)K{caq+X³Yφ$/"\Cedj(fsI>'ݲ=&=#U0?;ӼMvū_nF5#\O&~mXflؒ!
||e6;A+h9/)>O&d\25
r73DV:HJW	xmǶAlcoC%K"K+>|pN+=`hiy׀)ޅ~F5}faX5	ZZ"
nUƱ3h:Z+neJ;=HYB6BIH@P !Ѻ/NT;նK2x:ɇ0p=!?}f^LRpφ`@Vr@G Aw"0<A!\ŜԪX<711
'#hGw_C0"5m ṫ`",B",BPGbP!BpS/ t3Ϟߧ"$/0`
%:BrXa`F6;XApٕVb\r>i:_PK-:G/Ґ9c+.q|h"|X~5.5uбFl
0a|x=u04.zE4)x	C$Hl-
yױ;'jn
i\
W8tl-бk؎nApNlEMlaY6{ר`
Y;y80_w97=Ecg@Ҁ=	бQR$Ή{P1j`	<z	aXB5n&s;JMBDq~Av{%|{,wQG\:hEx5~<t;Vw]|()41#<=J DQgP6X@s#LtЧG?zje*{;
~v؝;O{(8C#\
Fس٨
)S"̌tNTf`#H800;Iw>B΃VݕYk`Õ(,7U
U+'F|`	
 ^EMB@n/+iQ'B/ paT/D;C!XB"0cr>Q88/l0݊M?xy~n07|cǎ0q)SMs^(d^^2l/WYn_zWl۾ܵ{"ވ־o|#G?>3L6ğ=w>1)BY"D-U5ڂ¢CiTSźƦffpvv]|nܼu}ŗ_o~OD%}y1<\'_ gK<b}ˉ_+'	HBM`8@8AAq,>"0X8d$
D0QPp)#`@L6-F8n#mO@zH(=&c̾dݽz~xFEyy
=%G	X'$`(,K?W-=Co"[	;=Qo;p0ȱ4Ï?!Idr-bXwAWM1		0
z޻}_>xo=z;xɓOkMuDT__ba~CٖsJ:CRZ	G#e&\WfHKih0a@À
4
w|kfdKeUh_ݯAųs94HASe	*g)AxӀ	n_ToO*HSoTb.W]ޠZA
Р%4(ײ3n膆>nE$YL!`*_mԝ/QsР
4y"ySIfuaƹgc,i0,5pCu~S9Ѡriȇ۝+]xWY"Z:ӸdM3^Dv
97V0N6CC4N۝#>1tdBG*@C'ie$5hͥotРUrS!\ʖrz$N:Ҡ#{脆ƒn#Hi	КʷkJ
A˱)sNy6K"cwgI=q:E+6Zg
Uo-/4CTРa;rV(ՕБu9'_4qbf՚*ʶ̅ڸ|5ǢT۳,8Ȅ#Eƾt^鎗{<6XjwУ-VZzQQYkF}QLVנ<VDɲ	̎#Er&ٝg9]|ak۝%m[
-jtgpZנ԰e*5+ٖd2
VGp\9iϷ9[2CeXְRUt6 Ne54̖t5Ӓb&I.ps6v.iXmq-NzXS^JYVwQcghY͉VKm x*2G6A?^TRaX*+5j$!Anh9|N'hG]ǰ.چr'=Uti.4'$l'Nb;niP
q[RNRJK9IӬ"Oli{%Z6[mْyKҙqL8=\8F\wߐLTe$(!aSIc.43l'u߻x=ن7ӚVTRLz"_E>ϋIh4X$&}49߻w?cW{YE˫}?Q
˱lpWDL|rV\`ƉмVmӰi4l6
m{Pdžg0|ǐ0aV]ց灡F!ʺ[Kn۹l{`?)`oh@lǧ"sf\޼-RtɌ)Nm-në=
5e'#1=0htHh#EAg"F	Vh•Ibm0;;67`2>A
:SvIQĢU]1WB%
OXoL[n`	`Q/c×hޫF'Jcs_+!DtU3(˗vjYy`xN+1™-x[VJfAƻC),ȗfjkۭTkëK/ck$fL<zҢ3AAh%{E"_(v}ÐnѡՑǀE{vX|!33ZѲ]X4A-jؒB/KC,_)%o2-o1ã{zc[OvˈNـ6VԔ*tAD@])Kz3c7Zf۳{p~.qte<`7"eUi9
!8\$UijݱfVXׯY!C}Oł)	)ZU:hFxT5Lͭ\϶|Up?G\=)D93}[WaPX:xEfq-6jɺ[5|=홯G޺ngT~Nɤѝڐl]=!5FXxB
ǪhC˵};޼kaOF#}TYإA{\,|41eW؈XÎRϾ*m;BRq}Z鳌ٝ9bIlVȵB%02qȌO[uaDӵ7&(-k~iRNPF
vhT@Ac<
ʓ6;B?["ۊTa[ddcW(i	i}EUq%ݝ pPsvdcA>Gz(6lj;^i<)7m}Uɰw>&t%4aS&Hsĉe!e;l[԰0ݸ/Wi<kQ
%ߤCX<pC#IF̍2c`7bTL8uxp{lh=W-
rɓw͉;0@"l?:ǢH./#3>oƮOW}/>{cI_ᜲks,p!m,g9@Ov.Rgu6A$Ⱥ[5X=ښWǖͯslwrl$&";$&,aqJ'=ʲ[_vwMæaӰi7X?ښc˖9_0tJddD'%x:,&rA>'>\0EEh`NӽGWpkz^`x +Wc"R,Bq&<$Lci7_uA[=kV};Ǘ/	b$fǢ*	˱\PW@i.wEfx΁HmjiHW#-]`0(̩IHL`
HwEĴϙqrxsvB@E͌:yn8~^I3mfځ6MmҔKIJqCwI֣yGﻭѾobKl˖%[^ p(t4uU}\?ɩk3Xb?<1{B1
)ʠ)u
e;5+jK״4Œ^S5x{z~q_=a8ie/ŴxXj(Q@ӨʨVf=[rSPԤtuEhx{~{/ͩ0/!=k[8P&ڪY V	$7yMRULMogn`##4n%ubD@tPf*haTIȚ^ʸ,oe>OUqx-"8g3h.PԗMЬ]U,*WPW2M~K(d+\+x{ڍ^o_=NioYz!pg'ئb
Z(e^ik{dEDUۆa}B{_k_ӜB3sޔJ(6y<d#d؞I.h5`UJUPW

]_ft--}l?mhtƛ]k1m(@SV#8SZʂDC"	Bj]*QTv?r?mcoG#'=c3#
F-DQLu@YBPQ4
-^uֽ/[|<7Ƒsp%'Zf#,՚Dɳ\S82C:vDos/{롽Kmx8dGR!kLBE	)3T}@Zd`&7+ܞ}}}}TUK8=1%
vBFcrQpXL"l*"D&[K76ٲm~~y5Lu?=Z	8
0kcwybd+@"LCӝ]g^)5Ah]@Q284N`Ye)68GQs$#⯜mh\ltrB3lHaO$+aFT&.JRL,	N(;1	Q1v iҷ4ްin|b-dY~FN좃a/ai.(I
JM(-9"IJOE|3٦J/i=#)}ȧl1S#8N0C
Q=ADR.Z;[Oj;r
`aR4BNuK}AeA9N\ˑ(,$fhw&}G'E_yعrXꂯ,@.WDaι99*l	-qWG_hw퇎-?k׽ҏD.gF0QIY0L,I\()'ڼ[pjxڅbmwuVe9A{@RBH,ʡ'LX!n.&⼏(+Aݤ{40Twm^Qw8RvW~_UvJvoJB
&dp$&#|$b32A:39>
%<$iCPMAcqd<k[cݍGۤYѧۗ	9J6"Y?1ᣱ&=3.tET]J0L	)<up}'/%hT'bj&HCg0gdsX]sFaFG2MP`3nc8޿ ?)J._JȱNp/\ڔIAi9_Sb$kdlSݳax3`<_V夗]i5_Jov+À
5R!ڃBҦnu\#.@33lp1%YKִ_[l6$4_1}Eo}O(E"9_72NƘɞx%+,CT堶 #y{hX`{a4'ĝ7PeK("*$}x-B
NhJ&.F%9*J`mAG*Z]i;8EU͡kt@	{dKم)9k~aə(kB~gxl؂kN(?d'ii/i
ŴxXjxW:epC1u3Dr~ϜK6-(',eS$̻챡lo~lPu՝xXOu`.8YNJdb=5P:)'4c]|kˆE+؋1SK<l}FdХ5<S 3rrETvp%9T:VL1O;ZI5xǛ;ƭ=iNse<T0nkĴtPJ%4%V@3\
Kƾ”w0)Fz.*	-ה
k0&Ģ]ig|78O섌ШFK@Nq4]iD%DqX-Tc굘wCw	Iq#xqA+@[q5@&}T'jUjM05o}
z
wҤ[{4p vKXL@QLBcjM8Y+#UJVak0wVC*yCMhmgpjL줌
,:5#,QPv?v
=J‚KЊ5X5Uܟzx?7cM	RځJ[~`A
&dH&Y#$c0$U"W;[e7uC+fspO뭍(rW;*q)tـ,V Xދ-]u?z˃z͑eu}4[u*/ օ%1=<'r`4;p#Yv;GuV\bKV}~]t;QoV9EAb!@
&X.(I/`r"(डT'=Eq2Rd+Erp*Vͻ[}n*L/|'t{q݅-*Zkb>"mnf:p~0HA\^0KÌ<h%\|l|5Zس52CRj=wIM̶i5M6(Ƌ(ԌIҔ-&h8VIlG,M%;%_<3mɟ!J-΅&nc~/lE#aj!Prj
d0+joU7*Öo6|$?6:x_󔺫K`L|b>*QJ 82Eg`*)=P3؏6r[h/w`}o羣=\[u᣻nj:|ͶoZp7ȗ|ImKu:mlB%a50as5ޱwDGI^{Ivx\/$ٝhcD,IFIdB#mZ47"TՁ>m3V?1Yiޯ-:B}Ky/eN(^,
юd,A#$9Z6mtoJZmio=aqS5ݾ|OӂSacO0.v8hx'#TQ*LIHLʆt ޜYޖ~0˪a
аm=ć“!A)# xB1B	3QFg2R!@	R`, }owYr6[iì+auc71'R	9#lD}qNܱqZӝNUzuuk@zWEAAP I\Bx $F$@BȅpAEVԺ9;m-ʶ?*9M8bɢv:jh"(VV@ߠTei4EJtLpavwk}n䅜4~1+=n*(NU
<L;sYINiBx6
_sZfFGܰZ)HB':!TUr_JDot$
H\$\VQ"Fa]|VaG^j2#(Q6"*r*&!i"$]0kA]0ݺ4!>DZр/rz[IV-9~`qL45z]ECmdULDD](ՀOICVt^DA$"CV[+{$SL:Q1hG	5M|CF^kʇZx3UAPi/

n҄di=ۊ~i+zd%C6@>k\OX["d>Еq]iB6gx;iذ%
gd9	$*MM//uxUakfR2ȕ\o`*X(0,OƤAq.<1*;O[T{j8lQƒ.3&Ba:A8/	W=hS
g4IC΢/}ڐ:=kJ]*
*8l]Kh-nH6j	&_ciS
3Ҁir`xaؚDy]Mݧ
1M&o
Zr-s.j)kjTAAdGO۸7`pHGܤM$Հ!o?f*wm2~\?h2b۩z2lnʯK @1'TYY0FG)2UhӲ4`^2nK֬f{}Vm&pҁ-ZwZܥ5UUz(ԦMjJm3GrAA%h4`Z	ЭlVy1>g<X.t+L52hA)-hD{b8V#aUh%i24!_]+.xkqn-1c|Fȏ`
ju~XG(ZFixX ZEui2`y/7eZ{~dUbk"UWYse]-5 ?H
0
 M((#DDYa<	c0EPۯez`]Q`%y$4)l	Vnb:36z&O3#dd`
cs_Ǣ|)p^g՟oM,w9ԛ$Ib	i{e:'ɳ+e;`/LlŚ{1f/w.{ɒ}x}c뻬2
dw6Mf_=8=M4<d3
Ypn	j\[ebۯ8
'?nulֻh?‹Do.̴.V{df]%{j	â'^@-Uquj'/).ѕ}LU:S7}k#prdjz^."*`NnR+n0.J*UqG1|]0?Lm8;7I0y	Nc
ϋEƫ+}V~R}sߟXr+ߖVS9+;S_c	''"OQȹic$jѾWCj-Kr[x#=Pác?8lޣ‚K±%GT]<=CHA—eVT+^˹`;Tv=l\>~	|y؟~uG<wxzيSgM'9tL&)A@
mBS )`Bmh!1RcӒeYu߷dIֹz%!v]iu pd0!L̐$̯ۚ>? ӷmHozޯ'|%:WS
8#^87Ѐ`SӏT]=r{L&u~C*gN{i%8dp?3 x\aheehjOy`~RMOU!KrUh>Du38lj,J0pzT~ޡ{&`jmյk˦t˸("R(HɼX&QoAqq˓2,ah6EeX=7eNަ;63e0uOɧ4]jnH"QRĀvߌ帶la,/1 G#Œaܔ>ehi3~1k<ʞ1tȧiPQ'5D^LRMl)l8q(˛G|0#xeX+)z9Ys{xJ1?o'ud^H2k<k>q2,9ʄq00|hahe>o옵f
Download .txt
gitextract_tfp7f5p4/

├── .github/
│   └── workflows/
│       └── master.yml
├── .gitignore
├── LICENSE.txt
├── Makefile
├── README.md
├── doc/
│   ├── CodingGuidelines.md
│   ├── DeveloperReadme.md
│   └── assets/
│       ├── logo.ai
│       └── logo_with_name.ai
└── src/
    ├── angular/
    │   ├── .angular-cli.json
    │   ├── .editorconfig
    │   ├── .gitignore
    │   ├── e2e/
    │   │   ├── app.e2e-spec.ts
    │   │   ├── app.po.ts
    │   │   └── tsconfig.e2e.json
    │   ├── karma.conf.js
    │   ├── package.json
    │   ├── protractor.conf.js
    │   ├── src/
    │   │   ├── app/
    │   │   │   ├── app.module.ts
    │   │   │   ├── common/
    │   │   │   │   ├── _common.scss
    │   │   │   │   ├── cached-reuse-strategy.ts
    │   │   │   │   ├── capitalize.pipe.ts
    │   │   │   │   ├── click-stop-propagation.directive.ts
    │   │   │   │   ├── eta.pipe.ts
    │   │   │   │   ├── file-size.pipe.ts
    │   │   │   │   ├── localization.ts
    │   │   │   │   └── storage-keys.ts
    │   │   │   ├── pages/
    │   │   │   │   ├── about/
    │   │   │   │   │   ├── about-page.component.html
    │   │   │   │   │   ├── about-page.component.scss
    │   │   │   │   │   └── about-page.component.ts
    │   │   │   │   ├── autoqueue/
    │   │   │   │   │   ├── autoqueue-page.component.html
    │   │   │   │   │   ├── autoqueue-page.component.scss
    │   │   │   │   │   └── autoqueue-page.component.ts
    │   │   │   │   ├── files/
    │   │   │   │   │   ├── file-list.component.html
    │   │   │   │   │   ├── file-list.component.scss
    │   │   │   │   │   ├── file-list.component.ts
    │   │   │   │   │   ├── file-options.component.html
    │   │   │   │   │   ├── file-options.component.scss
    │   │   │   │   │   ├── file-options.component.ts
    │   │   │   │   │   ├── file.component.html
    │   │   │   │   │   ├── file.component.scss
    │   │   │   │   │   ├── file.component.ts
    │   │   │   │   │   ├── files-page.component.html
    │   │   │   │   │   └── files-page.component.ts
    │   │   │   │   ├── logs/
    │   │   │   │   │   ├── logs-page.component.html
    │   │   │   │   │   ├── logs-page.component.scss
    │   │   │   │   │   └── logs-page.component.ts
    │   │   │   │   ├── main/
    │   │   │   │   │   ├── app.component.html
    │   │   │   │   │   ├── app.component.scss
    │   │   │   │   │   ├── app.component.ts
    │   │   │   │   │   ├── header.component.html
    │   │   │   │   │   ├── header.component.scss
    │   │   │   │   │   ├── header.component.ts
    │   │   │   │   │   ├── sidebar.component.html
    │   │   │   │   │   ├── sidebar.component.scss
    │   │   │   │   │   └── sidebar.component.ts
    │   │   │   │   └── settings/
    │   │   │   │       ├── option.component.html
    │   │   │   │       ├── option.component.scss
    │   │   │   │       ├── option.component.ts
    │   │   │   │       ├── options-list.ts
    │   │   │   │       ├── settings-page.component.html
    │   │   │   │       ├── settings-page.component.scss
    │   │   │   │       └── settings-page.component.ts
    │   │   │   ├── routes.ts
    │   │   │   ├── services/
    │   │   │   │   ├── autoqueue/
    │   │   │   │   │   ├── autoqueue-pattern.ts
    │   │   │   │   │   └── autoqueue.service.ts
    │   │   │   │   ├── base/
    │   │   │   │   │   ├── base-stream.service.ts
    │   │   │   │   │   ├── base-web.service.ts
    │   │   │   │   │   └── stream-service.registry.ts
    │   │   │   │   ├── files/
    │   │   │   │   │   ├── mock-model-files.ts
    │   │   │   │   │   ├── model-file.service.ts
    │   │   │   │   │   ├── model-file.ts
    │   │   │   │   │   ├── screenshot-model-files.ts
    │   │   │   │   │   ├── view-file-filter.service.ts
    │   │   │   │   │   ├── view-file-options.service.ts
    │   │   │   │   │   ├── view-file-options.ts
    │   │   │   │   │   ├── view-file-sort.service.ts
    │   │   │   │   │   ├── view-file.service.ts
    │   │   │   │   │   └── view-file.ts
    │   │   │   │   ├── logs/
    │   │   │   │   │   ├── log-record.ts
    │   │   │   │   │   └── log.service.ts
    │   │   │   │   ├── server/
    │   │   │   │   │   ├── server-command.service.ts
    │   │   │   │   │   ├── server-status.service.ts
    │   │   │   │   │   └── server-status.ts
    │   │   │   │   ├── settings/
    │   │   │   │   │   ├── config.service.ts
    │   │   │   │   │   └── config.ts
    │   │   │   │   └── utils/
    │   │   │   │       ├── connected.service.ts
    │   │   │   │       ├── dom.service.ts
    │   │   │   │       ├── logger.service.ts
    │   │   │   │       ├── notification.service.ts
    │   │   │   │       ├── notification.ts
    │   │   │   │       ├── rest.service.ts
    │   │   │   │       └── version-check.service.ts
    │   │   │   └── tests/
    │   │   │       ├── mocks/
    │   │   │       │   ├── mock-event-source.ts
    │   │   │       │   ├── mock-model-file.service.ts
    │   │   │       │   ├── mock-rest.service.ts
    │   │   │       │   ├── mock-storage.service.ts
    │   │   │       │   ├── mock-stream-service.registry.ts
    │   │   │       │   ├── mock-view-file-options.service.ts
    │   │   │       │   └── mock-view-file.service.ts
    │   │   │       └── unittests/
    │   │   │           └── services/
    │   │   │               ├── autoqueue/
    │   │   │               │   └── autoqueue.service.spec.ts
    │   │   │               ├── base/
    │   │   │               │   ├── base-stream.service.spec.ts
    │   │   │               │   ├── base-web.service.spec.ts
    │   │   │               │   └── stream-service.registry.spec.ts
    │   │   │               ├── files/
    │   │   │               │   ├── model-file.service.spec.ts
    │   │   │               │   ├── model-file.spec.ts
    │   │   │               │   ├── view-file-filter.service.spec.ts
    │   │   │               │   ├── view-file-options.service.spec.ts
    │   │   │               │   ├── view-file-sort.service.spec.ts
    │   │   │               │   └── view-file.service.spec.ts
    │   │   │               ├── logs/
    │   │   │               │   ├── log-record.spec.ts
    │   │   │               │   └── log.service.spec.ts
    │   │   │               ├── server/
    │   │   │               │   ├── server-command.service.spec.ts
    │   │   │               │   ├── server-status.service.spec.ts
    │   │   │               │   └── server-status.spec.ts
    │   │   │               ├── settings/
    │   │   │               │   ├── config.service.spec.ts
    │   │   │               │   └── config.spec.ts
    │   │   │               └── utils/
    │   │   │                   ├── connected.service.spec.ts
    │   │   │                   ├── dom.service.spec.ts
    │   │   │                   ├── notification.service.spec.ts
    │   │   │                   ├── rest.service.spec.ts
    │   │   │                   └── version-check.service.spec.ts
    │   │   ├── assets/
    │   │   │   └── .gitkeep
    │   │   ├── environments/
    │   │   │   ├── environment.prod.ts
    │   │   │   └── environment.ts
    │   │   ├── index.html
    │   │   ├── main.ts
    │   │   ├── polyfills.ts
    │   │   ├── styles.scss
    │   │   ├── test.ts
    │   │   ├── tsconfig.app.json
    │   │   ├── tsconfig.spec.json
    │   │   └── typings.d.ts
    │   ├── tsconfig.json
    │   └── tslint.json
    ├── debian/
    │   ├── changelog
    │   ├── compat
    │   ├── config
    │   ├── control
    │   ├── postinst
    │   ├── postrm
    │   ├── rules
    │   ├── seedsync.service
    │   ├── source/
    │   │   └── format
    │   └── templates
    ├── docker/
    │   ├── build/
    │   │   ├── deb/
    │   │   │   ├── Dockerfile
    │   │   │   └── Dockerfile.dockerignore
    │   │   └── docker-image/
    │   │       ├── Dockerfile
    │   │       ├── Dockerfile.dockerignore
    │   │       ├── run_as_user
    │   │       ├── scp
    │   │       ├── setup_default_config.sh
    │   │       └── ssh
    │   ├── stage/
    │   │   ├── deb/
    │   │   │   ├── Dockerfile
    │   │   │   ├── compose-ubu1604.yml
    │   │   │   ├── compose-ubu1804.yml
    │   │   │   ├── compose-ubu2004.yml
    │   │   │   ├── compose.yml
    │   │   │   ├── entrypoint.sh
    │   │   │   ├── expect_seedsync.exp
    │   │   │   ├── id_rsa
    │   │   │   ├── id_rsa.pub
    │   │   │   ├── install_seedsync.sh
    │   │   │   └── ubuntu-systemd/
    │   │   │       ├── ubuntu-16.04-systemd/
    │   │   │       │   ├── Dockerfile
    │   │   │       │   └── setup
    │   │   │       ├── ubuntu-18.04-systemd/
    │   │   │       │   ├── Dockerfile
    │   │   │       │   └── setup
    │   │   │       └── ubuntu-20.04-systemd/
    │   │   │           ├── Dockerfile
    │   │   │           └── setup
    │   │   └── docker-image/
    │   │       └── compose.yml
    │   ├── test/
    │   │   ├── angular/
    │   │   │   ├── Dockerfile
    │   │   │   └── compose.yml
    │   │   ├── e2e/
    │   │   │   ├── Dockerfile
    │   │   │   ├── chrome/
    │   │   │   │   └── Dockerfile
    │   │   │   ├── compose-dev.yml
    │   │   │   ├── compose.yml
    │   │   │   ├── configure/
    │   │   │   │   ├── Dockerfile
    │   │   │   │   └── setup_seedsync.sh
    │   │   │   ├── parse_seedsync_status.py
    │   │   │   ├── remote/
    │   │   │   │   ├── Dockerfile
    │   │   │   │   └── id_rsa.pub
    │   │   │   ├── run_tests.sh
    │   │   │   └── urls.ts
    │   │   └── python/
    │   │       ├── Dockerfile
    │   │       ├── compose.yml
    │   │       └── entrypoint.sh
    │   └── wait-for-it.sh
    ├── e2e/
    │   ├── .gitignore
    │   ├── README.md
    │   ├── conf.ts
    │   ├── package.json
    │   ├── tests/
    │   │   ├── about.page.spec.ts
    │   │   ├── about.page.ts
    │   │   ├── app.spec.ts
    │   │   ├── app.ts
    │   │   ├── autoqueue.page.spec.ts
    │   │   ├── autoqueue.page.ts
    │   │   ├── dashboard.page.spec.ts
    │   │   ├── dashboard.page.ts
    │   │   ├── settings.page.spec.ts
    │   │   └── settings.page.ts
    │   ├── tsconfig.json
    │   └── urls.ts
    ├── pyinstaller_hooks/
    │   └── hook-patoolib.py
    └── python/
        ├── __init__.py
        ├── common/
        │   ├── __init__.py
        │   ├── app_process.py
        │   ├── config.py
        │   ├── constants.py
        │   ├── context.py
        │   ├── error.py
        │   ├── job.py
        │   ├── localization.py
        │   ├── multiprocessing_logger.py
        │   ├── persist.py
        │   ├── status.py
        │   └── types.py
        ├── controller/
        │   ├── __init__.py
        │   ├── auto_queue.py
        │   ├── controller.py
        │   ├── controller_job.py
        │   ├── controller_persist.py
        │   ├── delete/
        │   │   ├── __init__.py
        │   │   └── delete_process.py
        │   ├── extract/
        │   │   ├── __init__.py
        │   │   ├── dispatch.py
        │   │   ├── extract.py
        │   │   └── extract_process.py
        │   ├── model_builder.py
        │   └── scan/
        │       ├── __init__.py
        │       ├── active_scanner.py
        │       ├── local_scanner.py
        │       ├── remote_scanner.py
        │       └── scanner_process.py
        ├── docs/
        │   ├── faq.md
        │   ├── index.md
        │   ├── install.md
        │   └── usage.md
        ├── lftp/
        │   ├── __init__.py
        │   ├── job_status.py
        │   ├── job_status_parser.py
        │   └── lftp.py
        ├── mkdocs.yml
        ├── model/
        │   ├── __init__.py
        │   ├── diff.py
        │   ├── file.py
        │   └── model.py
        ├── pyproject.toml
        ├── scan_fs.py
        ├── seedsync.py
        ├── ssh/
        │   ├── __init__.py
        │   └── sshcp.py
        ├── system/
        │   ├── __init__.py
        │   ├── file.py
        │   └── scanner.py
        ├── tests/
        │   ├── __init__.py
        │   ├── integration/
        │   │   ├── __init__.py
        │   │   ├── test_controller/
        │   │   │   ├── __init__.py
        │   │   │   ├── test_controller.py
        │   │   │   └── test_extract/
        │   │   │       ├── __init__.py
        │   │   │       └── test_extract.py
        │   │   ├── test_lftp/
        │   │   │   ├── __init__.py
        │   │   │   └── test_lftp.py
        │   │   └── test_web/
        │   │       ├── __init__.py
        │   │       ├── test_handler/
        │   │       │   ├── __init__.py
        │   │       │   ├── test_auto_queue.py
        │   │       │   ├── test_config.py
        │   │       │   ├── test_controller.py
        │   │       │   ├── test_server.py
        │   │       │   ├── test_status.py
        │   │       │   ├── test_stream_log.py
        │   │       │   ├── test_stream_model.py
        │   │       │   └── test_stream_status.py
        │   │       └── test_web_app.py
        │   ├── unittests/
        │   │   ├── __init__.py
        │   │   ├── test_common/
        │   │   │   ├── __init__.py
        │   │   │   ├── test_app_process.py
        │   │   │   ├── test_config.py
        │   │   │   ├── test_job.py
        │   │   │   ├── test_multiprocessing_logger.py
        │   │   │   ├── test_persist.py
        │   │   │   └── test_status.py
        │   │   ├── test_controller/
        │   │   │   ├── __init__.py
        │   │   │   ├── test_auto_queue.py
        │   │   │   ├── test_controller_persist.py
        │   │   │   ├── test_extract/
        │   │   │   │   ├── __init__.py
        │   │   │   │   ├── test_dispatch.py
        │   │   │   │   └── test_extract_process.py
        │   │   │   ├── test_model_builder.py
        │   │   │   └── test_scan/
        │   │   │       ├── __init__.py
        │   │   │       ├── test_remote_scanner.py
        │   │   │       └── test_scanner_process.py
        │   │   ├── test_lftp/
        │   │   │   ├── __init__.py
        │   │   │   ├── test_job_status.py
        │   │   │   ├── test_job_status_parser.py
        │   │   │   └── test_lftp.py
        │   │   ├── test_model/
        │   │   │   ├── __init__.py
        │   │   │   ├── test_diff.py
        │   │   │   ├── test_file.py
        │   │   │   └── test_model.py
        │   │   ├── test_seedsync.py
        │   │   ├── test_ssh/
        │   │   │   ├── __init__.py
        │   │   │   └── test_sshcp.py
        │   │   ├── test_system/
        │   │   │   ├── __init__.py
        │   │   │   ├── test_file.py
        │   │   │   └── test_scanner.py
        │   │   └── test_web/
        │   │       ├── __init__.py
        │   │       ├── test_handler/
        │   │       │   └── test_stream_log.py
        │   │       └── test_serialize/
        │   │           ├── __init__.py
        │   │           ├── test_serialize.py
        │   │           ├── test_serialize_auto_queue.py
        │   │           ├── test_serialize_config.py
        │   │           ├── test_serialize_log_record.py
        │   │           ├── test_serialize_model.py
        │   │           └── test_serialize_status.py
        │   └── utils.py
        └── web/
            ├── __init__.py
            ├── handler/
            │   ├── __init__.py
            │   ├── auto_queue.py
            │   ├── config.py
            │   ├── controller.py
            │   ├── server.py
            │   ├── status.py
            │   ├── stream_log.py
            │   ├── stream_model.py
            │   └── stream_status.py
            ├── serialize/
            │   ├── __init__.py
            │   ├── serialize.py
            │   ├── serialize_auto_queue.py
            │   ├── serialize_config.py
            │   ├── serialize_log_record.py
            │   ├── serialize_model.py
            │   └── serialize_status.py
            ├── utils.py
            ├── web_app.py
            ├── web_app_builder.py
            └── web_app_job.py
Download .txt
SYMBOL INDEX (1608 symbols across 171 files)

FILE: src/angular/e2e/app.po.ts
  class AppPage (line 3) | class AppPage {
    method navigateTo (line 4) | navigateTo() {
    method getParagraphText (line 8) | getParagraphText() {

FILE: src/angular/protractor.conf.js
  method onPrepare (line 22) | onPrepare() {

FILE: src/angular/src/app/app.module.ts
  class AppModule (line 123) | class AppModule {
    method constructor (line 124) | constructor(private logger: LoggerService) {
  function dummyFactory (line 130) | function dummyFactory(s) {

FILE: src/angular/src/app/common/cached-reuse-strategy.ts
  class CachedReuseStrategy (line 9) | class CachedReuseStrategy implements RouteReuseStrategy {
    method shouldDetach (line 14) | shouldDetach(route: ActivatedRouteSnapshot): boolean {
    method store (line 18) | store(route: ActivatedRouteSnapshot, handle: DetachedRouteHandle): void {
    method shouldAttach (line 22) | shouldAttach(route: ActivatedRouteSnapshot): boolean {
    method retrieve (line 26) | retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle {
    method shouldReuseRoute (line 31) | shouldReuseRoute(future: ActivatedRouteSnapshot, curr: ActivatedRouteS...

FILE: src/angular/src/app/common/capitalize.pipe.ts
  class CapitalizePipe (line 4) | class CapitalizePipe implements PipeTransform {
    method transform (line 6) | transform(value: any) {

FILE: src/angular/src/app/common/click-stop-propagation.directive.ts
  class ClickStopPropagationDirective (line 6) | class ClickStopPropagationDirective {
    method onClick (line 8) | public onClick(event: any): void {

FILE: src/angular/src/app/common/eta.pipe.ts
  class EtaPipe (line 7) | class EtaPipe implements PipeTransform {
    method transform (line 15) | transform(seconds: number = 0): string {

FILE: src/angular/src/app/common/file-size.pipe.ts
  class FileSizePipe (line 15) | class FileSizePipe implements PipeTransform {
    method transform (line 26) | transform(bytes: number = 0, precision: number = 2 ): string {

FILE: src/angular/src/app/common/localization.ts
  class Localization (line 1) | class Localization {

FILE: src/angular/src/app/common/storage-keys.ts
  class StorageKeys (line 1) | class StorageKeys {

FILE: src/angular/src/app/pages/about/about-page.component.ts
  class AboutPageComponent (line 13) | class AboutPageComponent {
    method constructor (line 17) | constructor() {

FILE: src/angular/src/app/pages/autoqueue/autoqueue-page.component.ts
  class AutoQueuePageComponent (line 24) | class AutoQueuePageComponent implements OnInit {
    method constructor (line 37) | constructor(private _changeDetector: ChangeDetectorRef,
    method ngOnInit (line 51) | ngOnInit() {
    method onAddPattern (line 76) | onAddPattern() {
    method onRemovePattern (line 95) | onRemovePattern(pattern: AutoQueuePattern) {

FILE: src/angular/src/app/pages/files/file-list.component.ts
  class FileListComponent (line 20) | class FileListComponent {
    method constructor (line 25) | constructor(private _logger: LoggerService,
    method identify (line 38) | static identify(index: number, item: ViewFile): string {
    method onSelect (line 42) | onSelect(file: ViewFile): void {
    method onQueue (line 50) | onQueue(file: ViewFile) {
    method onStop (line 56) | onStop(file: ViewFile) {
    method onExtract (line 62) | onExtract(file: ViewFile) {
    method onDeleteLocal (line 68) | onDeleteLocal(file: ViewFile) {
    method onDeleteRemote (line 74) | onDeleteRemote(file: ViewFile) {

FILE: src/angular/src/app/pages/files/file-options.component.ts
  class FileOptionsComponent (line 20) | class FileOptionsComponent implements OnInit {
    method constructor (line 37) | constructor(private _changeDetector: ChangeDetectorRef,
    method ngOnInit (line 45) | ngOnInit() {
    method onFilterByName (line 73) | onFilterByName(name: string) {
    method onFilterByStatus (line 77) | onFilterByStatus(status: ViewFile.Status) {
    method onSort (line 81) | onSort(sortMethod: ViewFileOptions.SortMethod) {
    method onToggleShowDetails (line 85) | onToggleShowDetails(){
    method onTogglePinFilter (line 89) | onTogglePinFilter() {
    method isStatusEnabled (line 93) | private static isStatusEnabled(files: Immutable.List<ViewFile>, status...

FILE: src/angular/src/app/pages/files/file.component.ts
  class FileComponent (line 20) | class FileComponent implements OnChanges {
    method constructor (line 45) | constructor(private modal: Modal) {}
    method ngOnChanges (line 47) | ngOnChanges(changes: SimpleChanges): void {
    method showDeleteConfirmation (line 62) | showDeleteConfirmation(title: string, message: string, callback: () =>...
    method isQueueable (line 82) | isQueueable() {
    method isStoppable (line 86) | isStoppable() {
    method isExtractable (line 90) | isExtractable() {
    method isLocallyDeletable (line 94) | isLocallyDeletable() {
    method isRemotelyDeletable (line 98) | isRemotelyDeletable() {
    method onQueue (line 102) | onQueue(file: ViewFile) {
    method onStop (line 108) | onStop(file: ViewFile) {
    method onExtract (line 114) | onExtract(file: ViewFile) {
    method onDeleteLocal (line 120) | onDeleteLocal(file: ViewFile) {
    method onDeleteRemote (line 132) | onDeleteRemote(file: ViewFile) {
    method isElementInViewport (line 145) | private static isElementInViewport (el) {
  type FileAction (line 156) | enum FileAction {

FILE: src/angular/src/app/pages/files/files-page.component.ts
  class FilesPageComponent (line 8) | class FilesPageComponent {

FILE: src/angular/src/app/pages/logs/logs-page.component.ts
  class LogsPageComponent (line 22) | class LogsPageComponent implements OnInit, AfterContentChecked {
    method constructor (line 42) | constructor(private _elementRef: ElementRef,
    method ngOnInit (line 50) | ngOnInit() {
    method ngAfterContentChecked (line 58) | ngAfterContentChecked() {
    method scrollToTop (line 63) | scrollToTop() {
    method scrollToBottom (line 68) | scrollToBottom() {
    method checkScroll (line 73) | checkScroll() {
    method insertRecord (line 77) | private insertRecord(record: LogRecord) {
    method refreshScrollButtonVisibility (line 90) | private refreshScrollButtonVisibility() {
    method isElementInViewport (line 101) | private static isElementInViewport(el): boolean {

FILE: src/angular/src/app/pages/main/app.component.ts
  class AppComponent (line 13) | class AppComponent implements OnInit, AfterViewInit {
    method constructor (line 19) | constructor(private router: Router,
    method ngOnInit (line 30) | ngOnInit() {
    method ngAfterViewInit (line 40) | ngAfterViewInit() {

FILE: src/angular/src/app/pages/main/header.component.ts
  class HeaderComponent (line 19) | class HeaderComponent implements OnInit {
    method constructor (line 31) | constructor(private _logger: LoggerService,
    method dismiss (line 40) | public dismiss(notif: Notification) {
    method ngOnInit (line 44) | ngOnInit() {

FILE: src/angular/src/app/pages/main/sidebar.component.ts
  class SidebarComponent (line 15) | class SidebarComponent implements OnInit {
    method constructor (line 22) | constructor(private _logger: LoggerService,
    method ngOnInit (line 30) | ngOnInit() {
    method onCommandRestart (line 38) | onCommandRestart() {

FILE: src/angular/src/app/pages/settings/option.component.ts
  class OptionComponent (line 12) | class OptionComponent implements OnInit {
    method ngOnInit (line 28) | ngOnInit(): void {
    method onChange (line 39) | onChange(value: any) {
  type OptionType (line 44) | enum OptionType {

FILE: src/angular/src/app/pages/settings/options-list.ts
  type IOption (line 3) | interface IOption {
  type IOptionsContext (line 9) | interface IOptionsContext {
  constant OPTIONS_CONTEXT_SERVER (line 15) | const OPTIONS_CONTEXT_SERVER: IOptionsContext = {
  constant OPTIONS_CONTEXT_DISCOVERY (line 70) | const OPTIONS_CONTEXT_DISCOVERY: IOptionsContext = {
  constant OPTIONS_CONTEXT_CONNECTIONS (line 95) | const OPTIONS_CONTEXT_CONNECTIONS: IOptionsContext = {
  constant OPTIONS_CONTEXT_OTHER (line 143) | const OPTIONS_CONTEXT_OTHER: IOptionsContext = {
  constant OPTIONS_CONTEXT_AUTOQUEUE (line 162) | const OPTIONS_CONTEXT_AUTOQUEUE: IOptionsContext = {
  constant OPTIONS_CONTEXT_EXTRACT (line 187) | const OPTIONS_CONTEXT_EXTRACT: IOptionsContext = {

FILE: src/angular/src/app/pages/settings/settings-page.component.ts
  class SettingsPageComponent (line 26) | class SettingsPageComponent implements OnInit {
    method constructor (line 43) | constructor(private _logger: LoggerService,
    method ngOnInit (line 59) | ngOnInit() {
    method onSetConfig (line 73) | onSetConfig(section: string, option: string, value: any) {
    method onCommandRestart (line 107) | onCommandRestart() {

FILE: src/angular/src/app/routes.ts
  type RouteInfo (line 11) | interface RouteInfo {
  constant ROUTE_INFOS (line 18) | const ROUTE_INFOS: Immutable.List<RouteInfo> = Immutable.List([
  constant ROUTES (line 51) | const ROUTES: Routes = [

FILE: src/angular/src/app/services/autoqueue/autoqueue-pattern.ts
  type IAutoQueuePattern (line 3) | interface IAutoQueuePattern {
  class AutoQueuePattern (line 12) | class AutoQueuePattern extends AutoQueuePatternRecord implements IAutoQu...
    method constructor (line 15) | constructor(props) {
  type AutoQueuePatternJson (line 24) | interface AutoQueuePatternJson {

FILE: src/angular/src/app/services/autoqueue/autoqueue.service.ts
  class AutoQueueService (line 19) | class AutoQueueService extends BaseWebService {
    method constructor (line 28) | constructor(_streamServiceProvider: StreamServiceRegistry,
    method patterns (line 38) | get patterns(): Observable<Immutable.List<AutoQueuePattern>> {
    method add (line 47) | public add(pattern: string): Observable<WebReaction> {
    method remove (line 91) | public remove(pattern: string): Observable<WebReaction> {
    method onConnected (line 120) | protected onConnected() {
    method onDisconnected (line 125) | protected onDisconnected() {
    method getPatterns (line 130) | private getPatterns() {

FILE: src/angular/src/app/services/base/base-stream.service.ts
  method constructor (line 21) | constructor() {}
  method getEventNames (line 23) | getEventNames(): string[] {
  method notifyConnected (line 27) | notifyConnected() {
  method notifyDisconnected (line 31) | notifyDisconnected() {
  method notifyEvent (line 35) | notifyEvent(eventName: string, data: string) {
  method registerEventName (line 39) | protected registerEventName(eventName: string) {

FILE: src/angular/src/app/services/base/base-web.service.ts
  method onInit (line 20) | public onInit() {
  method constructor (line 32) | constructor(_streamServiceProvider: StreamServiceRegistry) {

FILE: src/angular/src/app/services/base/stream-service.registry.ts
  class EventSourceFactory (line 12) | class EventSourceFactory {
    method createEventSource (line 13) | static createEventSource(url: string) {
  type IStreamService (line 19) | interface IStreamService {
  class StreamDispatchService (line 51) | class StreamDispatchService {
    method constructor (line 59) | constructor(private _logger: LoggerService,
    method onInit (line 66) | public onInit() {
    method registerService (line 75) | public registerService(service: IStreamService) {
    method createSseObserver (line 83) | private createSseObserver() {
  class StreamServiceRegistry (line 146) | class StreamServiceRegistry {
    method constructor (line 148) | constructor(private _dispatch: StreamDispatchService,
    method onInit (line 163) | public onInit() {
    method modelFileService (line 167) | get modelFileService(): ModelFileService { return this._modelFileServi...
    method serverStatusService (line 168) | get serverStatusService(): ServerStatusService { return this._serverSt...
    method connectedService (line 169) | get connectedService(): ConnectedService { return this._connectedServi...
    method logService (line 170) | get logService(): LogService { return this._logService; }

FILE: src/angular/src/app/services/files/mock-model-files.ts
  constant MOCK_MODEL_FILES (line 5) | const MOCK_MODEL_FILES: Immutable.Map<string, ModelFile> = Immutable.Map({

FILE: src/angular/src/app/services/files/model-file.service.ts
  class ModelFileService (line 24) | class ModelFileService extends BaseStreamService {
    method constructor (line 33) | constructor(private _logger: LoggerService,
    method files (line 42) | get files(): Observable<Immutable.Map<string, ModelFile>> {
    method queue (line 51) | public queue(file: ModelFile): Observable<WebReaction> {
    method stop (line 64) | public stop(file: ModelFile): Observable<WebReaction> {
    method extract (line 77) | public extract(file: ModelFile): Observable<WebReaction> {
    method deleteLocal (line 90) | public deleteLocal(file: ModelFile): Observable<WebReaction> {
    method deleteRemote (line 103) | public deleteRemote(file: ModelFile): Observable<WebReaction> {
    method onEvent (line 111) | protected onEvent(eventName: string, data: string) {
    method onConnected (line 115) | protected onConnected() {
    method onDisconnected (line 119) | protected onDisconnected() {
    method parseEvent (line 129) | private parseEvent(name: string, data: string) {

FILE: src/angular/src/app/services/files/model-file.ts
  type IModelFile (line 7) | interface IModelFile {
  class ModelFile (line 49) | class ModelFile extends ModelFileRecord implements IModelFile {
    method constructor (line 65) | constructor(props) {
  function fromJson (line 72) | function fromJson(json): ModelFile {
  type State (line 100) | enum State {

FILE: src/angular/src/app/services/files/screenshot-model-files.ts
  constant SCREENSHOT_MODEL_FILES (line 5) | const SCREENSHOT_MODEL_FILES: Immutable.Map<string, ModelFile> = Immutab...

FILE: src/angular/src/app/services/files/view-file-filter.service.ts
  class AndFilterCriteria (line 9) | class AndFilterCriteria implements ViewFileFilterCriteria {
    method constructor (line 10) | constructor(private a: ViewFileFilterCriteria,
    method meetsCriteria (line 14) | meetsCriteria(viewFile: ViewFile): boolean {
  class StatusFilterCriteria (line 19) | class StatusFilterCriteria implements ViewFileFilterCriteria {
    method constructor (line 20) | constructor(private _status: ViewFile.Status) {}
    method status (line 22) | get status(): ViewFile.Status {
    method meetsCriteria (line 26) | meetsCriteria(viewFile: ViewFile): boolean {
  class NameFilterCriteria (line 31) | class NameFilterCriteria implements ViewFileFilterCriteria {
    method name (line 35) | get name(): string {
    method constructor (line 39) | constructor(name: string) {
    method meetsCriteria (line 52) | meetsCriteria(viewFile: ViewFile): boolean {
  class ViewFileFilterService (line 71) | class ViewFileFilterService {
    method constructor (line 75) | constructor(private _logger: LoggerService,
    method buildFilterCriteria (line 104) | private buildFilterCriteria(): ViewFileFilterCriteria {

FILE: src/angular/src/app/services/files/view-file-options.service.ts
  class ViewFileOptionsService (line 20) | class ViewFileOptionsService {
    method constructor (line 24) | constructor(private _logger: LoggerService,
    method options (line 46) | get options(): Observable<ViewFileOptions> {
    method setShowDetails (line 50) | public setShowDetails(show: boolean) {
    method setSortMethod (line 60) | public setSortMethod(sortMethod: ViewFileOptions.SortMethod) {
    method setSelectedStatusFilter (line 70) | public setSelectedStatusFilter(status: ViewFile.Status) {
    method setNameFilter (line 79) | public setNameFilter(name: string) {
    method setPinFilter (line 88) | public setPinFilter(pinned: boolean) {

FILE: src/angular/src/app/services/files/view-file-options.ts
  type IViewFileOptions (line 9) | interface IViewFileOptions {
  class ViewFileOptions (line 41) | class ViewFileOptions extends ViewFileOptionsRecord implements IViewFile...
    method constructor (line 48) | constructor(props) {
  type SortMethod (line 54) | enum SortMethod {

FILE: src/angular/src/app/services/files/view-file-sort.service.ts
  class ViewFileSortService (line 70) | class ViewFileSortService {
    method constructor (line 73) | constructor(private _logger: LoggerService,

FILE: src/angular/src/app/services/files/view-file.service.ts
  type ViewFileFilterCriteria (line 19) | interface ViewFileFilterCriteria {
  type ViewFileComparator (line 27) | interface ViewFileComparator {
  class ViewFileService (line 72) | class ViewFileService {
    method constructor (line 88) | constructor(private _logger: LoggerService,
    method buildViewFromModelFiles (line 108) | private buildViewFromModelFiles(modelFiles: Immutable.Map<string, Mode...
    method files (line 189) | get files(): Observable<Immutable.List<ViewFile>> {
    method filteredFiles (line 193) | get filteredFiles(): Observable<Immutable.List<ViewFile>> {
    method setSelected (line 201) | public setSelected(file: ViewFile) {
    method unsetSelected (line 239) | public unsetSelected() {
    method queue (line 262) | public queue(file: ViewFile): Observable<WebReaction> {
    method stop (line 272) | public stop(file: ViewFile): Observable<WebReaction> {
    method extract (line 282) | public extract(file: ViewFile): Observable<WebReaction> {
    method deleteLocal (line 292) | public deleteLocal(file: ViewFile): Observable<WebReaction> {
    method deleteRemote (line 302) | public deleteRemote(file: ViewFile): Observable<WebReaction> {
    method setFilterCriteria (line 311) | public setFilterCriteria(criteria: ViewFileFilterCriteria) {
    method setComparator (line 320) | public setComparator(comparator: ViewFileComparator) {
    method createViewFile (line 338) | private static createViewFile(modelFile: ModelFile, isSelected: boolea...
    method createAction (line 445) | private createAction(file: ViewFile,
    method pushViewFiles (line 463) | private pushViewFiles() {

FILE: src/angular/src/app/services/files/view-file.ts
  type IViewFile (line 7) | interface IViewFile {
  class ViewFile (line 60) | class ViewFile extends ViewFileRecord implements IViewFile {
    method constructor (line 83) | constructor(props) {
  type Status (line 89) | enum Status {

FILE: src/angular/src/app/services/logs/log-record.ts
  type ILogRecord (line 7) | interface ILogRecord {
  class LogRecord (line 22) | class LogRecord extends LogRecordRecord implements ILogRecord {
    method constructor (line 29) | constructor(props) {
  function fromJson (line 36) | function fromJson(json: LogRecordJson): LogRecord {
  type Level (line 47) | enum Level {
  type LogRecordJson (line 61) | interface LogRecordJson {

FILE: src/angular/src/app/services/logs/log.service.ts
  class LogService (line 10) | class LogService extends BaseStreamService {
    method constructor (line 14) | constructor() {
    method logs (line 23) | get logs(): Observable<LogRecord> {
    method onEvent (line 27) | protected onEvent(eventName: string, data: string) {
    method onConnected (line 31) | protected onConnected() {
    method onDisconnected (line 35) | protected onDisconnected() {

FILE: src/angular/src/app/services/server/server-command.service.ts
  class ServerCommandService (line 13) | class ServerCommandService extends BaseWebService {
    method constructor (line 16) | constructor(_streamServiceProvider: StreamServiceRegistry,
    method restart (line 25) | public restart(): Observable<WebReaction> {
    method onConnected (line 29) | protected onConnected() {
    method onDisconnected (line 33) | protected onDisconnected() {

FILE: src/angular/src/app/services/server/server-status.service.ts
  class ServerStatusService (line 11) | class ServerStatusService extends BaseStreamService {
    method constructor (line 21) | constructor() {
    method status (line 26) | get status(): Observable<ServerStatus> {
    method onEvent (line 30) | protected onEvent(eventName: string, data: string) {
    method onConnected (line 34) | protected onConnected() {
    method onDisconnected (line 38) | protected onDisconnected() {
    method parseStatus (line 52) | private parseStatus(data: string) {

FILE: src/angular/src/app/services/server/server-status.ts
  type IServerStatus (line 6) | interface IServerStatus {
  class ServerStatus (line 32) | class ServerStatus extends ServerStatusRecord implements IServerStatus {
    method constructor (line 45) | constructor(props) {
  function fromJson (line 52) | function fromJson(json: ServerStatusJson): ServerStatus {
  type ServerStatusJson (line 84) | interface ServerStatusJson {

FILE: src/angular/src/app/services/settings/config.service.ts
  class ConfigService (line 17) | class ConfigService extends BaseWebService {
    method constructor (line 26) | constructor(_streamServiceProvider: StreamServiceRegistry,
    method config (line 36) | get config(): Observable<Config> {
    method set (line 47) | public set(section: string, option: string, value: any): Observable<We...
    method onConnected (line 79) | protected onConnected() {
    method onDisconnected (line 84) | protected onDisconnected() {
    method getConfig (line 89) | private getConfig() {

FILE: src/angular/src/app/services/settings/config.ts
  type IGeneral (line 11) | interface IGeneral {
  type ILftp (line 22) | interface ILftp {
  type IController (line 59) | interface IController {
  type IWeb (line 78) | interface IWeb {
  type IAutoQueue (line 89) | interface IAutoQueue {
  type IConfig (line 106) | interface IConfig {
  class Config (line 124) | class Config extends ConfigRecord implements IConfig {
    method constructor (line 131) | constructor(props) {

FILE: src/angular/src/app/services/utils/connected.service.ts
  class ConnectedService (line 15) | class ConnectedService extends BaseStreamService {
    method constructor (line 20) | constructor() {
    method connected (line 25) | get connected(): Observable<boolean> {
    method onEvent (line 29) | protected onEvent(eventName: string, data: string) {
    method onConnected (line 33) | protected onConnected() {
    method onDisconnected (line 39) | protected onDisconnected() {

FILE: src/angular/src/app/services/utils/dom.service.ts
  class DomService (line 11) | class DomService {
    method headerHeight (line 14) | get headerHeight(): Observable<number>{
    method setHeaderHeight (line 18) | public setHeaderHeight(height: number) {

FILE: src/angular/src/app/services/utils/logger.service.ts
  class LoggerService (line 4) | class LoggerService {
    method constructor (line 8) | constructor() {
    method debug (line 12) | get debug() {
    method info (line 20) | get info() {
    method warn (line 29) | get warn() {
    method error (line 37) | get error() {
  type Level (line 47) | enum Level {

FILE: src/angular/src/app/services/utils/notification.service.ts
  class NotificationService (line 14) | class NotificationService {
    method constructor (line 38) | constructor() {}
    method notifications (line 40) | get notifications(): Observable<Immutable.List<Notification>> {
    method show (line 44) | public show(notification: Notification) {
    method hide (line 53) | public hide(notification: Notification) {

FILE: src/angular/src/app/services/utils/notification.ts
  type INotification (line 3) | interface INotification {
  class Notification (line 18) | class Notification extends NotificationRecord implements INotification {
    method constructor (line 24) | constructor(props) {
  type Level (line 33) | enum Level {

FILE: src/angular/src/app/services/utils/rest.service.ts
  class WebReaction (line 12) | class WebReaction {
    method constructor (line 17) | constructor(success: boolean, data: string, errorMessage: string) {
  class RestService (line 29) | class RestService {
    method constructor (line 31) | constructor(private _logger: LoggerService,
    method sendRequest (line 40) | public sendRequest(url: string): Observable<WebReaction> {

FILE: src/angular/src/app/services/utils/version-check.service.ts
  class VersionCheckService (line 20) | class VersionCheckService {
    method constructor (line 24) | constructor(private _restService: RestService,
    method checkVersion (line 30) | private checkVersion() {
    method isVersionNewer (line 62) | private static isVersionNewer(version: string): boolean {

FILE: src/angular/src/app/tests/mocks/mock-event-source.ts
  class MockEventSource (line 3) | class MockEventSource {
    method constructor (line 10) | constructor(url: string) {
    method addEventListener (line 14) | addEventListener(type: string, listener: EventListener) {
    method close (line 18) | close() {}
  function createMockEventSource (line 21) | function createMockEventSource(url: string): MockEventSource {

FILE: src/angular/src/app/tests/mocks/mock-model-file.service.ts
  class MockModelFileService (line 9) | class MockModelFileService {
    method files (line 13) | get files(): Observable<Immutable.Map<string, ModelFile>> {

FILE: src/angular/src/app/tests/mocks/mock-rest.service.ts
  class MockRestService (line 5) | class MockRestService {
    method sendRequest (line 6) | public sendRequest(url: string): Observable<WebReaction> {

FILE: src/angular/src/app/tests/mocks/mock-storage.service.ts
  class MockStorageService (line 1) | class MockStorageService {
    method get (line 3) | public get(key: string): any {}
    method set (line 6) | set(key: string, value: any): void {}
    method remove (line 9) | remove(key: string): void {}

FILE: src/angular/src/app/tests/mocks/mock-stream-service.registry.ts
  class MockStreamServiceRegistry (line 7) | class MockStreamServiceRegistry {
    method connect (line 14) | connect() {
    method disconnect (line 18) | disconnect() {

FILE: src/angular/src/app/tests/mocks/mock-view-file-options.service.ts
  class MockViewFileOptionsService (line 7) | class MockViewFileOptionsService {
    method options (line 11) | get options(): Observable<ViewFileOptions> {

FILE: src/angular/src/app/tests/mocks/mock-view-file.service.ts
  class MockViewFileService (line 10) | class MockViewFileService {
    method files (line 15) | get files(): Observable<Immutable.List<ViewFile>> {
    method filteredFiles (line 19) | get filteredFiles(): Observable<Immutable.List<ViewFile>> {
    method setFilterCriteria (line 24) | public setFilterCriteria(criteria: ViewFileFilterCriteria) {}
    method setComparator (line 27) | public setComparator(comparator: ViewFileComparator) {}

FILE: src/angular/src/app/tests/unittests/services/base/base-stream.service.spec.ts
  class TestBaseStreamService (line 12) | class TestBaseStreamService extends BaseStreamService {
    method registerEventName (line 15) | public registerEventName(eventName: string) {
    method onEvent (line 19) | protected onEvent(eventName: string, data: string) {
    method onConnected (line 24) | public onConnected() {}
    method onDisconnected (line 26) | public onDisconnected() {}

FILE: src/angular/src/app/tests/unittests/services/base/base-web.service.spec.ts
  class TestBaseWebService (line 14) | class TestBaseWebService extends BaseWebService {
    method onConnected (line 15) | public onConnected(): void {}
    method onDisconnected (line 17) | public onDisconnected(): void {}

FILE: src/angular/src/app/tests/unittests/services/base/stream-service.registry.spec.ts
  class MockStreamService (line 12) | class MockStreamService implements IStreamService {
    method getEventNames (line 16) | getEventNames(): string[] {
    method notifyConnected (line 20) | notifyConnected() {
    method notifyDisconnected (line 24) | notifyDisconnected() {
    method notifyEvent (line 28) | notifyEvent(eventName: string, data: string) {

FILE: src/angular/src/app/tests/unittests/services/files/view-file-options.service.spec.ts
  function createViewOptionsService (line 12) | function createViewOptionsService(): ViewFileOptionsService {

FILE: src/angular/src/app/tests/unittests/services/files/view-file.service.spec.ts
  class TestCriteria (line 711) | class TestCriteria implements ViewFileFilterCriteria {
    method meetsCriteria (line 712) | meetsCriteria(viewFile: ViewFile): boolean {
    method constructor (line 754) | constructor(public flag: boolean) {}
    method meetsCriteria (line 755) | meetsCriteria(viewFile: ViewFile): boolean {
  class TestCriteria (line 753) | class TestCriteria implements ViewFileFilterCriteria {
    method meetsCriteria (line 712) | meetsCriteria(viewFile: ViewFile): boolean {
    method constructor (line 754) | constructor(public flag: boolean) {}
    method meetsCriteria (line 755) | meetsCriteria(viewFile: ViewFile): boolean {

FILE: src/angular/src/app/tests/unittests/services/utils/notification.service.spec.ts
  class TestNotificationService (line 9) | class TestNotificationService extends NotificationService {
  function sleepFor (line 139) | function sleepFor( sleepDuration ) {
  function sleepFor (line 171) | function sleepFor( sleepDuration ) {

FILE: src/angular/src/app/tests/unittests/services/utils/version-check.service.spec.ts
  function createVersionCheckService (line 40) | function createVersionCheckService(): VersionCheckService {

FILE: src/angular/src/typings.d.ts
  type NodeModule (line 4) | interface NodeModule {

FILE: src/docker/test/e2e/urls.ts
  class Urls (line 1) | class Urls {

FILE: src/e2e/tests/about.page.ts
  class AboutPage (line 8) | class AboutPage extends App {
    method navigateTo (line 9) | navigateTo() {
    method getVersion (line 13) | getVersion(): Promise<string> {

FILE: src/e2e/tests/app.ts
  class App (line 7) | class App {
    method navigateTo (line 8) | navigateTo() {
    method getTitle (line 12) | getTitle(): Promise<string> {
    method getSidebarItems (line 16) | getSidebarItems(): Promise<Array<string>> {
    method getTopTitle (line 22) | getTopTitle(): Promise<string> {

FILE: src/e2e/tests/autoqueue.page.ts
  class AutoQueuePage (line 8) | class AutoQueuePage extends App {
    method navigateTo (line 9) | navigateTo() {
    method getPatterns (line 13) | getPatterns(): Promise<Array<string>> {
    method addPattern (line 19) | addPattern(pattern: string) {
    method removePattern (line 26) | removePattern(index: number) {

FILE: src/e2e/tests/dashboard.page.ts
  class File (line 8) | class File {
    method constructor (line 9) | constructor(public name,
  class FileActionButtonState (line 15) | class FileActionButtonState {
    method constructor (line 16) | constructor(public title,
  class DashboardPage (line 21) | class DashboardPage extends App {
    method navigateTo (line 22) | navigateTo() {
    method getFiles (line 31) | getFiles(): Promise<Array<File>> {
    method selectFile (line 51) | selectFile(index: number) {
    method isFileActionsVisible (line 55) | isFileActionsVisible(index: number) {
    method getFileActions (line 60) | getFileActions(index: number): Promise<Array<FileActionButtonState>> {

FILE: src/e2e/tests/settings.page.ts
  class SettingsPage (line 8) | class SettingsPage extends App {
    method navigateTo (line 9) | navigateTo() {

FILE: src/e2e/urls.ts
  class Urls (line 1) | class Urls {

FILE: src/python/common/app_process.py
  class ExceptionWrapper (line 20) | class ExceptionWrapper:
    method __init__ (line 25) | def __init__(self, ee):
    method re_raise (line 29) | def re_raise(self):
  class AppProcess (line 33) | class AppProcess(Process):
    method __init__ (line 45) | def __init__(self, name: str):
    method set_multiprocessing_logger (line 54) | def set_multiprocessing_logger(self, mp_logger: MultiprocessingLogger):
    method run (line 58) | def run(self):
    method terminate (line 101) | def terminate(self):
    method propagate_exception (line 117) | def propagate_exception(self):
    method run_init (line 129) | def run_init(self):
    method run_cleanup (line 137) | def run_cleanup(self):
    method run_loop (line 145) | def run_loop(self):
  class AppOneShotProcess (line 156) | class AppOneShotProcess(AppProcess):
    method run_loop (line 160) | def run_loop(self):
    method run_cleanup (line 164) | def run_cleanup(self):
    method run_init (line 167) | def run_init(self):
    method run_once (line 171) | def run_once(self):

FILE: src/python/common/config.py
  class ConfigError (line 16) | class ConfigError(AppError):
  class Converters (line 31) | class Converters:
    method null (line 33) | def null(_: T, __: str, value: str) -> str:
    method int (line 37) | def int(cls: T, name: str, value: str) -> int:
    method bool (line 51) | def bool(cls: T, name: str, value: str) -> bool:
  class Checkers (line 65) | class Checkers:
    method null (line 67) | def null(_: T, __: str, value: Any) -> Any:
    method string_nonempty (line 71) | def string_nonempty(cls: T, name: str, value: str) -> str:
    method int_non_negative (line 79) | def int_non_negative(cls: T, name: str, value: int) -> int:
    method int_positive (line 87) | def int_positive(cls: T, name: str, value: int) -> int:
  class InnerConfig (line 95) | class InnerConfig(ABC):
    class PropMetadata (line 107) | class PropMetadata:
      method __init__ (line 109) | def __init__(self, checker: Callable, converter: Callable):
    method _create_property (line 118) | def _create_property(cls, name: str, checker: Callable, converter: Cal...
    method _get_property (line 126) | def _get_property(self, name: str) -> Any:
    method _set_property (line 129) | def _set_property(self, name: str, value: Any, checker: Callable):
    method from_dict (line 137) | def from_dict(cls: Type[T], config_dict: InnerConfigType) -> T:
    method as_dict (line 164) | def as_dict(self) -> InnerConfigType:
    method has_property (line 181) | def has_property(self, name: str) -> bool:
    method set_property (line 192) | def set_property(self, name: str, value: Any):
  class Config (line 215) | class Config(Persist):
    class General (line 219) | class General(IC):
      method __init__ (line 223) | def __init__(self):
    class Lftp (line 228) | class Lftp(IC):
      method __init__ (line 250) | def __init__(self):
    class Controller (line 267) | class Controller(IC):
      method __init__ (line 274) | def __init__(self):
    class Web (line 282) | class Web(InnerConfig):
      method __init__ (line 285) | def __init__(self):
    class AutoQueue (line 289) | class AutoQueue(InnerConfig):
      method __init__ (line 294) | def __init__(self):
    method __init__ (line 300) | def __init__(self):
    method _check_section (line 308) | def _check_section(dct: OuterConfigType, name: str) -> InnerConfigType:
    method _check_empty_outer_dict (line 316) | def _check_empty_outer_dict(dct: OuterConfigType):
    method from_str (line 323) | def from_str(cls: "Config", content: str) -> "Config":
    method to_str (line 342) | def to_str(self) -> str:
    method from_dict (line 355) | def from_dict(config_dict: OuterConfigType) -> "Config":
    method as_dict (line 368) | def as_dict(self) -> OuterConfigType:
    method has_section (line 379) | def has_section(self, name: str) -> bool:

FILE: src/python/common/constants.py
  class Constants (line 4) | class Constants:

FILE: src/python/common/context.py
  class Args (line 12) | class Args:
    method __init__ (line 18) | def __init__(self):
    method as_dict (line 24) | def as_dict(self) -> dict:
  class Context (line 33) | class Context:
    method __init__ (line 37) | def __init__(self,
    method create_child_context (line 53) | def create_child_context(self, context_name: str) -> "Context":
    method print_to_log (line 58) | def print_to_log(self):

FILE: src/python/common/error.py
  class AppError (line 4) | class AppError(Exception):
  class ServiceExit (line 11) | class ServiceExit(AppError):
  class ServiceRestart (line 19) | class ServiceRestart(AppError):

FILE: src/python/common/job.py
  class Job (line 13) | class Job(threading.Thread, ABC):
    method __init__ (line 19) | def __init__(self, name: str, context: Context):
    method run (line 32) | def run(self):
    method terminate (line 61) | def terminate(self):
    method propagate_exception (line 68) | def propagate_exception(self):
    method setup (line 80) | def setup(self):
    method execute (line 88) | def execute(self):
    method cleanup (line 98) | def cleanup(self):

FILE: src/python/common/localization.py
  class Localization (line 4) | class Localization:
    class Error (line 5) | class Error:

FILE: src/python/common/multiprocessing_logger.py
  class MultiprocessingLogger (line 12) | class MultiprocessingLogger:
    method __init__ (line 25) | def __init__(self, base_logger: logging.Logger):
    method start (line 34) | def start(self):
    method stop (line 37) | def stop(self):
    method propagate_exception (line 41) | def propagate_exception(self):
    method get_process_safe_logger (line 52) | def get_process_safe_logger(self) -> logging.Logger:
    method __listener (line 72) | def __listener(self):

FILE: src/python/common/persist.py
  class Serializable (line 16) | class Serializable(ABC):
    method from_str (line 23) | def from_str(cls: Type[T_Serializable], content: str) -> T_Serializable:
    method to_str (line 27) | def to_str(self) -> str:
  class PersistError (line 31) | class PersistError(AppError):
  class Persist (line 38) | class Persist(Serializable):
    method from_file (line 46) | def from_file(cls: Type[T_Persist], file_path: str) -> T_Persist:
    method to_file (line 52) | def to_file(self, file_path: str):
    method from_str (line 58) | def from_str(cls: Type[T_Persist], content: str) -> T_Persist:
    method to_str (line 62) | def to_str(self) -> str:

FILE: src/python/common/status.py
  class IStatusComponentListener (line 13) | class IStatusComponentListener(ABC):
    method notify (line 15) | def notify(self, name: str):
  class BaseStatus (line 24) | class BaseStatus:
    method _create_property (line 31) | def _create_property(cls, name: str) -> property:
    method _get_property (line 35) | def _get_property(self, name: str) -> Any:
    method _set_property (line 38) | def _set_property(self, name: str, value: Any):
  class StatusComponent (line 42) | class StatusComponent(BaseStatus):
    method __init__ (line 47) | def __init__(self):
    method add_listener (line 51) | def add_listener(self, listener: IStatusComponentListener):
    method remove_listener (line 55) | def remove_listener(self, listener: IStatusComponentListener):
    method copy (line 60) | def copy(cls: Type[T], src: T, dst: T) -> None:
    method _set_property (line 66) | def _set_property(self, name: str, value: Any):
  class IStatusListener (line 73) | class IStatusListener(ABC):
    method notify (line 75) | def notify(self):
  class Status (line 83) | class Status(BaseStatus):
    class CompListener (line 94) | class CompListener(IStatusComponentListener):
      method __init__ (line 96) | def __init__(self, status: "Status"):
      method notify (line 99) | def notify(self, name: str):
    class ServerStatus (line 106) | class ServerStatus(StatusComponent):
      method __init__ (line 110) | def __init__(self):
    class ControllerStatus (line 115) | class ControllerStatus(StatusComponent):
      method __init__ (line 121) | def __init__(self):
    method __init__ (line 134) | def __init__(self):
    method copy (line 143) | def copy(self) -> "Status":
    method add_listener (line 153) | def add_listener(self, listener: IStatusListener):
    method remove_listener (line 159) | def remove_listener(self, listener: IStatusListener):
    method __create_component (line 165) | def __create_component(self, comp_cls: Type[T]) -> T:
    method _set_property (line 174) | def _set_property(self, name: str, value: Any):

FILE: src/python/common/types.py
  function overrides (line 6) | def overrides(interface_class):

FILE: src/python/controller/auto_queue.py
  class AutoQueuePattern (line 13) | class AutoQueuePattern(Serializable):
    method __init__ (line 17) | def __init__(self, pattern: str):
    method pattern (line 21) | def pattern(self) -> str:
    method __eq__ (line 24) | def __eq__(self, other: "AutoQueuePattern") -> bool:
    method __hash__ (line 27) | def __hash__(self) -> int:
    method to_str (line 30) | def to_str(self) -> str:
    method from_str (line 36) | def from_str(cls, content: str) -> "AutoQueuePattern":
  class IAutoQueuePersistListener (line 41) | class IAutoQueuePersistListener(ABC):
    method pattern_added (line 45) | def pattern_added(self, pattern: AutoQueuePattern):
    method pattern_removed (line 49) | def pattern_removed(self, pattern: AutoQueuePattern):
  class AutoQueuePersist (line 53) | class AutoQueuePersist(Persist):
    method __init__ (line 61) | def __init__(self):
    method patterns (line 66) | def patterns(self) -> Set[AutoQueuePattern]:
    method add_pattern (line 69) | def add_pattern(self, pattern: AutoQueuePattern):
    method remove_pattern (line 79) | def remove_pattern(self, pattern: AutoQueuePattern):
    method add_listener (line 85) | def add_listener(self, listener: IAutoQueuePersistListener):
    method from_str (line 90) | def from_str(cls: "AutoQueuePersist", content: str) -> "AutoQueuePersi...
    method to_str (line 104) | def to_str(self) -> str:
  class AutoQueueModelListener (line 110) | class AutoQueueModelListener(IModelListener):
    method __init__ (line 112) | def __init__(self):
    method file_added (line 117) | def file_added(self, file: ModelFile):
    method file_updated (line 121) | def file_updated(self, old_file: ModelFile, new_file: ModelFile):
    method file_removed (line 125) | def file_removed(self, file: ModelFile):
  class AutoQueuePersistListener (line 129) | class AutoQueuePersistListener(IAutoQueuePersistListener):
    method __init__ (line 131) | def __init__(self):
    method pattern_added (line 135) | def pattern_added(self, pattern: AutoQueuePattern):
    method pattern_removed (line 139) | def pattern_removed(self, pattern: AutoQueuePattern):
  class AutoQueue (line 144) | class AutoQueue:
    method __init__ (line 151) | def __init__(self,
    method process (line 177) | def process(self):
    method __filter_candidates (line 259) | def __filter_candidates(self,
    method __match (line 297) | def __match(pattern: AutoQueuePattern, file: ModelFile) -> bool:

FILE: src/python/controller/controller.py
  class ControllerError (line 21) | class ControllerError(AppError):
  class Controller (line 28) | class Controller:
    class Command (line 32) | class Command:
      class Action (line 39) | class Action(Enum):
      class ICallback (line 46) | class ICallback(ABC):
        method on_success (line 49) | def on_success(self):
        method on_failure (line 54) | def on_failure(self, error: str):
      method __init__ (line 58) | def __init__(self, action: Action, filename: str):
      method add_callback (line 63) | def add_callback(self, callback: ICallback):
    class CommandProcessWrapper (line 66) | class CommandProcessWrapper:
      method __init__ (line 70) | def __init__(self, process: AppOneShotProcess, post_callback: Callab...
    method __init__ (line 74) | def __init__(self,
    method start (line 177) | def start(self):
    method process (line 191) | def process(self):
    method exit (line 204) | def exit(self):
    method get_model_files (line 220) | def get_model_files(self) -> List[ModelFile]:
    method add_model_listener (line 232) | def add_model_listener(self, listener: IModelListener):
    method remove_model_listener (line 244) | def remove_model_listener(self, listener: IModelListener):
    method get_model_files_and_add_listener (line 256) | def get_model_files_and_add_listener(self, listener: IModelListener):
    method queue_command (line 277) | def queue_command(self, command: Command):
    method __get_model_files (line 280) | def __get_model_files(self) -> List[ModelFile]:
    method __update_model (line 286) | def __update_model(self):
    method __process_commands (line 403) | def __process_commands(self):
    method __propagate_exceptions (line 518) | def __propagate_exceptions(self):
    method __cleanup_commands (line 530) | def __cleanup_commands(self):

FILE: src/python/controller/controller_job.py
  class ControllerJob (line 10) | class ControllerJob(Job):
    method __init__ (line 15) | def __init__(self,
    method setup (line 24) | def setup(self):
    method execute (line 28) | def execute(self):
    method cleanup (line 33) | def cleanup(self):

FILE: src/python/controller/controller_persist.py
  class ControllerPersist (line 8) | class ControllerPersist(Persist):
    method __init__ (line 17) | def __init__(self):
    method from_str (line 23) | def from_str(cls: "ControllerPersist", content: str) -> "ControllerPer...
    method to_str (line 36) | def to_str(self) -> str:

FILE: src/python/controller/delete/delete_process.py
  class DeleteLocalProcess (line 11) | class DeleteLocalProcess(AppOneShotProcess):
    method __init__ (line 12) | def __init__(self, local_path: str, file_name: str):
    method run_once (line 17) | def run_once(self):
  class DeleteRemoteProcess (line 29) | class DeleteRemoteProcess(AppOneShotProcess):
    method __init__ (line 30) | def __init__(self,
    method run_once (line 45) | def run_once(self):

FILE: src/python/controller/extract/dispatch.py
  class ExtractDispatchError (line 18) | class ExtractDispatchError(AppError):
  class ExtractListener (line 22) | class ExtractListener(ABC):
    method extract_completed (line 24) | def extract_completed(self, name: str, is_dir: bool):
    method extract_failed (line 28) | def extract_failed(self, name: str, is_dir: bool):
  class ExtractStatus (line 32) | class ExtractStatus:
    class State (line 37) | class State(Enum):
    method __init__ (line 40) | def __init__(self, name: str, is_dir: bool, state: State):
    method name (line 46) | def name(self) -> str: return self.__name
    method is_dir (line 49) | def is_dir(self) -> bool: return self.__is_dir
    method state (line 52) | def state(self) -> State: return self.__state
    method __eq__ (line 54) | def __eq__(self, other):
  class ExtractDispatch (line 58) | class ExtractDispatch:
    class _Task (line 62) | class _Task:
      method __init__ (line 63) | def __init__(self, root_name: str, root_is_dir: bool):
      method add_archive (line 68) | def add_archive(self, archive_path: str, out_dir_path: str):
    method __init__ (line 71) | def __init__(self, out_dir_path: str, local_path: str):
    method set_base_logger (line 85) | def set_base_logger(self, base_logger: logging.Logger):
    method start (line 88) | def start(self):
    method stop (line 91) | def stop(self):
    method add_listener (line 95) | def add_listener(self, listener: ExtractListener):
    method status (line 100) | def status(self) -> List[ExtractStatus]:
    method extract (line 110) | def extract(self, model_file: ModelFile):
    method __worker (line 159) | def __worker(self):
    method __coalesce_extractions (line 207) | def __coalesce_extractions(task: _Task):

FILE: src/python/controller/extract/extract.py
  class ExtractError (line 11) | class ExtractError(AppError):
  class Extract (line 18) | class Extract:
    method is_archive (line 23) | def is_archive(archive_path: str) -> bool:
    method is_archive_fast (line 34) | def is_archive_fast(archive_path: str) -> bool:
    method extract_archive (line 58) | def extract_archive(archive_path: str, out_dir_path: str):

FILE: src/python/controller/extract/extract_process.py
  class ExtractStatusResult (line 15) | class ExtractStatusResult:
    method __init__ (line 16) | def __init__(self, timestamp: datetime, statuses: List[ExtractStatus]):
  class ExtractCompletedResult (line 21) | class ExtractCompletedResult:
    method __init__ (line 22) | def __init__(self, timestamp: datetime, name: str, is_dir: bool):
  class ExtractProcess (line 28) | class ExtractProcess(AppProcess):
    class __ExtractListener (line 31) | class __ExtractListener(ExtractListener):
      method __init__ (line 32) | def __init__(self, logger: logging.Logger, completed_queue: multipro...
      method extract_completed (line 36) | def extract_completed(self, name: str, is_dir: bool):
      method extract_failed (line 43) | def extract_failed(self, name: str, is_dir: bool):
    method __init__ (line 46) | def __init__(self, out_dir_path: str, local_path: str):
    method run_init (line 56) | def run_init(self):
    method run_cleanup (line 72) | def run_cleanup(self):
    method run_loop (line 76) | def run_loop(self):
    method extract (line 96) | def extract(self, file: ModelFile):
    method pop_latest_statuses (line 104) | def pop_latest_statuses(self) -> Optional[ExtractStatusResult]:
    method pop_completed (line 119) | def pop_completed(self) -> List[ExtractCompletedResult]:

FILE: src/python/controller/model_builder.py
  class ModelBuilder (line 15) | class ModelBuilder:
    method __init__ (line 24) | def __init__(self):
    method set_base_logger (line 34) | def set_base_logger(self, base_logger: logging.Logger):
    method set_active_files (line 37) | def set_active_files(self, active_files: List[SystemFile]):
    method set_local_files (line 45) | def set_local_files(self, local_files: List[SystemFile]):
    method set_remote_files (line 52) | def set_remote_files(self, remote_files: List[SystemFile]):
    method set_lftp_statuses (line 59) | def set_lftp_statuses(self, lftp_statuses: List[LftpJobStatus]):
    method set_downloaded_files (line 66) | def set_downloaded_files(self, downloaded_files: Set[str]):
    method set_extract_statuses (line 73) | def set_extract_statuses(self, extract_statuses: List[ExtractStatus]):
    method set_extracted_files (line 80) | def set_extracted_files(self, extracted_files: Set[str]):
    method clear (line 87) | def clear(self):
    method has_changes (line 96) | def has_changes(self) -> bool:
    method build_model (line 103) | def build_model(self) -> Model:

FILE: src/python/controller/scan/active_scanner.py
  class ActiveScanner (line 13) | class ActiveScanner(IScanner):
    method __init__ (line 20) | def __init__(self, local_path: str):
    method set_base_logger (line 27) | def set_base_logger(self, base_logger: logging.Logger):
    method set_active_files (line 30) | def set_active_files(self, file_names: List[str]):
    method scan (line 39) | def scan(self) -> List[SystemFile]:

FILE: src/python/controller/scan/local_scanner.py
  class LocalScanner (line 11) | class LocalScanner(IScanner):
    method __init__ (line 15) | def __init__(self, local_path: str, use_temp_file: bool):
    method set_base_logger (line 22) | def set_base_logger(self, base_logger: logging.Logger):
    method scan (line 26) | def scan(self) -> List[SystemFile]:

FILE: src/python/controller/scan/remote_scanner.py
  class RemoteScanner (line 16) | class RemoteScanner(IScanner):
    method __init__ (line 20) | def __init__(self,
    method set_base_logger (line 44) | def set_base_logger(self, base_logger: logging.Logger):
    method scan (line 49) | def scan(self) -> List[SystemFile]:
    method _install_scanfs (line 85) | def _install_scanfs(self):

FILE: src/python/controller/scan/scanner_process.py
  class ScannerError (line 14) | class ScannerError(AppError):
    method __init__ (line 21) | def __init__(self, message: str, recoverable: bool = False):
  class IScanner (line 26) | class IScanner(ABC):
    method scan (line 32) | def scan(self) -> List[SystemFile]:
    method set_base_logger (line 37) | def set_base_logger(self, base_logger: logging.Logger):
  class ScannerResult (line 41) | class ScannerResult:
    method __init__ (line 45) | def __init__(self,
  class ScannerProcess (line 56) | class ScannerProcess(AppProcess):
    method __init__ (line 60) | def __init__(self,
    method run_init (line 76) | def run_init(self):
    method run_cleanup (line 81) | def run_cleanup(self):
    method run_loop (line 85) | def run_loop(self):
    method pop_latest_result (line 113) | def pop_latest_result(self) -> Optional[ScannerResult]:
    method force_scan (line 128) | def force_scan(self):

FILE: src/python/lftp/job_status.py
  class LftpJobStatus (line 8) | class LftpJobStatus:
    class Type (line 12) | class Type(Enum):
    class State (line 16) | class State(Enum):
    class TransferState (line 20) | class TransferState(namedtuple("TransferState",
    method __init__ (line 36) | def __init__(self, job_id: int, job_type: Type, state: State, name: st...
    method id (line 48) | def id(self) -> int: return self.__id
    method type (line 51) | def type(self) -> Type: return self.__type
    method state (line 54) | def state(self) -> "LftpJobStatus.State": return self.__state
    method name (line 57) | def name(self) -> str: return self.__name
    method total_transfer_state (line 60) | def total_transfer_state(self) -> TransferState:
    method total_transfer_state (line 64) | def total_transfer_state(self, total_transfer_state: TransferState):
    method add_active_file_transfer_state (line 69) | def add_active_file_transfer_state(self, filename: str, transfer_state...
    method get_active_file_transfer_states (line 74) | def get_active_file_transfer_states(self) -> List[Tuple[str, TransferS...
    method __eq__ (line 81) | def __eq__(self, other):
    method __str__ (line 84) | def __str__(self):
    method __repr__ (line 87) | def __repr__(self):

FILE: src/python/lftp/job_status_parser.py
  class LftpJobStatusParserError (line 12) | class LftpJobStatusParserError(AppError):
  class LftpJobStatusParser (line 16) | class LftpJobStatusParser:
    method __init__ (line 32) | def __init__(self):
    method set_base_logger (line 35) | def set_base_logger(self, base_logger: logging.Logger):
    method _size_to_bytes (line 39) | def _size_to_bytes(size: str) -> int:
    method _eta_to_seconds (line 59) | def _eta_to_seconds(eta: str) -> int:
    method parse (line 76) | def parse(self, output: str) -> List[LftpJobStatus]:
    method __parse_jobs (line 98) | def __parse_jobs(lines: List[str]) -> List[LftpJobStatus]:
    method __parse_queue (line 476) | def __parse_queue(lines: List[str]) -> List[LftpJobStatus]:

FILE: src/python/lftp/lftp.py
  class LftpError (line 20) | class LftpError(AppError):
  class Lftp (line 27) | class Lftp:
    method __init__ (line 45) | def __init__(self,
    method set_verbose_logging (line 73) | def set_verbose_logging(self, verbose: bool):
    method __setup (line 76) | def __setup(self):
    method with_check_process (line 86) | def with_check_process(method: Callable):
    method set_base_logger (line 100) | def set_base_logger(self, base_logger: logging.Logger):
    method set_base_remote_dir_path (line 104) | def set_base_remote_dir_path(self, base_remote_dir_path: str):
    method set_base_local_dir_path (line 107) | def set_base_local_dir_path(self, base_local_dir_path: str):
    method raise_pending_error (line 110) | def raise_pending_error(self):
    method __run_command (line 123) | def __run_command(self, command: str):
    method __detect_errors_from_output (line 166) | def __detect_errors_from_output(out: str) -> bool:
    method __set (line 178) | def __set(self, setting: str, value: str):
    method __get (line 187) | def __get(self, setting: str) -> str:
    method __to_bool (line 200) | def __to_bool(value: str) -> bool:
    method num_connections_per_dir_file (line 210) | def num_connections_per_dir_file(self) -> int:
    method num_connections_per_dir_file (line 214) | def num_connections_per_dir_file(self, num_connections: int):
    method num_connections_per_root_file (line 220) | def num_connections_per_root_file(self) -> int:
    method num_connections_per_root_file (line 224) | def num_connections_per_root_file(self, num_connections: int):
    method num_max_total_connections (line 230) | def num_max_total_connections(self) -> int:
    method num_max_total_connections (line 234) | def num_max_total_connections(self, num_connections: int):
    method num_parallel_files (line 240) | def num_parallel_files(self) -> int:
    method num_parallel_files (line 244) | def num_parallel_files(self, num_parallel_files: int):
    method rate_limit (line 250) | def rate_limit(self) -> str:
    method rate_limit (line 254) | def rate_limit(self, rate_limit: Union[int, str]):
    method min_chunk_size (line 258) | def min_chunk_size(self) -> str:
    method min_chunk_size (line 262) | def min_chunk_size(self, min_chunk_size: Union[int, str]):
    method num_parallel_jobs (line 266) | def num_parallel_jobs(self) -> int:
    method num_parallel_jobs (line 270) | def num_parallel_jobs(self, num_parallel_jobs: int):
    method move_background_on_exit (line 276) | def move_background_on_exit(self) -> bool:
    method move_background_on_exit (line 280) | def move_background_on_exit(self, move_background_on_exit: bool):
    method use_temp_file (line 284) | def use_temp_file(self) -> bool:
    method use_temp_file (line 288) | def use_temp_file(self, use_temp_file: bool):
    method temp_file_name (line 292) | def temp_file_name(self) -> str:
    method temp_file_name (line 296) | def temp_file_name(self, temp_file_name: str):
    method sftp_auto_confirm (line 300) | def sftp_auto_confirm(self) -> bool:
    method sftp_auto_confirm (line 304) | def sftp_auto_confirm(self, auto_confirm: bool):
    method sftp_connect_program (line 308) | def sftp_connect_program(self) -> str:
    method sftp_connect_program (line 312) | def sftp_connect_program(self, program: str):
    method status (line 315) | def status(self) -> List[LftpJobStatus]:
    method queue (line 333) | def queue(self, name: str, is_dir: bool):
    method kill (line 360) | def kill(self, name: str) -> bool:
    method kill_all (line 388) | def kill_all(self):
    method exit (line 397) | def exit(self):

FILE: src/python/model/diff.py
  class ModelDiff (line 12) | class ModelDiff:
    class Change (line 16) | class Change(Enum):
    method __init__ (line 21) | def __init__(self, change: Change, old_file: Optional[ModelFile], new_...
    method __eq__ (line 26) | def __eq__(self, other):
    method __repr__ (line 29) | def __repr__(self):
    method change (line 33) | def change(self) -> Change:
    method old_file (line 37) | def old_file(self) -> Optional[ModelFile]:
    method new_file (line 41) | def new_file(self) -> Optional[ModelFile]:
  class ModelDiffUtil (line 45) | class ModelDiffUtil:
    method diff_models (line 47) | def diff_models(model_before: Model, model_after: Model) -> List[Model...

FILE: src/python/model/file.py
  class ModelFile (line 10) | class ModelFile:
    class State (line 19) | class State(Enum):
    method __init__ (line 28) | def __init__(self, name: str, is_dir: bool):
    method __eq__ (line 48) | def __eq__(self, other):
    method __repr__ (line 82) | def __repr__(self):
    method name (line 86) | def name(self) -> str: return self.__name
    method is_dir (line 89) | def is_dir(self) -> bool: return self.__is_dir
    method state (line 92) | def state(self) -> State: return self.__state
    method state (line 95) | def state(self, state: State):
    method remote_size (line 101) | def remote_size(self) -> Optional[int]: return self.__remote_size
    method remote_size (line 104) | def remote_size(self, remote_size: Optional[int]):
    method local_size (line 115) | def local_size(self) -> Optional[int]: return self.__local_size
    method local_size (line 118) | def local_size(self, local_size: Optional[int]):
    method transferred_size (line 129) | def transferred_size(self) -> Optional[int]: return self.__transferred...
    method transferred_size (line 132) | def transferred_size(self, transferred_size: Optional[int]):
    method downloading_speed (line 143) | def downloading_speed(self) -> Optional[int]: return self.__downloadin...
    method downloading_speed (line 146) | def downloading_speed(self, downloading_speed: Optional[int]):
    method update_timestamp (line 157) | def update_timestamp(self) -> datetime: return self.__update_timestamp
    method update_timestamp (line 160) | def update_timestamp(self, update_timestamp: datetime):
    method eta (line 166) | def eta(self) -> Optional[int]: return self.__eta
    method eta (line 169) | def eta(self, eta: Optional[int]):
    method is_extractable (line 180) | def is_extractable(self) -> bool: return self.__is_extractable
    method is_extractable (line 183) | def is_extractable(self, is_extractable: bool):
    method local_created_timestamp (line 187) | def local_created_timestamp(self) -> datetime: return self.__local_cre...
    method local_created_timestamp (line 190) | def local_created_timestamp(self, local_created_timestamp: datetime):
    method local_modified_timestamp (line 196) | def local_modified_timestamp(self) -> datetime: return self.__local_mo...
    method local_modified_timestamp (line 199) | def local_modified_timestamp(self, local_modified_timestamp: datetime):
    method remote_created_timestamp (line 205) | def remote_created_timestamp(self) -> datetime: return self.__remote_c...
    method remote_created_timestamp (line 208) | def remote_created_timestamp(self, remote_created_timestamp: datetime):
    method remote_modified_timestamp (line 214) | def remote_modified_timestamp(self) -> datetime: return self.__remote_...
    method remote_modified_timestamp (line 217) | def remote_modified_timestamp(self, remote_modified_timestamp: datetime):
    method full_path (line 223) | def full_path(self) -> str:
    method add_child (line 229) | def add_child(self, child_file: "ModelFile"):
    method get_children (line 239) | def get_children(self) -> List["ModelFile"]:
    method parent (line 243) | def parent(self) -> Optional["ModelFile"]:

FILE: src/python/model/model.py
  class ModelError (line 12) | class ModelError(AppError):
  class IModelListener (line 19) | class IModelListener(ABC):
    method file_added (line 24) | def file_added(self, file: ModelFile):
    method file_removed (line 33) | def file_removed(self, file: ModelFile):
    method file_updated (line 42) | def file_updated(self, old_file: ModelFile, new_file: ModelFile):
  class Model (line 52) | class Model:
    method __init__ (line 56) | def __init__(self):
    method set_base_logger (line 61) | def set_base_logger(self, base_logger: logging.Logger):
    method add_listener (line 64) | def add_listener(self, listener: IModelListener):
    method remove_listener (line 74) | def remove_listener(self, listener: IModelListener):
    method add_file (line 86) | def add_file(self, file: ModelFile):
    method remove_file (line 99) | def remove_file(self, filename: str):
    method update_file (line 113) | def update_file(self, file: ModelFile):
    method get_file (line 128) | def get_file(self, name: str) -> ModelFile:
    method get_file_names (line 138) | def get_file_names(self) -> Set[str]:

FILE: src/python/scan_fs.py
  function print_file (line 31) | def print_file(file: SystemFile, level: int):

FILE: src/python/seedsync.py
  class Seedsync (line 26) | class Seedsync:
    method __init__ (line 39) | def __init__(self):
    method run (line 107) | def run(self):
    method persist (line 207) | def persist(self):
    method signal (line 214) | def signal(self, signum: int, _):
    method _parse_args (line 221) | def _parse_args(args):
    method _create_logger (line 254) | def _create_logger(name: str, debug: bool, logdir: Optional[str]) -> l...
    method _create_default_config (line 281) | def _create_default_config() -> Config:
    method _detect_incomplete_config (line 321) | def _detect_incomplete_config(config: Config) -> bool:
    method _load_persist (line 330) | def _load_persist(cls: Type[T_Persist], file_path: str) -> T_Persist:
    method __backup_file (line 356) | def __backup_file(file_path: str):

FILE: src/python/ssh/sshcp.py
  class SshcpError (line 12) | class SshcpError(AppError):
  class Sshcp (line 19) | class Sshcp:
    method __init__ (line 25) | def __init__(self,
    method set_base_logger (line 38) | def set_base_logger(self, base_logger: logging.Logger):
    method __run_command (line 41) | def __run_command(self,
    method shell (line 142) | def shell(self, command: str) -> bytes:
    method copy (line 175) | def copy(self, local_path: str, remote_path: str):

FILE: src/python/system/file.py
  class SystemFile (line 7) | class SystemFile:
    method __init__ (line 11) | def __init__(self,
    method __eq__ (line 26) | def __eq__(self, other):
    method __repr__ (line 29) | def __repr__(self):
    method name (line 33) | def name(self) -> str: return self.__name
    method size (line 36) | def size(self) -> int: return self.__size
    method is_dir (line 39) | def is_dir(self) -> bool: return self.__is_dir
    method timestamp_created (line 42) | def timestamp_created(self) -> datetime: return self.__timestamp_created
    method timestamp_modified (line 45) | def timestamp_modified(self) -> datetime: return self.__timestamp_modi...
    method children (line 48) | def children(self) -> List["SystemFile"]: return self.__children
    method add_child (line 50) | def add_child(self, file: "SystemFile"):

FILE: src/python/system/scanner.py
  class SystemScannerError (line 13) | class SystemScannerError(AppError):
  class PseudoDirEntry (line 20) | class PseudoDirEntry:
    method __init__ (line 21) | def __init__(self, name: str, path: str, is_dir: bool, stat):
    method is_dir (line 27) | def is_dir(self):
    method stat (line 30) | def stat(self):
  class SystemScanner (line 34) | class SystemScanner:
    method __init__ (line 41) | def __init__(self, path_to_scan: str):
    method add_exclude_prefix (line 50) | def add_exclude_prefix(self, prefix: str):
    method add_exclude_suffix (line 58) | def add_exclude_suffix(self, suffix: str):
    method set_lftp_temp_suffix (line 66) | def set_lftp_temp_suffix(self, suffix: str):
    method scan (line 75) | def scan(self) -> List[SystemFile]:
    method scan_single (line 86) | def scan_single(self, name: str) -> SystemFile:
    method __create_system_file (line 113) | def __create_system_file(self, entry) -> SystemFile:
    method __create_children (line 171) | def __create_children(self, path: str) -> List[SystemFile]:
    method _lftp_status_file_size (line 195) | def _lftp_status_file_size(status: str) -> int:

FILE: src/python/tests/integration/test_controller/test_controller.py
  class DummyListener (line 24) | class DummyListener(IModelListener):
    method file_added (line 26) | def file_added(self, file: ModelFile):
    method file_updated (line 30) | def file_updated(self, old_file: ModelFile, new_file: ModelFile):
    method file_removed (line 34) | def file_removed(self, file: ModelFile):
  class DummyCommandCallback (line 38) | class DummyCommandCallback(Controller.Command.ICallback):
    method on_failure (line 40) | def on_failure(self, error: str):
    method on_success (line 44) | def on_success(self):
  class TestController (line 49) | class TestController(unittest.TestCase):
    method my_mkdir (line 57) | def my_mkdir(*args):
    method my_touch (line 61) | def my_touch(size, *args):
    method create_archive (line 67) | def create_archive(*args):
    method setUp (line 102) | def setUp(self):
    method tearDown (line 361) | def tearDown(self):
    method __wait_for_initial_model (line 370) | def __wait_for_initial_model(self):
    method test_bad_config_doesnot_raise_ctor_exception (line 375) | def test_bad_config_doesnot_raise_ctor_exception(self):
    method test_bad_config_remote_address_raises_exception (line 388) | def test_bad_config_remote_address_raises_exception(self):
    method test_bad_config_remote_username_raises_exception (line 403) | def test_bad_config_remote_username_raises_exception(self):
    method test_bad_config_remote_path_raises_exception (line 418) | def test_bad_config_remote_path_raises_exception(self):
    method test_bad_config_local_path_raises_exception (line 433) | def test_bad_config_local_path_raises_exception(self):
    method test_bad_config_remote_path_to_scan_script_raises_exception (line 445) | def test_bad_config_remote_path_to_scan_script_raises_exception(self):
    method test_bad_remote_password_raises_exception (line 462) | def test_bad_remote_password_raises_exception(self):
    method test_initial_model (line 478) | def test_initial_model(self):
    method test_local_file_added (line 494) | def test_local_file_added(self):
    method test_local_file_updated (line 531) | def test_local_file_updated(self):
    method test_local_file_removed (line 570) | def test_local_file_removed(self):
    method test_remote_file_added (line 607) | def test_remote_file_added(self):
    method test_remote_file_updated (line 637) | def test_remote_file_updated(self):
    method test_remote_file_removed (line 669) | def test_remote_file_removed(self):
    method test_command_queue_directory (line 699) | def test_command_queue_directory(self):
    method test_command_queue_file (line 744) | def test_command_queue_file(self):
    method test_command_queue_invalid (line 787) | def test_command_queue_invalid(self):
    method test_command_queue_local_directory (line 825) | def test_command_queue_local_directory(self):
    method test_command_queue_local_file (line 862) | def test_command_queue_local_file(self):
    method test_command_stop_directory (line 899) | def test_command_stop_directory(self):
    method test_command_stop_file (line 963) | def test_command_stop_file(self):
    method test_command_stop_default (line 1027) | def test_command_stop_default(self):
    method test_command_stop_queued (line 1067) | def test_command_stop_queued(self):
    method test_command_stop_wrong (line 1139) | def test_command_stop_wrong(self):
    method test_command_stop_invalid (line 1199) | def test_command_stop_invalid(self):
    method test_command_extract_after_downloading_remote_file (line 1258) | def test_command_extract_after_downloading_remote_file(self):
    method test_command_extract_after_downloading_remote_directory (line 1317) | def test_command_extract_after_downloading_remote_directory(self):
    method test_command_extract_after_downloading_remote_directory_multilevel (line 1376) | def test_command_extract_after_downloading_remote_directory_multilevel...
    method test_command_extract_local_directory (line 1439) | def test_command_extract_local_directory(self):
    method test_command_reextract_after_extracting_remote_file (line 1481) | def test_command_reextract_after_extracting_remote_file(self):
    method test_command_extract_remote_only_fails (line 1562) | def test_command_extract_remote_only_fails(self):
    method test_command_extract_after_downloading_remote_directory_to_separate_path (line 1606) | def test_command_extract_after_downloading_remote_directory_to_separat...
    method test_command_redownload_after_deleting_extracted_file (line 1670) | def test_command_redownload_after_deleting_extracted_file(self):
    method test_config_num_max_parallel_downloads (line 1771) | def test_config_num_max_parallel_downloads(self):
    method test_downloading_scan (line 1825) | def test_downloading_scan(self):
    method test_persist_downloaded (line 1876) | def test_persist_downloaded(self):
    method test_redownload_deleted_file (line 1918) | def test_redownload_deleted_file(self):
    method test_command_delete_local_file (line 1973) | def test_command_delete_local_file(self):
    method test_command_delete_local_dir (line 2013) | def test_command_delete_local_dir(self):
    method test_command_delete_remote_dir (line 2053) | def test_command_delete_remote_dir(self):
    method test_command_delete_local_fails_on_remote_file (line 2093) | def test_command_delete_local_fails_on_remote_file(self):
    method test_command_delete_remote_fails_on_local_file (line 2135) | def test_command_delete_remote_fails_on_local_file(self):
    method test_command_delete_remote_forces_immediate_rescan (line 2177) | def test_command_delete_remote_forces_immediate_rescan(self):
    method test_command_delete_local_forces_immediate_rescan (line 2222) | def test_command_delete_local_forces_immediate_rescan(self):
    method test_download_with_excessive_connections (line 2268) | def test_download_with_excessive_connections(self):
    method test_password_auth (line 2385) | def test_password_auth(self):

FILE: src/python/tests/integration/test_controller/test_extract/test_extract.py
  class TestExtract (line 14) | class TestExtract(unittest.TestCase):
    method setUpClass (line 30) | def setUpClass(cls):
    method tearDownClass (line 77) | def tearDownClass(cls):
    method setUp (line 83) | def setUp(self):
    method tearDown (line 88) | def tearDown(self):
    method _assert_extracted_files (line 92) | def _assert_extracted_files(self, dir_path):
    method test_is_archive_fast (line 98) | def test_is_archive_fast(self):
    method test_is_archive_fast_works_with_full_paths (line 113) | def test_is_archive_fast_works_with_full_paths(self):
    method test_is_archive_false_on_nonexisting_file (line 118) | def test_is_archive_false_on_nonexisting_file(self):
    method test_is_archive_false_on_dir (line 121) | def test_is_archive_false_on_dir(self):
    method test_is_archive_false_on_bad_archive (line 127) | def test_is_archive_false_on_bad_archive(self):
    method test_is_archive_zip (line 134) | def test_is_archive_zip(self):
    method test_is_archive_rar (line 137) | def test_is_archive_rar(self):
    method test_is_archive_rar_split (line 140) | def test_is_archive_rar_split(self):
    method test_is_archive_tar_gz (line 144) | def test_is_archive_tar_gz(self):
    method test_extract_archive_fails_on_nonexisting_file (line 147) | def test_extract_archive_fails_on_nonexisting_file(self):
    method test_extract_archive_fails_on_dir (line 153) | def test_extract_archive_fails_on_dir(self):
    method test_extract_archive_fails_on_bad_file (line 159) | def test_extract_archive_fails_on_bad_file(self):
    method test_extract_archive_creates_sub_directories (line 169) | def test_extract_archive_creates_sub_directories(self):
    method test_extract_archive_zip (line 175) | def test_extract_archive_zip(self):
    method test_extract_archive_overwrites_existing (line 180) | def test_extract_archive_overwrites_existing(self):
    method test_extract_archive_rar (line 188) | def test_extract_archive_rar(self):
    method test_extract_archive_rar_split (line 193) | def test_extract_archive_rar_split(self):
    method test_extract_archive_tar_gz (line 198) | def test_extract_archive_tar_gz(self):

FILE: src/python/tests/integration/test_lftp/test_lftp.py
  class TestLftp (line 17) | class TestLftp(unittest.TestCase):
    method setUpClass (line 21) | def setUpClass(cls):
    method tearDownClass (line 29) | def tearDownClass(cls):
    method setUp (line 33) | def setUp(self):
    method tearDown (line 52) | def tearDown(self):
    method my_mkdir (line 58) | def my_mkdir(self, *args):
    method my_touch (line 62) | def my_touch(self, size: int, *args):
    method assert_local_equals_remote (line 67) | def assert_local_equals_remote(self):
    method test_download_1 (line 75) | def test_download_1(self):
    method test_download_2 (line 99) | def test_download_2(self):
    method test_download_3 (line 123) | def test_download_3(self):
    method test_download_4 (line 147) | def test_download_4(self):

FILE: src/python/tests/integration/test_web/test_handler/test_auto_queue.py
  class TestAutoQueueHandler (line 10) | class TestAutoQueueHandler(BaseTestWebApp):
    method test_get (line 11) | def test_get(self):
    method test_get_is_ordered (line 27) | def test_get_is_ordered(self):
    method test_add_good (line 45) | def test_add_good(self):
    method test_add_double (line 75) | def test_add_double(self):
    method test_add_empty_value (line 82) | def test_add_empty_value(self):
    method test_remove_good (line 92) | def test_remove_good(self):
    method test_remove_non_existing (line 128) | def test_remove_non_existing(self):
    method test_remove_empty_value (line 133) | def test_remove_empty_value(self):

FILE: src/python/tests/integration/test_web/test_handler/test_config.py
  class TestConfigHandler (line 9) | class TestConfigHandler(BaseTestWebApp):
    method test_get (line 10) | def test_get(self):
    method test_set_good (line 23) | def test_set_good(self):
    method test_set_missing_section (line 45) | def test_set_missing_section(self):
    method test_set_missing_option (line 52) | def test_set_missing_option(self):
    method test_set_bad_value (line 59) | def test_set_bad_value(self):
    method test_set_empty_value (line 74) | def test_set_empty_value(self):

FILE: src/python/tests/integration/test_web/test_handler/test_controller.py
  class TestControllerHandler (line 10) | class TestControllerHandler(BaseTestWebApp):
    method test_queue (line 11) | def test_queue(self):
    method test_stop (line 46) | def test_stop(self):
    method test_extract (line 81) | def test_extract(self):
    method test_delete_local (line 116) | def test_delete_local(self):
    method test_delete_remote (line 151) | def test_delete_remote(self):

FILE: src/python/tests/integration/test_web/test_handler/test_server.py
  class TestServerHandler (line 6) | class TestServerHandler(BaseTestWebApp):
    method test_restart (line 7) | def test_restart(self):

FILE: src/python/tests/integration/test_web/test_handler/test_status.py
  class TestStatusHandler (line 8) | class TestStatusHandler(BaseTestWebApp):
    method test_status (line 9) | def test_status(self):

FILE: src/python/tests/integration/test_web/test_handler/test_stream_log.py
  class TestLogStreamHandler (line 10) | class TestLogStreamHandler(BaseTestWebApp):
    method test_stream_log_serializes_record (line 12) | def test_stream_log_serializes_record(self, mock_serialize_log_record_...

FILE: src/python/tests/integration/test_web/test_handler/test_stream_model.py
  class TestModelStreamHandler (line 12) | class TestModelStreamHandler(BaseTestWebApp):
    method test_stream_model_fetches_model_and_adds_listener (line 13) | def test_stream_model_fetches_model_and_adds_listener(self):
    method test_stream_model_removes_listener (line 20) | def test_stream_model_removes_listener(self):
    method test_stream_model_serializes_initial_model (line 28) | def test_stream_model_serializes_initial_model(self, mock_serialize_mo...
    method test_stream_model_serializes_updates (line 43) | def test_stream_model_serializes_updates(self, mock_serialize_model_cls):

FILE: src/python/tests/integration/test_web/test_handler/test_stream_status.py
  class TestStatusStreamHandler (line 9) | class TestStatusStreamHandler(BaseTestWebApp):
    method test_stream_status_serializes_initial_status (line 11) | def test_stream_status_serializes_initial_status(self, mock_serialize_...
    method test_stream_status_serializes_new_status (line 27) | def test_stream_status_serializes_new_status(self, mock_serialize_stat...

FILE: src/python/tests/integration/test_web/test_web_app.py
  class BaseTestWebApp (line 15) | class BaseTestWebApp(unittest.TestCase):
    method setUp (line 21) | def setUp(self):
  class TestWebApp (line 63) | class TestWebApp(BaseTestWebApp):
    method test_process (line 64) | def test_process(self):

FILE: src/python/tests/unittests/test_common/test_app_process.py
  class DummyException (line 15) | class DummyException(Exception):
  class DummyProcess (line 19) | class DummyProcess(AppProcess):
    method __init__ (line 20) | def __init__(self, fail: bool):
    method run_loop (line 28) | def run_loop(self):
    method run_init (line 34) | def run_init(self):
    method run_cleanup (line 38) | def run_cleanup(self):
  class LongRunningProcess (line 43) | class LongRunningProcess(AppProcess):
    method __init__ (line 44) | def __init__(self):
    method run_init (line 47) | def run_init(self):
    method run_loop (line 50) | def run_loop(self):
    method run_cleanup (line 54) | def run_cleanup(self):
  class LongRunningThreadProcess (line 58) | class LongRunningThreadProcess(AppProcess):
    method __init__ (line 59) | def __init__(self):
    method run_init (line 63) | def run_init(self):
    method run_loop (line 66) | def run_loop(self):
    method run_cleanup (line 69) | def run_cleanup(self):
    method long_task (line 73) | def long_task(self):
  class DummyOneShotProcess (line 79) | class DummyOneShotProcess(AppOneShotProcess):
    method __init__ (line 80) | def __init__(self):
    method run_once (line 84) | def run_once(self):
  class OneShotLongRunningProcess (line 88) | class OneShotLongRunningProcess(AppOneShotProcess):
    method __init__ (line 89) | def __init__(self):
    method run_once (line 92) | def run_once(self):
  class TestAppProcess (line 97) | class TestAppProcess(unittest.TestCase):
    method setUp (line 98) | def setUp(self):
    method tearDown (line 110) | def tearDown(self):
    method test_exception_propagates (line 115) | def test_exception_propagates(self):
    method test_process_terminates (line 123) | def test_process_terminates(self):
    method test_init_called_before_loop (line 131) | def test_init_called_before_loop(self):
    method test_cleanup_called_after_loop (line 140) | def test_cleanup_called_after_loop(self):
    method test_long_running_process_is_force_terminated (line 152) | def test_long_running_process_is_force_terminated(self):
    method test_process_with_long_running_thread_terminates_properly (line 161) | def test_process_with_long_running_thread_terminates_properly(self):
  class TestAppOneShotProcess (line 170) | class TestAppOneShotProcess(unittest.TestCase):
    method setUp (line 171) | def setUp(self):
    method tearDown (line 183) | def tearDown(self):
    method test_run_once_called_once (line 188) | def test_run_once_called_once(self):
    method test_long_running_process_is_force_terminated (line 195) | def test_long_running_process_is_force_terminated(self):

FILE: src/python/tests/unittests/test_common/test_config.py
  class TestConverters (line 11) | class TestConverters(unittest.TestCase):
    method test_int (line 12) | def test_int(self):
    method test_bool (line 28) | def test_bool(self):
  class DummyInnerConfig (line 48) | class DummyInnerConfig(InnerConfig):
    method __init__ (line 53) | def __init__(self):
  class DummyInnerConfig2 (line 59) | class DummyInnerConfig2(InnerConfig):
    method __init__ (line 63) | def __init__(self):
  class TestInnerConfig (line 68) | class TestInnerConfig(unittest.TestCase):
    method test_property_order (line 69) | def test_property_order(self):
    method test_has_property (line 73) | def test_has_property(self):
    method test_checker_is_called (line 82) | def test_checker_is_called(self):
    method test_converter_is_called (line 90) | def test_converter_is_called(self):
  class TestConfig (line 98) | class TestConfig(unittest.TestCase):
    method __check_unknown_error (line 99) | def __check_unknown_error(self, cls, good_dict):
    method __check_missing_error (line 113) | def __check_missing_error(self, cls, good_dict, key):
    method __check_empty_error (line 128) | def __check_empty_error(self, cls, good_dict, key):
    method check_common (line 147) | def check_common(self, cls, good_dict, keys):
    method check_bad_value_error (line 164) | def check_bad_value_error(self, cls, good_dict, key, value):
    method test_has_section (line 180) | def test_has_section(self):
    method test_general (line 191) | def test_general(self):
    method test_lftp (line 213) | def test_lftp(self):
    method test_controller (line 282) | def test_controller(self):
    method test_web (line 317) | def test_web(self):
    method test_autoqueue (line 334) | def test_autoqueue(self):
    method test_from_file (line 360) | def test_from_file(self):
    method test_to_file (line 447) | def test_to_file(self):
    method test_persist_read_error (line 527) | def test_persist_read_error(self):

FILE: src/python/tests/unittests/test_common/test_job.py
  class DummyError (line 11) | class DummyError(Exception):
  class DummyFailingJob (line 15) | class DummyFailingJob(Job):
    method setup (line 16) | def setup(self):
    method execute (line 20) | def execute(self):
    method cleanup (line 23) | def cleanup(self):
  class TestJob (line 28) | class TestJob(unittest.TestCase):
    method test_exception_propagates (line 29) | def test_exception_propagates(self):
    method test_cleanup_executes_on_execute_error (line 40) | def test_cleanup_executes_on_execute_error(self):

FILE: src/python/tests/unittests/test_common/test_multiprocessing_logger.py
  class TestMultiprocessingLogger (line 15) | class TestMultiprocessingLogger(unittest.TestCase):
    method setUp (line 16) | def setUp(self):
    method test_main_logger_receives_records (line 25) | def test_main_logger_receives_records(self):
    method test_children_names (line 55) | def test_children_names(self):
    method test_logger_levels (line 80) | def test_logger_levels(self):

FILE: src/python/tests/unittests/test_common/test_persist.py
  class DummyPersist (line 11) | class DummyPersist(Persist):
    method __init__ (line 12) | def __init__(self):
    method from_str (line 17) | def from_str(cls: "DummyPersist", content: str) -> "DummyPersist":
    method to_str (line 23) | def to_str(self) -> str:
  class TestPersist (line 27) | class TestPersist(unittest.TestCase):
    method setUp (line 29) | def setUp(self):
    method tearDown (line 34) | def tearDown(self):
    method test_from_file (line 38) | def test_from_file(self):
    method test_from_file_non_existing (line 45) | def test_from_file_non_existing(self):
    method test_to_file_non_existing (line 51) | def test_to_file_non_existing(self):
    method test_to_file_overwrite (line 60) | def test_to_file_overwrite(self):

FILE: src/python/tests/unittests/test_common/test_status.py
  class DummyStatusComponent (line 10) | class DummyStatusComponent(StatusComponent):
    method __init__ (line 14) | def __init__(self):
  class DummyStatusComponentListener (line 20) | class DummyStatusComponentListener(IStatusComponentListener):
    method notify (line 22) | def notify(self, name):
  class DummyStatusListener (line 26) | class DummyStatusListener(IStatusListener):
    method notify (line 28) | def notify(self):
  class TestStatusComponent (line 32) | class TestStatusComponent(unittest.TestCase):
    method test_property_values (line 33) | def test_property_values(self):
    method test_listeners (line 40) | def test_listeners(self):
    method test_copy_values (line 59) | def test_copy_values(self):
    method test_copy_doesnt_copy_listeners (line 85) | def test_copy_doesnt_copy_listeners(self):
  class TestStatus (line 104) | class TestStatus(unittest.TestCase):
    method test_property_values (line 105) | def test_property_values(self):
    method test_listeners (line 112) | def test_listeners(self):
    method test_cannot_replace_component (line 123) | def test_cannot_replace_component(self):
    method test_default_values (line 130) | def test_default_values(self):
    method test_components_registered (line 137) | def test_components_registered(self):
    method test_copy_values (line 156) | def test_copy_values(self):
    method test_copy_doesnt_copy_listeners (line 181) | def test_copy_doesnt_copy_listeners(self):

FILE: src/python/tests/unittests/test_controller/test_auto_queue.py
  class TestAutoQueuePattern (line 15) | class TestAutoQueuePattern(unittest.TestCase):
    method test_pattern (line 16) | def test_pattern(self):
    method test_equality (line 22) | def test_equality(self):
    method test_to_str (line 29) | def test_to_str(self):
    method test_from_str (line 47) | def test_from_str(self):
    method test_to_and_from_str (line 65) | def test_to_and_from_str(self):
  class TestAutoQueuePersistListener (line 84) | class TestAutoQueuePersistListener(IAutoQueuePersistListener):
    method pattern_added (line 86) | def pattern_added(self, pattern: AutoQueuePattern):
    method pattern_removed (line 90) | def pattern_removed(self, pattern: AutoQueuePattern):
  class TestAutoQueuePersist (line 94) | class TestAutoQueuePersist(unittest.TestCase):
    method test_add_pattern (line 95) | def test_add_pattern(self):
    method test_add_blank_pattern_fails (line 111) | def test_add_blank_pattern_fails(self):
    method test_remove_pattern (line 120) | def test_remove_pattern(self):
    method test_listener_pattern_added (line 134) | def test_listener_pattern_added(self):
    method test_listener_pattern_added_duplicate (line 146) | def test_listener_pattern_added_duplicate(self):
    method test_listener_pattern_removed (line 157) | def test_listener_pattern_removed(self):
    method test_listener_pattern_removed_non_existing (line 172) | def test_listener_pattern_removed_non_existing(self):
    method test_from_str (line 183) | def test_from_str(self):
    method test_to_str (line 216) | def test_to_str(self):
    method test_to_and_from_str (line 239) | def test_to_and_from_str(self):
    method test_persist_read_error (line 254) | def test_persist_read_error(self):
  class TestAutoQueue (line 282) | class TestAutoQueue(unittest.TestCase):
    method setUp (line 283) | def setUp(self):
    method test_matching_new_files_are_queued (line 314) | def test_matching_new_files_are_queued(self):
    method test_matching_initial_files_are_queued (line 358) | def test_matching_initial_files_are_queued(self):
    method test_non_matches (line 388) | def test_non_matches(self):
    method test_matching_is_case_insensitive (line 399) | def test_matching_is_case_insensitive(self):
    method test_partial_matches (line 425) | def test_partial_matches(self):
    method test_wildcard_at_start_matches (line 453) | def test_wildcard_at_start_matches(self):
    method test_wildcard_at_end_matches (line 482) | def test_wildcard_at_end_matches(self):
    method test_wildcard_in_middle_matches (line 515) | def test_wildcard_in_middle_matches(self):
    method test_wildcard_matches_are_case_insensitive (line 548) | def test_wildcard_matches_are_case_insensitive(self):
    method test_matching_local_files_are_not_queued (line 577) | def test_matching_local_files_are_not_queued(self):
    method test_matching_deleted_files_are_not_queued (line 589) | def test_matching_deleted_files_are_not_queued(self):
    method test_matching_downloading_files_are_not_queued (line 602) | def test_matching_downloading_files_are_not_queued(self):
    method test_matching_queued_files_are_not_queued (line 622) | def test_matching_queued_files_are_not_queued(self):
    method test_matching_downloaded_files_are_not_queued (line 634) | def test_matching_downloaded_files_are_not_queued(self):
    method test_auto_queued_file_not_re_queued_after_stopping (line 649) | def test_auto_queued_file_not_re_queued_after_stopping(self):
    method test_partial_file_is_auto_queued_after_remote_discovery (line 670) | def test_partial_file_is_auto_queued_after_remote_discovery(self):
    method test_new_matching_pattern_queues_existing_files (line 695) | def test_new_matching_pattern_queues_existing_files(self):
    method test_new_matching_pattern_doesnt_queue_local_file (line 744) | def test_new_matching_pattern_doesnt_queue_local_file(self):
    method test_removed_pattern_doesnt_queue_new_file (line 762) | def test_removed_pattern_doesnt_queue_new_file(self):
    method test_adding_then_removing_pattern_doesnt_queue_existing_file (line 786) | def test_adding_then_removing_pattern_doesnt_queue_existing_file(self):
    method test_downloaded_file_with_changed_remote_size_is_queued (line 813) | def test_downloaded_file_with_changed_remote_size_is_queued(self):
    method test_no_files_are_queued_when_disabled (line 840) | def test_no_files_are_queued_when_disabled(self):
    method test_all_files_are_queued_when_patterns_only_disabled (line 875) | def test_all_files_are_queued_when_patterns_only_disabled(self):
    method test_all_files_are_queued_when_patterns_only_disabled_and_no_patterns_exist (line 906) | def test_all_files_are_queued_when_patterns_only_disabled_and_no_patte...
    method test_matching_new_files_are_extracted (line 934) | def test_matching_new_files_are_extracted(self):
    method test_matching_initial_files_are_extracted (line 984) | def test_matching_initial_files_are_extracted(self):
    method test_new_matching_pattern_extracts_existing_files (line 1024) | def test_new_matching_pattern_extracts_existing_files(self):
    method test_non_extractable_files_are_not_extracted (line 1083) | def test_non_extractable_files_are_not_extracted(self):
    method test_no_files_are_extracted_when_disabled (line 1115) | def test_no_files_are_extracted_when_disabled(self):
    method test_no_files_are_extracted_when_auto_extract_disabled (line 1155) | def test_no_files_are_extracted_when_auto_extract_disabled(self):
    method test_all_files_are_extracted_when_patterns_only_disabled (line 1196) | def test_all_files_are_extracted_when_patterns_only_disabled(self):
    method test_all_files_are_extracted_when_patterns_only_disabled_and_no_patterns_exist (line 1237) | def test_all_files_are_extracted_when_patterns_only_disabled_and_no_pa...
    method test_file_is_extracted_after_finishing_download (line 1275) | def test_file_is_extracted_after_finishing_download(self):
    method test_downloaded_file_is_NOT_re_extracted_after_modified (line 1317) | def test_downloaded_file_is_NOT_re_extracted_after_modified(self):
    method test_downloaded_file_is_NOT_re_extracted_after_failed_extraction (line 1345) | def test_downloaded_file_is_NOT_re_extracted_after_failed_extraction(s...

FILE: src/python/tests/unittests/test_controller/test_controller_persist.py
  class TestControllerPersist (line 10) | class TestControllerPersist(unittest.TestCase):
    method test_from_str (line 11) | def test_from_str(self):
    method test_to_str (line 24) | def test_to_str(self):
    method test_to_and_from_str (line 40) | def test_to_and_from_str(self):
    method test_persist_read_error (line 61) | def test_persist_read_error(self):

FILE: src/python/tests/unittests/test_controller/test_extract/test_dispatch.py
  class DummyExtractListener (line 18) | class DummyExtractListener(ExtractListener):
    method extract_completed (line 20) | def extract_completed(self, name: str, is_dir: bool):
    method extract_failed (line 24) | def extract_failed(self, name: str, is_dir: bool):
  class TestExtractDispatch (line 28) | class TestExtractDispatch(unittest.TestCase):
    method setUp (line 29) | def setUp(self):
    method tearDown (line 57) | def tearDown(self):
    method test_extract_single_raises_error_on_remote_only_file (line 61) | def test_extract_single_raises_error_on_remote_only_file(self):
    method test_extract_single_raises_error_on_bad_archive (line 74) | def test_extract_single_raises_error_on_bad_archive(self):
    method test_extract_single (line 86) | def test_extract_single(self):
    method test_extract_maintains_order (line 102) | def test_extract_maintains_order(self):
    method test_extract_calls_listener_on_completed (line 136) | def test_extract_calls_listener_on_completed(self):
    method test_extract_calls_listener_on_failed (line 153) | def test_extract_calls_listener_on_failed(self):
    method test_extract_calls_listeners_in_correct_sequence (line 175) | def test_extract_calls_listeners_in_correct_sequence(self):
    method test_extract_skips_remaining_on_shutdown (line 221) | def test_extract_skips_remaining_on_shutdown(self):
    method test_extract_dir_raises_error_on_empty_dir (line 256) | def test_extract_dir_raises_error_on_empty_dir(self):
    method test_extract_dir_raises_error_on_no_archives (line 263) | def test_extract_dir_raises_error_on_no_archives(self):
    method test_extract_dir_raises_error_on_no_local_files (line 279) | def test_extract_dir_raises_error_on_no_local_files(self):
    method test_extract_dir (line 297) | def test_extract_dir(self):
    method test_extract_dir_skips_remote_files (line 365) | def test_extract_dir_skips_remote_files(self):
    method test_extract_dir_skips_non_archive_files (line 425) | def test_extract_dir_skips_non_archive_files(self):
    method test_extract_dir_does_not_extract_split_rar_files (line 492) | def test_extract_dir_does_not_extract_split_rar_files(self):
    method test_extract_dir_exits_command_early_on_shutdown (line 563) | def test_extract_dir_exits_command_early_on_shutdown(self):
    method test_status (line 602) | def test_status(self):
    method test_extract_ignores_duplicate_calls (line 706) | def test_extract_ignores_duplicate_calls(self):

FILE: src/python/tests/unittests/test_controller/test_extract/test_extract_process.py
  class TestExtractProcess (line 18) | class TestExtractProcess(unittest.TestCase):
    method setUp (line 19) | def setUp(self):
    method tearDown (line 39) | def tearDown(self):
    method test_param_out_dir_path (line 44) | def test_param_out_dir_path(self):
    method test_param_out_local_path (line 63) | def test_param_out_local_path(self):
    method test_calls_start_dispatch (line 82) | def test_calls_start_dispatch(self):
    method test_retrieves_status (line 96) | def test_retrieves_status(self):
    method test_retrieves_completed (line 165) | def test_retrieves_completed(self):
    method test_forwards_extract_commands (line 213) | def test_forwards_extract_commands(self):

FILE: src/python/tests/unittests/test_controller/test_model_builder.py
  class TestModelBuilder (line 16) | class TestModelBuilder(unittest.TestCase):
    method setUp (line 17) | def setUp(self):
    method __build_test_model_children_tree_1 (line 27) | def __build_test_model_children_tree_1(self) -> Model:
    method test_build_file_names (line 80) | def test_build_file_names(self):
    method test_build_is_dir (line 91) | def test_build_is_dir(self):
    method test_build_mismatch_is_dir (line 142) | def test_build_mismatch_is_dir(self):
    method test_build_state (line 186) | def test_build_state(self):
    method test_build_remote_size (line 354) | def test_build_remote_size(self):
    method test_build_remote_size_from_status_is_ignored (line 371) | def test_build_remote_size_from_status_is_ignored(self):
    method test_build_local_size (line 379) | def test_build_local_size(self):
    method test_build_local_size_from_status_is_ignored (line 396) | def test_build_local_size_from_status_is_ignored(self):
    method test_build_local_size_downloading (line 404) | def test_build_local_size_downloading(self):
    method test_build_downloading_state_is_retained (line 413) | def test_build_downloading_state_is_retained(self):
    method test_build_downloading_speed (line 432) | def test_build_downloading_speed(self):
    method test_build_eta (line 455) | def test_build_eta(self):
    method test_build_estimated_eta (line 478) | def test_build_estimated_eta(self):
    method test_build_children_names (line 537) | def test_build_children_names(self):
    method test_build_children_is_dir (line 563) | def test_build_children_is_dir(self):
    method test_build_children_mismatch_is_dir (line 597) | def test_build_children_mismatch_is_dir(self):
    method test_build_children_sizes (line 611) | def test_build_children_sizes(self):
    method test_build_children_state_default (line 645) | def test_build_children_state_default(self):
    method test_build_children_state_default_partial (line 667) | def test_build_children_state_default_partial(self):
    method test_build_children_state_default_extra (line 698) | def test_build_children_state_default_extra(self):
    method test_build_children_state_downloaded_full (line 720) | def test_build_children_state_downloaded_full(self):
    method test_build_children_state_downloaded_full_extra (line 751) | def test_build_children_state_downloaded_full_extra(self):
    method test_build_children_state_downloaded_partial (line 791) | def test_build_children_state_downloaded_partial(self):
    method test_build_children_state_downloaded_partial_extra (line 822) | def test_build_children_state_downloaded_partial_extra(self):
    method test_build_children_state_queued (line 862) | def test_build_children_state_queued(self):
    method test_build_children_state_downloading_1 (line 885) | def test_build_children_state_downloading_1(self):
    method test_build_children_state_downloading_2 (line 911) | def test_build_children_state_downloading_2(self):
    method test_build_children_state_downloading_3 (line 937) | def test_build_children_state_downloading_3(self):
    method test_build_children_state_downloading_4 (line 961) | def test_build_children_state_downloading_4(self):
    method test_build_children_state_all (line 989) | def test_build_children_state_all(self):
    method test_build_children_downloading_speed (line 1023) | def test_build_children_downloading_speed(self):
    method test_build_children_eta (line 1057) | def test_build_children_eta(self):
    method test_build_sets_is_extractable (line 1092) | def test_build_sets_is_extractable(self, mock_extract_module):
    method test_build_transferred_size (line 1190) | def test_build_transferred_size(self):
    method test_build_local_created_timestamp (line 1235) | def test_build_local_created_timestamp(self):
    method test_build_local_modified_timestamp (line 1245) | def test_build_local_modified_timestamp(self):
    method test_build_remote_created_timestamp (line 1255) | def test_build_remote_created_timestamp(self):
    method test_build_remote_modified_timestamp (line 1265) | def test_build_remote_modified_timestamp(self):
    method test_rebuild (line 1275) | def test_rebuild(self):
    method test_rebuild_on_active_files (line 1302) | def test_rebuild_on_active_files(self):
    method test_rebuild_on_local_files (line 1325) | def test_rebuild_on_local_files(self):
    method test_rebuild_on_remote_files (line 1350) | def test_rebuild_on_remote_files(self):
    method test_rebuild_on_lftp_statuses (line 1375) | def test_rebuild_on_lftp_statuses(self):
    method test_rebuild_on_downloaded_files (line 1400) | def test_rebuild_on_downloaded_files(self):
    method test_rebuild_on_extract_statuses (line 1416) | def test_rebuild_on_extract_statuses(self):
    method test_rebuild_on_extracted_files (line 1441) | def test_rebuild_on_extracted_files(self):

FILE: src/python/tests/unittests/test_controller/test_scan/test_remote_scanner.py
  class TestRemoteScanner (line 17) | class TestRemoteScanner(unittest.TestCase):
    method setUp (line 21) | def setUp(self):
    method setUpClass (line 38) | def setUpClass(cls):
    method tearDownClass (line 45) | def tearDownClass(cls):
    method test_correctly_initializes_ssh (line 48) | def test_correctly_initializes_ssh(self):
    method test_installs_scan_script_on_first_scan (line 72) | def test_installs_scan_script_on_first_scan(self):
    method test_copy_appends_scanfs_name_to_remote_path (line 107) | def test_copy_appends_scanfs_name_to_remote_path(self):
    method test_calls_correct_ssh_md5sum_command (line 138) | def test_calls_correct_ssh_md5sum_command(self):
    method test_skips_install_on_md5sum_match (line 169) | def test_skips_install_on_md5sum_match(self):
    method test_installs_scan_script_on_any_md5sum_output (line 201) | def test_installs_scan_script_on_any_md5sum_output(self):
    method test_raises_nonrecoverable_error_on_md5sum_error (line 232) | def test_raises_nonrecoverable_error_on_md5sum_error(self):
    method test_calls_correct_ssh_scan_command (line 261) | def test_calls_correct_ssh_scan_command(self):
    method test_raises_nonrecoverable_error_on_first_failed_ssh (line 291) | def test_raises_nonrecoverable_error_on_first_failed_ssh(self):
    method test_raises_recoverable_error_on_subsequent_failed_ssh (line 324) | def test_raises_recoverable_error_on_subsequent_failed_ssh(self):
    method test_recovers_from_failed_ssh (line 361) | def test_recovers_from_failed_ssh(self):
    method test_raises_nonrecoverable_error_on_failed_copy (line 398) | def test_raises_nonrecoverable_error_on_failed_copy(self):
    method test_raises_nonrecoverable_error_on_mangled_output (line 419) | def test_raises_nonrecoverable_error_on_mangled_output(self):
    method test_raises_nonrecoverable_error_on_failed_scan (line 439) | def test_raises_nonrecoverable_error_on_failed_scan(self):

FILE: src/python/tests/unittests/test_controller/test_scan/test_scanner_process.py
  class DummyScanner (line 15) | class DummyScanner(IScanner):
    method scan (line 16) | def scan(self):
    method set_base_logger (line 19) | def set_base_logger(self, base_logger: logging.Logger):
  class TestScannerProcess (line 23) | class TestScannerProcess(unittest.TestCase):
    method setUp (line 24) | def setUp(self):
    method tearDown (line 36) | def tearDown(self):
    method test_retrieves_scan_results (line 41) | def test_retrieves_scan_results(self):
    method test_sends_error_result_on_recoverable_error (line 146) | def test_sends_error_result_on_recoverable_error(self):
    method test_sends_fatal_exception_on_nonrecoverable_error (line 164) | def test_sends_fatal_exception_on_nonrecoverable_error(self):

FILE: src/python/tests/unittests/test_lftp/test_job_status.py
  class TestLftpJobStatus (line 8) | class TestLftpJobStatus(unittest.TestCase):
    method test_id (line 9) | def test_id(self):
    method test_type (line 17) | def test_type(self):
    method test_state (line 31) | def test_state(self):
    method test_name (line 45) | def test_name(self):
    method test_total_transfer_state (line 59) | def test_total_transfer_state(self):
    method test_total_transfer_state_fails_on_queued (line 70) | def test_total_transfer_state_fails_on_queued(self):
    method test_active_transfer_state (line 80) | def test_active_transfer_state(self):
    method test_active_transfer_state_fails_on_queued (line 92) | def test_active_transfer_state_fails_on_queued(self):
    method test_equality_operator (line 102) | def test_equality_operator(self):

FILE: src/python/tests/unittests/test_lftp/test_job_status_parser.py
  class TestLftpJobStatusParser (line 9) | class TestLftpJobStatusParser(unittest.TestCase):
    method setUp (line 10) | def setUp(self):
    method test_size_to_bytes (line 14) | def test_size_to_bytes(self):
    method test_eta_to_seconds (line 32) | def test_eta_to_seconds(self):
    method test_empty_output_1 (line 44) | def test_empty_output_1(self):
    method test_empty_output_2 (line 50) | def test_empty_output_2(self):
    method test_empty_output_3 (line 57) | def test_empty_output_3(self):
    method test_empty_output_4 (line 65) | def test_empty_output_4(self):
    method test_queued_items (line 75) | def test_queued_items(self):
    method test_queued_items_with_quotes (line 120) | def test_queued_items_with_quotes(self):
    method test_queue_and_jobs_1 (line 183) | def test_queue_and_jobs_1(self):
    method test_queue_and_jobs_2 (line 293) | def test_queue_and_jobs_2(self):
    method test_queue_and_jobs_3 (line 392) | def test_queue_and_jobs_3(self):
    method test_queue_and_jobs_4 (line 447) | def test_queue_and_jobs_4(self):
    method test_queue_and_jobs_5 (line 498) | def test_queue_and_jobs_5(self):
    method test_queue_and_jobs_6 (line 550) | def test_queue_and_jobs_6(self):
    method test_jobs_1 (line 606) | def test_jobs_1(self):
    method test_jobs_2 (line 629) | def test_jobs_2(self):
    method test_jobs_3 (line 655) | def test_jobs_3(self):
    method test_jobs_quotes (line 688) | def test_jobs_quotes(self):
    method test_jobs_getting_file_list (line 723) | def test_jobs_getting_file_list(self):
    method test_jobs_mirror_empty (line 753) | def test_jobs_mirror_empty(self):
    method test_jobs_mirror_mkdir (line 781) | def test_jobs_mirror_mkdir(self):
    method test_jobs_connecting (line 808) | def test_jobs_connecting(self):
    method test_jobs_almost_done (line 837) | def test_jobs_almost_done(self):
    method test_jobs_empty (line 863) | def test_jobs_empty(self):
    method test_jobs_with_done_line (line 882) | def test_jobs_with_done_line(self):
    method test_jobs_missing_pget_data_line (line 908) | def test_jobs_missing_pget_data_line(self):
    method test_raises_error_on_bad_status (line 938) | def test_raises_error_on_bad_status(self):
    method test_jobs_special_char_1 (line 952) | def test_jobs_special_char_1(self):
    method test_jobs_special_char_2 (line 1005) | def test_jobs_special_char_2(self):
    method test_jobs_special_char_3 (line 1058) | def test_jobs_special_char_3(self):
    method test_jobs_special_char_4 (line 1111) | def test_jobs_special_char_4(self):
    method test_jobs_chmod (line 1164) | def test_jobs_chmod(self):
    method test_jobs_chmod_two_liner (line 1252) | def test_jobs_chmod_two_liner(self):
    method test_jobs_chmod_2 (line 1295) | def test_jobs_chmod_2(self):
    method test_removes_jobs_command (line 1337) | def test_removes_jobs_command(self):
    method test_removes_multiple_jobs_lines (line 1358) | def test_removes_multiple_jobs_lines(self):
    method test_removes_log_line (line 1381) | def test_removes_log_line(self):
    method test_removes_lines_before_first_jobs (line 1402) | def test_removes_lines_before_first_jobs(self):
    method test_jobs_removes_multiple_jobs_lines (line 1424) | def test_jobs_removes_multiple_jobs_lines(self):

FILE: src/python/tests/unittests/test_lftp/test_lftp.py
  class TestLftp (line 17) | class TestLftp(unittest.TestCase):
    method setUpClass (line 21) | def setUpClass(cls):
    method tearDownClass (line 88) | def tearDownClass(cls):
    method setUp (line 92) | def setUp(self):
    method tearDown (line 118) | def tearDown(self):
    method test_num_connections_per_dir_file (line 122) | def test_num_connections_per_dir_file(self):
    method test_num_connections_per_root_file (line 128) | def test_num_connections_per_root_file(self):
    method test_num_parallel_files (line 134) | def test_num_parallel_files(self):
    method test_num_max_total_connections (line 140) | def test_num_max_total_connections(self):
    method test_rate_limit (line 148) | def test_rate_limit(self):
    method test_min_chunk_size (line 156) | def test_min_chunk_size(self):
    method test_num_parallel_jobs (line 164) | def test_num_parallel_jobs(self):
    method test_move_background_on_exit (line 170) | def test_move_background_on_exit(self):
    method test_use_temp_file (line 176) | def test_use_temp_file(self):
    method test_temp_file_name (line 182) | def test_temp_file_name(self):
    method test_sftp_auto_confirm (line 188) | def test_sftp_auto_confirm(self):
    method test_sftp_connect_program (line 194) | def test_sftp_connect_program(self):
    method test_status_empty (line 200) | def test_status_empty(self):
    method test_queue_file (line 205) | def test_queue_file(self):
    method test_queue_dir (line 218) | def test_queue_dir(self):
    method test_queue_file_with_spaces (line 231) | def test_queue_file_with_spaces(self):
    method test_queue_dir_with_spaces (line 245) | def test_queue_dir_with_spaces(self):
    method test_queue_file_with_unicode (line 258) | def test_queue_file_with_unicode(self):
    method test_queue_dir_with_latin (line 271) | def test_queue_dir_with_latin(self):
    method test_queue_dir_with_unicode (line 292) | def test_queue_dir_with_unicode(self):
    method test_queue_num_parallel_jobs (line 306) | def test_queue_num_parallel_jobs(self):
    method test_kill_all (line 331) | def test_kill_all(self):
    method test_kill_all_and_queue_again (line 354) | def test_kill_all_and_queue_again(self):
    method test_kill_queued_job (line 385) | def test_kill_queued_job(self):
    method test_kill_running_job (line 411) | def test_kill_running_job(self):
    method test_kill_missing_job (line 431) | def test_kill_missing_job(self):
    method test_kill_job_1 (line 452) | def test_kill_job_1(self):
    method test_queued_and_kill_jobs_1 (line 522) | def test_queued_and_kill_jobs_1(self):
    method test_queue_dir_wrong_file_type (line 608) | def test_queue_dir_wrong_file_type(self):
    method test_queue_file_wrong_file_type (line 627) | def test_queue_file_wrong_file_type(self):
    method test_queue_missing_file (line 646) | def test_queue_missing_file(self):
    method test_queue_missing_dir (line 663) | def test_queue_missing_dir(self):
    method test_password_auth (line 681) | def test_password_auth(self):
    method test_error_bad_password (line 716) | def test_error_bad_password(self):

FILE: src/python/tests/unittests/test_model/test_diff.py
  class TestModelDiff (line 9) | class TestModelDiff(unittest.TestCase):
    method test_change (line 10) | def test_change(self):
    method test_old_file (line 18) | def test_old_file(self):
    method test_new_file (line 26) | def test_new_file(self):
  class TestModelDiffUtil (line 35) | class TestModelDiffUtil(unittest.TestCase):
    method test_added (line 36) | def test_added(self):
    method test_removed (line 45) | def test_removed(self):
    method test_updated (line 54) | def test_updated(self):
    method test_updated_children (line 66) | def test_updated_children(self):
    method test_diff_1 (line 82) | def test_diff_1(self):

FILE: src/python/tests/unittests/test_model/test_file.py
  class TestModelFile (line 9) | class TestModelFile(unittest.TestCase):
    method test_name (line 10) | def test_name(self):
    method test_is_dir (line 14) | def test_is_dir(self):
    method test_state (line 20) | def test_state(self):
    method test_local_size (line 29) | def test_local_size(self):
    method test_remote_size (line 42) | def test_remote_size(self):
    method test_transferred_size (line 55) | def test_transferred_size(self):
    method test_downloading_speed (line 68) | def test_downloading_speed(self):
    method test_update_timestamp (line 81) | def test_update_timestamp(self):
    method test_eta (line 91) | def test_eta(self):
    method test_is_extractable (line 104) | def test_is_extractable(self):
    method test_local_created_timestamp (line 111) | def test_local_created_timestamp(self):
    method test_local_modified_timestamp (line 122) | def test_local_modified_timestamp(self):
    method test_remote_created_timestamp (line 133) | def test_remote_created_timestamp(self):
    method test_remote_modified_timestamp (line 144) | def test_remote_modified_timestamp(self):
    method test_equality_operator (line 155) | def test_equality_operator(self):
    method test_child (line 170) | def test_child(self):
    method test_child_equality (line 180) | def test_child_equality(self):
    method test_fail_add_child_to_nondir (line 216) | def test_fail_add_child_to_nondir(self):
    method test_fail_add_child_twice (line 223) | def test_fail_add_child_twice(self):
    method test_full_path (line 234) | def test_full_path(self):
    method test_parent (line 247) | def test_parent(self):

FILE: src/python/tests/unittests/test_model/test_model.py
  class DummyModelListener (line 12) | class DummyModelListener(IModelListener):
    method file_added (line 14) | def file_added(self, file: ModelFile):
    method file_removed (line 18) | def file_removed(self, file: ModelFile):
    method file_updated (line 22) | def file_updated(self, old_file: ModelFile, new_file: ModelFile):
  class TestLftpModel (line 26) | class TestLftpModel(unittest.TestCase):
    method setUp (line 27) | def setUp(self):
    method test_add_file (line 37) | def test_add_file(self):
    method test_get_unknown_file (line 43) | def test_get_unknown_file(self):
    method test_remove_file (line 47) | def test_remove_file(self):
    method test_remove_unknown_file (line 54) | def test_remove_unknown_file(self):
    method test_update_file (line 58) | def test_update_file(self):
    method test_update_unknown_file (line 69) | def test_update_unknown_file(self):
    method test_get_file_names (line 74) | def test_get_file_names(self):
    method test_add_listener (line 87) | def test_add_listener(self):
    method test_remove_listener (line 91) | def test_remove_listener(self):
    method test_listener_file_added (line 104) | def test_listener_file_added(self):
    method test_listener_file_removed (line 115) | def test_listener_file_removed(self):
    method test_listener_file_updated (line 127) | def test_listener_file_updated(self):

FILE: src/python/tests/unittests/test_seedsync.py
  class TestSeedsync (line 11) | class TestSeedsync(unittest.TestCase):
    method test_args_config (line 12) | def test_args_config(self):
    method test_args_html (line 39) | def test_args_html(self):
    method test_args_scanfs (line 51) | def test_args_scanfs(self):
    method test_args_logdir (line 63) | def test_args_logdir(self):
    method test_args_debug (line 88) | def test_args_debug(self):
    method test_default_config (line 124) | def test_default_config(self):
    method test_detect_incomplete_config (line 139) | def test_detect_incomplete_config(self):

FILE: src/python/tests/unittests/test_ssh/test_sshcp.py
  class TestSshcp (line 30) | class TestSshcp(unittest.TestCase):
    method setUp (line 34) | def setUp(self):
    method tearDown (line 63) | def tearDown(self):
    method test_ctor (line 67) | def test_ctor(self):
    method test_copy (line 73) | def test_copy(self, _, password):
    method test_copy_error_bad_password (line 81) | def test_copy_error_bad_password(self):
    method test_copy_error_missing_local_file (line 89) | def test_copy_error_missing_local_file(self, _, password):
    method test_copy_error_missing_remote_dir (line 101) | def test_copy_error_missing_remote_dir(self, _, password):
    method test_copy_error_bad_host (line 112) | def test_copy_error_bad_host(self, _, password):
    method test_copy_error_bad_port (line 120) | def test_copy_error_bad_port(self, _, password):
    method test_shell (line 129) | def test_shell(self, _, password):
    method test_shell_with_escape_characters (line 137) | def test_shell_with_escape_characters(self, _, password):
    method test_shell_error_bad_password (line 158) | def test_shell_error_bad_password(self):
    method test_shell_error_bad_host (line 166) | def test_shell_error_bad_host(self, _, password):
    method test_shell_error_bad_port (line 174) | def test_shell_error_bad_port(self, _, password):
    method test_shell_error_bad_command (line 182) | def test_shell_error_bad_command(self, _, password):

FILE: src/python/tests/unittests/test_system/test_file.py
  class TestSystemFile (line 9) | class TestSystemFile(unittest.TestCase):
    method test_name (line 10) | def test_name(self):
    method test_size (line 14) | def test_size(self):
    method test_is_dir (line 22) | def test_is_dir(self):
    method test_time_created (line 28) | def test_time_created(self):
    method test_time_modified (line 34) | def test_time_modified(self):
    method test_add_child (line 40) | def test_add_child(self):
    method test_fail_add_child_to_file (line 52) | def test_fail_add_child_to_file(self):
    method test_equality_operator (line 58) | def test_equality_operator(self):

FILE: src/python/tests/unittests/test_system/test_scanner.py
  function my_mkdir (line 13) | def my_mkdir(*args):
  function my_touch (line 17) | def my_touch(size, *args):
  function my_mkdir_latin (line 23) | def my_mkdir_latin(*args):
  function my_touch_latin (line 27) | def my_touch_latin(size, *args):
  class TestSystemScanner (line 34) | class TestSystemScanner(unittest.TestCase):
    method setUp (line 37) | def setUp(self):
    method tearDown (line 41) | def tearDown(self):
    method setup_default_tree (line 45) | def setup_default_tree(self):
    method test_scan_tree (line 78) | def test_scan_tree(self):
    method test_scan_size (line 132) | def test_scan_size(self):
    method test_scan_non_existing_dir_fails (line 162) | def test_scan_non_existing_dir_fails(self):
    method test_scan_file_fails (line 171) | def test_scan_file_fails(self):
    method test_scan_single_dir (line 180) | def test_scan_single_dir(self):
    method test_scan_single_file (line 207) | def test_scan_single_file(self):
    method test_scan_single_non_existing_path_fails (line 216) | def test_scan_single_non_existing_path_fails(self):
    method test_scan_tree_excluded_prefix (line 225) | def test_scan_tree_excluded_prefix(self):
    method test_scan_size_excluded_prefix (line 251) | def test_scan_size_excluded_prefix(self):
    method test_scan_tree_excluded_suffix (line 278) | def test_scan_tree_excluded_suffix(self):
    method test_scan_size_excluded_suffix (line 297) | def test_scan_size_excluded_suffix(self):
    method test_lftp_status_file_size (line 315) | def test_lftp_status_file_size(self):
    method test_scan_lftp_partial_file (line 331) | def test_scan_lftp_partial_file(self):
    method test_scan_single_lftp_partial_file (line 364) | def test_scan_single_lftp_partial_file(self):
    method test_scan_lftp_temp_file (line 391) | def test_scan_lftp_temp_file(self):
    method test_scan_single_lftp_temp_file (line 474) | def test_scan_single_lftp_temp_file(self):
    method test_files_deleted_while_scanning (line 574) | def test_files_deleted_while_scanning(self):
    method test_scan_modified_time (line 604) | def test_scan_modified_time(self):
    method test_scan_file_with_unicode_chars (line 632) | def test_scan_file_with_unicode_chars(self):
    method test_scan_file_with_latin_chars (line 648) | def test_scan_file_with_latin_chars(self):

FILE: src/python/tests/unittests/test_web/test_handler/test_stream_log.py
  function create_log_record (line 10) | def create_log_record(created: float, msg: str) -> LogRecord:
  class TestCachedQueueLogHandler (line 24) | class TestCachedQueueLogHandler(unittest.TestCase):
    method test_caches_new_records (line 26) | def test_caches_new_records(self, mock_time_module):
    method test_prunes_old_records (line 55) | def test_prunes_old_records(self, mock_time_module):
    method test_prunes_old_records_at_get_time (line 84) | def test_prunes_old_records_at_get_time(self, mock_time_module):
    method test_cache_can_be_disabled (line 116) | def test_cache_can_be_disabled(self, mock_time_module):

FILE: src/python/tests/unittests/test_web/test_serialize/test_serialize.py
  class DummySerialize (line 8) | class DummySerialize(Serialize):
    method dummy (line 9) | def dummy(self):
  function parse_stream (line 13) | def parse_stream(serialized_str: str):

FILE: src/python/tests/unittests/test_web/test_serialize/test_serialize_auto_queue.py
  class TestSerializeConfig (line 10) | class TestSerializeConfig(unittest.TestCase):
    method test_is_list (line 11) | def test_is_list(self):
    method test_patterns (line 22) | def test_patterns(self):

FILE: src/python/tests/unittests/test_web/test_serialize/test_serialize_config.py
  class TestSerializeConfig (line 10) | class TestSerializeConfig(unittest.TestCase):
    method test_section_general (line 11) | def test_section_general(self):
    method test_section_lftp (line 19) | def test_section_lftp(self):
    method test_section_controller (line 47) | def test_section_controller(self):
    method test_section_web (line 59) | def test_section_web(self):
    method test_section_autoqueue (line 67) | def test_section_autoqueue(self):

FILE: src/python/tests/unittests/test_web/test_serialize/test_serialize_log_record.py
  class TestSerializeLogRecord (line 11) | class TestSerializeLogRecord(unittest.TestCase):
    method test_event_names (line 12) | def test_event_names(self):
    method test_record_time (line 29) | def test_record_time(self):
    method test_record_level_name (line 47) | def test_record_level_name(self):
    method test_record_logger_name (line 126) | def test_record_logger_name(self):
    method test_record_message (line 144) | def test_record_message(self):
    method test_record_exception_text (line 162) | def test_record_exception_text(self):

FILE: src/python/tests/unittests/test_web/test_serialize/test_serialize_model.py
  class TestSerializeModel (line 13) | class TestSerializeModel(unittest.TestCase):
    method test_event_names (line 14) | def test_event_names(self):
    method test_model_is_a_list (line 37) | def test_model_is_a_list(self):
    method test_update_event_is_a_dict (line 50) | def test_update_event_is_a_dict(self):
    method test_update_event_files (line 62) | def test_update_event_files(self):
    method test_file_name (line 100) | def test_file_name(self):
    method test_file_is_dir (line 109) | def test_file_is_dir(self):
    method test_file_state (line 118) | def test_file_state(self):
    method test_remote_size (line 146) | def test_remote_size(self):
    method test_local_size (line 162) | def test_local_size(self):
    method test_downloading_speed (line 178) | def test_downloading_speed(self):
    method test_eta (line 194) | def test_eta(self):
    method test_file_is_extractable (line 210) | def test_file_is_extractable(self):
    method test_local_created_timestamp (line 223) | def test_local_created_timestamp(self):
    method test_local_modified_timestamp (line 235) | def test_local_modified_timestamp(self):
    method test_remote_created_timestamp (line 247) | def test_remote_created_timestamp(self):
    method test_remote_modified_timestamp (line 259) | def test_remote_modified_timestamp(self):
    method test_children (line 271) | def test_children(self):
    method test_full_path (line 308) | def test_full_path(self):

FILE: src/python/tests/unittests/test_web/test_serialize/test_serialize_status.py
  class TestSerializeStatus (line 13) | class TestSerializeStatus(unittest.TestCase):
    method test_event_names (line 14) | def test_event_names(self):
    method test_server_status_up (line 25) | def test_server_status_up(self):
    method test_server_status_error_msg (line 38) | def test_server_status_error_msg(self):
    method test_controller_status_latest_local_scan_time (line 51) | def test_controller_status_latest_local_scan_time(self):
    method test_controller_status_latest_remote_scan_time (line 64) | def test_controller_status_latest_remote_scan_time(self):
    method test_controller_status_latest_remote_scan_failed (line 77) | def test_controller_status_latest_remote_scan_failed(self):
    method test_controller_status_latest_remote_scan_error (line 89) | def test_controller_status_latest_remote_scan_error(self):

FILE: src/python/tests/utils.py
  class TestUtils (line 6) | class TestUtils:
    method chmod_from_to (line 8) | def chmod_from_to(from_path: str, to_path: str, mode: int):

FILE: src/python/web/handler/auto_queue.py
  class AutoQueueHandler (line 12) | class AutoQueueHandler(IHandler):
    method __init__ (line 13) | def __init__(self, auto_queue_persist: AutoQueuePersist):
    method add_routes (line 17) | def add_routes(self, web_app: WebApp):
    method __handle_get_autoqueue (line 22) | def __handle_get_autoqueue(self):
    method __handle_add_autoqueue (line 28) | def __handle_add_autoqueue(self, pattern: str):
    method __handle_remove_autoqueue (line 43) | def __handle_remove_autoqueue(self, pattern: str):

FILE: src/python/web/handler/config.py
  class ConfigHandler (line 11) | class ConfigHandler(IHandler):
    method __init__ (line 12) | def __init__(self, config: Config):
    method add_routes (line 16) | def add_routes(self, web_app: WebApp):
    method __handle_get_config (line 21) | def __handle_get_config(self):
    method __handle_set_config (line 25) | def __handle_set_config(self, section: str, key: str, value: str):

FILE: src/python/web/handler/controller.py
  class WebResponseActionCallback (line 13) | class WebResponseActionCallback(Controller.Command.ICallback):
    method __init__ (line 21) | def __init__(self):
    method on_failure (line 27) | def on_failure(self, error: str):
    method on_success (line 33) | def on_success(self):
    method wait (line 37) | def wait(self):
  class ControllerHandler (line 41) | class ControllerHandler(IHandler):
    method __init__ (line 42) | def __init__(self, controller: Controller):
    method add_routes (line 46) | def add_routes(self, web_app: WebApp):
    method __handle_action_queue (line 53) | def __handle_action_queue(self, file_name: str):
    method __handle_action_stop (line 72) | def __handle_action_stop(self, file_name: str):
    method __handle_action_extract (line 91) | def __handle_action_extract(self, file_name: str):
    method __handle_action_delete_local (line 110) | def __handle_action_delete_local(self, file_name: str):
    method __handle_action_delete_remote (line 129) | def __handle_action_delete_remote(self, file_name: str):

FILE: src/python/web/handler/server.py
  class ServerHandler (line 9) | class ServerHandler(IHandler):
    method __init__ (line 10) | def __init__(self, context: Context):
    method add_routes (line 15) | def add_routes(self, web_app: WebApp):
    method is_restart_requested (line 18) | def is_restart_requested(self):
    method __handle_action_restart (line 25) | def __handle_action_restart(self):

FILE: src/python/web/handler/status.py
  class StatusHandler (line 10) | class StatusHandler(IHandler):
    method __init__ (line 11) | def __init__(self, status: Status):
    method add_routes (line 15) | def add_routes(self, web_app: WebApp):
    method __handle_get_status (line 18) | def __handle_get_status(self):

FILE: src/python/web/handler/stream_log.py
  class CachedQueueLogHandler (line 15) | class CachedQueueLogHandler(logging.Handler):
    method __init__ (line 20) | def __init__(self, history_size_in_ms: int):
    method get_cached_records (line 30) | def get_cached_records(self) -> List[logging.LogRecord]:
    method emit (line 38) | def emit(self, record: logging.LogRecord):
    method __prune_history (line 45) | def __prune_history(self):
  class QueueLogHandler (line 60) | class QueueLogHandler(logging.Handler, StreamQueue[logging.LogRecord]):
    method __init__ (line 64) | def __init__(self):
    method emit (line 69) | def emit(self, record):
  class LogStreamHandler (line 73) | class LogStreamHandler(IStreamHandler):
    method __init__ (line 84) | def __init__(self, logger: logging.Logger):
    method register (line 92) | def register(cls, web_app: "WebApp", **kwargs):
    method setup (line 102) | def setup(self):
    method get_value (line 110) | def get_value(self) -> Optional[str]:
    method cleanup (line 118) | def cleanup(self):

FILE: src/python/web/handler/stream_model.py
  class WebResponseModelListener (line 13) | class WebResponseModelListener(IModelListener, StreamQueue[SerializeMode...
    method __init__ (line 18) | def __init__(self):
    method file_added (line 22) | def file_added(self, file: ModelFile):
    method file_removed (line 28) | def file_removed(self, file: ModelFile):
    method file_updated (line 34) | def file_updated(self, old_file: ModelFile, new_file: ModelFile):
  class ModelStreamHandler (line 40) | class ModelStreamHandler(IStreamHandler):
    method __init__ (line 41) | def __init__(self, controller: Controller):
    method setup (line 49) | def setup(self):
    method get_value (line 53) | def get_value(self) -> Optional[str]:
    method cleanup (line 65) | def cleanup(self):

FILE: src/python/web/handler/stream_status.py
  class StatusListener (line 11) | class StatusListener(IStatusListener, StreamQueue[Status]):
    method __init__ (line 15) | def __init__(self, status: Status):
    method notify (line 20) | def notify(self):
  class StatusStreamHandler (line 24) | class StatusStreamHandler(IStreamHandler):
    method __init__ (line 25) | def __init__(self, status: Status):
    method setup (line 32) | def setup(self):
    method get_value (line 36) | def get_value(self) -> Optional[str]:
    method cleanup (line 49) | def cleanup(self):

FILE: src/python/web/serialize/serialize.py
  class Serialize (line 6) | class Serialize(ABC):
    method _sse_pack (line 11) | def _sse_pack(self, event: str, data: str) -> str:

FILE: src/python/web/serialize/serialize_auto_queue.py
  class SerializeAutoQueue (line 9) | class SerializeAutoQueue:
    method patterns (line 13) | def patterns(patterns: List[AutoQueuePattern]) -> str:

FILE: src/python/web/serialize/serialize_config.py
  class SerializeConfig (line 9) | class SerializeConfig:
    method config (line 11) | def config(config: Config) -> str:

FILE: src/python/web/serialize/serialize_log_record.py
  class SerializeLogRecord (line 9) | class SerializeLogRecord(Serialize):
    method __init__ (line 24) | def __init__(self):
    method record (line 29) | def record(self, record: logging.LogRecord) -> str:

FILE: src/python/web/serialize/serialize_model.py
  class SerializeModel (line 11) | class SerializeModel(Serialize):
    class UpdateEvent (line 17) | class UpdateEvent:
      class Change (line 18) | class Change(Enum):
      method __init__ (line 23) | def __init__(self, change: Change, old_file: Optional[ModelFile], ne...
    method __model_file_to_json_dict (line 64) | def __model_file_to_json_dict(model_file: ModelFile) -> dict:
    method model (line 88) | def model(self, model_files: List[ModelFile]) -> str:
    method update_event (line 98) | def update_event(self, event: UpdateEvent):

FILE: src/python/web/serialize/serialize_status.py
  class SerializeStatusJson (line 9) | class SerializeStatusJson:
    method status (line 21) | def status(status: Status) -> str:
  class SerializeStatus (line 46) | class SerializeStatus(Serialize):
    method status (line 55) | def status(self, status: Status) -> str:

FILE: src/python/web/utils.py
  class StreamQueue (line 10) | class StreamQueue(Generic[T]):
    method __init__ (line 17) | def __init__(self):
    method put (line 20) | def put(self, event: T):
    method get_next_event (line 23) | def get_next_event(self) -> Optional[T]:

FILE: src/python/web/web_app.py
  class IHandler (line 14) | class IHandler(ABC):
    method add_routes (line 19) | def add_routes(self, web_app: "WebApp"):
  class IStreamHandler (line 28) | class IStreamHandler(ABC):
    method setup (line 33) | def setup(self):
    method get_value (line 37) | def get_value(self) -> Optional[str]:
    method cleanup (line 41) | def cleanup(self):
    method register (line 45) | def register(cls, web_app: "WebApp", **kwargs):
  class WebApp (line 55) | class WebApp(bottle.Bottle):
    method __init__ (line 61) | def __init__(self, context: Context, controller: Controller):
    method add_default_routes (line 71) | def add_default_routes(self):
    method add_handler (line 90) | def add_handler(self, path: str, handler: Callable):
    method add_streaming_handler (line 93) | def add_streaming_handler(self, handler: Type[IStreamHandler], **kwargs):
    method process (line 96) | def process(self):
    method stop (line 103) | def stop(self):
    method __index (line 110) | def __index(self):
    method __static (line 118) | def __static(self, file_path: str):
    method __web_stream (line 126) | def __web_stream(self):

FILE: src/python/web/web_app_builder.py
  class WebAppBuilder (line 16) | class WebAppBuilder:
    method __init__ (line 20) | def __init__(self,
    method build (line 33) | def build(self) -> WebApp:

FILE: src/python/web/web_app_job.py
  class WebAppJob (line 14) | class WebAppJob(Job):
    method __init__ (line 19) | def __init__(self, context: Context, web_app: WebApp):
    method setup (line 28) | def setup(self):
    method execute (line 42) | def execute(self):
    method cleanup (line 46) | def cleanup(self):
  class MyWSGIHandler (line 52) | class MyWSGIHandler(httpserver.WSGIHandler):
    method wsgi_write_chunk (line 57) | def wsgi_write_chunk(self, chunk):
  class MyWSGIRefServer (line 63) | class MyWSGIRefServer(bottle.ServerAdapter):
    method __init__ (line 70) | def __init__(self, logger: logging.Logger, *args, **kwargs):
    method run (line 76) | def run(self, handler):
    method stop (line 84) | def stop(self):
Condensed preview — 337 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,062K chars).
[
  {
    "path": ".github/workflows/master.yml",
    "chars": 8825,
    "preview": "\nname: CI\n\non:\n  push:\n    branches: [ master ]\n    tags:\n      - v[0-9]+.[0-9]+.[0-9]+\n  pull_request:\n    branches: [ "
  },
  {
    "path": ".gitignore",
    "chars": 75,
    "preview": ".idea\n*.pyc\n/build\n.venv\npackage-lock.json\nsrc/python/build\nsrc/python/site"
  },
  {
    "path": "LICENSE.txt",
    "chars": 11356,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "Makefile",
    "chars": 8380,
    "preview": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\n# Catch sigterms\n# See: https://stackoverflow.com/a/52159940\ne"
  },
  {
    "path": "README.md",
    "chars": 2796,
    "preview": "<p align=\"center\">\n    <img src=\"https://user-images.githubusercontent.com/12875506/85908858-c637a100-b7cb-11ea-8ab3-75c"
  },
  {
    "path": "doc/CodingGuidelines.md",
    "chars": 781,
    "preview": "# Coding Guidelines\n\n## Python\n1. Try not to throw exceptions in constructors.\nDelay exceptions until after the web serv"
  },
  {
    "path": "doc/DeveloperReadme.md",
    "chars": 7473,
    "preview": "[TOC]\n\n\n\n# Environment Setup\n\n## Install dependencies\n1. Install [nodejs](https://joshtronic.com/2019/04/29/how-to-insta"
  },
  {
    "path": "doc/assets/logo.ai",
    "chars": 620143,
    "preview": "%PDF-1.5\r%\r\n1 0 obj\r<</Metadata 2 0 R/OCProperties<</D<</ON[5 0 R 32 0 R 58 0 R 84 0 R 110 0 R 136 0 R 162 0 R 188 0 R 2"
  },
  {
    "path": "doc/assets/logo_with_name.ai",
    "chars": 237729,
    "preview": "%PDF-1.5\r%\r\n1 0 obj\r<</Metadata 2 0 R/OCProperties<</D<</ON[7 0 R 35 0 R]/Order 36 0 R/RBGroups[]>>/OCGs[7 0 R 35 0 R]>>"
  },
  {
    "path": "src/angular/.angular-cli.json",
    "chars": 1530,
    "preview": "{\n  \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n  \"project\": {\n    \"name\": \"seedsync\"\n  },\n  \"apps\""
  },
  {
    "path": "src/angular/.editorconfig",
    "chars": 245,
    "preview": "# Editor configuration, see http://editorconfig.org\nroot = true\n\n[*]\ncharset = utf-8\nindent_style = space\nindent_size = "
  },
  {
    "path": "src/angular/.gitignore",
    "chars": 531,
    "preview": "# See http://help.github.com/ignore-files/ for more about ignoring files.\n\n# compiled output\n/dist\n/tmp\n/out-tsc\n\n# depe"
  },
  {
    "path": "src/angular/e2e/app.e2e-spec.ts",
    "chars": 290,
    "preview": "import { AppPage } from './app.po';\n\ndescribe('seedsync App', () => {\n  let page: AppPage;\n\n  beforeEach(() => {\n    pag"
  },
  {
    "path": "src/angular/e2e/app.po.ts",
    "chars": 208,
    "preview": "import { browser, by, element } from 'protractor';\n\nexport class AppPage {\n  navigateTo() {\n    return browser.get('/');"
  },
  {
    "path": "src/angular/e2e/tsconfig.e2e.json",
    "chars": 235,
    "preview": "{\n  \"extends\": \"../tsconfig.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"../out-tsc/e2e\",\n    \"baseUrl\": \"./\",\n    \"modu"
  },
  {
    "path": "src/angular/karma.conf.js",
    "chars": 1593,
    "preview": "// Karma configuration file, see link for more information\n// https://karma-runner.github.io/1.0/config/configuration-fi"
  },
  {
    "path": "src/angular/package.json",
    "chars": 1703,
    "preview": "{\n  \"name\": \"seedsync\",\n  \"version\": \"0.8.6\",\n  \"license\": \"Apache 2.0\",\n  \"scripts\": {\n    \"ng\": \"ng\",\n    \"start\": \"ng"
  },
  {
    "path": "src/angular/protractor.conf.js",
    "chars": 722,
    "preview": "// Protractor configuration file, see link for more information\n// https://github.com/angular/protractor/blob/master/lib"
  },
  {
    "path": "src/angular/src/app/app.module.ts",
    "chars": 5187,
    "preview": "import {BrowserModule} from \"@angular/platform-browser\";\nimport {APP_INITIALIZER, NgModule} from \"@angular/core\";\nimport"
  },
  {
    "path": "src/angular/src/app/common/_common.scss",
    "chars": 1140,
    "preview": "$primary-color: #337BB7;\n$primary-dark-color: #2e6da4;\n$primary-light-color: #D7E7F4;\n$primary-lighter-color: #F6F6F6;\n\n"
  },
  {
    "path": "src/angular/src/app/common/cached-reuse-strategy.ts",
    "chars": 1208,
    "preview": "import {ActivatedRouteSnapshot, DetachedRouteHandle, RouteReuseStrategy} from \"@angular/router\";\n\n/**\n * CachedReuseStra"
  },
  {
    "path": "src/angular/src/app/common/capitalize.pipe.ts",
    "chars": 295,
    "preview": "import { Pipe, PipeTransform } from \"@angular/core\";\n\n@Pipe({name: \"capitalize\"})\nexport class CapitalizePipe implements"
  },
  {
    "path": "src/angular/src/app/common/click-stop-propagation.directive.ts",
    "chars": 278,
    "preview": "import {Directive, HostListener} from \"@angular/core\";\n\n@Directive({\n    selector: \"[appClickStopPropagation]\"\n})\nexport"
  },
  {
    "path": "src/angular/src/app/common/eta.pipe.ts",
    "chars": 766,
    "preview": "import { Pipe, PipeTransform } from \"@angular/core\";\n\n/*\n * Convert seconds to an eta in the form \"Xh Ym Zs\"\n*/\n@Pipe({n"
  },
  {
    "path": "src/angular/src/app/common/file-size.pipe.ts",
    "chars": 867,
    "preview": "import { Pipe, PipeTransform } from \"@angular/core\";\n\n/*\n * Convert bytes into largest possible unit.\n * Takes an precis"
  },
  {
    "path": "src/angular/src/app/common/localization.ts",
    "chars": 1841,
    "preview": "export class Localization {\n    static Error = class {\n        public static readonly SERVER_DISCONNECTED = \"Lost connec"
  },
  {
    "path": "src/angular/src/app/common/storage-keys.ts",
    "chars": 255,
    "preview": "export class StorageKeys {\n    public static readonly VIEW_OPTION_SHOW_DETAILS = \"view-option-show-details\";\n    public "
  },
  {
    "path": "src/angular/src/app/pages/about/about-page.component.html",
    "chars": 670,
    "preview": "<div id=\"about\">\n    <div id=\"wrapper\">\n        <div id=\"banner\">\n            <img src=\"assets/logo.png\" alt=\"SeedSync\" "
  },
  {
    "path": "src/angular/src/app/pages/about/about-page.component.scss",
    "chars": 717,
    "preview": "@import '../../common/common';\n\n#about {\n    display: flex;\n    justify-content: center;\n\n    #wrapper {\n        margin-"
  },
  {
    "path": "src/angular/src/app/pages/about/about-page.component.ts",
    "chars": 454,
    "preview": "import {Component} from \"@angular/core\";\n\ndeclare function require(moduleName: string): any;\nconst { version: appVersion"
  },
  {
    "path": "src/angular/src/app/pages/autoqueue/autoqueue-page.component.html",
    "chars": 1944,
    "preview": "<div id=\"autoqueue\">\n    <span id=\"description\" *ngIf=\"connected\">\n\n        <ng-container *ngIf=\"enabled && patternsOnly"
  },
  {
    "path": "src/angular/src/app/pages/autoqueue/autoqueue-page.component.scss",
    "chars": 1885,
    "preview": "@import '../../common/common';\n\n#autoqueue {\n    padding: 15px;\n\n    #description {\n        font-size: 100%;\n    }\n\n    "
  },
  {
    "path": "src/angular/src/app/pages/autoqueue/autoqueue-page.component.ts",
    "chars": 4014,
    "preview": "import {ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit} from \"@angular/core\";\nimport {Observable} from \"r"
  },
  {
    "path": "src/angular/src/app/pages/files/file-list.component.html",
    "chars": 706,
    "preview": "<div id=\"file-list\">\n    <div id=\"header\">\n        <div class=\"name\">Filename</div>\n        <div class=\"status\">Status</"
  },
  {
    "path": "src/angular/src/app/pages/files/file-list.component.scss",
    "chars": 1138,
    "preview": "@import '../../common/common';\n\n#file-list #header {\n    display: none;\n}\n\n/* striped rows */\n#file-list > div:nth-child"
  },
  {
    "path": "src/angular/src/app/pages/files/file-list.component.ts",
    "chars": 2382,
    "preview": "import {Component, ChangeDetectionStrategy} from \"@angular/core\";\nimport {Observable} from \"rxjs/Observable\";\n\nimport {L"
  },
  {
    "path": "src/angular/src/app/pages/files/file-options.component.html",
    "chars": 9731,
    "preview": "<div id=\"file-options\"\n     [style.top.px]=\"headerHeight | async\"\n     [class.sticky]=\"(options | async)?.pinFilter\">\n  "
  },
  {
    "path": "src/angular/src/app/pages/files/file-options.component.scss",
    "chars": 6843,
    "preview": "@import '../../common/common';\n\n// Common dropdown template\n%dropdown {\n    button {\n        background-color: $primary-"
  },
  {
    "path": "src/angular/src/app/pages/files/file-options.component.ts",
    "chars": 3728,
    "preview": "import {ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit} from \"@angular/core\";\nimport {Observable} from \"r"
  },
  {
    "path": "src/angular/src/app/pages/files/file.component.html",
    "chars": 6789,
    "preview": "<div class=\"file\" [class.selected]=\"file.isSelected\" #fileElement>\n    <div class=\"content\">\n        <div class=\"status\""
  },
  {
    "path": "src/angular/src/app/pages/files/file.component.scss",
    "chars": 4799,
    "preview": "@import '../../common/common';\n\n.file {\n    padding: 10px;\n}\n\n/* selected file */\n.file.selected {\n    background-color:"
  },
  {
    "path": "src/angular/src/app/pages/files/file.component.ts",
    "chars": 5028,
    "preview": "import {\n    Component, Input, Output, ChangeDetectionStrategy,\n    EventEmitter, OnChanges, SimpleChanges, ViewChild\n} "
  },
  {
    "path": "src/angular/src/app/pages/files/files-page.component.html",
    "chars": 70,
    "preview": "<app-file-options></app-file-options>\n<app-file-list></app-file-list>\n"
  },
  {
    "path": "src/angular/src/app/pages/files/files-page.component.ts",
    "chars": 174,
    "preview": "import {Component} from \"@angular/core\";\n\n@Component({\n    selector: \"app-files-page\",\n    templateUrl: \"./files-page.co"
  },
  {
    "path": "src/angular/src/app/pages/logs/logs-page.component.html",
    "chars": 1574,
    "preview": "<div id=\"logs\">\n    <!--suppress HtmlUnknownAttribute -->\n    <ng-template #templateRecord let-record=\"record\">\n        "
  },
  {
    "path": "src/angular/src/app/pages/logs/logs-page.component.scss",
    "chars": 1844,
    "preview": "@import '../../common/common';\n\n#logs {\n    padding: 5px 15px;\n    font-family: monospace;\n    font-size: 70%;\n\n    disp"
  },
  {
    "path": "src/angular/src/app/pages/logs/logs-page.component.ts",
    "chars": 3744,
    "preview": "import {\n    AfterContentChecked,\n    ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, HostListener,\n "
  },
  {
    "path": "src/angular/src/app/pages/main/app.component.html",
    "chars": 1499,
    "preview": "<div id=\"top-sidebar\"\n     [class.top-sidebar-open]=\"showSidebar\"\n     [class.top-sidebar-closed]=\"!showSidebar\">\n\n    <"
  },
  {
    "path": "src/angular/src/app/pages/main/app.component.scss",
    "chars": 2982,
    "preview": "@import '../../common/common';\n\n\n#top-content {\n    margin-left: $sidebar-width;\n    transition: margin-left .4s;\n}\n\n#to"
  },
  {
    "path": "src/angular/src/app/pages/main/app.component.ts",
    "chars": 1554,
    "preview": "import {AfterViewInit, Component, ElementRef, OnInit, ViewChild} from \"@angular/core\";\nimport {NavigationEnd, Router} fr"
  },
  {
    "path": "src/angular/src/app/pages/main/header.component.html",
    "chars": 687,
    "preview": "<div id=\"header\">\n    <div *ngFor=\"let notif of notifications | async\"\n         class=\"alert\"\n         [class.alert-dang"
  },
  {
    "path": "src/angular/src/app/pages/main/header.component.scss",
    "chars": 546,
    "preview": "@import '../../common/common';\n\n#header {\n    .alert {\n        padding: 5px;\n        margin-bottom: 0;\n        border-ra"
  },
  {
    "path": "src/angular/src/app/pages/main/header.component.ts",
    "chars": 6290,
    "preview": "import {Component, OnInit} from \"@angular/core\";\nimport {Observable} from \"rxjs/Observable\";\n\nimport * as Immutable from"
  },
  {
    "path": "src/angular/src/app/pages/main/sidebar.component.html",
    "chars": 513,
    "preview": "<div id=\"sidebar\">\n    <a *ngFor=\"let routeInfo of routeInfos\"\n       class=\"button\"\n       routerLink=\"{{routeInfo.path"
  },
  {
    "path": "src/angular/src/app/pages/main/sidebar.component.scss",
    "chars": 1068,
    "preview": "@import '../../common/common';\n\n#sidebar {\n    .button {\n        background-color: inherit;\n        color: inherit;\n    "
  },
  {
    "path": "src/angular/src/app/pages/main/sidebar.component.ts",
    "chars": 1579,
    "preview": "import {Component, OnInit} from \"@angular/core\";\n\nimport {ROUTE_INFOS} from \"../../routes\";\nimport {ServerCommandService"
  },
  {
    "path": "src/angular/src/app/pages/settings/option.component.html",
    "chars": 1474,
    "preview": "<div class=\"form-group\"\n     [class.error]=\"value == '<replace me>'\">\n\n    <!-- Unfortunately, binding to type attribute"
  },
  {
    "path": "src/angular/src/app/pages/settings/option.component.scss",
    "chars": 746,
    "preview": "@import '../../common/common';\n\n.form-group {\n    margin-bottom: 0;\n    margin-left: 20px;\n    margin-right: 20px;\n}\n\n.e"
  },
  {
    "path": "src/angular/src/app/pages/settings/option.component.ts",
    "chars": 1293,
    "preview": "import {Component, Input, Output, ChangeDetectionStrategy, EventEmitter, OnInit} from \"@angular/core\";\nimport {Subject} "
  },
  {
    "path": "src/angular/src/app/pages/settings/options-list.ts",
    "chars": 6586,
    "preview": "import {OptionType} from \"./option.component\";\n\nexport interface IOption {\n    type: OptionType;\n    label: string;\n    "
  },
  {
    "path": "src/angular/src/app/pages/settings/settings-page.component.html",
    "chars": 2790,
    "preview": "<!--suppress HtmlUnknownAttribute -->\n<ng-template #optionsList let-header=\"header\" let-options=\"options\" let-id=\"id\">\n "
  },
  {
    "path": "src/angular/src/app/pages/settings/settings-page.component.scss",
    "chars": 2094,
    "preview": "@import '../../common/common';\n\n#settings {\n    width: 100%;\n\n    #accordion {\n        width: 100%;\n        display: fle"
  },
  {
    "path": "src/angular/src/app/pages/settings/settings-page.component.ts",
    "chars": 4796,
    "preview": "import {ChangeDetectionStrategy, Component, OnInit} from \"@angular/core\";\nimport {Observable} from \"rxjs/Observable\";\n\ni"
  },
  {
    "path": "src/angular/src/app/routes.ts",
    "chars": 1869,
    "preview": "import {Routes} from \"@angular/router\";\n\nimport * as Immutable from \"immutable\";\n\nimport {FilesPageComponent} from \"./pa"
  },
  {
    "path": "src/angular/src/app/services/autoqueue/autoqueue-pattern.ts",
    "chars": 568,
    "preview": "import {Record} from \"immutable\";\n\ninterface IAutoQueuePattern {\n    pattern: string;\n}\nconst DefaultAutoQueuePattern: I"
  },
  {
    "path": "src/angular/src/app/services/autoqueue/autoqueue.service.ts",
    "chars": 6257,
    "preview": "import {Injectable} from \"@angular/core\";\nimport {Observable} from \"rxjs/Observable\";\nimport {BehaviorSubject} from \"rxj"
  },
  {
    "path": "src/angular/src/app/services/base/base-stream.service.ts",
    "chars": 1383,
    "preview": "import {Injectable} from \"@angular/core\";\n\nimport {IStreamService} from \"./stream-service.registry\";\n\n\n/**\n * BaseStream"
  },
  {
    "path": "src/angular/src/app/services/base/base-web.service.ts",
    "chars": 1180,
    "preview": "import {Injectable} from \"@angular/core\";\n\nimport {StreamServiceRegistry} from \"./stream-service.registry\";\nimport {Conn"
  },
  {
    "path": "src/angular/src/app/services/base/stream-service.registry.ts",
    "chars": 6365,
    "preview": "import {Injectable, NgZone} from \"@angular/core\";\nimport {Observable} from \"rxjs/Observable\";\nimport EventSource = requi"
  },
  {
    "path": "src/angular/src/app/services/files/mock-model-files.ts",
    "chars": 7092,
    "preview": "import * as Immutable from \"immutable\";\n\nimport {ModelFile} from \"./model-file\";\n\nexport const MOCK_MODEL_FILES: Immutab"
  },
  {
    "path": "src/angular/src/app/services/files/model-file.service.ts",
    "chars": 7703,
    "preview": "import {Injectable} from \"@angular/core\";\nimport {Observable} from \"rxjs/Observable\";\nimport {BehaviorSubject} from \"rxj"
  },
  {
    "path": "src/angular/src/app/services/files/model-file.ts",
    "chars": 3304,
    "preview": "import {Record, Set} from \"immutable\";\n\n/**\n * Model file received from the backend\n * Note: Naming convention matches t"
  },
  {
    "path": "src/angular/src/app/services/files/screenshot-model-files.ts",
    "chars": 3924,
    "preview": "import * as Immutable from \"immutable\";\n\nimport {ModelFile} from \"./model-file\";\n\nexport const SCREENSHOT_MODEL_FILES: I"
  },
  {
    "path": "src/angular/src/app/services/files/view-file-filter.service.ts",
    "chars": 3953,
    "preview": "import {Injectable} from \"@angular/core\";\n\nimport {LoggerService} from \"../utils/logger.service\";\nimport {ViewFile} from"
  },
  {
    "path": "src/angular/src/app/services/files/view-file-options.service.ts",
    "chars": 3841,
    "preview": "import {Inject, Injectable} from \"@angular/core\";\nimport {Observable} from \"rxjs/Observable\";\nimport {BehaviorSubject} f"
  },
  {
    "path": "src/angular/src/app/services/files/view-file-options.ts",
    "chars": 1312,
    "preview": "import {Record} from \"immutable\";\n\nimport {ViewFile} from \"./view-file\";\n\n/**\n * View file options\n * Describes display "
  },
  {
    "path": "src/angular/src/app/services/files/view-file-sort.service.ts",
    "chars": 3499,
    "preview": "import {Injectable} from \"@angular/core\";\n\nimport {LoggerService} from \"../utils/logger.service\";\nimport {ViewFile} from"
  },
  {
    "path": "src/angular/src/app/services/files/view-file.service.ts",
    "chars": 18018,
    "preview": "import {Injectable} from \"@angular/core\";\nimport {Observable} from \"rxjs/Observable\";\nimport {BehaviorSubject} from \"rxj"
  },
  {
    "path": "src/angular/src/app/services/files/view-file.ts",
    "chars": 2614,
    "preview": "import {Record} from \"immutable\";\n\n/**\n * View file\n * Represents the View Model\n */\ninterface IViewFile {\n    name: str"
  },
  {
    "path": "src/angular/src/app/services/logs/log-record.ts",
    "chars": 1534,
    "preview": "import {Record} from \"immutable\";\n\n\n/**\n * LogRecord immutable\n */\ninterface ILogRecord {\n    time: Date;\n    level: Log"
  },
  {
    "path": "src/angular/src/app/services/logs/log.service.ts",
    "chars": 918,
    "preview": "import {Injectable} from \"@angular/core\";\nimport {Observable} from \"rxjs/Observable\";\nimport {ReplaySubject} from \"rxjs/"
  },
  {
    "path": "src/angular/src/app/services/server/server-command.service.ts",
    "chars": 1560,
    "preview": "import {Injectable} from \"@angular/core\";\nimport {Observable} from \"rxjs/Observable\";\n\nimport {BaseWebService} from \"../"
  },
  {
    "path": "src/angular/src/app/services/server/server-status.service.ts",
    "chars": 1541,
    "preview": "import {Injectable} from \"@angular/core\";\nimport {Observable} from \"rxjs/Observable\";\nimport {BehaviorSubject} from \"rxj"
  },
  {
    "path": "src/angular/src/app/services/server/server-status.ts",
    "chars": 2594,
    "preview": "import {Record} from \"immutable\";\n\n/**\n * ServerStatus immutable\n */\ninterface IServerStatus {\n    server: {\n        up:"
  },
  {
    "path": "src/angular/src/app/services/settings/config.service.ts",
    "chars": 4184,
    "preview": "import {Injectable} from \"@angular/core\";\nimport {Observable} from \"rxjs/Observable\";\nimport {BehaviorSubject} from \"rxj"
  },
  {
    "path": "src/angular/src/app/services/settings/config.ts",
    "chars": 3086,
    "preview": "import {Record} from \"immutable\";\n\n/**\n * Backend config\n * Note: Naming convention matches that used in the JSON\n */\n\n/"
  },
  {
    "path": "src/angular/src/app/services/utils/connected.service.ts",
    "chars": 1131,
    "preview": "import {Injectable} from \"@angular/core\";\nimport {Observable} from \"rxjs/Observable\";\nimport {BehaviorSubject} from \"rxj"
  },
  {
    "path": "src/angular/src/app/services/utils/dom.service.ts",
    "chars": 602,
    "preview": "import {Injectable} from \"@angular/core\";\nimport {Observable} from \"rxjs/Observable\";\nimport {BehaviorSubject} from \"rxj"
  },
  {
    "path": "src/angular/src/app/services/utils/logger.service.ts",
    "chars": 1095,
    "preview": "import {Injectable} from \"@angular/core\";\n\n@Injectable()\nexport class LoggerService {\n\n    public level: LoggerService.L"
  },
  {
    "path": "src/angular/src/app/services/utils/notification.service.ts",
    "chars": 2135,
    "preview": "import {Injectable} from \"@angular/core\";\nimport {Observable} from \"rxjs/Observable\";\nimport {BehaviorSubject} from \"rxj"
  },
  {
    "path": "src/angular/src/app/services/utils/notification.ts",
    "chars": 849,
    "preview": "import {Record} from \"immutable\";\n\ninterface INotification {\n    level: Notification.Level;\n    text: string;\n    timest"
  },
  {
    "path": "src/angular/src/app/services/utils/rest.service.ts",
    "chars": 2121,
    "preview": "import {Injectable} from \"@angular/core\";\nimport {HttpClient, HttpErrorResponse} from \"@angular/common/http\";\nimport {Ob"
  },
  {
    "path": "src/angular/src/app/services/utils/version-check.service.ts",
    "chars": 2620,
    "preview": "import {Injectable} from \"@angular/core\";\n\nimport * as compareVersions from \"compare-versions\";\n\nimport {RestService} fr"
  },
  {
    "path": "src/angular/src/app/tests/mocks/mock-event-source.ts",
    "chars": 677,
    "preview": "declare let spyOn: any;\n\nexport class MockEventSource {\n    url: string;\n    onopen: (event: Event) => any;\n    onerror:"
  },
  {
    "path": "src/angular/src/app/tests/mocks/mock-model-file.service.ts",
    "chars": 400,
    "preview": "import {Subject} from \"rxjs/Subject\";\nimport {Observable} from \"rxjs/Observable\";\n\nimport * as Immutable from \"immutable"
  },
  {
    "path": "src/angular/src/app/tests/mocks/mock-rest.service.ts",
    "chars": 232,
    "preview": "import {Observable} from \"rxjs/Observable\";\n\nimport {WebReaction} from \"../../services/utils/rest.service\";\n\nexport clas"
  },
  {
    "path": "src/angular/src/app/tests/mocks/mock-storage.service.ts",
    "chars": 272,
    "preview": "export class MockStorageService {\n    // noinspection JSUnusedLocalSymbols\n    public get(key: string): any {}\n\n    // n"
  },
  {
    "path": "src/angular/src/app/tests/mocks/mock-stream-service.registry.ts",
    "chars": 547,
    "preview": "import {TestBed} from \"@angular/core/testing\";\n\nimport {ConnectedService} from \"../../services/utils/connected.service\";"
  },
  {
    "path": "src/angular/src/app/tests/mocks/mock-view-file-options.service.ts",
    "chars": 350,
    "preview": "import {Subject} from \"rxjs/Subject\";\nimport {Observable} from \"rxjs/Observable\";\n\nimport {ViewFileOptions} from \"../../"
  },
  {
    "path": "src/angular/src/app/tests/mocks/mock-view-file.service.ts",
    "chars": 874,
    "preview": "import {Subject} from \"rxjs/Subject\";\nimport {Observable} from \"rxjs/Observable\";\n\nimport * as Immutable from \"immutable"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/autoqueue/autoqueue.service.spec.ts",
    "chars": 14957,
    "preview": "import {fakeAsync, TestBed, tick} from \"@angular/core/testing\";\nimport {HttpClientTestingModule, HttpTestingController} "
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/base/base-stream.service.spec.ts",
    "chars": 3128,
    "preview": "import {TestBed} from \"@angular/core/testing\";\n\nimport {BaseStreamService} from \"../../../../services/base/base-stream.s"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/base/base-web.service.spec.ts",
    "chars": 1898,
    "preview": "import {TestBed} from \"@angular/core/testing\";\n\nimport {BaseWebService} from \"../../../../services/base/base-web.service"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/base/stream-service.registry.spec.ts",
    "chars": 8129,
    "preview": "import {fakeAsync, TestBed, tick} from \"@angular/core/testing\";\n\nimport {createMockEventSource, MockEventSource} from \"."
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/files/model-file.service.spec.ts",
    "chars": 23603,
    "preview": "import {fakeAsync, TestBed, tick} from \"@angular/core/testing\";\nimport {HttpClientTestingModule, HttpTestingController} "
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/files/model-file.spec.ts",
    "chars": 6991,
    "preview": "import * as Immutable from \"immutable\";\n\nimport {ModelFile} from \"../../../../services/files/model-file\";\n\ndescribe(\"Tes"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/files/view-file-filter.service.spec.ts",
    "chars": 11979,
    "preview": "import {fakeAsync, TestBed, tick} from \"@angular/core/testing\";\n\nimport {ViewFileFilterService} from \"../../../../servic"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/files/view-file-options.service.spec.ts",
    "chars": 10712,
    "preview": "import {fakeAsync, TestBed, tick} from \"@angular/core/testing\";\n\nimport {ViewFileOptionsService} from \"../../../../servi"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/files/view-file-sort.service.spec.ts",
    "chars": 9010,
    "preview": "import {fakeAsync, TestBed, tick} from \"@angular/core/testing\";\n\nimport {LoggerService} from \"../../../../services/utils"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/files/view-file.service.spec.ts",
    "chars": 37525,
    "preview": "import {fakeAsync, TestBed, tick} from \"@angular/core/testing\";\n\nimport * as Immutable from \"immutable\";\n\nimport {ViewFi"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/logs/log-record.spec.ts",
    "chars": 2253,
    "preview": "import * as Immutable from \"immutable\";\n\nimport {LogRecord} from \"../../../../services/logs/log-record\";\n\n\ndescribe(\"Tes"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/logs/log.service.spec.ts",
    "chars": 3525,
    "preview": "import {fakeAsync, TestBed, tick} from \"@angular/core/testing\";\n\nimport * as Immutable from \"immutable\";\n\nimport {Logger"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/server/server-command.service.spec.ts",
    "chars": 2060,
    "preview": "import {TestBed} from \"@angular/core/testing\";\nimport {HttpClientTestingModule, HttpTestingController} from \"@angular/co"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/server/server-status.service.spec.ts",
    "chars": 3368,
    "preview": "import {fakeAsync, TestBed, tick} from \"@angular/core/testing\";\n\nimport {ServerStatusService} from \"../../../../services"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/server/server-status.spec.ts",
    "chars": 2241,
    "preview": "import * as Immutable from \"immutable\";\n\nimport {ServerStatus, ServerStatusJson} from \"../../../../services/server/serve"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/settings/config.service.spec.ts",
    "chars": 12482,
    "preview": "import {fakeAsync, TestBed, tick} from \"@angular/core/testing\";\nimport {HttpClientTestingModule, HttpTestingController} "
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/settings/config.spec.ts",
    "chars": 3708,
    "preview": "import * as Immutable from \"immutable\";\n\nimport {Config} from \"../../../../services/settings/config\";\n\ndescribe(\"Testing"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/utils/connected.service.spec.ts",
    "chars": 2500,
    "preview": "import {fakeAsync, TestBed, tick} from \"@angular/core/testing\";\n\nimport {ConnectedService} from \"../../../../services/ut"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/utils/dom.service.spec.ts",
    "chars": 1302,
    "preview": "import {fakeAsync, TestBed, tick} from \"@angular/core/testing\";\n\nimport {DomService} from \"../../../../services/utils/do"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/utils/notification.service.spec.ts",
    "chars": 7054,
    "preview": "import {fakeAsync, TestBed, tick} from \"@angular/core/testing\";\n\nimport * as Immutable from \"immutable\";\n\nimport {Notifi"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/utils/rest.service.spec.ts",
    "chars": 3011,
    "preview": "import {fakeAsync, TestBed} from \"@angular/core/testing\";\nimport {HttpClientTestingModule, HttpTestingController} from \""
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/utils/version-check.service.spec.ts",
    "chars": 3999,
    "preview": "import {fakeAsync, TestBed, tick} from \"@angular/core/testing\";\n\nimport * as compareVersions from \"compare-versions\";\n\ni"
  },
  {
    "path": "src/angular/src/assets/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "src/angular/src/environments/environment.prod.ts",
    "chars": 182,
    "preview": "import {LoggerService} from \"../app/services/utils/logger.service\"\n\nexport const environment = {\n    production: true,\n "
  },
  {
    "path": "src/angular/src/environments/environment.ts",
    "chars": 519,
    "preview": "// The file contents for the current environment will overwrite these during build.\n// The build system defaults to the "
  },
  {
    "path": "src/angular/src/index.html",
    "chars": 311,
    "preview": "<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <title>SeedSync</title>\n    <base href=\"/\">\n\n    "
  },
  {
    "path": "src/angular/src/main.ts",
    "chars": 330,
    "preview": "import {enableProdMode} from '@angular/core';\nimport {platformBrowserDynamic} from '@angular/platform-browser-dynamic';\n"
  },
  {
    "path": "src/angular/src/polyfills.ts",
    "chars": 2478,
    "preview": "/**\n * This file includes polyfills needed by Angular and is loaded before the app.\n * You can add your own extra polyfi"
  },
  {
    "path": "src/angular/src/styles.scss",
    "chars": 660,
    "preview": "@import 'app/common/common';\n\nhtml {\n    -ms-text-size-adjust: 100%;\n    -webkit-text-size-adjust: 100%;\n    -moz-text-s"
  },
  {
    "path": "src/angular/src/test.ts",
    "chars": 1091,
    "preview": "// This file is required by karma.conf.js and loads recursively all the .spec and framework files\n\nimport 'zone.js/dist/"
  },
  {
    "path": "src/angular/src/tsconfig.app.json",
    "chars": 247,
    "preview": "{\n    \"extends\": \"../tsconfig.json\",\n    \"compilerOptions\": {\n        \"outDir\": \"../out-tsc/app\",\n        \"baseUrl\": \"./"
  },
  {
    "path": "src/angular/src/tsconfig.spec.json",
    "chars": 366,
    "preview": "{\n    \"extends\": \"../tsconfig.json\",\n    \"compilerOptions\": {\n        \"outDir\": \"../out-tsc/spec\",\n        \"baseUrl\": \"."
  },
  {
    "path": "src/angular/src/typings.d.ts",
    "chars": 107,
    "preview": "/* SystemJS module definition */\ndeclare var module: NodeModule;\n\ninterface NodeModule {\n    id: string;\n}\n"
  },
  {
    "path": "src/angular/tsconfig.json",
    "chars": 363,
    "preview": "{\n  \"compileOnSave\": false,\n  \"compilerOptions\": {\n    \"outDir\": \"./dist/out-tsc\",\n    \"sourceMap\": true,\n    \"declarati"
  },
  {
    "path": "src/angular/tslint.json",
    "chars": 2842,
    "preview": "{\n  \"rulesDirectory\": [\n    \"node_modules/codelyzer\"\n  ],\n  \"rules\": {\n    \"arrow-return-shorthand\": true,\n    \"callable"
  },
  {
    "path": "src/debian/changelog",
    "chars": 4422,
    "preview": "seedsync (0.8.6) stable; urgency=low\n\n  * Fixed broken rar extraction in previous release\n\n -- Inderpreet Singh <inder@s"
  },
  {
    "path": "src/debian/compat",
    "chars": 2,
    "preview": "10"
  },
  {
    "path": "src/debian/config",
    "chars": 145,
    "preview": "#!/bin/sh -e\n\n# Source debconf library.\n. /usr/share/debconf/confmodule\n\n# Ask for username\ndb_input high seedsync/usern"
  },
  {
    "path": "src/debian/control",
    "chars": 747,
    "preview": "Source: seedsync\nSection: utils\nPriority: extra\nMaintainer: Inderpreet Singh <ipsingh06@gmail.com>\nBuild-Depends: debhel"
  },
  {
    "path": "src/debian/postinst",
    "chars": 559,
    "preview": "#!/bin/sh\n\nOVERRIDE_DIR=/etc/systemd/system/seedsync.service.d\nOVERRIDE_FILE=override.conf\n\n\n#!/bin/sh -e\n\n# Source debc"
  },
  {
    "path": "src/debian/postrm",
    "chars": 104,
    "preview": "#!/bin/sh\nif [ \"$1\" = \"purge\" ]; then\n    rm -rf /etc/systemd/system/seedsync.service.d\nfi\n\n#DEBHELPER#\n"
  },
  {
    "path": "src/debian/rules",
    "chars": 299,
    "preview": "#!/usr/bin/make -f\n\nexport DESTROOT=$(CURDIR)/debian/seedsync\n\n%:\n\tdh $@ --with=systemd\n\noverride_dh_auto_build:\n\tdh_aut"
  },
  {
    "path": "src/debian/seedsync.service",
    "chars": 550,
    "preview": "# Service unit for seedsync\n# Note: User should be overridden in\n#       /etc/systemd/system/seedsync.service.d/override"
  },
  {
    "path": "src/debian/source/format",
    "chars": 12,
    "preview": "3.0 (native)"
  },
  {
    "path": "src/debian/templates",
    "chars": 183,
    "preview": "Template: seedsync/username\nType: string\nDefault: root\nDescription: User for SeedSync service\n The service will run unde"
  },
  {
    "path": "src/docker/build/deb/Dockerfile",
    "chars": 3314,
    "preview": "# Creates environment to build python binaries\nFROM ubuntu:16.04 as seedsync_build_pyinstaller_env\nRUN apt-get update &&"
  },
  {
    "path": "src/docker/build/deb/Dockerfile.dockerignore",
    "chars": 100,
    "preview": "**/*.pyc\n**/__pycache__\n**/node_modules\n**/.venv\n.git\n.idea\nbuild\nsrc/angular/dist\nsrc/python/build\n"
  },
  {
    "path": "src/docker/build/docker-image/Dockerfile",
    "chars": 3035,
    "preview": "ARG STAGING_REGISTRY=localhost:5000\nARG STAGING_VERSION=latest\n\n# Creates environment to run Seedsync python code\n# Inst"
  },
  {
    "path": "src/docker/build/docker-image/Dockerfile.dockerignore",
    "chars": 117,
    "preview": "**/*.pyc\n**/__pycache__\n**/node_modules\n**/.venv\n.git\n.idea\nbuild\nsrc/angular/dist\nsrc/python/tests\nsrc/python/build\n"
  },
  {
    "path": "src/docker/build/docker-image/run_as_user",
    "chars": 442,
    "preview": "#!/bin/sh\n# run a command as (non-existent) user, using libnss-wrapper\n\nU=`id -u`\nG=`id -g`\n\nHOME_DIR=/home/seedsync\nPAS"
  },
  {
    "path": "src/docker/build/docker-image/scp",
    "chars": 66,
    "preview": "#!/bin/sh\nSCP=/usr/bin/scp\n/usr/local/bin/run_as_user \"$SCP\" \"$@\"\n"
  },
  {
    "path": "src/docker/build/docker-image/setup_default_config.sh",
    "chars": 748,
    "preview": "#!/bin/bash\n\n# exit on first error\nset -e\n\nCONFIG_DIR=\"/config\"\nSETTINGS_FILE=\"${CONFIG_DIR}/settings.cfg\"\nSCRIPT_PATH=\""
  },
  {
    "path": "src/docker/build/docker-image/ssh",
    "chars": 66,
    "preview": "#!/bin/sh\nSSH=/usr/bin/ssh\n/usr/local/bin/run_as_user \"$SSH\" \"$@\"\n"
  },
  {
    "path": "src/docker/stage/deb/Dockerfile",
    "chars": 1034,
    "preview": "ARG BASE_IMAGE=ubuntu:16.04\n\nFROM $BASE_IMAGE\n\n# Install dependencies\nRUN apt-get update && apt-get install -y \\\n    sud"
  },
  {
    "path": "src/docker/stage/deb/compose-ubu1604.yml",
    "chars": 184,
    "preview": "version: \"3.4\"\nservices:\n  myapp:\n    image: seedsync/stage/deb/ubu1604\n    container_name: seedsync_stage_deb_ubu1604\n "
  },
  {
    "path": "src/docker/stage/deb/compose-ubu1804.yml",
    "chars": 184,
    "preview": "version: \"3.4\"\nservices:\n  myapp:\n    image: seedsync/stage/deb/ubu1804\n    container_name: seedsync_stage_deb_ubu1804\n "
  },
  {
    "path": "src/docker/stage/deb/compose-ubu2004.yml",
    "chars": 184,
    "preview": "version: \"3.4\"\nservices:\n  myapp:\n    image: seedsync/stage/deb/ubu2004\n    container_name: seedsync_stage_deb_ubu2004\n "
  },
  {
    "path": "src/docker/stage/deb/compose.yml",
    "chars": 525,
    "preview": "version: \"3.4\"\nservices:\n\n  myapp:\n    image: seedsync/stage/deb\n    container_name: seedsync_stage_deb\n    build:\n     "
  },
  {
    "path": "src/docker/stage/deb/entrypoint.sh",
    "chars": 167,
    "preview": "#!/bin/bash\n\n# exit on first error\nset -e\n\necho \"Running entrypoint\"\n\necho \"Installing SeedSync\"\n./expect_seedsync.exp\n\n"
  },
  {
    "path": "src/docker/stage/deb/expect_seedsync.exp",
    "chars": 243,
    "preview": "#!/usr/bin/expect\nset timeout 10\nspawn \"./install_seedsync.sh\"\n\nexpect {\n    timeout {error \"ERROR: missing user prompt\""
  },
  {
    "path": "src/docker/stage/deb/id_rsa",
    "chars": 1674,
    "preview": "-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEA4Pn1J1LJKi9/xE1XaZZuSzdfwPQykqbnevCx1iSq8cWA8rdu\nZcR9sY7dyMc6xQ8YQ08nZnR"
  },
  {
    "path": "src/docker/stage/deb/id_rsa.pub",
    "chars": 398,
    "preview": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDg+fUnUskqL3/ETVdplm5LN1/A9DKSpud68LHWJKrxxYDyt25lxH2xjt3IxzrFDxhDTydmdHK8x/F2a8gO"
  },
  {
    "path": "src/docker/stage/deb/install_seedsync.sh",
    "chars": 42,
    "preview": "#!/bin/bash\ndpkg -i /install/seedsync.deb\n"
  },
  {
    "path": "src/docker/stage/deb/ubuntu-systemd/ubuntu-16.04-systemd/Dockerfile",
    "chars": 726,
    "preview": "# Copied from:\n# https://github.com/solita/docker-systemd/blob/master/Dockerfile\n# https://hub.docker.com/r/solita/ubunt"
  },
  {
    "path": "src/docker/stage/deb/ubuntu-systemd/ubuntu-16.04-systemd/setup",
    "chars": 739,
    "preview": "#!/bin/sh\nset -eu\n\nif nsenter --mount=/host/proc/1/ns/mnt -- mount | grep /sys/fs/cgroup/systemd >/dev/null 2>&1; then\n "
  },
  {
    "path": "src/docker/stage/deb/ubuntu-systemd/ubuntu-18.04-systemd/Dockerfile",
    "chars": 775,
    "preview": "# Copied from:\n# https://github.com/solita/docker-systemd/blob/master/Dockerfile\n# https://hub.docker.com/r/solita/ubunt"
  },
  {
    "path": "src/docker/stage/deb/ubuntu-systemd/ubuntu-18.04-systemd/setup",
    "chars": 739,
    "preview": "#!/bin/sh\nset -eu\n\nif nsenter --mount=/host/proc/1/ns/mnt -- mount | grep /sys/fs/cgroup/systemd >/dev/null 2>&1; then\n "
  },
  {
    "path": "src/docker/stage/deb/ubuntu-systemd/ubuntu-20.04-systemd/Dockerfile",
    "chars": 785,
    "preview": "# Copied from:\n# https://github.com/solita/docker-systemd/blob/master/Dockerfile\n# https://hub.docker.com/r/solita/ubunt"
  },
  {
    "path": "src/docker/stage/deb/ubuntu-systemd/ubuntu-20.04-systemd/setup",
    "chars": 739,
    "preview": "#!/bin/sh\nset -eu\n\nif nsenter --mount=/host/proc/1/ns/mnt -- mount | grep /sys/fs/cgroup/systemd >/dev/null 2>&1; then\n "
  },
  {
    "path": "src/docker/stage/docker-image/compose.yml",
    "chars": 137,
    "preview": "version: \"3.4\"\nservices:\n  myapp:\n    image: ${STAGING_REGISTRY}/seedsync:${STAGING_VERSION}\n    container_name: seedsyn"
  },
  {
    "path": "src/docker/test/angular/Dockerfile",
    "chars": 590,
    "preview": "FROM seedsync/build/angular/env as seedsync_test_angular\n\nRUN apt-get update\nRUN wget -nv -O /tmp/chrome.deb https://dl."
  },
  {
    "path": "src/docker/test/angular/compose.yml",
    "chars": 369,
    "preview": "version: \"3.4\"\nservices:\n  tests:\n    image: seedsync/test/angular\n    container_name: seedsync_test_angular\n    tty: tr"
  },
  {
    "path": "src/docker/test/e2e/Dockerfile",
    "chars": 550,
    "preview": "# Creates environment for e2e tests\nFROM node:12.16 as seedsync_test_e2e_env\n\nCOPY src/e2e/package*.json /app/\nWORKDIR /"
  },
  {
    "path": "src/docker/test/e2e/chrome/Dockerfile",
    "chars": 141,
    "preview": "FROM yukinying/chrome-headless-browser-selenium:latest\n\nUSER root\nRUN apt-get update && apt-get install -y libxi6 libgco"
  },
  {
    "path": "src/docker/test/e2e/compose-dev.yml",
    "chars": 272,
    "preview": "version: \"3.4\"\nservices:\n  tests:\n    command: /bin/true\n\n  myapp:\n    ports:\n      - target: 8800\n        published: 88"
  },
  {
    "path": "src/docker/test/e2e/compose.yml",
    "chars": 920,
    "preview": "version: \"3.4\"\nservices:\n  tests:\n    image: seedsync/test/e2e\n    container_name: seedsync_test_e2e\n    build:\n      co"
  },
  {
    "path": "src/docker/test/e2e/configure/Dockerfile",
    "chars": 177,
    "preview": "FROM alpine:3.11.6\n\nRUN apk add --no-cache curl bash\n\nWORKDIR /\nADD src/docker/wait-for-it.sh /\nADD src/docker/test/e2e/"
  },
  {
    "path": "src/docker/test/e2e/configure/setup_seedsync.sh",
    "chars": 1013,
    "preview": "#!/bin/bash\n\n./wait-for-it.sh myapp:8800 -- echo \"Seedsync app is up (before configuring)\"\ncurl -sS \"http://myapp:8800/s"
  },
  {
    "path": "src/docker/test/e2e/parse_seedsync_status.py",
    "chars": 103,
    "preview": "import sys\nimport json\ntry:\n    print(json.load(sys.stdin)['server']['up'])\nexcept:\n    print('False')\n"
  },
  {
    "path": "src/docker/test/e2e/remote/Dockerfile",
    "chars": 1014,
    "preview": "FROM ubuntu:18.04\n\n# Install dependencies\nRUN apt-get update && apt-get install -y \\\n    python3.7\n\n# Switch to Python 3"
  },
  {
    "path": "src/docker/test/e2e/remote/id_rsa.pub",
    "chars": 398,
    "preview": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDg+fUnUskqL3/ETVdplm5LN1/A9DKSpud68LHWJKrxxYDyt25lxH2xjt3IxzrFDxhDTydmdHK8x/F2a8gO"
  },
  {
    "path": "src/docker/test/e2e/run_tests.sh",
    "chars": 614,
    "preview": "#!/bin/bash\n\nred=`tput setaf 1`\ngreen=`tput setaf 2`\nreset=`tput sgr0`\n\nEND=$((SECONDS+10))\nwhile [ ${SECONDS} -lt ${END"
  },
  {
    "path": "src/docker/test/e2e/urls.ts",
    "chars": 146,
    "preview": "export class Urls {\n    static readonly APP_BASE_URL = \"http://myapp:8800/\";\n    static readonly SELENIUM_ADDRESS = \"htt"
  },
  {
    "path": "src/docker/test/python/Dockerfile",
    "chars": 1237,
    "preview": "FROM seedsync/run/python/devenv as seedsync_test_python\n\nRUN ls -l /app/python\n\n# Install dependencies\nRUN apt-get insta"
  },
  {
    "path": "src/docker/test/python/compose.yml",
    "chars": 342,
    "preview": "version: \"3.4\"\nservices:\n  tests:\n    image: seedsync/test/python\n    container_name: seedsync_test_python\n    build:\n  "
  },
  {
    "path": "src/docker/test/python/entrypoint.sh",
    "chars": 131,
    "preview": "#!/bin/bash\n\n# exit on first error\nset -e\n\necho \"Running sshd\"\n/usr/sbin/sshd -D &\n\necho \"Continuing entrypoint\"\necho \"$"
  },
  {
    "path": "src/docker/wait-for-it.sh",
    "chars": 5224,
    "preview": "#!/usr/bin/env bash\n# Use this script to test if a given TCP host/port are available\n\nWAITFORIT_cmdname=${0##*/}\n\nechoer"
  },
  {
    "path": "src/e2e/.gitignore",
    "chars": 23,
    "preview": "*.js\nnode_modules\ntmp/\n"
  },
  {
    "path": "src/e2e/README.md",
    "chars": 1283,
    "preview": "### To run e2e tests in dev mode:\n\n1. Install dependencies\n\n   ```bash\n   cd src/e2e\n   npm install\n   ```\n   \n2. Choose"
  },
  {
    "path": "src/e2e/conf.ts",
    "chars": 1520,
    "preview": "// Because this file imports from  protractor, you'll need to have it as a\n// project dependency. Please see the referen"
  },
  {
    "path": "src/e2e/package.json",
    "chars": 425,
    "preview": "{\n  \"name\": \"e2e\",\n  \"version\": \"1.0.0\",\n  \"description\": \"end to end tests\",\n  \"author\": \"\",\n  \"dependencies\": {\n    \"@"
  },
  {
    "path": "src/e2e/tests/about.page.spec.ts",
    "chars": 417,
    "preview": "import {AboutPage} from \"./about.page\";\n\ndescribe('Testing about page', () => {\n    let page: AboutPage;\n\n    beforeEach"
  },
  {
    "path": "src/e2e/tests/about.page.ts",
    "chars": 403,
    "preview": "import {browser, by, element} from 'protractor';\nimport {promise} from \"selenium-webdriver\";\nimport Promise = promise.Pr"
  },
  {
    "path": "src/e2e/tests/app.spec.ts",
    "chars": 705,
    "preview": "import {App} from \"./app\";\n\ndescribe('Testing top-level app', () => {\n    let app: App;\n\n    beforeEach(() => {\n        "
  },
  {
    "path": "src/e2e/tests/app.ts",
    "chars": 698,
    "preview": "import {browser, by, element} from 'protractor';\nimport {promise} from \"selenium-webdriver\";\nimport Promise = promise.Pr"
  },
  {
    "path": "src/e2e/tests/autoqueue.page.spec.ts",
    "chars": 2088,
    "preview": "import {AutoQueuePage} from \"./autoqueue.page\";\n\ndescribe('Testing autoqueue page', () => {\n    let page: AutoQueuePage;"
  },
  {
    "path": "src/e2e/tests/autoqueue.page.ts",
    "chars": 935,
    "preview": "import {browser, by, element} from 'protractor';\nimport {promise} from \"selenium-webdriver\";\nimport Promise = promise.Pr"
  },
  {
    "path": "src/e2e/tests/dashboard.page.spec.ts",
    "chars": 3163,
    "preview": "import {DashboardPage, File, FileActionButtonState} from \"./dashboard.page\";\n\ndescribe('Testing dashboard page', () => {"
  },
  {
    "path": "src/e2e/tests/dashboard.page.ts",
    "chars": 2737,
    "preview": "import {browser, by, element, ExpectedConditions} from 'protractor';\nimport {promise} from \"selenium-webdriver\";\nimport "
  },
  {
    "path": "src/e2e/tests/settings.page.spec.ts",
    "chars": 325,
    "preview": "import {SettingsPage} from \"./settings.page\";\n\ndescribe('Testing settings page', () => {\n    let page: SettingsPage;\n\n  "
  }
]

// ... and 137 more files (download for full content)

About this extraction

This page contains the full source code of the ipsingh06/seedsync GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 337 files (2.1 MB), approximately 569.4k tokens, and a symbol index with 1608 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!