diff --git a/.gitignore b/.gitignore index 7a56971..e8383c6 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ dist/ __pycache__/ .flatpak-builder/ flatpak-build-dir/ +*.jpg diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml deleted file mode 100644 index 12386d8..0000000 --- a/.gitlab-ci.yml +++ /dev/null @@ -1,69 +0,0 @@ ---- -include: - - local: .gitlab-ci/versioning/gitversion.yml - - local: .gitlab-ci/git/create_tag.yml - -stages: - - build - - release - -gitversion: - extends: .versioning:gitversion - stage: .pre - tags: - - gitlab-org-docker - rules: - - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Run this job when commits are pushed or merged to the default branch - -build: - stage: build - image: python:3.9.21 - tags: - - gitlab-org-docker - rules: - - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Run this job when commits are pushed or merged to the default branch - needs: - - job: gitversion - artifacts: true - script: - - sed -i "s/0.0.1/${GitVersion_MajorMinorPatch}/" src/OptimaLab35/__init__.py - - cat src/OptimaLab35/__init__.py - - python3 -m pip install build - - python3 -m build - artifacts: - paths: - - dist/* - expire_in: 1 day - -publish: - stage: release - image: python:3.9.21 - tags: - - gitlab-org-docker - rules: - - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Run this job when commits are pushed or merged to the default branch - variables: - TWINE_USERNAME: "__token__" - TWINE_PASSWORD: $TWINE_API - needs: - - job: build - artifacts: true - script: - - python3 -m pip install twine - - python3 -m twine upload dist/* - -create_tag: - extends: .git:create_tag - stage: release - tags: - - gitlab-org-docker - variables: - VERSION: $GitVersion_SemVer - TOKEN: $GITLAB_TOKEN - needs: - - job: gitversion - artifacts: true - rules: - - if: $CI_COMMIT_TAG - when: never # Do not run this job when a tag is created manually - - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Run this job when commits are pushed or merged to the default branch diff --git a/.gitlab-ci/git/create_tag.yml b/.gitlab-ci/git/create_tag.yml deleted file mode 100644 index 2c1afd7..0000000 --- a/.gitlab-ci/git/create_tag.yml +++ /dev/null @@ -1,15 +0,0 @@ ---- - -.git:create_tag: - image: alpine:3.21 - variables: - GIT_STRATEGY: clone - GIT_DEPTH: 0 - GIT_LFS_SKIP_SMUDGE: 1 - VERSION: '' - TOKEN: '' # Token with push privileges - script: - - apk add git - - git remote set-url origin https://oauth2:$TOKEN@$CI_SERVER_HOST/$CI_PROJECT_PATH - - git tag $VERSION - - git push origin tag $VERSION diff --git a/.gitlab-ci/versioning/gitversion.yml b/.gitlab-ci/versioning/gitversion.yml deleted file mode 100644 index dbbc149..0000000 --- a/.gitlab-ci/versioning/gitversion.yml +++ /dev/null @@ -1,31 +0,0 @@ ---- -.versioning:gitversion: - image: - name: mcr.microsoft.com/dotnet/sdk:9.0 - variables: - GIT_STRATEGY: clone - GIT_DEPTH: 0 # force a deep/non-shallow fetch need by gitversion - GIT_LFS_SKIP_SMUDGE: 1 - cache: [] # caches and before / after scripts can mess things up - script: - - | - dotnet tool install --global GitVersion.Tool --version 5.* - export PATH="$PATH:/root/.dotnet/tools" - - dotnet-gitversion -output buildserver - - # We could just collect the output file gitversion.properties (with artifacts:report:dotenv: gitversion.properties as it is already in DOTENV format, - # however it contains ~33 variables which unnecessarily consumes many of the 50 max DOTENV variables of the free GitLab version. - # Limits are higher for licensed editions, see https://docs.gitlab.com/ee/ci/yaml/artifacts_reports.html#artifactsreportsdotenv - grep 'GitVersion_LegacySemVer=' gitversion.properties >> gitversion.env - grep 'GitVersion_SemVer=' gitversion.properties >> gitversion.env - grep 'GitVersion_FullSemVer=' gitversion.properties >> gitversion.env - grep 'GitVersion_Major=' gitversion.properties >> gitversion.env - grep 'GitVersion_Minor=' gitversion.properties >> gitversion.env - grep 'GitVersion_Patch=' gitversion.properties >> gitversion.env - grep 'GitVersion_MajorMinorPatch=' gitversion.properties >> gitversion.env - grep 'GitVersion_BuildMetaData=' gitversion.properties >> gitversion.env - artifacts: - reports: - # propagates variables into the pipeline level - dotenv: gitversion.env diff --git a/.woodpecker/woodpecker_ci.yml b/.woodpecker/woodpecker_ci.yml new file mode 100644 index 0000000..ba24276 --- /dev/null +++ b/.woodpecker/woodpecker_ci.yml @@ -0,0 +1,92 @@ +steps: + - name: gitversion + depends_on: [] # nothing start emititly + when: + event: push + branch: main + image: mcr.microsoft.com/dotnet/sdk:9.0 + environment: + CI_TOKEN: + from_secret: CI_TOKEN + commands: + - git remote set-url origin https://CodeByMrFinchum:$CI_TOKEN@code.boxyfoxy.net/$CI_REPO.git + - git fetch --unshallow --tags + - apt-get update && apt-get install -y jq + - dotnet tool install --global GitVersion.Tool --version 5.* + - export PATH="$PATH:/root/.dotnet/tools" + - dotnet-gitversion -output json > version.json + - ls + - cat version.json + - | + echo "GitVersion_SemVer=$(jq -r '.SemVer' version.json)" >> gitversion.env + echo "GitVersion_LegacySemVer=$(jq -r '.LegacySemVer' version.json)" >> gitversion.env + echo "GitVersion_FullSemVer=$(jq -r '.FullSemVer' version.json)" >> gitversion.env + echo "GitVersion_Major=$(jq -r '.Major' version.json)" >> gitversion.env + echo "GitVersion_Minor=$(jq -r '.Minor' version.json)" >> gitversion.env + echo "GitVersion_Patch=$(jq -r '.Patch' version.json)" >> gitversion.env + echo "GitVersion_MajorMinorPatch=$(jq -r '.MajorMinorPatch' version.json)" >> gitversion.env + echo "GitVersion_BuildMetaData=$(jq -r '.BuildMetaData' version.json)" >> gitversion.env + + - name: tagging + depends_on: [gitversion] + when: + event: push + branch: main + image: alpine/git + environment: + CI_TOKEN: + from_secret: CI_TOKEN + commands: + - ls + - cat gitversion.env + - git config --global user.email "ci@noreply.boxyfoxy.net" + - git config --global user.name "CI Bot" + - git remote set-url origin https://CodeByMrFinchum:$${CI_TOKEN}@code.boxyfoxy.net/$${CI_REPO}.git + - . gitversion.env + - git tag $GitVersion_SemVer + - git push origin tag $GitVersion_SemVer + + - name: build + depends_on: [gitversion, tagging] + when: + event: push + branch: main + image: python:3.9.21 + commands: + - ls + - cat gitversion.env + - export $(cat gitversion.env | xargs) + - sed -i "s/0.0.1/$GitVersion_SemVer/" src/OptimaLab35/__init__.py + - cat src/OptimaLab35/__init__.py + - python3 -m pip install build + - python3 -m build --wheel --sdist -s src + + - name: publish_pypi + depends_on: [gitversion, tagging, build] + when: + event: push + branch: main + image: python:3.9.21 + environment: + TWINE_PASSWORD: + from_secret: TWINE_API + TWINE_USERNAME: "__token__" + commands: + - ls + - python3 -m pip install twine + - python3 -m twine upload src/dist/* + + - name: publish_forgejo + depends_on: [gitversion, tagging, build] + when: + event: push + branch: main + image: python:3.9.21 + environment: + TWINE_PASSWORD: + from_secret: PKG_TOKEN + TWINE_USERNAME: "CodeByMrFinchum" + commands: + - ls + - python3 -m pip install twine + - python3 -m twine upload --repository-url https://code.boxyfoxy.net/api/packages/CodeByMrFinchum/pypi src/dist/* diff --git a/CHANGELOG.md b/CHANGELOG.md index 50ef93c..a9b2781 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,167 @@ # Changelog +## 1.5.x +### 1.5.0: Feature - Time of dateEdit now today +- Changes that instead of the dateEdit elements being always set to a last day of 2024 it is the current day. + +## 1.4.x +### 1.4.2: Fix links +- Fixed that changelog was linked to GitLab, not it is to code.boxyfoxy.net +- Fixed Changelog + +### 1.4.1: Fix CI +- Fixed pipline +### 1.4.0: New CI +- Migrated repo from GitLab to my forgejo instance, therefore switching to woodpecker CI + +--- + +## 1.3.x +### 1.3.4: Fix - Spelling (25.04.01) +- Fixed misspelling in preview window. + +### 1.3.3: Patch - Increased Preview Performance x2 (25.04.01) +- Reduced preview stutter: Previously, the image was updated twice when changing brightness or contrast. Now, it updates only once, improving performance by 100%. +- There is still room for improvement. Analysis shows that image processing takes the most time, while displaying in Qt is relatively fast. Reducing the image size impacts performance, so resizing to 50% is a good idea. +- There is an issue where `QRunner` does not always finish in the correct order when brightness or contrast values are changed rapidly. ATM I do not know how to fix this easly. +- The "Preview" watermark now displays the brightness and contrast levels of the shown image. + +### 1.3.2: Fix - Fixed problem with app folders (25.03.30) +- Fixed a problem that the app folder path was not generated correctly. + +### 1.3.1: Fix - Fixed insert exif not working (25.03.27) +- Fixed the feature that inserted exif into images without modifying them. + +### 1.3.0: Feature - Write Adjustments into EXIF (25.03.24) +- Changes to contrast and brightness are now recorded in the EXIF comment section (labeled *Scanner* in the program). +- This allows users to track what adjustments were made to an image. + +--- + +## 1.2.x +### 1.2.2: Patch - Pyproject file (25.03.23) +- Fixed `Development Status` Classifier +- Added <4.0 python version + +### 1.2.1: Patch - Changelog file (25.03.23) +- Patches formation in changelog file. + +### 1.2.0: Refactor - Splitting Classes into Separate Files (25.03.23) +- Refactored `gui.py`, which previously contained almost all the code, into multiple files. +- Each window's logic is now in its own file, improving code organization. +- Window layouts remain in `.ui` folder, while their logic is now properly separated. + +## 1.1.x +### 1.1.0: Feature - New Function in Preview Window (25.03.23) +- Added a new feature to the preview window: **Hold a button to temporarily view the original (unedited) image.** This makes it easier to compare changes. +- Minor UI adjustments. + +--- + +## 1.0.x (25.03.06) +### 1.0.1: Fixed spelling +- Fixes spelling some places + +### 1.0.0: Fix version bump +- Version was not bumped correctly + +--- + +## 0.15.1: Final Polish (25.03.06) +- Fixed a bug where the GPS field being empty but selected caused issues. +- EXIF insertion is now canceled if any image in the folder does not end with a number. +- Minor GUI adjustments for a more polished experience. +- Disabled preview adjustment controls until an image is loaded to prevent errors. + +## 0.15.0: Preview Image Resizing Update (25.02.12) +- Added the ability to change the preview image size dynamically. +- Previously, the image was processed and displayed at its original size, causing lag or unresponsiveness when adjusting the slider. +- Reducing the processed image size should help improve performance. +- Default preview image size is now **25%**, but users can adjust it between **10% and 100%**. + +--- + +## 0.14.x +### 0.14.1: Patch changelog (25.02.12) +- Updated the changelog to include missing entries. + +### 0.14.0: Code refactor (by Mr. Finch) (25.02.11) +- Introduced constants and optimized the code. + +## 0.13.x (25.02.11) +### 0.13.1: Fixed image processing +- Fixed a bug that made it impossible to process images. + +### 0.13.0: Requirements file (by Mr. Finch) +- Added a requirements file. + +--- + +## 0.12.x +### 0.12.6: Disabled app restart on Windows (25.02.11) +- The app can not restart properly on Windows, so the restart button has been hidden when the OS is `nt`. +- Also updated tool tip to indicate that changing theme requeres are restart. + +### 0.12.5: Fixed EXIF File Generation Bug (25.02.10) +- Fixed a bug where the application failed to generate a new default EXIF file if none was available. Now, the file is correctly created when missing. + +### 0.12.4: Updated README (25.02.10) +- The README file (project description) now includes updates description and screenshots. + +### 0.12.3: UI Adjustments (25.02.10) +- Minor changes to maintain a unified layout across all windows. +- Added option to sync app theme with OS (if supported). +- Set auto theme as the default value. + +### 0.12.2: Minor UI Improvements for Theme Compatibility (25.02.10) +- Fixed text clipping issues when using the new theme options. + +### 0.12.1: Removed Unnecessary Debug Prints (25.02.09) +- Removed leftover debug statements. + +### 0.12.0: New Settings Menu & Patches (25.02.09) +- **New Settings Window:** + - The updater window has been reworked into a settings window. + - **Initial settings (first tab) include:** + 1. Option to change the theme (with an optional dependency installation). + 2. Reset selectable EXIF data to default. + - The updater UI has been moved to the second tab. + - Added a link to the changelog for easier access to update details. + +- **Patches:** + - Fixed an issue where links in labels (About window) did not open a browser. + - Added a changelog link in the About window. + - Minor changes to `utility.py` to handle settings. + +--- + +## 0.11.x (25.02.05) +### 0.11.1: Fixed pipeline +- Fixed pipeline publish error + +### 0.11.0: Refactor and Patches +- Fixed an issue with the updater: The updater window wouldn't start if the `updater_log.json` file was missing or lacked a valid last `time.time()` float value. +- Corrected layout issues in the preview window, repositioning elements to their proper places. +- Added an application icon (may not work on all desktop environments). +- Refactored code to reduce the size of the PyPi package by removing unnecessary folders. + +--- + +## 0.10.x (25.02.04) +### 0.10.1: Fixed Updater +- Fixed an issue where the updater was permanently disabled. + +### 0.10.0: Multithreading for Preview Window +- The preview window now processes images in a separate thread, and live update preview is enabled by default. + - This improves UI responsiveness. + - The image now resizes dynamically to fit the window when the window size changes. +- Minor UI improvements. + +--- ## 0.9.x +### 0.9.2: Enhanced updater +- Minor enhancments for the updater + ### 0.9.1: Patch for Unsuccessful Successful Update - Addressed a rare issue where the package did not update correctly using the updater. - Unable to reproduce, but it may have been related to an older version and the restart process. @@ -23,7 +184,7 @@ - Improved error handling for updater: now displays the specific error message instead of just **"error"** when an issue occurs during update checks. - Ensured all child windows close when the main window is closed. -### 0.8.3: Fix – OptimaLab35 Not Closing After Update +### 0.8.3: Fix - OptimaLab35 Not Closing After Update - Fixed an issue where **OptimaLab35** would not close properly when updating, resulting in an unresponsive instance and multiple running processes. ### 0.8.2: Patch for New PyPiUpdater Version diff --git a/README.md b/README.md index 722f656..22efff4 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,17 @@ # **OptimaLab35** -_Last updated: 02 Feb 2025 (v.0.9.0)_ +Developed on my [forgejo instance](https://code.boxyfoxy.net/CodeByMrFinchum), [GitLab](https://gitlab.com/CodeByMrFinchum) is used as backup. ## **Overview** **OptimaLab35** enhances **OPTIMA35** (**Organizing, Processing, Tweaking Images, and Modifying scanned Analogs from 35mm Film**) by offering a user-friendly graphical interface for efficient image and metadata management. -It serves as a GUI for the [OPTIMA35 library](https://gitlab.com/CodeByMrFinchum/optima35), providing an intuitive way to interact with the core functionalities. +It serves as a GUI for the [optima35 library](https://code.boxyfoxy.net/CodeByMrFinchum/optima35), providing an intuitive way to interact with the core functionalities. --- ## **Current Status** -### **Early Development** -OptimaLab35 is actively developed using **PySide6** and **Qt**, providing a modern interface for **OPTIMA35**. - -The program is still in its early stages, and features may change drastically over time. Some features might be added but later removed if they don't prove useful. Expect significant changes to the UI and functionality between updates. - -For the most accurate and detailed update information, please refer to the [**CHANGELOG**](https://gitlab.com/CodeByMrFinchum/OptimaLab35/-/blob/main/CHANGELOG.md) as the readme might lack behind. +The program has reached a stable release. All functions have been tested, and there should be *no* bugs. +While there is always room for additional features and optimizations, the core functionality is complete and reliable. --- @@ -38,9 +34,9 @@ For the most accurate and detailed update information, please refer to the [**CH - Automatically adjust EXIF timestamps based on image file names - Add GPS coordinates to images -### **Updater** +### **Settings** +- Option to use `PyQtDarkTheme` and select Dark, Light, or auto theme - Checks for updates on PyPI, automatically downloads and installs the latest version -- Restarts the program after update --- @@ -53,39 +49,45 @@ pip install OptimaLab35 --- -## Preview GUI **0.9.0** -**PREVIEW** might be out of date. +## GUI Preview +The layout remains consistent with v1.0.0. +The UI is OS-dependent, but a custom theme can be enabled in the settings. **Main tab** -![main](https://gitlab.com/CodeByMrFinchum/OptimaLab35/-/raw/main/media/main_tab.png){width=40%} +![main](https://code.boxyfoxy.net/CodeByMrFinchum/OptimaLab35/raw/branch/main/media/mainwindow_light.png){width=40%} +![main](https://code.boxyfoxy.net/CodeByMrFinchum/OptimaLab35/raw/branch/main/media/mainwindow_dark.png){width=40%} **Exif tab** -![main](https://gitlab.com/CodeByMrFinchum/OptimaLab35/-/raw/main/media/exif_tab.png){width=40%} - -**Exif editor** - -![main](https://gitlab.com/CodeByMrFinchum/OptimaLab35/-/raw/main/media/exif_editor.png){width=40%} +![main](https://code.boxyfoxy.net/CodeByMrFinchum/OptimaLab35/raw/branch/main/media/mainwindow_exif_light.png){width=40%} +![main](https://code.boxyfoxy.net/CodeByMrFinchum/OptimaLab35/raw/branch/main/media/mainwindow_exif_dark.png){width=40%} **Preview window** -![main](https://gitlab.com/CodeByMrFinchum/OptimaLab35/-/raw/main/media/preview_window.png){width=40%} +![main](https://code.boxyfoxy.net/CodeByMrFinchum/OptimaLab35/raw/branch/main/media/previewwindow_light.png){width=40%} +![main](https://code.boxyfoxy.net/CodeByMrFinchum/OptimaLab35/raw/branch/main/media/previewwindow_dark.png){width=40%} -**About** +**Settings** -![main](https://gitlab.com/CodeByMrFinchum/OptimaLab35/-/raw/main/media/about_window.png){width=40%} +![main](https://code.boxyfoxy.net/CodeByMrFinchum/OptimaLab35/raw/branch/main/media/settingswindow_light.png){width=40%} +![main](https://code.boxyfoxy.net/CodeByMrFinchum/OptimaLab35/raw/branch/main/media/settingswindow_dark.png){width=40%} **Updater** -![main](https://gitlab.com/CodeByMrFinchum/OptimaLab35/-/raw/main/media/updater_window.png){width=40%} +![main](https://code.boxyfoxy.net/CodeByMrFinchum/OptimaLab35/raw/branch/main/media/settingswindow_updater_light.png){width=40%} +![main](https://code.boxyfoxy.net/CodeByMrFinchum/OptimaLab35/raw/branch/main/media/settingswindow_updater_dark.png){width=40%} --- -# Use of LLMs +# Contribution + +Thanks to developer [Mr Finch](https://gitlab.com/MrFinchMkV) for contributing to this project. + +## Use of LLMs In the interest of transparency, I disclose that Generative AI (GAI) large language models (LLMs), including OpenAI’s ChatGPT and Ollama models (e.g., OpenCoder and Qwen2.5-coder), have been used to assist in this project. -## Areas of Assistance: +### Areas of Assistance: - Project discussions and planning - Spelling and grammar corrections - Suggestions for suitable packages and libraries @@ -97,7 +99,7 @@ In cases where LLMs contribute directly to code or provide substantial optimizat - mradermacher gguf Q4K-M Instruct version of infly/OpenCoder-1.5B - unsloth gguf Q4K_M Instruct version of both Qwen/QWEN2 1.5B and 3B -### References +#### References 1. **Huang, Siming, et al.** *OpenCoder: The Open Cookbook for Top-Tier Code Large Language Models.* 2024. [PDF](https://arxiv.org/pdf/2411.04905) diff --git a/pyproject.toml b/flatpak/pyproject.toml similarity index 75% rename from pyproject.toml rename to flatpak/pyproject.toml index 57042c5..4e3097a 100644 --- a/pyproject.toml +++ b/flatpak/pyproject.toml @@ -7,14 +7,8 @@ name = "OptimaLab35" dynamic = ["version"] authors = [{ name = "Mr Finchum" }] description = "User interface for optima35." -readme = "pip_README.md" requires-python = ">=3.8" -dependencies = [ - "optima35>=1.0.0, <2.0.0", - "PyPiUpdater>=0.6.0, <1.0.0", - "pyside6", - "PyYAML", -] +dependencies = ["optima35>=1.0.0, <2.0.0", "PyYAML", "PyPyUpdater"] classifiers = [ "Programming Language :: Python :: 3", "License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)", @@ -28,7 +22,7 @@ Source = "https://gitlab.com/CodeByMrFinchum/OptimaLab35" OptimaLab35 = "OptimaLab35.__main__:main" [tool.hatch.build.targets.wheel] -packages = ["src/OptimaLab35"] +packages = ["OptimaLab35"] [tool.hatch.version] -path = "src/OptimaLab35/__init__.py" +path = "OptimaLab35/__init__.py" diff --git a/media/about_window.png b/media/about_window.png deleted file mode 100644 index f97c061..0000000 Binary files a/media/about_window.png and /dev/null differ diff --git a/media/exif_editor.png b/media/exif_editor.png deleted file mode 100644 index 8457cb8..0000000 Binary files a/media/exif_editor.png and /dev/null differ diff --git a/media/exif_tab.png b/media/exif_tab.png deleted file mode 100644 index 7d62403..0000000 Binary files a/media/exif_tab.png and /dev/null differ diff --git a/media/main_tab.png b/media/main_tab.png deleted file mode 100644 index bf9d2f0..0000000 Binary files a/media/main_tab.png and /dev/null differ diff --git a/media/mainwindow_dark.png b/media/mainwindow_dark.png new file mode 100644 index 0000000..8ccda0d Binary files /dev/null and b/media/mainwindow_dark.png differ diff --git a/media/mainwindow_exif_dark.png b/media/mainwindow_exif_dark.png new file mode 100644 index 0000000..f759fe2 Binary files /dev/null and b/media/mainwindow_exif_dark.png differ diff --git a/media/mainwindow_exif_light.png b/media/mainwindow_exif_light.png new file mode 100644 index 0000000..2b3f1ab Binary files /dev/null and b/media/mainwindow_exif_light.png differ diff --git a/media/mainwindow_light.png b/media/mainwindow_light.png new file mode 100644 index 0000000..197874b Binary files /dev/null and b/media/mainwindow_light.png differ diff --git a/media/preview_window.png b/media/preview_window.png deleted file mode 100644 index 5fcc363..0000000 Binary files a/media/preview_window.png and /dev/null differ diff --git a/media/previewwindow_dark.png b/media/previewwindow_dark.png new file mode 100644 index 0000000..618340c Binary files /dev/null and b/media/previewwindow_dark.png differ diff --git a/media/previewwindow_light.png b/media/previewwindow_light.png new file mode 100644 index 0000000..aaf3d4d Binary files /dev/null and b/media/previewwindow_light.png differ diff --git a/media/settingswindow_dark.png b/media/settingswindow_dark.png new file mode 100644 index 0000000..9c791b8 Binary files /dev/null and b/media/settingswindow_dark.png differ diff --git a/media/settingswindow_light.png b/media/settingswindow_light.png new file mode 100644 index 0000000..67f5fb0 Binary files /dev/null and b/media/settingswindow_light.png differ diff --git a/media/settingswindow_updater_dark.png b/media/settingswindow_updater_dark.png new file mode 100644 index 0000000..fbe003c Binary files /dev/null and b/media/settingswindow_updater_dark.png differ diff --git a/media/settingswindow_updater_light.png b/media/settingswindow_updater_light.png new file mode 100644 index 0000000..6a3e124 Binary files /dev/null and b/media/settingswindow_updater_light.png differ diff --git a/media/updater_window.png b/media/updater_window.png deleted file mode 100644 index 506a184..0000000 Binary files a/media/updater_window.png and /dev/null differ diff --git a/pip_README.md b/pip_README.md index f36b255..576c8bf 100644 --- a/pip_README.md +++ b/pip_README.md @@ -1,4 +1,11 @@ -OptimaLab35 is in active development, and even *stable* versions may produce errors in unexpected situations. It is a GUI for optima35. -Please visit [OptimaLab35](https://gitlab.com/CodeByMrFinchum/OptimaLab35/-/blob/main/media/exif_editor.png?ref_type=heads) gitlab page for more information. +**[OptimaLab35](https://code.boxyfoxy.net/CodeByMrFinchum/OptimaLab35)** is a graphical interface for the [optima35 library](https://code.boxyfoxy.net/CodeByMrFinchum/optima35), designed for efficient image and metadata management. -Uses [optima35](https://gitlab.com/CodeByMrFinchum/optima35) to modify images. +Developed on my [forgejo instance](https://code.boxyfoxy.net/CodeByMrFinchum), [GitLab](https://gitlab.com/CodeByMrFinchum) is used as backup. + +### **Features** +- Resize, adjust brightness/contrast, and convert images to grayscale +- Add customizable text-based watermarks +- Manage EXIF data: add, copy, remove, and adjust timestamps +- Preview image adjustments in real time +- Theme selection (light, dark, auto) +- Automatic updates via PyPI diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..b5901cc --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +optima35 +PyPiUpdater +pyside6 +PyYAML diff --git a/src/OptimaLab35/__main__.py b/src/OptimaLab35/__main__.py index 557cfbf..512c7b3 100644 --- a/src/OptimaLab35/__main__.py +++ b/src/OptimaLab35/__main__.py @@ -1,7 +1,30 @@ -from OptimaLab35 import gui, __version__ +import sys +from PySide6 import QtWidgets +from .utils.utility import Utilities +from .mainWindow import OptimaLab35 +from .const import ( + CONFIG_BASE_PATH +) def main(): - gui.main() + u = Utilities(CONFIG_BASE_PATH) + app_settings = u.load_settings() + app = QtWidgets.QApplication(sys.argv) + + try: + import qdarktheme + app_settings["theme"]["theme_pkg"] = True + except ImportError: + app_settings["theme"]["theme_pkg"] = False + + if app_settings["theme"]["use_custom_theme"] and app_settings["theme"]["theme_pkg"]: + qdarktheme.setup_theme(app_settings["theme"]["mode"].lower()) + + u.save_settings(app_settings) + + window = OptimaLab35() + window.show() + app.exec() if __name__ == "__main__": main() diff --git a/src/OptimaLab35/const.py b/src/OptimaLab35/const.py new file mode 100644 index 0000000..2dcfd9c --- /dev/null +++ b/src/OptimaLab35/const.py @@ -0,0 +1,2 @@ +APPLICATION_NAME = "OptimaLab35" +CONFIG_BASE_PATH = "~/.config/OptimaLab35" diff --git a/src/OptimaLab35/gui.py b/src/OptimaLab35/mainWindow.py similarity index 56% rename from src/OptimaLab35/gui.py rename to src/OptimaLab35/mainWindow.py index 22fdafb..c299689 100644 --- a/src/OptimaLab35/gui.py +++ b/src/OptimaLab35/mainWindow.py @@ -1,49 +1,54 @@ -import sys import os from datetime import datetime - -from PyPiUpdater import PyPiUpdater from optima35.core import OptimaManager -from OptimaLab35.utils.utility import Utilities -from OptimaLab35.ui.main_window import Ui_MainWindow -from OptimaLab35.ui.preview_window import Ui_Preview_Window -from OptimaLab35.ui.updater_window import Ui_Updater_Window -from OptimaLab35.ui.exif_handler_window import ExifEditor -from OptimaLab35.ui.simple_dialog import SimpleDialog # Import the SimpleDialog class + from OptimaLab35 import __version__ +from .const import ( + APPLICATION_NAME, + CONFIG_BASE_PATH +) -from PySide6.QtCore import QRunnable, QThreadPool, Signal, QObject, QRegularExpression, Qt, QTimer +from .ui import resources_rc +from .previewWindow import PreviewWindow +from .settingsWindow import SettingsWindow + +from .utils.utility import Utilities +from .ui.main_window import Ui_MainWindow +from .ui.exif_handler_window import ExifEditor +from .ui.simple_dialog import SimpleDialog # Import the SimpleDialog class + +from PySide6 import QtWidgets, QtCore + +from PySide6.QtCore import ( + QRunnable, + QThreadPool, + Signal, + QObject, + QRegularExpression, + Qt, + QDate +) -from PySide6 import QtWidgets from PySide6.QtWidgets import ( QMessageBox, QApplication, QMainWindow, - QWidget, - QVBoxLayout, - QLabel, - QLineEdit, - QPushButton, - QCheckBox, - QFileDialog, - QHBoxLayout, - QSpinBox, - QProgressBar, + QFileDialog ) -from PySide6.QtGui import QPixmap, QRegularExpressionValidator +from PySide6.QtGui import QRegularExpressionValidator, QIcon class OptimaLab35(QMainWindow, Ui_MainWindow): def __init__(self): super(OptimaLab35, self).__init__() - self.name = "OptimaLab35" + self.name = APPLICATION_NAME self.version = __version__ self.o = OptimaManager() - self.u = Utilities() - self.u.program_configs() + self.u = Utilities(os.path.expanduser(CONFIG_BASE_PATH)) + self.app_settings = self.u.load_settings() self.thread_pool = QThreadPool() # multi thread ChatGPT # Initiate internal object - self.exif_file = os.path.expanduser("~/.config/OptimaLab35/exif.yaml") + self.exif_file = os.path.expanduser(f"{CONFIG_BASE_PATH}/exif.yaml") self.available_exif_data = None self.settings = {} # UI elements @@ -52,10 +57,11 @@ class OptimaLab35(QMainWindow, Ui_MainWindow): self.sd = SimpleDialog() # Change UI elements - self.change_statusbar(f"Using {self.o.name} v{self.o.version}", 5000) + self.change_statusbar(f"{self.name} v{self.version}", 10000) self.set_title() self.default_ui_layout() self.define_gui_interaction() + self.setWindowIcon(QIcon(":app-icon.png")) # Init function def default_ui_layout(self): @@ -85,15 +91,13 @@ class OptimaLab35(QMainWindow, Ui_MainWindow): self.ui.actionAbout.triggered.connect(self.info_window) self.ui.preview_Button.clicked.connect(self.open_preview_window) - self.ui.actionUpdate.triggered.connect(self.open_updater_window) + self.ui.actionSettings.triggered.connect(self.open_updater_window) regex = QRegularExpression(r"^\d{1,2}\.\d{1,6}$") validator = QRegularExpressionValidator(regex) self.ui.lat_lineEdit.setValidator(validator) self.ui.long_lineEdit.setValidator(validator) - #layout.addWidget(self.ui.lat_lineEdit) - #layout.addWidget(self.ui.long_lineEdit) - + self.ui.dateEdit.setDate(QDate.currentDate()) # UI related function, changing parts, open, etc. def open_preview_window(self): self.preview_window = PreviewWindow() @@ -101,7 +105,7 @@ class OptimaLab35(QMainWindow, Ui_MainWindow): self.preview_window.showMaximized() def open_updater_window(self): - self.updater_window = UpdaterWindow(self.version, self.o.version) + self.updater_window = SettingsWindow(self.version, self.o.version) self.updater_window.show() def update_values(self, value1, value2, checkbox_state): @@ -127,6 +131,7 @@ class OptimaLab35(QMainWindow, Ui_MainWindow):

For more details, visit:

@@ -334,6 +339,14 @@ class OptimaLab35(QMainWindow, Ui_MainWindow): # Start worker in thread pool ChatGPT self.thread_pool.start(worker) + def control_ending(self, name_lst): + for item in name_lst: + try: + int(item[-5]) + except ValueError: + return False + return True + def insert_exif(self, image_files): input_folder = self.settings["input_folder"] @@ -365,6 +378,12 @@ class OptimaLab35(QMainWindow, Ui_MainWindow): return image_list = self.image_list_from_folder(self.settings["input_folder"]) + print(image_list) + if not self.control_ending(image_list): + QMessageBox.warning(self, "Warning", f"Error: one or more filenames do not end on a number.\nCan not adjust time") + self.toggle_buttons(True) + return + self.insert_exif(image_list) self.toggle_buttons(True) @@ -398,10 +417,14 @@ class OptimaLab35(QMainWindow, Ui_MainWindow): user_data["lens"] = self.ui.lens_comboBox.currentText() user_data["iso"] = self.ui.iso_comboBox.currentText() user_data["image_description"] = self.ui.image_description_comboBox.currentText() - user_data["user_comment"] = self.ui.user_comment_comboBox.currentText() user_data["artist"] = self.ui.artist_comboBox.currentText() user_data["copyright_info"] = self.ui.copyright_info_comboBox.currentText() - user_data["software"] = f"{self.name} (v{self.version}) with {self.o.name} (v{self.o.version})" + user_data["software"] = f"{self.name} {self.version} with {self.o.name} {self.o.version}" + if int(self.ui.contrast_spinBox.text()) != 0 or int(self.ui.brightness_spinBox.text()) != 0: + user_data["user_comment"] = f"{self.ui.user_comment_comboBox.currentText()}, contrast: {self.ui.contrast_spinBox.text()}, brightness: {self.ui.brightness_spinBox.text()}" + else: + user_data["user_comment"] = self.ui.user_comment_comboBox.currentText() + return user_data def get_selected_exif(self): @@ -411,7 +434,10 @@ class OptimaLab35(QMainWindow, Ui_MainWindow): if self.ui.add_date_checkBox.isChecked(): selected_exif["date_time_original"] = self.get_date() if self.ui.gps_checkBox.isChecked(): - self.settings["gps"] = [float(self.ui.lat_lineEdit.text()), float(self.ui.long_lineEdit.text())] + try: + self.settings["gps"] = [float(self.ui.lat_lineEdit.text()), float(self.ui.long_lineEdit.text())] + except ValueError as e: + self.settings["gps"] = "Wrong gps data" else: self.settings["gps"] = None return selected_exif @@ -451,6 +477,9 @@ class OptimaLab35(QMainWindow, Ui_MainWindow): self.settings["own_date"] = self.get_checkbox_value(self.ui.add_date_checkBox) if self.settings["own_exif"]: self.settings["user_selected_exif"] = self.get_selected_exif() + if self.settings["gps"] is not None: + if len(self.settings["gps"]) != 2: + return self.settings["gps"] else: self.settings["user_selected_exif"] = None self.settings["gps"] = None @@ -473,335 +502,6 @@ class OptimaLab35(QMainWindow, Ui_MainWindow): QApplication.closeAllWindows() event.accept() -class UpdaterWindow(QMainWindow, Ui_Updater_Window): - # Mixture of code by me, code/functions refactored by ChatGPT and code directly from ChatGPT - def __init__(self, optimalab35_localversion, optima35_localversion): - super(UpdaterWindow, self).__init__() - self.ui = Ui_Updater_Window() - self.ui.setupUi(self) - self.dev_mode = True #True if optimalab35_localversion == "0.0.1" else False - #self.set_dev_ui() - from PyPiUpdater import PyPiUpdater - # Update log file location - self.update_log_file = os.path.expanduser("~/.config/OptimaLab35/update_log.json") - # Store local versions - self.optimalab35_localversion = optimalab35_localversion - self.optima35_localversion = optima35_localversion - - # Create PyPiUpdater instances - self.ppu_ol35 = PyPiUpdater("OptimaLab35", self.optimalab35_localversion, self.update_log_file) - self.ppu_o35 = PyPiUpdater("optima35", self.optima35_localversion, self.update_log_file) - self.ol35_last_state = self.ppu_ol35.get_last_state() - self.o35_last_state = self.ppu_o35.get_last_state() - - # Track which packages need an update - self.updates_available = {"OptimaLab35": False, "optima35": False} - - self.define_gui_interaction() - - def start_long_press(self): - """Start the timer when button is pressed.""" - self.timer.start(1000) # 1-second long press - - def cancel_long_press(self): - """Cancel long press if released early.""" - self.timer.stop() - - def toggle_dev_ui(self): - """Show or hide the hidden UI when long press is detected.""" - self.ui.dev_widget.setVisible(True) - - self.ui.check_local_Button.clicked.connect(self.local_check_for_updates) - self.ui.update_local_Button.clicked.connect(self.local_update) - - def define_gui_interaction(self): - """Setup UI interactions.""" - self.ui.label_optimalab35_localversion.setText(self.optimalab35_localversion) - self.ui.label_optima35_localversion.setText(self.optima35_localversion) - - self.ui.label_latest_version.setText("Latest version") - self.ui.label_optimalab35_latestversion.setText(self.ol35_last_state[1]) - self.ui.label_optima35_latestversion.setText(self.o35_last_state[1]) - - self.ui.update_and_restart_Button.setEnabled(False) - - # Connect buttons to functions - self.ui.check_for_update_Button.clicked.connect(self.check_for_updates) - self.ui.update_and_restart_Button.clicked.connect(self.update_and_restart) - self.ui.label_last_check_2.setText(self.time_to_string(self.ol35_last_state[0])) - self.ui.dev_widget.setVisible(False) - - # Timer for long press detection - self.timer = QTimer() - self.timer.setSingleShot(True) - self.timer.timeout.connect(self.toggle_dev_ui) - - # Connect button press/release - self.ui.check_for_update_Button.pressed.connect(self.start_long_press) - self.ui.check_for_update_Button.released.connect(self.cancel_long_press) - - def local_check_for_updates(self): - dist_folder = os.path.expanduser("~/git/gitlab_public/OptimaLab35/dist/") - self.ui.check_local_Button.setEnabled(False) - self.ui.label_optimalab35_latestversion.setText("Checking...") - self.ui.label_optima35_latestversion.setText("Checking...") - - # Check OptimaLab35 update - ol35_pkg_info = self.ppu_ol35.check_update_local(dist_folder) - if ol35_pkg_info[0] is None: - self.ui.label_optimalab35_latestversion.setText(ol35_pkg_info[1][0:13]) - else: - self.ui.label_optimalab35_latestversion.setText(ol35_pkg_info[1]) - self.updates_available["OptimaLab35"] = ol35_pkg_info[0] - - # Check optima35 update - o35_pkg_info = self.ppu_o35.check_update_local(dist_folder) - if o35_pkg_info[0] is None: - self.ui.label_optima35_latestversion.setText(o35_pkg_info[1][0:13]) - else: - self.ui.label_optima35_latestversion.setText(o35_pkg_info[1]) - self.updates_available["optima35"] = o35_pkg_info[0] - - - def local_update(self): - dist_folder = os.path.expanduser("~/git/gitlab_public/OptimaLab35/dist/") - packages_to_update = [pkg for pkg, update in self.updates_available.items() if update] - - if not packages_to_update: - QMessageBox.information(self, "Update", "No updates available.") - return - - # Confirm update - msg = QMessageBox() - msg.setWindowTitle("Update Available") - message = f"Updating: {', '.join(packages_to_update)}\nUpdate " - - if self.ui.restart_checkBox.isChecked(): - message = message + "and restart app?" - else: - message = message + "app?" - - msg.setText(message) - msg.setStandardButtons(QMessageBox.Yes | QMessageBox.No) - result = msg.exec() - - if result == QMessageBox.Yes: - update_results = [] # Store results - - for package in packages_to_update: - if package == "OptimaLab35": - pkg_info = self.ppu_ol35.update_from_local(dist_folder) - elif package == "optima35": - pkg_info = self.ppu_o35.update_from_local(dist_folder) - - update_results.append(f"{package}: {'Success' if pkg_info[0] else 'Failed'}\n{pkg_info[1]}") - - # Show summary of updates - # Show update completion message - msg = QMessageBox() - msg.setWindowTitle("Update Complete") - msg.setText("\n\n".join(update_results)) - msg.setStandardButtons(QMessageBox.Ok) - msg.exec() - - # Restart the application after user clicks "OK" - if self.ui.restart_checkBox.isChecked(): - self.restart_program() - - def time_to_string(self, time_time): - dt_obj = datetime.fromtimestamp(time_time) - date_string = dt_obj.strftime("%d %h %H:%M") - return date_string - - def check_for_updates(self): - """Check for updates and update the UI.""" - self.ui.check_for_update_Button.setEnabled(False) - self.ui.label_optimalab35_latestversion.setText("Checking...") - self.ui.label_optima35_latestversion.setText("Checking...") - - # Check OptimaLab35 update - ol35_pkg_info = self.ppu_ol35.check_for_update() - if ol35_pkg_info[0] is None: - self.ui.label_optimalab35_latestversion.setText(ol35_pkg_info[1][0:13]) - else: - self.ui.label_optimalab35_latestversion.setText(ol35_pkg_info[1]) - self.updates_available["OptimaLab35"] = ol35_pkg_info[0] - - # Check optima35 update - o35_pkg_info = self.ppu_o35.check_for_update() - if o35_pkg_info[0] is None: - self.ui.label_optima35_latestversion.setText(o35_pkg_info[1][0:13]) - else: - self.ui.label_optima35_latestversion.setText(o35_pkg_info[1]) - self.updates_available["optima35"] = o35_pkg_info[0] - - # Enable update button if any update is available - if any(self.updates_available.values()): - if self.dev_mode: - self.ui.update_and_restart_Button.setEnabled(False) - self.ui.update_and_restart_Button.setText("Update disabled") - else: - self.ui.update_and_restart_Button.setEnabled(True) - - last_date = self.time_to_string(self.ppu_ol35.get_last_state()[0]) - self.ui.label_last_check_2.setText(last_date) - self.ui.label_latest_version.setText("Online version") - self.ui.check_for_update_Button.setEnabled(True) - - def update_and_restart(self): - """Update selected packages and restart the application.""" - packages_to_update = [pkg for pkg, update in self.updates_available.items() if update] - - if not packages_to_update: - QMessageBox.information(self, "Update", "No updates available.") - return - - # Confirm update - msg = QMessageBox() - msg.setWindowTitle("Update Available") - message = f"Updating: {', '.join(packages_to_update)}\nUpdate " - - if self.ui.restart_checkBox.isChecked(): - message = message + "and restart app?" - else: - message = message + "app?" - - msg.setText(message) - msg.setStandardButtons(QMessageBox.Yes | QMessageBox.No) - result = msg.exec() - - if result == QMessageBox.Yes: - update_results = [] # Store results - - for package in packages_to_update: - if package == "OptimaLab35": - pkg_info = self.ppu_ol35.update_package() - elif package == "optima35": - pkg_info = self.ppu_o35.update_package() - - update_results.append(f"{package}: {'Success' if pkg_info[0] else 'Failed'}\n{pkg_info[1]}") - - # Show summary of updates - # Show update completion message - msg = QMessageBox() - msg.setWindowTitle("Update Complete") - msg.setText("\n\n".join(update_results)) - msg.setStandardButtons(QMessageBox.Ok) - msg.exec() - - # Restart the application after user clicks "OK" - if self.ui.restart_checkBox.isChecked(): - self.restart_program() - - def restart_program(self): - """Restart the Python program after an update.""" - print("Restarting the application...") - # Close all running Qt windows before restarting - app = QApplication.instance() - if app: - app.quit() - - python = sys.executable - os.execl(python, python, *sys.argv) - -class PreviewWindow(QMainWindow, Ui_Preview_Window): - values_selected = Signal(int, int, bool) - - def __init__(self): - super(PreviewWindow, self).__init__() - self.ui = Ui_Preview_Window() - self.ui.setupUi(self) - self.o = OptimaManager() - self.ui.QLabel.setAlignment(Qt.AlignCenter) - ## Ui interaction - self.ui.load_Button.clicked.connect(self.browse_file) - self.ui.update_Button.clicked.connect(self.update_preview) - self.ui.close_Button.clicked.connect(self.close_window) - - self.ui.reset_brightness_Button.clicked.connect(lambda: self.ui.brightness_spinBox.setValue(0)) - self.ui.reset_contrast_Button.clicked.connect(lambda: self.ui.contrast_spinBox.setValue(0)) - - # Connect UI elements to `on_ui_change` - self.ui.brightness_spinBox.valueChanged.connect(self.on_ui_change) - self.ui.brightness_Slider.valueChanged.connect(self.on_ui_change) - #self.ui.reset_brightness_Button.clicked.connect(self.on_ui_change) - - self.ui.contrast_spinBox.valueChanged.connect(self.on_ui_change) - self.ui.contrast_Slider.valueChanged.connect(self.on_ui_change) - #self.ui.reset_contrast_Button.clicked.connect(self.on_ui_change) - - self.ui.grayscale_checkBox.stateChanged.connect(self.on_ui_change) - - def on_ui_change(self): - """Triggers update only if live update is enabled.""" - if self.ui.live_update.isChecked(): - self.update_preview() - - def browse_file(self): - file = QFileDialog.getOpenFileName(self, caption = "Select File", filter = ("Images (*.png *.webp *.jpg *.jpeg)")) - if file[0]: - self.ui.image_path_lineEdit.setText(file[0]) - self.update_preview() - - def process_image(self, path): - """Loads and processes the image with modifications.""" - # Refactored by ChatGPT - if not os.path.isfile(path): - return None - - try: - img = self.o.process_image_object( - image_input_file=path, # Example: resize percentage - watermark="PREVIEW", - resize = 100, - grayscale=self.ui.grayscale_checkBox.isChecked(), - brightness=int(self.ui.brightness_spinBox.text()), - contrast=int(self.ui.contrast_spinBox.text()) - ) - return QPixmap.fromImage(img) - except Exception as e: - QMessageBox.warning(self, "Warning", "Error loading image...") - print(f"Error loading image...\n{e}") - return None - - def display_image(self, pixmap): - """Adjusts the image to fit within the QLabel.""" - # ChatGPT - if pixmap is None: - return - - # Get max available size (QLabel size) - max_size = self.ui.QLabel.size() - max_width = max_size.width() - max_height = max_size.height() - - # Scale image to fit within the available space while maintaining aspect ratio - scaled_pixmap = pixmap.scaled( - max_width, max_height, - Qt.KeepAspectRatio, - Qt.SmoothTransformation - ) - - # Set the scaled image - self.ui.QLabel.setPixmap(scaled_pixmap) - - # Adjust QLabel size to match image - self.ui.QLabel.resize(scaled_pixmap.size()) - - def update_preview(self): - """Handles loading and displaying the image.""" - # ChatGPT - path = self.ui.image_path_lineEdit.text() - pixmap = self.process_image(path) - self.display_image(pixmap) - - def close_window(self): - # Emit the signal with the values from the spinboxes and checkbox - # chatgpt - if self.ui.checkBox.isChecked(): - self.values_selected.emit(self.ui.brightness_spinBox.value(), self.ui.contrast_spinBox.value(), self.ui.grayscale_checkBox.isChecked()) - self.close() - class WorkerSignals(QObject): # ChatGPT progress = Signal(int) @@ -816,7 +516,7 @@ class ImageProcessorRunnable(QRunnable): self.signals = WorkerSignals() self.signals.progress.connect(progress_callback) self.o = OptimaManager() - self.u = Utilities() + self.u = Utilities(os.path.expanduser(CONFIG_BASE_PATH)) def run(self): input_folder = self.settings["input_folder"] @@ -850,13 +550,3 @@ class ImageProcessorRunnable(QRunnable): self.signals.progress.emit(int((i / len(self.image_files)) * 100)) self.signals.finished.emit() - - -def main(): - app = QtWidgets.QApplication(sys.argv) - window = OptimaLab35() - window.show() - app.exec() - -if __name__ == "__main__": - main() diff --git a/src/OptimaLab35/previewWindow.py b/src/OptimaLab35/previewWindow.py new file mode 100644 index 0000000..82161d2 --- /dev/null +++ b/src/OptimaLab35/previewWindow.py @@ -0,0 +1,166 @@ +import os +from optima35.core import OptimaManager + +from OptimaLab35 import __version__ + +from .ui import resources_rc +from .ui.preview_window import Ui_Preview_Window + +from PySide6 import QtWidgets, QtCore + +from PySide6.QtCore import ( + QRunnable, + QThreadPool, + Signal, + QObject, + QRegularExpression, + Qt, + QTimer, + Slot +) + +from PySide6.QtWidgets import ( + QMessageBox, + QApplication, + QMainWindow, + QFileDialog +) + +from PySide6.QtGui import QPixmap, QRegularExpressionValidator, QIcon + +class PreviewWindow(QMainWindow, Ui_Preview_Window): + values_selected = Signal(int, int, bool) + # Large ChatGPT with rewrite and bug fixes from me. + + def __init__(self): + super(PreviewWindow, self).__init__() + self.ui = Ui_Preview_Window() + self.ui.setupUi(self) + self.o = OptimaManager() + self.threadpool = QThreadPool() # Thread pool for managing worker threads + self.setWindowIcon(QIcon(":app-icon.png")) + self.ui.QLabel.setAlignment(Qt.AlignCenter) + + # UI interactions + self.ui.load_Button.clicked.connect(self.browse_file) + self.ui.update_Button.clicked.connect(self.update_preview) + self.ui.close_Button.clicked.connect(self.close_window) + + self.ui.reset_brightness_Button.clicked.connect(lambda: self.ui.brightness_spinBox.setValue(0)) + self.ui.reset_contrast_Button.clicked.connect(lambda: self.ui.contrast_spinBox.setValue(0)) + + # Connect UI elements to `on_ui_change` + self.ui.brightness_spinBox.valueChanged.connect(self.on_ui_change) # brightness slider changes spinbox value, do not need an event for the slider + self.ui.contrast_spinBox.valueChanged.connect(self.on_ui_change) # contrast slider changes spinbox value, do not need an event for the slider + self.ui.grayscale_checkBox.stateChanged.connect(self.on_ui_change) + self.ui_elements(False) + self.ui.show_OG_Button.pressed.connect(self.show_OG_image) + self.ui.show_OG_Button.released.connect(self.update_preview) + + def on_ui_change(self): + """Triggers update only if live update is enabled.""" + if self.ui.live_update.isChecked(): + self.update_preview() + + def browse_file(self): + file = QFileDialog.getOpenFileName(self, caption="Select File", filter="Images (*.png *.webp *.jpg *.jpeg)") + if file[0]: + self.ui.image_path_lineEdit.setText(file[0]) + self.update_preview() + self.ui_elements(True) + + def show_OG_image(self): + """Handles loading and displaying the image in a separate thread.""" + path = self.ui.image_path_lineEdit.text() + + worker = ImageProcessorWorker( + path = path, + optima_manager = self.o, + brightness = 0, + contrast = 0, + grayscale = False, + resize = self.ui.scale_Slider.value(), + callback = self.display_image # Callback to update UI + ) + self.threadpool.start(worker) + + def ui_elements(self, state): + self.ui.groupBox_2.setEnabled(state) + self.ui.groupBox.setEnabled(state) + self.ui.groupBox_5.setEnabled(state) + self.ui.show_OG_Button.setEnabled(state) + + def update_preview(self): + """Handles loading and displaying the image in a separate thread.""" + path = self.ui.image_path_lineEdit.text() + + worker = ImageProcessorWorker( + path = path, + optima_manager = self.o, + brightness = int(self.ui.brightness_spinBox.text()), + contrast = int(self.ui.contrast_spinBox.text()), + grayscale = self.ui.grayscale_checkBox.isChecked(), + resize = self.ui.scale_Slider.value(), + callback = self.display_image # Callback to update UI + ) + self.threadpool.start(worker) # Run worker in a thread + + def display_image(self, pixmap): + """Adjusts the image to fit within the QLabel.""" + if pixmap is None: + QMessageBox.warning(self, "Warning", "Error processing image...") + return + + max_size = self.ui.QLabel.size() + scaled_pixmap = pixmap.scaled(max_size, Qt.KeepAspectRatio, Qt.SmoothTransformation) + self.ui.QLabel.setPixmap(scaled_pixmap) + self.ui.QLabel.resize(scaled_pixmap.size()) + + def resizeEvent(self, event): + """Triggered when the preview window is resized.""" + file_path = self.ui.image_path_lineEdit.text() + if os.path.exists(file_path): + self.update_preview() # Re-process and display the image + super().resizeEvent(event) # Keep the default behavior + + def close_window(self): + """Emits signal and closes the window.""" + if self.ui.checkBox.isChecked(): + self.values_selected.emit(self.ui.brightness_spinBox.value(), self.ui.contrast_spinBox.value(), self.ui.grayscale_checkBox.isChecked()) + self.close() + +class ImageProcessorWorker(QRunnable): + """Worker class to load and process the image in a separate thread.""" + # ChatGPT + def __init__(self, path, optima_manager, brightness, contrast, grayscale, resize, callback): + super().__init__() + self.path = path + self.optima_manager = optima_manager + self.brightness = brightness + self.contrast = contrast + self.grayscale = grayscale + self.resize = resize + self.callback = callback # Function to call when processing is done + + @Slot() + def run(self): + """Runs the image processing in a separate thread.""" + if not os.path.isfile(self.path): + self.callback(None) + return + + try: + img = self.optima_manager.process_image_object( + image_input_file = self.path, + watermark = f"PREVIEW B:{self.brightness} C:{self.contrast}", + font_size = 1, + resize = self.resize, + grayscale = self.grayscale, + brightness = self.brightness, + contrast = self.contrast + ) + pixmap = QPixmap.fromImage(img) + self.callback(pixmap) + except Exception as e: + print(f"Error processing image: {e}") + self.callback(None) diff --git a/src/OptimaLab35/settingsWindow.py b/src/OptimaLab35/settingsWindow.py new file mode 100644 index 0000000..ffbd263 --- /dev/null +++ b/src/OptimaLab35/settingsWindow.py @@ -0,0 +1,357 @@ +import sys +import os +from datetime import datetime +from PyPiUpdater import PyPiUpdater + +from OptimaLab35 import __version__ +from .const import ( + CONFIG_BASE_PATH +) + +from .ui import resources_rc +from .utils.utility import Utilities +from .ui.settings_window import Ui_Settings_Window + +from PySide6 import QtWidgets, QtCore + +from PySide6.QtCore import ( + QRegularExpression, + Qt, + QTimer +) + +from PySide6.QtWidgets import ( + QMessageBox, + QApplication, + QMainWindow +) + +from PySide6.QtGui import QIcon + +class SettingsWindow(QMainWindow, Ui_Settings_Window): + # Mixture of code by me, code/functions refactored by ChatGPT and code directly from ChatGPT + def __init__(self, optimalab35_localversion, optima35_localversion): + super(SettingsWindow, self).__init__() + self.ui = Ui_Settings_Window() + self.ui.setupUi(self) + self.u = Utilities(os.path.expanduser(CONFIG_BASE_PATH)) + self.app_settings = self.u.load_settings() + self.dev_mode = True if optimalab35_localversion == "0.0.1" else False + self.setWindowIcon(QIcon(":app-icon.png")) + + # Update log file location + self.update_log_file = os.path.expanduser(f"{CONFIG_BASE_PATH}/update_log.json") + # Store local versions + self.optimalab35_localversion = optimalab35_localversion + self.optima35_localversion = optima35_localversion + # Create PyPiUpdater instances + self.ppu_ol35 = PyPiUpdater("OptimaLab35", self.optimalab35_localversion, self.update_log_file) + self.ppu_o35 = PyPiUpdater("optima35", self.optima35_localversion, self.update_log_file) + self.ol35_last_state = self.ppu_ol35.get_last_state() + self.o35_last_state = self.ppu_o35.get_last_state() + # Track which packages need an update + self.updates_available = {"OptimaLab35": False, "optima35": False} + self.define_gui_interaction() + + def define_gui_interaction(self): + """Setup UI interactions.""" + # Updater related + self.ui.label_optimalab35_localversion.setText(self.optimalab35_localversion) + self.ui.label_optima35_localversion.setText(self.optima35_localversion) + + self.ui.label_latest_version.setText("Latest version") + self.ui.label_optimalab35_latestversion.setText("...") + self.ui.label_optima35_latestversion.setText("...") + + self.ui.update_and_restart_Button.setEnabled(False) + + # Connect buttons to functions + self.ui.check_for_update_Button.clicked.connect(self.check_for_updates) + self.ui.update_and_restart_Button.clicked.connect(self.update_and_restart) + self.ui.label_last_check.setText(f"Last check: {self.time_to_string(self.ol35_last_state[0])}") + self.ui.dev_widget.setVisible(False) + + # Timer for long press detection + self.timer = QTimer() + self.timer.setSingleShot(True) + self.timer.timeout.connect(self.toggle_dev_ui) + + # Connect button press/release + self.ui.check_for_update_Button.pressed.connect(self.start_long_press) + self.ui.check_for_update_Button.released.connect(self.cancel_long_press) + self.ui.label_5.setText('
  • Changelog
  • ') + self.ui.label_5.setOpenExternalLinks(True) + #settings related + self.load_settings_into_ui() + self.ui.reset_exif_Button.clicked.connect(self.ask_reset_exif) + self.ui.save_and_close_Button.clicked.connect(self.save_and_close) + self.ui.save_and_restart_Button.clicked.connect(self.save_and_restart) + + if os.name == "nt": # Disable restart app when windows. + self.ui.save_and_restart_Button.setVisible(False) + self.ui.restart_checkBox.setChecked(False) + self.ui.restart_checkBox.setVisible(False) + +# setting related + def load_settings_into_ui(self): + """Loads the settings into the UI elements.""" + settings = self.app_settings + theme_mode = settings["theme"]["mode"] + use_custom_theme = settings["theme"]["use_custom_theme"] + pkg_available = settings["theme"]["theme_pkg"] + + if pkg_available: + index = self.ui.theme_selection_comboBox.findText(theme_mode, QtCore.Qt.MatchFlag.MatchExactly) + if index != -1: + self.ui.theme_selection_comboBox.setCurrentIndex(index) + self.ui.enable_theme_checkBox.setChecked(use_custom_theme) + self.ui.install_pkg_Button.setVisible(False) + self.ui.enable_theme_checkBox.setEnabled(True) + else: + self.ui.enable_theme_checkBox.setEnabled(False) + self.ui.install_pkg_Button.clicked.connect(self.install_theme_pkg) + + def install_theme_pkg(self): + a = self.ppu_ol35.install_package("PyQtDarkTheme-fork") + self.ui.install_pkg_Button.setEnabled(False) + self.ui.install_pkg_Button.setText("Please wait...") + + msg_box = QMessageBox() + msg_box.setIcon(QMessageBox.Information) + msg_box.setWindowTitle("Message") + msg_box.setText(a[1]) + msg_box.setStandardButtons(QMessageBox.Ok) + msg_box.exec() + if a[0]: + self.app_settings["theme"]["theme_pkg"] = True + self.load_settings_into_ui() + else: + self.ui.install_pkg_Button.setEnabled(True) + self.ui.install_pkg_Button.setText("Try again?") + + def save_settings(self): + self.app_settings["theme"]["mode"] = self.ui.theme_selection_comboBox.currentText() + self.app_settings["theme"]["use_custom_theme"] = self.ui.enable_theme_checkBox.isChecked() + self.u.save_settings(self.app_settings) + + def save_and_close(self): + self.save_settings() + self.close() + + def save_and_restart(self): + msg = QMessageBox() + msg.setIcon(QMessageBox.Icon.Question) + msg.setWindowTitle("Confirm Reset") + msg.setText("Are you sure you want to restart the app?") + msg.setStandardButtons(QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No) + + # Show the message box and wait for the user's response + response = msg.exec() + + # Check response and perform action + if response == QMessageBox.StandardButton.Yes: + self.save_settings() + self.restart_program() + else: + pass # Do nothing if "No" is selected + + def ask_reset_exif(self): + """Shows a dialog to ask the user if they are sure about resetting EXIF options to default.""" + # Create a QMessageBox with a Yes/No question + msg = QMessageBox() + msg.setIcon(QMessageBox.Icon.Question) + msg.setWindowTitle("Confirm Reset") + msg.setText("Are you sure you want to reset the EXIF options to default?") + msg.setStandardButtons(QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No) + + # Show the message box and wait for the user's response + response = msg.exec() + + # Check response and perform action + if response == QMessageBox.StandardButton.Yes: + self.u.default_exif() # Reset EXIF options to default + else: + pass # Do nothing if "No" is selected + +# update related parts + def start_long_press(self): + """Start the timer when button is pressed.""" + # brave AI + self.timer.start(1000) # 1-second long press + + def cancel_long_press(self): + """Cancel long press if released early.""" + # brave AI + self.timer.stop() + + def toggle_dev_ui(self): + """Show or hide the hidden UI when long press is detected.""" + self.ui.dev_widget.setVisible(True) + + self.ui.check_local_Button.clicked.connect(self.local_check_for_updates) + self.ui.update_local_Button.clicked.connect(self.local_update) + + def local_check_for_updates(self): + dist_folder = os.path.expanduser("~/.config/OptimaLab35/dist/") + self.ui.label_optimalab35_latestversion.setText("Checking...") + self.ui.label_optima35_latestversion.setText("Checking...") + + # Check OptimaLab35 update + ol35_pkg_info = self.ppu_ol35.check_update_local(dist_folder) + if ol35_pkg_info[0] is None: + self.ui.label_optimalab35_latestversion.setText(ol35_pkg_info[1][0:13]) + else: + self.ui.label_optimalab35_latestversion.setText(ol35_pkg_info[1]) + self.updates_available["OptimaLab35"] = ol35_pkg_info[0] + + # Check optima35 update + o35_pkg_info = self.ppu_o35.check_update_local(dist_folder) + if o35_pkg_info[0] is None: + self.ui.label_optima35_latestversion.setText(o35_pkg_info[1][0:13]) + else: + self.ui.label_optima35_latestversion.setText(o35_pkg_info[1]) + self.updates_available["optima35"] = o35_pkg_info[0] + + def local_update(self): + dist_folder = os.path.expanduser("~/.config/OptimaLab35/dist/") + packages_to_update = [pkg for pkg, update in self.updates_available.items() if update] + + if not packages_to_update: + QMessageBox.information(self, "Update", "No updates available.") + return + + # Confirm update + msg = QMessageBox() + msg.setWindowTitle("Update Available") + message = f"Updating: {', '.join(packages_to_update)}\nUpdate " + + if self.ui.restart_checkBox.isChecked(): + message = message + "and restart app?" + else: + message = message + "app?" + + msg.setText(message) + msg.setStandardButtons(QMessageBox.Yes | QMessageBox.No) + result = msg.exec() + + if result == QMessageBox.Yes: + update_results = [] # Store results + + for package in packages_to_update: + if package == "OptimaLab35": + pkg_info = self.ppu_ol35.update_from_local(dist_folder) + elif package == "optima35": + pkg_info = self.ppu_o35.update_from_local(dist_folder) + + update_results.append(f"{package}: {'Success' if pkg_info[0] else 'Failed'}\n{pkg_info[1]}") + + # Show summary of updates + # Show update completion message + msg = QMessageBox() + msg.setWindowTitle("Update Complete") + msg.setText("\n\n".join(update_results)) + msg.setStandardButtons(QMessageBox.Ok) + msg.exec() + + # Restart the application after user clicks "OK" + if self.ui.restart_checkBox.isChecked(): + self.restart_program() + + def time_to_string(self, time_time): + try: + dt_obj = datetime.fromtimestamp(time_time) + date_string = dt_obj.strftime("%d %h %H:%M") + return date_string + except TypeError: + return "Missing information" + + def check_for_updates(self): + """Check for updates and update the UI.""" + self.ui.check_for_update_Button.setEnabled(False) + self.ui.label_optimalab35_latestversion.setText("Checking...") + self.ui.label_optima35_latestversion.setText("Checking...") + + # Check OptimaLab35 update + ol35_pkg_info = self.ppu_ol35.check_for_update() + if ol35_pkg_info[0] is None: + self.ui.label_optimalab35_latestversion.setText(ol35_pkg_info[1][0:13]) + else: + self.ui.label_optimalab35_latestversion.setText(ol35_pkg_info[1]) + self.updates_available["OptimaLab35"] = ol35_pkg_info[0] + + # Check optima35 update + o35_pkg_info = self.ppu_o35.check_for_update() + if o35_pkg_info[0] is None: + self.ui.label_optima35_latestversion.setText(o35_pkg_info[1][0:13]) + else: + self.ui.label_optima35_latestversion.setText(o35_pkg_info[1]) + self.updates_available["optima35"] = o35_pkg_info[0] + + # Enable update button if any update is available + if any(self.updates_available.values()): + if self.dev_mode: + self.ui.update_and_restart_Button.setEnabled(False) + self.ui.update_and_restart_Button.setText("Update disabled") + else: + self.ui.update_and_restart_Button.setEnabled(True) + + last_date = self.time_to_string(self.ppu_ol35.get_last_state()[0]) + self.ui.label_last_check.setText(f"Last check: {last_date}") + self.ui.label_latest_version.setText("Online version") + self.ui.check_for_update_Button.setEnabled(True) + + def update_and_restart(self): + """Update selected packages and restart the application.""" + packages_to_update = [pkg for pkg, update in self.updates_available.items() if update] + + if not packages_to_update: + QMessageBox.information(self, "Update", "No updates available.") + return + + # Confirm update + msg = QMessageBox() + msg.setWindowTitle("Update Available") + message = f"Updating: {', '.join(packages_to_update)}\nUpdate " + + if self.ui.restart_checkBox.isChecked(): + message = message + "and restart app?" + else: + message = message + "app?" + + msg.setText(message) + msg.setStandardButtons(QMessageBox.Yes | QMessageBox.No) + result = msg.exec() + + if result == QMessageBox.Yes: + update_results = [] # Store results + + for package in packages_to_update: + if package == "OptimaLab35": + pkg_info = self.ppu_ol35.update_package() + elif package == "optima35": + pkg_info = self.ppu_o35.update_package() + + update_results.append(f"{package}: {'Success' if pkg_info[0] else 'Failed'}\n{pkg_info[1]}") + + # Show summary of updates + # Show update completion message + msg = QMessageBox() + msg.setWindowTitle("Update Complete") + msg.setText("\n\n".join(update_results)) + msg.setStandardButtons(QMessageBox.Ok) + msg.exec() + + # Restart the application after user clicks "OK" + if self.ui.restart_checkBox.isChecked(): + self.restart_program() + + def restart_program(self): + """Restart the Python program after an update.""" + print("Restarting the application...") + # Close all running Qt windows before restarting + app = QApplication.instance() + if app: + app.quit() + + python = sys.executable + os.execl(python, python, *sys.argv) diff --git a/src/OptimaLab35/ui/main_window.py b/src/OptimaLab35/ui/main_window.py index d19d062..38191e5 100644 --- a/src/OptimaLab35/ui/main_window.py +++ b/src/OptimaLab35/ui/main_window.py @@ -3,7 +3,7 @@ ################################################################################ ## Form generated from reading UI file 'main_window.ui' ## -## Created by: Qt User Interface Compiler version 6.8.1 +## Created by: Qt User Interface Compiler version 6.8.2 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ @@ -17,40 +17,40 @@ from PySide6.QtGui import (QAction, QBrush, QColor, QConicalGradient, QPainter, QPalette, QPixmap, QRadialGradient, QTransform) from PySide6.QtWidgets import (QApplication, QCheckBox, QComboBox, QDateEdit, - QFrame, QGridLayout, QGroupBox, QHBoxLayout, - QLabel, QLineEdit, QMainWindow, QMenu, - QMenuBar, QProgressBar, QPushButton, QSizePolicy, - QSlider, QSpinBox, QStatusBar, QTabWidget, - QVBoxLayout, QWidget) + QGridLayout, QGroupBox, QHBoxLayout, QLabel, + QLineEdit, QMainWindow, QMenu, QMenuBar, + QProgressBar, QPushButton, QSizePolicy, QSlider, + QSpinBox, QStatusBar, QTabWidget, QVBoxLayout, + QWidget) class Ui_MainWindow(object): def setupUi(self, MainWindow): if not MainWindow.objectName(): MainWindow.setObjectName(u"MainWindow") - MainWindow.setWindowModality(Qt.NonModal) - MainWindow.resize(440, 756) + MainWindow.setWindowModality(Qt.WindowModality.NonModal) + MainWindow.resize(450, 720) MainWindow.setMinimumSize(QSize(350, 677)) - MainWindow.setMaximumSize(QSize(1000, 1000)) + MainWindow.setMaximumSize(QSize(450, 1000)) self.actionInfo = QAction(MainWindow) self.actionInfo.setObjectName(u"actionInfo") self.actionPreview = QAction(MainWindow) self.actionPreview.setObjectName(u"actionPreview") self.actionAbout = QAction(MainWindow) self.actionAbout.setObjectName(u"actionAbout") - self.actionUpdate = QAction(MainWindow) - self.actionUpdate.setObjectName(u"actionUpdate") + self.actionSettings = QAction(MainWindow) + self.actionSettings.setObjectName(u"actionSettings") self.centralwidget = QWidget(MainWindow) self.centralwidget.setObjectName(u"centralwidget") self.gridLayout = QGridLayout(self.centralwidget) self.gridLayout.setObjectName(u"gridLayout") self.tabWidget = QTabWidget(self.centralwidget) self.tabWidget.setObjectName(u"tabWidget") - self.tabWidget.setMaximumSize(QSize(500, 16777215)) + self.tabWidget.setMaximumSize(QSize(420, 16777215)) self.tab_1 = QWidget() self.tab_1.setObjectName(u"tab_1") self.verticalLayout_10 = QVBoxLayout(self.tab_1) self.verticalLayout_10.setObjectName(u"verticalLayout_10") - self.folder_group = QFrame(self.tab_1) + self.folder_group = QGroupBox(self.tab_1) self.folder_group.setObjectName(u"folder_group") self.folder_group.setMaximumSize(QSize(400, 16777215)) self.gridLayout_5 = QGridLayout(self.folder_group) @@ -115,7 +115,8 @@ class Ui_MainWindow(object): self.png_quality_Slider.setMaximum(9) self.png_quality_Slider.setPageStep(1) self.png_quality_Slider.setSliderPosition(6) - self.png_quality_Slider.setOrientation(Qt.Horizontal) + self.png_quality_Slider.setOrientation(Qt.Orientation.Horizontal) + self.png_quality_Slider.setTickPosition(QSlider.TickPosition.TicksBothSides) self.gridLayout_4.addWidget(self.png_quality_Slider, 4, 2, 1, 1) @@ -146,7 +147,8 @@ class Ui_MainWindow(object): self.jpg_quality_Slider.setMinimum(1) self.jpg_quality_Slider.setMaximum(100) self.jpg_quality_Slider.setSliderPosition(90) - self.jpg_quality_Slider.setOrientation(Qt.Horizontal) + self.jpg_quality_Slider.setOrientation(Qt.Orientation.Horizontal) + self.jpg_quality_Slider.setTickPosition(QSlider.TickPosition.TicksBothSides) self.gridLayout_4.addWidget(self.jpg_quality_Slider, 3, 2, 1, 1) @@ -160,7 +162,8 @@ class Ui_MainWindow(object): self.resize_Slider.setMinimum(1) self.resize_Slider.setMaximum(200) self.resize_Slider.setValue(100) - self.resize_Slider.setOrientation(Qt.Horizontal) + self.resize_Slider.setOrientation(Qt.Orientation.Horizontal) + self.resize_Slider.setTickPosition(QSlider.TickPosition.TicksBothSides) self.gridLayout_4.addWidget(self.resize_Slider, 5, 2, 1, 1) @@ -192,7 +195,8 @@ class Ui_MainWindow(object): self.brightness_horizontalSlider.setObjectName(u"brightness_horizontalSlider") self.brightness_horizontalSlider.setMinimum(-100) self.brightness_horizontalSlider.setMaximum(100) - self.brightness_horizontalSlider.setOrientation(Qt.Horizontal) + self.brightness_horizontalSlider.setOrientation(Qt.Orientation.Horizontal) + self.brightness_horizontalSlider.setTickPosition(QSlider.TickPosition.TicksBothSides) self.gridLayout_3.addWidget(self.brightness_horizontalSlider, 1, 1, 1, 1) @@ -223,7 +227,8 @@ class Ui_MainWindow(object): self.contrast_horizontalSlider.setObjectName(u"contrast_horizontalSlider") self.contrast_horizontalSlider.setMinimum(-100) self.contrast_horizontalSlider.setMaximum(100) - self.contrast_horizontalSlider.setOrientation(Qt.Horizontal) + self.contrast_horizontalSlider.setOrientation(Qt.Orientation.Horizontal) + self.contrast_horizontalSlider.setTickPosition(QSlider.TickPosition.TicksBelow) self.gridLayout_3.addWidget(self.contrast_horizontalSlider, 4, 1, 1, 1) @@ -243,6 +248,7 @@ class Ui_MainWindow(object): self.groupBox_3 = QGroupBox(self.tab_1) self.groupBox_3.setObjectName(u"groupBox_3") self.groupBox_3.setEnabled(True) + self.groupBox_3.setMaximumSize(QSize(400, 16777215)) self.groupBox_3.setFlat(False) self.groupBox_3.setCheckable(False) self.groupBox_3.setChecked(False) @@ -537,7 +543,7 @@ class Ui_MainWindow(object): self.dateEdit = QDateEdit(self.date_groupBox) self.dateEdit.setObjectName(u"dateEdit") self.dateEdit.setEnabled(False) - self.dateEdit.setDateTime(QDateTime(QDate(2025, 1, 1), QTime(0, 0, 0))) + self.dateEdit.setDateTime(QDateTime(QDate(2024, 12, 31), QTime(22, 0, 0))) self.dateEdit.setMaximumDate(QDate(2038, 12, 31)) self.dateEdit.setMinimumDate(QDate(1970, 1, 1)) self.dateEdit.setCalendarPopup(True) @@ -557,7 +563,7 @@ class Ui_MainWindow(object): MainWindow.setStatusBar(self.statusBar) self.menuBar = QMenuBar(MainWindow) self.menuBar.setObjectName(u"menuBar") - self.menuBar.setGeometry(QRect(0, 0, 440, 27)) + self.menuBar.setGeometry(QRect(0, 0, 450, 19)) self.menuHelp = QMenu(self.menuBar) self.menuHelp.setObjectName(u"menuHelp") self.menuSettings = QMenu(self.menuBar) @@ -567,7 +573,7 @@ class Ui_MainWindow(object): self.menuBar.addAction(self.menuSettings.menuAction()) self.menuBar.addAction(self.menuHelp.menuAction()) self.menuHelp.addAction(self.actionAbout) - self.menuSettings.addAction(self.actionUpdate) + self.menuSettings.addAction(self.actionSettings) self.retranslateUi(MainWindow) self.rename_checkbox.toggled.connect(self.filename.setEnabled) @@ -605,7 +611,8 @@ class Ui_MainWindow(object): self.actionInfo.setText(QCoreApplication.translate("MainWindow", u"About", None)) self.actionPreview.setText(QCoreApplication.translate("MainWindow", u"Preview image", None)) self.actionAbout.setText(QCoreApplication.translate("MainWindow", u"About", None)) - self.actionUpdate.setText(QCoreApplication.translate("MainWindow", u"Update", None)) + self.actionSettings.setText(QCoreApplication.translate("MainWindow", u"Preferences...", None)) + self.folder_group.setTitle(QCoreApplication.translate("MainWindow", u"File selection", None)) #if QT_CONFIG(tooltip) self.input_folder_button.setToolTip(QCoreApplication.translate("MainWindow", u"Open a file browser to select a folder for loading images.", None)) #endif // QT_CONFIG(tooltip) diff --git a/src/OptimaLab35/ui/main_window.ui b/src/OptimaLab35/ui/main_window.ui index 57986b7..6b87b83 100644 --- a/src/OptimaLab35/ui/main_window.ui +++ b/src/OptimaLab35/ui/main_window.ui @@ -3,14 +3,14 @@ MainWindow - Qt::NonModal + Qt::WindowModality::NonModal 0 0 - 440 - 756 + 450 + 720 @@ -21,7 +21,7 @@ - 1000 + 450 1000 @@ -34,7 +34,7 @@ - 500 + 420 16777215 @@ -47,13 +47,16 @@ - + 400 16777215 + + File selection + @@ -183,7 +186,10 @@ 6 - Qt::Horizontal + Qt::Orientation::Horizontal + + + QSlider::TickPosition::TicksBothSides @@ -244,7 +250,10 @@ 90 - Qt::Horizontal + Qt::Orientation::Horizontal + + + QSlider::TickPosition::TicksBothSides @@ -273,7 +282,10 @@ 100 - Qt::Horizontal + Qt::Orientation::Horizontal + + + QSlider::TickPosition::TicksBothSides @@ -333,7 +345,10 @@ 100 - Qt::Horizontal + Qt::Orientation::Horizontal + + + QSlider::TickPosition::TicksBothSides @@ -385,7 +400,10 @@ 100 - Qt::Horizontal + Qt::Orientation::Horizontal + + + QSlider::TickPosition::TicksBelow @@ -417,6 +435,12 @@ true + + + 400 + 16777215 + + Watermarking @@ -872,12 +896,12 @@ - 0 + 22 0 0 - 2025 - 1 - 1 + 2024 + 12 + 31 @@ -914,8 +938,8 @@ 0 0 - 440 - 27 + 450 + 19 @@ -928,7 +952,7 @@ Settings - + @@ -948,9 +972,9 @@ About - + - Update + Preferences... diff --git a/src/OptimaLab35/ui/preview_window.py b/src/OptimaLab35/ui/preview_window.py index 5d2a021..5caf68c 100644 --- a/src/OptimaLab35/ui/preview_window.py +++ b/src/OptimaLab35/ui/preview_window.py @@ -3,7 +3,7 @@ ################################################################################ ## Form generated from reading UI file 'preview_window.ui' ## -## Created by: Qt User Interface Compiler version 6.8.1 +## Created by: Qt User Interface Compiler version 6.8.2 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ @@ -15,16 +15,17 @@ from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, QFont, QFontDatabase, QGradient, QIcon, QImage, QKeySequence, QLinearGradient, QPainter, QPalette, QPixmap, QRadialGradient, QTransform) -from PySide6.QtWidgets import (QApplication, QCheckBox, QFrame, QHBoxLayout, - QLabel, QLineEdit, QMainWindow, QMenuBar, - QPushButton, QSizePolicy, QSlider, QSpinBox, - QVBoxLayout, QWidget) +from PySide6.QtWidgets import (QApplication, QCheckBox, QFrame, QGridLayout, + QGroupBox, QHBoxLayout, QLabel, QLineEdit, + QMainWindow, QMenuBar, QPushButton, QSizePolicy, + QSlider, QSpacerItem, QSpinBox, QVBoxLayout, + QWidget) class Ui_Preview_Window(object): def setupUi(self, Preview_Window): if not Preview_Window.objectName(): Preview_Window.setObjectName(u"Preview_Window") - Preview_Window.resize(803, 775) + Preview_Window.resize(875, 775) Preview_Window.setMinimumSize(QSize(800, 700)) self.centralwidget = QWidget(Preview_Window) self.centralwidget.setObjectName(u"centralwidget") @@ -33,127 +34,175 @@ class Ui_Preview_Window(object): self.QLabel = QLabel(self.centralwidget) self.QLabel.setObjectName(u"QLabel") self.QLabel.setMinimumSize(QSize(628, 628)) - self.QLabel.setFrameShape(QFrame.Box) + self.QLabel.setFrameShape(QFrame.Shape.Box) self.QLabel.setScaledContents(False) self.horizontalLayout.addWidget(self.QLabel) self.widget = QWidget(self.centralwidget) self.widget.setObjectName(u"widget") - self.widget.setMinimumSize(QSize(150, 628)) - self.widget.setMaximumSize(QSize(150, 16777215)) + self.widget.setMinimumSize(QSize(160, 628)) + self.widget.setMaximumSize(QSize(180, 16777215)) self.verticalLayout_4 = QVBoxLayout(self.widget) self.verticalLayout_4.setObjectName(u"verticalLayout_4") - self.image_path_lineEdit = QLineEdit(self.widget) + self.groupBox_3 = QGroupBox(self.widget) + self.groupBox_3.setObjectName(u"groupBox_3") + self.verticalLayout_3 = QVBoxLayout(self.groupBox_3) + self.verticalLayout_3.setObjectName(u"verticalLayout_3") + self.image_path_lineEdit = QLineEdit(self.groupBox_3) self.image_path_lineEdit.setObjectName(u"image_path_lineEdit") + self.image_path_lineEdit.setEnabled(False) - self.verticalLayout_4.addWidget(self.image_path_lineEdit) + self.verticalLayout_3.addWidget(self.image_path_lineEdit) - self.load_Button = QPushButton(self.widget) + self.load_Button = QPushButton(self.groupBox_3) self.load_Button.setObjectName(u"load_Button") - self.verticalLayout_4.addWidget(self.load_Button) + self.verticalLayout_3.addWidget(self.load_Button) - self.widget_2 = QWidget(self.widget) - self.widget_2.setObjectName(u"widget_2") - self.widget_2.setMinimumSize(QSize(0, 250)) - self.widget_2.setMaximumSize(QSize(16777215, 250)) - self.verticalLayout = QVBoxLayout(self.widget_2) + + self.verticalLayout_4.addWidget(self.groupBox_3) + + self.groupBox_2 = QGroupBox(self.widget) + self.groupBox_2.setObjectName(u"groupBox_2") + self.verticalLayout = QVBoxLayout(self.groupBox_2) self.verticalLayout.setObjectName(u"verticalLayout") - self.label = QLabel(self.widget_2) - self.label.setObjectName(u"label") - - self.verticalLayout.addWidget(self.label) - - self.brightness_spinBox = QSpinBox(self.widget_2) + self.brightness_spinBox = QSpinBox(self.groupBox_2) self.brightness_spinBox.setObjectName(u"brightness_spinBox") self.brightness_spinBox.setMinimum(-100) self.brightness_spinBox.setMaximum(100) self.verticalLayout.addWidget(self.brightness_spinBox) - self.brightness_Slider = QSlider(self.widget_2) + self.brightness_Slider = QSlider(self.groupBox_2) self.brightness_Slider.setObjectName(u"brightness_Slider") self.brightness_Slider.setMinimum(-100) self.brightness_Slider.setMaximum(100) - self.brightness_Slider.setOrientation(Qt.Horizontal) + self.brightness_Slider.setOrientation(Qt.Orientation.Horizontal) + self.brightness_Slider.setTickPosition(QSlider.TickPosition.TicksBothSides) self.verticalLayout.addWidget(self.brightness_Slider) - self.reset_brightness_Button = QPushButton(self.widget_2) + self.reset_brightness_Button = QPushButton(self.groupBox_2) self.reset_brightness_Button.setObjectName(u"reset_brightness_Button") self.verticalLayout.addWidget(self.reset_brightness_Button) - self.contrast_Slider = QSlider(self.widget_2) - self.contrast_Slider.setObjectName(u"contrast_Slider") - self.contrast_Slider.setMinimum(-100) - self.contrast_Slider.setMaximum(100) - self.contrast_Slider.setOrientation(Qt.Horizontal) - self.verticalLayout.addWidget(self.contrast_Slider) + self.verticalLayout_4.addWidget(self.groupBox_2) - self.contrast_spinBox = QSpinBox(self.widget_2) + self.groupBox = QGroupBox(self.widget) + self.groupBox.setObjectName(u"groupBox") + self.verticalLayout_2 = QVBoxLayout(self.groupBox) + self.verticalLayout_2.setObjectName(u"verticalLayout_2") + self.contrast_spinBox = QSpinBox(self.groupBox) self.contrast_spinBox.setObjectName(u"contrast_spinBox") self.contrast_spinBox.setMinimum(-100) self.contrast_spinBox.setMaximum(100) - self.verticalLayout.addWidget(self.contrast_spinBox) + self.verticalLayout_2.addWidget(self.contrast_spinBox) - self.label_2 = QLabel(self.widget_2) - self.label_2.setObjectName(u"label_2") + self.contrast_Slider = QSlider(self.groupBox) + self.contrast_Slider.setObjectName(u"contrast_Slider") + self.contrast_Slider.setMinimum(-100) + self.contrast_Slider.setMaximum(100) + self.contrast_Slider.setOrientation(Qt.Orientation.Horizontal) + self.contrast_Slider.setTickPosition(QSlider.TickPosition.TicksBothSides) - self.verticalLayout.addWidget(self.label_2) + self.verticalLayout_2.addWidget(self.contrast_Slider) - self.reset_contrast_Button = QPushButton(self.widget_2) + self.reset_contrast_Button = QPushButton(self.groupBox) self.reset_contrast_Button.setObjectName(u"reset_contrast_Button") - self.verticalLayout.addWidget(self.reset_contrast_Button) + self.verticalLayout_2.addWidget(self.reset_contrast_Button) - self.grayscale_checkBox = QCheckBox(self.widget_2) + + self.verticalLayout_4.addWidget(self.groupBox) + + self.groupBox_5 = QGroupBox(self.widget) + self.groupBox_5.setObjectName(u"groupBox_5") + self.gridLayout = QGridLayout(self.groupBox_5) + self.gridLayout.setObjectName(u"gridLayout") + self.grayscale_checkBox = QCheckBox(self.groupBox_5) self.grayscale_checkBox.setObjectName(u"grayscale_checkBox") - self.verticalLayout.addWidget(self.grayscale_checkBox) + self.gridLayout.addWidget(self.grayscale_checkBox, 0, 0, 1, 1) - self.verticalLayout_4.addWidget(self.widget_2) + self.verticalLayout_4.addWidget(self.groupBox_5) - self.widget_5 = QWidget(self.widget) - self.widget_5.setObjectName(u"widget_5") - self.verticalLayout_2 = QVBoxLayout(self.widget_5) - self.verticalLayout_2.setObjectName(u"verticalLayout_2") + self.verticalSpacer = QSpacerItem(20, 219, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) - self.verticalLayout_4.addWidget(self.widget_5) + self.verticalLayout_4.addItem(self.verticalSpacer) - self.widget_4 = QWidget(self.widget) - self.widget_4.setObjectName(u"widget_4") - self.verticalLayout_3 = QVBoxLayout(self.widget_4) - self.verticalLayout_3.setObjectName(u"verticalLayout_3") - self.live_update = QCheckBox(self.widget_4) - self.live_update.setObjectName(u"live_update") + self.label = QLabel(self.widget) + self.label.setObjectName(u"label") + self.label.setLayoutDirection(Qt.LayoutDirection.LeftToRight) + self.label.setAutoFillBackground(False) + self.label.setAlignment(Qt.AlignmentFlag.AlignCenter) + self.label.setWordWrap(True) - self.verticalLayout_3.addWidget(self.live_update) + self.verticalLayout_4.addWidget(self.label) - self.update_Button = QPushButton(self.widget_4) - self.update_Button.setObjectName(u"update_Button") - self.update_Button.setAutoFillBackground(False) + self.show_OG_Button = QPushButton(self.widget) + self.show_OG_Button.setObjectName(u"show_OG_Button") - self.verticalLayout_3.addWidget(self.update_Button) + self.verticalLayout_4.addWidget(self.show_OG_Button) - self.checkBox = QCheckBox(self.widget_4) + self.groupBox_4 = QGroupBox(self.widget) + self.groupBox_4.setObjectName(u"groupBox_4") + self.groupBox_4.setMaximumSize(QSize(170, 16777215)) + self.gridLayout_2 = QGridLayout(self.groupBox_4) + self.gridLayout_2.setObjectName(u"gridLayout_2") + self.checkBox = QCheckBox(self.groupBox_4) self.checkBox.setObjectName(u"checkBox") - self.checkBox.setLayoutDirection(Qt.LeftToRight) + self.checkBox.setLayoutDirection(Qt.LayoutDirection.LeftToRight) self.checkBox.setChecked(True) - self.verticalLayout_3.addWidget(self.checkBox) + self.gridLayout_2.addWidget(self.checkBox, 3, 0, 1, 2) - self.close_Button = QPushButton(self.widget_4) + self.close_Button = QPushButton(self.groupBox_4) self.close_Button.setObjectName(u"close_Button") - self.verticalLayout_3.addWidget(self.close_Button) + self.gridLayout_2.addWidget(self.close_Button, 4, 0, 1, 2) + + self.live_update = QCheckBox(self.groupBox_4) + self.live_update.setObjectName(u"live_update") + font = QFont() + font.setPointSize(11) + self.live_update.setFont(font) + self.live_update.setChecked(True) + + self.gridLayout_2.addWidget(self.live_update, 0, 0, 1, 1) + + self.scale_Slider = QSlider(self.groupBox_4) + self.scale_Slider.setObjectName(u"scale_Slider") + self.scale_Slider.setMinimum(10) + self.scale_Slider.setMaximum(100) + self.scale_Slider.setPageStep(10) + self.scale_Slider.setValue(50) + self.scale_Slider.setOrientation(Qt.Orientation.Horizontal) + self.scale_Slider.setTickPosition(QSlider.TickPosition.TicksBothSides) + + self.gridLayout_2.addWidget(self.scale_Slider, 1, 0, 1, 2) + + self.update_Button = QPushButton(self.groupBox_4) + self.update_Button.setObjectName(u"update_Button") + self.update_Button.setEnabled(False) + self.update_Button.setAutoFillBackground(False) + + self.gridLayout_2.addWidget(self.update_Button, 2, 0, 1, 2) + + self.scale_label = QLabel(self.groupBox_4) + self.scale_label.setObjectName(u"scale_label") + font1 = QFont() + font1.setPointSize(9) + self.scale_label.setFont(font1) + + self.gridLayout_2.addWidget(self.scale_label, 0, 1, 1, 1) - self.verticalLayout_4.addWidget(self.widget_4) + self.verticalLayout_4.addWidget(self.groupBox_4) self.horizontalLayout.addWidget(self.widget) @@ -161,7 +210,7 @@ class Ui_Preview_Window(object): Preview_Window.setCentralWidget(self.centralwidget) self.menubar = QMenuBar(Preview_Window) self.menubar.setObjectName(u"menubar") - self.menubar.setGeometry(QRect(0, 0, 803, 27)) + self.menubar.setGeometry(QRect(0, 0, 875, 19)) Preview_Window.setMenuBar(self.menubar) self.retranslateUi(Preview_Window) @@ -169,6 +218,8 @@ class Ui_Preview_Window(object): self.brightness_spinBox.valueChanged.connect(self.brightness_Slider.setValue) self.contrast_Slider.valueChanged.connect(self.contrast_spinBox.setValue) self.contrast_spinBox.valueChanged.connect(self.contrast_Slider.setValue) + self.live_update.toggled.connect(self.update_Button.setDisabled) + self.scale_Slider.valueChanged.connect(self.scale_label.setNum) QMetaObject.connectSlotsByName(Preview_Window) # setupUi @@ -176,33 +227,30 @@ class Ui_Preview_Window(object): def retranslateUi(self, Preview_Window): Preview_Window.setWindowTitle(QCoreApplication.translate("Preview_Window", u"OptimaLab35 - Preview", None)) self.QLabel.setText("") + self.groupBox_3.setTitle(QCoreApplication.translate("Preview_Window", u"File", None)) #if QT_CONFIG(tooltip) self.image_path_lineEdit.setToolTip(QCoreApplication.translate("Preview_Window", u"Enter the path to the image file or use the 'Select Image' button to browse.", None)) #endif // QT_CONFIG(tooltip) self.image_path_lineEdit.setPlaceholderText(QCoreApplication.translate("Preview_Window", u"Image Path", None)) self.load_Button.setText(QCoreApplication.translate("Preview_Window", u"Select image", None)) - self.label.setText(QCoreApplication.translate("Preview_Window", u"Brightness", None)) + self.groupBox_2.setTitle(QCoreApplication.translate("Preview_Window", u"Brightness", None)) #if QT_CONFIG(tooltip) self.reset_brightness_Button.setToolTip(QCoreApplication.translate("Preview_Window", u"Click to reset the brightness to its default value (0).", None)) #endif // QT_CONFIG(tooltip) self.reset_brightness_Button.setText(QCoreApplication.translate("Preview_Window", u"Reset", None)) - self.label_2.setText(QCoreApplication.translate("Preview_Window", u"Contrast", None)) + self.groupBox.setTitle(QCoreApplication.translate("Preview_Window", u"Contrast", None)) #if QT_CONFIG(tooltip) self.reset_contrast_Button.setToolTip(QCoreApplication.translate("Preview_Window", u"Click to reset the contrast to its default value (0).", None)) #endif // QT_CONFIG(tooltip) self.reset_contrast_Button.setText(QCoreApplication.translate("Preview_Window", u"Reset", None)) + self.groupBox_5.setTitle(QCoreApplication.translate("Preview_Window", u"Grayscale", None)) #if QT_CONFIG(tooltip) self.grayscale_checkBox.setToolTip(QCoreApplication.translate("Preview_Window", u"Convert the image to grayscale (black and white).", None)) #endif // QT_CONFIG(tooltip) - self.grayscale_checkBox.setText(QCoreApplication.translate("Preview_Window", u"Black n White", None)) -#if QT_CONFIG(tooltip) - self.live_update.setToolTip(QCoreApplication.translate("Preview_Window", u"Enable live updates to immediately preview changes as you adjust brightness, contrast, or grayscale. Be aware that this might impact performance, especially with large images.", None)) -#endif // QT_CONFIG(tooltip) - self.live_update.setText(QCoreApplication.translate("Preview_Window", u"Live update", None)) -#if QT_CONFIG(tooltip) - self.update_Button.setToolTip(QCoreApplication.translate("Preview_Window", u"Apply Changes to Preview", None)) -#endif // QT_CONFIG(tooltip) - self.update_Button.setText(QCoreApplication.translate("Preview_Window", u"Update Preview", None)) + self.grayscale_checkBox.setText(QCoreApplication.translate("Preview_Window", u"Black and White", None)) + self.label.setText(QCoreApplication.translate("Preview_Window", u"Hold button to show original image", None)) + self.show_OG_Button.setText(QCoreApplication.translate("Preview_Window", u"Show", None)) + self.groupBox_4.setTitle(QCoreApplication.translate("Preview_Window", u"Behavior", None)) #if QT_CONFIG(tooltip) self.checkBox.setToolTip(QCoreApplication.translate("Preview_Window", u"Enable to copy adjustments to the main window upon closing", None)) #endif // QT_CONFIG(tooltip) @@ -211,5 +259,20 @@ class Ui_Preview_Window(object): self.close_Button.setToolTip("") #endif // QT_CONFIG(tooltip) self.close_Button.setText(QCoreApplication.translate("Preview_Window", u"Close", None)) +#if QT_CONFIG(tooltip) + self.live_update.setToolTip(QCoreApplication.translate("Preview_Window", u"Live update applies changes instantly. If the app becomes unresponsive or lags, disable this option.", None)) +#endif // QT_CONFIG(tooltip) + self.live_update.setText(QCoreApplication.translate("Preview_Window", u"Live refresh", None)) +#if QT_CONFIG(tooltip) + self.scale_Slider.setToolTip(QCoreApplication.translate("Preview_Window", u"Sets the resize value for the preview image. A high value may cause the application to freeze.", None)) +#endif // QT_CONFIG(tooltip) +#if QT_CONFIG(tooltip) + self.update_Button.setToolTip(QCoreApplication.translate("Preview_Window", u"Apply Changes to Preview", None)) +#endif // QT_CONFIG(tooltip) + self.update_Button.setText(QCoreApplication.translate("Preview_Window", u"Refresh image", None)) +#if QT_CONFIG(tooltip) + self.scale_label.setToolTip(QCoreApplication.translate("Preview_Window", u"Sets the resize value for the preview image. A high value may cause the application to freeze.", None)) +#endif // QT_CONFIG(tooltip) + self.scale_label.setText(QCoreApplication.translate("Preview_Window", u"50", None)) # retranslateUi diff --git a/src/OptimaLab35/ui/preview_window.ui b/src/OptimaLab35/ui/preview_window.ui index 33ad094..74b4cbb 100644 --- a/src/OptimaLab35/ui/preview_window.ui +++ b/src/OptimaLab35/ui/preview_window.ui @@ -6,7 +6,7 @@ 0 0 - 803 + 875 775 @@ -30,7 +30,7 @@ - QFrame::Box + QFrame::Shape::Box @@ -44,56 +44,52 @@ - 150 + 160 628 - 150 + 180 16777215 - - - Enter the path to the image file or use the 'Select Image' button to browse. + + + File - - Image Path - - - - - - - Select image - - - - - - - - 0 - 250 - - - - - 16777215 - 250 - - - + - - - Brightness + + + false + + + Enter the path to the image file or use the 'Select Image' button to browse. + + + Image Path + + + + Select image + + + + + + + + + + Brightness + + @@ -113,7 +109,10 @@ 100 - Qt::Horizontal + Qt::Orientation::Horizontal + + + QSlider::TickPosition::TicksBothSides @@ -127,19 +126,15 @@ - - - - -100 - - - 100 - - - Qt::Horizontal - - - + + + + + + + Contrast + + @@ -151,9 +146,18 @@ - - - Contrast + + + -100 + + + 100 + + + Qt::Orientation::Horizontal + + + QSlider::TickPosition::TicksBothSides @@ -167,13 +171,22 @@ - + + + + + + + Grayscale + + + Convert the image to grayscale (black and white). - Black n White + Black and White @@ -181,43 +194,63 @@ - - + + + Qt::Orientation::Vertical + + + + 20 + 219 + + + + + + + + Qt::LayoutDirection::LeftToRight + + + false + + + Hold button to show original image + + + Qt::AlignmentFlag::AlignCenter + + + true + - - - - - - Enable live updates to immediately preview changes as you adjust brightness, contrast, or grayscale. Be aware that this might impact performance, especially with large images. - - - Live update - - - - - - - Apply Changes to Preview - - - false - - - Update Preview - - - - + + + Show + + + + + + + + 170 + 16777215 + + + + Behavior + + + Enable to copy adjustments to the main window upon closing - Qt::LeftToRight + Qt::LayoutDirection::LeftToRight Copy Values @@ -227,7 +260,7 @@ - + @@ -237,6 +270,80 @@ + + + + + 11 + + + + Live update applies changes instantly. If the app becomes unresponsive or lags, disable this option. + + + Live refresh + + + true + + + + + + + Sets the resize value for the preview image. A high value may cause the application to freeze. + + + 10 + + + 100 + + + 10 + + + 50 + + + Qt::Orientation::Horizontal + + + QSlider::TickPosition::TicksBothSides + + + + + + + false + + + Apply Changes to Preview + + + false + + + Refresh image + + + + + + + + 9 + + + + Sets the resize value for the preview image. A high value may cause the application to freeze. + + + 50 + + + @@ -250,8 +357,8 @@ 0 0 - 803 - 27 + 875 + 19 @@ -322,5 +429,37 @@ + + live_update + toggled(bool) + update_Button + setDisabled(bool) + + + 785 + 624 + + + 785 + 659 + + + + + scale_Slider + valueChanged(int) + scale_label + setNum(int) + + + 783 + 644 + + + 831 + 619 + + + diff --git a/src/OptimaLab35/ui/resources_rc.py b/src/OptimaLab35/ui/resources_rc.py new file mode 100644 index 0000000..05fde9b --- /dev/null +++ b/src/OptimaLab35/ui/resources_rc.py @@ -0,0 +1,3187 @@ +# Resource object code (Python 3) +# Created by: object code +# Created by: The Resource Compiler for Qt version 6.8.1 +# WARNING! All changes made in this file will be lost! + +from PySide6 import QtCore + +qt_resource_data = b"\ +\x00\x00\xc5\x15\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x02\x00\x00\x00\x02\x00\x08\x06\x00\x00\x00\xf4x\xd4\xfa\ +\x00\x00\x01\x84iCCPICC prof\ +ile\x00\x00(\x91}\x91=H\xc3P\x14\x85O\ +SE\x91\x8aC;\x88\x88dh\x9d\xec\xa2\x22\x8e\xb5\ +\x0aE\xa8\x10j\x85V\x1dL^\xfa\x07M\x1a\x92\x14\ +\x17G\xc1\xb5\xe0\xe0\xcfb\xd5\xc1\xc5YW\x07WA\ +\x10\xfc\x01q\x17\x9c\x14]\xa4\xc4\xfb\x92B\x8b\x18/\ +<\xde\xc7y\xf7\x1c\xde\xbb\x0f\x10\x9aU\xa6Y=\x09\ +@\xd3m3\x93J\x8a\xb9\xfc\xaa\xd8\xf7\x8a\x00\xc6\x10\ +B\x181\x99Y\xc6\x9c$\xa5\xe1[_\xf7\xd4Mu\ +\x17\xe7Y\xfe}\x7f\xd6\xa0Z\xb0\x18\x10\x10\x89\x13\xcc\ +0m\xe2\x0d\xe2\x99M\xdb\xe0\xbcO\x1caeY%\ +>'\x9e0\xe9\x82\xc4\x8f\x5cW<~\xe3\x5crY\ +\xe0\x99\x113\x9b\x99'\x8e\x10\x8b\xa5.V\xba\x98\x95\ +M\x8dx\x9a8\xaaj:\xe5\x0b9\x8fU\xce[\x9c\ +\xb5j\x9d\xb5\xef\xc9_\x18*\xe8+\xcb\x5c\xa75\x8a\ +\x14\x16\xb1\x04\x09\x22\x14\xd4QA\x156\xe2\xb4\xeb\xa4\ +X\xc8\xd0y\xd2\xc7?\xe2\xfa%r)\xe4\xaa\x80\x91\ +c\x015h\x90]?\xf8\x1f\xfc\x9e\xadU\x9c\x9a\xf4\ +\x92BI\xa0\xf7\xc5q>b@\xdf.\xd0j8\xce\ +\xf7\xb1\xe3\xb4N\x80\xe03p\xa5w\xfc\xb5&0\xfb\ +Iz\xa3\xa3E\x8f\x80\xa1m\xe0\xe2\xba\xa3){\xc0\ +\xe5\x0e0\xfcd\xc8\xa6\xecJAZB\xb1\x08\xbc\x9f\ +\xd17\xe5\x81\xf0-0\xb0\xe6\xcd\xad}\x8e\xd3\x07 \ +K\xb3J\xdf\x00\x07\x87\xc0x\x89\xb2\xd7}\xde\xdd\xdf\ +=\xb7\x7f{\xda\xf3\xfb\x01\x97\x9br\xb5\xd7n\xdfs\ +\x00\x00\x00\x06bKGD\x00T\x00[\x00an\x8c\ +B\xeb\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\ +\x0d\xd7\x01B(\x9bx\x00\x00\x00\x07tIME\x07\ +\xe9\x01\x1e\x0c\x1b'u\x1fnc\x00\x00 \x00ID\ +ATx\xda\xec\xbdwxT\xd7\xb5\xff\xfd\x9d\xd1\xf4\ +\x22i\xd4{\xef]\x02\xf5\x0a\x08\x99f\x5c0\xc68\ +qb;\x8e\x1d\xd7\xc4\x8e\xe3\xdc\xe4\xbd\xf7\xfd\xe5\xbe\ +\xb9\xbf\xdc\x18S\x12c\x8c\xe96\xb6\x83\x0b`z\x11\ +\x02\x09\x90P\x03\xa1\x82$\x10*\xa8\x17P\xd7h\xfa\ +\xcc\xfb\x07\xb6\x13\x22\xd9:\x80$\xa6\xac\xcf\xf3\xf0<\ +~\xac}\xce\x9c\xb3\xce>g}\xd7\xdek\xaf\x0d\x10\ +\x04A\x10\x04A\x10\x04A\x10\x04A\x10\x04A\x10\x04\ +A\x10\x04A\x10\x04A\x10\x04A\x10\x04A\x10\x04A\ +\x10\x04A\x10\x04A\x10\x04A\x10\x04A\x10\x04A\x10\ +\x04A\x10\x04A\x10\x04A\x10\x04A\x10\x04A\x10\x04\ +A\x10\x04A\x10\x04A\x10\x04A\x10\x04A\x10\x04A\ +\x10\x04A\x10\x04A\x10\x04A\x10\x04A\x10\x04\xf1\xef\ +\xb0\xc8\x04\x04a\xfcly\x7f\x8d\xb5\x15\x9b\x15\xc6f\ +\xb3\x03\xac\xd8,/\xb6\x15\xdb\xc3\x8a\xcdvd\xb3Y\ +\xf6Vl\xb6\x0d\x8f/\xb0vr\xf3\x95Ie\x0e\x22\ +\xbe\xc4Q`\x00\xfb\x8ew\xdb\xf0/\xffa\xf8\xb1\x8f\ +\x01k\xf2\x0f\x03\x0bz\x83j\xec\xa6rt\xf0\xd6x\ +_W\xcb\xa0Z\xa5\x1c\xd1\xe9\xf5\xc3z\xbd\xa1_\xa7\ +\xd7\xdf\xd4\xeb\xf4\x1d:\xbd\xa1M\xaf\xd77\xea\xf4\x86\ +\xba\x97\xdexg\x84\x9e\x1aA\x90\x00 \x08\xe2G\xd8\ +\xbaq\x8d\x83\x15\x9b\x9d\xcc\xe1\xb0c8VV\xc1\x1c\ +\x8e\x95\x8f\xad\xcc\xd1\xc374\xd6\x05\x5c\x1b\xbe\x01\x80\ +\xc1`b\x1f\x16\xd6\xb7\x1f\x17\xcd\xb0\xaa\xa5\xfer\xcf\ +\xd0\xe0\xcd\x0e\xadVwC\xab\xd3]\xd3j\xf5\x95:\ +\xbd\xbe\xf8\xc5\xd7\xdf\xb9EO\x9f H\x00\x10\x84\xb9\ +G\xf0\xb6\x5c\x0e{!\x87\xc3I\xe1q\xac\x22d\xf6\ +\x8e\x01~Q\x99\xde\x06\xb0Yz\x83e\xda\x84\xcd\xba\ +=\xb2\xd0\x5c}\xb6u\xb0\xfff\xa3Z\xab\xbb\xa2\xd5\ +j/h\xb4\xfaS/\xbd\xf1\xce\x10\xf5\x1a\x82 \x01\ +@\x10&\xc5\x8e\x0f\xd7>\xce\xe3p\xe6\xf1x\x9c8\ +/\xff\xf0P{\x8f0\x99\xa5:\xf9\xfb\x11\x07\xfd\x1d\ +u\x83mM\xb5\xf5j\xb5\xb6B\xad\xd5\xe6\xff\xe2\x95\ +\xb7\xf7\x93e\x08\x82\x04\x00A\x18AT\xff\xae\x80\xcb\ +\xe5\xac\xe6s9\x0b\xf9\xe2\xe6\xe9\x97\xee\x16\x18\xefL\ +\xc3\xf8\xa6\x01\x9b\x05t]/\xef\xedjo>\xafT\ +i\x0e>\xff\xcao?#\xab\x10\x04\x09\x00\x82\xf8\x11\ +\x87\xbfv\x95\x80\xcf{\xd270\x22\xd3\xde3\xdc\x9e\ +\x1c\xbe\xf9\x08\x82\xfe\xf6\xda\xfe\x96\xebW\xce*U\xea\ +\xaf\x9e\x7f\xe5\xed/\xc9*\x04A\x02\x80\xb0`\xb6}\ +\xf0\xde\x1c\x01\x9f\xfbKk\xa94;4q\x99?9\ +|\xcb\x11\x04\xf5\xa5G\x9aFFG\xf3\x94*\xcd\xb6\ +_\xbe\xf6\xbbKd\x15\x82\x04\x00A\x989\xbb6\xaf\ +\xfb\x95P\xc0\x7fjN\xd6\x8a\x0c\x9d\x81M\xfd\x9f\x80\ +\x15Ko\xb8T\xb0\xef\x9cB\xa9\xfa\xe2\xb9\x97\x7f\xfb\ +\x11Y\x84 \x01@\x10f\xc0\x96\xf7\xd7X\x0b\xf9\xdc\ +?\x88\x84\xfc\xe5Q\xe9+\xc2(\xca'\xa6\x1a\x1d\xa8\ +>\xbf\xafn\x5c\xa1:\xa4Pi\xfe\x97*\x1a\x12$\ +\x00\x08\xc2\x84\xd8\xbaq\x8d\xb7P\xc0\xfb\xbd\xa7w\xc0\ +c\xae\x81\xf1.\xb4,\x8f\xb8\xa7\x8f#\x0b\xe8\xbe^\ +\xde\xd3\xde\xda\xf8\x8dB\xa9~\xf7\xc5\xd7\xdfi%\xab\ +\x10$\x00\x08\xc2\xf8\x9c\xbe\xbbP\xc0\xfbOO\x9f\x80\ +\xc7\x5c\x03\xe2\x9d\xc9\xe9\x13\xd3.\x06\x1a\xcb{\xdbo\ +4~\xa3P\xaa\xff\xe7\xc5\xd7\xdf\xe9$\xab\x10$\x00\ +\x08\xe2\x01\xb1\xe5\xfdw9B\x01\xef/\xce\xcen\xab\ +|\xa2\xb2\xbc\xc8\xe9\x13\xb3%\x06nT\x17\xb4\xf5\xf6\ +v}\xa9P\xaa\xff\xf8\xd2\x1b\xbf\xd7\x92U\x08\x12\x00\ +\x041\x0b|\xfc\xd1\xfa7\xc4\x22\xc1\xf3\xd1\xe9+\xa2\ +iN\x9fx\x90\xb0Y@\xd5\xf9}U\xf2q\xe5\xce\ +g\x7f\xf5\xd6\xfbd\x11\x82\x04\x00AL3\xdb7\xbd\ +\x97)\x16\x0a~?g\xde\xca\xc5z\x03u[\xc2\x18\ +\xc5\x80\x01\x97\xf2\xbf>.W(\xdf}\xe1\xd5\xdf\x9d\ +%\x8b\x10$\x00\x08\xe2>\xd8\xbdu\xc3{\x81!\xd1\ +\xcf\xc9<\xc2\xed\xc9\x1a\x84\xa90\xd8Q\xdb\x7f\xfdj\ +\xd5\xae\x9f\xbd\xf8\xe6\xef\xc8\x1a\x04\x09\x00\x82`\xc8\x8e\ +Mk\x17\x8aE\xfc?\xc4e=9\x8f\x86\xf8\x09\xd3\ +\x1e\x15\x00*\x0a\xbe\xca\x97\x8f\xab\xfe\xf7\x17\xaf\xbe}\ +\x8a,B\x90\x00 \x88I\xf8d\xcb\xfa\xffrqq\ +\x7f\xd1;2\xcb\x83\xacA\x98\x1b\xad5\x05\x1d==\ +\x9d[\x7f\xfe\xd2[\x7f&k\x10$\x00\x08\x8bg\xeb\ +\xc65Nb!\xff\xef\xf1\x0bV\xad\xd2\x1bX\xd4\x1f\ +\x09\x0b\x18\x150\x18\xcaO\x7f\xf9\xa5\x5c\xa1\xfa\xf5\x8b\ +\xaf\xbf\xd3G\x16!H\x00\x10\x16\xc5\xf6Mk\x17H\ +E\x82?\xc5f\xadL\xa3a~\xc22\x85\x00p\xb9\ +\xe0\xeb\xc2\xd1q\xe5\x9fh\x0bc\x82\x04\x00a\xf6\xec\ +\xda\xbc\xeey\xa9X\xf8\xdb\xc8\xb4\x15a\xe4\xf7\x09\xe2\ +\xf6G\xb8\xa6p_\xdd\xa8\x5c\xb1\xee\xb9\x97\x7f\xbb\x93\ +,B\x90\x00 \xcc\x8a\x8f?Z\xff\x07\x1f\xff\xa0_\ +\xbb\xf8\xc7;\x935\x08brz\x9a\xca{o45\ +\xfc\xfd\xd9_\xbd\xf5\xbfd\x0d\x82\x04\x00a\xd2\xec\xde\ +\xb2\xe1/\x11q)\xaf\x89\xec}\xa4d\x0d\x82`\xc6\ +x\xff\x8d\xd1+\x15\x17>\xf8\xd9Ko\xfe\x91\xacA\ +\x90\x00 L\xcb\xf1o\xdd\xb0vN\xf2\x82W\xac\xc4\ +\xceB\xb2\x06A\xdc\x1b:y\xaf\xe2R\xf1\xe9\x0f\x7f\ +\xf6\xe2\x9bo\x935\x08\x12\x00\x84\xd1;\xfe\xa4\xac\xa5\ +\xaf\xe996|\xb2\x06AL\x0fl\xed\xb0\xaa\xa4\xe0\ +\xe8\x07$\x04\x08\x12\x00\x84\xf19\xfe-\x1b\xfe\x12\x97\ +<\xff7\x1c\x89\x0bE\xfc\x041Ch\xc7z\x14\x15\ +\xc5g\xfeFS\x03\x04\x09\x00\xe2\x81\xf3\xf1G\xeb\x7f\ +\x1f\x1c\x1e\xfb{\x99{\x98\x8c\xacA\x10\xb3\xc3`g\ +\xdd\xe0\xb5\xda\xcb\xef>\xfb\xab\xb7\xde%k\x10$\x00\ +\x88Ye\xd7\xe6u\xcf\xbb\xb9y\xfc\x1f\xef\xc8,/\ +\xb2\x06A<\x18Zk\x0a\xda\xba\xba:\xfe\x9b\x96\x0f\ +\x12$\x00\x88\x19g\xfb\xa6\xb5\x0bl$\xc2\xb5\x91\xe9\ +O\xc4\x905\x08\xc28\xa89\xbf\xb7rxL\xf16\ +\x15\x14\x22H\x00\x10\xd3\xce\xd6\x8dk\x5c\xad\xc5\xc2O\ +\xe2\xe6=\xb9\x90*\xf7\x11\x84\xf1\xc1f\x01\x15\xf9_\ +\x9d\x1a\x91+~\xfe\xe2\xeb\xeft\x93E\x08\x12\x00\xc4\ +}\xf3\xd9\xb6\xbfmO\xc8^\xfd\x0br\xfc\x04a\x1a\ +B\xa0,o\xcf\x8e\x9f\xfe\xf27/\x905\x08\x12\x00\ +\xc4=\xf1\xf1G\xeb\xdf\x8c\x8aK\xf9\x93\xc8\xc1\xd7\x9a\ +\xacA\x10\xa6\xc5\xf8\xad\x96\x91\xea\x8a\x0b\x7fz\xf6W\ +om k\x10$\x00\x08Fl\xff\xe0\xbd$\x1b\xa9\ +\xe8\xc3\xc8\xf4'b\xc9\x1a\x04a\xda\xd4\x9c\xdf{y\ +xt\xfc\x95\x17^\xfb]\x09Y\x83 \x01@\xfc \ +\x9fo\xff\xfb\x9e\xf8\x05O=E\xc3\xfd\x04a>\xb0\ +Y@\xf9\xe9/\xbe\xf8\xc9\x0b\xbf^M\xd6 H\x00\ +\x10w\xb0k\xf3\xfa\xd7\xa3\xe7\xa4\xfc\x0f\x0d\xf7\x13\x84\ +\xf92~\xabe\xa4\xea\xd2\x85\xff|\xee\xe5\xb76\x92\ +5\x08\x12\x00\x16\xce\xd6\x8dk\xbcm$\xa2\xcfb\xb2\ +V\xa6\x19(\xea'\x08\xf3\xff\xe8\xb3\x80\xca\x82\xaf\x0b\ +\x87\xc7\xc6\x7f\xfa\xe2\xeb\xef\xb4\x92EH\x00\x10\x16\xc8\ +\xee\xad\x1b\xd6$-\x5c\xfd\xb6\xde\xc0\xa2~@\x10\x16\ +\x06\x9be0\x94\x9c\xda\xb3\xf6g/\xbe\xf9\x0eY\x83\ +\x04\x00a!l\xff\xe0\xbdD\x1bk\xf1\x96\xc8\xb4\x15\ +\xd1d\x0d\x82\xb0lj\x0a\xf7U\x0d\x8f\xc8_z\xe1\ +\xb5\xdf\x95\x925H\x00\x10f\xcc\xa7[\xff\xf6A\xe2\ +\xc2\xd5\xafR\x92\x1fA\x10\xff\x1c\x0d\x00JO\xed\xd9\ +\xf4\xcc\x8b\xbfy\x8d\xacA\x02\x800\xbf\xa8?\xc5\xd6\ +Z\xbc%\x22mE\x04Y\x83 \x88\xc9\xb8R\xb8\xef\ +\xca\xd0\xed\xd1\x80\x0bd\x0d\x12\x00\x84\x19\xb0{\xeb\xdf\ +6$-\x5c\xfd\x1b\x8a\xfa\x09\x82`2\x1aPrj\ +\xcf\xdf~\xf6\xe2o\xde$k\x90\x00 L\x94m\x1f\ +\xac\x09\xb1\x91\x8a?\x8dJ\x7fb.Y\x83 \x88\xbb\ +\xa1\xfa\xfc\xde\x8b\xc3\xa3\xf2g~\xf9\xda;W\xc9\x1a\ +$\x00\x08\x13\xe2\x93\x8f\xd6\xff1\xf5\xa1\xa7\xfe\xac5\ +X\xb1\xc9\x1a\x04A\xdc\x0b\x1c\x96N_t\xf2\x8b\xff\ +\xfa\xf9\xaf\xde\xfa\x0bY\x83\x04\x00a\x02\xec\xd9\xb9\xf1\ +D\xdc\xbc'\x1f\xa2u\xfd\x04A\xdc\xb7\x93\xb8\xbd\xcb\ +\xe0\xc9\xd5\xcf\xbf\xbe\x88\xacA\x02\x800Rv~\xb8\ +\xf6\x09\xbf\x80\x90\x0f\x5c\x02\xe2\x9d\xc9\x1a\x04AL'\ +=\x8d\xe5\xbd\xcd\x8dW_{\xfe\x95\xb7\xf7\x925H\ +\x00\x10F\x04-\xef#\x08b\xa6\xa1\xe5\x82$\x00\x08\ +#b\xeb\xfbk\xecl\xacE\x87\xa23V\xa6\x925\ +\x08\x82\x98\x0d\xaa\xce}]4<2\xbe\xfc\xc57\xde\ +\x19 k\x98.Vd\x02\xd3e\xe7\x87\xebV\x87G\ +\xcd9\xee\x13\x99\x15L\xd6 \x08b\xb6p\xf1\x0e\xf7\ +\xb2\x16q_H\x8d\x8fj?x4\xf7\x0aY\x84F\ +\x00\x88Y\x84\xd6\xf6\x13\x04\xf1\xa0\xa1\x9a\x01$\x00\x88\ +Yf\xcf\xce\x8d'\xe3\xe6=\x99CY\xfe\x04A<\ +p'r{\x95@\xee\xea\xe7_\x7f\x88\xacA\x02\x80\ +\x98!\xb6\x7f\xf0^\x8a\xa3\x83\xdd\xc7\xc1\x09\xcb\x02\xc9\ +\x1a\x04A\x18\x13\xd7\xca\x8e\x5c\xbfyk\xe0Y*#\ +L\x02\x80\x98fvm^\xffz\xea\x82e\xef\xe99\ +6|\xb2\x06A\x10\xc6\x08[;\xac*:}\xe4w\ +\xcf\xbd\xfc\xd6F\xb2\x86\xf1CI\x80&\xc0\xa7\xdb\xfe\ +\xf6ar\xce\xd3\xff\xaf\x9e-\xe0\x905\x08\x820V\ +\x0cl\x01\xc7;0jqB\x84\x87\xf37\x87O\x1c\ +%\x8b\xd0\x08\x00q\x1f\xec\xd9\xb9\xf1h\xdc\xbc'\x97\ +\xd0|?A\x10&\xe3Xn\xe7\x05\x1c[\xfd\xfc\xeb\ +K\xc9\x1a$\x00\x88\xbbd\xdb\xc65\xfe\xb6\xd6\xe2\xbd\ +\x91\xe9O\xc4\x905\x08\x820Ej\xce\xef\xad\x1c\x1a\ +\x91?\xf1\xcb\xd7\xdfi\x22k\x18\x1f4\x05`\x84\xec\ +\xd8\xb4vi@P\xe8A\xff\xd8\x85\x01d\x0d\x82 \ +L\x15g\xef0\x17>[\xb3*=)\xae\xfe\xd0\xb1\ +\xdc\xebd\x11\x12\x00\xc4\x8f\xf0\xf1G\xeb\xdfH\xcf^\ +\xbeC\xec\xe0gC\xd6 \x08\xc2\xd4\x91\xd8\xb9K|\ +}}\x9f\x98\x13\xee;r\xe0\xc8\xc9R\xb2\x08\x09\x00\ +b\x12vo\xdd\xb0&9\xe7'\x7f\xd6\xb3\xf9\xf4\x5c\ +\x08\x820\x1b\x0cl\xbe\x95W@\xd4\xe2\xf8pw\xf1\ +7\x87O\x9e\x22\x8b\x90\x00 \xfe\x85\xcf\xb6\xff\xfd\x93\ +\xc4\xec\xd5\xafPe?\x82 \xccR\x04\x00\xf0\xf4\x8f\ +LM\x8c\xf4\xf4\xdb\x7f\xe8\xc4\x01\xb2\xc8\x83\x87\x92\x00\ +\x8d\x80=;\xdf?\x1c7o\xd52\xca\xf4'\x08\xc2\ +\xec\x9d\x0e\x0b\xa8\xc8\xff\xf2\xc8\xea\xe7\xdfx\x98\xacA\ +\x02\xc0b\xd9\xf2\xfe\xbb<[\xa98/:se:\ +Y\x83 \x08K\xa2\xea\xec\xd7\xe7\x87F\xe5\xd9/\xbd\ +\xf1{5Y\x83\x04\x80E\xb1u\xe3\x1aO\x99\xb5\xf8\ +@d\xfa\x13qd\x0d\x820O\xf4z=t:\x1d\ +\x0c\x06\x03X,\x80\xc5b\xc3\xca\xca\x0a,\x16}z\ +\x01\xa0\xe6\xfc\xde\x8a\xc1\x11\xf9\xa3/\xbe\xfeN;Y\ +\x83\x04\x80E\xb0\xed\x83\xf7be6\xe2\xcf#RW\ +\x84\x925\x08\xc2\xfcP\xabU\xb8\xd9\xd7\x87\x9e\x9e.\ +\xf4\xdf\xba\x09\xa5R\x056\x9b\x0d[[[8:\xb9\ +\xc0\xc5\xd5\x15\xd6\xd66$\x04\x00\x5c)\xdaW?8\ +,\xff\xc9/_\xfb\xdde\xea9$\x00\xcc\x9a\xed\x9b\ +\xde\x9b\xe7\xe9\xe1\xf5\xb1wd\x96\x17Y\x83 \xcc\x0b\ +\x83\xc1\x80\xe1\xa1!\x94\x97\x15\xa3\xf2\xf2E\x5co\xb8\ +\x86\xa6\xc6\x06tv\xb4\x01\x00b\xe2\xe2\xe1\xe7\x17\x80\ +\xd0\xf0\x08\xc4\xc4\xceE``0\x04B\xa1\xc5\xdb\xad\ +\xb5\xa6\xa0\xad\xbd\xa3\xed\xd9\x17^\xfd]>\xf5\x22\x12\ +\x00f\xc9\x8eMk\x1f\x0e\x8b\x8c\xdb%\xf3\x08\xb7'\ +k\x10\x84\xf99\xff\xfe[\xb7p\xe8\xc0^\xe4\x9e<\ +\x8ak\xf5uP(\xe4\x93\xb6u\xf7\xf0Bxd4\ +RS3\x90\x92\x96\x09\x17W7p\xb9\x5c\x8b\xb6\xdf\ +`Gm\x7f]M\xc5s\xbfx\xf5\xed\xc3\xd4\x9bf\ +\x07Z\x068K\xec\xfcp\xed\xaa\xb0\xa89\xdbe\x1e\ +\xe1vd\x0d\x820?FGFp\xe8\xe0^|\xf1\ +\xf9'\xb8V_\x0b\xadV\xf3#m\x87\xd1\xd4\xd8\x80\ +\x96\xe6&tww\x82\xcb\xe1B,\x96@ \x10\x82\ +\xcdf[\xa4\xfd\x84\xd6N\x22\xa9\x88\xbb(5>\xf2\ +\xc6\xc1\xa3\xb9\xb5\xd4\xa3H\x00\x98\x89\xf3_\xf7LL\ +|\xfaG\xd6\xce\x81T\xdd\x8f \xcc\x10\x8dF\x83K\ +\x17K\xf1\xf5\x17\x9f\xa1\xae\xb6\x86\xf1q\xc3C\x83h\ +inFmm5\x86\x87\x87 \x14\x8a \xb5\xb6\x06\ +\x87\xc3\xb5\xc8\xfc\x00\xa1\xb5\xa3\xd0^f\xf3Pbl\ +h\xc7\xc1\xa3\xb9\xd5\xd4\xb3H\x00\x984\xbb6\xaf{\ +>!-\xfbC\xbe\xad\x87\x84\xacA\x10\xe6Ioo\ +7\xf6~\xf19\xce\x9f\xcd\xff\xd1\xc8\x7f2\xb4Z\x0d\ +\x06\xfao\xa1\xbe\xb6\x16\xf5u5P\xabU\x90\xc9\xec\ +\xc0\xe7\xf3-R\x08pE\xb6|W\x17\xa7\x87\xe2\xa3\ +\x02{\x0e\x1e\xcd\xa5\xc4@\x12\x00&\xeb\xfc_\x88O\ +\xcd\xde\xc8\x91\xb8\x88\xc8\x1a\x04a\x9e(\x15\x0a\x14\xe4\ +\xe7\xe1\xd8\xd1\x83\xe8\xed\xe9\xba\xe7\xf3h\xb5\x1a\xf4\xf6\ +v\xa3\xe8|\x01n\xde\xbc\x09\x1e\x8f\x07\x81@\x08\xa1\ +P\x08++\x8eE\xd9\x94\xcd\x93p]]\x9cr\xe2\ +\xa3\x02{\x0f\x1e\xcd\xad\xa0^F\x02\xc0\xa4\xd8\xb9y\ +\xdds\x09\xa9\xd9\x1fp$.\x94\xe2K\x10f\x8a^\ +\xafGC\xc3U\x1c\xfc\xe6k\x94\x5c8?m\xe7m\ +jl@}]-\x86\x87\x87\xc0b\xb3!\x91H!\ +\x10\x08-j4\xe0[\x11\xb0pnT`\xd7\xc1\xa3\ +\xb9\x95\xd4\xdbH\x00\x98\x86\xf3\xffp\xddO\x13\xd2\xb2\ +7S\xe4O\x10\xe6\xcd\xd0\xd0 \xce\x16\xe4\xe1\xf0\xc1\ +\xfd\x90\xcb\xc7\xa6\xf5\xdc\xc3C\x83\xa8\xaa\xbc\x84\x96\xe6\ +F\xa8\x94Jp\xb8\x5cH%R\xf0\xf8|\xcb\x13\x01\ +\x91\x81m\x94\x13@\x02\xc0\x04\x9c\xff\xda\x951\xf1\xe9\ +[i\xce\x9f \xcc\x1b\xadV\x8bkW\xebp`\xdf\ +W\xa8\xbdR5c\xbfs\xb3\xaf\x17%\xc5\x85\x18\x19\ +\x1e\x86B\xa1\x00\x9f\xcf\x87\xd4\xda\x06VV\x96\xf1\xf9\ +f\xf3$\x5c{\x99\xf5\xc2\xc4\xd8\x90\xc6\x83Gs\xeb\ +\xa8\xe7\x91\x000JvlZ\xbb4,j\xce\x0ek\ +\xe7@[\xb2\x06A\x987\xfd\xb7n\xe2\xe4\xf1\xc3\xf8\ +j\xcf\xeeY\xf9\xbd\xe6\xa6\xebhokEWW\x07\ +\x94J\x05d2;\x08\x85\x22\x8bX6\xc8\x15\xd9\xf2\ +%B\xee\x82\x94\xb9\x91\xb5\x87\x8e\xe5^\xa7\xdeG\x02\ +\xc0\xa8\xd8\xbe\xe9\xbd\x8c\x80\xa0\xd0\xcf\x1c\xbdc\x1c\xc9\ +\x1a\x04a\xde\xa8T*\x5c\xae(\xc7\xc6\xbf\xafe4\ +\xf4/\x14\x8a\x919/\x1bNN.\x90\xcb\xe5P*\ +\x15\xf7\xf4\xbb\x83\x83\xfdh\xbdq\x03\xd7\xae\xd6\xe3\xe6\ +\xcd^\x88\x84\x22H\xa4Rp\xb9\x5c\xb3\x17\x02Bk\ +G!\x8f\xad^\x90\x96\x14[v\xe8\xd8\xa9V\xea\x85\ +$\x00\x8c\x82m\x1f\xbc\x17\xe5\xe5\xe9\xf5\x95GH\xaa\ +;Y\x83 \xcc\x1b\xbd^\x8f\xee\xaeN|\xb5\xe7S\ +\x5c,+ftLJZ&~\xf5\xea\xaf\x91\x90\x98\ +\x02\xa9T\x0a\x8d\xfav\xc6\xff\xbd\xa0\xd5j08\xd8\ +\x8f\xeb\x0d\xd7p\xedj-\x94J%D\x221\xc4\x12\ +\x89\xd9/\x1b\x94\xd8\xb9K\x0c\xca\xc1\xf9\x99i\x89g\ +\x0e\x1f;\xd5K\xbd\x91\x04\xc0\x03e\xeb\xc65\xaev\ +6\x92CA\xf1K\x02\xc9\x1a\x04a\xfe(\x14\xe3(\ +<_\x80O?\xd9\xc1(\x92\xb7\x95\xd9\xe3\xc5\x97\xdf\ +@Bb2\xdc=<\x11\x12\x16\x01w\x0fOH\xa5\ +\xd6P(\x14\x18\x1c\xec\xbfg!\xd0\xdb\xdb\x8d\xca\x8a\ +K\xb8\xd1\xdc\x04\x16\x8b\x05\x99\x9d\xf9O\x0b\xd8:\xfb\ +\xd8\x8e\xf66ff\xcf\xcf\xfc\xe6\xf0\xf1Sc\xd4#\ +I\x00<0\x9ey\xea\xd1\xfc\xc8\xf4'\xa2\xc9\x12\x04\ +a\x19\xd1\x7fKs3\xf6|\xf61\xeak\x99%\xa5\ +\xaf|\xea\xa7X\xbcl9lm\xed\xc0f\xb3!\x14\ +\x8a\xe0\xe9\xe5\x0d\xff\x80@\xb8\xba\xb9C\x22\xb1F[\ +\xeb\x8d\xbb. \xf4\xafB\xa0\xbd\xed\x06\x8a\x8b\xceC\ +\xa7\xd5\xc1\xd1\xc9\x09\xb6\xb62\xb3N\x12t\xf2\x0as\ +\x1c\xeem\xcc\xfc\xfa\xc0\xb1m\xd4+I\x00<\x10\xbe\ +\xd8\xb51?:ce\x0aY\x82 ,\x83\xb1\xb1Q\ +\x1c;z\x10\x9f\xef\xde\xc1\xa8}Tt\x1c\x9ez\xfa\ +\xe7\x08\x08\x0c\x06\x87\xf3\xcfb>VVV\xb0\x95\xd9\ +\xc1\xcb\xcb\x07\xbe\xfe\x01\xf0\xf5\xf7\xc7\xd0\xe0\xe0=O\ +\x0b|'\x04\xae]\xad\x87\xde\xa0\x87\xbb\xbb'\xec\xed\ +\x1d\xccz:\xc0\xd9;\xcc--\xc6;k\xef\xc1\xe3\ +\x9fP\xcf$\x010\xab\xfcc\xc7\xfb\x07b\xb3V-\ +\x22K\x10\x84\xe5D\xff\x15\x97\xca\xb0\xfb\xe3m\xb8\xd9\ +\xc7l\xfa\xf9\xa9\x9f\xfc\x1c\xa9\x19Y\xb0\xb1\x99|a\ +\x10\x8f\xc7\x83\xbd\xbd\x03\xbc}|\x11\x1e\x19\x0d{\x07\ +\x07\x0c\x0e\x0e\xde\xd7\xb4@\xe3\xf5\x068:9\xc1\xc7\ +\xd7\x1f\x22\x91\xd8\xac\x9f\x89\x8bO\xb8OJ\x94W\xec\ +\xbeC\xc7\xbf\xa0\x1eJ\x02`V\xf8l\xdb\xdf\xb6\xcf\ +]\xf0\xd4j\xb2\x04AX\x0e==]\xf8f\xef\x97\ +(:\x7f\x96\xd1p}FV6\x1e}l%\xfc\xfc\ +\x03~tN\x9e\xc5bA \x10\xc2\xd1\xc9\x19\x01A\ +!\x08\x0c\x0a\x81D\x22\xbd\xe7\xda\x02Z\xad\x06\x0a\xa5\ +\x12\xc1\xc1apus7\xfb\xd5\x01n~\x11!I\ +\x11\x1e\x9e\xfb\x0f\x9f8D\xbd\x94\x04\xc0\x8c\xf2\xc9\x96\ +\x0d\xff\x93\xb4\xf0\xe9_\x1b\x0cd\x0b\x82\xb0\x14T*\ +\x15\x8a\x8b\xce\xe3\xe8\x91o\xd0\xd5\xd9>e{[\x99\ +=V\xad~\x06)\xe9\x99\x10\x08\x04\x8c~\x83\xcdf\ +C,\x16\xc3\xcd\xcd\x03!\xa1\xe1\x08\x0d\x8b\xc0\xb8|\ +\x1c\xfd\xb7n\xddu~\xc0\xf0\xd00B\xc3#\xe1\xe3\ +\xeb\xc7\xf8\xf7M\x19\x0f\xff\xc8\xb8\xb9a\xee\xdc\x03G\ +N\x9e\xa1\xdeJ\x02`F\xd8\xb5y\xddK)\x0f=\ +\xbdFo`\x911\x08\xc2B0\x18\x0chok\xc5\ +\x81\xfd_\xa1\xac\xa4\x98\x913^\xfa\xf0cX\xfa\xf0\ +cpqq\xbd\xabyx\x16\x8b\x05\x0e\x87\x03\xa9\xd4\ +\x1a~\xfe\x01\x08\x0b\x8f\x84Lf\x07\xadN\x07\x85B\ +\xc9\xb8~\x80V\xabAPp(\xc2\xc2#!\x91H\ +\xcd\xff\x19\x01\xf0\x0a\x88\xc8\x88\x0bq\xed9x4\xf7\ +\x12\xf5Z\x12\x00\xd3\xca\x8eMk\x17&\xa4\xe7|\xcc\ +\xe2J\xb8d\x0d\x82\xb0\x1c\xc6\xc7\xe5\xc8?\x9d\x8b\x83\ +\x07\xf6b`\xe0\xd6\x94\xed\xc3#\xa3\xb1l\xf9\xe3\x88\ +\x9d\x13\x0f.\xf7\xde>\x17\xb7\x85\x00\x17\x0e\x8eN\x08\ +\x0a\x0e\x85\x8f\x8f/D\x2214Z\x0d\xe3\xfc\x83\xe0\ +\x900\xc4\xc4\xce\x85\xb5\xb5\x8de\x085\xb0\xe0\xea\xea\ +\xbc`N\x84\x7f\xd9\xa1c\xb9\xcd\xd4s\xa7\x86M&\ +\x98\x9a\xad\x1b\xd7\xb8zxxn\xe7\x88\x9dig?\ +\x82\xb0 \xf4z=\xae7\x5c\xc5\xd9\x82\xd3\xe8\xech\ +\x9b\xb2\xbdP(Ft\xcc\x1c\xc4\xc6\xc5O\xcb\xd0;\ +\x8b\xc5\x82Lf\x87\xa4\x94t<\xf3\xdc\x0b\xc8\x9c\x97\ +\x0d\xa1\x90Yb\x9f\x95\x15\x07,\xb6e\x8dVr\xc4\ +\xceB\x0f\x0f\xcf\xed[7\xaeq\xa5\xdeK\x02`Z\ +\xb0\xb5\x16\x1f\xf4\x8e\xcc\xf2\x22K\x10\x84e\xd1\xdf\x7f\ +\x0be\xa5\xc5(.b\xb6\xd5\xaf_@\x002\xb2\x16\ +\xc0\xcd\xddcz\x1d\x1b\x87\x03\x01_\x00\x85|\x1c\x0a\ +\x85\x9c\xd11\x0e\x0e\x8e\xe0\xf3\xf8\x16\xf7\xcc\xbc#\xb3\ +\xbcl\xad\xc5\x07\xa9\xf7\x92\x00\xb8o\xfe\xb1\xe3\xfd\x03\ +Q\xe9O\xc4\x93%\x08\xc2\xb2P\xabUhl\xb8\x8a\ +\xf3\x05\xa7\x199]\xa1P\x8c\xec\x85\x8b\x11\x1b7w\ +\xda3\xef5\x1a\x0d.],C\xee\xc9\xa3\x8c\xda;\ +9\xbb\xc2\xc7\xd7\x0fb\x0b\x98\xff\x9f\x8c\xa8\xf4'\xe2\ +\xff\xb1\xe3\xfd\x03\xd4\x8bI\x00\xdc3\xbb\xb7nX?\ +g\xfe\xaaG\xc8\x12\x04aY\x18\x0c\x06\xf4\xf7\xdfB\ +Q\xe1Y\x943\xac\xf7\x1f\x9f\x98\x8c\xccy\xd9\x90J\ +\xad\xa7\xfdz\xda\xdbn\xe0\xcc\xe9\x93\x18\xe8gV\x1f\ + 9%\x1d\xfe\x01\xc1\x16\xb1\x02\xe0\x87\x983\x7f\xd5\ +#\xbb\xb7nXO\xbd\x99\x04\xc0]\xb3k\xf3\xba\x17\ +\x92\x16>\xfd&-\xf7#\x08\xcbC\xa5R\xa1\xa6\xea\ +2\x0e\x1d\xd8\xc7\xa8\xbd\xad\xcc\x1e\x0b\x1fZ\x0co\x1f\ +\xdfi\x8f\xfe\xe5\xf21\x5c,/Eu\xe5eF#\ +\x11~\xfeAHM\xcf\x82\xa7\x97e\xcfZ\x1a\x0c@\ +\xd2\xc2\xa7\xdf\xdc\xb5y\xdd\x0b\xd4\xa3I\x000f\xdb\ +\x07\xefEE\xcfM[\xaf'\xe7O\x10\x16\x87^\xaf\ +GWg;\x8e\x1c>\x80>\x86\xa5yS\xd32\x90\ +\x90\x98\x0a\xa1P4\xed#\x11-\xcdM(\xbep\x1e\ +\xcdM\x0dS\xb6\x17\x0a\xc5H\xcb\xc8B\xdc\x9cx\x08\ +\x04\x94\xb3\xac7\x00\xd1s\xd3\xd6o\xfb\xe0\xbd(\xea\ +\xd9$\x00\x18!\xb3\x16\x7f&\xb2\xf7\x91\x92%\x08\xc2\ +\xf2\x18\x1f\x97\xa3\xf0\x5c\x01\xce\x170\xab)\xe3\xe4\xec\ +\x8a%\xcb\x1e\x85\x8b\xab\xeb\xb4G\xff\xc3CC(\xbe\ +p\x1e\x05\xa7O1j\x1f\x1a\x1e\x81\xe4\x94t8\xbb\ +P\x12\xfcw\x88\xec}\xa42k\xf1gd\x09\x12\x00\ +S\xf2\x8f\x1d\xef\x1f\x8aH[\x11I\x96 \x08\xcbC\ +\xa7\xd3\xa1\xa9\xf1:\xce\xe6\xe71\xce\xb6\x7f\xf4\xf1\x95\ +\x88\x8a\x8e\x05\x9f?\xbd\xf3\xedZ\xad\x16W\xaeT!\ +\xfft.\xa3k\xb1\x95\xd9#!1\x19\x11Q1\xf7\ +\x5c\x7f\xc0\x5c\x89H[\x11\xf9\x8f\x1d\xefS\xa9`\x12\ +\x00?\xcc\xee-\x1b\xfe2g\xfe\xaa\x87\xc9\x12\x04a\ +\x99\x8c\x8c\x0c\xe3lA\x1e*.\x953j\x9f\x9c\x92\ +\x81\x8c\xac\x05\xb0\x95\xd9M\xebu\x18\x0c\x06\xf4\xf6t\ +\xa3\xb4\xb8\x10\x15\x17K\x19\x1d\xe3\xe7\x1f\x80\x8c\xcc\x05\ +ppp\xa4\x079\x09s\xe6\xafzx\xf7\x96\x0d\x7f\ +!K\x90\x00\x98\xc0\x8eMk\x97&\xe5\xac\xfe\x03%\ +\xfd\x11\x84\x85F\xffZ-.W\x5c\xc4\x89\xa3\x87\x19\ +G\xdcY\x0b\x16\xc2\xcf/`\xda#n\xa5R\x81\xfa\ +\xba+(\xc8\xcfc\xd4^(\x14c\xf1\xd2\xe5\x08\x0d\ +\x8b0\xeb-\x80\xefOT\x01I9\xab\xff\xb0c\xd3\ +\xda\xa5d\x0d\x12\x00\xdf\xb3\xe5\xfdw\xd9\x1e\x1e\x9e\x1f\ +Q\x8d\x7f\x82\xb0\x5c:;;\x90w\xf2\x18\xba\xbb:\ +\x19\xb5OJNE\xdc\x9c\x84i\x8f\xfe\xf5z=z\ +{{p\xb6\xe04\xae_\xabgt\xcc\x82\x9cEH\ +\xcf\x9c\x0f\x81\x90\x12\xff~\xd4\xb6\x06\x16<<\x9f\x1e&Cb\xe7=\x99\xbd{\xcb\x86\ +\xbf\x92\x00\xb0`vlZ\xbb0)g\xf5\xefi\xde\ +\x9f ,\x97\xd1\xd1\x11\x5c*/EIq\x11\xa3\xf6\ +1q\xf1\xc8\xc8Z\x00W7\xf7i\xbf\x96\x91\xe1!\ +\x9c\xcd\xcfCu\xd5eF\xed\x03\x83C\xb1h\xf1\xc3\ +\xb0wp\xa4\xe8\xff.\xf86\x1f\xe0\xf7;6\xad]\ +H\x02\xc0Bq\xb0\x97m\xa6y\x7f\x82\xb0\x5ct:\ +\x1d\xae]\xad\xc3\x99\xbc\x93\x8c\x8a\xfe|\xb7\xd4.r\ +\x06\x96\xdai4\x1a\xd4\xd7\xd7\x22\xef\xd4q\xc6\xd1\xff\ +\x8a\x95\xab\x11\x18\x1cB\xcb\xfe\xee\x01\xbd\x81\x05\x07{\ +\xd9f\x12\x00\x16\xc8?v\xbc\xbf?8a\x99?\xbd\ +\x06\x04a\xb9\xf4\xf5\xf5\xa0\xb8\xe8\x1c\x8a/\x9cc\xd4\ +\xde\xcf?\x00)i\x99ptr\x9e\xf6k\x19\xe8\xbf\ +\x85S'\x8f\xa2\xb5\xa5\x85Q\xfbEK\x96#!1\ +\x05\xd6\xd66\xf4 \xef\x91\xe0\x84e\xfe\xff\xd8\xf1\xfe\ +~K\xbd\x7f\x8b\x14\x00\xbb6\xaf\x7f}\xee\xfcU\x8f\ +Q\xf7'\x08\xcbE\xa9P\xa0\xbe\xae\x16y\xa7N0\ +>fa\xcebDF\xc6L\xfbp\xbbJ\xa5Bi\ +I\x11\xce\x15\x9ca\x14\xfd\xbb{x!=s><\ +=\xbdaeeE\x0f\xf3>\x98;\x7f\xd5c\xbb6\ +\xaf\x7f\x9d\x04\x80\x05\xb0u\xe3\x1a\x87\xf8\xd4\x05\x7f\xa5\ +:\xff\x04a\xb9\xe8\xf5z\xf4\xf5\xf5\xe2\xfcY\xe6K\ +\xedr\x16?\x8c\xccy\xd9\x10\x89\xc5\xd3~=\xcdM\ +\xd7\x91w\xea\x04:;\xda\x18\xb5OI\xcbDtL\ +\x1c$R\xaaX~\xdf}\xc1\x00\xc4\xa7.\xf8\xeb\xd6\ +\x8dk\x1cH\x00\x9896\x12\xd1~\x8e\xc4ED\xdd\ +\x9e ,8\xfaW*Qy\xf9\x22\x0e\xec\xfb\x9aQ\ +{'gW,^\xb2\x1cnn\x1e\xd3\x1e\xfd\x0f\x0f\ +\x0f\xa1\xb4\xa4\x08\xb55U\x8c\xda\x87GF#-=\ +\x0b^\xde>\x94\xf87Mp$.\x22\x1b\x89\xc8\xe2\ +\xa6\x02,J\x00|\xb2e\xc3\x7fGg\xaeL\xa7\xee\ +N\x10\x96\x1d\xfd\xb7\xdeh\xc6\xa1\x03\xfb\x18'\xdbe\ +\xe7,FTt,x\xd3\xbc\xd4N\xaf\xd7\xe3z\xc3\ +U\x94\x97\x163\x8a\xfeme\xf6HM\xcbDl\xdc\ +\x5c\xf0x\xb4\xeco:\x89\xce\x5c\x99\xfe\xc9\x96\x0d\xff\ +mQ\xc2\xc7Rnt\xdb\xc65A)9O\xfd\x97\ +\xce\xcc\x87\xfe\x0d\x06\x03\x0c\xb4\xae\xf1G\xf9.j\xa2\ +\xe8\xc9|\x1d\xbcN\xa7\x83Z\xad\xc2\xd0\xd0 \x06\x07\ +\x06022\x0c\xa5B\x01\xadV\x0b\x00(/+F\ +\xe19f\xbb\xfd\xf9\xf9\x07aA\xf6\x2288:M\ +{\xd1\x9f\xfe\xfe[(+\xb9\x80\x0b\x85\xcc\x92\x10\x83\ +\x83C\x91\x96>\x0f\xf6T\xef\x7fFH\xc9y\xea\xbf\ +\xb6m\xd4|\xfe\xcb\xd7\xdfi\xb0\x84\xfb\xb5\x18\x01`\ +#\x15\x7f\xaa3\xb0\xcd\xf6\x8b\xafV\xab\xd0\xdf\x7f\x0b\ +\xf219\xf4z=\xbd\xc9S\x08\x00\xa1P\x08{\x07\ +\x07\x08\x04B\x12\x02f\xe2\xf4\x95J%\x86\x87\x06\xd1\ +\xd9\xd9\x8e\x86\xab\xf5\xa8\xbdR\x8d\xde\xde\x1e\xa8\x94\x0a\ +\xa8T*\xa85j\xe8t:\x00\xc0\xcd\xbe>\xc6\xe7\ +^\xfe\xe8\x0a\x84\x84\x86M{\xa1\x1d\x8dF\x8d\xda\x9a\ +*\xe4\x9e<\xcah$\xc2\xc9\xd9\x15\xa9\xe9\x99\x08\x0a\ +\x09\xa5\xc4\xbf\x19Bg`\xb3l\xa4\xe2O\x01$\x92\ +\x000\x13vo\xd9\xf0\x97\xa8\x8c'\x12\xcc\xf5\xfeT\ +*\x15*.\x95\xe1\xe8\xe1o\xd0x\xbd\x01\xfao?\ +r\xc4\x0f\xe3\xee\xe9\x85\x87\x16-Cz\xc6<\x88%\ +\x122\x88\x09;~\xf9\xd8\x18Z[[P[S\x85\ +K\x17Kq\xa5\xa6\x1a\x03\x03\xfd\x18\x1a\xec\xbf\xef\xf3\ +\xcf\xcf^\x84\x94\xb4\xcc\x19\xd9\xed\xaf\xb3\xb3\x03g\x0b\ +\xf2p\xb5\xee\x0a\xa3cBB\xc3\x91\x9a\x9e\x05\x1b\x1b\ +[z\xf03HT\xc6\x13\x09\xbb\xb7\xa8\xff\xf2\xb3\x97\ +\xde\xfc#\x09\x00\x13g\xeb\xc65\xbe\xc99O\xfd\x87\ +9\x0f\xfdwv\xb4\xe1\xc0\xbe\xafp\xf0\x9b\xaf\xe8\xed\ +eHuU\x05\xdaZ[\xe0\xe8\xe8\x84\x98\xb8\xb9\x14\ +Q\x99\x18\x06\x83\x01\x0a\xc58:\xda\xdbPx\xae\x00\ +\xf9\xa7O\xe2JM5\xe39}\xa6DF\xc5\xc0\xd9\ +\xd9e\xda\x87\xfe\xe5\xf21\xd4T]\xc6\xb9\x02f\xd3\ +\x10\xb62{\xe4<\xb4\x04\x81A\xc14b5\x0b$\ +\xe7<\xf5\x1f[7j\xb6\xbd\xf8\xfa;-\xe6|\x9f\ +f/\x00l\xa4\xa2\xcf\xcdy\xe8\x1f\x00\xae\xd6\xd7\xa1\ +\xf2\xf2Ezk\xef\x92\xe6\xc6F44\x5cETL\ +\x1c\x09\x00\x13B\xa7\xd3\xa1\xaf\xb7\x07\x97+.\xe2\xc0\ +\xfe\xafp\xae o\xc6~\xab\xa9\xe9:\xaa*+\x10\ +\x16\x1e\x09'g\xe7iI\xbc\xd3\xe9t\xe8\xea\xecD\ +\xc1\x99S\x8c\x97\xfd-|h\x09R\xd3\xb3\xc0\xe5\xf2\ +\xa8\x03\xccF\x1f3\xb0Y6R\xd1\xe7\x00R\xcc\xf9\ +>\xcd\xfa\xab\xf7\xf1G\xeb\xff0w\xfeS\xcf\x9a\x7f\ +4{\x19\xc7\x8f\x1e\x82V\xab\xa17\xf7.\xe0ry\ +\x88\x9b\x93\x80\xe8\x98X\x12\x00&\x82F\xa3\xc6\xb5\xab\ +\xf58v\xe4 v\x7f\xbc\x0d\xd5\x95\x97f\xf4\xf7\x1a\ +\xae\xd5\xa3\xae\xb6\x06\x0a\xc58\xc0bA,\x12C(\ +\x12\xddW\x14.\x97\x8f\xe1t\xeeq\xec\xd8\xb6\x89Q\ +\xfb\x90\xb0\x08<\xf3\xf3\x17\x10\x18\x14\x02\x0e\x87C\x9d\ +`\x96p\xf1\x0e\xf7\x9c\x1b\xea\xa6>p\xe4d!\x09\ +\x00\x13c\xcb\xfb\xef\x0a2\x16>r\xc2\xc0\x16\x98\xfd\ +\x1bs\xb5\xae\x16\xa5%EP*\x15\xf4\xd6\xde\xa5\x00\ +HLJE4\x8d\x00\x98\x04*\x95\x12\x95\x97/\xe1\ +\xeb/>\xc3W_|\x86[\xb7\xfaf\xe5w\x87\x87\ +\x06Qq\xa9\x0c\xedm\xad\x18\x1f\x97\x83\xcb\xe5B*\ +\xb5\x06\x97\xcb\xbdk!\xa0\xd3\xe9P{\xa5\x1a\xdb\xb6\ +|\x80\x9b}\xbd\x8c\x8eyr\xf53\x98??\x07\x12\ +\xa9\x94\x86\xffg\x19/o\xef\xb4\x88@\x8f\xb5G\x8e\ +\xe7i\xcd\xf1\xfe\xcc\xd69ZKD\xfb\xf5\x1c\x1b\x8b\ +^(\x9b\x9c\x92\x81\x90\xd0p\x08\x84\x02\x8b^\x1ah\ +0\x18\xd0\xd1\xde\x86\xa3\x87\xbf\xa1/\x9a\x89\xa2T*\ +q\xb9\xa2\x1c{\xbf\xfc\x1cg\xf2r\xa7}\xae\x9f\x09\ +\x95\x15\xe5\xb8V_\x87\x9a\xeaJ\xa4g\xce\xc3\xdc\xf8\ +$xzy\x83\xcf\x170>\xc7@\xff-\x9c:q\ +\x8cq\xd1\x9f\xf8\x84d\xa4\xa7\xcf\x83\xad\xcc\x8e\x9c\xff\ +\x03@\xcf\xb1\xe1[\xdf.\x10\xb4\x84\x04\x80\x89\xb0\xf3\ +\xc3u\xab\xe3\xe6=\xb9\xd8\x92\x97\xc3\x0b\x85b$\xa7\ +\xa6#g\xf12XK\xada\xc9\x95\x01\xf4z=*\ +.\x96\x91\x000Q4\x1a5\xaa\xab*\xf0\xd5\x17\x9f\ +\xa1\xe0\xf4\xa9\x07\xe2\xfc\xbfC\xa1\x90\xe3\xf4\xa9\xe3h\ +\xbc~\x0d\xd5\x95\x97\x91\x92\x96\x81\xf8\x84d88:\ +M9\x8a\xa4V\xabPy\xf9\x12\x8a\x8a\xce2\xfe\xbd\ +\xa5\xcb\x1f\x83\x7f@\x10\x0d\xfd?@\xe2\xe6=\xb9x\ +\xe7\x87\xea\xd5\xcf\xbf\xf2\xdb=$\x00L\x00ww\x8f\ +w\xa9\x16\x0e \x12\x8b!\xb3\x95\xc1\xc6Vf\xd1#\ +\x00:\x9d\x0eRkk\xea\x10&\xfa\xec\x9a\x9b\x1aq\ +\xf4\xd07\x0f\xdc\xf9\xff+\xad7\x9a\xd1\xd7\xdb\x8b\xca\ +\xcb\x97\x90\x98\x5c\x8a\xa5\x0f?\x86\xa0\xe0P\x88\xc5\x92\ +I\x85\x80\xc1`@OO7N\xe7\x9d@G\x1b\xb3\ +\xc4\xbf\xc7\x9fX\x8d9s\x13\xa9\xde\xff\x03\xc6`\xb8\ +\xedS\x00\x90\x000v>\xdd\xf6\xb7\x0f\xbd#\xb3<\ +\xa9\xdb~[\xe9\x8e\xaa\xde\x81\xc5b\x81\x06OM\xf1\ +\xc3k@\x7f\xff-\x14\x9c9\x85/\xf7\xec\xbe\xa7s\ +\x08\x85bx\xfb\xfa\xc2\xc1\xc1\x09B\xa1\x10VVV\ +\xd0\xe9t\x18\x97\xcb\xd1w\xb3\x97\xf1F@?4\x1a\ +\xd0\xdc\xd4\x80\xee\xaeN\x94\x16_\xc0\xcaUO#)\ +%\x1d\xde\xde\xbe\x10\x08\x85w,\x1dT)\x95(.\ +<\x87\xcb\x97\xca\x19\x89\x98\x90\xb0\x08\xa4ed\xc1\xdd\ +\xc3k\xda\x97 \x12w\x8fwd\x96\xe7\xa7\xdb\xfe\xf6\ +\xe13\xbf\xfc\xcd+$\x00\x8c\x94\xad\x1b\xd7x'f\ +?\xf52\xed\xf4ww\x1fY\xb3\x11;\x84Y\xa1R\ +*QYQ\x8e];\xb6\xdc\xfd\x07\xdb\xc7\x0f\x11\x91\ +\xd1\x08\x0a\x0e\x85\xb7\x8f/\x9c\x9c]!\x16K\xc0\xe5\ +r\xa1\xd1h0::\x8c\xde\x9e\x1e\xb447\xe2\xda\ +\xd5:TUV\xa0\xaf\xb7\xfb\xbe\x84\xc0\xbb\x7f\xf9\x13\ +\x16,\x5c\x8cy\x0br\x90\x90\x94\x02ggW\xf0\xf9\ +|\x18\x0c\x06\x5c\xbbV\x8f\xd3y'\xd1z\xa3\x99\x91\ +hIHLAxd4D\x22\xda\xb7\xccXH\xcc\ +~\xea\xe5\xad\x1b\xd5\xef\xbe\xf8\xfa;\xad$\x00\x8c\x10\ +k\x89\xe8\x13\xbd\x81\x1c\x01\x13\xf4z=\xc6\xe5r\x0c\ +\x0c\xf4C\xa1\x187i!\xc0\xe7\x0b`go\x0f\xa9\ +\xd4\x9a\xa2%3\xea\x9f\xed\xed\xad\xd8\xbf\xf7\xcb\xbb\xaa\ +\xe8g+\xb3\xc7\xfc\x059HHJEhX\x04<\ +<<\xbf_\xb6\xf7\xaf\x22\xf1\xbb=3\xc6\xc6F\xd1\ +\xd6z\x03\xb5W\xaaQ^V\x8c#\x07\xf7\xdd\xd7u\ +\x9f>u\x1c\x97.\x96!;g\x11\x16>\xb4\x14\xa1\ +\xa1\xe10\x18\x0c(<\x97\x8f\xea\xaa\xcb\x8c\xce\x11\x1c\ +\x1a\x86\xa4\x94t\xb8\xb9yPG0\xa6>i`\xc1\ +Z\x22\xfa\x04@\x16\x09\x00#c\xe7\x87\xeb~\x1a\x9b\ +\xb52\x93\xe6\xfe\x99E\xfd7o\xf6\xa1\xb4\xb8\x10\x95\ +\x97/\xa1\xa7\xbb\xcb\xa4\xf7\x0f\xb0\xb7w@Tt,\ +\x12S\xd2\xe0\xe5\xe5C\x22\xc0\x0c\x18\x1d\x1dA\xe1\xf9\ +\x02\x94\x16\x171>\xc6\xdd\xc3\x0b\xcf<\xfb\x02\x92S\ +\xd2\xe1\xe9\xe5\xf3\xa3\xd1\xf3w\x82\xc0\xda\xda\x06\x11\x91\ +\xd1\xf0\xf9v\xc4 6n.\x8e\x1e>\x80\x8a\x8b\xa5\ +\xf7|\xedC\x83\xfd\xd8\xfb\xe5\xe7\xa8\xaa\xac\xc0\xe2%\ +\xcb\xc1\xe7\x0bPVr\x81\x91\x90\xb1\x95\xd9#5=\ +\x13\xd11q\xe0r\xb9\xd4\x11\x8c\x8c\xd8\xac\x95\x99;\ +?T\x85\xc3\x02\x04\x00\x00 \x00IDAT\xfd\xf4\ +\xf9W~\xfb\x19\x09\x00#\xc2\xdd\xdd\xe3\xff\x92\xf3g\ +\x86R\xa9@\xd5\xe5\x8b\xd8\xb6\xe5\x83\xfb\x9a\x035&\ +J\x8a\x0b\xa1\xd5i\xe1\xf0\xd8JH$\x944e\xca\ +\xe8\xb4Z4]o\xc0\xa9\x93\xc7\x18'\xfdy\xfb\xf8\ +\xe1\xd57\xdeFrj:\xec\xed\x1d\xeeZ\x04J\xa4\ +R\x84\x84\x86\xc3\xdd\xdd\x13\xa1a\x918}\xea8N\ +\x1c;\xcc\xb8R\xdfd\x5c\xbfV\x8f\xeb\xd7\xeaa+\ +\xb3\x87J\xa9dtLDd42\xb3\xb2!\x9b\xe6\ +\xbd\x07\x88\xe9\x0a\x9en\xfb\x1a\x00f!\x00\xcc\x22T\ +\xda\xbde\xc3_\xbd#\xb3\xbc\xa8{2C1>\x8e\ +\xc6\xeb\x0df\xe3\xfc\x81\xdb\xfb!\xb447A1>\ +N\x0f\xd8\xc4\x19\x1e\x1eB\xde\xa9\xe3\x8c\xa3p?\xff\ + \xbc\xfc\xda[\xc8\xc8\x9c\x0f\x07\x07\xc7{\x1e\x01\xb2\ +\xb2\xb2\x82\xadL\x86\xa8\xe8X<\xfb\xfcK\xf8\xc3\x7f\ +\xfe\x7fxt\xc5*\xd8\xca\xec\xef\xeb~\x86\x06\xfb\x19\ +\x09\x19w\x0f/\xcc_\x90\x03\x7f\xff@\x1a\xc52b\ +\xbc#\xb3\xbcvo\xd9\xf0W\x12\x00FBJ\xce\xaa\ +\xdfQ\xb7d\xaa`\x0d\xd0\xeatP\xa9\x94fwo\ +Z\x8d\xe6\xfb\xed^\x09\x13\x8d\xfeu:\x94\x95^\xc0\ +\xf9s\xf9\x8c\xda\xdb\xca\xec\xf1\xe8\x8a'\x91\x9c\x92\x06\ +\x1b[\xdbiI\x06\xe5p8pptBZ\xc6<\ +\xbc\xfc\xda\x9bx\xfb\x9d\xff\x07\xa9iY\xf7-\x04\xa6\ +\x222*\x06I)i\x10\x89\xc5\xd4\x11\xc8\xe7\xcc\x0a\ +&?\x05\xf0\xf9\xf6\xbf\x7f\xa95X\x91\x5c\xbe\x07!\ +0\x19B\xa1i||\x8ce=81\xbd\xb4\xdeh\ +FA~\x1e\xe3\xb5\xf2\xc9\xa9\xe9HNI\x87\xa3\x93\ +\xf3\xb4\xae\x04a\xb1X\x10\x08\x04\xf0\xf4\xf4\x86\xb3\x93\ +\x0bB\xc3#q:\xef\x04J.\x14\xa2\xb9\xa9qZ\ +\xb6\x1a\xfe\xf7\xe8?;g\x09<\xbd\xbciE\x8b)\ +\x04\x1b\x06+\xf6\xe7\xdb\xff\xfe\xe5O^\xf8\xf5*\x12\ +\x00\x0f\x88m\x1f\xac\x09\x89_\xf0\xd4\x93\xb4\xecoz\ +\xb0\x95\xd9#95\x1dvv\xf6F}\x9dc\xa3\xa3\ +\xa8\xa9\xaeDsS\x03=43B.\x1fCY\xe9\ +\x05TW^f$\xf0\xfc\xfc\x83\x905/\x1b\x01\x81\ +A36d\xcef\xb3!\x10\x0a\x11\x16\x1e\x09ww\ +ODE\xc5\xa2\xb4\xb8\x08ee\x17\x18\x97\xf3e\xc2\ +\xbc\x059HJN\x03\x87C\x89\x7f\xa6B\xfc\x82\xa7\ +\x9e\xdc\xf6\x81\xea\xff\xfc\xf2\xb5w\xae\x92\x00x\x00X\ +\x8bE[\xc8\xf9O\x1f^^\xdex|\xc5*\xf8\x05\ +\x04\xde\x8eB\x8c\xd1\xb6,\xa0\xa7\xbb\x1b\x1c\x0e\x87\x04\ +\x80\x19\xa1\xd7\xeb\xd1\xdc\xd4\x88\xd2\x92\x0b\x8c\x9e\xabP\ +(FZF\x16\xe6\xccM\x84P8\xf3k\xe5Y,\ +\x16le2\xa4g\xceG`P\x08\x22\xa3cQx\ +.\x1fgN\xe7\xde\xf7h@L\x5c<\x16/Y>\ +mS\x18\xc4,\xf5Y\xc3m\x1f\x04 \x93\x04\xc0,\ +\xb3c\xd3\xdaE1Y+3(\xf3\x7f\xfa\x10\x0aE\ +prv\x81\xbb\xbb\x91\x17R4\x00R)\x95\xf65\ +'\x86\x87\x87P^Z\x8c\xe2\xa2\xf3\x8c\xda\x87\x86G\ + 5-\x13.\xaen\xb3z\x9dVVVp\xf7\xf0\ +\x84\x83\xa3\x13\x02\x83B\x10\x11\x19\x8dsg\xcf\xa0\xe0\ +L\xee=\x9fs\xfe\x82\x1c\xf8\xfa\xf9S\xbd\x7f\x13$\ +&ke\xc6\x8eM\xcaE\xbfx\xf5\xed\x13$\x00f\ +3\xfa\x97\x8a\xfeJ\xce\x7f\x06|\xeb\xb7\x05R(\x12\ +!f\x0b\x8dF\x83\xabuWp6?\x8f\xf1Z\xf9\ +\xc4\xa4\xdb\x95\xf2\x1e\x94\xd3\xe4\xf3\xf9\x08\x0c\x0a\x86\xb3\ +\xb3\x0bB\xc3\x22\x1077\x01\xc7\x8e\x1c\xc0\xd5\xba+\ +w?\xba\xc0fO(TD\x98\xca\xf7\xf2\xb6/\x02\ +`\x92\x02\xc0$\x93\xe7vn^\xf7\xf3\xc8\xb4\x15\xd1\ +\xd4\xfd,\xf4\xa5\x03)?s\xa2\xaf\xb7\xe7v\xd1\x9f\ +\x92BF\xed\xfd\xfc\x03\x909/\xdb(rU\xacm\ +l\x10\x19\x1d\x8b\xc7W\xac\xc2\x7f\xfc\xf1\xbf\xb1\xf2\xa9\ +g\xee:\x916\xfft.Z\x9a\x9b\xa0\xd1h\xa83\ +\x98 \x91i+\xa2wn^\xf7s\x1a\x01\x98%\xec\ +e\xb6\xffE\xdd\x8e L\x1f\xc5\xf88\xeajkp\ +\xee\xec\x19F\xed\x85B1\x16/Y\x8e\xe0\xe00\xa3\ +Y+\xcf\xe1p`\xef\xe0\x08k\x1b[x\xf9\xf8 \ +,<\x12\xdf\xec\xfd\x02\xd5U\x15\x8c\x8e\xaf\xb8X\x8a\ +\xbcS\xc7\xe1\xe7\x1f\x08[\x99\x8c:\x85\xe9\xfa\xa4O\ +h\x04`\x86\xd9\xb5y\xfd\xeb\xc1\x09\xcb\xfcM\xb9\xb3\ +|W\x87\xff\xe6\xcd>\x0c\x0f\x0fA\xa7\xd5\x9a\xd5\xcb\ +\xa0\xd7\xeb\xa1R\xa90<4\x88\xbe\xde\x1e\xf4\xf6\xf6\ +`pp\x00J\xa5\x92\xd6\xe9\x13w\xf4\x93\xde\xde\x1e\ +\x9c-\xc8c\x5c\x94j~v\x0e2\xe7gC \x14\ +\x1a\xd5\xbd\xb0X,\xf0x<\xb8\xba\xbac\xd9\xf2\xc7\ +\xf0\xf2ko\x22-c>\xe3\xe3O\x1e?\x82\xfa\xba\ +\x1az?L\x94\xe0\x84e\xfe\xbb6\xaf\x7f\x9dF\x00\ +f\x18_\xff\xa0?\x9arG\xd1\xe9th\xbd\xd1\x82\ +\xdc\x13G\xd0\xd7\xd7\x0b\x1b\x1b\x1b\xa4g.@Xx\ +$\x04\x02\x01L\xfd\xde\xe4cc\xb8q\xa3\x09\x95\x15\ +\x97\xd0\xd3\xd3u{\xa3!\xbd\x01B\xa1\x08\xf6\x8e\x8e\ +\xb7wh\x0b\x0a\x81\xb5\x8d-%=Q\xf4\x8fK\x17\ +K\xb1\xf7\xcb\xcf\x19\xb5w\xf7\xf0\xc2\xe2\xa5\x8f\xc0\xc9\ +\xc9\xc5h\xe7\xcbY,\x16\xa4Rk$&\xa7\x82\xc5\ +ball\x14\x95\x15\xe5S\x1e\xd7\xd9\xd1\x86\xa2\xc2\ +\xb3\x88\x88\x8a\xa1\x04W\x13\xe5[\xdf\xb4\x91\x04\xc0\x0c\ +\xf1\xf1G\xeb\xdfv\x09\x88w1\xe5Nr\xb3\xaf\x17\ +\x9f~\xb2\x0d\x07\xf6}\xfd\xfdZ\xe7\xa6\xa6F\xbc\xfe\ +\xeb\xb7\xe1\xe7\x1f\x08+++\x93\xbc/\xa5B\x81\xd6\ +\xd6\x16\x9c>u\x02\xb9'\x8f\xa2\xb5\xa5e\xc2Zn\ +\xa1P\x0cW7w\xa4eda\xd1\x92\xe5\x08\x0a\x0e\ +\x81X,\xa1\xe4'\x0bD\xa7\xd3\xa1\xb5\xb5\x05\xff\xf8\ +l\x17\xe3c\x1eZ\xbc\x0c\xe1\x91Q\xe0\xf3\xf9F\x7f\ +\x7f\x22\x91\x18s\xe6&b\xd5\xeag08\xd0\xcfh\ +\x1b\xe0\xab\xf5uhokEhX\x04\xbd\x13&\x88\ +K@\xbc\xcb\xc7\x1f\xad\x7f\xfb\xd9_\xbd\xb5\xd6T\xae\ +\xd9\xa4\xa6\x00|\xfc\x83\xde6\xe5\x0eb0\x18\xd0\xda\ +\xda\x82\xea\xaa;\x0b\x9d\xe4\x1e?\x8c\xce\xce\x0e\xe8t\ +\xa69\x150.\x97\xe3by\x09>\xf8\xfbZ\xbc\xbf\ +\xe1]\x5c\xad\xbb2i!\x97\xef\xf6M\xdf\xbdk+\ +6nX\x83\xc2s\xf9\x18\x1e\x1e2\xe9\xad\x88\x89{\ +cdx\x08y\xb9\xc7\x18\x17\xd3\x09\x8f\x8cF\xfa\xb7\ +\xb5\xfeM\xc59J\xad\xad\x91\x90\x98\x82\x87\x16/c\ +\x94\x18\xd8\xdev\x03\xad7Zh\x1a\xc0\x8415\x1f\ +e2\x02\xe0\xe3\x8f\xd6\xff\xd6\xc5?\xde\xd9\xd4\x05\x80\ +B\xa1\xc0\xd8\xe8\xe8$Nt\x0cz\x13\xacj\xa4V\ +\xabQQQ\x8e\xdd\x1fo\xc7\xa9\x93G\x19\x1fW|\ +\xe1\x1c\xb6m\xf9\x00\xc5E\xe7\xa1P\xd0\x06>\x96\x84\ +F\xa3\xc1\x95+\xd58[p\x9a\xf11\xcb\x1e~\x0c\ +!\xa1\xe1\xe0ry&u\xafN\xce.\x9837\x11\ +\x11\x91QS\xb6\x1d\x1e\x1eF\xeb\x8dfz\x1fLy\ +\x14\xc0?\xde\xf9\xe3\x8f\xd6\xff\x96\x04\xc0t++\xbf\ + \xf3\xd8\xf0\xe7\x07\xa2\xdd\xdb\xce\xdf\xf4\x04\xc0\x8d\x96\ +&\x1c;|\x00\xe5\xa5\xc5w}lmM\x15\xfe\xf1\ +\xe9N\x5c\xad\xab\x85^\xaf\xa7\xaf\x87\x85p\xebV\x1f\ +\xf2O\xe7\xa2\xb9\xb1\x91Q\xfbEK\x96#19\x0d\ +66\xb6&w\xaf\x5c.\x17\xbe\xfe\x01\x08\x0e\x0d\x9f\ +r\x14`h\xb0\x1f\xcdM\xd71N;Z\x9a\xf6(\ +\x80\x09\xf9*\x93\x10\x00\xbb6\xaf{\xd5%\xc0\xb4\xa3\ +\x7fsdlt\x14\xa5%E(<_p\xcf\x9b\xf3\ +\x94\x97\x15\xe3\xcc\xe9\x93\x18\x18\xe8'\x83ZD\xf4\xaf\ +FY\xc9\x05\x141\xec3\xde>~\xc8\xc8Z\x00/\ +/\x1f\x93\xdd\x22\xd7\xd9\xd9\x15>\xbe~\x90ZO\x9d\ +\xdc\xd7\x7f\xeb\x16F\x86\x87\xa8\xa3\x98\xf2(@@\xbc\ +\xf3\xae\xcd\xeb^5\x85k5\x89$@77\x0f\xda\ +\xee\xd7\x08\xe9\xe8hCe\xc5E\xf4\xf5vO\xf8\xdb\ +\xfc\xecEX\xb2\xec\x11\x84\x84F\xc0\xca\xca\x0a7Z\ +\x9ap\xf0\x9b\xafq6\xff\xf4\x84\x0f\x7f\xc5\xa5r\xcc\ +\x9b\x9f\x03;;{\xda\x07\xdd\xcci\xbc\xde\x80\xfc\xd3\ +\xb9\x8c\x92\xe2\x00 !)\x15\x91Q\xb1\x90H\xa5&\ +{\xcf|>\x1f\x1e\x1e^pqq\x9d\xf4]\xf9W\ +\x14J\xc5\xf7y1\x94\x08h\xba|\xeb\xb36\x91\x00\ +\xb8Ov~\xb8\xee\x19\xef\xc8,o\xeaR\xc6\x16\xc9\ +i\xd0\xd5\xd5\x89\xa6\xa6\xeb\x13\xfe\x965?\x07?{\ +\xf6\x97\x88\x89\x9d\x03\xde\xb7\x19\xdb\xee\x1e\x9e\xf0\xf4\xf2\ +\x06\x8f\xc7\xc3\xa1\x03{\xefh\xdf\xdb\xd3\x8d\xee\xee.\ +Dj\xb5\xe0\xf1xd\x5c3exx\x08%\x17\xce\ +\xa3\xa6\xba\x92Q\xfb\x90\xb0\x08$\xa7\xa4\xc3\xdb\xc7\xd7\ +\xe4\xef\xdd\xc9\xd9\x05v\xf6\x0eS\xb6S\xa9\x94\x18\x19\ +\x19!\x01`\xe2xGfy\xef\xfcp\xdd3\xcf\xbf\ +\xf2\xdbO\x8d\xf9:\x8d>\xdc\xb2\x96\x08\x7fO\xdd\xc9\ +\xf8P)\x95\xe8\xbf\xd5\x87\x81\xfe\x89C\xf7\x89I)\ +\x88\x88\x8c\x86@(\x04\x9b\xcd\x06\x9b\xcd\x06\x8f\xc7\x83\ +\xa7\x97\x0f\x96,{tB{\xb9\x5c\x8e\xce\x8e6\xa8\ +\xd5*2\xac\x99\xa2\xd3j\xd1p\xad\x1e\xe5e%\xe8\ +\xech\x9b\xb2\xbdP(FJj\x06\xe6&$\x99\x85\ +(\x94H\xa5\x8c\xea|\xa8\xd5j()\x09\xd0,0\ +\x05\xdfe\xd4\x02`\xc7\xa6\xb5\x0b#\xd3V\x84SW\ +2>\xb4:-\x94\x0a%\xd4j\xf5\x1d\xff\xdfVf\ +\x0f{\x07G\x88\xc4\x13\x13\x9e8\x1c\x0e\x1c\x9d\x9c\x11\ +\x13\x17?AL\x0c\x0e\x0c@kf\x15\x11\x89\x7f2\ +0\xd0\x8f\x8be%\x8cw\xfb\x8b\x89\x9d\x83\xacy\x0b\ +\xe1\xe0\xe0h\x16\xf7oee\xc5\xa8\xc6\x87N\xab\xa3\ +e\x80fBd\xda\x8a\xf0\x1d\x9b\xd6.$\x01p\xaf\ +\xaaY,\xf8\x13\xad\x107NX,\x16\xd8V\x93w\ +\x1f\xadV\x0b\xc3dY\xfd\x06\x03\xb4Z-\x94J\xc5\ +Dq\xc0\xe5\xd0\x90\xa7\x99\xa2V\xabPWw\x05\xf9\ +\xa7s\x19%\xfe99\xbb\x22%=\x13!\xa1\xe1f\ +\x93\x13\xa2\xd5h\x199v+\x8e\x15\xac\xac\xa8B\xa6\ +9`\xf8\xd6\x87\x91\x00\xb8\x07\xb6n\x5c\xe3\x1b\x9b\xb9\ +2\x85\xba\x91q\xc2\xe5r!\x91H!\xfe\xb7H\x7f\ +h\xb0\x1f7Z\x9ap\xab\xff\xd6\x84c\x14J\x05\xae\ +]\xad\x9b\xb0e*_ \x80\xb3\xb3+\xb8\x5c.\x19\ +\xd6\xdc>\x82\x06\x03\xba\xbb\xbbp6?\x8f\xf1\xe68\ +!\xa1\xe1HK\xcf2\xe9\xc4\xbf\x7fgxx\x08c\ +ccS\xb6\xe3\xf1x\x93\x8e\x9e\x11\xa6Il\xe6\xca\ +\x94\xad\x1b\xd7\x18m\x12\x8b\xd1\x0a\x00\x89H\xb0^O\ +\xe1\xbf\xd1\x22\x10\x08\xe1\xe4\xe4\x0cG\xa7\x89\xab3\xcf\ +\x9d=\x83\xf3g\xcf\xa0\xb7\xa7\x1b*\x95\x0aj\xb5\x1a\ +\x83\x83\x03(\xbep\x1e\x07\xf6\x7f5\xa1\xbd\x8d\x8d\x0d\ +\x5c\xdd\xdc\xc1\xe3\xf1\xc9\xb0f\xc6\xb8\x5c\x8e\xca\x8a\x8b\ +\xc8\xcb=\xce\xa8\xbdP(\xc6\xa2\xc5\x0f\xc3\xd7\xcf\xdf\ +\xacV\x84\xf4tw\xe2\xd6\xad\xbe)\xdb\xf1\xf9\x02H\ +\xa5R\x1a\x0d3\x13\xf4\x86\xdb\xbe\xccX\xaf\xcfh\xc7\ +\x9a\xe6\xce_\xf5(\x09\x00\xe3\x85\xcdf\xc3\xc3\xd3\x1b\ +\xe1\x11Q\x136;\xb9Zw\x05_\xed\xf9\x14m\xad\ +-\xf0\xf3\x0f\x02\x9b\xcdF{\xdb\x0d\x14\x15\x9eE\xc5\ +\xc5\xd2\x09\xe7\xf2\xf6\xf1\x83\x87\xa7\x97\xc9\xee\x83@L\ +\x8eN\xa7CGG;\xf2O\xe7N\xb9\xfc\xed;\x96\ +=\xf28\x92S\xd3\xc1\xe7\x0b\xcc\xc6\x0ecc\xa3h\ +ok\x9b4a\xf6\xdf\x11\x89\xc4\xb0\xb3\xb3'\x01`\ +F\xcc\x9d\xbf\xeaQ\xe0\x0d\x12\x00L\xd9\xbdu\x03E\ +\xff&\x80\x8b\xab+b\xe3\xe6\xa2\xac\xf4\xc2\x84\xed\x5c\ +\xab\xab*p\xbd\xe1\x1a<\xbc\xbc\x00\x007\xfb\xfa0\ +4\xd8?i\xc4\x97\x96\x9e\x05/o\x1f\xfa\xe8\x99\x19\ +r\xf9\x18\xcaJ\x8ap6\x9fY\xc9_o\x1f?,\ +Y\xba\x1c\xf6&T\xef\x9fY\xf4\xdf\x85\xe6\xa6\xebS\ +\x8a \xa1P\x0cgg\x17Hh7@\xb3\x1b\x05\xd8\ +\xbdu\xc3\xfa\x9f\xbd\xf8\xe6[F\x17\xc8\x19\xa3\xc1\x22\ +b\x93_\xa0nc\xfcp\xb9<\xc4\xc6\xc5c\xce\x9c\ +\x84I\xcb\x9c*\x14r\x5c\xbfV\x8f\xeb\xd7\xea'u\ +\xfe\x00\xe0\x17\x10\x80\xe4\xd4t\x08\x04B2\xa8\x99E\ +\xff\xcdM\x8d\xd8\xf3\xf9'\x8c\xabD>\xfa\xf8\x93\x08\ +\x0c\x0a1\xab\x5c\x10\x85b\x1c\x0d\xd7\xeaq\xf5j\xed\ +\x94m\xf9\x02\x01\x02\x02\x83 \x12\x8a\xa8\x03\x99\x19\xc6\ +\xea\xd3\x8cN\x00\xec\xdc\xbc\xee9\x91\xbd\xaf\x94\xba\x8c\ +\xf13>>\x8e\x8e\xf66\x0c\x0d\x0d\xde\x97\x88ho\ +o\xc3\xb8\x5cN\xbb\x02\x9a\x11\x83\x03\xfd8rh?\ +\x9a\x9b\x1a\x18\xb5ON\xc9\xb8]\xef\xdfVf6\xd1\ +\xbf\xc1`@wW\x17\xca\xcb\x8a\x19\xedzhgg\ +\x0fo\x1f?\x08\x84$\x86\xcd\x0d\x91\xbd\xaft\xe7\xe6\ +u\xcf\x91\x00\x98\x02\xa9H\xf0k\xea.\xa6\xe1\xfc/\ +\x96\x15c\xd7\x8e\x8fp\xe2\xd8\xa1{\xde\x0b\xa0\xb2\xa2\ +\x1c[7\xbf\x8fsgOC\xce K\x9a0~\xd4\ +j5.\x96\x97\xe0B\xe19F\xed\x85B1\x16>\ +\xb4\x04\xfe\x01\x81f\x15\xfd\xcb\xe5c\xb8\x5cQ\x8e\x03\ +\xfb\xbef\xd4\xde? \x10\xbe~\xfe\x94\x0bc\xa6\x18\ +\xa3o3*\x01\xb0u\xe3\x1a\xdf\xa8\x8c'\xa2\xa9\xab\ +\x187\x1a\x8d\x1aW\xebk\xb1\x7f\xef\x17(8\x93{\ +\xdf\xe7\xab\xac(\xc7\xc7;\xb6\xe0\xe2\xc5R\xa8TT\ +\x0d\xd0\xd4\xe9\xech\xc7\xf9\xb3\xf9\xe8\xee\xead\xd4>\ +g\xd1R\xc4'&\xc3\xda\xda\xc6ll\xa0\xd3\xe9\xd0\ +\xd2\xdc\x84\x93\xc7\x8f0\x16\xc7\x91\xd1\xb1pqq\xa3\ +\x0ed\xa6De<\x11mlK\x02\x8d*\x09P,\ +\xe4\xff/\x8d\x02\x1b7z\xbd\x1e=\xdd\xdd8q\xec\ +\x10N\x1c;\xf4\x83\xed\x16,\x5c\x8c\xa8\xe8X\xd8;\ +8\x82\xcdbchh\x10\xd7\xae\xd6!\xf7\xc4\xd1I\ +?\x88\xd5U\x158\xf8\xcd\xd7pttBXx$\ +%\x04\x9a(\x8a\xf1q\x94\x97\x15\xe3by\x09#\xc7\ +\x17\x12\x16\x81\xccy\xd9\xf0\xf0\xf02\xab\xa1\xff\xa1o\ +\x97\xbd\x9e+\xc8ctLHX\x04RR3\xc0\x17\ +\x08\xa8\x13\x99)\x06\xc3m\x1f\x07\xe0)\x12\x00\x93\x90\ +\xb0\xe0\xc9'u$\x00\x8c\x1a\xa5R\x89\x8b\xe5%\xf8\ +\xfa\x8b\xcf'\xfd{bR\x1a\x1e~\xe4q\xc4\xc4\xcd\ +\x85\xad\xcc\x0eB\x81\x10,\x16\x0b*\x95\x12CCC\ +\xc8\xceY\x8cC\x07\xf6\xe2\xd4\xc9\xa3\x13\x8e\xbdT^\ +\x8a\xb0\xf0H\xb8\xb8\xba\xc1\x9e\xc1\xc6)\x84\xf1\xd1\xd0\ +P\x8f\x823\xa7\x18\xed\xf6'\x14\x8a\x91\x9c\x9c\x8e\x88\ +\xa8h\x08E\xe6\x93\xf8\xa6\xd1h\xd0x\xbd\x01y'\ +\x8f1>\xe6\xb1\x15\xab\xe0\xe3\xe3G\xbba\x9a9\x09\ +\x0b\x9e|\x12\xf85\x09\x80\x7f\xe7\xe3\x8f\xd6\xbf\xa13\ +\xb0)\xec3\xf2\xe8\xbf\xaf\xb7\x07\xf9gNM\x88\xee\ +\x84B1\x92S\xd3\xf1\xf43\xcf!&f\x0e\xc4\x12\ +\xc9\x1d\x11\x9dH,\x86\xad\xcc\x0e.\xae\xaepvq\ +\x81\x9d\x9d=\xbe\xdc\xb3\xfb\x8es\xf4\xf5v\xa3\xba\xb2\ +\x02\xf1\x09I\x90\xc9\xec\xe8chb\xf4\xdf\xba\x89\x0b\ +\x85\xe7Pq\xa9\x9cQ\xfb\xd0\xf0\x08\xc4'\xa5\xc0\xcd\ +\xcd\xc3\x8c\xa2\xbc\xdb\xd1\xff\xe9\xbc\x13\x8c+\x1f\xce\xcf\ +^\x84\xc4\xa4T\xb3\x12A\xc4\xe4\xe8\x0cl\xd6\xc7\x1f\ +\xad\x7f\xe3\xd9_\xbd\xf5\xbe1\x5c\x8f\xd1|a%\x22\ +\xc1\x8b\xd4=\x8c\x1b\xadV\x83\x86k\xf5\x93f4\xfb\ +\x05\x04`\xd5\xeag07>\x09\x92\x1f\xa8d\xc6b\ +\xb1 \x14\x8a\x10\x1a\x16\x89\xc7W\xae\xc6\xb2GVL\ +hSUY\x81\x96\xe6&\xa8\x94J2\xb8IE\xbd\ +j\xd4\xd5]A\xc9\x85\xc2\x1f\x5c\xf2\xf9\xaf\xd8\xca\xec\ +\x11\x9f\x90\x84\xd8\xd89\xe0p8f\xf4\x8ehq\xb1\ +\xbc\x04'\x8e\x1df\xd4\xde\xc9\xd9\x15\xd99\x8b\xe1\xee\ +\xe1I\xc9\x7f\x16\x821\xf9:\xa3\x10\x00[7\xaeq\ +\x8fL\xa7]\xff\x8c\x1d\xb5Z\x8d\xce\xce\xf6\x09\xdb\xb9\ +\x0a\x85bd\xce\xcb\xc6\x9c\xb9\x89\x8c\xb6<\xe5r\xb9\ +\x08\x0a\x0aA\xd6\xbcl\x04\x06\x87N\x18\x05hkm\ +\xc1\xc8\xe8\x08\x19\xdc\x84\xe8\xeb\xed\xc5\xc5\xb2b\x94\x96\ +\x142j\x1f\x1e\x1e\x89\xec\x9c%\xb0\x95\xd9\x99U\xf4\ +\xdfz\xa3\x05G\x0f\x1f`\x5c\xf90%-\x031\xb1\ +s!\x16K\xa8\x13Y\x08\x91\xe9+\xc2\xb7n\x5c\xe3\ +N\x02\xe0[D\x02\xfe\xff\xa5\xe4?\xe3\xff\xb8\x8d\xcb\ +\xe5hok\x9d\xf07W7wd\xcd[xW\x9b\ +\x98\x08\x84B\xf8\x07\x04!((d\xc2\xdf\xdaZo\ +`\xf8>j\x0b\x10\xb3\x8bR\xa9@}\xdd\x15\x9c9\ +\xcdlE\x88\xbb\x87\x17\x16,\x5c\x84\x80\x80 \xb3J\ +\xf6\x94\xcb\xc7p\xfe\xeci\xd4TW2j\x1f\x18\x1c\ +\x8a\x05\x0b\x17\xc1\xcd\xdd\x9d\xa6\xbb,\xea[z\xdb\xe7\ +\x91\x00\xf8\x96\x98\xc4\xac'\xa9[\x18?\x0a\xa5\x02\xad\ +-\x13\x93\xbbB\xc3\xc2\xe1\xe4\xe4|W\x1fs\x16\x8b\ +\x05[\x99\x0c.\xaen\x13\xaa\x08\xde\xbay\x13\x0a\x85\ +\x82\x0a\x03\x99\x00z\xbd\x1e]\x9d\x9d8\x93wrB\ +9\xe8\x1f\x22vN\xfc\xedz\xfff\x94\xf1\xae\xd7\xeb\ +\xd1p\xb5\x1eE\x85\xe7\x18G\xff\x0bs\x16#22\ +\x86\xaa`Z \xc6\xe2\xf3\x1e\xb8\x00\xd8\xf1\xe1\xdaG\ +8\x12\x17z\x03L\x00\xadF\x8b\x8e\x7f\x1b\xfe\x07\x00\ +{\x07Gp\xee\xa1\x80\x8bP \x82\x8d\x8d-\xa4\xd6\ +w\xd6>\x1f\x93\x8fB\xa7\xd5\x92\x000\x85\xa8wl\ +\x0ce\xa5E\xd8\xbfw\x0f\xa3\xf6N\xce\xaeX\x90\xbd\ +\x08n\xee\x9ef\x15\xf5\x0e\x0e\x0e\xa0\xb0\xb0\x00W\x18\ +T\xfc\x03\x80\xb4\x8c\xf9HLJ\x83\xa3\xa3\x13u\x22\ +\x0b\x84#q\x11\xee\xf8p\xed#\x16/\x00\xc4B\xfe\ +\x1b\xd4\x1dL\x03\x83A\x0f\x85B1\xb13s8`\ +\xb1Xw=\x9c\xcbb\xb3`e51\x01L\xa7\xd3\ +\x91\xf37\x05A\xa8\xd5\xa2\xa5\xa5\x09'\x8f\x1da|\ +\xcc\xd2e\x8fb\xce\xdc\x04\xf0x<\xb3\xb1\x83F\xa3\ +AUe\x05\x0a\xcf\xe63J\x80trvErJ\ +:\x82\x82C`eF\x09\x90\x84\xe9\xf9\xbe\x07.\x00\ +\xe2\xb2\x9e\x9cO]\xc1T\xa0U\x9a\xc4?\x19\x1d\x1d\ +A\xd1\xf9\x02T^\xbe\xc4\xa8}Tt\x1c\xb2\x1fZ\ +\x0c;{\x07\xb3\x9a\xfb\xefho\xc3\xb9\xfc<\xc6\xcb\ +\xfe\xa2c\xe2\x90\x90\x94\x02\x1b[\x19u\x22\x0b\xc6\x18\ +|\xdf\x03\x15\x00\xbb6\xaf\x7f\x9d\xb6\xfd%\x08\xd3\x8c\ +\xfe\xaf\xd6]\xc1\xb1\xa3\x07\x19\x97\xba]\xb6\xfcq\xf8\ +\xf9\x07\x9a\xd5\xb2\xbf\xb1\xb1QTUV\xe0\xd2\xa52\ +F\xed\xbd}\xfc\x90\x9a\x9e\x89\xa0\xe0\x10J\xfc\xb3p\ +\xf4\x86\xdb>\xd0b\x05\x80D\xc4\x7f\x96\xba\x01A\x98\ +\x1e7o\xf6\xe2\xf0\xc1\xfd\x8c\x13\xffr\x16?\x8c9\ +\xf1\x89\xb06\xa3\xbd\xee\xf5z=:\xda\xdbP\x5ct\ +\x8e\x91\x1d\x84B1\xe6\xccMDz\xc6|\xf0\xf9T\ +\xf2\x97x\xf0>\xf0\x81\x0a\x80\xe8\x8c'\xe2\xa8\x0b\x98\ +\x0f4oo\x19\xa8T*\x14\x9e\xcbGiI\x11\xa3\ +\xf6N\xce\xae\xc8\xccZ\x00/o\x1f\xa3\x98\xf36\x18\ +\x0c0\x18\x0c\xd0\xeb\xf5\xd0\xeb\xf5\xd0\xe9t\xd0i\xb5\ +\xd0~\xfbO\xa7\xd3}\xff\xb7\xef\xdaN\xc6\xe8\xe8\x08\ +*.\x95\xe3\xe07_1\xfa]\x0f//\xe4,^\ +\x06'g\x17\xeaD\x84Q\xf8\xc0\x07\xf66~\xf2\xd1\ +\xfa?\xd2\xf0\xbf\xf98\x84\xb1\xd1Qp\xb9\x5c\xb0\x18\ +\xe6\x09\xb0X,\x8c\x8d\x8dB\xa5\xa2\x8a\x7f\xa6&\xf2\ +\x9a\x9b\xae\xe3B\xd1y\x0c\xf4\xf73:f\xde\xfc\x85\ +\x88\x9b\x13\x0f\xe9\x03\x8c\xfe\xf5z=\xb4Z-4\x1a\ +5TJ%Tj\x15T*\x15\xd4*5\xd4j\x15\ +\xd4*\x15\xb4:-\xac\xd8V\xe0\xf1\xf9\xe0\xf1\xf8\xe0\ +\x0b\xf8\xe0\xf1x\x10\xf0\x05\x10\x08\x84\xe0p\xb9\xe0p\ +8`\xb3\xd9\xd0i\xb5hn\xbc\x8e\x03\xfb\xbed|\ +\x0d\xf3\x17\xe4 \x22\x22\xca\xac\xb6<&\xee\xb3_\x1a\ +n\xfb\xc2\x9f\xff\xea\xad\xbfX\x94\x00\x10\x8b\x04\xab\xe9\ +\xf1\x9b\x07\x8d\x0d\xd7p\xf2\xc4\x11H\xc4\x12\xe0.\x92\ +\xbb\x94\x0a\x05\xae\xd4Tat\x84\xaa\xfe\x99\x0a\xa3\xa3\ +#(/-Fue\x05\xa3\xb9\xff\xa8\xe88dd\ +-\x80\xbb\x87\xd7\x03\xb9^\xb5Z\x85\x91\x91\x11\x0c\x0e\ +\xf4\xe3\xe6\xcd>\xf4\xf6t\xa3\xbb\xab\x13\xdd\xdd]\xb8\ +\xdep\x15\x95\x15?\xbcoAL\x5c<\xfc\xfd\x03\xe1\ +\xee\xe1\x09W7w89\xb9\xc0\xc9\xd9\x052\x99\x0c\ +J\xa5\x12\xf9gr\x19'\xfe}g\x07\x99\x9d=u\ +\x22b2_hY\x02 *}E\x04\x8d\x00\x98\x07\ +\xa5%\x85\x8cK\xc0\x12&\x1c\xad|[\xec\xe6\xdc\xd9\ +3\x13\xcaAO\x86\xad\xcc\x1ei\x19Y\x88\x88\x8c\x9e\ +\xd5e\x7f\x06\x83\x01J\x85\x02\xdd\xdd\x9d\xb8q\xa3\x05\ +\xf5\xb55\xb8v\xad\x1e-\xcd\x8d\x8cs\x16\x00\xa0\xb2\ +\xa2\xfc\x0e\x81\x10\x18\x1c\x0a\x7f\xff@\xf8\xf9\x07\x80\xc3\ +\xe1\x22/\xf7\x04\xe3s=\xfc\xe8\x0a\x04\x87\x84Q\xbd\ +\x7fbR_\x08\xbc\xf2@~\xfb\x81\x08\x00\x1a\xfe7\ +U\xe8\xa1Y27o\xf6\xa1\xf0|>.\x95\x972\ +j\x1f\x1e\x1e\x89\x84\xc4T8\xccb\xb1\x9b\xd1\xd1\x11\ +t\xb4\xb7\xa1\xf6J5\xcaK\x8bQ|\xe1<\xe3\xca\ +|Sq\xfdZ\xfd]\x09\x88\xefX\xf6\xc8\x0a\xa4\xa6\ +eB$\x12S'\x22&\x0a\xeb\x078\x0d\xf0@\x04\ +\x80H\xc8\xa7\xd2\xbf&\x08\x9bm\x05;{\xfbi\xfb\ +\xa0\xfe\x10<.\x0f,6\xdb\xac\xd6\x8a\x9b:J\xa5\ +\x125U\x97q\xa1\xf0\x1c\xa3\xa1\x7f'gW\xc4'\ +&#,\x91J#\x00\xa6,\x02x\xf0\xf4\xf2\x86\xbb\ +\x87\xe7\xb4\x17\xfe\xf9nC!\x8a\x96\x8c\x87\xdb\xf5\xfe\ +\xf3\x91{\xfc0\xa3\xf6\x81\xc1\xa1\xc8\x9a\xb7\xf0\xae\xb7\ +\x87\xbe\x1b\xc6\xc6Fq\xb9\xe2\x22vn\xfd\x10\xc5\x17\ +\xce\x19\xad\xed\x1a\xae\xd6\xa3\xa1\xe1*le2\x88\xc5\ +\x12\xea\xd7\xc4\x94\xbe\x11xmV\x7fsV\x05\xc0\x8e\ +Mk\x17\xe9\x0d\xf4\x12\x98\x03\x94\xd0d\xfeh4\x1a\ +\x5c\xbfv\x15\xfb\xef\xa2\xd8\xcd\xc2\x9c\xc5\x08\x8f\x8c\x06\ +\x8733\xc5nF\x86\x87QZZ\x84\x8f6\xfd\x0d\ +\xb5\x0c\xb7\xde}P\x94\x96\x14\xde.\x1a\xa4\xd3\x22)\ +9\xed\x81\x16B\x22\x8c\x1f\xbd\x81\x85\x1d\x9b\xd6.\xfa\ +\xc5\xabo\x9f\x98\xad\xdf\x9cU\x01 \x10\xf0\x9e\xa7\xc7\ +L\x10\xc6\x8f\xc1`\xc0\xe0@?\xf2\xcf\xe42^\xfa\ +\x96\x9c\x92\x81\xac\xf9\x0b!\xb3\x95\xcdH\xb4+\x97\x8f\ +\xa1\xa4\xf8<>\xde\xb9u\xda\x9c\xbfP(\x86_@\ +\x00\x1c\x1d\x9d\xc1\xe3\xf3\xa1T(\xd0\xdf\x7f\x13\xcd\x8d\ +\x8d\xd32\xadP|\xe1\x1c\xb4Z\x0d\x00\xd0R@\x82\ +\xa9\x8f4O\x01\x10\x1a\x99\xf0\x10=b\xe2~a\xd1\ +\xb6\xc43\x8eV\xabAMu%\xf2O\x9fb\xecH\ +\x97>\xfc(|}\x03f\xa4\xde\xbfR\xa9\xc4\xc5\xb2\ +\x12|\xf5\xc5\xe7\xa8\xb8Xz\xcf\xe7\x89\x9b\x9b\x08?\ +\xff\x00\x04\x87\x84\xc1\xd3\xcb\x072\x99\x0c\x22\x91\x18\x1c\ +\x0e\x17,6\x0b\x86oK\x06\x8f\x8f\xcb1\xd0\xdf\x8f\ +\x8e\xf6644\x5cESc\xc3=\xffnyY1\ +\xd8l+\xf0x|$%\xa7\x81\xcf\xa7\x9c\x00\xc28\ +|\xe4\xac\x09\x80-\xef\xaf\xb1\x16;\xfaZ\xd3~1\ +\xc6\x8b^\xff\xcfMP\x8c\xd6\xf9\xb3X\xb77k1\ +\xe8\xe9\x81\xcd ]]\x9d8~\xec\x10\xe3%uK\ +\x96=\x82\xe8\xd8\xb9\x10K$3 F\xb4\xa8\xab\xad\ +\xc17\xfb\xbeD\xe1\xb93\xf7t\x8e\xc5\xcb\x1eEJ\ +j:\x02\x83B\xe0\xe2\xe2\x06\xb1X\x02\xbe\x80\x0f\x0e\ +\x87;\xe9t\x96^\xaf\x87F\xa3\x81Z\xa5\x82\x5c>\ +\x86\x9e\x9e\xdb\xa5\x83\x0b\xce\xe41\xae\x85\xf0\xaf\x94\x96\ +\x14\xc2F&\x83L&CxD4U\x04$&E\ +\xec\xe8k\xbd\xe5\xfd5\xd6/\xbd\xf1\xce\xac\xd4G\x9f\ +5\x01 \xe0s~M\xce\xdf\xf8?\xfa\xb9'\x8e\xa0\ +\xba\xaa\xc2\xa8\xa3\xec\xc1\xc1\x01\xd4\xd7\xd6\xd0\x03\x9b!\ +\x94\x0a\x05\x0a\xce\x9cBY\xc9\x05F\xed\xfd\xfc\x83\x90\ +\x92\x96\x09w\x0f\x8fi\xcf\x0d\xf9n\xcb\xdd\xbc\xdcc\ +8\x9b\x7f\xfa\xae\x8e\x15\x0a\xc5\x88\x89\x9d\x83e\x8f<\ +\x8e\xb9\xf1Ippt\x04\x9f/\x00\x87\xc1\x08\x05\x9b\ +\xcd\x06\x9f\xcf\x07\x9f\xcf\x87D*\x85\x83\xa3\x13\x02\x02\ +\x83\x91\x90\x94\x8a\x8a\x8be8\xb0\xef+TW]\xbe\ ++!p\xbe\xe0\x0c\x1c\x1c\x1cag\xe7\x00\x0fO/\ +\xeah\xc4\x04\x0c\x86\xdb\xbe\x12\xc0\x9f\xcdJ\x00\x08\x05\ +\xfc\x87\xe9\xf1\x1a7\x9d\x1dm\xd8\xbf\xf7K\xa3\xdf\xad\ +L\xa3\xd1\xd0\x06B3\xf6\x012\xa0\xae\xee\x0a\x8a\x8b\ +\x98\x97\xd0M\xcb\xc8BdT\xcc\x8c\xcco\x8f\x8e\x0c\ +\xa3\xb4\xa4\x08\xfb\xf7~yW\xce6$,\x02\x99Y\ +\x0b\x90\xb3h\x19\x02\x02\x83\xc0\xe5\xf2\xeeY\x9c\xb0X\ +,p8\x1cH$R\x88Db8;\xb9 (8\ +\x14'\x8e\x1dBA~\x1e\xe3\x1c\x09\x85B\x8e\xb3\xf9\ +ypw\xf7\xc4SO\xfflFFK\x08\xd3\xe7[\ +_i^\x02 &cE<-\xff3\x92\x8f\xfc\xb7\ +{\xa0O\xc6L\x97\xf9%\x8c\x9b\x81\x81~\x94\x95\x14\ +\xa1\x8e\xe1\x08K|B2\xd23\xe6\xc1\xdd\xc3sF\ +\x84^cc\x03\xbe\xd9\xf7%\x86\x06\xfb\x19\x1f\x97\x9c\ +\x92\x81\x87\x1fY\x81\xd4\x8c\xaci_\x8e\xc8f\xb3!\ +\x10\x0a\x11\x1a\x16\x01G'g\xf8\xfa\x05\xe0\xf0\x81}\ +\x8c\x97#vv\xb4\xa1\xf0\x5c>\x82C\xc3\x90\x94\x9c\ +\xc6h4\x82\xb0,b2V\xc4\xcfVU\xc0YY\ +\xcb\xb5\xfd\x83\xf7\xe2i\xf9\x9f\xf1\xa0\xd3\xeb\xa6\xbd\x88\ +\x0fa\xfah\xb5Z\x5c\xad\xabEiq\x11#!\xe8\ +\xe4\xec\x8a\x94\xb4LDD\xc5L\xfb\x9c\xb6\xc1`\xc0\ +@\xff-\x9c8v\xf8G\xb7\xec\xfdw\xb2\xe6\xe7\xe0\ +\x99\xe7~\x89\x87\x96,\x83\xb3\xf3\xd4\x15\xf8\x0c\x06\xc3\ +\xf7y/\xff\xfao\xaa\x1a\x17l6\x1bNN\xceX\ +\x98\xb3\x04?\xfd\xf9/\x905?\x87\xf15V^\xbe\ +\x84\xe2\xa2s\xe8\xed!\xb1MLDo`a\xfb\x07\ +\xef\xc5\x9b\xcd\x08\x00\x9f\xcf}\x8e\x1e\xab\xf1\xc0f\xb1\ +\x8d~\x98\x9f\x98}\xfa\xfazp\xa1\xe8,\xe3h6\ +\x222\x1a)i\x19\xb0\xb1\xb1\x9d\xf6kQ\xab\xd5\xa8\ +\xaa\xbc\x84\x93\xc7\x8f0>&#+\x1bO\xff\xf4Y\ +\xc4'&\xffh\xed}\x83\xc1\x00\x95R\x09\xb9|\x0c\ +\xa3\xa3#\x90\xcb\xe5P\xa9T\xd0\xebt`[Y\x81\ +\xcf\xe7C,\x16C*\xb5\x86X\x22\x01\x9f/\xf8A\ +!!\xb5\xb6Frj\xc6\xf7\xd3\x0b\x05g\xa6.\x97\ +\xacP\xc8Q^Z\x8c\xb89\x09ppt\xa2U\x01\ +\xc4\x0f\xf9\xcc\xf2\x99\xfe\x9dY\x11\x00B>/\x93\x1e\ +\xa9\x11\x09\x00++\x12\x00\xc4\x1d\x8c\x8f\x8f\xe3\xf2\xa5\ +\x8b\x8c\x97\xfd\xb9{x!95\x1d\x01\x01\xc1\xd3\x9e\ +\xf8\xf7]\xf4_t\xfe,\xe3)\xa9\x98\xb8x\xacZ\ +\xfd\x0c\xe6\xc4'\xfe\xa8\xf3\x97\x8f\x8d\xa1\xbd\xbd\x15\xad\ +7Z\xd0z\xa3\x19\x9d\x1d\xedhk\xbd\x81\xa6\xa6\xeb\ +\xe8\xeb\xed\x86\xbb\x87\x17\xbc\xbc|\xe0\xe5\xed\x03wO\ +/x{\xfb\xc2\xc7\xd7\x0f\x1e\x9e^\x10\x8b'\x9f\xb3\ +\x17\x89DHHJ\x81F\xa3\xc6\xc8\xc80\xa3\xe5\x82\ +\xd5U\x15().DpH\x18%\x04\x12\x0f\xccg\ +\xce\x8a\x00\x88J_\x11F\xf3\xff\xc6\xc5dC\x9cN\ +\xce\xae\xc8Y\xb4\x14NN\xce\xc6{\xe1,\x16F\x86\ +\x87p\xb1\xbc\xf4\xae\x86\x86\x89\x1f\xe6v\xa6}+\xce\ +\x9f;\xc3x\xd9_Hh8\xd23\xe6\xcf\xd8\xb2\xbf\ +\x86k\xf5(/+a\xd4\xde\xc9\xd9\x15+W\xfd\x04\ +s\x13\x92~\xd0I\xebt:\xb4\xb7\xdd@i\xc9\x05\ +T\x5c,C]]\xcd\xa4\xc9{\x9d\x1dm\xe8\xech\ +\xfb~\x14\xc4\xcf?\x08Q1\xb1\x9837\x01\x89\xc9\ +ips\xf3\x98t\xde^,\x96 19\x0d=\xdd\ +\xdd\xe8\xed\xe9f\xb4o\xc2\xb9\x82\xd3HM\xcf\x82\xb3\ +\x8b\x0b\xb8\x5c\x1euD\xe2\x0e\x9f\x09\xbcb\xfa\x02`\ +\xfb\xa6\xf7\xd2\xc8\xf9\x9b\x06\x1e\x9e^X\xb2\xf4\x11\x04\ +\x04\x06\xc3XW\x01\xb2\xc0Bww'\xe4\xf21\x12\ +\x00\xd3\xc4\xe8\xe8\x08*/_B\xc1\x99\xfc(\xc2#\xa2 \x10L\xdc\xac\xca\ +\xda\xda\x06\xd99\x8b\xd1\xd4\xd8\x80/\xf7\xec\x9e\xf2\xdc\ +\xad7\x9aQYQ\x8e\xf0\xf0H8\x1a\xb3\xe8&f\ +_\x94\x1bn\xfb\xce\x17^\xfd]\xa1I\x0b\x00>\x97\ +\xfb\x14=N\xd3\x80\xcb\xe1B$\x16\xc3\xda\xc6\xc6\xe8\ +\x1d\x16\x9f'\xa0\x076\x0d\xe8\xb4Zt\xb4\xb7\xe1\xe4\ +\xb1\xc3\x8c3\xedW\xaez\x1a1\xb1sg,\x83\xbd\ +\xbd\xbd\x15\x95\x95\x97\x18-\xfbKLJCrj\x06\ +\x5c\x5c\xdd&\x9d\xa7\x1f\x97\xcbQVz\x01\xfb\xbe\xde\ +\x83\xc2s\x05\xf7\x5c\xde\xb7\xb3\xa3\x0d\xdf\xec\xfd\x12=\ +\xdd]X\xb1r5\x92S3 \x12\xdd9\xd5\xc0b\ +\xb1\xe0\xe4\xec\x82G\x1e[\x89\xf2\xb2\x12F\xa3)U\ +\x97+0?{\x11\xec\xec\xecg\xa4\x82\x22a\xba|\ +\xeb;gT\x00\xcc\xf8*\x00\xa1\x80\x97A\x8f\xd2\xb4\ +0\x18y\xc5&\x03hHi\xba\x18\x19\x1dA\xfe\xe9\ +\x5c\x14\x15\x160j\x1f\x13\x17\x8f\xcc\xacl\xd8\xceP\ +\xbd\x7f\x9dN\x87K\xe5\xa5\xe8\xea\xec\x98\xfa\xdb\x22\x14\ +#%-\x03!\xa1\xe1\x93\xe6\xb4(\x95\x0a\x5c\xbaT\ +\x86]\xdb?\xc2\xa9\x93G\xef\xbb\xb6\xbfB!\xc7\x99\ +\xbc\x13\xd8\xf3\xf9'\xb8XV\x0c\x95J51\xa2\xe2\ +p\xe0\x1f\x10\x88'\x9ed\xb6\xeby}}-\xdaZ\ +o\xd0\xaa\x1c\xe2\x81\xf8\xce\x19\x17\x00Q\xe9+\x22\xe9\ +Q\x12\x84\xf1\xa1\xd1\xa8Q[S\x85\xcfv\xefd|\ +Lv\xceb\xf8\x07\x06\xcdX\x12\xe9\xd0\xd0 \xae_\ +\xbf\xc6\xa8\xd0SL\xec\x1c\xc4\xc6\xc5\xc3\xce\xce~\xc2\ +\xdf\xb4Z-\x9a\x1a\xaf\xe3\xeb/?Gi\xc9\xf4\x06\ +Q\x85\xe7\xce`\xff\xde/p\xbd\xe1\xea\xa4e\xb3\xc5\ +\x12)\xe2\xe6\xc6#nn\xe2\xd4\xf7;\xd8\x8f\x96\x96\ +F\xc8\xc7\xe5F/\xbc\x89\xd9e6|\xe7\x8c\x0a\x80\ +m\x1b\xd7\xf8\xd3\xfc?A\x18\x1f\x06\x83\x01}\xbd\xbd\ +8q\x9c\xf9\xd0\x7f\xd6\xfc\x1c\xa4\xa6e\xfe\xe0\x5c\xfb\ +t\xd0\xdd\xd5\x89\xfe[7\xa7\x8c\xd6\x85B1\x22\xa2\ +\xa2\x11\x10\x184\xe9\xbd\x0d\x0d\x0d\xe2\xf4\xa9\xe3\xc8=\ +~xF\xae\xf3l\xfei\x9c>u\x1c}\xbd=\x93\ +\x8e\x02\xb8{xa\xce\xdc\x04F\xe7\xbaZW\x8b\xd1\ +\x91a\x12\x00\xc4\x1d\xe8\x0d\xb7}\xe8L\xfe\xc6\x8cN\ +:\xf1x\x9c\xa7\xe91Z\x9ecQ*\x15\x18\x1b\x1b\ +\xc3\xd8\xe8\x08\x14\x0a\x05\x0c\x06\x03\xf8|\x01\xa4\xd6\xd6\ +\x90H$\x10\x0aE\xd3\xbet\x8c\xb8;T*%.\ +\x96\x97\xa0\xb8\xe8<\xa3\xf6N\xce\xaeX\xb2\xecQx\ +{\xfb\xce\xd8F6\x06\x83\x01\xdd]\x9d\xe8e\xb0\xf4\ +\xcf\xdb\xd7\x17\xa1a\x91\x90N\x22Ft:\x1dj\xaf\ +T\xe3\x1f\x9f}2c\xf6S(\xe48w\xf6\x0c\x22\ +\xa3b!\xb3\xb3\x9f\xb0\x96_*\x95\x22<\x22\x1aB\ +\xa1xJ1s\xa1\xf0\x1cF^\x1e\x86A\xaf\x07\xe8\ +\xbd &\xfa\xd0\x19+\x0b<\xa3\x02\x80\xcf\xe3\xce\xa3\ +Gh9(\x95\x0a\xb4\xde\xb8\x81kW\xeb\xd0\xd6\xda\ +\x82\x8e\x8e6t\xb6\xb7A\xa3\xd5\xc2\xd5\xcd\x1d\xbe\xbe\ +~\xf0\xf0\xf0F@P0|}\xfd!\xb5\xb6\x22e\ +\xb2\xeb\x00\x00 \x00IDAT&\xa3= \xdaZ\ +o \xfft.\xe3\x8c\xf8\x87\x16/CtL\x1c\x84\ +\x22\xd1\x0c\x8a\x12\x15\x06\x07\x0706::\xb5 q\ +r\x81\x97\xb7\xcf\xa4S\x11\xc3\xc3C\xc8\xcb=~W\ +\xe5\x83\xef\x85\xda\x9a*\x5c\xb9R\x85\xb0\xf0H\xb8\xb8\ +\xba\xdd\xf9\xed\xe3\x0b\xe0\xe5\xed\x83\xc0\xa0`TWU\ +L)&Z\x9a\x9b\x11\x14\x14\x0a!%\x02\x12\x13}\ +\xa8i\x0a\x80\xa0\x88\x84\xb9\xf4\x08-\x83\xc1\x81~\x14\ +\x15\x9eEq\xd1y\x94\x14\x17Np,\xdf-\xd9\xb3\ +\x95\xd9#95\x1d)\xa9\xe9HM\xcb\x82\x8b\xab\x1b\ +\x8d\x06\xcc2c\xa3\xa38w\xf6\x0c*.1[F\ +\x19\x15\x1d\x87\xa4\xe44\xb8\xb8\xba\xceH\xe2\xdf\xbf\x8e\ +J\x8c\x8c\x0cC\xa1P\xfch;\xa1P\x0cw\x0f\x0f\ +\xd8\xdb;L:\x8a\xd0x\xfd\x1aj\xaa/\xdf\xd5o\ +\xdb\xca\xfe\x99G\xa0R*\x19'\x0c^\xbeX\x8e\xcc\ +\xacl8:9\xdf12\xc2b\xb1 \xb3\xb3CT\ +L\xdc\x94\x02\x00\x00N\x9f:\x0e\xa9T\x8a\xc4\xa4T\ +H\xa4R\xea\xa4\xc4\xac\xf8\xd0\x19\x15\x00\x12\x07\x1f)\ +\xe5\x00\x987\x06\x83\x01\xfd\xb7n\xe2\xf8\xd1C8\xf0\ +\xcdW\xa8\xad\xa9\xfa\xd1\xf6C\x83\xfd8~\xe4\x00\xea\ +\xaeT\xa3\xff\xd6-<\xfc\xc8\x0a\xb8\xba\xb9\x93\x08\x98\ +%\xf4z=\xaa\xab/\xe3|\xc1\x19FU\xf6\xbe\xcb\ +\xb4\x0f\x8b\x88\x04\x9f?\xb3K/U*\x15\x86\x87\x06\ +\xa7L\x00\xe4\x0b\x04ppp\x82D2\xd1Qj4\ +\x1a45^\xc7@?\xb3\xe8?&.\x1e\x8b\x97.\ +G\xdc\x9c\x04\xd8\xd8\xd8bxx\x08\x97.\x96\xe2\xd8\ +\xe1\x03\x8c\x1cw\xf1\x85sX\xdd\xf3s\x04\x87\x84M\ +\x98\x1a\x11\x89\xc4\xf0\xf2\xf2at\x1d\x85\xe7\x0a04\ +8\x80[7\xfb0oA\x0e\x1c\x1c\x9d\xe8\x9d \ +q\xf0\x99Q58c\x02`\xc7\xa6\xb5\x0b\xc9\xf9\x9b\ +?\xe3r9\x0a\xf2\xf3\x189\xff\x7f\xa5\xf5F3\xfe\ +\xf1\xd9\xc7\xe0ryx\xfc\x89U\xb0\x95\xd9\xcdht\ +I\xdc\xa6\xb7\xb7\x1b\xa5\xc5\x85\xb8\xc6p\x0b\xdb\xb89\ +\xf1HJI\x87\xb3\xb3\xeb\x8c_\x9bF\xa3\xc6\xe8\xc8\ +\xc8\x94\xd17\x8f\xc7\x83Tj=\xe9t\xc4\xb8\x5c\x8e\ +\xbe\xdenF\xab\x08\xe2\xe6&\xe2g\xcf\xbe\x80\xe4\xd4\ +\x0cH$R\xb0\xd9l\xb8\xeb=\xe1\xed\xed\x0bgg\ +W\xac}\xf7\xcf\x8c\xa6H:;;\xa0T* \x10\ +\xdc)\x90\x04\x02\x01\xec\xec\xed\x19\xdd\xbbB!Gy\ +Y1\x86\x86\x87\xd0\xd3\xd3\x85EK\x1e\x81\x9f\x7f\x00\ +\x95\xec\xb6t\xc1n\xb8\xedK\x7f\xf1\xea\xdb\xa7f\xe2\ +\xfc3&1y\x5c\xceRz|\xe6\x1fM\xd6\xd4T\ +\xe2\xc4\xb1\xc3?\xe8\xfc\x85B1\x84\xc2\xc9\xf7\x89\xef\ +\xeb\xed\xc6W_|\x8a\xf2\xb2bh4\x1a2\xe8\x0c\ +\xa3R\xa9Pw\xa5\x06\xe5e%\x8c\xe6\xc7\xbf\xdf\xed\ +/2zV\xa2Q\x9dN\xc7\xa8\x1fp\xb9\x5c\x08\x84\ +\xc2I\x93\x11\x15\xcaq\x0c\x0d\x0eNy\x0e[\x99=\ +\x92\x92S\x11\x1b\x17\x0f\x1b\x1b[XYY\x81\xc5b\ +\xc1\xca\xca\x0aRkk$$\xa5`\xf1\xd2\xe5\x8c\xae\ +\xbb\xbb\xabs\xd2u\xfc\x1c\x0e\x17\x22\xf1\xdd\x95J\xbe\ +~\xad\x1e{>\xdf\x8dOvnA\xe5\xe5\x8bP*\ +\x15\xd4q-\x9c\x99\xf4\xa536\x02\xc0\xe7q\x12\xe9\ +\xd1\x997\x83\x03\xfd(/+\xc6\xa5\xf2\xd2I\x9dG\ +dT\x0c<=\xbd\xc1\xb6b\xa3\xbb\xbb\x0b\xd5\x95\x15\ +\x13\x22\xaa\xd6\x1b\xcd8}\xea$\xc2#\xa2\xe1\xe6\xee\ +A\xa3\x003\x84\xc1`@OO\x17\x8a/\x9cg\xb4\ +Y\xcdw\xd1\x7fZ\xc6\xbc\x1f\xac\xaf?\xed\x02@\xab\ +\x83V\xab\x9d\xfa\xa3\xc5\xe1L\x88\xb6\xbfC\xab\xd1b\ +||\xea\xf9{;;{\xb8{x\xc1Vf7\xe1\ +o,\x16\x0b\x12\x89\x04Q\xd1q\x8c\xae{xh\x08\ +:\x9dv\xd2\xf3p\xef!\xa9oh\xb0\x1f\xfb\xf7\xee\ +\xc1\xd0\xd0 V\xff\xf4Y\xc4\xc4\xce\x81D\x22\xa5w\ +\xc3B\x99I_:c\x02 ,.=\x9a\x1e\x9dy\ +\xd3\xde\xde\x8a\x9a\xaa\xca\x09C\xb6N\xce\xaex\xf4\xf1\ +\x95\xc8\x9c\x97}{~\x9f\xc5\xc6\xad[7QZ\x5c\ +\x84Ovm\x9d0\xf7\x5cWW\x83\x96\x96&\xb8\xb8\ +\xba\xcd\xd8\x123Kg|\x5c\x8e\xcb\x97\xcaq\xe4\xd0\ +7\x8c\xda\xfb\xf9\x07!#k\x01\xbc\xbd}f\xcd\xf1\ +\xe8\xf5z\x18\x0czFm\x7fhD\xc2`0@\xa7\ +\xd31J\xe2\xb3\xb2\xe2\x80\xcd\x9e\xfc\xdeX,\x16x\ +:2\x82\xae\xeeN\xa8\xd5*2\xec\x0c0\ +2<\x84\xb2\xd2\x0b8}\xea8\xa3\xf6\xee\x1e^X\ +\xbct9\x9c]\x5cg\xf5:9\x1c\x0e\xa3\x0d\x864\ +\x1a\x0d\x94J\xc5\xa4ex\x05\x02!le\xb2)\xcf\ +\xd1\xd7\xdb\x8d\xea\xaa\xcbhh\xa8\x9f0\x7f\xafV\xab\ +q\xedZ\x1d\xce\xe4\x9ddt\xdd\xce.\xae\xe0N2\ +Z\xa0\xd3i\xa7e\x0e\xff\xfa\xb5z\xfc}\xfd\xbb8\ +v\xf4 z{\xba\xa9b\xa0\x85\xa17\xdc\xf6\xa9&\ +3\x02\xc0\xe5Z\xe5\xd0c3\xf7N\xa9\x87v\x92\x84\ +-\xa9\xb55\xc4b\xc9\xa4\xc3\xa7l6\x1b\x12\x89\x14\ +\xce.\xae\x13r\x01\xc6FG\xa1\xd7\xe9\x8d\xfa\x9e\xc7\ +\xc7\xe5\xe8\xec\xe8\x80F\xa3\x86\xb3\x8b+d2;\xa3\ +_\xaa\xa5\xd1h\xd0\xdc\xd4\x88\x93\xc7\x8f0>f\xe5\ +\xaa\x9f \x22*f\xc6v\xfb\xfb\xe1\xef\x06\x17\x22\x91\ +x\xca\xe8]\xadVC>6\x06\x95J\x09\x91\xe8\xce\ +\x04S\xb1X\x0c{{G\xf0\x05\x82)\xa7\x01\xcaJ\ +.\xc0\xda\xda\x1ac\xa3\xa3\x08\x08\x0a\x86X,\x81\x5c\ +>\x86\xc6\x86k\xc8\xcb=\x8e\xf2\xb2b\x86\x82\xc9s\ +\xd2\x9c\x04\x95J\x85\xa1\xa1\xc1i\xb1\xcd\xd0`?v\ +\xef\xda\x06\x8dF\x83\xc5K\x97\xc3\xcd\x8d\xf2e,\x89\ +o}j\xe9t\x9fwF\xdep\x1e\x97\x12\x00\xcd\x1d\ +6\x8b=\xe9\xf6\xa5\xa3##\x18\x97\xcb\xa1\xd1\xa8\xc1\ +\xe3\xddY\x1eU\xaf\xd7C1>\x8e\xde\x9e\x89\xeb\xcf\ +%\x12\x89\xd1:S\x83\xc1\x80\xc1\x81~\xe4\x9e<\x8a\ +\x8b\xe5\xa5\xd0j4\xf0\xf3\x0f\xc0\x92e\x8f\xc1\xd7\xcf\ +\xdfh\xa7-\x0c\x06\xc3\xf7U\xf1\xbe+\xc44\x15\x19\ +Y\xd9H\xcb\x98\x07k\xe9\xecWi\xe4\xf1x\xb0\xb6\ +\xb6\x99\xd2y\xab\x94J\x0c\x0e\x0c@.\x97O\x10\x00\ +<\x1e\x1f\xde>\xbeptr\x9ar\xbach\xb0\x1f\ +G\x0f\x1d@kK3\xbc}\xfd \x11K!\x1f\x97\ +\xe3Fs#\xae\xd4T3\xba\xe6\x90\xb0\x08\xb8\xb8\xb8\ +M\xe8\xeb\x00\xa0\x18\x1fGwW\xe7\xb4\xd9\xa7\xb3\xa3\ +\x0d\xfb\xbf\xfe\x02\x1a\xb5\x1a\x8f<\xb6\x12\xaen\xee$\ +\x02,\x84\x99\xf2\xa93\x22\x00\xec\xec\x9d\xc2\xe9\x91\x99\ +y\x87\xe4\xf3!\x93\xd9\xc1\xce\xce\xfe\x8e\x0f\xadB!\ +\xc7\xd5\xab\xb5hok\x83\x8f\xaf\xdf\xf7\xceQ\xaf\xd7\ +chh\x10\xa5%E\x13\xa2\x7f\xa9\xb55\x5c\xdd\xdc\ +\xc1\xe3\xf3\x8c\xf2^\xd5j5J\x8a\x0b\xb1{\xd7\xf6\ +\xef\xf7x\xb7\xfd\xff\xd9{\xcf\xe8\xb6\xae,]\xf0C\ +\x222\x01\x10 @\x82 \x08F0\x819\xe7 \x89\ +\xca\xc1\x96\xec\xb2\xcbvU\xbfvu\xf7LU\xf7\x9b\ +^=\xd5k\xcd\x9a\xf9\xd5o\xc2[\xaf\xa7{\xba^\ +\x87z]]\xed*\xdb\xe5(\xc9\x92\xacD\x8aQ\xcc\ +I\xccA$\xc5\x9cs\x04\x01\x82\x08\xf3\x83\x92\xda2\ +)\xf1\x92\xb8\x94A\xf0~ky-/\xf1\xdc\x80{\ +\xee=\xfb\xdb\xfb\xec\xfdm\x89\x14,\x96\x0b\xdey\xef\ +\xa7\x10\x8b%\x0ey\xdff\xf3&\x9a\x1a\xebq\xf7\xce\ +MB\xe3\xc5\x12)r\x8f\xe5A\xad\xd6\xfc \xbd\xe9\ +\xd9l\x0eDb1\xf8|\xfe+\x8d\xb7\xc1\xa0\xc7\xf8\ +\xc4\x18\x96\x16\x17\xe0\xee.\xdf\x16e\xd2\x06\x87\xc2\xdb\ +\xdb\x07}\x04\xb4\x0e\x9e\xd5\xdf\x7f\xd7\xe0\xef\xa5mp\ +\x5c|\x12\x14\x9e\x9e;\x92\xc0\x95\x95et\xb4\xb5\x92\ +\xfa\x8c\x06\xfa{q\xed\xeb\xcf\x01\x00\x17\xde\xb8\x02O\ +O\x8a\x04\x1c\x05\x1c\x94M=\x10\x97\xcb7\x22KC\ +M\x99s\x83\xc3\xe1\xc0\xc3\xc3\x13J/\xd5\xb6\xbf\x15\ +\x17\x16\xe0\xf6\xadk\xe8\xee\xea\xc0\xd2\xe2\x22V\x96\x97\ +18\xf0\x04w\xbe\xfd\x06_~\xfe\xc9\xb6\xf1\x22\xb1\ +\x18\x1e\x9e^`\xb1\x1c\x94\x00ll`dx\xe8\xb9\ +\xf1\x7f\xe6=\xd6VWb]\xef\x98m\x5cm6\x1b\ +\xc6FGq\xe7\xf6\x0dB\x8a\x7f\x00\x90\x9a\x96\x81\xd8\ +\xf8\xc4\x1fL\x8a\x96\xc3\xe5B\x22q\x03\x8f\xcf\xdfu\ +\xec\xcc\xf4\x14&'\xc6a\xd9!\xc9N\xaeP '\ +\xf7\xc4K\xf5'^F\x04\x9e\xfdG\x14>\x1a?\x84\ +\xeb\xa2 \x95\xca\xb6\x19a\x93\xc9\x84\xc9\x89q\xf4\xf5\ +\xf5\x90\xfe\x9c\xc6\xc7Fp\xf3\x9b\xafQTp\x1f\xb3\ +\xb33TN\xc0\x11\xc0A\xd9\xd4\x03\xa1\xf96P\x8c\ +\xf4(@\xe5\xadFDT4\x1e5\xd4\xbd\xb0p\xce\ +LO\xe2\xcb\xcf?EmM\x15\xdc\x9e\x96.\xad,\ +/\xa1\xaf\xafwG\xcf.$$\x0cj\xb5\xc6a\xb7\ +\x00,\x16\x0b66\x8c\xdb\xfe}jjb\xc7D4\ +G\xc0\xfa\xba\x1eU\x95e\x84\xd5\x19}4~8q\ +\xf2,\xbcT\xde?\xd8<0\x18\x0c\xc8\xe5\x1e\x90I\ +\xdd\xd1\x87W{\xef\x13\xe3cx\xdc\xdd\x89\x98\xd8\x84\ +m\x84\x85\xc5rARJ:rO\x9c\xc4\x9d[\xd7\ +\x0f\xec~\xe3\x13\x93\x11\x16\xae\xdbQ\x92x]\xafG\ +ww'!\xf2\xe5\xa5R\x83\xcd\xe6\xbc@0w\xc3\ +\xf0\xd0\x00>\xfe\xddo\xc0\x17\x08\x90s,\x0fb\xb1\ +\x84\x8a\x0481\x0e\xca\xa6\x92\xfe\xa5\xff\xf6\x9f\xff6\ +\x8d\x22\xa4G\x03nR\x19\x12\x12S\x10\x9f\x98\xbc\xed\ +oK\x8b\xf3hij@IQ>\x8a\x0b\xb7\x12\xaa\ +v2\xfe^*5r\x8e\x9dth\x11 \x1b\x0e\xd7\ +\x0bm\xb5Z\xd1\xff\xa4\x17\xd5\x95\xe5\x84\xbb\xfd\x9d8\ +y\x06\xba\x88(p\xb9\xbc\x1f\xf4\xde\xbd}| W\ +x\x10\x88\x00L\xa2\xab\xb3\x1dc;\xfc>\x1a\x8d\x06\ +w\xb9\x02\x17/]ATL\xfc\xc1\x18\xff\x84d\x1c\ +;~\x0aj\x1f\xdf\x1d\x09\xe3\xcc\xcc4Z\x9a\x1a\x09\ +\x9d+95\x1d?\xf9O\x7f\x82\x0b\x97\xde\xdas$\ +\xe0_\xfe\xf1\xefQUQ\x86\x95\x95ejArf\ +\x02`\xdb\xb2\xad\x0eO\x00X\x0cF\x065]G\x03\ +\x0c\x06\x03*\x95\xda\xaer1\xb1D\x02_\xbf\x00\xaa\ +\xfe\x9fD,//\xa1\xe2a)\xe1n\x7f\xc9)\x19\ +HJI\x87\xbb\x5c\xf1\x83\xdf\xbbT\xea\x0e\x8d\xaf\xdf\ +\x0b\xdd\xf9^\x86\xf6\xb6\x16\xb46?\xdaQ\xf9\xcf\xc5\ +\xc5\x05\xe1\x11Q\xb8\xfc\xd6\xbb\xdb\xcaN\xedE\xa06\ +\x04\x17.]Atl<\xd8\xec\xed\xc9\x7f\x1b\x1bF\ +tu\xb6\xa3\xba\xb2\x9c\xd0\xf9t\x11\xd1\xc8=v\x12\ +\xef\xbe\xffGx\xe7\xbd\x9f\xee\x99\x04|\xf2\xbb\x7fC\ +c}-\x0c\x86u\xea\xe5wb\x1c\x84m%\x9d\x00\ +0Y\xcc(j\xaa\x8e\x06\xe6fgQW[\x85\x9e\ +\xee\xce}\x9fc|l\x0cU\x15e\x98\x9c\x18\xa7\xf6\ +2I\x80\xc5bAkK\x13*\xcaK\x09\xeb\xfd'\ +&\xa7B\xab\x0du\x88\xc63...\x88\x8c\x8e\x85\ +\xbb\x5cN\xc8\xf8\xd5\xd6Va\xa0\xff\xc9\xb6\xad\x18\x1a\ +\x8d\x06\x91H\x8c\xcc\xac\x5c\xfc\xf1\x9f\xfc\x1c~\xfeA\ +\xa4\xdc\x9f\x8f\xc6\x0fo\xfd\xe8=d\xe6\x1c\x87H$\ +\xde1\xfa21>\x86\x07\xf9w\x08\xe5\x13\x84\xe9\x22\ +\xe1\xa3\xf1\x85H,Fh\x98\x0eo\xbf\xf3\x01\xde\xfb\ +\xc9\x87{\xba\xa7\xb6\xd6&\x5c\xbf\xfa\x05\xba;;\xec\ +\x16\x1e\xa2\xe0\xb88\x08\xdbJz\x0e\x80\x0b\x93\x11D\ +M\x95\xf3c~~\x0e\xa5%\x05\xf8\xec\xd3\xdf\xe1q\ +W\xc7\xbe\xcf\xb3\xb48\x8f\xcf>\xfd\x08f\x8b\x19\xe7\ +/\xbc\x09\x0fO%\xf5p\xed\xc0\xf8\xd8(\xaa*\xca\ +\xd0\xd3\xddEh|pH\x18\x12\x93\xd3\x08w\xad{\ +\x1d\x08\x0c\x0aFXx\x04\xa1,\xfe\x9a\xaa\x0aDE\ +\xc7\xc2\xd3S\x09\xa9\xcc}\x1b\x09\x90\xb9\xcbq\xe2\xe4\ +\x19\x08\x04B\x5c}\xdaxj\xbf\x88OH\xc6\xdb\xef\ +~\x80\xe4\x94t\xb8Ie;\x8eY]]Aqa\ +>J\x8a\xf2\x09\x9d34,\x02^^\xde\xcf\xc9W\ +@\xa0\x16o\xbf\xf3\x01XL\x16~\xf7\xef\xbf&|\ +o%E\xf9\xcf\x13(\xb5\xc1\xa1T>\x80\x13\xe2 \ +l+\xe9\x04\xc0?4\xce\x8f\x9a*\xe7\x86a}\x1d\ +-M\x8d\xb8\xfa\xe5g/5\xfe\x5c.\x1fBWW\ +p\x9fJ\xc9\x9a\xcdf,\xcc\xcf\xef\xe8\x15\x8d\x8f\x8d\ +\xe0\xf6\xad\xeb\xe0r\xb9\xb8\xf4\xc6\xdb?X\x16\xfaa\ +\xc7\xfa\xba\x1em\xad\xcdh\xa8\xaf!\xe4}z\xa9\xd4\ +\xc8\xc8\xcaApH\xa8C%`\xba\xba\x8a\x90\x9e\x91\ +\x83\xb2\x92\x22B\xb5\xfc\xf7\xef~\x0b\x8d\xaf?\x12\x93\ +R\xc0\xe1p\xb7\x91\x00\xa9T\x86\xdccy\xf0\xf6V\ +\xe3\xd6\x8d\xab\xa8\xa9\xae\xc0\xcc\xf44\xa1g\xc4\xe5\xf2\ +!W(\x90\x9e\x99\x83\xb3\xe7/! pK0h\ +'\x03\xbb\xb1\xb1\x81\x9a\xaa\x0a<(\xb8K\xf8\xb7\xc6\ +\xc5'B*\xfb\x0f2\xc1d2\xe1\xeb\xe7\x8f7\xae\ +\xbc\x03\x9b\xcd\x86\xdf\x7f\xf4?\x08\x9f\xab\xb8\xa8\x00R\ +\x99\x0c\x02\x81\x10*o5\xf5A8\x19\x0e\xc2\xb6\x92\ +N\x00\x042\x8d\x90\x92\x01v^X,\x16\x0c\x0f\x0f\ +\xe2\xfa\xd5/\xd0\xd6\xda\xb4\xe3\x82\x19\xae\x8b@H\x98\ +\x0eAA\xc1\x90\xb8IA\xa7\xd3\xb1\xbc\xbc\x84\xa1\xc1\ +~t\xb4\xb7\xa1\xb7\xa7{[vt_O7\x1e\xdc\ +\xbf\x03\xb5Z\x83\xb4\x8cl*'`\x8f\xb0Z\xad\x18\ +\x1f\x1bE]m\x15\xe1\x88Ltl<2\xb2r\x7f\ +\xf0\xc4\xbf\xef\x83\xc5b!8$\x14\xb1q\x09\x84\xe4\ +\x8b[\x9a\x1ap\xed\xab\xcf \x93\xb9#H\x1b\xb2m\ ++\x83F\xa3\x81/\x10 \x222\x1aj\x1f\x0dR3\ +\xb2\xd0\xd2\xd4\x88\xc1\x81~LL\x8c\xc1\xb4a\xc2\xc6\ +\x86\x11\x9b\x9b\x9b`\xb1X`\xb39\xe0\xf2\xb8P(\ +<\xe1\xeb\xe7\x8f\xd8\xb8DDF\xc5@,q{\xe9\ +{i6\x9b\xd1\xdd\xd5\x81\xbb\xb7o`\xe0\x09\xb1\x1e\ +\x02g\xce]BHh\xf861\xa3g$\xe0\xc2\x1b\ +W\xb0a2\xe2\xe6\xf5\xab\x84\xc8\xca\xd2\xe2\x92\x93\xd3\x11\x9f\x90\x0c\x1e\x8fX\xee\x05\x87\xcb\ +EBb\x0a\xde\xb8\xf2\x0e!}\x84g\xdf\xd1\xbd\xbb\ +\xb7\xd0\xd1\xd6\x02\xa3\xc1@}(N\x02\xb2m,\xa9\ +1V&\x83AU\x008\xb1\xa7\xb9\xbe\xbe\x8e\x91\x91\ +\xa1m\x7f\x0b\x09\x0bGDT\xf4\x9e\xea\xc8Y,\x16\ +T\xdejh4~hj|1\xa25::\x8c\x95\ +\x95\xe5\xe7!Y\x0a\xaf\xf0\xfe\x17\xe6P\xfc\xe0>\xa1\ +\x929\x008y\xfa:\x82'}=\x18\xe8\xefCG{\ +\xdb\x9e:\x06>_\x1bUj\x5cy\xfb\xc7\x88KH\ +\x02\x87\xc3\xd9\xd7s\xa0\xd3\xe9P*U8{\xfe\x12\ +\xfaz\x1e\xa3\xae\xb6\x92\xd0q\xb7o]G\x906\x04\ +\xa9i\x99\x0e\xa1\xf6H\xc1ql,\xa9\x04@\xaa\x0a\ +\x91P\x1a\x00\xce\x8d\xcd\xcd\xcdm\xffF\xa3\xd3\x80\xfd\ +\x18j\x1a\x0dt\xdavO\xc8b\xb1\x00\xd4{\xf4J\ +\xac\xae\xae\xa0\xac\xa4p\xc7\x84\xcc\x9d\x10\xa8\x0dAz\ +f.<\x95\x87\xb3\x7f\xbcH$Fvn\x1eV\x96\ +W`\xda0\xed\xa9s\x1e\xb0U#\xdfP_\x83\x8e\ +\xf66\xb8I\xa5\x10\xba\xbaB&\x93C \x10\x80\xcd\ +\xe6\x80\xc9d\x82F\xa7\xc1f\xb5\xc1l6cc\xc3\ +\x88\xd5\x95\x15\xcc/\xccaa~\x1e\xab++\xfb2\ +\xfc\xcf\x8c\xff\xdb\xef\xbc\x8f\xe3yg\xe0\xea*\xb2\xcf\ +\x03d\xb1\x10\x14\x14\x82\xb7\xdey\x1fcc#\x84\x9a\ +=\xf5\xf5t\xa3\xb80\x1f~\xfe\x01\xf0\xf6\xf6\xa1H\ +\xf5!\x86T\x15Bj\x18\x87\xe4:+\xea\xc5\xa2@\ +\xe1\xa0a\xb1X\xd0\xd5\xd9\x8e\xfa\xdajB\x99\xe7\x5c\ +.\x1fy'\xcf\x22<\x07\x8b\xd5\x82\x9b\xd7\xbf\xde3\x09x\x16\ +\x11\x18\x1f\xd3\xbf\xb6{\xf6R\xa9\xf1\xf6\xbb\x1f\xe0\xc2\ +\xc5\xcb\x90H\xdcH1\xbe<>\x1f\x09\x89\xc9\xb8\xfc\ +\xd6\xbb\xf8\xcd\xaf\xff\x91\x101yXZ\x84\xd8\xb8D\ +\xc8\xe5\x1e\xfb\x8e@Pp\x04\x90kcI\xdd\x08\xa4\ +\xbc\x7f\x0a\x14\x0e\x1e\xf3\xf3s\xa8\xa9\xda\x0ak\x13A\ +rj:\x92S\xd2!s\x97\x1f\xfa\xdf\xee\xa5\xf2\xc6\ +\x85\x8b\x97\xf1\xce{?A\xa06\xc4\xe1\xefW\x1b\x1c\ +\x8a\xa4\xe44\xc8d\xee\xa4\xe6]\xb8Ie\xc8\xcc>\ +\x86\xbc\xd3g\x09\x8d\x9f\x99\x9e\xc4\x83\xfc;\x18\xdd!\ +\x89\x97\xc2\xe1\x01\xd96\x96\xb47\xf2\xdf\xfe\xf1\xbfQ\ +M\x80(P \x096\x9bm\xc7\xf25\x93\xc9\x84\xd6\ +\xe6G\xa8\xa9\xaa \xe4\xfd{\xa9\xd4HLNE@\ +\x90\xd6i\xb2\xc0\xe5\x0a\x0f\xe4\x1c\xcbCdT\x8c\xc3\ +\xdfk\xff\x93^t\xb4\xb5`aa\x9e\xd4z|\x06\ +\x83\x01\x8d\xaf\x1f\xd23r\x10\x1c\x1aN\xe8\x98\x8e\xf6\ +V\x94\x95\x16\x11\xd2G\xa0\xe0\xb8 \xd3\xd6\x92\xb6\x05\ +@\xa7\xd3\xb5\xd4\xd4\x1cM\xd0h4\xd0\xf7\x11\xda\xa4\ +\xd3\xe8\xd4~\xe4w`6\x9b\xb1\xb4\xb8\x80\xe5\xe5%\ +\xac\xafo\x09!\xb1\xd9\x1c\x88D\x22H\xdc\xa4pq\ +q\xc1\xd8\xe80\x1e\x96\x15\xed\xd8\x87a'\x84\xe9\x22\ +\x91\x90\x98b\xf7\xde\xb3\xa3\x91\xa3\x95\xe5e,\xcc\xcf\ +;\xfc\xbd\x0e\x0f\x0d\xe0\xe3\xdf\xfd\x06t\x06\x1d\xc7\x8e\ +\x9f\x86T&#\xed\x9d\xe7\xf1\xf8\x88\x89\x8dGzF\ +6\x86\x07\x07w\xdd\x0a\x98\x99\x9eD]M\x15\xa2c\ +\xe2\x10\x13\x9b@\x95\x05\x1eR<\xb5\xb5\xbdd\x9c\x8b\ +L\x02\xa0\xa1\xa6\xe6hbyy\x09cc\xa3X[\ +[\xdb\x13iX]]\xc1\xe2\xe2\ +\x09\xa9\xe9\x99`\xb3\x9d'\xe9\xcbj\xb5\xa2\xf9Q\x03\ +\x8a\x0b\xf3\x0f\xd5}\xf7\xf5t\xe3\xfa\xd5/\xc1\xe7\x0b\ +\x91\x95s\x9c\xb0\x0a \x01c\x80@m02\xb3s\ +18\xf0d\xd7\xaa\x80\x99\xe9I\xb4\xb7\xb5 >!\ +\x19\x22\x91\x98\x8a\x02\x1cB\x90ik\xc9\x8c\x00xP\ +Ss41<4@\xc8(Q\xd8n\xcc\x86\x87\x87\ +\xf0\x87O>\xc2\xbd;\xb7^J\x84\xb6\x9a$\xb5\xa2\ +\xb3\xbd\x95\xf0\xb9Uj5\xce\x9c\xbf\x04\xa9\x03\xeb\xfd\ +\xef\x07\x93\x13\xe3(+-\xc4\xf0\xe0\xe0\x0fz\x1f\x5c\ +.\x1fBW\xd7=\x95\x07\xb645\x80\xcf\xe3\xc3\xd5\ +\xd5\x15\x89\xc9i\xa4\xd5\xe4\xf3\xf9\x02$$\xa6\xa2\xe9\ +Q\x03\x16\xe6\xe7w\xbd\x9f\x8a\xb2\x12$&\xa5\xc0\xdf\ +?\x10BWW\xeaC<|\x11\x00\xd2l-y\x11\ +\x00:]JM\x8d\xf3\xe3u\x08\x898\xbaF=Y\ +X^^\xc2\x83\xfc;\xaf4\xfe\xfb5N'O\x9d\ +CpH\x98SuT4\x1a\x0dhnj@[k\ +3\xe1\x96\xbb\xc1![\xd2\xe9\x93\x93\xe3X^Z\xda\ +w=\xff3\x83/\x12\x8b\xe1\xed\xed\x83\x80\xc0 x\ +x(Q_W\x8d\x87\xa5\xc5\x84\xcf\xd9\xf4\xa8\x01b\ +\x89\x04BW\x11t\x11Q\xa4x\xe04\x1a\x0d\x1a_\ +_\xa4\xa4\xa6\xa3\xad\xa5i\xd72G\x83A\x8f\xaa\x8a\ +\x87\x88\x8a\x8eCh\x98\x8e\xca\xc39l\x11\x00\x12m\ +-\x89\x04\x80Fm(9\xbb\xf1waA\xa3\xf1#\ +$>b\x0f\x5c\x85\x22\xb0\x5cXN\xbd0\x99\xcdf\ +\xb4\xb64!\xff\xfem\xd2\xb7@\xa2\xa2c\x91\x96\x91\ +\x0d\x91H\xec4\xcf\xcbf\xb3alt\x14\xe5e\xc5\ +\x84\x22!\x5c.\x1f\xd99\xc7\xf1\xe6[\xef\xc2\xc5\xc5\ +\x05O\xfaz11>\x8a\xe9\xe9)\xccLOam\ +u\x15+\xab\xcbXZ\x5c\xdc\xe65\x8b%R\xf0\xf9\ +|\x88%\x12\xb8\x0aE\x10\x08\x85\x90+<\xe0\xe1\xa9\ +\x84\x87\x87'\x82\xb4\xa1P\xab}@g0\x10\x1a\xae\ +\x83@(D\xd1\x83|B\xf3h0\xe8QUY\x0e\ +/\x957\xdc\xdc\xa4Py\xabIy\xcf]\x5c\xd8H\ +N\xc9@mu%\xa1\xef\xb3\xa4(\x1f\x99Y\xb9P\ +\xfbh \x14RQ\x80\xc3E\x00\xc8\xb3\xb5dn\x01\ +\x08\xa9\xa9q^\xd0h4\x88\xc5\x12\xa4g\xe5\xa0\xaa\ +\xb2\xec\xc0\xae\xc3\xe5\xf2\x11\x1d\x1b\x07\x99L\xee\xd4\x04\ +`||\x14\x0f\xee\xdf9\x90P\xf6\xc93\xe7\x11\x10\ +\x18\xe4T\x91\x94\xb5\xd5U\xd4\xd6T\xe0Qc=\xa1\ +\xf1\x81AZ$\xa5\xa4C\x1b\x1c\x0a6\x9b\x8d m\ +\xc8\x96\xd1_Y\xc6\xd2\xd2\x22VV\x96\xb1\xb6\xba\x82\ +\xd5\xd5U\x18\x8d\x06\x9866`\xb1Z\xc1`0\xc0\ +va\x83\xcd\xe1@(\x14\xc2\xd5U\xbc\xe5\xf9\x8b\xc4\ +\x10\x89\xc5\x10\x08\x84/\xbc\x97a\xe1\x11\xa0\xd3\x19`\ +2\x98\xb8u\xe3\x1a\xa1H\xc0\xd2\xe2<\x8a\x1e\xe4\xc3\ +[\xed\x83\x13\xa2\xb3\xa4\x105\x1a\x8d\x06\x85\x87'r\ +\x8f\x9fBI\xd1\x03B\xf7\xd1\xd0P\x8b\xf8\xc4\xe4m\ +\xbf\x89\x82c\x83L[K\x1a\x01\x90y\xa8\xa9\x08\x80\ +\x93C(tEv\xce\x090\x99L\xb4\xb7\xb6`y\ +\x99\xdc\x96\xbd|>\x1f!a:\xa4\xa5g\xc1]\xae\ +p\xda\xe7\xb8\xbe\xaeG}m\x15Z\x9a\x1f\xed[^\ +\xf6Ups\x93\xc2f\xb59M/\x05\x8b\xc5\x82\x9e\ +\x9e.\x94\x97\x95\x10\xf2n\xb9\x5c>\x22\xa2b\x10\x15\ +\x1d\xfb\x5c\xf9\x90N\xa7\xc3U$\x82\xabH\x04\x95\xb7\ +\x1a\x16\x8b\x05V\xab\x05\x16\x8b\x156\xab\x156\xd8\xb6\ +\xe4\xa7i[\xc6\x94F\xa3\x83\xc1\xa0\x83Ng\xbc\x92\ +H\xb1X.\xcf\xc3\xe8\x16\xab\x15wn}ChN\ +\x07\xfa{q\xe7\xd6\x0d(\xbd\xbc\x11\x9f\x90\x04\x17\x17\ +\xfb\x15\x1a\x99L&\xa2bb\x91w\xfa,n^\xff\ +j\xd7\xf1\xcd\x8f\x1a08\xd0\x0f\xa5\x977\xa5\x0ex\ +\x88@\xa6\xad%\x8d\x00\xb8Jd\x02jj\x9c\x9ey\ +\xc2[\xed\x83s\x17\xdeDzf\x0e\xcc\x9bf\x90'\ +\xdaO\x03\x83A\x87\xd0U\x04\xb1X\xe2\xb4y\x00V\ +\xab\x15\x03\xfdOPW[\xbd/)[\x22\xf8\xf6\xe6\ +5\xac\xae\xae *:\x0e^*\xd5\xa1\xaf\x02\x98\x9b\ +\x9bEC]\x0d\xf1\xf2G__\xe4\x1c\xcb{e\xcb\ +]\x06c\xcb\xb0\x93\x91\xd2\xc2d2\x11\x12\x1a\x8e7\ +\xaf\xbc\x83u\xfd\x1a\xe1\xb6\xc5u\xb5\x95\xf0\xf5\xf3\x87\ +R\xe9\x05\x1f\x8d\x9f\xdd\xf9\x004\x1a\x0dn\x12)\xb2\ +sN\xa0\xba\xb2|\xd7&Q\xe3c#\xe8hoA\ +DT\x0c\xd8l6\x15\x058$ \xd3\xd6\x92F\x00\ +\x84\x22)\xdbB\xcd\xcd\x91 \x01\x22\x91\xd8\xa9\xf6\x97\ +_'V\x96\x97\xd1\xfc\xa8\x01\xf5\xb5\xd5\x07v\x8d\xc2\ +\x82\xbb\xe8\xealGFV\x0e\x12\x93\xd2\x10\x11\x15\x0d\ +\x0f\x0f\xe5\xa1,\xf9\xda\xd8\xd8@_\xefc<,#\ +\x96h\xc7\xe5\xf2q\xe6\xdc%\xe8tQ\xaf\xf5\xf7>\ +#\x01?\xfa\xf1O099\x81\xa6\xc6:B\xc7\xe5\ +\xdf\xbf\x83\x900\x1d\xdc\xa42R\xbe)\x97\xa7\xdb\x1d\ +\xf1\x09I\x84\x88HiI!r\x8e\x9d\x84\x9b\xc4\x0d\ +\x0c'J\x18uf\x08ER\xd2\x1az\x90\xf6\x85\xd8\ +XB\x17jj(Px9,\x16\x0b\x9e\xf4\xf5\xa0\ +\xe8\xc1}\xc2-|\xf7\x8b\xf1\xb1\x11|\xf1\x87\xdf\xe3\ +\xa3\x7f\xfb\x17|\xf2\xd1\xbf\xa1\xbe\xae\x1akk\xab;\ +\xca\x0b;*l6\x1b\xe6fgP\xf9\xb0\x14-M\ +\x0d\x84\x8eILNEf\xd61\xf0\x05\xaf? \xc9\ +f\xb3\xa1\xd3E\xe1g\x7f\xfa\x0b\xf8h\xfc\x08\x1d\xb3\ +\xb48\x8f[7\xaebxh\x00f\xb3\x99\x14\x82.\ +\x93\xb9#.!\x99\xd0\xf8\xc7]\x1d\xe8\xech=\xf2\ +b\x5c\x87\x09d\xdaZ\x12)2\x15>\xa2@\xe1U\ +\x98\x9d\x99FEy\x09\xe1>\xeer\x85'\xfc\xfc\x83\ +\xc0\xe5\xf2\xf7}\xcd\xb6\xd6&\xdc\xbcq\x15\xff\xf0w\ +\xff\x15_~\xfe\x09\xfaz\x1f\xc3`X'U\x97\xfe\ +\xa0`4\x1a\xd0\xda\xd2\x84\xaf\xbe\xf8\x94\xf0\xf3\xca;\ +u\x16*o\xf5\x0f\x16\xed\xe0p\xb9\x88\x8dK\xc4\x1f\ +\xff\xc9\xcf!Wx\x12:\xa6\xa9\xb1\x0e\x85\x05\xf7\xb0\ +\xbc\xbcD\xca\xbc\xf0\xf8|\x84\xeb\x22\x11\x13\x97Hh\ +|I\xd1\x03\xac\xae\xae\x1c\x8aw\x82\x02\xb9\xb6\x96\x92\ +\x81\xa2@\xe1u\x183\x83\x01\x9d\x1dm(,\xb8O\ +h<\x97\xcb\xc7\xe5\xb7\xde\xc1_\xfc\xe5_#\xef\xf4\ +Y\xc2\x1e\xe5\xcb\xbc\xcc\x96\xa6\x06\xfc\xf6_\xff\x19\xff\ +\xf4\xab\xff\x17\xf7\xef|\x8b\x89\xf11\x98L&\x87]\ +\xf4\xadV+\xc6FG\xf0\xed\xcdk\x84\x13%\x93S\ +\xd2\x11\x17\x9f\xf4\x83'\xb4\x09\x84B\xa4\xa5g\xe1\xc2\ +\xa5\xcb\x84\x8f\xb9u\xe3\x1a\x9a\x1e\xd5\x93\x12\x05`0\ +\x18Pz\xa9\x90\x91\x99C,\x0a\xd0\xdd\x89\xfe'\xbd\ +\x87*:D\x81\x1cP\x9b>\x14\x9ec\xc3\xb4\x81\xa5\ +\xc5E\xcc\xcd\xce8pB\x10\x0d\x0b\xf3\xf3\xd0\xaf\xeb\ +\x0f\xcds\xb5Z\xad\x98\x9e\x9eByY1\xe1\xc4\xbf\ +\xe4\xd4t\x9c\xbbp\x19^*o\x84\x84\x85\xa3\xaa\xbc\ +\x0c\xf5u\xd5hz\xd4\xb0\xef\xed\x83\xa5\xc5y\x14\x16\ +\xdcEkK\x13\x92S\xd2q\xee\xe2\x9b\x08\x0e\x09\x83\ +X,q8\xc1 \xfd\xda\x1a*\xcbKQWSE\ +h\xbc\x8f\xc6\x0f\xa7\xcf^\x80\xc2\xc3\xe3\x07\xcfu\xa0\ +\xd3\xe9\x90+\x8aF\xc9b\xc1\xa6i\x93z\x10\xaf\x01\xfa\xb55\ +\x14=\xb8O\xa8U+\x00\x04\x87\x86##+\x17R\ +\x99\xfb\xb6\x85\x98N\xa7\xc3M*Cl\x5c\x22\xde}\ +\xff\x8f\xf0W\x7f\xfd\xbf\xe3\xc2\xa5\xb7\xecJ\x12\x04\x80\ +\xf2\xb2\x22\xfc\xed\x7f\xfd/\xf8\xedo\xfe\x19E\x85\xf7\ +1>6\x8a\xcd\xcd\x1f\xe6\xfd\xb0\x98\xcdx\xd4P\x87\ +\x07\xf9w\x09\x8d\x17K\xa4\xc8\xcc\xce\x85\xc6\xd7\xcf!\ +\xfb\x1e\xb8\xcb\x15HLLE|\xe2\xeeY\xf9\x06\x83\ +\x1e\xad\xadM\xe8\xeah\x87\xc5b\x7fQ5\x8f\xcf\x87\ +F\xe3\x87\xc0\xc0\xa0]\xc7.\xcc\xcfcdd\x08\xa6\ +\x8d\x0d\xea\xa3=B o\x0b\x80\xda\x0384\xb0\xd9\ +l\xb0X)\xd5\x86\xd7\xf1\x9c{{\xbbQYQF\ +\xf8\x98S\xa7\xcf#88\xec\xb9\x82\xdd\x8e\x1f-\x93\ +\x09OO/\x88\xc5\x12\x04\x06\x05#!)\x05wn\ +}c\xd7\xb6\x80\xc1\xa0\xc7\x9d[\xd7\xd1\xf3\xb8\x0b\xa9\ +\xa9\x99HNMGXx$\xa42\xd9k\xcd\x07\x19\ +\x1e\x1eBqa>f\xa6\xa7\x09\x8dO\xcb\xc8Bt\ +L\xbc\xc3\xeaR0\x99Lh\x83C\x11\x97\x90\x84\xc7\ +\xdd\x9d\xbb\xe6o\x0c\x0f\x0e\xa2\xbe\xae\x1a\x91Q1v\ +\xaba2\x99L(<\x94P\xfb\xf8\xa2\xa1\xfe\xd5\x22\ +J\xab++\xe8\xeb}\x8c\xf5u\xfd\x0f\x1e\x01\xa2\xf0\ +\xfal-\xb5\x05p\x04Ag0^i`(\x90\x03\ +\xa3\xd1\x80\xee\xae\x0eL\x8c\x8f\x11\x1a\x9f{\xfc\x14\x92\ +S\xd3!q#\xa6\xf4\xc9\xe5\xf2\xe0\xa3\xf1\x83\xbb\x5c\ +\x81\xd00\x1d\x8a\x0b\xf3q\xef\xce-LN\x8c\xef[\ +b\xb8\xaf\xa7\x1bc##\xe8\xechE\x5cB\x12\xd2\ +3s\x11\x1a\xa6{-Jq\xfa\xb554\xd4\xd7\xa0\ +\xbd\xad\x85\xd0\xfd\xfbh\xfc\x90\x9a\x96\x09?\xff@\x87\ +\x0e[\x8b\xc4b$%\xa7\xa1\xb1\xbevW\x02`0\ +\xe8\xd1\xd1\xde\x8a\x9e\xc7]\xa4\xc8a\xcb\xe5r\xa8\xbc\ +\xd5\xbbn\x03\x18\x0cz\x8c\x0c\x0favv\x16n\x0e\ +\x9c\x03D\xc1A#\x00\x14\x0e\x0f\xb6\xb4\xcei;\x18\ +\x14><\x95^\x10\x08\x1c[\xd5\xd9`4`vf\ +\x86\xf4.zdc]\xaf\xc7\xc4\xf8\x18VWV\x08\ +\x8d\x8fKH\x82\xb7Z\xb3'\x19d:\x9d\x0e\x81@\ +\x08mp(<\x95^\xd0EF\xa3\xac\xe4\x01\x9a\x9b\ +\x1a\xf1\xb8\xabc\xdf\xd1\x80\x86\xfa\x1a\xf4\xf5\xf5\xa2\xa5\ +\xe9\x11r\x8e\xe5!#+\x17\x1e\x9eJ\xb8\xb8\xb8\x1c\ +\x08\x11\xb0Z\xad\x18\x1c\xecGmM%\xa1J\x09.\ +\x97\x8f\xf4\xcc\x1c$$\xa68\xbc\x8e=\x8dFC\x90\ +v+RC$\x0a0\xd0\xff\x04=\x8f\xbb\xa1\x8b\x88\ +\x82Hl_^\x83\xabH\x0co\xb5\x06\xeer\xf9\xae\ +\xdf\xcb\xdc\xdc\x0c\x86\x06\xfb\x11\x18\xa4\xa5\xf2\x00(\x02\ +@\xe1\xa8A\xa5V\xe3\xfd\x9f|\x08\xb5Z\xe3\xb0\xba\ +N4\xd00;;\x83\x82\xfb\xb7QXp\xd7\xa1\x9f\ +\xa7i\xd3\x84\xa5\xc5EBc\xc5\x12)\xc6\xc7F\xd1\ +\xff\xa4\x17\x81A\xc1\x10\x0a]\xf7\xb4\x08\xd3\xe9t\x88\ +\xc5\x12\xa4\xa5e\xc2\xdf?\x10M\x8f\x1a\xf0\xb0\xb4\x10\ +\x0d\x04\xbc\xce\x97aiq\x1e5\xd5\xe5\xe8\xee\xeeD\ +{[3\x8e\x9d8\x8d\xc8\xa8\x18\xb8Ie`\x91!\ +\xa2\xff\x1d\xac,/\xa3\xa1\xae\x1a5U\x15\x84\xc6\x87\ +\xeb\x22\x90\x96\x91\xfdJ\xbd\x7fG\x02\x9b\xcdAjZ\ +&j\x08h\xf4/-\xce\xa3\xaf\xef1\xa6\xa6\xa6\xec\ +&\x004\x1a\x0d~\xfe\x01\xf0\xf2\xf2\xde\xb5\x12ax\ +p\x10}\xbd\x8f\x91\x9d{\xe2\x85\x04T\x0a\x14\x01\xa0\ +p\x04 \x16\x89\xa1\x8b\x88\x8268\xd4\xa1\xbd\xa9\xf1\ +\xb1Q\xb4\xb569~\xa4\x054\xd0\x19\xc4\x8c\xf8\xd2\ +\xe2<\xfe\xf0\xf1o\xd1\xd5\xd9\x8e\x13'\xcf 5-\ +\x13*\x95\x1a\x1c.wO\x1e7\x83\xc9\x84\xca[\x0d\ +w\xb9\x1c!\xa1a\x08\xd7\x95\xa2\xa6\xba\x12\x0du5\ +\xfb\xde\x16XZ\x9c\xc7\xb77\xaf\xa1\xa3\xbd\x0di\x19\ +Y8v\xe2\x14\x82\x82B tu%\xa5i\x93\xd9\ +lFww\x07J\x8a\x0a\x08Eu\xc4\x12)\xe2\x12\ +\x92\x10\x1e\x1e\xe9\x90\x89\x7f/{o\xbdT\xdeHH\ +JAgg\xfb\xae\xbfs\xe0I\x1f\xc6\xc7G\xe1\xeb\ +\xe7gwI\xa0R\xa9\x22\xb4\x9d`0\xe81==\ +\x85\x95\xe5%\xc8\xdc\xe5\xd4\x82H\x11\x00\x0aG\x09t\ +:\xe3\xf9\xf6\x80#w\x06\xa3\xd3\xe9\xa0\xd3\x1c?D\ +\xc9\xe6p\xf6\xac\xa9\xd0\xd4X\x87\xa6\xc6:\x1c\xcf;\ +\x833\xe7.!4\x5c\x07\xb9\xdcc\xcfan6\x9b\ +\x83\xc0\xa0`x*\xbd\x10\x16\x1e\x89\xa8\xe8X\x94?\ +,!\xac\xa9\xbf\xa3Q\xea\xef\xc5@\x7f/*\xcb\xcb\ +\xf0\xa3w?@|b2T\xdej\xbb\xfa\xc9\xdbl\ +6LOO\xa2\xba\xf2\xe1\xae\x89j\xcf\x10\x18\x18\x84\ +\xb4\x8clHe\x87k\xaf\x9a\xcf\x17 \x222\x1a^\ +*\xd5\xae\x04\xa0\xad\xb5\x09\xc3C\x03\x88\x8e\x89\xb3\x9b\ +\x00\x08\x84B\xf8\xf9\x07@\xae\xf0\xdc5\xfa\xb00?\ +\x87\x99\x99i\x8a\x00\x1c\x955\x9fz\x04\x14\x0e\x1bl\ +\x87Dv\x8a\xcf\xe7\xc3[\xad\x81\x9bT\xba\xe7c\x0b\ +\x0b\xee\xe2\x7f\xfb\xe5\x7f\xc6\x17\x9f\xfe\x1e\xd5U\xe5\x98\ +\x9e\x9a\xdc\x97T\xab@ Dl|\x22\xde\xbc\xf2\x0e\ +~\xfe\x17\x7f\x85\xf7~\xf2!\xc4\x12\xa9]\xbfk\xa0\ +\xbf\x17\xff\xf7\x7f\xf9?\xf0\xaf\xff\xf2+\x14\x16\xdcC\ +\xff\x93>l\xec\xb3|\xcch4\xa0\xab\xb3\x1d\xc5\x85\ +\x05\x84\x8f9u\xe6\x02BB\xc3\x0f]\xfbZ\x06\x83\ +\x01\xff\x80 \x04\x04h\x09\x8d\xef\xeby\x8c\xc5\x05\xfb\ +\xf3\x5c\xe8t:\x02\x03\xb5\x84\xde\xc3\xa9\xa9\x09LM\ +MR\x8b\x0c\x15\x01\xd8\x1bh4\xaa\x14\x90\x02\x85\xef\ +\x82\xc5rA\xb8.\x12\xbe~\x01\xbb\xca\xb1\xee\x04\x83\ +A\x8f\xdf\xfd\xfb\xaf\xd1\xdc\xdc\x88\x94\xb4\x0c\xa4\xa6f\ +B\x1b\x1c\x0a\xbe@\xb0\xb7m\x01\x06\x03\x0a\x0fO\x88\ +%n\xf0\xf5\xf5\x87.\x22\x0a\xf7\xef~\x8b\xba\x9a\xaa\ +}o\x0b\x00@\xfe\xbdo\xd1\xde\xd6\x82\xb4\xf4,\xa4\ +\xa6g!*:\x16R\x99;\xe1m\x81g\x12\xc9\x0f\ +K\x8b\x08K$\x9f\xbd\xf0&R\xd3\xb3\xc0\xe5\xf2\x0e\ +\xe5;!\x96H\x10\x97\x90\x88[7\xbe\xdeule\ +E\x19\xce_\xbc\x0c\x1f\x8d\x9f][-4\x1a\x0d\x9e\ +J/\x08\x05\xc2]\xc7.-.b~n\x06&\xd3\ +\x86\xc3\xa8*R\xd8nk\x1d\x8e\x00P\xa0\xf0}X\ +,\x16X,f\xd8l[F\x88y\xc4\xfa\x8d\xd3h\ +4h4~8{\xfe\x0dt\xb4\xb7\xee\xbbj\xa1\xa5\ +\xa9\x01=\xdd]hkiFv\xeeq$$\xa6@\ +\xed\xa3\x01\x9b\xbd\xd7m\x016\xbcT\xdep\x93J\x11\ +\x1c\x12\x86\x9a\xea\x0a\xdc\xbb}\xd3\xae|\x8a\xf1\xb1\x11\ +|\xf5\xc5'\xe8\xe8hEZz\x16\xd22\xb2\x11\xa4\ +\x0d\x81\xab\xabhW\x92b4\x1a\xd0\xd4P\x8f\xbb\xdf\ +\xde$t-/\x95\x1ay'\xcfB\xe1\xe1y\xe8\xbc\ +\xff\xe7\x0b.\x93\x85\x88\xc8XB\xe1\xf8\x99\xe9I\x8c\ +\x8c\x0c!<\x22\x12\x02\x02\xc6\xfbU\xef\xa1@\xe8\x0a\ +o\xb5\x06\x1d\xedm\xaf$}z\xbd\x1eKKKX\ +__\xa7\x08\x00\x15\x01\xa0@a\x8fF\xdfl\xc6\xf2\ +\xf2\x12\x06\xfa\x9f`bb\x0c\x06\x83\x01\xb0\xd9\xc0\xe6\ +p \x93\xb9# P\x0b\x99\xbb\x1c\x0c\x06\xe3\xd0.\ +\xe2{2\xba\x1c\x0e\xd23\xb2\xb0\xb6\xf6W\xf8\xa7_\ +\xfd\xdd\xbeI\x80\xc1\xa0Gey\x09FG\x86\xd0\xda\ +\xfc\x08)iYHJN\x85\xbb\x5c\xb1'\xef\x90F\ +\xa3\x81\xc7\xe3# P\x0b\x0fO%\xa2\xa2cQX\ +p\x0f\xb7o}\x83\xd5\x95\x95}G\x04:\xdb[1\ +>6\x86\x8e\xb6V$\xa7e %5\x03\x01\x81Z\ +\xb0X\xac\x1d\xe7\xd9b\xb1`p\xa0\x1f\xb7n\x5c\xdd\ +\x93DrxD\xe4\xa1\xd6\xb0\xa0\xd3\xe9\x90\xcb\xe5\xc8\ +=\x9e\x87/\xfe\xf0\xfb]\xc7ww\xb5#3+\xd7\ +.\x02\x00\x00\x1c\x0e\x07^*\xef]\xc7m\x18\x8dX\ +Y^\x82a}\x1db\xb1\x84Z\xd0(\x02@pa\ +\x01\xd5\x10\xe8\xa8{\xfb\xcb\xcbKhijDiI\ +!\xfa\x9f\xf4b~n\xf6y{S&\x93\x09\x91H\ +\x0c_\xbf\x00\xa4\xa6g\x221)\x15R\x99\xbb\xd3G\ +\x05h4\x1a$nR\x9c\x1f\x8c\ +=\xe0\xf3\x05{\xd2\x0f`0\x99\x90\xc9\ +\xdc\x91\x9d{\x02\x01\x81Z\xd4\xd7U\xa3\xaev\xab\x1e\ +\x7f\xbf$efz\x123\xd3\x93\xe8\xealG{[\ +\x0bN\x9e:\x07mp(\xc4\x92\xad\xb6\xc3\x9b\x9b\x9b\ +\xe8hkAu%q\xe9\xe2\xb3\xe7\xdf\x806$\xd4\ +)\xea\xd3Y,\x16\xbcTjBMzfgf\x9e\ +v\xe9\xf3\xb3\xeb\xb7\xb3X,H\xdc\xdc \x12\x89v\ +\xbd\xe6\xca\xca2\xd6\xd7\xf5\xb0\xd9lG\x22JGE\ +\x00(P\xd8'\xacV+\x86\x06\xfb\xf1\xd5\x17\x9f\xe2\ +\xdaW\x9f\x13\x0a\xe7\x1a\x0cz|\xf2\xbb\xdf`aa\ +\x1e\xef\xff\xe4C\x84\x86\xe9H\x17\x96qDlu\x87\ +\x8b\x87F\xe3\x07]d4\x82C\xc3QRT\xb0\xaf\ +\x04\xc1g\xe8\xeb\xe9\xc6?\xf4t\xa3\xe9Q\x03\x8e\xe7\ +\x9dBl\x5c\x12\xbcT\xaa=\xe7\x07\xb0X.\xf0\xf3\ +\x0f\x84B\xe1\x89\xb0\xf0H\x84\x84\x86\xa3\xac\xa4\x10M\ +\x8du\xfb\xbe\xb7\x99\xe9I\x5c\xfd\xf2S\xb4\xb75\xe3\ +\xf8\x89\xd3HI\xcd\x80\x7f@\x10\xd6\xf4\xab(+-\ +B_o\x0f\xa1\xf3\x9c<}\x1e\xc9)\xe9\x0e\xab\xf7\ +\xbfg\x0f\xee\x99hSF\x16\xee\xdczu\x8b\xe8\xd5\ +\x95\x15LMN\xc0l\xde\xb4\x9b\xfc\x88\xc5\x12B\xcf\ +pmu\x15\xfa\xb55X-\x96=E\x95(\x1ci\ +\x02`\x83\xc3\xca\xc7Q80\xcc\xce\xce\xe0\xfe\xbdo\ +Qp\xff\xce\x9e\xf7\x8f\xef\xdc\xba\x0e.\x97\x87\x0f\xff\ +\xf4\xe7P\xab5G\xc2\xdb\xa0\xd3\xe9\x90\xca\xdc\x91\x96\ +\x9e\x05_?\x7f\x84\xeb\x22QQ^\x8a\xca\xf22\xbb\ +\xa4\x8d\xcb\xcb\x8a\xd0PW\x83Sg\xce\xe3\xd8\x89S\ +\x08\x0d\xd3A*s\xdf3\xb1\xe2\x0b\x04\x08\xd7En\ +\xb5\x1d\x0e\x0dGMu\x05\xaa*\x1f\xee[V\x18\x00\ +\x1ewu\xe0qW\x07j\xab+p\xfa\xdc%l\x9a\ +L\xa8xXBX\xef?#3\x17j\x1f\x8d\xd3\xc8\ +\xd3\xd2\xe9t\x08\x84B\xa8\xd5>\x84\xc8\xf2\xd4\xe4\x84\ +\xdd\xdd\x19i4\x1a\x5c]E\x10\x0a]w\x1d\xbb\xb2\ +\xba\x15\x01\xb0X-`P>\xa2\x03\x82\xbc\xcdv\xf2\ +r\x006WM`\xbaR\xfa\x91G\x08&\xd3\x06\x9a\ +\x1f\xd5?\xed\xde\xb6\xbf\xda\xe1\xab_~\x0amp\x08\ +.\xbd\xf16\xf8\x0e\xde\x83\x80L0\x18\x0c\xa8\xd5\x1a\ +\xc8d\xee\x08\xd2\x86 .>\x11\x85\xf9\xf7PUY\ +\xb6\xefs\x1a\x0cz|s\xed\x0b\xd4\xd5V\xe1\xc2\x1b\ +W\x90\x90\x98\x82\xc0@-\xa42\xf7=\x1b\x0b\xb1D\ +\x82\xa4\x94th|\xfd\x11\x19\x15\x8b\xf2\x87\xc5\xb8\xf6\ +\xd5gv\xfd\xe6\x86\xfa\x9a=o{$%\xa7!\x22\ +*\xda\xee$8G\x03\x87\xcd\x81\xcc\x9dX\xb3\x9f\xf9\ +\xf9Y\x18\x0d\x06B\x95\x15\xaf\x82P\xe8\x0a\x1e\x7f\xf7\ +\xd6\xd1k\xab\xab0\x18\x0c\xfb\xd2\x9d\xa0p\xf0\xa0m\ +\xae\x9a\x1c\x8e\x00\xac.\xcfo\xf0\xa4\x14\x01\xd8u\xe1\ +g2\xe1\xb2\xc3\x9e\xf7V\x93\x95\xc3\xe5\xe1LOM\ +\xa1\xbe\xaefG\xef\xd0G\xe3\x87\xdc\xe3'\x11\x16\x1e\ +\x09\x06\x83\x81\xde\xden\x14\x16\xdc\xdbQ\x8f\xbc\xb2\xbc\ +\x0cq\xf1I\xd0\x06\x87\x1e\xb9=G\x1e\x8f\x0fmp\ +(\x94J/\x84\x84\x86C\x17\x19\x85\xdb\xb7\xbe\xb1k\ +[`|l\x04\xff\xf2\xdf\xff\x0em\x19\xcdHJI\ +C|B2\xb4\xda\x90=\xb7ye>\x95\x15v\x93\ +\xca\x10\x18\x14\x0c]D4\xee\xdc\xba\xbe\xef\xdc\x85\xbd\ +\x2284\x1c\x89\xc9iP\xfb8_t\x88\xc5bA\ +*\x95\xc1K\xa5\xdeu\xae\x97\x96\x96`0\xac\xdb\xb5\ +'\xff\xac\xfa\x83K\xe0\x1d\x98\x99\x9e\x86\xc1\xb0N\x11\ +\x00\x07\xc5\xea\xf2\xfc\x06Y\xe7\x22\x8d\x00\xac,\xce\xad\ +\xf1\xa4\xbeBjz^\xfd\x11\xca\xe5\x8am\x8d9|\ +4~\x90\xcad\xa4\xe8\xaa\xbf.X\xadV\x8c\x8d\x8d\ +\xe0qw\xe7\x8e\x0b\xf7{\x1f\xfc1\xd2\xd2\xb3 \x96\ +H\x00\xd0\x90\x98\x9c\x0a\x9d.\x0a\xff\xfa\xeb\xff\xbeM\ +\x8evp\xe0\x09\xc6\xc7F\x11\x10\xa8=rZ\x01\xc0\ +VHX$\x96 ,<\x12*\x95\x1a\x91Q\xb1(\ +zp\x1f\x15\xe5\xa5\xfb\x8e\xacl\x11\xab\x12\xf4\xf6t\ +\xa3\xf9Q\x032\xb3\x8f!)%\x0d\x9e\x9e^{\xde\ +\x16\xe0\xf1x\xf0\xd1\xf8B\xaeP $4\x1c\x0f\xcb\ +\x8aP\x5c\x98\x8f\xe1\xc1A\xbb\x84\x84^\x05.\x97\x8f\ +\xe4\xe4t\xc4%$9e=:\xe3iU\x8c\xd0u\ +\xf7\x90\xfc\xc2\xdc\x1c\xd6\xd7\xb7\x08\x80=pa\xb3\xc1\ +b\xed\xee\xa3\x19\x0cz\x18\x8dT\x04\xc0Q\xb1\xb28\ +\xb7\xe6p\x04`njd\xc1# \xde\x93\x9a\x9eW\ +\x13\x00\xb5\x8f\x06o\x5c\xfe\xd1\x96\xa76>\x0a\xa1\xd0\ +\x15\x17.^\x86\xc6\xd7\xffP\x11\x00\xa3\xd1\x80\xe9\xa9\ +)L\xef \x1b\x9a\x95}\x0c\xe9\xdf\xeb\xd4\xc6\xe1p\ +\x10\x97\x90\x84\xf9\xf9\xb9m\x04`yy\x19\x13\xe3c\ +0\x996\x8e$\x01\xf8\xae\xc7\xed&\x95!5=\x0b\ +\xfe\x81A\x88KH\xc2\xd5\xaf>\xb3;\x11\xaf\xb8p\ +\x12O\xfaz\xd0\xde\xd6\x82\xcc\xac\x5cD\xc5\xc4A\x22\ +q\xdbs\xdba>_\x80\xb0\xf0\x08\xa8T\xde\x88\x8e\ +\x89GQ\xc1=\xd4TW`xh\x80\xf4g\x11\x11\ +\x19\x8d\xecc' \xdb\xe3\xf6\xc5\xa1!\x00\x0c\x06\xf8\ +\x02\x01!u\xbe\xa9\xa9\x09\x18\x9f\xeai\xd8wM:\ +\x5c]E\x04\xbfo\xa3\xddy\x07\x14\x0e\x06sS#\ +\x0b\x0eG\x00\xacV\xeb*55D<\x1b\x1e2\xb2\ +r\x11\x12\x1a\x8e\xe9\xe9I\x88D\x12x*\x95\xe0\xf1\ +\xf8\x87*\xcc\xb9\xb9\xb9\x09\xbd~\x15z\xbd~\x9b\xe7\ +\xa6V\xfb\xee\xd8L\x84\xc7\xe5!0(\x18\xc1\xa1\xe1\ +/l\x1bl\x18\x8d\x98\x99\x99\xa2\x16\x9c\xa7$\xd1\xc5\ +\xc5\x05\xde\xde>\xe0p\xb8hz\xd4`\x17\x01x\x86\ +g\xfa\x01]\x9dm\x88\x8dK\xc4\xc9\xd3\xe7\xa1\xd5\x86\ +\x80\xcb\xe3\xed\xadl\x90\xc1\x80\xc4M\x8a\xc4\xa4T\x04\ +\x04\x04!*&\x1e\x85\x05w\xf1\xb8\xbb\xd3\xaem\x8b\ +\xefB,\x91\x22&.\x1e\xfe\xfe\x81N\xdb\x97\x9eN\ +\xa7\x83\xcb\xe5\x82\xcd\xe1\x12\x9a\xbb\x0d\xd3\x86\xdd\xa9_\ +4\x1a\x0dn\x04\x1b(m\x18\x8d\xb0<\xd5\xf0\xa0\xe0\ +X \xd3\xd6\x92F\x00,V\xdb\x0255\xc4\xc0\xe1\ +p\xe0\xad\xf6\x81\xca[\xfd\xfc\xc3\ +\xdf)sC\x98L\x16\x04\x04\x13_7\x8cF\xbbC\ +\xf24\x1a\x0dB!\xb1]Z\x8b\xc5\x0c\x0b\xb5\x05\xe0\ +\x90 \xd3\xd6\x92H\x00\xac\xf3\xd4\xd4\xec\xfd\x83<\xb4\ +\x8b\x17\x83\x09\x0e\x97\xb3\xad6yfz\x12\xb333\ +X_\xd7o\xcb\xdc6\x9b\xcd\x98\x9e\x9eBOw\xd7\ +\x0b\xff\xce\xe6p qs\x03\x93E\x95\x1c=\xc3\xd4\ +\xe4\x04\x0a\xf3\xefbld\xe4@\xce\xff\x8c\x08\x9c<\ +}\x1e'N\x9eAxD\x14<<\x94{\xae5w\ +qa#$4\x1cJ/\x15t\x91Q\xd0ED\xa1\ +\xa4\xb8\x00\x9d\xed\xadv\x11\x95\xab_~\x8a\x89\xb1Q\ +\xbc\xf5\xce\xfbHLNuJY\xdag\xea\x98D`\ +4\x1a`\xb3\xd9o\x90]X\xc4\xf2),\x16\x0bl\ +\x14\x01pP\x02@\x9e\xad%s\x0b`\x8a\x9a\x9a\xa3\ +\x83\xad^\xf7\xeep\x93J\xb7%\xaa=j\xacCh\ +\xb8\x0eQQ\xb1`?\xedco6ob\xa0\xbf\x0f\ +\x0f\xf2\xb7\xeb\x05\xf0\xf9|(\xbdTN\xa1\xf2F\x06\ +\x8cF\x03\x1e5\xd6\xa1\xb5\xb5\xe9\xc0\x92\xec\x9e\xe1Y\ +G\xbf\xec\xdc\x13\xc8\xcc\xcaEH\x98n\xcf\xf9\x01\x00\ + \x12\x89\x11\x1b\x97\x08\x8d\xaf?B\xc3t(+)\ +DeE\x99]\xdb\x02U\x95e0\x18\x0d`0\x18\ +HI\xcb\x04\x8f\xc7s\xaayf0\x18\xcf\xbf\x8f\xdd\ +`6\x9bI\x88\x90\xd1\xc0$\x98\x00j6\x9ba\xb1\ +Z\xa8\x8f\xd1\x01A\xa6\xad%/\x02`\xb1\x8dRS\ +st\xc0b\xb1\xa0\xf4R! P\xbb\xad\x0c\xb0\xb8\ +\xf0>8\x1c\x0e\x16\xe6\xe7\xe0\xad\xde\x12p\x99\x9e\x9e\ +Byi\x11n^\xffj\xdb\xb9\xdc\xe5\x0a(\xbdT\ +`2YG\xfe\xb9\xdal6\x8c\x0c\x0f\xa1\xae\xa6\x0a\ +\xc3\x83\x83\xaf\xe5\x9a\xe3c#\xf8\xc3\xc7\xbfEsS\ +\x03N\xe4\x9dAbr*|\xfd\x02\xf6\xac\xbc\xc7`\ +0 \x97+ N\xcf\x82\xaf_\x00b\xe2\x12PV\ +Z\x84\xfbwn\xee\xfb\xde\x9a\x1a\xeb\xa0Ry\xc3[\ +\xadA`\x90\xd6\xa9r\x02\xe8t:a\xd2k6[\ +`#A\x00\x86h\x05\xc8\xe6&\xb5%\xe7\xb0\x11\x00\ +\x12m-\x99\x11\x80!jj\x8e\x16T\xdej\x84\x85\ +\xe9P\xfc \x7f\x9b\xa7z\xf7\xf6\x0d\xf4\xf7\xf7A\xed\ +\xe3\x0b\x06\x83\x81\x91\xe1\xc1\x1d\xc3\xc2\x5c.\x1f1\xb1\ +\xf1\xf0\xf5\xf5w\xda\x84\xaf\xbd`mm\x15\x8f\x1a\xeb\ +Q[SI\xc8\xfb\x0f\xd4\x86 \xef\xe4Y\xac\xad\xae\ +\xe2\xf7\x1f\xfd\x0f\xbb\xae\xfdl[\xe0x\xde\x19$\xa7\ +\xa4#&.\x01~\xfe\x81\xfb\xd8\x16p\x81\xc6\xd7\x0f\ +2ww\x04\x87\x84#::\x0eW\xbf\xfelG\x0d\ +\x08\x22\xf8\xf6\xe65\xa4\xa4e\xc2\xdb[MH\xc8\xe6\ +0\x81\xf86\xa0\xed\xb5^\xcff\xb3\xd9]vH\xe1\ +\xc0\x22\x00\xa4\xd9Z2\x09@\x0f55G\x0b|\xbe\ +\x00\xa9\xe9\xd9\xe8ho\xc5\xdd\xdb7\xb6\xfd\xfd\x99\x04\ +\xec\xab\xe0\xa9\xf4B\xee\xb1\x93N\xa3\xf3n\xe77\x84\ +\xde\x9en\x14\x17\xe6\x13\x0a\x9d\x8b%R\xa4\xa6f\xe2\ +\xc2\xa5+pa\xb3\x11\x15\x13\x8b{w\xbfEKS\ +\xa3]\xfa\x01\x85\x05w\xd1\xdb\xd3\x8d\xa6\xa6\x06\xa4\xa5\ +g#95\x1d2\x99\xfb\x9e\xb7\x05\x04\x02!\x02\x02\ +\x83\xe0\xa9T\x22L\x17\x81\x82\xfbwPY^\x86\xc9\ +\x89\xf1=om4\xd4\xd5 )9\xcd\xa9\x08\x80\xd5\ +j\xc5\xa6\x89X\xe5\x0bY\xed\xb3\xcd\x043\xfb\x99\x0c\ +&E\xc8\x1d\xf7\xbd!\xcd\xd6\x92F\x00~\xf6\xe7\x7f\ +\xdd\xfb\xf8\xccO\xa8\xd99B\xb0\xd9l[\xb5\xc5\x22\ +\x11\xb8\x5c\xfe\xbe\xf6\xabU\xdej\xb09\x1c\xaa\x954\ +\x80\xb9\xb9Y\xd4VW\xa2\xb2\xbc\x84\xd0x\xb5\xda\x07\ +i\x99\xd9\xf0Ry\x83F\xa3!;7\x0f\x01\x81Z\ +\xd4TW\xa0\xac\xb8\x10\x9d\x9d\xedv\xb7\x1d\xee\xeah\ +G[k\x13\x8e\x9f8\x85\x90P\x1d\x84\xae\xae{\x22\ +\x02\x0c\x06\x03\xae\xae\x22DE\xc7\xc1\xdb\xdb\x07\xb1q\ +\x89()*@Ks\xe3\x9e\xf4\x03\x9a\x9b\x1a\xb1\xb6\ +\xb6\xe6T\x1d\xea\xacV+\x8cF\x03\xa1\xb1,\x96\x0b\ +)\xbf{s\x93\x98\x8a,\x83\xc9\xa0\x08\x80\x83\xe2g\ +\x7f\xfe\xd7\xbdd\x9d\x8b\xd4\xb4k:\x0d\xa0\xb6\x8d\x8e\ +\x06,f3\x06\x06\x9e\xe0\xc6\xf5\xafP\x5cX\xb0\xef\ +d\xb5\x86\xba\x1a|\xfe\xe9\xef\xf0\xa3\x1f\x7f\x80\x90\xd0\ +\xa3\xd1\x15p\xe7\x85y\x13C\x03\xfd\xa8\xad\xae 4\ +\x9e\xcb\xe5#+\xe78\xa2\xa2c\x9f/\xd4l6\x1b\ +\xfe\x01A\xf0\xf0P\x22\x222\x1a\xc5\x85\xf9\xa8\xad\xae\ +D_o\xcf\xbe\xe6\xe7Y\xdb\xe1\xc9\x89q<\xee\xee\ +DZz\x162\xb3\x8f\xc1\xd7\xd7\x1f\x1c.w\xcf\xfa\ +\x01r\x85\x07\xb2s\x8f#8$\x0c\xd5U\xe5(*\ + \xde\xfb`mm\x15&\xd3\x86S\x11\x00\x8b\xd5\x02\ +\xe3\x86\x91 \x01`\x91\xf0\xbbm\x84\xb56\x98L&\ +\xd5\x0a\xd8\x01A'yJH\xae\xbb\xa2:\x02\x1e\x05\ +X\xadV\x8c\x8e\x8e\xe0\xf6\xad\xeb\xf8\xe6\xdaWvu\ +\xb13\x18\xf4\xb8\x7f\xf7[\x986M\xf8\xd9\x9f\xfe\x02\ +\x81A\xc1G\xd2\xf3X_\xd7\xa3\xaf\xef1a\x9d\xfd\ +\xf8\xc4d\x1c\xcf;\x03\x1e\xef\xc5\x908\x8dF\x83@\ +(\x84.\x22\x1aj\x1f_\xe8\x22\xa2Q]\xf5\x10\xcd\ +M\x8d\xfb\xee\xe8g0\xe8\xd1\xd4X\x87\xee\xce\x0e\xd4\ +\xd5T\xe1\xc2\xa5+\x88OL\x86\xbb\x5c\x0e6\x9b\xb3\ +'C\xe1\xe2\xc2\x86\xdaG\x03w\xb9\x02\x22\x91\x08M\ +\x8f\x1a\x08\x91\x13.\x97\x0b&\x93\xe5TF\xc9\xbci\ +\xc6\xca\xf2\xf2\x1e\x08\x80}\xdf\x85\xcd\x06l\x10$\x1c\ +\x0c&\x13\xf4C\xa4Lzt@\xae\x87M*\x01\x98\ +\x1f\xeb^\x94x\x85J\xa8Irn,/-\xa2\xe2\ +a\x09>\xfd\xfd\xbf\xbft\xf1\xf6R\xa9\xa1\x8b\x88\x82\ +X,\x01\x8dN\xc3\xea\xea*z\x1ew\xed\x98\x08f\ +0\xe8QY^\x06OO%\xdey\xef\xa7P*U\ +G\xeb\x93\xb6\xd9\xb0\xae\xd7ctx\x98\xf01\xd9\xb9\ +'\xe0\xa5R\xbd\x94,\xd1\xe9tH$n\xc8\xc9=\ +\x81\xc0\xa0`DE\xc7mm\x0d\x94\x14\xed\x9b\xb0\x19\ +\x0cz\xd4\xd5V\xa2\xae\xb6\x12W~\xf4>r\x8f\xe5\ +A\x1b\x1c\x0a\x99\xbb|O\x91\x1b\x1a\x8d\x06\xab\xc5\x82\ +\xf9\xb99\xc2\xc7\x84\x86G\x80/p\x1eA \x9b\xcd\ +\x06\xa3\xd1\x00\xfd\x1a1Y\xf7\xbd\x12\xad\x97]su\ +e\x85\x18\xe1`\xb2\xc0\xa0\xb6\x00\x1c\x0e\xf3c\xdd\x8b\ +\x0eK\x00\xc6\x07\xbb\xc7(\x02\xe0\xdc0\x99L\xe8\xea\ +\xec\xc0\xf5k_\xech\xfc\xe5\x0aO\x9c<}\x0eI\ +\xc9iPxx>\x9786\x1a\x0d\x98\x9d\x99Fg\ +G\x1b\xbe\xbdy\x1d\x03\xfd/nc--\xce\xa3\xac\ +\xb4\x08\xfe\x01A8qr\xbbg\xeb\xec\x04\xc0d2\ +an~\x96\xd0x.\x97\x8f\xf9\xb9Y\x8c\x0c\x0f\xc1\ +\xd7/\x00l6\xfb\x95\x9e\x9c\xc6\xd7\x0fr\xb9\x02\xda\ +\xe0P\x84\xeb\x22Q\x98\x7f\x0fu\xb5\x95v\xdd\xf3\xd5\ +/?\xc5\xa3\x86:\xe4\x9d:\x83\xc4\xe44h\x83C\ +\xb7\xc8\x1e\x01#e\xb1X\xd0\xdb\xfbxGM\x88\x97\ +!!1\x85\xb0\x8e\xfda\x80\xc5b\xc1\xfa\xba\x1e\x06\ +\xc3\xfa\xaec\xc3t\x91\xe0\xf2\xb8$\x10\x00+\xe6\xe6\ +\x88\xbdcl\x0e\x87\xb0f\x00\x85\xd7\x87\xf1\xc1\xee1\ +\x87%\x00\x9bf\xcb\x04\x00\x1d5M\xcek\xa8\x96\x96\ +\x16QZ\xf2`\xc7pr\x98.\x12\x97\xdf\xfa1\xd2\ +\xd2\xb3\xe0\xe1\xe9\xf9B\xc8\xd6f\xb3! P\x8b\xe0\ +\x900\xa8}|q\xfd\xeb\xcf\xb7\xed\xff\xf6\xf5t\xa3\ +\xa1\xae\x06\xa1a\x11\x08\x0c\xd2\x1e\xa9=\xc8\xbd\xd4x\ +\x1b\x0cz\xfc\xe1\x93\x8f0:2\x8c\xcc\xec\x5cDF\ +\xc7B\xa1\xf0|e#%\x1e\x9f\x8f m\x08<=\ +\x95\x08\x09\x09G\xf9\xc3X\x94\x14?\xd8wi\x1e\x00\ +\x0c\xf4\xf7\xe2\xd7\xff\xd4\x8b\xc6\xfaZ\xe4\x1c\xcbCR\ +J:|||w\xcd\xd4_ZZDyY\x11:\ +\xda\xdb\x08]'-#\x07\xa1a:\xa7\x22\x85\x16\x8b\ +\x05\xfa\xb55\xac\x11\x88\x00\xb8\xbb+\xc0\xe1\xf0\xec\xfe\ +\x1e6M\x9b\x84#\x0e\x5c.\x17L\x06\xa5\xcc\xe9h\ +xjc\x1d\x93\x00\x98-\x96\x01j\x8a\x9c\x17\x16\x8b\ +\x05\xfdOzQW[\xb5\xedo^*5\xde\xbc\xfc\ +\x0e\xf2N\x9e\x81\xc4M\xbam\xb1\xa2=\xed\x03\xe0.\ +W =3\x1bL&\x13\x06\xa3a[\xa3\x9b\xc7\x8f\ +;1<<\x00\x8d\xaf\xafS\xb6\x81\xdd\x09\xcf\x1a\x00\ +\xb9\xb9I\x09\x1f\xb3\xb48\x8f[7\xbe~\xaa\xe2w\ +\x1cI\xc9i\x08\x0d\x8f\x80\xdb\x0e\xcf\xfe\x19\x9e\xb5\x1d\ +\x8e\x88\x8a\x81J\xed\x83\x98\xb8D\x14=\xb8\x8f\xab_\ +~j\xd7\xfd7\xd4\xd7\xa0\xaf\xaf\x17\x1d\xed\xadHM\ +\xcfBLl;\x12\x12\x8b\xc5\x82\x96\xa6\ +FT\x94\x97\x12\xf2\xfe\xe5\x0aOd\xe5\x1c\x83\xdaG\ +s\xa8\xbae\xee\xbaV\x9a71??\x87\xc9\x89\xf1\ +]\xc7\x8aDbp\xb8\x1c\xbb\xafi4\x1a`\x22P\ +\x05 Wx\x82\xc3\xe1\x81\xce\xa0\xb6\x00\x1c\xee\xbd!\ +\xd9\xc6\x92K\x00\xcc\x96Nj\x8a\x88<'3\x16\x16\ +\xe6191\x06\x89D\x0a\x85\x87\xe7+\xc3\xb8\x8e\x02\ +\x93\xc9\x84\xe1\xa1\x81\x1d\xbd\xc6\xe4\xd4t\xe4\x1e?\xb9\ +\xa3\xf1\xff>\x84BW\xc4'$arr\x1c\x03\xfd\ +O^\xd8\x93\xeelo\xc5\xf0\xd0 \xf4kkpq\ +;:\x04\x80\xcf\x17\xc0G\xe3\xbb//|rb\x1c\ +\x1dm\xad\x88KLBV\xf6q\x04\x04\x06\x81\xc3y\ +y\xc8\x98\xc5bm)\xf6\x89\xc5\x08\x08\x08BLl\ +<\xbe\xf8\xc3\xef\xd1\xd6\xda\xb4\xef\xdf\xb0\xb48\x8f\xbb\ +\xb7o\xa0\xb7\xf71\x9a\x9b\x1a\x91\x9a\x96\x89\xc4\xe4T\ +\x88D\xe2\x17\xf2\x14\xc6FGPZ\xf2\x00\x03O\x9e\ +\x10:o|B\x12\xa2\xa2\xe3\x9cN'bcc\x03\ +\xb33\xd3\x84H\x90\xd0\xd5\x15\x5c\x8e}[\x006\x9b\ +\x0d\xeb\x86ul\x18wO\x02\x14\x89\xc5\xe0\xf1\xb8\xa0\ +\xd3\xa9$@\xc7\xb3\x1d\xe4\xdaXR\x09\x80\xc5bm\ +\xa4\xa6h\xf7\x0f\xbf\xb9\xa9\x01_~\xf61\xa6\xa6&\ +!\x16Kp\xe1\xd2\x15\xa4\xa5gA\xe8\xea\xea\xd0\xf7\ +n4\xacc|ltG\x8f!\xef\xd49He\xee\ +\x84\x17)\x91X\x02]D4bb\xe3QR\x94\xff\ +\xc2\xdf\x86\x87\x06\xb1\xb4\xb4\x08\xc9\x1e<\xe2\xc3\x0e\x1e\ +\x8f\x87\x80\x00-\xe2\x13\x92\x09W\x02<\xc3\xb3\xe4\xbc\ +\x9e\x9en\xd4\xd7T\xe1\xec\x857\x91\x92\x9a\x01\xb9\xc2\ +\x03..;\xd7\x8f\xd3h4\xb0\xd9\x1cx*\xbd\x90\ +\x99}\x0c\xeb\xebz\xbb\x08\xc03\xf4\xf5tcld\ +\x04-\xcd\x8dhzT\x8f\xd3g/\x22 \x08<\ +>\x1fF\xa3\x11\xb5\xd5\x15h\xa8\xab!d\xf8\xfc\xfc\ +\x83\x90\x9c\x92\x0e?\xff\x00\xa7\xaa\x0cy\x96\xf49=\ +ML\xd2\xdd\xdd]\xfeJBG\x14+\xcb\xcbX]\ +\xd9\xbd\xea@(t\x05\x87\xc3\xa5t\x00\x1c\x10d\xdb\ +XR\x09\xc0\x87\xbf\xf8e]\xcf\xc0\x07\x94\xa8\xcb+\ +>\xfc\xf1\xb1Q|\xf6\xc9G(,\xb8\xfb\xfc\xdf\x17\ +\xe6\xe7\xe0\xa5R!4,\xe2\x95\xfb\xb8?\xf8\xa2\xb5\ +\xbe\x8e\xe1\xe1\xa1m\x7f\x0b\x0e\x09\x83\x9f_\xc0\x9eB\ +\xb4t:\x1d2w\xf7\xa7\xadh_\x14\x11\x9a\x9c\x18\ +w:\xd1\x97\xdd\xc0b\xb9\xc0? \x10\x19\xd9\xc7\xd0\ +\xd7\xd7\xbb\xafL\xfd\xa5\xc5\xf9\xe7\xe1\xf8\xa6\xc6z\x1c\ +\xcf;\x8d\x88\xc8hH\xdc\xa4\xaf\xcc\xd2_Z\x5cD\ +{[\x0bi\xbf\xc5`\xd0?'\x02\xdd\x9d\xed8q\ +\xea,\x12\x93\xd2\xb0\xba\xb2\x8c\x86\x86ZB\x02@\x5c\ +.\x1f\xf1\x09I\x88OJq\xba\x84P\xab\xd5\x8a\xd5\ +\xd5\x15B\xf9\x17\x5c.\x1f^*\xb5\xdd\xfa\x186\x9b\ +\x0dK\x8b\x0bXZ^\xdau\xac@ \x04\x9f/p\ +\xaa-\x17g\x00\xed\xa9\x8duX\x02\xb0\xe5Yl\xd5\ +\x9bR\xd8\xf9#\x9c\x9c\x18\xc7\xe8\xe8\x8b\xe5^m\xad\ +M\x98\x99\x9e\x866\xd8\xe2\xb0\x04\x00\xd8\xda\x02\x18\x19\ +\xde\xde\xa0\xc6[\xed\x03\x97}la\x08\xf8\x02\xc8d\ +\xee`s8/\x10\x80\xb5\xb5\xd5\xadf$G\x88\x00\ +\x00\x80\x9bT\x86\x9c\xdc\x13X\x5c\x98\xc7\x9doo\xec\ +[\xce\xf7\xbb\xf9\x01i\x19Y8\x91w\x06\x81\xda`\ +\x08\x85\xae\xdb\xbc\xba\xf5u=\x1a\xeakvl\xd2D\ +\x06\x11xFH*\x1e\x96\x82\xc9d\xa2\x83`\x9b\xe0\ +\xc0 -2s\x8e\xc3\xcb\xcb\xdb\xe9\xe6\xd9l6c\ +zj\x92P\xa4\xc7M*\xddJ\xa8\xb5\x93\x00X\xad\ +V,..`vf\x86@\x04@\x08\xbe@@E\ +\x00\x1c\x8d\x00\x1c\xc0RH\xba\xb5Y\x9b\x1bZ\xe5I\ +5Bj\xbav\xc6\xe6\xa6\x09\x86\xf5\xed\xa5?F\xa3\ +\x91\x94~\xdf\x07\xed\xb9,\xcco\xf7L\xd9l6\xe8\ +t\xfa\x9e\x8d5\x83\xc9\x84\x0b\x9b\xbd\xad\xd9\xcc\xe6\xa6\ +\xe9H\xf6\x22\xa7\xd3\xe9\xf0\xf5\x0b\xc0\xa57\xdf\x86\xc4\ +M\x8a\xc2\xfc\xbbv\x85\xe5\x07\xfa{1\xd0\xdf\x8b\x96\ +\xa6F\x9c\xbb\xf8&\xe2\x13\x92\xa1\xf2V\x83\xcf\x17\x80\ +F\xa3\xc1b\xb1`\xa0\xbf\x0f_\xdb\x99\x04H\x84\x90\ +\x94\x97\x15\x11\x1e/\x96H\x91\x9c\x9a\x8e\x88\xc8h\x87\ +&\xc4\xfb&\xd2\x1b\x1b\xe8\xeal'4V\xe1\xe1\x09\ +77\x99\xdd\xde\xb8\xc9\xb4\x81\xa5\xc5E\x82\xcf\xdf\xed\ +H\x95\xe1\x1e\x16\xac\xcd\x0d\xad:<\x01\xe8\xefj\x1c\ +\xd0\xa5k\x22\xa9\xe9r\xca\x18\x06\xf9\xacv\x07\xe5H\ +\x8b\xe5\xe8\xf6!\xa7\xd3\xe9\xf0\x0f\x08\x82\xabH\x8c \ +m\x08\xca\xcb\x8a\xf1\xd9'\xffn\xd79\xdbZ\x9b\xd0\ +\xd6\xda\x843\xe7.!#+\x17\xba\x88hx\xab}\ +\xb0\xb2\xbc\x84\xe2\xc2\xfc\x1d\xbb4\xfe\x90\x08\x0c\x0cB\ +Ff.$\x127\xe7\xfb\x82l6\xac\xac,\xa3\xa6\ +\xaa\x9c\xd0\xf8\xa8\xe8X\x08]]\xed\x8e\x84\x19\x8dF\ +LOO\xee\x9a\x04(\x96H!\x91\xb8\x81\xc7\xe3Q\ +\xcb\x9d\x83\xa1\xbf\xab\x91\xf4*;\xd2\x09\x80\xc9l\xe9\ +\x05@\x11\x00\xa7\x04%\xf3\xfc\xbaH\x80B\xe1\x01\xb1\ +X\x02_?\x7f\xe8\x22\xa2q\xe7\xdbo\xf0\xa8\xa1n\ +\xdf=\x17\x80\xad\x16\xcd\x1d\xed\xadHI\xcb@Bb\ +*\x8cF\x03J\x8a\x1f\x10>\xfe\x9d\xf7~\x0a\xd3\x86\ +\x09\xb55\x95\x84\xba\x15\xee\x17\xd9\xb9y\xd0\x86\x84:\ +\xe5\x1e\xb4\xc5bAoO7\xe1D\xcf\xe0\x90p\x08\ +\xf8\x02\xbb\xaf\xbb\xae\xd7cp\xa0\x7f\xd7\xf7\xc7\xc5\xc5\ +\x05\x22\x91\x18\x5c.E\x00\x1c\x0dOm\xabc\x13\x00\ +\xf3\xa6\xb9\x05\xc0\x15j\xba(P\xb0\x0fl6\x1b\xde\ +\xde>\x90\xba\xc9\xa0\x0d\x0eAMU\x05\x1e\x14\xdcE\ +KS\xc3\xbe\xcf9<4\x80\xe1\xa1\x0146\xd4\x81\ +\xcb\xe1\x12\x16\x02:\x7f\xf12\xde\xb8\xfc\x0e\xdc\xdc\xa4\ +H\xcb\xc8F\xc1\xfd\xdbxXZl\x17!\xd9\x09\xb9\ +\xc7O!;\xf7\x04\xf8$\x18=G\xc4\xfa\xba\x1e\xf5\ +\xb5\xd5\x84\xc6\x86\xe9\x22\x9fw\xcb\xb4\x07V\xab\x15s\ +s3\x98\x9b\xdd}\xff\x9f\xcb\xe5B,\x91\x80KE\ +\x00\x1c\x0eOm\xabc\x13\x80M\x8b\xa5\x9c\x9a*\x0a\ +\x14\xc8\x01\x8dF\x03_ @\x906\x04J\xa5\x17\x22\ +\xa3c\x90\x7f\xef6\xca\xcb\x8a13=\xbdo\x03\xbc\ +\x17\x05@?\xff \xa4\xa6g\xc1\xd7\xcf\x1f|\xbe\x00\ +nR)\x82C\xc2\x90\x94\x92\x86o\xae~\xb9\xefn\ +\x83\xdb\x8d\x0f\x1f\x17\xdfx\x0b\x9eJ\xa5S&\x7fZ\ +\xadV\x8c\x8e\x0c\xe3q7\xb1R\xee\xe8\x98x\xc8\xdc\ +\xdd\xedN\xc6\xb3=\xbd.\x11\xd5A\xa5R\x05\x85\xc2\ +\x93J\x00t@\x1c\x84m%\x9d\x00|\xf8\xf3_V\ +\xf6\x0c~@U\x02\x1c!\xd8\xac6X,\x16\x98\xcd\ +f\xe2\x9b\x04O\x1b\xc2XmV\xea\x01\x12\x00\x83\xc1\ +\x80H,ATT,|4~\x88\x8c\x8aAYi\ +\x11\xda[\x9b\x09\x95\xd5\xd9c\x94\x13\x93S\xa0\x8b\x88\ +\x82@ |\xfao<\xf8h|!W(\x10\x1c\x12\ +\x86\x07\xf9w\xd1\xf4\xa8\x01=\xdd]v\x11\x81w\xde\ +\xfb\x09\xc2\xc2#\x9cV\x01\xd2d2\xa1\xbb\xab\x03\xfd\ +\xfd}\x84\xc6\xfbh|!\x16\xd9\xdfZ\xc5l1\xa3\ +\xffI/!\xd5Aw\xb9\x1c\x0aOO\xea\x83s8\ +G`\xcb\xb6:<\x01\x00\x00\x1al\xb0Q\xfb\xc5G\ +\x06S\xd3\x93hom\x86P\xe8J8M\x80F\xa3\ +A\xbf\xb6\x86\xb1\x91a\x98L&\xea!\x12%\x02L\ +&d2w\xe4\x9d:\x07mp\x18\x1a\xeakPU\ +Q\x86G\x8d\xf5v\xb5e~\x19\x02\x83\xb4HI\xcd\ +\x84\xb7\xda\xe7\x85\x7f\xa7\xd3\xe9\xe0\xf3\x05\x88\x88\x8c\x81\ +\xca\xdb\x071\xb1\x8d\xa8\xa9\xae@MU\xc5\xb6FO\ +D\x10\x15\x13\x8f\xd4\xf4,He\xeeN\xeb}\xce\xce\ +L\xa3\xa1\xae\x86PygbR\x1a|\xfd\x02H\x09\ +\xc5\xcf\xcd\xcebt\x07L\xdc\xef\x00\x00 \x00ID\ +ATd\x98\x109\x93\xb9\xcb!\x93\xbaS\x1f\x9a\xa3\ +\x11\x80\x03R\xd79\x10\x020\xd8V6\xe4\xa3\xcb\xd6\ +P\xd3v4p\xff\xceM\xdc\xbfs\x93z\x10\xaf\x11\ +,\x16\x0b\x81AZx*\x95\x08\xd7E\xa0\xaa\xe2!\ +*\xcaK\xb7\xf5V\xb0\x07\xcf\xca\xf1\xa2c\xe2\xc1b\ +\xb9\xec8\x86N\xa7C&sGf\xf61\x04iC\ +\x10\xae\x8bD\xf9\xc3\x12\xd4TU\x10&$^*5\ +\xce_\xbc\x8c\xd00\xdd\xa1\x90\xc4\xde\x97\x17n6\xa3\ +\xa3\xbd\x95\xb0\xe0\x92\x7f`\x10T$\x08\x00\x01\xc0\xe0\ +\xc0\x13LNN\x10\x9a\x07o\xb5\x06\x1c.\x97\xfa\xc0\ +\x1c\x0c\x83meC\x87\x86\x00,\xcc\xcft\xfa\x00\x14\ +\x01p:P\xfb:\x8e\x06\x81@\x88p]\x14T\xde\ +>\x08\x0d\x8f@]M%\xcaJ\x8a\xf6\xe5\x85\x7f\x1f\ +\xe1\xbaHdd\xe5\xc2M\xba\xbb$3\x8b\xc5\x82\xda\ +G\x03\xb9B\x81 m\x08\x22\x22\xa3QU\xf1\x10\x95\ +\xe5%\xaf<.L\x17\x89\x0b\x17\xaf ;\xf7\xb8S\ +\x96\xfd=\xc3\xcc\xcc\x14*\x1e\x96\x10\x9a\x17/\x95\x1a\ +\x01\x81Z\xc8\x15\x0a\xbb\xafk2m`hh\x00c\ +\xa3\xbbWm\xb8\xcb\x15N'\xbb\xec,X\x98\x9f9\ +\x90>;\x07B\x00L\x9b\xe6:\x00g\xa8is.\ +\xd0h4p_\x83w\xc0`0\xa8\x8a\xc3=\x80N\ +\xa7\xc3\xcdM\x8a\x94\xd4t\xf8\xfa\xf9#\x222\x06\xe5\ +e\xc5\xf8\xe6\xda\x17\xfb>\xa7\x5c\xe1\x89\xd4\xf4L\x04\ +iC\xf6d\x108\x1c.B\xc3t\xf0\xf4TB\xa7\ +\x8bBBb2J\x8a\x1fl\xab\x5c\xe0r\xf9x\xf3\ +\xadw\x90\x9c\x92\x0e]d4\xdc\xdd\xe5N;?F\ +\xa3\x11\x8d\xf5\xb5ho'\xe6\xfdk4~\xd0\x06\x87\ +\x90\x22\xc63??\x87\x89\xf11\xac\xae\xac\xec:\xd6\ +S\xe9\x05\x95J}\xa4\xd47\x0f\x0b\x9e\xda\xd4\xc3A\ +\x0067-\x0f\x00\xfc\x0d5m\xce\x05.\x97\x87\xc8\ +\xa8\x98\x03M:\x03\x00\x85\xc2\x13\x5c.\x8fZ\x88\xf6\ +\x08\x16\xcb\x05\xde\xde>\x90\xc9\xe4[^xT4\xae\ +~\xf5\xd9\xbe\x84~bb\xe3\x91\x91\x99\xfb<\xf1o\ +\xafD\xd1M*\x83\xd0U\x04\x8d\x9f?\xd22\xb21\ +91\x8e\xf9\xf99\x98\xcdf\x88Dbxz*\xb7\ +T\xee\xa4RR\x1a\xdd8*l6\x1bF\x86\x87P\ +WSE\xa8\xf2B,\x91\x22\x22*\x1a\x81\x81\xc1\xa4\ +\x5c{zj\x12\xc3C\x83\xbb\xee\xff\x8b%R\x04\x05\ +\x05\xc3U$\xa2>$\x07\xc4S\x9bz8\x08\xc0\x87\ +\xbf\xf8e]\xef\xe0\x07\xb0R\x11\xe3\x9dV\xc7\x97x\ +q48\xb2\xdbK\xa3\xd1 \x96\xb8!+\xe78\xfa\ +\xfb\xfb\x08\xb7s\xdd+<\x95^H\xcf\xcc\x81R\xa9\ +\xa2\x08\xc0>\xe7\x89\xc7\xe3A\xe3\xeb\x07\xb9B\x81\xd0\ +0\x1dJ\x8a\x0aPVZ\x84\xc7]\x1d\x84\xce\x91\x9c\ +\x92\x81\xb7\xdf\xfd\x00j\x1f\x1f\xbb\xe6\x80\xc5bA&\ +s\x87\x9b\x9b\x14\xfe\x01A\xb0\x98\xcd\xb0\xc1\x06\x06\x9d\ +\x01\x16\x8b\x05:\x83\xe1\xf4s\xbc\xb6\xb6\x8a\xb6\xd6&\ +47\x11k\xe2\xe6\xe7\x1f\x80\xe4\x94\x0c\x08\x84\xf6\xab\ +\xa9\x1b\x8d\x06\x8c\x8e\x0ccddh\xd7\xb1|>\x1f\ +\xbe~\xfe\x94\x00\x90\x03\x82N#\xbf\x09\xd0\x81\x12\x00\ +\x000\xadN\x19\x98\x02\x0f*\x9b\xe4{\x8b3\x87\xc3\ +\xd9\xf1\xe3\xe6\xf1\xf8OI\x80#G\x00\xb8HM\xcf\ +\x82\xc4M\x8a'}=;\xf64\xb0\x07.l6|\ +||\x11\xae\x8b\xa4<\x11{\x17\x0d:\x1d\x02\x81\x10\ +aa\x11P\xa9\xd4\x88\x8dOBQ\xc1=\x94\x96\x14\ +bueeG\x8fP,\x91\x22-#\x0b\x97\xaf\xbc\ +\x8b\xc8\xe8\x98\x97&\xfe\xed\xe7^\xd8l6\xe0\xa4\x09\ +~/\x83\xc5bA\xff\x93^\x94\x16? \xb4\xf7/\ +\x96H\x11\x17\x9f\x88\x80\xc0 R\xf6\xe1WVV0\ +8\xf0\x84P\xe4A\xa3\xf1\x83\x97JMu\x00t@\ +\x98V\xa7\x0c\x07u\xee\x03#\x00]M\x15\xad\x11\x19\ +W\x92\xa8\xe9{\x11\xde\xde>\x88\x8a\x8e\xc3\xec\xcc\x0c\ +VWV\xc0\xe6p\x10\x1b\x97\x00\x0fO%\x18\x0c\xc7\ +n|B\xa3\xd1 \x12\x89\x11\x9f\x90\x8c\xc8\xa8X\xd2\ +\x1b\xf6\xd0h4\xb0\x5cX`2Y\x94\xf7O\x12\x18\ +L&$nR$%\xa7! \x08\xb1\xf1\x89\xa8\ +\xab\xa9\xc2\xc4\xf8\x18VV\x97a\xb1X \x14\x08!\ +\x93+\x10\x13\x13\x8f\xb4\x8clx\xa9\xbc\xb75h\xa2\ +\xb0w\xccLO\xa1\xa4\xa8\x00\xc5\x85\xf7\x09\x8d\xf7R\ +\xa9\x10\x9f\x90\x0c\x91\xd8\xfe\xda\x7f\xab\xd5\x8a\xe9\xa9\x09\ +tu\x12\x8b\xfa\xa85\x1a(\xbd\xa8\xa8\x9b#\xa2\xab\ +\xa9\xe2\xc0\x9au\x1c\x98\xc5\xd90\x99\xeb\x00P\x04\xe0\ +{\x06\xce\xc3S\x89\xcbo\xbd\x0b\x85\x87'fg\xa6\ +!tuEbR*|4\xbe\x87\x86}3\x99L\ +\xa7\xec\xd2\xe6\xcc\xef\x1d\x8b\xc5\x82\xa7\xd2\x0b\xa7\xcf^\ +DbR*\xc6\xc7F1\xbf0\x07\x9b\xd5\x06W\x91\ +\x08*\x95\x1ar\x85\x07e\xf8I\xc2\xda\xda*\x1a\x1b\ +jq\xf3\x9b\xab\x84\x8fINIGHh8)\xeb\ +\xc0\x86\xd1\x88\x81\xfe'(+\xd9}\xeb\x98\xcb\xe5#\ +\x5c\x17\x05\x91HLM\x9c\x03\xe2\xa9-=\x5c\x04\xc0\ +\xb4i\xbe\x0b\xe0?S\xd3\xf7=\x8f\x8c\xc1\x8068\ +\x14J/\x15\xf4\xfa5\xb0]\xd8\x10\x89%\x94A\xa5\ +\xf0\xda\xc8\x9b\xc2\xc3\x13\x0a\x0fJ\xed\xed\xc0\xd6>\x93\ +\x09\x8f\xbb;q\xeb\xc65B\xa2?\xc0V9d\xce\ +\xb1\x93p\x93\xca\xc8\x89>\xccL\x13\xee9\xa0R\xab\ +\x11\x19\x15K\x95\xff9\xea\xfb\xb4eK\x0f\x04\x076\ +\xe3\x7f\xfc\xf3\xff\xb5\x90NE\x93v~\xe8t:D\ +\x221\x94J\x15\xa42w\xca\xf8S\xa0\xe0$\xb0Z\ +\xad\x18\x1b\x1d\xc6\xcdo\xbe\xdeU\x03\xe1\xbb\xb8\xf4\xe6\ +\xdb\x08\xd2\x06\x93b\x84766\xd0\xff\xa4\x97p\xa7\ +\xc7\xac\xeccP(<(\x02\xe0\x88\xb6\x82\xb6eK\ +\x0f\x1d\x01\x00\x80\xb5\xb9\xa1Uj\x0a\x0f\x17h4\xba\ +\xc3\xef\x03\xd2i\xd4BE\xc111=5\x89\xbbw\ +n\xe2\xdaW\x9f\x11>\xe6\xec\x857\x91\x9c\x92AJ\ +\xdd\xbf\xcdf\xc3\xf2\xf2\x12\x9a\x9b\x1a\x08+1&$\ +\xa6\xd8\xddq\x90\xc2\xe1\xb4\xa1\x07\xeaz\xf6v\xd47\ +Fej\xb2\xa9i<\x1cX^YBoO\x176\ +6\x0c\x0e|\x974\xcc\xceLczf\x8a\x9a0\x0a\ +\x0e\x85\xb9\xd9Y\x14\xe4\xdf\xc1\xd5/\x89\x1b\x7f?\xff\ + \xe4\x9d<\x0bO\xa5\x17)\x1e\xb8\xc5b\xc1\xd8\xe8\ +\x08\xeaj\xaa\x08\x8d?\x7f\xf12\xbc}4T\x14\xd2\ +A\xd1\xdbQ\xdfx\x90\xe7?\xd0Y\xdf0m\x96\x02\ +\xa0\x08\xc0!\xc1\xf0\xe0 \xae}\xf59)5\xc8\x07\ +\x09\xa3\xc1\x80\xbe\xbe\x1ej\xc2(8\x0cVV\x96Q\ +\x5c\x94\x8f\x9b\xdf|Mx\xdf\x1f\x00\xce]x\x03\x91\ +Q1\xe0\xf1\xc8\xa9\xbf\xd7\xaf\xad\xa2\xe9Q=\xdaZ\ +\x9b\x08\x8d\x8f\x8dK\x84T*\xa3\xc2\xff\x0e\x8a\xa76\ +\xf4p\x12\x00\x93\xc9\xfc9(E\xc0C\x03\x83A\x8f\ +\xba\xdaJ\xeaAP\xa0\xb0\x07,/-\xa2\xb4\xa4\x08\ +7\xae\x7fEXl\x09\x00.\x5cz\x0b\xd9\xb9' \ +#I\x06\xd9j\xb5btt\x04\xb7n\x10\xab\x7f\xfb\xb6\ +\x88\xdaG\x03\x06\x93RN;\x8a\xb0Z\xadX\x98\x9f\ +\xc3\xc3\xd2b\xfc\xfe\xa3\x7f\xdd\x93\xf1\xf7\xd1\xf8\xe1\xc4\ +\xc9\xb3\x88\x8a\x8e\x05\x9bMN\xf2\x9d\xc5b\xc1\xe3\xee\ +NTU<$|\x0fQ1\xf1\x10K$\xd4d:\ +(^\x87\xed;\ +\xb4c\xb3e;\x0f=\x01\x00\x80\xb6\x8a\xeb]\xe1i\ +o\x86R\xd3\xfaza\xb3\xd9\x00\x9b\xed?\xfe\x7f\x9b\ +g\xcb$5\x0c\xf9C\xff\xd6\x9d~\xe3\xf3\xbf\x91p\ +\x0d\x16\x8b\x05\x89\x9b\x94z\xb1\x8e\x18\xacV+\xc6\xc7\ +FQ]U\x8e\x07\xf7\xef\xa0\xaa\xb2l\xcf\xe7HL\ +J\xc3\xbb?\xfe)BB\xc3IM\xba3\x18\xd6\xd1\ +P_\x8b\xba\xda\xaa\x1d;<~\x1f>\xbe\xbe\x88\x88\ +\x8c\x86BAIA;2\xda*\xaew\xbd\x8e\xeb\xbc\ +\x16\x02`\xd80=\x04@\x11\x80\xd7\x08\x83A\x8f\x96\ +\xe6G\xa0\xd3\x19O\x15\xc6\x8en\x08\xc6j\xb1\xa2\x9f\ +@;V\x0a\x14\xbeO\x1c\xf5kkhkkFi\ +\xf1\x03\xd4\xd6T\x12\xce\xb0\xff.\xe2\x13\x92\xf1g\xbf\ +\xf8_\x10\x19\x15\x03\x0e\x89\x8a{V\xab\x15\xbd=\xdd\ +(+y@\xe8\xbe\xb6\x9a\xfeDB\x17\x19}`\xd1\ +2\x0a\xa4\xdaL\xe7 \x00\x1b\x1b\x9b\xbf\x03\xf0?Q\ +\xd3\xfazQ\xfc \x1f\xcd\x8f\x1a\xa82\x1f\x00\x06\x83\ +\x81z!\x0e\xa1\x01\xfend\xe7e\x11\x1e`\xab\xb4\ +\x15\xb4\xff(\xd7\xa4\xd1h\xfb\xde\x9e\xb1Z\xad\xd8\xd8\ +0bb|\x1c\x15\xe5%\xc8\xbfw\x1b=\xdd]\x84\ +<\xec\xef##\xeb\x18\xde\xfb\xe0?!2*\x06\x5c\ +\x1e\xb9\xf5\xf6\xb3\xb33\xa8\xad\xaeD-A\xd5?\x1f\ +__dd\xe6\x90\x9a\x7f@\xe1@m\xa6s\x10\x80\ +\x0f\x7f\xf1\xcb\x86\xde\xc1\xf7a\xb5Q\xfb\xa5\xaf;\x0a\ +0>\xa6\xa7\x1e\x04\x85Ca\xec-\x16\x0b\xccf3\ +,f3\xcc\xe6M\xac\x1b\xd6\xa1_\xd3\xc3`X\xc7\ +\x86\xd1\x08\xa3\xd1\x80\xcd\xcdMX,\x16X\xadV\x00\ +60\x99\xac\xad\xf6\xd4,\x16\x5cX.\xe0\xf2x\xe0\ +\xf1\xf8\xe0\xf1x\xe0p8`\xb2X\xcf\xc7\xd0\xe9\xaf\ +\xeesa\xb5Z\xb1a4bjj\x12\xad-Mx\ +XV\x84\xb2\xe2\xc2}\x19~.\x97\x8f\xb4\x8c,\x5c\ +y\xfb\xc7\x88\x8bO\x22E\xe7\xff\xbb0\x1a\x0d\xe8l\ +o\xc5\x83\x82\xbb\x84\x12\xff\xb8\x5c>\xd2\xd2\xb3\x10\x97\ +\x90|h\xda\x8e\x1fU\xd0i6|\xf8\x8b_6\xbc\ +\x8ek\xbd6\xd7\xb0\xa5\xfczCD\xfa\xe5xjz\ +\x0f\xe0\x85a0\xa8\x84\x9e}?;J\x02\xf5\x87\x80\ +\xd5j\x85\xc5b\x81\xc9\xb4\x01\xc3\xfa:\xd6\xd6\xd60\ +??\x8b\xc9\x89q\x0c\x0d\x0e`rb\x1c\xabk\xab\ +X\xd7\xeb\xb1a4`\xdd\xb0\x8e\xb5\xd5U\x18\x0c\x06\ +\xac\xae\xac\xc0`\xd0\x83\xcb\xe5\x83\xcd\xe1\x80\xcf\xe7\x83\ +\xcd\xe6\x80\xcb\xe3\x82\xc7\xe5\x81/\x10\x82\xc3\xe1@ \ +\x14\xc2\xdb\xdb\x07>\x1a?x*\x95\x10K\xdc\xc0\xe7\ +\x09\xc0\xe3\xf3\xe0\xe2\xc2~N\x08,\x16\x0b\x0c\x86u\ +\xcc\xcd\xce\xa2\xf9Q\x03JK\x1e\x10\xce\xa8\x7f\x99\xb1\ +=q\xf2\x0c.\xbd\xf96\xa2c\xe3H\xab\xf5\x7f\x06\ +\x8b\xc5\x82\xe1\xa1A\xdc\xbb{\x0b\x9d\xed\xad\x84\x8e\x09\ +\xd7E '7\x0f\x22\x91\x98z\xf9\x1c\x1c-\xe5\xd7\ +\x1b^\xd7\xb5^\x1b\x010\x187n\x03\xa0\x08\xc0\x01\ +\xc0K\xa5\x82\xaf\xaf\xff\x9e4\xc8)lEH\x94J\ +\x15hTw\xc1\xd7\xe6\xe5\x1b\x8d\x06\xe8\xf5z,-\ +.`nv\x16\x13\x13c\xe8}\xdc\x8d\xda\xda\xca=\ +\xd5\xd3?\x9b?\x83AO\xd8P\x87\xe9\x22\x91\x94\x9c\ +\x06mp\x18<\x95J\xb8\xb9\xc9\xc0b\xb10?7\ +\x8b\xee\xeeN\x94\x14\x15\xec\xa9\x85\xef\xcb\xf0\xa3w?\ +@\xde\xe9s\x08\x0d\x0b\x87\x8b\x0b\x9b\xf4g8;3\ +\x8d\x07\x05wq\xe7\xd6u\xc2\x84$\xe7X\x1e\x02\x02\ +\xb5\x94\xf7\x7f\x18\xd6\xa5-[\xe9\x5c\x04\xc0\xb8a\xfe\ +\x15\x8d\x86\xbf\xb1Q\xe5\x80\xa4#((\x18'\xcf\x9c\ +\xc7\xec\xec\x0c\x06\xa8d7\xc2\xf8\x9f\xff\xe2\xaf\x10\x1e\ +\x11I-\x8a\x07\x0c\x8b\xc5\x82\xa5\xc5\x05LNN`\ +lt\x18C\x83\x03\x18\x1c\xe8GMu\xc5k%\xad\ +\x9d\xed\xad\xcf=f?\xff DE\xc7\x82\xcb\xe3\xa1\ +\xbb\xab\x03M\x8duv\x9f_\xae\xf0\xc4\x07\x7f\xf43\ +d\xe7\x9c\x80\x8f\xc6\xf7@ro\xf4\xfa5\xd4TW\ +\xec\xa9\xe3`zV\x0e\xd22r\x1c\xbe\xc9\x17\x05\x80\ +F\xdb\xb2\x95\xaf\xedz\xaf\xf3\xc75\xd5\xd7.\xf3d\ +\xbe\xae\xd44\x93\xefY-,\xcccxp\x00cc\ +#\xd8\xdc\xdc\xa4\x1e\xca+\xc0`0\xe1.\x97\xc3\xdf\ +?\x10\xeer\x05E\x00\x0e\xe8\x9d4\x99L\x98\x9b\x9d\ +\xc1\xe3\xeeNtwu\xa0\xe7q\x17\xfa\x9f\xf49%\ +I\x8dOH\xc6\xe5\xb7\x7f\x8c\x94\xd4\x0cHe\xee\x07\ +\xd2]oss\x13\x8f\x1a\xeb\xf0\xeb\x7f\xfc\xff\x087\ +\xed\x92+<\xf17\xff\xd7\xdf\x2295\x83\xca\xfc?\ +\x04X\x9f\x1b\x5c\x89IH\x129]\x04\x00\x00\xba\xdb\ +\xeb\x0bb\xb3}\xafP\xd3L6k\xa4A*\x95A\ +$\x12#$4\xfc\x95\xd9\xd2\x14\xb6h6\x8b\xb5\x95\ +\x18F\x09\xf9\x1c\xc0\x22\xa6\xd7ctt\x04]\x9dm\ +hijDGG\xeb\xff\xdf\xde}F7uf\xfd\ +\x02\xff\x1fU\xcb\xb2e\xc9\xbdw\xdc\xb01\x98\x98\xde\ +\xc1\xf4\x16j\xe8\xc1\x80\x09\x10H(!o\x99{\xdf\ +\xb9\xeb-s\xd3&3If2!\x0c$\x84`\x9a\ +\x13z/\x06L5\xcd\x05\x1b\xf7^q\x93e\xf5v\ +?\x98\xe4N!\xb1\xdcU\xf6o-\xd6\xe2\xc3\x91\xa5\ +\xb3\xf5\xe8<\xfb\xe9&\x8fU[\x1a\x81@\x88\xb9\xf3\ +\x17b\xe6\xec\xf9\x88\x8a\x8e\xe9\xb5\xad\xa1\x0d\x06\x03\x0a\ +\xf2\x9f\xe3\xf8\xd1C\x9d:\xb1s\xf5\xda\x0d\x88\x1e4\ +\x98\xe6\x08Y\x88\xdc\xac\x07\x17\xfb\xf2\xfd\xfa4\x01P\ +\xa94\xfb\x00P\x02\xd0[_&\x87CK\xfeH\xbf\ +\xb5\xf8\xd5j\x15\x8a\x0a\x0b\xf0(\xfd>\x9e\x04\x80\x12\x00B,X\x9bL\x86\ +\xfc\xfc\xe7\xb8v\xe5\x02\xce\x9f=e\xd5-\xfe\xbf%\ +km\x85B!\x87L&\x83J\xa9\xec\xd5\x0aV*\ +mA\xda\xad\xeb8\x9a\xfc\x9d\xc9K$\x7f\xda\x83`\ +\xd2\xe4ipuu\xa3\x82jA^\xd6\x8d}\xaa_\ +\xfa\xe2\xf3K\xea\x8ct: !\x96G\xa7\xd3\xa1\xae\ +\xb6\x06\xf7\xef\xdd\xc6\xd1\xc3\x07\xf1\xf4q\xef\xeeY2\ + <\x12\xce\x12\x17\x08^\xee\xec\xc7\xe3\xf1\xc00,\ +0,\x06,\x86\x05\xbd^\x0f\xbdA\x0f\x8dF\x03\x8d\ +\xba}S\xa1\xa6\xe6\xc6^\x9f{0f\xdc$\xbc\xbe\ +p)\xe2^\x8b\x87\x9b\x9bG\x8f\xcf\xbdi\x93\xc9p\ +\xf7\xce-\x1c\xd8\xbf\x07\xe9\x0f\xee\x9a\xfc\xbaq\x13\xa6\ + q\xfd&\x0c\x8d\x1f\x0e.\x97K\x05\xd6B\xb0\x18\ + ,\xc8\xa3\xcf\xeb\xe3~\x991\x96q\xf3xF\xcc\ +\xd8E\xb1\xf4\xb5\x13bA-\x14\x85\x02y\xb9\xcf\x90\ +z\xfd2~L9\xda+k\xf8\xc7M\x98\x82\xb0\xf0\ +\x08xxxA\xe2\xec\x0c\x07G\x11\xec\x05\xf6\xb0\x13\ +\xd8\x81\xc7\xe3\x83\xcb\xe5\x82\xc5b\xff<\xa9\xed\xa7-\ +\x84\xb5Z\x0d\xb4Z\x0dTJ\x15\x14\x0a9Z[[\ +\xd1\xd2\xdc\x84\xba\xba\x1a<\xcfy\xd6\xa5\x13\xfc~M\ +\xda\xcdk\xa8(/\xc5\xac\xb9\xafc\xc2\xc4)\x08\x8f\ +\x88\xea\xb1\x1d\xff\x14r9\x1e<\xb8\x8b#\xc9\xdfu\ +\xaa\xf2\xf7\xf1\xf5\xc7\xec\xb9\x0b\x10=(\x96*\x7f\x0b\ +\x93q\xf3x\xbf,\x93\xe9\x97\x04@\xa1T\x1f\x05@\ +\x09\x00!\x16\xc0h4\xa2\xa5\xb9\x09\xf7\xef\xdd\xc1\xc5\ +\x0bg\xba\xbc?\xfe?\x12\x08\x84\xf0\xf2\xf6A\xcc\xa0\ +\xc1\x18\x1a?\x1cA\xc1!\x90H\x5c\xe0\xe0\xe0\x00\x81\ +@\xd0\xbe]/\x9b\x0d\x16\x8b\xf5\xf3\xbf_\x9a\xcdn\ +4\x1aa0\x18~\xfe\xf7\xf36\xc3J\x05\xe4mm\ +hjlDIq!\x1e\xdc\xbf\x83\xdc\x9cg\xa8\xa9\ +\xae\xea\xf6=\x94\x95\x16c\xff\xd7\x7fAey\x19\xa6\ +\xcd\x98\x83a#F\xc1\xd1\xb1{\xdb\x9c\xc8\xdb\xdap\ +\xe7\xf6M\x1cI\xfe\xaeS\xbb\x12\x0a\x04B\xacY\x9b\ +\x841\xe3&\xc0\xc1\x816\xfc\xb1\xb8\xe4\xba\xbdN\xec\ +s\xfd6\x1d\x9f\x86\x01\x081\x7f\x06\x83\x01uu5\ +\xb8v\xe5\x22N\xfep\x0c\x99\x19\x8f\xbb]\xe9\x07\x04\ +\x05!n\xe80DF\x0dDDd4\xbc\xbc|~\ +\xde\x9f\x9f\xcdf\xf7\xf8\x92\xb5\x9fz\x094j5\x14\ +\x0a9\xaa\xab\xab\x90\xfb,\x0b9\xcf\xb2\x90\x91\xf1\x18\ +e%%\xddN\x06\xe2^\x1b\x8e\xd7\x17.\xc1\xf8\x09\ +S\xe0\xe6\xee\xd1\xa5{h\x93\xc9\x90v+\x15\xdf\x1f\ +\xf8k\xa7Z\xfe\x02\x81\x10k\x127`\xe9\xb2\xd5\xf0\ +\xf4\xf2\xa6%\x7f\x16\xa6\xbf\xba\xff\xfb\xad\x07\x00\x002\ +o\xa5dG\x8fY\x18M_?!\xe6I\xa7\xd3\xa1\ +\xbc\xac\x04g\xcf\x9c\xc0\x99\x93?\x98<\x0b\xfdU\xdc\ +=\xbc\x10\x122\x00\xe3&N\xc6\xa0\xd8!\xf0\xf5\x0b\ +\x80X,\x06\x87\xc3\xed\xf5\x9d\x18\x19\x86\xf9y\x8f\x0c\ +{\xa1\x10\x12g\x17\x84\x85G`\xc2\xa4\x04\x94\x97\x97\ +\xe2\xe9\x93G\xb8s\xeb\x06\x8a\x8a\x0a\xba<\xac\xf1\xf8\ +\xe1}\xc8d\xad\xa8\xaf\xab\xc3\xac9\xf3\xe1\x1f\x10d\ +\xf2\x0a\x01\xa3\xd1\x88Vi\x0bR\xaf_\xc1\x91\xe4\xef\ +:\xbd-\xf1\x8cYs1{\xee\x02\xb8{xR\xe5\ +o\x812o\xa5d\xf7\xd7{\xf7[\x02 W\xa8\x92\ +\x01\xfc7}\xfd\x84\x98\x1f\xadV\x8b\xe2\xa2\x02\x1c>\ +\xf4-\xce\x9f=\xdd\xe5\x93\xf1\x02\x02\x83\x11\x12\x1a\x86\ +\x91\xa3\xc7b\xe4\xa8\xb1\xf0\xf2\xf2\x81\x9d@\xd0\xe1\xd1\ +\xbc\xbd\x89\xcdf\x83\xcd\x16\x80\xefa\x07WW7D\ +E\xc5`\xdc\xf8\xc9\xb8s\xfb\x06\x1e?|\x80\xfc\xbc\ +\xdc.%;\x05y\xb9P\xc8\xe5h\x93\xc9\xf0\xfa\xa2\ +7\x10\x12\x12\x0av\x07\x93\x03\x0d\x06\x03\x1a\x1b\x1bp\ +\xf9\xe29\x9cH9\xd2\xe9\x1e\x96IS\xa6c\xe9\xf2\ +\xd5\x08\x08\x0c\xa6-\xad-\xd4\xcb\xba\xb0_\xf4k\xba\ +H\xc3\x00\x84\x98\x1f\x8dF\x8d\x82\xfc<\x1c\xd8\xff5\ +.]8\xdb\xa5\xeeq\xb1\xc4\x05#G\x8f\xc5k\xf1\ +\xc3\x117t\x18\x82CB{\xfcX\xdc\x9e\xbfo\x0d\ +\x8a\x8b\x0a\x90~\xff.\xd2\xd3\xef\xe1\xc1\xbd;]J\ +|\xc4\x12\x17\xcc\x9a3\x1f\x8b\x96,G\xe8\x800p\ +\xb9\xbc_\xeca\xa9\xae\xae\xc4\xa5\x0bg\xf1\xc3\xb1\xc3\ +\x9d>#!a\xda,\xac\x5c\xb3\x0e\x83\x87\x0c5\xfb\ +\xd8\x92W\xeb\xcf\xee\x7f\x00\xe8\xd7\x94q\x5c\x5c\xd0\x5c\ +\x8f\x80(/*\x06\x84\x98O%\xf8,+\x13\x07\xbe\ +\xdd\x8b+\x17\xcfw\xa9\xf2\x8f\x1f6\x12\x8b\x96,\xc7\ +\xec\xb9\xafc\xc4\xa81\xf0\xf1\xf1\xb3\x88-\xaa\xd9l\ +6\x5c\xdd\xdc\x11\x12:\x00\x81A!\xf0\xf0\xf4\x84N\ +\xabEuUe\xa7\xfe\x8eJ\xa5Da~>\xb4Z\ +\x0d\xdc=\xbc\xe0\xec\xec\xfcO\xads\xb5Z\x8d\x82\xfc\ +\xe78\xf9\xc3Q\x1c<\xb0\x0f5\xd5\x9d{\x8f\x09\x93\ +\xa6b\xd9\x8a5\x18\x1c\x17\x0f\x81@@\x05\xd7Be\ +\xde:\xfe\xf8\xd8\x89s{\xfa\xeb\xfd\xfb\xf5W\xd9\xa6\ +P\x7f\x03 \x8e\x8a\x01\xe9O\x06\x83\x01F\x83\x01F\ +\xc0f\x0fRb\x18\x06z\xbd\x0ey\xcfsp\xfc\xe8\ +!\x5c\xbdt\xa1\xd3\x95\xbfX\xe2\x82\xe93fc\xf2\ +\xd4\x19\x88\x89\x19\x0c\x91\x93S\xaf\xef\x94\xd7\x1b\x1c\x1c\ +\x1c\x113h0\xfc\xfd\x03\x10\x1e\x1e\x89\x90\xd00\x5c\ +8\x7f\xa6S\xbd\x01J\xa5\x1cG\x92\x0f\x80a\x18,\ +]\xbe\x1a\x03\xc2\x22~N\x82\xdad2dd<\xc6\ +\xe9\x93)8\x91r\xa4\xd3\x9fo\xe4\xa8qX\xbct\ +\x05\x86\xbe6\x1c\xf6\xf6\xf6\xf4\x03\xb6`/\xeb\xc0\xfe\ +\xfb\xdd\xf7w\x00h\x18\x80\xf4\x17\x85B\x81\xc6\x86\x17\ +hhx\x01y\x9b\x0cj\xb5\xda\xa6\xe3\xa1T*\x91\ +~\xff\x0eN\x9dH\xe9t\xe5\x1f\xf7\xdap\xcc\x9e\xbb\ +\x00#F\x8e\x86\x9f\x7f\xc0/v{[^\x8f\x88\x1a\ +\x15\xe5e\xb8s\xfb&N\x9fH\xe9\xd2*\x88\xb5\xeb\ +6a\xc1\xe2e\x08\x0c\x0aF}]-\xee\xdf\xbd\x8d\ +\xd3'Sp\xf7\xce\xcd.U\xfe+V'b\xc4\xa8\ +1\xb4\xdc\xcf\xc2\xf5w\xf7\x7f\xbf\xf7\x00\x00\xc0\xe3\xd4\ +\xa3\xd7\x06\x8f_2\x89\x8a\x03\xe9\xcb\x16\x7fee9\ +\x1e?LGv\xd6STWU\xa2\xa5\xa5\x192Y\ +\xabm'Dry\x97\xb6\xf4\x9d:c\x0e\x16/Y\ +\x8e\xe8A\x83\xe1\xe4$\xb6\xc8V\xff/\xe1\xf1\xf8\x08\ +\x0a\x0e\x85\xc4\xd9\x05~~\x018x`_\xa7\xd6\xe7\ +\x03\xc0\xe1C\x07\xc0\xb0\x18\x0c\x1e2\x149\xcf\xb2p\ +\xfe\xec\xa9.M2\x1c\x1c\x17\x8f7\xd7m\xc4\xd0\xf8\ +\xe1T\xf9[\x81\xc7\xa9G\xaf\xf5\xf7g\xe8\xf7\x04@\ +\xaeT\x7f\x06\x80\x12\x00\xd2'\xf4z=\x0a\xf2\x9f\xe3\ +\xd4\x89\xe3\xb8u\xf3\xba\xd5\x1eW\xdb\x17\xdc=\xbc0\ +u\xfa,\xbc\xbep)B\x07\x84\x83\xcf\xe7[\xe5}\ +\xb2X,8;\xbb`\xc4\xa8\xb1pqu\x83\x87\x87\ +'\xae^\xb9h\xf2\x90\x80R)\xc7\x0f\xc7\x8f\xe0\xe1\ +\x83{(//\xeb\xd2\xc4\xc2\x91\xa3\xc6!i\xf36\ +\x0c\x1e2\x14\x02\x01u\xfb[\x83\x97u_\xbf2\x8b\ +E\xa3\xd9\x99\x19\x0a\x8e\x83'\xcdd!\xbd\xde\xf2/\ ++-F\xf2\xf7\xdf\xe2\xd8\xe1\xef\xad\xfe\xe4\xba\xde\x14\ +\x10\x18\x8c\xd9\xf3\x16`\xce\xdc\x85\xf0\xf3\x0f\xb0\x99%\ +h:\x9d\x0e\x95\x15\xe58u\xe2\x18\x8e\x1fM\xee\x95\ +\xed\x90\xff\x96@ \xc4\xd8\x09\x93\xb0b\xd5Z\xc4\x0e\ +\x8e\x83\x9d\x1d=&\xad\xa2\x1c\xb5\xd5*\xa3\x07\xc5\xf6\ +{&g\x16\xbf\xdaQq\x91\x03\xbc\x83\xa3\x07S\xb1\ + \xbd\xa9\xb5U\x8akW/\xe1\xc07{\xd1&\x93\ +R@\xba(8$\x0cK\x97\xad\xc4\xfc\x85K\xe1\xed\ +\xedcS\xeb\xcfY,\x16DNN\xf0\x0f\x0c\x82\xbd\ +P\x88\xaa\xca\x0aH[\x9a{\xe5\xbd\xc4\x12\x17L\x9f\ +9\x1b+W'\x22:f0\xec\xech\xa9\x9f\xb5x\ +|\xeb\xcc\xa1\x1fN_8\xd1\xdf\x9f\xc3,\xd6\xe6(\ +T\xea\x7fg\x18\xac1\xd2d@\xd2K\xf4z=\xea\ +jk\x90v\xf3z\x977\xb5!@DT4\x16-\ +Y\x8e\x99\xb3\xe6A\xe2\xecb\x93;\xcf\xb1X,x\ +y\xf9`\xee\xfcE\xe0qy\xf8!\xe5\xb0\xc9\xc7\xf5\ +v&\xc9\x9a6c\x16f\xce~\x1d\xc1\xc1!\x1dn\ +(D,\x07\xc3\xb4\xd7y\xe6\xf0Y\xcc\x22u?}\ +\xfe\xb2l\xc2\xd0\xe0\xc5\xee\xfeQ\xeeTc\x0e\x1cE\x22\xc0J\x92Q#\x8c(*,\ +@\xf2\xc1op\xed\xca\x05\x93^\x13\xf7\xdap\xcc\x9b\ +\xbf\x08Q\x03\xa3{\xb4\xe5l4\x1a\xa1\xd5j\xf1\xe2\ +E\x1d2\x9e<\xc6\xe5K\xe7\x90\x93\x9d\x89\xfa\xba\xba\ +\x1e\xdd\x9bA\xa9\x94\xa3 /\x17\x05y\xb9\x10\x08\x84\ +\xb8}\xeb\x06\x22\xa3\x06\x22a\xda,\xc4\x0e\x8e\x83\xab\ +\x9b\x1b8\x1cn\x8f%\x02\x1c\x0e\x07\x03\xa3c\xf0\xc6\ +\x8a5\xa8\xa9\xa96\xf9t\xbf\xea\xaaJh4\x1a\xfa\ +\xe1Y\xb9\xcc\x9b\xc73\x92\xb6\xee.\xa1\x04\xe0W\xc8\ +\x14\xaa?\x02\xd8G\xc5\x85\xf4\x17''1<<<\ +\xe1$\x96X\xcd=)\xe4r475\xe2\xee\xed[\ +&\xf7\x82$L\x9d\x81\xd7\xe2\x87\xf7\xe8\xbe\xfez\xbd\ +\x1e\xad\xd2\x16df>\xc5\x95K\xe7q\xe3\xfa\x95^\ +\xdfL\xe7\xa7d\xa0\xb8(\x1f\xc5E\xf9\xc8\xce\xca\xc0\ +\x88\x91c0e\xea\x0c\x0c\x8c\x89\x85X,\xe9\xb1\x96\ +7\x8f\xc7G\xfc\xf0\x91X\xb2l%\xfe\xf2\xa7?\x9a\ +\xd4\xdbr\xf8\xd0\xb7\x181j\x0c\xdc\xdc=h\xad\xbf\ +\x15{Y\xb7\x99\x15\xb3[_r\xf2\xec\xa5\xa7\x89+\ +\x17\xed\xe4\xdaK\xf8TdHO\xd1h\xd4x\x96\x9d\ +\x89;i7:\xbcv\xdc\xf8\xc9\x88\x8c\x8a\x06\xdfJ\ +\x1e\xc6F\xa3\x11e\xa5%8\x9a\xfc\x1d\x9e\xe7\x9a\xb6\ +^=a\xeaL,Z\xb2\xbcG\xc7\xfd\xd5j5J\ +K\x8a\xf1C\xcaa\x1c:\xb8\x1f7\xaf_\x81\x5c\xde\ +\xd6\xe7\xf1\x90\xb64\xe3Yv\x06\x0a\x0a\xf2\xa0\xd5j\ +!\x91\xb8\xc0\xc1\xc1\x01lv\xcf\xb4\x87\xb8\x5c\x1e\xc4\ +b1\xa4\xd2\x16\xe4<\xcb2-AS(1\xf4\xb5\ +\xe1\x1099\xd1\xcc\x7f+\xa4h,\x91\xcd\x9c\xb7\xc4\ +\xec\xe6\xb7\x99\xe5\xee\x12\xd9O\xee\xee\x1d6%h;\ +\x15\x1b\xd2\x1f\xe4\xf26477A\xaf\xd7Y\xc5\x08\ +\x80J\xa9\xc4\xe3G\x0fp\xe3\xfaU\x93\xae\x8f\x88\x8a\ +\xc6\xf4\x99s\xe0\xe7\x1f\xd8c\x95Qk\xab\x14\xcf\xb2\ +3\xf1\xe3\xf1\xc38u\xe2\xb8Y\xc4\xe5yN6\x9e\ +\xe7d\xa3\xbc\xac\x04s\xe6.DTt\x0c\x1c\x1dE\ +\xddoU\xb1\xd9\xf0\xf1\xf5\xc3\xe4)\xd3\x91\x9d\x95a\ +\xd2&A\xe9\xf7\xef\xe2\xee\x9d[\xf0\xf0\xf4\x04\x9fO\ +\xbd\x00\xd6&\xfb\xc9\xdd\xbd\xe6\xf8\xb9\xcc2\x01X\x9d\ +\xb4}G~\xc9\xf2\xedtL0\xe9\x0fO\x1e?\x84\ +V\xa7\xb5\x9a}\xd7UJ\x05\x1e\xa5?0y|}\ +\xde\xeb\x8b\x11;dh\x8f\x8c\xfb\x1b\x8dF456\ +\xe0v\xda\x0d\x9c\xfc\xe1X\xa7&\xc7\xf5\x95\xe3G\xbe\ +GMU\x15^_\xf4\x06\xc6\x8c\x9d\x00\xb1\xa4\xfbC\ +?|\xbe\x1d\x06\xc5\x0e\xc1\xcc\xd9\xf3MJ\x00\x94J\ +9n\xa7\xdd\xc0\xf0\x11\xa3\x11\x18\x14L?B+\xc2\ +b\xda\xeb4J\x00:\xe1\xe1\xb5#'\xe2&.\x9d\ +O\xc5\x87\xf4\xb5\x9b\xa9Wp3\xf5\x8aM\xde{\xc2\ +\xb4Y\x189jl\x8f\x1c7k0\x18\xd0\xd8\xf0\x02\ +W\xaf\x5c\xc0\xe1C\x07z|\xbb\xdc\x9et;-\x15\ +-\xd2\xf6#\xa1\x13\xa6\xce\x80\x8b\xab[\xb7{?\xc4\ +\x12g\x8c\x189\x06\x09\xd3f\xe1\xf2\xc5\xb3\x1d^_\ +\x98\x9f\x87\xec\xac\x0cx\xfb\xf8\x80\xc7\xa3\x11Pk\xf1\ +\xf0\xda\x91\x13\xe6\xfa\xd9\xccv\xcdI\x9bB\xb5\x83\xb6\ +\x04\x22=\x85\x01\x03\x16CK\xac~\xbd\xc2r\xc1\xf8\ +\x89S\xe0\xe3\xeb\xd7\xed\xd6\x7f{\xcb\xbf\x11\x17\xce\x9d\ +\xc6\x81\xfd{{\xb4\xf2\x17\x08\x84\x7f\xf7\xaf\xa7<\xcb\ +\xca\xc0w\xdf\xec\xc5\xf9s\xa7\xd0\xd8\xd8\xd0\xed\xbf\xc7\ +f\xb3\x11\x18\x18\x8cQc\xc6\xc3\xc7\xd7\xbf\xc3\xebk\ +\xaa\xab\xf0\xf0\xc1]477Sa\xb4\xa2\xd6\x7f\x9b\ +B\xb5\xc3\x5c?\x9f\xd9\xf6\x00$m\xdd]r\xc4\xd1\ +\xfeN\xec\xb8\xc5\xa3\xa8\x18\x91n'\x00,\x06\x02{\ +:G\xfd\xd7\xc4\x0f\x1b\x81\xd8\xc1q\x10\x0a\x1d\xba\xfd\ +\xb7Z\xa5-8w\xe6\x04\x0e\x1f:`\xf2r\xb8W\ +U\xf4\x8e\x22\x11\x9c\xc4bxy\xf9`@X8\xfc\ +\xfc\x03 \x129\xfd\xcf\xc9\ +\xc6\xf1\xa3\xdfC \xb0G\xc2\xb4\x19\xddJ\x88\x18\x86\ +A`P0\x06\xc5\x0e\xc1\xa3\xf4\xfb\x1d~\x96\xe2\xa2\ +B\xbf\x8b\xefm\x87\x90\ +\x01a\xf0\xf7\x0f\xe8\xf0\x90\xa0\xb2\xb2R\xd4\xd7\xd7B\ +\xa3Q\xf7i|H\xcf\xd4U\x16\xd3 \xb2\x94\x0f\xfa\ +\xe6[;>I\xbd\x1c\xf6\x9egH\xbc\x07\x151\xd2\ +]l\x0e\x07b\xb1\x04\x8e\x8e\x22\x84\x85G\xc0`0\ +\xc0h\xb4\xfc\x05\xa7\x0c\x18455\xa2\xae\xb6\xd6\xa4\ +\x04\xc0\xc7\xd7\x0f\x01\x81\xdd\xdbz\xb6\xb1\xe1\x05n\xdf\ +L5y\xb9\xdd\xd0\xf8\xe1X\xf2\xc6*\x84\x85G\xf4\ +K\xe5\xc6\xe5\xf2\x10\x16\x1e\x89e+\xd6@\xd6\xda\x8a\ +\xb4\x9b\xd7:|M}]\x0d\xae_\xbd\x84\x811\xb1\ +p\xed\xe2.\x81\x0c\xc3\xc0\xcf/\x00\xde>\xbe\x1d\xae\ +\x90\xa8\xaf\xabA}]-\x94\x0a\x05\xec\xed\x85\xf4\x83\ +\xb5\x94\xd6\x7fQz\xdd\x9bo\xed\xf8\x84\x12\x80\xde\xc8\ +\xac\x8a\xf2?\xf6\x0c\x89\xff\x88\x8a\x19\xe9\xb1D\xe0\xe5\ +R2k\x22\x97\xb7\xa1\xcd\x84S\xf6\xc4\x12\x17\xf8\xfa\ +\xf9\xc3\xcd\xbd\xeb9\xb5Z\xadF^^..\x9c?\ +c\xd2\xf5\x01\x81\xc1\x983o\x01\x06\xc6\x0c\xea\xd1c\ +\x86\xbb\xd2\x13\x10\x15\x15\x83\xb9\xf3\x17\xa1\xba\xaa\xd2\xa4\ +\xfd\x0a\xae_\xbb\x8c\xc9\x09\xd31z\xec\x84.\x95\x19\ +\x86a\xe0\xec\xe2b\xf2^\xff\x15\x15ehm\x95\xc2\ +\x85\x96\x03ZT\x1deI\x9f\xd7\xa2\x06\x97\xde|k\ +\xc7\xc7\xb5\x85\xe9\xb5T\xcc\x08\xf9e\xd5\xd5U\xa8\xaf\ +\xeb\xf8g\xe2\xe9\xe5\xd5\xed.\xf8\xb66\x19\x1e\xa5\xdf\ +3\xe9\xdc{\x00\x986c6\xc6\x8e\x9bh\x16\x07-\ +98:\xe2\xb5\xf8\xe1\x98\x9c0\xcd\xa4\xeb\xeb\xebj\ +p\xf3\xc65(\x95\x8a\xae\xb7\xb88\x5cD\xc7\x0c6\ +\xe9\xda\xdc\x9clH\xa5-V\xd13e\x13\xad\xff\xc2\ +\xf4\xda7\xdf\xdaA\x09@o*)\xca\xff\x1f*j\ +\x84\xbc\x9a\xc1`@mu\x15JK\x8a;\xbc\xd6I\ +$\x86\x7f@\xd7\x8f\xfc\xd5\xeb\xf5\xa8\xad\xa9Fvf\ +\x86I\xd7\x8f\x1e3\x01S\xa7\xcf\x86\x93\x93\xd8l\xd6\ +\xb7{xxb\xec\xf8I\x18=f\x82I\xd7\xe7\xe5\ +>CYi\xd7wve\xb1X\xed\xfb\x0aH\x5c:\ +\xbc\xf6YV\x06\xa4--\xd0\xeb\xf5T\xb0\xa9n\xa2\ +\x04\x00\x00\xd6n\xda\xf1y\xde\x833ET\xdc\x08\xf9\ +gJ\x85\x02\xd2V)\xd4*U\x87\xd7\xbayx\xc0\ +\xb9\x1b\xcb\xcc\xb4Z-J\x8a\x8b\x90\x99\xf1\xc4\xa4\xeb\ +'%L\x83\x9f\x9f?\xd8f4\xa9\x8d\xcd\xe1 ,\ +,\x12\xa3\xc7N0\xa9R\xae\xaf\xafCnN6t\ +:]\x97\x13\x00\x89\xc4\x05\x83b\x87\x98t}cC\ +\x034j5\x15l3\x97\xf7\xe0L\xd1\xdaM;>\ +\xa7\x04\xa0\x0f46\xb7\xfc'\x159B\xfeY\x9b\xbc\ +\x0d\xb2\xd6\x8e7\xe1\x11\x08\x84\x08\x08\x0c\xea\xf2\x8cv\ +\x00P*\x15(-)2\xe9\xd0\x9d\x91\xa3\xc6a`\ +\xf4 \x08{\xe0\x98\xe1\x9e&rrBtL,\xa2\ +cb;\xbcV*\x95\xa2\xaa\xb2\x1c2Yk\x97\xdf\ +\x8f\xc7\xe7!zP\xacI\xd7\xd6\xd6VC\xa5VQ\ +\xc1\xa6:\x89\x12\x80\x9f$n\xda\xf9mVZJ\x06\ +\x15;B\xfe\x9e\xbc\xad\x0d---\x1dV\xca\x8e\x22\ +\x11\xbc\xbc|\xc0\xe1t}\xed\xbfB.7\xb9\xf5\x1f\ +;$\xee\xe5\xfb\x99\xdf\xbcc\x16\x8b\x05?\xff\x00\x84\ +\x85Gtx\xbc\xb0Z\xa5BEE9\xa4-]?\ +\xb2\x97\xcb\xe1\xc2\xdf?\xd0\xa4k\xab\xab+\xa9\x07\xc0\ +\xcce\xa5\xa5d$n\xda\xf9-%\x00}\xa8U\xa6\ +\xf8\x17\xda&\x9b\x90\x7fn\x95K\xa5-\x1dWB\x5c\ +.$\x12\xe7.W\xc8\x06\x83\x01\x8d\x8d\x0d&\xed\xa8\ +'\x10\x08\x11\x16\x1e\x09'\xb1\xc4l\xe3\xe6\xec\xe2\x82\ +\xa0\xe0\x10xy\xfbt\x10_9^\xd4\xd5\xa1\xa1\xe1\ +\x05\x0c\x06C\x97\xde\x8b\xcd\xe1\xc0\xd9\xd9\xc5\xa4k+\ +\xca\xca\xa0\xd5j\xa9`\x9b)\x86i\xaf\x8b,\xf5\xf3\ +[l\x02\xb0n\xcb\xae\x0bOS\x8f\xdd\xa4\x22H\xc8\ +\xff\xa7Q\xab!\x97\xc9:\xbc\x8e\xc3\xe1\xc0\xc1\xd1\xb1\ +\xcb\xbb\xcc\x19\x8dF\xd4\xd7\xd5B\xd6\xdaqWx\xe4\ +\xc0hxy\xfb\xc2\xae\x1b\x07\x0d\xf56>\xdf\x0e\xde\ +>~pq\xe9\xb8bn\x93\xcb\xd0\xd4\xd8\xd8\xf5\x04\ +\x80\xc5\x82\xa3\xa3\xc8\xa4k_\xbc\xa8\x87Z\xad\xa2\x95\ +\x00f\xeai\xea\xb1\x9b\xeb\xb6\xec\xba@\x09@\x7f\xf4\ +\x02\xc8\x15\x1bY\xd4\x0b@\xc8\xcf\xadr\xb5Z\x0d\x8d\ +\xa6\xe3.c\x89\xb3\x0b\x04\x02\xfb.\xcf\xc67\x18\x0c\ +\xa8\xa9\xae2\xe9\xda\x88\xc8\x81\x16q\xb4\xad\x8f\x8f\x1f\ +\x5cM\xd8\x13\xa1M&CSSC\xd7g\xe7\xbf<\ +\x98*\x22*\xba\xc3K\xf5z\x1d\x94Je\x97\x93\x0d\ +\xd2\x8b\x95'\xd3^\x07Y\xf4=X\xf2\x87\xdf\xf0\xf6\ +\xee\xe7\xe9W\x0f\x1f\xa5\xa2H\xc8\xcb\x04@\xa3\x86\xd6\ +\x84\x19\xea\x0e\x0e\x8e\xdd\x9a\x00h4\x1aPZZl\ +\xd2\x04@ww\x0f\x93[\xbc\xfdI\xe2\xec\x0c\x91\xa3\ +\xa8\xc3y\x00\xf5uux\xf1\xa2\x1e\x06C\xd7\x12\x80\ +\xf6\x83\x81xpuu\xef\xf0Z\x9dNG=\x00f\ +*\xfd\xea\xe1\xa3\x1b\xde\xdem\xd1\xc7\x8aZ\xfc)\x13\ ++\xd6\xbf\xb3\x94\xc3\xe8)=&6\xcfh4\xc2\xa0\ +\xd7\xc3`B\xcbT \x10tk'\xbe\xce\xf4\x00\x88\ +DN\xdd:k\xa0\xaf\x08\x85\x0epp\xecx\x95\x82\ +R)\x87R\xa1\xe8\xd6\xfa|\x0e\x87\x0dG\x91iI\ +\x91N\xa7\xa3\x04\xc0\xccp\x18\xbda\xc5\xfaw\x96Z\ +\xfa}X\xc51Sw.\x1d\xa1\xed\x81\x09%\x00F\ +\x03\xf4z=\xf4&\xb4L9\x5cn\xb7\xb6@\xd6\xeb\ +\xf5\x90\xb7\xb5\x99t\xad\x9d\x9d\xc0\x22\x0e\xb4a\xb3\xd9\ +\x10\x89\x9c\xc07a\xae\x82N\xa7\xeb\xf2^\x00@\xfb\ +\xca\x03\x9e\x09\x09\x98V\xab\x85^\xa7\xa7\x04\x80\xea\x1c\ +J\x00~\xc9\xea\x8d\xdb\xff\xa5,+\xb5\x9c\x8a%\xb1\ +\xed\x04\x000\x18\xf4&\xb5L\xd9lv\xb7\x8e\x99\xd5\ +j\xb5&u\x81\x8b%.\xe0\xf1y\x16\x13C{\xa1\ +\x10<^\xc7\x9fW\xaf\xd7C\xa7\xedz\x02\xc00,\ +\x93\x93\x22\x9dNK\x09\x80\x19)\xcbJ-_\xbdq\ +\xfb\xbfX\xc3\xbdX\xcdA\xd3UU\x95\xffN\xcb\x02\ +\x89\x8d\xa7\x000\x18L\xab(X\x0c\xd3\xad\xedx\x0d\ +&v\x7f\x0b\x85B\xb0X,\xb3\xd9\xfa\xb7#\x5c.\ +\x17\x5cn\xc7{#\x18\x0c\xfa.\xcf\x01hO\x00\x18\ +0&\xcc`\xd6h44\x01\xd0\x8c0L{]c\ +-\xf7c5\x09@\xe2\xe6\x9d\x07\x9f\xa4\x1e\xbbAE\ +\x94\x90\xbeH5:\xf5\xd8\xb4\x9c\x07|'>+\xb5\ +\xc9m\xcf\x93\xd4c7\x127\xef\x8f\ +\xf2\xf2RTU\x96c\xfe\x82\xa5\xf0\xf1\xf1\x05\x9b\xc3\ +\xa1\xe0\xfcR\xcb\x981\x18\xa52\xc5\x0a\xab\xbfOk\ +\xbf\xc1\xd3\xe7/\xb7\xc4G\xf9\xf2}Bb\xc6R\xb1\ +\xb6>\x1a\x8d\x1ay\xcfs\xf0\xcd\xbe\xafp\x22\xe5\x18\ +\x9a\x9a\x1a((\x84\xbcBSc\x03\xca\xcaJ\xa1V\ +\xa9\xe0\xee\xe9\x05\xb1XB\xf3\x02~\xc1\xfd\xcb\xc9\xff\ +7q\xf3\xae\x14J\x00\xac\xc0\x8fg.^\x1d7$\ +h\xa6G@\x94\x0f\x15m\xebj\xf9gg>\xc5\xc1\ +\x03\x7f\xc5\xe5\x0b\xe7hI\x1f!\x1d\x90\xcb\xdb\x90\xf7\ +<\x17\x06\xa3\x01^^\xde\x90H\x9c)\x09\xf8\x07\x99\ +7\x8f?X\xbe~\xdb2[\xb8W\x9b\xf9\xe6\xa52\ +\xf9*6c\xa0\x9d\x01\xac\x84N\xa7C~^.R\ +\x8e%\xe3\xea\xa5\x0bT\xf9\x13b\x22\xa5R\x8e\xef\x0f\ +\xfc\x15\xa7N\x1cGii\x09\xf4\xdd8\xd6\xd8\xeaZ\ +\xc4\x8c\xc1(\x95\xc9W\xd9\xca\xfd\xda\xcc \xd0\x86\xad\ +\xbb\xf3\xbf\xe5q\xffsx\xc2\xf2\xffM\xc5\xdc\xb2\x19\ +\x0c\x06\x94\x96\x14\xe3\xc4\x0fGq\xee\xcc\xc9nU\xfe\ +b\x89\x0bF\x8f\x19\x07O/o\x08\x04\xf6\x16qn\ +=\xb1]Z\x9d\x16\x8a69*+\xcb\x91\xfe\xe0\x1e\ +Z\x9a\x1b\xbb\xfc\xb7\x92\x0f~\x0b\xa1\xd0\x01\x0b\x17/\ +\x83\xbb\x87'\xf5\x04\x00\xb8s\xe9\xf0\x7fn\xd8\xba;\ +\xdfV\xee\xd7\xe6&\xc6\x1d\xd9\xff\xc5\xcd\xd8\xf1\x8bi\ +>\x80\x05\xab\xaf\xaf\xc3\xe9\x13)\xf8v\xff\x1e\xd4\xd7\ +\xd5t\xea\xb5\x02\x81\x10\xbe\xfe\xfe\x181r\x0c\x86\xbe\ +6\x1c\xbe~\xfept\x14\x81\xcf\xe7\x83\xcd\xe1\xd0\xec\ +hb\xd6\x8c\x06\x03tz\x1d\xd4*\x15Z[\xa5(\ +-)\xc1\xbd;\xb7\xf0\xe8\xe1}\x94\x95\x16w\xfa\xef\ +\xf9\xf8\xfac\xe3\xe6w0k\xf6|\x08\x1d\x1cl:\ +\xb6\x197\x8e\xddZ\xba\xf6\xedq\xb6t\xcf6\xd7\xdc\ +\x91\xb6)\x16\xe8\xdaj\xcb8\x0e\x9e\xf6\xf48\xb1<\ +J\xa5\x02\x99O\x1f\xe3\xf4\xa9\x94NU\xfe\x02\x81\x10\ +\x91\x03\xa31n\xfc$\x0c\x1b1\x1a\x01\x01\x81\x10:\ +8\x82\xc7\xe3\xb5\x9f\xcdN\x15?\xb1\xa4D\xc0h\x84\ +\xc1`\xc0\x80\xb0\x08\x8c\x1c=\x16\x85\x05yxp\xef\ +6.\x9e?\x8b\xe2\x22\xd3\x1b\xb0U\x95\xe58~\xe4\ +{x\xfb\xf8b\xc4\xc816\xdb\x03\xa6k\xabUH\ +\xadx\xc3\x9f_\xc2\xb6\xb5\x1b>}\xfe\xb2\x22~P\ +\x98,`\xc0\xa0\x194!\xc0\xb2\x18\x0c\x06\x94\x97\x95\ +\xe2\xfb\x83\xfbq\xef\xf6M\x93_\xe7\xee\xe1\x85\x84i\ +3\xb0&1\x09\xe3'N\x81\xbf\x7f\x00\x84\x0e\x8e\xe0\ +\xbcl\xf1S\xe5O,\x0d\xc30`\xb1X\xe0r\xb9\ +\x10\x0a\x85\xf0\xf4\xf4FxD\x14\x22\x22\xa3\xc00\x0c\ +\xea\xea\xea\xa0R)M\xfa[uu5\xe0\xf1\xf9\x08\ +\x8f\x88\x82H\xe4ds\xbf\x07\x16\x03\xdc\xbb~r\xe7\ +\xfa-\xbbR)\x01\xb0\x01'\xcf^|0r\x90\x7f\ +\xacWPt$=J,\x87\xac\xb5\x15\xe7\xce\x9c\xc4\ +\xb7\xfb\xbe2\xf95\x03\xc2#\xb1p\xd1\x1bX\xb1*\ +\x11\x03\xc2\x22`o/\xa4\xb1Nb}\x0fr6\x1b\ +\x02\x81=\xbc\xbc}\x10: \x1c\x5c.\x17\x0d/^\ +@\xda\xd2l\xd2\xeb\xe5r9\xbc\xbc|\x10\x14\x1cb\ +s\xbb\x05>\xba~\xe4\xc7\xd5I\xef\xee\xb4\xc9rc\ +\xab?\x98\x94S\xe7\x8f$\x8c\x8c\x5c\xe5\xea\x13\xe6L\ +\x8f\x0f\xf3\xa7\xd7\xe9PP\x90\x87\xfd{\xbfD\x9d\x89\ +]\xff\x11Q\xd1xc\xf9\x1a\xcc\x99\xbf\x10\x1e\x1e\x9e\ +`\xb3\xd9\x14Hb\xd5\xbd\x02l6\x07b\x893\x02\ +\x03\x83\xc1\xe3\xf3Q[S\x83f\x13&\x0aJ[\x9a\ +\xc1\xe6r\x11\x13\x13\x0b\x89\xc4v\x1e\x89y\x0f\xce\x14\ +-^\xbdi\xb4\xad\x96\x19\x9bn\x0a546ob\ +14\x10`\x09\x14J\x05\x1e?z\x80\x82\xfc<\x93\ +\xae\xf7\xf1\xf5\xc7\x92\xa5+1m\xfa,\xb8\xb8\xb8R\ +7?\xb1\x9d\x87:\x8b\x05/o\x1f\xcc\x9c=\x0f\xf3\ +\x17.\x81\x8f\xaf\xbfi\x95a\xee3\xc4\x00\ +`\xd6\x9c\xd71o\xc1b\xf8\x07\x04\xd2x?\xb1\xe9\ +$@$r\x82\xbd\xc0\x1e\xe5e\xa5&\x9d\x91\xc1\xe1\ +r\x10\x1c<\x00\x81A!V\x9d8?M=ze\ +\xc5\x86w\xd6\xd8z\x19\xa1\xa7#\x00i\x9bbZY\ +V*\x1d\x1dg\xa6T*%n\xa7\xdd0i\xc3\x1f\ +\x1f_\x7f\x8c\x197\x01\x81A\xc14\xe6Ol\x1e\x87\ +\xc3\xc1\xc0\x98A\x982u\x86IC\x01U\x95\x95(\ +..\x84T\xdab\xb51)\xcbJ\xad\x94\xb6)\xa6\ +Q\xe9\xa0\x04\x00\x00\xb0q\xdb\xfb\x86\xca\xca\x8a\xb7h\ +>\x80y\xaa\xab\xadAA\xfes\x93\xae\x1d5f<\ +\xa2cbao/\xa4\xc0\x11\x02@(t\xc0\x88Q\ +c0 ,\xa2\xc3k[\x9a\x1bQQ^\x86\xe6\xa6\ +&\xeb\xac\xf0\x18#*++\xde\xda\xb8\xed}\x03\x95\ +\x0cJ\x00~\xb6n\xcb\xae\xb3\xf7.%\xff\x8e\x86\x8b\ +\xcd\x8b\xd1hDaA\x1e\x9a\x9b:\x9e\xc9\xec\xee\xe1\ +\x85!C^\x83\xb7\x8f\x1f\x05\x8e\x90\x97\x18\x86\x81\x97\ +\xb7\x0f\x86\x0d\x1f\x05\xb1\xc4\xc5\xa4\x84\xbb\xa9\xb1\x01z\ +\xbd\xde\xca\xe2\x00\xdc\xbb\x94\xfc\xbbu[v\x9d\xa5R\ +A\x09\xc0?Y\xbdq\xfb\xbf=\xbav\xe44E\xc2\ +|\xe8\xf5z\x14\x16\xe4C*\x95vxm\xec\xe08\ +\x84ED\x82\xcf\xe7S\xe0\x08\xf9\x1b\xf6\xf6B\x84G\ +D\xc1\xd3\xcb\xab\xc3kkj\xaa\xd0\xd8\xd8\x00\x9d\x95\ +\x1d\x12\xf4\xe8\xda\x91\xd3\xab7n\xff7*\x0d\x94\x00\ +\xfc\xa2\xe5\xeb\xb6\xcd\xcdNK\xc9\xa2H\x98\x07\xb9\xbc\ +\x0dRi\x0b\xd4*U\x87\xd7\xfa\xf8\xf8\xc1\xd3\xcb\x9b\ +\x82F\xc8+z\x01\xfc\x02\x02\xe0\xed\xed\xdb\xe1\xb5\x05\ +y\xb9hii6i\xc2\xad\xa5\xc8NK\xc9Z\xbe\ +n\xdb\x5c*\x09\x94\x00t\xa8\xb9U\xbeR\xd1X*\ +\xa3H\xf4\xbf\xb66\x19\x14r\xd3&\xffy\xfb\xf8\xc2\ +\xde\x9e\x8ex \xe4U\x09\x80\xb3\xb3\x0b\xdc\xdc\xdcM\ +\xba^&k\xb5\x9a\xfd\x00\x14\x8d\xa5\xb2\xe6V\xf9J\ +*\x05\x94\x00\x98d\xc3\xdb\xefef]\xbb\ +i\xe7^\xfa\xf6)\x01\xe8\xb4\xd5I\xdbw<\xbav\ +\xe4$E\xa2\xff\xe8t:\x93f#\xb3\xd8lp\xb9\ +\x5c0\xb4\xf1\x0f!\xbfH \x10\x98\x9c\x00\x18\xf4\x96\ +\xbdR\xee\xd1\xb5#'W'm\xdfA\xdf:%\x00\ +]\xb6|\xdd\xb6\xf9\x99\xb7\x8e\xa7S$\xfa\x87\xc1`\ +\x80\xc1\xd0\xf1\x83\x88\xc5bQ\xe5O\xc8\xaf\xb6\x88\xdb\ +\x0f\x0b2\x85^\xaf7\xe9wg\xae2o\x1dO_\ +\xben\xdb|\xfa\xd6)\x01\xe8\xb6\x96V\xf9\xbc\xb2\xac\ +\xd4r\x8aD\xff%\x01\x84\x10b\x8a\xb2\xac\xd4\xf2\x96\ +V\xf9<\x8a\x04%\x00=\x22i\xeb\xee\x9a\xca\xca\x8a\ +\xf5:y\x9d\x92\xa2A\x08!\xe6I'\xafSVV\ +V\xacO\xda\xba\xbb\x86\xa2A\x09@\x8fY\xb7e\xd7\ +\xe5\xf4\xb4\xcb\xdbi\xbb`\xf3\xc50\x0c\x9d\xfcG\xc8\ +\xaf\xfeH\xac\xb82c\x8cHO\xbb\xbc}\xdd\x96]\ +\x97\xe9\x8b6\x0d\xad\x99\xea\x84\xb5\x9bv~\xf5\xedW\ +,\xbf\x91S\x97\xff\xbb\x81\xf2\x00\xb3\xa2V\xab\xd0\xd2\ +\xdc\x84\x17\xf5u\x94\x04\x10\xf2\xaa\xd6\xb1^\x07i\x8b\ +u\x1e\xf2\xc3b\x80\xbb\x97\x92\xff{\xed\xa6\x9d_\xd1\ +7M\x09@\xafY\xb3q\xfbo\x0e~\xcdx\xc6O\ +Y\xb6\xceHI\x80\xd9\xa8\xaa\xac\xc4\xd5\xcb\x17\x90\x9f\ +\x97K\x09\x00!\xaf`0\x18P\x5cThu\xf7\xc5\ +0\xc0\x83+\xc9\x7f]\xb3q\xfbo\xe8[\xa6\x04\xa0\ +\xd7\xad\xdc\xf0\xee\xfaC\x7fe\xb9\xc6M\x5cJ\x13M\ +\xccDKs#\xce\x9e\xfe\x91\x02A\x88\x8dyt\xed\ +\xc8\xc9\x95\x1b\xde]O\x91\xe8<\x9a\x03\xd0E\xcb\xd7\ +m\x9b\xff\xf4\xc6\xd1T\x8a\x04!\x84\xf4\x8f\xa77\x8e\ +\xa6\xd2r?J\x00\xfa\xc5\x1bk\xb7N\xcc\xbcu\xfc\ +!E\x82\x10bM\x18\x861\xfb\x09\x83\x99\xb7\x8e?\ +|c\xed\xd6\x89\xf4mQ\x02\xd0oZZ\xe5s\xb3\ +\xd3Rr(\x12\xbd\x83\xc7\xe3\xd1\xf1\xbe\x84\xf41;\ +;;\xb3>W#;-%\xa7\xa5UN\xa7\xfbQ\ +\x02\xd0\xbf\x92\xb6\xee\xaein\x95/+\xcbJ-\xa3\ +h\xf4<'\xb1\x18Nb1\x04\x02!\x05\x83\x90>\ +\x22\x91\xb8@ 0\xcf\x935\xcb\xb2R\xcb\x9a[\xe5\ +\xcbh\xad?%\x00fa\xc3\xdb\xefeVT\x96\xaf\ +\xae-J\xaf\xa3h\xf4,\x17\x177\x84\x84\x86\xc1Q\ +$\xa2`\x10\xd2\x07\x06\xc6\xc4\xc2?0\x10\xf6\xf6\xe6\ +\x97t\xd7\x16\xa5\xd7UT\x96\xaf\xa6\xd3\xfdz\x06\x1d\ +\x9d\xd6CN\x9d\xbb\x5c6vD\x5c\xae\xa3=w\xba\ +@\xe4&\xa0\x88\xf4\x0c\x0e\x87\x03GGG\xd4\xd4T\ +#?/\x97\x02BH/\x12\x08\x84\x986}6\xc6\ +O\x9a\x02\x17\x17W\xb3\xfal\xcdU9M\xf99Y\ +k\xd7oy\xef\x0a}S\x94\x00\x98a\x12p\xa9`\ +t|L\x89\x8b\xc4i:\xd7^L\x03\xd7=\xc4Q\ +\xe4\x04g\x89\x0b\xe4\xf26\x14\x17\x15P@\x08\xe9%\ +\xb3\xe7-\xc0\xfc\x05K\x10\x122\x00l\xb6\xf9T\x0f\ +\x8a\xc6RY\xf6\x93{I\xeb\xb6\xec:A\xdf\x12%\ +\x00f\xeb\xe4\xd9K9\xc3\x87DVxy\xbaOg\ +\xf1\x1c\xb8\x14\x91\x1e(\xa4l6\x5c]\xdd\x10\x18\x14\ +\x02'\xb1\x18---0\x02P\xa9\xe8h\x06B\xba\ +K,qAXx$\x96,[\x85\x85\x8b\x97#,\ +<\x1c<\x1e\xcfl>\x9f\xae\xadV\xf1\xe8^\xea\xa6\ +\xc4\xcd\xbb\x0e\xd3\xb7\xd5\xb3h\xcb\xb4^\xb2\xef\xcbO\ +\xd6\x0e\x1b=\xe5O\x1c\x07O\x1a\x0e\xe8\xa9\x07\x81N\ +\x87\x96\x96fT\x94\x97\xa1\xb2\xa2\x0c--\xcd\xd0\xe9\ +t\x14\x18B\xba\x88\xc7\xe3A\x22q\x86\x7f@\x10|\ +}\xfd\xe1(\x12\x99U\xcb_\xd7V\xab|p\xfb\xca\ +\x96\xc4M;\xf7\xd3\xb7E\x09\x80E\xd9\xff\xe5'\xeb\ +\xe3GO\xf9\x8c\x92\x80\x9e\xa5\xd7\xe9\xa07\xe8a\xa0\ +\x03\x19\x08\xe9^\x05\xc0\xb4\xaf\xf9g\xb39fU\xf1\ +\xffT\xf9\xa7\xdf\xbe\xb2m\xed\xa6\x9d{\xe9\x9b\xa2\x04\ +\xc0R\x93\x80\xc4\xf8\xd1S>\xe78x\xdaS4\x08\ +!\xc4\xa4\xca_\x91~\xfb\xca\xd6\xb5\x9bv\xee\xa3h\ +\xf4\x1e\x9a\x03\xd0\xcbN\x9e\xbd\xf4\xe4\xb5\x98\x01\x15.\ +\x12\xd1\x14\x9a\x18H\x08!\xbfN\xd1X*{t/\ +us\xe2\xe6\x9d\xdfR4(\x01\xb0\x86$ s\xf8\ +\x90\x88b\x07\x01w2-\x11$\x84\x90Wk\xae\xca\ +i\xce~roc\xe2\xe6]\x87(\x1a\x94\x00XS\ +\x12\xf0l\xd4k19\x8e\x02\xceT\x81\xc8\x9d\x86\x03\ +\x08!\xe4o+\xff\xcag\x8d9Y\x8f\xdf\x5c\xb7e\ +\xd7\x0f\x14\x0dJ\x00\xac\xce\xa9s\x97\xf2G\xbe\x16\x9d\ +nT5O\x14{\x04:QD\x08!\x04(\xcbJ\ +-/,|\xbeb\xfd\x96\xf7.R4\xfa\x0eM\x02\ +\xec\x07_\x7f\xf1\xd1\x10\x89\x93\xf0\xfb\xe8\xd1\x0b#)\ +\x1a\x84\x10[\x96};%\xb7Y*_\xb1\xe1\xed\xf7\ +\x9eP4(\x01\xb0\x09{>\xff\xd0O\x22\x12\x9e\x88\ +\x19\xbb(\x8e\xa2A\x08\xb1EY\xb7\x8e?nn\x95\ +\xcfO\xda\xba\xbb\x82\xa2A\x09\x80M\xf9\xea\xb3\x0fx\ +bG\xe1\x95\xd8\xf1\x8b\xc7R4\x08!\xb6$\xe3\xc6\ +\xb1[-2\xf9\x94\x8d\xdb\xde\xd7P4(\x01\xb0Y\ +\xc9\xfb>;\x1d7q\xe9l#\xedkC\x08\xb1\xf6\ +J\x87\x01\x1e_?rfY\xe2\xb69\x14\x8d\xfeE\ +\x93\x00\xcd@\xca\xc9\xf3\xc9#b\xfc\x82}\x83\xa3c\ +)\x07 \x84X+\x16\x03\xa4_=|`\xc5\xbaw\ +\x96P4(\x01 /\xfdp\xea\xc2\x89\xf8\x81>B\ +\xbf\x90\x98\xd1\x94\x04\x10B\xac\xb1\xf2\xbfw\xf9\xd0G\ +\xab6\xbc\xbb\x85\xa2A\x09\x00\xf9\x07?\x9e\xbexy\ +h\xa4ws@@\xe0d#\x8bO\xdf\x0d!\xc4:\ +*\x1a]\xab\xe6\xce\x95\xe3;\xd6l\xdc\xf1_\x14\x0d\ +J\x00\xc8/8q\xe6\xe2\xfd\xc1\x11\x01Ox\x8cf\ +\xb2\x83\xb3\x8f\x03E\x84\x10b\xc9j\x0b\xd3\xeb\x9e\xa6\ +\xdf^\x91\xb8y\xe7A\x8a\x86y\xa1I\x80f\xea\xeb\ +\xcf?\x0c\x11\x8b\x84\xc7c\xc6.\x1aL\xd1 \x84X\ +\xa2\xac[\xc7\x9f\xb6\xb4\xca\x17m\xd8\xba\xbb\x88\xa2A\ +\x09\x00\xe9\xa4\xe4}\x9f\x9f\x8d\x9b\xb8d&\xad\x10 \ +\x84XL\xc5\xc2\x00\x8f\xaf\x1f=\xb7,q\xeb,\x8a\ +\x86\xf9\xa2!\x003\x97r\xf2\xfc\xa1\xe1\xd1\xbe\x1e~\ +!1\xf1\x94\x03\x10B\xcc\x1d\x8b\x01\x1e\x5cI\xfer\ +\xc5\xfawVP4(\x01 \xdd\xf4\xe3\xe9\x0bg\xe3\ +\x22\xbc\x9b\x02\x02\x03&\x19Yv\x1c\x8a\x08!\xc4,\ ++\x7f\x9dT}\xfbr\xca\x8e5\x1b\xb7\xff\x07E\xc3\ +\xfc\xd1\x10\x80\x05\xd9\xfb\xc5G\xa3\xdc\x5c\x9d\xbf\x09\x1f\ +6{\x00E\x83\x10bN\xf2\x1e\x9c)x\xd1\xd0\xf4\ +\xe6\xfa\xb7\xdf\xbbC\xd1\xa0\x04\x80\xf4\x92\xe4}\x9f_\ +\x8c\x9b\xb8d*\xcd\x0b \x84\xf4{%\xd2>\xde\x7f\ +iY\xe2\xd6i\x14\x0d\xcbBC\x00\x16(\xe5\xe4\xf9\ +\x83\xc3\x06\xfa\x8a\xfdBbFP\x0e@\x08\xe9/,\ +\x06\xb8\x7f9\xf9\x0f+\xd7\xbf\xb3\x92\xa2A\x09\x00\xe9\ +#?\x9e\xbepqH\xb8W\xbe\x83\x1d{\x82@\xe4\ +nO\x11!\x84\xf4\xa5\xe6\xcag\x8d\x8f\xef\x5cZ\xff\ +\xe6[;>\xa6hX&\x1a\x02\xb0p{>\xfb\xd0\ +\xd9Id\x7f*v\xdc\xe2\xd1\x14\x0dBH_\xc8\xb8\ +y\xec\xb6\xb4U17i\xdb\xee&\x8a\x06%\x00\xa4\ +\x9f}\xb7\xe7\x0f_\x0cOX\xb6\xc5@c\x02\x84\x90\ +^\xf2\xb2\xcb\xffO\xab\x92\xde}\x9b\xa2a\xf9h\x08\ +\xc0J\xfcx\xfa\xc2\xb9!\xe1\x9e\xcf\xb8\xd0\x8c\xa7-\ +\x84\x09!=\xad\xb60\xbd.\xe3\xc1\xb5\xb5\xd4\xe5O\ +=\x00\xc4\x8c%\xef\xfb\xfcB\xdc\xc4%\xd3h\x95\x00\ +!\xa4\xdb\x95D\xfb,\xff\x8b\xcb\x12\xb7N\xa7hP\ +\x0f\x001s)'\xcf\x1f\x8c\x8f\xf4\xd6\x06\x86\x0e\x9c\ +h\x00\x8b\x92\xf5\xcd_~\xff~\xf8\xc0!\xefK|\xa2\ +$\x14\x0dB\xfaFsUNs\xde\xb3'\x1f\xbc\xf9\ +\xd6\x8e\x0f(\x1a\x84\x12\x00\xd2\xaf\x0e|\xf5\xe9\xff\xc4\ +\x8d\x9c\xf4.\xc7\xc1S@\xd1 \xa4w\xe8\xdaj\x95\ +\x8f\xef^\xfb\xc3\xea\x8d\xdb\xff\x8d\xa2A(\x01 \xe6\ +\x95\x08\xec\xf9\xf4\xe3\x11\x13f\xbdm\xe08\xf1)\x1a\ +\x84\xf4\x0c\x96N\xaa\xbe\x97z\xf6\x8b\xd5I\xdbwQ\ +4\x08%\x00\xc4\xec\x13\x81\xa1#'of\x0b=\xa8\ +G\x80\x90.\xd2\xcb\xeb\x94\x8f\xee^\xfd3U\xfc\x84\ +\x12\x00by\x89\xc0W\x9f\xfeOt\xdc\xa8\xb7\xed]\ +\x02\x1d)\x1a\x84\x98F\xd1X*\xcb~|\xe7\x0b\xea\ +\xea'\x94\x00\x10\x8b\xf7\xcd_~\xff\xaf\x81!a\xef\ +x\x86\xc4{P4\x08y\xb5\xda\xa2\xf4\xba\xd2\xa2\xfc\ +?\xbe\xf9\xd6\x8e\xdfQ4\x08%\x00\xc4\xaa\xec\xff\xf2\ +\x93DG\xa1`g\xcc\x98\x85Q\xb4\x9f\x10!\xed\x0f\ +\xe1\xac\xb4\x94\x1c\x99\x5c\xf9\x09-\xe7#\x94\x00\x10\xab\ +\xb7\xf7O\x1fOv\xb4\xb7\xfb\xed\x90\x09\x8b\xc7\xd0\xce\ +\x82\xc4\x16\xb1\x18\xe0I\xea\xb14\x99B\xf5[\xda\xc0\ +\x87P\x02@l\xce\x9e\xcf?t\x17\x0a\xf8\x7f\x8c\x9f\ +\xbct\xa9\xc1\xc8Py$6P\xf1\x1b\x8d\xe9W\x8f\ +\x1c\x91+\xd5\xef$m\xdd]O\x11!\x94\x00\x10\x9b\ +\xf7\xedW\xbf\xff_\x9e\x9e>I\x011\x13|)\x1a\ +\xc4\xda\x94e\xa5V\xd6\xd6V\xedY\xb3q\xc7\x7fR\ +4\x08%\x00\x84\xbc\xc2_\xff\xf4q\x82\xd0\x9e\xff\xaf\ +q\x13\x96L\xa4\xe1\x01b\xd9\xad}\xe0q\xea\xd1\xeb\ +r\x85\xfaw\xeb\xb6\xec\xbaL\x11!\x94\x00\x10b\xa2\ +\x03{>\xfdh@D\xecZ\x89\xef@\x17\x8a\x06\xb1\ +\x14\xcd\x95\xcf\x1a\x0b\x9eg\xec_\x9d\xb4\xfd=\x8a\x06\ +\xa1\x04\x80\x90n\xd8\xfb\xa7\x8f\xc6\x0b\x05v\xef\x0f\x9d\ +\xb8x\x86\xc1H\xc5\x96\x98ck\xdf\x88G\xd7\x8f\x9d\ +\x97+U\x1f\xac\xdf\xf2\xde\x0d\x8a\x08\xa1\x04\x80\x90\x1e\ +\xf6\xcd_~\xbfMho\x97\x18;va,\x0d\x11\ +\x90\xfe\xad\xf4\x81\x8c[)\x19r\x85j\xdf\x9bo\xed\ +\xf8\x8c\x22B(\x01 \xa4\x0f|\xf5\xd9\x07\x1c\x81\x1d\ +\xef\x7f<<\xbc\x97\x06\x0e\x9a\xe0o\xa4d\x80\xf4\xc5\ +C\x93\x01J3S\xcb\xeb\xea\xaa\x8f(U\x9a\x7f\xdb\ +\xb8\xed}\x1dE\x85P\x02@H?\xd9\xf3\xf9\x87>\ +\x02;\xdeo\xfc\x02C_\xf7\x0a\x8d\xf7\xa0d\x80\xf4\ +t\xa5_S\x98^WQZ\xf8\xa3R\xa5\xf9\xaf\xa4\ +\xad\xbb\xab(*\x84\x12\x00B\xcc/\x19\x08\x10\xd8\xf1\ +\xde\xf7\x0b\x08}\xddk@\xbc'%\x03\xa4\xcb\x95~\ +AzmEY\xe1\x8fJ\x95\xe6\x83\xa4\xad\xbb\xcb(\ +*\x84\x12\x00B,\xc4W\x9f}(\x12\xf0\xb9\xffj\ +/\xe0\xcf\x1d4va\x14\xcd\x19 \xbf\x86\xc5\x00\x99\ +\xb7Rr\x14J\xf5)\xa5Z\xfb\xbb\x8d\xdbv\x1d\x11\ +\x91\xcb\x00\x00\x02\xcaIDAT\xb7RT\x08%\x00\ +\x84X\x81\xfd_~\xf2\x96\xc0\x8e\xff\xc6\xd0\x09\x0b\xc7\ +\xe9\x8d,*\xff\x04l\xc6`|\x94\x9arS\xa9R\ +\x1f^\xbbi\xe7_(\x22\x84\x12\x00B\xac\xdc\xd7_\ +|4\xd4\x8e\xcf\xdd rt\x9c\x129|v\x08\xf5\ +\x0e\xd8N+?\xf7\xfe\x99\xa2V\x99\xec\x8aJ\xad\xfd\ +z\xc3\xdb\xef=\xa2\xa8\x10J\x00\x08\xb1a\xfb\xfe\xfc\ +\xf1R;>oI\xd0\x80\xe8\xf1.~\x03](!\ +\xb0\x9e\x0a\xbf\xb1\xe2YcIA\xf6\x0d\x95Zs4\ +q\xf3\xae#\x14\x15B(\x01 \xe4W\x12\x82OV\ +\xda\xf1\xb9\xf3\xbc\xfd\x82\xc7z\x0f\x88\xf7\xa0\x84\xc0r\ +*\xfc\xea\x82\xf4\xba\xea\x8a\xe2[*\xb5\xf6d\xe2\xe6\ +\x9d\x07)*\x84P\x02@H\x97\xed\xfd\xd3\xc7\x93\xf9\ +<\xceB;\x1ewd\xec\xb8\x85\xb1F#\xc3PN\ +\xd0\xff\x0f0\x861\x1a3n\xa6d\xa84\xda\xbbj\ +\x8d.\x85\x8e\xd6%\x84\x12\x00Bz\xd5W\x9f}`\ +\xc7\xe5r\x96\xf1\xb9\x9c\x04>\x8f\x1b;h\xec\x82H\ +#\x18\x86\x96\x1d\xf6\xd2\xc3\x8a\x01\x18\x18\x8d\x99\xb7~\ +\xc8Uk\xb4\x19j\xad\xee\xb2V\xabK\xde\xb8\xed}\ +\x15E\x87\x10J\x00\x08\xe9w\x7f\xfd\xf3\xc7\x0bx\x1c\ +\xceD\x1e\x8f\x13\xe7\x1f20\xd2\xc57JB\xc3\x07\ +\x9d\xc3b\x80\xc6\xca\x9c\xe6\xf2\xa2g\xb9\x1a\x8d\xee\xb1\ +F\xa7\xbb\xben\xf3\xae\x1f(2\x84P\x02@\x88\x85\ +\xf5\x16|(\xe6rX\x09\x1c\x0eg\x14\x8f\xc3\x8e\x96\ +\xb8\xb8\x85\x06\x0f\x1a\x1f`\x04\x8b\xb1\xd5\xe4\x80\xc5\x00\ +\x0c\x0c\xc6\xe2\xcc\x1be\xcd\x8d/\x0a5:}\xb6N\ +\xa7\xbb\xa3\xd5\x19.o\xdc\xb6\xbb\x85J\x0d!\x94\x00\ +\x10b\xd5\xf6|\xfe\xa1+\x9b\xc5\x1a\xc9\xe1\xb0\x06s\ +\xd8\xecp\x0e\x87\x1d(\x96\xb8\xf9\x06E\x0e\xf1\x04\xd7\ +\x89o\x04`i\xc3\x0a\xed\xdd\xf5\x00\xb4RuI\xee\ +\x93\xda\x96\xe6\x17\x95:\x9d\xbeT\xa7\xd7\xe7\xe9t\x86\ +\xa7z\x83\xe1n\xd2\xd6\xdd\x0d\xf4\xed\x13B\x09\x00!\ +\xe4\xd7{\x10Dl\x16\x13\xc5b\xb1B\xd9,\xc6\x9f\ +\xc5f\xf9\xb2Y,7\x16\x8bqa\xb3XN<\xbe\ +\x9d\xc8\xdd;H\xe2(q\xb5\xe7;\xb8\xd9\x19\xf1\xf7\ +\x9b\x1c\x19\xff\xe6?\xc6_{\x180\xaf~000\ +\x18\xd5m/T\xb2\xe6\x06E}uI\xb3F\xadj\ +\xd5\x1b\x0cR\x83\xc1\xd8\xa87\x18^\x18\xf4\x86J\xbd\ +\xc1Xn0\x18\x0a\xf5\x06c\x0e\xed\xa0G\x08!\x84\ +\x10B\x08!\x84\x10B\x08!\x84\x10B\x08!\x84\x10\ +B\x08!\x84\x10B\x08!\x84\x10B\x08!\x84\x10B\ +\x08!\x84\x10B\x08!\x84\x10B\x08!\x84\x10B\x08\ +!\x84\x10B\x08!\x84\x10B\x08!\x84\x10B\x08!\ +\x84\x10B\x08!\x84\x10B\x08!\x84\x10B\x08!\x84\ +\x10B\x08!\x84\x10B\x08!\x84\x10B\xcc\xc4\xff\x03\ +\xa6\x0e\x1f\x0e'd\xb8q\x00\x00\x00\x00IEND\ +\xaeB`\x82\ +" + +qt_resource_name = b"\ +\x00\x0c\ +\x07o0\xa7\ +\x00a\ +\x00p\x00p\x00-\x00i\x00c\x00o\x00n\x00.\x00p\x00n\x00g\ +" + +qt_resource_struct = b"\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ +\x00\x00\x01\x94\xb7\xa1\xcdj\ +" + +def qInitResources(): + QtCore.qRegisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data) + +def qCleanupResources(): + QtCore.qUnregisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data) + +qInitResources() diff --git a/src/OptimaLab35/ui/settings_window.py b/src/OptimaLab35/ui/settings_window.py new file mode 100644 index 0000000..e3d7823 --- /dev/null +++ b/src/OptimaLab35/ui/settings_window.py @@ -0,0 +1,297 @@ +# -*- coding: utf-8 -*- + +################################################################################ +## Form generated from reading UI file 'settings_window.ui' +## +## Created by: Qt User Interface Compiler version 6.8.2 +## +## WARNING! All changes made in this file will be lost when recompiling UI file! +################################################################################ + +from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, + QMetaObject, QObject, QPoint, QRect, + QSize, QTime, QUrl, Qt) +from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, + QFont, QFontDatabase, QGradient, QIcon, + QImage, QKeySequence, QLinearGradient, QPainter, + QPalette, QPixmap, QRadialGradient, QTransform) +from PySide6.QtWidgets import (QApplication, QCheckBox, QComboBox, QGridLayout, + QGroupBox, QHBoxLayout, QLabel, QMainWindow, + QPushButton, QSizePolicy, QSpacerItem, QTabWidget, + QVBoxLayout, QWidget) + +class Ui_Settings_Window(object): + def setupUi(self, Settings_Window): + if not Settings_Window.objectName(): + Settings_Window.setObjectName(u"Settings_Window") + Settings_Window.setEnabled(True) + Settings_Window.resize(400, 325) + Settings_Window.setMinimumSize(QSize(400, 300)) + Settings_Window.setMaximumSize(QSize(450, 350)) + self.centralwidget = QWidget(Settings_Window) + self.centralwidget.setObjectName(u"centralwidget") + self.centralwidget.setMaximumSize(QSize(500, 500)) + self.verticalLayout = QVBoxLayout(self.centralwidget) + self.verticalLayout.setObjectName(u"verticalLayout") + self.tabWidget = QTabWidget(self.centralwidget) + self.tabWidget.setObjectName(u"tabWidget") + self.tabWidget.setMaximumSize(QSize(500, 500)) + self.tabWidgetPage2 = QWidget() + self.tabWidgetPage2.setObjectName(u"tabWidgetPage2") + self.gridLayout_2 = QGridLayout(self.tabWidgetPage2) + self.gridLayout_2.setObjectName(u"gridLayout_2") + self.pkg_info_groupBox = QGroupBox(self.tabWidgetPage2) + self.pkg_info_groupBox.setObjectName(u"pkg_info_groupBox") + self.gridLayout = QGridLayout(self.pkg_info_groupBox) + self.gridLayout.setObjectName(u"gridLayout") + self.label_optima35_latestversion = QLabel(self.pkg_info_groupBox) + self.label_optima35_latestversion.setObjectName(u"label_optima35_latestversion") + self.label_optima35_latestversion.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) + + self.gridLayout.addWidget(self.label_optima35_latestversion, 2, 2, 1, 1) + + self.label_latest_version = QLabel(self.pkg_info_groupBox) + self.label_latest_version.setObjectName(u"label_latest_version") + self.label_latest_version.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) + + self.gridLayout.addWidget(self.label_latest_version, 0, 2, 1, 1) + + self.label = QLabel(self.pkg_info_groupBox) + self.label.setObjectName(u"label") + + self.gridLayout.addWidget(self.label, 1, 0, 1, 1) + + self.label_optimalab35_latestversion = QLabel(self.pkg_info_groupBox) + self.label_optimalab35_latestversion.setObjectName(u"label_optimalab35_latestversion") + self.label_optimalab35_latestversion.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) + + self.gridLayout.addWidget(self.label_optimalab35_latestversion, 1, 2, 1, 1) + + self.label_9 = QLabel(self.pkg_info_groupBox) + self.label_9.setObjectName(u"label_9") + + self.gridLayout.addWidget(self.label_9, 0, 0, 1, 1) + + self.label_optimalab35_localversion = QLabel(self.pkg_info_groupBox) + self.label_optimalab35_localversion.setObjectName(u"label_optimalab35_localversion") + self.label_optimalab35_localversion.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) + + self.gridLayout.addWidget(self.label_optimalab35_localversion, 1, 1, 1, 1) + + self.label_6 = QLabel(self.pkg_info_groupBox) + self.label_6.setObjectName(u"label_6") + self.label_6.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) + + self.gridLayout.addWidget(self.label_6, 0, 1, 1, 1) + + self.label_2 = QLabel(self.pkg_info_groupBox) + self.label_2.setObjectName(u"label_2") + + self.gridLayout.addWidget(self.label_2, 2, 0, 1, 1) + + self.label_optima35_localversion = QLabel(self.pkg_info_groupBox) + self.label_optima35_localversion.setObjectName(u"label_optima35_localversion") + self.label_optima35_localversion.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) + + self.gridLayout.addWidget(self.label_optima35_localversion, 2, 1, 1, 1) + + + self.gridLayout_2.addWidget(self.pkg_info_groupBox, 0, 0, 1, 2) + + self.dev_widget = QWidget(self.tabWidgetPage2) + self.dev_widget.setObjectName(u"dev_widget") + self.horizontalLayout_2 = QHBoxLayout(self.dev_widget) + self.horizontalLayout_2.setObjectName(u"horizontalLayout_2") + self.check_local_Button = QPushButton(self.dev_widget) + self.check_local_Button.setObjectName(u"check_local_Button") + + self.horizontalLayout_2.addWidget(self.check_local_Button) + + self.update_local_Button = QPushButton(self.dev_widget) + self.update_local_Button.setObjectName(u"update_local_Button") + + self.horizontalLayout_2.addWidget(self.update_local_Button) + + + self.gridLayout_2.addWidget(self.dev_widget, 1, 0, 1, 2) + + self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + + self.gridLayout_2.addItem(self.verticalSpacer, 2, 0, 1, 1) + + self.label_5 = QLabel(self.tabWidgetPage2) + self.label_5.setObjectName(u"label_5") + + self.gridLayout_2.addWidget(self.label_5, 3, 0, 1, 1) + + self.label_last_check = QLabel(self.tabWidgetPage2) + self.label_last_check.setObjectName(u"label_last_check") + self.label_last_check.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) + + self.gridLayout_2.addWidget(self.label_last_check, 3, 1, 2, 1) + + self.widget = QWidget(self.tabWidgetPage2) + self.widget.setObjectName(u"widget") + self.horizontalLayout = QHBoxLayout(self.widget) + self.horizontalLayout.setObjectName(u"horizontalLayout") + self.check_for_update_Button = QPushButton(self.widget) + self.check_for_update_Button.setObjectName(u"check_for_update_Button") + + self.horizontalLayout.addWidget(self.check_for_update_Button) + + self.update_and_restart_Button = QPushButton(self.widget) + self.update_and_restart_Button.setObjectName(u"update_and_restart_Button") + + self.horizontalLayout.addWidget(self.update_and_restart_Button) + + self.restart_checkBox = QCheckBox(self.widget) + self.restart_checkBox.setObjectName(u"restart_checkBox") + self.restart_checkBox.setChecked(True) + + self.horizontalLayout.addWidget(self.restart_checkBox) + + + self.gridLayout_2.addWidget(self.widget, 5, 0, 1, 2) + + self.tabWidget.addTab(self.tabWidgetPage2, "") + self.tabWidgetPage1 = QWidget() + self.tabWidgetPage1.setObjectName(u"tabWidgetPage1") + self.verticalLayout_2 = QVBoxLayout(self.tabWidgetPage1) + self.verticalLayout_2.setObjectName(u"verticalLayout_2") + self.groupBox_4 = QGroupBox(self.tabWidgetPage1) + self.groupBox_4.setObjectName(u"groupBox_4") + self.horizontalLayout_3 = QHBoxLayout(self.groupBox_4) + self.horizontalLayout_3.setObjectName(u"horizontalLayout_3") + self.label_4 = QLabel(self.groupBox_4) + self.label_4.setObjectName(u"label_4") + self.label_4.setWordWrap(True) + + self.horizontalLayout_3.addWidget(self.label_4) + + self.reset_exif_Button = QPushButton(self.groupBox_4) + self.reset_exif_Button.setObjectName(u"reset_exif_Button") + self.reset_exif_Button.setMinimumSize(QSize(100, 0)) + self.reset_exif_Button.setMaximumSize(QSize(100, 16777215)) + + self.horizontalLayout_3.addWidget(self.reset_exif_Button) + + + self.verticalLayout_2.addWidget(self.groupBox_4) + + self.groupBox_3 = QGroupBox(self.tabWidgetPage1) + self.groupBox_3.setObjectName(u"groupBox_3") + self.gridLayout_3 = QGridLayout(self.groupBox_3) + self.gridLayout_3.setObjectName(u"gridLayout_3") + self.label_3 = QLabel(self.groupBox_3) + self.label_3.setObjectName(u"label_3") + + self.gridLayout_3.addWidget(self.label_3, 0, 0, 1, 3) + + self.enable_theme_checkBox = QCheckBox(self.groupBox_3) + self.enable_theme_checkBox.setObjectName(u"enable_theme_checkBox") + self.enable_theme_checkBox.setChecked(False) + + self.gridLayout_3.addWidget(self.enable_theme_checkBox, 1, 0, 1, 1) + + self.theme_selection_comboBox = QComboBox(self.groupBox_3) + self.theme_selection_comboBox.addItem("") + self.theme_selection_comboBox.addItem("") + self.theme_selection_comboBox.addItem("") + self.theme_selection_comboBox.setObjectName(u"theme_selection_comboBox") + self.theme_selection_comboBox.setEnabled(False) + self.theme_selection_comboBox.setMinimumSize(QSize(100, 0)) + self.theme_selection_comboBox.setMaximumSize(QSize(100, 16777215)) + + self.gridLayout_3.addWidget(self.theme_selection_comboBox, 1, 2, 1, 1) + + self.save_and_close_Button = QPushButton(self.groupBox_3) + self.save_and_close_Button.setObjectName(u"save_and_close_Button") + + self.gridLayout_3.addWidget(self.save_and_close_Button, 3, 0, 1, 1) + + self.horizontalSpacer_2 = QSpacerItem(98, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.gridLayout_3.addItem(self.horizontalSpacer_2, 1, 1, 1, 1) + + self.install_pkg_Button = QPushButton(self.groupBox_3) + self.install_pkg_Button.setObjectName(u"install_pkg_Button") + + self.gridLayout_3.addWidget(self.install_pkg_Button, 2, 0, 1, 3) + + self.save_and_restart_Button = QPushButton(self.groupBox_3) + self.save_and_restart_Button.setObjectName(u"save_and_restart_Button") + + self.gridLayout_3.addWidget(self.save_and_restart_Button, 3, 1, 1, 2) + + + self.verticalLayout_2.addWidget(self.groupBox_3) + + self.tabWidget.addTab(self.tabWidgetPage1, "") + + self.verticalLayout.addWidget(self.tabWidget) + + Settings_Window.setCentralWidget(self.centralwidget) + + self.retranslateUi(Settings_Window) + self.enable_theme_checkBox.toggled.connect(self.theme_selection_comboBox.setEnabled) + + self.tabWidget.setCurrentIndex(0) + + + QMetaObject.connectSlotsByName(Settings_Window) + # setupUi + + def retranslateUi(self, Settings_Window): + Settings_Window.setWindowTitle(QCoreApplication.translate("Settings_Window", u"Settings", None)) + self.pkg_info_groupBox.setTitle(QCoreApplication.translate("Settings_Window", u"Package information", None)) + self.label_optima35_latestversion.setText(QCoreApplication.translate("Settings_Window", u"unknown", None)) + self.label_latest_version.setText(QCoreApplication.translate("Settings_Window", u"Latest version", None)) + self.label.setText(QCoreApplication.translate("Settings_Window", u"OptimaLab35", None)) + self.label_optimalab35_latestversion.setText(QCoreApplication.translate("Settings_Window", u"unknown", None)) + self.label_9.setText(QCoreApplication.translate("Settings_Window", u"Package", None)) + self.label_optimalab35_localversion.setText(QCoreApplication.translate("Settings_Window", u"0.0.0", None)) + self.label_6.setText(QCoreApplication.translate("Settings_Window", u"Local Version", None)) + self.label_2.setText(QCoreApplication.translate("Settings_Window", u"optima35", None)) + self.label_optima35_localversion.setText(QCoreApplication.translate("Settings_Window", u"0.0.0", None)) +#if QT_CONFIG(tooltip) + self.check_local_Button.setToolTip(QCoreApplication.translate("Settings_Window", u"FOR DEVELOPER", None)) +#endif // QT_CONFIG(tooltip) + self.check_local_Button.setText(QCoreApplication.translate("Settings_Window", u"Check local", None)) +#if QT_CONFIG(tooltip) + self.update_local_Button.setToolTip(QCoreApplication.translate("Settings_Window", u"FOR DEVELOPER", None)) +#endif // QT_CONFIG(tooltip) + self.update_local_Button.setText(QCoreApplication.translate("Settings_Window", u"Update local", None)) + self.label_5.setText(QCoreApplication.translate("Settings_Window", u"TextLabel", None)) + self.label_last_check.setText(QCoreApplication.translate("Settings_Window", u"TextLabel", None)) + self.check_for_update_Button.setText(QCoreApplication.translate("Settings_Window", u"Check for update", None)) + self.update_and_restart_Button.setText(QCoreApplication.translate("Settings_Window", u"Update", None)) +#if QT_CONFIG(tooltip) + self.restart_checkBox.setToolTip(QCoreApplication.translate("Settings_Window", u"Restarts the app after update.", None)) +#endif // QT_CONFIG(tooltip) + self.restart_checkBox.setText(QCoreApplication.translate("Settings_Window", u"Restart", None)) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.tabWidgetPage2), QCoreApplication.translate("Settings_Window", u"Updater", None)) + self.groupBox_4.setTitle(QCoreApplication.translate("Settings_Window", u"EXIF", None)) + self.label_4.setText(QCoreApplication.translate("Settings_Window", u"Reset selectable EXIF data to default", None)) + self.reset_exif_Button.setText(QCoreApplication.translate("Settings_Window", u"Reset", None)) + self.groupBox_3.setTitle(QCoreApplication.translate("Settings_Window", u"Theme", None)) + self.label_3.setText(QCoreApplication.translate("Settings_Window", u"Change theme from OS to PyQT Dark or Light", None)) +#if QT_CONFIG(tooltip) + self.enable_theme_checkBox.setToolTip(QCoreApplication.translate("Settings_Window", u"Changes will take effect after restarting the application.", None)) +#endif // QT_CONFIG(tooltip) + self.enable_theme_checkBox.setText(QCoreApplication.translate("Settings_Window", u"Custom theme", None)) + self.theme_selection_comboBox.setItemText(0, QCoreApplication.translate("Settings_Window", u"Auto", None)) + self.theme_selection_comboBox.setItemText(1, QCoreApplication.translate("Settings_Window", u"Dark", None)) + self.theme_selection_comboBox.setItemText(2, QCoreApplication.translate("Settings_Window", u"Light", None)) + +#if QT_CONFIG(tooltip) + self.theme_selection_comboBox.setToolTip(QCoreApplication.translate("Settings_Window", u"Changes will take effect after restarting the application.", None)) +#endif // QT_CONFIG(tooltip) +#if QT_CONFIG(tooltip) + self.save_and_close_Button.setToolTip(QCoreApplication.translate("Settings_Window", u"Changes will take effect after restarting the application.", None)) +#endif // QT_CONFIG(tooltip) + self.save_and_close_Button.setText(QCoreApplication.translate("Settings_Window", u"Apply theme", None)) + self.install_pkg_Button.setText(QCoreApplication.translate("Settings_Window", u"Install package for custom theme", None)) + self.save_and_restart_Button.setText(QCoreApplication.translate("Settings_Window", u"Apply and restart", None)) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.tabWidgetPage1), QCoreApplication.translate("Settings_Window", u"Preferences", None)) + # retranslateUi + diff --git a/src/OptimaLab35/ui/settings_window.ui b/src/OptimaLab35/ui/settings_window.ui new file mode 100644 index 0000000..91bee20 --- /dev/null +++ b/src/OptimaLab35/ui/settings_window.ui @@ -0,0 +1,408 @@ + + + Settings_Window + + + true + + + + 0 + 0 + 400 + 325 + + + + + 400 + 300 + + + + + 450 + 350 + + + + Settings + + + + + 500 + 500 + + + + + + + + 500 + 500 + + + + 0 + + + + Updater + + + + + + Package information + + + + + + unknown + + + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter + + + + + + + Latest version + + + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter + + + + + + + OptimaLab35 + + + + + + + unknown + + + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter + + + + + + + Package + + + + + + + 0.0.0 + + + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter + + + + + + + Local Version + + + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter + + + + + + + optima35 + + + + + + + 0.0.0 + + + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter + + + + + + + + + + + + + FOR DEVELOPER + + + Check local + + + + + + + FOR DEVELOPER + + + Update local + + + + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + TextLabel + + + + + + + TextLabel + + + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter + + + + + + + + + + Check for update + + + + + + + Update + + + + + + + Restarts the app after update. + + + Restart + + + true + + + + + + + + + + + Preferences + + + + + + EXIF + + + + + + Reset selectable EXIF data to default + + + true + + + + + + + + 100 + 0 + + + + + 100 + 16777215 + + + + Reset + + + + + + + + + + Theme + + + + + + Change theme from OS to PyQT Dark or Light + + + + + + + Changes will take effect after restarting the application. + + + Custom theme + + + false + + + + + + + false + + + + 100 + 0 + + + + + 100 + 16777215 + + + + Changes will take effect after restarting the application. + + + + Auto + + + + + Dark + + + + + Light + + + + + + + + Changes will take effect after restarting the application. + + + Apply theme + + + + + + + Qt::Orientation::Horizontal + + + + 98 + 20 + + + + + + + + Install package for custom theme + + + + + + + Apply and restart + + + + + + + + + + + + + + + + + enable_theme_checkBox + toggled(bool) + theme_selection_comboBox + setEnabled(bool) + + + 96 + 225 + + + 317 + 225 + + + + + diff --git a/src/OptimaLab35/ui/simple_dialog.py b/src/OptimaLab35/ui/simple_dialog.py index 019877a..5410dc7 100644 --- a/src/OptimaLab35/ui/simple_dialog.py +++ b/src/OptimaLab35/ui/simple_dialog.py @@ -17,6 +17,7 @@ class SimpleDialog(QDialog): self.message_label.setWordWrap(True) # Enable word wrapping self.message_label.setAlignment(Qt.AlignLeft | Qt.AlignTop) # Align text self.message_label.setMaximumWidth(400) # Set max width so it wraps text + self.message_label.setOpenExternalLinks(True) # Create the close button close_button = QPushButton("Close", self) diff --git a/src/OptimaLab35/ui/updater_window.py b/src/OptimaLab35/ui/updater_window.py deleted file mode 100644 index 1c2e67f..0000000 --- a/src/OptimaLab35/ui/updater_window.py +++ /dev/null @@ -1,173 +0,0 @@ -# -*- coding: utf-8 -*- - -################################################################################ -## Form generated from reading UI file 'updater_window.ui' -## -## Created by: Qt User Interface Compiler version 6.8.1 -## -## WARNING! All changes made in this file will be lost when recompiling UI file! -################################################################################ - -from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, - QMetaObject, QObject, QPoint, QRect, - QSize, QTime, QUrl, Qt) -from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, - QFont, QFontDatabase, QGradient, QIcon, - QImage, QKeySequence, QLinearGradient, QPainter, - QPalette, QPixmap, QRadialGradient, QTransform) -from PySide6.QtWidgets import (QApplication, QCheckBox, QGridLayout, QHBoxLayout, - QLabel, QMainWindow, QPushButton, QSizePolicy, - QWidget) - -class Ui_Updater_Window(object): - def setupUi(self, Updater_Window): - if not Updater_Window.objectName(): - Updater_Window.setObjectName(u"Updater_Window") - Updater_Window.setEnabled(True) - Updater_Window.resize(340, 200) - Updater_Window.setMinimumSize(QSize(336, 200)) - Updater_Window.setMaximumSize(QSize(340, 300)) - self.centralwidget = QWidget(Updater_Window) - self.centralwidget.setObjectName(u"centralwidget") - self.gridLayout_2 = QGridLayout(self.centralwidget) - self.gridLayout_2.setObjectName(u"gridLayout_2") - self.widget_2 = QWidget(self.centralwidget) - self.widget_2.setObjectName(u"widget_2") - self.gridLayout = QGridLayout(self.widget_2) - self.gridLayout.setObjectName(u"gridLayout") - self.label = QLabel(self.widget_2) - self.label.setObjectName(u"label") - - self.gridLayout.addWidget(self.label, 1, 0, 1, 1) - - self.label_optima35_localversion = QLabel(self.widget_2) - self.label_optima35_localversion.setObjectName(u"label_optima35_localversion") - self.label_optima35_localversion.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter) - - self.gridLayout.addWidget(self.label_optima35_localversion, 2, 1, 1, 1) - - self.label_9 = QLabel(self.widget_2) - self.label_9.setObjectName(u"label_9") - - self.gridLayout.addWidget(self.label_9, 0, 0, 1, 1) - - self.label_optima35_latestversion = QLabel(self.widget_2) - self.label_optima35_latestversion.setObjectName(u"label_optima35_latestversion") - self.label_optima35_latestversion.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter) - - self.gridLayout.addWidget(self.label_optima35_latestversion, 2, 2, 1, 1) - - self.label_optimalab35_localversion = QLabel(self.widget_2) - self.label_optimalab35_localversion.setObjectName(u"label_optimalab35_localversion") - self.label_optimalab35_localversion.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter) - - self.gridLayout.addWidget(self.label_optimalab35_localversion, 1, 1, 1, 1) - - self.label_6 = QLabel(self.widget_2) - self.label_6.setObjectName(u"label_6") - self.label_6.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter) - - self.gridLayout.addWidget(self.label_6, 0, 1, 1, 1) - - self.label_optimalab35_latestversion = QLabel(self.widget_2) - self.label_optimalab35_latestversion.setObjectName(u"label_optimalab35_latestversion") - self.label_optimalab35_latestversion.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter) - - self.gridLayout.addWidget(self.label_optimalab35_latestversion, 1, 2, 1, 1) - - self.label_latest_version = QLabel(self.widget_2) - self.label_latest_version.setObjectName(u"label_latest_version") - self.label_latest_version.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter) - - self.gridLayout.addWidget(self.label_latest_version, 0, 2, 1, 1) - - self.label_2 = QLabel(self.widget_2) - self.label_2.setObjectName(u"label_2") - - self.gridLayout.addWidget(self.label_2, 2, 0, 1, 1) - - - self.gridLayout_2.addWidget(self.widget_2, 1, 0, 1, 2) - - self.widget = QWidget(self.centralwidget) - self.widget.setObjectName(u"widget") - self.horizontalLayout = QHBoxLayout(self.widget) - self.horizontalLayout.setObjectName(u"horizontalLayout") - self.check_for_update_Button = QPushButton(self.widget) - self.check_for_update_Button.setObjectName(u"check_for_update_Button") - - self.horizontalLayout.addWidget(self.check_for_update_Button) - - self.update_and_restart_Button = QPushButton(self.widget) - self.update_and_restart_Button.setObjectName(u"update_and_restart_Button") - - self.horizontalLayout.addWidget(self.update_and_restart_Button) - - self.restart_checkBox = QCheckBox(self.widget) - self.restart_checkBox.setObjectName(u"restart_checkBox") - self.restart_checkBox.setChecked(True) - - self.horizontalLayout.addWidget(self.restart_checkBox) - - - self.gridLayout_2.addWidget(self.widget, 2, 0, 1, 2) - - self.label_last_check = QLabel(self.centralwidget) - self.label_last_check.setObjectName(u"label_last_check") - - self.gridLayout_2.addWidget(self.label_last_check, 0, 0, 1, 1) - - self.label_last_check_2 = QLabel(self.centralwidget) - self.label_last_check_2.setObjectName(u"label_last_check_2") - self.label_last_check_2.setEnabled(True) - self.label_last_check_2.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter) - - self.gridLayout_2.addWidget(self.label_last_check_2, 0, 1, 1, 1) - - self.dev_widget = QWidget(self.centralwidget) - self.dev_widget.setObjectName(u"dev_widget") - self.horizontalLayout_2 = QHBoxLayout(self.dev_widget) - self.horizontalLayout_2.setObjectName(u"horizontalLayout_2") - self.check_local_Button = QPushButton(self.dev_widget) - self.check_local_Button.setObjectName(u"check_local_Button") - - self.horizontalLayout_2.addWidget(self.check_local_Button) - - self.update_local_Button = QPushButton(self.dev_widget) - self.update_local_Button.setObjectName(u"update_local_Button") - - self.horizontalLayout_2.addWidget(self.update_local_Button) - - - self.gridLayout_2.addWidget(self.dev_widget, 3, 0, 1, 2) - - Updater_Window.setCentralWidget(self.centralwidget) - - self.retranslateUi(Updater_Window) - - QMetaObject.connectSlotsByName(Updater_Window) - # setupUi - - def retranslateUi(self, Updater_Window): - Updater_Window.setWindowTitle(QCoreApplication.translate("Updater_Window", u"Updater", None)) - self.label.setText(QCoreApplication.translate("Updater_Window", u"OptimaLab35", None)) - self.label_optima35_localversion.setText(QCoreApplication.translate("Updater_Window", u"0.0.0", None)) - self.label_9.setText(QCoreApplication.translate("Updater_Window", u"Package", None)) - self.label_optima35_latestversion.setText(QCoreApplication.translate("Updater_Window", u"unknown", None)) - self.label_optimalab35_localversion.setText(QCoreApplication.translate("Updater_Window", u"0.0.0", None)) - self.label_6.setText(QCoreApplication.translate("Updater_Window", u"Local Version", None)) - self.label_optimalab35_latestversion.setText(QCoreApplication.translate("Updater_Window", u"unknown", None)) - self.label_latest_version.setText(QCoreApplication.translate("Updater_Window", u"Latest version", None)) - self.label_2.setText(QCoreApplication.translate("Updater_Window", u"optima35", None)) - self.check_for_update_Button.setText(QCoreApplication.translate("Updater_Window", u"Check for update", None)) - self.update_and_restart_Button.setText(QCoreApplication.translate("Updater_Window", u"Update", None)) -#if QT_CONFIG(tooltip) - self.restart_checkBox.setToolTip(QCoreApplication.translate("Updater_Window", u"Restarts the app after update.", None)) -#endif // QT_CONFIG(tooltip) - self.restart_checkBox.setText(QCoreApplication.translate("Updater_Window", u"Restart", None)) - self.label_last_check.setText(QCoreApplication.translate("Updater_Window", u"Last update check:", None)) - self.label_last_check_2.setText(QCoreApplication.translate("Updater_Window", u"TextLabel", None)) - self.check_local_Button.setText(QCoreApplication.translate("Updater_Window", u"Check local", None)) - self.update_local_Button.setText(QCoreApplication.translate("Updater_Window", u"Update local", None)) - # retranslateUi - diff --git a/src/OptimaLab35/ui/updater_window.ui b/src/OptimaLab35/ui/updater_window.ui deleted file mode 100644 index 581aa3d..0000000 --- a/src/OptimaLab35/ui/updater_window.ui +++ /dev/null @@ -1,198 +0,0 @@ - - - Updater_Window - - - true - - - - 0 - 0 - 340 - 200 - - - - - 336 - 200 - - - - - 340 - 300 - - - - Updater - - - - - - - - - - OptimaLab35 - - - - - - - 0.0.0 - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - Package - - - - - - - unknown - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - 0.0.0 - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - Local Version - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - unknown - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - Latest version - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - optima35 - - - - - - - - - - - - - Check for update - - - - - - - Update - - - - - - - Restarts the app after update. - - - Restart - - - true - - - - - - - - - - Last update check: - - - - - - - true - - - TextLabel - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - - - Check local - - - - - - - Update local - - - - - - - - - - - - diff --git a/src/OptimaLab35/utils/utility.py b/src/OptimaLab35/utils/utility.py index d7673f5..3f71698 100644 --- a/src/OptimaLab35/utils/utility.py +++ b/src/OptimaLab35/utils/utility.py @@ -2,8 +2,12 @@ import yaml import os class Utilities: - def __init__(self): - pass + def __init__(self, app_folder_path): + self.folder_path = os.path.expanduser(app_folder_path) + self._ensure_program_folder_exists() + self.exif_path = os.path.expanduser(f"{app_folder_path}/exif.yaml") + self.settings_path = os.path.expanduser(f"{app_folder_path}/settings.yaml") + self._prepear_exif_config() def read_yaml(self, yaml_file): try: @@ -12,29 +16,38 @@ class Utilities: return data except (FileNotFoundError, PermissionError) as e: print(f"Error loading settings file: {e}") - return + return None def write_yaml(self, yaml_file, data): try: with open(yaml_file, "w") as file: yaml.dump(data, file) + return True except PermissionError as e: print(f"Error saving setings: {e}") + return False - def program_configs(self): + def _prepear_exif_config(self): """Prepear folder for config and generate default exif if non aviable""" - program_folder = self._ensure_program_folder_exists() - if not os.path.isfile(f"{program_folder}/exif.yaml"): - self._default_exif(f"{program_folder}/exif.yaml") + if not os.path.isfile(self.exif_path): + self.default_exif() def _ensure_program_folder_exists(self): - program_folder = os.path.expanduser("~/.config/OptimaLab35") - if not os.path.exists(program_folder): - print("in not, make folder") - os.makedirs(program_folder) - return program_folder + if not os.path.exists(self.folder_path): + os.makedirs(self.folder_path) - def _default_exif(self, file): + def load_settings(self): + """Loads settings from file, or creates default settings if missing.""" + if os.path.exists(self.settings_path): + settings = self.read_yaml(self.settings_path) + return settings if settings else self._default_settings() + return self._default_settings() + + def save_settings(self, settings): + if not self.write_yaml(self.settings_path, settings): + print("Error writing file") + + def default_exif(self): """Makes a default exif file.""" print("Making default") def_exif = { @@ -78,7 +91,19 @@ class Utilities: "Scanner: NA" ] } - self.write_yaml(file, def_exif) + self.write_yaml(self.exif_path, def_exif) + + def _default_settings(self): + """Returns default settings and writes them if the settings file does not exist.""" + settings = { + "theme": { + "theme_pkg": False, + "use_custom_theme": False, + "mode": "Auto" + } + } + self.write_yaml(self.settings_path, settings) + return settings def append_number_to_name(self, base_name: str, current_image: int, total_images: int, invert: bool): """"Returns name, combination of base_name and ending number.""" diff --git a/src/flatpak/app-icon.png b/src/app_resources/app-icon.png similarity index 100% rename from src/flatpak/app-icon.png rename to src/app_resources/app-icon.png diff --git a/src/flatpak/net.boxyfoxy.OptimaLab35.desktop b/src/app_resources/net.boxyfoxy.OptimaLab35.desktop similarity index 100% rename from src/flatpak/net.boxyfoxy.OptimaLab35.desktop rename to src/app_resources/net.boxyfoxy.OptimaLab35.desktop diff --git a/src/flatpak/net.boxyfoxy.OptimaLab35.metainfo.xml b/src/app_resources/net.boxyfoxy.OptimaLab35.metainfo.xml similarity index 100% rename from src/flatpak/net.boxyfoxy.OptimaLab35.metainfo.xml rename to src/app_resources/net.boxyfoxy.OptimaLab35.metainfo.xml diff --git a/src/app_resources/resources.qrc b/src/app_resources/resources.qrc new file mode 100644 index 0000000..e6ae569 --- /dev/null +++ b/src/app_resources/resources.qrc @@ -0,0 +1,6 @@ + + + + app-icon.png + + diff --git a/src/generate_qrc.sh b/src/generate_qrc.sh new file mode 100644 index 0000000..db1137a --- /dev/null +++ b/src/generate_qrc.sh @@ -0,0 +1,3 @@ +#!/bin/bash +echo "Updating resources.qrc file and placing in ui folder..." +pyside6-rcc app_resources/resources.qrc -o OptimaLab35/ui/resources_rc.py diff --git a/src/pyproject.toml b/src/pyproject.toml index 4e3097a..ec4f716 100644 --- a/src/pyproject.toml +++ b/src/pyproject.toml @@ -7,9 +7,18 @@ name = "OptimaLab35" dynamic = ["version"] authors = [{ name = "Mr Finchum" }] description = "User interface for optima35." -requires-python = ">=3.8" -dependencies = ["optima35>=1.0.0, <2.0.0", "PyYAML", "PyPyUpdater"] +readme = "../pip_README.md" +requires-python = ">=3.8, <4.0" +dependencies = [ + "optima35>=1.0.0, <2.0.0", + "PyPiUpdater>=0.7.2, <1.0.0", + "pyside6", + "PyYAML", +] classifiers = [ + "Development Status :: 5 - Production/Stable", + "Environment :: X11 Applications :: Qt", + "Topic :: Multimedia :: Graphics :: Editors", "Programming Language :: Python :: 3", "License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)", "Operating System :: OS Independent", @@ -17,6 +26,8 @@ classifiers = [ [project.urls] Source = "https://gitlab.com/CodeByMrFinchum/OptimaLab35" +Documentation = "https://gitlab.com/CodeByMrFinchum/OptimaLab35/-/blob/main/README.md" +Changelog = "https://gitlab.com/CodeByMrFinchum/OptimaLab35/-/blob/main/CHANGELOG.md" [project.scripts] OptimaLab35 = "OptimaLab35.__main__:main" diff --git a/src/OptimaLab35/update_ui.sh b/src/update_ui.sh similarity index 69% rename from src/OptimaLab35/update_ui.sh rename to src/update_ui.sh index 95cda5f..3b50769 100755 --- a/src/OptimaLab35/update_ui.sh +++ b/src/update_ui.sh @@ -4,5 +4,5 @@ echo "Update main window." pyside6-uic OptimaLab35/ui/main_window.ui -o OptimaLab35/ui/main_window.py echo "Update preview window." pyside6-uic OptimaLab35/ui/preview_window.ui -o OptimaLab35/ui/preview_window.py -echo "Update updater window." -pyside6-uic OptimaLab35/ui/updater_window.ui -o OptimaLab35/ui/updater_window.py +echo "Update settings window." +pyside6-uic OptimaLab35/ui/settings_window.ui -o OptimaLab35/ui/settings_window.py