From d887d2b86717d45e1afe5f74da44a2a7ec4d478f Mon Sep 17 00:00:00 2001 From: Jason-JP-Yang Date: Tue, 13 May 2025 22:42:47 +0800 Subject: [PATCH] Addition Features: Custom Homepage and WHEP player 1. DVR record apply support regex, for usage: please enter config file -dvr_apply and start regex with /^xxx$/ 2. Add custom homepage for player, enter the url localhost:8080/players/homepage.html to access 3. Add WHEP player, enter the url localhost:8080/players/whep_itp.html 4. Convert Files Format from CRLF to LF (Windows to Linux) * Known Issues: 1. There is a unsmooth swup between hompage and player page, Swup.js will be used to fix this issue in the future. --- .github/ISSUE_TEMPLATE/bug_report.md | 10 +- .github/ISSUE_TEMPLATE/feature_request.md | 5 +- .github/workflows/codeql-analysis.yml | 2 +- .github/workflows/release.yml | 14 +- .github/workflows/test.yml | 1 - .gitignore | 1 - .vscode/README.md | 2 +- .vscode/launch.json | 68 +- .vscode/settings.json | 43 +- .vscode/tasks.json | 31 +- CONTRIBUTING.md | 15 - README.md | 274 +- SECURITY.md | 8 - docker-compose.yaml | 28 + package-lock.json | 27 + package.json | 5 + trunk/AUTHORS.md | 173 - trunk/AUTHORS.txt | 1 - trunk/doc/CHANGELOG.md | 1 - trunk/doc/source.flv | 0 .../api-server/static-dir/favicon.ico | 0 .../research/api-server/static-dir/index.html | 0 trunk/research/players/css/bootstrap.min.css | 6159 ++++++++++++++++- trunk/research/players/css/homepage_main.css | 135 + trunk/research/players/css/whep_main.css | 309 + trunk/research/players/homepage.html | 330 + trunk/research/players/img/school_logo.png | Bin 0 -> 59672 bytes .../research/players/img/school_logo_text.png | Bin 0 -> 142158 bytes trunk/research/players/js/anime.js | 8 + trunk/research/players/js/srs.page.js | 10 +- trunk/research/players/js/srs.sdk.js | 134 +- trunk/research/players/js/whep_main.js | 66 + trunk/research/players/whep.html | 131 - trunk/research/players/whep_itp.html | 371 + trunk/src/app/srs_app_config.cpp | 23 +- trunk/src/app/srs_app_config.hpp | 1 + trunk/src/app/srs_app_hls.cpp | 2 +- trunk/src/app/srs_app_rtc_conn.cpp | 170 +- trunk/src/app/srs_app_rtc_sdp.cpp | 36 - trunk/src/app/srs_app_rtc_sdp.hpp | 10 +- trunk/src/app/srs_app_rtc_source.cpp | 282 +- trunk/src/app/srs_app_rtc_source.hpp | 3 - trunk/src/app/srs_app_stream_bridge.cpp | 37 +- trunk/src/app/srs_app_stream_bridge.hpp | 3 - trunk/src/core/srs_core_version7.hpp | 2 +- trunk/src/kernel/srs_kernel_codec.cpp | 97 +- trunk/src/kernel/srs_kernel_codec.hpp | 24 +- trunk/src/kernel/srs_kernel_error.hpp | 2 +- trunk/src/kernel/srs_kernel_rtc_rtp.cpp | 392 +- trunk/src/kernel/srs_kernel_rtc_rtp.hpp | 77 +- trunk/src/utest/srs_utest_kernel.cpp | 200 +- trunk/src/utest/srs_utest_rtc.cpp | 2 +- 52 files changed, 7953 insertions(+), 1772 deletions(-) delete mode 100644 CONTRIBUTING.md delete mode 100644 SECURITY.md create mode 100644 docker-compose.yaml create mode 100644 package-lock.json create mode 100644 package.json delete mode 100644 trunk/AUTHORS.md delete mode 120000 trunk/AUTHORS.txt mode change 120000 => 100644 trunk/doc/source.flv mode change 120000 => 100644 trunk/research/api-server/static-dir/favicon.ico mode change 120000 => 100644 trunk/research/api-server/static-dir/index.html create mode 100644 trunk/research/players/css/homepage_main.css create mode 100644 trunk/research/players/css/whep_main.css create mode 100644 trunk/research/players/homepage.html create mode 100644 trunk/research/players/img/school_logo.png create mode 100644 trunk/research/players/img/school_logo_text.png create mode 100644 trunk/research/players/js/anime.js create mode 100644 trunk/research/players/js/whep_main.js delete mode 100644 trunk/research/players/whep.html create mode 100644 trunk/research/players/whep_itp.html diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 708a1ba9e..ba856061a 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,14 +1,13 @@ --- name: Bug report about: Create a report to help us improve -title: '' +title: "" labels: bug -assignees: '' - +assignees: "" --- -!!! Before submitting a new bug report, please ensure you have searched for any existing bugs. Duplicate issues or -questions that are overly simple or already addressed in the documentation will be removed without any +!!! Before submitting a new bug report, please ensure you have searched for any existing bugs. Duplicate issues or +questions that are overly simple or already addressed in the documentation will be removed without any response. **Describe the bug** @@ -19,6 +18,7 @@ Desribe your SRS Server version here. **To Reproduce** Steps to reproduce the behavior: + 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index c9cd62803..53e719d50 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,10 +1,9 @@ --- name: Feature request about: Suggest an idea for this project -title: '' +title: "" labels: feature -assignees: '' - +assignees: "" --- !!! Before submitting a new feature request, please ensure you have searched for any existing features. Duplicate issues or questions that are overly simple or already addressed in the documentation will be removed without any response. diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 58829c3ae..c9c4cc426 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -14,7 +14,7 @@ jobs: strategy: fail-fast: false matrix: - language: [ 'cpp' ] + language: ["cpp"] steps: - name: Checkout repository diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3216cbe22..13b8265cf 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -434,35 +434,35 @@ jobs: name: Release ${{ env.SRS_TAG }} body: | If you would like to support SRS, please consider contributing to our [OpenCollective](https://opencollective.com/srs-server). - + [${{ github.sha }}](https://github.com/ossrs/srs/commit/${{ github.sha }}) ${{ github.event.head_commit.message }} - + ## Resource * Source: ${{ env.SRS_SOURCE_MD5 }} [${{ env.SRS_SOURCE_TAR }}](https://github.com/ossrs/srs/releases/download/${{ env.SRS_TAG }}/${{ env.SRS_SOURCE_TAR }}) * Binary: ${{ env.SRS_PACKAGE_MD5 }} [${{ env.SRS_PACKAGE_ZIP }}](https://github.com/ossrs/srs/releases/download/${{ env.SRS_TAG }}/${{ env.SRS_PACKAGE_ZIP }}) * Binary: ${{ env.SRS_CYGWIN_MD5 }} [${{ env.SRS_CYGWIN_TAR }}](https://github.com/ossrs/srs/releases/download/${{ env.SRS_TAG }}/${{ env.SRS_CYGWIN_TAR }}) - + ## Resource Mirror: gitee.com * Source: ${{ env.SRS_SOURCE_MD5 }} [${{ env.SRS_SOURCE_TAR }}](https://gitee.com/ossrs/srs/releases/download/${{ env.SRS_TAG }}/${{ env.SRS_SOURCE_TAR }}) * Binary: ${{ env.SRS_PACKAGE_MD5 }} [${{ env.SRS_PACKAGE_ZIP }}](https://gitee.com/ossrs/srs/releases/download/${{ env.SRS_TAG }}/${{ env.SRS_PACKAGE_ZIP }}) * Binary: ${{ env.SRS_CYGWIN_MD5 }} [${{ env.SRS_CYGWIN_TAR }}](https://gitee.com/ossrs/srs/releases/download/${{ env.SRS_TAG }}/${{ env.SRS_CYGWIN_TAR }}) - + ## Docker * [docker pull ossrs/srs:${{ env.SRS_MAJOR }}](https://ossrs.io/lts/en-us/docs/v7/doc/getting-started) * [docker pull ossrs/srs:${{ env.SRS_TAG }}](https://ossrs.io/lts/en-us/docs/v7/doc/getting-started) * [docker pull ossrs/srs:${{ env.SRS_XYZ }}](https://ossrs.io/lts/en-us/docs/v7/doc/getting-started) - + ## Docker Mirror: aliyun.com * [docker pull registry.cn-hangzhou.aliyuncs.com/ossrs/srs:${{ env.SRS_MAJOR }}](https://ossrs.net/lts/zh-cn/docs/v7/doc/getting-started) * [docker pull registry.cn-hangzhou.aliyuncs.com/ossrs/srs:${{ env.SRS_TAG }}](https://ossrs.net/lts/zh-cn/docs/v7/doc/getting-started) * [docker pull registry.cn-hangzhou.aliyuncs.com/ossrs/srs:${{ env.SRS_XYZ }}](https://ossrs.net/lts/zh-cn/docs/v7/doc/getting-started) - + ## Doc: ossrs.io * [Getting Started](https://ossrs.io/lts/en-us/docs/v7/doc/getting-started) * [Wiki home](https://ossrs.io/lts/en-us/docs/v7/doc/introduction) * [FAQ](https://ossrs.io/lts/en-us/faq), [Features](https://github.com/ossrs/srs/blob/${{ github.sha }}/trunk/doc/Features.md#features) or [ChangeLogs](https://github.com/ossrs/srs/blob/${{ github.sha }}/trunk/doc/CHANGELOG.md#changelog) - + ## Doc: ossrs.net * [快速入门](https://ossrs.net/lts/zh-cn/docs/v7/doc/getting-started) * [中文Wiki首页](https://ossrs.net/lts/zh-cn/docs/v7/doc/introduction) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e7a9d2875..ca90dacee 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -325,4 +325,3 @@ jobs: runs-on: ubuntu-22.04 steps: - run: echo 'All done' - diff --git a/.gitignore b/.gitignore index 0319e6d68..98d710e79 100644 --- a/.gitignore +++ b/.gitignore @@ -42,4 +42,3 @@ cmake-build-debug /trunk/ide/srs_clion/srs /trunk/ide/srs_clion/Testing/ /trunk/ide/vscode-build - diff --git a/.vscode/README.md b/.vscode/README.md index eb513707b..8af7b20de 100644 --- a/.vscode/README.md +++ b/.vscode/README.md @@ -15,7 +15,7 @@ Run commmand `> CMake: Configure` to configure the project. > Note: You can press `Ctrl+R`, then type `CMake: Configure` then select `Clang` as the toolchain. -> Note: The `settings.json` is used to configure the cmake. It will use `${workspaceFolder}/trunk/ide/srs_clion/CMakeLists.txt` +> Note: The `settings.json` is used to configure the cmake. It will use `${workspaceFolder}/trunk/ide/srs_clion/CMakeLists.txt` > and `${workspaceFolder}/trunk/ide/vscode-build` as the source file and build directory. Click the `Run > Run Without Debugging` button to start the server. diff --git a/.vscode/launch.json b/.vscode/launch.json index 047efcbfd..9358a53df 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,36 +1,36 @@ { - "version": "0.2.0", - "configurations": [ + "version": "0.2.0", + "configurations": [ + { + "name": "Launch SRS", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/trunk/ide/vscode-build/srs", + "args": ["-c", "conf/console.conf"], + "stopAtEntry": false, + "cwd": "${workspaceFolder}/trunk", + "environment": [], + "externalConsole": false, + "MIMode": "lldb", + "setupCommands": [ { - "name": "Launch SRS", - "type": "cppdbg", - "request": "launch", - "program": "${workspaceFolder}/trunk/ide/vscode-build/srs", - "args": ["-c", "conf/console.conf"], - "stopAtEntry": false, - "cwd": "${workspaceFolder}/trunk", - "environment": [], - "externalConsole": false, - "MIMode": "lldb", - "setupCommands": [ - { - "description": "Enable pretty-printing for gdb", - "text": "-enable-pretty-printing", - "ignoreFailures": true - } - ], - "preLaunchTask": "build", - "logging": { - "engineLogging": true - } - }, - { - "name": "Launch srs-proxy", - "type": "go", - "request": "launch", - "mode": "auto", - "cwd": "${workspaceFolder}/proxy", - "program": "${workspaceFolder}/proxy" - } - ] -} \ No newline at end of file + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ], + "preLaunchTask": "build", + "logging": { + "engineLogging": true + } + }, + { + "name": "Launch srs-proxy", + "type": "go", + "request": "launch", + "mode": "auto", + "cwd": "${workspaceFolder}/proxy", + "program": "${workspaceFolder}/proxy" + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json index 58eb63a36..21ec94ae1 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,23 +1,24 @@ { - "cmake.sourceDirectory": "${workspaceFolder}/trunk/ide/srs_clion", - "cmake.buildDirectory": "${workspaceFolder}/trunk/ide/vscode-build", - "cmake.configureOnOpen": false, - "files.associations": { - "vector": "cpp", - "__hash_table": "cpp", - "__split_buffer": "cpp", - "__tree": "cpp", - "array": "cpp", - "bitset": "cpp", - "deque": "cpp", - "initializer_list": "cpp", - "list": "cpp", - "map": "cpp", - "queue": "cpp", - "set": "cpp", - "stack": "cpp", - "string": "cpp", - "string_view": "cpp", - "unordered_map": "cpp" - } + "cmake.sourceDirectory": "${workspaceFolder}/trunk/ide/srs_clion", + "cmake.buildDirectory": "${workspaceFolder}/trunk/ide/vscode-build", + "cmake.configureOnOpen": false, + "files.associations": { + "vector": "cpp", + "__hash_table": "cpp", + "__split_buffer": "cpp", + "__tree": "cpp", + "array": "cpp", + "bitset": "cpp", + "deque": "cpp", + "initializer_list": "cpp", + "list": "cpp", + "map": "cpp", + "queue": "cpp", + "set": "cpp", + "stack": "cpp", + "string": "cpp", + "string_view": "cpp", + "unordered_map": "cpp" + }, + "files.eol": "\n" } diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 98388f3b3..83fc97a9a 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -1,17 +1,16 @@ { - "version": "2.0.0", - "tasks": [ - { - "label": "build", - "type": "shell", - "command": "cmake --build ${workspaceFolder}/trunk/ide/vscode-build", - "group": { - "kind": "build", - "isDefault": true - }, - "problemMatcher": ["$gcc"], - "detail": "Build SRS by cmake." - } - ] - } - \ No newline at end of file + "version": "2.0.0", + "tasks": [ + { + "label": "build", + "type": "shell", + "command": "cmake --build ${workspaceFolder}/trunk/ide/vscode-build", + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": ["$gcc"], + "detail": "Build SRS by cmake." + } + ] +} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index af1600a2f..000000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,15 +0,0 @@ -Welome to contribute to SRS! - -1. Please start from fixing some [Issues: good first issue](https://github.com/ossrs/srs/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22). -1. Please [setup your email](https://ossrs.io/lts/en-us/how-to-file-pr#setup-your-email) before contributing, this is important. -1. Then follow the [guide](https://ossrs.io/lts/en-us/how-to-file-pr) or [贡献代码](https://ossrs.net/lts/zh-cn/how-to-file-pr) to file a PR. -1. We will review your PR ASAP. Since our bandwidth is limited, we appreciate your patience. - -If achieve [50 commits](https://github.com/ossrs/srs/graphs/contributors), you will be [TOC of SRS](https://github.com/ossrs/srs/blob/develop/trunk/AUTHORS.md#toc). - -* The update of this file MUST be approved by [Winlin](https://github.com/winlinvip) and 3+ [TOC](https://github.com/ossrs/srs/blob/develop/trunk/AUTHORS.md#toc). -* Each [PullRequest](https://github.com/ossrs/srs/pulls) MUST be approved by 2+ [TOC](https://github.com/ossrs/srs/blob/develop/trunk/AUTHORS.md#toc) or [Developers](https://github.com/ossrs/srs/blob/develop/trunk/AUTHORS.md#developers). -* The name of TOC will be listed at [README](https://github.com/ossrs/srs#authors) forever. - -All [contributors](https://github.com/ossrs/srs/blob/develop/trunk/AUTHORS.md#contributors) are listed in SRS authors. - diff --git a/README.md b/README.md index 2ebe47cad..6b9147f0c 100755 --- a/README.md +++ b/README.md @@ -1,35 +1,11 @@ -# SRS(Simple Realtime Server) +# NPL ITP Intranet Livestream Server -![](http://ossrs.net/gif/v1/sls.gif?site=github.com&path=/srs/develop) -[![](https://github.com/ossrs/srs/actions/workflows/codeql-analysis.yml/badge.svg?branch=develop)](https://github.com/ossrs/srs/actions?query=workflow%3ACodeQL+branch%3Adevelop) -[![](https://github.com/ossrs/srs/actions/workflows/release.yml/badge.svg)](https://github.com/ossrs/srs/actions/workflows/release.yml?query=workflow%3ARelease) -[![](https://github.com/ossrs/srs/actions/workflows/test.yml/badge.svg?branch=develop)](https://github.com/ossrs/srs/actions?query=workflow%3ATest+branch%3Adevelop) -[![](https://codecov.io/gh/ossrs/srs/branch/develop/graph/badge.svg?token=Zx2LhdtA39)](https://app.codecov.io/gh/ossrs/srs/tree/develop) -[![](https://ossrs.net/wiki/images/wechat-badge4.svg)](https://ossrs.net/lts/zh-cn/contact#discussion) -[![](https://img.shields.io/twitter/follow/srs_server?style=social)](https://twitter.com/srs_server) -[![](https://img.shields.io/badge/SRS-YouTube-red)](https://www.youtube.com/@srs_server) -[![](https://badgen.net/discord/members/yZ4BnPmHAd)](https://discord.gg/yZ4BnPmHAd) -[![](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fossrs%2Fsrs.svg?type=small)](https://app.fossa.com/projects/git%2Bgithub.com%2Fossrs%2Fsrs?ref=badge_small) -[![](https://badgen.net/badge/srs/stackoverflow/orange?icon=terminal)](https://stackoverflow.com/questions/tagged/simple-realtime-server) -[![](https://opencollective.com/srs-server/tiers/badge.svg)](https://opencollective.com/srs-server) -[![](https://img.shields.io/docker/pulls/ossrs/srs)](https://hub.docker.com/r/ossrs/srs/tags) +> This is a fork of SRS Service with additional features provided that enhance the experience of livestream in NPL. +> **COPYRIGHT (C) 2024-2025 Jason Yang Jiepeng, Jasper, HyperKNF, Hayden, NPL ITP Team, PLK, NPL** -SRS/6.0 ([Hang](https://ossrs.io/lts/en-us/product#release-60)) is a simple, high-efficiency, and real-time video server, -supporting RTMP/WebRTC/HLS/HTTP-FLV/SRT/MPEG-DASH/GB28181, Linux/Windows/macOS, X86_64/ARMv7/AARCH64/M1/RISCV/LOONGARCH/MIPS, -and essential [features](trunk/doc/Features.md#features). +## Usage (Simple Version) -[![SRS Overview](https://ossrs.net/wiki/images/SRS-SingleNode-4.0-sd.png?v=114)](https://ossrs.net/wiki/images/SRS-SingleNode-4.0-hd.png) - -> Note: For more details on the single-node architecture for SRS, please visit the following [link](https://www.figma.com/file/333POxVznQ8Wz1Rxlppn36/SRS-4.0-Server-Arch). - -SRS is licenced under [MIT](https://github.com/ossrs/srs/blob/develop/LICENSE), and some third-party libraries are -distributed under their [licenses](https://ossrs.io/lts/en-us/license). - - - -## Usage - -Please check the Getting Started guide in [English](https://ossrs.io/lts/en-us/docs/v5/doc/getting-started) +Please check the Getting Started guide in [English](https://ossrs.io/lts/en-us/docs/v5/doc/getting-started) or [Chinese](https://ossrs.net/lts/zh-cn/docs/v5/doc/getting-started). We highly recommend using SRS with docker: ```bash @@ -48,158 +24,150 @@ ffmpeg -re -i ./doc/source.flv -c copy -f flv -y rtmp://localhost/live/livestrea Alternatively, stream by [OBS](https://obsproject.com/download) using the following configuration: -* Service: `Custom` -* Server: `rtmp://localhost/live` -* Stream Key: `livestream` +- Service: `Custom` +- Server: `rtmp://localhost/live` +- Stream Key: `livestream` Play the following streams using media players: -* To play an RTMP stream with URL `rtmp://localhost/live/livestream` on [VLC player](https://www.videolan.org/), open the player, go to Media > Open Network Stream, enter the URL and click Play. -* You can play HTTP-FLV stream URL [http://localhost:8080/live/livestream.flv](http://localhost:8080/players/srs_player.html?autostart=true&stream=livestream.flv) on a webpage using the srs-player, an HTML5-based player. -* Use srs-player for playing HLS stream with URL [http://localhost:8080/live/livestream.m3u8](http://localhost:8080/players/srs_player.html?autostart=true&stream=livestream.m3u8). +- To play an RTMP stream with URL `rtmp://localhost/live/livestream` on [VLC player](https://www.videolan.org/), open the player, go to Media > Open Network Stream, enter the URL and click Play. +- You can play HTTP-FLV stream URL [http://localhost:8080/live/livestream.flv](http://localhost:8080/players/srs_player.html?autostart=true&stream=livestream.flv) on a webpage using the srs-player, an HTML5-based player. +- Use srs-player for playing HLS stream with URL [http://localhost:8080/live/livestream.m3u8](http://localhost:8080/players/srs_player.html?autostart=true&stream=livestream.m3u8). -If you'd like to use WebRTC, convert RTMP to WebRTC, or convert WebRTC to RTMP, please check out -the wiki documentation in either [English](https://ossrs.io/lts/en-us/docs/v5/doc/getting-started#webrtc) or +If you'd like to use WebRTC, convert RTMP to WebRTC, or convert WebRTC to RTMP, please check out +the wiki documentation in either [English](https://ossrs.io/lts/en-us/docs/v5/doc/getting-started#webrtc) or [Chinese](https://ossrs.net/lts/zh-cn/docs/v5/doc/getting-started#webrtc). -To learn more about RTMP, HLS, HTTP-FLV, SRT, MPEG-DASH, WebRTC protocols, clustering, -HTTP API, DVR, and transcoding, please check the documents in [English](https://ossrs.io) +To learn more about RTMP, HLS, HTTP-FLV, SRT, MPEG-DASH, WebRTC protocols, clustering, +HTTP API, DVR, and transcoding, please check the documents in [English](https://ossrs.io) or [Chinese](https://ossrs.net). -## Sponsor +## Complete User Guideline -Would you like additional assistance from us? By becoming a sponsor or backer of SRS, we can provide you -with the support you need: +### Features -* Backer: $5 per month, online text chat support through Discord. -* Sponsor: $100 per month, online text chat plus online meeting support. +Please read [FEATURES](trunk/doc/Features.md#features). -Please visit [OpenCollective](https://opencollective.com/srs-server) to become a backer or sponsor, and send -us a direct message on [Discord](https://discord.gg/yZ4BnPmHAd). We are currently providing support to the -developers listed below: +### Changelog -[![](https://opencollective.com/srs-server/backers.svg?width=800&button=false)](https://opencollective.com/srs-server) +Please read [CHANGELOG](trunk/doc/CHANGELOG.md#changelog). -At SRS, our goal is to create a free, open-source community that helps developers all over the world -build high-quality streaming and RTC platforms for their businesses. +### Performance - +Please read [PERFORMANCE](trunk/doc/PERFORMANCE.md#performance). -## Contributing +### Architecture -The [authors](trunk/AUTHORS.md#authors), [TOC(Technical Oversight Committee)](trunk/AUTHORS.md#toc), -and [contributors](trunk/AUTHORS.md#contributors) are listed [here](trunk/AUTHORS.md). The TOC members +Please read [ARCHITECTURE](trunk/doc/Architecture.md#architecture). + +### Ports + +Please read [PORTS](trunk/doc/Resources.md#ports). + +### APIs + +Please read [APIS](trunk/doc/Resources.md#apis). + +### Mirrors + +Please read [MIRRORS](trunk/doc/Resources.md#mirrors). + +### Dockers + +Please read [DOCKERS](trunk/doc/Dockers.md). + +## SRS(Simple Realtime Server) + +**Here is a short appendix introduce the official package of SRS Simple Realtime Server:** + +SRS/6.0 is a simple, high-efficiency, and real-time video server, +supporting RTMP/WebRTC/HLS/HTTP-FLV/SRT/MPEG-DASH/GB28181, Linux/Windows/macOS, X86_64/ARMv7/AARCH64/M1/RISCV/LOONGARCH/MIPS, +and essential [features](trunk/doc/Features.md#features). + +[![SRS Overview](https://ossrs.net/wiki/images/SRS-SingleNode-4.0-sd.png?v=114)](https://ossrs.net/wiki/images/SRS-SingleNode-4.0-hd.png) + +> Note: For more details on the single-node architecture for SRS, please visit the following [link](https://www.figma.com/file/333POxVznQ8Wz1Rxlppn36/SRS-4.0-Server-Arch). + +SRS is licenced under [MIT](https://github.com/ossrs/srs/blob/develop/LICENSE), and some third-party libraries are distributed under their [licenses](https://ossrs.io/lts/en-us/license). + +### Contribution to official repo of SRS + +The [authors](trunk/AUTHORS.md#authors), [TOC(Technical Oversight Committee)](trunk/AUTHORS.md#toc), +and [contributors](trunk/AUTHORS.md#contributors) are listed [here](trunk/AUTHORS.md). The TOC members who made significant contributions and maintained parts of SRS are listed below: -* [Winlin](https://github.com/winlinvip): Founder of the project, focusing on ST and Issues/PR. Responsible for architecture and maintenance. -* [ZhaoWenjie](https://github.com/wenjiegit): One of the earliest contributors, focusing on HDS and Windows. Has expertise in client technology. -* [ShiWei](https://github.com/runner365): Specializes in SRT and H.265, maintaining SRT and FLV patches for FFmpeg. An expert in codecs and FFmpeg. -* [XiaoZhihong](https://github.com/xiaozhihong): Concentrates on WebRTC/QUIC and SRT, with expertise in network QoS. Contributed to ARM on ST and was the original contributor for WebRTC. -* [WuPengqiang](https://github.com/Bepartofyou): Focused on H.265, initially contributed to the FFmpeg module in SRS for transcoding AAC with OPUS for WebRTC. -* [XiaLixin](https://github.com/xialixin): Specializes in GB28181, with expertise in live streaming and WebRTC. -* [LiPeng](https://github.com/lipeng19811218): Concentrates on WebRTC and contributes to memory management and smart pointers. -* [ChenGuanghua](https://github.com/chen-guanghua): Focused on WebRTC/QoS and introduced the Asan toolchain to SRS. -* [ChenHaibo](https://github.com/duiniuluantanqin): Specializes in GB28181 and HTTP API, contributing to patches for FFmpeg with WHIP. -* [ZhangJunqin](https://github.com/chundonglinlin): Focused on H.265, Prometheus Exporter, and API module. +- [Winlin](https://github.com/winlinvip): Founder of the project, focusing on ST and Issues/PR. Responsible for architecture and maintenance. +- [ZhaoWenjie](https://github.com/wenjiegit): One of the earliest contributors, focusing on HDS and Windows. Has expertise in client technology. +- [ShiWei](https://github.com/runner365): Specializes in SRT and H.265, maintaining SRT and FLV patches for FFmpeg. An expert in codecs and FFmpeg. +- [XiaoZhihong](https://github.com/xiaozhihong): Concentrates on WebRTC/QUIC and SRT, with expertise in network QoS. Contributed to ARM on ST and was the original contributor for WebRTC. +- [WuPengqiang](https://github.com/Bepartofyou): Focused on H.265, initially contributed to the FFmpeg module in SRS for transcoding AAC with OPUS for WebRTC. +- [XiaLixin](https://github.com/xialixin): Specializes in GB28181, with expertise in live streaming and WebRTC. +- [LiPeng](https://github.com/lipeng19811218): Concentrates on WebRTC and contributes to memory management and smart pointers. +- [ChenGuanghua](https://github.com/chen-guanghua): Focused on WebRTC/QoS and introduced the Asan toolchain to SRS. +- [ChenHaibo](https://github.com/duiniuluantanqin): Specializes in GB28181 and HTTP API, contributing to patches for FFmpeg with WHIP. +- [ZhangJunqin](https://github.com/chundonglinlin): Focused on H.265, Prometheus Exporter, and API module. A huge `THANK YOU` goes out to: -* All the [contributors](trunk/AUTHORS.md#contributors) of SRS. -* All the friends of SRS who gave [big support](https://ossrs.net/lts/zh-cn/product). -* [Genes](http://sourceforge.net/users/genes), [Mabbott](http://sourceforge.net/users/mabbott), and [Michael Talyanksy](https://github.com/michaeltalyansky) for making and sharing [State Threads](https://github.com/ossrs/state-threads/tree/srs). +- All the [contributors](trunk/AUTHORS.md#contributors) of SRS. +- All the friends of SRS who gave [big support](https://ossrs.net/lts/zh-cn/product). +- [Genes](http://sourceforge.net/users/genes), [Mabbott](http://sourceforge.net/users/mabbott), and [Michael Talyanksy](https://github.com/michaeltalyansky) for making and sharing [State Threads](https://github.com/ossrs/state-threads/tree/srs). -We're really thankful to everyone in the community for helping us find bugs and improve the project. +We're really thankful to everyone in the community for helping us find bugs and improve the project. To stay in touch and keep helping our community, please check out this [guide](https://github.com/ossrs/srs/contribute). ## LICENSE -[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fossrs%2Fsrs.svg?type=small)](https://app.fossa.com/projects/git%2Bgithub.com%2Fossrs%2Fsrs?ref=badge_small) +NPL ITP Intranet Livestream Server is a fork of SRS and also livenced under [MIT](https://github.com/PLK-NPL-ITP/livestream_server/blob/develop/LICENSE) -SRS is licenced under [MIT](https://github.com/ossrs/srs/blob/develop/LICENSE), and some third-party libraries are -distributed under their [licenses](https://ossrs.io/lts/en-us/license). - -[![](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fossrs%2Fsrs.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fossrs%2Fsrs?ref=badge_large) +SRS is licenced under [MIT](https://github.com/ossrs/srs/blob/develop/LICENSE), and some third-party libraries are distributed under their [licenses](https://ossrs.io/lts/en-us/license). ## Releases -* 2025-05-03, [Release v6.0-a2](https://github.com/ossrs/srs/releases/tag/v6.0-a2), v6.0-a2, 6.0 alpha2, v6.0.165, 169712 lines. -* 2024-09-01, [Release v6.0-a1](https://github.com/ossrs/srs/releases/tag/v6.0-a1), v6.0-a1, 6.0 alpha1, v6.0.155, 169636 lines. -* 2024-07-27, [Release v6.0-a0](https://github.com/ossrs/srs/releases/tag/v6.0-a0), v6.0-a0, 6.0 alpha0, v6.0.145, 169259 lines. -* 2024-07-04, [Release v6.0-d6](https://github.com/ossrs/srs/releases/tag/v6.0-d6), v6.0-d6, 6.0 dev6, v6.0.134, 168904 lines. -* 2024-06-15, [Release v6.0-d5](https://github.com/ossrs/srs/releases/tag/v6.0-d5), v6.0-d5, 6.0 dev5, v6.0.129, 168454 lines. -* 2024-02-15, [Release v6.0-d4](https://github.com/ossrs/srs/releases/tag/v6.0-d4), v6.0-d4, 6.0 dev4, v6.0.113, 167695 lines. -* 2023-11-19, [Release v6.0-d3](https://github.com/ossrs/srs/releases/tag/v6.0-d3), v6.0-d3, 6.0 dev3, v6.0.101, 167560 lines. -* 2023-09-28, [Release v6.0-d2](https://github.com/ossrs/srs/releases/tag/v6.0-d2), v6.0-d2, 6.0 dev2, v6.0.85, 167509 lines. -* 2023-08-31, [Release v6.0-d1](https://github.com/ossrs/srs/releases/tag/v6.0-d1), v6.0-d1, 6.0 dev1, v6.0.72, 167135 lines. -* 2023-07-09, [Release v6.0-d0](https://github.com/ossrs/srs/releases/tag/v6.0-d0), v6.0-d0, 6.0 dev0, v6.0.59, 166739 lines. -* 2024-06-15, [Release v5.0-r3](https://github.com/ossrs/srs/releases/tag/v5.0-r3), v5.0-r3, 5.0 release3, v5.0.213, 163585 lines. -* 2024-04-03, [Release v5.0-r2](https://github.com/ossrs/srs/releases/tag/v5.0-r2), v5.0-r2, 5.0 release2, v5.0.210, 163515 lines. -* 2024-02-15, [Release v5.0-r1](https://github.com/ossrs/srs/releases/tag/v5.0-r1), v5.0-r1, 5.0 release1, v5.0.208, 163441 lines. -* 2023-12-30, [Release v5.0-r0](https://github.com/ossrs/srs/releases/tag/v5.0-r0), v5.0-r0, 5.0 release0, v5.0.205, 163363 lines. -* 2023-11-19, [Release v5.0-b7](https://github.com/ossrs/srs/releases/tag/v5.0-b7), v5.0-b7, 5.0 beta7, v5.0.200, 163305 lines. -* 2023-10-25, [Release v5.0-b6](https://github.com/ossrs/srs/releases/tag/v5.0-b6), v5.0-b6, 5.0 beta6, v5.0.195, 163303 lines. -* 2023-09-28, [Release v5.0-b5](https://github.com/ossrs/srs/releases/tag/v5.0-b5), v5.0-b5, 5.0 beta5, v5.0.185, 163254 lines. -* 2023-08-31, [Release v5.0-b4](https://github.com/ossrs/srs/releases/tag/v5.0-b4), v5.0-b4, 5.0 beta4, v5.0.176, 162919 lines. -* 2023-08-02, [Release v5.0-b3](https://github.com/ossrs/srs/releases/tag/v5.0-b3), v5.0-b3, 5.0 beta3, v5.0.170, 162704 lines. -* 2023-07-09, [Release v5.0-b2](https://github.com/ossrs/srs/releases/tag/v5.0-b2), v5.0-b2, 5.0 beta2, v5.0.166, 162520 lines. -* 2023-06-11, [Release v5.0-b1](https://github.com/ossrs/srs/releases/tag/v5.0-b1), v5.0-b1, 5.0 beta1, v5.0.157, 162494 lines. -* 2023-05-14, [Release v5.0-b0](https://github.com/ossrs/srs/releases/tag/v5.0-b0), v5.0-b0, 5.0 beta0, v5.0.155, 162600 lines. -* 2023-03-23, [Release v5.0-a5](https://github.com/ossrs/srs/releases/tag/v5.0-a5), v5.0-a5, 5.0 alpha5, v5.0.148, 162066 lines. -* 2023-02-12, [Release v5.0-a4](https://github.com/ossrs/srs/releases/tag/v5.0-a4), v5.0-a4, 5.0 alpha4, v5.0.141, 161897 lines. -* 2023-01-02, [Release v5.0-a3](https://github.com/ossrs/srs/releases/tag/v5.0-a3), v5.0-a3, 5.0 alpha3, v5.0.128, 161327 lines. -* 2022-12-18, [Release v5.0-a2](https://github.com/ossrs/srs/releases/tag/v5.0-a2), v5.0-a2, 5.0 alpha2, v5.0.112, 161233 lines. -* 2022-12-01, [Release v5.0-a1](https://github.com/ossrs/srs/releases/tag/v5.0-a1), v5.0-a1, 5.0 alpha1, v5.0.100, 160817 lines. -* 2022-11-25, [Release v5.0-a0](https://github.com/ossrs/srs/releases/tag/v5.0-a0), v5.0-a0, 5.0 alpha0, v5.0.98, 159813 lines. -* 2022-11-22, Release [v4.0-r4](https://github.com/ossrs/srs/releases/tag/v4.0-r4), v4.0-r4, 4.0 release4, v4.0.268, 145482 lines. -* 2022-09-16, Release [v4.0-r3](https://github.com/ossrs/srs/releases/tag/v4.0-r3), v4.0-r3, 4.0 release3, v4.0.265, 145328 lines. -* 2022-08-24, Release [v4.0-r2](https://github.com/ossrs/srs/releases/tag/v4.0-r2), v4.0-r2, 4.0 release2, v4.0.257, 144890 lines. -* 2022-06-29, Release [v4.0-r1](https://github.com/ossrs/srs/releases/tag/v4.0-r1), v4.0-r1, 4.0 release1, v4.0.253, 144680 lines. -* 2022-06-11, Release [v4.0-r0](https://github.com/ossrs/srs/releases/tag/v4.0-r0), v4.0-r0, 4.0 release0, v4.0.252, 144680 lines. -* 2020-06-27, [Release v3.0-r0](https://github.com/ossrs/srs/releases/tag/v3.0-r0), 3.0 release0, 3.0.141, 122674 lines. -* 2020-02-02, [Release v3.0-b0](https://github.com/ossrs/srs/releases/tag/v3.0-b0), 3.0 beta0, 3.0.112, 121709 lines. -* 2019-10-04, [Release v3.0-a0](https://github.com/ossrs/srs/releases/tag/v3.0-a0), 3.0 alpha0, 3.0.56, 107946 lines. -* 2017-03-03, [Release v2.0-r0](https://github.com/ossrs/srs/releases/tag/v2.0-r0), 2.0 release0, 2.0.234, 86373 lines. -* 2016-08-06, [Release v2.0-b0](https://github.com/ossrs/srs/releases/tag/v2.0-b0), 2.0 beta0, 2.0.210, 89704 lines. -* 2015-08-23, [Release v2.0-a0](https://github.com/ossrs/srs/releases/tag/v2.0-a0), 2.0 alpha0, 2.0.185, 89022 lines. -* 2014-12-05, [Release v1.0-r0](https://github.com/ossrs/srs/releases/tag/v1.0-r0), all bug fixed, 1.0.10, 59391 lines. -* 2014-10-09, [Release v0.9.8](https://github.com/ossrs/srs/releases/tag/v0.9.8), all bug fixed, 1.0.0, 59316 lines. -* 2014-04-07, [Release v0.9.1](https://github.com/ossrs/srs/releases/tag/v0.9.1), live streaming. 30000 lines. -* 2013-10-23, [Release v0.1.0](https://github.com/ossrs/srs/releases/tag/v0.1.0), rtmp. 8287 lines. -* 2013-10-17, Created. - -## Features - -Please read [FEATURES](trunk/doc/Features.md#features). - - -## Changelog - -Please read [CHANGELOG](trunk/doc/CHANGELOG.md#changelog). - -## Performance - -Please read [PERFORMANCE](trunk/doc/PERFORMANCE.md#performance). - -## Architecture - -Please read [ARCHITECTURE](trunk/doc/Architecture.md#architecture). - -## Ports - -Please read [PORTS](trunk/doc/Resources.md#ports). - -## APIs - -Please read [APIS](trunk/doc/Resources.md#apis). - -## Mirrors - -Please read [MIRRORS](trunk/doc/Resources.md#mirrors). - -## Dockers - -Please read [DOCKERS](trunk/doc/Dockers.md). - -Beijing, 2013.10
-Winlin +Bold text is the release from the contribution of NPL ITP Development Group! +- **2025-05-13, [Release v6.0.166.2b](), v6.** +- 2025-05-03, [Release v6.0-a2](https://github.com/ossrs/srs/releases/tag/v6.0-a2), v6.0-a2, 6.0 alpha2, v6.0.165, 169712 lines. +- 2024-09-01, [Release v6.0-a1](https://github.com/ossrs/srs/releases/tag/v6.0-a1), v6.0-a1, 6.0 alpha1, v6.0.155, 169636 lines. +- 2024-07-27, [Release v6.0-a0](https://github.com/ossrs/srs/releases/tag/v6.0-a0), v6.0-a0, 6.0 alpha0, v6.0.145, 169259 lines. +- 2024-07-04, [Release v6.0-d6](https://github.com/ossrs/srs/releases/tag/v6.0-d6), v6.0-d6, 6.0 dev6, v6.0.134, 168904 lines. +- 2024-06-15, [Release v6.0-d5](https://github.com/ossrs/srs/releases/tag/v6.0-d5), v6.0-d5, 6.0 dev5, v6.0.129, 168454 lines. +- 2024-02-15, [Release v6.0-d4](https://github.com/ossrs/srs/releases/tag/v6.0-d4), v6.0-d4, 6.0 dev4, v6.0.113, 167695 lines. +- 2023-11-19, [Release v6.0-d3](https://github.com/ossrs/srs/releases/tag/v6.0-d3), v6.0-d3, 6.0 dev3, v6.0.101, 167560 lines. +- 2023-09-28, [Release v6.0-d2](https://github.com/ossrs/srs/releases/tag/v6.0-d2), v6.0-d2, 6.0 dev2, v6.0.85, 167509 lines. +- 2023-08-31, [Release v6.0-d1](https://github.com/ossrs/srs/releases/tag/v6.0-d1), v6.0-d1, 6.0 dev1, v6.0.72, 167135 lines. +- 2023-07-09, [Release v6.0-d0](https://github.com/ossrs/srs/releases/tag/v6.0-d0), v6.0-d0, 6.0 dev0, v6.0.59, 166739 lines. +- 2024-06-15, [Release v5.0-r3](https://github.com/ossrs/srs/releases/tag/v5.0-r3), v5.0-r3, 5.0 release3, v5.0.213, 163585 lines. +- 2024-04-03, [Release v5.0-r2](https://github.com/ossrs/srs/releases/tag/v5.0-r2), v5.0-r2, 5.0 release2, v5.0.210, 163515 lines. +- 2024-02-15, [Release v5.0-r1](https://github.com/ossrs/srs/releases/tag/v5.0-r1), v5.0-r1, 5.0 release1, v5.0.208, 163441 lines. +- 2023-12-30, [Release v5.0-r0](https://github.com/ossrs/srs/releases/tag/v5.0-r0), v5.0-r0, 5.0 release0, v5.0.205, 163363 lines. +- 2023-11-19, [Release v5.0-b7](https://github.com/ossrs/srs/releases/tag/v5.0-b7), v5.0-b7, 5.0 beta7, v5.0.200, 163305 lines. +- 2023-10-25, [Release v5.0-b6](https://github.com/ossrs/srs/releases/tag/v5.0-b6), v5.0-b6, 5.0 beta6, v5.0.195, 163303 lines. +- 2023-09-28, [Release v5.0-b5](https://github.com/ossrs/srs/releases/tag/v5.0-b5), v5.0-b5, 5.0 beta5, v5.0.185, 163254 lines. +- 2023-08-31, [Release v5.0-b4](https://github.com/ossrs/srs/releases/tag/v5.0-b4), v5.0-b4, 5.0 beta4, v5.0.176, 162919 lines. +- 2023-08-02, [Release v5.0-b3](https://github.com/ossrs/srs/releases/tag/v5.0-b3), v5.0-b3, 5.0 beta3, v5.0.170, 162704 lines. +- 2023-07-09, [Release v5.0-b2](https://github.com/ossrs/srs/releases/tag/v5.0-b2), v5.0-b2, 5.0 beta2, v5.0.166, 162520 lines. +- 2023-06-11, [Release v5.0-b1](https://github.com/ossrs/srs/releases/tag/v5.0-b1), v5.0-b1, 5.0 beta1, v5.0.157, 162494 lines. +- 2023-05-14, [Release v5.0-b0](https://github.com/ossrs/srs/releases/tag/v5.0-b0), v5.0-b0, 5.0 beta0, v5.0.155, 162600 lines. +- 2023-03-23, [Release v5.0-a5](https://github.com/ossrs/srs/releases/tag/v5.0-a5), v5.0-a5, 5.0 alpha5, v5.0.148, 162066 lines. +- 2023-02-12, [Release v5.0-a4](https://github.com/ossrs/srs/releases/tag/v5.0-a4), v5.0-a4, 5.0 alpha4, v5.0.141, 161897 lines. +- 2023-01-02, [Release v5.0-a3](https://github.com/ossrs/srs/releases/tag/v5.0-a3), v5.0-a3, 5.0 alpha3, v5.0.128, 161327 lines. +- 2022-12-18, [Release v5.0-a2](https://github.com/ossrs/srs/releases/tag/v5.0-a2), v5.0-a2, 5.0 alpha2, v5.0.112, 161233 lines. +- 2022-12-01, [Release v5.0-a1](https://github.com/ossrs/srs/releases/tag/v5.0-a1), v5.0-a1, 5.0 alpha1, v5.0.100, 160817 lines. +- 2022-11-25, [Release v5.0-a0](https://github.com/ossrs/srs/releases/tag/v5.0-a0), v5.0-a0, 5.0 alpha0, v5.0.98, 159813 lines. +- 2022-11-22, Release [v4.0-r4](https://github.com/ossrs/srs/releases/tag/v4.0-r4), v4.0-r4, 4.0 release4, v4.0.268, 145482 lines. +- 2022-09-16, Release [v4.0-r3](https://github.com/ossrs/srs/releases/tag/v4.0-r3), v4.0-r3, 4.0 release3, v4.0.265, 145328 lines. +- 2022-08-24, Release [v4.0-r2](https://github.com/ossrs/srs/releases/tag/v4.0-r2), v4.0-r2, 4.0 release2, v4.0.257, 144890 lines. +- 2022-06-29, Release [v4.0-r1](https://github.com/ossrs/srs/releases/tag/v4.0-r1), v4.0-r1, 4.0 release1, v4.0.253, 144680 lines. +- 2022-06-11, Release [v4.0-r0](https://github.com/ossrs/srs/releases/tag/v4.0-r0), v4.0-r0, 4.0 release0, v4.0.252, 144680 lines. +- 2020-06-27, [Release v3.0-r0](https://github.com/ossrs/srs/releases/tag/v3.0-r0), 3.0 release0, 3.0.141, 122674 lines. +- 2020-02-02, [Release v3.0-b0](https://github.com/ossrs/srs/releases/tag/v3.0-b0), 3.0 beta0, 3.0.112, 121709 lines. +- 2019-10-04, [Release v3.0-a0](https://github.com/ossrs/srs/releases/tag/v3.0-a0), 3.0 alpha0, 3.0.56, 107946 lines. +- 2017-03-03, [Release v2.0-r0](https://github.com/ossrs/srs/releases/tag/v2.0-r0), 2.0 release0, 2.0.234, 86373 lines. +- 2016-08-06, [Release v2.0-b0](https://github.com/ossrs/srs/releases/tag/v2.0-b0), 2.0 beta0, 2.0.210, 89704 lines. +- 2015-08-23, [Release v2.0-a0](https://github.com/ossrs/srs/releases/tag/v2.0-a0), 2.0 alpha0, 2.0.185, 89022 lines. +- 2014-12-05, [Release v1.0-r0](https://github.com/ossrs/srs/releases/tag/v1.0-r0), all bug fixed, 1.0.10, 59391 lines. +- 2014-10-09, [Release v0.9.8](https://github.com/ossrs/srs/releases/tag/v0.9.8), all bug fixed, 1.0.0, 59316 lines. +- 2014-04-07, [Release v0.9.1](https://github.com/ossrs/srs/releases/tag/v0.9.1), live streaming. 30000 lines. +- 2013-10-23, [Release v0.1.0](https://github.com/ossrs/srs/releases/tag/v0.1.0), rtmp. 8287 lines. +- 2013-10-17, Created. diff --git a/SECURITY.md b/SECURITY.md deleted file mode 100644 index 91045ff9f..000000000 --- a/SECURITY.md +++ /dev/null @@ -1,8 +0,0 @@ -# Security Policy - -We appreciate work to discover security vulnerabilities, but as SRS is entirely volunteer driven, -so we might not be able to respond to issues in time. - -Please click [here](https://github.com/ossrs/srs/security/advisories) to report a vulnerability. - - diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 000000000..b3e4d2df2 --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,28 @@ +name: OSSR-SRS + +services: + srs: + container_name: SRS-Streaming-Server + # image: ossrs/srs:v6.0.166 + # image: itprefects/srs:v6.0.166.1h + image: itprefects/srs:v6.0.166.2b + restart: unless-stopped + environment: + - SRS_DAEMON=off + - SRS_IN_DOCKER=on + - CANDIDATE=127.0.0.1 + working_dir: /usr/local/srs + ports: + - "10080:10080/udp" + - "1935:1935" + - "1985:1985" + - "1990:1990" + - "5060:5060" + - "8000:8000/udp" + - "8080:8080" + - "8088:8088" + - "9000:9000" + volumes: + - ./docker_data/config:/usr/local/srs/conf + - ./docker_data/DVR_Record:/usr/local/srs/DVR_Record + - ./docker_data/objects:/usr/local/srs/objs diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..1ea8fb6d4 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,27 @@ +{ + "name": "livestream_server", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "prettier": "^3.5.3" + } + }, + "node_modules/prettier": { + "version": "3.5.3", + "resolved": "https://mirrors.huaweicloud.com/repository/npm/prettier/-/prettier-3.5.3.tgz", + "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 000000000..1b53ca166 --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "devDependencies": { + "prettier": "^3.5.3" + } +} diff --git a/trunk/AUTHORS.md b/trunk/AUTHORS.md deleted file mode 100644 index 2426c9930..000000000 --- a/trunk/AUTHORS.md +++ /dev/null @@ -1,173 +0,0 @@ -## AUTHORS - -The authors and administrators of SRS, ordered by first contribution: - -- `Winlin` -- `XiaoZhihong` - -## TOC - -The TOC(Technical Oversight Committee), ordered by first contribution: - -- `Winlin` -- `ZhaoWenjie` -- `ShiWei` -- `XiaoZhihong` -- `WuPengqiang` -- `XiaLixin` -- `LiPeng` -- `ChenGuanghua` -- `ChenHaibo` -- `ZhangJunqin` - -## CONTRIBUTORS - -CONTRIBUTORS ordered by first contribution. - -* `Winlin` -* `Winlin` -* `Winlin` -* `ZhaoWenjie` -* `ZhaoWenjie<740936897@qq.com>` -* `ZhaoWenjie` -* `xiangcheng.liu` -* `naijia.liu` -* `alcoholyi` -* `byteman` -* `chad.wang` -* `suhetao` -* `Johnny` -* `karthikeyan` -* `StevenLiu` -* `StevenLiu` -* `StevenLiu` -* `zhengfl` -* `tufang14` -* `allspace` -* `niesongsong` -* `rudeb0t` -* `CallMeNP` -* `synote` -* `lovecat` -* `panda1986<542638787@qq.com>` -* `YueHonghui` -* `ThomasDreibholz` -* `JuntaoLiu` -* `RocFang` -* `MakarovYaroslav` -* `MirkoVelic` -* `HuiZhang(huzhang2)` -* `OtterWa` -* `walkermi<172192667@qq.com>` -* `haofz` -* `ME_Kun_Han` -* `ljx0305` -* `cenxinwei` -* `StarBrilliant` -* `xubin` -* `intliang` -* `flowerwrong` -* `YLX<568414379@qq.com>` -* `J` -* `Harlan` -* `hankun` -* `JonathanBarratt` -* `KeeganH` -* `liuxc0116` -* `ChengdongZhang` -* `lovacat` -* `qiang.li` -* `HungMingWu` -* `Himer` -* `XiaLixin` -* `XiaLixin<68469352@qq.com>` -* `XiaLixin` -* `XiaLixin` -* `alphonsetai` -* `Michael.Ma` -* `lam2003` -* `ShiWei` -* `ShiWei` -* `ShiWei` -* `XiaofengWang` -* `XiaoZhihong` -* `XiaoZhihong` -* `XiaoZhihong` -* `yanghuiwen` -* `WuPengqiang<309554135@qq.com>` -* `WuPengqiang` -* `l<22312935+lam2003@users.noreply.github.com>` -* `xfalcon` -* `ChenGuanghua` -* `ChenGuanghua` -* `LiPeng` -* `LiPeng` -* `yajun18` -* `liulichuan` -* `yapingcat` -* `chenchengbin` -* `ChenHaibo<495810242@qq.com>` -* `ChenHaibo` -* `jasongwq` -* `yinjiaoyuan` -* `PieerePi` -* `JesseXi` -* `PieerePi<40780488+PieerePi@users.noreply.github.com>` -* `ghostsf` -* `xbpeng121<53243357+xbpeng121@users.noreply.github.com>` -* `Johzzy` -* `stone` -* `cfw11<34058899+cfw11@users.noreply.github.com>` -* `Hung-YiChen` -* `long` -* `matthew1838<77285055+matthew1838@users.noreply.github.com>` -* `rise` -* `pyw` -* `MatheusMacabu` -* `Alex.CR` -* `Zhouxiaojun2008<279686030@qq.com>` -* `Zhouxiaojun2008 <31402829+zhouxiaojun2008@users.noreply.github.com>` -* `Pengfei.ma` -* `Pengfei.ma<52305649+mapengfei53@users.noreply.github.com>` -* `ZhangJunqin` -* `ZhangJunqin` -* `AbrarAhmed<13979201+abrar71@users.noreply.github.com>` -* `BoringWednesday<2651933495@qq.com>` -* `liuxiaoliang<37902979+liuxiaoliang8@users.noreply.github.com>` -* `qingfuliao<45161976+qingfuliao@users.noreply.github.com>` -* `along` -* `akanchi` -* `HuachaoMao` -* `James` -* `lvndry` -* `马文武` -* `PurpleGrape` -* `xmedia-systems` -* `MatinZadehDolatabad` -* `zozobreakzou` -* `mingo-wu<57790355+mingo-wu1@users.noreply.github.com>` -* `CommanderRoot` -* `dev-clavis` -* `everything411` -* `faicker` -* `Matthew` -* `simon1tan1<107955289+simon1tan1@users.noreply.github.com>` -* `feng<308276366@qq.com>` -* `wangzhen` -* `yashwardhan-jyani<100014271+yashwardhan-jyani@users.noreply.github.com>` -* `qyt<486179@qq.com>` -* `Kazuo` -* `MarkCao` -* `Mr.Li` -* `Loken` -* `JacobSu` -* `terrencetang2023` -* `jb-alvarado<2212056+jb-alvarado@users.noreply.github.com>` -* `Jay<39650910+w41203208@users.noreply.github.com>` -* `Arjen10<47875127+Arjen10@users.noreply.github.com>` -* `Lukas<89481353+Lukas-Kaufmann@users.noreply.github.com>` -* `VampireAchao` -* `Laurentiu` -* `Bahamut` -* `MarcOlzheim` - diff --git a/trunk/AUTHORS.txt b/trunk/AUTHORS.txt deleted file mode 120000 index 36adef640..000000000 --- a/trunk/AUTHORS.txt +++ /dev/null @@ -1 +0,0 @@ -AUTHORS.md \ No newline at end of file diff --git a/trunk/doc/CHANGELOG.md b/trunk/doc/CHANGELOG.md index d165b6e63..d3c31a9f4 100644 --- a/trunk/doc/CHANGELOG.md +++ b/trunk/doc/CHANGELOG.md @@ -7,7 +7,6 @@ The changelog for SRS. ## SRS 7.0 Changelog -* v7.0, 2025-05-13, Merge [#4289](https://github.com/ossrs/srs/pull/4289): rtmp2rtc: Support HEVC. v7.0.33 (#4289) * v7.0, 2025-04-30, Merge [#4308](https://github.com/ossrs/srs/pull/4308): Fix memory leaks from errors skipping resource release. v7.0.32 (#4308) * v7.0, 2025-04-26, Merge [#4292](https://github.com/ossrs/srs/pull/4309): Support custom deleter for SrsUniquePtr. v7.0.31 (#4309) * v7.0, 2025-03-21, Merge [#4292](https://github.com/ossrs/srs/pull/4292): Typo: "forked" process in log output. v7.0.30 (#4292) diff --git a/trunk/doc/source.flv b/trunk/doc/source.flv deleted file mode 120000 index 32d9ecfc2..000000000 --- a/trunk/doc/source.flv +++ /dev/null @@ -1 +0,0 @@ -source.200kbps.768x320.flv \ No newline at end of file diff --git a/trunk/doc/source.flv b/trunk/doc/source.flv new file mode 100644 index 000000000..32d9ecfc2 --- /dev/null +++ b/trunk/doc/source.flv @@ -0,0 +1 @@ +source.200kbps.768x320.flv \ No newline at end of file diff --git a/trunk/research/api-server/static-dir/favicon.ico b/trunk/research/api-server/static-dir/favicon.ico deleted file mode 120000 index 251568d4d..000000000 --- a/trunk/research/api-server/static-dir/favicon.ico +++ /dev/null @@ -1 +0,0 @@ -../../favicon.ico \ No newline at end of file diff --git a/trunk/research/api-server/static-dir/favicon.ico b/trunk/research/api-server/static-dir/favicon.ico new file mode 100644 index 000000000..251568d4d --- /dev/null +++ b/trunk/research/api-server/static-dir/favicon.ico @@ -0,0 +1 @@ +../../favicon.ico \ No newline at end of file diff --git a/trunk/research/api-server/static-dir/index.html b/trunk/research/api-server/static-dir/index.html deleted file mode 120000 index c90ed45dd..000000000 --- a/trunk/research/api-server/static-dir/index.html +++ /dev/null @@ -1 +0,0 @@ -../../index.html \ No newline at end of file diff --git a/trunk/research/api-server/static-dir/index.html b/trunk/research/api-server/static-dir/index.html new file mode 100644 index 000000000..c90ed45dd --- /dev/null +++ b/trunk/research/api-server/static-dir/index.html @@ -0,0 +1 @@ +../../index.html \ No newline at end of file diff --git a/trunk/research/players/css/bootstrap.min.css b/trunk/research/players/css/bootstrap.min.css index df96c8648..d62114183 100755 --- a/trunk/research/players/css/bootstrap.min.css +++ b/trunk/research/players/css/bootstrap.min.css @@ -6,4 +6,6161 @@ * http://www.apache.org/licenses/LICENSE-2.0 * * Designed and built with all the love in the world by @mdo and @fat. - */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover,a:focus{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} + */ +.clearfix { + *zoom: 1 +} + +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: "" +} + +.clearfix:after { + clear: both +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0 +} + +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box +} + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section { + display: block +} + +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1 +} + +audio:not([controls]) { + display: none +} + +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100% +} + +a:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px +} + +a:hover, +a:active { + outline: 0 +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline +} + +sup { + top: -0.5em +} + +sub { + bottom: -0.25em +} + +img { + width: auto\9; + height: auto; + max-width: 100%; + vertical-align: middle; + border: 0; + -ms-interpolation-mode: bicubic +} + +#map_canvas img, +.google-maps img { + max-width: none +} + +button, +input, +select, +textarea { + margin: 0; + font-size: 100%; + vertical-align: middle +} + +button, +input { + *overflow: visible; + line-height: normal +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0 +} + +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; + -webkit-appearance: button +} + +label, +select, +button, +input[type="button"], +input[type="reset"], +input[type="submit"], +input[type="radio"], +input[type="checkbox"] { + cursor: pointer +} + +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield +} + +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none +} + +textarea { + overflow: auto; + vertical-align: top +} + +@media print { + * { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + box-shadow: none !important + } + + a, + a:visited { + text-decoration: underline + } + + a[href]:after { + content: " (" attr(href) ")" + } + + abbr[title]:after { + content: " (" attr(title) ")" + } + + .ir a:after, + a[href^="javascript:"]:after, + a[href^="#"]:after { + content: "" + } + + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid + } + + thead { + display: table-header-group + } + + tr, + img { + page-break-inside: avoid + } + + img { + max-width: 100% !important + } + + @page { + margin: .5cm + } + + p, + h2, + h3 { + orphans: 3; + widows: 3 + } + + h2, + h3 { + page-break-after: avoid + } +} + +body { + margin: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 20px; + color: #333; + background-color: #fff +} + +a { + color: #08c; + text-decoration: none +} + +a:hover, +a:focus { + color: #005580; + text-decoration: underline +} + +.img-rounded { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px +} + +.img-polaroid { + padding: 4px; + background-color: #fff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1) +} + +.img-circle { + -webkit-border-radius: 500px; + -moz-border-radius: 500px; + border-radius: 500px +} + +.row { + margin-left: -20px; + *zoom: 1 +} + +.row:before, +.row:after { + display: table; + line-height: 0; + content: "" +} + +.row:after { + clear: both +} + +[class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px +} + +.container, +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px +} + +.span12 { + width: 940px +} + +.span11 { + width: 860px +} + +.span10 { + width: 780px +} + +.span9 { + width: 700px +} + +.span8 { + width: 620px +} + +.span7 { + width: 540px +} + +.span6 { + width: 460px +} + +.span5 { + width: 380px +} + +.span4 { + width: 300px +} + +.span3 { + width: 220px +} + +.span2 { + width: 140px +} + +.span1 { + width: 60px +} + +.offset12 { + margin-left: 980px +} + +.offset11 { + margin-left: 900px +} + +.offset10 { + margin-left: 820px +} + +.offset9 { + margin-left: 740px +} + +.offset8 { + margin-left: 660px +} + +.offset7 { + margin-left: 580px +} + +.offset6 { + margin-left: 500px +} + +.offset5 { + margin-left: 420px +} + +.offset4 { + margin-left: 340px +} + +.offset3 { + margin-left: 260px +} + +.offset2 { + margin-left: 180px +} + +.offset1 { + margin-left: 100px +} + +.row-fluid { + width: 100%; + *zoom: 1 +} + +.row-fluid:before, +.row-fluid:after { + display: table; + line-height: 0; + content: "" +} + +.row-fluid:after { + clear: both +} + +.row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.127659574468085%; + *margin-left: 2.074468085106383%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box +} + +.row-fluid [class*="span"]:first-child { + margin-left: 0 +} + +.row-fluid .controls-row [class*="span"]+[class*="span"] { + margin-left: 2.127659574468085% +} + +.row-fluid .span12 { + width: 100%; + *width: 99.94680851063829% +} + +.row-fluid .span11 { + width: 91.48936170212765%; + *width: 91.43617021276594% +} + +.row-fluid .span10 { + width: 82.97872340425532%; + *width: 82.92553191489361% +} + +.row-fluid .span9 { + width: 74.46808510638297%; + *width: 74.41489361702126% +} + +.row-fluid .span8 { + width: 65.95744680851064%; + *width: 65.90425531914893% +} + +.row-fluid .span7 { + width: 57.44680851063829%; + *width: 57.39361702127659% +} + +.row-fluid .span6 { + width: 48.93617021276595%; + *width: 48.88297872340425% +} + +.row-fluid .span5 { + width: 40.42553191489362%; + *width: 40.37234042553192% +} + +.row-fluid .span4 { + width: 31.914893617021278%; + *width: 31.861702127659576% +} + +.row-fluid .span3 { + width: 23.404255319148934%; + *width: 23.351063829787233% +} + +.row-fluid .span2 { + width: 14.893617021276595%; + *width: 14.840425531914894% +} + +.row-fluid .span1 { + width: 6.382978723404255%; + *width: 6.329787234042553% +} + +.row-fluid .offset12 { + margin-left: 104.25531914893617%; + *margin-left: 104.14893617021275% +} + +.row-fluid .offset12:first-child { + margin-left: 102.12765957446808%; + *margin-left: 102.02127659574467% +} + +.row-fluid .offset11 { + margin-left: 95.74468085106382%; + *margin-left: 95.6382978723404% +} + +.row-fluid .offset11:first-child { + margin-left: 93.61702127659574%; + *margin-left: 93.51063829787232% +} + +.row-fluid .offset10 { + margin-left: 87.23404255319149%; + *margin-left: 87.12765957446807% +} + +.row-fluid .offset10:first-child { + margin-left: 85.1063829787234%; + *margin-left: 84.99999999999999% +} + +.row-fluid .offset9 { + margin-left: 78.72340425531914%; + *margin-left: 78.61702127659572% +} + +.row-fluid .offset9:first-child { + margin-left: 76.59574468085106%; + *margin-left: 76.48936170212764% +} + +.row-fluid .offset8 { + margin-left: 70.2127659574468%; + *margin-left: 70.10638297872339% +} + +.row-fluid .offset8:first-child { + margin-left: 68.08510638297872%; + *margin-left: 67.9787234042553% +} + +.row-fluid .offset7 { + margin-left: 61.70212765957446%; + *margin-left: 61.59574468085106% +} + +.row-fluid .offset7:first-child { + margin-left: 59.574468085106375%; + *margin-left: 59.46808510638297% +} + +.row-fluid .offset6 { + margin-left: 53.191489361702125%; + *margin-left: 53.085106382978715% +} + +.row-fluid .offset6:first-child { + margin-left: 51.063829787234035%; + *margin-left: 50.95744680851063% +} + +.row-fluid .offset5 { + margin-left: 44.68085106382979%; + *margin-left: 44.57446808510638% +} + +.row-fluid .offset5:first-child { + margin-left: 42.5531914893617%; + *margin-left: 42.4468085106383% +} + +.row-fluid .offset4 { + margin-left: 36.170212765957444%; + *margin-left: 36.06382978723405% +} + +.row-fluid .offset4:first-child { + margin-left: 34.04255319148936%; + *margin-left: 33.93617021276596% +} + +.row-fluid .offset3 { + margin-left: 27.659574468085104%; + *margin-left: 27.5531914893617% +} + +.row-fluid .offset3:first-child { + margin-left: 25.53191489361702%; + *margin-left: 25.425531914893618% +} + +.row-fluid .offset2 { + margin-left: 19.148936170212764%; + *margin-left: 19.04255319148936% +} + +.row-fluid .offset2:first-child { + margin-left: 17.02127659574468%; + *margin-left: 16.914893617021278% +} + +.row-fluid .offset1 { + margin-left: 10.638297872340425%; + *margin-left: 10.53191489361702% +} + +.row-fluid .offset1:first-child { + margin-left: 8.51063829787234%; + *margin-left: 8.404255319148938% +} + +[class*="span"].hide, +.row-fluid [class*="span"].hide { + display: none +} + +[class*="span"].pull-right, +.row-fluid [class*="span"].pull-right { + float: right +} + +.container { + margin-right: auto; + margin-left: auto; + *zoom: 1 +} + +.container:before, +.container:after { + display: table; + line-height: 0; + content: "" +} + +.container:after { + clear: both +} + +.container-fluid { + padding-right: 20px; + padding-left: 20px; + *zoom: 1 +} + +.container-fluid:before, +.container-fluid:after { + display: table; + line-height: 0; + content: "" +} + +.container-fluid:after { + clear: both +} + +p { + margin: 0 0 10px +} + +.lead { + margin-bottom: 20px; + font-size: 21px; + font-weight: 200; + line-height: 30px +} + +small { + font-size: 85% +} + +strong { + font-weight: bold +} + +em { + font-style: italic +} + +cite { + font-style: normal +} + +.muted { + color: #999 +} + +a.muted:hover, +a.muted:focus { + color: #808080 +} + +.text-warning { + color: #c09853 +} + +a.text-warning:hover, +a.text-warning:focus { + color: #a47e3c +} + +.text-error { + color: #b94a48 +} + +a.text-error:hover, +a.text-error:focus { + color: #953b39 +} + +.text-info { + color: #3a87ad +} + +a.text-info:hover, +a.text-info:focus { + color: #2d6987 +} + +.text-success { + color: #468847 +} + +a.text-success:hover, +a.text-success:focus { + color: #356635 +} + +.text-left { + text-align: left +} + +.text-right { + text-align: right +} + +.text-center { + text-align: center +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 10px 0; + font-family: inherit; + font-weight: bold; + line-height: 20px; + color: inherit; + text-rendering: optimizelegibility +} + +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small { + font-weight: normal; + line-height: 1; + color: #999 +} + +h1, +h2, +h3 { + line-height: 40px +} + +h1 { + font-size: 38.5px +} + +h2 { + font-size: 31.5px +} + +h3 { + font-size: 24.5px +} + +h4 { + font-size: 17.5px +} + +h5 { + font-size: 14px +} + +h6 { + font-size: 11.9px +} + +h1 small { + font-size: 24.5px +} + +h2 small { + font-size: 17.5px +} + +h3 small { + font-size: 14px +} + +h4 small { + font-size: 14px +} + +.page-header { + padding-bottom: 9px; + margin: 20px 0 30px; + border-bottom: 1px solid #eee +} + +ul, +ol { + padding: 0; + margin: 0 0 10px 25px +} + +ul ul, +ul ol, +ol ol, +ol ul { + margin-bottom: 0 +} + +li { + line-height: 20px +} + +ul.unstyled, +ol.unstyled { + margin-left: 0; + list-style: none +} + +ul.inline, +ol.inline { + margin-left: 0; + list-style: none +} + +ul.inline>li, +ol.inline>li { + display: inline-block; + *display: inline; + padding-right: 5px; + padding-left: 5px; + *zoom: 1 +} + +dl { + margin-bottom: 20px +} + +dt, +dd { + line-height: 20px +} + +dt { + font-weight: bold +} + +dd { + margin-left: 10px +} + +.dl-horizontal { + *zoom: 1 +} + +.dl-horizontal:before, +.dl-horizontal:after { + display: table; + line-height: 0; + content: "" +} + +.dl-horizontal:after { + clear: both +} + +.dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap +} + +.dl-horizontal dd { + margin-left: 180px +} + +hr { + margin: 20px 0; + border: 0; + border-top: 1px solid #eee; + border-bottom: 1px solid #fff +} + +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #999 +} + +abbr.initialism { + font-size: 90%; + text-transform: uppercase +} + +blockquote { + padding: 0 0 0 15px; + margin: 0 0 20px; + border-left: 5px solid #eee +} + +blockquote p { + margin-bottom: 0; + font-size: 17.5px; + font-weight: 300; + line-height: 1.25 +} + +blockquote small { + display: block; + line-height: 20px; + color: #999 +} + +blockquote small:before { + content: '\2014 \00A0' +} + +blockquote.pull-right { + float: right; + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eee; + border-left: 0 +} + +blockquote.pull-right p, +blockquote.pull-right small { + text-align: right +} + +blockquote.pull-right small:before { + content: '' +} + +blockquote.pull-right small:after { + content: '\00A0 \2014' +} + +q:before, +q:after, +blockquote:before, +blockquote:after { + content: "" +} + +address { + display: block; + margin-bottom: 20px; + font-style: normal; + line-height: 20px +} + +code, +pre { + padding: 0 3px 2px; + font-family: Monaco, Menlo, Consolas, "Courier New", monospace; + font-size: 12px; + color: #333; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px +} + +code { + padding: 2px 4px; + color: #d14; + white-space: nowrap; + background-color: #f7f7f9; + border: 1px solid #e1e1e8 +} + +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 20px; + word-break: break-all; + word-wrap: break-word; + white-space: pre; + white-space: pre-wrap; + background-color: #f5f5f5; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px +} + +pre.prettyprint { + margin-bottom: 20px +} + +pre code { + padding: 0; + color: inherit; + white-space: pre; + white-space: pre-wrap; + background-color: transparent; + border: 0 +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll +} + +form { + margin: 0 0 20px +} + +fieldset { + padding: 0; + margin: 0; + border: 0 +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: 40px; + color: #333; + border: 0; + border-bottom: 1px solid #e5e5e5 +} + +legend small { + font-size: 15px; + color: #999 +} + +label, +input, +button, +select, +textarea { + font-size: 14px; + font-weight: normal; + line-height: 20px +} + +input, +button, +select, +textarea { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif +} + +label { + display: block; + margin-bottom: 5px +} + +select, +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + display: inline-block; + height: 20px; + padding: 4px 6px; + margin-bottom: 10px; + font-size: 14px; + line-height: 20px; + color: #555; + vertical-align: middle; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px +} + +input, +textarea, +.uneditable-input { + width: 206px +} + +textarea { + height: auto +} + +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + background-color: #fff; + border: 1px solid #ccc; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border linear .2s, box-shadow linear .2s; + -moz-transition: border linear .2s, box-shadow linear .2s; + -o-transition: border linear .2s, box-shadow linear .2s; + transition: border linear .2s, box-shadow linear .2s +} + +textarea:focus, +input[type="text"]:focus, +input[type="password"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="date"]:focus, +input[type="month"]:focus, +input[type="time"]:focus, +input[type="week"]:focus, +input[type="number"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="search"]:focus, +input[type="tel"]:focus, +input[type="color"]:focus, +.uneditable-input:focus { + border-color: rgba(82, 168, 236, 0.8); + outline: 0; + outline: thin dotted \9; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6) +} + +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + *margin-top: 0; + line-height: normal +} + +input[type="file"], +input[type="image"], +input[type="submit"], +input[type="reset"], +input[type="button"], +input[type="radio"], +input[type="checkbox"] { + width: auto +} + +select, +input[type="file"] { + height: 30px; + *margin-top: 4px; + line-height: 30px +} + +select { + width: 220px; + background-color: #fff; + border: 1px solid #ccc +} + +select[multiple], +select[size] { + height: auto +} + +select:focus, +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px +} + +.uneditable-input, +.uneditable-textarea { + color: #999; + cursor: not-allowed; + background-color: #fcfcfc; + border-color: #ccc; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025) +} + +.uneditable-input { + overflow: hidden; + white-space: nowrap +} + +.uneditable-textarea { + width: auto; + height: auto +} + +input:-moz-placeholder, +textarea:-moz-placeholder { + color: #999 +} + +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + color: #999 +} + +input::-webkit-input-placeholder, +textarea::-webkit-input-placeholder { + color: #999 +} + +.radio, +.checkbox { + min-height: 20px; + padding-left: 20px +} + +.radio input[type="radio"], +.checkbox input[type="checkbox"] { + float: left; + margin-left: -20px +} + +.controls>.radio:first-child, +.controls>.checkbox:first-child { + padding-top: 5px +} + +.radio.inline, +.checkbox.inline { + display: inline-block; + padding-top: 5px; + margin-bottom: 0; + vertical-align: middle +} + +.radio.inline+.radio.inline, +.checkbox.inline+.checkbox.inline { + margin-left: 10px +} + +.input-mini { + width: 60px +} + +.input-small { + width: 90px +} + +.input-medium { + width: 150px +} + +.input-large { + width: 210px +} + +.input-xlarge { + width: 270px +} + +.input-xxlarge { + width: 530px +} + +input[class*="span"], +select[class*="span"], +textarea[class*="span"], +.uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"] { + float: none; + margin-left: 0 +} + +.input-append input[class*="span"], +.input-append .uneditable-input[class*="span"], +.input-prepend input[class*="span"], +.input-prepend .uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"], +.row-fluid .input-prepend [class*="span"], +.row-fluid .input-append [class*="span"] { + display: inline-block +} + +input, +textarea, +.uneditable-input { + margin-left: 0 +} + +.controls-row [class*="span"]+[class*="span"] { + margin-left: 20px +} + +input.span12, +textarea.span12, +.uneditable-input.span12 { + width: 926px +} + +input.span11, +textarea.span11, +.uneditable-input.span11 { + width: 846px +} + +input.span10, +textarea.span10, +.uneditable-input.span10 { + width: 766px +} + +input.span9, +textarea.span9, +.uneditable-input.span9 { + width: 686px +} + +input.span8, +textarea.span8, +.uneditable-input.span8 { + width: 606px +} + +input.span7, +textarea.span7, +.uneditable-input.span7 { + width: 526px +} + +input.span6, +textarea.span6, +.uneditable-input.span6 { + width: 446px +} + +input.span5, +textarea.span5, +.uneditable-input.span5 { + width: 366px +} + +input.span4, +textarea.span4, +.uneditable-input.span4 { + width: 286px +} + +input.span3, +textarea.span3, +.uneditable-input.span3 { + width: 206px +} + +input.span2, +textarea.span2, +.uneditable-input.span2 { + width: 126px +} + +input.span1, +textarea.span1, +.uneditable-input.span1 { + width: 46px +} + +.controls-row { + *zoom: 1 +} + +.controls-row:before, +.controls-row:after { + display: table; + line-height: 0; + content: "" +} + +.controls-row:after { + clear: both +} + +.controls-row [class*="span"], +.row-fluid .controls-row [class*="span"] { + float: left +} + +.controls-row .checkbox[class*="span"], +.controls-row .radio[class*="span"] { + padding-top: 5px +} + +input[disabled], +select[disabled], +textarea[disabled], +input[readonly], +select[readonly], +textarea[readonly] { + cursor: not-allowed; + background-color: #eee +} + +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"][readonly], +input[type="checkbox"][readonly] { + background-color: transparent +} + +.control-group.warning .control-label, +.control-group.warning .help-block, +.control-group.warning .help-inline { + color: #c09853 +} + +.control-group.warning .checkbox, +.control-group.warning .radio, +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + color: #c09853 +} + +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + border-color: #c09853; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075) +} + +.control-group.warning input:focus, +.control-group.warning select:focus, +.control-group.warning textarea:focus { + border-color: #a47e3c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e +} + +.control-group.warning .input-prepend .add-on, +.control-group.warning .input-append .add-on { + color: #c09853; + background-color: #fcf8e3; + border-color: #c09853 +} + +.control-group.error .control-label, +.control-group.error .help-block, +.control-group.error .help-inline { + color: #b94a48 +} + +.control-group.error .checkbox, +.control-group.error .radio, +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + color: #b94a48 +} + +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + border-color: #b94a48; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075) +} + +.control-group.error input:focus, +.control-group.error select:focus, +.control-group.error textarea:focus { + border-color: #953b39; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392 +} + +.control-group.error .input-prepend .add-on, +.control-group.error .input-append .add-on { + color: #b94a48; + background-color: #f2dede; + border-color: #b94a48 +} + +.control-group.success .control-label, +.control-group.success .help-block, +.control-group.success .help-inline { + color: #468847 +} + +.control-group.success .checkbox, +.control-group.success .radio, +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + color: #468847 +} + +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + border-color: #468847; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075) +} + +.control-group.success input:focus, +.control-group.success select:focus, +.control-group.success textarea:focus { + border-color: #356635; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b +} + +.control-group.success .input-prepend .add-on, +.control-group.success .input-append .add-on { + color: #468847; + background-color: #dff0d8; + border-color: #468847 +} + +.control-group.info .control-label, +.control-group.info .help-block, +.control-group.info .help-inline { + color: #3a87ad +} + +.control-group.info .checkbox, +.control-group.info .radio, +.control-group.info input, +.control-group.info select, +.control-group.info textarea { + color: #3a87ad +} + +.control-group.info input, +.control-group.info select, +.control-group.info textarea { + border-color: #3a87ad; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075) +} + +.control-group.info input:focus, +.control-group.info select:focus, +.control-group.info textarea:focus { + border-color: #2d6987; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3 +} + +.control-group.info .input-prepend .add-on, +.control-group.info .input-append .add-on { + color: #3a87ad; + background-color: #d9edf7; + border-color: #3a87ad +} + +input:focus:invalid, +textarea:focus:invalid, +select:focus:invalid { + color: #b94a48; + border-color: #ee5f5b +} + +input:focus:invalid:focus, +textarea:focus:invalid:focus, +select:focus:invalid:focus { + border-color: #e9322d; + -webkit-box-shadow: 0 0 6px #f8b9b7; + -moz-box-shadow: 0 0 6px #f8b9b7; + box-shadow: 0 0 6px #f8b9b7 +} + +.form-actions { + padding: 19px 20px 20px; + margin-top: 20px; + margin-bottom: 20px; + background-color: #f5f5f5; + border-top: 1px solid #e5e5e5; + *zoom: 1 +} + +.form-actions:before, +.form-actions:after { + display: table; + line-height: 0; + content: "" +} + +.form-actions:after { + clear: both +} + +.help-block, +.help-inline { + color: #595959 +} + +.help-block { + display: block; + margin-bottom: 10px +} + +.help-inline { + display: inline-block; + *display: inline; + padding-left: 5px; + vertical-align: middle; + *zoom: 1 +} + +.input-append, +.input-prepend { + display: inline-block; + margin-bottom: 10px; + font-size: 0; + white-space: nowrap; + vertical-align: middle +} + +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input, +.input-append .dropdown-menu, +.input-prepend .dropdown-menu, +.input-append .popover, +.input-prepend .popover { + font-size: 14px +} + +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input { + position: relative; + margin-bottom: 0; + *margin-left: 0; + vertical-align: top; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0 +} + +.input-append input:focus, +.input-prepend input:focus, +.input-append select:focus, +.input-prepend select:focus, +.input-append .uneditable-input:focus, +.input-prepend .uneditable-input:focus { + z-index: 2 +} + +.input-append .add-on, +.input-prepend .add-on { + display: inline-block; + width: auto; + height: 20px; + min-width: 16px; + padding: 4px 5px; + font-size: 14px; + font-weight: normal; + line-height: 20px; + text-align: center; + text-shadow: 0 1px 0 #fff; + background-color: #eee; + border: 1px solid #ccc +} + +.input-append .add-on, +.input-prepend .add-on, +.input-append .btn, +.input-prepend .btn, +.input-append .btn-group>.dropdown-toggle, +.input-prepend .btn-group>.dropdown-toggle { + vertical-align: top; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0 +} + +.input-append .active, +.input-prepend .active { + background-color: #a9dba9; + border-color: #46a546 +} + +.input-prepend .add-on, +.input-prepend .btn { + margin-right: -1px +} + +.input-prepend .add-on:first-child, +.input-prepend .btn:first-child { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px +} + +.input-append input, +.input-append select, +.input-append .uneditable-input { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px +} + +.input-append input+.btn-group .btn:last-child, +.input-append select+.btn-group .btn:last-child, +.input-append .uneditable-input+.btn-group .btn:last-child { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0 +} + +.input-append .add-on, +.input-append .btn, +.input-append .btn-group { + margin-left: -1px +} + +.input-append .add-on:last-child, +.input-append .btn:last-child, +.input-append .btn-group:last-child>.dropdown-toggle { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0 +} + +.input-prepend.input-append input, +.input-prepend.input-append select, +.input-prepend.input-append .uneditable-input { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0 +} + +.input-prepend.input-append input+.btn-group .btn, +.input-prepend.input-append select+.btn-group .btn, +.input-prepend.input-append .uneditable-input+.btn-group .btn { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0 +} + +.input-prepend.input-append .add-on:first-child, +.input-prepend.input-append .btn:first-child { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px +} + +.input-prepend.input-append .add-on:last-child, +.input-prepend.input-append .btn:last-child { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0 +} + +.input-prepend.input-append .btn-group:first-child { + margin-left: 0 +} + +input.search-query { + padding-right: 14px; + padding-right: 4px \9; + padding-left: 14px; + padding-left: 4px \9; + margin-bottom: 0; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px +} + +.form-search .input-append .search-query, +.form-search .input-prepend .search-query { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0 +} + +.form-search .input-append .search-query { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px +} + +.form-search .input-append .btn { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0 +} + +.form-search .input-prepend .search-query { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0 +} + +.form-search .input-prepend .btn { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px +} + +.form-search input, +.form-inline input, +.form-horizontal input, +.form-search textarea, +.form-inline textarea, +.form-horizontal textarea, +.form-search select, +.form-inline select, +.form-horizontal select, +.form-search .help-inline, +.form-inline .help-inline, +.form-horizontal .help-inline, +.form-search .uneditable-input, +.form-inline .uneditable-input, +.form-horizontal .uneditable-input, +.form-search .input-prepend, +.form-inline .input-prepend, +.form-horizontal .input-prepend, +.form-search .input-append, +.form-inline .input-append, +.form-horizontal .input-append { + display: inline-block; + *display: inline; + margin-bottom: 0; + vertical-align: middle; + *zoom: 1 +} + +.form-search .hide, +.form-inline .hide, +.form-horizontal .hide { + display: none +} + +.form-search label, +.form-inline label, +.form-search .btn-group, +.form-inline .btn-group { + display: inline-block +} + +.form-search .input-append, +.form-inline .input-append, +.form-search .input-prepend, +.form-inline .input-prepend { + margin-bottom: 0 +} + +.form-search .radio, +.form-search .checkbox, +.form-inline .radio, +.form-inline .checkbox { + padding-left: 0; + margin-bottom: 0; + vertical-align: middle +} + +.form-search .radio input[type="radio"], +.form-search .checkbox input[type="checkbox"], +.form-inline .radio input[type="radio"], +.form-inline .checkbox input[type="checkbox"] { + float: left; + margin-right: 3px; + margin-left: 0 +} + +.control-group { + margin-bottom: 10px +} + +legend+.control-group { + margin-top: 20px; + -webkit-margin-top-collapse: separate +} + +.form-horizontal .control-group { + margin-bottom: 20px; + *zoom: 1 +} + +.form-horizontal .control-group:before, +.form-horizontal .control-group:after { + display: table; + line-height: 0; + content: "" +} + +.form-horizontal .control-group:after { + clear: both +} + +.form-horizontal .control-label { + float: left; + width: 160px; + padding-top: 5px; + text-align: right +} + +.form-horizontal .controls { + *display: inline-block; + *padding-left: 20px; + margin-left: 180px; + *margin-left: 0 +} + +.form-horizontal .controls:first-child { + *padding-left: 180px +} + +.form-horizontal .help-block { + margin-bottom: 0 +} + +.form-horizontal input+.help-block, +.form-horizontal select+.help-block, +.form-horizontal textarea+.help-block, +.form-horizontal .uneditable-input+.help-block, +.form-horizontal .input-prepend+.help-block, +.form-horizontal .input-append+.help-block { + margin-top: 10px +} + +.form-horizontal .form-actions { + padding-left: 180px +} + +table { + max-width: 100%; + background-color: transparent; + border-collapse: collapse; + border-spacing: 0 +} + +.table { + width: 100%; + margin-bottom: 20px +} + +.table th, +.table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #ddd +} + +.table th { + font-weight: bold +} + +.table thead th { + vertical-align: bottom +} + +.table caption+thead tr:first-child th, +.table caption+thead tr:first-child td, +.table colgroup+thead tr:first-child th, +.table colgroup+thead tr:first-child td, +.table thead:first-child tr:first-child th, +.table thead:first-child tr:first-child td { + border-top: 0 +} + +.table tbody+tbody { + border-top: 2px solid #ddd +} + +.table .table { + background-color: #fff +} + +.table-condensed th, +.table-condensed td { + padding: 4px 5px +} + +.table-bordered { + border: 1px solid #ddd; + border-collapse: separate; + *border-collapse: collapse; + border-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px +} + +.table-bordered th, +.table-bordered td { + border-left: 1px solid #ddd +} + +.table-bordered caption+thead tr:first-child th, +.table-bordered caption+tbody tr:first-child th, +.table-bordered caption+tbody tr:first-child td, +.table-bordered colgroup+thead tr:first-child th, +.table-bordered colgroup+tbody tr:first-child th, +.table-bordered colgroup+tbody tr:first-child td, +.table-bordered thead:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child td { + border-top: 0 +} + +.table-bordered thead:first-child tr:first-child>th:first-child, +.table-bordered tbody:first-child tr:first-child>td:first-child, +.table-bordered tbody:first-child tr:first-child>th:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px +} + +.table-bordered thead:first-child tr:first-child>th:last-child, +.table-bordered tbody:first-child tr:first-child>td:last-child, +.table-bordered tbody:first-child tr:first-child>th:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px +} + +.table-bordered thead:last-child tr:last-child>th:first-child, +.table-bordered tbody:last-child tr:last-child>td:first-child, +.table-bordered tbody:last-child tr:last-child>th:first-child, +.table-bordered tfoot:last-child tr:last-child>td:first-child, +.table-bordered tfoot:last-child tr:last-child>th:first-child { + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px +} + +.table-bordered thead:last-child tr:last-child>th:last-child, +.table-bordered tbody:last-child tr:last-child>td:last-child, +.table-bordered tbody:last-child tr:last-child>th:last-child, +.table-bordered tfoot:last-child tr:last-child>td:last-child, +.table-bordered tfoot:last-child tr:last-child>th:last-child { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px +} + +.table-bordered tfoot+tbody:last-child tr:last-child td:first-child { + -webkit-border-bottom-left-radius: 0; + border-bottom-left-radius: 0; + -moz-border-radius-bottomleft: 0 +} + +.table-bordered tfoot+tbody:last-child tr:last-child td:last-child { + -webkit-border-bottom-right-radius: 0; + border-bottom-right-radius: 0; + -moz-border-radius-bottomright: 0 +} + +.table-bordered caption+thead tr:first-child th:first-child, +.table-bordered caption+tbody tr:first-child td:first-child, +.table-bordered colgroup+thead tr:first-child th:first-child, +.table-bordered colgroup+tbody tr:first-child td:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px +} + +.table-bordered caption+thead tr:first-child th:last-child, +.table-bordered caption+tbody tr:first-child td:last-child, +.table-bordered colgroup+thead tr:first-child th:last-child, +.table-bordered colgroup+tbody tr:first-child td:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px +} + +.table-striped tbody>tr:nth-child(odd)>td, +.table-striped tbody>tr:nth-child(odd)>th { + background-color: #f9f9f9 +} + +.table-hover tbody tr:hover>td, +.table-hover tbody tr:hover>th { + background-color: #f5f5f5 +} + +table td[class*="span"], +table th[class*="span"], +.row-fluid table td[class*="span"], +.row-fluid table th[class*="span"] { + display: table-cell; + float: none; + margin-left: 0 +} + +.table td.span1, +.table th.span1 { + float: none; + width: 44px; + margin-left: 0 +} + +.table td.span2, +.table th.span2 { + float: none; + width: 124px; + margin-left: 0 +} + +.table td.span3, +.table th.span3 { + float: none; + width: 204px; + margin-left: 0 +} + +.table td.span4, +.table th.span4 { + float: none; + width: 284px; + margin-left: 0 +} + +.table td.span5, +.table th.span5 { + float: none; + width: 364px; + margin-left: 0 +} + +.table td.span6, +.table th.span6 { + float: none; + width: 444px; + margin-left: 0 +} + +.table td.span7, +.table th.span7 { + float: none; + width: 524px; + margin-left: 0 +} + +.table td.span8, +.table th.span8 { + float: none; + width: 604px; + margin-left: 0 +} + +.table td.span9, +.table th.span9 { + float: none; + width: 684px; + margin-left: 0 +} + +.table td.span10, +.table th.span10 { + float: none; + width: 764px; + margin-left: 0 +} + +.table td.span11, +.table th.span11 { + float: none; + width: 844px; + margin-left: 0 +} + +.table td.span12, +.table th.span12 { + float: none; + width: 924px; + margin-left: 0 +} + +.table tbody tr.success>td { + background-color: #dff0d8 +} + +.table tbody tr.error>td { + background-color: #f2dede +} + +.table tbody tr.warning>td { + background-color: #fcf8e3 +} + +.table tbody tr.info>td { + background-color: #d9edf7 +} + +.table-hover tbody tr.success:hover>td { + background-color: #d0e9c6 +} + +.table-hover tbody tr.error:hover>td { + background-color: #ebcccc +} + +.table-hover tbody tr.warning:hover>td { + background-color: #faf2cc +} + +.table-hover tbody tr.info:hover>td { + background-color: #c4e3f3 +} + +[class^="icon-"], +[class*=" icon-"] { + display: inline-block; + width: 14px; + height: 14px; + margin-top: 1px; + *margin-right: .3em; + line-height: 14px; + vertical-align: text-top; + background-image: url("../img/glyphicons-halflings.png"); + background-position: 14px 14px; + background-repeat: no-repeat +} + +.icon-white, +.nav-pills>.active>a>[class^="icon-"], +.nav-pills>.active>a>[class*=" icon-"], +.nav-list>.active>a>[class^="icon-"], +.nav-list>.active>a>[class*=" icon-"], +.navbar-inverse .nav>.active>a>[class^="icon-"], +.navbar-inverse .nav>.active>a>[class*=" icon-"], +.dropdown-menu>li>a:hover>[class^="icon-"], +.dropdown-menu>li>a:focus>[class^="icon-"], +.dropdown-menu>li>a:hover>[class*=" icon-"], +.dropdown-menu>li>a:focus>[class*=" icon-"], +.dropdown-menu>.active>a>[class^="icon-"], +.dropdown-menu>.active>a>[class*=" icon-"], +.dropdown-submenu:hover>a>[class^="icon-"], +.dropdown-submenu:focus>a>[class^="icon-"], +.dropdown-submenu:hover>a>[class*=" icon-"], +.dropdown-submenu:focus>a>[class*=" icon-"] { + background-image: url("../img/glyphicons-halflings-white.png") +} + +.icon-glass { + background-position: 0 0 +} + +.icon-music { + background-position: -24px 0 +} + +.icon-search { + background-position: -48px 0 +} + +.icon-envelope { + background-position: -72px 0 +} + +.icon-heart { + background-position: -96px 0 +} + +.icon-star { + background-position: -120px 0 +} + +.icon-star-empty { + background-position: -144px 0 +} + +.icon-user { + background-position: -168px 0 +} + +.icon-film { + background-position: -192px 0 +} + +.icon-th-large { + background-position: -216px 0 +} + +.icon-th { + background-position: -240px 0 +} + +.icon-th-list { + background-position: -264px 0 +} + +.icon-ok { + background-position: -288px 0 +} + +.icon-remove { + background-position: -312px 0 +} + +.icon-zoom-in { + background-position: -336px 0 +} + +.icon-zoom-out { + background-position: -360px 0 +} + +.icon-off { + background-position: -384px 0 +} + +.icon-signal { + background-position: -408px 0 +} + +.icon-cog { + background-position: -432px 0 +} + +.icon-trash { + background-position: -456px 0 +} + +.icon-home { + background-position: 0 -24px +} + +.icon-file { + background-position: -24px -24px +} + +.icon-time { + background-position: -48px -24px +} + +.icon-road { + background-position: -72px -24px +} + +.icon-download-alt { + background-position: -96px -24px +} + +.icon-download { + background-position: -120px -24px +} + +.icon-upload { + background-position: -144px -24px +} + +.icon-inbox { + background-position: -168px -24px +} + +.icon-play-circle { + background-position: -192px -24px +} + +.icon-repeat { + background-position: -216px -24px +} + +.icon-refresh { + background-position: -240px -24px +} + +.icon-list-alt { + background-position: -264px -24px +} + +.icon-lock { + background-position: -287px -24px +} + +.icon-flag { + background-position: -312px -24px +} + +.icon-headphones { + background-position: -336px -24px +} + +.icon-volume-off { + background-position: -360px -24px +} + +.icon-volume-down { + background-position: -384px -24px +} + +.icon-volume-up { + background-position: -408px -24px +} + +.icon-qrcode { + background-position: -432px -24px +} + +.icon-barcode { + background-position: -456px -24px +} + +.icon-tag { + background-position: 0 -48px +} + +.icon-tags { + background-position: -25px -48px +} + +.icon-book { + background-position: -48px -48px +} + +.icon-bookmark { + background-position: -72px -48px +} + +.icon-print { + background-position: -96px -48px +} + +.icon-camera { + background-position: -120px -48px +} + +.icon-font { + background-position: -144px -48px +} + +.icon-bold { + background-position: -167px -48px +} + +.icon-italic { + background-position: -192px -48px +} + +.icon-text-height { + background-position: -216px -48px +} + +.icon-text-width { + background-position: -240px -48px +} + +.icon-align-left { + background-position: -264px -48px +} + +.icon-align-center { + background-position: -288px -48px +} + +.icon-align-right { + background-position: -312px -48px +} + +.icon-align-justify { + background-position: -336px -48px +} + +.icon-list { + background-position: -360px -48px +} + +.icon-indent-left { + background-position: -384px -48px +} + +.icon-indent-right { + background-position: -408px -48px +} + +.icon-facetime-video { + background-position: -432px -48px +} + +.icon-picture { + background-position: -456px -48px +} + +.icon-pencil { + background-position: 0 -72px +} + +.icon-map-marker { + background-position: -24px -72px +} + +.icon-adjust { + background-position: -48px -72px +} + +.icon-tint { + background-position: -72px -72px +} + +.icon-edit { + background-position: -96px -72px +} + +.icon-share { + background-position: -120px -72px +} + +.icon-check { + background-position: -144px -72px +} + +.icon-move { + background-position: -168px -72px +} + +.icon-step-backward { + background-position: -192px -72px +} + +.icon-fast-backward { + background-position: -216px -72px +} + +.icon-backward { + background-position: -240px -72px +} + +.icon-play { + background-position: -264px -72px +} + +.icon-pause { + background-position: -288px -72px +} + +.icon-stop { + background-position: -312px -72px +} + +.icon-forward { + background-position: -336px -72px +} + +.icon-fast-forward { + background-position: -360px -72px +} + +.icon-step-forward { + background-position: -384px -72px +} + +.icon-eject { + background-position: -408px -72px +} + +.icon-chevron-left { + background-position: -432px -72px +} + +.icon-chevron-right { + background-position: -456px -72px +} + +.icon-plus-sign { + background-position: 0 -96px +} + +.icon-minus-sign { + background-position: -24px -96px +} + +.icon-remove-sign { + background-position: -48px -96px +} + +.icon-ok-sign { + background-position: -72px -96px +} + +.icon-question-sign { + background-position: -96px -96px +} + +.icon-info-sign { + background-position: -120px -96px +} + +.icon-screenshot { + background-position: -144px -96px +} + +.icon-remove-circle { + background-position: -168px -96px +} + +.icon-ok-circle { + background-position: -192px -96px +} + +.icon-ban-circle { + background-position: -216px -96px +} + +.icon-arrow-left { + background-position: -240px -96px +} + +.icon-arrow-right { + background-position: -264px -96px +} + +.icon-arrow-up { + background-position: -289px -96px +} + +.icon-arrow-down { + background-position: -312px -96px +} + +.icon-share-alt { + background-position: -336px -96px +} + +.icon-resize-full { + background-position: -360px -96px +} + +.icon-resize-small { + background-position: -384px -96px +} + +.icon-plus { + background-position: -408px -96px +} + +.icon-minus { + background-position: -433px -96px +} + +.icon-asterisk { + background-position: -456px -96px +} + +.icon-exclamation-sign { + background-position: 0 -120px +} + +.icon-gift { + background-position: -24px -120px +} + +.icon-leaf { + background-position: -48px -120px +} + +.icon-fire { + background-position: -72px -120px +} + +.icon-eye-open { + background-position: -96px -120px +} + +.icon-eye-close { + background-position: -120px -120px +} + +.icon-warning-sign { + background-position: -144px -120px +} + +.icon-plane { + background-position: -168px -120px +} + +.icon-calendar { + background-position: -192px -120px +} + +.icon-random { + width: 16px; + background-position: -216px -120px +} + +.icon-comment { + background-position: -240px -120px +} + +.icon-magnet { + background-position: -264px -120px +} + +.icon-chevron-up { + background-position: -288px -120px +} + +.icon-chevron-down { + background-position: -313px -119px +} + +.icon-retweet { + background-position: -336px -120px +} + +.icon-shopping-cart { + background-position: -360px -120px +} + +.icon-folder-close { + width: 16px; + background-position: -384px -120px +} + +.icon-folder-open { + width: 16px; + background-position: -408px -120px +} + +.icon-resize-vertical { + background-position: -432px -119px +} + +.icon-resize-horizontal { + background-position: -456px -118px +} + +.icon-hdd { + background-position: 0 -144px +} + +.icon-bullhorn { + background-position: -24px -144px +} + +.icon-bell { + background-position: -48px -144px +} + +.icon-certificate { + background-position: -72px -144px +} + +.icon-thumbs-up { + background-position: -96px -144px +} + +.icon-thumbs-down { + background-position: -120px -144px +} + +.icon-hand-right { + background-position: -144px -144px +} + +.icon-hand-left { + background-position: -168px -144px +} + +.icon-hand-up { + background-position: -192px -144px +} + +.icon-hand-down { + background-position: -216px -144px +} + +.icon-circle-arrow-right { + background-position: -240px -144px +} + +.icon-circle-arrow-left { + background-position: -264px -144px +} + +.icon-circle-arrow-up { + background-position: -288px -144px +} + +.icon-circle-arrow-down { + background-position: -312px -144px +} + +.icon-globe { + background-position: -336px -144px +} + +.icon-wrench { + background-position: -360px -144px +} + +.icon-tasks { + background-position: -384px -144px +} + +.icon-filter { + background-position: -408px -144px +} + +.icon-briefcase { + background-position: -432px -144px +} + +.icon-fullscreen { + background-position: -456px -144px +} + +.dropup, +.dropdown { + position: relative +} + +.dropdown-toggle { + *margin-bottom: -3px +} + +.dropdown-toggle:active, +.open .dropdown-toggle { + outline: 0 +} + +.caret { + display: inline-block; + width: 0; + height: 0; + vertical-align: top; + border-top: 4px solid #000; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + content: "" +} + +.dropdown .caret { + margin-top: 8px; + margin-left: 2px +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + background-color: #fff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box +} + +.dropdown-menu.pull-right { + right: 0; + left: auto +} + +.dropdown-menu .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #fff +} + +.dropdown-menu>li>a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 20px; + color: #333; + white-space: nowrap +} + +.dropdown-menu>li>a:hover, +.dropdown-menu>li>a:focus, +.dropdown-submenu:hover>a, +.dropdown-submenu:focus>a { + color: #fff; + text-decoration: none; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #08c, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#08c), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #08c, #0077b3); + background-image: -o-linear-gradient(top, #08c, #0077b3); + background-image: linear-gradient(to bottom, #08c, #0077b3); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0) +} + +.dropdown-menu>.active>a, +.dropdown-menu>.active>a:hover, +.dropdown-menu>.active>a:focus { + color: #fff; + text-decoration: none; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #08c, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#08c), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #08c, #0077b3); + background-image: -o-linear-gradient(top, #08c, #0077b3); + background-image: linear-gradient(to bottom, #08c, #0077b3); + background-repeat: repeat-x; + outline: 0; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0) +} + +.dropdown-menu>.disabled>a, +.dropdown-menu>.disabled>a:hover, +.dropdown-menu>.disabled>a:focus { + color: #999 +} + +.dropdown-menu>.disabled>a:hover, +.dropdown-menu>.disabled>a:focus { + text-decoration: none; + cursor: default; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false) +} + +.open { + *z-index: 1000 +} + +.open>.dropdown-menu { + display: block +} + +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990 +} + +.pull-right>.dropdown-menu { + right: 0; + left: auto +} + +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid #000; + content: "" +} + +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px +} + +.dropdown-submenu { + position: relative +} + +.dropdown-submenu>.dropdown-menu { + top: 0; + left: 100%; + margin-top: -6px; + margin-left: -1px; + -webkit-border-radius: 0 6px 6px 6px; + -moz-border-radius: 0 6px 6px 6px; + border-radius: 0 6px 6px 6px +} + +.dropdown-submenu:hover>.dropdown-menu { + display: block +} + +.dropup .dropdown-submenu>.dropdown-menu { + top: auto; + bottom: 0; + margin-top: 0; + margin-bottom: -2px; + -webkit-border-radius: 5px 5px 5px 0; + -moz-border-radius: 5px 5px 5px 0; + border-radius: 5px 5px 5px 0 +} + +.dropdown-submenu>a:after { + display: block; + float: right; + width: 0; + height: 0; + margin-top: 5px; + margin-right: -10px; + border-color: transparent; + border-left-color: #ccc; + border-style: solid; + border-width: 5px 0 5px 5px; + content: " " +} + +.dropdown-submenu:hover>a:after { + border-left-color: #fff +} + +.dropdown-submenu.pull-left { + float: none +} + +.dropdown-submenu.pull-left>.dropdown-menu { + left: -100%; + margin-left: 10px; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px +} + +.dropdown .dropdown-menu .nav-header { + padding-right: 20px; + padding-left: 20px +} + +.typeahead { + z-index: 1051; + margin-top: 2px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px +} + +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05) +} + +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15) +} + +.well-large { + padding: 24px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px +} + +.well-small { + padding: 9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px +} + +.fade { + opacity: 0; + -webkit-transition: opacity .15s linear; + -moz-transition: opacity .15s linear; + -o-transition: opacity .15s linear; + transition: opacity .15s linear +} + +.fade.in { + opacity: 1 +} + +.collapse { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height .35s ease; + -moz-transition: height .35s ease; + -o-transition: height .35s ease; + transition: height .35s ease +} + +.collapse.in { + height: auto +} + +.close { + float: right; + font-size: 20px; + font-weight: bold; + line-height: 20px; + color: #000; + text-shadow: 0 1px 0 #fff; + opacity: .2; + filter: alpha(opacity=20) +} + +.close:hover, +.close:focus { + color: #000; + text-decoration: none; + cursor: pointer; + opacity: .4; + filter: alpha(opacity=40) +} + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none +} + +.btn { + display: inline-block; + *display: inline; + padding: 4px 12px; + margin-bottom: 0; + *margin-left: .3em; + font-size: 14px; + line-height: 20px; + color: #333; + text-align: center; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + vertical-align: middle; + cursor: pointer; + background-color: #f5f5f5; + *background-color: #e6e6e6; + background-image: -moz-linear-gradient(top, #fff, #e6e6e6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #fff, #e6e6e6); + background-image: -o-linear-gradient(top, #fff, #e6e6e6); + background-image: linear-gradient(to bottom, #fff, #e6e6e6); + background-repeat: repeat-x; + border: 1px solid #ccc; + *border: 0; + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + border-bottom-color: #b3b3b3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05) +} + +.btn:hover, +.btn:focus, +.btn:active, +.btn.active, +.btn.disabled, +.btn[disabled] { + color: #333; + background-color: #e6e6e6; + *background-color: #d9d9d9 +} + +.btn:active, +.btn.active { + background-color: #ccc \9 +} + +.btn:first-child { + *margin-left: 0 +} + +.btn:hover, +.btn:focus { + color: #333; + text-decoration: none; + background-position: 0 -15px; + -webkit-transition: background-position .1s linear; + -moz-transition: background-position .1s linear; + -o-transition: background-position .1s linear; + transition: background-position .1s linear +} + +.btn:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px +} + +.btn.active, +.btn:active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05) +} + +.btn.disabled, +.btn[disabled] { + cursor: default; + background-image: none; + opacity: .65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none +} + +.btn-large { + padding: 11px 19px; + font-size: 17.5px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px +} + +.btn-large [class^="icon-"], +.btn-large [class*=" icon-"] { + margin-top: 4px +} + +.btn-small { + padding: 2px 10px; + font-size: 11.9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px +} + +.btn-small [class^="icon-"], +.btn-small [class*=" icon-"] { + margin-top: 0 +} + +.btn-mini [class^="icon-"], +.btn-mini [class*=" icon-"] { + margin-top: -1px +} + +.btn-mini { + padding: 0 6px; + font-size: 10.5px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px +} + +.btn-block { + display: block; + width: 100%; + padding-right: 0; + padding-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box +} + +.btn-block+.btn-block { + margin-top: 5px +} + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100% +} + +.btn-primary.active, +.btn-warning.active, +.btn-danger.active, +.btn-success.active, +.btn-info.active, +.btn-inverse.active { + color: rgba(255, 255, 255, 0.75) +} + +.btn-primary { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #006dcc; + *background-color: #04c; + background-image: -moz-linear-gradient(top, #08c, #04c); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#08c), to(#04c)); + background-image: -webkit-linear-gradient(top, #08c, #04c); + background-image: -o-linear-gradient(top, #08c, #04c); + background-image: linear-gradient(to bottom, #08c, #04c); + background-repeat: repeat-x; + border-color: #04c #04c #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false) +} + +.btn-primary:hover, +.btn-primary:focus, +.btn-primary:active, +.btn-primary.active, +.btn-primary.disabled, +.btn-primary[disabled] { + color: #fff; + background-color: #04c; + *background-color: #003bb3 +} + +.btn-primary:active, +.btn-primary.active { + background-color: #039 \9 +} + +.btn-warning { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #faa732; + *background-color: #f89406; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + border-color: #f89406 #f89406 #ad6704; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false) +} + +.btn-warning:hover, +.btn-warning:focus, +.btn-warning:active, +.btn-warning.active, +.btn-warning.disabled, +.btn-warning[disabled] { + color: #fff; + background-color: #f89406; + *background-color: #df8505 +} + +.btn-warning:active, +.btn-warning.active { + background-color: #c67605 \9 +} + +.btn-danger { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #da4f49; + *background-color: #bd362f; + background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); + background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); + background-repeat: repeat-x; + border-color: #bd362f #bd362f #802420; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false) +} + +.btn-danger:hover, +.btn-danger:focus, +.btn-danger:active, +.btn-danger.active, +.btn-danger.disabled, +.btn-danger[disabled] { + color: #fff; + background-color: #bd362f; + *background-color: #a9302a +} + +.btn-danger:active, +.btn-danger.active { + background-color: #942a25 \9 +} + +.btn-success { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #5bb75b; + *background-color: #51a351; + background-image: -moz-linear-gradient(top, #62c462, #51a351); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); + background-image: -webkit-linear-gradient(top, #62c462, #51a351); + background-image: -o-linear-gradient(top, #62c462, #51a351); + background-image: linear-gradient(to bottom, #62c462, #51a351); + background-repeat: repeat-x; + border-color: #51a351 #51a351 #387038; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false) +} + +.btn-success:hover, +.btn-success:focus, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + color: #fff; + background-color: #51a351; + *background-color: #499249 +} + +.btn-success:active, +.btn-success.active { + background-color: #408140 \9 +} + +.btn-info { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #49afcd; + *background-color: #2f96b4; + background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); + background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); + background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); + background-repeat: repeat-x; + border-color: #2f96b4 #2f96b4 #1f6377; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false) +} + +.btn-info:hover, +.btn-info:focus, +.btn-info:active, +.btn-info.active, +.btn-info.disabled, +.btn-info[disabled] { + color: #fff; + background-color: #2f96b4; + *background-color: #2a85a0 +} + +.btn-info:active, +.btn-info.active { + background-color: #24748c \9 +} + +.btn-inverse { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #363636; + *background-color: #222; + background-image: -moz-linear-gradient(top, #444, #222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444), to(#222)); + background-image: -webkit-linear-gradient(top, #444, #222); + background-image: -o-linear-gradient(top, #444, #222); + background-image: linear-gradient(to bottom, #444, #222); + background-repeat: repeat-x; + border-color: #222 #222 #000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false) +} + +.btn-inverse:hover, +.btn-inverse:focus, +.btn-inverse:active, +.btn-inverse.active, +.btn-inverse.disabled, +.btn-inverse[disabled] { + color: #fff; + background-color: #222; + *background-color: #151515 +} + +.btn-inverse:active, +.btn-inverse.active { + background-color: #080808 \9 +} + +button.btn, +input[type="submit"].btn { + *padding-top: 3px; + *padding-bottom: 3px +} + +button.btn::-moz-focus-inner, +input[type="submit"].btn::-moz-focus-inner { + padding: 0; + border: 0 +} + +button.btn.btn-large, +input[type="submit"].btn.btn-large { + *padding-top: 7px; + *padding-bottom: 7px +} + +button.btn.btn-small, +input[type="submit"].btn.btn-small { + *padding-top: 3px; + *padding-bottom: 3px +} + +button.btn.btn-mini, +input[type="submit"].btn.btn-mini { + *padding-top: 1px; + *padding-bottom: 1px +} + +.btn-link, +.btn-link:active, +.btn-link[disabled] { + background-color: transparent; + background-image: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none +} + +.btn-link { + color: #08c; + cursor: pointer; + border-color: transparent; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0 +} + +.btn-link:hover, +.btn-link:focus { + color: #005580; + text-decoration: underline; + background-color: transparent +} + +.btn-link[disabled]:hover, +.btn-link[disabled]:focus { + color: #333; + text-decoration: none +} + +.btn-group { + position: relative; + display: inline-block; + *display: inline; + *margin-left: .3em; + font-size: 0; + white-space: nowrap; + vertical-align: middle; + *zoom: 1 +} + +.btn-group:first-child { + *margin-left: 0 +} + +.btn-group+.btn-group { + margin-left: 5px +} + +.btn-toolbar { + margin-top: 10px; + margin-bottom: 10px; + font-size: 0 +} + +.btn-toolbar>.btn+.btn, +.btn-toolbar>.btn-group+.btn, +.btn-toolbar>.btn+.btn-group { + margin-left: 5px +} + +.btn-group>.btn { + position: relative; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0 +} + +.btn-group>.btn+.btn { + margin-left: -1px +} + +.btn-group>.btn, +.btn-group>.dropdown-menu, +.btn-group>.popover { + font-size: 14px +} + +.btn-group>.btn-mini { + font-size: 10.5px +} + +.btn-group>.btn-small { + font-size: 11.9px +} + +.btn-group>.btn-large { + font-size: 17.5px +} + +.btn-group>.btn:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px +} + +.btn-group>.btn:last-child, +.btn-group>.dropdown-toggle { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px +} + +.btn-group>.btn.large:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px +} + +.btn-group>.btn.large:last-child, +.btn-group>.large.dropdown-toggle { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px +} + +.btn-group>.btn:hover, +.btn-group>.btn:focus, +.btn-group>.btn:active, +.btn-group>.btn.active { + z-index: 2 +} + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0 +} + +.btn-group>.btn+.dropdown-toggle { + *padding-top: 5px; + padding-right: 8px; + *padding-bottom: 5px; + padding-left: 8px; + -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05) +} + +.btn-group>.btn-mini+.dropdown-toggle { + *padding-top: 2px; + padding-right: 5px; + *padding-bottom: 2px; + padding-left: 5px +} + +.btn-group>.btn-small+.dropdown-toggle { + *padding-top: 5px; + *padding-bottom: 4px +} + +.btn-group>.btn-large+.dropdown-toggle { + *padding-top: 7px; + padding-right: 12px; + *padding-bottom: 7px; + padding-left: 12px +} + +.btn-group.open .dropdown-toggle { + background-image: none; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05) +} + +.btn-group.open .btn.dropdown-toggle { + background-color: #e6e6e6 +} + +.btn-group.open .btn-primary.dropdown-toggle { + background-color: #04c +} + +.btn-group.open .btn-warning.dropdown-toggle { + background-color: #f89406 +} + +.btn-group.open .btn-danger.dropdown-toggle { + background-color: #bd362f +} + +.btn-group.open .btn-success.dropdown-toggle { + background-color: #51a351 +} + +.btn-group.open .btn-info.dropdown-toggle { + background-color: #2f96b4 +} + +.btn-group.open .btn-inverse.dropdown-toggle { + background-color: #222 +} + +.btn .caret { + margin-top: 8px; + margin-left: 0 +} + +.btn-large .caret { + margin-top: 6px +} + +.btn-large .caret { + border-top-width: 5px; + border-right-width: 5px; + border-left-width: 5px +} + +.btn-mini .caret, +.btn-small .caret { + margin-top: 8px +} + +.dropup .btn-large .caret { + border-bottom-width: 5px +} + +.btn-primary .caret, +.btn-warning .caret, +.btn-danger .caret, +.btn-info .caret, +.btn-success .caret, +.btn-inverse .caret { + border-top-color: #fff; + border-bottom-color: #fff +} + +.btn-group-vertical { + display: inline-block; + *display: inline; + *zoom: 1 +} + +.btn-group-vertical>.btn { + display: block; + float: none; + max-width: 100%; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0 +} + +.btn-group-vertical>.btn+.btn { + margin-top: -1px; + margin-left: 0 +} + +.btn-group-vertical>.btn:first-child { + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0 +} + +.btn-group-vertical>.btn:last-child { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px +} + +.btn-group-vertical>.btn-large:first-child { + -webkit-border-radius: 6px 6px 0 0; + -moz-border-radius: 6px 6px 0 0; + border-radius: 6px 6px 0 0 +} + +.btn-group-vertical>.btn-large:last-child { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px +} + +.alert { + padding: 8px 35px 8px 14px; + margin-bottom: 20px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + background-color: #fcf8e3; + border: 1px solid #fbeed5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px +} + +.alert, +.alert h4 { + color: #c09853 +} + +.alert h4 { + margin: 0 +} + +.alert .close { + position: relative; + top: -2px; + right: -21px; + line-height: 20px +} + +.alert-success { + color: #468847; + background-color: #dff0d8; + border-color: #d6e9c6 +} + +.alert-success h4 { + color: #468847 +} + +.alert-danger, +.alert-error { + color: #b94a48; + background-color: #f2dede; + border-color: #eed3d7 +} + +.alert-danger h4, +.alert-error h4 { + color: #b94a48 +} + +.alert-info { + color: #3a87ad; + background-color: #d9edf7; + border-color: #bce8f1 +} + +.alert-info h4 { + color: #3a87ad +} + +.alert-block { + padding-top: 14px; + padding-bottom: 14px +} + +.alert-block>p, +.alert-block>ul { + margin-bottom: 0 +} + +.alert-block p+p { + margin-top: 5px +} + +.nav { + margin-bottom: 20px; + margin-left: 0; + list-style: none +} + +.nav>li>a { + display: block +} + +.nav>li>a:hover, +.nav>li>a:focus { + text-decoration: none; + background-color: #eee +} + +.nav>li>a>img { + max-width: none +} + +.nav>.pull-right { + float: right +} + +.nav-header { + display: block; + padding: 3px 15px; + font-size: 11px; + font-weight: bold; + line-height: 20px; + color: #999; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + text-transform: uppercase +} + +.nav li+.nav-header { + margin-top: 9px +} + +.nav-list { + padding-right: 15px; + padding-left: 15px; + margin-bottom: 0 +} + +.nav-list>li>a, +.nav-list .nav-header { + margin-right: -15px; + margin-left: -15px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5) +} + +.nav-list>li>a { + padding: 3px 15px +} + +.nav-list>.active>a, +.nav-list>.active>a:hover, +.nav-list>.active>a:focus { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + background-color: #08c +} + +.nav-list [class^="icon-"], +.nav-list [class*=" icon-"] { + margin-right: 2px +} + +.nav-list .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #fff +} + +.nav-tabs, +.nav-pills { + *zoom: 1 +} + +.nav-tabs:before, +.nav-pills:before, +.nav-tabs:after, +.nav-pills:after { + display: table; + line-height: 0; + content: "" +} + +.nav-tabs:after, +.nav-pills:after { + clear: both +} + +.nav-tabs>li, +.nav-pills>li { + float: left +} + +.nav-tabs>li>a, +.nav-pills>li>a { + padding-right: 12px; + padding-left: 12px; + margin-right: 2px; + line-height: 14px +} + +.nav-tabs { + border-bottom: 1px solid #ddd +} + +.nav-tabs>li { + margin-bottom: -1px +} + +.nav-tabs>li>a { + padding-top: 8px; + padding-bottom: 8px; + line-height: 20px; + border: 1px solid transparent; + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0 +} + +.nav-tabs>li>a:hover, +.nav-tabs>li>a:focus { + border-color: #eee #eee #ddd +} + +.nav-tabs>.active>a, +.nav-tabs>.active>a:hover, +.nav-tabs>.active>a:focus { + color: #555; + cursor: default; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: transparent +} + +.nav-pills>li>a { + padding-top: 8px; + padding-bottom: 8px; + margin-top: 2px; + margin-bottom: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px +} + +.nav-pills>.active>a, +.nav-pills>.active>a:hover, +.nav-pills>.active>a:focus { + color: #fff; + background-color: #08c +} + +.nav-stacked>li { + float: none +} + +.nav-stacked>li>a { + margin-right: 0 +} + +.nav-tabs.nav-stacked { + border-bottom: 0 +} + +.nav-tabs.nav-stacked>li>a { + border: 1px solid #ddd; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0 +} + +.nav-tabs.nav-stacked>li:first-child>a { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-topleft: 4px +} + +.nav-tabs.nav-stacked>li:last-child>a { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomright: 4px; + -moz-border-radius-bottomleft: 4px +} + +.nav-tabs.nav-stacked>li>a:hover, +.nav-tabs.nav-stacked>li>a:focus { + z-index: 2; + border-color: #ddd +} + +.nav-pills.nav-stacked>li>a { + margin-bottom: 3px +} + +.nav-pills.nav-stacked>li:last-child>a { + margin-bottom: 1px +} + +.nav-tabs .dropdown-menu { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px +} + +.nav-pills .dropdown-menu { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px +} + +.nav .dropdown-toggle .caret { + margin-top: 6px; + border-top-color: #08c; + border-bottom-color: #08c +} + +.nav .dropdown-toggle:hover .caret, +.nav .dropdown-toggle:focus .caret { + border-top-color: #005580; + border-bottom-color: #005580 +} + +.nav-tabs .dropdown-toggle .caret { + margin-top: 8px +} + +.nav .active .dropdown-toggle .caret { + border-top-color: #fff; + border-bottom-color: #fff +} + +.nav-tabs .active .dropdown-toggle .caret { + border-top-color: #555; + border-bottom-color: #555 +} + +.nav>.dropdown.active>a:hover, +.nav>.dropdown.active>a:focus { + cursor: pointer +} + +.nav-tabs .open .dropdown-toggle, +.nav-pills .open .dropdown-toggle, +.nav>li.dropdown.open.active>a:hover, +.nav>li.dropdown.open.active>a:focus { + color: #fff; + background-color: #999; + border-color: #999 +} + +.nav li.dropdown.open .caret, +.nav li.dropdown.open.active .caret, +.nav li.dropdown.open a:hover .caret, +.nav li.dropdown.open a:focus .caret { + border-top-color: #fff; + border-bottom-color: #fff; + opacity: 1; + filter: alpha(opacity=100) +} + +.tabs-stacked .open>a:hover, +.tabs-stacked .open>a:focus { + border-color: #999 +} + +.tabbable { + *zoom: 1 +} + +.tabbable:before, +.tabbable:after { + display: table; + line-height: 0; + content: "" +} + +.tabbable:after { + clear: both +} + +.tab-content { + overflow: auto +} + +.tabs-below>.nav-tabs, +.tabs-right>.nav-tabs, +.tabs-left>.nav-tabs { + border-bottom: 0 +} + +.tab-content>.tab-pane, +.pill-content>.pill-pane { + display: none +} + +.tab-content>.active, +.pill-content>.active { + display: block +} + +.tabs-below>.nav-tabs { + border-top: 1px solid #ddd +} + +.tabs-below>.nav-tabs>li { + margin-top: -1px; + margin-bottom: 0 +} + +.tabs-below>.nav-tabs>li>a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px +} + +.tabs-below>.nav-tabs>li>a:hover, +.tabs-below>.nav-tabs>li>a:focus { + border-top-color: #ddd; + border-bottom-color: transparent +} + +.tabs-below>.nav-tabs>.active>a, +.tabs-below>.nav-tabs>.active>a:hover, +.tabs-below>.nav-tabs>.active>a:focus { + border-color: transparent #ddd #ddd #ddd +} + +.tabs-left>.nav-tabs>li, +.tabs-right>.nav-tabs>li { + float: none +} + +.tabs-left>.nav-tabs>li>a, +.tabs-right>.nav-tabs>li>a { + min-width: 74px; + margin-right: 0; + margin-bottom: 3px +} + +.tabs-left>.nav-tabs { + float: left; + margin-right: 19px; + border-right: 1px solid #ddd +} + +.tabs-left>.nav-tabs>li>a { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px +} + +.tabs-left>.nav-tabs>li>a:hover, +.tabs-left>.nav-tabs>li>a:focus { + border-color: #eee #ddd #eee #eee +} + +.tabs-left>.nav-tabs .active>a, +.tabs-left>.nav-tabs .active>a:hover, +.tabs-left>.nav-tabs .active>a:focus { + border-color: #ddd transparent #ddd #ddd; + *border-right-color: #fff +} + +.tabs-right>.nav-tabs { + float: right; + margin-left: 19px; + border-left: 1px solid #ddd +} + +.tabs-right>.nav-tabs>li>a { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0 +} + +.tabs-right>.nav-tabs>li>a:hover, +.tabs-right>.nav-tabs>li>a:focus { + border-color: #eee #eee #eee #ddd +} + +.tabs-right>.nav-tabs .active>a, +.tabs-right>.nav-tabs .active>a:hover, +.tabs-right>.nav-tabs .active>a:focus { + border-color: #ddd #ddd #ddd transparent; + *border-left-color: #fff +} + +.nav>.disabled>a { + color: #999 +} + +.nav>.disabled>a:hover, +.nav>.disabled>a:focus { + text-decoration: none; + cursor: default; + background-color: transparent +} + +.navbar { + *position: relative; + *z-index: 2; + margin-bottom: 20px; + overflow: visible +} + +.navbar-inner { + min-height: 40px; + padding-right: 20px; + padding-left: 20px; + background-color: #fafafa; + background-image: -moz-linear-gradient(top, #fff, #f2f2f2); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fff), to(#f2f2f2)); + background-image: -webkit-linear-gradient(top, #fff, #f2f2f2); + background-image: -o-linear-gradient(top, #fff, #f2f2f2); + background-image: linear-gradient(to bottom, #fff, #f2f2f2); + background-repeat: repeat-x; + border: 1px solid #d4d4d4; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); + *zoom: 1; + -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065) +} + +.navbar-inner:before, +.navbar-inner:after { + display: table; + line-height: 0; + content: "" +} + +.navbar-inner:after { + clear: both +} + +.navbar .container { + width: auto +} + +.nav-collapse.collapse { + height: auto; + overflow: visible +} + +.navbar .brand { + display: block; + float: left; + padding: 10px 20px 10px; + margin-left: -20px; + font-size: 20px; + font-weight: 200; + color: #777; + text-shadow: 0 1px 0 #fff +} + +.navbar .brand:hover, +.navbar .brand:focus { + text-decoration: none +} + +.navbar-text { + margin-bottom: 0; + line-height: 40px; + color: #777 +} + +.navbar-link { + color: #777 +} + +.navbar-link:hover, +.navbar-link:focus { + color: #333 +} + +.navbar .divider-vertical { + height: 40px; + margin: 0 9px; + border-right: 1px solid #fff; + border-left: 1px solid #f2f2f2 +} + +.navbar .btn, +.navbar .btn-group { + margin-top: 5px +} + +.navbar .btn-group .btn, +.navbar .input-prepend .btn, +.navbar .input-append .btn, +.navbar .input-prepend .btn-group, +.navbar .input-append .btn-group { + margin-top: 0 +} + +.navbar-form { + margin-bottom: 0; + *zoom: 1 +} + +.navbar-form:before, +.navbar-form:after { + display: table; + line-height: 0; + content: "" +} + +.navbar-form:after { + clear: both +} + +.navbar-form input, +.navbar-form select, +.navbar-form .radio, +.navbar-form .checkbox { + margin-top: 5px +} + +.navbar-form input, +.navbar-form select, +.navbar-form .btn { + display: inline-block; + margin-bottom: 0 +} + +.navbar-form input[type="image"], +.navbar-form input[type="checkbox"], +.navbar-form input[type="radio"] { + margin-top: 3px +} + +.navbar-form .input-append, +.navbar-form .input-prepend { + margin-top: 5px; + white-space: nowrap +} + +.navbar-form .input-append input, +.navbar-form .input-prepend input { + margin-top: 0 +} + +.navbar-search { + position: relative; + float: left; + margin-top: 5px; + margin-bottom: 0 +} + +.navbar-search .search-query { + padding: 4px 14px; + margin-bottom: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 1; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px +} + +.navbar-static-top { + position: static; + margin-bottom: 0 +} + +.navbar-static-top .navbar-inner { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0 +} + +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; + margin-bottom: 0 +} + +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + border-width: 0 0 1px +} + +.navbar-fixed-bottom .navbar-inner { + border-width: 1px 0 0 +} + +.navbar-fixed-top .navbar-inner, +.navbar-fixed-bottom .navbar-inner { + padding-right: 0; + padding-left: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0 +} + +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px +} + +.navbar-fixed-top { + top: 0 +} + +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1) +} + +.navbar-fixed-bottom { + bottom: 0 +} + +.navbar-fixed-bottom .navbar-inner { + -webkit-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1) +} + +.navbar .nav { + position: relative; + left: 0; + display: block; + float: left; + margin: 0 10px 0 0 +} + +.navbar .nav.pull-right { + float: right; + margin-right: 0 +} + +.navbar .nav>li { + float: left +} + +.navbar .nav>li>a { + float: none; + padding: 10px 15px 10px; + color: #777; + text-decoration: none; + text-shadow: 0 1px 0 #fff +} + +.navbar .nav .dropdown-toggle .caret { + margin-top: 8px +} + +.navbar .nav>li>a:focus, +.navbar .nav>li>a:hover { + color: #333; + text-decoration: none; + background-color: transparent +} + +.navbar .nav>.active>a, +.navbar .nav>.active>a:hover, +.navbar .nav>.active>a:focus { + color: #555; + text-decoration: none; + background-color: #e5e5e5; + -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125) +} + +.navbar .btn-navbar { + display: none; + float: right; + padding: 7px 10px; + margin-right: 5px; + margin-left: 5px; + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #ededed; + *background-color: #e5e5e5; + background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5)); + background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5); + background-repeat: repeat-x; + border-color: #e5e5e5 #e5e5e5 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075) +} + +.navbar .btn-navbar:hover, +.navbar .btn-navbar:focus, +.navbar .btn-navbar:active, +.navbar .btn-navbar.active, +.navbar .btn-navbar.disabled, +.navbar .btn-navbar[disabled] { + color: #fff; + background-color: #e5e5e5; + *background-color: #d9d9d9 +} + +.navbar .btn-navbar:active, +.navbar .btn-navbar.active { + background-color: #ccc \9 +} + +.navbar .btn-navbar .icon-bar { + display: block; + width: 18px; + height: 2px; + background-color: #f5f5f5; + -webkit-border-radius: 1px; + -moz-border-radius: 1px; + border-radius: 1px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25) +} + +.btn-navbar .icon-bar+.icon-bar { + margin-top: 3px +} + +.navbar .nav>li>.dropdown-menu:before { + position: absolute; + top: -7px; + left: 9px; + display: inline-block; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-left: 7px solid transparent; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: '' +} + +.navbar .nav>li>.dropdown-menu:after { + position: absolute; + top: -6px; + left: 10px; + display: inline-block; + border-right: 6px solid transparent; + border-bottom: 6px solid #fff; + border-left: 6px solid transparent; + content: '' +} + +.navbar-fixed-bottom .nav>li>.dropdown-menu:before { + top: auto; + bottom: -7px; + border-top: 7px solid #ccc; + border-bottom: 0; + border-top-color: rgba(0, 0, 0, 0.2) +} + +.navbar-fixed-bottom .nav>li>.dropdown-menu:after { + top: auto; + bottom: -6px; + border-top: 6px solid #fff; + border-bottom: 0 +} + +.navbar .nav li.dropdown>a:hover .caret, +.navbar .nav li.dropdown>a:focus .caret { + border-top-color: #333; + border-bottom-color: #333 +} + +.navbar .nav li.dropdown.open>.dropdown-toggle, +.navbar .nav li.dropdown.active>.dropdown-toggle, +.navbar .nav li.dropdown.open.active>.dropdown-toggle { + color: #555; + background-color: #e5e5e5 +} + +.navbar .nav li.dropdown>.dropdown-toggle .caret { + border-top-color: #777; + border-bottom-color: #777 +} + +.navbar .nav li.dropdown.open>.dropdown-toggle .caret, +.navbar .nav li.dropdown.active>.dropdown-toggle .caret, +.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret { + border-top-color: #555; + border-bottom-color: #555 +} + +.navbar .pull-right>li>.dropdown-menu, +.navbar .nav>li>.dropdown-menu.pull-right { + right: 0; + left: auto +} + +.navbar .pull-right>li>.dropdown-menu:before, +.navbar .nav>li>.dropdown-menu.pull-right:before { + right: 12px; + left: auto +} + +.navbar .pull-right>li>.dropdown-menu:after, +.navbar .nav>li>.dropdown-menu.pull-right:after { + right: 13px; + left: auto +} + +.navbar .pull-right>li>.dropdown-menu .dropdown-menu, +.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu { + right: 100%; + left: auto; + margin-right: -1px; + margin-left: 0; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px +} + +.navbar-inverse .navbar-inner { + background-color: #1b1b1b; + background-image: -moz-linear-gradient(top, #222, #111); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222), to(#111)); + background-image: -webkit-linear-gradient(top, #222, #111); + background-image: -o-linear-gradient(top, #222, #111); + background-image: linear-gradient(to bottom, #222, #111); + background-repeat: repeat-x; + border-color: #252525; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0) +} + +.navbar-inverse .brand, +.navbar-inverse .nav>li>a { + color: #999; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25) +} + +.navbar-inverse .brand:hover, +.navbar-inverse .nav>li>a:hover, +.navbar-inverse .brand:focus, +.navbar-inverse .nav>li>a:focus { + color: #fff +} + +.navbar-inverse .brand { + color: #999 +} + +.navbar-inverse .navbar-text { + color: #999 +} + +.navbar-inverse .nav>li>a:focus, +.navbar-inverse .nav>li>a:hover { + color: #fff; + background-color: transparent +} + +.navbar-inverse .nav .active>a, +.navbar-inverse .nav .active>a:hover, +.navbar-inverse .nav .active>a:focus { + color: #fff; + background-color: #111 +} + +.navbar-inverse .navbar-link { + color: #999 +} + +.navbar-inverse .navbar-link:hover, +.navbar-inverse .navbar-link:focus { + color: #fff +} + +.navbar-inverse .divider-vertical { + border-right-color: #222; + border-left-color: #111 +} + +.navbar-inverse .nav li.dropdown.open>.dropdown-toggle, +.navbar-inverse .nav li.dropdown.active>.dropdown-toggle, +.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle { + color: #fff; + background-color: #111 +} + +.navbar-inverse .nav li.dropdown>a:hover .caret, +.navbar-inverse .nav li.dropdown>a:focus .caret { + border-top-color: #fff; + border-bottom-color: #fff +} + +.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret { + border-top-color: #999; + border-bottom-color: #999 +} + +.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret { + border-top-color: #fff; + border-bottom-color: #fff +} + +.navbar-inverse .navbar-search .search-query { + color: #fff; + background-color: #515151; + border-color: #111; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -webkit-transition: none; + -moz-transition: none; + -o-transition: none; + transition: none +} + +.navbar-inverse .navbar-search .search-query:-moz-placeholder { + color: #ccc +} + +.navbar-inverse .navbar-search .search-query:-ms-input-placeholder { + color: #ccc +} + +.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { + color: #ccc +} + +.navbar-inverse .navbar-search .search-query:focus, +.navbar-inverse .navbar-search .search-query.focused { + padding: 5px 15px; + color: #333; + text-shadow: 0 1px 0 #fff; + background-color: #fff; + border: 0; + outline: 0; + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + box-shadow: 0 0 3px rgba(0, 0, 0, 0.15) +} + +.navbar-inverse .btn-navbar { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e0e0e; + *background-color: #040404; + background-image: -moz-linear-gradient(top, #151515, #040404); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404)); + background-image: -webkit-linear-gradient(top, #151515, #040404); + background-image: -o-linear-gradient(top, #151515, #040404); + background-image: linear-gradient(to bottom, #151515, #040404); + background-repeat: repeat-x; + border-color: #040404 #040404 #000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false) +} + +.navbar-inverse .btn-navbar:hover, +.navbar-inverse .btn-navbar:focus, +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active, +.navbar-inverse .btn-navbar.disabled, +.navbar-inverse .btn-navbar[disabled] { + color: #fff; + background-color: #040404; + *background-color: #000 +} + +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active { + background-color: #000 \9 +} + +.breadcrumb { + padding: 8px 15px; + margin: 0 0 20px; + list-style: none; + background-color: #f5f5f5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px +} + +.breadcrumb>li { + display: inline-block; + *display: inline; + text-shadow: 0 1px 0 #fff; + *zoom: 1 +} + +.breadcrumb>li>.divider { + padding: 0 5px; + color: #ccc +} + +.breadcrumb>.active { + color: #999 +} + +.pagination { + margin: 20px 0 +} + +.pagination ul { + display: inline-block; + *display: inline; + margin-bottom: 0; + margin-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + *zoom: 1; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05) +} + +.pagination ul>li { + display: inline +} + +.pagination ul>li>a, +.pagination ul>li>span { + float: left; + padding: 4px 12px; + line-height: 20px; + text-decoration: none; + background-color: #fff; + border: 1px solid #ddd; + border-left-width: 0 +} + +.pagination ul>li>a:hover, +.pagination ul>li>a:focus, +.pagination ul>.active>a, +.pagination ul>.active>span { + background-color: #f5f5f5 +} + +.pagination ul>.active>a, +.pagination ul>.active>span { + color: #999; + cursor: default +} + +.pagination ul>.disabled>span, +.pagination ul>.disabled>a, +.pagination ul>.disabled>a:hover, +.pagination ul>.disabled>a:focus { + color: #999; + cursor: default; + background-color: transparent +} + +.pagination ul>li:first-child>a, +.pagination ul>li:first-child>span { + border-left-width: 1px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px +} + +.pagination ul>li:last-child>a, +.pagination ul>li:last-child>span { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px +} + +.pagination-centered { + text-align: center +} + +.pagination-right { + text-align: right +} + +.pagination-large ul>li>a, +.pagination-large ul>li>span { + padding: 11px 19px; + font-size: 17.5px +} + +.pagination-large ul>li:first-child>a, +.pagination-large ul>li:first-child>span { + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px +} + +.pagination-large ul>li:last-child>a, +.pagination-large ul>li:last-child>span { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px +} + +.pagination-mini ul>li:first-child>a, +.pagination-small ul>li:first-child>a, +.pagination-mini ul>li:first-child>span, +.pagination-small ul>li:first-child>span { + -webkit-border-bottom-left-radius: 3px; + border-bottom-left-radius: 3px; + -webkit-border-top-left-radius: 3px; + border-top-left-radius: 3px; + -moz-border-radius-bottomleft: 3px; + -moz-border-radius-topleft: 3px +} + +.pagination-mini ul>li:last-child>a, +.pagination-small ul>li:last-child>a, +.pagination-mini ul>li:last-child>span, +.pagination-small ul>li:last-child>span { + -webkit-border-top-right-radius: 3px; + border-top-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + border-bottom-right-radius: 3px; + -moz-border-radius-topright: 3px; + -moz-border-radius-bottomright: 3px +} + +.pagination-small ul>li>a, +.pagination-small ul>li>span { + padding: 2px 10px; + font-size: 11.9px +} + +.pagination-mini ul>li>a, +.pagination-mini ul>li>span { + padding: 0 6px; + font-size: 10.5px +} + +.pager { + margin: 20px 0; + text-align: center; + list-style: none; + *zoom: 1 +} + +.pager:before, +.pager:after { + display: table; + line-height: 0; + content: "" +} + +.pager:after { + clear: both +} + +.pager li { + display: inline +} + +.pager li>a, +.pager li>span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px +} + +.pager li>a:hover, +.pager li>a:focus { + text-decoration: none; + background-color: #f5f5f5 +} + +.pager .next>a, +.pager .next>span { + float: right +} + +.pager .previous>a, +.pager .previous>span { + float: left +} + +.pager .disabled>a, +.pager .disabled>a:hover, +.pager .disabled>a:focus, +.pager .disabled>span { + color: #999; + cursor: default; + background-color: #fff +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000 +} + +.modal-backdrop.fade { + opacity: 0 +} + +.modal-backdrop, +.modal-backdrop.fade.in { + opacity: .8; + filter: alpha(opacity=80) +} + +.modal { + position: fixed; + top: 10%; + left: 50%; + z-index: 1050; + width: 560px; + margin-left: -280px; + background-color: #fff; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.3); + *border: 1px solid #999; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + outline: 0; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box +} + +.modal.fade { + top: -25%; + -webkit-transition: opacity .3s linear, top .3s ease-out; + -moz-transition: opacity .3s linear, top .3s ease-out; + -o-transition: opacity .3s linear, top .3s ease-out; + transition: opacity .3s linear, top .3s ease-out +} + +.modal.fade.in { + top: 10% +} + +.modal-header { + padding: 9px 15px; + border-bottom: 1px solid #eee +} + +.modal-header .close { + margin-top: 2px +} + +.modal-header h3 { + margin: 0; + line-height: 30px +} + +.modal-body { + position: relative; + max-height: 400px; + padding: 15px; + overflow-y: auto +} + +.modal-form { + margin-bottom: 0 +} + +.modal-footer { + padding: 14px 15px 15px; + margin-bottom: 0; + text-align: right; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 #fff; + -moz-box-shadow: inset 0 1px 0 #fff; + box-shadow: inset 0 1px 0 #fff +} + +.modal-footer:before, +.modal-footer:after { + display: table; + line-height: 0; + content: "" +} + +.modal-footer:after { + clear: both +} + +.modal-footer .btn+.btn { + margin-bottom: 0; + margin-left: 5px +} + +.modal-footer .btn-group .btn+.btn { + margin-left: -1px +} + +.modal-footer .btn-block+.btn-block { + margin-left: 0 +} + +.tooltip { + position: absolute; + z-index: 1030; + display: block; + font-size: 11px; + line-height: 1.4; + opacity: 0; + filter: alpha(opacity=0); + visibility: visible +} + +.tooltip.in { + opacity: .8; + filter: alpha(opacity=80) +} + +.tooltip.top { + padding: 5px 0; + margin-top: -3px +} + +.tooltip.right { + padding: 0 5px; + margin-left: 3px +} + +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px +} + +.tooltip.left { + padding: 0 5px; + margin-left: -3px +} + +.tooltip-inner { + max-width: 200px; + padding: 8px; + color: #fff; + text-align: center; + text-decoration: none; + background-color: #000; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px +} + +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid +} + +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-top-color: #000; + border-width: 5px 5px 0 +} + +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-right-color: #000; + border-width: 5px 5px 5px 0 +} + +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-left-color: #000; + border-width: 5px 0 5px 5px +} + +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-bottom-color: #000; + border-width: 0 5px 5px +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + max-width: 276px; + padding: 1px; + text-align: left; + white-space: normal; + background-color: #fff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box +} + +.popover.top { + margin-top: -10px +} + +.popover.right { + margin-left: 10px +} + +.popover.bottom { + margin-top: 10px +} + +.popover.left { + margin-left: -10px +} + +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + font-weight: normal; + line-height: 18px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + -webkit-border-radius: 5px 5px 0 0; + -moz-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0 +} + +.popover-title:empty { + display: none +} + +.popover-content { + padding: 9px 14px +} + +.popover .arrow, +.popover .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid +} + +.popover .arrow { + border-width: 11px +} + +.popover .arrow:after { + border-width: 10px; + content: "" +} + +.popover.top .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, 0.25); + border-bottom-width: 0 +} + +.popover.top .arrow:after { + bottom: 1px; + margin-left: -10px; + border-top-color: #fff; + border-bottom-width: 0 +} + +.popover.right .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, 0.25); + border-left-width: 0 +} + +.popover.right .arrow:after { + bottom: -10px; + left: 1px; + border-right-color: #fff; + border-left-width: 0 +} + +.popover.bottom .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, 0.25); + border-top-width: 0 +} + +.popover.bottom .arrow:after { + top: 1px; + margin-left: -10px; + border-bottom-color: #fff; + border-top-width: 0 +} + +.popover.left .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, 0.25); + border-right-width: 0 +} + +.popover.left .arrow:after { + right: 1px; + bottom: -10px; + border-left-color: #fff; + border-right-width: 0 +} + +.thumbnails { + margin-left: -20px; + list-style: none; + *zoom: 1 +} + +.thumbnails:before, +.thumbnails:after { + display: table; + line-height: 0; + content: "" +} + +.thumbnails:after { + clear: both +} + +.row-fluid .thumbnails { + margin-left: 0 +} + +.thumbnails>li { + float: left; + margin-bottom: 20px; + margin-left: 20px +} + +.thumbnail { + display: block; + padding: 4px; + line-height: 20px; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + -webkit-transition: all .2s ease-in-out; + -moz-transition: all .2s ease-in-out; + -o-transition: all .2s ease-in-out; + transition: all .2s ease-in-out +} + +a.thumbnail:hover, +a.thumbnail:focus { + border-color: #08c; + -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25) +} + +.thumbnail>img { + display: block; + max-width: 100%; + margin-right: auto; + margin-left: auto +} + +.thumbnail .caption { + padding: 9px; + color: #555 +} + +.media, +.media-body { + overflow: hidden; + *overflow: visible; + zoom: 1 +} + +.media, +.media .media { + margin-top: 15px +} + +.media:first-child { + margin-top: 0 +} + +.media-object { + display: block +} + +.media-heading { + margin: 0 0 5px +} + +.media>.pull-left { + margin-right: 10px +} + +.media>.pull-right { + margin-left: 10px +} + +.media-list { + margin-left: 0; + list-style: none +} + +.label, +.badge { + display: inline-block; + padding: 2px 4px; + font-size: 11.844px; + font-weight: bold; + line-height: 14px; + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + white-space: nowrap; + vertical-align: baseline; + background-color: #999 +} + +.label { + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px +} + +.badge { + padding-right: 9px; + padding-left: 9px; + -webkit-border-radius: 9px; + -moz-border-radius: 9px; + border-radius: 9px +} + +.label:empty, +.badge:empty { + display: none +} + +a.label:hover, +a.label:focus, +a.badge:hover, +a.badge:focus { + color: #fff; + text-decoration: none; + cursor: pointer +} + +.label-important, +.badge-important { + background-color: #b94a48 +} + +.label-important[href], +.badge-important[href] { + background-color: #953b39 +} + +.label-warning, +.badge-warning { + background-color: #f89406 +} + +.label-warning[href], +.badge-warning[href] { + background-color: #c67605 +} + +.label-success, +.badge-success { + background-color: #468847 +} + +.label-success[href], +.badge-success[href] { + background-color: #356635 +} + +.label-info, +.badge-info { + background-color: #3a87ad +} + +.label-info[href], +.badge-info[href] { + background-color: #2d6987 +} + +.label-inverse, +.badge-inverse { + background-color: #333 +} + +.label-inverse[href], +.badge-inverse[href] { + background-color: #1a1a1a +} + +.btn .label, +.btn .badge { + position: relative; + top: -1px +} + +.btn-mini .label, +.btn-mini .badge { + top: 0 +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0 + } + + to { + background-position: 0 0 + } +} + +@-moz-keyframes progress-bar-stripes { + from { + background-position: 40px 0 + } + + to { + background-position: 0 0 + } +} + +@-ms-keyframes progress-bar-stripes { + from { + background-position: 40px 0 + } + + to { + background-position: 0 0 + } +} + +@-o-keyframes progress-bar-stripes { + from { + background-position: 0 0 + } + + to { + background-position: 40px 0 + } +} + +@keyframes progress-bar-stripes { + from { + background-position: 40px 0 + } + + to { + background-position: 0 0 + } +} + +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f7f7f7; + background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); + background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); + background-repeat: repeat-x; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1) +} + +.progress .bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + color: #fff; + text-align: center; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e90d2; + background-image: -moz-linear-gradient(top, #149bdf, #0480be); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); + background-image: -webkit-linear-gradient(top, #149bdf, #0480be); + background-image: -o-linear-gradient(top, #149bdf, #0480be); + background-image: linear-gradient(to bottom, #149bdf, #0480be); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: width .6s ease; + -moz-transition: width .6s ease; + -o-transition: width .6s ease; + transition: width .6s ease +} + +.progress .bar+.bar { + -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15) +} + +.progress-striped .bar { + background-color: #149bdf; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + -moz-background-size: 40px 40px; + -o-background-size: 40px 40px; + background-size: 40px 40px +} + +.progress.active .bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -moz-animation: progress-bar-stripes 2s linear infinite; + -ms-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite +} + +.progress-danger .bar, +.progress .bar-danger { + background-color: #dd514c; + background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); + background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0) +} + +.progress-danger.progress-striped .bar, +.progress-striped .bar-danger { + background-color: #ee5f5b; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent) +} + +.progress-success .bar, +.progress .bar-success { + background-color: #5eb95e; + background-image: -moz-linear-gradient(top, #62c462, #57a957); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); + background-image: -webkit-linear-gradient(top, #62c462, #57a957); + background-image: -o-linear-gradient(top, #62c462, #57a957); + background-image: linear-gradient(to bottom, #62c462, #57a957); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0) +} + +.progress-success.progress-striped .bar, +.progress-striped .bar-success { + background-color: #62c462; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent) +} + +.progress-info .bar, +.progress .bar-info { + background-color: #4bb1cf; + background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); + background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); + background-image: -o-linear-gradient(top, #5bc0de, #339bb9); + background-image: linear-gradient(to bottom, #5bc0de, #339bb9); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0) +} + +.progress-info.progress-striped .bar, +.progress-striped .bar-info { + background-color: #5bc0de; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent) +} + +.progress-warning .bar, +.progress .bar-warning { + background-color: #faa732; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0) +} + +.progress-warning.progress-striped .bar, +.progress-striped .bar-warning { + background-color: #fbb450; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent) +} + +.accordion { + margin-bottom: 20px +} + +.accordion-group { + margin-bottom: 2px; + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px +} + +.accordion-heading { + border-bottom: 0 +} + +.accordion-heading .accordion-toggle { + display: block; + padding: 8px 15px +} + +.accordion-toggle { + cursor: pointer +} + +.accordion-inner { + padding: 9px 15px; + border-top: 1px solid #e5e5e5 +} + +.carousel { + position: relative; + margin-bottom: 20px; + line-height: 1 +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden +} + +.carousel-inner>.item { + position: relative; + display: none; + -webkit-transition: .6s ease-in-out left; + -moz-transition: .6s ease-in-out left; + -o-transition: .6s ease-in-out left; + transition: .6s ease-in-out left +} + +.carousel-inner>.item>img, +.carousel-inner>.item>a>img { + display: block; + line-height: 1 +} + +.carousel-inner>.active, +.carousel-inner>.next, +.carousel-inner>.prev { + display: block +} + +.carousel-inner>.active { + left: 0 +} + +.carousel-inner>.next, +.carousel-inner>.prev { + position: absolute; + top: 0; + width: 100% +} + +.carousel-inner>.next { + left: 100% +} + +.carousel-inner>.prev { + left: -100% +} + +.carousel-inner>.next.left, +.carousel-inner>.prev.right { + left: 0 +} + +.carousel-inner>.active.left { + left: -100% +} + +.carousel-inner>.active.right { + left: 100% +} + +.carousel-control { + position: absolute; + top: 40%; + left: 15px; + width: 40px; + height: 40px; + margin-top: -20px; + font-size: 60px; + font-weight: 100; + line-height: 30px; + color: #fff; + text-align: center; + background: #222; + border: 3px solid #fff; + -webkit-border-radius: 23px; + -moz-border-radius: 23px; + border-radius: 23px; + opacity: .5; + filter: alpha(opacity=50) +} + +.carousel-control.right { + right: 15px; + left: auto +} + +.carousel-control:hover, +.carousel-control:focus { + color: #fff; + text-decoration: none; + opacity: .9; + filter: alpha(opacity=90) +} + +.carousel-indicators { + position: absolute; + top: 15px; + right: 15px; + z-index: 5; + margin: 0; + list-style: none +} + +.carousel-indicators li { + display: block; + float: left; + width: 10px; + height: 10px; + margin-left: 5px; + text-indent: -999px; + background-color: #ccc; + background-color: rgba(255, 255, 255, 0.25); + border-radius: 5px +} + +.carousel-indicators .active { + background-color: #fff +} + +.carousel-caption { + position: absolute; + right: 0; + bottom: 0; + left: 0; + padding: 15px; + background: #333; + background: rgba(0, 0, 0, 0.75) +} + +.carousel-caption h4, +.carousel-caption p { + line-height: 20px; + color: #fff +} + +.carousel-caption h4 { + margin: 0 0 5px +} + +.carousel-caption p { + margin-bottom: 0 +} + +.hero-unit { + padding: 60px; + margin-bottom: 30px; + font-size: 18px; + font-weight: 200; + line-height: 30px; + color: inherit; + background-color: #eee; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px +} + +.hero-unit h1 { + margin-bottom: 0; + font-size: 60px; + line-height: 1; + letter-spacing: -1px; + color: inherit +} + +.hero-unit li { + line-height: 30px +} + +.pull-right { + float: right +} + +.pull-left { + float: left +} + +.hide { + display: none +} + +.show { + display: block +} + +.invisible { + visibility: hidden +} + +.affix { + position: fixed +} \ No newline at end of file diff --git a/trunk/research/players/css/homepage_main.css b/trunk/research/players/css/homepage_main.css new file mode 100644 index 000000000..0febf238a --- /dev/null +++ b/trunk/research/players/css/homepage_main.css @@ -0,0 +1,135 @@ + + +nav { + display: flex; + justify-content: space-between; + align-items: center; + padding: 1rem 2rem; + background: white; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); +} + +.logo { + display: flex; + align-items: center; + gap: 0.8rem; +} +.logo img { + width: 40px; + height: 40px; +} + +.nav-button { + background: #4285f4; + color: white; + padding: 0.8rem 1.5rem; + border: none; + border-radius: 24px; + cursor: pointer; + transition: all 0.3s ease; +} + +.nav-button:hover { + background: #357abd; +} + +main { + padding: 4rem 2rem; + max-width: 1200px; + margin: 0 auto; +} + +.hero-section { + margin-top: 3rem; +} + +h1 { + font-size: 2.5rem; + color: #202124; + margin-bottom: 1.5rem; + line-height: 1.3; +} + +.subtitle { + font-size: 1.2rem; + color: #5f6368; + margin-bottom: 3rem; + max-width: 600px; +} + +.join-container { + display: flex; + gap: 1rem; + max-width: 500px; +} + +.code-box { + margin: 0; + display: flex; + flex-direction: column; + /* gap: 30px; */ + position: relative; + width: 250px; + justify-content: center; +} + +#code-input { + padding: 10px; + border: 1px solid rgba(0, 0, 0, 0.5); + background: white; + border-radius: 8px; + outline: none; + color: #000000; + font-size: 1em; + transition: 0.5s; +} +#code-span { + position: absolute; + left: 0; + padding: 0 10px; + pointer-events: none; + font-size: 1em; + color: rgba(0, 0, 0, 0.5); + text-transform: uppercase; + transition: all 0.5s; +} +#code-input:valid ~ #code-span, +#code-input:focus ~ #code-span { + color: #4285f4; + transform: translateX(-15px) translateY(-18px) scale(0.7); + /* font-size: 0.65em; */ + padding: 0 10px; + background: white; + border-left: 3px solid #4285f4; + border-right: 3px solid #4285f4; + /* letter-spacing: .2em; */ +} +#code-input:valid, #code-input:focus { + border: 3px solid #4285f4; +} + +.join-button { + background: linear-gradient(135deg, #4285f4, #34a853); + color: white; + padding: 1rem 2rem; + border: none; + border-radius: 8px; + font-size: 1rem; + cursor: pointer; + transition: all 0.3s ease; +} + +.join-button:hover { + opacity: 0.9; + transform: translateY(-1px); +} + +@media (max-width: 768px) { + h1 { + font-size: 2rem; + } + + .join-container { + flex-direction: column; + } +} \ No newline at end of file diff --git a/trunk/research/players/css/whep_main.css b/trunk/research/players/css/whep_main.css new file mode 100644 index 000000000..51c8f3804 --- /dev/null +++ b/trunk/research/players/css/whep_main.css @@ -0,0 +1,309 @@ +/*=============== VARIABLES CSS ===============*/ +@import url('https://fonts.googleapis.com/css2?family=Quicksand:wght@300..700&display=swap'); + +:root { + /*========== Colors ==========*/ + /*Color mode HSL(hue, saturation, lightness)*/ + --background-color: rgb(255, 255, 255); + --preloader-background-color: rgb(255, 255, 255); + --preloader-text-color: hsl(210, 30%, 10%); + --secondary-color: hsl(0, 0%, 65%); + + /*========== Font and typography ==========*/ + /*.5rem = 8px | 1rem = 16px ...*/ + --body-font: "Quicksand", sans-serif; + --second-font: Serif; + --h3-font-size: 1rem; + + /*========== z index ==========*/ + --z-tooltip: 10; + --z-fixed: 100; +} + +body { + margin: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 20px; + color: #333; + background-color: #fff; + overflow: hidden; + height: 100vh; + display: flex; + justify-content: center; + align-items: center; +} + +#rtc_media_player { + max-width: 95%; + max-height: 95vh; + border-radius: 18px; + box-shadow: 0 8px 30px rgba(0, 0, 0, 0.12); + background: #000000; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + overflow: hidden; + cursor: pointer; + object-fit: contain; +} + +*, +*::after, +*::before { + margin: 0; + padding: 0; + box-sizing: inherit; +} + +.form { + max-width: 60rem; +} + +.form__radios { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(20rem, 1fr)); + gap: 2rem; +} + +.form__radio { + display: grid; + grid-template-columns: auto 1fr; + column-gap: 2rem; + row-gap: .8rem; + margin-top: 1rem; +} + +.form__radio p { + grid-column: 1 / -1; +} + +.form__inputs { + display: flex; + flex-direction: column; + gap: .8rem; + margin-top: 4rem; +} + +.form__inputs input, +.form__radios input { + margin-bottom: 1rem; + background-color: #556; + border: none; + padding: 1rem 1.5rem; + color: inherit; + outline: transparent; +} + +.form__buttons { + margin-top: 4rem; + display: grid; + grid-template-columns: repeat(auto-fit, minmax(20rem, 2fr)); + gap: 1rem 2rem; +} + +.toast .btn { + background-color: #778; + color: inherit; + border: none; + padding: 1rem 1.5rem; + cursor: pointer; +} + +.btn:hover { + background-color: #556; +} + +.btn--success { + background-color: rgb(21, 173, 89); +} + +.btn--success:hover { + background-color: rgb(12, 134, 67); +} + +.btn--error { + background-color: rgb(199, 29, 66); +} + +.btn--error:hover { + background-color: rgb(158, 16, 47); +} + +.btn--warning { + background-color: rgb(232, 172, 21); + color: #222226; +} + +.btn--warning:hover { + background-color: rgb(199, 141, 15); +} + + +/* THE ACTUAL TOAST NOTIFICATIONS */ +.toast { + position: fixed; + top: 0; + right: 0; + margin: 0.7rem; + display: flex; + flex-direction: column; + gap: 1rem; + max-width: 90%; +} + +.toast__message { + position: relative; + color: #EEE; + background-color: #334; + width: 25rem; + max-width: 100%; + max-width: 100%; + padding: 1rem; + display: grid; + grid-template-columns: auto 1fr; + gap: 1.1rem; + align-items: center; + font-size: 0.85rem; + border-left: 3px solid #EEE; + animation: toast 6s cubic-bezier(0.075, 0.82, 0.165, 1) forwards; +} + +.toast__icon { + background-color: rgb(21, 173, 89); + width: 1.95rem; + height: 1.95rem; + border-radius: 50%; + color: #222226; + display: grid; + place-items: center; +} + +.toast__icon svg { + height: 1.3rem; + width: 1.3rem; +} + +.toast__buttons { + display: grid; + /* flex-direction: row; */ + grid-template-columns: 1fr 1fr; + gap: 1rem; + margin-top: 1rem; + justify-content: stretch; +} + +.toast__buttons button { + background-color: rgba(255, 255, 255, .1); + border: none; + color: inherit; + padding: .5rem 1rem; + cursor: pointer; +} + +.toast__buttons button:hover { + background-color: rgba(255, 255, 255, .2); +} + +.toast__close { + position: absolute; + top: 1rem; + right: 2rem; + font-size: 1.5rem; + font-weight: 100; + color: #888; + cursor: pointer; +} + + +/* ERROR MESSAGES */ +.toast__message--error { + background-color: #334; + background-image: linear-gradient(to right, + rgba(136, 7, 35, 0.3), + rgba(136, 7, 35, 0) 30%); + border-left: 3px solid rgb(199, 29, 66); +} + +.toast__message--error .toast__icon { + background-color: rgb(199, 29, 66); +} + +.toast__message--error .toast__icon svg { + height: 1.5rem; + width: 1.5rem; +} + +.toast__message--error .toast__heading { + color: rgb(199, 29, 66); + margin: 0; +} + + +/* WARNING MESSAGES */ +.toast__message--warning { + background-color: #334; + background-image: linear-gradient(to right, + rgba(145, 93, 10, 0.3), + rgba(145, 93, 10, 0) 30%); + border-left: 3px solid rgb(232, 172, 21); +} + +.toast__message--warning .toast__icon { + background-color: rgb(232, 172, 21); +} + +.toast__message--warning .toast__icon svg { + height: 1.5rem; + width: 1.5rem; +} + +.toast__message--warning .toast__heading { + color: rgb(232, 172, 21); + margin: 0; +} +.toast__message p { + margin: 0; +} + + +/* SUCCESS MESSAGES */ +.toast__message--success { + background-color: #334; + background-image: linear-gradient(to right, + rgba(12, 100, 52, 0.3), + rgba(12, 100, 52, 0) 30%); + border-left: 3px solid rgb(21, 173, 89); +} + +.toast__message--success .toast__icon { + background-color: rgb(21, 173, 89); +} + +.toast__message--success .toast__icon svg { + height: 1.5rem; + width: 1.5rem; +} + +.toast__message--success .toast__heading { + color: rgb(21, 173, 89); + margin-top: 0.8rem; + margin-bottom: 0; +} + +@keyframes toast { + 0% { + transform: translateY(150%); + opacity: 0; + } + + 10%, + 90% { + transform: translateY(0); + opacity: 1; + } + + 100% { + transform: translateY(100%); + opacity: 0; + } +} + diff --git a/trunk/research/players/homepage.html b/trunk/research/players/homepage.html new file mode 100644 index 000000000..bba38c271 --- /dev/null +++ b/trunk/research/players/homepage.html @@ -0,0 +1,330 @@ + + + + + + + NPL ITP Intranet Livestream Channel + + + + + + + + + + + + + +
+

NPL ITP

+

Intranet Livestream Channel

+

Connecting to the SRS Server ...

+
Loading...
+
+ + + + +
+
+

内联网人人都可以用的超低延迟直播服务

+

借助SRS服务和WebRTC连接协议,随时观看直播

+ +
+
+ + Enter the Stream Code +
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/trunk/research/players/img/school_logo.png b/trunk/research/players/img/school_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2074e57746170079a9dd182b750ef3a4e69d8e55 GIT binary patch literal 59672 zcmbTc1ymi))+P)DIk>wY++BkNcXtbLa0~A4?(V^ZySp9S9fAiB7ThQA{qA?y%)jQh z>9xAMy6UNCOYL3VtGXhU6{V072oNA3AdqFG#Z~{_>;9gt0NB6RhK9w%zc+XXX&q+> z2t>?(PDqHX96SgJ7y>JGZ5M3?d43anJ7!~3dypBkhn>S;Gz5fzu!n=OiH(^H8OY4S z>YE_&va=URW@Rb})Z$WLRd5h9v$T@-axzo%QdBqbvN7Q^1qut133%}TC9pGdF(&h{ zv;F4G?;!~M7cc+c@;}uqK(c>9Tx6SH?RBjaXfWinx9cT=L(t{yqr;EnQq3_*q!o z-QAhpIhgI8ELhn1`1t4ooxRl+|-1{%+}1# z?3;`8Uo6{yunv~?F80or_Ww83|7reT1pIZag2I1f{BL!!v-^(-XBP>#zh?Z~A^%&n zv%05)8H=i!v%Ra6iJ64kUo|QIvBrU4%*o8y#okHX-rn}V2TJ+BRVHI+XXYTIRWLTO z`u2|zbpKNqGjU@VGeO`#m_@C=##Ke@H?9Hug|28@o{rAu`{#%OI-y8ewlC1F2>(X%w)s` zfq&h@Y-MH2Z^~=J%>^=MWn$%HH)i7G<1lC9+{C8YE|D8N)W{&?Z*;S$5nyHt{CBn0|FH-Di`L!J>@Vs6LtOk9%-P=D#ogG+OvK`^xBfpw9?M_#S^i1d z|FVST|7zsF+Ww~m|8Mx;S>vDLf2OOy5C56)%)b4d<(&RbXSV*^s1OkQ#WLa|>K-}2 z-`q0{v|K;pd+)c(Hu<}4I8VE^TYe%k8^tJaO*Qd`kYtg65e*nhkhLtxOhfakC+=%A z(l`Cdq{n<}Kw-t1wPpX=?DFkxKPCo}uWjeojX>|VSKf=IxyvQr(M99*dS%y&cmGEb zsPf@n+dKTm-u%jl^ePB#4)Fbx2w`cmp5Y47mvpf63088Umr^NDuu+s5^fDWN3^ZOZd zD!kw3dei%K-0&sgQ*V#rqrZ4yyzR^4`e1i&djr8#j>>jJ6`fYE_L4W^kLlk>qdQC; zrQz`{+_^X1TyiXLQI_4NS4zHqo$j?Wg%XKq148dSHZZ8dzZ1rY{9_vi|0wwqLrhWx zI>#G?V~b{Nw^PSKBO$@_D^>_ydwr;b&WZcuM*QCM-o@OzKksukH(@DGH*+$HZm7f| z34XByN$FI;^yal*?aegR`fh*nKfMt)coNpy36%OU+j{TW@Gs8b^W6=4nCHDL8PbU) zwdg0XE_vZ?`v^z+y)B`%l7-47a5P_w;P~}?EoUK!w`m{o+|l*-ysGDlTv<_W8G0Pn zr+vK==lXrQ%}l z!Lo;OvZ;jAi@EQlYd+V{PnBE3f5grFsX^yU)*plMJ&q5%hQ4L>Cd4;5J!z$2HRZ*U z6`WX%i{3z{&K{+`6xc(i?%yn(=`-E$A5Ipp!Wuj08@1o!-QLcs`CE;a3Nhb)UJ(g%fEtAKBh{Q=V`SZzC0-yzQU4=N>D|#}L$6o;~$GkB`UbM@( z(xpAg6?vdSmk0-2xaJ=R@9l`p&!a(+*r*XV({gzy?XBB47pWA34AQRs@Hdp5dw#QXmoh66Q!o6=kaVS+3lZqxXfF$!69?6LKx>KcA zJS8kb%r(BnH9zqFx3p&4UodjtC|t6%{nl~e8=U)8R#%I%$xF-P>mCXo@`dWppJ$LK zg`Wv_W;q01x$p%?ZW?>Y+t9f=jgx(zG)t(Y8V@eX>!WkgrlXk;enYeI?{Givg zEdCmExx72udn*%fb2)K)zlHv)bhPE}F-Tx@K9IcPo6wOqOeSWEfuRu|aZ4tmJQH=0 zKD*o=p{B^8p2KcNMf(y(XO@wcRzVRF>Z$lO5)-pCnUYhr7I8Q%l~MmqsPOmkeB|-$AK{Ms;B4n|mbdV|v+tF(oj*n2po+P**~CEP zEcD{Z59mv>fQ={zN|A|3M(sz*#7U&Qrn8HQkKN5r3xk0B`3xUV-^*FBvd zYzZAb1#j|I<2%}<=u@+uH-s@nPb3VA=cNS>2$D3Gi97Ug>H)C?uyO8_J#U6zeYeAu ze3kcx248xf?W?1=x-UI0G5uI)(n^CxH~E{G3PUDtXK_&MUW6ifq-}i(A^;Pga`;*Y zT<@G|rTAhHsb#((RIvl{2yvmPW?SSlv>P(n(q=ZqJUa%anS{f3;C^A`S2$T2Tw_Er z;hKoYeZK?d?4d@1T@6uwzP^MvEstluXX6n6ew)iC{rRMXe4c#dOWOAEuzl1v%3EP9 z5up+$%|J;40wH>nJ`=UKa53sWz?wEBjM{y#-zS1aeILlqY(E)P5B9U+c`HLZ+dncl zj$`>aL+E-aP^$XO+pue2*j7${WqtfgROOT~h9-sb9+23RJxa+8hw2kL&@l5ohr760 z+dW2^Wa#?LZ^Vm8@Hw_Bk3{%rb}QefKkOwPKAFecEp_H+?;U1-HXiY_nV7Li7g^(X zdd(hcs2{1%=1ti1uFjU^=m4j?I}Z@y!a;XaQ*LyGE?rw0Yim=Y=afb%Dt1H;boe5V zLe=3T_wTjnITT(5rW?+qvJ?8r1cs`CXJP;$CdyAyWo<>hH!rf_I-C_Nva7QY6FQR5 zan0F3=Qdm6d{Yhj-=&0G{2oW|XF9xIqOzDA9jt%He2VvZ-d~Q{Zr>^P&*j5;jZNDR z4%Di#Vne4aL^L)KcM5oW5tia@OjR{QH3RE3z7FoV8419#(6Z|49-K|4F|^orJfj#r zI5)D7qQ@!nY>~nuQ#Lay$HrY zH^J5DR69UzVhBQwD=WuFg!yxQKM`Nu!FHZj)_S+Yjs5${YgXnd(!SG*M_XBAk*kVO zgi?R4!tM)lCF;Z0ALNrCZ;t1K9~y)myC}WQPRI41Yc{{;5#$SXSctJ&SaBT8ZQfqK zpnTfziL*rl;DyjLW$NSbp9VtISi|9ZVg?5u^`^4096=L2Q#t#tpw zZzlA$mj3FZy4QzicN+21%b~gJV^*KJ!zjwZh@;tq^gzs8yYoT;>##S-sy5e*;$^M= z?>kiJ5rWCirW{!wb2ULer^@GctGE46|I7QEhLe}2ig&@px$dh)L*vnbK*K(Vx_&rj z`YSPVby>$!Ae?55;=iA#8>uocWI8Ms?c}?f5DL_a}N_ z8cL~v#GX95+-x4@GFu!vfE;}$5#BA89BE>QFhy;!nXk$)zL11L%mr)b2gC{j8j7)J z21RELFt37DXVd>=b#yu%r$V$He}rM#HOYpLP`Eb_9Jj#da4fi5kE!i2kZpPKq4APf zkiCvd-0}8nwq-4#!KSdWxj9_PI~?6Hoo4kjW#I|C?s_So4w%UE zxA2chsL)dL(n0|}FwR2VwWay_tKQ5;@8=uxo!ptRJtC=ht$EA)aR#$XPpK{K`3JwV zqlf8-9`6}CO7K;W+{IDo#61TllWBhi&+Pge0x*~6kDP}L3YcVXcDWLdbVIzf0I@O) zGWZVKuO;}oBiYL8Gh*Tl(3+&P)juY(08Ymryuv!H;Q^>KD?CM~=a6Dkfe{fcZ%FP5 zZrxLnn)%sSeoRoZ*&7BM-;uXcBrea{kXaPYeS@pj8{|Yq30vhdD;)@l)2KPY`q%J54d{R{HuyO+$Ff!#?Ieatp z7eHRiJ-PCmCtm_gC}N!OF5iScZTLsXqd0wx`UpKotBqv|)PBB!WY+7g%$ccuIsW79 z_j+(-8tA9=uEluO#}G{uhidmRYoNEWNq8w3oWL)hB=#UjmyIME z$}6p}Vov#USlJ0M#~XjKL`r6;9g5AS3C;Trr8ruIEI?emiTi7x@^-Gg!tY{b{m=#| zaY*4tBA!mDVhI9E#jjtS_X$w$w)*nKR)9J1E+XH%pcX!VM7Qu3B%L4a&XuTJqr)bs zfDo<5v^L;p- zo+?TG;75Z`LdbwhOc19uEitz})I>>_(r&3EPQC`jlI^>(w!VSnH{@h&Gl$e2#pSDg zA~xgwqCL!0Og)72dLeeFV8{UsSpz@Q(PJ;o9+gwW-Q0JE6z~$SqP=nFGTei4nSb70 zCn{(WTk3qI^9WfWaxu)bLtXmrjPH%k+I_egSvuV*+56+a*ut7dSon~9ZU};d<8}h= z6RSV3s2+R3=mNS{&AJ}Sey={;5oCF3_dM4+AllRqKwuPrs-#&ZDXQYp3HD*zT!|N9 zAcMPmzt6r3$UecQU`c;sMj#{VHG9EYa93D54Bw>$MQSy$uq zkhe4h4=9I-Y=*U>nh}9{a8#KWq1lm>Su=0ljh4-j;@da1MH#>m zXN$%b(gXwOjT+Dn(BlTE$?;dH%26C1cRq1$d?WbDZ3>zd#Uw!8E)S;!J2vpD1_X*a zk}zns)Y(61tu@>bR-q*~P5BG1qBP{0nLF?lc&13nMTOtD6o|`f@B@~{xq8dhDzi{p zabE2|v_67KKbN1S_@8=D;~;v(HC&hf-u{T?#}vMbOpM%GF>v1=+neiWrthcBo8Hw) zuh0WMYzEg_I(?s6{~YaTMfCjEN)raBF#ANBD-i ztcvXbcztM$N@z*ylTUdbL-S-r(aGW|u-`1&E*mFr?F)2IB*xhatz&J$!#4zM>ccuW6qi;ANkqZbu{SicazN{U{T(Dq#h`IwTzt}ui4^zoc>TdZQ%alBg+ov;QIkz zT!d~Nm8lE&`F_NOY4P|ZpOvpJa8s(LwDC z;+7s?!x2MF{MW&rv5Z>7-V8W5PF9P4POn=F^|BT;Ey>XXJqHbj3?xn3DiaZ2X(n>~ zBK{{dZ_+1D%;a9s{>75dWf(47NOVg1i&2aSLIOq|&XBX(Cns0YUvx39j=%6Y91+7| z4c4O;&;(^U9T5YuemQT_G9&%Mf*HRFGt_gVO9Oi74lW7+v|Qt*Bj zZe^|h#ouQp4_uPpe&}M&7g$WP$38wsDH#m2QmGo-VRZxRarX?zXJtj&zAR9^TvSs6 zcV;RBimlZbPwJPIq2eESoFun4jyLS4F6r0~jX`fU01w z!)JQx`8C{_l;`^i{yK~zkAGPrGo#`N*eqv6^J6Ybo-?q@@uDGEz<=o*j*B{-7i2Xu zamM$+5d6MjYUTyCVD$=LN&*xjY=QNSLBY@IjsB(Z~dHmbGHBZk^ghqLe2KLb75a6$>St}js0uUfWV2d zZz#L}u@hogU11>Qcmk$|7XjFcMZTffHS5_c6qiz(9E}@-*hC|?ykamBJv?#D4L1A} zSRAuNH-rtN1gZ&!oT!e2^MG@zpEq|{JZHc&9aQRg$SuDx_kGlhfC(5v z18)*uUmr3jGi=$M8Em3Jl*Y8!2LfXn@p23LtLGC*OQ=3i=cK_CWMd8Ih`(9HDEub8J7H)w&IdvnEBd9x_jutVo`PG=PBjgC_HONk{#4=aJ^WIt z>GSo~vH-XG-FaiGb=SU*6SH8uU*?8mPAV@zQN0O!^fr7q0EG5i24Z@*MZ!@JxMHG_ zLq*S$93!cE;b~Cda5be+F89}Chrlpksdi`=uz~}|O_HD!huWz7Q)NyOP3qVs>0!9P z&_HIcf=s{QS%UllE@Vm`VT}MwK|t_Ku&Kz3&>#>@z)=qpzW#lFi9~ z-=A-7&DnQtX3eGRzwGes1sdE$AW*r?hhmtFyu~CURGW~A!UsArs_KAD>gJ2}2%w4~ zTA_iGvXPun7`Rfj7`w$Ptz1LYBGS@TrQfCIq+=M^2B@&`zfjmkq%y-7*Gc26-A`!C z4r!Vsqm95y?-s)6FB9M)awpPel2_1&xFm?rc-ft$$R$zYnW*ITMPz8(2p9(4Mph4N z$EK2t(#6Q26$YhzcNGN+#yE%sB`pBHNCyvtLaAB^(5%42v?0l8nHZ7Rb>sc%P$L3U z+LM8BD9!UOM|^uzN5YSq5{sNM~;fuWy!|Po@-~Z0w}eE zA&4Lc6r8`yHW|65Da)HI0^(TPR4|u|-G%`0P$6farr;vqlpiCiR5%>cU1hIt%?b(g zB5M#@9Ye-2a>!>wF9EeN;Ti-pN*q8LEb=Y6#2(02;jr+CD;T3yPBKep+cvw#~27>ND+C_JXgT zTLlxX0$1BSP`y6Oi0lmh?6@GG51vz$JG;lDK#J^-KPDeLp(tla%_^YcOdKuSEMW!;#h@)u)B zL<}x(lHhu%=ph6|Q3~bqZ3{K!_C(lNNkQbHa&nQqJv>r_+``ID;1I3vf^**8vu-v- z&~2r(stw(OYdwYy%m6_#tCj4Ob+HEE45Xrs1rU3#<^lwx!!j_^U)PC(s=$C)Gy?K3 zkuKfMiERU7cyJ1@Da~Lu6wUDC?|GW88S%ZZkc}NQ?%rG359@i2z1-JTxS_%YFw9E! z_Q?CYH~x)gO#2JSJDOJs(!|E50jU_q@5+JIGBgo*x`8-2fr|Zn5x3^rsd;(<*f`nij+7{FEvAel zy;e}hSU?$vE`&%oX?fV7kRd3p*c8mg10;Lz0|S>>f-OfIRQjv}9J5FtIIUDiF$G3v zvia~igjj5NS?|&PfP?sR==;@S?PxCUO+mEsJFIdqP#cg$^z9^$et zP-nOv9~vbHS_F!JGuQSx!({f$skwj|GItiQnhAg2myl{7_d#~g1GCQQ$z_EW$Paru z2Za|ftyHI<^pa^g9kN$cmo?e4Rh%-h`{(!bAc6N}nB6eTY6sH*7ZXNwet0&eE16-o zYOjX-Jd*&z>kUIvmcqC9-qn3k%J}jdd&E(wN-W)HO49^I{OvS{JtVFb8pp=TDb&A< zrWZ#|lA$$~*DK~6D_d**kZR!(<3GrxmdaIdb*dnPA*d2$6VVc1?+ZzAZ#r@BJ_`$2 z1!-J;{$R;}l+3PZtlQB|&wwv>l5UD_#yBZP4e%%&5Sn_^-GIO}ySfQxO)f}?j#x}d zYENx1b1$Yz7mkEdy4zggW%IRHVykK|o5nv_{|T|*k*YmSR@FxdMdkVoAuPex5Ht@t zKuH-19%o$k;%(GTD=m-f#*ORj7}1c9^B&1Z(oai^9kv%nq{Sdoqf%!sNTH0BqW(5g zj@;;X!I|E@qqy9}8Hi(P!t1?efBenr$f7lG$k!W3xgJAGx8fTB+#j`=$|f%DQ|xi- z_pp$-Pu~$B{vxgz#EM~f$TmdDElxtS^5!xGz3^i;R5c)fD5rCeR^jVHf?no?_+{%QR>QS}fTeUl@_or?C@qT8^v zwKRVEHJQi z*3*0Dj~rY+okSl;OJDcrUhYfF4^+SU65(DWEq^uR?JpGMh&pS05(f3eEcWnYWIy(d zWRhquw*B?>6Umo309IF`>9DQod3kICM;RaHq#rA?p89u!TMJhC>T~fQj33JinQv8s zX?{^?=uPGVIPS3x)=!XWIM5;sYl}0!r0lH_zPCpyNg?t#Ym5Tb(PG}c!&DYq!>6g? z9!;&$TftK)3}e67i`USYVD5R%PRqPEm84P>q~(b{)u<|#R==K_Qr3*@u8H6gof|JA zMNaO$1nKeAf?irks?a9w38xwJ-LHmk3hiHqe#DZ(lK4;`c}Q;iIb3?*~0`UR2zONuWWEvaoM5mC@a($^%@7~b=m3{!9Y ziTc#ENUeI%+}m9uNg}M~&=t-oY{}kdfM-3J!`sG;j z()PGthOP|x?C~`XM%XDr0^JZ<88PeWw43J71e~7AYy4Zizj_yd{vA5)y3^*5XG~F`_LD9^@(`vj+YAL8x=0>J!xUA_?_=L1G|B1#Imco}HMFI@zmUj6CF}VMGF;E6Xv_ccd z1&B19^a zCeSg0E@ZSY!bywmtQm~4jEiBVzO#vIN8vrUz6LZ98(mbiCPXj`5bjE+g4nA>;H6ze z3k6(KB%ajpILEE})ENXi?ucDDbL2OEx*NYjx28$)mF#bQvcrOB8^FOQ>`CRxcSF8E z&iv_S#N7M^R9&d-Nc(~={giS&n+O+Y*H@1XrXqtGCh*`lu2Mb-6Qfyhv!FEey04KV zFg?l5=C*rYf4)zj8{3LAFCeem=|F&FQ6c662%1M3V1R&oZj(api&Zfp*10E0Wb+ z$F{6srxWb}yjHr#&oB*Bt%J56Y20wGo_CMU1qc z#$h=%$Gdi$kQuXWGJ1bsj^Z2|n?)pIBcXp+!y!xr>H2?|6&K8MZ zcS_3NILoSF3LF5NNCo?t2r?nXVc)B*u+#hoPFX2QL>Ztl>?qLS5dc>Jkc7DW6xR^F zjC02tgcH6%L7#T<{`b^EYUuSu(}*j1r5Rf`4Oql>g zE=?p6(+7YnmZQY1DAq<{07;Hq4xJLThq*aGvk?@@p70YNrCOqjaU{Aazk@WHy;&*` zXRe-|?`LbM*;*p;y#aJlN?K-d3_T1Edw75!Sf8JU-=bFu4+v#3-Tn4v#k80`_(!~S zaoX7L8yOfRnVz4CX`EfEGKW|&sWg0envJ0HSA_(5z)>{6{PK;Y5tsMva5o2U6j#H~ zdNaUj$q{0KMbI@@MlIHERcHlXP1m<;_u+R3k2xjIG&J^oOh4kK4v4haiAeGWnV{{GGPk4G!t5; zEA$rsw2qtb!XZhI&%_w?5}$a5596|r=HBqakQ=0AOyZKp^B^$4?M_taDJeU>b4f}_ zaL#*VgWxcq=Se;8E(L2;0z0lSm$@8N~Bl z0(VJrjlch*@NCrb@v;Z&JqJ|r3xVUpQI!oy*HpzR9_>h?(iph`*t`Q&YK(=c;jV%R zu?i`OLg?Lq&tn&zy>bRhpA}*aV-FCSi2YefbX)4=%*5|(d6hrt+!fro=EBdqyeVYlo9^Q^(R%%{; zEeFfBAJn_)pDW*)0DOxTD%EQkBJER(V(uFLH6s zF5lsx*nc2wkUo*i<@X|u*eC@vo1p(_f-uTB&q(NHQU^e)OBYj(GM6TtnEyHcdfLS_ zl&n#>t1{3pQdo~}y`Y8#roq2FqshxD=Hv|`1pg3suB%VE? z{%~U9s#@BL>|=~$d|jr{8{LC85C??~{nECk_`C9W5(#fwc&$uZUC%)g6B|?DFx#9l zo+#pDH?|n|9fOr*8yvt9IjaLI;ai+j-1BZ?%!uDsj#twv{<$XGQj%z^2A7#L@;FKz z^%Xbt8S{s=^8D~nxs&dJzB{8HHqwMS;jS5HmPeC6+L=-#k^~ z*iTQe@j0Ppq``SPAb+^prVlxak~XLVxOl{>yDyC^HO*XvtxXkyZb^wk*4&2<8zPZh z?3X07z@%%#zaYw9s$a?}B&mp(WF6{YPJk^D^Lt&w(}##;BQ_4xv}F8O+}AzX*gE|I zL>duul}sc>$SNMOMeguiRR7FUs)ya zAtzihIG(>B*4d5(U&U{d%!V4$TXR~oYqxWZXJ#>~K1ZTsaM-w{RDjOaXdKeNA`_aA zMgUx(^NNwg*9e4r&ei{rv~y_LKXv~7U~R>Gw>|oBsrqnaS#3HwufdG_D$MP78*2D= zUH+3RMFfT^VijYo>FsST>PUV-9x`{PK#uDD;voLdpW%lhP5PO?zMpv_x_Aifhr{Lbj8YrQAeVRkit%TfN62&n8pa2 z&NB1ZJjcSB8n&yZv9yKdNq)u<4Rld;h;cNZsK!CohOdFjMBq_ z;y7DK)^184u)-=|T4)?aFoUM04JQ~$Y*Z#lko{hFa)Cn)D5+EI$c|zKYuc!r%Z4N; zw{5g?co`+^GQIpD=8wt1m&~ST3*(KtRu5JE4x0~qE7_g{ow8#i#q z4TXK!F#{>tqWWk4J1_*Fb34ze|9EHrNaLP6(8;wG0g-Bv6s!#RCzS?g+A>^pQTG?gZHtgX0{0_s{ zVgy?O4Ev-GCrpd{wnT=!-b`5kYl}aX%&+P;XPxocLw>5bg+!ZouWc>oQ}MrbnC-oP zyX=8t7I)xDsW7W#_z3c!LlZ0}Sj>y7Ae%UoDA=CQsIo0zY zFDTgFiR6~_YYyJ6tR2D65#i=h5%wpkF3S~r%d}9{ZYMZBOXvwtz@an0t_u*SuprN< zp`sFIGg1#hgR)6dFK7}0NCV6_9@L^MB!b)+Bdf?ufG|M_DGooxakiZu6$ln&;NjB( z04C6hnvV#k>e=V;u89bR(8bMd<1(KnpiOfIh)dG93cqBneRsV#v`JJ&vmw=j^2^hg z%k$CWG4Gc}n~nMVs~}EHmwtgV{`}YRraRj24GF6=6qJuckyj8!rk1T~KjGJ@g2W9g zOC9Nz*JzoDS=pdwS~{x}PoC6q0Is>;_|+En&*rk|q@p-We3SECNM!Dg|Dd2KrDjCuAk6V zg>RRU>p|jkOS%D@`vKhL``gT`$gzjRh`+mfng3l$b@+sZ|I0l|y+tA9t~M6z2%di8 z$PSuZV7hjbLfuz?I#}6!h-?aou(!V2Xt+W@_M|KL~+%9 z>riwAY|%XgjLdI?T!?h1x?A6C(SG@ps!Ol(_kG z!0YNd6#md~X84}kZ|@hsduDHbyi92P@a7d7HuI0kc( zVuLV}{G4-6qiTM!cmR{UKzWGY?m=Z)wHcNQdL98}~v_}C^A4t7mhfd zKx`5XHLHr=rTc^YHixfmB8_d02O_(LBWZ}SZO4V=aU!0*WB04N z&8LfwX8HJdw);Ml#R{&&oErfQx_%+#K4BP?1j$=Yn5;_{h=q}OGT;ns@cI;c7d6$%KRXYK3ns>ygl!n+mXjiV;HK+eERJNt7IkP>{K^1@f2b0EgknY7}_f${kb8q_cGeLt>lTO6Ike1N% zb!>juY1Rnldav^`PmkyH0j6)OAFy`ad8)ds-e?ypt;I~lzM!liuhFX^r@?_{;wT*IxR9$F7ozo3}Vqso0&)$Amk_e_0*EOe;Wy zP5}S}YQqZ{n7wvn^WGNa&pGbmGrn&;fb{rhBgulHfj$hXm1B%T#!fL`@T~L1N>%r- z+;SC=9jYwSJ7q4&Q!qXMGwp+)+v?$KhDa_XBD`-nA2rmBy|H ze-c+)i21e!?mEg>Fx(bFvEP^o(&~j>n~zAwvyO}BpPd*5haYBQhMoEhyVtPj5@kEPbK zETE)Hf|i0OV*Cb5R9Vj>9;EGP0i9l> z%7>1wb_51!2or9-k%^(M>;#WRiuWn((i+n*4(w(+Q&(#6_hMXOa9Ss4slhtkr&OFS z+zUyWav)##(k}bhNlr!IcRlxS{BDmU=kJNR+k$V(m%*gdzm~bHc#jY#h2NZASYB{{ zf*Du~!)q=kPJ~{BkA+@pby`>lN4~zJU3UIHn$%!R)rC)#Qyw7yAtYl&Lph&6(1`wZ z$-?u6GCj|Wron@rSWY;?HOrwSo~jV16R$5ZY1Vpj6oBgcbOvpS)Ad@Caj03BR8@)g zEk-JeiPjT?jjca%#y_;6wI}}5%C_Y4BHq)3ef_1HVc(iN08{I@*Y4BC){Ubi_s?uy z=v>wgXAbTv;{k$~o)@v(`}0K!p*W|EL>&KNC|fbX1-HXyTyEeSdo%}n#x*< zkR_}ZIwp1V47}Xp)pZz=05(=^jf_I^X7;Elf-IJ9h*}Gj;b4;?;f~NX-&X~FklOv_tQn%Y#+u29G z0~m)8iAbneIpHsQHxr%*d~jA(+y1ZK??W5HgwS$`qxhV$zf1>ZD!l4H{+;5}S!MGDpvPGC7YE+Zm-lOhrJJTn?FDmu{ z+8D0f`_L$AohTToMYoDHYzGvd9+v~-NqjMDD6^}ElvTHI)qYlQc+VVP{l;JzCS+r;E;GD9XTQWz+O7#b?iqM zde8E1b9vY72y(Xk`rz4cGY!0k>YDU&A>sb^0ZpAlmV!|00EMXK8}Pk+jF6yx_Y#)J z|Hqvpj1a%yN06-93S#<W}>j+0g5qEj?~dP z%YxJ1hEFzM>nvd_@MZgxeem}ws)G~KSVtQxb$8ai6-&7~5{tZr!r9>2V2z211cO`1 zH3{`8eoUpP08W<~2gkU8CK5}Hi?FC1*TI$eoi9g7{_k=~{tpBL_fWaDe&liKG&MK) z+nw2Ax}j+|%N!3$a*1|`R=f{T1kAkAhsl~IOybl-NK@av59e>PqOGdHG233Kpo$nI zpPXg$$&iA#;dIuI>RK@k(cfQ$9R(Do!o&vx6s{*B6IjHYeJMWak?xQ3yhrQrE%cak z>6%?d$F_w6*+I6|GSZe<(tn-kAf9uZ(6Kf+5 z9&gb(tG^%EH>amKf37%|d`;ZImpBpqvHtr`^W4%6zw9o0DeUE7S&#*1=AI}{Z3mK` zn&W)hFE=4P$p~Fgm9X{kLF+di7CN02V*|7u6V)n)Fv7(wwzV&@tAbOofrEQrm z*jrXR-HsL(6qjsL5qQzZNbKh)U$!$kf7w>j&+DIDyfTTd(nfIpY-wq0!oD(k+^zTH zw=Y(Bz(COO;=Pb8yIR59`Q@PJ8ltpmfI>wI>IGOqKZYV9(wMOpO(eGdrKad13RQKj z8~+l9rSy*FYy40`?Sv6Ke%DZ`*%9#9020tK+E9vcfN0!hONs8R_DZupfV+EOCk77yTN#0 zpFc?V+oO-GC^_HLrMUew=K2Y*i)2jo4|cY;1J3GCo7~m%^Jn&&w<#AoGI)A!A=3_C zRQSK}V*~a2cY1IQTZEjH4lJ%V0}E zM0YGGwNXs|uu@DV5wEG3j~jR1=ji-hKKQk33{e2M5qsbdG)6Fc(A*2@&elp#vJ|s7 zoEqwuL?I2Wr`qqA>t@^MV+%lq+3z8UPdu+d()gyPne6b6T;djjie4X|NAo>lxrCLL zC(!8Y9Ah}Y)1wE%^E!P9jSsuw_?;G2eLTLbf_y9?I5<*EpQ?bI@ccRA(h9T7 zN$eJ~b&dmlCY|sVXz+ntVGi85M9A`DDJ9N#`0`S0Iyz+9TZ2C*3`NH3SR&^d9!z`v?Eg3>)#6+{kI{o2E*;9)lpc}z0b%R&8pcRAH_>MNU@eRJIa2bQSXRcVEgFS>AZwa_ zLK%)#P9hzV;68UNs7znJBS*f{<4oN-ma zs7I5F>--KMs}ojKnuAk}b^GK1=JM>@9xm&V{dUmG+T<-U>YhfW`kblj_}+!MQD=wM zW20PRee}GQEmM<78_tX?{v^MPz6<%0{|TZ?&pmQPhZ_R&x$-0?N*pLWoUT(DBP|E1 z{P)I~5${w^^vuYw8+B{4;`kqyQFnLHh@I%vW~+|HUzUL2*)|$x3Zi^q#HYPds3+W9 zg_rf_CUw#A1A?z?Mu+uNlzxfN&NCubky*pat=+pNlfE;0zNzCXx@^@@Buu{o3v5f_GJ$Fe#R1O5P(4w_f)lslXS~)Jdo_vJiRl+){dQgI7tv;pe zh9hSWe)cEp=jc@o3HY@*oTM6al%F>cv2gd8j0VYZ*sNh4*bKC^>0^W>#c#=%Wo6vM z1(p8t?3~j>M#9nj%*OKJNIzX@h-*EGo2Ddcv;)2G%ZI%0Rq?a>E9rjlFLs||H+B7{ z+M!Ij+?d(fB;>nI&L`7qq6npS;p%BIHN&|KTEJH%Bf>9PqXg`-QepgAiiknS(pyK{ zBwhrH1PonfOq^W$(!{^*AFaL&f0$l-6P*%fAHOWcB5nELo>#8SJ3i}J(p~Gb4pPL# zp#aYWb3kDYP&_g}?ubD?FM~}h7Gt;^x0mZuVoIp^+cYZphXzh;dZcUeMgk3Mz@<61 z*JTJDt#}+1bMqLA?Op=mqe8f{gd4`hv(nh&H>r&F4;9eJpuKJ2NH+3(OPTcv;C}#l zK!(3VL*Hj-e-oQ}>xgp}V@g<^IW7g4qhlf+BSn$3mu=zV9;0$-KN%EiaSz4@SaNh;crK#OXW-Yj&=$rh9a7n`gT&Qo`_th;re%eZ zM;;?iLQoD_VHvo86J}LsX#CLqC4n(%NRvRXowX9#v5#67T|YiO>eIM5?kPP+VtY3^o z;A#hT?%8-NmJ+!V-Pk}J8Hgsx`2l4IWLTzp%bo20$1k(<$JbDoR1vr+M>BfoZ-@>Y zr2do>a67vIuvX8qA!w$icVfg88}_auiVB3a3V{ut6qV=-g|Zpu6t?n;^}{53KG_AA zVnr4qB7`+mZ3!pePIvdo#MK&e7Okgi)mt&S1sJJF5)bRug9wqvMaKu37<+_lVeXyG zxn)uUU}SF*5!z<>)9CEAiq2IuRtk z!H67l*S(vC&61N=?ZBaoKoDuL=JKYr^`HP#FIdG6jCn=USlOub|3e?yLdUO<#El~fi*RkfG|B6f`7(X(?+P}MkAYbIs zFMX4}KmHzKYKYdQ^C>RuVCb<&sT|siQ!9b40fu2wrBo+~Jxj7>HxGaEDx7ka@~sa* zt&B}Vj@)_=<83*JG?B3wAy7jTj84rk|MHiUJ#!U_G)QG}ge9K{bbA}8{M{8Sz4%sGrHuWm9hxrkW@41SC1EIYv78yDx*F zJQMT6wMUqnE7Ntthl%|nmKvT)=XrRdfHe~g4DKUweU404sOSPlCYU5biiFsyVYI}= zmV>>&V0?1hbaTtxn}xVCrA&7^-n_GJCUZ@H-_7s!^Br_7x)7~85kxqYh-MCOc<0v{ z8r6T4~##g_FHrKEIO04RP_X#$uHsXX|mYYdF1oE5FQFI9kbo6XTcweH^y) znio^7YDS0K*muOosk@#0;6)T$PQ(cns2OV3!S6YNrk7sG$oGHFp)Y)eg`fN&vY{1= zL$-Y}V)W-QK8cm!X@z>xYbgHr9oWG~QS;tQ*BjqJ^q=45$XC8e^1voM$7g6}ob0q> z=%y)Z-R+dN?;*451RBVrnijI`4R0pfT*M0$Aql~p9*mS2*P-#^3pn@GlPJ#XA`U#F zMB_9yvi7t8i0fymx{AbF94&B!K#(AfL7%Xmo_||R{r*EpB2+^wLHB%c6jJCEi>x)x zt5@M(aRpwbO!xF86BCoL51D7KvR!>Ot57ae%;@0u1Ze=Ba|Dzp*^W3cfsM|-c~;DKw&wb` zJKWCFg%8uW^9#(Y{}6R@9d4Y(iczX6X7O9!Nu{@+f$RU9NE%N5_&+1s6khW@5}73$ zpCVLgk5`aDaZUp>5AH=D8e-17-$?z^c^v-nFR1MqW*{unxO64i?lwBlJduWT&xL#e zyeu}=v}X)DQ|ax%dwCu7sT6I>(>2!g3H-Fte821Yr& zdnfHp?Tk}HnKC(F(SO6QsqENK@tiZ!%`G@5p2YBjTj~4KSIPZw1$uIXd_@tjn@^>) zkz5qB_wWCi>Mal9oVb!@AAS!dkx;ZgB|C+$vdF1z^gjHLgyBB=`j%4(J;)jy0TzQX z9_n~8x^_8v`93;2D>TeGpPU9OQ`DRg3W37th|#ef2sfBI;hgXN*}mPMe*NB^zx;>s z2R}4#(Y$jA02sUU(G8@5G1%LxQy)RtoY> zC*d3stety^JGaketOUa2c=W(Xt&m<0OqGMITAraY!Z+H>w+|boNy4#g_&!LtNYMj1sAH`e~s(2E@MkH1uq$V*bDo{sbjF0W0wQbeSvqQ&! z(6{{?d;9usdf)zocds>?tdvFy8yskAzTnz5r@Z4kLacwBAn$ifqL_bW&Dtx!+vdOS z=cC~x`BHVp=_quDxt@ikmX_bnHmEPQJ~Z09dwg{GH;wJxm!|BBFbk=R@q$k33+tHM z`~bz^2*cA$aZUNSUs5Cu)JX8X3jMV#5p^u?K9vIln>euR`z%`fZbF;K(+MK6#0wTO z_qDHO;IVB?@7PE-c_-%35Yt10OpT7ve$k_}oOcE@NLIe*y*O{KVw+otf-F)CwC5un zhrlVItsxQy7fBLnJgLwaa23KBvO3MbI*yZ)YFmSp5)H&o$|64EfVka$JNUPCUVrlSnfK0#FD3nzQ zTZiX>sA@1-nqT$`8ej5!0wFL)5YL^%;!k{pT4#ainj6`-WiQ&qWXmO%C6dht_Mm0R zx({4V=ESu)p@)(Xc?Ms`?ArTdMh7?2({wr$;Wh>*QW^kc6%l7S#ihzYOE1UR03|Jn zE>qdDh4HFp&8I#}VeQG(MkZPEj?0<5UovT0o1zh&W|~sz&H4DCMGZL5g-mqb3HhgVU6UhbW%33MX5KmKI+K zDi1xz^!;0j{S4U)&p>uBL7;JsCfu`+%Kl!!P|Fu7&g~#}1lG&oHnw0KiHQY{1XB%( zNe~&IqD_1BgigCx?J+VyWsy;g<0-6=ct#ScMnYm7-(oG8wre zgy>p|-?NmCfBGPk@A)7jw{4>Cyo=E`K?#GP#&GYA4DY{=o~~C=Y*@zL?b{eDTVfSr zO^n0`Q6{Y&{^8AS%2sIhB>Cb3T%jA7LUq!P*E=vm;m|z(ra~(7c{PHpAMkkh^zBDP7ZXiFw16 zutPh_M9t|POsle*`>fEotd(a6Gg zyd8w1CR{x0<5-bmYYhZW1}j0-`NTG!MaE@8S|T)#QAo#Pq6DKH$`~?ZgG}6gClj|l zNUaoMyBg_y{@K)>eik(^;P7=DD1YtSOx7z-`u8u=w6p<(#Z6#xc#OlJ{R*nPlQnCW z;dg74NQe^{c<5pFeEQ#UjVAFm^YUFBDaK@*=5xZoehS^*fE!nt+;AU5zxfT7TA9|h zYssE_9>ty>K%|^wIt8{TMw4+Yi8PcIQg|(Bt~Lz zXYt=i)a)xDRawwZun=c($KUV~j%R zl;2oei7P@9>*7W^=GP6QU4vgd0bxU|4pN$3E7R5}J;lVtop{pS;y7o-aLd!y#b-vZ zy00Zxjw(enGw7&>@kBc1T*g>3Y4c*Houx+TM~DM3JEKhi zDDbRDC=#67B;(g_pt^T2)%k4{Uv@FVYakX-F9f^4`aSl2`#V&HB9|>tyMKn^TW;sn z4}XNZ5NzI^U?)`by+eZk7qoz^oV?eCqd$-h;Icc>_yI^UmWBte%A@IG@Wt+Lt7tW zc6uTb%GHcg2aAf~(V$Y+n zVs%QQr^WAbQvDGLvB-%@9{$*s)b75IWMYh3&XB$R7S_J=?- zU>%>b0jIN@?koNZuc?vNeUGsByEii}D@@;hC%gXRy97Ngv|svK#JpD2FMmn@9UD0K zy=z(giNB&cI>M13{ebcBd=K5$j9Ah}bD;&bcsUE-{O8bE|CHBRNJ+4GG0K<7=?XgR zXZM5uLPbxrV#(j)=T0U;P)SA^8C6tD7AxG@RttkrV04rs&7{R93MDNW|0u0(5lxLJ zA-yaHGpo3>bfiEW#Y9m;-cvFBy@e~E@^v4RXQaSF2)p^-H|>fhM~I?n0+G`0V;zLh zfJ0(IWtP)etkPDjF;o)A^YfonjFnhhCf9g2iHqmJh;P1|c;y_H{`EVUyzdcuZ@H0&Lx<;`zJ?<|`#Hhr7%Tqb4dh>P zFs|&s(U8fJ0Z`L|wH;)2l9G-k<*&)4q$Yj&k7k-;iCnl&bKE>$7By zrS7)u}_QIO%;fwm%PJ zQl?Fu0peOKNg~rZW+{be>I$I2I#`)tg+w7}$WGAO5>qU$!wMHegaU*$v)5)xl7u8N z$c&2q*BROy8WtWN>3xt&Wei^%tO^k(3&LPcf>jFXHP8@bsZ%l?5AZa^YJ=-)Osr^Z zzmOFt9%0*-pJ4jN$XJQYWKdX)sUl?VDYJE%z9Ss^+0O|xmNg%EFOBD2MDEP}Om2US z{DLLeD(wH&ZDiZ>cxRo8i^OV)t!u|ywF1w}GIsk$>RI3B{L6PxU*E*x!2!;^>I=9-GZgmqG1`=8^+hiv@qLQI zu-);fd)X^#x#R+>4vh5er{ejv{PlYXR<5S0HiY}5U*g4z*mD4l|5WF=3kWg=0#!#} z-(7fz=hL&|RW!A}kgBx=%3zH^8W+z?@O*)uopYTMzocxPSkTmPWPnN}EqOs*7QA2? z8Zfi%NK%*-nJ;w8u5SfW%4a-N;TbD%Cet+OD2cVv?8qvej;U1o@$E$`kBq1zFESuP z;15U5KIw%CjfnDCw?ZVKsppN%FT)Y@b!=HMGo~pRf0mf(sgr6<9ql6?JVc?Xfqds& zq8R*!BCVHRK=X@VNg@NB{z-Iafm%(F7ZH{W0zqTTT#T2eRE;o|Ds$JYV07m}bk;+q zv?m0fOOm9eRbvf^G=D3F#=%gX97EQs_*&zX`WPJ9OF?9is!CiLW_6r+M+4up$R?3PAzK__XHFpsD2!vN=t)#4NXvhtU#+0;@508Yx|baVQ2^d{-g- zVoKPu0dnWR+7RaK;s+MukR%_t9T%_Tv|nuCjPLve zyY?i!P$I1dxCFw%^##6l7~8jtN8fZg`(F8S4qX3p#F1g9c8`%An_=|N-^BF$-^^XF ze;H#N@1d@)5i3((QRKO#W-3rGde~>LbmaRw6FOq3Q-=cA|OK&N~}l- z^DX3c8J8ifQV12}#08{HsQOb_2{}{1i4qVJ-=85P3P@L`<$Y@~PKXf!%uFzJE$t3Q2B&fQl2R@>ecAYREV>d85!f04B_|;86!!IARk(!fl8<_ zB9D+6CLK!>fUH6lMdB0@b9<&G~Izp!G(Q@`FRIEWHB4ryoj%Z`?RT@+p-zN!tVw+I9 z`(EO5OvkBb;sy0s&zp_2R2q=mblx&5As1vYQA!dcRgB|0Nb96kLOV-_Wi3gPa;;c> zY&5OI6V**1_#?OKDakWd;IKB>f|MwgLn8opc1t*R$YUhZ25V%>ig#SeVnu{&J(}|s z>gys3&5IuY-zO@hG7i~Q>#1A5l9_uRz#l(~QE9W`6W{kc6O4XumAvLAY*RCKyhLSi zm`Dm@A#o!Q&-F=id77X9d`vZFbk9blaB(9=A@ZmWj^j68aX>*)y|SlNQAIRfv_fd#(MaSKUk~uwc|OsL0vi~)}|Dv5|Lh@ zNzhsog&{gQ_5}W+q%(jeGBLCiC-Hzpwf;^!_py%HLLXjRVktPwC=7%jIguqB{HS(kK%|p zHnSG^58;$nOk-^W(j?4jPN>gx66AZ*|9gU8YmAwVVikq+&nLR+dd7ZvGXrZ+rtLMa zMg{)k?>qKc_`Qx=Kns_ii!b5!AO09`!yPn#_eXTU_LYP|4l#U?13&sDOFr;+^5>t$ z%r!q@@5ipB^`+-f85n2$nmeg$?x5-73vr}}9vH!nOtAAGK7$eslq(Z-j!ZFi-5vO2 z6>Q0{`IA@S`W~f9i8Wmf^xm@xzoaSu_kC=?a~HP06EoR|U*AdG)<*LyUP|e%?HvB$ zwOElL1HshjATrxZY-;GfL9*@5_+9NdNji+CuxJssYS4iomqfTyK1mks7&(b0t0N|E zzm1)r`vS73i-wmxA7dnrut+ONMA{K!tw9?HM>HX96K(B7II^0iOeHAmkk&KP(zX>T zpIZ_`wKk2>qbNENvs{}`OqMyWi{l8H7~42|tDm-0@r)Gs;TOMHg+m)!q~qW?K{^i4 zTC6aLW81fs2%#}rqm6t#dHn|>t4Q5})f3cbBRtWBRKerh|LhDOtTi|`#u`nqVhQWt z_YQWx;|g|P^-ZeFm(sI#Esp1*wZ`+(Y)6u$6Ptd=4Y7jU(gmFIuFDwu-1j;Bu`klM zcQ0#CIh&)8-p$yLens1RU(bq^!^XIep&t6B}`R5Tkua)MuOv4$Qwnrz8j}hCd}5TMiCilDRy;W zsxD2JzLf0v1ihdCCP%*fpOmL(=v0>6sdbDW?c?y)on(88OdUN!OI#qT5188c5Hcvx zcbKEYBMDcdqq53BRP)8 zQc>+RRm-SsnT1`uNOBkB>6lnrT+&Y1G&W2jj6z6ap~yV%g%q#2g6Z%5fXR1XLGZ!% z(suDBc=>>`jqtRKd;+7)<037Qku<;QEew|(!XN(v`|}%k;J<%?D+6Y_JE%KaBAhpe z{OA6e6Yso$(Sbq2P}603k+s2o0E+jLK3jjSxQc0J}c*?_{TD2;TZ? zf{R~)(h8vjQg~Qv)8Db65+V%BlgL6lojeS##Uu((`^3`VNQYQDI1y+kLHTXDJ`azlQ>vYnXQaT%#6UqiVP|vmNeERy zSZ{XJ6{J2+g0h0r^Z_PKmCB@-mVJ*SvC>4+p*<_;Y4!z^n2Ml zlueWL)*7OW$KtnLjytD?-oN`-4t(-+jNX1bC;rV_$u3yJl+#S%I5SOz5h*Ow&#>w( ze@=423z+QNk8l-k1VP6f=;}%{3eu%~?n{{KfnzM%SVEfysw&-Kkuq(AcWnAy3`xo# zCKN(glu*=E>K{5-v|~|1B89{lhr|fndxPcp{Zr3{v3|V=EOF zk56Ly2ASBgo5S08(zj^~WZUVPzk+H_<7E^U2%`|+O{;!Jffq;U1BcoB)vpoVv4QC% zWYu4PfVS6NhExjqglVVNT8vB(LZOl@c_B&4Lqy~IX)0z2+!;iY$5@@tw3aTy>J(OM zJ>nR~YCgl`lF6yOS)HN=pZ+uJ7badY{nk@c|6nLh5s56pg zZcFPqAhRjs4tmy!7b$SVIMhn}8LVb0Pi9D@GSTbt%vqGg*{6?U&MdrQYQe?qr&o_R6zIP+HylEpV|M8z`z2K!!a`ghw z35Z0DF8Fw>8faRx0xf381|X?naHYc0P$w-mF(kyGB%YNiABEJ92dqX4syZfvpFSYR zwo7AYw@OGcVG>`elqlO+jEb>pHY2Vq3XL$9Y`QyR9D!T#iL5514kuGYHMip|UPQ+Q zXVMXF4v=kfH zfKamy!l{B>cbx*L)In{1H!ip^y@anJJXjbj&*+H`~tE&0l5c@XfeU z1>fe-Iw3M;v`%oXC4)p-iM2j+U+{9y`S;I|Kl==#kqU7o!Fv)O3TA0OT^xjT&{ocp zb~x!=3}jj`N>bM)(H5fw*7ecSBf%v>5TnpmVG;*r95N$_ShU*Vgce z5hi^6K^GGI#KkiX)+&s45LOWhMaA{036~fLv?Pl|)+Ts1!7=G@MVn}Z?_(Fvr|#qv zh=jt<;$(!i2$jYi(t=T%Y8$1=!|dLF z@+^gaf;4~FdXhI1V-o5MRg{yVY3|Eu2?BQ9_gNm>_+{3t>!V}AYq6#k<$5stpd?X< z<9Vs6iXH5nZt~}!O>oaf!iP5#zW60+iSzfwU_c67Qfng>5Nni9Kq-V$cru+JWSq1R zV@-^Rt4Nz-SuF+!gPpE0**}D51x6d(u|cK=28iQ`BuX$^qol-U6xx8wW@zu8ho7$_ z!BTP@3LPyt#XQ<3Xd&^8!Xv;)AAFT2p{%7Mb=rbsB7EtgWRPA*qQP}>Z8{OjI0}nJ zVlYX%lO!bA;bFo`fL*!>7SBN`2NfkGo{yTfx=##tB_&4tZ(#4%Z;{P)vufQ32#sXs z$gk*Vv4}mORg4u5iIq48l4FH^S*0rT^bfnlwHl>~BNWhcR%ec}h$x92DXMOCJ-GuQV%5TL(;vCC>q`dvJAe0nzW3fm_AYF^rBK75JC1wsErqq9gO#fj< zb`MeN--nx&NNR#GOmLk9Q?61Sn}Q^zRwb;F#0iOT5JKW=gDXHLHMDdIg`w9i;08Wg zOkhNSlk325k{BX#ep-4}nE+MSLw@NTRCgzZo(}ShmSI&9oRkG9HVWe^P!SlFW&~7% z&?)+j7=&=p0+OL&_WtH>gjYw~N$V+llE5VRj)R_sz^3!2HPR?dJ;8>F;U zXC9@h3(UkBw5lN!7jvAmC62&1F|D~Vl+%P4jCwiV1fgP#d`EC@nYm82;(4( zrKSXl5EQ~0!dq@9*}WILb^%SxS5dNA0%^e}I5r(@gK`i!=;|q#dV?IKmga3#l7oFkmtnG&HpIj{-f zflUh_N+^Pc|Bt!%472R0uD^d(b;8ZJbDZwUIcbz76p#ccn4E(!U@*Zp*hGUdAcFq} zV{8*mG8s(9fFy*nP?koMbL^g;=^Sr9p{m{wr$tf=BoOwy^&CA4J@@vhvrdJ*_gZT; zv0F%$%P0Tb+QYkqSh=uT;2#U%nPYdZojh^>8=Cqzh;)8A##n@4zJQ>a_l+kgpFo#y zW%ooslZ`YOgCGqH6*;Y-IVWi@DAIl}%1z;m6b%_6(w+3KeI=+CP943L{SSSBl^gzo zT=SC&t&5T|(i((NNDU^PrRVDBGkN3~wNHJYT}Ni<|MNeC&P6EgVr7ZCsUWHjjlq*t z_a0zo>rSQ*A0<<>1gR?7mNa>%fa&f;o_8J{D_aTtt;~oSRzKsT*yat83h{OFz(>Zu z&8eMV;k2`^AnU9kv@tOagbHwq4pG^|UEe{dJ+kXsS@*OjVZsr1Y!kGv+RT#vtBEx@ z(n}oWrw7<}%UfVFOH;6k@c0ySCkGHy<1|Kh^WZJ_qoXNE30jwIK%TyVMe8@>FYQJZ zvM8^BjRmm`v2(MW{N9h*|KI;Zy1$Dp@BI)_R}XG7*`jU2UJ+KIY(S~BmqUj>Lv`#B ziEf}iLFB55J!;9FQc>PQsz!vf91Y=Kl5?m$e#qjV}pYmg_Q97Gb-C|!^@`eWR@67 z)zpdVRhX$E!x+E4nchuHm@Vw5Wy5AxUG#UjUKgU^5Eoj=c{!%0ZsGXWw=i0NfWG$4 z#Ke@N65-q=<%uJtqG1j_^ih;9QV(k=FFD|tMu;-7Z{kfzRV20v2wbNQjf2F~Ii{WM zWLuUX{ceyR%i2g2g$fXc{?9NhEo zXjx_B8Ska3^Ae1cAvOjjZ8A{+&21ZLD%?*YUBf9gBP19-FUay+(a?GB+0n++&e+TB z)IGGeoPzYJNMq`D4v+S;bD$k940R!JMF2cf#ZXv5&Tmjmg=GAGEN-Gbh6bA_0vbY- z>$;LHUO)SH{5yO0yqA^nUV4}PHId3S|sZZU-#LE5T&b@>cYu`=l z#2DVbLFPurnLBcdiGABC4R6H@MsS@jbpP3`|La%M_T+QW9ZRsv;@TKTIKKl~Ep(^cm}~|znNA`U zm}GBkO`N>_^WFQhWgV-|eGi#^|Hi3(KPDp8yTGq}aotUCKGc=_cB$7PLc^ebkK1 z4K-V$S{Y!Ve3(M(T3Q$X8M#ak=|Ue)rXS&VC5IQ`AkF+sEfo+TbUHC5cgvtX;w2F< zN?01DS{)~-@1;6^g5kqICx}O(kY{M}c8VPhivDVZ5yUp&=;7-KD*^qRF2<6k(AtN- zq@PX;{YGHs4smGvXPKEg!paRVBERUFkjWxdjDv%T1@p{GjEbOsg6RV{Gd}ngn%Yih z#ilo+@~aR!=_xbPBsqTTpkok@z)N+LPC-7M2%l&hCyqx8;a3=Hj?aVp@|@m(jPmea zvOQ;Egp;(l>k!Zgr+_9y@ABs|df&S*7(M>8*8%T(!T@X!e`WpMdq4l@e)BnAbJH3c zp@UEsNf}4`NPI#OBGC-)eFsNRS{^*S24fxEut7$35jf+x3n17JBMN?*C~To#Opy}} zg4n~8$xLiC35ig~NF_++R z%>^8{AGd8e)%KVUdlmj_NzfQ(_}KMK5B!wzd;XbHx{2DFt0^vfKDK;}iK%;7x9WxD z@)w~MxOh0aLE!krrp&;pFEcQC8+~hEOY^$tB27Lye+Y#!5+McNeCA&@${gSMWrj|E zfv&}GW9^2QpqxdZlj=PZgi=I0L<*JAqckXIjv!@evsv8G!}^m*)rQuOq>Kq8ur}bn zp>w!$<`nwGM_JeXMX<$0#Blz73QYq^NUpenj;=L~oV@jw<-MQydVc+z_WjWSK7Rbm zsr!$9^-X0lxp>vmi;_K@sw0&_lTHYGGC)RY!pXfv)!pnkx`d(W7~z2{JmPpN5y4oX z8!d8LFzFNITUy9umJ&r0nX6;x&$ME`MDlPqn~(-4-OS=8uO{R6bL{Zfn7#k4EMNI5 zitQI9xk(!!f;2*f2%E>sh|b055I3IBv7^^Q>brC;e+5DtJQNKB+DXyYe;HjTwz2>I z@8M@|pjIhS$Xr41IcMW_ZoqYVP$q+lBN~&3(0h(BeeZUrY7JJu?JwE??vFCDbq89< zI8r6*nt;$Tv9K6dk!mg=(jIO$OV_$H$zHq>R;;7k(@(~2qHp~x=vi?E6H_}G8Muq- z12@q&@N=vqDEcilwLcRrGgwnWST7MX(G|u{+{DSD`&hB+N|vpD7J^iAKyfvZZGcP> z5#mK@bnO6p_k5hmkt1wa^LE-+JPYNvCxucc#!8JqA*{ra9#L$FYz@aX_+k^jY9(I? zFeb)oN!`ris7KPptkh^-V0OCB9S<(%Wqtbzr}mIM^;dm1!6HrYz^2Lq4NvY{WKQDEK=8@AyHl$9r*-KvJX}wo-cK}Nn zbS-%SHU&ewKgGe_pJ(~H2CcnUf$?#?YNAtM1jahx_R+iM1P-vm2Ai%k*Nm@y8vBoN;-0&iJFtsj;1Jclhfy^{=8V(v zB-AE{h-QXRQX-{;)$x2OIgPRgQMW{uIby9b7#dr568uoGCi z#kMW1SaGg%?C5QO)|-3g*WvS97yR(Y3gFqv<4>nLwp!LI%$)o=>9#Gn*~K8TIB^MF zfolrXXC7c=>^|xFa)ATJlhfMww zkXaz9+*u)hRfDh|LQ1sKSmDv#`!YIm>)5*OgB;xcUN*&}(W=^xy`6rNNwvbChokQ zgFpNq;-N8oEfCUDNTn#biiYbWt&7CR75=Xn2qt-Bb)1xS9VAK%QUYRPjMAhl6>PNx zL52Na_zaXLSbo{%v|sgNoYiZ|_q>daJJvNJ zzvn%8PL@?0-h!83mgKkXyjgi9QC8rHI<=EGv3>790rl^$;F?i(bg!MsuwGKxqVk}k{Ks~aN%wVw2H29L^b(iaIUP|HO z8xUPDrnR$+x~L*V9oNZYLeTXQrpq@|nHWRN&MYsD-u)J9?bY+5e}5Q&g+@vlGFzHp zVD{5!4?0^fVNv@tXlh=L6lsV;CP%-=sY-(%Zttd{Tre~Eq`~G0b%c_7!LLgN4*8Ui zpUW~jvzPIy+vsh&neL6RAeHJysCF=kyS$JQ)(DJoQ4+8r);N$mi%n;|n`3)E&i3t} zWpQE!=|M<0tzzBj?_l@cALRJqFS1M-MvmOd@TqI*U35B2R=)96Uxwhe+3_=0I752xA~3QK(c2_r{7u)WlelS=bn~YRngV zB#|~aO3hPoT%@arl!HvA$l8dxp$U$B?S~xy**$cge-Vpb@H|+*me#e;A=|fsp+jHe z*ukGLH8n~9>gO|f@P8;(#yR_pPoWBHiDV7edI(PvYKy`m^(aFJ|A&FYpQ5GXLYA+8 zEq>D(#3CYP6Ek#SUFekrqJAUIhDoo+%EYi)>FlBrj zlZzdUs-s+~3Pv=DMUYe@g#;ncRwG1;LRe z<&dUml*u1_lVkV%oF$iC!pir26q!GR6{q*o-Esp*_I#T?_g#(ScW~aOf5Po}5@qF( z0gMe0)-Q|2^cUjckOOv zY5s0T_kNK&X(mhCsLu_MvL*T#znbR0t8mh3_TT$90ykRNJ?8NMczEXiTOd^;?kYGv zEp&GMHJR=U8J)U^`ovDk`+tmUDjb+u!L@s~&?W|%l_?rw3gLsclPJ>38@fQYr6v?! z93g8C(py5;nztg`c2PR^MNS;}8r9J|=w1B+(k*8r{kCKuVGT-nXe3%Ta52Op#Adr# zy5aRmp%^~)U)Tr#0dM^~QEjWSNL*u4+65I81a(3u4W^Ba>t8`r&vOYwOL_OrjDG1G zOx+{s!^vN`b0L5F$&i@zq(Hgj#PA=yAECG-FMaY0y)X`ys^5jk?j{b~OWB1eE-$%##D{1b0CPo#Be3yc6vGFWggRh#g3shN! zg;)w)SwRU8KTzCobUkOSDUp+3Wn3<&#aTjo|BLD9elF>rMaVc!R5?Y-j?nE~wDXS! zu%BzHH!9<^_3&sRWt*@%O`&imh1QM4OY6){{(@5nKg6M3J|}1MWb*n^HT)I|DZz0S zLJDFnK;-D{Tu)Eo7RwdVr-?%&=dTwkacPvc!5M!EMZ$K(fTE17q`=Q?o&|+WW4ZUCiQ{0(cQV8 z{?Q6M|9m&<)Cg&jCg67-uzw?_ANU331N$gmeUSbayqK2Wr{EOVabo*>IP&0ES+!w= z=I)m>D~n{Ur8;yQ$B+Lf<;plKHvKK#z0bj@R6^R6Cee=&NfVOR1|d_3IHWptKVyf# z%kbnjGA&)K+w#|Rc3+B+MXb;ZD~vvB7<8Pl)3tPorNij#BnMA6aqjA~S-bpAwB=VL zy%rjzfB-DS)iE$?wwQ0-_WQo!_XF7N34_R#XG^1W_4rsvU_~O$seMVN>0Gicd9sBn zj^7{@SzVL zj0o%J3> zdKrvQaQHv|gMsf}OLL`;$h$Ox2F+R$c!IJQA*?19rw~o;q&BSL^q0Sg)RWIgc$QG+ z2}{$DDiEY}7E%TLqLZ|2N<%fO@hHOP3q~%o)Mv(NeB`r?9GyVE_s#g7ee|97c80cJ z!{MD@W0lNP=)07OiTgNo{};)4u<7h~Q0%x85m;OdR;onm$qKLvR|p&%plg$yIPqzY zAO1ORm}1SkXVJO*O02gMZF591__Bd{w3}QY!ystH38BpL>xbw zVI{dn10^Cf0m?KmrjF}o9@kvfaB_G?)5zDU-TGZhrQ>XT%bUnPICM26u^b`cLK8uJWgh=B_izDjT`7X6a zV*uaD&A9n~1GoRq@A$m{Zpn2A70Pqf%7e(bfm9icP#8c-0bWGP>8H1ChNhIHQg>Le z>+I2P(nyr!fQXVmCsd+vDGdsNMuE(bZ9a!|b}iY~vpI6)OB~(%Rpy5GuyW-K$#!nS znr4Ld@ZA)kiG?91Bvm|tEi=)U5*;9S})@ zhr-u}xLzkrL&^H|Za$YSZ+!!tv5~sx0xm>?i~=Qn5a3w#OGfr@he$bSC21%yRw0a! z4kgli?0TIUC76l~nN*%QoTB=`z3lm$QBM1h&yqQ76|2s8A4l(h7gNLgY3^Ljx^v%5 zq}Ed>BrWO~au5et<>NXa^eA%^4=^{nlcD23!%erd`iyte(sc>AJ|P;7Mj3%Cl2*z1 z(U|3r_G}SIk?7~SBF4lKc_MPIha!!10GB{$zro@qLfp)os0f&yJ&J=fn=kkL-U0f( zl%nQk&2?Yp_m?ND)Mkg#u|&?xYDUbVRR)ngn|ywVbpAM@edIgwyJi|eNNgn5N`w^% z6Jbo8)1O~zgq!lO> zp^b=5Oc<9CZZqr8dIwI^Qf$4!j<0-$Q$Ie6q)y6Bkv575O_XwQP_%b0;;eVSmD4}@ zK{)R$jF%yAJ=}S^l8^=~Ej1A*qAQQ~eCsB$dDR};dI%>wZ^66JASKP^VxEnyL<0O$ zJVVxTkY$jffQdZBzyy2$-@7Ou+=Iw1W%A*BZ5dCl-dkzZhWG+|UB z6iA8H8e_msxwNKYdOD}UTZWN7#t9L!PHY4igEq5NOUJNQ4=>4gFU&*xwfMaN7UG4W zS6s3^ieeg#ok=696<8~A$)F^twzJ4;MR&gTFfZd*JEdP&@>?KW>0o3E={lfOSZUGH zLE>ZL7;6%CtPloI#L1`oU9_%xA)C&BH_Mm3koxq^Y`^FI9NzP3bZHdVkr-)lwTBWR zLjzxBc49w0OJ9Q5b^(sbAlwWqpLHd<3)d3^v5s+-Am=FRjRu+X&SLc^K1Az_UyN<< z!9n5A`%<7tSSG|sD{*m=zeD|4I|3yvQfp9}m>_9T`ZblBM6Fa{V~v&INJ+(nbgWrL z`{fs6W1q-1R8$pLTQaybJj2Z1qwM|g2l1w7$h4iyij99kd3HBP_x>k2J%%+3ZJQHC z(>Ub#fiJP`?l&=W@^%(4x|q!ueuS3QuSTTX5ExwHCQN1mqzUJrn@R`^q7E_WC;%+d ziIKuX+J$i@F`&W0B|=j5Jlb-zbf#vo?utY!LPRKXIP)!=b91|BG>%7DbEi1-b-(v8 z^_WPV?VT5IRbF7`rcWV+ML5C3Dpv@hDCXPnGhOtxM~_<|(q zehN;2wh?jcVy&ONJO(T&+}uVwSG|%o7k-?U#cLTK`YHSFdjli;z6Ze+n2^fA^_WAoiw(biR&gOEv@yh zl!AWiZF~YW>V6qYB^*J6r7m2`UEQpD!)xh%^-GCx$VzZch_srLFR4>T-~9kb{{1u5 zD;1i%E@koR=dtJLk2!hbM$)0gX^b;^`Np=(ajY{LFBPVvVC* z{B$#^{1TRRjNqum^yM*!JB{xpERKN#U!l3!OLNQlM5=S%IUspe94|;{>cT@1Cp{EM z5E=5Rb6LH14Rg(Ra%%9096R)L!~=|;`W|UwCTH&F zNab25F)<8IF*~u3(ef!M9iviS zgpoehX*}xQ--;L^1zLk+4QV14ca9+a#iWXT2_XVVCh8CsLv7{&GL@NaZa?SHV;Qf< z1YjYA-h1ckZwtcVml|6|iKay0O}X=;IcZY4CG-|{;kf~k&OFA)1$Awx2bx-Wl)2J( zI35nso|#YSncsb30Q3K61+5*#@`GWI~WQe1K+h3=;@HTZRg4t$?I zQ+JXwE~lUUAyjTThB~g3m=9VMxmXcYtAvX>So*K;rf~ZXTF*L*N^2+iy2g0P%Oj=y z4UM)$b$$LJJ;7kMMkFiQnifBO=CO>|V{T|~%bkAxu~QGdv{s#_;Itx$vC>T* zpmFfi9W-YuWV0@_zt`RCSK&I#Db=@ov zx1EpcwIfs-VH85!d3Pd(bpo_Z#I>bs=ve+joXlFH2j4*3(&v)tzKqyLDC1#F85L)- zGLd~s=duVIRQ*<(FMTRj`lxDvOt~1@NZJzTL+fO(CxuMt`SbCFZXtw=P=>%%v7Vw4 zS3yO1c+@?IRe$>iOg&`mN7oUh3{qCW`bZ>&AmGTSzrp(VzJqk`V){Ct#wqd2R}j1`z&oer;}~Jkd}^f z5UL9+1X>7C2BGWt(xt8iu89~K{2ZQbrET$x2qGUbbBgltC~40ja{T%Id-6M2YY*Rk5A#lQw+Td=&as{`pF~xTL%P%K-6#1;*0Qj%I^w)IT?0mPK zMT-#6dRXfdJ0@ve6)vHSNn3|{u8qa7eV8?qNEfU`@xyJ02@8A2WbO@%-rrZ+ZHzQzsu>(zN`UNZXFFfYe}Jyi_l_;v!b} zkC8q!K{d`GWPrs%YmNJB%kHm-RS{w65Cm0BJb{z##8=I@si(8N?P=I(jG5tk85zEd z(b2txNAD%uw3^Pv=Tq$5jGOMl$_^Y=AOeK+DNmkY=Hxy)*I!A#xf?rMz~E+?#xQJsE} z;jtSya{P1H1B%x4I+|CUM{~>hh*S~ZZDxGx7dUP}Q`=JzCPnGMJ%kTENO81=O&iPt zJqV8mVCH*~f0^qPAo0kO2=+xnLe?Y9IK+RVgI)5yiJhw}prRpr#@Q@-`PGbm;&Y?{ z9Y(k+MMfw}dyX;r!*7s&)oW<$e=$SD_c3$yNA$L>L+S`!o95Ke{Y*~X#BAvSGB!;r zyMj&Yucpv`KB-h6*2`d|!s>a^FcTqFjMbAw1}dQscqnPnk1Ag7BcfR(Il6N(Yt|0Y z)OI0hw-;;FymNh${Rr#hj88p4v1!$=E*;kkDaljETWSAzm%SGYaR4+zkI#D5>;)q0fDcb1r`hh0Z6jbmh|-*?&E)`=7+g@n0}qyPLV%FfI9Y ztXXn39ZR2ulj;Le#0m&Sl<2o%9yU4!os{~CMhOj+>V8suAVN!#WGa4pn50B$i!~9w zo#S-1j^XAuB5WFM1wuOW3hx26(qWXDnX)Fn>G6!q;{tF#x8c;3+*O*L*;Z`pxdcNF zseM486=bs;P&UufjuGxUz5*jO3KyY0w6IBc$8UwPl1e#8xeWE%09FfP7d%x0n}s-s zwVmahLX=+-7-}hXi;d_{v+CjB`guz4KMC)c2Z~iL+JSunHM|kfxn(7kY z%MsS+h}1%wX^)Z$GQU!Z$J$?J(4-O=VNlA&I1($&qkhH{5hhM@#BmfM97${iHlL>O z^vf80@NQb9NOay@m88JN8kFw5k@WNalID(QbL!|V>^yu8nM@yTt>?3P{aNJmXXAKF z(J4zPV~j1Mgfp*rlu+Mo(wUDWg|$#E573BWYH30|Rv}(`F`n#X! zO?~SQq~j7vLns2Ij;P$ZpVntoP^lauy%g&iR&V-CQqE>@G8iX7+i4t=O~k`x2CD@I zjS>&5jV8~{N(D%!Ck823YScr8H4-Z{+9c+kj|dS#n8wRStX>h}Ma}r>evlzT$X{~e zbYqTzxSalU=*9K|C2g$^%5@Qzxn8f8iu^X@$ zsS#FT$nx;E)fWMQ$|ISj)Hq6}?P7#&K@9F@_QCC_nv0`Cf~>-gQy5*L?ffmswf&gc z8h$oSXy?n+zZF_aVhny{uu?Gh?O$M|O&AqUh>TLC=T$4k0<#b#x)})O#X%Ag7(vpl z^>Cd%IU@?Bl>~&OgrU8WqAnZ^8Y2uK&{lv-vM7!bxXtbKz53-G+`1P*gN7qW*9A7~ zGrjvR7M~hJu2@7*aV>}TT~E9+AZpIxsxne%F=~D(x8j#MZ6z%sF+zKIMkXv0>7W|} zWT&pN7FQFCz&|@ZHjGuq*AAm$+aT#N3 zBv)c3BakR&$MzBgb^1Ctf}de>_g<=_<78Y9VJ&eSA!46ev6ZzSct2+ON*v)}B7@_) zEVSL#+7Kz5_(zN#=l;8oQ9E{&KiF31_eP>6p(Rw5fmEVBvGBWZ2^~qxmd&^;mQy}* z6r~eU*`QIUF+R!Yj_oX4wuDs2M&yxiP%a%N*K!fqECz>|kiZ5=A#sF*LV{L6QZhDX zl5+VJL1T)_)ICVYVR$qm2xA%yJcH{7@cZdne^3|!o=jNGu{5NrW#rz2lv;)#@w38$qZJv)(6eL_ zhXw{v282|I(Bdmiw09r&*)Jg5eGd8N6s4*C^z;N6TR=GAscd4GARAyup)pRaJWWs= zraZHYxzbifOCto;9L=gmTWbp^M|>jfBrQxPSrr#bGZ_>jtg)%(7+!i6Hnk2LSHN`< zD5L>nrWl{xN~XDOsITuCrylQk{XqiPuGjJX()7V+PmJAKXz#cRsa!M`B{ah3QN?pv z*7a>R_YLyUKsT<Ake-^>)HmY;u%#}x(oBI*MmTB0C zy6{Q+UF5S%XfCcIo$W!TGoZo7hbgwK!%KA})Rbe#$w;UhgRFqXv2U2A zodK!LMzjE_5<^UF5|O{g^mgjy6Sb}-=Y1LOe%#~r2LU)s`oWTshlfu7^o;hl3oxn; zgM$(wSf6zFQ^`$V$E9lqI5^ryy=;)Fg-g1_iLiQ{(%fEVr-zxH+Rx<3JxCd$%u}EEZMOcbk;|Of4EEU?+RlL&itOZ zCSx*Eku6s#i3I>`ExtB5N)Q=K#yTJ+TE+&;B9f^#=iX$yraEoA~)dBbAw5 z#KA1Mtr#P)GDc`0zj-Cf>19*zK3cK?CrbiXxC< zz-T<qMDq-i#}^Oxtt9^fLP(S` z#6pr}>E_n}0fDsCmBl(1q6V=_A+10&pT@&tB{bX!A=AXMfJhOC8pn}DkwJNBqH>Ls zJGQcP^LkWf4Jp5gVrnsco#&HF<;jY6qV^@YsU}bvVgyMuXR;zWL?8^hGJ=`j!$h@- z*rWh~l@f#@4o$LcK_?y=QX{c+&`lJS8wWT+J`>R#+?^(qBx@UreqwdGM*JTbQ0ah?I)R zN@@?@i>h0!lz5Gp$b#cKRE?ScyqJuc9|7~|V9bSNnHsEZI+SX@&;ivX91hPA{998+RtF(BnNXzhFoO0?22b)<}v znH^1i>Nxf4;V@rZeamBMUSBBwpmk8Z@P&HQhG%>`m1;dPHhK#tsA9B5OCPIZgo#Oa zUPQKi5tnVAKw6Eo3m7$lXnU^bxK0XJ#K}q=*Eu=*6Jpyo-P3>7 z1Api+{$VpPkj-8+GI8J^zIgc9Js*f0qxi)l8W$xZ94m?N=<2_U_2GZAX304FPWCL! zR#tNe)r6}mOjeqiiZXjlqeX#AV1=#FZ*}*ZZS;fTgu$r9g)oO^U!Tvi?o) zgs_5KAd{q{JW|)#|6gAvIB*14T4Zd{)}fNmapwEpOq_D@j36LFD+f=xpc^=y-9)a7 zBhsYvi{uH_PZ?^`@|^FfZEa)~HB;xnXh!Koufg}`ZHxZIA2 zk22R7qmb=_`EE8PEsw??lyRN3P*{-zlf}A_^;{|@Nog8m(P-kF$MWY~Np8#OkNgm^ zP!0k-kpMWfmbfy*gJ1b7;qVmxAGUb?>gz0|rAuTC#FCm(v_1K0;5iFcwdxTl)1dOB z>mWXi^aL3Io+ywi7fBk$aW?cHrmI*W-Fq=sWwG;m zYo1g%j-WjA05+)A7A?Qxn?juV2d8xYC;*Gri-#Wg`7>`H9Qw)23cXhe$6tYXxD+fT z+V3XQbUA1A|2Io}ma=o=kpPav4n*9*!4i?>@bMO$wI`^J{S1-rLYQ3Q-Rnk)k<0?K zrxY_Zst2&53ckT&FtLX+$w3F-!B{~ft!TgST=IYRoJYB#NB*bC#;C-#8GrI5(GP!w zIywEgSW^o{Y@uQzn$nVNR3SS(g_dQE>k->WDxSEJBDPbsRA+Gz%xFVHJEXDX8zH3! z9>6_qEspjP(x6c|+5y#|rVMVr3rU)^6o~i`<*^@wNnu@3@dCPaLSp1Jk!>f`L!@k# zq4BlE%7AVlq`;cQvEI@^2ti~*l*rQ6HO6^oPf_sCKxCE>%Ve)A(OBye>I$R7cT!As zJ!t?>o>d*YGhbM;6ih;AH$q@#iuUfOFm>{J&RsLe?$I8M z^~nlD#SIaWk5oRW3R)LX&MYTR^l-uqkU#Jd0>2y6sNtC$k+c}<3s%ddX~&R&H#sF~ zOc8C;>`P zH6BCPUC+e!T{wh^s^x+|@6j*~g2Mw?p~(n^6qX1*$v zS}g{*;bJqIr)@5=q%cIG<9#S6mGm_mg>WLYhQ`3P%uWwZH)s1k|2Rf$!T6&A+|qUB z*2>V{iJ9?-^7+1J5~~8z+C*F$K|0?{u4x^sx_8r+ndL;ajUZ0cUX(HzBa)IO5ZMZ+ zrUiE&)m**qeDW)vkK+}Q#^CuWqENHY$cjZ3Kik3)9JSTgk(r9ABT4E50|lv0Gk zVirKKh!SH)M=2V{;E{MCTLZ2&s1qZ^$4@4Dy;d-h5)^Sz)f%!Cpdy{TyrxKd#|8AQ zeR-ldM1ZzUkN7^TLQ<+h5YI8W>+9ThJYZn51yCUDZ!lU!;`l~7S3pF=tm_^n<1eSF zeIo*i76xquj_{Bwq%wIw(n+1jcb#`XeD^Vr*+TJ01Gum6!|kgyLi|cqVC>F$x?Z$<+;m-~TD-pFHOKtGk+1 zR!CUlM&iW4#x}Zfi;2vfvOy)p}xwFiN#Du zIpm}0XBjOhi8`0}4bh#SqHFQH5i$=}VMPSiAhk!ewv*!%Tgl~?UDuyp{kTiVj~JIf z_5%PG_dfF)PnhaP<>sng?tbrWh0>JgWgF*Q>~M=`?22my6fNyv*>r0XCIWUa#1g9Xz@ zk9K(&vI26UCKD-)%uta&QYoYq3Ejv%>{9yJ$IJqeu*B9R#@(StHX^jJ1RjsLVl_{< z7Xm2++Gs)@VR$ld(9XTH@o)7@%SN_FBQ-0-ls*`)eu(2;`Ko=sBxVIMRb&~IR3M+dw7pypf z8`p_U0LCY@4Xg!6xVX3=G}9AB?myYi$-(asmyY3@2oc0d^~;z?Tw2ED^DPhw8goa{ z%F?-V3&6a#L_*w*rNwbwT&*5?#S33DatJik;*c~7x5m6n=dZO83l`j)|E>_$l8FUr zBXLP+`$&Pb3K>1}nvoGzsT084q+`u@J#t#&M9Ka=v>J^?`z{q>34Mog(;&BcF|w-_ zAtj~qB-vsoi5+-7dEvEv#3il83CEcjypG)`IvE(~Ml2v3_Hg(%;QeJx$%`Fu{#TAuv&lRf;M)(IZ}Ps$BS8cC{e(4BEFu zaTON_AzZYv^VEEhQlgYh%wisE2$7VFg{IKgMN5A-4F{xl7R*z3i-_65VJd^8WTb4K2a38e;<_1+2Bq&1{2cs-E*s z|M6oVsNWq=7=T;*p1psp@h=a|9lq%~Vb5!cyp^Q=7#T+()7aD^npVG`Rkas$QO_a1 zb>wMy?l@kUfJsY@6q*=^IHwsMUWRX6N>e|l(0>Va-;y;NZ7sqyAf6+xO%jK5P~Xe3 zk(-HyrPe6XY8&L9vXC7C%*E$fnP7@SB`@EjUx#iVa(2^1y{2yKAWc`{m1m33kt za$2F32d;|~LhLvQPY}fsp=*#5nxZCZ#!zl5F!iJFQ5qgwaBO}#QHx(q)y7(+vJ{P? z`HH7ec>6!l9hWd}fj|p9VKE}Y3W*=4sEASAcm6Bkq3_ekgA621CQV(3bUgDVEPLnc zFvd_pk+TjePWXgEMW{HBG0-@+4Ha4@4%~~5C8=}=UQj?bw<4V`r0Wqon$Y?PI#V_IMEU~9?Y7r@~O2f1xWF1w_aM~F=*jU&}Q|m{Gv&%@u5!O0bCnCa< znj2(n-+$RywqBcaijSFf{QKew18~bXAE@*{|DrD+J@m6nrpJEK)VXvCk#TSxfr%re zl(ZICF;P5?b2f}~|EVzsbPCDBx>{pll^YLt@x0dk)JK1UgJ8T;CMxfvQXZ#KpTyV_ zuA`}#&3KtEl$b*4Nrd)D7uQm3>m-;QN)#Fm2v^~>wzK5*FJVbnA1UK-?E32wH{42y zK}tm`meiw|)RwjMz4AGzR2GY%hQ?J6o|Z`KVIzmgt6`!!#=d(a2S52aqKO&Y$9$p_ z7z1GtkusLnM$FK6zDH%cLP7b2aU;pEHn-FMoM+>O)12J1kCbwWjm8Q=q%8HcL+2Um zsZY;R`qp*WYKtGt+R$ zMFSnwwd4@$-m{r33kJ8yIl}bo&rI5Dr#ogbThD4E^A{)D8_ZW}{^J4K&4PKApDbJ%h?kchfk2 zf`a1^kZ=h@VwRkBCWVVmXKd>}hX3>Hi0Kh*&LL1faZn|9`e`^Xcok9#4pa{zTh3wC z=JzHH|9#}}kDfAd@}@%PsxCBHgpg>fQ5w>Pv&a=zbKZtsT(`fQfw|@d(@u{E5Y@DNe)9cvipO2gEM>;-2`Dh`DEcixaV~w9)!qnt$qG%LU7eQ|~6=QHrh!P2( z%!y*gzV{RQFMBF+p_%NOrR2|CMPu6@LJYC86oo@^tV-?Mx1-Oy0z3x-hgdV_%|vnhjC?y%=9HdF{;y821j}+Opbbe45xe)r}=z@ zlS8;ZqI;ciaUv(%=u_=P1n zzCtPz%>o0i0c4d>ITYH~5NX5olKXl@1)#)~!J3Bla`TTw%&$VV|Youciz zR}nfszDYbIYBb1*i1C|mXXwX2hOj~GIn)%`xI%dIEgb&a_fo#$CR``Pt2M}J$>T~0 z3qTk=>4EgHC{og+CZQn(v-v#vS3IBW*_#>v&QFMs50Xu}=#+yM5@9W>kRg5UX^4?= zrf<4~x~&s~I8Z;@4>LuHJE?Ovzh_TiKQmTjg$_}UF*pf zni!k72TPs&(iM1ZO$m!w%-^mf(L%8IwmT8Ar7qGey5vfl`uh>F#tW1D@0{Bp^diRo z^%F!}AHWd}vf&)@EjM%j-@lK_k)uo(H8oqImW`;T8;N+!?+E*F_QL|gqK!tznzZ$C zw8Cu&w1{bq1gkf0Ve^|_&Fsk&)PH&dS)d-&F-o9K3-h|ijB+4R1NMg*WwZM%mzJZhx#4`h&I`(6B9vflL zP%pJ$5?7>Xm>G_U={LE{IMsJ{6+k>?RZ6uB`VABW#ohx5Ud#mKd7w#Zy z>S&cg#+sBC)U_fnBwEfe<)yfDdmm1rLOAdsh&sp^Ez60}wN2Xjh)+^3oxqhX#HC40 zJcZk}jOMe?B&JG4qNHwgKvU>2^TYq4bZAd9Ew^{F^73<-DncX_IdW*@q8gHTYLfl` z@_9--9^&BVzRZrd{1a|@hK!IjSCZe{Yd~U z#4~EGZ7=?SP|m=}u^%B-fRP@`bBS%D(BtNNX==Tcr*A&R+LcrIRi8jNm`l6lOh{-_ zgpCF{E!cl@8GA?9GBNpGD%0CQI!Kz4p&|?ish<1ya`LJ7Bb-kuxwjO6|TK#6Vyz`8T|Z{*C982_&J6$S8pW#4$uW4zT_2-pkNu zzD~9hQWJvdutG*@3cka1Bf#|bqH>RPt9 z&N_kZIERe80wD~NMEnFTa42zdK@^PBd)_%TU3w{z zl&By^DTR$fYH^)`@BNh2kwZA1q?GGnkUhEgVil*PA#Y6xQOM!G-rPC7TA!Pvikh2gJ$ zlS*TXih!!oNM&*6BGmE~tbO}mqDJPZ{OBiiOM}FMa&f#AjVPw+!nG97dn(dKj1K$& z<)m4A<_G9sb0x}2vv=2zx%d9JacIw5DGz-aGqIKG=r@_J9p)>yrkSiZFZg?lus|U_ z#7m#Fla%YQXz8CPA}AykRf&s|g6iZ$oE*BV(cZb{gWXFeZhWF}_1p1BcD4TQc<nTwy3jpGe+icmBiW@jEm>DU?WS)JiuH4JCEi`35SML1#OW=BD{!(5Jc5Z z7I#e0l6#2B;rkgHxQkkRoUWEFtl0Q!dY8V4V(00k3mee7!r-x=lFlrp*s_ME)high z>1K-M5bHt8I+Q#`YI2s@BS-0d>IFD%4$<3*BQ@i9J(OslNpNd%k~%{p0AG5@Ai_a2 z5!WeR`c%$(_dnuqSi;EvTu(ec^@wrkeChK@w|5g)Lx#Wm4Jefn!XssBWKDp-`E;Bo zU&`XMHj!Pjh!bD<4#QvjE>Sp#<2hL2BwlL>BIDEXnwQdk;TfF##8;TO^>)%$5JgFD z*h)!I@VMY#J^{;@6O7)%;Qk-cwe%vIm;WWj*3)V4Ighr^wI~6@BS)AyelOEQ+c4oa z?mm>_2M?SFZVHH#v%`D~gan+><-#*|@@K2}(9-{U+B=^{!>!?3C(#DM!A2(-I{aPc zW=`(x?BDdB){bi)IVew1{K;lufUY&~Ii7D{|COneN5WG_zmF?pq_()iAeF@mht3tR zrMu^JF57aHrI`~b;gQuDl(a}?sLCRaHN?{JgKbMWFp?pYnq~9m*RcMAkFetOzbDgr z1vsq;Rm2KKF}I$q<5O;IN9zE0$qM|{E5K-?FeZ#8sX!o1jj>W)aNf=c~W%8)mBrWFDVyaru@~o>^`SKT0zUdy0f9Kl>B$1XVCxb8w zZDR_jttGYYY^;f?p12OFLJHj%BjO6kG&0pruK6OCE`J~Ap7XD)J@*adnkSi>)cnr_ zXQIhrZDqmVTV@BieB&^!t!LA}{CODHlBF4GU6c|?YdCfCW`+iCp*!3C&E@OfckBs* z)55>cpYp>2`j%bw&Gz<1-JUH*oKdBT5xk05sMs=s3LuX6fV|S^398BS@e9$$M2ywcZfLc zvF7DhQ}6A;)esBFSO??yc&=j4XFkvDp}nMZ;x^y1b{V+fC`;g4jMZ2jVB-McN&*oh zrDXE(0E0jLKC}1Ui7L;cRJBB)H6~U`c0vS%g$&D|^V}q>Gqa7UvF)_CZA4|) z;*mj^MxvD=YZx!UZ)(S=4s2$cyY?^U;KVYttf7ShQzK;z!bn^+Rv4al`TVL4E_j}&g@y+x8aA6S1Ri9#-AL(?d{JhcP)9^*TT56bKvl| zkc31*nur=wS)_q%>v>7t~x3qkKD){$3Oig?s?POxZ@q~r+ng( z@=w1WLOkrbl+4wRj&K4v_~Yxj<9*jKyK@Kmn!wXOaU7EJB(5u|o0#gVx)i>VGU zdibjx-T$xD(;euUQ5+{C*LfQ4%hxky!0;^teJ+`65nQb0}% zq~qcmMJxmr0LQ`A7S~E@XregAH3oNX4)4?`G!|}e{pB9G7BT$YZ(vJhz{iP0@{W%P zB4j-xqg(>(fpqXq17#v+q(k%Ovsm)schbJBn?3LU2+@sq5Sak!rtxA!-ESl&mEnP}^PO8yU zm1Om?IU*fnttI2cyzYWu(9z#u-J18IyrtkMP!YaYAkv0l^j7xo{d(x+x~^Gs*89Kr zzk#hk`3wvo#0zy>@A+Tr>}bFB#L;gNRQKaagV8Rb6XGdNHrGXG-)mXBO!JZ_JxC^s zu~8003K2`JQ5Yq`_1HGp%Y6qI(-^sy%Jh9$>0*L$W{!WFeGj~j;{!L-)cthUpZzwn z`644nZl_+^hw1KN)rRaQdJRT1X>33E#QwmVoy=GF<6V|IMju~l`##~U@jx5T1EQ>PiEyu-cQGp z#SDD-%Y--FK`2VNu7ZljDv65g)QbhyyyZ=p<(&le0e0{BDk;C6wHx0^Xa9Om4&KU< zJ73S};ctRDhQQJozn|%SALGbiFAp4DN-dqos&O0vv9P3!!gVB$<8sB8?QH3-(%1J! zyxbzJG{g}=Kv0Lcag@XRzJl*JM%x!{y8cfBqy^%CWd;WL#3yd5{_{t!IdtOWEzflI zY_6qkBREZoh(;Wuq#;#U&Gg(+RyIAv;IPl|OgEwOaBPfHE|Fs}dJ-KqGdh;$+|#B| z%psgChxdP)Qv*LGn_5NR%Gc1h?$2@k)%bpf!NYeUqH%JqE6FTg51zx&w%vGfgySlN z6@;FpMnt3yuJ03KF;XHupTb4wa^^e#n(>^=_|QoTLBb#P9T#COp5qhiM7MaMe&t7- zfwhRxzLThx$1&PdAS2wsq6=-bzT!o!`rB6#q#TaD^#hDwdlOP6g#<4aguX&sP2>uC zU-suLdf{`CYK)=%pJZ%!gjJjVhUVTYXl;Hfh1?Q!bvwt0?qqsqE3ICZk)a<@s@}<` zetI#-=6W#c8kicsDxyt@s}-IIS=DxszqoWeEBc>8&+@l`O2lMbArUliJjvjmPjhnQ z&f4nL&wk_L_3!(|{}!(P*8mLg;g5aq)LY;1RHr($^-0ok+)V2x+#rKiPGV5)HArXH z5sh3=zHOEV5BD;y9bDN!8cAepNI#D>nnulIN>8$}Wq{h~jYJ_VUim8e*ZvK;&P@nm zG1kS+Eh8;ws196@72x)rOL55xn&ukJ96U&*8(3rUq=SkDS?Lo85uWQ}qKKxeU&`jU zyoq4TX|$ht7Ja9mMYS|XqdG&aUdM)(6doc3)WRaj3jtVKpAUVf8!Sg)BBRb@WE3Evyg(+QpNaP90JXOQ_}yo$vo3>woZ7+AiJ1iO+wE-GBRb zYIom_&Kn9B`HO9CISx1;66>`)o87^D3jm`-Gd0*iXnycBDAd{8wH|L%;xoTG-}6b zZrOrX%?KqC%o4~9gc1|%W#;4^gq0C0wd3TA9i$5zDfDb$ZuTIx(MbwMP>%vgIXI0F z&v7ZakiL5#Gslk+x1^EHd5jb&;bT%c+Rr|d_KTi`Jbe@Xy0rv{2QanTBkp;j8Q9?A zD1i|%;gV%Ezu_-f|2MCv|J*Yv-M@{)|NI$F{p4muBLFEev7qWp(ovbLZBWYjEWY?M z7X8&fpjtZ#r|w~3&&RQ~5?MDzuBihj)lJn}JkQ|apu;pOo@8*_|6{l^$5(GWjhVSD z#&gkn0!O)tE~P(>vQ2Dgx|zRuMv11b^J!iA0(?=#a|E#oQ8teaPH}AC*O{A|8eX#D z&;EY-%1sB~|NgK3Nz-P(9slb92KeM>Z#wm^H$HFs)bw3fM8RxRQ*kxQZ9z+mvKks0 zWU-TI{AQMRjIi@Wj;XjmaS3uHLKuuL;fW@ur(2i{N}Rc3D>4*hyPrgC>KK_rVX2pH z;=uNg5tL(=uYNj}#w5c>Zo$v@kY9BMeHT0hN4iw+-A+22qHIHyu!z9mN{>K>1cN7- z_}MK~_a4AB8su7AaEeU?(#6TQ(zbRTt*cfsb*UV!Ez=9&6t4 z24?Qq#<4Gbo5TP0C91pkkiz0vODa^9t)dwN*^oIU>Ho9mvGM~SAYRmip4iXPo$n*k z6D(T(9400P86LQaY^IrFVJ%w6AS^B((}(|)IQnlsf5RqjJH8HAyVPZjO9@2|E7CZk zLZ>^%JDz!nRn29(w)_)rW*JfkiMyuo5vI<_p-(Y3aM$pP)z5oX|N66T`BQY8{l54= z0WiSp-}0tu>Jv@F<3Bk+lWmiQ=JgPZl#q+wT(m}p{Esh`X;QoyW5uvF8DWugX z6%t8@!I2hLwv|Zd@5N1Rpx`Y+T0?E}4tDQ)KaG-R!{#^Bvf^2!GRr9qZ)0luXZTG; z-1f6*S-Y8PWrmTXgXAg=QbHk=LWEHBQwSU50V5^c+Q)T*!2!l@yPKK&wt;DoY0D$5 zK|2;3HyHcjPYEX`A91e>0odZ>2#ZuP{+XL-K5aEeKKTELZoCsWY7pfGjYgG>Od9v| z)+cfdbyBpw=%uWA_upf3DdNh#4DS3_YI74T-tb0R*1U{N%Sy&4A7t{xEwp$AQiWbZ zCx;DpGqUer**2QzKd(QHhB9c+Co(lMB1>#sj80PsYrOc&E}iP z^^2jc9YBJ@LQLWJM#>R%a<~H^f=+k--xsE?a$& zXPteDZ1V;5ZG00_Iw+YaVJf94jo-?_U0*^txnJ}zJ^dd(_UYSa|F`k;aQv?y;(k3A zt$oGRS?7Q4`Hl&84jld=A{Yn!#Ih+Bkuiqcs+X{+t&6{U)=~O915zf3p^g<6hZM@@ z5UDDAN?Go^>ooN29uDpQ5JLw)OM6EL>o4X@r>*44pS_0WXIw!oEeYnf zarDNI5>*FSfBvf}_B( z*IqO5r^3f$iT_go1Bj-@Gx?^?Z!S&jKd^7x2MBA26Z;fn2^>q-X{CAP`-sARUVia* z+FFhvV;78};(7?G6pVu~k{_Pv4h>MM^{L( zhA}z~v53&ppoK}i-E54pI$@327~xs8O~kStD?n;IQ^gemBP3ctBy?h16&aN9a5inE z<3n#_@fW_2U2_3pWq``zPqO>&|3|(nPu*)Ko-PyXn1&Z(Od4x*)MN;57wgu)iH_b? zw3?9jZhHn>_x0mCHLMI#u}2h_aE-#1&Gh<1yy?OntS!29Ygz);!a6S zI=7ist6#~Q{#l;7VVI&;7zz~Qm|3rQG4zxz@QvlA&)Sxs0Vk!JM3r`SKTmCmjU{@Kd8TmElRlf)CsO8!G*{`C5_oe#Xe zX>9msA8N6weA}isgDxPH#VUtF`{i_Z@8uQe{Fu2aT>H>PSQ%ln9!@B!#FDIpQ&_%w z$3~X41gy~iMKQYszxm>X@!+MXOy0%bt)C{FTg38JFGqQ6=w6?r(9+7lzMryx_uI%% zUPkAlSJ2eCl(xTqHJ4p=A>()6%NM;^Gr=1 z#@Y(&HoS%AzLyYtSypU#1(nK44j=j#)@Smh+RsXSsci#2eu#;|e`h#`Z{2wsCA$(W zXOJ;yq0vHvX~slVt~h;^XPtFF-5t-MbH#IrwFkBVq!6OQ$-|#z^5~6~m1{41->S{8 z{Gkvl|1>^hk2C(y4si>`YhHKy?vzc7W2b)jWF^{YXvBnUK3SN|FL_AbP9iRo{B6L)$B*JRK_QOfyrUi1{Qr)?qC z)kgP=UP$w$PsVF4P@OwS<$AEd&&1)j&vQQj!;e~#cU5#(|0j3 zejBY#=b`)#>a{5*55J95C#U$28!lnjM1fF7I5-JAMrs`CA*+@Ri%#*Xr`*J*Md#46 z`kj!<;}9ndkWevt{0AI7`pGDtUHMT36v{4{HRDm}T_nUMww;mYf&X|FQF2hm(Tu~@}N;-m0c^s49MGb#tZB*7w)Sn9rp2Vmq36A$t3$VNaQCOkwe(-V;upe6{bt51IeovU6!rez)4G~@Xl=<*2$j^0A9brJd8I)tdBjlfriNVw#4E14U= zo_chEAK$i)pKj|TO67?f=)fSSbE~afn+e`c}W;)ZEZLZ*J^v^a&% zr{j_$)`DWs^ZEbUJM%a@i#lIFRquB8)7_^}?|Y}SbT(Ec5Y(`a$}-@<1#xhh5rsj< z4P_J+_1^IggE9`HfVhn-C@6xm851CZgoNx{cW3ENr z6E_mx|5IugUV|cxv>;a!7*>&i1K-9g7&NwCfieSl+Qm{9B_lu}Hjko$aK$p_Hm%_B zQ7W#XGI1~3t|b&~2OyD{haswwmVqjUkTQk#vZPb}l-vpO#Q}=hA&hK^ zjBOAIhl$rLAz61G&F04S1k@>EfQDp{O9cNb?bK18^38Oi1=K{*(P zz*k{%ho7K#_m}ak@PU@rbFZ$QbHlnLn}*-dQMm)Z#Q(kh8~IP&_}*2y%wX4{{tfdZ zktpG4JBF<(S`M+wQxM)Tar-fHO0ajd4sC_;l?yVDp(QTE6eB)+`#Xsdp`-3$LfIgZ zXfs8}!LSth;msV_`&HUHE~UEhVoJh7lS4`eiO=lF^X%&TI?eMhqo(B@RMnqERpVQz zYj_hC;Q~_!S7T9u;ik#Y^fEQElgWwam>9l~>G7X4IlhHdYA?m&2)dw&N{89$12lEN znf4{0q`u`!l8xsPNS=UUWZB>MERlFM;lx~&VPXjn(3o~T0cV=A{i}(@l7uQxDwk0C zQ;hHU0z=~u^3aAk-1p4sOa>IfvJfha;bieWLD5d&lmsgpw{XqH8)>dzPRrbz!A#&u z7h7bRJ+z8lJHO>C!+WBs+@p6-RY|0dBwR*Rywj{O1qnjJ<6K_Wh{4 zI#DmJU^fK`%7_q*v>{SG)OBoPbTq<&gY}p}h3#kX4S^$*xJsgQ6@&XVF{eOH#gCYo z86^^5gwSF3ZoCOCg3McT4ZhKWWw;0}@Gvk783y-!8zm-aU-B+os~OV>;#fYGQ%`1Q zAN_*^EIi}OG<3e7x|XY{Z@rSnj&sOor}0W9PCV;=lFe7pF!y{CZRb%{*UiA;9Rvak zsBOLwA!8UafZ>@$!cB}H-h!L!r>^Ntd{Kb`_#%%mLWEhu%kdXB>Fa8`(s0C@|kla#KX;y_h zaJ(QQ5GPW#1b1{BT~z~&j5!QtVt6u$&_OiQ*q)7{N@Pt%?^qj!l0{wg0A^_zx75q{ z=tjC0{vDCznP9k>vWV~_c!t9DMi|`p9omv_CEjomhSV6|i#KMz#mL@YV0wKt&Ak$w z06DSJ*LK=dM znW5kqIHtvHI?R1*R`A1T=aU{?L+ZKj601IoQ1f~CuEKBu9Y&c7$1_k9TPe9IV)duv zN(+gJ(0*BYtEb3kdWhG&2`f;EKogV^3=L=lMG+ipe+bRPD1DQq5V|Z zG3VPTUm|3NK*ecHQRMLOlNeqRUu$d?LMxwXBSWNm1Z+<}o_7aUqMMRaZm^Q>{R$hm+(J?7C#q`C zx~_S_2eu#S^?tb=GXVyOcHJ=E)&2gD8-Y1L=-qXDact)ul)MZjB#BrT&7GenS`p;$ zFWJNi{y2Wo!F9oQo3Xq+d0iwQ8b^m`d1P%D_ib2AvEwj7el1wtU!f|Q^rTY(UESx?}liNxAL*e~|>d+|d}mo4@}ng}f^|4||&fJrn~_hOgH z48LiA11M}l;Z7ovdPWB~BD@i_HpwX$Vb}zvM!Qp(as*#xcyebgkFHvRrz1!?h9g2a zc<5P=Qn8BUbcn{9S^oZ_mB@%@e)k6n#Og7P3_(B7SpUQ9*!_!~<;=ft{=&=tq5H&- z9TPk6OB_=H21qoXKUm-Lx{p>?wB6R%^PSRA@12A^3A#Y2ej#%g-AcPz!7W$aM_2V2 zh9AQUO(8siw4xMbh+M&@lqm4MO;B|O_t_8K9B4Z43*$ZC&h@Up9%X1sZiHy^WReT7r==myJI>oqYjljf zm&dm%QCSnmlh^?tow3Pb@z~~t-2M2O3{Jw(?oXf&ti%yHv<#3R+K#Y_#1f~0Fc3;1 zg@Hztb!l!2(=@Ro&1g}!6-h%N%Xi2qtx#n-2SSJ!dlUnhn1L!3l2U%KEVmIFX$ovZ zQP2>McA~Y%)bJKWser=89bUum_Ujp$*~539cq6~qH=il52Cai=N)*gVQhtG4$RX-g zVg=G%cXmHZYkEm8`T+6DOA$sCLn{V)?$`VF-(ReZ&j0R-UDtlRan5@NkKmI2w>c)h z#Qi?*`HT8zvWdFPWU9AgVqzdslc>S46Ik&irsyPWY^5SR#Q1QG$-Idz9V}A#o<+zA zlq;75IYy=%*xj3?u{MS6{u1Rw$Ow_ z%TdC@5E3w66cH&VMxMgYk5Sio83 zxzuI~nIS4`8W|hh!^plb(l=yq=aWlV)w=*`2|QiGQW9mQ(MAOUGfFgDLWn%?J@*Ap zo41o_!^eoWUW8+Uo7%&^ZMQLa=;2hNru#EXSA74b&wlYc|GALw7~z=QfnP#g{$oEA zKljeAc~^egANy&3>$)45P4^L0HB`6%FIwB*#hd2s=c8}mL|t?WZGlu3n1(@KD12SS z)&)FsmMw0O+kUj1XLoC+hrZ9w4c9WA8KJ6jA$GVLUu4jp2H!wSiO??TR6kk;DNmzU zKIZ;bk82^yo#}sL#Rd@Nrrbi<7^cO@a39(&zUV;E;FbLs+N!3pbqV?6el~Bq6MNrv ztRE`!>7Sj=w!RaISq^zUg>L}%6vC}U79Fh2G%<6Ee|h_E-rBvJWc^Jvc3ekLRFIx} zfo;A}nb@Q)0$M6f!_O88-i9YR(6Cgco z?V^N-XB6pZ8sf8;t)-=MH<7v5P%-xkwBa*8bUz25y^d05wx@dj-~46E>Hl))!iBf| zF6;R*#W8(^_-$_g>gPtXv#iM$^Iapu>skXkWrQPbgzI0AaBRZ*Y39@qFfr7`aHauI z&JYwHR>`Jhm?&XUvS*knnGE(fkS&^on-xia4YS1pmC408rLv*Zml{8NfWre1QC)Wi zk=oN<^hN|wQsN5(Z59|yJ%aB~kZAcUAb{2aq=%F)XhAVM&f%fwNYtN+8SMmBL>d}I zj#Te`xc%R!e-iFqzlc@OHIm9#ARJI4kD&wL1_`+?o@1l6#k|M_AAHMRx|%a2Td$_E z?XNL>i;08xF|_@5O2+($TUy_A)3jH;>YjTZIU+@vuQW&PTZliF7azs%8QysJrQ^BH zpWODsUDtPJH^f>N+)91JJ28qjmb{JYFMW#Jf7Z#Sk!2LaIfTxD8N&B-xJ8FRG=S%8 z9^Kl+uCXvzFJH&9c|XKEyoLI?A0v?LLi#gIP4A>o%3_5&@o>xUkqwO|1HO%=Y-BEk z%m*-)L>WHXaM8*F&%!VatVlIN+GO%C5ampy3RBDtGPLtvGGjkt?{ppi`tVYEX1Wlv z0fG}KHHF~{3~8aPB1KG`d@b{XoA|rSHZm{a(lqB5s@h(Un=aDV`%wn=t(@(sJpX(1 z-u#IV3DI@byybl*c-8E{FY(2D9&vB}{0Fw0roB6JXwRbT=$5z@i5Qiw=Mo7m$8vu~ zSMv~K=>WqM^{Ai=ejZ!f*j64@@=>lr8V0j7jqK=YCzBIYRc@!4`xOG8aCi=>$tTIC z2WV`&92Kd>R%Thkje%Jxk{&F2=TCZ4`m z$??-_=D&m1&i9d@*h9~j&oDTV;>T+iu(GF~pk2X?m_~UO1Wkod9)+TV6`sLzt0}l9 z-F5qU+p^89I8g$XXfcbQ6D&UME^?73BEAAGPyl1${nyuN)G)eTqC zHvd|LQ-ksg7>0?LpJL~#za|){!;99Fb)RJa{scc+JCC&oT2YRH<(7*-v&A&F89^zK z(!)gJm?2K8?dOAUUyJ4Xbf5fXoJcpBiO1Qt`2mEP-P_!B=DRvin7>Yl%m296na2pP zx*hnpx#OFw#y|6kYj>r_hgxP*FVszE_SlK~6~y8v6Z3Y`T;Ip^RDy}aadJi!PnPgq z8*q`~NpvxaC#Mhw9L^-@IT*yxO;ZyYrKE-kia3dy706&ULV4(!9`^0|X9m)bvbiV8 z_Z~c*XM5|JQ;|Uh)>HI%5H{Kfglh3b5w|eQ%{y0rpt>n16K#_;3-XW-$$gnje(tCAT{+2PxYO~ z*M8oCBO|0uO)e-1&gKXZ$G38Lo{41!P^D=cIZJ!8z@=v#WO3&X;=%c}wqAwSCX)xh z$xvGHgO%;9-7}Y2q41d{?pAX8yuDm~!8Q`15Y4Uc#)wpKaL+wV=X==R*T5rd=dpFN zg*@e!rAmSnVYJc+kwq#WB}}9hCG4lU@PzGLynK-A%1+ukZUj8G?7Ra%cOV~$G~ZLz zdchak+k3}_xaCzFUU-cJ_$3DSe&fxDwtVMihy1DWuJ>83UFR`1_)Yfqe~;&TyZHX2 zOE_4p!E+`tbR&j0jc0fiU4dzaa3lyX3#B3f6=Z(vel96B)I94Uw(@`FJbUqvQ zETR}IQt+n<$woZk63K>HQ1dK*^_F!kX)jM~x{H$L(F!%Kr+}zOo$@_&6 zzuUU_D&sX3V1T_Zd}vN_cIX2$?+pk8dNtDnShK0zP zv?mX z&2Pu3KAExp2N@lFK3y4#-PhE*^lPyNSqTOKVAP>>4OnI&X&P@IHVEKOF~2(3WQ;0uMO7Fm!;V-{o<%LqW; z!_s+9=^W*%^LJ5KJw-$Ntym}yZ2lC|4ENW!Uj7f0?w$uuIpv52+X4z(fu_e?uT*Tz`9uD=doQ_-Kxp>1BAL}^z`W>&8Bg6mCYdXLHdf<`D zy*=MObujnLy%B3kb8W>5M5EK}9^A?1{sLe5<)!5E)0kEj1>Zy2f}&r-F$|=i2O%l> z5>q=M1zLD$ZGte-l#s&2(;7*6vLy42^D~;17*eCzsxAMNWTc&eChgj`SQJNnY~-eu-Sq%Eny--?}kd z-2U!lMQ2PZn{2+9p0wttkDtxz14;a#!qElHQjmhM%I8!=ql5=iBeeLBH^6@g;iC}v z`6z~2u1WKa6sBupNt>>woxJ zxBTZe@UKyh2l)5Uv-YNs43GZeQ&MN*aj%;CmJE;gnSABpi`X?|B0L8>9Ku(V*xJJ? zRN|SS<;%P95?X`jQwo;9Ac`@clUgRZ>W#ZN{iIoPW3vQH1u|x7R@7ef`BP8-@<0EH zhkQ(OJixz)v9VQ=sgWnn${pT)Zaz2o4(Ux-7;%S#8HY8`ce8p^E9p`lSy{jgW}#@H zr1@J_7ymT^g@eL#BScl6H!M8BMQ3iOF`lQCDPh{?41tO@;fho4GAqx0qO0rZX{dKJ zaXi3(fK{vB6{xR>Uzi`?@Fg#mZ3@{A1-rJ~E|_5U_A zxbDNYd$2wpCo)<}^1!d_`Sp(ZOo}ROL*u);T%1W3VV2cao^uFCwSa43$Z53ph+8%* z+PCty3-(iE4^T|U3ndX5Cf0Jt+{GWbx29%A=17nESm1bo{|K~xI5gI?Z_dcj`nTls zLpK>-I_^tN??fGsuWx0|{z~#xAZDX@B>#+^>tlZwgpr0gTXE@m^vZ!@{x1P~U zYa->^g{nd2MK;sA?2ZLXzVOtM9>=lF@c_R9XswMMPrs)jYRK~^^ZRbdsnNyhnNC(e z?@)4*Tyo;`gacXSI8}qTIq#nw)A>b5$AuH3;lg9Koc(Cwcz|DFwBBe9t$*N(?8L8b z@I|W4(}7?~$?eruXW!el{Pu4g>HqK5#_<6Ei5MJwtm^Qx}j5*eC&K0GiB#j7%2L}QIf+#B^0RRC3j{yMzMTdd<_a?t1#r)q5)=5Uk6$Au} z@;?`-EP&z$1QY~BRzg(W%kaVg(u+WP`NCowlYNqeeS?)c{*r~=mC4Cu1fKmM3`oE+ zJT;ZR)@06F-!k>ElD$Mn-$c1Fe$;n9UOu)?__y*DczWhjPh{q|2jc|614aNE47CDy z7a{qZ0`0eK-d^kwG~M!Pm(lEHN`r$!zo^6C`qm4dx?aQRBKZfjQvK*<0e=wr|9;v3 z>sc@GsJrI3${_qGZj)QfO{|I|wHbU2l%o-1@!F^rhz&;^gqO;Ci8uJqE7*Sf<~nUM`}_6=$G3#2 z&{^jX6&4JXJ(#3}u)obBDEX{_M+s8cudAnV!o6t2eA<4?ZGTO(t*Q-i2d&t#Yc-i+ z&@gR+WC*eT0^wcM@uSHpz1f&36WIszjZp)wg;-M+eN zmw%vZM+8U5OJN_gN`hYj8vCH7Ln?})gL@2l#;lG)D@S(mtbe5#WoL4~x~a-$@uDP7 z1=FW*y)RjX>RC4~YX~mfw4RXP6mN@E=9po}FVK<(u+V3@wF&KwI`c`1~N`=Q0@zf}p9K{)xvz0+HA{(PlmtIv-3JO@L9JORkZ8NnsNifqKaXwA zT(!8>nfgXI8(h2fEBmDAxEG6Yed9IMHsjwE)IQ%__1lV?x9UO$bMm5b@@L0NK%MC7 zrBVKFqM$Q=fw;Z|D{R6p*`%Rj_oJvh)rS!@~ z>V08_=l(<$CeW`idh;&W^lLTADARU%2cXw}(HY)Zn(;!}Yuxm3cyjaj(`+887x}*n z_3uD5P$jGc(l-ZXHJitoc0+gV=!mlvsVU_tzEfCW*-APJJftLOesp6HPLmD|4L3)% z+34(8DrFk`H}W-5kzW}=O2N7Nj3HYB_dU-6D_TcZ-z?PE>(X!VxFlbvDX(D~$JMNf zE^M44Q&^7`vFVfHe$7+eN;7O(W92IkZYQlnaQ~K!bK$8=CMu~wfEJ<*C9+F{mntzJ zoWdIZtgKq@1acP>;u09yAsOYIJeRm>Y4NR&AG7johPRbyn#Qzth|S(Hxq)-tph1CG z9nd#GqZ??d`BjSix|zOXE*J9nJU9pVYc&-3rJTN)$0n~ zjR7@Tf(AqmO#kJ#Or2te_Oz%q6Ijt``RZ+2Su}Fa-ba!#yc*v|=;!~;tkW+L;Of5xTK_1Bg=0#DUeFj&(0LOJc3az`6L4ZVpC-scdiGH9srv);>7HJ z;X?-;>KK8KegM8QD-tx@~9mHSGF z1hw*#!B`$Pd^44Ml~(8Btp+O9E>Wh`CPsn*-fhV)p}a9;OO;i$T+u?u`^2wex%ARJ zxq#+xYq{6fax92z88jt>QFZjZ?EbxuZZr@R;{{C8T`5YM!cr9XmkP;{@z9`1Oeis| zn8sSZ?o9{)lNMnK^v4H`)MLXT1^oHOWbL%ftnsb$AgOb-yMz3+6Z8E9xQj-u7*Vq_ zsp2L!I{!np@wWHtBQ&>bx#hor;NZqJs|9{8vmj#r6m5!z`tcb=F*p|Dk&2|8pV4Xoqb-&0K z#^stJQ*_&?B68xnj9f#Xf1h0Jz4Z6j!@@p#a@h)9YSa=aPMe4>hVRrnI9b#bC06y6 zlS1j-2p9ZV+|W@Cj;_}024#N`KNXe33$tOpMVP+BUzI9Q3nB@n`x&pq6^4$f-!1Dx zzC(X-ENFha2((qfDq`B!dHO^*MWIY2;nO&4v2osky_Z8!Od{Y;?a#3h%M{9l5=gO; zQwGyOt^B;DfsFd{h6gint}z}P{77UOC#K@Fp_nDo}hI02G~)Brc>$^!?{Ggfsh&MG6wN@O zJjzk!m0ro+l!`;m&d13>;*}rFkbFw3-~?8}0_cwxPGd+$q|=49P>Xd^hg6YW*K20&vLIegVz)QVN2rwGL}2hhoaxgnlc7tKS=u(917bY*?qyD#p`6K| zCdeH+(S?8}U=^17W$EYF#ZBvD%@T<2sdAbc}b(y_+i4n(3lk*jdlCQAGCE)yB) z(Kj1y*i?I*gi}SOQJ_qs%VHKL#`;=4+x>*s;k;L%eqkyV4e@@h+Ls#&OK`<*{T4Zm z&O1iEO0WPxdD*P=vkeASTGA94hg`O zMn=3qf1qu8hC`Kr`#YGYyetH9>RcMDlx~+!QYKutJdRDIVS&lM~_t0b{HE38}d7cd=vij)4@bFFGt{oKWJZ3;R- z!}bpxC0iUkCvzMbu&MvD0{15$Fr~%W*|NUYCvy7N+iBSdC%J?RYm74CRF<8GrcUP> zUn4V%Y(9${k=avWKx4us&A267>lmuKeXnkrA`SeDy^(B5CzH6@H-W^f;s4N?bOZ=> zjC5qa@NNd**-5T#jiJwU{3lnNr50K?*PqchK1S#5@LFzh$Vq#yEA!4@1nJ4%@p>gn z)v)PbSu6VOOwR?aA3ZoHzb$Me&m3Hb+wR3gQ^eB$W_TMQf}h)@BhqfX&o2es|8y4W zON&~BWneO?nWl+fi4tAkKN!Ig>@9=nayM$5*3P^{RieI79dryI=(#lc7iyRgg+tMH@rW-;%sxhN|ZMc8dxDa+$D2)~D#;X|mLBK@2aF zge3F9(4T`{g){h07d3B|*(6@MnNt`tG1B-S!-?ovytkZucvVKExfapJ$PFxW6E)|h4WgC`{m?oGFw-8O0(;g zPWc`wOdB|bpkvjXSyHI5-4L=w_z}mMI&*gUh~qoi0%iH!v04@aoWf81@epp1MGqg6n_|15o#Qb8nqX`0n9v%_tB*N# zWNl8Ap?K!WZJR_rZmx3ZM@n5?moxZ5#Jw=|WD1&}(xK3*uqUZYv2H!s`vJ;*pCwnw z^rjP{F)QD zT)y^TX}2bJoxtGho8=zc{^hS?HqAzrzP~71mRn~NN6^ZN@uFNkX$EJ2lw#`w6wB43 zPO6U1#_P@gEyk%}fz!**Me5l;)BBw~a$LJ_X(rpfq3e?Mr}vs8jco+CC8IjTkh+=6 zPN`A%d26g22@BqRHPHu8jZ)bHP%%6Xyj5WGU^N>CSXSx^o>ifJPp7D1=|G(gGS2*N9$_wh+P-Uwrv^mb!dnQV)Sp`l% ztysle3c=D>a;|3mfp@QZ(JoWU96)PQHZ}beLE#S5L?Bcq+8HIukmZV|*q(2-xF?C_ z)v-Hcp-Q3tNit5u&B8?0E38(cY+~b{CtWJ*A!}}vX~XyS*F0*<#%MBU*&kL;{2Iq% zz*zxbIC?lj zbB?U&?+cQ$B}-m@nWP-hLxkWuS<=TaR~S?rym(1Lu++{zSZ9Fnrix^Pb=vOebxN~k zMiwVW2D`y9m?ig>*pei5q%$s^rM9;CtDPm6y~uk*-6(9VYhf>vrHwd~SDEfuyMz+C zj4J}T8Z;H#1t*0ke~jxzx*ScWpb+cVsxqx`a2wqZW8y1Y4dMLx80_&< z7X?>}gbuSDsaClFwZmC7ge&Y&cq&aZsT^PyMiGZPjte~~WeA=`c~o*`CN>^WugH>k z{yN4tuOkoX5FnB`-71u^j)|kailpWuj315zO4S|Vt)b}sNZZLkv^4u&pbs}37@=V^ z*b|!L*RqjBAeBtuLR+Inx4}UZ0nQ9+U{)Did29F_c7g5$?0OG8Rk2GzL_0NEtOeS0 zpi<`pAdSx=W@qc6QXSV(2rcJ@>$?YL)qto~v()M9Id9J>&{EM-x_jYh!Mtol1?MI3 zao@>%Ni&;YsxYzh0O9QWZ)obmr3S`TCD9r+v$vz)RA3w9_Y!t)KEeOPKwe`0h5trq zk#_;b#VcW@GlnwnnhI*IkOysIe0SYtDV+l=d;B<0wb|zgJjJI8k~tL z9by+iZl$D$>WatB9!Bu4LCp@t2u1Y+D4>y`Qmn&}W&&EXa51732)R>VyJ@x}2}Fv1 ziqZxvepYB|wIao~S@UWRYUxapoNT5r?&^z+(I4!FqKK;pjOU5@a|#%s88V?`|N^R4Hh9@q6< zx@KfvHiWhFG&H;9jq3~z^`yAP*WkEr`EaQ;iAPxF|0SZr5qPxC4)3WIhyRD!e`7b` z)VBGL>9;02NFVct>)RA%7jyY@gA{G6Ehij&(vx;iCoQRx9)E%7#B$BU>O|iipPL7R zF|E|?i9;A1r(RCu&eW#Mbb78viYvRRT=>)MDv!6q*9T6|`bWMHa)94IAhTO98I&^Y zuz&fyw#YSk43Bq~A<%mt1hi*9pR_T+I}U%R%!C@?EEL+q?LHO(Rhyg?MMq-ejpY-k zajKV?$!YBk<>X?rG7OCzp^P`7g|Sxu@fPH#5(bw@@UuWVb_6ob&G?AsP4aS7)*jakDdL)bndA(|p0(6vSm@6f%v4&G1<$k0Y$+ubt z8`v-*Zgr*MkV2cwai#85vdOPviOi~E-1j=&v8Rmewe`=_ni5tbrD~_#G*H{j$6wuK znl_6~Y3~b(gSsOaQMSagfT4^75dO}!$FFj&4K;P{kIPxDe?T#_@88UN{Z@7cv}g=SNaodO;F zjwj?ynObx4F2X415eujDx=^oNxFl7+dvxDUM5!&{ZDAx^V2n6pFAr*FW=;Ot@ZmJ! zyszsi_~6T*A%1>I$dYN(d3@oT!H1hwN$>kr8UM@u@zqS|g*_oc0Ni=6H%k<$96Nzk z;nyB-<}WGV?VRB*CVD3Byd8S}!b4@jfXSIHqP~ma=Zu`Tt_mhsM`wR3!7N0+Qej#{ zy$qcC>aL5Kdc5-Z>(BGBa^!Cubdjx2Ba=3&&yVsr&$0oT3R-d zud&y6EaD)PRo%2)T&dMrpq)-{?@LSmF{a^RaW9o5p;-rnDovzrKcf9yWlh31+odi? z9k`C0w;x;gQ;ALKlsiRSJFj3B;)Wcx?ULMy^Pr0+kqvPl6GQjkWd7c6lkI3h$9%Sq z@2NpTW!SX!tDC>`fwKzoTn&d125M4GU%R%%jM=W!VP@O0oE3YuGuZ!;Tp;K_Xx!zU zCRlgZsHjM9w56drntpvY?4e1?f}uu{1(OynA;>%+om(@5HHvi&!^)h5`3jnT=9flW zdRjBD9wsoPke=nwCNGl>mxkaSy-N|CE>%~Ia{?E3jmm`Q#0l3CT2{7IQT+>bugEuP z@Wcupo?SadXIScRZS`gs4a;m}K%j!8a1PllJhYI-K$M3*NrFL)_7y8E76uc34Tv0C zUFk#H%*AMqcnsBM?FpsV>Z zf{PzX5J3CV%Xu@m)rn>6T#RuH?%0*tIO>g&f$0&WOqMrK7UNXRp@?J%&axKpk!>!G z{bXqtpvB(Ib!|F55;k?VIf)kwXtR}Oqo*SryL<0gQ<=BHGSeA1)%euzHbINj4@9}P z3(Wxha5T>cyB?`KVo}Y7;p7G`seg`~*`~AW9blDlmXHmt^heVZ*!8DVw3YG10DJh# zAjVTkQaM2eh=&TM57irv-i@1zA0aWaYRy#c4t?sI-yl2qddjl5t^++<@9@;}h|vj! z6x=Yt+qwYwb3J)81!Cem9;4>j^dM`|o&0$(2ssZt}xtpCRGa&T5FGV*zzxs;z5JVX+obBoQd-P`MyWTT9tM5N?7|@r?Q->@! z_`y5bXPEyyG0MKYBb9mZhP0`r?pXx8|+XAmd_%>X$^sc1SRQD2V%tFDbV{nFv zA5EQ>iVGbmY#Vd1&o1pJISPVX*ulXHLm5Uz@Yv*Gdsv1A#R?L~t9F}m`Ni9~%n(sTcQ23#Q6g!{w;{GuVQ_YfT-JLHoqM>qYFRf-> zpYI`JZKKZJ$1kC}GRPh|J@?%fy6=1X%y%Y-@9$^|HRjamOxc%+NUzJm&lD$Nwu=1$ zDy9S@U0sU_9+mCXy|DiEAffTFEz0P<2v&5=t17(n(dJ)8GiXM-_R*s;)(yIp$X{5^ z?{pHNGTX1FN9f<(Hh+vf5?V&VP8ikpa^|rLzc72aFO}+PH0vJ>U5*>H67chSsy?|4 z14SOLu&b{>Ell=W*^ljfj|Uba{O1W{i&t2=*3^vNp8sTI*Io@xUVmA>FE;j^X!HOsh@>6ZXjcJ&I_F_S6z?GXuGHUrULmA3G% z9Gs$(;13+7k^Um#Xf6=oqA`g^e_il_=pCWymeAF8h)tiIuy%oFNCBg4)GqMP9A4Tc zl9>2;x`R!wTurMliVC*jmGJ^`l@>6HY1S(EsC&t1!UHU5V7edG=j+|?mGfQLzX9zmE zcMyypoa!p6m%oXhg2L_TX052&eteAT95T+Cl}R*<-qH6*t5^2$78rVYZS z0O||1N{LEDT*O}$qHsA07?;6(_zeYB(yU_zQ5{4&mbkEp_!EbQ}zwe(aP}?x>j+>;vjzFpw4^ueT@Vw z;itCW)4xQOLjC-H^pOJX&uu$?C0~%Z&nwo^9;>mU_sEWY)!F^4<{$pc8S0ZDY|=Gw zCOLiWiaB>dPUXa6(DB`UNU8IxPag=H%@jI(4>pYIf^DV|=qyEP4NM#poiY6MS}VQ| z=sDIDCS&=LG0B~((D${6+voSbajeBG=zB;l9m1Q6dYza2CY|9Z;H3moriQjlCmOf7 zE@eAq)o0g>{*E=azrQ3|-uJRylo62GeAyABL`>!9Q6euHM|<*-E&SOzez-_qz%*~# z=xe(DW%DT58rN2{?sE=aIc^YP8t^zd(pBr>i2!qf(9+)ZYXDc#%;zZ=vdaQ6f4XDRe{F+E^9bV9MC|M{GoFTxwl1 zS>xc4Mh|p_ZZp3mwb3}RA7dGMzM~6U8M%!#Ade=D=>`1q*IdzKt5ISGtUDWtcuV7y zHbkuuV{mh9n2sP%>aaRUC_%G%{Q4xCyjBg18dwg~(&3?__Uk2wGOz2ntcseIqx2$e z*X#YT9<+D#Yx>}A9-JofzI^t~_jCO!=&IxYlI_v-vUIn-eGU2331w?z5yDCId?B0d zp{ek4ae~;s^?u=Kn}DC(3@F#ggnQOV@HrhUUC~_3N)ZLY&C88S=;QsaP3YCb_Z*}= zFce<=358wa(EBizL@e~W{82v71nQfyLT%99_Jc0+20g8{Y=d3R?E4SPi38}M*8V>% z5l;&in5XZiko}s!0UTXOw5ZB{HyH0tJ4knUXx7pDqaCFfAu7Gvp++J}BE6?C+D)>{ zg(osYg4^)-h$%f^W!8r@mW^p-6wne-q3u!zpbu3c)ipvWk{M)z%XWJgociHRwx}8l z8lDWSwb4A8Yp$Z=v~4;ELcb%ZZqj*`iCS9#eaPh%pBlY5pXys1DFn@&`54tEXiAcc zXi&3Y!OkBcfLq7Ltz+3WoVME522k`iGL~@;iE=2Uu#y#I=IGaZ>CXlb*JCe5X55AM zrTv76`$+(@L`gg+Xwl>!1%v@+Pv)d=Q69#^XmEqWup$U3sQ^eNUY(68xMZ8e!5c3xs`ktRpcemWaZwIp^apN2}HkWB)Y>tsV-w%-3h)gmYZnuO+Otke}M}Gt{ zF=U{xLU3A9U-hUEej%sjiyOrEVmoZFL&;+ysJ4iGIZp21L*s}UT$U3U-7L61=LEnn z#yS|$$842uHMUzy7+U(t`p79P?bY?S^(+mR>A!7jCgv<_B$*ANye&NpT~dD@)SQL{ zI`k!ouu%BCq^(_-QsY&9IlsPSV6dI4p6J%CxjEf|Gf%%d8Ci=H;}M9Zp$8O1^A>93 zXvopVdWG`qqdaZ2(!R|k_^sfo_M3@GWR|DEDn8tk1-Zs^S4=NZKL8&;LaeskN=SW@ zJQTY=dTP6(&m%sa6+;+=>3i)4nLUrMn5}7kebm*bV`*`fQtgrYj4q+)E6L3*efQd3 zd&704-bEMBmbcco_z}Iv2gIOCk_c%#Ty*&d+JlaX<7@xTp+IX4ysPL=OZaeoGZ>S- zLFftC|F!G{CeKU?#=5tLL-Yz8a{Yz zwz}ebO+t@9XTL`=S+6~zNsIP_IiLC5eRuaXN#3RKNndD9;I7Cr3cR?mRpRaat`UDc z*ulE&zIlTVeECV`Rg^(eD)NGQn1BnmPVAp>qdpq>6PNzF$7G^d9PUq>N9#`hiDTd4 za^UA3V=JYP=#G_&3E}gW(?>D4zQ9%7;Fi(WYo3c@MlB=Xn&~}-6d^O-`I93TDw(3c z(d?$5*PpF%6}a#|peLlKvGqe<>U*Fo^Ji*Yx=R7{%P1&$dk>kc9TVTKfIA{&PO6D4Z5O4f!T z%y3=wqGoKRd5~vxFYPCZoM^C&JA#QN0kb~sG-^!ZLb;h{eK;Yw-R<>lm&TE`rf@|4PAAD=4+7@_2WZ;Qvt`q#5LURd_WXf%ffmCA#j?V|F+%3z06i@>ZB=s?k-q z4YSuy^}D%zkccUiqOz6}&_NjJ<>cdxmZ77kGJaUyzUZXjZ%`(m`vd*5vqW-_~hr zIYr<7Xa9FBme~pM^eaip{kh;Z6M>XAz*B|3)NaDL2aDl#q`Lb)DnFmG(nd)m*cfQ< zu!Wyr=SKj+Yuwa@xcA6^r%yJ=!8)IZx$q`21H+z4(Q3_Bdyf24+KhFb6`VN3`qB)p z<9CGQPsC7kO!kyw8nX!2wgHyytULggMijf9vwsmA3%pZ~Fq zU7gqYR&-!EJS2jDPX~wE`x#}Vbk5Kj)=8?ahA2ixt(SWhc)m0t9{%D{j;vEtr+p|b z)Zpzo4U@%ku`RZeJpw_vq!+qk-`%xF)M8UZpZiV(*eG22oWxm)TwGuI^|{sA zC6)X6hKZfa^>EwU6Q7Y}LxZoL*k*DRo_v7G;TjXR9ifPX95zL+Uv*zP^F#6V zZZwX2(|r(j_JH@TJS*89ow^tAAAENT{ZDTN(&=Y`)*;(9UvH&fKOz4US5s@(-KwD( zgKHsC5zZmShtO55LjNX&xR&r3lujLwh=PEFAUmH3oFYl2m!+I>G&#=voGp>L#8@l( zez;8G18OaZEEp^*(fghi!);QKu`&1^wYsRp3$;2kdt?k`bTR5#dI|0hyqN)+BiMqq z>M+Z(2oK#$b%DYgD+rPpK~OrZn8Xns4MLk$Od_m9SI4RoJ#a~j; z-0Hh%ciwMamXrll(xA{73k+P^qY;!Y9%mF1!29O6CE1bxTE?!1a;H*-W+4$an+VDm ziLOxrD=2U8fdC^_8NakW*<6sOB7fhJv9ceoN9^d=K;q)y1rT{zKlxU3XXF$leiu&7 z1zr8bFB5QG@-E&^h?~dpb%7MI(I6oS_d$rZV%l;&{os^5QR=(<+{(xo+%LXYCVay@ zf{?sM=2gDBC3i{3PQ!<6k~slgBI79`ao4l*PGSD=op-(V?|I4}%Rm!rz^lp>1~GExbHP1lZ-LKVBROica#_c>dHNndDCF=6V( z`!=h{T5a@MXY;G-x4v|roB#N@1O*wq$r?X*A>3ZP#4ds9&E%ncIlI7=liPd94je}YbM_UTvZCpA6L!wC3V6=@Q>q)+rE+a zXLDTb8>32D+AQz$fl7Udmi#}T`wTzlx{T`m=T4sKHWGBy*_>Uy6$zin69x0K|$9*oM{;9dHo;_=U%KIRsuPsV3W z5nnzYZTyGJNQeLHy&LR?n_l?GJ;oUFY3odAUeB8H+x#&$4A#-3O=1cKHqFQvL5g66 zp&$xqRsIr0g(c%p4W>v$&#Ej3U=M(hD}dp`p!T%uQ9(i`lch$Gcq)am0S=+VJON&? zyyb9edK`=Jtm6>9i)Hz1;9smN!1ue1)5?2sz z0w4@p+BXkGObr z636?_**AHqA-M?k7XS9$ZQ(mZSn_#i#(<;2ipa_iiJ!-nzlg^_Tl>Pv0RV-Uph;e1h;> z-q^uY&r(Mw$q%9H7E+^j;Rt-9EN7u!$BAC@ z4JJY=kspveG=UEbAB0+Jznskr@A0@9eCO|x^PB~HW^OxJ2IW%JSZ44L*=v#8FKclr z9LJT*?Dz0&{XUoE>xuZ;9M`yB}VP0tLPn5Xv{Gv)bKeAz!M*XX*^g-O4D>tMsU(A;t;L z<(a}sm9J|;|2$oaDLJk4a{F}`)hz#s>D6nl^*fVn58#?TyU8h(rjYTR4XGdfHz@q! z|DW-I6x*LSYH5`o+me#Lz1Lknjzk+EW~r8ank0b(@)<5mVcxg#2P$Nk9D59iv_Sn5 z2SRAAHL|Ai!+-!aH7qEee1}`KD)c4t2MYO}V;Fui=enLq}psJc1!jZ}1>B&gcrH(I-me`53 zZ`^Ympn9u${|gyPu@yo|mOi^>UL!62!Vk9R>1(v45cA|w4SHT}H5=)`Hi8G3V*uH7 zX}`&N942r{`WF!GEPm+f7MJgLLY?&TyK2npDg2Mz=}2P7E|Ht)wi38N+0mQV&*=9g z*VR??gh6R$qJGLN7bJ*h|5+l82won+J3hUzeL7@m4C}6On*3nXhenEY(iLWt&!=cw zrV5waTRK}MDL;R?URXDyU3w=H9^)0N~1G#$G0@@2`kF7X2=&JD}(j>7DtIg|z;q?IzQPLkMV*i#3p zA-r1$iM>poBH#}HIBsez+1}@!NzV&QqFO0a<^j2l_+E`xjJU4s!Ox(@9xvUfoJMjk zSEQj&07OJox*p`zw~g4eLHO`;103I-1y0L%h{Gp^@%hP-42%z(b&hUhN%;tWKA?3z zJf70C*CW8xvR&EtqnY^pUsiUe*74qaj?*VqJ*d9^g^%8#_4FcmC4RmXGMj{^h*o_Q z8u68~L4R@Hg)!pT-6g#2ZhvJ?s_1ngogb!jteOidbM)4e?2c1`h%>*%Y26;KtSo!K zCnDtU9lAX3Qs7RBt85qj7xsQJ9;$1Xj_)fxy#&MbAw4&ykH>Ywqvn0iQU|;ed>X`S zRqfYV1-{d`ex&68v7c{p?Bv-OQp*#k#5!a!6Qe51!E2cSxy#xK{F~NsZGvyoMDOxd zJR7i;5P{xfNj`{oT1Kdm!qok^@G8}OP}5gLpo+ouk^k>B+;3Kq-OS#X1X16wgDx0| zZn6lAYaFxB7%DtbI+P1- zr@&azE+&=-P72k=WPS#M7(>9u8jvhT18JrDhC(krH4|3eNWvOEs23(l!lqedrw|^& z3v85e^7D~O;ipHWv}TYpX%zcGmx+Q(&w6(jd6QT|MNyUbZi<|QEyW;)E~5j{h{&Ve zP4t=~7h}v|CM|T-s9lkZhPR4(g4Iy$q?Qwrs4RY>9GK*?YT6KjVnR$C1<0wtu`G5n z0LygorU<^nnK`5=QiQ;>z-4(N9U3Z0Oa{RF(GYWz#KMdNF{@QG=@nrY^fDKvP|Q2i zgV)!N<~qs2Of!kYK6r>*^7UOaE@p1csnh6Ft2o`df^**KN}dk=%hFAH*5SBpU-#ZF8*+5RXw_>x_exI92TijJ-%B^gbE4Q zt*QIHImUPxpcGn?L?U?SK~*o+2JY9X5r^I?R#&CH40diLnR!ijz(^1C35!&+n%oUo zwegzKPK1oSnM*y?>y__tI;(Hrjal1mX>cB=+6wE-H(Ng&27dU%B>7{977ms`b~I=% z={Avv(!xQ_qu0;+-gm8SIE+{|+@KM$J+#2iYW?iiWw;6rNmHa%FABz*sDF33YJ;ac zpZZ*Or0@D%d&WX8cuNM`D~=Mht6ZX;f+1Gdznh)qhC!CNK>1XTb(L=_yS}g+;HeI{b;^){V^Ih zW(3xK{K4b+{z})+%GW(N{*$8}j{{gclUZ2a$0zt!QPOKsHoUm~oPbXJdc_!iA}WR& zU_*aiTZu>|{r1T`;|=W&%2{FSy~>y6q@sydY0c|)$ddH6)tm3Rd>wW!Y9w$sq0fh! z^)s?JKV-F!K(0;bExc%DdB(rhXQ1K}42}5Zc!lwK%BbgB|1b!S0?)S6=+kXDQYe5^{pI2EWnBmURs z#TqxarIT1%P-{@1^9wC>43TGGp0k4YIOXz5zlp{Cn|98 zKlOeKg=bUb=z4iuxJR(RKrak{J4kO^odQ4U!<${h+E4;p?XMmy4|5$VhQow8-)M)K zrhoz#pc~F73MU^|5i*7^!3P`gp+a*S7mLkd&I14&)Sw?oNqI0v=3h{QF+a3ckR!P~ zPk5AZjvbnw?+ep0KwAhUPlluY5Z3>vEBTlko&@v#1uU4TVdqGRc{C4+IEIqnsB3rR zo^Wos)R+YXLNyW=ye#R^x3@pJ`dI;vR@AYyX5cD=eqUDsc6zyBN0b!~MX|4QljiCX zXd(XVc>`vU8G?Lfq~>X748axio|oJCiv%X>=&$`A!Pp5Rhkv0Za-7hV0Fig7PUryX zhQ@rE5)@`E;60L=f^XQ7;)^aSDy6V4#uP@XaiJ#VQ5YbTwgWU=Qg#nzkMV|B^=Ztv z`TfAE9|txCn&<%(dmsyWv6K$WzL~p(iU0>c!$e{D>icBe)INmMtbd}%Dy7)yVSjM< z6fIOUo{$L1+IB&8!+*{ti9cZdk=hNlOH#$BX<=r$)R&82u#AJBv2Opzll$yK-@5oE zR1QaG9#`-4MM7TR%fJlG#5_Sl+i;JY-TtH=-XAfh&OmU&eF$TsmeQtew>$U>YG~-u zW(6$ISZMHF1L!j-vJcN)cw$EXoIJ>RI-;#{jHm_-O8y~7M!$a}Qs*gp0}Lj4$=%k{ zM{^o_liUB=mSM97F3UFwwr7m>g&b0T@&#fr4$1j>fp2rnv+iDQZfKaC)7~rF-=D~e zmM}nLql7-8>(?I2M{tu>S4Vb}si>aRw33!N>|RzhC|9%X_P*)HWU1{7{eY7j1|z z&-1^2wWOl~z+~$C=Dn3W_%BlYQZ*RH49*B(28zDx9j=iyh&~gks!KK zp32R^4JdA~s=8>vU7f2k(Z}f|F=Jq;SdywT;Cpw{b=&`>TBFl;miV5kve%&XE6>U* z;AQLLQtQFIslM7@l>?-~;r?mB9hF(v*Vtw`w4Cv>y|`C&Ln2~Lt#7lj&tq;`a4CfB zkm>9LGyl8oRk!LS(%)dsA<$r3*aCC<_3tPw>L5dv7Qc(iNSO=G4n0?To}`qx+t*?Q z8Uo(I6(n*2$iqD2Y+w7|@#kKHcaT&Iw!Z#ES*N~7%AqR!6tsslOP=5RuJ`kVVUE-P z5qH{ufFr8CGs)kmTS%77=W&0BP%odbaV6$5FIrOKz35<1(^d0hr{bI&Jd*(_n=}>@ z6d2OppXX)TFp`iOs4{Z!m>8L`wYUM#AE<+9UwQ>J5^%+5WN_aUcQk&)RDg$erw2_X zbgFFoSM5a!lgY*}99A_Ps%g7{RY{V%Os0}V4U`5FbsjPe7oJC}QJl5a?X-(fL#cG6 z1W3mQsj+zh6*FT*CKM3_w;`|bcag+H4i*vK1Sk4NktK3d1)IEr?zS$X2ky$KMLE!j zWlS=6qSO028%6ZfuMoq9V=<;5hd7Mya0`PhhGL6ksDPrvU_ZGPx?mrk?8a8yLmuB% zqPeF~6#vLiz!*IczVI*f_9s(`MkhGdqGpI9qmj0xyKB8-7-mSzn=l}4?Ee7OKq|jw z5;psVCywoP*jjHb5FQEfJKXJj%&tx(oa-oe*rC0`R0%pg6pbDgVDF?Ionql|dJN>c zNr#ErCi=FG-Y)Wa$a zi|R*Hd+8b2{%K7F1!0vg)ajdl<+-E(-LH4@&InPAYGV+Cc(K*#)4u!lx;sDkcHOOL zEY;Hy@=#IkV&KgW&sc)>0eLXEzqGMed967mQVWpy&8I(ZxEA?^d8h+=XYZVZolqx* zhtlAFX`51#^wkFthDuQrv<=F=xbDAU@;w83rR|_Ja5C&sP-tlV6BLZo(~7mm#1 zhUc!mbY?2dn zW`wo6GY~HP?0u)*l9L`+M%$n*>f_FN{b7nGXjLom-p$WS-2KRH(;j@bWzRZXztx)$ zE|~Fq;Xi7Pwgi~-(0ft**sJqiDz7y4E-5#@n4g`{X?@ZY$M%`KX=mlQNa|^H-;DZq zB*ZduDxLM|kjdgqbhx~__V*FxKxUJ_$!!mEVwPzplQ6_N9!FG#sgO;Xpj z)MadQ51_wFk`wh+-F#*U$2nMO>;>YVEO-hCCxx)qYfpIQ;TLCpi1rE-8h@Oa5HfSb z3slSmy+&z1`^HaBBcdowjN%?aKWsjG>cB6by7#oZ@oWlx_1Y01f^WzX;0XMO5a47n z3V1l6Qla#Cm{@BK$PLekv7@lEhq(}`63%d;2P+NsJuPmW(PN+JE7*3N6B)INp5X3d=HB zb(0248evFekXlAKkn%^lf>Gp)+TO)9Z^zMOSJ)r^PHIm`!{<%mxiaJ|l5r8yQ-t)A zyQ+{I89nYkqA~0rFJy$r!t#Vk5E4xGLwco`<)_+{)ha!%TQI@zv&Arp!YLJZJtKbj zGyMO%2HZ`xFaCS+>5?c_k@^VDv|n)Quy2M#J?iG!_4Gou?-t!W%-?b~A45Y_1X9H3a_H@%IJkA=hVn0yY{?MZ#{U+vu`=r62QLZL7r>z5-DY0#gnuL1`@%V7< zbmPZib9iDGtlEF>+O1`S$$;jT$AA3lwyP!$hC1~^d`#!YM&Hfaa=ja>e|QP8KG_Ke zUV8Yf>;Cna54Sd>8An&xZMs57H!>5OQZXK*J_G&`z zDkd6&9=A_?(dom!iH}j$Vfwp`0TeY_Et5Kq6o{g-hJq{Z`g+DW(}sLiT+uX8P!o|~ z3D@D>kD`v_Nyqn_6CwCVdJMiDM}Q;npF@C?#TM+{_Ucq??YiUL&ax9d&cd^kB{ghh zdQh~qq?);!((w)?*UhleF zhRC!J=cJZKMsl5vqQi<=+i!%BTN>sF$SM#XfMI(?zbS+i87PV4S0a!+CS+pgbWw5OpU`UTO(Hl%*Q z(88F2P&wqg#3SD&deGO^T^LPLx^uogUBA2g>~y{8+^p{GsIzsb;C2_=9(_mcq_dM* z%90HS&XiHn#bdD0Tp9AR5cb&VB|NHgC@yd8^U}YUUiHiT!pq6|k;qoq{WKhgN|RCu zffR4tSup|TC@~;^o~7%H&w#0t73(ij>t|yNYUt zKKuTXrzs3GvQVgBPFif!gps+w$Hl1I)WC$xgDgP*jTO6p6P@Vjj}vqghAVGy>i0y zdX36T4W;KQrKboFK3u!wM&vHrJg4V3cC*ZIq&H~Orb)G>zn@=qaMf)_a}|o%yI7pU$Mh;GLM%px`)yNk%u9%34!aMXfmxE{lzFgfwp5TQ&BwJHL8qPf0^6 zks&=?KGTv7r3m3GZ)~!q?myVjR}S()$J$s}HU6D1Rz5R!ceo&Ggt<%xm9$a7Ob5?%@!Vy5r~kHa*K~iBnoE72NF4T0bqPt> zrFQt^Vl~q5=WaXyv=aw>i@yaD_uf~lAGSKYg8Q$KZh`%rclyxJp>TF^_Jty=d;7~( z55j%6|H#3aTVe2%P5mcwU(j(ic$O?#S3Gt8vb|HskILI#U2i>w%7Aos8IT_;Yc@G3 zY%?->6q#e~@~YvS{r`GnUVQr%h=8Gev5iJsGA2h`Nh8(|pf+eWFjIAMAJIogJuZXE zRRF|4>7HkQ%OG<$4<-;Ey=Cgt`I+(iF%jT@(&!|FHihdahToNf(GK=axs_VH z2a*kbmX+ydd8tyCsLx}{xbaLKHwih4S{AVGM3oSf@Q|sQE_oc2=+l{~aRnQv+sg8D zt66DHEvv3qqDZtDVM$>kDnxJzCO}w(;*)efG}|eR67c^P0@*rLZvT3X`n%0}k!nd{ zW3+vX3LKf#?&NxrEI`-RAJl>_V(b<4vRa3Z6+%_6wyQvtDKz!yiK`5xlZN;zd+wIl- zNrbUYb5(FJz3Z9ZK7+9cb$)6Gb<(h9ZyN`~)(}o=dxW^qIxt2Sxlnq*AcxA-#d5Tr zwZk};l(}m!8uw~es-e??_K|eZ7v5i#v1V(<2~hcjXAXsWBBZhzCPoXlbW`P6xv^y0 zZ%2Ia{y)edWG0BW)2>drZ8%aR2Ey zz_rt`ucTo(NJej{Lp0gqfQo5V$z;|OC-nJsVBgej(dPi7kuvRy_aCu4Jgk3ya@piD zd27>W3#pa0vk-R|?MRJ2U){uhKt>Z@IE}(E<+82nZBn~8hB$QhE8=ZV+meFnAG5_K;|!n!-XglMM+PQ0VqyPMLrLGJ7b z^vzGe(RGt<&LNr-_5&gN;LA7MAJp2H2z#IUCMC zY2epH6luH1?>zPXF++1!qpwVc`P2B5C-j|Lbg+IH>T`~Y+V3G=w!&JWkAGO-cgFm} zs~m1G9?ySFXn^b+u7BuECy_roOT*bx=u(1>k$RyOZKOE(VI1yRw{0OvW5Nce&X9B_T zFqtAz2o)8kL5XM4zardFFk+!cJN_?-hT$*5{7Ybn%#ZzukVhw%YoVZ0SqNG&OjL#7 zP^vG8wn$`prqd5+u}LGCDz1P@)#?T!{3V-tJtwdj z^#+!0*v;&jHO%RC3E`{^s+|Z1H&mNaC{clS1VJ`^P$wl)1&#&303xw1LTA{tCz=ro zUWWK6+&}87GVzzuI4fas-q6If`OWlwl_H+0i(6+mZP}+k`bl@+`%q}G>EX`u>@*uO5!!E{$ zhJc4v)*Dc2rI^LVuR2RAOWNjj8{d{I6Pk}%$N!t|sBlm9D1^Wb)9TvP;1*iz#?1JM zV~5Oo;r`QZK#}O^+?ozI2wf(GrYWC&ck!!GWc<|Yk%;DNy}81KOdyLG&`}+|ps~rG z0*A(eHudg~4Ne`}M_o8ZuQn>=5*klZ$XRr!ju6?%EgDfcBCVmngHoy3?r{0?9ZsL& zNJG_+I5KxWj9Y3C zbxaTeuSTP2+P1GIpC%QEaFWM!Mv9?w>iFLCVX#qNT5an8!`!Wd50o4I2)A3cW=rYB z5L~#VAQ6=f*2JR9=0pmgqia)E)13OmTMOUND5Wk^n1p$vsD%dNUA5;>-*pE!rA(-! z_eu1+_dh$U|7X8$x>icz2v|r}L^x~H=)qYlFi1DRI3@<_pbFPUT~yXMaM^~Elg+kp zbp=xURH(1_Q&Kcg3V7oq%*Z0W|5)1tql&vCt&%Y`vT+nTDv=IBG+j)-WFW8`lb z{rL8k)(=KrYro7?gBhyf(t@jc71-*!Vrk~TU`*718PyO-~O+xf|!I*%;pb2v_ zA&XvCZz>z~*ek!ki_Zr4c)xrDjsQpCZ-v1BELn6qDzeQr3;t18wPWJ!J>vq~%2g7h zT?U#1vO&&tcEpBnq!ZVLfV>D5S#Q2)6{`gHa2U%Jod4 z%wT@c@%X7?KCe|MM?qwZ5(5PnRJ2v%buvf8HfAyHV%qourb`-)?=>)C6-*eyL=nno zSc?hkr>Mk-k6=b4bK+bHD>(?Kk2N>0#^7T)LS_dtUHmvER;UFRRx<1%SJ(E7;8qK= zOoW&6C_U~*CTrRX<)MVRjbgUFDw$bvPQ*MUm^7gE{UCmVtLvf9j+eI|CleLW#m)|64shj$vacoa~x= zzPVF@0^^-6bm^fuT5)k&>##+w*I`sg`BJ|w+;tgU8k+IPU`_~mjvmg@Mj&kXLF52B zq>!K6#pKLUoN9-e3AfkBp15QB?P*DdN+PS_Cq?-2(8+P4w-3+npr;_m&h^aO3tvUe zz_TK?_Ku>BZ8oKBVjQT`kushk-5Wu7voR>G@DoBNm!M9dJJz6f(PmY(=F|sXoc-zS zrMpkQ^vn@6b{Ew?J)lqOu0!lnAk?HDMO;WJtrDbY(60-3z91AwjqWU1FDYIdb^yY& zg$BtKMj09G(kX7=U6n~;lPZ*Bh(2ZdHx#uD6Hx8eze?e^=1e1oV31h&&j1t_J$4NlIhDDTlXBQ>TJp^CzD?SpUD zKCrH^d;+P=GKmNwwenC>lA-#YFIWHT#SfQAUio;L(9V}WTpGlANnibB`M7-t8#6Qr zGme;G5e75^1JWn-1tMd1gaMy2vCsS`?>g4%N=+?%dJ`+pJFW%m~-dsjjoI+pn7VGeUG%bhW>$&mHw9 zN|21FF3@hB_UGLh7Hwy5!#hBjJl?i2cIca%v}fVh-8>V%8b^R5@V7vOQi>XI3%~$^r#ZKad{YWV;f1O%Mr+Jp98o3J*PAiab3dk*eXC z5~4(KQN^YPS%?iyZD7X@tYInX=`22V8q+|nlY$t9^$yC93-9F*Z?(34hzN?`foL#$ z6Kl2^p$KL$eatuzxmcpRSUGIs(DLkV`HYNp!e%nWxWZ*Iu%CdPIh+<|vaMl3bvjce zjKvCZ;c_3CfD{RJ!?9OvBgQB!Bmxn{wqmeqp}d4Z7Ag4>SN`z(tI#CvBS7dAx z6uWRF74y0*AP#co1;+ONmCWK$vLbT|vte^DW)dVI(o!5SGAYpQJDeb)|Ah0$@#wVZ zNBDQRcB2~vys$P!BHiw`8x++E2I=oFiDU|g-|t=`l`4;V*16kl{R>yzTUbsGJ)R}mL(scH; zLEjDOm%gdl;!6Bx=9XLcmo{Y6z>W4n1QLVVaH*VQxDa_oxq@Bk$%aEJW`{fE{m=f^ z*r{XF;Wj+X_mtm;Hg@V_gR%E9?|;b&T2rJ+`-YXuLRa zbnYBDus*hIUD26$J~Q*~#zq@E{%U`M&-771gG-6;-CZJtg%cK*XC6)zG)0$sUg%?Q0(|f9kh|JL1ls zKDgERs7LJq!c^8JDNb9BYs0qfsXlJOihUPiA76F0p9@YKMs$u-x*mbdSLO)(Zz1qM zM;3ztzsOR*@ZyHb`A_dFuV%~k_G6VskQ=ccBT#zhpm;oauaE#oFWi<)r$u1I*Ah(j8uSBLbNw>pQ`)c% zax-Ny;Ze8PE0lT=2%4}EgGAd2nbg zM-Vz{0O@?;g~(HYxv@VNgIS;&HMq1mFDX0&q_{SMG9WOjKc;!Ze+t*gM;;GwF_n_L zEC%*&|2~kt29WPqm>Xm>g(42^q6uvxsnn*Q&>te!d^cGw99gk9N^ww2O)*m$%}j{6n!T5X#S(+r0Eu*V*L?RP77Nym;RX@@#y ztNPY@!?)eG_2KgHD{}|Km2?6TMOsK5S_Sgc*gX4#IZJmveEO7uKX!6DZO9@$-%v2n z`|zz(AJwW9R12rg0$0qlzMZx8=E#SnsKMp4_QF$!d=BHAR^|H5&z3*D31l%syl8#O zqoW#*=&K#CD~=0QuvOh`ci1lR$;(dI4}+GxvKo_~jBJRg(es<`2NhH^IuK26K$R0z zP`yUZ#thEdgdD=nee;rbg9Pn?vbS~J*0O14OnL~WVJ!@cCO+ma-*Z7xnQ;&~m2TWo zJ~=wKjwbyOhMW7)OLIT6*j({Di)u&0B&W6M=m!cSkezj*aU*h8_ONT=(JpgV)R;1F zef+0~R&FZkv-e>At>oCbXPa6%P5yM~fb=cj&e~jxP)%(M&|Q(wNE2G7 zAMuJom@rDGY~E8;JM^Jf=6-U{v_W5GrNtiXX~F5=a!~4hUo~yk(29+2-mB zX*5vX=wSws!wM?PTp`-_aG=)Gu!lN__uM9h62t;vt+f7=Qz;k7jSZ%;$!AjTgn_Tko$)`khSFoTYEP)QFuM{g4|oA-k(T3LMDV35u%O!k7DBE*yi zVUVW6>S8Ag;p_u3rt3!DBT97^@&+d|k9j4VG7u$H;8Ee+lgr!|J@7-7#1?|r^V_cD z7BrCnyAAL~m2j=(G8=L`8CzABtx&|f{U^t4KVGR{afQ!kds!ya{a1yfZrxQmZr-Z> zXV5^I!sdcdzvUooZDK~lkaZkzBSF>a@Wj}yZl=Z{8a3%`1Nx+Ff}zQ*Td#Op*a%^5 zNPg|OU_dR#Kv+nSghONC#!HTS{?y|OKo+HLki~#Or?MbluB=aX;(;T)#)li=9^r1g zwb>CL8)hMLkm(N09fmyY-(Ri1hC(<0tVNE&GV<|ScTegJ5uUvz4ZWZ^&iMSN4L4nV z{+JIsIewe-C2`qi_t153Ll)OY zEPM|&2=AeZ6QTYtMN_osne;m&Sywl5aMsGcxd}T#d`f%eB<|~zle7~`n4q%5Ku5G< z{ee?AY_BK~Tt{1skH|m;_gDVT{k8dYBBXjMTJq!sQYw-7K`>RH{YM8-45XbMCwnbuZzV zDqwo)nIn%@?bSq!4o^HtiU^5i&{J1u-e&1J-Vua#+3T;3)_tHqdpWcMnaJ)HK>+ zU;AX`6UF6Cy&FxA+Y)0tuW{MwGZ7!sgilUpe9bq%ZT@CgQQh#$T1(o?A1-@1MyE32 z>!^yB-R-5_UvI^R;;Gj?`2BMTV@9a4srQ=A2cI23GOx#KZTFAJ*W?Ir1paIUdi)aj zvm5kh?%(eW$cE%scch825M5NnN)!gMi`68@!%FHNJN6`zVm*YX1C~I zt<&zp+XioeG=qhW?pwtM<{AZs%i|(b8z^!(4tb@9#|G30qIHppd-|l4F*3bzV9+2^ z<*+z}Yt~jQV@}InrjF?aqLI;dIOJgz3@b=!as830jjNCgYHF`M4(U_Pwt_m$#16LYBM zusY>xrqpYZ{|I7*0f?`qjwBPSnL?vuah-_Jg3>oEoN)6|+%&kjI0(R`FS*VPamUy;eUtejAvIuI)^7|yR%>90!{a2|>E97_me_t>- zmY@5NPhN!0KDwxg4epz=?YQCDYv28P-L0@+Z-0926)G}Uu)p-snU}$lQHQ~o7sbkL z>8XZ_g1ls*@Od{Dp&Mz{a>DbM==EQCfAI^S{k-Y+ALniV_XVd6?KFg|8~g8c6_61M zcRQ+u3T=0>gQH?|AW-2j)OOvP^7=k~>5}V!u@whs2_fjT^G6@Q_1{EBFu482t5;QZ5gyyw4cK9jUtZIkd)2+)epp#=j*YJ4Nsh88 zS)rV>boX==Lob~&w(nfDg&x8k_Dc~G6Gr7N7%?z&OJ~?`-&<4pueatu)9tz+EjzjX z;<2wH;djU!k zh2L~7?^|*|cEi(!@-S^ScPzf@EUdL#_X@(7PhGz5!0FdrH1_pg*$D?wYUj7^Y)C47 zA%z2fxb!k{4~Twb-#WcYAbIVVgB8YIwaS`+4EcD{32U)6t={FZ_GSQz(;86-wkFiG*FMc!ALQq0Lvg5nDnsZ5s^OfCHx~yg~EAxEle+>Q3?%hv7wOb zm^NVulQ*mfNh)IwYbk~mAYv{MU=TgwH~n~!FX@8|r^5kb92fI8o0+S=fw`KRLG-N5 zXRpENp$zI?Gc(D`aMlIhH@m`7DQ=!nwTyoo#_$> zpiBkjSJDIkj!yzB6SwMWmouC&@*@WyAW zJ0pu7&K4>Jjj#?^WTD68>C0a>-TKs93vS1ZzpA*Ru{Uxa2Rw4?^aqax++<|2sjzY~ z2HQ2bjiN(IJ8NfWL@1<`OI)vfv@A!M1vqcf9_{SyyIf#vQo!2o7#E*%NPg@Q1H=?5iz^&MBm@QG-qyy8X(D z&y5?Nvl50Y<;ZspTZwkDv?z|9evAEeRy*&oElx_%8DISO;`g6>f5|h~oImRQvrZiN zE7Y0!E-w|NMUG;VJ?+yUH{H2%Q|ZZ1y*Y2U!JuwNcz&es2v68w78H6x^c9(DF%>11 z#sag|Bd`~@&#y#n$-&Xo7ms5x`gK8*#hD&$$U}-I$eZuNQ-}PFdXhh7rN$O#XT%kC zb^=s{@xve1-(a#}Vyg|i7aToVVmyWP|IwxCpGD=yB!p}VYOxEE6p@9(X21Al;}thw zKJI0Fc0^=x+4=+1V2t$cfihzbTww>GHsp06jNJ;`M@YJ@q{8?N!qR`mv#6`*MW;6# zz2QIkY2)pyx0Ft66XFX@#=5{Src<(h*iMBNkPm5p>g@%a@vJ%Ck1{1S^_JAfUzzhxv)OU7R;zLtjrOz_gQM0q zMA{Oy|3f`wTF(bjKY>SHne#3}nTHB*KfK1Mp6Tub_5GfCZ_#rfe7!p1AD2&fy*usZ z>u>}(0)H?XLGd~cBuvTb%V)Ft+D!;0&4mF= z434c7LL>!p78$BRMiVS`upfaSQiv#Og9UsZ{J0PX>SKWh8w*rGnFCQ2?Ow>7l08Cb zsNZa3emj2LSP$!q@e{P;b2om&xFdx9NJ$|ia*~?B6sbc&+;mJNS3t!=4j|ei1!426 z&<3m{ks+5$1$R=ooCYY&6$DQLCrJrHO2sIjK^}@!z+OfsI{5KD$T zE-`UKL3tG%a)1kkt@>@uV%f=>jT@QHkjheW&SNeU$bM)wYj!mQGJ%*{5zVkE zI;yCnGqwhqhaVe=siv?tJbT0#_^YDlHd@+A(7>os>_sSL3=PKGFD(Q29uwrqen8G- z6rvlw-$;0z;M55QgCgW_QX%`(rw;rPHvNYsk7bojxi5XR^aZ=!qkr`FlkP-0hW(vg z6RX{Y2VuJf_hn*?x^YlJT48rPvWUVbT9(QhbI$emeK%vx_VQ5?qDXZZDQs~3@azq! zYk2SAg0wZb*4@SIP|3AjeRtS>Uw`p&?+hD|v2kesjBRjhHTFH>89Xh8dW%ABUKrYB zf&^tQl!&I``gaNiU3+p%wL6eD&{7KFtKT+XAAWbV-Gt0@2#@w|uTGCw2B*@3%#_#z zz-32Qn2#Bjvwq>4qEpBrm&$ekQvq~x`-H-j2IBS(_4V-cjGnhacHT*Ye!cjN5g!Et z0V$kY(ZryH>K-EcLmI1BS_bq^J)->Jm75Pvx$n7|9{{5qQjJ$`ES+@6lRtllT)->) z!(}xO&dH(GTgr}GwyyZ>`K$Jx zb+E!T6g#13pzsPq_wk0`j?v*aA|#Or5dpB~3n3+zMog_tKXPoEAr0=_Uo$|c{TaUI z!gn+Qi!j)XS3X(s;%gr*Q`~*S2`}^n556u(fFtmqN8o>gEV>-U;~Hxgy|w?KovqlL z!ge(nm|bu_1<}GYPX>i7{B-eBu0icV;|?ZQCgUZajy50{j#3U=2#7==S#TY7IFUQo1huZ2 z1)59<9W^tL6C}}MXYSf^W-YH^K~ob97Rs@)7Oe(}qw_+3ib$(s0kVKc9WhCKBJx>4 z0zsM-N)2)xHG)zn&Cf)!D*T2*CnoYo<5-x>$gyn*%AG)^Nd=_PSNb7Tgqnp^UW2?m zTXG?B?n0g>#^52Un3p^oZ|x$EJCUb$gMjCO5F~a&?F== zg&`J+AQ~pq8<-?Hj!9$mOb*g1!uf~DxmCDUBrOvyr`c{l++j)g~+?m<3L)ePon=& z`IZKclx;3aR~X>eq0w%fDpRFg<#JZNqf%#pP5=K~-u`U)BL}ORGbfD9UHR6(&b=JA z^_4AW()kQNMk&ZY)S^s)9wAzgj5{QsM&Gakd?17VavUSt+(sC{pf6kO?ihq7_JK08 z7Ue9|ST_L6{M1KZoBwoiWm9IP&Kl*mAuLZed+FXY8;oDhFRwCPk)07++D+6uoC~!@ zqmWrKsHGl9&tPgRJ$!s1&^put%+%tZgYEt{45lN+ydz&M6TY9b{l?!{?mzE?@7CS>{JV=5 zUUKG$PjWKj$bhNCQrBQjM!4e(zbx2sp`b36HO^nWs_3?<6T{^kq8E=R*l7eOk>{?? zhaNZd6a76@4llys+>{S{)qUT7jzMg1%84ZcMdq1(a}rAX^-kHfZd>_OC?TUkd{=iD zFPM;YsXWqm?MYd8_ZuIhwP0PLRv~f_r30ru-}-*0lS5uD)#r3h9oJ{hz}_iaaSu>p zWV?aA@QDc52{8%6cT`K1W*Xa(|B(1VS!4en=kK^MQooUoOV`|w&{a5sd(iI>I|)D& zY~Rn>e9J?(OuM&N_8$`f<<+LF2cMt$PV~9ce6}1~5Ubn4m8igx&BrW0dY1wD%^#;+D-22RLd8nnCPNhSHhXA&QlkLcV zJo>{=dk;2T&<`d+-MtP+v|c!6KDvG3-Slkuz~-&kd+uYe&3hhXF&UFaAt>PkpM7uf z^Y=YFbIkJ(o^b>6J`a0M+P8mTLF#sd5;s6;&BOM{=8&>aW~{#rrF+WDD~-8fGg%^c zArHbw74$xDyP)0*lwxw86>3Lff*K*x;ThJbi$S5w$#H5I3fEE_|Hz{ue#25gQdLx4B z*Jcte3euj05&rSign~yQi5T;UVb&5Ov#{xdO4+DvBTGo1!gLAanG|_+V!sdJsAHH7 zB_5j1JDJ*$gWSDD7LaP0D+IL@H3y|0GL-=lFSDE2OtY ziykVt^9ipYAzTyXI`Fp-uMj1+RSMJ2_%6HxI1`4ZP!kg{XbB-46j_mB10Z}B@=_?R zi@BkYhMJ5lR8`Hab!KKMtzo|UdM0w9=n0fcPjfY^-wPgv{YpRx#c*IHRZ^0d%+v+B zEPlWsrpU}^V&p@LNo_=EZ4h{nH;~`gjGW2sP!@|ZsLx^XG2;PI3=3&AOpE-`bbmb? z>Dj~@ELA95qCz;T4Ac$;7#mA*;$+U+aRk?$do_CMKYE6mNH=4Z4jo&(Hwz)LP@~mz z9z=|8t%`07 z-HdR^1IQ0N0|Q1_NP!Tx9d-(pRG)Zb{u|%V*>)kB!cb@{Jq{?GcjL~=$!~qO>M?Bd zve7s!?>`lgdyG_2%pxSSO+YUCivRVGm%TP`<^EHPD~!qHsO(4h%Qx$lf8A&Mo4 z+JE_LwwIj`0~85VuG3%tbj6Ej-}uqNspI?p`t8gux9ljYOYbgr!fONlgA`1f42Uek zy@2QO&Z7GM*FEsdnU^3Mi#q){2 z3m~^Sgiv9__rGtyN$EMaZkAsFLXAkd!nbR?`5puI7kCF323)w5w{w_ir5k z$iuf%K4h4fqaLO1uBU(f9QY5R=SgI7x_s>H=>vXx^p>gj(jZ~}ioNHd?8zf&S4?C* z%8kA9>=9qza>axfG)kGP{p1bp3)jaNkG5Rd-HXfD;|OpB{x%5wSCd7byFR(Ge(pVG z70bu3+7V#u4`i@*2Zy#c}Um<|r;= zu8Jz=s;-BM=wK2I3^j?dOr3|EJUE8RV+>3b3#BX(3R+?Ua{6MRoZ%-9brPw-ITGi^ z0$Bxoiq_aGKirZyznp?p`=3Uh7`&c{)S16;GT+|2ri@;sZgjb zEyA=uz3u2fB3lA^B;rYBAZWmi?SM07f(k*kq@H0T1x)V*x=Hm4h0t4UO#7j6AqFrK zH7S;~KfQ2FBBzLh0U3i^CVq%W;uXsb5Cc=KcBqjS2h+JcHnUAJeD~u+nJ|sCzE1Q!H|Cv z3+nTr8bXl(p;qhrvP9o;$os5j;|3M6X3Vf|E9wWQR3-Gpa7hi+@(2$*j@jKs>Md|U z8IwBH0$;MPpCcw_rzSzO=y|;&u{;p+&5?-yygag_zA3uc!S$DneHF9Xk{G?p+HRFj z2f!4v1{?N$7>pRL7H5A9q^L(zC#3a->2VoNYX?K>mLk}su6SUmfw3C(wLivGv;p-^ zFY3$LiEM6`O|kPa6n#%&INBtH(B(ojM|8lpl^)-I--7Coc0~%yQ@&a=2AZ#bzVZpEdc(|C*A?gkHrfvAgsQz7L(eUcj4lr^y|<&q&>)iC8kV5l#%+Fu@hs&f)he zS8OgDw*X~d@Y%cV_IF6K2tpUS@!{{SL=qzly}x0`G~&eZeHTPNv%~EV&kp3=Mm;BK zrV2gTKCrlg*9~VM=R*mZ{lOr#({lO4?DqdB>3`eI077j|11K>Y&iR$ zJ&le>_Xj)*0Kh;$zlUk@RmQp%*X}tOVr%#HXZ3y^LM(~M(R+#pIv8Ibaj;hBkAJZk z`EejIF={ItonOsP8eYwklln7N{uN9X(+{Nwq2|#+p+<=j4yubE3l(cGGu!qvS;Z12 zYS_YzOV={jX1J5WAck`D&etzy<4aD1&OVdADb<}52^jwNeZGm-7d$Fbz8Q6b+bN!&)9hH0p@5EB>w4BSW=?EFUREN{aEBBvEIc<@FIVlnzL{0S0j^BkGyH;mkr^~B}zVvi)1?331bk$`AWicGK zC@e&56Z9(c$&>ocICI*-@A~&nDU6TNnC`=OI4{XVFV6Y0u&91uL{W>7SPE z1M2>zHyG_#qt0K4WBTwMyW^_KFCv$3Gv#PS-QWU;-d9pP_{9&GKCVD6_px4xl+_w- z>9_pr=N~6r@J18O!O`iqd&me=g6)nSQN<#mf%JFi`uo2Pb=FRrIKhNVx5fr2Q?moa zf%0r6P?`02Jv-~?x<*Sck1yD%`4)vSV?xA$AEaI2J%yHd(brJ8{x>+nzBXb&##*R^ zJqop)y>wSzX@xOcO3^Y=3#p`2$Msr##W|zihhn@Unkdq0=bSp^D-^9K^Oy)e^f5IF zC3k~zOp;2~3b_+R4)aRFbG&svqQkWf2joN+0pHdQI=%vgw=Ps_-}=I`$*7Mx<<#T* z&p|1at#Bx!`G)q_RM;;}jZCO*x%`mUs$FzC82FfFGBE}8NLwaf*uIj6;h5-=!f9BT zbbvajXfitzTW=)lT-X2xP>z%YeQWq=OW)}5e54X9Amj?*d{ocIV}0N7{c!|10!NQP zw_XTGf0)014{rPZarISe{u9d7}#e5dr z4Uf25l&jDfn0~@grXN0pDKavc7z&~+HUW8eM0l|u3Y!!nNa?*w^_jvUq{wazTkKG& z3bciWP`=iLbDTHj6bf&HmO5SnF{C#L$PGx92gWy2QX^p>E)XAbQng!z3`z=Nl~A4^ zg|7n3fDL6g+zuuK>5~XKgLHKKRw|fO69aZb#F=tGsqzNYJ-DulkgF-Y2|;w_x_H!5 zgh@@yOeUq#3-hT&M2Wx(fqCJ2kkm$DP$xK!($F6Nrq76x3bjC>T2dKtDz5>jRPZ&y zaEH!|luJ|@XUYI_9((s@aU+K?pVh{Kf`YrBnRo1A_R=zDn>m-+i+8YKe-|_KPemO} zU@uMxyTHQ8hB8|z{YNBEVA}X`EX7^R1|}_FrU9iOmm+qcF^Rc|?2<$qwt($f=jmc? zQosZ%4`LjEx@bqF-p1nic%{6#L9MMCq|hw8$>VN(LZM8oKPCtK`|bp(Xrd5mxKY?` zhtOM)lBwVSzU}6(XK%f=e_rC&I}uihne*A@)y<8aoe~Xl$wWf0Q`wIs7wFG`2?OQe z&Z3&xp;trCqqg9nx4u|O;iPwVb}SW$+Y@ihd+M9n+iry8B^gh&u15bRg17HrW5GE$ ze6k*j&lOO7T2+KYwVm=pqX&$%F70bbzqC#C??^;>WFK@pl0woiKY7Ph=Z*Q0KBsVA z`VFNg^ySYR#Y@)}pW{U_)QIm4h2lPW+w@1Tz4*9SKtNj+G8m<_A&Ybikt!)ucI{9K zvn`=APHTJ6*0>l={arU4|7cpGq0P1bbjJF-e_g!uJR)Av3+3sJ9FV^8vU5g%IC4nV zx}*ec<4Yeb?oepm?+>vP#`T&vVPxKl&M;iNwY>hB_ZEXJ{u#X^Jeh_8z1E1IqdkJa zD%)S^9_|#mvw_pD{jhNBp6cP$=TIg=eb-aJe)am}=U&?BuJ8(SdHiZO)NcjeF%(*h zd^+DhE*<;QaYJ*~_3-e>E%(YXK{UpV>!%g!@`e}MZ=7D~zvJr3Poc)&s?PSCk!&EM z_*G}$Em*nl)SDjuVeZ){4f^Jq^T)g~pik;nJTH#v)bhUK`hMTe-g-U4KJ)NqIdj5& zxpO9r$`^80d$4r%l4&!l@xxGv%FaZd5%e2nJ^HldvkLbgO%m9U@7y}0MxOykgHCNi z=xbTKHgz^?IyNu79-KU1l_S6r_-hdOuOy33TiJlRidpyU+E=1py<5q4R~sZY9|i{~ zGezV=c*;@I510w`E+MRu!Z4|R229z)r62?%iN8C^ydY8}Bpg5-ps#5!!2nb}nqh~3 zT~2ZX8`Za#_0LhU#FR5&vN8q=91K;k4RHu^UL}Kzf@e_kDNf5$uw@?!Q6EXOq-Ozbb|&kQEDP{R8}zSvSn~8 z4Km%}K}<7f2qHD(0Hsd|k!{$#o{3C|A_TFc;h`+(Wg^r>)DIoW35~AG#Awr`)R+#r-T?UgIi9yd~DQQd`AB$^2 zsw|xhDV-Ds3x$&MC+QQKjunzE!+H1NK-w1f4}oM-WGlQt&~{mT0vA(yp8-rg zXb>~+-N$U3q3RayW%7D2i-*~eJP-9BA#Z{@3zG_A0gLtpr&v`Qi%Xiuf~Y&`@@|1j zQVENC2`e}2u}xP&YT=tY623#%MIg>X^GKnkvMb2T#I+)e0O2}ADW>z1U}iv$wn#%3 z!Nu3;Qn13RjHKkf&DF7*jaSITnr5%t_=;Q!H>LmXrOTxiPH(i zqm2rIu+iA|7nsgNDeYRxMd+%M2E&mHOy>>)Qm>S^4ZmHuy6E()?)m1W=ISZBK%(l348_I)+OX+nYe$<6}}V>WCnpF*LE(F+k% z7^oQVDnUeK_z-TmVc&P%3C|5KII_Bb2dkR;ELmT4dUV}P+OG>?)Q{gb?ZK{y;^8h3 z1-3Mqoa~3+cU<=4+#Q$o>z%mgyV+Y_hg$s;lr!7WOfb{yskYvl@#I?zo?X1|z+^a- zvIFH!IhWk|)%;Ipth@WtGe`dWXd@S*&yR8`uej&iG>;E)IEX}|h2A&yMr%e?`4zf$ zBAe5Xx!ym9g)PdW2_f_C!;*W{M-GQK|DGej5%_x}@Lxw3J+8)7Q`Owtn=0m?){GoK zu{56b%4}kJ%!cuzpShfJ7+YwW)h%asq)m9Ko*>mmq)`KvE)dd|!pTd5lczAoY5QCh zgf04p$e9q>8QzBo>Q!c36C2*Up7qaDu$1H>2xFXvP|+ko*`tEym`!au$URr z(paj~%=9NrV$6y5fe?-TS|g+~p!5e6(Qsy@Fc|rw-4rWl;97?$ySKcdD$bIr)&=zB9uGch`Tkln?d$09-?Te*y z?SE?+P?s~;#pR8CPQT%kv0+!-@cl~V5sE9C^IrLM#lxa7d1<|oDb!i7QCOf5Ed?o? z`1{IzC&3KmBseu5_~^T}@11?p;BOG3)~O=dgGc%i4X6-y+Whl^!Z%^XKMsaBDKCGt z{JEJ6ce>7+KIlg}c2%7vZ*05*<#DKAJ2FIhF|;CkC~Vu;H%GtH+;1VZ;Dd$iEX7yUT+a ztmp;zEy9PDs@7w7I0p~|wU^vmTfU(IF2ZgPAb(Z34}5`uc;1q|7hZMmH=jm&KxD!O zc~;H;ykh)|H(oOCl^!TZhq|subj=TYVT5N_h^drPcfVfAyYjN)OS`kpq1Hj|J$=OV zZ{WZr$=W|k%wQ8jq_jzmED{4$RokbMj`hqOR zly`ED-D(eCi6g)f`2UZn28dR*jLF%bCYZbM&L}v6Mq6e=kaRBxE5at)ej~AnTA{!ActIhC*NF_a0p^*6n zUqU!-VjI28$Hw=oV3P(qS$<{#a^5B(922D#sQ5fX;bN$W0=dMtpfE-edL=TSd#eTf?mCRWK z_fM;XDN*(!kQ&E=sVPjXhS?4N79oGnUtY#)znH-qHf?1YXPkz@^{GtJCl899gt;-) z5*Ztr4@#n?z77Nh$4iQ3y4)iG7a*=$fjxKI_BB68zm%EOxHV;IT3#3#cZe| zJDX`hvZeYM^1TU{Pj%U7D6|4Ft z#4J1aFzLz-EMd@SCQdXt4iSaJyAt}>jX*avb7F-C>xym*zHr5P+NGr7r?nrKm_>4TaSrH?5v zw({ccMTnkMCl4~H>GI~9<^L2btHDhz*o z1$l|vE;@bKN9Rl%^u1cGaK7|l&st}M+F*eJNksXftucsYBZp)!jZ*5mybfI)?NB5# zJU7>}m@TfjHqTn&9u)_n=2*Hq6I@3%a!^}+IcUNlCq1@Qr&0P5)~fjC*UdLR^zz)7 z@eEN!!r3tZb|J@d10`C2{?o>PW~arLz~JL|T`B?-s=3L4MU}agM{E|8@`P6TEw-G9w==bND6NBLnurZ z?HLr?L&psu$NTCFM!z$1P^J*x+|vaiuSx%UeclCPOpZhr;DcJmah11RHvYw&jJWo$ zp*=lBoAs&vPPbpWztlMBsBjZ7!rP7<+1s@U#zpMgx!W$DtJosSvpnrS#GeB0WW40kSAuA~+n2aGwm1zV9O)D?L$P87XaY7yyr? zA0E{;;Tv-VI0AnS0{=B+(I0TjZI&G;HB`-h#BD2M@d?Ly6o%Y#nOd2|d<`*8O&bty zDPwV&NzC8Z$!e{2ijukj+gjYn*4Fo74UJTT3$vY2cJLe*lqVHRQG`Nd(${fp6oTRd zswmWIq%c&K$i+tWs$<6$l(OEby;xH0Bq&eAq5q&LJV+2}k7RI0Yg3pay+$SVHLPjb zDu!uB7C&SFOFQ>urWnvyDD*Bx8^Uh!;rz-F%HRe-5dAP}@tI9R?w=?whA}N_2UgUw znwc|M{rU}zHJDKk35DwWWU|=f$AQ2d$D|oKf^D7`hAu&nK~+s7b8Oni8v6HTDH(|@ zq|*SG4CcwrWP$Qh=7xi4PxRR-cA~exaSs;%#kWO$ZsaD?pY5 z{h8C~V#Ymtn4wQL%e&-!mM~^KvzctHd21m^Z;+{a^zlfyxWSIX~i0rc>Y-+nly7A$@h%hoCpY&8kj2fM3#iy z&VtlmFj-K{njCsoY(&^>CqwG!!IPi}VON57jqxY^dBGZ?x`H$+U|5usXkin2?`I=3 znpsYgPNhMOOsXa6Z?0r|eE~>(_GVO2ZVWj+28*?#ps{Z0$zo+pLsG`6&taFH7CrxK z9xH$CQBW%}=d|lSx(JL=AWo5m21Ib#Y(9J1fN#J4b@NR~H-imJ^b!&~5z2STnIk`a z?3KBLKlpy#9YSqX3_fcbt*IB?_T|h=&l>(sNk!um`B{m@f8|*vCFm+|xcInNA9!)j zTU3exPLFxlKlJ^tFm?)|xWj>n=_+v^aI!PP8#|(j4q;yRQrP<;NcIIBKpfigl%?EV46|3qwOUU9Bu-9DK|X$ z-4}ADoLzPQcRx*=(036WA|LLPlTe5njR@H2cs>+bxpqt0i8B}ON@;0N>s?N1qU*OD zEI=M#XH7lofixZ4*zAaX@Wt6L-}~ImmydRblt2nq_sBa-%a-BX->BWtL>d*@ZMP5+ zLAjL-cOWD~*f6{Bl%c1a*1cdwzA1^EPljfbECd%^fOCv z6?Kdso;M$TusbD@Ivk72+GM5}D)Ah1R@GYaG1=2$oJa53?6kO2GGe7R!^B6n21ZoT zB$&oQ$q72k$iZ1_JHe>i-47F5BCFjM10w7~fBVZP-nx5z`Fb1yjzHH4{MV30x1)Ao zebwrF?bfEG)T|3vq~x6XAZ$ZxP{=*WV%&B^z}$3WtUh;LLe}{Y_+`j%F)n{n7q@I; z|BMpW3-$8mEf~i3*CjCz${`7*2a)3_hN~%g7Iqx-gEW97q68YAvQQrp2bmV*ViO8> zv7{t5QzuTt&sa=}YXm1yD)HcJ$!{dH22!>HJ}-0ZD`pi4(Zt(=#Sb6Mk;n2?u7 zE}?!Dr-$Pvy>bIEYze>+M(T7k%i?9svT_X*BkWRh%84wdUp{O2{5yn@{tjgdq%|QP zwe8)kdEruKE2%)JW-JI@8q@(VvsPC!pTi90PQt7QOPF-cT9$zDOLf5@oQ9Oa%7%rK zYW!z_{E zsNj$bHBpS~5Cb#7QTbK2)5h-B~jYwTO5SA^Y+7!pk;n zEj@Aj?&>p#4oL5*0ur9>If8{kGodQ}I%Dp(>tOvqg!0NzupYK4!X3hTXC>^v^vvP! zpFVZqw`ocG#yOubcKZ<=r~M`e4mR{}Y_uxWns8Vj4Js33)vi&4GonpGIy)ysrF&vf z2QEYKV+t=6F(3S8eql296Dic)Wh;>iAR2l4%WafJTA9p;4y7z2cTef_p^#lmt`+qI zIGd)PfAeSCcNEno!|W!I7^kTjH#BF-^%oxZ<^U8af8_S6VOQV#%>tzgdCW9xgT66; z<-Td_ww8{*?!x0fsIIrX{l!lkltNfu)Y(G4WiNcN1aP-Y_kCj1?J9ioYMq}5&ZKVg2#>hkIPtBiygB*_K_Ez8~imUW>9J`4na?+${Lhy_yX9Hlt+y?H+>P2h!pD&J5AA=y@C=+yW z(wO{tN6?JcO>A(#z4c!||9bhEBi_V^zaGuL__iDYj=+Bgf&U7!==GXo8><#woTk=Bsv*j(L&c#?w>HJ8={kWe3E7N3%2W*J9=iN;=JcZ09!RE- z3de)&NigUakvvBxY9Jy)h9kyIM7n$~53|+QGe7eFI}-YD7i5zNid!9HrFvnZ8ekj=_i=N&`4U0u+SKo*of>l z*0g*bt6IAe`A>2oKTsgg>5FSd-qCT6GiTzH5f(Dr) zH64zwFpNQ7BL#n=ydv|Gt7@DcwG4yI1*OwxbBA+8A@jLS&CCze94U-sL{Qj-_5(%< z4Z@m%pV`gSkbdQA1M`EBn-3IIYA2NA5RP5N)Ya9=$R2FdCLH@Qg zRF}D@zG>@}P;<-`sk-z%Oqo=rkPcdzoD+E5 zAN=|qt9ko*>Za^%IK&74na9deAGO=F);so955Mg0Z%!eb{OB+%D$9Za*UYEyKJ~t9 zFKk8}ai>eG`hme;?c&w@-$D3X|I(`FY*H6#A#zaNU`x5;-mib(y1Vl9;R7-u-}h)a zBC<$FKxkyuZ;N(5f74?>eov&WHAD>eTy}a)$q=}A>a~g^uJ_pfEE=2b3HLlZGfxyX zU?f~GzUa6QpemZ8)^Br8M5qGDw_3Pr|LL1|SB*nkTSI=)W-o}m4u(9ak=`+fH@XcV z8X|4zT%vb z|3(g~@%6_UtE@Ap-~PnU@7i&%()EojG@!P@faR%o7T&+Huwt@7Be$chN6_c?w>F$e z$%*57uZYzunxU9b$qt4#C!oLhKxpk4{3os1T0WW@L+etgFw|aqdaB`Ik9tjb%Of8KC)n|l&xBa?`o=}@a~x?NA1+Db)0nKzWP~g`aOs6K_;zb|b-%YxI{>2K#vK)j$fa$~vyEJBdJn_x zxy!!Z#hG<@UII@wO2!o5@$|2|S8h2tG1}JG11I94{nBqvcFZEN=|g(eu!Kz zN{vt}rR=z&Su04T?k+URU_K-AZ+6^hcN|R6>H2O`#|`~iu89{ysl0yIE+%hYjmq^` zsD0Y_Vc9_pGRic1wWE3ce#B>3^$1G@(GjL^BP1dG9uWQ}r%DPS#N#mt#i`z_VjD{G zS%$udr5e^SyCwqnvR&jBV!sOR(Q*xW*qav+(trm6f;tp6m|X}7Yg}| zzJQxK_ZKnC(xot-sb%7%bOxI;COLH?ljo)|X&e+d5F?+@$?UcG9$~4P?^DKpArXq%eW;g8cbFj>teKV*4Y(z*PxVPKCjmv!aYOuinHw zMHNhKh!a999o0=t0plAP>OxXHEjiB;cNVY%ZdCtK>Y-`*@VK3nIBHYvG0ttm85YlUy--`3Btz&V0(wVKn&U{tX%vFf+(?EexpixNtzX=SA5~g)ugMPd1qx z5WoKbn`$Ud9Feo^{iiRy;+xm6Bv#(7=iJl@eSd%c-9=x&_wCw;plTrHD!fl3ISoyY zgc}~3@f*q(^rxDA-Dx?gYV^~^x*Z0UFnbZ3%+6$}CMj@YOu~S;Z(W^LcJpQ9Uw-q` zmG^eb)2^=8*qyVe?|V^p+ZmvwNnDZ6ow80ukP5gP9h!trdr6)ObT$dD{hl zlWS^HoVK;jTl@CgTs}i&GYW6)U68W#@mo*62Tq%c6UO&mKsk?hw-l!{njEn&yubL# zCF_dELal1u6+Ht;0R$mwIB{(6Z9@uDx0aL{`yn4vOe9U*QtX|c+n1j`^1ahf=>H@3 zD;)OGm*;*EAFpYIE9gd(#TCDHTiNKm?8Ne{)R>a26#c=orw{%XB@qN-bhHcFsKhxW z(0-`D;8&#McQ#O`_H{W~v3W;j{GsW4_gZ`El>Wc{x?snR^Oo(tK&6)3u0D6nI~h=< zgzFu(K)s^e*Hu@XJL(OP8O@4K2T!c7HRrwY>574vq#0DWujYiO?m3xCZcuH^t#g;} zy=ca~9cPHeJI@H{ zvg^w8$GrW-U7a4avwqc~58}9zCtja_2|c^;Tt51k=WYYQSL6tA1db&F-5Nw4%L5+k zefj-vWmEOSlLMZ{6rH|znI>lNmqD?_FAActw6pAZt7-S-Ai^@WiFuo3vZOykUi?md zz*E=P<8C&HRRy&v8GUyt;|izACDn1_V4&HyFF&rzi!eesrT8f{6b%=HD3PWp7|&o7 zMMV_^vWUl~8D>7JooQtV-AZePFQ1Phj1>8f0X=Zwb2xadD2Tark!>&QRNTrK` zqNsx6hY&;x=8+f-OqrSrB@L!5%@*b|TUetTB`44vHHf7Id4fKW9IqXsf~kqAr5dK~ z*N>^P;h?HRo+WAx8u|@E_-O*%L1EN`970kXA%CKjg_3EJ4;X4NGUG1P7TmR;#aC4_ zWz0aPOh|@H>|T^;L_zL>gIFB$4~-yVBGe)b`a#m*KpKD|DvAxi6NEa9awv=eC-amS zG1p8Jv!L_@Ih*Q64@G@OCrIBWD1cBmaa^n^j9o}wqfjxqKRl)+k07Bu1z|%&OO*Bq zI8obCg-_KgkVN{92qUsXEg*yr6T)9%S_8M(5Sj9X985pyTo%}}kGT$@1jhD47BDxn zK%)@`KKaZKtSk!`Gw1GoOqbu6rJpvHDYFt-)7o{c5$dUB{YIu9J&39Fi7m!AVkU>` zser+cs~la%;sT+gcOzXL;p*cwKxFB!fQ30MyO^nN13OS{XKRZ3u(IYjvNOoFqax6fm%LeKLD z#Uimj%P@MZl}UEvp3_vi{Iz1at}Y~1Sz}@+eC{)u2Ya1Wqpa3FQ_*O_LG!<8 zX&nsCTfX;#_1nuQld=#QbWs@B)bYI+zWem~mtcmT5{`Sc{NvK`uWf-kwsOb?Qym%FMjlxm77!pI9|;BSa~hlMsUQF;7=#Ykv8U#^ zEqkhtLk+fgkWzNrl@p%*$Hik`+`6-J4C+WuqS|yc{1+4zOt8HE>B>95{AKekr-Ho9 zTD)^sL4I;!R(f0!^0>Mr30(oQ?_k5g(#obBNPxmBC`rL4jm%pOWno{tZ93ie=)oB) zKX~q<^Ps+vvM2;yC=^l`j5BV3>BD7DJ7L{VSkUzfq3t^4AtGe6^?Fh%hxXKl9tT7g zQG0- z-wY~9+lX-10k3|#e7po77?iONIgCe2VA}K?8q8ZA9^K4E zyDod@i`Drbe6yCE(}cVRA^kdR{M><@M12-HX91VWI#X8rdXudyL`Fhwdw>A7HdNMP!~tf^%M0f~$XC(wg+7ufF-8_TCuSWQzzGci0a|^vlya~Mrqb9kIVxOH&6bPTiL6L_V9ZHDT z97H&FQ(BU);=!AzJ(QOj-tqU}JLs()>2#D|lZc1p>7`fx$(%86wbD^|nUq%jJR)hZI%BeS|G}Y|e#k2^ zo)^74Qqi-|k34`E_Ic@f3d<35z>6cGp|ur7WKnp@qNzeZ+-9h7an>x#f+-HvltrTi7A}S+;Y%}MQe!?hn?%V^nSeW5}<>Z-RrAS+YMK~NzMb9G!c05vuGnizV zEUkTAwxw3hZPg(O0cax@-;T2iFLaXH-dgelMTi)=+AVa2N4O_nkmx(!VJ{h z)lA(-s=;Wskp?WPPN62>ohyhVj5ZiZ@S0Qr}>@LfNlPFdg z3Sp3lUQvKk)K`K`N#S_JEHj(O2?t#M2P}>Pt#FUsO|=c(w7EQ!4m9PF2NS4l5SZj& z`z=g0apVb~e*uxfY9gUw*2pIB)R7@maq-wAX*uWpR4FU24a8o3(&O4V*3-5729-8% zzf`4n1VasDATzxr9_q@7hT6&PIIuvMHg3GpI{F=%OdkeVI-oY@YzcN8{+`>p?_6yC ze-SKx6wnc`wY0nP5QXq#n3xziV~xL`QA~22KY!%gf4=*&8!Tq+VA#JCm=~)>+r9jQ z^1mLcZXe$PGZ74?j{}TPzqb8HUVreHu$>pP@*lM{wYv%cX43l&2;qV#lf1ra-}QfZ zWVQLO`cJ{azuD)pEzwWx3Xz$_XTW|gK>(8Qp zaWsrC#AbQIN)OP3kaOkpZ|%DFxi_|7J9ld7)_K#1y!+;R`w!;B;j=K;QVG!MKGnYR z>u_ByaeG2!G+>g7K^lP1O;^u)C_CNQzd!4^^TY3D(2kkxtfw1bqC)WP_&;Q==y}m$^85d@!7R@Sq`-amNtO<$h*(D%PO_t*ICPgbq3SjbT(=*crayL9Ij z@4R1r$>rya{nyU@4Np!QQ*gTS#b9<*d_wI*Q z6xK9$5AW+z%B$jQq`AYLhF;t>cJbB1SZHWbTGfP6xmzz-IP$gg=8szX$|J`%3YqHK zLse~G|M7jx9@)67b{@-w`B-}6CRiek2$92AUO4{A&l)K5UcoVxh85Z>(d)O=V%Bvs zK<`tcUcfdGaO?fPhgvu54Jz+S=zeX*;n2C@89FlB3%Mdsv+}CIK7ZeA_`INCnMN4INJyylkf+~$L2K8{0EZKY=qid!K7u8Kjwxb zYCCxWr==KVYI3j+FnF%*+bH|8E5TbKi;>#~dHa}MRHa)e8-0+mTF5nbYz3~vAQjE{ zQI=$4KgCow4^a5`klotm&Vm$n2268CgN;p){XjYSBOy`%pe8&nie~2Z06z?90O0*D z#B5;lKMgLdQiB2O1&{*m8tC={6b4{a1A;=6bRlJ|Cio6C?}I27466e2Twj+95>YKl zb8KX?OeROoKJqlyp^+R=JgpSx#SqDj~o@_IwlV#=v9D6eULkbsI-QoP^ zR?UDi2`>9D5$=2B{zNuB!W*=DH%%@(&@!XUnUh;E<%l(B$*;7g@hfE#V<0_y>fe3- zJ&$+0wq2(740&JX)jHZ+-v5Eiv26xZ3Tk6!B%zcheBS19maG|X^;}@2Q0iL~@t7>^ zZ5#Uk<2Li@?F9gm_|iT3($*hT)O8K#K@Jaakv~UQoj2*3-`;-S_qgY2kXsxOl%6+# z(@7oVD8^(imw$NwL#}Y@#ANQU+f5cnYUpD1$u+2XT(#8$X-Lr9L?ag=H|MsH* zmm`%JIQOz?43rpPvhErZ$Y~#JtDdIBbv9;L&Y_8;^EW^7(w4n8v&NojGc;#snCjuQ z+N#$ok8>qFbfkUco%g*xk=M(>!iyf_YcHAf;`E6HYd)%$JhG##WCcz-z~kSuW^jHUt(X_+(xTW z4G3O3yFEDqEaHtUBONg$vyOA{`tC4u6ja?t{E8llyq|noIVEb6;joy1_GX zbnf=Ohg!zBcKNK#cJXl+W}92jojd%Ebeq049EmceDtNuRCPx_<>GN1J3A`Q!QbEgk z($zVH7!Js*;Sa;qq;Q?3DP!_0FM+Er963+<9RdiRb6%A=GjL@_49zM(Qrr2>Z~pA1m-kh) zjqlrI%6~`S<%B;y`N3}yqj49UJ3o;O`&8$K}?qSt!d z_Wg}>F(C!8_=!}f1A)_{+nqQje<%LIKLalJKf3z2hif`VvOE>vy#%f$$vLx!y>rL6 z7v1%zUz~LJd)e!wZ{V1e{gtg#m#*G_4JKopeEEjMG1Y_reE)~c0)z3F;~q2K>kX>) zdUeVX^;8#I>h)9w{-0Ige;zF25el5;1zN~(OJr(qT$%tEfQ$^euEUfz?GIKPz(FD` zbvO<$YH3@0VO!(t-y&bb1%asBhCp*NSQoyyUdV6BtAWn>r}e)QNM43`QKEMA5@03y{xy6D6O!itH`xsJ_)ndz;IsErMP} zm>Oa1D<&2O3KEEcg;vP`uA|6kl=)~>K|{v{6YV)e(hGcHmQ?-!?8ftPc83Wp4DRD=H&>qX!{5Dm9at6-nNU`k)^OdWlOFr_b#v}l z4=hC+5EOpYK5$6;7MPrL*u7>jB1Z>gJgD}1!={h=?EZ?@DTp`tCwj0-HGTTxdOySK zfJ9dOlfe;~K`?Fx$At?=y>Qu*F)z%3?f*}{ec~2oO)6f$eP8|8{_ywJ_d(7#p9kjs zWrWPW@DFd}KvnyQ-G^F6uNv@9Mh+I3_NH+;1}Xe?dk{ z0C-2fb?vPC!AhP005Ry7y8$Md9Wr9#1puvj#)P8xxi{~(0~BV|(Ch>F^#QQKIbi8t zeDI&^?lkDPe9vmqwt^*fO95i4YC1>397fxhh2@i`L4IUuVcK!vukR+B+nfaep=s>m z2sc)`=Hf~JK=0+MlwMvChLu(IQ-^Tz+{8(*6K$Zu{t ze#Zem(*FGP`n#WfbH`2SuT%65G-q(eaUz$UJ@%d1Q;JvTq#GO3tpg4sFz@FWE*S&m6X#jHpI z+i*G@{>dezPaG;EZiqfQKjQ*z!MFdcGgaTl>KqcN(k9Cz@n_Z+pFXI5!NkTx&F}k zrA28!#!Dxe8u&!#CH3J{1yU9G3@h+I4;B%O?ojDUs)FG_Q8?5-MWfH(3XBt%Yjllz z)wt(`{V3p4reX9loxW&Scjt;byX`x3!^l+BSw}YMO%q@4t#2Ualqn*zI+Jbg-(qq5 zumb;!Go}t{MGKvoTKr}(Up#Y)L4ddov-Gt8{g@fB069W&s%*2+!CDukn|G2nV;W3m zYyehC`4|sWK>v`YAe$uVCUVr*lL^vEH9(;hW-v_e$&ov#LvNu6PZVEuBk5sYlXK1G zkY8%S1n$Jc7v?y=AX&}1BvnbtQ+@dE`?($<7xCQnh}ptxNregKl>6jzPgMuAaOI~<&YOW zl6J&)Fo4Yj8)+;VBHUJ4))@l>8L)Q(L<4NXs{nR0pa9^M3UJo})1U4=J4oU8VvwpK z1$sUcPB-Zaaxnk`pagrUhn&_uqKsmYp{fATC8%>020b$LI5L|mB)ix_@2=hC*t`w; zEhT9KaWZ9QQyhR($Yc?>5vl}u?y!qGDJ|&z%1UNC^(@zGmC1_Vw7Uo#)IAo4-5Iai%C z?rgnfR9peGEIJJC?(XhEgS)#!U~qT$!5s#72rj{c26uN4F2N-Mf)gI!dH3A)?mh3{ z{yS^-?yjotuKIP07w>}_Xu|&fhabUvzoH_ZbyG)u>)++5$y&e*GxNjt?w`oCw=Bg! zlyDd*dVbkiHlK?4eM(DUQf}g7%x_j6zI^aj`nNjxZT-*!4gvHF7C7aTR_CerWf+tr z_@BWIDx@Hn>qDq=#G0MCl=xUg>f2VZ)%05 zuNlG5&?bpYbHtw8`q*)+B0eb+E1y0qd?qzcMcJjNU)(L^ZaMriMjU~Mt+Dyd)yUgn zYl9;sgi4j=w?H00llQwXvP`!dUTMXF?9tU}@7aisEZe?b(Az?+@G9^SOre+U z`L5y$@Nz7)oL-$aSsZ=!$YxjL;u~h`kH#~5;RU;hshnci(c%Z>9`BywLcgc<=6(B{ zjk+VH@~ZdgB{y&AQz(KSdh3ck%~?Ao6T z$=3wahP_`P`-j`sUX>7{nof#3Pb-T*{gi!1K40)q+)1Xe%7I`F&G*+F!+&pA@Sp8x z@MfEXkS8suvvwyZKf!{C?w;@dM4TTf5jRzHtp0SVKDd5=uKAevnS5zHz9)bCH+?LD znQ=(7)4v*zE%Pz-t86E@SvlUL*bMk_PImF~Lm z5*&;}mQ-|5d$$$I%(?p09q3_?=K3=&$HjYxY{7;Pe0)I=RE~asyeG*{+&O#U^N=Io z%nRz_Ik~=M0ObHlW~kw@YijZHabvKSrg&*~2AFQ#f}-g^A-n}pkU`{{ ztLft0`l(aezt@a!`AAY>0#a=*HSCleUklWhm^H`mUOD2Wp$qW71RQPH7U(G5kb^rd zsRf8i4`W@NNeeVz*=tZ!(Sur5cxSaroZ2%hXq|&svwzFu z%;t`CMg2HZnPyUsdSi)@1{z@*4`0mfr&!P!2kjUjEgYJrEnD8Mr7s-re0;1=1V_!` zn(b`6J$vEcV9o~-J2yiIX<$tzJ7P-e?mWWqGX^3QqWy;xbG}MQrq3e|6!F=0pB~~% zoGDZgx&Z6QD5j5n18S)db6oslMat=}xZBmXqNCyt-De|pNkEYLoj?v{eG6M2GQEym zL=I;h>k~ zBO?pV)7T!3C<5J5DLl75CcPpVG{~Y_^;7P?J0QGndZS z9q2RZigM)2!2r~Zn-89qw^pX=oD3mFaIzT66DhWHEs$8H{{*h zTjuAcp4f7$h@a@cuXwENLj;P@k4X9+a7cj++NGSzV0XB@15_&N6}O#NBh!hbr`nP< z1lM`Puie4i{8;tMw?xD zc(eAZ{2pLCS=))mn{*uFU=m}zV}|hX5ejM2VY7dG5)y#4u%z7E{%h^COZ;(HZA-xn*N0Hu^=IqNQarLmcKpTtJJx9m9uQ`8WSorH-C z9yTTVE=IDDpB(-Wg4()#=+YjcW2DUTp%mO>PnG#~SyOXKaKB*K+52=0pJB4P`D+HJ z$$-OyT9Lb&UDW$^5xF9>PGas6oSp4IVMw>_`TjZBCwMYhnqSrCZw4*DR-U-o4{7|~ zqhdtWd>;EXE&`2v!g$~p_H(*|G-};Se zkgd@Tf0&*p$0dI9$TaPxTju#ZEz~i$Gn}p*n8o_*UkL6u^h9{>$F^iiZo(6C7|@|L zg(_M!VrWie-9B`>BQ~WaS+A4gvTrm(_86R5aXn`Jg9=AO7s1rsT>eXLWZkxw=f~v{ zYwCue(Sya`WSQG%r!K1zN%E^&QRMCgpF_Hr#;}X7>8Z<;u5M&&RDb{dvAjzNX)yTw zC~aXSsd^IkI5BvyXLKcv>gOR}_f%IU>(v`zp7z8!FFH8L3WT`|?9Z#Xcu1-V%0ex7 zsUa68_DBiaYeYQ5m41c$87jKM^jz=zb$(3#+A-MI?``(V-{EgQs00-gj0aHc_F)1mquW;1>;gs`MdQvEKEOe5?yL8m!Q~H24p5{{WluO#cC! zzuc7j7Q3AjN*r%jg}+2ic>E~J%+-#>o67nVCJ&ZIlzB#!SHq5jXW7FDuXbg1x)Zrm z^*9=6rxnFWSW)0~j1Q133Co2%Ylk9;c7#6dT%phzW0Z*E^a~qZo7Yf4 z-Fl3DpgT3eLW1e+H}N>WgiypaMiq4`fTqt#yqK|%$|8Ye7V_DV2$soi%(pV-?gdT5 zPe*V{*TV*N==_vdqZpsP>l+f6HvHPad}$#kZZal^O#fjAF#vOxWTL|dF=Atz;$@~A z(h20~Ujq9-f5LMh_tOskf(j;h#ttMn7*@x+4jap801W#kMXxlgYmliVBzb>^!HuW=lKd!icI0syP`!x=eW#hu8j}n%XsV{<{ znUXF_zFCl`wDLFEt-j-=%;1msllH~~pR%lnBr(@0Zz6d*AH~LsHy;26E7yCqHWYam z_t)|zwGYQ6@+5vg3{_{1%WNh)$vckQs16FNis+dFf4ii75AsYT%38s;f2A+qz#+Tw z^Hq;Mx{ha>>vgii_}kLx$_UDF@oCxQ)xUr1ZDtL@Mr`Ji?%q((^v+V(X)}NrcA9MT z;DgCU@;=Zje@X1(dRu>&w~Z?t`9rr!?}6x|ZlInor=r2j6?Yg~d-TFD1iTO59QUuD zI!hk$wY6>NmLtv!CtWwNi<3G+PYWM2u9vM`6Y;`b8k9(RXb7*l#9ny>_hiO&j?rCz zJmPS!YHP5|YWM5?4*T13fh23mFQM~@;ZsC~g=vEyH(iYHaNr>KnZteW=`r2sO7n2! zvyyXOQvIfquG7jviybg4MhWeEqt{%#+Qf2w zpYCVhBQls;SSnG%xNpPf_u>zLQ(AZhT||@cp87UkU(FU6H4!=Gw(ux#(W2;4iVq18 zznr~hTTYHZ1C4jw6}NMOwYwmti|6ax3nEtUX>za0&S@Jn)?bNw*@~ zDv`?9MCv&mvtOkrk)saC44<*=UN`=MYQ47+0=X9CWZU@S+}V;Rzdd@OsH+A_Dc2@; z^$Oqa&5}PJzpOTKb1-u|wFjK_)(JVkes@pyed^Y%m*_HIgWL&MN(Me9-%s`2TqHg7 ze}8_>C)3R6R<2MFv_P4q@TUIT`d`J5k=HDw$N@_nLGWPo6?zplV3lQ3Z@jJ>XqluLi-AeGixZfn8Vc4z;7Zl?8Gi@ zbb>dJW|8EUII+aLdku*Si=~eICvaJbXhG1J`lIcV0)C%#$pyPbg@l%cZjrq#AM)!u+4%s?PR69Lqcj|-?7{$> zmD23Xh;V9!1N~Kw0zvGE!cs;M4w|GyT}r?mpXwMrzA9EyWEU;k291`c0kRGlV{Awo ztR%4FW0DH6QH(+=fraxvqohrKq)TB^nO5yFxc7@NHci&0Kfn+t z0{yy=kVN$q%EDp)iCQ((w^NFjSf0a25Higm7nf3@*qM3>169Z!!FL!IDa!@|w6^4( z4s;p^YR^X;KtUz59Ts#6Qv_E`S>?FBIk+A_s8%Pus_*EOB!hZ(A$R0Tr%YMDBAL9< zJStc=EM$cw$$gfu7!&=JWpG{)SIcXOdzFnBQ2|p(KNeShPn)S;{ zeOp`41Fpbk(BG9mv&=jl@S>ys;}soM*jB^+BK^O07yTA9tzS9$7T2|d<=|B51v8D@rP8^H1&`|y3!Bw?k=%RN$JG)9)Og6VW@D*0WxFqLD^p8v|g zZD<~KeDVGXDbk_0du(H)&EmeHtshU>sP(8%+n!gaU|MD{x)!5*lrDeZEq7z4yF*kB z#+~lz!G43yr19#vkeuS+PLI_H^oeE{Jj&cL9cJfa%{;r)ns(>fCF-f)qJzM{@Yz|u zx}1CO!{fJ8`W@1CjbGZA*l4TGNl^T;!SD9&*Ma`iA?$Al!^%6qf)wN=?hA$e*K$8> zXdM`5R6mD81r3j%p~`N>%NFcBE*8H2$!Dh)gi)fIGMQ@=^3wDAC2gJbgii2ln%`vO z!?KrPN?>x9tF8M-!0h0;Q}91n?4NLYD(7A=wo7@Y8#1WVKNo{Zad|FF+AgX;BPX*i z_P8F$!SbNqQ=(2Mq7>}{=42s(3uQQg!Cg2Oxtkn9KjRB}r_CcRui?101e!j53+@_c z^u~3w+s+hjLH%OS_SyR40zc#Gb;X~U+4{7o`6RbvG_dAmt4t+|{rkHD6kExde89eL zu)gQ)YZdMJ9?Hw-F;N zElhQX8BN>vCXic`IYV6HJA-cWhrRoj+n#8y3dqZJFwmua@TJqSfcnz(Y>yWI7C_&^q><)bTb+g~UG+93nt?dR>iFAuLg6(Hl1b*(Pc zaz^p`wm`k8H&A1zW65*|PaCE6SbE!2m?Jg`>Ge*CT*57D%2Tko4Q$f&d^vt$yy51s z3)3`xHldg^%rDE&Ha1R>vrg)z2%mVE{k&olwjJz9*9#UXhLE{5a0gP9_T2S(WuvyL zfDP%nlOM4w3eyx=1*Q`=67zIXJtngh)WU_w9zOIvmE<#q4Z4m3;}e}eU06)GYn)bY zA|8Kxad9vEfGaXU%dM=Sc}!}l|B=F2JwfFL#?qu2rdN^v<>%kSs>+Ituv#3r2K5qn z4Rmb6!QWV8MzYWs>3yWQ`UyT{RUUNhAu2^DYmGR4J&aHuPoW_1)^HRh!Wx~u?-H>e zC!AcsqMnPx82DTuwYt|GjUkckpTQAfmPLz2V%|#3qvY2M&|LJzSS88DujqLTW=6#y z<7RIf0Bzpe5PTE>-p24Q2LzoF9;_4=z=Nii8674pr6mialm~aMY1)@=yeLMQ(JN7X zW-Cz>ZGb+A$zL(@yCgcLw>Y%xvzO*36dbldDq;;Y-0u1If<%+@h8$lYmwbN;RYN?E z#*o|YUj_hm?s;?XKRVCe_V`dTdVTgR$rajLhFD{T_Vdsf)RdGLJW0|+Cw<9$<@(gE zc_`aMwOB9&E(hnQQ4q$1NC!L?LE}qM#~7xt&R#` z;O&1lS6FIjb1nV~cIdYV4=;0YYq*{&{tbc-Ypylv0S#b7|INxj`<>-z8ivY`{YMXV z;TJ&&V|>tQC}NU|wA^ErNbnD_`b3`vEx5UAz z`KAbO`x)PzdtBx#j}zdgkI%HS3eAN>gA_=oVuv=dcEXR98P^|4VQN%~Gkc+$+EcA8 z$!wd^Bl=O_Ui}rx!ox0aNs|7&)lUV2&K^TO0cyAa7F0-25RD{~zSX$0XyDVb=Y}2K z?{JtVJj1=24!4;!%IgG%=`~#=&^IykL)+jaD-|YV_tTVlXSOdb@B5Unw)fX2qQ~l4 zQC$cff7A~!QMZ0dCS6_EK;yQl>8h~}cg%&P?-#>thU`oEN9rM(89o%0AOp!R{ z*zDSlI=7ul*d# z1j!rW%y`@sR0f|o9=UkM1+4|>^L=VD}xfVvgk$Z#d zUP!nu9JN|l=f((3Ep)6qPi{cJ|E+PY_@CX&cY54M39xisnM~mq;+wX2btYZkA33YR z8`~NM*O!8Mv$qC&1i4Zpf!VZ~!H{I{`!~4THE-IUXWsg@GX>{|y+3~fWRsPg>?4TF z5wVu!^}ZmEu-IyJ7#DM*(x%#S<63%XwhH8f*5JiPg?;5Ai^0iI3|wEsE)ifc1b0HW zhha7qy7K`XZZM0-gJJ{m{0T4;zt(xMWq>~#u^EVOW(k}gXM{VeuEVkX$^UO;^MvjVwOiXbCyGXhvc!Q>)@2Td?% z%et6d9F$UV`eAl92#Uw-U201B&=oP)V2Ubi2V2t7x`W5?71ADc{8x_ei;y}wsd3Cp89_<-4xL+ zkLenCwFCaXea#d1wBngCIB%D4e^rPL8{B@b4d8ND;M9H`ULe!t)dI{4PhL_}ZO{TPR(-nhvEf4&iti*($c3(6&9MgH8@}(9>Ux{{JIa8?Ubm`NZ8vpNe-MMH#=@My z6y)3IEjcZPHiatMsu`7`Wj)?dS=Wx8=hozvcDeCn&1+ii#{&Xh)KlhgFrhA?mR4u; znziqXe))vkD=H6d!7c}{JNsQP7}n}fwzZw!!u%$`^#scF=tvp9N?t>tfxBd`_eK7xCBy$hO1(xQ>?nGNg4NC03CWNHsDwJ3?>k>ah0y}W*5Gw= zy~=)SRq$o@R4n7hkQIR%YPBn7wuv2twT@iLeymtz|0WOrX%FzEXh|k;&E%F(PN-bK zqY`DwcdPM4P`!qm12V%#L@B|2<(?Zi$HREdgTYHTmCq7{wrjAmYpT41i0Gt9_FxKo z*p_ml4A&LuCY7uwa8zXrWiJ?=tcEqlTi*(5Sc-=lKq#}?zphI6TyBhWIbyBHLwE=s zqrb}0pXaU9utJArorLfvJF=|5rzC%M5W%VOvkvAFb~o?872Y8VhP+| zT~??*kH!|DT&+U^ad?qJLzRH)^GItS5i#tp8U3*!r+>7)NgZ(i5R7Af|D(cJ24<(x zO#@pw(Ko_9WH0bGq2?7UNx9+|*fdia4{066DN#b2(|8@3&M=EJTE3}|e!BV`!*&R%x3we0fJ&l-M9l-00GVWf-a1IUV`tM1BIu21wR^% zIPEvusMTm)HFFYXKl4V>HT|x_*>f>EIT=TYf&-d%owBsu7KEsZw}Kb*F9WUHpeyva z)KD(j9WM(-)krOOk^z#fZKqP5^i{y`9U@Pe^c`J3R;+sibJys&dFT?2EW=Nc`_l%2 z{Z0`Q{st-I?>E9H;nR`^ZMP5JdGBAyD$V*X20<^6rGFMTO%sD%{KLF&Y2m{lbEBrQ zD(_1j_>4p2z|h{;l_4@za!k;qZIL&Anv!bpy!r zhVOb%6*oBttvs;5B^q@3O>BcYWNe)-RqnSC5@sAPCD5{kcdSI2RDQYDbyd(Zmm|3FKrt)8)?Ys zM?MeD5JDLb^O+s?8?81p;4lB5z7iF%#L>-AD?dGi)Nr_mn;*Jl^!+HHpT3}8fAR)~eFgBxt{2}I~Obp&{*NKxqeSY&l*vWhJ9%Qqx3 z@0dm!>JUl`6^!AZs|e)jC^T`exMUwH@Z&-oEhyH{{rbC$g(*_{D|Tg|zz2W|H{Rv` zl30C3WhbaUciwwa473(G0E42bn|aP>{5lG_8>cO$o(aF$uSx33`C*&V+|Tm0;ac{w zDJ4grdL(icE0LG~)p z1sU-QfFF%n8?)XQku6BvC)E$vVYHJjmsk0U4Br_E6FA)gh#^&Q{O1K1+lAX?0pmcvS)M-3a0 zeNxC$73OuzS*cUK*vkk>OCtuxPp$FdxN%j5*h%~;%UiQO!-VE>wNl|#vei4%J?QRc zJ;~_!+ki`F;~Fl!eJEzsK88W~5oguo@Ts_yrScZ}!iHc%T)!7L_8;IW0Q-%4Nq!`Uzt8Rj|-pfp}tj~_t;yh+A^urzU$XZE8Yc=~HH6h8WJ2-)5doMTz$02+Uo zMEN+Oh0SZ&czi^f4tM#P=Sfirq0(Q>STbAie0g1vr3@^ju;-#HEHI@+02qC)BU&tD6HjJVmA;NJuD@TwMzHEnLRg_VnmqD z!NzO5yHLs5-%RgL9z?86lbAUjBCO@R!KaJ}|5@2?a!%N->=fp+PeT;BJ@_qqOJ0Ln zoTMEnT_4|xrJ#A*xkcQ(Cyj^0fUPw+4qQe0<$rz_`ZwCkg#=LJc0=Y(!bv-OI&%@ zn6qXrrlX8Cp`L7!pYAW9c9BxZK#JO0z&0(ODkOKg%qU~Y8g`&OBk|%L(RuWRXjVN# zcyj#Ljc}t>Whx9(s)0RolCTgtB$A91Zy05|ebHhTPSkcr16awd%MFZNR|1u?hN1aE zN?h<9uP4>%NPL8RA}~Ag*P-7V>MN@RunyrwjwVxhwI<-j`Y=TBbXY^HSne(*HCBk-r^@Sex|oDt z+HNJ|YBOp&oTAE~P+)skx#O7lJ($N@_@&3LJuH>yyBkRJ27VwUuOgG;`vtQhd}@(0j5wb+SsCwy=MpQt|WVCL{c9w|qDK|Me1lC|y&P zeT1lZ@=WMs7S${5v!XOaXs3sN+HrA6Np$x6j2+&l#DJygf~0hWglUe#5_mjIuC5yt zMCNNn5#ON+2Se6@(OQ+$7ToE(517^U0TE}+#-&9>hm;esV}?7im2oNyrGp(Fa-58q z0wH4MG!&`ys;McI@`Y-2^SAKS`6Y2SndTg0waKs13(?JOsVvaKLEQAINMek1 z>PVmOf zMdLh+3t(%(Rve|y`f+{ZRPDfqeek2mRf8@*K&`NZ_UsS+ubd+CbZs7pGA*!JL{)6z;%{Dbr&nL>v}G5Jo2%Mj#XY zuNwwMyV)0J!@4O)s9{((PZG!_TjWOCMGx(6#3hYKShL7LT_5u^XS-tMr)8Q|mh#LD z9H5nh5IIgRM9ue}78iz|x(>>p8ooz}AY&*L%I*5YmjkR@N)k_r;#Mpuz{pDhXK`hw zkjsaRrHJe64efIY4`OEdx_~?rb+{;{?oTfux~Xs_3}0pNE|`uZE@-cviZ8>#DM~Ow zmP*`Teb1jY;orw%7>}I8zD~Km_<{h3$JQV&f z#n}+HrTc{qHs6b@P&l(0ggw44O?gKkbIw#{e+f4chFv{DPBELv3ds4p6k@E**vI&5 zfI<%1yztemX{tc}M^V|(kyO|hsY1GeQthV`?@y-`_Rvp{CM>amb2tulK(sn*XD2e|)lw)&KcqEk9B|%BHI< zp4o^{_2#uQ(Pic-5Ck(&o46VH-o)1!bS+b$IwE;X;_j;X1yUP96^$H^hn|!^#`%h; z`o~mpn0*z*9j9zCBi>=s5_y?qGR$1xFgL9}lGZi?3g9#>=Age~J5*91PdtqGy0ecX z^~I_X$Y9<{c##WAwOj!h-M&kK+Wc3YG$|`UJu(zrpHPsIK{Igc!H567Qf!xC= z2=M4X7<(TBn#xO}w9-Qk0Orggrs(&gB%x61IHS`|2c?gEgr8IT=8>=||M5+_CMU#* z{*|+B$iZZDp6Cmg9HHchEV4kD{P43~HHC>SXi1Hbs{s_tMhc(SBED8YwRWgra|mDMbS339xu_FF4{xx4cj|;NkrqCt~~q z4#f*V$E~b1^VN)w<5+;oKLE&IoS;+DXcTc1vrj4oBL;5TIudAAl#4@uTrj7hFeF(b z*5xKRspT7k*^ncO*R+^$nd0yjOs;5l7f=m6@u5OXd5pt+cc$nDEXsjkS z(H@I(FiMfCA!*E!LJ5|>9NSAvG?JIb%bLByJKJo|Uy>o%JHd&cRw*$Xzb0-AX4)0` zCPgDNXQ)EzD57C?oWd9g1iw*@nJuaT^U%?z@dBgyxleK}q?xTb?~Re=wKA8wn`%)X zG!#05vDmYA&CM5v<-Sddy)8U&JrQKmr0p7O$JoGBQP2HxyO*IV7gPR2-#QB7WRy{1 z{SRFJ-=*?@Jp|O@@(=bGb5&{){n+OSjgfh?Mc{n^EN8jEVLXjC&u~V{F@?>eKJTND zyiuHRWqiHA>qEUsa}74aQVK}`N|v`IlzRXlPYuNT0Zl>Brm7;2;yu*3ht7@^%<*mx*z~D>hYal@#m)`)7+`i3hbH98z-vk*k2QH+BQV}nGmXI5 zSJm=RVmrZN5w0;zc?$oA2oDhXG9a0f9AKJT%j`~P-vNM=j9HnYiIWbiSR-G$Xl@snfg4yW}Ap5lU?rtDS}h zWpHsKfCy7RW^SNFYRP+Q5|>{xpVtg#Q2J{CMC7!Hyd9VY{Nod@ymWM^rLnU@V}T8s zx@Up^^Y60Oft|5w7_*Jmh+zWwDLlgHvndu30SE_N!r;f1 zJp@F-KH`|Nw3|b&{9ZO_sf`MOAIz-`zgzK${jmu%gDk2PRK%B5R$)e-I`Ub*ax9*K zfG3&!Be)xoB@ULh;5lP8SV$xmN4$t@YawMJ^LxUW#zdBkB$m}J8CJUS;O`CHLs=um z5z*xN-8OGbDd|X_I_X?OBbQge<{~o(-K&Hi zz-q<|(z;`06Dc=^tKS*=eeptq6$ZF-bdD3L54BKP!>FJ>1x6TKfZ|%!s)bzB<{-xmvmnfyWN15H+=wnHDJg zXSoaA7-`11I;4g#EMZ>!48#w@dO#Y^O8?DC{x>=KXmZp{E;9ewNX~Zgx=K`>6>7@3q%Sy+vsHM%ey z=HS6#(O4!pvl%_r@vk^4bz`GqesE%pV&6!Pcp}H$U9`q{rS6NA(8Qp3iH~cfF7jR2 zU`LFFNg0059FkORN{%h|FTi7yZ(OA%Cp_~|V+J-VAd?=~ z?A4efl?z}(l7!VrDHbn(==jmjB|OBJW6f1&KGeJH4|WaR{RDr`QWk!DU)VOX3>B{~|Ga2}Zds zPS-`gQZvyGf(r%s=W+Nbjz>e48kD9Cpe*E}WIl1RPg%T{!cEf4))${R9lT0|i}(S^ z-wolU>?|@9D1BwR0%)`DQ9U$P|<3;ZMv;5{h+B&9&* zj%CGjdO)W>FO9D;Wj6TSQe65Pl#D#?LiCpl|0tE0xsc}h(-_FnqTZRp#2TJNZBbst zUT}Cs^(%N&%pj4MkUMt&#MZ)u!0Cm!GGB{9dc7ZaBZYemwlZ-yPYUp_I2i-h`?|=6 z9wq)Jb{wJ`%|{svT@TfW2q>^nO%2Sc;nwb>k%Pv=@v5&RHdj$Xi7rJmk_i2B^_Cqb-tA-}0kf)1Q2XIv_U6PwRKrC#l4LLy&NjUil&hR8Au9Qr3qqJLl8h+BPl*k7=0 zK!B7@!7x{aeYb6kd)?ZC_zm#GqZ9z*K@11ce>Kq=#fPK_VbRDbbR7jwLm@p9O%rG} z;;IOkL@FAQ11F7=i4-f}cKrZ2GMI#zF)(v&h*b=Sh5bifS+~u=iy{p-EhZ8g>AtX@ z0R$8e7nTIiH7BV%3K=zPN@ZBPSo6=EW1s^x^wWlVB!IAqKRm2Kg9yPIhnP8N_@YiC z#+-|2Yzv8+gpWiT3gtUn4>GhCnsOxeUZ!x1!!A+j0g@ZhiFZodbFIH*zU0KITW8SJLuq)(DQo%|Xg)TJYF z_eFy`5_eEo#18F8;IO@2TwEQ`t7@;K;RH=n98R=<=s;P!23KCNH131IgkvAE#2(YGWPNkmI~lw`ZNzxI z>lD8m<-uHwBmJpt674xqSgTs6U+jKDO%(~pzmJOBEm8w!2c1yj-x-`6)jtUVKZ2js zl+>_l@%y4NtFk#Y9$fLn${|1P+%ARX%DZ3WxN1-~lGPhp69;&dOT*U_>YBsTtbG27 zZ8Q3jP(GoMRuwaRtU|Rq(yD5+g0amGFE3A8?jSFKm9R%Nc5roPap>5*{EZTEBBh+E zHQx;;y5vvB5*rQ}yuS$2!s<-}T{2+@=%C!XFYw8Ydg4Dx+P}kfgY=SB5iq`qhQo);|z!F ztrfWmW*IGrL}D#u+_8>g>IP`S6&KP^*rcwjHEii>Wg_`eZ!a>Xvd}Dkd&}px2gCUI6OET)Tn6p8GQKv1<+EQ zSa_w3J}8V~Ekc$nBrhV35ILY5);jM(Md3oJG@z$)oQ4oIlE{^}>{nCXx*z0|Go&M9 zut6HoD3kvE#8>)$`or6Q@BSGVOH9GIVWMJ>s6m6N9Jf?{b_r?BNYqnJfy^k`eIG6) zr^1u(0Qz--!#Hbg*xe!ZYM>DxQ@4W+&*%YJB8pKKiUXV>JuMy8J;r$ zH#xPfD1(L!U0#`EzOfUbgJh|N4CL($>-P?%39+w26I=M@`XR+E+xS9zMrNc^JM!7Z z3`yJ}Fx^H%Ebp}z5+uT9d|6j|3x70aNa_g2Z}NcX_P!E9YZ6J;nUY-9B7t>$Begjy zHOewd*A<$6{(cD8Xz)3Kf+2wY#xVCY2068Pd>nAa4oh&}n(F_;YiHP#A_4eYuCFPN z`ov6!mWY&`9jH{y1LubV%L9nkS?JqZvhko=GRkZo|3u|5FSy9Q#Cv8OQWO0 ze5@YnI#EXfm+&?WqVWlmeP4lHfIW#w$-H!RnQHthZeyVNzeM~0lZ6zz!_Ig#*dTl? z57PiBkRlXDrf`xTBQj~RML;nr2k$g-V*+6H_7V;dhF7j|xBci0;X|wI0#sTUXcngr zU`0A`(9gsKASmL)5ssdsrY(y>p(5}duz}SoZ$b#UJ7y`CS~hhX?4!*{m&_(SwFt4m z5l#n!`l-LuV->?gehWV5Y=e5WvI)~f{DDvRPDOH0m}h=hs7OGY^^t_K%2k#8`d-OM z+k^2YA2LfeeX+V3m9w8+1zqW#l$fwD1o0_!!nsWuQ`Ex6d;`X!5&cXPe*seB@V;o5 z(($lkD(Gy@C zZCF4h8=1=PJ1!6a1pvrPiEClqaSX@x$F~nuhEMhm*=*4aK=9N-?vQ@WPacl)U7U zZgb7>M30Hh?cDz-r5Qhb;`V~ltW*q_@O8x{V5$PPfDjqo{;cUm?!ke{JENNPl~~To zN|%Xn`FJ2$5ei-_|EDCcJD% zs)KRJ_8eh}UFJzSj?f)%H0|bCPRCONfY6Zp2SMM_T&$ARJRhLM6f>y{Qf- z>~-R5#ywY!mmBZ#-j56?N5bgux{#8pY==0!6jpdwYJ<4w8gNqO39%)5c4=PLw-MA( z{x*JR_4=?pz#*&RPNYX`=*>hd!*wjPys=(9nFfE>{e)h2#1ItSi=OLD$1z4KGFBGW zDJG|x_RBnTcKiec;bD`;$2y6Wk&bvsB-(fs;ptTaaYFGAf>J1zx~EY@j}(qFk>oIq zt2WC~Tq80|PX<)g!U6@Qqxh$b$xxV_7d(L|&X)fvJABOTI<)^I)yC+pQN%>JeR`G{ z(h`eg`bzQ@_Le`C2S!f{1}G~X4o!N9yf#jltO3A89JnjrvE84If5lEz^ z9znsNLb)^pxwAs_`5z!9Oaz}eQ->NcyD&XjOu1>H&j)Zr$?=DIyMeJo(? z7_C|%R@)>RIQYrK$Cwl@92qm{&jDts8w z4tR7MGbQC&KHR>cJnSKdki!X|nm2ae;-{L?kl3nYyW#|jwMVb+nz$NJ5wA69vaU(u zR)egA7HJ5&QLdgh&gfW|i8(%0}ivIs-ky;2h5sQrZRi4X$b<^4ikVcQP z*n&By1VYbC8a+~gULR)7G!oqvoAB03J>X6bsRPgiaI@f7hyV(Ecep6Qa!6xQR5k9o z^kXc93Yb5pXsx>$Q_3oFn2)3=siXW8g-T5|BKkOr78IVS{L`B4Y6+LdJiZkBG+}2U{|$KOBL0Yx~fyFExgNe@Fum*3qrrI_(d0S!G{s3B0z%(mDV_8w7;8VbC!@*@}6hql5Zda7I! zLhhl*9R=Kv`c*T<2K1m!{W%|;nXh_^d^9LDBIhN?aq!toee0XEIvm(4u@<5w2p&#d zD*(_T^`)qR_qdqlojAhOm9Fr^_)57DWY`m3;6@m`lySYM5CM4>N~tU$tRV^C+?uey zPr`woDA9y+NWNBBpoiy3B)VEYHwl2`74=0zvKS`J%>`81BTJYHRHwiwRv#0k=0|hW zE0inh``6@}a6&mX5suAdCNn3Q9cetFmx--THkQi5f)$ujyqvZ!WW__+h?q*1fhjw_ zqlQkMTV}D-E_r8>Q$9<#xJhV1Aew>0@wyi@*b@g?xW6z2c301f(Knototc} zZT4l#5ki5aj1aU*#ZijQgBWF35PQ8mNc6}Us8Tsfdq>LC}Tnm z4n5?=m)-uE8&!=9S1wq1Kfl#xC#zW#@_L@!c5#-rrvLYF?EeG0`UsKnN-(XR80G|Z z>6TMg)R@dzVT@0qB<24f0Kh;$zo>$cdJOnuVJ8e$I;q_*Bd6Oaq>eGp>+6Ts81N{B zSP^D50FycuVl&WZs5eg{5Ap}Q?d8Z23{XZ+oJ^K6Agc`61{>lC+D>en!5ouyY=)!B zD4?u)X3;~~f!FP;R#B+kL2)l+t^6jDTi9=5Qc=JofH1*o;Rj$ZX%5jq-MccC$~eB-Y9Kj>0XL7v3=X2_>khT%#cgWU}$} zbW+FR)T)5_PH&$gzg6sHQu`{ZgountXFCOtRKPGNM%m{sBGcltNtT}joh+YwM2av_ z6~~ zk0$Q`9~;bV5;`!8+92Fv)o|f8$D-~6ncUifD@+N<&IgH*PO(+Y7g!oKx`L{pw|;)e zTfZn0cCS?^jh+)vcxY<^jb!;4R9XWW z)6(&$UdU5JVBKT}xTu;;fJS&9B&Ik@0k1^=CVD=(hcO{fTFfvT$_6?D#Nxfo*(Djx zWZxspWaBJ9WuVxTFd;Cq0D1uQD5o6jibO&bbAW|(p$|19o0MaR!+kan+XCpse#aTW zGCuABiM^#`ZZjV3MqK22YHL_Yk(iG%b7qqzb1H?pw~|^`4zP%0V29R7lF<~=9K!Gi zB^P*|CAsK(#oxQUinz}YmeK2`u)lk_+E{o1(q%I$;FU-s3Yg?L0X8EEsUoJ*KuLA)W2h&5L}sBQWZ#5;EP^?+QzOS`^sA;J3T@34OdKk{EL3PspI?NS0EaT z$;vC*$CZ|(9nz|mDZ{q^(kTx|qKf^8TPE(<*EnP5l;SmG%5wIfY**aAkYVS(#+ePx z-6gXo7q2cYO0W7a?RILj|K$ptv0yRcZ5bE!v};V6voV^7<`F<7$&B@37n$XYg~;#k zq@V}U4Ne((!whJWeRcyai6}F6$W~N^$*f1Vw`v@PMM9 zRCG`#5g9-vM61lo_F#U-^P=|>pg7pwO9!}+03E{wyDIM7;rN4*(*Cu zqDBVOIDftdYHL|VEsYz%NUAA2|2#_1T0jYn8Gx?}a#k#pEd*nVWUo~ z_M>8l=MP&|3ONsteu%fEz~cYh74Yfo@EHjfLxHxu_9HLNMerSIb=d-d zuoX&DiphmdN)VI(1;7M0ksqMQ8?iu2$bgaoA($}682!!zl!#!-;-r=b$fOB^al-oL za2<`S&=*%mSpbY0nA5bjtfQ*R*C@yDL*&CeQtAqX3^EB;lY#I_SttM`K$LMvDOu24 z*R^R2wQbl+lAL_9jh{ma6-YjSIi+w^WeI1G^ip6#b_GQ*9r6UDZU8+P!-TtC6zJ-t zKx+d98=EK!H_)iV4QZthATdnRfKM3S$YIdKU{40QXGo^UegGs&03rd5WC|-X7xPF8 zgPinqfH^%PG+^TCv{#Yeb(ky}lMq&4hGT}g4};L=PEw$+FdS$XP)NoOvmVY)bi+F+ z42Mv}li*y$v7a(*RIP%{)PO!mtY4X7BYAc@Dbw@GQZ$6rW-H080FxE~XKpi9vV;^l zhNxH+z%R)TCi^4#Tu30*l{?WRc%YmDhpQ;6RghuiFw&&u;vI-N5s*CjA!Zn3EQMwE zH5LIlK1`iW%c#A559xIolvy|nEa?pR&}0gkuu_*rMw68?4d_qRf`JY5qysa<0Mb~8 zthc9=rOeET%EIKvWP>xTCSTYE;N6B37~3Y5C;;OVYJ9@Z7obd%aEL2QX=;}0vfV!W zKBLQ3xi}p0tX3)vUnnW61I$Sz6626chS#D+6-)1&jre*=Ws;aluXZYAp!EMAEgg0* zT%wM;T=D+*h?tKa1B;3!I<3N^*WinjT0YkbxV=GRFdT*Kpr=VXd0Xh66HKb+^xzC_eVN&PQTROVjIX}K{*$YSNI`hOv zd)$|kdkWG0X8;ttTz*?TCZsWZe96{ueATonc@W3vJK527y94;X##N#f{8)XCerFYO zS;S&gi&~z^OGmdagU?>i_11eGiEFOsx|66?(vV57as7X)liwfKcmfez|Kj}ip5xwK zJi7mUPc~>(PFMn-@}BJVg^a&`c;!F5h|c0?YjeAE=bKlAhm6wH~78AMB;)lp=REII?&d=%8a)wsmj0B60 z&Rt*jxT@wV3~8j+L5e7z$-S_z_Y1;65$sy1m4d!1>hz*#Fl0pdd-8tCwk%2i%l-@Z zD-ys(f(%+Ysgzby0MN*!U?kbN##lmT1u_?5RMXb9k?gH7uR(^REo(OE3}s*$^#UX^ zfJxe|Fk^;0x5Y|UWFop-09^N0QdjgXO0;-MKXC}fw8$yM_gDhWWt7=4mYfD-6n1nY zu)dxA^-bh!ZY2Uxj0N0y-A7V@R7n65OLq9w=}Db~%tBc^z>vgIjO$Jvx9Zx9^KDg^E*bOuqFH6jH7X@8qR)S6 z?eb(!xZr^{twt$$cI-dT%=X?y_^RT4S9<*+>1|)1_X~d@d>`IBuq)Q*zx!vz7Ju}+ zH=q7sd-bKF51HqZdJ=!|FVPmxy7y2xDucXgoj(vdN2^fa(0~pY2co{NT4A?xe%)7p{KDJY z_cqK{@uxAd)v8Pg0D5)8~7e|bTWyr zC!AY&&`A;_7T*&vs1**YRogjgSnkd*Uo`Pw6G!E4gIjptiKow{0RCWD{fEE3ch7Tg z?Yb49pU*GfkNF()BD(MKr#u#oD{Ll>|KVR=wgmtF@Kieo=1S{8&axVr$h`1`tjirt zYwz;#!}JRa7Fq83;1lov@|mSOZ@K!1&#IsxP{%Pg6R}<>rO436gg(ztU-0$Ew|@KD zIrl7{UA7F9<)7+z{@ewl-hO{X?$~{YnkPU0pG~(PsA?aD2{J*FC;(dfy1)PG2j_h6 zrfX*0Us2mN`nKP_`55j$@J8hO5Js3PIU8)GmNT>hXB=3Jh8(uWL;t)w67xum)(Iq6 zXNn#(1`EP(rKjgl^vFd4R$LY2bv9FNr;1uV27od2++i|?BN7H$xKmCk2T)YTAVrmv zQk4PuC%_{96K_?O3l>WwvpUjJCJqnpjg&I(pllmiopBilSKqa07D3C zPtr{oLz!Le)V+KSd3NqbghU$|Duw{CnJ_X%uOG%0kp!GuSt9BNo7mn>(GI)FD2zq} zSQ~N_fsqWwWn?yw2hcH50wytJ189ciGmt>6g!4m6fX&knn+#%W1bPQCCJM934|?pn z(6iWl0Hb0^C~c6d#<9~X{)Kh4E$Q}_Tu8rn>buFYh(Z>C_Nn+&$ml$HU2nLZrHV!}IkaxEE+A(J7?Qkza% zjT`Y90sNNh&>OwdiyMx=O1u#T)wP;~4Q(#mhGeWMq!icvC2>go!7BL`+zPxPr-*+8s+R@bR$X~a)=6p(kFBb=mz7s{j5%D}HD=X@ipz`!m1o5V<=34%f8<-A_x)S1 zQTo1n?abeGJN)StbseKO?`fE&z_rc`Uw4H$=EeylayMJe+OBC6iq@xq;^%#ah%lk> zugr8qU0atccg@Bl7x_aGfdKg)uTd!?)5jL9&B-!1Odgm2Ap=EzZPKXRtyi8i_N9I0 z&9jd*+H>LGMHZ9FiC&$Gk~~}G*|Uc)g(T}!ouH7*gt?Vq7Vf%>lXAOsgJj4 z{uIiXZZmd#<>Cns)HOMVuHRODmOmUd^xmyL+*UL1um4*Ai%=wbElbb(ZVrR}z{QJ4 zJ(ZJbtZMIY=QXxDit3tOL;1TpZdlgN(&CKrX=4jEta<)Z*vbFlRmi})ee3EOzv}4l z=GL{?OV@3yS-_xx7fg`R@FAIp&zm#+^_EU|?xCvIadpj(lEzMV{{E_t@h>jh{f$vW zGj<-VYP)gN(5wTWXBlum4lM#$!S_Sj)aESQy02kQw<}-~lhurH<+AvQA!&O?4$0nE zR+4_OD9=(onEeA&?H(~Cqp_y3J6}Xo;X_$AeM4Ds#uu^&KNgQm)@-aiZ{`($eykPW zlUNdL#YUH9Za;h0@TF766>Kibx7O4*br-MQRC&&GZ|?lg_5;n+KD_<8r9b)hqF`>X0Y{jaXr`xSt{QQ|(xvpY&jxUUI(c7~}1FSXP*JKFFLF(bqa zKx0Cwl)=yoQ$v#CY)kP&YdL{7~HSOnR*AQ(-EPn zHXC(#HR!oxGa7ymn53gb!m-PTZ-okJgw%=<00f|gA_F8800#Q%gyu&?BOuN~T}ZZU zD_A-$bu_IdSJz<*g?*GkYIY~wa*%r+Oz)FyPJy&`vdhF(hV;qRfd-Qsw(n9ZDkrgmD2JS!Pv(FNhPGO z$O@DxbujYDLSJ7EB&qG>_8lY>SUP{K4f0VJUW0VijmhQ+03u9rIy!a%F!9(6y_TYY zY?gyTm@ET1lpJSqKuBVR8z_U_7}S$d$X>l+ayF|d0C!o90rFC1Hb5JCLA?hlu5^L6L3AGTMZ%kva|oaMt_DkQjm0=_t_DNs>-vF4i>?)u4|P;9kPp zLDUKNDaO$+s=$w2rzYFnS(LtLAsHr)qqtUynsOf@lMC!@%P}G7$qclS3*g<+vIbz& zO}2E@Df@h|!9zLD0>_w)2T68*!sS)2Bb6ot1J6ovzTxWwpuk2s=nRjtn5WHb-oZuhp#@pVgT+;z*wD==NH#y7}q#%H`xanJtzyJ!83|9$^mpXZ*Xw$)pKa~F(!8-M2?y6ihot>3)6eh&YgudSR+ zQ{yv#zW!XL{CH{e?8znTqS4rge|dV{@9%s3{X2(29`^U&TyfRd;YkySzyA8Ot#1#r zesm*BiR4oSro7_(EHNOwBM^$no_uM`?Z0?v<$Wyu=S2?2@a^}@uO3>GQI3BeH)w@X z7=v2=o{8@o4~i#T@TV4s)0eUIiEqq?X-V*r&$c}O6Khw%1ryJEpq`)2 zyhPz?Fm_n>uAhDHY;kYEb4pUvU@yJq;tjk~(3 zd%@rTwf-lSbsZzmnq9W^%NI_1=D)$74sw@2_S?LHi1yn*efi%jH&k32iE`)|hFB`O z|JEDk{_fVV&AqqZG1mi39&GFIz1gVT=|HQ;{+DF zM}~ZKFZjNM>pG>3`3%m>|H>-QD6ojA2UXMI=Wm253lyjm!3q^~OGr|J$nz}1L9?e< zkpWtyn*!ZOsJ=soA1iqR3g|L87m@v9__=wa8!3P7h@4DR0o3?6=|&bWXc>4DQO|ea??nf1H+iiEc6vh$>Ur@^$l-R z&;({M9ld;78)TU1*2Fz63<;}53FlI64!JsaQ&+T1nCF z-K5YU9z>c+T11HW+>o1sQ!=P>P(Ll0zc6H;N>XAQ@u-_z_5dX*5A@a?s~AmO}pTD+5-MhPC83IX@*Rv^l9TsKML-#wk#eE2{4y5C<0^3 z=MnoE^EXpx>vC#q+zp4*IAvv@Mb?b7peHWC@u0^N02#^+aSj<6i%dqutw^O{IN?Vl zmq6Of5g8(`gPl-u`~#7Tc-x8sXjc`?KrqdZyUWZ77xE7lY+Yb0xfu8#ThC0UHB5hM8wetnc1jy;`JZ= z_?|Zv|9)-9cM|x36bSuie_Zy@nue|qN($0y{~IOg>2Eu3)7Z6M`PP49mr~p8R{?1L zjvo-=(&-Nrdq48d2jy2h_3HN93_2zK`iJNIpcg29(TWOoHTJKUw|d1BkLO8Q_=5lQ zhobb#ioIW7ySZvRnEh2JJ8mBMjy>;>Jchu>Bq@p70EI$bPLv?^xzF|7->T4Gd(F3g z_R338Oq{1u$`Vd@NO#{OtM9ctd>7j+pMPH;0|-2i*z)}tV8FpJL-ujL2Sf6#%tC&X zKfCNnqFX=CO8%dJ29kE=_kQ)-)9{8;Dy)7kaZTK?M=IAg$K zEFP5voVzb}+c#dWHWZUJZ8Df4bJ7e2ER*;a^~fz)S00Y|DBx)#kGq|!T9I?;L#7`j zs0n3Ai1=m9mJP7*7f^)>SQT2CGyrc(l^LuQ7%avlj1$GpH!he!{_Z6JM3mOyl&wPF zV6%?e8&*)`p%*Em5XLvzkYj3cDF*Nvhul*|I>=1HTrndz)=KH4rjY3p4;)NCptd7# z2$P<);w6+(g#1AC6()7H$(@wKp;IAUM6Ql%asyBWRr#bZN&~Zs8lZPD-rYc6&rW0! zR#VK~NxnogMf4Uj7>AM3FrC!uEYiTxMX7g_JaIguU zV1;rakx)=Pm!Fy46baaox?!h4s0F~WmV#ZaXe+Eky*ps>A}70hKgH}8803rw5Y54M zU@-(%v$Yxf?De8oat!Lqra_S2=9(y8P(nCsI!8aY7Nxg4r!`BoAOF8CY5CZ zKsf-Sm^8)X4>V$&+2Ni(MM=Vkeo27LhV^7`eg`aK5oMQLO6K%w0P8lM`V|0?BRqs8 zSQrSgp$;1gX~E7KNu>tph0%}-@f$%f$btnv$t|C`%m~1Avr{9l1|d2+zmB|}he?+; z7OTZdc+cW7b0QH!_@{hyLZaTT)MRheTgyJMAK7(rXY;#vs5M!8@x~K+ivHU-lTW(+ z{{30}fI7zdA6xtNmrZ+Y`~K$n`zu;TDgYKe!HD#YclTWv3`KvBS@8dcYvc)M`?GxF zf6_XiiJxafj^mGeU_0x*hnvU$_?~5VwRN}^fBDtrUtc(*?4)4nGpb|%OXq}H|4(bX z7~D#pdt)a6fCTq1dDI__$ocO|e5W9TEPm>hZ9i;ockj*3G(wVg(xvzNmXw#Imi`qO z=vHvTIYp1G_t`hLzp?jF%k(a%&&qL6YquPkS5e!6K;~2T1%B#f=SMmBwDwuV{kVTK z{-?g-|J@b-{rL}XTeGR^5;l?H?-8Ox=o>f8d6%?Wx1gQuAmIu`duY*xP7YRA&wA)ywOMzgPPQsbQK17 zF{J5X^ef;Z<2ZIdWiuN9MwPaRZ26ai?aQFL`q!zs`X#u7+R0jUAxwC(@L8U|VdY1h86arh;0d~^awT^V?<1?l&1h4_P#fOB43(p#BEM&`@fvm_na)Q~@ z8WCRsFx%Z#PWHxk;m!%e#+Zf-=qEJ6;6@8W7qtpJZ2&cCcz%6;an;+ARYq}S-C8S6o?T?n8%Pc6Ck}9VfOwe z0K6UK>D)nq=Died+(}-`2r?C%jeRU4pQ{ppv4*mAfK;~o>&l;+VZ4=SOES7rwjm2@+jP4(FY0xBQ?&i2Mnwf-loV)#QO&zmqd1D zjM_XlI^0nlnb^Hg5!b&&dA4jkDDuVi1emSBgW8Jdlj2w+oQKg|z1C2)#%L;DVsBkD z(PSBYSuE=RlT5Dt)Fo>FwVNJFh6n7?!AXw?050(pXXZx_%i8~???2NTJCqp7mI?fw z+I^sTHVir#ZJ&_eawZelwLYGdX{4^NA&ul<%cls;e2{)R4ZZEGBIij&;CnGq4)`J`J{GKux?>leYV0 z>&APv__0AQr6|g^*7Uv)vb8j9(+G(tPNO8QQ7in}=^qI)j&8!~3Fu(}WC%lA3@H|r zmu$Qs4e8WMZ(5(@gaL=D+v(5X`6(D3wW5b^(6Xo#CL;Pc0QT-ko86s$*L}-=v2I)S zxZnTi+@D_qvyoGMA5aS=_E`;Cw2phdax+cM1APWS32L`j_+n{{guG^bK@Er?DZ&(UQ z+Y;YFyvFZK_xM7l%yeTD`ht(UULl*6I^BVc5WWwP!16&#u&*(tToyDMGORbky}hDj`gYUTuwH@p=aI(vfha1N&{2ltFhD*H9 zFiJAx9vsfe82G!w8^w2B=JEtHAnDiQJ5{GrCQV;(FE_fq0SoSFEZ0hag$d)@j)B&V_u$zd)$u(8BUcH&NBsN@ zppUal*{>&iF#C2Uzvqkqi{Y?SXYW{dU6*TTfzdb$tW^;JgI2I$JQjs%A-DPp_6SBJ z08KE2aUCR=tBMXcmr{!hGEEMr=V}2A2z?>st9>OJy%!OfAQA8`g9KHj1N#LjDLalP zkg+FBa|9#B9dF0Jw?YMgo(3h%Qq0oXR0wd^g=h`CV?Ru1LX@5{iwrQNVQ&>yx3R=Q zgwPAXsSz%q*37Z!UF;+$B&2PP>#@Fc@fj)ZJuKwoJ8ev=CM`gi%{l_cI{Uz2uE3xS zy?-INl_m1Wu))?iTb%wo<6B2|@Bf(v2Gl)=x(5ue?nj z^i9TLP$MLS{Pf1Y@%DJI&%JV+{G-U_QI6$mwaPK+OvDeL}Jew^(@$xs_(Heb_e!Yb+%d0!2P&Q4e)@Y@@EO z{Q%Zh%E+EYHX9~nA!il+l8F7l6aWXFh^cQOK@D}o$YwjWH*W-E*-9Ddv&af?YA_8G z#x=YR4s7JC%4AX{vxNYREX?6dPHa~uM;r>GQB-n0>cPxo^4x^+pA76}@*MYDFvg1l z#0Nq$YHZgi%4>9#o?U?+%o_B2S~2>8;Sl$MVzM7d$%Jj|n5!mD-Y#p#!pGg7>RY?J zcU`G5m94`YPw7PWzjAZqZxmlaeMdMPIm#G)pkn|N;uHO_d}i>*rgm2m`hSjl&|)C3 z+qJ)O_Rk-9=W7S6S|=Q?X)g?#n zv<|$+wk~)2#vQebfB4%szH+FlZAx>SGcAaTnsl=+I%-(h>|H}^ zr#lNhpW_;voyC8CYJEQXrAq6YyN7n#eM8VAbratA62BLKMG6Chvg$^ASz}9g(Y=qZ zF0F0o9(ka$W$qtlmxC=u2y8ag^Y_7pz!!=voJiFSzt}r{Az? zXYG=k?|${>b=#}wdl0{)!C-0Jub#!$@_t2JBSN{Ev ztu1V7b(GXJ*+;-QLe<>inwgtn5AKNXIy^bA?a*XLE5~lYJ;^J_6U_^gsOQ zf@|=W7Y4ik{JySkZ{`C}to5b%eABhF{(!gc8svJV zP|*nMmFW`--zzG#?)}*VD<0rpZhl6oaL;}o{lTNrV~4kJZ}G{NlLC_?^_`_pzq<7T z7;D@JLyyrue+0edF-~=&5koR7E;>)+j2IrHVeUVjBP z_FC@-acz!$^2IIZEq!rE5EAK;pa&yDlM>fT)JfJlZfN^Yi?$;x4r*@`<==KSk1jmnvT;Y#v*owQmSnXbL$ zMqI|BmP~R6wP48r4p`oe*QG486ow}!e)r-crwC`0xxbV99Arz0G7m)Wniax)%6TOwiWVVhXIh#*8c1gC(1gU~pcf zU^E4K#Id76o(F;05%TE)pffC_89Rc~mt2fLN0S$(Itrs6uBJmslQo3&=E>x9mgCrW zQqY0^M#xrW8Z(&SAY56|8`xv0BZ4jgB7-pA>1tj9pc;X5={!h`rvn7r0Q?z(BpKXf zr(qJz#)7Trf!siyZ5zOf`pB9-mNIkZlgdzn^8_baMk)M8(Sz6$ z-gU5f#)|b7b2DtZp8^>CsjbUkiMkXz{2kF+jehcYyr%>H}Z;%QGK7 z*wN*Y@?eFfP&~l_U`_UJ9~yR(3jki$A0JzNFN{nsX6X~(7nq#|gG5~zRD;E2lLY}5 zSFS&F@y{Pv{*|?xD=uj1@Iq;gYaIh3%=E@EP@VX@zpebzyR^9e|=`d zkCx0E@&323nR&m>eDXfA-~a8s2RH4iKMS+`;@-=3<^|5HE@u9E*NegD$eZqZaZPKd zM+3HksdHhM@9`pr2w8T6-ua$4;`}Qb+gznB9iE{r?XFBj52(PXP(hBlL#I{xbYOEa zsK(^d;1(_bvwRpJBPUknylhIzTkEz|FIm3s&{+uS7Cq!$4xjp;FKoFT0p0u2ySZne zHTP8n^nHEv?z-96-S+%5dk?o38}Piqc{_C8yb&)m8@OUa#TEMww~pO$aOLm+`O=mj zx!eH@7-mEtv6=%HpYK?GUWNI`IbVJJS)Pa}E3ma+bIIffu$}0E%C-q`A)Z&;>dblY zsdYbif6I{zw(qO|%9OFkOktYaU0F}Pyyg03Ys;_Rxwm0_hyem*KM1d+s=BU;`2AH^ zeCMfuRW~}c7Lz8S2KeM}aUc|xKJ&(ouVC_JJdXVu9Q(&~CdG6g>NuEtgJ4T>K6)=q zzN*wXr{ZzbvuxX2KmE>o-@fbBmHRHj_l<@Wrqy45?%0>i25r|4OpLAESatqOEB2m0 ztR$oL>DRX2efg4c&w!CR{eDt0dw1;KE3R|yD?g3CwN?!N?|EePZ$8{vvjnjX`8?j@ zNDemnkzrz^@3jJOI~I{OH?P@Ld0}O3XSNvA;GV#vq{bF!878PM`|Y1s{UL<=8nP*4 zYMes_CXyT5JsA)EYyDlg7N+96cfM`_h7sWOf?quF&Z8A|ow*9EbL!|kfWr~5f~l9i zy|(Cxvuypt!Tyna@KC6FzsrEYgH{Z!v3zJJ{K;}<4@wUpv~iMO)^ zl}*mzD16F3zaI6(FY&QoeofeM9lz8z+KV23YTY*;{m-VK@x3EA%iKL@TFLUVqKpHF ztJ_C!JJ7Un?Y8PUe|>J_onO0R$|IPRxwkOSIw0umd*3_NarJxsq(Bq*9QF2njWfUb zlNbN6VQ1Yms2ga?n7qxGoHO>r4oqNf*ipCSz0Fl;EyI1~%jZvcrLD_zb5@^8PTtPp z>W<+z|NNCl-~F&+z7i2DL-MWlS6?{sg>;*~dCit1=WX6qfA)h01I%@WMdncv#|6O z5pIG-Vl$aU#08*OPAzTqc$nl-wLKl63IISzNf~HCf+;|zfIlZJY#5`4Dn|h~&4{Og z9PK;FU@gT1su18!Cn6h;(kH#1#o}w&<0#7OS3*XbHVs}ZN^(d)gz*jbr~W0%g;T1@ zG8wL+V4&DvrDq3(asdRC#yEs5Sw0E{?O^A&fFV>P(Ed_@WAy$ZTQTmhh1_&I3}&j3 zk!T>3btuemW{^%d1hqiqk;6rShFWs%FDJ)dnA_AhP~2gs7))v4?jxkAiV_BB0!N`% z5vVY^M-hA}1FR(FDeB07NCDQwb1upN8>y9GMMF*xh1wdx76!>YVLEAC+0?px89ooj zXV@q*kAN9XPA+LP(ZWw}hFm;;* z?V^8GaD&O-)T9`akteSiS(b?|0^$h-18^>Y>;R+~v)6H4OEH{0 zH)1pncVtlcp*k|qZh+Ns0Ph%E%QeC*2x~~gWWW&205ruT&fG}2aWv!7h^LV}_T881 z48zu9Bb&Y;cP^eBKcPoPWWn`Y0BRK1{_uHA@6(Ijc`=yV%5pS*E5MNLx*tCK;-+17 zlQ`RprDi|7`K%w`aM_f{_;oy3ByhX@=|fMh|3x4WRXy;JwLjtrj4p@whmguRK50FL zW?&Ge0RwFZF(Q+`e9OOAw>x|qqgh9@Cl6Ir}H~z5Nd`gN1Ld zK6sW^t-7z>?zu73X6VKY`*Rp1)PA_VX7MwxZ~rc4&N2Aph!<&0uTel_o?NUJZO853 zSnvxl5bv{<`i=ullNbOp22KzKeDwFvkb5ixP9$>R%$l?0;jsuOO z&s#KdLvDt#4%vgwExYUI@2zSZ!!zs*K3A+ibmfkH^~)xYE!^4nc;8sL@5^`G_x7&> z(Kv2%GMYcNuQJ%}as|u)Z|*6h^ER?9DLc#Dl#!+% zkVQDzx#NLu-`DywjT?8?E`0c38}7!Sk4Bee?HyW_Ui(qkz^}f4?ycx;ocz)|yS}<{ zSN%NEwhj3$3?M>!jq0du5fKRo9{J6c=fC&i;fujk+|c3jn;Dcd2t$w3X%FBFvMmkR zuf-S)&HM4aZ#@OJq3F7cCq8-8muCE_v^cGj%~IGrwyWUAJ70XHqNcMLAeKst z(rWI%^MbEW9bY8eJ@=G1FZ-r+<9s5qxJaZ)$U8-+AA% z#{n)(kl6kOlL3R4Z1cLr9P5BRivt+;oaA^q!4l&Ba2Cc(F`LB@19K*3PepEDzk5C2 zHv{HA*Mdb2K;*oFm(qGw@%uyyKWxt7vdSc z=TP(XWor+98N2fDzPkf9ZUWe)-&Y_8M}-NHQ6=ez{`%`Ht{PgLF0LZy#eONJJz3cvEcdy!1HD8D8I>W5%`ssJiy6duY#tG#`YrE^! zTYmle(;sZDUgGhG4eVw;ds5MMOd_^n@<%%w&;H)$?Y_g!6Ry1ZnfLKsP#aBJnl`>* zl2eDn(s789|sD&p@f ziFljU+{4%2@&QTQ`$!EI$zU8q1`T2*Adf`$s4!;nV<7H8AbUk~kk%a-L!AMH!?So) z^x`o?mYjJ^W^kWqa-#r{(&JT)3=W{d2CA=ri%hO`N;6JJc>Fk0aQ`9l2N{_3I?(a= zS2&$A$Y3^0nBSNH4CjEg%EWFd$=@rN-GH&Nn$5`YW? zm{Tbjw$|EC>Tccuz={4nWH&~=$Pa8qPh&?Fz+*mTH+2T%;@H5TisOZx6B1b0u5AFR_2kLiOs>(BNjG*f8O8uOm5hZMDV$wRWhCv~ zME151sSW*{;Xo^yvghOYHPq4i0kyWiPkEW=k}YQu09S#~F7hI((^DeYoq~Zpf|{(R z_V$gyV+P8~JDbcI0E%#c4RZ!0?=$a{_$-c908ad!A8tKuLUBl9g8qRs@zqf<%i_T^BPwUspK`(cn03i7DZTlK0@eC*DL(Q37yt)@C^6Lypz{>n%e?{Bm*H`Vk z#AwjcvrD(%Fk(phJ`9>4{)qmpla{-$p%I)nF?lffK~?WcA;GfV_>-3&w7dNvN@axE z*S7CoH|ySBpvdoAG;`>?zxmtB7asiQ`k$B}r+s<(u1n5eG?E{xFJrLJeT;84w>fsa z_|EQch9b~9Coe=Oz?DbAB4)dJ@VOs-90%%KoCN?p0xXI*!W|ETyQ3HFJ$Iac6J)4X z#FKpINic!v|6t{o_-&Azw`%-_@uZ=z(8c^ZNGct*R{>vIn1WP0rXrjVz11YP;}Bsn4uVO z;-iP2er2m+)9!}3%m(qg0GcFf^|3y?o}R?_44 z-=l>5YSb_OwEXwG54Dus`n5R^{_tz_e)$oyvr`oa^Lt6BHtdtw?&NWWo1a^{^JjPc zaoJx1o&}Q(kVcr%ziw1n)((6>{?e}>juinX9LvV-HH#4aFa{Gff=QY(reH%aP~`1E z`nUU6e_pj5gS!ztF^3){y6%$6f4}^kv0{Mu%HNZ_{?I=^xG%{zCU_zvK6y;uhTen1 zbsS&6^~fqPLO%uok*EM{ca^uytgP)Ai}&o{_nk9m#0oIGyImf?2?+piVt8rh9$tsr8!}w?!)G4yg`$FmXSwS2 zmrj1X7bx<3Fk#fOZD0K#Vf;0*rqNN1{%q-=|GnYY!-ixqbFy+!JKOsv7S|+ubdD}O zDKMbB>q%BTc3AEnNJ~dIwK$9JxM%6VwjF4m%=gBgnjH6F{L=a3pE`S1**ouTthnH> z|Nih-4K2=0?%CvVS50&GkgLuc_xw-3z4)&DY>OE5gYmY_zxr=Sx*UEp*9)?E-P`XS zxE3!R2NsvVfAA7a3XFjio;;oq-EjHTM|y!GuLtc2d%k|>e>SXIUwH*;j=6kU=#nL4 z{&V$3lb+(&pSthVRcmQ;6o6GU^`2+GH$qO@aXPg+*;c^1e|P)A=D9rSi3yd&1q((k zz4H7C|KtPhUB35~IS+mL`%f=gyQTU(Fy`@%yXxlr`RR4P!t3AYx8BnMi-Q7{V01@8 zT6|ker^k%%Bj*d(+;YR*-}VAU-u@NmjeqHqoBnyz)_sk0Iji&aRr{~nxU=S|S(8e5 zvKy>o`@M;&n@qL)yFV*_oy`JkwWU(sI5(5K-cu6`L`!c*Du9Oy^pPa1}z7_ z$Gs`~+RD8bp0{A+61?J8o;p0EnuUN+1Id~ zS}OiU?MI%cE&wq%@)Ui(DsnhBQ8U~r4>j9pM{7R#9Y`#tJ^%>-#<&I#Ervu40#2M{ z;cpjvF)HvdQfSb}X37P4Ny9q#Q{$1BsHyIC#8PYpv)Lw`P`UW5LQUG$up~%mKaw(2 zA!Woq>xWQo(dCp^cqL|kW7JT;k~*7SMW5YXIHPipC9ehjdn|#398`+_IYatn$}aj6 z`uz}t(Yl`6YhR$onx)j?Xe3kCI4T}}E#(ZkigdDk^6lA2tuMVqjZZv64bMJH?W@*P zvs2XLU_*Jl$+>rUZeaZq!K`6h7{fF0i}wDYPRyF&|3%bC6z}1m7_*6(NQ$5^ zQAAR(2AyS`Q9KBuoCk^c2|ao#<=z;%4%AWW(q+{8*kjcE<#kOGl-f%dBd-! zq7heIG`8{|^|{-3ZMdPZP<>`I>@9g1sj-&o<)F52B~Z~&gX)E2AITSz^o8`q;k=_=#8jozdehNAa}8=eKYyG z)>628KlwWLQD@^yZR3$AM>ijNVuHQ({j6{(fNaX4q%#yjc5Dlvc1Hog7vXE$e?ZS; zCJgM3V_+Iv9eGc_yyXXAE^=hJhA}F&Yin;=j!aO8m=)3907Du5U1_-?aN3BX80{|1D^hfs@-@>_5O5bJ1iMIvm zQr7AXhc7+dbJP3&{?`_>tze*ZfBeVVdslBfGEEPeBwsV=s~Wa+)xPU6_&a6Z84NR6 zGoGA16m^CO9YzlQ_YnX@#}dP%zekfN7n<_>%9%5%p(%Tng#1;p&Mj2?Y%(@()_&h5Y7e4Fk2 zJC8r4-nyrL4zohc0>C83hfwzY{Xd86yT)qPhM8$%N#WX!l^3%iMc?<8SG7%qQ3ml3 z%uHz7graqQUsr1sKJ*>AIOCVEC#VB5F}Z=8`mrTD-Ox6?B=e9_$E@$MT`dGd{rGRM zxS|&*@+UA$6S`pG$XA(V<|AidiGJO5m~P|^@_ZflHgRv@FG63?HNc8?mp4s*?cM#? zVZf{AdUICmO<$V+Ku)HC*<^a*&0SxE=d zfa@4o6W#Ln%df;l)M?9}``^*9Y4(ykrL3~=K5-sxNuli^42v3jRSC)O%JC`^m>fkQ zuWXtyJa;Q5C%XCG#tZIG^riF0|Kl%rU-6Y*pvb=mlia;{YkEPc1l zz1E1QDoWl@Ia5$d#Rb-i{xzG2`wT!94^5;{si>E}x9=;bbFPv13qzNv?kHH~jNlw= z^=W*^2i)AIoprOI9=Q(pDHTu1#4yQr)%g?t)jQeI_d@`|k3}Nz-N(g-n#tC0t2qn( zo|F5n_!B;%j$a#CaQ%PY-0`(dyK1JxR4KvV(My+%dm(QCldt*HOIHB=i)#nFDEs%T z+kVJ@XGi8k)g2?5HRbOJSoH|5`Ffr1c*CM`BXW1)ncc$Kt~gh+6(5v;xue^2R3gm3 ze|g#N>sD{7oDYSO7*pqEo0{j(EM4BexM)SGW0eAiw4!BV!?v1p@%^@*&N)95-}{AU z7Qyla0o^U z1;V)ZC|iU?GAXeHi0JKSJ4w5z07`6}gWf`uWhA8)Tnh6Q7^yVuqmFj;K{_FqOdChG z%*muSmg17u;s@eZ5zUb7bxSgrxC4UiV$h>d=OIetDw4z8rJ>;+>S$akSj)5mIdt`7 z&=c4r0Yz+scqjod>TQ$A3O2E&<_+}zm6KAJPdUZsQD**G0KZlWwt;!vv5A_Ntt98R zL!|Jx12X~0V2sHOCBwZag6b96FLe~-2snRY?=ZU+pfLIb6~YjRIag-ldaPOnJc5)> zqd{Z{Tw~EI7{fzL7I5LS923G|sz>6)km*)Q z6#0u?0GGAs|MXOmIcp;26kR}SnE%A20RI5AYyu>SVr(r;1bZd{cpdmx0+Qkwavr_z z3TkOtLoW9LLPHqYV1$#OzXaeMh$iv|8qM7Rj4Tbt(-fve$(!PdJ&O!UxyJn9WI}=m z5?x^x?XI&>0aPOv=}K~`A-j!)gq)alghsHXmh>4or{gPBDsx+H`NQ*K3TZ6Cjj>rU){W`VGjBaz(|E?+PH$9zyHzsx1jH%n@jQP^4(wK zUeRQI(etBH1ZPev`e2|k73ElJvNKHGn5DMztmw{zO(S50Gam2#WQGqOy1dAKjz*1KB4TJl5&%fc~;KYXNpA|Bjkye|4zqdW`IXJKw%qg0## zV#F#~hS+D`3(R5^fbj(BuUsJw_hnD{x}7*G?*xM-49tRX_iJYRc#fClksJX1aRXKK zGUWw>5p^=EC_x5;#>+0X$L%v-f~?iiE7^y8q1@#O*gi&SPxuIL7fg-q@6T<#n+5(gI={5EC)WwKPO$1j*MavHx3?5qmS%_?r2H929)4c^Ixzf0vu+WrJn znQ`0pHckPHC3?;3z{H^s_&1O^UX_<+>NSRdNJ4V#!}xp*bwRISaS|j!qoI&RFzMjv zzY_omKCooCSq7E7adsm`O(DxTw%qcyc|Um%{f#WKJ!|&R*T4{o?|JWnemoZ#xNblN z$Ty|LEI4{e%>x}UCYKQZd+cHdh-?AacJ+U+PNVYnNI^w^Jgz(Lr~Fi|y`F7}od7Vl zc6NEQ!30kF$-QrX4-5;NB#D|`de*475aRw@22uRpr(fUteZD@iF!+?@W*C~#Z+(Kh zBOwRPVR>c@# zK+uUVQ4Dg20|7?>yllEJ(tWxKeZ%xrALwO~-G z(J3N8QzvZKXiz(QWsHnh>}W|iog>6#kOq@uiry=W?^$UUUB~J4cMi0@cQ+imu(ruw z%3zl#b8IG!7te%p&NuD<{_!L8cBnZB8Yd3l)o4?@GaFKWmU;??y=OV?bN5koI8xtL zwrx-S0$8&0+mKEdlaDUT+^yH0IEmfMQgfYo;;bC~#{406>xMZ|fjCE4c!EQvmY-lY zhwr2h$0hEqTxU$+*!n&*_&N5^7q{Gs=cgF9vC}Ce#1;6=3Fn(L2=E@o}Sd}&H zquuz9^J-7$yq{_B{lbGq#0$in_FWwu5rKI_l4wm9jnSHr>vJR;IA(giN5IlGQ3TNp z;lK`R?U2xc=0d9JG6OuiC%Q|qS2($=c7*%z6fjvlZ1%^f(eF^x5zn-+{c(Ti{K%O zJV2OH*qg~7dz~bCZbV#+g{;Ytluhzykr5g4){x(eNl7_OZs7iE%bFy*LxM~-Jg4E^5$wC}LPC`Veb zTP%OuWkDQ!T{~P+*H9GeFwdGsrr9$|nGHi8fHVmVY~1Zz(J$yCx4(ttp*BD;OenLF z5Z3`LXe5N*zK)I54QJVC$c_HY$@uI-lAFu0qgtFJK9A^KzhVPrB-B&B&Q++nLZ&j3*=JR;;?MzFk)4fh13oOqdVO+`;6 z-p9wuW;Y-)4zy*`$WAxqU<_uEp%+w93f8g=6AEnjGlDdxT)RwWklDgnRA6Ali zbhfy>vSm`=W5;ZAP_I4a?AiAru4LWd_HNt zF*B`g?egRaU4a;2%cJNIb3yi}2E!ws#{9tbc!I`1{qy}P0MKdxN=&FrWXNSpNB`DQ zCM*#J@Jh-RlH(Vw5(D}Z2WLE2BkY2c3xA{s#GEjw=o#!C_xqlxlH(4Ydwu}Ck3Q^q za2^f|!ABbBR%*i{|dsyzh6Rwtb zJ@C%MKl;O)1-P#jL#jOFKPQWgpC&QM%%abH+XkAS-&_cp_=clKb*{AG7!_ zCcv`Qo@`qNy~+iqoK=e=Hxs5vy3TI@QG=^f?c>Q_7n4f^Nvcl0Ld>ZGEcSzY1AUD1 zP=yMhca{im!ueEitV+K~7ztS5se+;aD=_!o1rVW;-YZW(optqnFM4@1S((A@6)Y*v z%eFMLB4VKR;dv2GvuN#|&Y+EPm(L$o)HZexq>|}93&)-hA9DxWVO~=YCuo)nGb@YM z32+^8Suhw@MleBu)v_`_j(7|6Ex&yA0swy=aEZwG_e+`NRhDL^LxGtPf!FoZU=GSp+-Gj^61U^YJmuaK?P>3lA3gOiJZyk5r+LhoW!^j0ZJxX_`c#&L<0E zE%cV*aK!Xbz`2_o&99LI*@kUyxL`$;=w)OnVG~7xz<{o(0OFC%>eV5hCa9ex!|DcYbVfaurlDd2s10%qC5? zmGs4B=p`(sU=_ya96l@R!qw@SSA%p(K7I@tFS-zY6&d8(bAXx-?;;r@Hy{X3I?i%E zd5*H@>A`h9I#v;fi(};zhxJE0JITFuGX=mly6c+Bws0|-Mi!GP|7-zTyIWVo33UU> zz<8Q6ku9k!02sqf#|@CzwvM`C^us5`nlp>cX|n*nihzfC?8;7&$wy!El=gr{0Ooki zO+K)YUbxD-?FYaxw?qDFqx7t4WVVbUwZ4dCN+ZB8$FH!fZtpNLxsGFk))Vg|A_)RF z#w0bw6+q7xKGEq_P^(8xVf3h)v!;;7JdborIJ&|em*g;FQpj!WGz-wH;8{|I(pD{# zAB#=+BHXe1O5u2r;{ZzlXV7`*e{f@9>Y6{T^o_h6%MqBVG*23xw{6O}!Yz0AIdC`z zOU9me|Ip;%Ks+7TTKuH5g)rXmVdmY}>krQ}_ZYkt^f+2NPNSy1lgg*@k>lSAJNMzN z`r|fC-fukM)bDPnxU8n3do&)he8EE3iPmFZNDp^O&R%0@P#FeNqCXOh_EG8zzvq_V zzAXj=?jPGf4Y0!}07Y>RW%dZnS-bX3_tY+85YH?nhn6D>VAsbjaNlc-*TL6FNxtpCFK#*e7C7#;?mE~w<<(XD zFJ(EZ7C&%`{nDb@WpCiEubyn17>x^K>0>v)e#7Bo9~7ea)7^KzhF$)U2|)2Fu$?op zpJKl;qhE}ky6;26wY4{Y?sV7PQ)FSxldSiN%fgvu%f57B%S6aeeDG$Z*ULPe?q~UN(A&SypXKj%d$%_ma^5-2mLW^hdEw&GFBRrmst^HEk6x^GFaxUk zUY`wBgTX-$umHdUFycXNv*=E0`LD%2O|Mt^9nOG}C5tRohh*TO9#x?J;nYE zcz*hRhK=Of?OwAMBm(>PDIq(5{KYLlcymqpRd{9zTX(K0fSDe$*jW+bl#e-joZW;a z8CA^;;FdiN2f#}5za)^-D$s|T(SP5d_!-yH?aSavBLF+uB=jz`YN+>pa5gTDLaHS$ z6fC$mtJZ8fazR6jtB|9G#QPXT`@)8O6|EEb`H6d)f}fwv0JB5$>71W4@x5mRSd>WB zNJ=y}211TPxTE5qX<*`*E!08&sK%5C*fR9a`Mn5qS7VHb2@CGO1DGoz3rqvD#0eKqVRdqW~J`kxD;OWbJW} zh`3QOP!#YZ+3P2T6RM7*Av9T}=+IJg^HOTAc^Rnw1N{|NUyib#qra=GWWD3XeyOu5FY}kZj z*HK#0S!7C^0X8ltnFra!*>XL_J%oV;KP94Yd<84(cJ6>=cq5qLT4B&*%N|CSoGCCB z8i`Hh;{AN@;d{$5_IHp+lsxvHSyTQrhWb6x9^AwMlO5F807D|3Ws>M?4Pje?Sr*q- z)E16(SUL7Zt}r!9Wdk#2gWi|_UvGpY@)*m7hX&+Fnfvd)<*eHw>1jo8fe0T)6MQ@5 zcLP4iJP39Vgkneg%c547&j(n#I1yX8#n4zU5jRvz7Aju?w#KgS0D#&H+sL=+(sF zAN`^Y3>JAl3Io6aUOe$v1K$J(`%ONf5Em{S^#VZeSO6Z(MoHqx(EB0Y^!?s9?mo~s z4e=)9gggm{KWb>^E;!q*AACiRf2Zip>#Yw4D~L(y`0efIe+SV6b^L4eb^Yu8%||Z6 z3^m4DQkDqHUR}QTYse1Uh+e7zomYE-)~WW1uLU9ZJ$^aaVC=Zx`-4%{o&$|Dzk2zU zmtS4E_bN8JVDP+tTlJDv>keOzRla<$vL|QP#7})*(k=1`f|L~^EZ+eOc_a_|7gpv8%;nvyO*opx(rn~l(w@kzPbHIqT z@cvXIfARajS-O~y114waPTXByisI&1WcH=o9d&q_D6f_3-w_GGeKK6)k7*`(++R&(52k+Yk{ z^5>pd9!gUWH`dE@@WbD;RAkgONw+UkDXW4Tn2ZK_{9d+7VCH&rjtsO51O z*-XPE@$6~ii$t3P>R|fr-LEWhy8H$w*F84tiIVQqt;ZMr{bvMNlu1=CfWpRLpuR8~ z?L@?RjtEZ|3uaK+jk?}lMIFn~w|D3W zo>(mTWM&Q1JOHJT3OyfqAz6>(RA{fV*AafN~e%zx6>3EM! zb)e!XV8o+DtOlFma33bVub9OFv&fl{=qEd!+me{iMlT}LqbcS_pXKKFC=jtzmis)i z&6Vng4z;lR#h{*7IyGRdnp`3zqNSieSGTyXg?jjR3j0^cZ@$s`H z6#Gd4*^cfV!ZM%=&H zz=NBHKzEZ7OtzX`S;1~fiSrsm*gpoPd_(3YeMoD=Z4x=IAq8ZpC+qtd^acC>?2UrF z=vf$W8S#)AH!^p_U~S)7(vqCn;qPqnd&u(6lN~1Hol2It9-F;QNC3JzV5D(E&%`N8 zb=;speDhDCI|LX>bGian7(X-t(E2g^>p8|z@qI!To;S5*>FwW~|1%7zg^Z@>QWH>8 zTomFOOh{oc!?6}e4Qv1wA-6hik54*i8T{St#0vBo10Q>lzfS!INjxa-|LHGZIPnSe z`sn}m>_*Nu)Boq~JzxFZ-&O_Tnz^Y3a@?Oju;S)WI1ZgHoHR%0??YU|omR8X`Ef7V zzWc=2h0&mK&YVzqwC8fh#G(%_K5O*TPrSVKMt1Oo44K~BSb5$BJ8I6xHvc`)b~!#o z%;KD4NuIFNA2{-UVh|d6^w(Ehnv-p+1wg#W3F93$a6nI>dFkr?*Mfat3C7{1z~NNa z?NMg&Bm-MW-&#K0QS;lzR(DBdU1u>2d_?~uq`Emj|I<5vM$U!JpcfgZ$6ZP#`PN!w zbl&vqzpQ!~xp_nORJ4x%JJN@9PGg#(i|kngJs>#DtE?&ik(itci+$dI1`b za}Yh#b(%o&gx%xo@l-XdYwR8Z1ClVzMTBc<@6!LCFxX>H-s4Wf%Aa`6_QmC56HuRQ z{>Ar@HuU(~-y>gl7^K{1|MKCLe|hu0{mWS1fBQXeeZ9TYlf#BWS?T)j-`#%xEq#r2 z2D6`Vp=~#UA!bEb@4{v;$ZO=x)1#Akr&<@7F7E#o-y;qBW+A(UB)jKph4YT@isob! zR9s({YW7Z;a3NGGWf0FZ$48%o(|Q6N_hy(Ho^}U#|JFB9$YuFziS$*&GZ|-=;Y}9n2SNoDp zJL}J3Hc$`g>7CzR^vh}E3)lDND)KrES`9z{k`I1dF?fE)W=}3&e&@Fr-ht;Q&+hl` z$5Bj~ytdHGiV5Rh$@i(w(V6`E837g{fe6dx5=SU_7=|k?;K4`XB2fz9CHf0-`NROa z&@1tv8SGTO#dCfrW7h7lC2t)}+nuTlFu>&aKsBxZ4eG*AQV59Ap!IDv-1CPol} zWXQ~+oQ1Q=G9S$4@S!Bn%)m{{AS_wL(-QAzF$wcJa-r)Q_(sEc5abuYRh%M%y+oCn zp~XtX{q!^*y8={Ug<*VNszsnL%yPmo=1Fwp9^B!gtjn$-YwluEmyYV!0lIgB{nG$M zj)S4kgi`+uYhhxKByd+Hnn^&|qqMk6o2_mD>XRoA&#^n_7wUNm*lCrWEkRf9N zKA!09SmR^HNfi4e+M|=);%OaF&!~#WR?HkK*!31!m0J8=k3kp$N(8`8u9N@8 zfIGPj-gCbnBnS3G4z~P@1{V7dM0hX`K*3Dmpc>CHiVjaa|9(3%(u9nK&yNq5^C!E( zLvCvD`hteu2P~T@fN46+ve(mjDDYrL7*m|ab^YsySNwT@Mf>z`T|MKs*w)h}MQKOf zK!pqyeODfDz?g0|oM2*cs(lk6rvG`E(XB}*>I;P1hBS39qK@4Po}-g)QVbAI`UogeM!^}Wzi=k7Xp{bM~i6aPH<1+nx5 z@zREW&JD0xuL)hhW~wmS`PNUL|H{97_v!zD!XO^p18@EK(pG-%Txb9o zFGHO?HdrjMa$(b^AO3pt55N8MjbDP}q>+_Z4upSZbNd}UT$@EZ>E{Iw#p{s`+0`=; zYIfNTA>`oQ_WX{H+qgdoWp?Co81rwxb=lAFyngm?7R|1EkxSCf9pNYbd3(v7=IiH#D_Tj_yf_ZH z;a~j8uRQc!vHfIv8I!e-K!@p})XGmdUO&W7nN?&kf9a=1<~D+9cxx5y&E| zaAO_J%%E~Nq4gm4+ei1l>&cDB-o=+}^#3B{-j;sfU5ozrj_YRM2NJU7Qm~mg4<1rx zzW0kw>ycNx3ORrVj%#A$l*gYt@>b0E-_b z{q%hSVH5_ugb`jSQE{O@TmBs50c7R)6`JvYV{QP|0B4TDIr#8AyuQgE`ki}iW2`}D z&#FGKnKThS9EurtE+5X|`%|OSBt6Ldy_9{PIM4i1|3Re+_cul(2`9ckLzg=i zIsfDcT-HVF&lN;u0mk4W*_lbjpgfJjoCJyu)ID)AWul1kKT_cfSYHo!%_C5xg2*RK zP%edDF>&Kwn#2WZ!tayg!IEW3wGy;YD2(XsX0=h2VDf!jiL{8vU~pj7J7!Rs!Hx3N zMhbB+Vz7&b(9akR9wV!JKH2S1wotyRRHNq)1}frFn@F|Ah|oJ{vb72a(nJhu7|dH- zC_ObeTPZu>rJ=`=EBNRp%JlZbdBr}S6m;?nkGFzMDF2)q45=Xd@1B<-jBS)zv~+c z*D#rd^QRiUjBiGm`x7{CFPjYTdP~Ppd{bStZ2FzIFZl7U1Kq2h*mUCdGv`%l7beND zgrQkRbN9VlKDFaO&oyh8Ha+<-AGz+6=(lwssJ#s0n$qnwjnVg>Mm;(T%*U= zhSPg38VOH7T$pTKTXvtide@=8rKuEhfY0e|gva@W^GjTlCO`if`!N>;u?@b@U_x`w zy$00n;<|@k9t{h73 z&oTrAWZ35tY|LO~gV2}=z*s@FkToL?em1wR{Q;DyJMTxyCjX>d=# z#E<(23viV**VmA9#bPqAy_zho&7|>^L3D#^&)-a?drgt2C`b_gDLVDWNcIJ&Vo7lu z8=oM~OryB*TilnN`@PQZV$IC4u?#z+<}fym-T=aDN6BfDa)FR23(Y|lWzwi+)`}-? z@t$tVJ^2*nENb%Ha21R zVj?jDJhUh|ok|Y-3^F-qpog^_=L3kXAjGA6wQ*Hg97C`eK4%bIAoizZi;us-@QqdK z68ShQ&-k2c4hW+t@@MTCDm0=`Y=#86%?X@;7Hr#zmGFfRO0KAMD-p$XW*B4dC8Mb_ z1kmC^)$2e(M0v}p$-Le|Y=*7h3bl?$K$;sEWfJqj!9sGPh}PthYs2`vQwR zoZ_m_T?ac9qA!v^?B~99-bWixmCw2q@=XjL=A1_`_{IZ&KPxka2?_UHP29*2?|t#J z8&ML*ZtrWBG(F|A8AF$b-piYd;~XX~ImYkKS{X7q(MRzmP}NBaLnfZmp~vLGv*7B9m){uP1qR|%zpOF_;eZv50eoz82|>8YFabSWtZXW&Pj*Xg{> z##(nfRJE^v{7Vo201k|}R;X#?j*e@d+<4^8*ygt{8ySA+#e_**uP^@4fN%afdq+Qc zve!T5*vS!`b0rsP{+K~&VE}KVb@#bl8SH0Zvy|CldH9R!_ zcHrY>&?r;q=1Sr`&*297k|IRTePD2rp3}29$4e<{m$6@`&y~wq24%m>{3pNs;4gpo z_<;}LcolKeuIL#IH{ym^iIU{Az5{S`tp3lRY-nIJ5u7;1R5qtrwV-huN+l<~$-dAy z#CP~Pgnbq5MHQ=7=beOAdJeUvjK}BcY&Dw-iP*n z5X*eyV#gc(jn(^)4K6d7;Wm%*Nqnfp&O_1Pfa-x;NBnUvvCe_u+D3y(u9`Wohq|L@ zq%{r$A111N4e_|m0jTw7xh3;5x4-6Z=diOK` z?eoW}xz^b}b4ulT<>)WV8bu&-@)yt7rZvY{k&DB zR%aTjF3$n?rN;A@`2IzoCjO=Duv%kEqvz}pEKreM=cQbRA0YAfOX=Dz$}BjeTou+qf|(TLK{z>zLy$x!((Jf;=FB>C zo#Nk0-+Op2$&b~@G8?8pE1>c zGKcR6rzJsVLjmq!Heqli%2dU7Cf}3+Nsz@vybtAx!%&eu?P~3Xt<(QZKer-dethg> z*z=R@OXXl6LExLkLrOZ5B&ASbs+oD{OzA@ z`r?D@54{_v0u$d7(4V`#{5jc;{Qe|mm_qen+w?OBjk6W-M0)}mLGZW(`F(3xJ!KYf z-y?h854T1aZctPpbzras761OSj>82O5+CD<(*^pVu3Fl%;l?#>4`yIl&meG=#;LwQ z^&`(7c{`M`vw(stZ(phWf-m=_JjweX-}ko@H-l`@8DIa=`mgm21nWdR%b96%vY0#F z>m%lzNNPb0iffm&KC^gE?LmGB$k%D~|IuU59e>-A6GJmz242iP#5gX+<+8cXbLtcC zTl>X|GOM3^ttXr(XPqx74b?oc{_tI}?yvK|#PA`5Tm4^2Wp88@w z@z{?^(q%rhy1;&o@9$+@(|BDUdGG4412ZuszFtKlDa+;^o!6hc9mFNH>^<1Oq7-LP zEb7ts_KsWU{S29N-IsHIFp3<#F>#=LuAJ*CJibm=!}`4820kxvp7Xe>E&Q^p?N?0o>l*S^@`R%iY#tiaPS~d@tt42_}NW6JJ(%o{iA_s#j%sa zZLCJ}cOZ5{Tqth4X66H}jb#V89DeLnEWWVq+$tR@8r(_Key!T!onHV+izSu z?f!}L3T1u5XM^u>SZ$o7Dn=NmOVxv^O1PU@Xh~y z{!1W)b(4*A*MXj;cYNpv#w&X5wQYdf^}5`{BKZ`W8*LBvjxP^nd)`v z4!3koEWp$y=SNl_9_XRuwWzdl*qJD0mO05TFkPh_A)sV*4 zLSf$y3J)Bj(f&s$7VaP$q7}^c7I2p=MFuueWb`;y)UHKnJ-eiW@QKz&+=#)o)U;qO zRiUI*W3*G~S>zq|^dQ?1F&@*WQP~Y}30=3GRCV>-11H8lR+=X8IOE1zI!pMXKgmO= zS9S`GaZWDf6#AS{UXddS!lr3~iO;Mlq^+qT-&4p+?Cc;_4#6I*jI!AbKrF=2!+7Wj z4L|T0l^JbhZL1{oEDWPFi8vZpK@1}v`|w)1o0(T>U z_sS05tG6`1DA`|W{E74!cnDjW5YT)nTf>vp9Lk~I^R~bL)iYR`76v!UCs3+)qSO1c zwh7A6#_jF5-uL*v_n5ba9Fz}m15#pCgwejeMC5x^@7u`ecdb3 z*Tcp-`H8{JGg~Wmf9%~Wzx~5|w|;_+L|9!s4g-%5eD3!Tee);J{roLA&-*#dF#_#f z-dP*AwBP>s|Nh5!^$rB8|M~B(egIbb`~*x)P${$5yz_@gk94Nduv?n;9Uol$mXG}W z`D>Q9J$kasH|_erzWZ7{(XGebAI{uyA68LP$d6^u!$35pjLYn$Ri-D~MOHLR>X>+! znTUACG%<<~`H3c&*Psu8%iC4-O_0_f{bt)|StT07Pb@q4mj7la$2{EcLQ@f+@UGhy z{B*^lrspr^JUDlr(kFSsRB8;Kbh_i(S@&(--F@xe;{&sh8Cd|H%K!QG3!lIfbB@tC ztxU|FUAKkroylt$0V|9f!v_x|qlzyB$h%Cf@u;-1bWPj6|z1GAmZA-oif z;4m!iLb0(pZniGTCG*WU&iNhs(yqGyi39J)O*bEB93zqacKWMSauv_cn&j_(K@JHe7Z^NHbKJAOB{{ zKYZcaPkk51su+qUE#Lat#(%-h@p_!2r;pv!n~vRqc#-9(HpnC2PW7?(toZSDtEWDA zxkHCrBpyeI$G&5y2>*gQsS89596CO*0A>9~@r?YOQU#dlp-uC2S>xCN5MPkzO*ofI zy&Pi`Z=Ii0UBC6@?d&9t+4&fY z)$@5c59guTpoyaFz5C7A&$$=p;_p=I%WLyMsc#hF?tdFk{NB28jL73!XaCR_e*e4g z{o;jhee8X!zc$%EcXa!v@k2{4E$4G(yd)fIT@vO}UxXuZb60<$9>DbgXmu zkJFkfP8%eF^vr+r-~H_W@q;ZqfKxWtx%xi$(d#~e@3yltOBtI9WM3Qy++Qg1c{~4l zfBxytuH5GlHe4$o*txIgDmXR24W>M5Tq_G(_xG&6>;L_H%RLY7`Vwb`TFu7r{-b@1 zHt*_M_nv?H?Z;E`wD!aAS^d@T{42LxR@w3zNA7J6-VI z55~z~r-eB;|2G-5s#uxZJbcrd=@0$Y?F)WtwVd%6nBH1`@Z;}U^_B1bdh_SuUm(6e zk=5M#!7u#&58wFF`k%k;mifQ1+f9Lvu90aQwzl8=k$-#OJzc&2#!tL&^*>K^6TjTg z${S_=SLKPyp95IAd|KOa=!-AJeJ7SwHob$~)mI^YKo6pb8+;hIa48}c{WRMB5FI?U zo*v$=rQhtCMtC4~`pe~|_LJw-gC{I(>8D$lbkedZTGG0%A+yKHTiVo}s z(Xmkdj1Qyd5ym|VHsHd?j16Y+GY@jA&Za5b)k}d#AE#4~JwXbWhZ^5;Cn7Ock<#V{ z0b++c{_-rjx1J`7V_y@Z*OJRDSsmrELDBR*{1Ekg=SP$o^rBn^_X=ZWBZXv&sz3e# zs($x7N$;wrz|MVi;$Q!f@;!anTNAG4r7(JHTPsz6=zU~_>uUQyeS+fqJ1Cz<7(G_c z4~O!eN~->=w@~eyZ-jc6qTmy7e7*M%lo&;6I_A+py;T7tJfB9KNE+rhZnFQ?+oOxfvX6qvLDC}|(e0QE1DqA;X>6e)h}n2s94owHH^jX& zAA_-PAih`NZ+KQm;p|$>1SkztoKUzQhB(J4IJA>C9kkQ^JEu}7GCFl*ndB3MveTyy zbQgRZpg;)35^dPx_&W?y`kSlv(~4Pknl|-qWG}xKWxG&#@jidYf+}Kr{ZN;G3&-3S zsd?IGKIy5r_S-LYKEB@H$G4C2cMtFVz#c>c^bdw=@I-NWrXb4h1ZPK|LTpN-`ve>r z``a2lhY+CttL8e<$o`Vkvs;c|_tzi4_Ypj16%uY+o%`57e(KAvNx(dr%x%Bm`pStlMKJfPC-y7d5ZURmJb@zrZ|M0h4 zKh8aK;tmrR3Y4rS`AeO-9Op(M&>U)Afxi5YH-GqV?ppGrb4UH;ren7=$z;=>@d@X4 z9yhOf1dMChaO5NJTJ@D+H0AvIkDvW4%qT>k$GmA(2X0t3^%0l|JiQoZ4||UeEZ7Q1 z(Dj>--@50>z@qWK6(+h@EpFPdc3JCVH(fRT_YRxEk0^&XZ{F2;{ZlUGqqqfT4 zy=GbKXM>r*QiG(N}qhyc16L>G&NjoQ72YQr@xBbokZadoP zoy}$*O*PI_&;9nJZMZ=@U4D4~ll$KG{(rvzKBGa15%{Q|E`Q_QI+rM*6GM^Xo8?(k zDtG_r%WrubZrb~}tar(s-|Fo5MjQBBhaq9If}3Fe8Zu;Yqj~e%Y4_r|9Ql`TJ^59G zQO8(NeU-f*kreqvI&1&-zut8hnyMUdUR`$YqkI1r#N9St4s6n@BJY34^6$=UtJr(X zx|t85?7QL7^#|X%7cn1?KY#32+^~x45T5a7;jFj`=kH@oyl}iO+8@fw)qmc-;j2(R zYkG%*wL1>@WXBNhg25@-eC|w-3JQ zx|zRSI&5l|xozz?Z`$5*^X5HWe0?Dc0YcIgECs0-QwBy^KZWUP3V^kywr8(-1j4~l;!SUZ~6ES z@7?^bTo%kX72r|Xwnq2itCzJsHE(A1wz?|ksqQ}ilr4L^*CMv(&Yq!A4Lh>F`;GA$NlK@#`#~YE4Ori>I3V(JbQZ8j(vv)mVE8*XaCa| zPP+MIZK`&3eDia6d|>&arj6s{!uL}n%)4&ieXwWsX5^HH;%OW2EMJ@FPp{gudU4Zp z^QYDBxO(-JhxVc8aNFLlwfm3uFGf_&Eqr_#B#launKP|&|8>jT9-A|*dIzqV&yKGj z=St;gzy9d=A6b9oF1(pn+SJN0+q|}`F9lH#$!_=uHFp~@~|78aM?46rGvyFXK9ubEcv7bb9NmBTWR#tkV zU?52bjtDG*NCY#~y>PKs+fd=+u`~V7Wi@EDESonvLNoNQG|dQ!yk7c1j;F7qq`8ls zl8eet50h=?4>I-^>xJzroU30&>PIqa-xaEx)2=aS6*~QVk}wK=)th#f!_Y*NoT;3P zMkKBFK43<)^(7aY*QGI&D}M*)w#5jD#^<}u>W-FG+0Z0w{R_}W1BP=S?091C&?G58 zv^X^UjP7@h_;(sq0IF_0;~#YZTZ)S9%P(}S{-+3b83_zT+_FxKPuPYG?#H^rxOr11 zdVao#dLs*p7-s=?2rf3RD4@(}F{;5KV~)z0SM?F1u76iqrJa|kWkea*3j$*P=CgBA zETj{9UL}ebnpkb6IQXD`=yrdM_b>MO2uI6cJ5fb77at0w4#7U><7}{UNHz@>+SVjiO6SaUuMxWaw-UuB#SgvYd3Zpn?7XH@ z+8Gun>$tDYO5YH6*KK69A@|R9K4PU7C&MhQ-C%mckFZ1QFaGFX?&tD-u7N99F(Og{ z^5(l=rqKO9vE9=_nl7XLUh8(Q!^P)rBG<3G6HK+7w~ZQux1ut~tx-6B7TygWR+#5d z7iG?spt>;#K;uWHp-{(RB7sxSTpHPs;m&CE7xC8oxV)vovEMZ5$@b&H=kyT2I|M%w z+5kI@ZK_`z=nW&v;J(>@PAvIWTbJU+C4@@+)Ev9{6dt=3?rrIphw7e*&cwHC^+oE0 z-8+Wkf>LiDm56=(1PFdyH_t)7iVmM&AI7fV&qq?DpfJ!*(@En zVFLCOvMQgM*DVQ^90Wf~LURRfN@~LZGxig=bS%;X67s_z3PP(a{Ff74Q_mb9L?35T z)z48v8IA&A!-|599`r4^GdEI?AsT8qFGH60enLr{P+7v47_o%UL#T)2^-MV}yZM$# z|E`6G_yV6?rXDX>ZX}F0$wnWkL9;FSY#)2>Yl12o7VxC)aZ{hla-E0smqaVCiP%l< zRjMZ({7nHu2~|%5&ZNy3r(LKQ=}}Wf$bv0*w@ZHOJg*v}luZhwJS2K`W3?R+Vpptj%IT|A7Q|2w$**zK{zr;DdA zwfS0ZnZvU#$e!p#NdCD)AbkLrLcCGGZ#Yfuit*_S=p2CW3V`8wi-YERY>A82;N7Zp zy4}e6F+=RdaI@UEX}Xd--Mrs}z+njn5{R`dYitZEvN} zl+MpYo^b;!avtoF{5=+GZo^b;?D*-*lX9o{hy3yS zK8)&{#;DDX-`iGsJ1SBvzDw6Z@&!X0SK(R5$!m*X_Q@lcrE_a(j>pAOpTpZztHZ8w zx`>|8P?Aa3S`f;8@M{b*eb9^s%2Lnn<;RmiZh)67$M8wipTur1I3UF1`s>lhW52nV zj#zQx)W1%LPS+0sZC_Yj)UQLy9?-INxfB1F`*o`9X(wx|k2#L>{=!tOQs{Ft)~V)+ z&+w!r>s630>S@jI_xd{lW%}m>XbxsGd;H)&bhYy~#w}{nG-?2y*`h{ICU}?AQg-kI zx%0=q-?s4pIrD?)!)5w$NaGyQIWgRMXu{hwOfJve#>b4+Zt3UgbuP>HE|`lOwNQ)K zu-$FfV=J=$EmWkAUrH+i5fa14&STC?6CQNmL3qM+&d2=excc zyL$K!NhI0qqd__ukgw3V4vzysm1yt!lm8xzB*id=W9H2WvSl3$YH4L6Bv!exA@p@un2ZFi({X-sKL zi@W4oXkYK>&RY4&xqEy`8y*D#?V2$1{ieInbI#Z3{8w2YMo{jlmN7~Y{CA`f(t{t1 z%KPmbk~xF7!aFf)OZn|0>)s&!#uPn{=7h;r=mL;8oei^W8oUK)55b0ruFa>T_Ck+E zapew$QurltMp5?fHi{QXz2o-<8$zJ*SEMTfs&|ZCA+?*%aehCW6$zq}1|^7k(>$mA zBGb`s+w}WOfsvdpA;_A}xmU>f7B++L(59ltvz)8h1YtdQr1MV|{SeIopY+DVW`Apw zxuM3`+J-%=rlGUq(&=+w2ot4V`LK{tDPIt^&(=`QE_db%H7regYP*oX@_IOb6E4U* zb5dkD*}Un4XRgw1Y4`Yo&Pf*CP|%ckrdDZmVAm%;awxr-u}Nv&1)_B9z%A-sJ+~Vw zO6B|a?IVeYy-BJh9)r=j=?i~h2rtf*{G}go04G3@_oXPL#xAsGoK#giBG;_Tx?AF= z$pQ=yCuGgv!Ky%pHmZpeCiF&Ft-$(8^A8xm)>|i$nw>PBvDWq&v7zLDX%77O@YQKK z$i5fu$Y;w-k)hv`UkgW)1kynfHzM)@KUr#{i=C-19Pru5X@sHF`qFQ6+Pm)#+`H#J zf4j&nM@L8hO1Ldie-(1l+ws|>7AVdfy~ZD_RY=zCHUELm)>Zf1u`?Z>4;31NI8ICy zuCb)a*Oo_gmbR$Q7=_1dLHOc)5U8y|LN_}#nS_<3L<&yc7gOWo5`A75rQwyJo-vvA zWZK_jH?K29x_oi$Y{*ho`z$-WyYug%*nDt9zGr{jsViv;FN%kDM#+4-?-#axmu2$c ztzelA|06O{21g({E0%fANGP77sUW#+(yf7!@> zbsggx5z)Pz4M*k~ou5}d1u6p>?2FudDPqT!$!oVH4Vwquhza}^JoEp`y-Q&VF)OjF(mZJaASKWj7d(NInI z{{C{RHqrATXG5K0>!*=m%<7_&=ccC4`8+gc5~MryWmoFgjd0q!zp?x#-glKNr2BbE za+zyiew{UMqcTaLz&DH`>12n(0)Iq$c)IlD2@=XDc@%uijBU_~q9nUY3>c?*GuntWy#2*g`9>adKPS)w8p6B(5xXyi4*DU=oBPlQ}JC{8UdWn1l=2os3`| zBSA1mVqfxJWqQ!(+)m4>_h(DR?dr<9{pIt~QG812XF%mjqF7wV`%!Iu`Ji}ua?4ei z#bbzgn+C;p+N71b_M%M7cPv;?u%kGz_qJid>Ggw_UZBgU1N`8J)dCO^j9AeXfw8GY zGcWgD{*oebmErNTKZyqM;+80H_f>6;3#YLS4tu1-Om{xSD zkOx^fOkm$ak~b1mI=3O^;cbRP>MV)ZUs@3d9iCQN6jLw_5EgO1ZCxO%N=qiyFARCx z!lNsLfuHJeGmAi3vilNVpayfPe;1A_PsDCIkaajk1U$=! zVOv6W-g4u|F(BAOtna zKQpi{Wa24dk1HldRi#+N?1Yc1;KLoGvww9eojwNd=(-XzGvqoWcA>N7!VSKhSx!ut zcs75$n+Mhj`rf#hoZTnvrrU;u*jRFXOxDOyLuMNOe0P-pHG-dZjhQQF!PqeIEA$on z-%GPl=OswSVXkze``~--N4u-x)<@RJ!6THZJ*17_HTKt#$`7c6S;BZU=)7am7qi|u zJt&OpZQ>(S3%7fU%SX)Qnd`|@#_R)TO6j1=fgAyNM5?9r=sgzYGQ|Ea$xYogew<9t z*ELeXdg@sn^+q&L%9iu=dDJEK*zM9=l@Zwee$ieNICfQ39LJ-Mz5aeWLHxNbkon1j zqsXi6k1!PX#@8zkVeVhmWr$+9QPOWCehlSgy>@)lG$v4DN^wOwmdONl^Ce4-B=Sxp z-2SD>^L#&E9CfUE=*dy@qh~wexvegU?tXXUyaKz zNUn>z-+yFY>0<5S@yiLke<>~MW&*WRCG5!<`&b6^L2l3`YM_?wSm&ZBwe4--IZG2F z_welOS5Et*TozO6PXdGEM;2PUC*9%EZJm?t;GvLESzYy>xBhlPr%SE_g&M(!=&6mD z{ABnHgO=&Hvgww0_)Xs%Z!3nf-6^`wUPJ^aeCAJ2vv`-(;g1h&mGFD#$y6KqlhuWiUq~{}({D9ZURvI|H+~oC{^GIh9Z8U^<9(V{jZH9`V_$$OdiRIh3W^n^y z7G>VB=c{iC-UweCo$G z>S5Hf2D`fq!j^lYBBD>ZmO%m6)caYapn{&3K#Ajgy15*1Ss^uftn0*VA&zQi+V*QI zBTC*k#U*F?f$h6OClNR54hTRn?2+~IQ{kj~a`PBuawW2|=-51hg9tX}t`X9RjiJaN za&iK_${GVPs7+w7`vs*0Eo=e|X529HO)4%?@z$h%S`98zsiWupxJd4<8%j6nK*=4f zd3-${R6HYxve9P3({`wuJqoQOa+bQ1(T52COH3pSj&g>r8<$vkwOEG?qBSB(fo>QH z9AOWHMm{4z~&x z0tZ)m-p@YxTYUV<_>ez%(c4w5$y&DoBukX29t^18V3j*w)w(}ay&t8~{gCWCEe;$Q z#W6ey>_b;VaUyHFTMBQXld3pt$s9OO`j{jz499-Oopy19A31fNxW^KDP(RXfE^_lS zeLcfqb-NFL(7f?}ZCK;A6TI8pCsKFB{6j4Wnh{7^zFHN@L|;J;}163R!yfrzF(<&%uDA;$me5HroU)^P{DEW zNR1$B?9o|?TvVBf2ZfB87q3R3*0}})v+KdBV*G%EL{Tc$GI^$&5If+i$)kDhESQ6H zG)yM6^u<;PzYyj5D)JQ-O7&KiVEON2`~IBE*ZzSPz z1$v5K5K9N44aAR;?4oiv71}PSb4E5O7odshv%d|nC2a(2M~mwvWhxq(Sq||SeCHhj zagb0^HebOmD9JxuY2=Iy4r2&H;o_f+G+E&S80d_!b0-@oO(<36nHuxbtZfOjL$J}W z$=({2917}!BZ2$(YR>GU!4Ga}|MFlEDchv~h{al@pp~`(>%56I7!4wy;w(@)tub&m z0_)}z%@{M0O$?xR;G1;`{4~#Yu8HD2aLxwufkRtHk>^h7<+!bpSY@FW-VnG93qVXs z=mKy%(_$-DV4}79xMbM*m(~RV88fKKrzFU|?j3`%EUP+9>Kn;Al3GGWhRL4ej);F3 znxQf%4jUm;fEKDz%8lZI<1`ff-+UpLhJGFF82))Z!{g(9>^E6dyKU_u9$!?P%iH#4 z(26j`eg-OM?Qa#4+OE;X>zB{l=&#r@&wBGKyeAk%__*%mhkH#8jfCEH^Sy+)|7Kc?FtXD8P14od+c-H`r z@^!69u6R>^719Ypj7ij(dJMsZY)O*aLb0=2$z4(OAV~VJnTW>J6UoA)2XgDFR)TD4 zsnr$GQ%OKJaQKq+a^w}X^oig_)9gP^Af>ZsA2(y1)-eAYG#-+WRucbfjpmgGkQS8-*EjLXR z#H-YS7lWB&a(RoP)zBb6*6LSJ>MSL#Dw4yBg`&UPUFZ>oMvXl=(TM8X6oYQ(U$XV7 z-;O+S0}bB?NjAKZfo^!068!0CK^8U!(l9GhAC8zIwDU_HUYtb3E+A)EiI_16agvyG zU06AY$ox}d5}>gZG-6T-Bf`+X^D+w&UMu)!!Wmq*EF%8%$;m+TQoVAbzXqV(`d54l zj_kMceVj~9^z|S7oC8Z@-~Xc6j(~O& zu3xB-$}bwiLesErxFHY)Cy+0xMt7v^`b_NSyz}jl?*ntwu|>7I_cGe+pJ*vhbzY)5 z)=cNbxvDpvZ?N`wbhk5;y+7Ad$Yo0~z$i+W zu>85Q>dF>c6|EbaHq1Jj$slgg3aqnCXivx`7W07;_rgw9zu|DGQ#r--!>mEVP^zQ> zh`})}ACBtccF;yo%7-H+nLbv zE#d%t+5((q8H6(}I)c}!oB>Cs9%I>ci+~%g3USQDzpKWFjKC6`xwO@az zRZeKLjPsX`yB&><3~^W++12(lG?E1Ti3aVyf1`P%uS-Y9kW3q*;PWc`Qbd~R)Z!`D z&iVfXhkLNkGg_)gfu6vKx+wKTathOaQf&^!PYMb2?%qS&n|6p9U?@-5-z7Q@eq(Y^V}9$d~%>3zWAf zOsk)dHnCdOmp3Tdt$(e>#F9-L{J8gc{H23qKTe4+#JFE9`H^-3bvp?@5L1fbjvS4| z_QW}_y;E-&av-rv|7-QVdSczjmCPjtzrC9#;9&|NE4HVqDdLwMVvaAj+7f@q$Mhe? zc4Lpn{Eb|%tOL}RP^y(iEFM2EGxF8=d#=yTuG;~3(b}lmrasP_k7lOlNqw$~_vnH9 zMv1(VzSV9MgZBqQnAg-kb1yh&_3kEXsbR|>bm#vFI{TV)fLsf`>1zR1BM03tPoKY@ zx30I-K@#I#`$H?;Pp^;FFK|S>iq6y@t1++9Ee~7-I_l-}sGYr@WJEk&+;HgVk$kkG zC&tLMEvTuov>a}G-#JJUmBf;(Nsc>cWcQZIa>XpUTe2rCWvM6+6@3;<)O7E$Gos$Cr+j~e!i)7udXSs)tP}3g4(!g7KW8o zIDY0U7@j6B;|B_-P%c_N4wQ<$4*!bSDsYD?Vm)%W+-Lo}XWLtVkVAmSRf& zXB6nNBI&o}Dtc*SdtZ)fr-bAF48!Jb zovIOn6nyC7Fnk?~%~=q*y4!YtL<&6-dR_?qtn3<9Ndtp-E$wH=6A2o;vTAs7d^O_m zTP$Hub?;|!-8AgBoEXt%NQoWkV$NE1W>y_)0ol~xAiT*IEM z5Kz^zAf(@eJBb&ry0Ln_Qa1!DIyxihH`|O-?SX&XoPTNb_D?;Q_NG6gP=ptEUP5yO zpTaNSPlBh&9xO(``k4>^*IfQ9Fg-aWt=_LSytxvUtWZZ<`{=>h`B`nwI!Dd-7%qLT z*NyHryN{{QD7X75x3VKHf}y}ZPu9ch6 zo&78kK7KSxvyhThCfjAt_tElL-#Y<1N|iTsqUZnkM$6bGKDXx9M*OzUw;fZ5qR)6K zU$Eq&Bdh2G*z<*yiz_KJiz6~@W|TNlilwIk2_PzF$9)W4eEb;&QP>`GR-Isy$XaeI z{JN)`FcBkiLN@~j)F#!D)8ng07IJJHcd?Gkz1qi~qGS-@^7udP03@xdo}d|urXCfTY|R*9;hZ&fD2(xny21i}xX|X-xJdf7 zJQsv5)mpxU%QS;AZFT+qDQj^hsgPob6>;7Z-vFlO!^(sJ`%rtU%uKJ_b5&s33 z4ajzH&}?&J${9HsTQz;(Y{2)*g9iM#+sYfW%p3_XYCJzLs$dL6t!er`nvO($<^iTe>CNvS!sUB(Ms z3ObrNqSi@`p@m188d1zbZbAnyRN?EimOZnytKjP~x7(j)+GlykP83D{+Ht6UTi%o= z_vnw85Nx4(ts0(aB6om=eyEw~(H^qR22bdP=A!&mVC+yo&IIXnhUiKe=0V>jM+Yfj zNIjd!@0u&`l%r8r9_G^O4Q2Qz;K*i<Myu-+|u6XeuYc1Js~z0BWgSiV*~SGPK-ve?>=vVw=Ry-???5yncu-3M3O$oVe23J|OgV64tfX>}-ZY+nzsC)!9-Gq~1ng1n zbB>fsbWjelZnSBg@DVU=@i#AIY4Cp#(-o|*l}oi+qZaXV9VF4Ni+S>y+7Q?1?NN{o z_0P^r@1HJC_rOMR;E__)`765!LoddMshsVxI75jRRX3646l4^n?=m-oRXcK+bHul@ z*K}g2uu7&4BhiaC{>8km_E65lW80JT_mnp z(oXBSc_kD`Dxy*SZJ}k}tbq~yx!H90iQCzlHR(HLfs(VMwF230yz+(3&nAKD8SkRH zC&@P6&*00`3`&O6+Q_#8D|&NLoeJ{waqTnCz^Ps4*qF)=C%JzDz$k*#D~%1I zy?@q)GYtYrvt>)=3Fbt%ak`YE2ghrE<=;T>Uiu`=Sjcz#wYSRASrXWzc;{4!RGJ43 zTm1Bc5buwtCJhebA|w!La*CG+*tAU;qyyv3G%VkShlWjhi_~-?6T}uwq zb!A+d_Xv+dcRu`HKke|G;5apthHRhHDri=wp*$mz#MRVw4U2d!laL;@l-Ut0@#7>e zBHNW?48S@$bfneev;5ys&B&=RB3dtc0^uXjicCt_0Qn19oERv9- zqh{qrr7Xu=H)D{psJk*uxTt^fS-gPQGO7jWiWU6^cfb^{7gnE%-3_@rcD&L?l?lUc z!j0P;RnKw&-N4ic9%3y6mZl3%b4Iv1t7xynT6s4*mGCyR7ezV|I5rAl{!92=O8Io~ zm@@T^71D4Tw*tk=?sgkxXL9W@Q^!z6$H9 z8asi65NUgQKoX`fUUEV2+4#U7k{^@~MMORZ2ZmNJrfZxib?$GRawwgKgh6$rS=GRC z!8j>#YpX^g)gQKHNHeRN1b9r##VPgG7J;#Ce6KT^A51lJA@uY%mbj2 zHUTqJl>6VHu62cK4LOk0L?aGz(uf@Y$`h?FD}StVU1@Bcu4Zdo?P$Ut1?>rC^#hs( zUAeowtOO3D`UaUnhI|5sh|qpquM4l6sjXdsZL$n$Si^!DndL75#26AZ8Z_+UmVx4W z=G~Fkz@(#d^5HC=B3Jf=MQeX}#s|dKU@9?uH=LmC39Gyl*qqTPHMk%|&t%8o3DRBW z(B%kulW)&yr9hlhsc@&Hh;kgAWU;V@=`TYI%2|2a;0+yGL&BP40n5waOj?g3{K+eY zN&4d%x$@dc6p#x$Jicers&V=mSu7hD+%37ccxAnu_mLcT;vPL3Som*oVKNfbIDj-H z1$Ye+c50C;h@99g|Ab{(eJkprKs z%qPt<&v%*9+B^p&Cxjy*`V&GRm+Nok)hp-iOE)vYK0t8&!FF7R_(-9qDaJ~q&7Wx2 z8DCYeUtyiUXJMVkD2oD)dwvfoA5fV}Kn+Uv#g&rbFk&!OKcN=q?-B-B5(6+n7OI2$ z*~$w$BC^l@ByxG2H5@7gYObwIao2k{2AnA))Cm}?jmRw6sH$l{O;yk=hv-}AQW0H7 zsJ%ql$eH~|iiNq^P@a^(ocj9hL)2>__g`N{F1B_~s=!z53jlQ(F4w5E+HXBblZ{D` z{$eR+FwYR zp${D2IVupjC?i|1S6g)k<*UM$9DT57ExINGKkB8OfdH}Zz45ARifaIc6vS41_F5-=YpEap2|wz}q*7MxWn`7()C1bmfpW1O||Q-_nI2M1ganLN-CD&mbEQ zgCocQ1XPLF07nI9&pvdP!aspgi}T z4NIaE)sHJMtZnY1W|J~-c+Tw!rb=ozv@|(e0eFYs)MwP)($ocXWAhA z+QtIb6aK%G^?y;z!^nRO$zr$hh6xB~r zWV*67CPhz^e%FhWU?f*}HrOx&)vCY&H2F)Z9p-;O-_L8OP@)saCxLwwd!ATuFG=vHVWh5r`i5129r=#@OFyl0k#6uK0_H0(&4i+Fo3VJTj)# zo9fw}s`iWsJ|L|72VAi>8tOS|RKUEl3#vCOvvlo;K^>P?!RB0e*%-ZqC=4)oL!SE| zppPL!S%JhslM7&uD;q}#$)fc)l2%>3WLI7s6K^2V5!u>^dQepbj*{cZn0-fSI@Z&t zinfk)>NuO|bd>&_3^zV_MVqkTC4)bmu+glE-NYB?0PsjU6!fY%=O}WXZ{`zLl>;T! z@KW)w=9_P8+5bdq%bfHogfcP;OIAS1S^@JlAg~?FV#gpZQ1TATIZa^mtneqgrw5)| z^bvYhU2M-8l_WL0P6X-icW`yofdGBgf=z=1M1{jII}5G)j@;m zu$fY5YIz(f{>}SM0fIARg%(OJzB2KgFG^@4NzydB2nMEd$BjswEJ_}NGeIqnh+>PD z>Qm*;=P38fdjbo0AeG8GU?;Rrd)o?5&>74RzbVCE1*r@!3`NSLOt^=gWb&+sHcMUt z_Eg;8>Bf06+%o^_EFFX)v2G^wZl)3UiV`e#l9rB)E@W)mZw7A)6^sViawlKN?o1U$ zOFvcw$FExz8%~g#9YHTwlD9qv%n;I%(op5aC;~*;M_s2EacYP%h^ISHNogKpuxe+H zGo7`O81B>r#vE8vpJu^4AapM&WH@!9gJf4&)i4;r>3}1{+1nLuLx}m8cTS z-u>%E>JF!+bd(an>|}kM-XLl#*T9e?WFhhzQ~{%gDXzr4y(2DtL9QOD-J2j+dgM-^ z1umx$n3(JRcF0n!{L}%MR5!_>d>PtHzQudKTv4qdo1$`NR2d!nfoW=Pp^aDXs7^?p zOPQT`Y!?n$|7;cV`p)d8`Mx~Uu-BqXRuZh9HA^1ITq%=K-hnrafmB-pzEY7wl3+r* z%0J@=F#j7?hPI()%t_v)aw2Cg8oOg+H2xY_`XxFk!xgs(nwvjo2&@AYesk-C;*eSm zFo=_bB8C;QU9n3Uu?QHIhjq@J16|ot6?)P(!SoZxNw_KRo2NZksudds?|163x=N|u&ppw+a0-@pHJ1@)e^IP) z%_b|V7@=sCr8e`6&edjcyU`-G6BTS8#Wa5uwt|6(n4{XaG^3<}D#?@Igy_`8%R)gV z^G2Rj5pX!L`x?6Ws;n9oHlU(tKU1{fVHkB)Tcz-!DIa?Aco4Iv@fkmNK`3|_3%n`C z8TJceD}BnYmbQkuaZM&uth#h4yDa%@zQn~<@o#>*#%NKO(y-ZsP2SHZ;&k_$#t)O__}frnzllkJ&k zh(pYityQ^O2=D1v|g5U8jDO1;mc4{7H(R!!*}&0wvW=u2@5D?Sx{bC!SFTj;b89~?KfqP6ZMNm{o|b2p)nS~LFTJ=r9*tx zl*Kb7(u9?sxGmkz2c&d`5^iC3Hl&Sf(T^y`0WAqXyWm?wWMFPdsFr>BlgM1IvnFm| zgdgDa`YPpjew*bzkRegxttpzs)mvE~j4le--+FVsgcb z;?bWd(KwVbN%?wlak_T*cr0F8k!B~cnW1ynT|3*)^`b{+)1XM%Zi=n&=c1(lpV-fN zc(yDV6H3|S;`Ph0EI|~1@flHa8oIu97?o;nS+690TAe{O+~{HhVU--3`S#lpLO#nt!1&0QGYVJIhM-} zW+DJ>?4#xfx=6nTRf4tah5oNnVV~qGggO!-LsiRZ)XZ)*Jt|ulE4DFlLOC$gCytH9 z$vy|~R$VOEw(#JF5oHMM1U{1n5_`P96_Jeugmyv*YXdlNd`FrxA{K%ad za^+K_60%Wkm7TCzr47k&{v0_h9c#SbX~E+{C@7k5vbetMk)devC<*NNvw5~jp2mtb zl&=k%6&?GMv-9K$U^d$W;UhcGNk46gCH#n_QTd#y3e}hEf;;s8iC)?VRl4{No+`fKnhz@F_h>@3LP~bv5-4F>(iL1X6HBp&j?&612e0y3TeCDP_YGq0 z((QqBQ~gqoz{HU6OV>n5lM72fN?F&32UhIg286q#;xFu^t^5JY*kFyq!AdI3$cV2A zdqQLs!Mv((0~~6WWrcGy4+nlrY&EafwF}U%%=#a#5CymvG?)xlIvl1Uqg{Q4^W;^L5h5>N?J3H z+1lNbWhMdQEbZub?zTJKhQGD-kJK%o7{_8twe=ZMi}&&aF+{`50w9j%TG0>xr~%ub ze(;9i#ODyP<_)vZkx|K_XTlyAs^I;*;y-TV+x}UBeNvPb=q;2!ye%XV8hvNSCjDK9 z!Hci_Tj+d`0k8{|;JdiJ<0WuZMu#wqJGwGjHf?SXgS*KyZ7uIB{!42HK!lSgcK_4- zvL!o?(?o zcBb2md6#419t(hBd%dH4Fv@=)Y9*Sdhpb^c1{KP4z$b8>)vGAUD;*e7AESng;K8)O zf^Z9Xwo<{{zU`lO_zGxNOv4YqyRQJ}VrQj;12lHj&onE{S)p`PaE5#GIdXre%Y6$- zqIAru11^t2QC%ZFTHY{$kc*TF4p`*#@~kVk3r)x}F&mpw-*M3fQj$fI@`v8QWQFQ; zMAzJn6l|%;fs4;~iG-@@2;`ZpyJAz8(31QeQvup3HwYZp6rRMMa7d-h86qR}?L9YF zb-?p^OSu{16Kgy54PV$8OflVFjIGA^g&>QHKGl|QJg5jB>nCedr>mdV^=;ZUCk3-y6xpnaI!ZTzrG(-lD`<@n{)f6)xkO|6QO#b$ z)a=JMG0qNL*szc8w=~&|L0^gnTGoC@so-sz^i<*G(64}Hzw#h?*59bNdR7pfw|~IRs+&C@8>J-9@raEsaRp5gmwh^2MisR2z)IQiov&4i*7K4JhEn`_!v*cQB26z#a#7N zBWsI{#uLP>%NQdQrdV9?FOJd8tU6xq2*@+!R`W>G&}r>OKE(B)DvOPZ{=VaSKaQ`; z{z|FpGtNy9bb&1orHco5*p0VE2rr!lKJ%tL6XD(Ei%QEW;AZ)~DzIbMxo$rEPhqKAi{)2LY`rg=nQhokxJqLCAFZJ@q=6VDg-+JD z>V?Lm9FL;Ij5vo&h5Rkwil+R_%c!gn9^*2T3d%}Ttj3-_ixcG}MGsTbk}j}Muo+=Ufv-fXi)=Zp^gFYBUULx* zI9tuYWoQx6g*-;G#XwB@I7Fnx;m>(sqM2HzE!F|A>A=~S3w4h`h9u-Dqrsn0TO%KCTtw#2v){%!PLJ>`s3E%?M#ocm}6=O2Wrq-feFQqQ^)%W0NTdJM)R5GvV zKEprDA=789w%Z~$Km=j3L}0hNmDzW0%_LzawgG!lt{kGqW;IHv+V3SYW--Py>Q>BZ#+lR0n$HWAuoSD2wG#Z{xektYGo1)a6DWh4Z~Xf#^eU za78ot!7GYj_T}2%;Z^~Tx$h>55#8o*%mX~~0_097L~g3wCO9tk*?Q4tqWab`bK|tc zMD$<&i?x7b>SP?-5vb;$Wje;=1#b<3s=Y*YtGY^Q=W{vA0 zw2_BB4(to|Gx#=5!QkF0PyuV8^NudFc^)cW{}bV28swtPG!Qt$v7 zVG$@w_@ctS9oRl_&H~X*6Wa3P2UNanyz`Qi2=XGuYO2l>EQ-WeOo?CnX@VT~=KY;s zwn+s;K1eD=8RH0vq{O7zf6xSyIg-?~=vhX6M&c7+@3`0E1COXdTBhD0K4oVtfkIoB zFZa^(9+|2h?RjItYr`YIP^bFVgT6Zi`nrY1x>KVv>K+!>1;bcG43_*`7T ztc`ji*mI(6C2a2_%jn)4NhGLZfS;d5X7Ar5d8uhZuYxtCJW+nr5DajSPnIyy>EvFk z|0hUXf{^$&0cvs}Jk^x4sg+*QMi`1yKqW5bNqh(QXr^&&srA1!G~V(=mtbn8?Ncn`qb|g1Rjq zg|l}i$@^sJ21UZt5_*6XiV{_v0tRN1{UFxqCv+RY#TccO`*>8psJu$Ng?|wle-WYi z+F0ene>azQkFkWsz|CsGS*#EkzMtojWM0RE_M&0 z8FL7{7o$yI7sebDtsN5&C_)GZG68OIPdqPVys3f<#7kNV|Aw94@HP_h;cC^8%msKB z1-3!AMLe?LRUtKKh${hEG&OnDz?dXBFDX8c7^4KpTMEE6|4LA;lKeh+hA*@IhgKG% zJ79C=L`&1ACssAsg~hQvHR?61U6mA#pvuA_8~ihfHQ(M$P&aR*z!LR2O@h8gIi2}i z6vWzA!U}k7{^2b?Qd<2NEQh-T1hJ# z3ID1TYjt+AN3>Iu;tYSRRkFoQDLu)7=0Ntgy1b3$zcQ7LA`eN4|Et9tB_|o#;TabG z(^x{D-#>-_-l&hd*)^nohJj#RMFJhBZBz$>!ylz|P0=xPVaUhR;+rVLDem9k1o{Dj z4mVnBRY$-dF$4Iwx`Ck-5k&}lv1vd&Tv9n7p;6McJpR50s>t6@KhvDk0S2Tf;=}+` z9B}mr)hBm~mB?l2q&5rmK1V6712Q`?O2Gf2>#ZM}Zr}c4X&4OyX=z4x=ZFELHW*z3 zqq`-gV>FBuknWIFK#*>bQBo=(EutbJDEj5PpI`3#bA6t_;e5Z3<9y|rlzz@e0j+Z{ zA_*k}TLpv)((@@+HMgpGbKIWTyF$rG4Y67(<2ylBG@W{!{3iib{(VyjBfU{|qGHLh z6V6-a32PH#(AT{t4Q4G%vR@-ev4F?Q`~6_3+Lup;8`-C!P7JLzG&{7_a^~M_d=UG5 z@ZVl9)+T$O5Se@T$9DEJ$Dzq|L0kI+GwfG1dpZvOIrGP5W(EXf8P}P#C(hXpQZHB( zi+JNh-MiuIMS*+0cNWv}nbC9x#J3IOVX7hO>D3!`Jh8;T2<=N*Hi+Blsy*1%qyNkS zquWyP`wRJ)Si7(QE%#otdi~b|RZ-v5RPDyvl30!W#nY`(32K4BgmOy$9460Ut|s=3 zoMe72X-k~wWTP|=)j5_&xtj_|Um+~Jz_d$izda%?j>cC#6k`#IAcZaPe)HGAu|tTC zU(>c!dxZaISN*fPxc<2$?CFXWoLmp4?mcDSIs1#kzsmf8AlQY8LhxVdQo{j!%=B~3 zdwkxNu4xl4AAFSiWz2MVFK8?Je6qV}d5h*S<#xn+$0^yH-TA{Jwo@?_++Z7k>xHJ6 zE3T-K>iVKfS!X>HYq&A8J+J(!Pi+Cu+x~RAj42y6T2p#1Y{e?@$I40Jz1K>yrJdr= zu(1;9SV9xS)kka}$MyEqiXn1JoM=VKS7~H%HFcWiNCyttkKs6ljg0DGu0zRo>^l4* zhaYq=1b4n#fYf<6B4QxYUSO$RA-)8A^`sLzo|ycr=-q5fA^!b?NhbPli=-q*AH5?D zriLiL2@8cf;uLXaVYCh;8z*~w$Qo{`BQDGN+?RL80EUr%%yoj(Lo>ldJ@TMpa4GCE{rnD-tWy6FYjN+9P0UQW* z1+HI&^*$ae7C5fkk?zZD#MCZm!+fc@QwJcvc$XH0&S;eQsd$yqfac#Hu!IjNYhwTi0gW8Ih%_%w3$WP zj)@&uUMm)U(UxkgY1!eEd(xm{R6H@o@~En5K32?-c$%Ua*)5$jWtL%zqwC2BV{wI; zbCURpVKGdPgP4>c$Lf#RETWga_~{!PK`XL^V`)SzV$5wABo)*`1gd{AQCMRz(heJ> zh^G7)mef8n!j*60L))D=RSVyhjq#hsO|slnIDKyNs=_aXi*bx_gf6pImm5-FsR`=r z%L$jy$eDh~SqXa8AJsFXG4E+2KrGTR)zOZ>I_>7_^4AN>tXA(SM?6I8u7}i;uFjq1 z&*MnMXzo}O@NP=S-Qk+Y(UVb2d?0UruRiZ8SmoYQ@y!XH?6m=1r=BQ0H`H&WwKDNs z$XYoCs-v|d6~5r<%lVmD>p42Qmwzk&Ey0*r@fpXC1Sau;m?V)m+94-32-ZuXI@S0b z^5XXp3wfIQ7c=rCDV_2ce*1U4^|iY7J=YytMxSFP-Z-L9+)kzpyOV&oV(_yWp%)%& z93*zsSg4x}n1ZZ&X+q$ecWTCn#?FT=#}N@$!h4|q_)$No+@q)`(Xq|aCdHlkf`7il zzWsckH3(j0;Ma0@V=-EMH9$F5Jxm|SCtJqUweqEc_x&AEf7M7L_H#8S0midtI0wu>M$ouSSMY`TB_%Wb3i{_9Q80 zu83y8%kdUh(Brgxl@BQ(cmLw>)-ceJ>A7Jo`y_j)gt%zt;y3Nl5E=IUF89c~75SKa zqUvJn{{+L|ir85z#f2WULOds*3C?|989y2D*_N4B%uul>uKbcVXY=ZiyqyNY-aL>l zaF)C0+v@_pV=WfufK5O#goiacFDwZ7fea+ijzxAKV)O3N(VoVA$sAkN#ivjuwU-C- zajZs{DsXd{RYbLG#Wqv=m64&|Q8+I8;NcN1N)79+5VngCArm?X{W&;*%Av(5j!3#~ zl{EjJNd<5GdVYR&U;>oxolhzIvgieK!u4q_=1>Z@DxX9WR?rePxL@{jAKz}^{1l(z z&*k0TQ!i@AM0_n`u?Cuh=Hau$3ZBC%G5TlUeU58lNIlKC_OeYW-YcHh$iOs+p!MB;i#tcbhZpHcyuGUu)O;OUSx#Pq)7){bj?4w2~M&xmAaf7^31JO zmDBqE&3C#A8yWaE)Wo~#<8@Kw^!_y0|3-HIY)fIB`>U-mc9F^9Nq4W4Lcu+Rb-56! zwjYVHLWjd;uZ77a7gU|zVYka4EEFG*tc2RLauoNNp&}@dxPP}l!Y_#eb=9H^a_${` z7+!BQ_J{Xqtx5$%r>g2vdf_%Iw2z$%`6kb1LH-a)z7D z6;(Mu*wrs^<)2hM6j_wk`tymWJ~IZ3*pFUN{4leto+#qUQR02y(dJ}%Diy69nuH|h z>oqydPgq8WM86g$lrqAKdaG<;{pM9ZHtfni3tmdCPO@`R)ReULq`ppLC&HiB0eP8o zo#H^Yo=oG|%49jD3wZjD?RMB4u5l@Ct=Szf&ii3qqwr2sizXTMdm8)0A(NI(;;KEn zjt-7%BOmXpLyG;dUzomR8ImUc#B6wi5z&O9wI^Qvvj$MDj-kLRsUwA3LkNJE)F)@( zMpp@91x4)_WVVB|0E><61P*0dQK!GUcPpke z???GBkkXiVzat+G8CHt!TREmg+6C(!XK?lLQpsW)=07l}Pw{-BYw-UmYe!kbeT2Yq-}#AB*pfG{*b&u%tAhf5z7J^1|AoKF`{+#ljg>0;6)la= z4|RpOZ8O-`Pj4t)lgQ=rkOxzoC%Tk zh8XN-!cIwyyAVqLd|4AJ3nbv2?MReq`V?2uuSHFRg>R1@)gBE*0F_>4;D3D@cl$Kt z5tjiIhaMlP-vl4iv~b%SJi1Y!SuPNL8h!`s{Fc@qC(cJb+NM34{McLwY1~mnh@Fe& zI~NP9-;r~-ZA(=!ZB?7{q;rxJhBed@<1&nr{DL8I=odOYT2vtDdO2D_jaD{xZK<;| zRk8FY^-M((gd~5S2M|}))x{kW;>p!rs!?hu{PPLmtd2G&T7blPtt@c@b`lHZ?$-6W zS*yke;ix{OOJBOm$(1NtO!`SJ)n+GcBB@o)@QVv*@M`y{?L$2cR*^MJ1uDUP3K7Tw z&7Z+7KRDG13R$7uwt0pvdhMnDb&rC6#!1PmeLnp6$}gE2$$!&binz$PyE>0u+dEIm zQ$2p4s~lt~qvFVhqJjI#-L5etqN2Q9nl9R33!n$zm@E_=#X}-E_EKagQxpaQ*wW9n zags=Y5D+|M9;i<5Amdf;fJ55JE~*}MF?KwgHc6zeP7r$ZstS(9o;_3HEc8J?3-%E2 zHvunY3`6{%QTxS=Ku0ZG6a5<5CEgc-IL9ykFrDM3{50P_9S5nNVqO-g64kb}Cm>ku z^BVKAn(qkrOW#8qkPwhJz(lA`mqngxohY8{?>u-&=lKz5j9j6^7}cg~7Pn5|+M^%_ z4I7SW6^%MJttHOz?-C7MeCD^UR7i942hp@Q_mouy4^;>=(_?QRlWe<7L$UX-6R4)> zZdfAn#0b)JsMNcX77c|$j8zg4s`ORoeqsWaDh&w?=U-&CDhbH5a6avNKxlbys^+7k zYDyrB2JRXkYf6E~N_=H;FCYA1c={JIt@#@nsHb6TM_f(Obpj&rc@)D2s6dv3zMru*v}!Ym}e#_<%P;Lq4ibt!tJ5!k30!P&70Q`%9IU;KO{Ves1ot|-EBp3lD}i=)&A&fIZlpZQR6%iHVtz)~ zx~&n>m}hI06f(Kz*}pl2Vcq4md2VVGQ?r1#)|nG+XZ7@wYF!$+mO2Z6h9yuPQ3^O! zB0IXWpp~^|bvSW8QS6l>U)oG|R}vgxdK#Xx)l_#t(z6{CdLLptX5Et^{-DyPz(2t8wxH8Dk2UrjcbO$}3uUwr)01}!8%X+E%f2=V`srz3Os zFQYA0G=I$f%*}t$_W`EF#PI%V=1Hf&C&=dkrzfD$IJ7;xy(FUN{EzX zzIXY$B#y*rOYIJHv8+iVgCf|Z2*LVri`Nw4Sgv5<@|Q?jPw+EmMg+NIdAcL~tdQ&) z#sH_squ^sMmTS&4F=P*3aPq1U@q5HE5(b}s70Wj}hkU-M>iEt^En4$A_grS{@~0$0 zq{`3Ta@P3nGj(qV(mZQ5je>7xw1Qw^R^Ut~xi3&L<}u(>=Yq6?gQAT_bzYF<#0c}^_TI~zfS zA$LjEVK)c09}ZVySUgqX;i*=ppQJ--DcIT_N48AGO%EU7xuxARqB+S9L45!}oqO79dsa*cdSb;?W5m7`3iPhppZ})(){aJO)B^a&} zr;oJ$f@GN#5rvnkfdLgvRCYfO0AeGYWA@LW7R-bsP~8<+6@XO_gQ*0j2WHDgqPFI% z5g~Ic!1dq)00+2JeK;K75*{tFUp~&2&RmOee$M5Yme_RkeZ~}#8S$PEN=9bLntV3) zn1YfTG=K|tcxiIh?BFHtlpkwG+>HjmEt>&%JL=Tm=50>O1VB_|^iY}xCcu5Qw zN0W1aYwc<6YtEAS*C;L(fx-pz3*4l+DE?tf%KN(RvzMfJixVe3q32~h_`?B;jL+PD^aD0Ba?SEnrA1=yF)%xEPv$OP z@YQFf<~~bt=m2uvUShinemTC(+@#^k=hBzl53Ksp6qVzIL&!UAowaW!FpPjqIhM0# zCA|}&Yv84pRVSjztZ-*@{mh{CaYKt26mgRUM+A$t?PvkeA&@(uLg(|;O}Lyz?7(EN zg&2oFCic(R@;8zA;IABbp}58(nRceeFhe$=7}4Gn3T`*^=4>XTqB^%PeC_k48h{iy zlJtCQnC^f|6lh#XXKLZ%39~4#;&Tv11z#+R5H??rH79-kR-sOFB_ATW4-VIO&I%ll znbSSk*Qq~EaMz;Dh-&hx{8r9Uk(hOzKNm`8&b^CI;jlDoUd7w0qQA=q1(Q1MW1^l= zrIAgLjDw*RVd-5I7@h+>!~uiq%`yC(^mjTWkt(3GuQ>hkongyluN(B6GbFczZekRv zz@%l^<@^9Cs%C8LxyNUluAuwSN!7LnL~y{2A6ZCo0|`=TR?rHZ3-;=?V0dm^A9zZ} z`EQ-$GcDF}LMVOWIMOquyglgsyFd$^<^BjCt}mKgTwCyU8uW|=e0*wD-?>P2zXeic zUQ)B-pDy)PrAK(Kc)m0}7*osq?-fV$+Q zvF#c~QY&e&k6F_qht`LaB7*paRH~#vt?^&UP27Bz{Y9NdHD!ln4YcHm$JFB$%Y)w~ zD5}6RDWSn%IhSj8nQ z%qT#WpjnO}mYmbZwtVtxu#xY{@9p68fFH$ZlN8D_VL!U`N&_YE`{2L0)wLpc%%?*w zPVt+(pGJSp7N*OUL^mzf7>&q(W#CXEvet|Hdcf)0k{<>ze)J{ zw%U`yAF-ymj;7J+Iv(kGur)8HI}A-E)2uOl8>1r)UEIt9*AvJ}AJp?8qc$wn)Zjd~ zT;dg~FQW|Y1^dd{d*%v$T6hsJO&@^W>JxU&2hhtkp*!R$%!8uanmBZpO37b>VQYOf z)g5Q4@5R3!%J~a!#qM$br=##m1P5#G*o=%4Ll@g~?VHFPK;U~I!~2McwU^I}Eu^P` z?~jDz8hMsw@u1XQ34CJf`Gz5559YL)Dji}?Ha1Q1cLxPMwx}n2*>eOz?rxGA*&1?N z<(2i_*iSyDATm^*%L7B-V2#n7K*?D|b5iBzMz2vtWP8;uvRs_ib1xK5oH)>3d|eE{c6BKYkK@A zBW6~R&sVfK7)z@c96s}=oQ^3JBP5~BHEEJ%UK;BycHr0A`h5FMt_HHPaP<@J^~)~n|YJV@|!9;2F*T! zHA`~9jP(DPF8@C=ee^r!`-2-ubwIx8R5&~r_~}~r_vR_dO%VIYisa?Gdti|`vksg}s1oXHPG&9O=3}ci{SFL;M;SphTXD^;nF@=YvR-TCHkjT^slMJEGevG&UX}IlNU{P|4gZ(DtydILxMk1fB@a+ zT*{ae=0Ewqy;B zbEOAo`iB2~(Tts>k2PPsl~=dNqGdAsO-Vkfy~qWWh|!NwtTuG5%a280{?g8w&MDO~ z7xm6_5RMZ=ovBdBr9a>eb$?rWeRZDw%{ zZmk^d>)}wRL|#CkD7_3ca*uy}hx_xD0B3-j;no|PUw!dcFT;+0`p{_jg!`RHEN>Nq z=JaqLk!n@q|N1JT?i%DNEa;IA)7w{Vmv3dOUgag^qPD@y@j5kP$EZbK@YZyI{Z<4* z){w4SKgIMVdy@Vo6{FbhrQ(^m504wZ5dI8~RLna1t6?9IA?w<}8XJ~-WW?{|fB(2U zA2q%8(j=9oT1WQv63kzjbb^^MM%vIM*+$_)m~Xue*qQxG*6$VmpSk`gFp`v{lZ9oIEdM#N2D2U#Tmq7SuVCn@lGe#t zB%iv2$YC@izZh%oa0xJsXIaxJB3~bvt6TGg$t+!*lLjU&+Yp=VPbj27sNEaPJE$o|@z)z#*ek0GXJL1sr>lwb;i<%x?H zrqS-W0lJKh9)OJxb{31OdC%-D78eXWS*z2}-6vf}zV zB4mz~!&k*qqt_fuLuW9Ruj^?ZBOXVE4$}f+=*|`JEy6_3_;jnuVV7vXqZoiB)BbdD0hUbu}fJrU44P&7FjWZ(3@<+tLbM5Suw2Lz|&e z#}B31vp;b{EeSwh<8$1o4g}5UIw{rDjK_3H=RwCAd=&cJrdBPDLjwo>T)PM28i&BjiaA!e=+?@SlVysZY}m=Jv=mO!yAq-SQ8%8O;_ zds%ejRry;cK89v#}4mhvgAD5Bop6|iyOyPTeIuF1k4plr05p&h}tTqYj4r-Eb1iZHT{#8#L1@4 z%*b1Nzy3S!x^y)}xEDWMMhKyS*BD()Q|DwvPcd&*M3R&>$rHnxTUiy%raFAU8ire#VR9qb_sP2}#=6}v zkE%GI{UB-LdHPlDNLtrO@6vKAT_z=5UwF%~XE|@i%HK@i(~Hf(fhOKARXjYPfUKl* z;nu+jlocD=fDH%sC!U_8T+%AC7S~!RyZZdy!(1TN=&gNXt;2y_z^z~TV#9Vpk>->e zmQa16%(TJg(}V#-q}S^EOI!TSrbL?|Uhapv|M{y~iQbbY;qeRZm!(3%E4_c`owE0{ z1~D4kVK}L-x~$A5nab+cE^A^CwIHPM0e>DQwOb_KFoHFhOpXO25i5sn?-~_~=WM|J z6d;qDot%(p6)+6f&?|l5swrhiO5(9*mkSFrSGnQ)Z1y-~GMvyzDySGllfZ6L=F^#i z9(kK-NgiXgscJ0!CK*x|ITpms+9eH&IU{Z&jG=Iq8OIiq;tisW@Z%>X;{l-z5qBQy z;N?|TvSC1lJEyS*Gg_We)_JbR%v4%KGXd20mtu_4E-PbPm>w+E4sYk1Mr?R+(A<*n zn+kFTGmG%^*Iu;gGrVt0RJH7ezwXON(PzrXDbkvE#j0gs?Uz921(!chu5GE#yL+=v zoPQous=C`O<5SXG-vdqiUQU{N)K-x?b|$#8PRWoJ*G|?*hEShB{Df8^uX`63l}>7T z{5V)}-wvlyUDgY0uOInggsayFt#O)AURKlNNZ_jBo^*0jleyY~U6^b#teIw&wA49A>*DHYSW(_qyiiIecSU7lNF zabU``Bbe!ZK26)tEF;tWufTd4vL38@|Hh@5% zRr(v4uklUpX^PX3XaYkMaj&9)}bo``qw) zFt&wT5d|^w?~L|-`a**O43)MMcMCNG2%y%K!Z86P_o>eYTa#AyAF1?+$h)~cvyKEH zjXpG$h1>S68d{q)b7}=JTw7E2l~Zf;YkkuhtysAg0t@@?{0m*29FU@3LTOn`Io8Gp zxB*WDi$Lrb6=p<50Nq%x3=1eY-mNY++uSo_iL|3%qQk*zkWdA zFk6$ztI&%_R+l(s-gR}{zVZ1@oj4-k_3)C8kkEgE>sR*o{)nG^Dy?uvznk#ekg#=> zH`(Q%okuhrZ!5{)#{3@XVP%>;RJ&r2wxUaI7Ev(2=V3THIepQg_CXt4N~HQFM?q>I z?ZJCyb#NQN2;(caD_qaczK(2$Y5U3Vn_9?3yA*rMdRTft)h zMyacm@YCbPg?U_i4A~ zRI-9b*TjR`wGrS^ME35GPwG8@&M{ej6C+A2{U#{^E`m`%~Us*3aJ!ld^F2BFq? zS236HOxqyGISmlgmd>9n<~SyeH;wi;!D*{Cimk)-T&DldSN?wo25vPxZm%DmeCd!i zB0W0H<8%voX^2Ny^g*E-u?m`I&AM^cz{W0f#FQ`CyTE0jJgA8ks#W&zRBQ0f(iYM&HW{N_**IavwOl5wls*f z+^8VJeJ@-EL);KZH&6CMORs9Ho)p!${VMC9Cizn*;ERAybPJ{Ip+xK1nt1k&T7wH* z8=A=9T4L#d{xz;+S8zV3< z9G8yzD7!F#?wRE33b{9a%aUIEHCP8_u4?S{hBEi$&9nK{@zQP(RJu390`TjiQT0VOL;k$duiq%;&_n^7HC=2 zLneoHJeoeI6)qR2>gOi9KXOJybDL`re@Z zzjPjg&uprfpe>Mp@xx;j_x!MNoQ<~tV``#7c-hzGuaTr;?<&N5>o%4%XZUs9<}(fp z0R3bq#bF^$narZX^LN?1h13_@SL@4?ClDV6C>-;wRz*y)_w% zN+RKLGW#bHdS-R)hS-y$kE9yD^d}NKTT^buhMG=q73wm4{+@;usH*kV7o_F^$6bl* zYiiOx1iSX0{uZU1I;~pvQ9%kd*impmEx-3|M9i(Y?2t_XWAaG;=|QZ;K(4 z_@pFmWl^XP12cutHpb$0LUP3K7M`x*RL@3G{n(pA6~6$E4;scG8bA8eMAStZ&E7ze zV2D?|rMml=^2wGALCJ+>U(B|J1O(Ipkk20O{QdR>CP9*265Cq`35OW>WaPa)uB6St{@KhW zxLUtZ@Hl$}18NF)17)4@{Qbr~J(@6S9d`MaIk)jm>*{c!)_++^{{O6`T=KH1)ow+J z_D>zL>xobA;oo8Vk^3^_?KwiUI8BoM=qUUX_M9?}TsW z@B_S#ctea7;P%>xggzBe7j%_?>&I}I?fl+P%%lRhv%Ki{vu=3Xrp{DBMhf51LIFFV z0Wh8LT(?Rk9R;$Si^D;Klik>;*t#ecqf{>)A}D|O)Yrj4A(2kcPL)xT0GxtsVt&S9 zpH+L7Dgkn_A~o+?Y_B%AbjqC<8oCTZpGQN*Afq9OS5ue`=vCLuRKy&g;j$D=VO4Fa zycu}1iA}W$4t##{G+_uHC4AB%SOb(nt zG0X)(U;bpSE+umv@X~OCBvVvfZEt6T2*pvsJ9rHX*Tx)y&u_1zmyL(aCZOwxB#7MK z2TRM9NVTVxc6`NJCAmo#1>obm3DAo$`J2AbIy&v_^k2VmDb*$LBWu8A%XEnVWl2!Z zib~fkdnnE^g)TK-J+PhA`}yBFNOQsSDd(&(cDx(ptvS2HYp?s}hW7g+bP)ooImZ$_ z59#U^_PmN1tEG*}&c`h44`($yA&gmBxa%n-$~qX>L)R{{cEsBnb$fJp?62?M6c8Oj zLhJfCG(p@pvEd05vZLE@>t)7mMC67~dyI|Dy6$&eLRl-v5G59GGE@cCT~-MC&#GBP zXGM96iPS{>Y)@vBWU%VK;6u)WYaOgYnH=Vttmp}l#B1g@?vx<;hSon#LskTq7XPI( zNbH}HCMlEd*36ZwpZ4L|%*1q zi_%pa0_OJ6LGMl4t&iqw+aep928ul9kAWE%hL2r{E0`(#o|EJ>hjOW&SWXULqt=(# zkwuHpo90c>`*rYi7UlHV@TASGU7v0Zv~wkWtX4PuHtql(_8X=S*IbeO9#q>=T9ZiN#*jJzH zX27uN(HNhk^h}*xerJg+ zrd~#Ti5kpV;-3#6f7A__SqjiGcXU*VwgYQn4J8bX4)iOgWI60z@rzSrND+pzDB1FE z-?!|q?zveOuKLi-Le|Oc`2j$?r6E$P>>ccqiJqdiyhDHjzyhLoqy#9-{lwPz&4YO< zU1C+bU)3R%xnW2U%S1iR9Sjo)kD@9R8r7ZUdFDW5-q0|$Ypx-77-`shQZE4wL@zoq!X!tjGc;@a0W^~jJnS8(8 zd!0#mS9&LF>gzWiZ*!8=_8BAePoL{`QLUqL2XSykXdX;$K?ZgNmz9dkztl3+Et%@k z*HuDe8Yb209QN8xHLx5TLHi}<(op`*TUV#p+$|dZ?a1l1VGOOmo#{?EgQ~=oK7dR~ zQ?6Ojb~Rw4w&|+gV36`*-pl_o-S+=sirk+Fq$Ny$K>8hRqLY`&0`LB$cdEKK8Pc}u+@7eg)+DQ?Jb~#)9_$t&?MI#gt2zWaYQ9DvGnCmU%~%%> z#w4{F@iLHzi|p-`s<(*lmugE=Lo@8+ z^H&urth`d~4B8Ma`q)%HyHobXFAh z2I{ySYVu#kT*d#4Ii+HJHAhqK{a-HKbkZ8H6I)3`-dSEc=^45gFeFUZ;CN2eHG9I< zb~a8NPKI|Zb%Pg;|aR1qC@iHo)4>n-u2#QQ9^27@uGK7WMPJS7R+ zfia9Lu-XE0QDqv2y3N&96KcE#vmh9|1x6x%tHWYaqBafDEY9oQmg&APMj?X^VQ&?o zQpR0;nfn{(*JPB9uA&w%Z#2%Xsz)xn6_uAYsu+xJR!qEe2q&Z+2#4c(1e zRH}mQm(P6}WSs=ZS$9h=2Hsp1^sj_rn%bH5#oYQE3P8<;hh2Pno>L5M-0x1fqVPYK2rbz9DF5X(orv|p-zE=YkA zd^lG6rd*o2>YgLpyHpF2`EX*W!4f*<{!)^SeJoBGyu6oHiT+MNX`5B0ihmdGks2!i z__4T-ERc*{sM2162Anl6y1qcF1_4RL$H zko_P5?uM)O!frxjuiF9PilitUOinOWfhaxi+C9>Y-WkAJCdY|d?uQd(f||d zI~r}^U-d^!J@o&V`HuddE5cLuBTTF5?7pD^zwrsWwcsy)vBY5mVoa{wp^WNo*|)a?2IvNA7>;{||8 z<`aDfF_N+0qv{UMDW{#)(8SkpcD&%F@FcW3-Tt1n8QCW_@-qDBYuZC5x-~1FX&tyY zA3OLWA+){s08{r@1WyIoJXwISe4$8pl9WDQL1z5oaZ@23%@Pqq+M&xwZAQhHt)=+e z;YDCxudInNPDWG{LtI`vL~Q6Lz-| z@6MK8Uiu2Esn!Df3b>D_B7ELqbXdl-GbZbRy)fU7;lTL|RK>H*kOuIbx>rBjy zf!QtnlsBo0gtf}LkW6seG$8OT4hI9;mDbP4;xg;wOJ)?ZK%qMjMq>G*)KJ?UE4>Pj zLit`|LH#1{()SBJC`Wb@DaP@Da&=)W)iw1`?psB!!D-9cCPo~~id=b1Cve&Za6R87 z-9&Iwv0A~8y$&K!0{ntqHDZK=$qJJukUKzc`h{(8fcz;x~e9|ehP0w1{5nUW8Js9qcrA6Nq zwhXyot~jLRPlE_m2`QfOQ_v9m9#kxA}h3P?? z_wlGNAoy=yZz9=J-Y2rqKQ4^S*Oj)5gzd>kl<@w>S(Wc`y#>yOmQ_y9kF4b{=>$EO z2K54&CwEKeItb#Z{MGRE64M6-To~i2`}gWCg1t4q%-M?2HTM1;txee~{=bJ1rM~?? z!Z%HnP5t5!6kQ7C34ccx@cYCx@+)!UO2e#u+CloEe}aXw>b?=*W)qL+e)LOe=a`1# zGf;ds{zm6pRnf()beug*2B9qz$jJ*jR49=pjrl`%K|`xXn5T@3_gx;TO+MVTF9^cZ zL)`;hZXL%o9m?l$a%?T<$E@7l7BrtwX_&50N!Msre$7^gfXQh-E2Va=Hsz!xy znzf57@aDqGYaBHW9&?KW9==^ces5AS=ehn>t&+OU4KT$pO>6#$7ts)}opf@+;J-8tDK|rSc}?I)_YoZd0}ReqmH z)?c%)7mI2BaxQl6NeVt`fqDJ(qg}L5Vl)mq&`gSii^Ss3Jc_4Jynbth%%%P1PTr;Y zojIv@@B9AWdAR?PG+)~<+_O^oEfo&RhoM3teF|hAmc&#f;peiPV)kZ%S0e8vesBstV<_Xx z)OTL_QYFd3fJ>UjR89FPH2qdalah18yk}SQ3?=#ZKG}O|yAW%DmWUgIBFhZ>A@ zs^qH{dj7Wh`8DDpa7^`zAO3MDetP$jvR&(dP)oP8QsUO=;pu#Q?S0(C0EPNk@NPd* zWkaCzrJ5$D7^-dtDlZ;7!)MC0_0gHDKmJ)pJZ#MZuuFAXxsM*RKW2$b(l)i3imxq} zo)nfEB!WGr<3qMQ7*41op^!?2pbJnS5{en@X~d5k(5&miQqHF)HTUl<_!Pjm{?eftk)`5EUkAp&a4iItL-E@ zKYY%ks@2bJUG)W|J%?PWf_RrvaiKM2s-1FKomde)O(?R^k}5av3XseaHUmB;4F89l zw(~P>z^i<}x9l{ZfCiU2(l2sId>%^DxqoAk&r&7Fy%C5RiQ+A1)jey-c@$Rv2EKBg1fsDAdLoh4em4+G(aHG zxO)ih!6A*iH%=4$B)BxtGz6Dm!4ur!anF0_o!oo=!29s(!yco?sH#yl*V=Q>8f)*l z?a4)A4yKzLTSD3t98x2-ac$nH6J*KdF_~R;P`=Vu_tcQ$wBIY8Mm(KboK-lS&l()9 zEWu2oie^aSq@bKbk=IVUm@>H&@V=UC$0@D+GV`T^A@V<*Iq3=hEWi5nR^r*xS=U zONT^Wqznl&8}%(lF@bJ0yIPUf2Gn~-haTIVG8N1Pb3`tSO&0TKrJz1hwyVPuLXhh= z8ux+-6|2ef5try2e7pn5{_Dx`r|$vUV@7JBi>`YG%MoW(DuK~fn`LSM?H!DJ z^c?)axUZ?Goe|Z%yuKVS72eXw-m!n+u$i>jko=fzwt%WLR7_+a;s=(isKl%+SvJ(D zhZm({dnZwrlwUpLrB%#j3c5h{a2Qn7qywujXsRz;eTn#fO>Zmg+lK`C5X#XLpHVUqKC$;$2j zT&(2m^RK!YP3}`ah)A}EUw70ouy(xt!1-q3=beK5bOjo<-rl{U^YOl}?$XtC;p9oH zZ&>owtxN;Gfs1AyrEer@ua@-Eh%3emai!N5a@F$Mrum1T!fBUhP_3wmOeLB_OSj%@ z(uTpvQf*=sMTg3(h*0_E6BP!dLL5j%yqBx6E=hmORA z8?(I+v^RSA^6-E6=SXZ<%g*>Sg}J#iYy#i zmwZe|@TF2{Py3EiWRf7YnaT|s=*6d(QTwmPVy4`|9K?D8jKZJ0buwVdrgUYk@jV`h z#dTfd0~sggQHN~yFRxFC@qQM;YX)8rOX3pc*qHk+!RQ)WNf)`J*Y*2&j*8!PP{Jmym6y_>#9RImAw#KWsL%#`IZ$ZQ8Km_ ztFj>GBTnUu^st_C7g3Zz!p*$xv-Nw4TTkM<_;DsnMv@V24gn=d^x4}<-d5%YU3#vb zRZ@^;E{QD1kP2gLWVlB%VLij=7{;IY5ic2GPeHUqDlDPmR2h{3ZB#5rmpG0F>4AFk zN1|NSSJ@B*2y7FLzLL>GI}*}=rY#zKiOo`KB3AVZw`dOjs{R8}*fCGZS5`L4X!zlK zJ_)Ed*I7OuA69b{df{M%B;Y$FU&dn9Yq;V;SX|>bz1xoW8uaIc&=DU)cu2b+kWCpbrnl(6rI>$>5K2 z=~&!>;=y8!eJicb+I7-ga`LN%Pd^H%k;H0UPgqAu*{E{H-U{7gFwsh+%Hb%Pk(P>v zJA`1mh{3Sl>BbKNb!~vfUqtnywpQJybF~Ey!lPkhV*t_boQjpqe$;x~dC#o$_(b&H zs@RCnMm#zz8)f9_^Pf%Z+DJ{yX?yT5OSAlNdl^&iOcjnw5FdQ!s&94^*A6-mQir}6 zubS@P-@D{bluP-?m`w05{mxiteyw1^LNv4q?AG7QUXqj0yftPH0KMiSyFv56D(qD7 zUr2-;o;#w1gXTiMVioIo7t(QSiuqI83d5e~xp1Rou**h|6eT1yqG4rX$G>eR-l>uy zEsEBmkB>E0R3=(PvZFulP2qSx%qJolJxpP|U zl9vgS)8a}d1Yz+Hu&{?S5L627}mMqeMPy2NYnnlp(5SsZAlB`Y-^7K<2lu; zj60e@Msb;yfFZNikJV!WhJliF$Id{-2xxvW^pmT>(k-%o-!L7x`izzPPH9l&AD$G> z9FM@=@(C}4(sJ!Zh5D^J1A_}3>3-pfUkv%|x2OW_4SpPucz3MUw7T;Vccy^^GSa*f zQTw^5KF$Ey-bJbm0;n$ucLlKM9ef4z;pH;0Q;*5AQd=YCKmsPyJaHMvoy4f*y7q5L z@cIwBEPPQmVLH*0!wkE!6~S15RCxjqq+^V8G}k0~5&cVP%Gai&p??JTMq?}f8e#;Q zh>(VcD?A^T77#_N)RwuGmPUYS8+2mX=+w(PqxxoL;9ttvsKph;H0QRXnP5|gkRrpU zaB_#mqL@(T!rQba`n*{>!2y}q)x2dzn2u7WeCy1dd8EbAOhLD46GfYu4nslkARdl{ zZEPGZb7PI5*0RTfl##^A;mme*-P?bfBS|y5F#L&^sF2!L+n5L7k|gb$FeSCg14__^ z`*{F=%e+~;Q)J^c^iJzwi}F-6QNjON=Lfrap8#AGMAVe@J$-=*5T-)SFYcuCR-PwR z^2_^E)CemL%#WXvoYSA}ZjOG>Fx(M|J zxUihj7NDp`COMr0KMeom7yv#Gy^+5UB-LqAP<_sdBYj!@HtfHA9GF~T^0ZQ z@fhDfo!Fs)JFr|MrxX-Q@L#U6hB7V8^z*W2h=FQwGQ~$U3d`yQYJJeR1k03)bP&)n zQOcMd;ahzFm^wc;H^8Aqm_OSOLehNv{(@^7T8HOB4RNB#olSMFi8g{#s-9O2uU_jG znb*^RN=P>=thb*((sKDLeFg34<8M=JeaH(h$bB+9?wN?O$=C{)mGq)ETzs6EiyTSA z6!H5lQBQS)U(P9&dCBNGlwEEspW>Cipq`WN3GDQ^Obv#5sTJG>TDv@M5aOOoAT z^Lx>HL$I%Vx$#Eov(O~=I|S+s+mi4)In18CAmX}eP|x$AykCnz=6zw{=OBCQmt-71 zAg3Ft_IF3MIM8&?WVU;7&M&vm|53pHOR;eW^-w~>X)I{t(H3sBsIGmxz1OpV;RDn) z$JT<46<5Tm&21E|tkbA^+&fJa^WQ%Hy3S8oTQ#O|Q6TXnZ>CNNp4325QJ#bIhZ0WL zB*urZX4(oDvjzoxB4s{L8i3+Wame~vpFKGL9J5@PoDuyf)i~}Wm>^*_K1(s6da$pa z37MNm2}e*2(2>aKnQNqFO&DFdo?tv96jF*(q4(3p|IwuEmpPewN<8qI zx&>-AK(VmyD1Os*)Io%g&LH53=+)>3RybvWuf_xJyS6pQPb3o_IRk>9X;)qf(={+6 z&Ul{VX8;xCR%L8u6DpN+b1qW+h-<$9I*ZXYM%igD?)@RPJhw6{I5VYEw6r$O01+7~ zSx(YfetuyfWbNi9UBit#7;+dl`puKBNaUy-*)7}8lW)3tY4Sy7+fR56i9&lhy*r7P_qiIfo!px?$_pB*^PqXo7S9hbSZ`GIR$v=x5BBH|e~s6?35*yR836=Z zJJ^>ugUSz%h~JtAnW3FHjGU~iN1vG{9{w6ZZ2HN0vvmdKCwEqHHr^iuZ(sdXEabjT zTR?QT#ya!S(fkh{kH`eGGXCm@R!Al7xx*FdwJM6+u)qmsFelT8c#z+H2e8T~xC`j+ z_s4jKX^h;>H*&M3>KGyw0|;YjleK>Bdo<_TLmUHKil>M5 zkeAlUR6e*3&Pa7EP9z>>N)Vb}F%}P!+3kSse^_b?h^Tb5!?5 zwfk#=;qwz1<&cOl6MYH<*BD>qkIn4~Xjr?)nF4}Is+B77qBdbzksUdC+Qk4NBZ|AD zqg^IUDY)ZpvoUw+*y`e@asG4q93G*WJXgBdMwgy9`g7VnSz9?P9q7pEX=`t%%GwO& zCl>XfvywA@>q%7v?S%G1NaPh^48fJAW}<@J+x1)iqs3XjOdMsUjqc~3rFr{h z3Tjpa?Pmp9&TE(+e(42z*k1wug5VJcaWAB=YgViemfVJ%kUq?XnIMb3d#WJa;YFNh z*JFE>ad(?uo+FKE9o3w9%B}o-Ty!AAg~2^c92)F-kG9_F0G`{@5_^vM`3E}$DA$xd zP=Cq1oE4?70NG8Uy@j7+Y)Ja8F=2Qe6xz=W-boM9U=t9-hfos3Kv?ytNvC*BlyLE}A5fFt9hwzS{3UTMqEkzP`~kIgAcE8xL4QudU}Z6R0zps&WO;Y><`% z*geWIr_N~Rj@)ReY5NoiRBy`Mft*1v7xm`o7E;L)IEKC?h3&_81MdI$Zuy+=2j?z@ zN*Q}5=0MQaMPNZ-hDq*V;nLxB(=hVi{U7O>WbG4+qZ7=-)tL;;lStkwgCL2Pmv_kAa;2QhF%IANqDwL?)|dkSB{c>l!gB z5?_v_8Cs;*Q*5W%yj@3u=&JN>a39mUQ4;f~hS|gFs8a+Mj4Ya(OhxB(^Q^wT`E(LV zDG#H>tJ0@|O#xL^%Zf5x${(C$E95mL+W1Wr0*u`P_+OCq3%w1Ph5UG~*n3DjOd4bN zuCeL+x!2heCeHi2guA5mTCtojYq(t`0sOzQy;sf?3)h*Y2F;7$sy>L)ONkQ@7vEJ? z>(}@UHCy*RX{s#Ty4Nt0jnFwLF8F8!?c}DUIPGgXSKAEvECs)nY>{BtuDifMv)X(k z=o6yxqmg=33qQ}Uv!?1esU*3A73#z``$C(4JrST;)OLB`8O%%Wl)R8%UB_YXCUdyJ zMlQB%Ocx*GrvZQ4myW7=640(sw?2RD=e81(y_Avm?n1cl$Ic8{Sn=dwR3C}bWysCF z$b|o`r}IU@h*xAJXszs~d3El$4jEAR7%8IY+>flO$5@d%_GCePExvmTI_!9U*_6l& zdUL~0LyLae%bCmEC#no{qmifBg}HQ1p!-Qc5h=dFtlcEyk9Y9o0)>8!e7+z%(g1t_ zOv)P+L;3V!PiQz>BA~9g=a#>gZ`|(}LYG-Rl^7=-*U^APBE_~cvy^$qo8OvEYoeJP zLqs4cwUeObStopKHOmrWa^lfvck4x!JymJyE^|qIzbolz z^o|ft*w5`RO}d@x8snOOC7XR%H@r0t+C8A{KARxhjQ$N)`d{E@wD%9EQiz3e>Q#mCh%~z!~*X&5GXJmqDgOO=dwj_t}xZH1SSZsW+Pc6-epN9IhIT#~IJ0P*cz^8k&q+Xqy|G+IQ=eJ-&(x3_&0 zFdHc!S~?dGuLIL0P)Z7%qhykZh_o@7i!?DRDzrRbWs8DT_c-t4x+;#}*=ydm2Yo*f z@$0j=*m4k5uMz((pwg@LkFP|Bbu!keRMPP+MRmomwL`*PvfcGy0d_oKm8LJVpwoHm z%F8J918rlh^Zi^+SaI>@AL*TyY4SKx^QH6ec}lhly0a?)nE`gwmBp&a>mRt8#&Ng} zG!wYn&%@l;+?#v9qw_CyB`F8}j25~}a(DK*T?gX6%fFr=`~L6IQ+kFTn-J#e-K|_? zR`;zE+!bK6O9f673W8*VTPMmlOA7sQ4fwdOTm%7#XolB|xI<9f;)+aAp*}jz7P-}r z(Y1$X{b*$ruoYO)%})X$8_Y_u7idRKAIF|`=iWtSL4#~#?zH?km6X zdn@mU9Xj6trkN#Ee?jjSjy&4GIW>5RUD|N5^Wrcm=-995P3?w_=8u*`6SiWfz^d#n z-vYQv2IO)3p13<+Um-wCN??P|u{~OaNbBXBfCp^Ke;WWZ}kR4pFg0up=(4c$>x9 zPN-y*GjcLXmhjHGcPVkRnpwOW-_@IvH5%409Zpu174E$po}?Nb3jT~+PhpbO6IwM% z#ubgACD8n}xZ>;o(eyk#!Tj__F{6w6Yk=zSoZR)u$v;+#SkE!C&azqaz)~ru-PfI< z!*AZht;TmdvI>MdwBQc13_P-H>*v$#eF|CzEFcuP(FCZFLVq_YqNd+=&#B+Z@g>dP zLLw29yPGW=yMHLj&bfRqjrcLL=J-w!hJxnZ#2%f7cs=(}IKlsl|HondfrOspIQA&| zDMVpNdw48&hq5e|>lVZAsv~07jrPpZ$I* zWBdJOAeC53ux9w*S@Q>wTiP&S*ZGL-0%fl`+uT^^LU*#IJJY!P+8BIrb(fY2E%3XG z*IH=|qTBYrfAnax96sDOZ4na}J&Qp5Up@W!z{qnrV=}WQ`unH<`$hkw+yA=f|4)C1 h{{J`{4+g7JNUF}5Jm07Y08btdWqFNPHL`C){tE;(`Hlbp literal 0 HcmV?d00001 diff --git a/trunk/research/players/js/anime.js b/trunk/research/players/js/anime.js new file mode 100644 index 000000000..4f57877f1 --- /dev/null +++ b/trunk/research/players/js/anime.js @@ -0,0 +1,8 @@ +/* + * anime.js v3.1.0 + * (c) 2019 Julian Garnier + * Released under the MIT license + * animejs.com + */ + +!function (n, e) { "object" == typeof exports && "undefined" != typeof module ? module.exports = e() : "function" == typeof define && define.amd ? define(e) : n.anime = e() }(this, function () { "use strict"; var n = { update: null, begin: null, loopBegin: null, changeBegin: null, change: null, changeComplete: null, loopComplete: null, complete: null, loop: 1, direction: "normal", autoplay: !0, timelineOffset: 0 }, e = { duration: 1e3, delay: 0, endDelay: 0, easing: "easeOutElastic(1, .5)", round: 0 }, r = ["translateX", "translateY", "translateZ", "rotate", "rotateX", "rotateY", "rotateZ", "scale", "scaleX", "scaleY", "scaleZ", "skew", "skewX", "skewY", "perspective"], t = { CSS: {}, springs: {} }; function a(n, e, r) { return Math.min(Math.max(n, e), r) } function o(n, e) { return n.indexOf(e) > -1 } function u(n, e) { return n.apply(null, e) } var i = { arr: function (n) { return Array.isArray(n) }, obj: function (n) { return o(Object.prototype.toString.call(n), "Object") }, pth: function (n) { return i.obj(n) && n.hasOwnProperty("totalLength") }, svg: function (n) { return n instanceof SVGElement }, inp: function (n) { return n instanceof HTMLInputElement }, dom: function (n) { return n.nodeType || i.svg(n) }, str: function (n) { return "string" == typeof n }, fnc: function (n) { return "function" == typeof n }, und: function (n) { return void 0 === n }, hex: function (n) { return /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(n) }, rgb: function (n) { return /^rgb/.test(n) }, hsl: function (n) { return /^hsl/.test(n) }, col: function (n) { return i.hex(n) || i.rgb(n) || i.hsl(n) }, key: function (r) { return !n.hasOwnProperty(r) && !e.hasOwnProperty(r) && "targets" !== r && "keyframes" !== r } }; function c(n) { var e = /\(([^)]+)\)/.exec(n); return e ? e[1].split(",").map(function (n) { return parseFloat(n) }) : [] } function s(n, e) { var r = c(n), o = a(i.und(r[0]) ? 1 : r[0], .1, 100), u = a(i.und(r[1]) ? 100 : r[1], .1, 100), s = a(i.und(r[2]) ? 10 : r[2], .1, 100), f = a(i.und(r[3]) ? 0 : r[3], .1, 100), l = Math.sqrt(u / o), d = s / (2 * Math.sqrt(u * o)), p = d < 1 ? l * Math.sqrt(1 - d * d) : 0, h = 1, v = d < 1 ? (d * l - f) / p : -f + l; function g(n) { var r = e ? e * n / 1e3 : n; return r = d < 1 ? Math.exp(-r * d * l) * (h * Math.cos(p * r) + v * Math.sin(p * r)) : (h + v * r) * Math.exp(-r * l), 0 === n || 1 === n ? n : 1 - r } return e ? g : function () { var e = t.springs[n]; if (e) return e; for (var r = 0, a = 0; ;)if (1 === g(r += 1 / 6)) { if (++a >= 16) break } else a = 0; var o = r * (1 / 6) * 1e3; return t.springs[n] = o, o } } function f(n) { return void 0 === n && (n = 10), function (e) { return Math.round(e * n) * (1 / n) } } var l, d, p = function () { var n = 11, e = 1 / (n - 1); function r(n, e) { return 1 - 3 * e + 3 * n } function t(n, e) { return 3 * e - 6 * n } function a(n) { return 3 * n } function o(n, e, o) { return ((r(e, o) * n + t(e, o)) * n + a(e)) * n } function u(n, e, o) { return 3 * r(e, o) * n * n + 2 * t(e, o) * n + a(e) } return function (r, t, a, i) { if (0 <= r && r <= 1 && 0 <= a && a <= 1) { var c = new Float32Array(n); if (r !== t || a !== i) for (var s = 0; s < n; ++s)c[s] = o(s * e, r, a); return function (n) { return r === t && a === i ? n : 0 === n || 1 === n ? n : o(f(n), t, i) } } function f(t) { for (var i = 0, s = 1, f = n - 1; s !== f && c[s] <= t; ++s)i += e; var l = i + (t - c[--s]) / (c[s + 1] - c[s]) * e, d = u(l, r, a); return d >= .001 ? function (n, e, r, t) { for (var a = 0; a < 4; ++a) { var i = u(e, r, t); if (0 === i) return e; e -= (o(e, r, t) - n) / i } return e }(t, l, r, a) : 0 === d ? l : function (n, e, r, t, a) { for (var u, i, c = 0; (u = o(i = e + (r - e) / 2, t, a) - n) > 0 ? r = i : e = i, Math.abs(u) > 1e-7 && ++c < 10;); return i }(t, i, i + e, r, a) } } }(), h = (l = { linear: function () { return function (n) { return n } } }, d = { Sine: function () { return function (n) { return 1 - Math.cos(n * Math.PI / 2) } }, Circ: function () { return function (n) { return 1 - Math.sqrt(1 - n * n) } }, Back: function () { return function (n) { return n * n * (3 * n - 2) } }, Bounce: function () { return function (n) { for (var e, r = 4; n < ((e = Math.pow(2, --r)) - 1) / 11;); return 1 / Math.pow(4, 3 - r) - 7.5625 * Math.pow((3 * e - 2) / 22 - n, 2) } }, Elastic: function (n, e) { void 0 === n && (n = 1), void 0 === e && (e = .5); var r = a(n, 1, 10), t = a(e, .1, 2); return function (n) { return 0 === n || 1 === n ? n : -r * Math.pow(2, 10 * (n - 1)) * Math.sin((n - 1 - t / (2 * Math.PI) * Math.asin(1 / r)) * (2 * Math.PI) / t) } } }, ["Quad", "Cubic", "Quart", "Quint", "Expo"].forEach(function (n, e) { d[n] = function () { return function (n) { return Math.pow(n, e + 2) } } }), Object.keys(d).forEach(function (n) { var e = d[n]; l["easeIn" + n] = e, l["easeOut" + n] = function (n, r) { return function (t) { return 1 - e(n, r)(1 - t) } }, l["easeInOut" + n] = function (n, r) { return function (t) { return t < .5 ? e(n, r)(2 * t) / 2 : 1 - e(n, r)(-2 * t + 2) / 2 } } }), l); function v(n, e) { if (i.fnc(n)) return n; var r = n.split("(")[0], t = h[r], a = c(n); switch (r) { case "spring": return s(n, e); case "cubicBezier": return u(p, a); case "steps": return u(f, a); default: return u(t, a) } } function g(n) { try { return document.querySelectorAll(n) } catch (n) { return } } function m(n, e) { for (var r = n.length, t = arguments.length >= 2 ? arguments[1] : void 0, a = [], o = 0; o < r; o++)if (o in n) { var u = n[o]; e.call(t, u, o, n) && a.push(u) } return a } function y(n) { return n.reduce(function (n, e) { return n.concat(i.arr(e) ? y(e) : e) }, []) } function b(n) { return i.arr(n) ? n : (i.str(n) && (n = g(n) || n), n instanceof NodeList || n instanceof HTMLCollection ? [].slice.call(n) : [n]) } function M(n, e) { return n.some(function (n) { return n === e }) } function x(n) { var e = {}; for (var r in n) e[r] = n[r]; return e } function w(n, e) { var r = x(n); for (var t in n) r[t] = e.hasOwnProperty(t) ? e[t] : n[t]; return r } function k(n, e) { var r = x(n); for (var t in e) r[t] = i.und(n[t]) ? e[t] : n[t]; return r } function O(n) { return i.rgb(n) ? (r = /rgb\((\d+,\s*[\d]+,\s*[\d]+)\)/g.exec(e = n)) ? "rgba(" + r[1] + ",1)" : e : i.hex(n) ? (t = n.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i, function (n, e, r, t) { return e + e + r + r + t + t }), a = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(t), "rgba(" + parseInt(a[1], 16) + "," + parseInt(a[2], 16) + "," + parseInt(a[3], 16) + ",1)") : i.hsl(n) ? function (n) { var e, r, t, a = /hsl\((\d+),\s*([\d.]+)%,\s*([\d.]+)%\)/g.exec(n) || /hsla\((\d+),\s*([\d.]+)%,\s*([\d.]+)%,\s*([\d.]+)\)/g.exec(n), o = parseInt(a[1], 10) / 360, u = parseInt(a[2], 10) / 100, i = parseInt(a[3], 10) / 100, c = a[4] || 1; function s(n, e, r) { return r < 0 && (r += 1), r > 1 && (r -= 1), r < 1 / 6 ? n + 6 * (e - n) * r : r < .5 ? e : r < 2 / 3 ? n + (e - n) * (2 / 3 - r) * 6 : n } if (0 == u) e = r = t = i; else { var f = i < .5 ? i * (1 + u) : i + u - i * u, l = 2 * i - f; e = s(l, f, o + 1 / 3), r = s(l, f, o), t = s(l, f, o - 1 / 3) } return "rgba(" + 255 * e + "," + 255 * r + "," + 255 * t + "," + c + ")" }(n) : void 0; var e, r, t, a } function C(n) { var e = /[+-]?\d*\.?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?(%|px|pt|em|rem|in|cm|mm|ex|ch|pc|vw|vh|vmin|vmax|deg|rad|turn)?$/.exec(n); if (e) return e[1] } function B(n, e) { return i.fnc(n) ? n(e.target, e.id, e.total) : n } function P(n, e) { return n.getAttribute(e) } function I(n, e, r) { if (M([r, "deg", "rad", "turn"], C(e))) return e; var a = t.CSS[e + r]; if (!i.und(a)) return a; var o = document.createElement(n.tagName), u = n.parentNode && n.parentNode !== document ? n.parentNode : document.body; u.appendChild(o), o.style.position = "absolute", o.style.width = 100 + r; var c = 100 / o.offsetWidth; u.removeChild(o); var s = c * parseFloat(e); return t.CSS[e + r] = s, s } function T(n, e, r) { if (e in n.style) { var t = e.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase(), a = n.style[e] || getComputedStyle(n).getPropertyValue(t) || "0"; return r ? I(n, a, r) : a } } function D(n, e) { return i.dom(n) && !i.inp(n) && (P(n, e) || i.svg(n) && n[e]) ? "attribute" : i.dom(n) && M(r, e) ? "transform" : i.dom(n) && "transform" !== e && T(n, e) ? "css" : null != n[e] ? "object" : void 0 } function E(n) { if (i.dom(n)) { for (var e, r = n.style.transform || "", t = /(\w+)\(([^)]*)\)/g, a = new Map; e = t.exec(r);)a.set(e[1], e[2]); return a } } function F(n, e, r, t) { var a, u = o(e, "scale") ? 1 : 0 + (o(a = e, "translate") || "perspective" === a ? "px" : o(a, "rotate") || o(a, "skew") ? "deg" : void 0), i = E(n).get(e) || u; return r && (r.transforms.list.set(e, i), r.transforms.last = e), t ? I(n, i, t) : i } function N(n, e, r, t) { switch (D(n, e)) { case "transform": return F(n, e, t, r); case "css": return T(n, e, r); case "attribute": return P(n, e); default: return n[e] || 0 } } function A(n, e) { var r = /^(\*=|\+=|-=)/.exec(n); if (!r) return n; var t = C(n) || 0, a = parseFloat(e), o = parseFloat(n.replace(r[0], "")); switch (r[0][0]) { case "+": return a + o + t; case "-": return a - o + t; case "*": return a * o + t } } function L(n, e) { if (i.col(n)) return O(n); if (/\s/g.test(n)) return n; var r = C(n), t = r ? n.substr(0, n.length - r.length) : n; return e ? t + e : t } function j(n, e) { return Math.sqrt(Math.pow(e.x - n.x, 2) + Math.pow(e.y - n.y, 2)) } function S(n) { for (var e, r = n.points, t = 0, a = 0; a < r.numberOfItems; a++) { var o = r.getItem(a); a > 0 && (t += j(e, o)), e = o } return t } function q(n) { if (n.getTotalLength) return n.getTotalLength(); switch (n.tagName.toLowerCase()) { case "circle": return o = n, 2 * Math.PI * P(o, "r"); case "rect": return 2 * P(a = n, "width") + 2 * P(a, "height"); case "line": return j({ x: P(t = n, "x1"), y: P(t, "y1") }, { x: P(t, "x2"), y: P(t, "y2") }); case "polyline": return S(n); case "polygon": return r = (e = n).points, S(e) + j(r.getItem(r.numberOfItems - 1), r.getItem(0)) }var e, r, t, a, o } function $(n, e) { var r = e || {}, t = r.el || function (n) { for (var e = n.parentNode; i.svg(e) && i.svg(e.parentNode);)e = e.parentNode; return e }(n), a = t.getBoundingClientRect(), o = P(t, "viewBox"), u = a.width, c = a.height, s = r.viewBox || (o ? o.split(" ") : [0, 0, u, c]); return { el: t, viewBox: s, x: s[0] / 1, y: s[1] / 1, w: u / s[2], h: c / s[3] } } function X(n, e) { function r(r) { void 0 === r && (r = 0); var t = e + r >= 1 ? e + r : 0; return n.el.getPointAtLength(t) } var t = $(n.el, n.svg), a = r(), o = r(-1), u = r(1); switch (n.property) { case "x": return (a.x - t.x) * t.w; case "y": return (a.y - t.y) * t.h; case "angle": return 180 * Math.atan2(u.y - o.y, u.x - o.x) / Math.PI } } function Y(n, e) { var r = /[+-]?\d*\.?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?/g, t = L(i.pth(n) ? n.totalLength : n, e) + ""; return { original: t, numbers: t.match(r) ? t.match(r).map(Number) : [0], strings: i.str(n) || e ? t.split(r) : [] } } function Z(n) { return m(n ? y(i.arr(n) ? n.map(b) : b(n)) : [], function (n, e, r) { return r.indexOf(n) === e }) } function Q(n) { var e = Z(n); return e.map(function (n, r) { return { target: n, id: r, total: e.length, transforms: { list: E(n) } } }) } function V(n, e) { var r = x(e); if (/^spring/.test(r.easing) && (r.duration = s(r.easing)), i.arr(n)) { var t = n.length; 2 === t && !i.obj(n[0]) ? n = { value: n } : i.fnc(e.duration) || (r.duration = e.duration / t) } var a = i.arr(n) ? n : [n]; return a.map(function (n, r) { var t = i.obj(n) && !i.pth(n) ? n : { value: n }; return i.und(t.delay) && (t.delay = r ? 0 : e.delay), i.und(t.endDelay) && (t.endDelay = r === a.length - 1 ? e.endDelay : 0), t }).map(function (n) { return k(n, r) }) } function z(n, e) { var r = [], t = e.keyframes; for (var a in t && (e = k(function (n) { for (var e = m(y(n.map(function (n) { return Object.keys(n) })), function (n) { return i.key(n) }).reduce(function (n, e) { return n.indexOf(e) < 0 && n.push(e), n }, []), r = {}, t = function (t) { var a = e[t]; r[a] = n.map(function (n) { var e = {}; for (var r in n) i.key(r) ? r == a && (e.value = n[r]) : e[r] = n[r]; return e }) }, a = 0; a < e.length; a++)t(a); return r }(t), e)), e) i.key(a) && r.push({ name: a, tweens: V(e[a], n) }); return r } function H(n, e) { var r; return n.tweens.map(function (t) { var a = function (n, e) { var r = {}; for (var t in n) { var a = B(n[t], e); i.arr(a) && 1 === (a = a.map(function (n) { return B(n, e) })).length && (a = a[0]), r[t] = a } return r.duration = parseFloat(r.duration), r.delay = parseFloat(r.delay), r }(t, e), o = a.value, u = i.arr(o) ? o[1] : o, c = C(u), s = N(e.target, n.name, c, e), f = r ? r.to.original : s, l = i.arr(o) ? o[0] : f, d = C(l) || C(s), p = c || d; return i.und(u) && (u = f), a.from = Y(l, p), a.to = Y(A(u, l), p), a.start = r ? r.end : 0, a.end = a.start + a.delay + a.duration + a.endDelay, a.easing = v(a.easing, a.duration), a.isPath = i.pth(o), a.isColor = i.col(a.from.original), a.isColor && (a.round = 1), r = a, a }) } var G = { css: function (n, e, r) { return n.style[e] = r }, attribute: function (n, e, r) { return n.setAttribute(e, r) }, object: function (n, e, r) { return n[e] = r }, transform: function (n, e, r, t, a) { if (t.list.set(e, r), e === t.last || a) { var o = ""; t.list.forEach(function (n, e) { o += e + "(" + n + ") " }), n.style.transform = o } } }; function R(n, e) { Q(n).forEach(function (n) { for (var r in e) { var t = B(e[r], n), a = n.target, o = C(t), u = N(a, r, o, n), i = A(L(t, o || C(u)), u), c = D(a, r); G[c](a, r, i, n.transforms, !0) } }) } function W(n, e) { return m(y(n.map(function (n) { return e.map(function (e) { return function (n, e) { var r = D(n.target, e.name); if (r) { var t = H(e, n), a = t[t.length - 1]; return { type: r, property: e.name, animatable: n, tweens: t, duration: a.end, delay: t[0].delay, endDelay: a.endDelay } } }(n, e) }) })), function (n) { return !i.und(n) }) } function J(n, e) { var r = n.length, t = function (n) { return n.timelineOffset ? n.timelineOffset : 0 }, a = {}; return a.duration = r ? Math.max.apply(Math, n.map(function (n) { return t(n) + n.duration })) : e.duration, a.delay = r ? Math.min.apply(Math, n.map(function (n) { return t(n) + n.delay })) : e.delay, a.endDelay = r ? a.duration - Math.max.apply(Math, n.map(function (n) { return t(n) + n.duration - n.endDelay })) : e.endDelay, a } var K = 0; var U, _ = [], nn = [], en = function () { function n() { U = requestAnimationFrame(e) } function e(e) { var r = _.length; if (r) { for (var t = 0; t < r;) { var a = _[t]; if (a.paused) { var o = _.indexOf(a); o > -1 && (_.splice(o, 1), r = _.length) } else a.tick(e); t++ } n() } else U = cancelAnimationFrame(U) } return n }(); function rn(r) { void 0 === r && (r = {}); var t, o = 0, u = 0, i = 0, c = 0, s = null; function f(n) { var e = window.Promise && new Promise(function (n) { return s = n }); return n.finished = e, e } var l, d, p, h, v, g, y, b, M = (d = w(n, l = r), p = w(e, l), h = z(p, l), v = Q(l.targets), g = W(v, h), y = J(g, p), b = K, K++, k(d, { id: b, children: [], animatables: v, animations: g, duration: y.duration, delay: y.delay, endDelay: y.endDelay })); f(M); function x() { var n = M.direction; "alternate" !== n && (M.direction = "normal" !== n ? "normal" : "reverse"), M.reversed = !M.reversed, t.forEach(function (n) { return n.reversed = M.reversed }) } function O(n) { return M.reversed ? M.duration - n : n } function C() { o = 0, u = O(M.currentTime) * (1 / rn.speed) } function B(n, e) { e && e.seek(n - e.timelineOffset) } function P(n) { for (var e = 0, r = M.animations, t = r.length; e < t;) { var o = r[e], u = o.animatable, i = o.tweens, c = i.length - 1, s = i[c]; c && (s = m(i, function (e) { return n < e.end })[0] || s); for (var f = a(n - s.start - s.delay, 0, s.duration) / s.duration, l = isNaN(f) ? 1 : s.easing(f), d = s.to.strings, p = s.round, h = [], v = s.to.numbers.length, g = void 0, y = 0; y < v; y++) { var b = void 0, x = s.to.numbers[y], w = s.from.numbers[y] || 0; b = s.isPath ? X(s.value, l * x) : w + l * (x - w), p && (s.isColor && y > 2 || (b = Math.round(b * p) / p)), h.push(b) } var k = d.length; if (k) { g = d[0]; for (var O = 0; O < k; O++) { d[O]; var C = d[O + 1], B = h[O]; isNaN(B) || (g += C ? B + C : B + " ") } } else g = h[0]; G[o.type](u.target, o.property, g, u.transforms), o.currentValue = g, e++ } } function I(n) { M[n] && !M.passThrough && M[n](M) } function T(n) { var e = M.duration, r = M.delay, l = e - M.endDelay, d = O(n); M.progress = a(d / e * 100, 0, 100), M.reversePlayback = d < M.currentTime, t && function (n) { if (M.reversePlayback) for (var e = c; e--;)B(n, t[e]); else for (var r = 0; r < c; r++)B(n, t[r]) }(d), !M.began && M.currentTime > 0 && (M.began = !0, I("begin")), !M.loopBegan && M.currentTime > 0 && (M.loopBegan = !0, I("loopBegin")), d <= r && 0 !== M.currentTime && P(0), (d >= l && M.currentTime !== e || !e) && P(e), d > r && d < l ? (M.changeBegan || (M.changeBegan = !0, M.changeCompleted = !1, I("changeBegin")), I("change"), P(d)) : M.changeBegan && (M.changeCompleted = !0, M.changeBegan = !1, I("changeComplete")), M.currentTime = a(d, 0, e), M.began && I("update"), n >= e && (u = 0, M.remaining && !0 !== M.remaining && M.remaining--, M.remaining ? (o = i, I("loopComplete"), M.loopBegan = !1, "alternate" === M.direction && x()) : (M.paused = !0, M.completed || (M.completed = !0, I("loopComplete"), I("complete"), !M.passThrough && "Promise" in window && (s(), f(M))))) } return M.reset = function () { var n = M.direction; M.passThrough = !1, M.currentTime = 0, M.progress = 0, M.paused = !0, M.began = !1, M.loopBegan = !1, M.changeBegan = !1, M.completed = !1, M.changeCompleted = !1, M.reversePlayback = !1, M.reversed = "reverse" === n, M.remaining = M.loop, t = M.children; for (var e = c = t.length; e--;)M.children[e].reset(); (M.reversed && !0 !== M.loop || "alternate" === n && 1 === M.loop) && M.remaining++, P(M.reversed ? M.duration : 0) }, M.set = function (n, e) { return R(n, e), M }, M.tick = function (n) { i = n, o || (o = i), T((i + (u - o)) * rn.speed) }, M.seek = function (n) { T(O(n)) }, M.pause = function () { M.paused = !0, C() }, M.play = function () { M.paused && (M.completed && M.reset(), M.paused = !1, _.push(M), C(), U || en()) }, M.reverse = function () { x(), C() }, M.restart = function () { M.reset(), M.play() }, M.reset(), M.autoplay && M.play(), M } function tn(n, e) { for (var r = e.length; r--;)M(n, e[r].animatable.target) && e.splice(r, 1) } return "undefined" != typeof document && document.addEventListener("visibilitychange", function () { document.hidden ? (_.forEach(function (n) { return n.pause() }), nn = _.slice(0), rn.running = _ = []) : nn.forEach(function (n) { return n.play() }) }), rn.version = "3.1.0", rn.speed = 1, rn.running = _, rn.remove = function (n) { for (var e = Z(n), r = _.length; r--;) { var t = _[r], a = t.animations, o = t.children; tn(e, a); for (var u = o.length; u--;) { var i = o[u], c = i.animations; tn(e, c), c.length || i.children.length || o.splice(u, 1) } a.length || o.length || t.pause() } }, rn.get = N, rn.set = R, rn.convertPx = I, rn.path = function (n, e) { var r = i.str(n) ? g(n)[0] : n, t = e || 100; return function (n) { return { property: n, el: r, svg: $(r), totalLength: q(r) * (t / 100) } } }, rn.setDashoffset = function (n) { var e = q(n); return n.setAttribute("stroke-dasharray", e), e }, rn.stagger = function (n, e) { void 0 === e && (e = {}); var r = e.direction || "normal", t = e.easing ? v(e.easing) : null, a = e.grid, o = e.axis, u = e.from || 0, c = "first" === u, s = "center" === u, f = "last" === u, l = i.arr(n), d = l ? parseFloat(n[0]) : parseFloat(n), p = l ? parseFloat(n[1]) : 0, h = C(l ? n[1] : n) || 0, g = e.start || 0 + (l ? d : 0), m = [], y = 0; return function (n, e, i) { if (c && (u = 0), s && (u = (i - 1) / 2), f && (u = i - 1), !m.length) { for (var v = 0; v < i; v++) { if (a) { var b = s ? (a[0] - 1) / 2 : u % a[0], M = s ? (a[1] - 1) / 2 : Math.floor(u / a[0]), x = b - v % a[0], w = M - Math.floor(v / a[0]), k = Math.sqrt(x * x + w * w); "x" === o && (k = -x), "y" === o && (k = -w), m.push(k) } else m.push(Math.abs(u - v)); y = Math.max.apply(Math, m) } t && (m = m.map(function (n) { return t(n / y) * y })), "reverse" === r && (m = m.map(function (n) { return o ? n < 0 ? -1 * n : -n : Math.abs(y - n) })) } return g + (l ? (p - d) / y : d) * (Math.round(100 * m[e]) / 100) + h } }, rn.timeline = function (n) { void 0 === n && (n = {}); var r = rn(n); return r.duration = 0, r.add = function (t, a) { var o = _.indexOf(r), u = r.children; function c(n) { n.passThrough = !0 } o > -1 && _.splice(o, 1); for (var s = 0; s < u.length; s++)c(u[s]); var f = k(t, w(e, n)); f.targets = f.targets || n.targets; var l = r.duration; f.autoplay = !1, f.direction = r.direction, f.timelineOffset = i.und(a) ? l : A(a, l), c(r), r.seek(f.timelineOffset); var d = rn(f); c(d), u.push(d); var p = J(u, n); return r.delay = p.delay, r.endDelay = p.endDelay, r.duration = p.duration, r.seek(0), r.reset(), r.autoplay && r.play(), r }, r }, rn.easing = v, rn.penner = h, rn.random = function (n, e) { return Math.floor(Math.random() * (e - n + 1)) + n }, rn }); \ No newline at end of file diff --git a/trunk/research/players/js/srs.page.js b/trunk/research/players/js/srs.page.js index 520491e48..04021abf9 100755 --- a/trunk/research/players/js/srs.page.js +++ b/trunk/research/players/js/srs.page.js @@ -129,7 +129,7 @@ function build_default_whip_whep_url(query, apiPath) { var vhost = (!query.vhost)? window.location.hostname:query.vhost; var app = (!query.app)? "live":query.app; var stream = (!query.stream)? "livestream":query.stream; - var api = ':' + (query.api || (window.location.protocol === 'http:' ? '1985' : '1990')); + var api = ':' + (query.api || (query.schema === 'http' ? '1985' : '1990')); const realApiPath = query.path || apiPath; var queries = []; @@ -141,7 +141,9 @@ function build_default_whip_whep_url(query, apiPath) { } queries = user_extra_params(query, queries, true); - var uri = window.location.protocol + "//" + server + api + realApiPath + "?app=" + app + "&stream=" + stream + "&" + queries.join('&'); + schema = query.schema || window.location.protocol.slice(0, -1); + + var uri = schema + "://" + server + api + realApiPath + "?app=" + app + "&stream=" + stream + "&" + queries.join('&'); while (uri.lastIndexOf("?") === uri.length - 1) { uri = uri.slice(0, uri.length - 1); } @@ -180,3 +182,7 @@ function srs_init_whep(id, query) { update_nav(); $(id).val(build_default_whip_whep_url(query, '/rtc/v1/whep/')); } + +function srs_get_whep(query) { + return build_default_whip_whep_url(query, '/rtc/v1/whep/'); +} diff --git a/trunk/research/players/js/srs.sdk.js b/trunk/research/players/js/srs.sdk.js index e86e46813..8770310f8 100644 --- a/trunk/research/players/js/srs.sdk.js +++ b/trunk/research/players/js/srs.sdk.js @@ -574,7 +574,7 @@ function SrsRtcWhipWhepAsync() { userStream.getTracks().forEach(function (track) { self.pc.addTrack(track); // Notify about local track when stream is ok. - self.ontrack && self.ontrack({track: track}); + // self.ontrack && self.ontrack({track: track}); }); } @@ -602,6 +602,13 @@ function SrsRtcWhipWhepAsync() { return self.__internal.parseId(url, offer.sdp, answer); }; + // 新增回调函数 + self.onconnected = null; // 连接成功回调 + self.onfirstvideo = null; // 收到第一个视频包回调 + self.oninactivevideo = null; // 视频流中断回调 + self.onvideoresume = null; // 视频流恢复回调 + self.onconnectionlost = null; // 连接永久丢失回调 + // See https://datatracker.ietf.org/doc/draft-ietf-wish-whip/ // @url The WebRTC url to play with, for example: // http://localhost:1985/rtc/v1/whep/?app=live&stream=livestream @@ -614,6 +621,19 @@ function SrsRtcWhipWhepAsync() { if (!options?.videoOnly) self.pc.addTransceiver("audio", {direction: "recvonly"}); if (!options?.audioOnly) self.pc.addTransceiver("video", {direction: "recvonly"}); + + if (options.onconnected) self.onconnected = options.onconnected; + if (options.onfirstvideo) self.onfirstvideo = options.onfirstvideo; + if (options.oninactivevideo) self.oninactivevideo = options.oninactivevideo; + if (options.onvideoresume) self.onvideoresume = options.onvideoresume; + if (options.onconnectionlost) self.onconnectionlost = options.onconnectionlost; + + // 监听ICE连接状态 + self.pc.oniceconnectionstatechange = function () { + if (self.pc.iceConnectionState === 'connected') { + self.onconnected && self.onconnected(); + } + }; var offer = await self.pc.createOffer(); await self.pc.setLocalDescription(offer); @@ -641,15 +661,114 @@ function SrsRtcWhipWhepAsync() { // Close the publisher. self.close = function () { - self.pc && self.pc.close(); - self.pc = null; + // 清理所有计时器 + clearInterval(self.__internal.checkInterval); + clearTimeout(self.__internal.inactiveTimer); + + // 重置状态 + self.__internal.checkInterval = null; + self.__internal.inactiveTimer = null; + self.__internal.videoState = 'closed'; + + // 关闭PeerConnection + if (self.pc) { + self.pc.close(); + self.pc = null; + } + }; + + const handleVideoState = { + init: async () => { + const stats = await self.pc.getStats(self.__internal.currentTrack); + stats.forEach(report => { + if (report.type === 'inbound-rtp' && report.kind === 'video') { + if (report.bytesReceived > 0) { + self.__internal.videoState = 'active'; + self.onfirstvideo && self.onfirstvideo(); + } + } + }); + }, + + // 检测中状态 + checking: async () => { + const stats = await self.pc.getStats(self.__internal.currentTrack); + stats.forEach(report => { + if (report.type === 'inbound-rtp' && report.kind === 'video') { + if (report.bytesReceived > self.__internal.lastBytes) { + self.__internal.videoState = 'active'; + self.__internal.lastBytes = report.bytesReceived; + self.__internal.lastActiveTime = Date.now(); + // self.onfirstvideo && self.onfirstvideo(); + self.onvideoresume && self.onvideoresume(); + console.log('🎬 视频流恢复'); + } + } + }); + }, + + active: async () => { + const stats = await self.pc.getStats(self.__internal.currentTrack); + let bytesUpdated = false; + + stats.forEach(report => { + if (report.type === 'inbound-rtp' && report.kind === 'video') { + const currentBytes = report.bytesReceived; + if (currentBytes > self.__internal.lastBytes) { + self.__internal.lastBytes = currentBytes; + self.__internal.lastActiveTime = Date.now(); + bytesUpdated = true; + } + } + }); + + if (!bytesUpdated && Date.now() - self.__internal.lastActiveTime > 3000) { + self.__internal.videoState = 'inactive'; + self.oninactivevideo && self.oninactivevideo(); + + // 启动15秒断开倒计时 + self.__internal.inactiveTimer = setTimeout(() => { + self.onconnectionlost && self.onconnectionlost(); + self.close(); + }, 10000); + } + }, + + inactive: async () => { + const stats = await self.pc.getStats(self.__internal.currentTrack); + stats.forEach(report => { + if (report.type === 'inbound-rtp' && report.kind === 'video') { + if (report.bytesReceived > self.__internal.lastBytes) { + // 清除断开计时器 + clearTimeout(self.__internal.inactiveTimer); + self.__internal.inactiveTimer = null; + + self.__internal.videoState = 'checking'; + } + } + }); + } }; // The callback when got local stream. // @see https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/addStream#Migrating_to_addTrack self.ontrack = function (event) { - // Add track to stream of SDK. self.stream.addTrack(event.track); + + if (event.track.kind === 'video') { + self.__internal.currentTrack = event.track; + + // 启动状态检测引擎 + self.__internal.checkInterval = setInterval(() => { + if (!self.__internal.currentTrack) return; + + // 执行状态机转换 + handleVideoState[self.__internal.videoState]?.(); + }, 1000); // 每秒检测一次 + + // 初始状态转换 + self.__internal.videoState = 'init'; + } }; self.pc = new RTCPeerConnection(null); @@ -661,6 +780,13 @@ function SrsRtcWhipWhepAsync() { // Internal APIs. self.__internal = { + videoState: 'init', + checkInterval: null, + inactiveTimer: null, // 新增断开计时器 + lastBytes: 0, + lastActiveTime: 0, + currentTrack: null, + parseId: (url, offer, answer) => { let sessionid = offer.substr(offer.indexOf('a=ice-ufrag:') + 'a=ice-ufrag:'.length); sessionid = sessionid.substr(0, sessionid.indexOf('\n') - 1) + ':'; diff --git a/trunk/research/players/js/whep_main.js b/trunk/research/players/js/whep_main.js new file mode 100644 index 000000000..37454140f --- /dev/null +++ b/trunk/research/players/js/whep_main.js @@ -0,0 +1,66 @@ +const btns = document.querySelectorAll('.btn'); +const toastContainer = document.querySelector('.toast'); +const buttonYes = document.querySelector('#buttonsYes'); +const buttonNo = document.querySelector('#buttonsNo'); +const buttonsContainer = document.querySelector('#buttonsDiv'); + +const options = { + regular: { + heading: 'This is a Regular notification', + paragraph: 'This toast message notifies you of something. Whatever that may be.', + svg: '' + }, + success: { + heading: 'This is a Success notification', + paragraph: 'This toast message notifies you of all your great successes. You rock!', + svg: '
' + }, + error: { + heading: 'This is an Error notification', + paragraph: 'This toast message notifies you of an Error. Don\'t worry it\'s probably not your fault.', + svg: '
' + }, + warning: { + heading: 'This is a Warning notification', + paragraph: 'This toast message notifies you of a Warning. Who knows what might have happened.', + svg: '
' + } +} + +function createToast({type='regular', buttons='false', close='true', heading='', paragraph='', button1='', button2=''}) { + const html = ` +
+ ${options[type].svg} +
+

+ ${heading ? heading : options[type].heading} +

+

+ ${paragraph ? paragraph : options[type].paragraph} +

+
+ ${close === 'true' ? `×` : ''} + +
+ `; + toastContainer.insertAdjacentHTML('beforeend', html); + + const toast = toastContainer.lastElementChild; + toast.addEventListener('animationend', () => toast.remove()); +} + +function resetForm() { + document.querySelector('#heading').value = ''; + document.querySelector('#paragraph').value = ''; +} + +btns.forEach(btn => btn.addEventListener('click', function(e) { + e.preventDefault(); + const close = document.querySelector('input[name=close]:checked').value; + const heading = document.querySelector('#heading').value; + const paragraph = document.querySelector('#paragraph').value; + resetForm(); + createToast({type: this.value, close, heading, paragraph}); +})); + + diff --git a/trunk/research/players/whep.html b/trunk/research/players/whep.html deleted file mode 100644 index a1939e86a..000000000 --- a/trunk/research/players/whep.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - SRS - - - - - - - - - - - -
-
-
- - Usage: Enter the WebRTC WHEP URL and click "Play" to start playing. -
-
- URL: - - -
- -

- - -

-
- Controls: - - -
- - SessionID: - -

- Simulator: Drop - - -
- - - - diff --git a/trunk/research/players/whep_itp.html b/trunk/research/players/whep_itp.html new file mode 100644 index 000000000..430991083 --- /dev/null +++ b/trunk/research/players/whep_itp.html @@ -0,0 +1,371 @@ + + + + + + NPL ITP Intranet Livestream Channel + + + + + + + + + + + + +
+

NPL ITP

+

Intranet Livestream Channel

+

Connecting to the SRS Server ...

+
Loading...
+
+ + + +
+ + + + + + + diff --git a/trunk/src/app/srs_app_config.cpp b/trunk/src/app/srs_app_config.cpp index d74f4b410..5f6fb7791 100644 --- a/trunk/src/app/srs_app_config.cpp +++ b/trunk/src/app/srs_app_config.cpp @@ -23,6 +23,7 @@ #include #include +#include using namespace std; #include @@ -333,12 +334,30 @@ bool srs_config_apply_filter(SrsConfDirective* dvr_apply, SrsRequest* req) if (args.size() == 1 && dvr_apply->arg0() == "all") { return true; } - + string id = req->app + "/" + req->stream; if (std::find(args.begin(), args.end(), id) != args.end()) { return true; } - + + for (const string& pattern : args) { + // 如果模式以/开始和结束,则视为正则表达式 + if (pattern.size() >= 2 && pattern.front() == '/' && pattern.back() == '/') { + try { + std::regex re(pattern.substr(1, pattern.size() - 2)); + if (std::regex_match(id, re)) { + return true; + } + } catch (const std::regex_error&) { + // 正则表达式无效,跳过这条规则 + continue; + } + } else if (pattern == id) { + // 普通字符串匹配 + return true; + } + } + return false; } diff --git a/trunk/src/app/srs_app_config.hpp b/trunk/src/app/srs_app_config.hpp index bfb87445f..cfc875d73 100644 --- a/trunk/src/app/srs_app_config.hpp +++ b/trunk/src/app/srs_app_config.hpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include diff --git a/trunk/src/app/srs_app_hls.cpp b/trunk/src/app/srs_app_hls.cpp index 1a4f9f7f7..47022b9ae 100644 --- a/trunk/src/app/srs_app_hls.cpp +++ b/trunk/src/app/srs_app_hls.cpp @@ -1068,7 +1068,7 @@ srs_error_t SrsHlsController::write_video(SrsVideoFrame* frame, int64_t dts) // Refresh the codec ASAP. if (muxer->latest_vcodec() != frame->vcodec()->id) { - srs_trace("HLS: Switch video codec %d(%s) to %d(%s)", muxer->latest_vcodec(), srs_video_codec_id2str(muxer->latest_vcodec()).c_str(), + srs_trace("HLS: Switch video codec %d(%s) to %d(%s)", muxer->latest_acodec(), srs_video_codec_id2str(muxer->latest_vcodec()).c_str(), frame->vcodec()->id, srs_video_codec_id2str(frame->vcodec()->id).c_str()); muxer->set_latest_vcodec(frame->vcodec()->id); } diff --git a/trunk/src/app/srs_app_rtc_conn.cpp b/trunk/src/app/srs_app_rtc_conn.cpp index 410db4185..af2fbcfdc 100644 --- a/trunk/src/app/srs_app_rtc_conn.cpp +++ b/trunk/src/app/srs_app_rtc_conn.cpp @@ -2598,51 +2598,6 @@ bool srs_sdp_has_h264_profile(const SrsSdp& sdp, const string& profile) return false; } -bool srs_sdp_has_h265_profile(const SrsMediaPayloadType& payload_type, const string& profile) -{ - srs_error_t err = srs_success; - - if (payload_type.format_specific_param_.empty()) { - return false; - } - - H265SpecificParam h265_param; - if ((err = srs_parse_h265_fmtp(payload_type.format_specific_param_, h265_param)) != srs_success) { - srs_error_reset(err); - return false; - } - - if (h265_param.profile_id == profile) { - return true; - } - - return false; -} - -bool srs_sdp_has_h265_profile(const SrsSdp& sdp, const string& profile) -{ - for (size_t i = 0; i < sdp.media_descs_.size(); ++i) { - const SrsMediaDesc& desc = sdp.media_descs_[i]; - if (!desc.is_video()) { - continue; - } - - std::vector payloads = desc.find_media_with_encoding_name("H265"); - if (payloads.empty()) { - continue; - } - - for (std::vector::iterator it = payloads.begin(); it != payloads.end(); ++it) { - const SrsMediaPayloadType& payload_type = *it; - if (srs_sdp_has_h265_profile(payload_type, profile)) { - return true; - } - } - } - - return false; -} - srs_error_t SrsRtcConnection::negotiate_publish_capability(SrsRtcUserConfig* ruc, SrsRtcSourceDescription* stream_desc) { srs_error_t err = srs_success; @@ -3086,6 +3041,8 @@ srs_error_t SrsRtcConnection::negotiate_play_capability(SrsRtcUserConfig* ruc, s bool nack_enabled = _srs_config->get_rtc_nack_enabled(req->vhost); bool twcc_enabled = _srs_config->get_rtc_twcc_enabled(req->vhost); + // TODO: FIME: Should check packetization-mode=1 also. + bool has_42e01f = srs_sdp_has_h264_profile(remote_sdp, "42e01f"); SrsSharedPtr source; if ((err = _srs_rtc_sources->fetch_or_create(req, source)) != srs_success) { @@ -3126,87 +3083,56 @@ srs_error_t SrsRtcConnection::negotiate_play_capability(SrsRtcUserConfig* ruc, s remote_payload = payloads.at(0); track_descs = source->get_track_desc("audio", "opus"); + } else if (remote_media_desc.is_video() && ruc->codec_ == "av1") { + std::vector payloads = remote_media_desc.find_media_with_encoding_name("AV1"); + if (payloads.empty()) { + // Be compatible with the Chrome M96, still check the AV1X encoding name + // @see https://bugs.chromium.org/p/webrtc/issues/detail?id=13166 + payloads = remote_media_desc.find_media_with_encoding_name("AV1X"); + } + if (payloads.empty()) { + return srs_error_new(ERROR_RTC_SDP_EXCHANGE, "no found valid AV1 payload type"); + } + + remote_payload = payloads.at(0); + track_descs = source->get_track_desc("video", "AV1"); + if (track_descs.empty()) { + // Be compatible with the Chrome M96, still check the AV1X encoding name + // @see https://bugs.chromium.org/p/webrtc/issues/detail?id=13166 + track_descs = source->get_track_desc("video", "AV1X"); + } + } else if (remote_media_desc.is_video() && ruc->codec_ == "hevc") { + std::vector payloads = remote_media_desc.find_media_with_encoding_name("H265"); + if (payloads.empty()) { + return srs_error_new(ERROR_RTC_SDP_EXCHANGE, "no valid found h265 payload type"); + } + + remote_payload = payloads.at(0); + + // TODO: FIXME: pick up a profile for HEVC. + // @see https://www.rfc-editor.org/rfc/rfc7798#section-7.2.1 + + track_descs = source->get_track_desc("video", "H265"); } else if (remote_media_desc.is_video()) { - std::string prefer_codec = ruc->codec_; - if (prefer_codec.empty()) { - // Get the source codec if not specified. - std::vector track_descs = source->get_track_desc("video", ""); - if (!track_descs.empty()) { - std::string codec_name = track_descs.at(0)->media_->name_; - std::transform(codec_name.begin(), codec_name.end(), codec_name.begin(), ::tolower); - if (codec_name == "h265") { - prefer_codec = "hevc"; - } else { - prefer_codec = codec_name; - } - } else { - return srs_error_new(ERROR_RTC_SDP_EXCHANGE, "no video track in source"); - } + // TODO: check opus format specific param + vector payloads = remote_media_desc.find_media_with_encoding_name("H264"); + if (payloads.empty()) { + return srs_error_new(ERROR_RTC_SDP_EXCHANGE, "no valid found h264 payload type"); } - if (prefer_codec == "av1") { - std::vector payloads = remote_media_desc.find_media_with_encoding_name("AV1"); - if (payloads.empty()) { - // Be compatible with the Chrome M96, still check the AV1X encoding name - // @see https://bugs.chromium.org/p/webrtc/issues/detail?id=13166 - payloads = remote_media_desc.find_media_with_encoding_name("AV1X"); - } - if (payloads.empty()) { - return srs_error_new(ERROR_RTC_SDP_EXCHANGE, "no found valid AV1 payload type"); - } - - remote_payload = payloads.at(0); - track_descs = source->get_track_desc("video", "AV1"); - if (track_descs.empty()) { - // Be compatible with the Chrome M96, still check the AV1X encoding name - // @see https://bugs.chromium.org/p/webrtc/issues/detail?id=13166 - track_descs = source->get_track_desc("video", "AV1X"); - } - } else if (prefer_codec == "hevc") { - std::vector payloads = remote_media_desc.find_media_with_encoding_name("H265"); - if (payloads.empty()) { - return srs_error_new(ERROR_RTC_SDP_EXCHANGE, "no valid found h265 payload type"); - } - - // @see https://www.rfc-editor.org/rfc/rfc7798#section-7.2.1 - bool has_main_profile = srs_sdp_has_h265_profile(remote_sdp, "1"); - remote_payload = payloads.at(0); - - for (int j = 0; j < (int)payloads.size(); j++) { - const SrsMediaPayloadType& payload = payloads.at(j); - - // For H.265, we only check if profile-id=1 (Main Profile) - // Format example: level-id=180;profile-id=1;tier-flag=0;tx-mode=SRST - if (!has_main_profile || srs_sdp_has_h265_profile(payload, "1")) { - remote_payload = payload; - break; - } - } - - track_descs = source->get_track_desc("video", "H265"); - } else { - vector payloads = remote_media_desc.find_media_with_encoding_name("H264"); - if (payloads.empty()) { - return srs_error_new(ERROR_RTC_SDP_EXCHANGE, "no valid found h264 payload type"); - } + remote_payload = payloads.at(0); + for (int j = 0; j < (int)payloads.size(); j++) { + const SrsMediaPayloadType& payload = payloads.at(j); + // If exists 42e01f profile, choose it; otherwise, use the first payload. // TODO: FIME: Should check packetization-mode=1 also. - bool has_42e01f = srs_sdp_has_h264_profile(remote_sdp, "42e01f"); - - remote_payload = payloads.at(0); - for (int j = 0; j < (int)payloads.size(); j++) { - const SrsMediaPayloadType& payload = payloads.at(j); - - // If exists 42e01f profile, choose it; otherwise, use the first payload. - // TODO: FIME: Should check packetization-mode=1 also. - if (!has_42e01f || srs_sdp_has_h264_profile(payload, "42e01f")) { - remote_payload = payload; - break; - } + if (!has_42e01f || srs_sdp_has_h264_profile(payload, "42e01f")) { + remote_payload = payload; + break; } - - track_descs = source->get_track_desc("video", "H264"); } + + track_descs = source->get_track_desc("video", "H264"); } for (int j = 0; j < (int)track_descs.size(); ++j) { @@ -3312,11 +3238,7 @@ void video_track_generate_play_offer(SrsRtcTrackDescription* track, string mid, SrsVideoPayload* payload = (SrsVideoPayload*)track->media_; - if (payload->name_ == "H265") { - local_media_desc.payload_types_.push_back(payload->generate_media_payload_type_h265()); - } else { - local_media_desc.payload_types_.push_back(payload->generate_media_payload_type()); - } + local_media_desc.payload_types_.push_back(payload->generate_media_payload_type()); if (track->red_) { SrsRedPayload* red_payload = (SrsRedPayload*)track->red_; diff --git a/trunk/src/app/srs_app_rtc_sdp.cpp b/trunk/src/app/srs_app_rtc_sdp.cpp index d87c5e097..e6f298a4e 100644 --- a/trunk/src/app/srs_app_rtc_sdp.cpp +++ b/trunk/src/app/srs_app_rtc_sdp.cpp @@ -92,42 +92,6 @@ srs_error_t srs_parse_h264_fmtp(const std::string& fmtp, H264SpecificParam& h264 return err; } -srs_error_t srs_parse_h265_fmtp(const std::string& fmtp, H265SpecificParam& h265_param) -{ - srs_error_t err = srs_success; - - std::vector vec = srs_string_split(fmtp, ";"); - for (size_t i = 0; i < vec.size(); ++i) { - std::vector kv = srs_string_split(vec[i], "="); - if (kv.size() != 2) continue; - - if (kv[0] == "level-id") { - h265_param.level_id = kv[1]; - } else if (kv[0] == "profile-id") { - h265_param.profile_id = kv[1]; - } else if (kv[0] == "tier-flag") { - h265_param.tier_flag = kv[1]; - } else if (kv[0] == "tx-mode") { - h265_param.tx_mode = kv[1]; - } - } - - if (h265_param.level_id.empty()) { - return srs_error_new(ERROR_RTC_SDP_DECODE, "no h265 param: level-id"); - } - if (h265_param.profile_id.empty()) { - return srs_error_new(ERROR_RTC_SDP_DECODE, "no h265 param: profile-id"); - } - if (h265_param.tier_flag.empty()) { - return srs_error_new(ERROR_RTC_SDP_DECODE, "no h265 param: tier-flag"); - } - if (h265_param.tx_mode.empty()) { - return srs_error_new(ERROR_RTC_SDP_DECODE, "no h265 param: tx-mode"); - } - - return err; -} - SrsSessionInfo::SrsSessionInfo() { } diff --git a/trunk/src/app/srs_app_rtc_sdp.hpp b/trunk/src/app/srs_app_rtc_sdp.hpp index 39dbb8f0d..d2aba8a48 100644 --- a/trunk/src/app/srs_app_rtc_sdp.hpp +++ b/trunk/src/app/srs_app_rtc_sdp.hpp @@ -97,16 +97,8 @@ struct H264SpecificParam std::string level_asymmerty_allow; }; -struct H265SpecificParam -{ - std::string level_id; - std::string profile_id; - std::string tier_flag; - std::string tx_mode; -}; - extern srs_error_t srs_parse_h264_fmtp(const std::string& fmtp, H264SpecificParam& h264_param); -extern srs_error_t srs_parse_h265_fmtp(const std::string& fmtp, H265SpecificParam& h265_param); + class SrsMediaPayloadType { public: diff --git a/trunk/src/app/srs_app_rtc_source.cpp b/trunk/src/app/srs_app_rtc_source.cpp index 1e5deef0d..9292ccc1b 100644 --- a/trunk/src/app/srs_app_rtc_source.cpp +++ b/trunk/src/app/srs_app_rtc_source.cpp @@ -785,15 +785,7 @@ std::vector SrsRtcSource::get_track_desc(std::string ty if (type == "video") { std::vector::iterator it = stream_desc_->video_track_descs_.begin(); while (it != stream_desc_->video_track_descs_.end() ){ - if (media_name.empty()) { - track_descs.push_back(*it); - } else { - string name = (*it)->media_->name_; - std::transform(name.begin(), name.end(), name.begin(), static_cast(std::toupper)); - if (name == media_name) { - track_descs.push_back(*it); - } - } + track_descs.push_back(*it); ++it; } } @@ -1082,15 +1074,10 @@ srs_error_t SrsRtcRtpBuilder::on_video(SrsSharedPtrMessage* msg) return err; } - // support video codec: h264/h265 - SrsVideoCodecId vcodec = format->vcodec->id; - if (vcodec != SrsVideoCodecIdAVC && vcodec != SrsVideoCodecIdHEVC) { - return err; - } - + // WebRTC does NOT support HEVC. #ifdef SRS_H265 - if ((err = bridge_->update_codec(vcodec)) != srs_success) { - return srs_error_wrap(err, "update codec"); + if (format->vcodec->id == SrsVideoCodecIdHEVC) { + return err; } #endif @@ -1174,16 +1161,10 @@ srs_error_t SrsRtcRtpBuilder::filter(SrsSharedPtrMessage* msg, SrsFormat* format // Because RTC does not support B-frame, so we will drop them. // TODO: Drop B-frame in better way, which not cause picture corruption. - if (!keep_bframe) { - bool is_b_frame = false; - if (format->vcodec->id == SrsVideoCodecIdAVC) { - if ((err = SrsVideoFrame::parse_avc_bframe(sample, is_b_frame)) != srs_success) { - return srs_error_wrap(err, "parse bframe"); - } - } else if (format->vcodec->id == SrsVideoCodecIdHEVC) { - if ((err = SrsVideoFrame::parse_hevc_bframe(sample, format, is_b_frame)) != srs_success) { - return srs_error_wrap(err, "parse bframe"); - } + if (!keep_bframe && format->vcodec->id == SrsVideoCodecIdAVC) { + bool is_b_frame; + if ((err = SrsVideoFrame::parse_avc_b_frame(sample, is_b_frame)) != srs_success) { + return srs_error_wrap(err, "parse bframe"); } if (is_b_frame) { continue; @@ -1205,60 +1186,53 @@ srs_error_t SrsRtcRtpBuilder::package_stap_a(SrsSharedPtrMessage* msg, SrsRtpPac return err; } + // Note that the sps/pps may change, so we should copy it. + const vector& sps = format->vcodec->sequenceParameterSetNALUnit; + const vector& pps = format->vcodec->pictureParameterSetNALUnit; + if (sps.empty() || pps.empty()) { + return srs_error_new(ERROR_RTC_RTP_MUXER, "sps/pps empty"); + } + pkt->header.set_payload_type(video_payload_type_); pkt->header.set_ssrc(video_ssrc_); pkt->frame_type = SrsFrameTypeVideo; + pkt->nalu_type = (SrsAvcNaluType)kStapA; pkt->header.set_marker(false); pkt->header.set_sequence(video_sequence++); pkt->header.set_timestamp(msg->timestamp * 90); - ISrsRtpPayloader* stap = NULL; - vector*> params; - int size = 0; - if (format->vcodec->id == SrsVideoCodecIdHEVC) { - for (size_t i = 0; i < format->vcodec->hevc_dec_conf_record_.nalu_vec.size(); i++) { - if (format->vcodec->hevc_dec_conf_record_.nalu_vec[i].nal_unit_type == SrsHevcNaluType_VPS - || format->vcodec->hevc_dec_conf_record_.nalu_vec[i].nal_unit_type == SrsHevcNaluType_SPS - || format->vcodec->hevc_dec_conf_record_.nalu_vec[i].nal_unit_type == SrsHevcNaluType_PPS) { - vector& nalu = (vector&)format->vcodec->hevc_dec_conf_record_.nalu_vec[i].nal_data_vec[0].nal_unit_data; - params.push_back(&nalu); - size += format->vcodec->hevc_dec_conf_record_.nalu_vec[i].nal_data_vec[0].nal_unit_length; - } - } + SrsRtpSTAPPayload* stap = new SrsRtpSTAPPayload(); + pkt->set_payload(stap, SrsRtspPacketPayloadTypeSTAP); - stap = new SrsRtpSTAPPayloadHevc(); - pkt->set_payload(stap, SrsRtspPacketPayloadTypeSTAPHevc); - pkt->nalu_type = kStapHevc; - } else if (format->vcodec->id == SrsVideoCodecIdAVC) { - params.push_back(&format->vcodec->sequenceParameterSetNALUnit); - params.push_back(&format->vcodec->pictureParameterSetNALUnit); - size = format->vcodec->sequenceParameterSetNALUnit.size() + format->vcodec->pictureParameterSetNALUnit.size(); + uint8_t header = sps[0]; + stap->nri = (SrsAvcNaluType)header; - stap = new SrsRtpSTAPPayload(); - pkt->set_payload(stap, SrsRtspPacketPayloadTypeSTAP); - pkt->nalu_type = kStapA; - } - - if (size == 0) { - return srs_error_new(ERROR_RTC_RTP_MUXER, "vps/sps/pps empty"); - } + // Copy the SPS/PPS bytes, because it may change. + int size = (int)(sps.size() + pps.size()); char* payload = pkt->wrap(size); - for (vector*>::iterator it = params.begin(); it != params.end(); ++it) { - vector* param = *it; + if (true) { SrsSample* sample = new SrsSample(); sample->bytes = payload; - sample->size = param->size(); - if (format->vcodec->id == SrsVideoCodecIdHEVC) { - static_cast(stap)->nalus.push_back(sample); - } else { - static_cast(stap)->nalus.push_back(sample); - } + sample->size = (int)sps.size(); + stap->nalus.push_back(sample); - memcpy(payload, (char*)param->data(), param->size()); - payload += (int)param->size(); + memcpy(payload, (char*)&sps[0], sps.size()); + payload += (int)sps.size(); } + if (true) { + SrsSample* sample = new SrsSample(); + sample->bytes = payload; + sample->size = (int)pps.size(); + stap->nalus.push_back(sample); + + memcpy(payload, (char*)&pps[0], pps.size()); + payload += (int)pps.size(); + } + + srs_info("RTC STAP-A seq=%u, sps %d, pps %d bytes", pkt->header.get_sequence(), sps.size(), pps.size()); + return err; } @@ -1266,14 +1240,8 @@ srs_error_t SrsRtcRtpBuilder::package_nalus(SrsSharedPtrMessage* msg, const vect { srs_error_t err = srs_success; - SrsFormat* format = meta->vsh_format(); - if (!format || !format->vcodec) { - return err; - } - bool is_hevc = format->vcodec->id == SrsVideoCodecIdHEVC; - SrsRtpRawNALUs* raw_raw = new SrsRtpRawNALUs(); - uint8_t first_nalu_type = 0; + SrsAvcNaluType first_nalu_type = SrsAvcNaluTypeReserved; for (int i = 0; i < (int)samples.size(); i++) { SrsSample* sample = samples[i]; @@ -1282,8 +1250,8 @@ srs_error_t SrsRtcRtpBuilder::package_nalus(SrsSharedPtrMessage* msg, const vect continue; } - if (first_nalu_type == 0) { - first_nalu_type = is_hevc ? uint8_t(SrsHevcNaluTypeParse(sample->bytes[0])) : uint8_t(SrsAvcNaluTypeParse(sample->bytes[0])); + if (first_nalu_type == SrsAvcNaluTypeReserved) { + first_nalu_type = SrsAvcNaluType((uint8_t)(sample->bytes[0] & kNalTypeMask)); } raw_raw->push_back(sample->copy()); @@ -1304,7 +1272,7 @@ srs_error_t SrsRtcRtpBuilder::package_nalus(SrsSharedPtrMessage* msg, const vect pkt->header.set_payload_type(video_payload_type_); pkt->header.set_ssrc(video_ssrc_); pkt->frame_type = SrsFrameTypeVideo; - pkt->nalu_type = first_nalu_type; + pkt->nalu_type = (SrsAvcNaluType)first_nalu_type; pkt->header.set_sequence(video_sequence++); pkt->header.set_timestamp(msg->timestamp * 90); pkt->set_payload(raw_raw, SrsRtspPacketPayloadTypeNALU); @@ -1314,54 +1282,40 @@ srs_error_t SrsRtcRtpBuilder::package_nalus(SrsSharedPtrMessage* msg, const vect // because more than one RTP packet will refer to it. SrsUniquePtr raw(raw_raw); - int header_size = is_hevc ? SrsHevcNaluHeaderSize : SrsAvcNaluHeaderSize; - // Package NALUs in FU-A RTP packets. int fu_payload_size = kRtpMaxPayloadSize; // The first byte is store in FU-A header. - uint8_t header = raw->skip_bytes(header_size); - - int nb_left = nn_bytes - header_size; + uint8_t header = raw->skip_first_byte(); + uint8_t nal_type = header & kNalTypeMask; + int nb_left = nn_bytes - 1; int num_of_packet = 1 + (nn_bytes - 1) / fu_payload_size; for (int i = 0; i < num_of_packet; ++i) { int packet_size = srs_min(nb_left, fu_payload_size); + SrsRtpFUAPayload* fua = new SrsRtpFUAPayload(); + if ((err = raw->read_samples(fua->nalus, packet_size)) != srs_success) { + srs_freep(fua); + return srs_error_wrap(err, "read samples %d bytes, left %d, total %d", packet_size, nb_left, nn_bytes); + } + SrsRtpPacket* pkt = new SrsRtpPacket(); pkts.push_back(pkt); pkt->header.set_payload_type(video_payload_type_); pkt->header.set_ssrc(video_ssrc_); pkt->frame_type = SrsFrameTypeVideo; - pkt->nalu_type = kFuA; + pkt->nalu_type = (SrsAvcNaluType)kFuA; pkt->header.set_sequence(video_sequence++); pkt->header.set_timestamp(msg->timestamp * 90); - if (is_hevc) { - SrsRtpFUAPayloadHevc* fua = new SrsRtpFUAPayloadHevc(); - if ((err = raw->read_samples(fua->nalus, packet_size)) != srs_success) { - srs_freep(fua); - return srs_error_wrap(err, "read hevc samples %d bytes, left %d, total %d", packet_size, nb_left, nn_bytes); - } - fua->nalu_type = SrsHevcNaluTypeParse(header); - fua->start = bool(i == 0); - fua->end = bool(i == num_of_packet - 1); - - pkt->set_payload(fua, SrsRtspPacketPayloadTypeFUAHevc); - } else { - SrsRtpFUAPayload* fua = new SrsRtpFUAPayload(); - if ((err = raw->read_samples(fua->nalus, packet_size)) != srs_success) { - srs_freep(fua); - return srs_error_wrap(err, "read samples %d bytes, left %d, total %d", packet_size, nb_left, nn_bytes); - } - fua->nalu_type = SrsAvcNaluTypeParse(header); - fua->start = bool(i == 0); - fua->end = bool(i == num_of_packet - 1); - - pkt->set_payload(fua, SrsRtspPacketPayloadTypeFUA); - } + fua->nri = (SrsAvcNaluType)header; + fua->nalu_type = (SrsAvcNaluType)nal_type; + fua->start = bool(i == 0); + fua->end = bool(i == num_of_packet - 1); + pkt->set_payload(fua, SrsRtspPacketPayloadTypeFUA); pkt->wrap(msg); nb_left -= packet_size; @@ -1400,19 +1354,11 @@ srs_error_t SrsRtcRtpBuilder::package_fu_a(SrsSharedPtrMessage* msg, SrsSample* { srs_error_t err = srs_success; - SrsFormat* format = meta->vsh_format(); - if (!format || !format->vcodec) { - return err; - } - - bool is_hevc = format->vcodec->id == SrsVideoCodecIdHEVC; - int header_size = is_hevc ? SrsHevcNaluHeaderSize : SrsAvcNaluHeaderSize; - srs_assert(sample->size >= header_size); - - char* p = sample->bytes + header_size; - int nb_left = sample->size - header_size; + char* p = sample->bytes + 1; + int nb_left = sample->size - 1; uint8_t header = sample->bytes[0]; - + uint8_t nal_type = header & kNalTypeMask; + int num_of_packet = 1 + (nb_left - 1) / fu_payload_size; for (int i = 0; i < num_of_packet; ++i) { int packet_size = srs_min(nb_left, fu_payload_size); @@ -1425,32 +1371,17 @@ srs_error_t SrsRtcRtpBuilder::package_fu_a(SrsSharedPtrMessage* msg, SrsSample* pkt->frame_type = SrsFrameTypeVideo; pkt->header.set_sequence(video_sequence++); pkt->header.set_timestamp(msg->timestamp * 90); - pkt->nalu_type = is_hevc ? kFuHevc : kFuA; - if (is_hevc) { - // H265 FU-A header - SrsRtpFUAPayloadHevc2* fua = new SrsRtpFUAPayloadHevc2(); - pkt->set_payload(fua, SrsRtspPacketPayloadTypeFUAHevc2); + SrsRtpFUAPayload2* fua = new SrsRtpFUAPayload2(); + pkt->set_payload(fua, SrsRtspPacketPayloadTypeFUA2); - fua->nalu_type = SrsHevcNaluTypeParse(header); - fua->start = bool(i == 0); - fua->end = bool(i == num_of_packet - 1); + fua->nri = (SrsAvcNaluType)header; + fua->nalu_type = (SrsAvcNaluType)nal_type; + fua->start = bool(i == 0); + fua->end = bool(i == num_of_packet - 1); - fua->payload = p; - fua->size = packet_size; - } else { - // H264 FU-A header - SrsRtpFUAPayload2* fua = new SrsRtpFUAPayload2(); - pkt->set_payload(fua, SrsRtspPacketPayloadTypeFUA2); - - fua->nri = (SrsAvcNaluType)header; - fua->nalu_type = SrsAvcNaluTypeParse(header); - fua->start = bool(i == 0); - fua->end = bool(i == num_of_packet - 1); - - fua->payload = p; - fua->size = packet_size; - } + fua->payload = p; + fua->size = packet_size; pkt->wrap(msg); @@ -2134,7 +2065,6 @@ SrsVideoPayload* SrsVideoPayload::copy() cp->sample_ = sample_; cp->rtcp_fbs_ = rtcp_fbs_; cp->h264_param_ = h264_param_; - cp->h265_param_ = h265_param_; return cp; } @@ -2148,55 +2078,14 @@ SrsMediaPayloadType SrsVideoPayload::generate_media_payload_type() media_payload_type.rtcp_fb_ = rtcp_fbs_; std::ostringstream format_specific_param; - bool has_param = false; - if (!h264_param_.level_asymmerty_allow.empty()) { format_specific_param << "level-asymmetry-allowed=" << h264_param_.level_asymmerty_allow; - has_param = true; } if (!h264_param_.packetization_mode.empty()) { - if (has_param) format_specific_param << ";"; - format_specific_param << "packetization-mode=" << h264_param_.packetization_mode; - has_param = true; + format_specific_param << ";packetization-mode=" << h264_param_.packetization_mode; } if (!h264_param_.profile_level_id.empty()) { - if (has_param) format_specific_param << ";"; - format_specific_param << "profile-level-id=" << h264_param_.profile_level_id; - } - - media_payload_type.format_specific_param_ = format_specific_param.str(); - - return media_payload_type; -} - -SrsMediaPayloadType SrsVideoPayload::generate_media_payload_type_h265() -{ - SrsMediaPayloadType media_payload_type(pt_); - - media_payload_type.encoding_name_ = name_; - media_payload_type.clock_rate_ = sample_; - media_payload_type.rtcp_fb_ = rtcp_fbs_; - - std::ostringstream format_specific_param; - bool has_param = false; - - if (!h265_param_.level_id.empty()) { - format_specific_param << "level-id=" << h265_param_.level_id; - has_param = true; - } - if (!h265_param_.profile_id.empty()) { - if (has_param) format_specific_param << ";"; - format_specific_param << "profile-id=" << h265_param_.profile_id; - has_param = true; - } - if (!h265_param_.tier_flag.empty()) { - if (has_param) format_specific_param << ";"; - format_specific_param << "tier-flag=" << h265_param_.tier_flag; - has_param = true; - } - if (!h265_param_.tx_mode.empty()) { - if (has_param) format_specific_param << ";"; - format_specific_param << "tx-mode=" << h265_param_.tx_mode; + format_specific_param << ";profile-level-id=" << h264_param_.profile_level_id; } media_payload_type.format_specific_param_ = format_specific_param.str(); @@ -2241,31 +2130,6 @@ srs_error_t SrsVideoPayload::set_h264_param_desc(std::string fmtp) return err; } -// level-id=180;profile-id=1;tier-flag=0;tx-mode=SRST -srs_error_t SrsVideoPayload::set_h265_param_desc(std::string fmtp) -{ - std::vector attributes = split_str(fmtp, ";"); - for (size_t i = 0; i < attributes.size(); ++i) { - std::string attribute = attributes.at(i); - std::vector kv = split_str(attribute, "="); - if (kv.size() != 2) { - return srs_error_new(ERROR_RTC_SDP_DECODE, "invalid h265 param=%s", attribute.c_str()); - } - if (kv[0] == "level-id") { - h265_param_.level_id = kv[1]; - } else if (kv[0] == "profile-id") { - h265_param_.profile_id = kv[1]; - } else if (kv[0] == "tier-flag") { - h265_param_.tier_flag = kv[1]; - } else if (kv[0] == "tx-mode") { - h265_param_.tx_mode = kv[1]; - } else { - return srs_error_new(ERROR_RTC_SDP_DECODE, "invalid h265 param=%s", kv[0].c_str()); - } - } - return srs_success; -} - SrsAudioPayload::SrsAudioPayload() { channel_ = 0; @@ -2858,7 +2722,7 @@ void SrsRtcVideoRecvTrack::on_before_decode_payload(SrsRtpPacket* pkt, SrsBuffer } uint8_t v = (uint8_t)(buf->head()[0] & kNalTypeMask); - pkt->nalu_type = v; + pkt->nalu_type = SrsAvcNaluType(v); if (v == kStapA) { *ppayload = new SrsRtpSTAPPayload(); diff --git a/trunk/src/app/srs_app_rtc_source.hpp b/trunk/src/app/srs_app_rtc_source.hpp index 13e03efb0..3efe3904d 100644 --- a/trunk/src/app/srs_app_rtc_source.hpp +++ b/trunk/src/app/srs_app_rtc_source.hpp @@ -396,7 +396,6 @@ class SrsVideoPayload : public SrsCodecPayload { public: H264SpecificParam h264_param_; - H265SpecificParam h265_param_; public: SrsVideoPayload(); @@ -405,10 +404,8 @@ public: public: virtual SrsVideoPayload* copy(); virtual SrsMediaPayloadType generate_media_payload_type(); - virtual SrsMediaPayloadType generate_media_payload_type_h265(); public: srs_error_t set_h264_param_desc(std::string fmtp); - srs_error_t set_h265_param_desc(std::string fmtp); }; // TODO: FIXME: Rename it. diff --git a/trunk/src/app/srs_app_stream_bridge.cpp b/trunk/src/app/srs_app_stream_bridge.cpp index 80e0b999b..de2915d92 100644 --- a/trunk/src/app/srs_app_stream_bridge.cpp +++ b/trunk/src/app/srs_app_stream_bridge.cpp @@ -85,7 +85,7 @@ SrsFrameToRtcBridge::SrsFrameToRtcBridge(SrsSharedPtr source) // video track ssrc if (true) { - std::vector descs = source->get_track_desc("video", ""); + std::vector descs = source->get_track_desc("video", "H264"); if (!descs.empty()) { video_ssrc = descs.at(0)->ssrc_; } @@ -95,8 +95,6 @@ SrsFrameToRtcBridge::SrsFrameToRtcBridge(SrsSharedPtr source) rtp_builder_ = new SrsRtcRtpBuilder(this, audio_ssrc, audio_payload_type, video_ssrc, video_payload_type); #endif - - video_codec_id_ = SrsVideoCodecIdReserved; } SrsFrameToRtcBridge::~SrsFrameToRtcBridge() @@ -157,39 +155,6 @@ srs_error_t SrsFrameToRtcBridge::on_rtp(SrsRtpPacket* pkt) { return source_->on_rtp(pkt); } - -srs_error_t SrsFrameToRtcBridge::update_codec(SrsVideoCodecId id) -{ - srs_error_t err = srs_success; - - if (video_codec_id_ == id) { - return err; - } - - std::vector video_track_descs = source_->get_track_desc("video", ""); - if (video_track_descs.empty()) { - return srs_error_new(ERROR_RTC_NO_TRACK, "no track found for conversion"); - } - - SrsRtcTrackDescription* video_track_desc = video_track_descs.at(0); - SrsVideoPayload* video_payload = (SrsVideoPayload*)video_track_desc->media_; - - if (id == SrsVideoCodecIdHEVC) { - video_payload->name_ = "H265"; - video_payload->set_h265_param_desc("level-id=180;profile-id=1;tier-flag=0;tx-mode=SRST"); - } else { - video_payload->name_ = "H264"; - video_payload->set_h264_param_desc("level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f"); - } - - srs_trace("RTC: Switch video codec %d(%s) to %d(%s)", video_codec_id_, srs_video_codec_id2str(video_codec_id_).c_str(), - id, srs_video_codec_id2str(id).c_str()); - - video_codec_id_ = id; - - return err; -} - #endif SrsCompositeBridge::SrsCompositeBridge() diff --git a/trunk/src/app/srs_app_stream_bridge.hpp b/trunk/src/app/srs_app_stream_bridge.hpp index d5391c97c..dfa4857c8 100644 --- a/trunk/src/app/srs_app_stream_bridge.hpp +++ b/trunk/src/app/srs_app_stream_bridge.hpp @@ -65,8 +65,6 @@ private: #if defined(SRS_FFMPEG_FIT) SrsRtcRtpBuilder* rtp_builder_; #endif -private: - SrsVideoCodecId video_codec_id_; public: SrsFrameToRtcBridge(SrsSharedPtr source); virtual ~SrsFrameToRtcBridge(); @@ -76,7 +74,6 @@ public: virtual void on_unpublish(); virtual srs_error_t on_frame(SrsSharedPtrMessage* frame); srs_error_t on_rtp(SrsRtpPacket* pkt); - srs_error_t update_codec(SrsVideoCodecId id); }; #endif diff --git a/trunk/src/core/srs_core_version7.hpp b/trunk/src/core/srs_core_version7.hpp index 6e9507f88..ae5fb1d33 100644 --- a/trunk/src/core/srs_core_version7.hpp +++ b/trunk/src/core/srs_core_version7.hpp @@ -9,6 +9,6 @@ #define VERSION_MAJOR 7 #define VERSION_MINOR 0 -#define VERSION_REVISION 33 +#define VERSION_REVISION 32 #endif \ No newline at end of file diff --git a/trunk/src/kernel/srs_kernel_codec.cpp b/trunk/src/kernel/srs_kernel_codec.cpp index f1a73ae32..ba0257382 100644 --- a/trunk/src/kernel/srs_kernel_codec.cpp +++ b/trunk/src/kernel/srs_kernel_codec.cpp @@ -676,7 +676,7 @@ srs_error_t SrsVideoFrame::add_sample(char* bytes, int size) // By default, use AVC(H.264) to parse NALU. // For video, parse the nalu type, set the IDR flag. - SrsAvcNaluType nal_unit_type = SrsAvcNaluTypeParse(bytes[0]); + SrsAvcNaluType nal_unit_type = (SrsAvcNaluType)(bytes[0] & 0x1f); if (nal_unit_type == SrsAvcNaluTypeIDR) { has_idr = true; @@ -703,25 +703,29 @@ srs_error_t SrsVideoFrame::parse_avc_nalu_type(const SrsSample* sample, SrsAvcNa srs_error_t err = srs_success; if (sample == NULL || sample->size < 1) { - return srs_error_new(ERROR_NALU_EMPTY, "empty nalu"); + return srs_error_new(ERROR_AVC_NALU_EMPTY, "empty nalu"); } uint8_t header = sample->bytes[0]; - avc_nalu_type = SrsAvcNaluTypeParse(header); + avc_nalu_type = (SrsAvcNaluType)(header & kNalTypeMask); return err; } -srs_error_t SrsVideoFrame::parse_avc_bframe(const SrsSample* sample, bool& is_b_frame) +srs_error_t SrsVideoFrame::parse_avc_b_frame(const SrsSample* sample, bool& is_b_frame) { srs_error_t err = srs_success; + if (sample == NULL || sample->size < 1) { + return srs_error_new(ERROR_AVC_NALU_EMPTY, "empty nalu"); + } + SrsAvcNaluType nalu_type; if ((err = parse_avc_nalu_type(sample, nalu_type)) != srs_success) { return srs_error_wrap(err, "parse avc nalu type error"); } - if (nalu_type == SrsAvcNaluTypeIDR || nalu_type == SrsAvcNaluTypeSPS || nalu_type == SrsAvcNaluTypePPS) { + if (nalu_type != SrsAvcNaluTypeNonIDR && nalu_type != SrsAvcNaluTypeDataPartitionA && nalu_type != SrsAvcNaluTypeIDR) { is_b_frame = false; return err; } @@ -751,87 +755,6 @@ srs_error_t SrsVideoFrame::parse_avc_bframe(const SrsSample* sample, bool& is_b_ return err; } -srs_error_t SrsVideoFrame::parse_hevc_nalu_type(const SrsSample* sample, SrsHevcNaluType& hevc_nalu_type) -{ - srs_error_t err = srs_success; - - if (sample == NULL || sample->size < 1) { - return srs_error_new(ERROR_NALU_EMPTY, "empty hevc nalu"); - } - - uint8_t header = sample->bytes[0]; - hevc_nalu_type = SrsHevcNaluTypeParse(header); - - return err; -} - -srs_error_t SrsVideoFrame::parse_hevc_bframe(const SrsSample* sample, SrsFormat *format, bool& is_b_frame) -{ - srs_error_t err = srs_success; - - SrsHevcNaluType nalu_type; - if ((err = parse_hevc_nalu_type(sample, nalu_type)) != srs_success) { - return srs_error_wrap(err, "parse hevc nalu type error"); - } - - if (nalu_type > SrsHevcNaluType_CODED_SLICE_TFD) { - is_b_frame = false; - return err; - } - - SrsUniquePtr stream(new SrsBuffer(sample->bytes, sample->size)); - stream->skip(2); - - // @see 7.3.6.1 General slice segment header syntax - // @doc ITU-T-H.265-2021.pdf, page 66. - SrsBitBuffer bs(stream.get()); - - uint8_t first_slice_segment_in_pic_flag = bs.read_bit(); - - uint32_t slice_pic_parameter_set_id; - if ((err = bs.read_bits_ue(slice_pic_parameter_set_id)) != srs_success) { - return srs_error_wrap(err, "read slice pic parameter set id"); - } - - if (slice_pic_parameter_set_id >= SrsHevcMax_PPS_COUNT) { - return srs_error_new(ERROR_HEVC_DECODE_ERROR, "slice pic parameter set id out of range: %d", slice_pic_parameter_set_id); - } - - SrsHevcRbspPps *pps = &(format->vcodec->hevc_dec_conf_record_.pps_table[slice_pic_parameter_set_id]); - if (!pps) { - return srs_error_new(ERROR_HEVC_DECODE_ERROR, "pps not found"); - } - - uint8_t dependent_slice_segment_flag = 0; - if (!first_slice_segment_in_pic_flag) { - if (pps->dependent_slice_segments_enabled_flag) { - dependent_slice_segment_flag = bs.read_bit(); - } - } - - if (dependent_slice_segment_flag) { - return srs_error_new(ERROR_HEVC_DECODE_ERROR, "dependent slice segment flag is not supported"); - } - - for (int i = 0; i < pps->num_extra_slice_header_bits; i++) { - bs.skip_bits(1); - } - - uint32_t slice_type; - if ((err = bs.read_bits_ue(slice_type)) != srs_success) { - return srs_error_wrap(err, "read slice type"); - } - - is_b_frame = slice_type == SrsHevcSliceTypeB; - if (is_b_frame) { - srs_verbose("nalu_type=%d, slice type=%d", nalu_type, slice_type); - } - - // no need to evaluate the rest - - return err; -} - SrsFormat::SrsFormat() { acodec = NULL; @@ -2340,7 +2263,7 @@ srs_error_t SrsFormat::avc_demux_sps() // 7.4.1 NAL unit semantics // ISO_IEC_14496-10-AVC-2012.pdf, page 61. // nal_unit_type specifies the type of RBSP data structure contained in the NAL unit as specified in Table 7-1. - SrsAvcNaluType nal_unit_type = SrsAvcNaluTypeParse(nutv); + SrsAvcNaluType nal_unit_type = (SrsAvcNaluType)(nutv & 0x1f); if (nal_unit_type != 7) { return srs_error_new(ERROR_HLS_DECODE_ERROR, "for sps, nal_unit_type shall be equal to 7"); } diff --git a/trunk/src/kernel/srs_kernel_codec.hpp b/trunk/src/kernel/srs_kernel_codec.hpp index f267fdc01..9899271b6 100644 --- a/trunk/src/kernel/srs_kernel_codec.hpp +++ b/trunk/src/kernel/srs_kernel_codec.hpp @@ -14,12 +14,6 @@ class SrsBuffer; class SrsBitBuffer; -class SrsFormat; - -// @see: https://datatracker.ietf.org/doc/html/rfc6184#section-1.3 -const int SrsAvcNaluHeaderSize = 1; -// @see: https://datatracker.ietf.org/doc/html/rfc7798#section-1.1.4 -const int SrsHevcNaluHeaderSize = 2; /** * The video codec id. @@ -427,8 +421,6 @@ enum SrsAvcNaluType // Coded slice extension slice_layer_extension_rbsp( ) SrsAvcNaluTypeCodedSliceExt = 20, }; -// @see https://datatracker.ietf.org/doc/html/rfc6184#section-1.3 -#define SrsAvcNaluTypeParse(code) (SrsAvcNaluType)(code & 0x1F) std::string srs_avc_nalu2str(SrsAvcNaluType nalu_type); #ifdef SRS_H265 @@ -504,19 +496,8 @@ enum SrsHevcNaluType { SrsHevcNaluType_UNSPECIFIED_63, SrsHevcNaluType_INVALID, }; -// @see https://datatracker.ietf.org/doc/html/rfc7798#section-1.1.4 #define SrsHevcNaluTypeParse(code) (SrsHevcNaluType)((code & 0x7E) >> 1) -/** - * @see Table 7-7 – Name association to slice_type - * @doc ITU-T-H.265-2021.pdf, page 116. - */ -enum SrsHevcSliceType { - SrsHevcSliceTypeB = 0, - SrsHevcSliceTypeP = 1, - SrsHevcSliceTypeI = 2, -}; - struct SrsHevcNalData { uint16_t nal_unit_length; std::vector nal_unit_data; @@ -1339,10 +1320,7 @@ public: virtual SrsVideoCodecConfig* vcodec(); public: static srs_error_t parse_avc_nalu_type(const SrsSample* sample, SrsAvcNaluType& avc_nalu_type); - static srs_error_t parse_avc_bframe(const SrsSample* sample, bool& is_b_frame); - - static srs_error_t parse_hevc_nalu_type(const SrsSample* sample, SrsHevcNaluType& hevc_nalu_type); - static srs_error_t parse_hevc_bframe(const SrsSample* sample, SrsFormat* format, bool& is_b_frame); + static srs_error_t parse_avc_b_frame(const SrsSample* sample, bool& is_b_frame); }; /** diff --git a/trunk/src/kernel/srs_kernel_error.hpp b/trunk/src/kernel/srs_kernel_error.hpp index afc7f904f..69a14a590 100644 --- a/trunk/src/kernel/srs_kernel_error.hpp +++ b/trunk/src/kernel/srs_kernel_error.hpp @@ -279,7 +279,7 @@ XX(ERROR_HEVC_DECODE_ERROR , 3099, "HevcDecode", "HEVC decode av stream failed") \ XX(ERROR_MP4_HVCC_CHANGE , 3100, "Mp4HvcCChange", "MP4 does not support video HvcC change") \ XX(ERROR_HEVC_API_NO_PREFIXED , 3101, "HevcAnnexbPrefix", "No annexb prefix for HEVC decoder") \ - XX(ERROR_NALU_EMPTY , 3102, "NaluEmpty", "NALU is empty") + XX(ERROR_AVC_NALU_EMPTY , 3102, "AvcNaluEmpty", "AVC NALU is empty") /**************************************************/ /* HTTP/StreamConverter protocol error. */ diff --git a/trunk/src/kernel/srs_kernel_rtc_rtp.cpp b/trunk/src/kernel/srs_kernel_rtc_rtp.cpp index 1b1d91b15..7b08532d9 100644 --- a/trunk/src/kernel/srs_kernel_rtc_rtp.cpp +++ b/trunk/src/kernel/srs_kernel_rtc_rtp.cpp @@ -758,7 +758,7 @@ SrsRtpPacket::SrsRtpPacket() shared_buffer_ = NULL; actual_buffer_size_ = 0; - nalu_type = 0; + nalu_type = SrsAvcNaluTypeReserved; frame_type = SrsFrameTypeReserved; cached_payload_size = 0; decode_handler = NULL; @@ -961,23 +961,6 @@ bool SrsRtpPacket::is_keyframe() if((SrsAvcNaluTypeIDR == nalu_type) || (SrsAvcNaluTypeSPS == nalu_type) || (SrsAvcNaluTypePPS == nalu_type)) { return true; } -#ifdef SRS_H265 - if(nalu_type == kStapHevc) { - SrsRtpSTAPPayloadHevc* stap_payload = dynamic_cast(payload_); - if(NULL != stap_payload->get_vps() || NULL != stap_payload->get_sps() || NULL != stap_payload->get_pps()) { - return true; - } - } else if(nalu_type == kFuHevc) { - SrsRtpFUAPayloadHevc2* fua_payload = dynamic_cast(payload_); - if(fua_payload->nalu_type >= SrsHevcNaluType_CODED_SLICE_BLA && fua_payload->nalu_type <= SrsHevcNaluType_RESERVED_23) { - return true; - } - } else { - if((SrsHevcNaluType_VPS == nalu_type) || (SrsHevcNaluType_SPS == nalu_type) || (SrsHevcNaluType_PPS == nalu_type)) { - return true; - } - } -#endif } return false; @@ -1081,10 +1064,10 @@ void SrsRtpRawNALUs::push_back(SrsSample* sample) nalus.push_back(sample); } -uint8_t SrsRtpRawNALUs::skip_bytes(int count) +uint8_t SrsRtpRawNALUs::skip_first_byte() { - srs_assert (cursor >= 0 && nn_bytes > 0 && cursor + count < nn_bytes); - cursor += count; + srs_assert (cursor >= 0 && nn_bytes > 0 && cursor < nn_bytes); + cursor++; return uint8_t(nalus[0]->bytes[0]); } @@ -1211,7 +1194,7 @@ SrsSample* SrsRtpSTAPPayload::get_sps() continue; } - SrsAvcNaluType nalu_type = SrsAvcNaluTypeParse(p->bytes[0]); + SrsAvcNaluType nalu_type = (SrsAvcNaluType)(p->bytes[0] & kNalTypeMask); if (nalu_type == SrsAvcNaluTypeSPS) { return p; } @@ -1229,7 +1212,7 @@ SrsSample* SrsRtpSTAPPayload::get_pps() continue; } - SrsAvcNaluType nalu_type = SrsAvcNaluTypeParse(p->bytes[0]); + SrsAvcNaluType nalu_type = (SrsAvcNaluType)(p->bytes[0] & kNalTypeMask); if (nalu_type == SrsAvcNaluTypePPS) { return p; } @@ -1415,7 +1398,7 @@ srs_error_t SrsRtpFUAPayload::decode(SrsBuffer* buf) v = buf->read_1bytes(); start = v & kStart; end = v & kEnd; - nalu_type = SrsAvcNaluTypeParse(v); + nalu_type = SrsAvcNaluType(v & kNalTypeMask); if (!buf->require(1)) { return srs_error_new(ERROR_RTC_RTP_MUXER, "requires %d bytes", 1); @@ -1516,7 +1499,7 @@ srs_error_t SrsRtpFUAPayload2::decode(SrsBuffer* buf) v = buf->read_1bytes(); start = v & kStart; end = v & kEnd; - nalu_type = SrsAvcNaluTypeParse(v); + nalu_type = SrsAvcNaluType(v & kNalTypeMask); if (!buf->require(1)) { return srs_error_new(ERROR_RTC_RTP_MUXER, "requires %d bytes", 1); @@ -1542,362 +1525,3 @@ ISrsRtpPayloader* SrsRtpFUAPayload2::copy() return cp; } - -SrsRtpSTAPPayloadHevc::SrsRtpSTAPPayloadHevc() -{ - ++_srs_pps_objs_rothers->sugar; -} - -SrsRtpSTAPPayloadHevc::~SrsRtpSTAPPayloadHevc() -{ - int nn_nalus = (int)nalus.size(); - for (int i = 0; i < nn_nalus; i++) { - SrsSample* p = nalus[i]; - srs_freep(p); - } -} - -SrsSample* SrsRtpSTAPPayloadHevc::get_vps() -{ - int nn_nalus = (int)nalus.size(); - for (int i = 0; i < nn_nalus; i++) { - SrsSample* p = nalus[i]; - if (!p || !p->size) { - continue; - } - - SrsHevcNaluType nalu_type = SrsHevcNaluTypeParse(p->bytes[0]); - if (nalu_type == SrsHevcNaluType_VPS) { - return p; - } - } - - return NULL; -} - -SrsSample* SrsRtpSTAPPayloadHevc::get_sps() -{ - int nn_nalus = (int)nalus.size(); - for (int i = 0; i < nn_nalus; i++) { - SrsSample* p = nalus[i]; - if (!p || !p->size) { - continue; - } - - SrsHevcNaluType nalu_type = SrsHevcNaluTypeParse(p->bytes[0]); - if (nalu_type == SrsHevcNaluType_SPS) { - return p; - } - } - - return NULL; -} - -SrsSample* SrsRtpSTAPPayloadHevc::get_pps() -{ - int nn_nalus = (int)nalus.size(); - for (int i = 0; i < nn_nalus; i++) { - SrsSample* p = nalus[i]; - if (!p || !p->size) { - continue; - } - - SrsHevcNaluType nalu_type = SrsHevcNaluTypeParse(p->bytes[0]); - if (nalu_type == SrsHevcNaluType_PPS) { - return p; - } - } - - return NULL; -} - -uint64_t SrsRtpSTAPPayloadHevc::nb_bytes() -{ - int size = 2; - - int nn_nalus = (int)nalus.size(); - for (int i = 0; i < nn_nalus; i++) { - SrsSample* p = nalus[i]; - size += 2 + p->size; - } - - return size; -} - -srs_error_t SrsRtpSTAPPayloadHevc::encode(SrsBuffer* buf) -{ - if (!buf->require(2)) { - return srs_error_new(ERROR_RTC_RTP_MUXER, "requires %d bytes", 2); - } - - // STAP header, RTP payload format for aggregation packets - // @see https://datatracker.ietf.org/doc/html/rfc7798#section-4.4.2 - buf->write_1bytes(kStapHevc << 1); - buf->write_1bytes(1); - - // NALUs. - int nn_nalus = (int)nalus.size(); - for (int i = 0; i < nn_nalus; i++) { - SrsSample* p = nalus[i]; - - if (!buf->require(2 + p->size)) { - return srs_error_new(ERROR_RTC_RTP_MUXER, "requires %d bytes", 2 + p->size); - } - - buf->write_2bytes(p->size); - buf->write_bytes(p->bytes, p->size); - } - - return srs_success; -} - -srs_error_t SrsRtpSTAPPayloadHevc::decode(SrsBuffer* buf) -{ - if (!buf->require(2)) { - return srs_error_new(ERROR_RTC_RTP_MUXER, "requires %d bytes", 2); - } - - // STAP header, RTP payload format for aggregation packets - // @see https://datatracker.ietf.org/doc/html/rfc7798#section-4.4.2 - uint8_t v = buf->read_1bytes(); - buf->skip(1); - - // forbidden_zero_bit shoul be zero. - // @see https://datatracker.ietf.org/doc/html/rfc7798#section-4.4.2 - uint8_t f = (v & 0x80); - if (f == 0x80) { - return srs_error_new(ERROR_RTC_RTP_MUXER, "forbidden_zero_bit should be zero"); - } - - // NALUs. - while (!buf->empty()) { - if (!buf->require(2)) { - return srs_error_new(ERROR_RTC_RTP_MUXER, "requires %d bytes", 2); - } - - int size = buf->read_2bytes(); - if (!buf->require(size)) { - return srs_error_new(ERROR_RTC_RTP_MUXER, "requires %d bytes", size); - } - - SrsSample* sample = new SrsSample(); - sample->bytes = buf->head(); - sample->size = size; - buf->skip(size); - - nalus.push_back(sample); - } - - return srs_success; -} - -ISrsRtpPayloader* SrsRtpSTAPPayloadHevc::copy() -{ - SrsRtpSTAPPayloadHevc* cp = new SrsRtpSTAPPayloadHevc(); - - int nn_nalus = (int)nalus.size(); - for (int i = 0; i < nn_nalus; i++) { - SrsSample* p = nalus[i]; - cp->nalus.push_back(p->copy()); - } - - return cp; -} - -SrsRtpFUAPayloadHevc::SrsRtpFUAPayloadHevc() -{ - start = end = false; - nalu_type = (SrsHevcNaluType)0; - - ++_srs_pps_objs_rothers->sugar; -} - -SrsRtpFUAPayloadHevc::~SrsRtpFUAPayloadHevc() -{ - int nn_nalus = (int)nalus.size(); - for (int i = 0; i < nn_nalus; i++) { - SrsSample* p = nalus[i]; - srs_freep(p); - } -} - -uint64_t SrsRtpFUAPayloadHevc::nb_bytes() -{ - int size = 3; - - int nn_nalus = (int)nalus.size(); - for (int i = 0; i < nn_nalus; i++) { - SrsSample* p = nalus[i]; - size += p->size; - } - - return size; -} - -srs_error_t SrsRtpFUAPayloadHevc::encode(SrsBuffer* buf) -{ - if (!buf->require(3)) { - return srs_error_new(ERROR_RTC_RTP_MUXER, "requires %d bytes", 3); - } - - // PayloadHdr, @see: https://datatracker.ietf.org/doc/html/rfc7798#section-4.4.3 - buf->write_1bytes(kFuHevc << 1); - buf->write_1bytes(1); - - // FU header, @see https://datatracker.ietf.org/doc/html/rfc7798#section-4.4.3 - uint8_t fu_header = (start ? kStart : 0) | (end ? kEnd : 0); - fu_header |= nalu_type; - buf->write_1bytes(fu_header); - - int nn_nalus = (int)nalus.size(); - for (int i = 0; i < nn_nalus; i++) { - SrsSample* p = nalus[i]; - - if (!buf->require(p->size)) { - return srs_error_new(ERROR_RTC_RTP_MUXER, "requires %d bytes", p->size); - } - - buf->write_bytes(p->bytes, p->size); - } - - return srs_success; -} - -srs_error_t SrsRtpFUAPayloadHevc::decode(SrsBuffer* buf) -{ - if (!buf->require(3)) { - return srs_error_new(ERROR_RTC_RTP_MUXER, "requires %d bytes", 3); - } - - // skip PayloadHdr, 2 bytes - buf->skip(2); - - uint8_t fu_header = buf->read_1bytes(); - start = fu_header & kStart; - end = fu_header & kEnd; - nalu_type = SrsHevcNaluType(fu_header & 0x3F); - if (!buf->require(1)) { - return srs_error_new(ERROR_RTC_RTP_MUXER, "requires %d bytes", 1); - } - - SrsSample* sample = new SrsSample(); - sample->bytes = buf->head(); - sample->size = buf->left(); - buf->skip(sample->size); - - nalus.push_back(sample); - - return srs_success; -} - -ISrsRtpPayloader* SrsRtpFUAPayloadHevc::copy() -{ - SrsRtpFUAPayloadHevc* cp = new SrsRtpFUAPayloadHevc(); - - cp->start = start; - cp->end = end; - cp->nalu_type = nalu_type; - - int nn_nalus = (int)nalus.size(); - for (int i = 0; i < nn_nalus; i++) { - SrsSample* p = nalus[i]; - cp->nalus.push_back(p->copy()); - } - - return cp; -} - -SrsRtpFUAPayloadHevc2::SrsRtpFUAPayloadHevc2() -{ - start = end = false; - nalu_type = (SrsHevcNaluType)0; - - payload = NULL; - size = 0; - - ++_srs_pps_objs_rfua->sugar; -} - -SrsRtpFUAPayloadHevc2::~SrsRtpFUAPayloadHevc2() -{ -} - -uint64_t SrsRtpFUAPayloadHevc2::nb_bytes() -{ - // PayloadHdr(2) + FU header(1) - return 3 + size; -} - -srs_error_t SrsRtpFUAPayloadHevc2::encode(SrsBuffer* buf) -{ - if (!buf->require(3 + size)) { - return srs_error_new(ERROR_RTC_RTP_MUXER, "requires %d bytes", 3 + size); - } - - // Fast encoding. - char* p = buf->head(); - - // PayloadHdr, @see: https://datatracker.ietf.org/doc/html/rfc7798#section-4.4.3 - /* - * create the HEVC payload header and transmit the buffer as fragmentation units (FU) - * - * 0 1 - * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * |F| Type | LayerId | TID | - * +-------------+-----------------+ - * - * F = 0 - * Type = 49 (fragmentation unit (FU)) - * LayerId = 0 - * TID = 1 - */ - *p++ = kFuHevc << 1; - *p++ = 1; - - // FU header, @see https://datatracker.ietf.org/doc/html/rfc7798#section-4.4.3 - uint8_t fu_header = (start ? kStart : 0) | (end ? kEnd : 0); - fu_header |= nalu_type; - *p++ = fu_header; - - memcpy(p, payload, size); - - // Consume bytes. - buf->skip(3 + size); - - return srs_success; -} - -srs_error_t SrsRtpFUAPayloadHevc2::decode(SrsBuffer* buf) -{ - if (!buf->require(3)) { - return srs_error_new(ERROR_RTC_RTP_MUXER, "requires 3 bytes"); - } - - // skip PayloadHdr, 2 bytes - buf->skip(2); - - uint8_t fu_header = buf->read_1bytes(); - start = fu_header & kStart; - end = fu_header & kEnd; - nalu_type = SrsHevcNaluType(fu_header & 0x3F); - - payload = buf->head(); - size = buf->left(); - buf->skip(size); - - return srs_success; -} - -ISrsRtpPayloader* SrsRtpFUAPayloadHevc2::copy() -{ - SrsRtpFUAPayloadHevc2* cp = new SrsRtpFUAPayloadHevc2(); - - cp->start = start; - cp->end = end; - cp->nalu_type = nalu_type; - cp->payload = payload; - cp->size = size; - - return cp; -} diff --git a/trunk/src/kernel/srs_kernel_rtc_rtp.hpp b/trunk/src/kernel/srs_kernel_rtc_rtp.hpp index ff731db0b..b417208fb 100644 --- a/trunk/src/kernel/srs_kernel_rtc_rtp.hpp +++ b/trunk/src/kernel/srs_kernel_rtc_rtp.hpp @@ -29,14 +29,10 @@ const uint8_t kNalTypeMask = 0x1F; // @see: https://tools.ietf.org/html/rfc6184#section-5.2 const uint8_t kStapA = 24; + // @see: https://tools.ietf.org/html/rfc6184#section-5.2 const uint8_t kFuA = 28; -// @see: https://datatracker.ietf.org/doc/html/rfc7798#section-4.4.2 -const uint8_t kStapHevc = 48; -// @see: https://datatracker.ietf.org/doc/html/rfc7798#section-4.4.3 -const uint8_t kFuHevc = 49; - // @see: https://tools.ietf.org/html/rfc6184#section-5.8 const uint8_t kStart = 0x80; // Fu-header start bit const uint8_t kEnd = 0x40; // Fu-header end bit @@ -257,12 +253,9 @@ enum SrsRtspPacketPayloadType { SrsRtspPacketPayloadTypeRaw, SrsRtspPacketPayloadTypeFUA2, - SrsRtspPacketPayloadTypeFUAHevc2, SrsRtspPacketPayloadTypeFUA, - SrsRtspPacketPayloadTypeFUAHevc, SrsRtspPacketPayloadTypeNALU, SrsRtspPacketPayloadTypeSTAP, - SrsRtspPacketPayloadTypeSTAPHevc, SrsRtspPacketPayloadTypeUnknown, }; @@ -296,7 +289,7 @@ private: // Helper fields. public: // The first byte as nalu type, for video decoder only. - uint8_t nalu_type; + SrsAvcNaluType nalu_type; // The frame type, for RTMP bridge or SFU source. SrsFrameType frame_type; // Fast cache for performance. @@ -383,7 +376,7 @@ public: public: void push_back(SrsSample* sample); public: - uint8_t skip_bytes(int count); + uint8_t skip_first_byte(); // We will manage the returned samples, if user want to manage it, please copy it. srs_error_t read_samples(std::vector& samples, int packet_size); // interface ISrsRtpPayloader @@ -467,68 +460,4 @@ public: virtual ISrsRtpPayloader* copy(); }; -class SrsRtpSTAPPayloadHevc : public ISrsRtpPayloader -{ -public: - // The NALU samples, we will manage the samples. - // @remark We only refer to the memory, user must free its bytes. - std::vector nalus; -public: - SrsRtpSTAPPayloadHevc(); - virtual ~SrsRtpSTAPPayloadHevc(); -public: - SrsSample* get_vps(); - SrsSample* get_sps(); - SrsSample* get_pps(); -// interface ISrsRtpPayloader -public: - virtual uint64_t nb_bytes(); - virtual srs_error_t encode(SrsBuffer* buf); - virtual srs_error_t decode(SrsBuffer* buf); - virtual ISrsRtpPayloader* copy(); -}; - -// FU, for one NALU with multiple fragments. -// With more than one payload for HEVC. -class SrsRtpFUAPayloadHevc : public ISrsRtpPayloader -{ -public: - // The FUA header. - bool start; - bool end; - SrsHevcNaluType nalu_type; - // The NALU samples, we manage the samples. - // @remark We only refer to the memory, user must free its bytes. - std::vector nalus; -public: - SrsRtpFUAPayloadHevc(); - virtual ~SrsRtpFUAPayloadHevc(); -// interface ISrsRtpPayloader -public: - virtual uint64_t nb_bytes(); - virtual srs_error_t encode(SrsBuffer* buf); - virtual srs_error_t decode(SrsBuffer* buf); - virtual ISrsRtpPayloader* copy(); -}; - -// FU, for one NALU with multiple fragments. -// With only one payload for HEVC. -class SrsRtpFUAPayloadHevc2 : public ISrsRtpPayloader -{ -public: - bool start; - bool end; - SrsHevcNaluType nalu_type; - char* payload; - int size; -public: - SrsRtpFUAPayloadHevc2(); - virtual ~SrsRtpFUAPayloadHevc2(); -public: - virtual uint64_t nb_bytes(); - virtual srs_error_t encode(SrsBuffer* buf); - virtual srs_error_t decode(SrsBuffer* buf); - virtual ISrsRtpPayloader* copy(); -}; - #endif diff --git a/trunk/src/utest/srs_utest_kernel.cpp b/trunk/src/utest/srs_utest_kernel.cpp index 7b0b51a65..b0d428aa7 100644 --- a/trunk/src/utest/srs_utest_kernel.cpp +++ b/trunk/src/utest/srs_utest_kernel.cpp @@ -3567,204 +3567,6 @@ VOID TEST(KernelCodecTest, AVFrameNoConfig) HELPER_EXPECT_SUCCESS(f.add_sample((char*)"\x05", 1)); } } -VOID TEST(KernelCodecTest, VideoFrameH264) -{ - srs_error_t err; - - if (true) { - // I Frame - uint8_t data[] = {0x05, 0x00, 0x00, 0x00}; - SrsSample sample((char*)data, sizeof(data)); - - SrsAvcNaluType nalu_type = SrsAvcNaluTypeForbidden; - HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_nalu_type(&sample, nalu_type)); - EXPECT_EQ(nalu_type, SrsAvcNaluTypeIDR); - - // P Frame - uint8_t data2[] = {0x01, 0x00, 0x00, 0x00}; - SrsSample sample2((char*)data2, sizeof(data2)); - - nalu_type = SrsAvcNaluTypeForbidden; - HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_nalu_type(&sample2, nalu_type)); - EXPECT_EQ(nalu_type, SrsAvcNaluTypeNonIDR); - - // SPS - uint8_t data3[] = {0x07, 0x00, 0x00, 0x00}; - SrsSample sample3((char*)data3, sizeof(data3)); - - nalu_type = SrsAvcNaluTypeForbidden; - HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_nalu_type(&sample3, nalu_type)); - EXPECT_EQ(nalu_type, SrsAvcNaluTypeSPS); - - // PPS - uint8_t data4[] = {0x08, 0x00, 0x00, 0x00}; - SrsSample sample4((char*)data4, sizeof(data4)); - - nalu_type = SrsAvcNaluTypeForbidden; - HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_nalu_type(&sample4, nalu_type)); - EXPECT_EQ(nalu_type, SrsAvcNaluTypePPS); - - // Empty Sample - SrsSample empty_sample(NULL, 0); - HELPER_EXPECT_FAILED(SrsVideoFrame::parse_avc_nalu_type(&empty_sample, nalu_type)); - } - - if (true) { - // B Frame, slice_type=1(B Frame) - uint8_t data[] = {0x01, 0xA8, 0x00, 0x00}; - SrsSample sample((char*)data, sizeof(data)); - - bool is_b_frame = false; - HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample, is_b_frame)); - EXPECT_TRUE(is_b_frame); - - // Non-B Frame, slice_type=0(P Frame) - uint8_t data2[] = {0x01, 0x88, 0x00, 0x00}; - SrsSample sample2((char*)data2, sizeof(data2)); - - is_b_frame = true; - HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample2, is_b_frame)); - EXPECT_FALSE(is_b_frame); - - // SPS - uint8_t data3[] = {0x07, 0xA8, 0x00, 0x00}; - SrsSample sample3((char*)data3, sizeof(data3)); - - is_b_frame = true; - HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample3, is_b_frame)); - EXPECT_FALSE(is_b_frame); - - // PPS - uint8_t data4[] = {0x08, 0xA8, 0x00, 0x00}; - SrsSample sample4((char*)data4, sizeof(data4)); - - is_b_frame = true; - HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample4, is_b_frame)); - EXPECT_FALSE(is_b_frame); - - // IDR - uint8_t data5[] = {0x05, 0xA8, 0x00, 0x00}; - SrsSample sample5((char*)data5, sizeof(data5)); - - is_b_frame = true; - HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample5, is_b_frame)); - EXPECT_FALSE(is_b_frame); - - // Empty Sample - SrsSample empty_sample(NULL, 0); - HELPER_EXPECT_FAILED(SrsVideoFrame::parse_avc_bframe(&empty_sample, is_b_frame)); - } -} - -#ifdef SRS_H265 -VOID TEST(KernelCodecTest, VideoFrameH265) -{ - srs_error_t err; - - if (true) { - // I Frame - uint8_t data[] = {0x26, 0x01, 0x00, 0x00}; - SrsSample sample((char*)data, sizeof(data)); - - SrsHevcNaluType nalu_type = SrsHevcNaluType_INVALID; - HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_hevc_nalu_type(&sample, nalu_type)); - EXPECT_EQ(nalu_type, SrsHevcNaluType_CODED_SLICE_IDR); - - // P Frame - uint8_t data2[] = {0x02, 0x01, 0x00, 0x00}; - SrsSample sample2((char*)data2, sizeof(data2)); - - nalu_type = SrsHevcNaluType_INVALID; - HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_hevc_nalu_type(&sample2, nalu_type)); - EXPECT_EQ(nalu_type, SrsHevcNaluType_CODED_SLICE_TRAIL_R); - - // VPS - uint8_t data3[] = {0x40, 0x01, 0x00, 0x00}; - SrsSample sample3((char*)data3, sizeof(data3)); - - nalu_type = SrsHevcNaluType_INVALID; - HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_hevc_nalu_type(&sample3, nalu_type)); - EXPECT_EQ(nalu_type, SrsHevcNaluType_VPS); - - // SPS - uint8_t data4[] = {0x42, 0x01, 0x00, 0x00}; - SrsSample sample4((char*)data4, sizeof(data4)); - - nalu_type = SrsHevcNaluType_INVALID; - HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_hevc_nalu_type(&sample4, nalu_type)); - EXPECT_EQ(nalu_type, SrsHevcNaluType_SPS); - - // PPS - uint8_t data5[] = {0x44, 0x01, 0x00, 0x00}; - SrsSample sample5((char*)data5, sizeof(data5)); - - nalu_type = SrsHevcNaluType_INVALID; - HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_hevc_nalu_type(&sample5, nalu_type)); - EXPECT_EQ(nalu_type, SrsHevcNaluType_PPS); - - // Empty Sample - SrsSample empty_sample(NULL, 0); - HELPER_EXPECT_FAILED(SrsVideoFrame::parse_hevc_nalu_type(&empty_sample, nalu_type)); - } - - if (true) { - SrsFormat format; - HELPER_EXPECT_SUCCESS(format.initialize()); - - // B Frame, slice_type=0(B Frame) - uint8_t data[] = {0x02, 0x01, 0xE0, 0x44}; - SrsSample sample((char*)data, sizeof(data)); - - bool is_b_frame = false; - HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_hevc_bframe(&sample, &format, is_b_frame)); - EXPECT_TRUE(is_b_frame); - - // Non-B Frame, slice_type=1(P Frame) - uint8_t data2[] = {0x02, 0x01, 0xD0, 0x30}; - SrsSample sample2((char*)data2, sizeof(data2)); - - is_b_frame = true; - HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_hevc_bframe(&sample2, &format, is_b_frame)); - EXPECT_FALSE(is_b_frame); - - // VPS - uint8_t data3[] = {0x40, 0x01, 0xE0, 0x44}; - SrsSample sample3((char*)data3, sizeof(data3)); - - is_b_frame = true; - HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_hevc_bframe(&sample3, &format, is_b_frame)); - EXPECT_FALSE(is_b_frame); - - // SPS - uint8_t data4[] = {0x42, 0x01, 0xE0, 0x44}; - SrsSample sample4((char*)data4, sizeof(data4)); - - is_b_frame = true; - HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_hevc_bframe(&sample4, &format, is_b_frame)); - EXPECT_FALSE(is_b_frame); - - // PPS - uint8_t data5[] = {0x44, 0x01, 0xE0, 0x44}; - SrsSample sample5((char*)data5, sizeof(data5)); - - is_b_frame = true; - HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_hevc_bframe(&sample5, &format, is_b_frame)); - EXPECT_FALSE(is_b_frame); - - // IDR - uint8_t data6[] = {0x26, 0x01, 0xE0, 0x44}; - SrsSample sample6((char*)data6, sizeof(data6)); - - is_b_frame = true; - HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_hevc_bframe(&sample6, &format, is_b_frame)); - EXPECT_FALSE(is_b_frame); - - // Empty Sample - SrsSample empty_sample(NULL, 0); - HELPER_EXPECT_FAILED(SrsVideoFrame::parse_hevc_bframe(&empty_sample, &format, is_b_frame)); - } -} -#endif VOID TEST(KernelCodecTest, IsSequenceHeaderSpecial) { @@ -4419,7 +4221,7 @@ VOID TEST(KernelCodecTest, HevcVideoFormat) if (true) { SrsFormat f; HELPER_EXPECT_SUCCESS(f.initialize()); - + // firstly demux sequence header HELPER_EXPECT_SUCCESS(f.on_video(0, (char*)ext_vps_sps_pps, sizeof(ext_vps_sps_pps))); EXPECT_EQ(1, f.video->frame_type); diff --git a/trunk/src/utest/srs_utest_rtc.cpp b/trunk/src/utest/srs_utest_rtc.cpp index 9603c512c..b40679008 100644 --- a/trunk/src/utest/srs_utest_rtc.cpp +++ b/trunk/src/utest/srs_utest_rtc.cpp @@ -62,7 +62,7 @@ VOID TEST(KernelRTCTest, RtpSTAPPayloadException) SrsAvcNaluType nalu_type = SrsAvcNaluTypeReserved; // Try to parse the NALU type for video decoder. if (!buf.empty()) { - nalu_type = SrsAvcNaluTypeParse(buf.head()[0]); + nalu_type = SrsAvcNaluType((uint8_t)(buf.head()[0] & kNalTypeMask)); } EXPECT_TRUE(nalu_type == kStapA);