pax_global_header00006660000000000000000000000064152261577040014523gustar00rootroot0000000000000052 comment=ecc995429dd439f49c3c40fccc603df2e49addef dtkcore-6.7.46/000077500000000000000000000000001522615770400132625ustar00rootroot00000000000000dtkcore-6.7.46/.clang-format000066400000000000000000000164501522615770400156430ustar00rootroot00000000000000--- # 语言: None, Cpp, Java, JavaScript, ObjC, Proto, TableGen, TextProto Language: Cpp # BasedOnStyle: LLVM # 访问说明符(public�private等)的�移 AccessModifierOffset: -4 # 开括�(开圆括��开尖括��开方括�)�的对�: Align, DontAlign, AlwaysBreak(总是在开括���行) AlignAfterOpenBracket: Align # 连续赋值时,对�所有等� AlignConsecutiveAssignments: None # 连续声明时,对�所有声明的��� AlignConsecutiveDeclarations: None AlignEscapedNewlines: Right # 左对�逃脱�行(使用�斜��行)的�斜� #AlignEscapedNewlinesLeft: true # 水平对�二元和三元表达�的�作数 AlignOperands: true # 对�连续的尾�的注释 AlignTrailingComments: true # �许函数声明的所有�数在放在下一行 AllowAllParametersOfDeclarationOnNextLine: true # �许短的�放在�一行 AllowShortBlocksOnASingleLine: Empty # �许短的case标签放在�一行 AllowShortCaseLabelsOnASingleLine: false # �许短的函数放在�一行: None, InlineOnly(定义在类中), Empty(空函数), Inline(定义在类中,空函数), All AllowShortFunctionsOnASingleLine: Inline # �许短的if语���在�一行 AllowShortIfStatementsOnASingleLine: false # �许短的循环��在�一行 AllowShortLoopsOnASingleLine: false # 总是在定义返回类型��行(deprecated) AlwaysBreakAfterDefinitionReturnType: None # 总是在返回类型��行: None, All, TopLevel(顶级函数,�包括在类中的函数), # AllDefinitions(所有的定义,�包括声明), TopLevelDefinitions(所有的顶级函数的定义) AlwaysBreakAfterReturnType: None # 总是在多行string字����行 AlwaysBreakBeforeMultilineStrings: false # 总是在template声明��行 AlwaysBreakTemplateDeclarations: Yes # false表示函数实��么都在�一行,�么都�自一行 BinPackArguments: false # false表示所有形��么都在�一行,�么都�自一行 BinPackParameters: false # 大括��行,�有当BreakBeforeBraces设置为Custom时�有效 BraceWrapping: # class定义�� AfterClass: true # 控制语��� AfterControlStatement: Never # enum定义�� AfterEnum: false # 函数定义�� AfterFunction: true # 命�空间定义�� AfterNamespace: false # ObjC定义�� AfterObjCDeclaration: false # struct定义�� AfterStruct: true # union定义�� AfterUnion: true AfterExternBlock: false # catch之� BeforeCatch: false # else之� BeforeElse: false # 缩进大括� IndentBraces: false SplitEmptyFunction: true SplitEmptyRecord: true SplitEmptyNamespace: true # 在二元�算符��行: None(在�作符��行), NonAssignment(在�赋值的�作符��行), All(在�作符��行) BreakBeforeBinaryOperators: None # 在大括���行: Attach(始终将大括�附加到周围的上下文), Linux(除函数�命�空间和类定义,与Attach类似), # Mozilla(除枚举�函数�记录定义,与Attach类似), Stroustrup(除函数定义�catch�else,与Attach类似), # Allman(总是在大括���行), GNU(总是在大括���行,并对于控制语�的大括�增加�外的缩进), WebKit(在函数��行), Custom # 注:这里认为语��也属于函数 BreakBeforeBraces: Custom # 在三元�算符��行 BreakBeforeTernaryOperators: false # 在构造函数的�始化列表的逗���行 BreakConstructorInitializersBeforeComma: true BreakConstructorInitializers: BeforeColon # �行字符的�制,0表示没有�制 ColumnLimit: 130 # �述具有特殊�义的注释的正则表达�,它�应该被分割为多行或以其它方�改� CommentPragmas: '^ IWYU pragma:' CompactNamespaces: false # 构造函数的�始化列表�么都在�一行,�么都�自一行 ConstructorInitializerAllOnOneLineOrOnePerLine: false # 构造函数的�始化列表的缩进宽度 ConstructorInitializerIndentWidth: 4 # 延续的行的缩进宽度 ContinuationIndentWidth: 4 # 去除C++11的列表�始化的大括�{�和}�的空格 Cpp11BracedListStyle: true # 继承最常用的指针和引用的对�方� DerivePointerAlignment: false # 关闭格�化 DisableFormat: false # 自动检测函数的调用和定义是�被格�为�行一个�数(Experimental) ExperimentalAutoDetectBinPacking: false # 需�被解读为foreach循环而�是函数调用的� ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ] # 对#include进行排�,匹�了�正则表达�的#include拥有对应的优先级,匹��到的则默认优先级为INT_MAX(优先级越�排�越��), # �以定义负数优先级从而���些#include永远在最�� IncludeCategories: - Regex: '^"(llvm|llvm-c|clang|clang-c)/' Priority: 2 - Regex: '^(<|"(gtest|isl|json)/)' Priority: 3 - Regex: '.*' Priority: 1 # 缩进case标签 IndentCaseLabels: true #IndentPPDirectives: AfterHash # 缩进宽度 IndentWidth: 4 # 函数返回类型�行时,缩进函数声明或函数定义的函数� IndentWrappedFunctionNames: false # �留在�开始处的空行 KeepEmptyLinesAtTheStartOfBlocks: false # 开始一个�的�的正则表达� MacroBlockBegin: '' # 结�一个�的�的正则表达� MacroBlockEnd: '' # 连续空行的最大数� MaxEmptyLinesToKeep: 1 # 命�空间的缩进: None, Inner(缩进嵌套的命�空间中的内容), All NamespaceIndentation: Inner # 使用ObjC�时缩进宽度 ObjCBlockIndentWidth: 4 # 在ObjC的@property�添加一个空格 ObjCSpaceAfterProperty: false # 在ObjC的protocol列表�添加一个空格 ObjCSpaceBeforeProtocolList: true # 在call(�对函数调用�行的penalty PenaltyBreakBeforeFirstCallParameter: 19 # 在一个注释中引入�行的penalty PenaltyBreakComment: 300 # 第一次在<<��行的penalty PenaltyBreakFirstLessLess: 120 # 在一个字符串字��中引入�行的penalty PenaltyBreakString: 1000 # 对于�个在行字符数�制之外的字符的penalty PenaltyExcessCharacter: 1000000 # 将函数的返回类型放到它自己的行的penalty PenaltyReturnTypeOnItsOwnLine: 60 # 指针和引用的对�: Left, Right, Middle PointerAlignment: Right # �许�新排版注释 ReflowComments: true # �许排�#include SortIncludes: Never # 在C风格类型转��添加空格 SpaceAfterCStyleCast: false SpaceAfterTemplateKeyword: true # 在赋值�算符之�添加空格 SpaceBeforeAssignmentOperators: true # 开圆括�之�添加一个空格: Never, ControlStatements, Always SpaceBeforeParens: ControlStatements # 在空的圆括�中添加空格 SpaceInEmptyParentheses: false # 在尾�的评论�添加的空格数(�适用于//) SpacesBeforeTrailingComments: 2 # 在尖括�的<�和>�添加空格 SpacesInAngles: false # 在容器(ObjC和JavaScript的数组和字典等)字��中添加空格 SpacesInContainerLiterals: false # 在C风格类型转�的括�中添加空格 SpacesInCStyleCastParentheses: false # 在圆括�的(�和)�添加空格 SpacesInParentheses: false # 在方括�的[�和]�添加空格,lamda表达�和未指明大�的数组的声明��影� SpacesInSquareBrackets: false # 标准: Cpp03, Cpp11, Auto Standard: Auto # tab宽度 TabWidth: 4 # 使用tab字符: Never, ForIndentation, ForContinuationAndIndentation, Always UseTab: Never dtkcore-6.7.46/.clog.toml000066400000000000000000000001601522615770400151560ustar00rootroot00000000000000[clog] repository = "https://github.com/linuxdeepin/dtkcore" from-latest-tag = true changelog = "CHANGELOG.md" dtkcore-6.7.46/.github/000077500000000000000000000000001522615770400146225ustar00rootroot00000000000000dtkcore-6.7.46/.github/ISSUE_TEMPLATE/000077500000000000000000000000001522615770400170055ustar00rootroot00000000000000dtkcore-6.7.46/.github/ISSUE_TEMPLATE/config.yml000066400000000000000000000023651522615770400210030ustar00rootroot00000000000000blank_issues_enabled: false contact_links: - name: BUG Report | 缺陷报告 url: https://github.com/linuxdeepin/dtk/issues/new?assignees=&labels=&template=bug-report.yml about: Please create bug reports to the issue board in our dtk repo. - name: docs-update | 文档补充 url: https://github.com/linuxdeepin/dtk/issues/new?assignees=&labels=&template=docs-update.yml about: Please create docs-update to the issue board in our dtk repo. - name: unit-test-report | �元测试报告 url: https://github.com/linuxdeepin/dtk/issues/new?assignees=&labels=&template=unit-test-report.yml about: Please create unit-test-report to the issue board in our dtk repo. - name: Feature Request | 特性请求 url: https://github.com/linuxdeepin/developer-center/discussions/new?category=features-request-ideas-%E7%89%B9%E6%80%A7%E8%AF%B7%E6%B1%82-%E5%A4%B4%E8%84%91%E9%A3%8E%E6%9A%B4 about: Please create feature requests to the discussion board in our developer-center repo. - name: General Discussion & Questions | 常规讨论与问答 url: https://github.com/linuxdeepin/developer-center/discussions/categories/q-a-%E9%97%AE%E7%AD%94%E6%9D%BF%E5%9D%97 about: Please use the discussion board in our developer-center repo. dtkcore-6.7.46/.github/ISSUE_TEMPLATE/document.md000066400000000000000000000005241522615770400211460ustar00rootroot00000000000000--- name: Docs update about: Document Normalization title: 'Doc: [Document Type][file name]' labels: 'Doc' assignees: '' --- ## Target files (目标文件) ## Planned completion time (计划完�时间) ## Document Type (文档类型) [] New documents [] Standardized documents [] Internationalization of documents [] Example documents dtkcore-6.7.46/.github/workflows/000077500000000000000000000000001522615770400166575ustar00rootroot00000000000000dtkcore-6.7.46/.github/workflows/auto-release.yml000066400000000000000000000025661522615770400220010ustar00rootroot00000000000000name: Auto Release on: workflow_dispatch: inputs: version: description: 'Release version (e.g., 1.0.0)' type: string required: false name: description: 'The name of the person to release the version' type: string required: false email: description: 'The email of the person to release the version' type: string required: false timezone: description: 'The timezone in the debian changelog file' required: false type: string default: 'Asia/Shanghai' workflow_call: inputs: version: description: 'Release version (e.g., 1.0.0)' type: string required: true name: description: 'The name of the person to release the version' type: string required: false email: description: 'The email of the person to release the version' type: string required: false timezone: description: 'The timezone in the debian changelog file' required: false type: string default: 'Asia/Shanghai' jobs: auto_tag: uses: linuxdeepin/.github/.github/workflows/auto-release.yml@master secrets: inherit with: version: ${{ inputs.version }} name: ${{ inputs.name }} email: ${{ inputs.email }} timezone: ${{ inputs.timezone }} dtkcore-6.7.46/.github/workflows/backup-to-gitlab.yml000066400000000000000000000005371522615770400225340ustar00rootroot00000000000000name: backup to gitlab on: [push] concurrency: group: ${{ github.workflow }} cancel-in-progress: true jobs: backup-to-gitlabwh: uses: linuxdeepin/.github/.github/workflows/backup-to-gitlabwh.yml@master secrets: inherit backup-to-gitee: uses: linuxdeepin/.github/.github/workflows/backup-to-gitee.yml@master secrets: inherit dtkcore-6.7.46/.github/workflows/call-auto-tag.yml000066400000000000000000000005171522615770400220370ustar00rootroot00000000000000name: auto tag on: pull_request_target: types: [opened, synchronize, closed] paths: - "debian/changelog" concurrency: group: ${{ github.workflow }}-pull/${{ github.event.number }} cancel-in-progress: true jobs: auto_tag: uses: linuxdeepin/.github/.github/workflows/auto-tag.yml@master secrets: inherit dtkcore-6.7.46/.github/workflows/call-build-distribution.yml000066400000000000000000000004321522615770400241260ustar00rootroot00000000000000name: Call build-distribution on: push: paths-ignore: - ".github/workflows/**" pull_request_target: paths-ignore: - ".github/workflows/**" jobs: check_job: uses: linuxdeepin/.github/.github/workflows/build-distribution.yml@master secrets: inherit dtkcore-6.7.46/.github/workflows/call-chatOps.yml000066400000000000000000000002421522615770400217120ustar00rootroot00000000000000name: chatOps on: issue_comment: types: [created] jobs: chatopt: uses: linuxdeepin/.github/.github/workflows/chatOps.yml@master secrets: inherit dtkcore-6.7.46/.github/workflows/call-clacheck.yml000066400000000000000000000005251522615770400220520ustar00rootroot00000000000000name: Call CLA check on: issue_comment: types: [created] pull_request_target: types: [opened, closed, synchronize] concurrency: group: ${{ github.workflow }}-pull/${{ github.event.number }} cancel-in-progress: true jobs: clacheck: uses: linuxdeepin/.github/.github/workflows/cla-check.yml@master secrets: inherit dtkcore-6.7.46/.github/workflows/call-commitlint.yml000066400000000000000000000003641522615770400224750ustar00rootroot00000000000000name: Call commitlint on: pull_request_target: concurrency: group: ${{ github.workflow }}-pull/${{ github.event.number }} cancel-in-progress: true jobs: check_job: uses: linuxdeepin/.github/.github/workflows/commitlint.yml@master dtkcore-6.7.46/.github/workflows/call-deploy-dev-doc.yml000066400000000000000000000007401522615770400231270ustar00rootroot00000000000000name: deploy docs on: push: branches: ["master"] workflow_dispatch: inputs: tag: required: true type: string permissions: contents: read pages: write id-token: write # Allow one concurrent deployment concurrency: group: "pages" cancel-in-progress: true jobs: deploydocs: uses: linuxdeepin/.github/.github/workflows/deploy-dev-doc.yml@master with: ref: ${{ inputs.tag }} secrets: inherit dtkcore-6.7.46/.github/workflows/call-doc-check.yml000066400000000000000000000004671522615770400221420ustar00rootroot00000000000000name: doxygen-check on: pull_request_target: paths-ignore: - ".github/workflows/**" concurrency: group: ${{ github.workflow }}-pull/${{ github.event.number }} cancel-in-progress: true jobs: check_job: uses: linuxdeepin/.github/.github/workflows/doc-check.yml@master secrets: inherit dtkcore-6.7.46/.github/workflows/call-license-check.yml000066400000000000000000000005521522615770400230120ustar00rootroot00000000000000name: Call License and README Check on: pull_request_target: types: [opened, synchronize, reopened] permissions: pull-requests: write contents: read concurrency: group: ${{ github.workflow }}-pull/${{ github.event.number }} cancel-in-progress: true jobs: license-check: uses: linuxdeepin/.github/.github/workflows/license-check.yml@master dtkcore-6.7.46/.github/workflows/cppcheck.yml000066400000000000000000000012651522615770400211660ustar00rootroot00000000000000name: cppcheck on: pull_request_target: paths-ignore: - ".github/workflows/**" concurrency: group: ${{ github.workflow }}-pull/${{ github.event.number }} cancel-in-progress: true jobs: cppchceck: name: cppcheck runs-on: ubuntu-latest steps: - run: export - uses: actions/checkout@v3 with: ref: ${{ github.event.pull_request.head.sha }} persist-credentials: false - uses: linuxdeepin/action-cppcheck@main with: github_token: ${{ secrets.GITHUB_TOKEN }} repository: ${{ github.repository }} pull_request_id: ${{ github.event.pull_request.number }} allow_approve: false dtkcore-6.7.46/.github/workflows/dtkcore-archlinux-build.yml000066400000000000000000000050771522615770400241360ustar00rootroot00000000000000name: Build dtkcore on Arch Linux on: push: pull_request: jobs: container: runs-on: ubuntu-latest container: archlinux:latest strategy: matrix: include: - qt_version: 5 dtk5: "ON" - qt_version: 6 dtk5: "OFF" steps: - name: Initialize pacman and system update run: | pacman-key --init pacman --noconfirm --noprogressbar -Syu - name: Install base build tools run: | pacman -S --noconfirm --noprogressbar base-devel git cmake ninja pkgconf - name: Install dtkcore Qt5 system dependencies if: matrix.qt_version == 5 run: | pacman -S --noconfirm --noprogressbar \ qt5-base qt5-tools \ icu uchardet dbus \ gtest spdlog \ gsettings-qt \ dtkcommon dtklog - name: Install dtkcore Qt6 system dependencies if: matrix.qt_version == 6 run: | pacman -S --noconfirm --noprogressbar \ qt6-base qt6-tools \ icu uchardet dbus \ gtest spdlog \ dtkcommon dtk6log - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Configure and build dtkcore run: | cmake -B build \ -GNinja \ -DCMAKE_INSTALL_PREFIX=/usr \ -DCMAKE_INSTALL_LIBDIR=lib \ -DCMAKE_BUILD_TYPE=Release \ -DMKSPECS_INSTALL_DIR=lib/qt/mkspecs/modules \ -DBUILD_DOCS=OFF \ -DBUILD_EXAMPLES=OFF \ -DBUILD_TESTING=OFF \ -DDTK5=${{ matrix.dtk5 }} cmake --build build -j$(nproc) echo "✅ dtkcore Qt${{ matrix.qt_version }} built successfully!" - name: Install dtkcore to staging directory run: | DESTDIR=/tmp/dtkcore-install cmake --install build echo "Total: $(find /tmp/dtkcore-install -type f | wc -l) files" - name: Create installation package run: | cd /tmp/dtkcore-install pacman -S --noconfirm zip zip -r /tmp/dtkcore-archlinux-qt${{ matrix.qt_version }}-$(date +%Y%m%d-%H%M%S).zip . ls -la /tmp/dtkcore-archlinux-qt${{ matrix.qt_version }}-*.zip - name: Upload dtkcore Arch Linux build artifacts if: ${{ !env.ACT }} uses: actions/upload-artifact@v4 with: name: dtkcore-archlinux-qt${{ matrix.qt_version }}-build path: "/tmp/dtkcore-archlinux-qt${{ matrix.qt_version }}-*.zip" if-no-files-found: error retention-days: 30 dtkcore-6.7.46/.github/workflows/dtkcore-deepin-build.yml000066400000000000000000000052741522615770400234040ustar00rootroot00000000000000name: Build dtkcore on Deepin crimson on: push: pull_request: jobs: container: runs-on: ubuntu-latest container: linuxdeepin/deepin:crimson strategy: matrix: include: - qt_version: 5 dtk_profile: nodtk6 - qt_version: 6 dtk_profile: nodtk5 steps: - uses: actions/checkout@v4 - name: Setup apt sources and build tools run: | set -euxo pipefail echo "deb [trusted=yes] http://mirrors.kernel.org/deepin/beige/ crimson main commercial community" > /etc/apt/sources.list echo "deb-src [trusted=yes] http://mirrors.kernel.org/deepin/beige/ crimson main commercial community" >> /etc/apt/sources.list rm -rf /etc/apt/sources.list.d apt-get update apt-get install -y devscripts equivs git - name: Build and install dtkcommon from source run: | set -euxo pipefail cd /tmp git clone --depth=1 https://github.com/linuxdeepin/dtkcommon.git cd dtkcommon mk-build-deps --install --remove --tool='apt-get -o Debug::pkgProblemResolver=yes --no-install-recommends --yes' debian/control dpkg-buildpackage -uc -us -b dpkg -i ../*.deb 2>/dev/null || apt-get install -f -y echo "✅ dtkcommon installed" - name: Build and install dtklog from source run: | set -euxo pipefail cd /tmp git clone --depth=1 https://github.com/linuxdeepin/dtklog.git cd dtklog mk-build-deps --install --remove --tool='apt-get -o Debug::pkgProblemResolver=yes --no-install-recommends --yes' debian/control dpkg-buildpackage -uc -us -b -P${{ matrix.dtk_profile }} dpkg -i ../*.deb 2>/dev/null || apt-get install -f -y echo "✅ dtklog installed" - name: Install dtkcore build dependencies run: | set -euxo pipefail mk-build-deps --install --remove --tool='apt-get -o Debug::pkgProblemResolver=yes --no-install-recommends --yes' debian/control - name: Build dtkcore deb packages run: | set -euxo pipefail dpkg-buildpackage -uc -us -b -P${{ matrix.dtk_profile }} echo "✅ dtkcore Qt${{ matrix.qt_version }} deb packages built successfully!" ls -la ../ - name: Collect deb artifacts run: | mkdir -p dist mv ../*.deb dist/ ls -la dist - name: Upload dtkcore deb packages as artifacts uses: actions/upload-artifact@v4 with: name: dtkcore-deepin-deb-packages-qt${{ matrix.qt_version }} path: dist/*.deb if-no-files-found: error retention-days: 30 dtkcore-6.7.46/.gitignore000066400000000000000000000005401522615770400152510ustar00rootroot00000000000000# Compiled Object files *.slo *.lo *.o # Compiled Dynamic libraries *.so *.dylib # Compiled Static libraries *.lai *.la *.a build*/ *.pro.user* *.DS_Store # executeable files *.qm src/DtkCores bin/ .qmake* Makefile cmake/DtkCore* .cache *.pc *.pri dtkcore_config.h *.user #tools .vscode .idea # Ignore Doxygen theme files docs/doxygen-theme/ dtkcore-6.7.46/.gitlab-ci.yml000066400000000000000000000002271522615770400157170ustar00rootroot00000000000000include: - remote: 'https://gitlab.deepin.io/dev-tools/letmeci/raw/master/gitlab-ci/dde.yml' variables: CPPCHECK: "true" CODESPELL: "true" dtkcore-6.7.46/.obs/000077500000000000000000000000001522615770400141235ustar00rootroot00000000000000dtkcore-6.7.46/.obs/workflows.yml000066400000000000000000000023121522615770400167010ustar00rootroot00000000000000test_build: steps: - link_package: source_project: deepin:Develop:dde source_package: %{SCM_REPOSITORY_NAME} target_project: deepin:CI - configure_repositories: project: deepin:CI repositories: - name: deepin_develop paths: - target_project: deepin:CI target_repository: deepin_develop architectures: - x86_64 - aarch64 - name: debian paths: - target_project: deepin:CI target_repository: debian_sid architectures: - x86_64 - name: archlinux paths: - target_project: deepin:CI target_repository: archlinux architectures: - x86_64 filters: event: pull_request tag_build: steps: - branch_package: source_project: deepin:Develop:dde source_package: %{SCM_REPOSITORY_NAME} target_project: deepin:Unstable:dde filters: event: tag_push commit_build: steps: - trigger_services: project: deepin:Develop:dde package: %{SCM_REPOSITORY_NAME} filters: event: push dtkcore-6.7.46/.packit.yaml000066400000000000000000000007241522615770400155020ustar00rootroot00000000000000# See the documentation for more information: # https://packit.dev/docs/configuration/ specfile_path: rpm/dtkcore.spec # add or remove files that should be synced synced_files: - rpm/dtkcore.spec - .packit.yaml upstream_package_name: dtkcore # downstream (Fedora) RPM package name downstream_package_name: dtkcore actions: fix-spec-file: | bash -c "sed -i -r \"0,/Version:/ s/Version:(\s*)\S*/Version:\1${PACKIT_PROJECT_VERSION}/\" rpm/dtkcore.spec" dtkcore-6.7.46/.project.json000066400000000000000000000002421522615770400156770ustar00rootroot00000000000000{ "Type": "homebrew", "3rdparty": ["tools/qdbusxml2cpp"], "ignore": ["src/translations","src/widgets/assets","doc",".tx"], "license": ["GPLv3"] } dtkcore-6.7.46/.release.json000066400000000000000000000010451522615770400156530ustar00rootroot00000000000000{ "commit": { "quilt": false, "pkgver": "echo $(git tag | sort -V | tail -n1)'+r'$(git log $(git describe --abbrev=0 --tags)..HEAD --oneline|wc -l)'+g'$(git rev-parse --short HEAD);", "dist": "experimental" }, "release": { "quilt": true, "pkgver": "git describe --abbrev=0 --tags %(ref)s", "dist": "unstable" }, "release-candidate": { "quilt": true, "dist": "unstable" } } dtkcore-6.7.46/.reuse/000077500000000000000000000000001522615770400144635ustar00rootroot00000000000000dtkcore-6.7.46/.reuse/dep5000066400000000000000000000031611522615770400152440ustar00rootroot00000000000000Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: dtkcore Upstream-Contact: UnionTech Software Technology Co., Ltd. <> Source: https://github.com/linuxdeepin/dtkcore # Sample paragraph, commented out: # # Files: src/* # Copyright: $YEAR $NAME <$CONTACT> # License: ... # ci Files: .github/* *.yml *.yaml .obs/* .syncexclude Copyright: None License: CC0-1.0 # git Files: .gitignore Copyright: None License: CC0-1.0 # config Files: *.toml *.conf *.json .clang-format Copyright: None License: CC0-1.0 # qt Files: *.pro *.pri *.qrc *.prf Copyright: None License: CC0-1.0 # cmake Files: *.cmake *CMakeLists.txt *.pc.in, cmake/*.in misc/*.in VERSION VERSION.in Copyright: None License: CC0-1.0 # debian Files: debian/* Copyright: None License: CC0-1.0 # Arch Files: archlinux/* Copyright: None License: CC0-1.0 # rpm Files: rpm/* Copyright: None License: CC0-1.0 # docs Files: *.dox *.md src/util/README.dpinyin tools/qdbusxml2cpp/README Copyright: UnionTech Software Technology Co., Ltd. License: CC-BY-4.0 # doxygen src Files: docs/src/* Copyright: None License: CC0-1.0 # interface Files: include/DtkCore/D* Copyright: None License: CC0-1.0 # others Files: src/util/resources/dpinyin.dict tests/data/LGPLv3.txt Copyright: None License: CC0-1.0 #doxygentheme Files: docs/doxygentheme/* Copyright: Copyright (c) 2021 - 2022 jothepro License: MIT #reference Files: docs/references/* Copyright: UnionTech Software Technology Co., Ltd. License: CC-BY-4.0 Files: toolGenerate/**/* Copyright: None License: CC0-1.0 Files: src/log/dconfig_org_deepin_dtk_preference.hpp Copyright: None License: CC0-1.0 dtkcore-6.7.46/.syncexclude000066400000000000000000000004121522615770400156060ustar00rootroot00000000000000# Paths that will be exclude from synchronize workflow # Please use relative path which use project directory as root # Notice that # * .git # * debian # * archlinux # * .obs # * .github # are always ignored linglong.yaml conanfile.py VERSION CHANGELOG.md dtkcore-6.7.46/CHANGELOG.md000066400000000000000000000455151522615770400151050ustar00rootroot00000000000000# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [6.7.46] - 2026-07-16 ### Fixed - Preserve float literal type in JSON config values ## [6.7.45] - 2026-07-09 ### Fixed - Fix serial comparison logic in DConfigCache setValue ## [6.7.44] - 2026-06-17 ## [6.7.43] - 2026-06-04 ### Added - Add version guard for entryList method - Add thread safety for pinyin dictionary initialization - Support full Unicode with UTF-8 byte escaping ### Changed - Chore: New release 6.7.33 - Chore: New release 6.7.34 - Chore: New release 6.7.35 - Chore: New release 6.7.36 - Chore: New release 6.7.37 - Chore: New release 6.7.38 - Update license info loading and search paths - Chore: New release 6.7.39 - Chore: New release 6.7.40 - Move inline function to library codebase - Chore: New release 6.7.41 - Chore: New release 6.7.42 - Replace private access hacks with accessor pattern ### Fixed - Validate subpath format in dconfig - 修� DSysInfo 在 AArch64 架构下的线程安全问题 - Restore dconfig_meta_files macro for DTK5 compatibility - Avoid duplicate logging under systemd with journal - Replace QScopedPointer with raw pointer for DSGConfigManager - Memory leak when overwriting cached DBus property values ### Removed - Remove fallback to file mode in DConfig ## [6.7.42] - 2026-05-20 ### Added - Add version guard for entryList method - Add thread safety for pinyin dictionary initialization - Support full Unicode with UTF-8 byte escaping ### Changed - Chore: New release 6.7.33 - Chore: New release 6.7.34 - Chore: New release 6.7.35 - Chore: New release 6.7.36 - Chore: New release 6.7.37 - Chore: New release 6.7.38 - Update license info loading and search paths - Chore: New release 6.7.39 - Chore: New release 6.7.40 - Move inline function to library codebase - Chore: New release 6.7.41 ### Fixed - Validate subpath format in dconfig - 修� DSysInfo 在 AArch64 架构下的线程安全问题 - Restore dconfig_meta_files macro for DTK5 compatibility - Avoid duplicate logging under systemd with journal - Replace QScopedPointer with raw pointer for DSGConfigManager - Memory leak when overwriting cached DBus property values ### Removed - Remove fallback to file mode in DConfig ## [6.7.41] - 2026-05-08 ### Added - Add version guard for entryList method - Add thread safety for pinyin dictionary initialization - Support full Unicode with UTF-8 byte escaping ### Changed - Chore: New release 6.7.33 - Chore: New release 6.7.34 - Chore: New release 6.7.35 - Chore: New release 6.7.36 - Chore: New release 6.7.37 - Chore: New release 6.7.38 - Update license info loading and search paths - Chore: New release 6.7.39 - Chore: New release 6.7.40 - Move inline function to library codebase ### Fixed - Validate subpath format in dconfig - 修� DSysInfo 在 AArch64 架构下的线程安全问题 - Restore dconfig_meta_files macro for DTK5 compatibility - Avoid duplicate logging under systemd with journal - Replace QScopedPointer with raw pointer for DSGConfigManager ### Removed - Remove fallback to file mode in DConfig ## [6.7.40] - 2026-04-23 ### Added - Add version guard for entryList method - Add thread safety for pinyin dictionary initialization ### Changed - Chore: New release 6.7.33 - Chore: New release 6.7.34 - Chore: New release 6.7.35 - Chore: New release 6.7.36 - Chore: New release 6.7.37 - Chore: New release 6.7.38 - Update license info loading and search paths - Chore: New release 6.7.39 ### Fixed - Validate subpath format in dconfig - 修� DSysInfo 在 AArch64 架构下的线程安全问题 - Restore dconfig_meta_files macro for DTK5 compatibility - Avoid duplicate logging under systemd with journal - Replace QScopedPointer with raw pointer for DSGConfigManager ### Removed - Remove fallback to file mode in DConfig ## [6.7.39] - 2026-04-09 ### Added - Add version guard for entryList method ### Changed - Chore: New release 6.7.33 - Chore: New release 6.7.34 - Chore: New release 6.7.35 - Chore: New release 6.7.36 - Chore: New release 6.7.37 - Chore: New release 6.7.38 - Update license info loading and search paths ### Fixed - Validate subpath format in dconfig - 修� DSysInfo 在 AArch64 架构下的线程安全问题 - Restore dconfig_meta_files macro for DTK5 compatibility - Avoid duplicate logging under systemd with journal - Replace QScopedPointer with raw pointer for DSGConfigManager ### Removed - Remove fallback to file mode in DConfig ## [6.7.38] - 2026-03-31 ### Added - Add version guard for entryList method ### Changed - Chore: New release 6.7.33 - Chore: New release 6.7.34 - Chore: New release 6.7.35 - Chore: New release 6.7.36 - Chore: New release 6.7.37 ### Fixed - Validate subpath format in dconfig - 修� DSysInfo 在 AArch64 架构下的线程安全问题 - Restore dconfig_meta_files macro for DTK5 compatibility - Avoid duplicate logging under systemd with journal - Replace QScopedPointer with raw pointer for DSGConfigManager ### Removed - Remove fallback to file mode in DConfig ## [6.7.37] - 2026-03-25 ### Added - Add version guard for entryList method ### Changed - Chore: New release 6.7.33 - Chore: New release 6.7.34 - Chore: New release 6.7.35 - Chore: New release 6.7.36 ### Fixed - Validate subpath format in dconfig - 修� DSysInfo 在 AArch64 架构下的线程安全问题 - Restore dconfig_meta_files macro for DTK5 compatibility - Avoid duplicate logging under systemd with journal - Replace QScopedPointer with raw pointer for DSGConfigManager ### Removed - Remove fallback to file mode in DConfig ## [6.7.36] - 2026-03-12 ### Changed - Chore: New release 6.7.33 - Chore: New release 6.7.34 - Chore: New release 6.7.35 ### Fixed - Validate subpath format in dconfig - 修� DSysInfo 在 AArch64 架构下的线程安全问题 - Restore dconfig_meta_files macro for DTK5 compatibility - Avoid duplicate logging under systemd with journal ### Removed - Remove fallback to file mode in DConfig ## [6.7.35] - 2026-03-05 ### Changed - Chore: New release 6.7.33 - Chore: New release 6.7.34 ### Fixed - Validate subpath format in dconfig - 修� DSysInfo 在 AArch64 架构下的线程安全问题 - Restore dconfig_meta_files macro for DTK5 compatibility - Avoid duplicate logging under systemd with journal ### Removed - Remove fallback to file mode in DConfig ## [6.7.34] - 2026-02-27 ### Changed - Chore: New release 6.7.33 ### Fixed - Validate subpath format in dconfig - 修� DSysInfo 在 AArch64 架构下的线程安全问题 - Restore dconfig_meta_files macro for DTK5 compatibility - Avoid duplicate logging under systemd with journal ## [6.7.33] - 2026-02-05 ### Fixed - Validate subpath format in dconfig - 修� DSysInfo 在 AArch64 架构下的线程安全问题 - Restore dconfig_meta_files macro for DTK5 compatibility ## [6.7.32] - 2026-01-22 ### Added - Add unit tests for dconfig2cpp generated class - Add version macros and property definitions to dconfig2cpp ### Changed - Replace with the new interface dconfig isInitializeSucceeded ### Fixed - Correct condition check for fallback config in LogManager - Refactor DConfig wrapper class generation for thread safety and lifecycle management - Fix: dconfig2cpp: ensure isInitializeSucceeded() is true only after all ### Removed - Delete workflow call-synchronize-to-dtk6 - Remove dtk5/6 version differentiation in build rules ## [6.7.31] - 2026-01-06 ### Added - Add DTK6 documentation package and improve build profiles ### Changed - Unify DTK5 and DTK6 ### Fixed - Correct pinyin tone number placement and test issues - Fix build with Qt 6.9 ## [5.7.30] - 2025-12-11 ### Added - Add isReadOnly method to DConfig ### Changed - Generate dtkcore_config.h out of source tree ### Fixed - Fix DCI file engine compatibility issues in Qt6 - Correct dtkcore_config.h installation path ## [5.7.28] - 2025-12-04 ## [5.7.27] - 2025-11-27 ### Added - Add reproducible build configuration ## [5.7.26] - 2025-11-06 ### Changed - Chore: New release 5.7.25 - Improve numeric type detection in dconfig2cpp (#516) ### Fixed - 修��些机型CPU型�中包�冒�时控制中心无法读�显示CPU信�的问题 ## [5.7.25] - 2025-10-30 ## [5.7.24] - 2025-10-16 ### Added - Support Qt 6.10 ### Fixed - Replace rmdir with rename for directory operations - Prevent thread-safety issue in D-Bus config manager - Sync with qt5platform-plugins ## [5.7.23] - 2025-09-25 ### Added - Add fallback type conversion in demarshall function ### Changed - Feat: DPinyin::firstLetters support set ToneStyle - 增加�务器教育版和国防版 ### Fixed - Fix trash validation for symlinks - Fix heap-use-after-free issue - Fix dconfig static variable release issue ## [5.7.22] - 2025-09-04 ### Fixed - Resolve non-reproducible DBUS code generation issue ## [5.7.21] - 2025-08-14 ### Added - Add deprecation ignore support for DTK ## [5.7.20] - 2025-07-31 ### Changed - Improve D-Bus resource management with RAII ### Fixed - Use QCoreApplication for application name - Resolve compilation warnings and Qt6 compatibility issues ## [5.7.19] - 2025-07-03 ### Added - Add security hardening flags to build configuration ### Changed - Replace QtDBus with libdbus-1 in dsgapplication ## [5.7.18] - 2025-06-27 ### Fixed - Improve logging rules environment variable handling - Copy cachePrefix in DConfigFile copy constructor - Make version parameter optional in release workflow ## [5.7.17] - 2025-06-18 ### Added - Feat(ci): add auto release - Add license for VERSION.in ### Changed - Support VERSION file - Update .syncexclude ### Fixed - .deepin@main -> .deepin@master ## 5.7.14 (2025-04-12) ### Bug Fixes * resolve compilation failure on Qt 6.9 ## 2.0.14 (2019-05-23) #### Bug Fixes * **DSettings:** crash when calling getOption() if option doesn't exist ([90ac734b](https://github.com/linuxdeepin/dtkcore/commit/90ac734b872203ea698808a7197aa7a9c7e2b5bd)) ## 2.0.12 (2019-04-18) ## 2.0.11 (2019-04-17) #### Bug Fixes * Cross-builds incorrectly, built packages contain paths from build architecture ([8d32577a](https://github.com/linuxdeepin/dtkcore/commit/8d32577a89e54b5c9c834caae83d98e50f59df77)) * https://github.com/linuxdeepin/dtkcore/issues/10 ([3f99873a](https://github.com/linuxdeepin/dtkcore/commit/3f99873a786f6830688ecd0d8d2e2bf8dfb63ce0)) ## 2.0.10 (2019-03-27) #### Bug Fixes * crash at application ([d852a218](https://github.com/linuxdeepin/dtkcore/commit/d852a21811f9f86e04274fc9f732d7c7a210ef3f)) #### Features * add DNotifySender ([89bbcd7c](https://github.com/linuxdeepin/dtkcore/commit/89bbcd7c3821985bb2bca51247394fd4a65b25bf)) ## 2.0.9.17 (2019-02-26) ## 2.0.9.16 (2019-02-26) #### Bug Fixes * deepin-os-release support cpu model and other info query ([cbeb47c9](https://github.com/linuxdeepin/dtkcore/commit/cbeb47c97e31d2b5dd3c198c60ee74332fecb293)) ## 2.0.9.15 (2019-01-25) #### Bug Fixes * failed build the deepin-os-release on Qt 5.7.1 ([8bae8654](https://github.com/linuxdeepin/dtkcore/commit/8bae8654bdb20a7f773130d22b9db139460ba575)) * use main project c/cxx/ld flags on build deepin-os-release ([86dbd507](https://github.com/linuxdeepin/dtkcore/commit/86dbd507c1b3b101c1816f091782430ec1ce20ce)) ## 2.0.9.14 (2019-01-02) ## 2.0.9.13 (2018-12-28) ## 2.0.9.12 (2018-12-24) #### Bug Fixes * **DPathBuf:** missing default constructor ([74374cb4](https://github.com/linuxdeepin/dtkcore/commit/74374cb4cf0245ab1fe73f62fe0d13566f945db3)) #### Features * support connan build ([ba2d213f](https://github.com/linuxdeepin/dtkcore/commit/ba2d213fd6c7e36e118288305e5892c339250623)) ## 2.0.9.11 (2018-12-14) ## 2.0.9.10 (2018-12-05) #### Bug Fixes * include unistd.h instead of sys/unistd.h ([39c50a13](https://github.com/linuxdeepin/dtkcore/commit/39c50a1398c34123e3806a3060a4c64e7f45ed68)) * url encoding ([4a6b7b61](https://github.com/linuxdeepin/dtkcore/commit/4a6b7b61bb3ad9ab417eda69249b5e9aced0aa97)) ## 2.0.9.9 (2018-11-19) #### Features * add DRecentManager class. ([a2defafd](https://github.com/linuxdeepin/dtkcore/commit/a2defafdcf57078461221c665e322287a43d24a8)) #### Bug Fixes * compatibility with Qt 5.6 ([0ec7f3ce](https://github.com/linuxdeepin/dtkcore/commit/0ec7f3ce389b323ecb2b103801c1cd1d55f100fa)) * **drecentmanager:** * xbel file does not exist. ([c57ffe71](https://github.com/linuxdeepin/dtkcore/commit/c57ffe714f26b1a8a8859e2ffbeeed3d75ee11a1)) * uniform url format. ([413a8988](https://github.com/linuxdeepin/dtkcore/commit/413a8988116708ab8bcf9efbb9bc8f52e048efa5)) * url encoded. ([e234a8cc](https://github.com/linuxdeepin/dtkcore/commit/e234a8cc5ad9d2c14a16950838115c4f2f27c605)) * **recent:** chinese doc ([fb256461](https://github.com/linuxdeepin/dtkcore/commit/fb256461d1bdb0862b1a3a129978fc3932a6bcab)) ## 2.0.9.8 (2018-11-09) #### Bug Fixes * can't get correct disk size in some case ([20a12b62](https://github.com/linuxdeepin/dtkcore/commit/20a12b622ea7b01f0616c15a8af85e31fc2d36cb)) ## 2.0.9.5 (2018-10-26) #### Features * update version number for expermimental ([02b5d5c1](https://github.com/linuxdeepin/dtkcore/commit/02b5d5c1e01a05f57651b774b02cae31ef9a549f)) ## 2.0.9 (2018-07-20) #### Bug Fixes * remove qt symbols ([57ec78ba](https://github.com/linuxdeepin/dtkcore/commit/57ec78ba685a53692b0260d3d558d8b0915fc3e4)) * non array type value is wrong on parse josn file ([9f138664](https://github.com/linuxdeepin/dtkcore/commit/9f13866439d8d650893434594da023e7d331d866)) ### 2.0.8.1 (2018-05-14) #### Bug Fixes * update symbols ([f6c53cc4](https://github.com/linuxdeepin/dtkcore/commit/f6c53cc493c1bcf55dca54dbf500e2e484af73c9)) * add LIBDTKCORESHARED_EXPORT for windows ([6fb1096f](https://github.com/linuxdeepin/dtkcore/commit/6fb1096f6d0784937cf84f0e4ae1f5f7587085e5)) * **changelog:** update email format ([cb09a0ca](https://github.com/linuxdeepin/dtkcore/commit/cb09a0cadcf2fa0ba271b1d98d3b96a993eb892b)) ## 2.0.8 (2018-05-02) #### Features * add symbols ([048de455](https://github.com/linuxdeepin/dtkcore/commit/048de4551bdd770aca5e9c12798362f913061654)) ## 2.0.7 (2018-03-01) #### Bug Fixes * cmake link depends ([cdfcff9e](https://github.com/linuxdeepin/dtkcore/commit/cdfcff9e2f3e92bc6dbb45644d2714d6c4dbdda0)) * better static lib support ([99886406](https://github.com/linuxdeepin/dtkcore/commit/99886406a0cae849fad23286fdf64bb399e37da0)) * read settings value failed ([cf1c7698](https://github.com/linuxdeepin/dtkcore/commit/cf1c769893773794dff5a67c235c5d1f3234541a)) * set default should not use ([146529f6](https://github.com/linuxdeepin/dtkcore/commit/146529f6887e798606f2bf763ab8a760969bff26)) * fix dtk-settings install path ([1893cff3](https://github.com/linuxdeepin/dtkcore/commit/1893cff301dacb546a246a4f824dab68eac51351)) * develop package no install the "version.pri" file ([5667b562](https://github.com/linuxdeepin/dtkcore/commit/5667b562630565fca5abed690f3d3478dd3c7603)) * awk script failed ([524a3fa6](https://github.com/linuxdeepin/dtkcore/commit/524a3fa6021ee54db416503520aea65ef0e2c3a0)) * set default build version for debian changelog ([ec6e2a83](https://github.com/linuxdeepin/dtkcore/commit/ec6e2a8376c7aca7162b4fbb782b998c9a6ab630)) * set its value only if VERSION is empty ([1836000c](https://github.com/linuxdeepin/dtkcore/commit/1836000c49eb149a6495322c4cbb1474d5d48204)) #### Features * add hide support for group ([e7e4fb66](https://github.com/linuxdeepin/dtkcore/commit/e7e4fb669276fbce61c6378e74ae82573e7c0313)) * add get option interface ([d8682485](https://github.com/linuxdeepin/dtkcore/commit/d8682485a6737da83fb28f22335f1da1afb8956c)) * add group interface for DSettingsGroup ([c876180f](https://github.com/linuxdeepin/dtkcore/commit/c876180f535e3027dce63628f31379ef874367ed)) * support generate cmake with qt function ([524b0559](https://github.com/linuxdeepin/dtkcore/commit/524b055929b7be84375a45f9d10cbc3a0ecac6de)) * config pkg config with dtk_module ([137b9138](https://github.com/linuxdeepin/dtkcore/commit/137b91388d9b9db24c8136dd4e2c6e690a5712c5)) * support qt module ([17ca0de9](https://github.com/linuxdeepin/dtkcore/commit/17ca0de9156a320cea32208dcff2f8cdf7d6a237)) * add the "version.pri" file ([07aab9fd](https://github.com/linuxdeepin/dtkcore/commit/07aab9fd6478c83c7bae1062f64b4bd20b21869c)) * remove build version from install path ([3bf0bfb5](https://github.com/linuxdeepin/dtkcore/commit/3bf0bfb5f49c3e83d4c36cc33f219150bf3731d8)) * make version parser easier ([6d3b4ead](https://github.com/linuxdeepin/dtkcore/commit/6d3b4ead7080158d1d8977bf7cf99ae842e574ec)) * set verion when build ([9083dbd3](https://github.com/linuxdeepin/dtkcore/commit/9083dbd3e29bf9d06b1032901ba13848fa964f4c)) * add .qmake.conf file ([2890f643](https://github.com/linuxdeepin/dtkcore/commit/2890f643a57c3532ab623410f7c6c6dbfdd6788d)) * add DtkCore and dtkcore_config.h headers ([308a0cc4](https://github.com/linuxdeepin/dtkcore/commit/308a0cc41101499c04308b4ef3bb2fff4ab8d783)) * **DSettings:** support set default value ([5fe9bfd0](https://github.com/linuxdeepin/dtkcore/commit/5fe9bfd0a5e20cef7393639712302825b803db29)) ## 2.0.6 (2018-01-15) ## 2.0.5.3 (2017-12-27) #### Bug Fixes * Adapt lintian ([27df15df](https://github.com/linuxdeepin/dtkcore/commit/27df15df32788002491a24f06f098a5f849a4988)) * break forever loop for syncing backend data ([f70e500e](https://github.com/linuxdeepin/dtkcore/commit/f70e500ec2fd5c751e40833bdc4df586614bcff2)) #### Features * **util:** add dpinyin ([128d7d67](https://github.com/linuxdeepin/dtkcore/commit/128d7d678e921bc580dd732b14a454973397899c)) ## 2.0.5.2 (2017-11-28) #### Bug Fixes * make macosx build success ([af04bbe1](https://github.com/linuxdeepin/dtkcore/commit/af04bbe193a4b4251908f830d927ebdc8f4459e7)) * windows build failed ([66c4c812](https://github.com/linuxdeepin/dtkcore/commit/66c4c812eb29634710642f4e9d6b3d69cc692cb2)) #### Features * add macro D_DECL_DEPRECATED ([89e49868](https://github.com/linuxdeepin/dtkcore/commit/89e49868f113ef01c03bcf5b6846eec95c428382)) ## 2.0.5 (2017-11-06) #### Bug Fixes * build failed on used dbasefilewatcher.h project ([34fbe4b3](34fbe4b3)) * add miss libgsettings-qt-dev ([f61c1b54](f61c1b54)) * not select python version ([7e7e8832](7e7e8832)) #### Features * support gsettingsbackend, remove dsettings-key ([26a29800](26a29800)) * create gsettingsbackend ([b94b97b1](b94b97b1)) dtkcore-6.7.46/CMakeLists.txt000066400000000000000000000016721522615770400160300ustar00rootroot00000000000000cmake_minimum_required (VERSION 3.13) file(READ "${CMAKE_CURRENT_SOURCE_DIR}/VERSION" FILE_VERSION) string(STRIP "${FILE_VERSION}" FILE_VERSION) project (DtkCore VERSION ${FILE_VERSION} DESCRIPTION "DTK Core module" HOMEPAGE_URL "https://github.com/linuxdeepin/dtkcore" LANGUAGES CXX C ) if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) set(CMAKE_INSTALL_PREFIX /usr) endif () include(GNUInstallDirs) include(CMakePackageConfigHelpers) option(DTK5 "Build DTK5." ON) if(DTK5) set(DTK_VERSION_MAJOR "5") set(DTK_NAME_SUFFIX "") # Empty name suffix for DTK5 products. else() set(DTK_VERSION_MAJOR "6") set(DTK_NAME_SUFFIX "6") endif() set(DTK_VERSION_MINOR ${PROJECT_VERSION_MINOR}) set(DTK_VERSION_PATCH ${PROJECT_VERSION_PATCH}) set(DTK_VERSION "${DTK_VERSION_MAJOR}.${DTK_VERSION_MINOR}.${DTK_VERSION_PATCH}") # Officially, DTK5 uses QT5, DTK6 uses QT6 set(QT_VERSION_MAJOR ${DTK_VERSION_MAJOR}) include(dtkcore.cmake) dtkcore-6.7.46/LICENSE000066400000000000000000001221621522615770400142730ustar00rootroot00000000000000GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright © 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. “This License� refers to version 3 of the GNU General Public License. “Copyright� also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. “The Program� refers to any copyrightable work licensed under this License. Each licensee is addressed as “you�. “Licensees� and “recipients� may be individuals or organizations. To “modify� a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version� of the earlier work or a work “based on� the earlier work. A “covered work� means either the unmodified Program or a work based on the Program. To “propagate� a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To “convey� a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays “Appropriate Legal Notices� to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The “source code� for a work means the preferred form of the work for making modifications to it. “Object code� means any non-source form of a work. A “Standard Interface� means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The “System Libraries� of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component�, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The “Corresponding Source� for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices�. c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate� if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A “User Product� is either (1) a “consumer product�, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used� refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. “Installation Information� for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. “Additional permissions� are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered “further restrictions� within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An “entity transaction� is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A “contributor� is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version�. A contributor's “essential patent claims� are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control� includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a “patent license� is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant� such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying� means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is “discriminatory� if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version� applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS� WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright� line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an “about box�. You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer� for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . dtkcore-6.7.46/LICENSES/000077500000000000000000000000001522615770400144675ustar00rootroot00000000000000dtkcore-6.7.46/LICENSES/BSD-3-Clause.txt000066400000000000000000000026641522615770400172220ustar00rootroot00000000000000Copyright (c) . Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dtkcore-6.7.46/LICENSES/CC-BY-4.0.txt000066400000000000000000000411771522615770400163360ustar00rootroot00000000000000Creative Commons Attribution 4.0 International Creative Commons Corporation (“Creative Commons�) is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an “as-is� basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible. Using Creative Commons Public Licenses Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses. Considerations for licensors: Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC-licensed material, or material used under an exception or limitation to copyright. More considerations for licensors. Considerations for the public: By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor’s permission is not necessary for any reason–for example, because of any applicable exception or limitation to copyright–then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. More considerations for the public. Creative Commons Attribution 4.0 International Public License By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. Section 1 – Definitions. a. Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. b. Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. c. Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. d. Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. e. Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. f. Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License. g. Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. h. Licensor means the individual(s) or entity(ies) granting rights under this Public License. i. Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. j. Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. k. You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. Section 2 – Scope. a. License grant. 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: A. reproduce and Share the Licensed Material, in whole or in part; and B. produce, reproduce, and Share Adapted Material. 2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. 3. Term. The term of this Public License is specified in Section 6(a). 4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material. 5. Downstream recipients. A. Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. B. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. 6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). b. Other rights. 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. 2. Patent and trademark rights are not licensed under this Public License. 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties. Section 3 – License Conditions. Your exercise of the Licensed Rights is expressly made subject to the following conditions. a. Attribution. 1. If You Share the Licensed Material (including in modified form), You must: A. retain the following if it is supplied by the Licensor with the Licensed Material: i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); ii. a copyright notice; iii. a notice that refers to this Public License; iv. a notice that refers to the disclaimer of warranties; v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; B. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and C. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. 2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. 3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. 4. If You Share Adapted Material You produce, the Adapter's License You apply must not prevent recipients of the Adapted Material from complying with this Public License. Section 4 – Sui Generis Database Rights. Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database; b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material; and c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. Section 5 – Disclaimer of Warranties and Limitation of Liability. a. Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You. b. To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You. c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. Section 6 – Term and Termination. a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or 2. upon express reinstatement by the Licensor. c. For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. d. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. e. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. Section 7 – Other Terms and Conditions. a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. Section 8 – Interpretation. a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.� Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at creativecommons.org/policies, Creative Commons does not authorize the use of the trademark “Creative Commons� or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses. Creative Commons may be contacted at creativecommons.org. dtkcore-6.7.46/LICENSES/CC0-1.0.txt000066400000000000000000000156101522615770400160740ustar00rootroot00000000000000Creative Commons Legal Code CC0 1.0 Universal CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER. Statement of Purpose The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an "owner") of an original work of authorship and/or a database (each, a "Work"). Certain owners wish to permanently relinquish those rights to a Work for the purpose of contributing to a commons of creative, cultural and scientific works ("Commons") that the public can reliably and without fear of later claims of infringement build upon, modify, incorporate in other works, reuse and redistribute as freely as possible in any form whatsoever and for any purposes, including without limitation commercial purposes. These owners may contribute to the Commons to promote the ideal of a free culture and the further production of creative, cultural and scientific works, or to gain reputation or greater distribution for their Work in part through the use and efforts of others. For these and/or other purposes and motivations, and without any expectation of additional consideration or compensation, the person associating CC0 with a Work (the "Affirmer"), to the extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on those rights. 1. Copyright and Related Rights. A Work made available under CC0 may be protected by copyright and related or neighboring rights ("Copyright and Related Rights"). Copyright and Related Rights include, but are not limited to, the following: i. the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work; ii. moral rights retained by the original author(s) and/or performer(s); iii. publicity and privacy rights pertaining to a person's image or likeness depicted in a Work; iv. rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(a), below; v. rights protecting the extraction, dissemination, use and reuse of data in a Work; vi. database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and vii. other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof. 2. Waiver. To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer's Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer's heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer's express Statement of Purpose. 3. Public License Fallback. Should any part of the Waiver for any reason be judged legally invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum extent permitted taking into account Affirmer's express Statement of Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, non transferable, non sublicensable, non exclusive, irrevocable and unconditional license to exercise Affirmer's Copyright and Related Rights in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "License"). The License shall be deemed effective as of the date CC0 was applied by Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate the remainder of the License, and in such case Affirmer hereby affirms that he or she will not (i) exercise any of his or her remaining Copyright and Related Rights in the Work or (ii) assert any associated claims and causes of action with respect to the Work, in either case contrary to Affirmer's express Statement of Purpose. 4. Limitations and Disclaimers. a. No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document. b. Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law. c. Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work. d. Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work. dtkcore-6.7.46/LICENSES/LGPL-2.1-or-later.txt000066400000000000000000000624621522615770400200210ustar00rootroot00000000000000GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. < signature of Ty Coon > , 1 April 1990 Ty Coon, President of Vice That's all there is to it! dtkcore-6.7.46/LICENSES/LGPL-3.0-or-later.txt000066400000000000000000001221621522615770400200130ustar00rootroot00000000000000GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright © 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. “This License� refers to version 3 of the GNU General Public License. “Copyright� also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. “The Program� refers to any copyrightable work licensed under this License. Each licensee is addressed as “you�. “Licensees� and “recipients� may be individuals or organizations. To “modify� a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version� of the earlier work or a work “based on� the earlier work. A “covered work� means either the unmodified Program or a work based on the Program. To “propagate� a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To “convey� a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays “Appropriate Legal Notices� to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The “source code� for a work means the preferred form of the work for making modifications to it. “Object code� means any non-source form of a work. A “Standard Interface� means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The “System Libraries� of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component�, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The “Corresponding Source� for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices�. c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate� if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A “User Product� is either (1) a “consumer product�, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used� refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. “Installation Information� for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. “Additional permissions� are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered “further restrictions� within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An “entity transaction� is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A “contributor� is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version�. A contributor's “essential patent claims� are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control� includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a “patent license� is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant� such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying� means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is “discriminatory� if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version� applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS� WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright� line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an “about box�. You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer� for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . dtkcore-6.7.46/README.md000066400000000000000000000032151522615770400145420ustar00rootroot00000000000000## Deepin Tool Kit Core Deepin Tool Kit (DtkCore) is the base development tool of all C++/Qt Developer work on Deepin. You should read the Deepin Application Specification firstly. 中文说明:[README.zh_CN.md](./README.zh_CN.md) ## Document 中文文档:[dtkcore文档](https://linuxdeepin.github.io/dtkcore/index.html) ## Dependencies ### Build dependencies * Qt >= 5.10 ## Compile option | **Compile option** | **meaning** | **Default state** | |--------------------|-------------|---------------| | BUILD_DOCS | Compile document | ON | | BUILD_TESTING | Compile test | Default is ON in debug mode | | BUILD_EXAMPLES | Compile example | ON | | BUILD_WITH_SYSTEMD | Support Systemd function | OFF | | BUILD_THEME | Add themes to the document | OFF | ## Installation ### Build from source code 1. Make sure you have installed all dependencies. 2. Build: ```bash mkdir build cd build cmake .. make ``` 3. Install: ```bash sudo make install ``` ## Getting help Any usage issues can ask for help via * [Telegram group](https://t.me/deepin) * [Matrix](https://matrix.to/#/#deepin-community:matrix.org) * [IRC (libera.chat)](https://web.libera.chat/#deepin-community) * [Forum](https://bbs.deepin.org) * [WiKi](https://wiki.deepin.org/) ## Getting involved We encourage you to report issues and contribute changes * [Contribution guide for developers](https://github.com/linuxdeepin/developer-center/wiki/Contribution-Guidelines-for-Developers-en). ## License deepin-tool-kit is licensed under [LGPL-3.0-or-later](LICENSE). dtkcore-6.7.46/README.zh_CN.md000066400000000000000000000030251522615770400155410ustar00rootroot00000000000000## Deepin Tool Kit Core Deepin Tool Kit Core(DtkCore) 是所有C++/Qt开�人员在Deepin上工作的基础开�工具. 您应该首先阅读 Deepin应用程�规范. ## 文档 中文文档:[dtkcore文档](https://linuxdeepin.github.io/dtkcore/index.html) ## �赖 ### 编译�赖 * Qt >= 5.10 ## 编译选项 | **编译选项** | **�义** | **默认状�** | |--------------------|-------------|---------------| | BUILD_DOCS | 编译文档 | ON | | BUILD_TESTING | 编译测试 | Debug模�下默认为ON | | BUILD_EXAMPLES | 编译示例 | ON | | BUILD_WITH_SYSTEMD | 支�Systmed功能 | OFF | | BUILD_THEME | 为文档添加主题 | OFF | ## 安装 ### 从�代�构建 1. 确�已�安装了所有的编译�赖. 2. 构建: ```bash mkdir build cd build cmake .. make ``` 3. 安装: ```bash sudo make install ``` ## 帮助 任何使用问题都�以通过以下方�寻求帮助: * [Telegram 群组](https://t.me/deepin) * [Matrix](https://matrix.to/#/#deepin-community:matrix.org) * [IRC (libera.chat)](https://web.libera.chat/#deepin-community) * [Forum](https://bbs.deepin.org) * [WiKi](https://wiki.deepin.org/) ## �与贡献 我们鼓励您报告问题并作出更改 * [开�者代�贡献指�](https://github.com/linuxdeepin/developer-center/wiki/Contribution-Guidelines-for-Developers) ## �议 DTK工具包�循�议 [LGPL-3.0-or-later](LICENSE). dtkcore-6.7.46/VERSION000066400000000000000000000000071522615770400143270ustar00rootroot000000000000006.7.46 dtkcore-6.7.46/VERSION.in000066400000000000000000000000121522615770400147300ustar00rootroot00000000000000@version@ dtkcore-6.7.46/archlinux/000077500000000000000000000000001522615770400152575ustar00rootroot00000000000000dtkcore-6.7.46/archlinux/PKGBUILD000066400000000000000000000020221522615770400163770ustar00rootroot00000000000000# Maintainer: justforlxz pkgname=dtkcore-git pkgver=6.7.46 pkgrel=1 sourcename=dtkcore sourcetars=("$sourcename"_"$pkgver".tar.xz) sourcedir="$sourcename" pkgdesc='DTK core modules' arch=('x86_64' 'aarch64') url="https://github.com/linuxdeepin/dtkcore" license=('LGPL3') depends=('deepin-desktop-base-git' 'gsettings-qt' 'dtkcommon-git' 'lshw' 'uchardet' 'icu' 'libsystemd' 'spdlog') makedepends=('git' 'qt5-tools' 'ninja' 'cmake' 'doxygen') conflicts=('dtkcore') provides=('dtkcore') groups=('deepin-git') source=("${sourcetars[@]}") sha512sums=('SKIP') build() { cd $sourcedir cmake \ -GNinja \ -DMKSPECS_INSTALL_DIR=lib/qt/mkspecs/modules \ -DBUILD_DOCS=ON \ -DBUILD_WITH_SYSTEMD=ON \ -DBUILD_EXAMPLES=OFF \ -DQCH_INSTALL_DESTINATION=share/doc/qt \ -DCMAKE_INSTALL_LIBDIR=lib \ -DCMAKE_INSTALL_PREFIX=/usr \ -DCMAKE_BUILD_TYPE=Release \ -DD_DSG_APP_DATA_FALLBACK=/var/dsg/appdata \ -DDTK5=ON ninja } package() { cd $sourcedir DESTDIR="$pkgdir" ninja install } dtkcore-6.7.46/cmake/000077500000000000000000000000001522615770400143425ustar00rootroot00000000000000dtkcore-6.7.46/cmake/DtkCMake/000077500000000000000000000000001522615770400157655ustar00rootroot00000000000000dtkcore-6.7.46/cmake/DtkCMake/DtkCMakeConfig.cmake000066400000000000000000000050471522615770400215460ustar00rootroot00000000000000function(addDefinitions macro) string(TOUPPER ${macro} macro) add_definitions(-D${macro}) endfunction() add_definitions(-DQ_HOST_NAME=\"${CMAKE_HOST_SYSTEM_PROCESSOR}\") addDefinitions(Q_HOST_${CMAKE_HOST_SYSTEM_PROCESSOR}) find_package(DtkCore REQUIRED) set(DEEPIN_OS_RELEASE_TOOL_PATH ${DtkCore_TOOL_DIRS}) set(DEEPIN_OS_RELEASE_TOOL ${DEEPIN_OS_RELEASE_TOOL_PATH}/deepin-os-release) if(NOT EXISTS "${DEEPIN_OS_RELEASE_TOOL}") message(FATAL_ERROR "\"${DEEPIN_OS_RELEASE_TOOL}\" is not exists. Install \"dtkcore-bin\" first") endif() function(formatString string) string(REGEX REPLACE "\\s+" "_" string ${string}) endfunction() macro(execDeepinOsRelease args output) exec_program(${DEEPIN_OS_RELEASE_TOOL} ARGS ${args} OUTPUT_VARIABLE ${output} RETURN_VALUE exitCode) if(NOT ${exitCode} EQUAL 0) message(FATAL_ERROR "exec deepin-os-release failed, with args: ${args}, error message: ${output}") endif() endmacro() execDeepinOsRelease(--deepin-type DEEPIN_OS_TYPE) execDeepinOsRelease(--deepin-version DEEPIN_OS_VERSION) execDeepinOsRelease(--product-type CMAKE_PLATFORM_ID) execDeepinOsRelease(--product-version CMAKE_PLATFORM_VERSION) if("${CMAKE_PLATFORM_ID}" STREQUAL "") message(WARNING "No value of the \"--product-type\" in the process \"${DEEPIN_OS_RELEASE_TOOL}\"") else() formatString(CMAKE_PLATFORM_ID) message("OS: ${CMAKE_PLATFORM_ID}, Version: ${CMAKE_PLATFORM_VERSION}") if(NOT "${CMAKE_PLATFORM_ID}" STREQUAL "") addDefinitions(Q_OS_${CMAKE_PLATFORM_ID}) string(TOUPPER ${CMAKE_PLATFORM_ID} CMAKE_PLATFORM_ID) set(OS_${CMAKE_PLATFORM_ID} TRUE) endif() formatString(CMAKE_PLATFORM_VERSION) add_definitions(-DQ_OS_VERSION=\"${CMAKE_PLATFORM_VERSION}\") #uos base with deepin if("${CMAKE_PLATFORM_ID}" STREQUAL "UOS") addDefinitions(Q_OS_DEEPIN) set(OS_DEEPIN TRUE) endif() endif() if("${DEEPIN_OS_TYPE}" STREQUAL "") message(WARNING "No value of the \"--deepin-type\" in the process \"${DEEPIN_OS_RELEASE_TOOL}\"") else() formatString(DEEPIN_OS_TYPE) message("Deepin OS Type: ${DEEPIN_OS_TYPE}") message("Deepin OS Version: ${DEEPIN_OS_VERSION}") if(NOT "${DEEPIN_OS_TYPE}" STREQUAL "") addDefinitions(Q_OS_DEEPIN_${DEEPIN_OS_TYPE}) addDefinitions(DEEPIN_DDE) string(TOUPPER ${DEEPIN_OS_TYPE} DEEPIN_OS_TYPE) set(OS_DEEPIN_${DEEPIN_OS_TYPE} TRUE) set(DEEPIN_DDE TRUE) endif() formatString(DEEPIN_OS_VERSION) add_definitions(-DQ_OS_DEEPIN_VERSION=\"${DEEPIN_OS_VERSION}\") endif() dtkcore-6.7.46/cmake/DtkCMake/DtkCMakeConfig.cmake.in000066400000000000000000000050701522615770400221470ustar00rootroot00000000000000function(addDefinitions macro) string(TOUPPER ${macro} macro) add_definitions(-D${macro}) endfunction() add_definitions(-DQ_HOST_NAME=\"${CMAKE_HOST_SYSTEM_PROCESSOR}\") addDefinitions(Q_HOST_${CMAKE_HOST_SYSTEM_PROCESSOR}) find_package(Dtk@DTK_NAME_SUFFIX@Core REQUIRED) set(DEEPIN_OS_RELEASE_TOOL_PATH ${DtkCore_TOOL_DIRS}) set(DEEPIN_OS_RELEASE_TOOL ${DEEPIN_OS_RELEASE_TOOL_PATH}/deepin-os-release) if(NOT EXISTS "${DEEPIN_OS_RELEASE_TOOL}") message(FATAL_ERROR "\"${DEEPIN_OS_RELEASE_TOOL}\" is not exists. Install \"dtkcore-bin\" first") endif() function(formatString string) string(REGEX REPLACE "\\s+" "_" string ${string}) endfunction() macro(execDeepinOsRelease args output) exec_program(${DEEPIN_OS_RELEASE_TOOL} ARGS ${args} OUTPUT_VARIABLE ${output} RETURN_VALUE exitCode) if(NOT ${exitCode} EQUAL 0) message(FATAL_ERROR "exec deepin-os-release failed, with args: ${args}, error message: ${output}") endif() endmacro() execDeepinOsRelease(--deepin-type DEEPIN_OS_TYPE) execDeepinOsRelease(--deepin-version DEEPIN_OS_VERSION) execDeepinOsRelease(--product-type CMAKE_PLATFORM_ID) execDeepinOsRelease(--product-version CMAKE_PLATFORM_VERSION) if("${CMAKE_PLATFORM_ID}" STREQUAL "") message(WARNING "No value of the \"--product-type\" in the process \"${DEEPIN_OS_RELEASE_TOOL}\"") else() formatString(CMAKE_PLATFORM_ID) message("OS: ${CMAKE_PLATFORM_ID}, Version: ${CMAKE_PLATFORM_VERSION}") if(NOT "${CMAKE_PLATFORM_ID}" STREQUAL "") addDefinitions(Q_OS_${CMAKE_PLATFORM_ID}) string(TOUPPER ${CMAKE_PLATFORM_ID} CMAKE_PLATFORM_ID) set(OS_${CMAKE_PLATFORM_ID} TRUE) endif() formatString(CMAKE_PLATFORM_VERSION) add_definitions(-DQ_OS_VERSION=\"${CMAKE_PLATFORM_VERSION}\") #uos base with deepin if("${CMAKE_PLATFORM_ID}" STREQUAL "UOS") addDefinitions(Q_OS_DEEPIN) set(OS_DEEPIN TRUE) endif() endif() if("${DEEPIN_OS_TYPE}" STREQUAL "") message(WARNING "No value of the \"--deepin-type\" in the process \"${DEEPIN_OS_RELEASE_TOOL}\"") else() formatString(DEEPIN_OS_TYPE) message("Deepin OS Type: ${DEEPIN_OS_TYPE}") message("Deepin OS Version: ${DEEPIN_OS_VERSION}") if(NOT "${DEEPIN_OS_TYPE}" STREQUAL "") addDefinitions(Q_OS_DEEPIN_${DEEPIN_OS_TYPE}) addDefinitions(DEEPIN_DDE) string(TOUPPER ${DEEPIN_OS_TYPE} DEEPIN_OS_TYPE) set(OS_DEEPIN_${DEEPIN_OS_TYPE} TRUE) set(DEEPIN_DDE TRUE) endif() formatString(DEEPIN_OS_VERSION) add_definitions(-DQ_OS_DEEPIN_VERSION=\"${DEEPIN_OS_VERSION}\") endif() dtkcore-6.7.46/cmake/DtkDConfig/000077500000000000000000000000001522615770400163165ustar00rootroot00000000000000dtkcore-6.7.46/cmake/DtkDConfig/DtkDConfigConfig.cmake000066400000000000000000000073221522615770400224260ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2022 - 2023 Uniontech Software Technology Co.,Ltd. # # SPDX-License-Identifier: LGPL-3.0-or-later # This cmake file is used to deploy files that dconfig's meta and override configure. include(CMakeParseArguments) # get subpath according `FILE` and `BASE`. # e.g: FILE = /a/b/c/d/foo.json, BASE = /a/b, then return SUBPATH = /c/d/ function(get_subpath FILE BASE SUBPATH) get_filename_component(BASE_FILE_PATH ${BASE} REALPATH) get_filename_component(FILE_PATH ${FILE} REALPATH) string(REPLACE ${BASE_FILE_PATH} "" SUBPATH_FILE_NAME ${FILE_PATH}) get_filename_component(SUBPATH_PATH ${SUBPATH_FILE_NAME} DIRECTORY) set(${SUBPATH} ${SUBPATH_PATH} PARENT_SCOPE) endfunction() if(NOT DEFINED DSG_DATA_DIR) set(DSG_DATA_DIR ${CMAKE_INSTALL_PREFIX}/share/dsg) endif() add_definitions(-DDSG_DATA_DIR=\"${DSG_DATA_DIR}\") # deploy some `meta` 's configure. # # FILES - deployed files. # BASE - used to get subpath, if it's empty, only copy files, and ignore it's subpath structure. # APPID - working for the app. # COMMONID - working for common. # # e.g: # dtk_add_config_meta_files(APPID dconfigexample BASE ./configs FILES ./configs/example.json ./configs/a/example.json) # function(dtk_add_config_meta_files) set(oneValueArgs BASE APPID COMMONID) set(multiValueArgs FILES) cmake_parse_arguments(METAITEM "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) foreach(_current_FILE ${METAITEM_FILES}) set(SUBPATH "") if (DEFINED METAITEM_BASE) GET_SUBPATH(${_current_FILE} ${METAITEM_BASE} SUBPATH) endif() if (DEFINED METAITEM_APPID) install(FILES "${_current_FILE}" DESTINATION ${DSG_DATA_DIR}/configs/${METAITEM_APPID}/${SUBPATH}) elseif (DEFINED METAITEM_COMMONID) install(FILES ${_current_FILE} DESTINATION ${DSG_DATA_DIR}/configs/${SUBPATH}) else() message(FATAL_ERROR "Please set APPID or COMMONID for the meta item." ${_current_FILE}) endif() endforeach() endfunction() # deploy some `meta` 's override configure. # # configuration for the `meta_name` 's override configure. # # FILES - deployed files. # BASE - used to get subpath, if it's empty, only copy files, and ignore it's subpath structure. # APPID - working for the app, if it's empty, working for all app. # META_NAME - override for the meta configure. # # e.g : #dtk_add_config_override_files(APPID dconfigexample BASE ./configs META_NAME example FILES ./configs/dconf-example.override.json ./configs/a/dconf-example.override.a.json) # function(dtk_add_config_override_files) set(options) set(oneValueArgs BASE APPID META_NAME) set(multiValueArgs FILES) cmake_parse_arguments(OVERRIDEITEM "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) if (NOT DEFINED OVERRIDEITEM_META_NAME) message(FATAL_ERROR "Please set meta_name for the override configuration." ${FILES}) endif() foreach(_current_FILE ${OVERRIDEITEM_FILES}) set(SUBPATH "") if (DEFINED OVERRIDEITEM_BASE) GET_SUBPATH(${_current_FILE} ${OVERRIDEITEM_BASE} SUBPATH) endif() if (DEFINED OVERRIDEITEM_APPID) install(FILES "${_current_FILE}" DESTINATION ${DSG_DATA_DIR}/configs/overrides/${OVERRIDEITEM_APPID}/${OVERRIDEITEM_META_NAME}/${SUBPATH}) else() install(FILES "${_current_FILE}" DESTINATION ${DSG_DATA_DIR}/configs/overrides/${OVERRIDEITEM_META_NAME}/${SUBPATH}) endif() endforeach() endfunction() # deprecated since dtk6 function(dconfig_meta_files) dtk_add_config_meta_files(${ARGV}) endfunction() function(dconfig_override_files) dtk_add_config_override_files(${ARGV}) endfunction() dtkcore-6.7.46/cmake/DtkDConfig/DtkDConfigConfig.cmake.in000066400000000000000000000070511522615770400230320ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2022 - 2023 Uniontech Software Technology Co.,Ltd. # # SPDX-License-Identifier: LGPL-3.0-or-later # This cmake file is used to deploy files that dconfig's meta and override configure. include(CMakeParseArguments) # get subpath according `FILE` and `BASE`. # e.g: FILE = /a/b/c/d/foo.json, BASE = /a/b, then return SUBPATH = /c/d/ function(get_subpath FILE BASE SUBPATH) get_filename_component(BASE_FILE_PATH ${BASE} REALPATH) get_filename_component(FILE_PATH ${FILE} REALPATH) string(REPLACE ${BASE_FILE_PATH} "" SUBPATH_FILE_NAME ${FILE_PATH}) get_filename_component(SUBPATH_PATH ${SUBPATH_FILE_NAME} DIRECTORY) set(${SUBPATH} ${SUBPATH_PATH} PARENT_SCOPE) endfunction() if(NOT DEFINED DSG_DATA_DIR) set(DSG_DATA_DIR ${CMAKE_INSTALL_PREFIX}/share/dsg) endif() add_definitions(-DDSG_DATA_DIR=\"${DSG_DATA_DIR}\") # deploy some `meta` 's configure. # # FILES - deployed files. # BASE - used to get subpath, if it's empty, only copy files, and ignore it's subpath structure. # APPID - working for the app. # COMMONID - working for common. # # e.g: # dtk_add_config_meta_files(APPID dconfigexample BASE ./configs FILES ./configs/example.json ./configs/a/example.json) # function(dtk_add_config_meta_files) set(oneValueArgs BASE APPID COMMONID) set(multiValueArgs FILES) cmake_parse_arguments(METAITEM "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) foreach(_current_FILE ${METAITEM_FILES}) set(SUBPATH "") if (DEFINED METAITEM_BASE) GET_SUBPATH(${_current_FILE} ${METAITEM_BASE} SUBPATH) endif() if (DEFINED METAITEM_APPID) install(FILES "${_current_FILE}" DESTINATION ${DSG_DATA_DIR}/configs/${METAITEM_APPID}/${SUBPATH}) elseif (DEFINED METAITEM_COMMONID) install(FILES ${_current_FILE} DESTINATION ${DSG_DATA_DIR}/configs/${SUBPATH}) else() message(FATAL_ERROR "Please set APPID or COMMONID for the meta item." ${_current_FILE}) endif() endforeach() endfunction() # deploy some `meta` 's override configure. # # configuration for the `meta_name` 's override configure. # # FILES - deployed files. # BASE - used to get subpath, if it's empty, only copy files, and ignore it's subpath structure. # APPID - working for the app, if it's empty, working for all app. # META_NAME - override for the meta configure. # # e.g : #dtk_add_config_override_files(APPID dconfigexample BASE ./configs META_NAME example FILES ./configs/dconf-example.override.json ./configs/a/dconf-example.override.a.json) # function(dtk_add_config_override_files) set(options) set(oneValueArgs BASE APPID META_NAME) set(multiValueArgs FILES) cmake_parse_arguments(OVERRIDEITEM "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) if (NOT DEFINED OVERRIDEITEM_META_NAME) message(FATAL_ERROR "Please set meta_name for the override configuration." ${FILES}) endif() foreach(_current_FILE ${OVERRIDEITEM_FILES}) set(SUBPATH "") if (DEFINED OVERRIDEITEM_BASE) GET_SUBPATH(${_current_FILE} ${OVERRIDEITEM_BASE} SUBPATH) endif() if (DEFINED OVERRIDEITEM_APPID) install(FILES "${_current_FILE}" DESTINATION ${DSG_DATA_DIR}/configs/overrides/${OVERRIDEITEM_APPID}/${OVERRIDEITEM_META_NAME}/${SUBPATH}) else() install(FILES "${_current_FILE}" DESTINATION ${DSG_DATA_DIR}/configs/overrides/${OVERRIDEITEM_META_NAME}/${SUBPATH}) endif() endforeach() endfunction() @DCONFIG_DEPRECATED_FUNCS@ dtkcore-6.7.46/cmake/DtkTools/000077500000000000000000000000001522615770400161055ustar00rootroot00000000000000dtkcore-6.7.46/cmake/DtkTools/DtkDBusMacros.cmake000066400000000000000000000053221522615770400215560ustar00rootroot00000000000000# Copyright 2005-2011 Kitware, Inc. # Copyright (C) 2022 The Qt Company Ltd. # SPDX-License-Identifier: BSD-3-Clause include(MacroAddFileDependencies) include(CMakeParseArguments) function(dtk_add_dbus_interface _sources _interface _relativename) get_filename_component(_infile ${_interface} ABSOLUTE) get_filename_component(_basepath ${_relativename} DIRECTORY) get_filename_component(_basename ${_relativename} NAME) set(_header "${CMAKE_CURRENT_BINARY_DIR}/${_relativename}.h") set(_impl "${CMAKE_CURRENT_BINARY_DIR}/${_relativename}.cpp") if(${QT_VERSION_MAJOR} EQUAL "5") if(_basepath) set(_moc "${CMAKE_CURRENT_BINARY_DIR}/${_basepath}/${_basename}.moc") else() set(_moc "${CMAKE_CURRENT_BINARY_DIR}/${_basename}.moc") endif() else() if(_basepath) set(_moc "${CMAKE_CURRENT_BINARY_DIR}/${_basepath}/moc_${_basename}.cpp") else() set(_moc "${CMAKE_CURRENT_BINARY_DIR}/moc_${_basename}.cpp") endif() endif() get_source_file_property(_nonamespace ${_interface} NO_NAMESPACE) if(_nonamespace) set(_params -N -m) else() set(_params -m) endif() get_source_file_property(_skipincludeannotations ${_interface} SKIP_INCLUDE_ANNOTATIONS) if(_skipincludeannotations) set(_params ${_params} -S) endif() get_source_file_property(_classname ${_interface} CLASSNAME) if(_classname) set(_params ${_params} -c ${_classname}) endif() get_source_file_property(_include ${_interface} INCLUDE) if(_include) set(_params ${_params} -i ${_include}) endif() add_custom_command(OUTPUT "${_impl}" "${_header}" COMMAND ${DTK_XML2CPP} ${_params} -p ${_relativename} ${_infile} DEPENDS ${_infile} ${DTK_XML2CPP} VERBATIM ) set_source_files_properties("${_impl}" "${_header}" PROPERTIES SKIP_AUTOMOC TRUE SKIP_AUTOUIC TRUE ) qt_generate_moc("${_header}" "${_moc}") list(APPEND ${_sources} "${_impl}" "${_header}") set_property(SOURCE "${_impl}" APPEND PROPERTY OBJECT_DEPENDS "${_moc}") set(${_sources} ${${_sources}} PARENT_SCOPE) endfunction() function(dtk_add_dbus_interfaces _sources) foreach(_current_FILE ${ARGN}) get_filename_component(_infile ${_current_FILE} ABSOLUTE) get_filename_component(_basename ${_current_FILE} NAME) # get the part before the ".xml" suffix string(TOLOWER ${_basename} _basename) string(REGEX REPLACE "(.*\\.)?([^\\.]+)\\.xml" "\\2" _basename ${_basename}) dtk_add_dbus_interface(${_sources} ${_infile} ${_basename}interface) endforeach() set(${_sources} ${${_sources}} PARENT_SCOPE) endfunction() dtkcore-6.7.46/cmake/DtkTools/DtkDConfigMacros.cmake000066400000000000000000000027011522615770400222300ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd. # SPDX-License-Identifier: LGPL-3.0-or-later include(MacroAddFileDependencies) include(CMakeParseArguments) # Define the helper function function(dtk_add_config_to_cpp OUTPUT_VAR JSON_FILE) if(NOT EXISTS ${JSON_FILE}) message(FATAL_ERROR "JSON file ${JSON_FILE} does not exist.") endif() cmake_parse_arguments( "arg" "" "OUTPUT_FILE_NAME;CLASS_NAME" "" ${ARGN} ) # Generate the output header file name get_filename_component(FILE_NAME_WLE ${JSON_FILE} NAME_WLE) if(DEFINED arg_OUTPUT_FILE_NAME) set(OUTPUT_HEADER "${CMAKE_CURRENT_BINARY_DIR}/${arg_OUTPUT_FILE_NAME}") else() set(OUTPUT_HEADER "${CMAKE_CURRENT_BINARY_DIR}/dconfig_${FILE_NAME_WLE}.hpp") endif() # Check if CLASS_NAME is set if(DEFINED arg_CLASS_NAME) set(CLASS_NAME_ARG -c ${arg_CLASS_NAME}) else() set(CLASS_NAME_ARG "") endif() # Add a custom command to run dconfig2cpp add_custom_command( OUTPUT ${OUTPUT_HEADER} COMMAND ${DTK_DCONFIG2CPP} -o ${OUTPUT_HEADER} ${CLASS_NAME_ARG} ${JSON_FILE} DEPENDS ${JSON_FILE} ${DTK_XML2CPP} COMMENT "Generating ${OUTPUT_HEADER} from ${JSON_FILE}" VERBATIM ) # Add the generated header to the specified output variable set(${OUTPUT_VAR} ${${OUTPUT_VAR}} ${OUTPUT_HEADER} PARENT_SCOPE) endfunction() dtkcore-6.7.46/cmake/DtkTools/DtkSettingsToolsMacros.cmake000066400000000000000000000053571522615770400235520ustar00rootroot00000000000000#============================================================================= # Copyright 2019 Deepin Technology Co., Ltd. # Copyright 2019 Gary Wang # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # * Neither the name of authors nor the names of its # contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #============================================================================= function(DTK_CREATE_I18N_FROM_JSON _generated_file_list _input_json_file _output_cpp_file_name) set (generated_file_list) # 0(failed) or 1(succeeded) files in the list. get_filename_component(_input_json_abs_path ${_input_json_file} ABSOLUTE) get_filename_component(_input_json_abs_dir ${_input_json_abs_path} DIRECTORY) set (_output_cpp_abs_path ${_input_json_abs_dir}/${_output_cpp_file_name}) if (DTK_SETTINGS_TOOLS_FOUND) add_custom_command(OUTPUT ${_output_cpp_abs_path} COMMAND ${DTK_SETTINGS_TOOLS_EXECUTABLE} ARGS ${_input_json_abs_path} -o ${_output_cpp_abs_path} DEPENDS ${_input_json_abs_path} VERBATIM) list(APPEND generated_file_list ${_output_cpp_abs_path}) else () message (WARNING "The dtk-settings tools could not be found at ${DTK_SETTINGS_TOOLS_EXECUTABLE}") message (WARNING "Package distributor may create a separated package for tools like `libdtkcore-bin`.") endif () set(${_generated_file_list} ${generated_file_list} PARENT_SCOPE) endfunction() dtkcore-6.7.46/cmake/DtkTools/DtkToolsConfig.cmake.in000066400000000000000000000012501522615770400224030ustar00rootroot00000000000000include(CMakeFindDependencyMacro) find_dependency(Dtk@DTK_NAME_SUFFIX@Core REQUIRED) set (DTK_SETTINGS_TOOLS_EXECUTABLE ${DtkCore_TOOL_DIRS}/dtk-settings) if (EXISTS ${DTK_SETTINGS_TOOLS_EXECUTABLE}) set(DTK_SETTINGS_TOOLS_FOUND TRUE) endif () include("${CMAKE_CURRENT_LIST_DIR}/Dtk@DTK_NAME_SUFFIX@SettingsToolsMacros.cmake") include("${CMAKE_CURRENT_LIST_DIR}/Dtk@DTK_NAME_SUFFIX@ToolsTargets.cmake") include("${CMAKE_CURRENT_LIST_DIR}/DtkDBusMacros.cmake") include("${CMAKE_CURRENT_LIST_DIR}/DtkDConfigMacros.cmake") get_target_property(DTK_XML2CPP Dtk@DTK_NAME_SUFFIX@::Xml2Cpp LOCATION) get_target_property(DTK_DCONFIG2CPP Dtk@DTK_NAME_SUFFIX@::DConfig2Cpp LOCATION) dtkcore-6.7.46/conanfile.py000066400000000000000000000066171522615770400156040ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. # # SPDX-License-Identifier: LGPL-3.0-or-later from conans import ConanFile, tools class DtkcoreConan(ConanFile): name = 'dtkcore' version = '2.0.9' license = 'GPL' author = 'Iceyer me@iceyer.net' url = 'https://github.com/linuxdeepin/dtkcore' description = 'cross platform ui library' topics = ('qt', 'dtk') settings = 'os', 'compiler', 'build_type', 'arch' options = {'shared': [True, False]} default_options = 'shared=False' generators = 'qmake' exports_sources = '*' requires = 'jom_installer/1.1.2@bincrafters/stable', 'qt/5.6.3@iceyer/stable' def extend_include_path(self): return '%s/include/libdtk-%s/DCore' % (self.package_folder, self.version) # def source(self): # self.run('git clone https://github.com/linuxdeepin/dtkcore.git source') # self.run('cd source && git checkout 2.0.9.9') def build(self): outdir = self.build_folder # includedir = outdir + '/include' mkspecsdir = outdir + '/mkspecs' # libdir = outdir + '/lib' env_vars = tools.vcvars_dict(self.settings) env_vars['_CL_'] = '/utf-8' with tools.environment_append(env_vars): command = 'qmake -r' command += ' VERSION=%s' % self.version # command += ' CONFIG-=debug_and_release' # command += ' CONFIG-=debug_and_release_target' command += ' CONFIG+=release' command += ' PREFIX=%s' % outdir command += ' MKSPECS_INSTALL_DIR=%s' % mkspecsdir command += ' DTK_STATIC_LIB=YES' command += ' DTK_STATIC_TRANSLATION=YES' command += ' DTK_NO_MULTIMEDIA=YES' command += ' %s' % self.source_folder self.run(command) self.run('jom clean') self.run('jom') self.run('jom install') def package(self): self.deploy() outdir = self.build_folder self.copy('*', dst='include', src=outdir+'/include') self.copy('*.lib', dst='lib', src=outdir+'/lib') self.copy('*', dst='mkspecs', src=outdir+'/mkspecs') def package_info(self): self.cpp_info.libs = ['dtkcore'] self.cpp_info.includedirs.append(self.extend_include_path()) self.env_info.QMAKEPATH = self.cpp_info.rootpath self.env_info.QMAKEFEATURES = self.cpp_info.rootpath + '/mkspecs/features' def deploy(self): try: content = [] module_pri = self.build_folder + '/mkspecs/modules/qt_lib_dtkcore.pri' s = open(module_pri) for line in s.readlines(): if line.startswith('QT.dtkcore.tools'): line = 'QT.dtkcore.tools = %s\n' % ( self.package_folder + '/bin') elif line.startswith('QT.dtkcore.libs'): line = 'QT.dtkcore.libs = %s\n' % ( self.package_folder + '/lib') elif line.startswith('QT.dtkcore.includes'): line = 'QT.dtkcore.includes = %s\n' % ( self.extend_include_path()) content.append(line) s.close() # print('create module file', content) s = open(module_pri, 'w') s.writelines(content) except FileNotFoundError: print('skip update qt module file') dtkcore-6.7.46/debian/000077500000000000000000000000001522615770400145045ustar00rootroot00000000000000dtkcore-6.7.46/debian/changelog000066400000000000000000000412711522615770400163630ustar00rootroot00000000000000dtkcore (6.7.46) unstable; urgency=medium * Release 6.7.46 -- yeshanshan Thu, 16 Jul 2026 20:52:24 +0800 dtkcore (6.7.45) unstable; urgency=medium * Release 6.7.45 -- yeshanshan Thu, 09 Jul 2026 19:54:27 +0800 dtkcore (6.7.44) unstable; urgency=medium * Release 6.7.44 -- yeshanshan Wed, 17 Jun 2026 11:17:16 +0800 dtkcore (6.7.43) unstable; urgency=medium * Release 6.7.43 -- yeshanshan Thu, 04 Jun 2026 19:43:39 +0800 dtkcore (6.7.42) unstable; urgency=medium * Release 6.7.42 -- yeshanshan Wed, 20 May 2026 14:24:51 +0800 dtkcore (6.7.41) unstable; urgency=medium * Release 6.7.41 -- yeshanshan Fri, 08 May 2026 13:54:27 +0800 dtkcore (6.7.40) unstable; urgency=medium * Release 6.7.40 -- yeshanshan Thu, 23 Apr 2026 21:35:52 +0800 dtkcore (6.7.39) unstable; urgency=medium * Release 6.7.39 -- mhduiy Thu, 09 Apr 2026 21:22:16 +0800 dtkcore (6.7.38) unstable; urgency=medium * Release 6.7.38 -- yeshanshan Tue, 31 Mar 2026 11:07:23 +0800 dtkcore (6.7.37) unstable; urgency=medium * Release 6.7.37 -- mhduiy Wed, 25 Mar 2026 17:04:44 +0800 dtkcore (6.7.36) unstable; urgency=medium * Release 6.7.36 -- yeshanshan Thu, 12 Mar 2026 20:20:47 +0800 dtkcore (6.7.35) unstable; urgency=medium * Release 6.7.35 -- yeshanshan Thu, 05 Mar 2026 19:31:08 +0800 dtkcore (6.7.34) unstable; urgency=medium * Release 6.7.34 -- mhduiy Fri, 27 Feb 2026 14:58:49 +0800 dtkcore (6.7.33) unstable; urgency=medium * Release 6.7.33 -- yeshanshan Thu, 05 Feb 2026 17:27:03 +0800 dtkcore (6.7.32) unstable; urgency=medium * Release 6.7.32 -- yeshanshan Thu, 22 Jan 2026 16:53:52 +0800 dtkcore (6.7.31) unstable; urgency=medium * Release 6.7.31 -- yeshanshan Tue, 06 Jan 2026 13:16:35 +0800 dtkcore (5.7.30) unstable; urgency=medium * Release 5.7.30 -- yeshanshan Thu, 11 Dec 2025 20:58:19 +0800 dtkcore (5.7.28) unstable; urgency=medium * Release 5.7.28 -- mhduiy Thu, 04 Dec 2025 19:52:58 +0800 dtkcore (5.7.27) unstable; urgency=medium * Release 5.7.27 -- mhduiy Thu, 27 Nov 2025 19:39:07 +0800 dtkcore (5.7.26) unstable; urgency=medium * Release 5.7.26 -- yeshanshan Thu, 06 Nov 2025 17:02:30 +0800 dtkcore (5.7.25) unstable; urgency=medium * Release 5.7.25 -- yeshanshan Thu, 30 Oct 2025 21:47:32 +0800 dtkcore (5.7.24) unstable; urgency=medium * Release 5.7.24 -- yeshanshan Thu, 16 Oct 2025 19:45:57 +0800 dtkcore (5.7.23) unstable; urgency=medium * Release 5.7.23 -- yeshanshan Thu, 25 Sep 2025 16:49:58 +0800 dtkcore (5.7.22) unstable; urgency=medium * Release 5.7.22 -- yeshanshan Thu, 04 Sep 2025 19:27:28 +0800 dtkcore (5.7.21) unstable; urgency=medium * Release 5.7.21 -- yeshanshan Thu, 14 Aug 2025 19:47:41 +0800 dtkcore (5.7.20) unstable; urgency=medium * Release 5.7.20 -- yeshanshan Thu, 31 Jul 2025 20:00:27 +0800 dtkcore (5.7.19) unstable; urgency=medium * Release 5.7.19 -- yeshanshan Thu, 03 Jul 2025 21:11:07 +0800 dtkcore (5.7.18) unstable; urgency=medium * Release 5.7.18 -- yeshanshan Fri, 27 Jun 2025 17:07:16 +0800 dtkcore (5.7.17) unstable; urgency=medium * Release 5.7.17 -- asterwyx Wed, 18 Jun 2025 18:01:08 +0800 dtkcore (5.7.16) unstable; urgency=medium * fix: add missing UosMilitary edition type cases -- YeShanShan Mon, 19 May 2025 17:21:50 +0800 dtkcore (5.7.15) unstable; urgency=medium * fix: correct bitwise operation in dconfig status tracking * chore: update REUSE license file patterns * fix: add QPointer check for parent object safety -- YeShanShan Thu, 08 May 2025 17:53:02 +0800 dtkcore (5.7.14) unstable; urgency=medium * fix: resolve compilation failure on Qt 6.9 -- JiDe Zhang Sat, 12 Apr 2025 17:19:00 +0800 dtkcore (5.7.13) unstable; urgency=medium * fix: add copyright for dconfig_org_deepin_dtk_preference.hpp * feat: supports create generic config by dconfig2cpp * fix: build failed on Qt6 -- YeShanShan Thu, 20 Mar 2025 17:05:39 +0800 dtkcore (5.7.12) unstable; urgency=medium * feat: dconfig2cpp always add bindableFoo functions on Qt6 * feat: Add files generated by qdbusXML2cpp and DCONG2cpp -- YeShanShan Thu, 06 Mar 2025 17:29:21 +0800 dtkcore (5.7.11) unstable; urgency=medium * feat: dconfig2cpp generated codes supports qml * feat: export ProductType for QML * feat: async get dconfig value for DLog * feat: support auto generate the Qt code from a dconfig's json -- YeShanShan Thu, 27 Feb 2025 20:47:22 +0800 dtkcore (5.7.10) unstable; urgency=medium * Release 5.7.10 -- YeShanShan Thu, 13 Feb 2025 17:18:04 +0800 dtkcore (5.7.9) unstable; urgency=medium [ root ] * UNRELEASED -- Deepin Packages Builder Thu, 23 Jan 2025 09:07:08 +0000 dtkcore (5.7.8) unstable; urgency=medium [ root ] * UNRELEASED -- Deepin Packages Builder Tue, 14 Jan 2025 11:17:31 +0000 dtkcore (5.7.7) unstable; urgency=medium [ root ] * UNRELEASED -- Deepin Packages Builder Thu, 09 Jan 2025 09:28:38 +0000 dtkcore (5.7.6) unstable; urgency=medium [ root ] * UNRELEASED -- Deepin Packages Builder Thu, 02 Jan 2025 05:43:52 +0000 dtkcore (5.7.5) unstable; urgency=medium * fix: pidfd leak -- Deepin Packages Builder Thu, 12 Dec 2024 03:03:54 +0000 dtkcore (5.7.4) unstable; urgency=medium * fix: hasVtable is incorrect when destructing -- Deepin Packages Builder Tue, 03 Dec 2024 02:00:45 +0000 dtkcore (5.7.3) unstable; urgency=medium [ root ] * UNRELEASED -- Deepin Packages Builder Wed, 20 Nov 2024 02:19:06 +0000 dtkcore (5.7.2) unstable; urgency=medium [ root ] * UNRELEASED -- Deepin Packages Builder Wed, 13 Nov 2024 01:53:26 +0000 dtkcore (5.7.1) unstable; urgency=medium * feat: 增加智能终端设备类型 (#434) Thanks to Whale107 * fix: remove unnecessary link libraries * fix: DDBusInterface signal loss * fix(util): error appid from `getAppIdFromAbsolutePath` -- Deepin Packages Builder Wed, 16 Oct 2024 03:30:45 +0000 dtkcore (5.6.34) unstable; urgency=medium [ root ] * UNRELEASED -- Deepin Packages Builder Tue, 20 Aug 2024 05:03:51 +0000 dtkcore (5.6.32) unstable; urgency=medium * refactor: log files move to dtklog(Issue: #182) -- Deepin Packages Builder Mon, 08 Jul 2024 02:29:21 +0000 dtkcore (5.6.31) unstable; urgency=medium * chore: use '&&' and '||' instead of 'and' and 'or' -- Deepin Packages Builder Thu, 27 Jun 2024 09:11:34 +0000 dtkcore (5.6.30) unstable; urgency=medium * feat: �许基于dtk开�的应用动�控制其日志输出等级(Task: 307567)(Influence: �许基于dtk开�的应用动�控制其日志输出等级) * fix: lshw查询内存大�时返回多元素数组,修正解�过程(Bug: 228681)(Influence: DSysInfo::memoryInstalledSize解�过程) * fix: 从文件中读�deepinType和productType值时因为��问题会失败(Influence: 正常显示版本和说明) * feat: 增加registerLoggingRulesWatcher接�(Task: 303379) * fix: 修�计算 build 版本�错误的问题(Influence: 构建版本�(BUILD_VERSION )) * feat: DeepinType类型增加军用版(Task: 316703)(Influence: DeepinType类型) * fix: 修�日志格�时间戳显示异常问题(Bug: 236239)(Influence: 使用DLogManager的应用日志输出格�) * chore: loggingrules config move to preference * refactor: remove LoggingRules interface * fix: crashed when access DSGApplication::id early * chore: fallback to dsgconfig value * fix(build): build faild on Qt 6.7.1 -- Deepin Packages Builder Thu, 30 May 2024 02:46:32 +0000 dtkcore (5.6.29) unstable; urgency=medium * chore: remove warning for dbusxml2cpp in qt6 -- Deepin Packages Builder Mon, 13 May 2024 03:02:53 +0000 dtkcore (5.6.28) unstable; urgency=medium * fix: fix undefined reference errors on spdlog 1.14.0 Thanks to hillwoodroc -- Deepin Packages Builder Mon, 29 Apr 2024 08:23:39 +0000 dtkcore (5.6.27) unstable; urgency=medium * fix: lossing value when save DConfig * fix(qdbusxml2cpp): support qt 6.7 -- Deepin Packages Builder Fri, 19 Apr 2024 08:55:35 +0000 dtkcore (5.6.26) unstable; urgency=medium [ root ] * UNRELEASED -- Deepin Packages Builder Tue, 26 Mar 2024 05:47:35 +0000 dtkcore (5.6.25) unstable; urgency=medium * chore: fix docs typo * feat: support to set appId for DConfig * fix: DConfig add check for name(Issue: #1211374) -- Deepin Packages Builder Mon, 11 Mar 2024 01:16:26 +0000 dtkcore (5.6.22) unstable; urgency=medium * Release 5.6.22 -- Deepin Packages Builder Wed, 10 Jan 2024 02:30:59 +0000 dtkcore (5.6.21) unstable; urgency=medium * fix: app blocked when AM is unavailable * chore: remove decltype(auto) for dutil * chore: fix relative path invalid link * feat: allow skip including headers of annotations(Issue: #147) -- Deepin Packages Builder Tue, 09 Jan 2024 01:45:43 +0000 dtkcore (5.6.20) unstable; urgency=medium * feat: add utils function * chore: Implement DSGApplication::getId * feat(dstandardpaths): add XDG_STATE_HOME * chore: keep order when deduplication * fix: log files limit not work * chore: add dtk dbus generate function -- Deepin Packages Builder Tue, 28 Nov 2023 05:40:53 +0000 dtkcore (5.6.19) unstable; urgency=medium * fix: Type error for qdbusxml2cpp * fix: correct Dtk6SettingsToolsMacros.cmake path * chore: add flag UserPublic(Issue: https://github.com/linuxdeepin/developer-center/issues/5928) -- Deepin Packages Builder Mon, 23 Oct 2023 07:33:19 +0000 dtkcore (5.6.18) unstable; urgency=medium * fix: Can't clear cache when reset for DConfig in FileBackend * feat: Add isDefaultValue for DConfig(Issue: #3) * fix: Compiling failed in lower libspdlog-dev * fix: missing parameter passing for synchronization * fix(build): skip failed unit test * chore(tools): show help if argc < 2 * fix: Compiling failed in libspdlog-dev before 1.4.0 Thanks to Shiroko * fix: cmake failure when env is null * chore: correct typos in DtkSettingsToolsMacros.cmake Thanks to Felix Yan * chore: dpinyin tweak(Issue: #109) -- Deepin Packages Builder Wed, 18 Oct 2023 06:01:45 +0000 dtkcore (5.6.17) unstable; urgency=medium * Release 5.6.17 -- Deepin Packages Builder Fri, 08 Sep 2023 15:12:36 +0800 dtkcore (5.6.16) unstable; urgency=medium * fix: FileAppender log level not set * chore: ut linked dtkcore instead of source code * chore: tweak CMakeLists * chore: support Qt 6.4 build * chore: qch docs tweak * chore: add DtkBuildHelper depends * chore: console with color at tty * fix: missing dependency qttools5-dev * feat: add synchronization workflow -- Deepin Packages Builder Tue, 22 Aug 2023 06:13:45 +0000 dtkcore (5.6.15) unstable; urgency=medium * chore: dlog example tweak -- Yixue Wang Fri, 11 Aug 2023 13:42:20 +0800 dtkcore (5.6.14) unstable; urgency=medium * chore: function need to be marked as override * chore: ignore doxygen-theme folder Thanks to Skye-rs * chore: change OUTPUT_DIR variable in cmake * chore: remove unused pro files * refactor!: deprecate some interfaces in dtk6 * fix: updateProp cannot convert to property type * fix: typo in xdg * chore: reduce compilation warnings Thanks to SPUER(Issue: #96) * chore(dcapmanager): RuntimeTime -> RuntimeDir * chore: Sync by https://github.com/linuxdeepin/.github/commit/559e91167d4919644f37bbcf123eb0651c1528ea(Influence: none) * chore: make test-recoverage.sh runable again * chore: add ut for DDbusSender * feat: add systembus send support * fix: internalPropSet nerver emit propertyChanged * chore: should include QVector headers * chore: dsysinfo tweak * chore: add some unit test -- Deepin Packages Builder Thu, 27 Jul 2023 06:56:33 +0000 dtkcore (5.6.13) unstable; urgency=medium * feat: DConfig add check for no existed item when override * fix(cmake): wrong use of option and wrong macro * fix: calling delay in DDBusSender(Issue: https://github.com/linuxdeepin/developer-center/issues/4415) * feat: DConfig add check for subpath(Issue: #54) * feat: DConfig exports metadir's implementation(Issue: #10) * fix(dccinterface): fix cannot get the right type * fix: DConfig's `subpathIsValid` produces error * fix(ut): failed ut * fix(build): build faild on Qt6 * fix: fix build failed due to gcc compiler bug * fix: ut_dfilewater failed on Qt6 * fix: DTextEncoding ut failed in Qt6. * fix: fix DTextEncoding warnings. * feat: support dtk6core build * feat: add DThreadUtils class * fix: move Qt CorePrivate to target private link * fix: qdbusxml2cpp-fix not in path * chore: remove ddbusinterface property cache * chore: remove libdtkcommon depends -- Deepin Packages Builder Sun, 25 Jun 2023 14:40:49 +0800 dtkcore (5.6.12) unstable; urgency=medium * Release 5.6.12 * add DLicenseInfo * cached memoryInstalledSize * FIX developer-center#4348 -- Deepin Packages Builder Mon, 15 May 2023 11:18:15 +0800 dtkcore (5.6.11) unstable; urgency=medium * Release 5.6.11 * add color to ConsoleAppender * remove build warning -- Deepin Packages Builder Mon, 08 May 2023 11:48:45 +0800 dtkcore (5.6.10) unstable; urgency=medium * Release 5.6.10 * support XDG_SESSION_DESKTOP set to DDE -- Deepin Packages Builder Mon, 17 Apr 2023 17:08:28 +0800 dtkcore (5.6.9) unstable; urgency=medium * Release 5.6.9 -- Deepin Packages Builder Mon, 03 Apr 2023 09:48:07 +0800 dtkcore (5.6.8) unstable; urgency=medium * Release 5.6.8 -- Deepin Packages Builder Wed, 22 Feb 2023 14:09:56 +0800 dtkcore (5.6.6) unstable; urgency=medium * Release 5.6.6 -- Deepin Packages Builder Tue, 21 Feb 2023 12:25:24 +0800 dtkcore (5.6.5) unstable; urgency=medium * Release 5.6.5 -- Deepin Packages Builder Thu, 02 Feb 2023 14:25:36 +0800 dtkcore (5.6.4) unstable; urgency=medium * Release 5.6.4 -- Deepin Packages Builder Fri, 06 Jan 2023 16:30:40 +0800 dtkcore (5.6.3) unstable; urgency=medium * Release 5.6.3 -- Deepin Packages Builder Mon, 12 Dec 2022 14:40:31 +0800 dtkcore (5.6.2.2) unstable; urgency=medium * release 5.6.2.2 -- Deepin Packages Builder Thu, 17 Nov 2022 17:41:10 +0800 dtkcore (5.6.2.1) unstable; urgency=medium * snipe release 5.6.2.1 -- Deepin Packages Builder Mon, 31 Oct 2022 16:53:16 +0800 dtkcore (5.6.2) unstable; urgency=medium * snipe release 5.6.2 -- Deepin Packages Builder Wed, 21 Sep 2022 13:57:29 +0800 dtkcore (5.6.0) unstable; urgency=medium * snipe release 5.6.0 -- Deepin Packages Builder Mon, 11 Jul 2022 17:47:56 +0800 dtkcore (5.0.3) unstable; urgency=medium * Release 5.0.3 -- Deepin Packages Builder Tue, 21 Sep 2019 13:31:03 +0800 dtkcore (5.0.0) unstable; urgency=medium * Release 5.0.0 -- Deepin Packages Builder Tue, 03 Sep 2019 08:47:03 +0800 dtkcore (2.0.8) unstable; urgency=medium * Release 2.0.8 -- Deepin Packages Builder Wed, 02 May 2018 10:52:03 +0800 dtkcore (0.3.3-1) unstable; urgency=medium * Initial release -- Deepin Packages Builder Mon, 10 Oct 2016 16:58:07 +0800 dtkcore-6.7.46/debian/control000066400000000000000000000062061522615770400161130ustar00rootroot00000000000000Source: dtkcore Section: libdevel Priority: optional Maintainer: Shanshan Ye Build-Depends: debhelper-compat ( =12), cmake, pkg-config, libgtest-dev, libdtkcommon-dev, libicu-dev, libuchardet-dev, libdbus-1-dev, qttools5-dev-tools , qttools5-dev , libgsettings-qt-dev , libdtklog-dev(>> 6.7.33) , qtbase5-private-dev , qt6-base-dev-tools , qt6-base-dev , qt6-base-private-dev , libdtk6log-dev(>> 6.7.33) , qt6-tools-dev , doxygen Standards-Version: 3.9.8 Package: libdtk6core Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, lshw Multi-Arch: same Build-Profiles: Description: Development ToolKit Core Library (DTK6 with Qt6) DTK Core is the base library of deepin Qt/C++ applications. . This package contains the shared libraries for DTK6 applications. Package: libdtk6core-bin Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, libdtk6core( =${binary:Version}) Build-Profiles: Description: Development ToolKit Core Utilities (DTK6 with Qt6) DTK Core is the base library of deepin Qt/C++ applications. . This package contains the utilities of DTK6 Core. Package: libdtk6core-dev Architecture: any Depends: libdtk6core( =${binary:Version}), libdtkcommon-dev(>=5.6.16), libdtk6log-dev Build-Profiles: Description: Development ToolKit Core Devel Library (DTK6 with Qt6) DTK Core is the base library of deepin Qt/C++ applications. . This package contains the header files and development library symbolic links of DTK6 Core. Package: libdtk6core-doc Architecture: any Build-Profiles: Description: Development ToolKit Core Documentation DTK Core is the base library of deepin Qt/C++ applications. . This package contains the doc files of DtkCore. Package: libdtkcore5 Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, lshw Multi-Arch: same Build-Profiles: Description: Development ToolKit Core Library (DTK5 with Qt5) DTK Core is the base library of deepin Qt/C++ applications. . This package contains the shared libraries for DTK5 applications. Package: libdtkcore5-bin Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, libdtkcore5( =${binary:Version}) Build-Profiles: Description: Development ToolKit Core Utilities (DTK5 with Qt5) DTK Core is the base library of deepin Qt/C++ applications. . This package contains the utilities of DTK5 Core. Package: libdtkcore-dev Architecture: any Depends: libdtkcore5( =${binary:Version}), libdtkcommon-dev(>=5.6.16), libdtklog-dev Build-Profiles: Description: Development ToolKit Core Devel Library (DTK5 with Qt5) DTK Core is the base library of deepin Qt/C++ applications. . This package contains the header files and development library symbolic links of DTK5 Core. Package: libdtkcore-doc Architecture: any Build-Profiles: Description: Development ToolKit Core Documentation DTK Core is the base library of deepin Qt/C++ applications. . This package contains the doc files of DtkCore. dtkcore-6.7.46/debian/copyright000066400000000000000000000017601522615770400164430ustar00rootroot00000000000000Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: dtkcore Source: https://github.com/linuxdeepin/dtkcore Files: * Copyright: 2017 Deepin Technology Co., Ltd. License: LGPL-3+ This package is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. . This package is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. . You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . On Debian systems, the complete text of the GNU Lesser General Public License version 3 can be found in "/usr/share/common-licenses/LGPL-3". dtkcore-6.7.46/debian/libdtk6core-bin.install000066400000000000000000000000351522615770400210500ustar00rootroot00000000000000usr/libexec/dtk6/DCore/bin/* dtkcore-6.7.46/debian/libdtk6core-dev.install000066400000000000000000000001641522615770400210610ustar00rootroot00000000000000usr/lib/*/libdtk6core.so usr/include/dtk6/* usr/lib/*/pkgconfig/dtk6core.pc usr/lib/*/cmake/Dtk6*/* usr/lib/*/qt6/* dtkcore-6.7.46/debian/libdtk6core-doc.install000066400000000000000000000000361522615770400210460ustar00rootroot00000000000000usr/share/qt6/doc/dtkcore.qch dtkcore-6.7.46/debian/libdtk6core.install000066400000000000000000000000331522615770400203000ustar00rootroot00000000000000usr/lib/*/libdtk6core.so.* dtkcore-6.7.46/debian/libdtkcore-dev.install000066400000000000000000000003071522615770400207720ustar00rootroot00000000000000usr/lib/*/libdtkcore.so usr/include/dtk5/* usr/lib/*/pkgconfig/dtkcore.pc usr/lib/*/cmake/DtkCMake/* usr/lib/*/cmake/DtkTools/* usr/lib/*/cmake/DtkDConfig/* usr/lib/*/cmake/DtkCore/* usr/lib/*/qt5/* dtkcore-6.7.46/debian/libdtkcore-doc.install000066400000000000000000000000361522615770400207600ustar00rootroot00000000000000usr/share/qt5/doc/dtkcore.qch dtkcore-6.7.46/debian/libdtkcore5-bin.install000066400000000000000000000000351522615770400210470ustar00rootroot00000000000000usr/libexec/dtk5/DCore/bin/* dtkcore-6.7.46/debian/libdtkcore5.install000066400000000000000000000000321522615770400202760ustar00rootroot00000000000000usr/lib/*/libdtkcore.so.* dtkcore-6.7.46/debian/rules000077500000000000000000000052531522615770400155710ustar00rootroot00000000000000#!/usr/bin/make -f DPKG_EXPORT_BUILDFLAGS = 1 include /usr/share/dpkg/default.mk export DEB_CXXFLAGS_MAINT_APPEND = -Ofast # 安全编译�数 export DEB_BUILD_MAINT_OPTIONS = hardening=+all export DEB_CFLAGS_MAINT_APPEND = -Wall export DEB_CXXFLAGS_MAINT_APPEND = -Wall export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed -Wl,-z,relro -Wl,-z,now -Wl,-z,noexecstack -Wl,-E # reproducible编译�数 DEB_CMAKE_EXTRA_FLAGS += -DCMAKE_SKIP_BUILD_RPATH=ON DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH) # Calculate build version: # 5.6.8 -> 0; 5.6.8.7 -> 7; 5.6.8+u001 -> 1; 5.6.8.7+u001 -> 7; 5.6.8.0+u001 -> 0 BUILD_VER := $(shell echo $(DEB_VERSION_UPSTREAM) | awk -F'[+_~-]' '{print $$1}' | awk -F'.' '{print $$4}' | sed 's/[^0-9]//g' | awk '{print int($$1)}') ifeq ($(BUILD_VER), 0) ifeq ($(shell expr $(shell echo "$(DEB_VERSION_UPSTREAM)" | awk -F. '{print NF-1}') '<' 3), 1) BUILD_VER=$(shell echo $(DEB_VERSION_UPSTREAM) | awk -F'[+_~-]' '{print $$2}' | sed 's/[^0-9]//g' | awk '{print int($$1)}') endif endif BUILD_DOCS := $(if $(filter nodoc,$(DEB_BUILD_PROFILES)),OFF,ON) BUILD_DTK5 := $(if $(filter nodtk5,$(DEB_BUILD_PROFILES)),OFF,ON) BUILD_DTK6 := $(if $(filter nodtk6,$(DEB_BUILD_PROFILES)),OFF,ON) %: dh $@ override_dh_auto_configure: ifeq ($(BUILD_DTK5),ON) mkdir -p build5 QT_SELECT=qt5 dh_auto_configure --builddirectory=build5 -- $(DEB_CMAKE_EXTRA_FLAGS) -DBUILD_WITH_SYSTEMD=ON -DBUILD_EXAMPLES=OFF -DBUILD_TESTING=OFF -DBUILD_DOCS=$(BUILD_DOCS) -DBUILD_VERSION=$(BUILD_VER) -DD_DSG_APP_DATA_FALLBACK=/var/dsg/appdata -DDTK5=ON endif ifeq ($(BUILD_DTK6),ON) mkdir -p build6 dh_auto_configure --builddirectory=build6 -- $(DEB_CMAKE_EXTRA_FLAGS) -DBUILD_WITH_SYSTEMD=ON -DBUILD_EXAMPLES=OFF -DBUILD_TESTING=OFF -DBUILD_DOCS=$(BUILD_DOCS) -DBUILD_VERSION=$(BUILD_VER) -DD_DSG_APP_DATA_FALLBACK=/var/dsg/appdata -DDTK5=OFF endif override_dh_auto_build: ifeq ($(BUILD_DTK5),ON) QT_SELECT=qt5 dh_auto_build --builddirectory=build5 endif ifeq ($(BUILD_DTK6),ON) dh_auto_build --builddirectory=build6 endif override_dh_auto_install: ifeq ($(BUILD_DTK5),ON) QT_SELECT=qt5 dh_auto_install --builddirectory=build5 endif ifeq ($(BUILD_DTK6),ON) dh_auto_install --builddirectory=build6 endif override_dh_link: ifeq ($(BUILD_DTK5),ON) dh_link usr/lib/$(DEB_HOST_MULTIARCH)/libdtkcore.so.5 usr/lib/$(DEB_HOST_MULTIARCH)/libdtkcore.so -p libdtkcore-dev endif ifeq ($(BUILD_DTK6),ON) dh_link usr/lib/$(DEB_HOST_MULTIARCH)/libdtk6core.so.6 usr/lib/$(DEB_HOST_MULTIARCH)/libdtk6core.so -p libdtk6core-dev endif override_dh_auto_test: ifeq ($(BUILD_DTK5),ON) QT_SELECT=qt5 dh_auto_test --builddirectory=build5 endif ifeq ($(BUILD_DTK6),ON) dh_auto_test --builddirectory=build6 endif dtkcore-6.7.46/debian/source/000077500000000000000000000000001522615770400160045ustar00rootroot00000000000000dtkcore-6.7.46/debian/source/format000066400000000000000000000000151522615770400172130ustar00rootroot000000000000003.0 (native) dtkcore-6.7.46/docs/000077500000000000000000000000001522615770400142125ustar00rootroot00000000000000dtkcore-6.7.46/docs/CMakeLists.txt000066400000000000000000000072341522615770400167600ustar00rootroot00000000000000cmake_minimum_required (VERSION 3.10) find_package (Doxygen REQUIRED) set (QCH_INSTALL_DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/qt${QT_VERSION_MAJOR}/doc CACHE STRING "QCH install location") set (DOXYGEN_GENERATE_HTML YES CACHE STRING "Doxygen HTML output") set (DOXYGEN_GENERATE_XML YES CACHE STRING "Doxygen XML output") set (DOXYGEN_GENERATE_QHP YES CACHE STRING "Doxygen QHP output") set (DOXYGEN_FILE_PATTERNS *.cpp *.h *.zh_CN.md *.zh_CN.dox CACHE STRING "Doxygen File Patterns") set (DOXYGEN_PROJECT_NUMBER ${DTK_VERSION} CACHE STRING "") # Should be the same as this project is using. set (DOXYGEN_EXTRACT_STATIC YES) set (DOXYGEN_OUTPUT_LANGUAGE "Chinese") if("${QT_VERSION_MAJOR}" STREQUAL "5") find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Help) else() find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS ToolsTools) endif() get_target_property(_qhelpgenerator_location Qt${QT_VERSION_MAJOR}::qhelpgenerator IMPORTED_LOCATION) if("${_qhelpgenerator_location}" STREQUAL "") set(_qhelpgenerator_location "qhelpgenerator") endif() set (DOXYGEN_QHG_LOCATION ${_qhelpgenerator_location} CACHE STRING "Doxygen QHG path") set (DOXYGEN_QHP_NAMESPACE "org.deepin.dtk.core") set (DOXYGEN_QCH_FILE "dtkcore.qch") set (DOXYGEN_QHP_VIRTUAL_FOLDER "dtkcore") set (DOXYGEN_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/docs/) set (DOXYGEN_HTML_EXTRA_STYLESHEET "" CACHE STRING "Doxygen custom stylesheet for HTML output") set (DOXYGEN_TAGFILES "qtcore.tags=qthelp://org.qt-project.qtcore/qtcore/" CACHE STRING "Doxygen tag files") set (DOXYGEN_IMAGE_PATH ${PROJECT_SOURCE_DIR}/docs/src) set (DOXYGEN_SOURCE_BROWSE "YES") set (BUILD_THEME OFF CACHE BOOL "Build doxgen theme") if(BUILD_THEME) if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/doxygen-theme") message(STATUS "doxygen-theme exists") else() execute_process(COMMAND git clone https://github.com/linuxdeepin/doxygen-theme.git --depth=1 WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} TIMEOUT 60 ) execute_process(COMMAND bash themesetting.sh WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/doxygen-theme/ ) endif() set (DOXYGEN_HTML_EXTRA_STYLESHEET "docs/doxygen-theme/doxygen-awesome-css/doxygen-awesome.css" "docs/doxygen-theme/doxygen-awesome-css/doxygen-awesome-sidebar-only.css" "docs/doxygen-theme/doxygen-awesome-css/doxygen-awesome-sidebar-only-darkmode-toggle.css" ) set (DOXYGEN_HTML_EXTRA_FILES "docs/doxygen-theme/doxygen-awesome-css/doxygen-awesome-darkmode-toggle.js" "docs/doxygen-theme/doxygen-awesome-css/doxygen-awesome-fragment-copy-button.js" "docs/doxygen-theme/doxygen-awesome-css/doxygen-awesome-paragraph-link.js" "docs/doxygen-theme/doxygen-awesome-css/doxygen-awesome-interactive-toc.js" ) set (DOXYGEN_GENERATE_TREEVIEW "YES") set (DOXYGEN_DISABLE_INDEX "NO") set (DOXYGEN_FULL_SIDEBAR "NO") set (DOXYGEN_HTML_HEADER "docs/doxygen-theme/doxygen-awesome-css/header.html") set (DOXYGEN_HTML_FOOTER "docs/doxygen-theme/doxygen-awesome-css/footer.html") endif() set (DOXYGEN_MACRO_EXPANSION "YES") set (DOXYGEN_PREDEFINED "DCORE_BEGIN_NAMESPACE=namespace Dtk { namespace Core {" "DCORE_END_NAMESPACE=}}" "DCORE_USE_NAMESPACE=using namespace Dtk::Core;" "Q_OS_LINUX=1" ) set (DOXYGEN_EXPAND_ONLY_PREDEF "YES") doxygen_add_docs (doxygen ${PROJECT_SOURCE_DIR}/include ${PROJECT_SOURCE_DIR}/docs ALL WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMENT "Generate documentation via Doxygen" ) install (FILES ${PROJECT_BINARY_DIR}/docs/html/dtkcore.qch DESTINATION ${QCH_INSTALL_DESTINATION}) dtkcore-6.7.46/docs/MainPage.zh_CN.md000066400000000000000000000035651522615770400172260ustar00rootroot00000000000000\mainpage dtkcore @brief dtk # dtkcore ## 简介 dtkcore 是一个基于Qt的C++库,它�供了一些常用的工具类,以�一些基础的模�,如日志��件�网络�线程�数�库�文件�图形�音频�视频�系统信�等 ## 使用 现在的dtkcore>=5.6版本使用CMake�管��个模�,所以使用dtkcore时,需�先安装CMake(CMake>=3.10),然�需�在你的CMake项目中引入dtkcore的CMake模�,如下: ```cmake find_package(Dtk6Core REQUIRED) target_link_libraries( Dtk6::Core ) ``` ```qmake QT += dtkcore ``` ```bash pkg-config --cflags --libs dtk6core # pkgconfig find Dtk6Core in qmake # CONFIG += link_pkgconfig # PKGCONFIG += dtk6core # pkgconfig find Dtk6Core in cmake # find_package(PkgConfig REQUIRED) # pkg_check_modules(Dtk6Core REQUIRED IMPORTED_TARGET dtk6core) # target_link_libraries( PkgConfig::Dtk6Core ) ``` 以上示例仅为最�示例,并�能�独作为CMake项目使用,需�你自己添加其他的CMake模�,如Qt的CMake模�,以�你自己的CMake模�. @note 注�:dtkcore的QMake模�会自动引入Qt5的QMake模�,所以�需��次引入Qt5的QMake模�,但是在使用CMake的时候必须手动引入Qtcore的CMake模� ## 文档 阅读文档建议从模�页�开始,模�页��供了dtkcore的�个模�的简介,以��个模�的使用示例。 @subpage DLog dtkcore的文档使用doxygen管�,由deepin_doc_doc_go_sig�供维护支�, 如果你也想加入sig,请访问[deepin_doc_doc_go_sig](https://matrix.to/#/#deepin_doc_doc_go:matrix.org) ## 许� dtkcore使用LGPLv3许��,你�在此许��下自由使用dtkcore
dtkcore的文档使用[CC-BY-4.0](https://creativecommons.org/licenses/by/4.0/)许��,你�在此许��下自由使用dtkcore的文档,但是转�或者引用时必须注明出处。 dtkcore-6.7.46/docs/Specification.md000066400000000000000000000046411522615770400173210ustar00rootroot00000000000000# Deepin Application Specification {#Specification} Every application should keep the rule in this document. ## 1. Application Information Application should set the property Organization-name and Application-name. Organization/Application name can contains alphabet, number and other visible ASCII code, BUT space MUST NOT appear in the name. And we do not approve of no-ASCII code character in the Organization/Application name Application can stay Organization-name empty, but it should always set an Application-name. ## 2. Standard Path The log, configure and runtime cache of Application should store in specific path. **If Organization-name is empty, "{Organization-name}/" would not appear in path.** ### 2.1 User Application Standard Path As an application run for user session, the Standard path should be: ````bash XGD_LOG_HOME_DEEPIN: Where deepin-user-specific log should be written. XGD_USER_HOME/.log DAPP_CONFIG_HOME: Where application-specific configurations should be written. XDG_CONFIG_HOME/{Organization-name}/{Application-name} DAPP_LOG_HOME: Where application-specific log should be written. XGD_LOG_HOME_DEEPIN/{Organization-name}/{Application-name} DAPP_CACHE_HOME: Where application-specific cache files should be written. XGD_CACHE_HOME/{Organization-name}/{Application-name} DAPP_DATA_HOME: Where application-specific data files should be written. $XDG_DATA_HOME/{Organization-name}/{Application-name} ```` Simple example: The dde-dock is offcial application of deepin and the standard path will be: ````bash DAPP_CONFIG_HOME: $HOME/.config/deepin/dde-dock DAPP_LOG_HOME: $HOME/.log/deepin/dde-dock DAPP_CACHE_HOME: $HOME/.cache/deepin/dde-dock DAPP_DATA_HOME: $HOME/.local/share/deepin/dde-dock ```` ### 2.2 System Application Standard Path Application run as system daemon, or with user with no home directory should place it's file in this standard path: ````bash DAPP_CONFIG_SYS: /etc/{Organization-name}/{Application-name} DAPP_LOG_SYS: /var/log/{Organization-name}/{Application-name} DAPP_DATA_SYS: /usr/share/{Organization-name}/{Application-name} DAPP_CACHE_SYS: /var/cache/{Organization-name}/{Application-name} ```` Refs: [XDG Base Directory Specification](https://specifications.freedesktop.org/basedir-spec/basedir-spec-0.8.html) [XDG Base Directory support](https://wiki.archlinux.org/index.php/XDG_Base_Directory_support) dtkcore-6.7.46/docs/dci/000077500000000000000000000000001522615770400147515ustar00rootroot00000000000000dtkcore-6.7.46/docs/dci/ddcifile.zh_CN.dox000066400000000000000000000117631522615770400202400ustar00rootroot00000000000000/*! @~chinese @file include/dci/ddcifile.h @ingroup dci @class Dtk::Core::DDciFile ddcifile.h @brief ddcifile.h 是关于dci文件相关�作的一个类,实现了 DCI 文件的逻辑。其�是对数�的打包 dci文件的结构路径如下: ![DCI图标结构路径](@ref dciicon-tree.png ) @enum Dtk::Core::DDciFile::FileType @var Dtk::Core::DDciFile::FileType Dtk::Core::DDciFile::UnknowFile @brief 未知文件 @var Dtk::Core::DDciFile::FileType Dtk::Core::DDciFile::File @brief 文件 @var Dtk::Core::DDciFile::FileType Dtk::Core::DDciFile::Directory @brief 目录 @var Dtk::Core::DDciFile::FileType Dtk::Core::DDciFile::Symlink @brief 软链接 @fn bool Dtk::Core::DDciFile::isValid() @brief 判断读�的dci文件是�有效 @details 当指定的dci文件未�功加载时,此函数会返回false,一般会出现在文件格�错误(�是一个dci格�的文件),或者是dci文件数�被篡改而无法识别的情况 @note 本类中所有涉�文件�作的函数�会首先执行此方法,故如无必�,无需手动确�文件是�有效 @fn QString Dtk::Core::DDciFile::lastErrorString() @brief 获�上一个报错信�,为人类�读字符串,�以通过此报错信��获�错误内容,一般情况下是因为文件�存在或者文件�过长(>62个字符)导致。 @fn bool Dtk::Core::DDciFile::writeToFile(const QString &fileName) @brief 写入文件,在�完对于dci文件的�作之�调用此接�,为�存的作用 @param[in] fileName 文件� @fn bool Dtk::Core::DDciFile::writeToDevice(QIODevice *device) @brief 写入到设备,设备指的是qt中的io设备,�以在qt文档中找到相关信� @param[in] device IO设备 @sa [QIODevice](https://doc.qt.io/qt-6/qiodevice.html) @fn QByteArray Dtk::Core::DDciFile::toData() @brief 返回dci文件的原始数�,以QByteArray形�返回 @retval 如果返回为空字符串则说明读�失败 @sa DDciFile::writeFile @fn static constexpr int Dtk::Core::DDciFile::metadataSizeV1() @brief MAGIC_SIZE + VERSION_SIZE + FILE_COUNT_SIZE: 4+1+3 = 8 @fn QStringList Dtk::Core::DDciFile::list(const QString &dir, bool onlyFileName = false) @brief 列出文件列表 @param[in] dir 文件夹地� @param[in] onlyFileName 是��显示文件� 默认为false @fn int Dtk::Core::DDciFile::childrenCount(const QString &dir) @brief �文件计数 @fn bool Dtk::Core::DDciFile::exists(const QString &filePath) @brief 判断文件是�存在 @param[in] filePath DCI图标结构路径 @fn FileType Dtk::Core::DDciFile::type(const QString &filePath) @brief 判断文件类型 @sa DDciFile::FileType @param[in] filePath DCI图标结构路径 @fn QByteArray Dtk::Core::DDciFile::dataRef(const QString &filePath) @brief 获�dci内部文件的数�,以一�引用(软连接)的方�获�,�会产生数�的的�制 @param[in] filePath DCI图标结构路径 @retval 如果返回为空字符串,则说明此文件�存在或者无效 @fn QString Dtk::Core::DDciFile::name(const QString &filePath) @brief 获�dci内文件的文件� @param[in] filePath DCI图标结构路径 @retval 如果返回为空字符串,则说明此文件�存在或者无效 @fn QString Dtk::Core::DDciFile::symlinkTarget(const QString &filePath, bool originData = false) @brief 获�软链目标 @param[in] filePath DCI图标结构路径 @param[in] originData @retval 如果返回为空字符串,则说明此文件�存在或者无效 @note 链接的目标�能是“�存在的路径��“文件��“链接�,��是目录 @fn bool Dtk::Core::DDciFile::mkdir(const QString &filePath) @brief 创建目录(注�:此目录指的是在dci文件内部的目录,而�是指的是传统目录) @param[in] filePath DCI图标结构路径 @return �作是��功 @fn bool Dtk::Core::DDciFile::writeFile(const QString &filePath, const QByteArray &data, bool override = false) @brief 写入文件 @param[in] filePath DCI图标结构路径 @param[in] data 数�内容 @param[in] override 当文件已�存在时,是�覆盖此文件,默认状�下�执行覆盖,会在lasterror中记录"The target file is existed"错误信�。 如果传入为true,则会执行覆盖�作,** 此�作��逆 **。 @return �作是��功 @sa QByteArray DDciFile::toData() @fn bool Dtk::Core::DDciFile::remove(const QString &filePath) @brief 移除文件 @param[in] filePath DCI图标结构路径 @return �作是��功 @fn bool Dtk::Core::DDciFile::rename(const QString &filePath, const QString &newFilePath, bool override = false) @brief �命�文件 @param[in] filePath DCI图标结构路径 @param[in] newFilePath 新文件的路径 @param[in] override 当文件已�存在时,是�覆盖此文件,默认状�下�执行覆盖,会在lasterror中记录"The target file is existed"错误信�。 如果传入为true,则会执行覆盖�作,** 此�作��逆 **。 @return �作是��功 @fn bool Dtk::Core::DDciFile::link(const QString &source, const QString &to) @brief 链接文件 @param[in] source 文件� @param[in] to 链接目标 @return �作是��功 */ dtkcore-6.7.46/docs/dci/index.zh_CN.md000066400000000000000000000227341522615770400174120ustar00rootroot00000000000000@page dci dci--dci图标工具类 # DTk dci:dci工具类 关于dtkcore�供的dci工具�:[DCI](group__dci.html#files)
下�内容是关于dci文件的简介,还有一部分使用以�工具将会在以�的文档中�供 ## 关于dci图标简介 `DCI` 图标是一�整�性图标格�,应用�以使用该图标完�多�状�的自动�化。例如, `ListView` 控件中高亮的 `Item` 图标自动�白,`Menu` 中图标跟�当� `Item` �化等等。 `dtkcore` 中�供了一个 `DDciFile` 的类,实现 `DCI` 文件的逻辑。其�是对数�的打包,��于图片数�,�以是任何文本和二进制数�。 `dtkcore` 中还�供了用于在文管中解�文件的文件引擎,专门用于通过 `QFile` 和 `QDir` 处� `dci` 文件。 dtkgui 中�供了一个 `DDciIcon` 类,实现了对 `DCI` 图标的逻辑。区别于 `DDciFile` ,它是 `DDciFile` 的上层�装,�使用 DDciFile �以将文件进行打包归档的功能,�装了一�图标格�。 `DDciIcon` 中�供的接�,都是针对图标的,并无 `DDciFile` 的数�处��作,多个 `DDciIcon` 进行数�拷�和交�时,�以进行数�共享。 `DDciIcon` �以通过调用 pixmap 函数返回需�显示的图片数�,也�以通过调用 paint 函数直接将内容绘制到目标内部。解� Dci 图标的过程,这里讲解一下,详细过程�以查看代��解: 首先需�创建一个 DDciFile �解� (*.dci) 文件,无论是本地文本还是二进制数�,都�以通过 `DDciFile` �解�内部内容。 根� `DDciIcon` 中规定好的路径格�,�解�出图标中拟定的��信�,一般情况下的 `DDciIcon` 的路径格�是这样的: ![DCI图标结构路径](@ref dciicon-tree.png ) 最上层时 `/` 作为根目录( `DCI` 文件都必须使用 `/` 作为根目录)。 第一层�目录( 16�32�512 )作为图标的大�。一般情况下是图标在 @1(1�缩放比) 时的大�(在目�的使用设计师使用的 dci 图标�件的)。例如上述图标,传入的大�在 0-16时选择 16,传入大�在 16-32 时选择 32,... 以此类推。 第二层目录( `normal.light` )作为该层图标的状�和主题,其中状�分为 `Normal` , `Disabled` , `Hovered` 和 `Pressed` 四�,主题分为 `light` 和 `dark` 两�。四�状�和两�主题�产生 8 �组�,也就是说,��大�的图标最多有八���状�和主题的�图标进行切�。需�注�的是:状�和主题存在缺�模�: `normal` 和 `light` 。如果传入的状�和主题在所属大�的�图标下未找到,则选择缺�模�的状�和主题。也就是说,当图标的 `Normal` 和 `light` 状�未找到任何图标时,该图标是无效的。一般情况下,如果图标�会在��状�和主题下�生过大的样�修改,�修改内部颜色填充时,�以�添加特殊状�的图标,通过修改调色版解决。(����) 第三层目录(1�2)作为缩放比系数,�以存放多个缩放比系数�适�系统的缩放比。例如上述示例:缩放比系数在1和2之间时,选择 2,大于 2 时,选择 2 ,默认情况下选择 1。目��供的图标中,为了��尽��少图标文件的大�,仅�存缩放比为 3 的文件。在软件层�进行缩放。 第四层(1.png)�述图标图片文件(图层)所�带的信�。这些信�中,包�:图层优先级�外边框数值�调色�格��颜色调整数值�图层格�。�以通过下述文件表 ``` ├── 1.7p.3.png.alpha8 ├── 2.3.webp └── 3.7p.3_0_0_-10_0_0_0_0.png.alpha8 │ │ │ │ │ │ ┕�┳�┙┕�┳�┙ │ │ │ │ │ │ rgba format │ │ │ │ │ │ │ │ │ │ │ └─ lightness (亮度) │ │ │ │ └─ saturation (饱和度) │ │ │ └─ hue (色调) │ │ └─ palette (高亮色3) │ └─ padding (填充间隔) └─ prior (图层) .[padding].. ``` 下�进行一一介�: * **图层优先级**(`prior`):优先级代表图层的绘制顺�,从 1-n 进行绘制,最底层的图层会被上层图层覆盖。 * **外边框数值**(`padding`):外边框在有阴影效果的图标中充分利用。 `padding` 代表图层外围�被控件大�覆盖的区域。 ![layout](@ref layout.png) 类似控件的布局方�,这里�以之看 `padding` 部分, `padding` 定义四周所有数�,举个例�,如果�图标的大�是 32 (第一层目录的数值),一�缩放比下,如果该图层的 `padding` 大�时 5,那么该图层的真实图片大�是:[32 + 5 × 2, 32 + 5 × 2] = [42, 42]。但最终, `padding` 区域的大�并�计算在整个图标大�内(仅针对 QML,dtkwidget �支�)。为了区别其他数�, `padding` 的数值��使用 `'p'` 进行结尾。例如上述示例:`'7p'` 。 * **调色�格�** :当存在调色�时,就表示该图标的颜色是通过调色�的颜色进行动��化的,外部修改调色�颜色�,预览效果会�之�生�化。因此该图标有两�特性:1. �以转�� alpha8 格�; 2. �以�需�其他状�,通过调色��化��。当无调色�时,该部分的数值为空。调色�格�分为5�:无效(-1)��景色(0)�背景色(1)�高亮�景色(2)�高亮色(3)。 * **颜色调整数值** :颜色调整�针对有调色�的图层(调色�格�部分数��为空)时。一旦存在,必须�将其所有的数�写入,例如上述示例。颜色调整数值使用 '_' 进行分割。 �个部分表示:hu�saturation�lightness�red�green�blue�alpha。 * **图层格�** :图层格��以使用:"png"�"jpg"�"webp"。如果图层存在调色�格�,就�味��以优化其大�,转化为 alpha8 格�,使用".alpha8" 作为�缀,进行标识,在软件渲染时进行进行�原。 `DCI` 图标的细节介�在 应用图标,上�主�介� `DCI` 图标的整个结构和在 `QML` 中的使用方�。其主�是设计实现了一�特殊格�的文件(.dci),该�格�通过路径,�称和文件数�,打包到�一个文件内,使��状��大��主题的多个图标图片,整�到�一个文件内,在程�内部自动匹�当�状�,选择�适的图标图片。因此,总的�说, `DCI` 图标是对多个图标图片的打包归档。 本文将介� `DCI` 图标在 `dtkwidget` 和 `dtkdeclarative` 中的使用,对于一些 `DCI` 图标相关的高级知识(使用方无需过度关心),如 “DDciIconPalette��“缩放比的适��以�“图片的格��等等。 **请注�:** 当使用 `DciIcon` 时,如果您认为控件在��状�下需�进行图标�色或更�图标而未出现时,�能是由于**设计�供的图标未指定�色所需�的调色�对象(�以�解为图标出错)** 或 **设计认为该�场景下�需��色(�固定样�图标)**,请�时与设计沟通。 ### 1. 图标状� 大部分控件�以分为 `Normal` � `Hovered` � `Pressed` 和 `Disabled` 四�状�。这四�状�是��控件的基础状�。因此将使用这几�状�作为图标的状�分类。 #### 答疑 1. 为什么没有 `Checked` 和 `Inactive` 类似这样的状�? `Checked` 状�属于��状�,并�属于基础状�。 `Checked` 状�下,�以有 `Hovered` � `Pressed` � `Normal` 等等状�,相�地, `Unchecked` 状�也会存在一样的情况。因此, `Checked` 状�并�适�作为 `DCI` 图标的状�。对于需�时,�通过控件的 `checked` 状�属性,切�下��的图标��。 `Inactive` 状�作为窗�的状�,在 `DTK` 应用都会通过�低�明度的方�实现,而�是作为图标状�。 2. 为什么需�这些状�? 存在这些状�的原因是,为了让应用和开�者更加无感知的使用图标,而无需关心��状�下进行图标切�的�作。方便设计师一次�供多�状�的图标到一个图标文件中,进行压缩整�。防止出现图标资�较多,�用较大系统内存,�时能够帮助设计师在控件的��状�下,�仅仅�局�于修改图标颜色这一�功能,也�以通过��的图标代替,更适�多样化的样�设计。 3. 图标�显示�能是什么原因? 很�能是 webp 格�的支�问题, 查看一下系统中是�安装 `qt5-image-formats-plugins` ,这个包中有对 webp 格�图片格�的支�。 ### 2. 图标大�和缩放比 应用所关心的图标大�是�正常,是�能够适�高缩放比模�等等。 `DCI` 图标中都�到了这些,默认情况下,设计师所�供的图标大�能够满足应用开�的需求,应用�需�主动调用接�指定图标大���,例如 `dtkwidget`,中 `DIconButton` �以使用 `setIconSize` 指定; `QML` 中�以指定 `DciIcon` 控件的 `sourceSize` 或者 `Button` 控件的 `icon.size` 等等。而对于高缩放比的适�, `DTK` 已�全部完�无需应用关心。 @defgroup dci @brief dtkdci图标工具类, �供对于dci文件的�作方法 @details 详细内容�� [DCI图标简介](md_docs_dci_index_zh_CN.html#autotoc_md0) dtkcore-6.7.46/docs/filesystem/000077500000000000000000000000001522615770400163765ustar00rootroot00000000000000dtkcore-6.7.46/docs/filesystem/dbasefilewatcher.zh_CN.dox000066400000000000000000000055641522615770400234200ustar00rootroot00000000000000/*! @~chinese @ingroup dfilesystem @file include/filesystem/dbasefilewatcher.h @class Dtk::Core::DBaseFileWatcher @brief DBaseFileWatcher 类�供了一系列接��供监视文件和目录的�动。 @note 建议使用 DFileWatcher 类,该类是 DBaseFileWatcher 的�类,�供了更多的功能。或者使用DFileWatcherManager类,该类�供了对文件和目录的监视功能。 @warning 该类是一个虚类,�应该被直接使用,而应该使用 DFileWatcher 类或者 DFileWatcherManager 类。 @fn QUrl Dtk::Core::DBaseFileWatcher::fileUrl() @brief 返回文件的统一资�定�符 @sa [QUrl](https://doc.qt.io/qt-5/qurl.html) @fn bool Dtk::Core::DBaseFileWatcher::startWatcher() @brief 开始监视文件�动 @return true �功 false 失败 @sa DBaseFileWatcher::stopWatcher @fn bool Dtk::Core::DBaseFileWatcher::stopWatcher() @brief �止监视文件�动 @return true �功 false 失败 @sa DBaseFileWatcher::startWatcher() @fn bool Dtk::Core::DBaseFileWatcher::restartWatcher() @brief ��监视文件�动 @return true �功 false 失败 @sa DBaseFileWatcher::startWatcher() @fn virtual void Dtk::Core::DBaseFileWatcher::setEnabledSubfileWatcher(const QUrl &subfileUrl, bool enabled = true) @brief 设置是�对`subfileUrl`目录�用文件监视 @param[in] subfileUrl 设置所针对的 Url @param[in] enabled 是��用文件�动监视 @fn static bool Dtk::Core::DBaseFileWatcher::ghostSignal(const QUrl &targetUrl, SignalType1 signal, const QUrl &arg1) @brief ��一个信�表示目标目录`targetUrl`得到了一个`signal`信�,包��数`arg1`
使用方�如下: @code DBaseFileWatcher::ghostSignal(QUrl("bookmark:///"), &DBaseFileWatcher::fileDeleted, QUrl("bookmark:///bookmarkFile1")); @endcode @return �功��返回 true,�则返回 false @fn static bool Dtk::Core::DBaseFileWatcher::ghostSignal(const QUrl &targetUrl, DBaseFileWatcher::SignalType2 signal, const QUrl &arg1, const QUrl &arg2) @brief ��一个信�表示目标目录`targetUrl`得到了一个`signal`信�,包��数`arg1`和`arg2`
@details 示例用法: @code DBaseFileWatcher::ghostSignal(QUrl("bookmark:///"), &DBaseFileWatcher::fileMoved, QUrl("bookmark:///bookmarkFile1"), QUrl("bookmark:///NewNameFile1")); @endcode @var Dtk::Core::DBaseFileWatcher::fileDeleted(const QUrl &url) @brief 文件被删除的信� @var Dtk::Core::DBaseFileWatcher::fileMoved(const QUrl &fromUrl, const QUrl &toUrl) @brief 文件被移动的信� @var Dtk::Core::DBaseFileWatcher::fileAttributeChanged(const QUrl &url) @brief 文件属性被改�的信� @var Dtk::Core::DBaseFileWatcher::subfileCreated(const QUrl &url) @brief �文件被创建的信� @var Dtk::Core::DBaseFileWatcher::fileClosed(const QUrl &url) @brief 文件被关闭的信� @var Dtk::Core::DBaseFileWatcher::fileModified(const QUrl &url) @brief 文件被修改的信� */ dtkcore-6.7.46/docs/filesystem/dcapfile.zh_CN.dox000066400000000000000000000237671522615770400217000ustar00rootroot00000000000000/*! @~chinese @ingroup dfilesystem @file include/filesystem/dcapfile.h @class Dtk::Core::DCapFile @brief 对于文件�作的安全�装, �供了带有安全管控的文件读�, 相关�洞�[CWE_22](https://cwe.mitre.org/data/definitions/22.html) @fn explicit Dtk::Core::DCapFile(QObject *parent = nullptr) @brief 默认构造函数, 创建一个文件默认文件对象 @fn Dtk::Core::DCapFile::DCapFile(const QString &name, QObject *parent) @brief �载的构造函数, 接�传入一个文件�, 并创建一个文件对象 @note 调用此构造函数相当于调用默认构造函数+`DCapFile::setFileName()` @fn void Dtk::Core::DCapFile::setFileName(const QString &name) @brief 传入需��作的文件� @fn bool Dtk::Core::DCapFile::exists() const @brief 文件是�存在 @note 此处的存在指当�由setFileName() 指定的文件或者是在构造时指定的文件是��读�写 @note 需�在构造时或者手动指定了文件���以使用此函数, �则请调用其�载的函数 @fn static bool Dtk::Core::DCapFile::exists(const QString &fileName) @brief 文件是�存在 @param[in] fileName 文件� @note 此处的存在指的是此函数的传入的文件�指�的文件是��读�写 @fn QString Dtk::Core::DCapFile::readLink() const @brief 读�软连接, 如果软连接指�的文件��许读写, 则返回空字符串 @note 此方法在Qt版本>=5.13�**废弃** @return 返回软连接指�的文件或者目录的�对路径 @note 需�在构造时或者手动指定了文件���以使用此函数, �则请调用其�载的函数 @sa [readLink](https://doc.qt.io/qt-5/qfile-obsolete.html#readLink-1) @fn QString Dtk::Core::DCapFile::symLinkTarget() const @brief 这是一个�载函数
返回符�链接, 或Windows上的快�方�指�的文件或目录的�对路径, 如果该对象�是符�链接, 则返回一个空字符串。 @fn bool Dtk::Core::DCapFile::remove() @brief 如果文件存在则删除文件 @note 此处的存在指当�由setFileName() 指定的文件或者是在构造时指定的文件是��读�写 @note 需�在构造时或者手动指定了文件���以使用此函数, �则请调用其�载的函数 @note 文件需�在删除�被关闭 @fn static bool Dtk::Core::DCapFile::remove(const QString &fileName) @brief 如果文件存在则删除文件 @param[in] fileName 文件� @note 此处的存在指的是此函数的传入的文件�指�的文件是��读�写 @note 文件需�在删除�被关闭 @sa DCapFile::remove() @fn bool Dtk::Core::DCapFile::moveToTrash() @brief 如果文件存在则将文件移动至默认回收站(垃圾桶) @note 此处的存在指当�由setFileName() 指定的文件或者是在构造时指定的文件是��读�写 @note 需�在构造时或者手动指定了文件���以使用此函数, �则请调用其�载的函数 @note 此方法仅在Qt版本>=5.15.0��用 @fn bool Dtk::Core::DCapFile::moveToTrash(const QString &fileName, QString *pathInTrash) @brief 如果传入文件�对应文件存在则将文件移动至指定回收站(垃圾桶) @note 此处的存在指的是此函数的传入的文件�指�的文件是��读�写 @note 此方法仅在Qt版本>=5.15.0��用 @param[in] fileName 文件� @param[in] pathInTrash 回收站路径 @fn bool Dtk::Core::DCapFile::rename(const QString &newName) @brief 如果文件�存在则�命�文件 @param[in] newName 新文件� @note 需�在构造时或者手动指定了文件���以使用此函数, �则请调用其�载的函数 @fn static bool Dtk::Core::DCapFile::rename(const QString &oldName, const QString &newName) @brief 如果文件�存在则�命�文件 @param[in] oldName 旧文件� @param[in] newName 新文件� @fn bool Dtk::Core::DCapFile::link(const QString &newName) @brief 创建一个�为newName的链接 @details 该链接指�当�由`setFileName()`指定的文件或者是在构造时指定的文件。链接是什么�决于底层文件系统(无论是Windows上的快�方�还是Unix上的符�链接)。如果�功, 则返回ture;�则返回false @note 如果是windows系统的newName�数必须有`.lnk`�法�缀��用 @param[in] newName 新文件� @fn static bool Dtk::Core::DCapFile::link(const QString &oldname, const QString &newName) @brief 该函数是�载`DCapFile::link()`区别是需�手动传入原始文件� @sa DCapFile::link(const QString &newName) @fn bool Dtk::Core::DCapFile::copy(const QString &newName) @brief `setFileName()`指定的文件或者是在构造时指定的文件�制一份, �为newName
如果�功, 则返回ture;�则返回false @note 确�文件在�制之�是关闭的 @note 如果�制的文件是一个符�链接(symlink), 它所指的文件被�制, 而�是链接本身。除了�� 会被�制外, 其他的文件元数�都�会被�制。 @note 如果一个�称为 newName 的文件已�存在, `copy()`将会返回true但是并�会覆盖它 @fn static bool Dtk::Core::DCapFile::copy(const QString &fileName, const QString &newName) @brief 该函数是�载`DCapFile::copy(const QString &newName)`区别是需�手动传入原始文件� @sa DCapFile::copy(const QString &newName) @fn bool Dtk::Core::DCapFile::open(OpenMode flags) @brief 使用OpenMode模�打开文件, 如果�功返回true;�则返回false
@details 模�如下:
NotOpen = 0x0000,
ReadOnly = 0x0001,
WriteOnly = 0x0002,
ReadWrite = ReadOnly | WriteOnly,
Append = 0x0004,
Truncate = 0x0008,
Text = 0x0010,
Unbuffered = 0x0020,
NewOnly = 0x0040,
ExistingOnly = 0x0080
@note 在�写或读写模�下, 如果相关文件�存在, 该函数将在打开文件之��试创建一个新文件 @fn bool Dtk::Core::DCapFile::resize(qint64 sz) @brief 设置文件大�sz(以字节为��)。如果调整大��功, 则返回true;�则为false。如果sz大于当�文件, 则新字节将设置为 0;如果sz较�, 则文件将被简�地截断 @note 如果文件�存在, 此函数�能会无效 @fn static bool Dtk::Core::DCapFile::resize(const QString &filename, qint64 sz) @brief 该函数是�载`DCapFile::resize(qint64 sz)`区别是手动指定文件� @sa DCapFile::resize(qint64 sz) */ /*! @class Dtk::Core::DCapFile @brief 对于文件夹�作的�装 @fn Dtk::Core::DCapDir::DCapDir(const DCapDir &) @brief 拷�构造函数 构造一个DCapDir对象, 该对象是目录目录的DCapDir对象的副本 @fn Dtk::Core::DCapDir::DCapDir(const QString &path = QString()) @brief 构造指�给定目录路径的DCapDir。如果 path 为空, 则使用程�的工作目录`.` @fn Dtk::Core::DCapDir::DCapDir(const QString &path, const QString &nameFilter, SortFlags sort = SortFlags(Name | IgnoreCase), Filters filter = AllEntries) @brief 构造具有路径路径的DCapDir对象 @details 该 DCapDir 使用nameFilter按�称筛选其�目, 并使用筛选器 按属性筛选其�目。它还使用排�对�称进行排�。
默认�称筛选器是一个空字符串, 它�排除任何内容;默认筛选器是“所有�目�, 这也�味��排除任何内容。默认排�为“�称|忽略大�写, �按�称排�, �区分大�写。 如果path为空字符串, DCapDir 将使用 “.�(当�目录)
如果nameFilter为空字符串, DCapDir 将使用�称筛选器“*�(所有文件) @note 路径�需�存在 @fn void Dtk::Core::DCapDir::setPath(const QString &path) @brief 将目录的路径设置为path。该路径被清除了多余的"."�"... "和多个分隔符。没有检查这个路径的 目录是�真的存在;
路径�以是�对路径也�以是相对路径, �对路径以目录分隔符"/"开始(在Windows下�以选择在��加一个驱动器�, 例如: C:\)
相对路径以目录�开始, 并指定一个相对于当�目录的路径。一个�对路径的例�是字符串"/etc/apt", 一个相对路径例�是 "src/1/"
@fn bool Dtk::Core::DCapDir::cd(const QString &dirName) @brief 将DCapDir的目录更改为dirName。 如果新目录存在, 则返回true;�则返回false 请注�, 如果新目录�存在, 则�执行逻辑`cd()`�作 @fn QStringList Dtk::Core::DCapDir::entryList(Filters filters = NoFilter, SortFlags sort = NoSort) const @brief 返回目录中所有文件和目录的�称列表 @details 这些�称根�以�使用`setNameFilters()` 和`setFilter()` 设置的�称和属性筛选器排�, 并根�使用`setSorting() 设置的标志进行排�。
�以使用过滤器和排��数覆盖属性过滤器和排�规范。 如果目录��读��存在或与规范�匹�, 则返回空列表。 @fn QString Dtk::Core::DCapDir::entryList(const QStringList &nameFilters, Filters filters = NoFilter, SortFlags sort = NoSort) @brief �载函数, 返回目录中所有文件和目录的�称列表 @sa entryList(Filters filters = NoFilter, SortFlags sort = NoSort) @fn bool Dtk::Core::DCapDir::mkdir(const QString &dirName) const @brief 创建文件夹 @fn bool Dtk::Core::DCapDir::rmdir(const QString &dirName) const @brief 移除文件夹 @fn bool Dtk::Core::DCapDir::mkpath(const QString &dirPath) @brief 创建目录 @fn bool Dtk::Core::DCapDir::rmpath(const QString &dirPath) @brief 移除目录 @fn bool Dtk::Core::DCapDir::exists() const @brief 文件夹是�存在(如果找到��文件, 此函数将返回 false) @fn bool Dtk::Core::DCapDir::exists(const QString &name) const @brief 指定文件夹是�存在(如果找到��文件, 此函数将返回 false) @fn bool Dtk::Core::DCapDir::remove(const QString &fileName) @brief 移除文件夹 @fn bool Dtk::Core::DCapDir::rename(const QString &oldName, const QString &newName) @brief �命�文件夹 @param[in] oldName 旧文件夹� @param[in] newName 新文件夹� */ dtkcore-6.7.46/docs/filesystem/dfilesystemwatcher.zh_CN.dox000066400000000000000000000111151522615770400240170ustar00rootroot00000000000000/*! @~chinese @ingroup dfilesystem @file include/filesystem/dfilesystemwatcher.h @class DFileSystemWatcher @brief 监�文件系统�化的类 @details DFileSystemWatcher监视文件系统对文件的更改和目录,通过观察指定的path列表。
调用addPath()�监视特定的文件或目录。多个path�以使用addPaths()函数添加。现有path�以使用removePath()和removePaths()函数删除。
DFileSystemWatcher检查添加到其中的�个path。具有以下特性的文件添加到DFileSystemWatcher�以使用函数Files()和使用函数directories()创建的目录。
fileChanged()信�在文件被修改时�出,�命�或从�盘中删除。类似地,directoryChanged()在目录或其内容被修改或移除。
请注�,DFileSystemWatcher��止监视一次文件,它们被�命�或从�盘和目录中删除一次,它们已从�盘中移除。 @note 在�行�支�inotify的Linux内核的系统上,包�被监视路径的文件系统�能被�载。
默认情况下,Windows CE�支�目录监控,这�决于安装的文件系统驱动程�。
监视文件和目录的行为修改�作会消耗系统资�。这�味�有一个�制进程�以使用的文件和目录的数��时监控。 @fn DFileSystemWatcher::DFileSystemWatcher(QObject *parent) @brief 构造函数,构造一个新的文件系统监视器对象。 @fn DFileSystemWatcher::DFileSystemWatcher(const QStringList &paths, QObject *parent = Q_NULLPTR) @brief 构造函数,构造一个新的文件系统监视器对象,监控指定路径列表。 @param paths �监�的路径列表 @fn bool DFileSystemWatcher::addPath(const QString &file) @brief 添加�监�的路径 @details 如果path存在,则将path添加到文件系统监视器。如果path�存在或已�存在,则�添加它由文件系统监视程�监视。
如果path指定了一个目录,则调用directoryChanged()信�将在path被修改或从�盘中删除时�出。�则,当path被修改��命�或删除。,就会触�fileChanged()信�
如果监视�功,则返回true。
监视故障的原因通常与系统有关,但是�能包括资��存在�访问失败或总监视数��制,如果平�有一个。 @note �能有一个系统�赖的数��制�以�时监控的文件和目录。
如果达到了这个�制,path将�会被监控,返回false。 @param[in] file �监�的路径 @sa DFileSystemWatcher::addPaths() @sa DFileSystemWatcher::removePath() @fn QStringList DFileSystemWatcher::addPaths(const QStringList &files) @brief 添加�监�的路径列表 @details 将path中的�个path添加到文件系统监视程�。path如果�存在,或者已�存在,则�添加由文件系统监视程�监视。
如果path指定了一个目录,则调用directoryChanged()信�将在path被修改或从�盘中删除时触�。�则,当path被修改��命�或删除。,就会触�fileChanged()信�
返回值是一个无法被监视的路径列表。
监视故障的原因通常与系统有关,但是�能包括资��存在�访问失败或总监视数��制,如果平�有一个。
@note �能有一个系统�赖的数��制�以�时监控的文件和目录。
如果达到了这个�制,多余的path就�会达到,它们将被添加到返回的QStringList中。 @param[in] files �监�的路径列表 @sa DFileSystemWatcher::addPath() @sa DFileSystemWatcher::removePaths() @fn bool DFileSystemWatcher::removePath(const QString &file) @brief 移除监�的路径 @details 从文件系统监视程�中删除指定的path。
如果监视�功删除,则返回true。
监视删除失败的原因通常与系统有关,但�能是因为path已�被删除了。 @sa DFileSystemWatcher::removePaths() @sa DFileSystemWatcher::addPath() @fn QStringList DFileSystemWatcher::removePaths(const QStringList &files) @brief 移除监�的路径列表 @details 从文件系统监视程�中删除指定的path。
返回值是一个无法被监视的路径列表。
监视删除失败的原因通常与系统有关,但å�¯èƒ½æ˜¯å› ä¸ºpathå·²ç»�被删除了。 @sa DFileSystemWatcher::removePath() @sa DFileSystemWatcher::addPaths() @fn QStringList DFileSystemWatcher::directories() const @brief 获å�–监å�¬çš„目录列表 @sa DFileSystemWatcher::files() @fn QStringList DFileSystemWatcher::files() const @brief 获å�–监å�¬çš„æ–‡ä»¶åˆ—表 @sa DFileSystemWatcher::directories() */ dtkcore-6.7.46/docs/filesystem/dfilewarcher.zh_CN.dox000066400000000000000000000032621522615770400225540ustar00rootroot00000000000000/*! @~chinese @ingroup dfilesystem @file include/filesystem/dfilewatcher.h @class DFileWatcher @brief DFileWatcher ç±»æ��供了对 DBaseFileWatcher 接å�£çš„实现,å�¯ä¾›ç›‘视文件和目录的å�˜åЍ @fn DFileWatcher::DFileWatcher(const QString &filepath, QObject *parent = 0) @brief 构造函数 @param filepath è¦�监视的文件或目录的路径 @param parent 父对象 @fn void DFileWatcher::onFileDeleted(const QString &path, const QString &name) @brief 当文件被删除时触å�‘的信å�· @param[in] path 文件所在的目录路径 @param[in] name 文件å�� @fn void DFileWatcher::onFileAttributeChanged(const QString &path, const QString &name) @brief 当文件属性å�‘生å�˜åŒ–时触å�‘的信å�· @param[in] path 文件所在的目录路径 @param[in] name 文件å�� @fn void DFileWatcher::onFileMoved(const QString &fromPath, const QString &fromName, const QString &toPath, const QString &toName) @brief 当文件被移动时触å�‘的信å�· @param[in] fromPath 文件原æ�¥æ‰€åœ¨çš„目录路径 @param[in] fromName 文件原æ�¥çš„æ–‡ä»¶å�� @param[in] toPath 文件现在所在的目录路径 @param[in] toName 文件现在的文件å�� @fn void DFileWatcher::onFileModified(const QString &path, const QString &name) @brief 当文件被修改时触å�‘的信å�· @param[in] path 文件所在的目录路径 @param[in] name 文件å�� @fn void DFileWatcher::onFileCreated(const QString &path, const QString &name) @brief 当文件被创建时触å�‘的信å�· @param[in] path 文件所在的目录路径 @param[in] name 文件å�� @fn void DFileWatcher::onFileClosed(const QString &path, const QString &name) @brief 当文件被关闭时触å�‘的信å�· @param[in] path 文件所在的目录路径 */ dtkcore-6.7.46/docs/filesystem/dfilewatchermanager.zh_CN.dox000066400000000000000000000067011522615770400241120ustar00rootroot00000000000000/*! @~chinese @ingroup dfilesystem @file include/filesystem/dfilewatchermanager.h @class DFileWatcherManager @brief DFileWatcherManager ç±»å�¯ä»¥å¸®åŠ©ç®¡ç�†ä¸€ç³»åˆ— DFileWatcher 文件监视器,并在文件å�˜åŠ¨æ—¶å�‘é€�ä¿¡å�·é€šçŸ¥. @details 示例代ç �: ```cpp #include "dfilewatchermanager" #include #include #include #include DCORE_USE_NAMESPACE int main(int argc, char **argv) { QCoreApplication app(argc, argv); DFileWatcherManager manager; QTemporaryFile tmpfile1; // 创建临时文件1 tmpfile1.open(); QFile file1( tmpfile1.fileName()); QTemporaryFile tmpfile2; // 创建临时文件2 tmpfile2.open(); QFile file2( tmpfile2.fileName()); manager.add(tmpfile1.fileName());// 监控临时文件1 manager.add(tmpfile2.fileName());// 监控临时文件2 QObject::connect(&manager, &Dtk::Core::DFileWatcherManager::fileModified, &app, [=](const QString value) { qDebug() << "文件å�‘生å�˜åЍ:" << value; }); // 文件å�‘生å�˜åŠ¨æ—¶æ‰“å�°æ–‡ä»¶è·¯å¾„ QObject::connect(&manager, &Dtk::Core::DFileWatcherManager::fileDeleted, &app, [=](const QString value) { qDebug() << "文件被删除:" << value; }); file1.open(QIODevice::WriteOnly|QIODevice::Text);// 修改临时文件1 file1.write("test"); file1.close(); file2.open(QIODevice::WriteOnly|QIODevice::Text);// 修改临时文件2 file2.write("test"); file2.close(); qDebug() << manager.watchedFiles();// 打å�°æ‰€æœ‰è¢«ç›‘控的文件路径 qDebug() << "---------------------------"; app.processEvents();// 处ç�†äº‹ä»¶ manager.removeAll();// 移除所有的监控 qDebug() << manager.watchedFiles();// 打å�°æ‰€æœ‰è¢«ç›‘控的文件路径 return app.exec(); } ``` 上é�¢ä»£ç �演示了如何使用 DFileWatcherManager ç±»æ�¥ç›‘控文件å�˜åŠ¨å’Œæ¸…é™¤æ–‡ä»¶å�˜åŠ¨çš„ç›‘æŽ§. 具体å�¯ä»¥å�‚ç…§æº�ç �中的example文件夹中的文件å�˜åŠ¨ç›‘æŽ§ä¾‹å­�. @fn DFileWatcher* DFileWatcherManager::add(const QString &filePath) @brief 为路径`filePath`创建 DFileWatcher 并将其添加到 DFileWatcherManager 中. @return 被创建并添加到 DFileWatcherManager çš„ DFileWatcher @fn void DFileWatcherManager::remove(const QString &filePath) @brief 从 DFileWatcherManager 中移除路径`filePath`对应的 DFileWatcher. @fn void DFileWatcherManager::removeAll() @brief 从 DFileWatcherManager 中移除所有的 DFileWatcher. @fn void DFileWatcherManager::watchedFiles() @brief 获å�– DFileWatcherManager 中所有的 DFileWatcher. @var void DFileWatcherManager::fileDeleted(const QString &filePath) @brief 当路径`filePath`对应的文件被删除时å�‘é€�此信å�·. @var void DFileWatcherManager::fileAttributeChanged(const QString &filePath) @brief 当路径`filePath`对应的文件属性å�‘生å�˜åŒ–æ—¶å�‘é€�此信å�·. @var void DFileWatcherManager::fileMoved(const QString &fromFilePath, const QString &toFilePath) @brief 当路径`fromFilePath`对应的文件被移动到路径`toFilePath`æ—¶å�‘é€�此信å�·. @var void DFileWatcherManager::fileClosed(const QString &filePath) @brief 当路径`filePath`对应的文件被关闭时å�‘é€�此信å�·. @var void DFileWatcherManager::fileModified(const QString &filePath) @brief 当路径`filePath`对应的文件被修改时å�‘é€�此信å�·. @var void DFileWatcherManager::subfileCreated(const QString &filePath) @brief 当路径`filePath`对应的文件夹中有新的å­�文件被创建时å�‘é€�此信å�·. */ dtkcore-6.7.46/docs/filesystem/dstandardpaths.zh_CN.dox000066400000000000000000000051211522615770400231150ustar00rootroot00000000000000/*! @~chinese @ingroup dfilesystem @file include/filesystem/dstandardpaths.h @class DStandardPaths @brief DStandardPaths ç±»æ��述了一些标准的文件路径,包括XDG文件路径,locateç­‰ @fn static QString DStandardPaths::writableLocation(QStandardPaths::StandardLocation type) @brief DStandardPathsæ��供兼容Snap/Dtk标准的路径模å¼�。DStandardPaths实现了Qtçš„QStandardPaths主è¦�接å�£ã€‚此处返回å�¯å†™è·¯å¾„ @fn static QStringList DStandardPaths::standardLocations (QStandardPaths::StandardLocation type) @brief DStandardPathsæ��供兼容Snap/Dtk标准的路径模å¼�。DStandardPaths实现了Qtçš„QStandardPaths主è¦�接å�£ã€‚此处返回所有Standardpath @fn static QString DStandardPaths::locate(QStandardPaths::StandardLocation type, const QString &fileName, QStandardPaths::LocateOptions options = QStandardPaths::LocateFile) @brief 在 type 的标准ä½�置查找å��为 fileName 的文件或目录。选项标志å…�许您指定是å�¦æŸ¥æ‰¾æ–‡ä»¶æˆ–目录。默认情况下,此标志设置为 LocateFile。返回找到的第一个文件或目录的ç»�对路径,å�¦åˆ™è¿”回空字符串。 @fn static QStringList DStandardPaths::locateAll(QStandardPaths::StandardLocation type, const QString &fileName, QStandardPaths::LocateOptions options = QStandardPaths::LocateFile) @brief 在类型的标准ä½�置中按å��ç§° fileName 查找所有文件或目录。选项标志å…�许您指定是å�¦æŸ¥æ‰¾æ–‡ä»¶æˆ–目录。默认情况下,此标志设置为 LocateFile。返回找到的所有文件的列表。 @fn static QString DStandardPaths::findExecutable(const QString &executableName, const QStringList &paths = QStringList()) @brief å�ŒQStandardPaths::findExecutable, 查找å�¯æ‰§è¡Œæ–‡ä»¶ @fn static void DStandardPaths::setMode(DStandardPaths::Mode mode) @brief å�ŒQStandardPaths::setTestModeEnabled, 设置是å�¦æ˜¯æµ‹è¯•模å¼� @fn static QString DStandardPaths::homePath() @brief 返回家目录 @fn static QString DStandardPaths::homePath(const uint uid) @brief 用uid返回家目录 @fn static QString DStandardPaths::path(DStandardPaths::XDG type) @brief 返回对应的xdg目录 @fn static QString DStandardPaths::path(DStandardPaths::DSG type) @brief 返回对应Dsg目录 @fn static QStringList DStandardPaths::paths(DStandardPaths::DSG type) @brief 返回所有DSG下所有目录 @fn static QString DStandardPaths::filePath(DStandardPaths::XDG type, QString fileName) @brief 用xdg和文件å��称拼接,返回文件ç»�对路径 @fn static QString DStandardPaths::filePath(DStandardPaths::DSG type, QString fileName) @brief 用dsg和文件å��称拼接,返回文件ç»�对路径 */ dtkcore-6.7.46/docs/filesystem/dtrashmanager.zh_CN.dox000066400000000000000000000010541522615770400227320ustar00rootroot00000000000000/*! @~chinese @ingroup dfilesystem @file include/filesystem/dtrashmanager.h @class DTrashManager @brief dtk垃圾管ç�†å™¨æ��供管ç�†æ–‡ä»¶å›žæ”¶ç«™çš„功能。 @details é�žå¸¸ç®€å�•的一个类 @fn ststic DTrashManager *DTrashManager::instance() @brief 获å�–DTrashManager的实例 @fn bool DTrashManager::trashIsEmpty() const @brief 判断回收站是å�¦ä¸ºç©º @fn bool DTrashManager::cleanTrash() @brief 清空回收站 @fn bool DTrashManager::moveToTrash(const QString &filePath, bool followSymlink = false) @brief 将文件移动到回收站 */ dtkcore-6.7.46/docs/filesystem/index.zh_CN.md000066400000000000000000000003001522615770400210200ustar00rootroot00000000000000@page dfilesystem dfilesystem--dtk文件系统æ“�作的å°�装 # Dlog:dtk日志组件 TODO:添加filesystem组件使用说明 @defgroup dfilesystem @brief dtk文件系统æ“�作的å°�装 dtkcore-6.7.46/docs/global/000077500000000000000000000000001522615770400154525ustar00rootroot00000000000000dtkcore-6.7.46/docs/global/dconfig.zh_CN.dox000066400000000000000000000345101522615770400206020ustar00rootroot00000000000000/*! @~chinese @file include/global/dconfig.h @ingroup dglobal @class Dtk::Core::DConfigBackend dconfig.h @brief é…�ç½®å�Žç«¯çš„æŠ½è±¡æŽ¥å�£ã€‚ @details 所有DConfig使用的é…�ç½®å�Žç«¯éƒ½ç»§æ‰¿æ­¤ç±»,用户å�¯ä»¥ç»§æ‰¿æ­¤ç±»å®žçŽ°è‡ªå·±çš„é…�ç½®å�Žç«¯ã€‚ @sa FileBackend @sa DBusBackend @sa QSettingBackend @fn Dtk::Core::DConfigBackend::~DConfigBackend() @brief DConfigBackendæž�构函数 @sa FileBackend::~FileBackend() @sa DBusBackend::~DBusBackend() @sa QSettingBackend::~QSettingBackend() @fn bool Dtk::Core::DConfigBackend::isValid() const = 0 @brief 判断此å�Žç«¯æ˜¯å�¦å�¯ç”¨ @sa DConfig::isValid() @sa FileBackend::isValid() @sa DBusBackend::isValid() @sa QSettingBackend::isValid() @fn bool Dtk::Core::DConfigBackend::load(const QString &) = 0 @brief åˆ�始化å�Žç«¯ @details appId 管ç�†çš„é…�置信æ�¯key值,默认为应用程åº�å��称。 @sa FileBackend::load() @sa DBusBackend::load() @sa QSettingBackend::load() @fn QStringList Dtk::Core::DConfigBackend::keyList() = 0 @brief 获得所有å�¯ç”¨çš„é…�置项å��ç§° @sa DConfig::keyList() @sa FileBackend::keyList() @sa DBusBackend::keyList() @sa QSettingBackend::keyList() @fn QVariant Dtk::Core::DConfigBackend::value(const QString &key, const QVariant &fallback = QVariant()) const = 0 @brief æ ¹æ�®é…�置项å��称获得对应值 @param[in] key é…�置项å��ç§° @param[in] fallback 没有获å�–到é…�置项值å�Žæ��供的默认值 @sa DConfig::value() @sa FileBackend::value() @sa DBusBackend::value() @sa QSettingBackend::value() @fn void Dtk::Core::DConfigBackend::setValue(const QString &key, const QVariant &value) = 0 @brief æ ¹æ�®é…�置项å��称设置其值 @param[in] key é…�置项å��ç§° @param[in] value 需è¦�更新的值 @sa DConfig::setValue() @sa FileBackend::setValue() @sa DBusBackend::setValue() @sa QSettingBackend::setValue() @fn void Dtk::Core::DConfigBackend::reset(const QString &key) @brief 设置其é…�置项对应的默认值,此值为ç»�过override机制覆盖å�Žçš„值,ä¸�一定为此é…�置文件中meta中定义的值。 @param[in] key é…�置项å��ç§° @sa DConfig::reset() @sa FileBackend::reset() @sa DBusBackend::reset() @sa QSettingBackend::reset() @fn bool Dtk::Core::DConfigBackend::isReadOnly(const QString &key) @brief 检测指定é…�置项是å�¦ä¸ºå�ªè¯» @param[in] key é…�置项å��ç§° @return 如果é…�置项为å�ªè¯»è¿”回true,å�¦åˆ™è¿”回false @sa DConfig::isReadOnly() @sa FileBackend::isReadOnly() @sa DBusBackend::isReadOnly() @fn QString Dtk::Core::DConfigBackend::name() const = 0 @brief å�Žç«¯é…�置的唯一标识 @sa FileBackend::name() @sa DBusBackend::name() @sa QSettingBackend::name() @fn bool Dtk::Core::DConfigBackend::isDefaultValue(const QString &key) @brief 检测指定é…�置项å��称对应的值是å�¦ä¸ºé»˜è®¤å€¼ã€‚ @param[in] key é…�置项å��ç§° @sa DConfig::isDefaultValue() @sa FileBackend::isDefaultValue() @sa DBusBackend::isDefaultValue() @sa QSettingBackend::isDefaultValue() @class Dtk::Core::QSettingBackend dconfig.h @brief QSettingå�Žç«¯,继承自DConfigBackend抽象接å�£,并实现了虚函数。 @sa DConfigBackend @fn QSettingBackend Dtk::Core::QSettingBackend::QSettingBackend(DConfigPrivate* o) @brief QSettingBackend构造函数 @class Dtk::Core::DConfigPrivate dconfig.h @brief DConfigçš„ç§�有实现 @fn DConfigPrivate Dtk::Core::DConfigPrivate::DConfigPrivate() @brief DConfigPrivate构造函数 @fn bool Dtk::Core::DConfigPrivate::invalid() @brief 判断此å�Žç«¯æ˜¯å�¦å�¯ç”¨ @fn DConfigBackend* Dtk::Core::DConfigPrivate::getOrCreateBackend() @brief 创建一个é…�ç½®å�Žç«¯ @details 默认使用的é…�ç½®å�Žç«¯ä¼šä¼˜å…ˆæ ¹æ�®çŽ¯å¢ƒå�˜é‡�æ�¥é€‰æ‹©é…�置中心的D-Bus接å�£è¿˜æ˜¯æ–‡ä»¶é…�ç½®å�Žç«¯æŽ¥å�£ã€‚若没有é…�置此环境å�˜é‡�,则根æ�®æ˜¯å�¦æœ‰é…�置中心æ��ä¾›D-Busæœ�务æ�¥é€‰æ‹©é…�置中心æœ�务还是文件é…�ç½®å�Žç«¯æŽ¥å�£ã€‚ @fn DConfigBackend* Dtk::Core::DConfigPrivate::createBackendByEnv() @brief 创建一个é…�ç½®å�Žç«¯ @details å°�试根æ�®çŽ¯å¢ƒå�˜é‡�æ�¥é€‰æ‹©é…�置中心的D-Bus接å�£è¿˜æ˜¯æ–‡ä»¶é…�ç½®å�Žç«¯æŽ¥å�£ã€‚ @var QString Dtk::Core::DConfigPrivate::appId @brief é…�置文件所属的应用Id,为空时默认为本应用Id。 @var QString Dtk::Core::DConfigPrivate::name @brief é…�置文件å�� @var QString Dtk::Core::DConfigPrivate::subpath @brief é…�置文件对应的å­�目录 @var QScopedPointer Dtk::Core::DConfigPrivate::backend @brief é…�置策略å�Žç«¯ @class Dtk::Core::DConfig dconfig.h @brief é…�置策略æ��供的接å�£ç±» @details ## 概述 此接å�£è§„范定义了开å�‘库所æ��供的关于é…�置文件读写的相关接å�£ï¼Œå¦‚果应用程åº�所使用的开å�‘库实现了此规范,则程åº�应当优先使用开å�‘库æ��供的接å�£ã€‚ 项目目录结构如下: ```bash ├── CMakeLists.txt ├── config │ └── example.json └── main.cpp ``` ## CMakeLists.txt ```cmake cmake_minimum_required(VERSION 3.1.0) # 指定cmake最低版本 project(dconfig-example VERSION 1.0.0 LANGUAGES CXX) # 指定项目å��ç§°, 版本, 语言 cxx就是c++ set(CMAKE_CXX_STANDARD 11) # 指定c++标准 set(CMAKE_CXX_STANDARD_REQUIRED ON) # 指定c++标准è¦�求,至少为11以上 set(CMAKE_AUTOMOC ON) # 支æŒ�qt moc set(CMAKE_AUTORCC ON) # support qt resource file # 支æŒ�qt资æº�文件 set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # 支æŒ� clangd if (CMAKE_VERSION VERSION_LESS "3.7.0") # 如果cmake版本å°�于3.7.0 set(CMAKE_INCLUDE_CURRENT_DIR ON) # 设置包å�«å½“å‰�目录 endif() find_package(Qt5 REQUIRED COMPONENTS Core) # 寻找Qt5组件Core find_package(Dtk REQUIRED COMPONENTS Core) # 寻找Dtk组件Core add_executable(${PROJECT_NAME} # 生æˆ�å�¯æ‰§è¡Œæ–‡ä»¶ main.cpp ) target_link_libraries(${PROJECT_NAME} PRIVATE # 添加需è¦�链接的共享库 Qt5::Core dtkcore ) # dtk_add_config_meta_files函数,部署一些"meta"çš„é…�置。 # 函数定义在dtkcoreçš„cmake目录下 # APPID 应用的ID # FILES 需è¦�部署的文件。 dtk_add_config_meta_files( APPID ${PROJECT_NAME} FILES ./config/example.json ) ``` ## example.json ```json { "magic": "dsg.config.meta", "version": "1.0", "contents": { "canExit": { "value": true, "serial": 0, "flags": ["global"], "name": "I am name", "name[zh_CN]": "我是å��å­—", "description": "I am description", "permissions": "readwrite", "visibility": "private" }, "key1": { "value": "125", "serial": 0, "flags": ["nooverride"], "name": "I am name", "name[zh_CN]": "我是å��å­—", "description": "I am description", "permissions": "readwrite", "visibility": "public" }, "number": { "value": 1, "serial": 0, "flags": ["global"], "name": "array value type", "permissions": "readwrite", "visibility": "public" }, "array": { "value": ["value1", "value2"], "serial": 0, "flags": ["global"], "name": "array", "permissions": "readwrite", "visibility": "public" }, "map": { "value": {"key1": "value1", "key2": "value2"}, "serial": 0, "flags": ["global"], "name": "map", "permissions": "readwrite", "visibility": "public" } } } ``` ## main.cpp ```cpp #include #include #include DCORE_USE_NAMESPACE int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 构造DConfig,元数æ�®æ–‡ä»¶å��example,与元数æ�®å®‰è£…目录的/usr/share/dsg/configs/APPIDå��(å�¯æ‰§è¡Œæ–‡ä»¶å��)对应目录/example.json, DConfig config("example"); // 判断是å�¦æœ‰æ•ˆ if (!config.isValid()) { qWarning() << QString("DConfig无效, name:[%1]."). arg(config.name()); return 0; } // 获å�–所有é…�置项的key qDebug() << "所有的所有é…�置项的key:" << config.keyList(); // 获å�–指定é…�置项的值,é…�置项å�¯ä»¥æ˜¯å­—符串,数组,map容器,布尔值,整型,详è§�example.json qDebug() << "canExit对应的值:" << config.value("canExit").toBool(); QVariantMap map; for (int i = 0; i < 1; i++) { QVariantMap nestItem; for (int j = 0; j < 1; j++) { nestItem[QString::number(j)] = QString::number(j); } map[QString::number(i)] = nestItem; } QScopedPointer heapConfig; heapConfig.reset(new DConfig("example")); if (!heapConfig->isValid()) { qWarning() << QString("DConfig无效, name:[%1]."). arg(heapConfig->name()); return 0; } // 监å�¬å€¼æ”¹å�˜çš„ä¿¡å�· const bool &oldValue = heapConfig->value("canExit").toBool(); QObject::connect(heapConfig.get(), &DConfig::valueChanged, [oldValue,&heapConfig](const QString &key){ qDebug() << "canExit原æ�¥çš„值:" << oldValue << ", canExit新的值:" << heapConfig->value(key).toBool(); }); // é‡�ç½®canExit的值 heapConfig->setValue("canExit", !oldValue); return a.exec(); } ``` ## 从æº�ç �构建 ```bash mkdir build && cd build # 修改路径å‰�缀为/usr,GNU标准的默认值为/usr/local cmake .. -DCMAKE_INSTALL_PREFIX=/usr make sudo make install ``` 结果如下图 ![example](/docs/src/dconfig_example1.png) @fn DConfig Dtk::Core::DConfig(const QString &name, const QString &subpath, QObject *parent) @brief 构造é…�置策略æ��供的对象 @param[in] name é…�置文件å�� @param[in] subpath é…�置文件对应的å­�目录 @param[in] parent 父对象 @fn DConfig Dtk::Core::DConfig(DConfigBackend *backend, const QString &name, const QString &subpath, QObject *parent) @brief 使用自定义的é…�置策略å�Žç«¯æž„造对象 @param[in] backend 调用者继承于DConfigBackendçš„é…�置策略å�Žç«¯ @param[in] name é…�置文件å�� @param[in] subpath é…�置文件对应的å­�目录 @param[in] parent 父对象 @fn static DConfig* Dtk::Core::DConfig::create(const QString &appId, const QString &name, const QString &subpath, QObject *parent) @brief 构造é…�置策略æ��供的对象,指定é…�置所属的应用Id,管ç�†æŸ�一特定应用的é…�置。 @param[in] appId é…�置文件所属的应用Id,为空时默认为本应用Id @param[in] name é…�置文件å�� @param[in] subpath é…�置文件对应的å­�目录 @param[in] parent 父对象 @return 构造的é…�置策略对象,由调用者释放 @fn static DConfig* Dtk::Core::DConfig::create(DConfigBackend *backend, const QString &appId, const QString &name, const QString &subpath, QObject *parent) @brief 构造é…�置策略æ��供的对象,指定é…�置所属的应用Id。 @param[in] backend 调用者继承于DConfigBackendçš„é…�置策略å�Žç«¯ @param[in] appId é…�置文件所属的应用Id,为空时默认为本应用Id @param[in] name é…�置文件å�� @param[in] subpath é…�置文件对应的å­�目录 @param[in] parent 父对象 @return 构造的é…�置策略对象,由调用者释放 @fn static DConfig* Dtk::Core::DConfig::createGeneric(const QString &name, const QString &subpath, QObject *parent) @brief 构造é…�置策略æ��供的对象,用æ�¥ç®¡ç�†ä¸Žåº”用无关的é…�置。 @param[in] name é…�置文件å�� @param[in] subpath é…�置文件对应的å­�目录 @param[in] parent 父对象 @return 构造的é…�置策略对象,由调用者释放 @note 如果我们管ç�†é’ˆå¯¹æŸ�一特定应用的é…�置,应该使用 Dtk::Core::DConfig::create(),或 Dtk::Core::DConfig(),æ�¥æŒ‡å®šæ‰€å±žåº”用的appId。 @fn static DConfig* Dtk::Core::DConfig::createGeneric(DConfigBackend *backend, const QString &name, const QString &subpath, QObject *parent) @sa Dtk::Core::DConfig::createGeneric() @fn DConfig Dtk::Core::DConfig(DConfigBackend *backend, const QString &appId, const QString &name, const QString &subpath, QObject *parent) @brief 使用自定义的é…�置策略å�Žç«¯æž„造对象 @param[in] backend 调用者继承于DConfigBackendçš„é…�置策略å�Žç«¯ @param[in] appId é…�置文件所属的应用Id,为空时默认为本应用Id @param[in] name é…�置文件å�� @param[in] subpath é…�置文件对应的å­�目录 @param[in] parent 父对象 @note 调用者å�ªæž„造backend,ç”±DConfig释放。 @fn static void DConfig::setAppId(const QString &appId) @brief 显示指定应用Id,ä¸�采用DSGApplication::id()作为应用Id @param[in] appId é…�置文件所属的应用Id @note 需è¦�在QCoreApplication构造å‰�设置。 @fn static void DConfig::globalThread() @brief 一个æœ�务于 DConfig 的公用线程,一般用于 dconfig2cpp 生æˆ�的代ç �,此线程在构造时会自动调用 QThread::start 以满足 dconfig2cpp 的需求。 @return 此线程默认为 running 状æ€� @note 请ä¸�è¦�æž�构它,它会在应用程åº�退出时释放 @fn QString Dtk::Core::DConfig::backendName() @brief é…�置策略å�Žç«¯å��ç§° @return é…�置策略å�Žç«¯å��ç§° @note 调用者å�ªèƒ½ç”¨DConfig访问DConfigBackend对象,所以ä¸�返回DConfigBackend对象。 @fn QStringList Dtk::Core::DConfig::keyList() @brief 获得所有å�¯ç”¨çš„é…�置项å��ç§° @return é…�置项å��称集å�ˆ @fn bool Dtk::Core::DConfig::isValid() @brief 判断此å�Žç«¯æ˜¯å�¦å�¯ç”¨ @fn bool Dtk::Core::DConfig::isDefaultValue(const QString &key) @brief 检测指定é…�置项å��称对应的值是å�¦ä¸ºé»˜è®¤å€¼ã€‚ @param[in] key é…�置项å��ç§° @fn QVariant Dtk::Core::DConfig::value(const QString &key, const QVariant &fallback) @brief æ ¹æ�®é…�置项å��称获得对应值 @param[in] key é…�置项å��ç§° @param[in] fallback 没有获å�–到é…�置项值å�Žæ��供的默认值 @fn void Dtk::Core::DConfig::setValue(const QString &key, const QVariant &value); @brief æ ¹æ�®é…�置项å��称设置其值 @param[in] key é…�置项å��ç§° @param[in] value 需è¦�更新的值 @fn void Dtk::Core::DConfig::reset(const QString &key) @brief 设置其é…�置项对应的默认值,此值为ç»�过override机制覆盖å�Žçš„值,ä¸�一定为此é…�置文件中meta中定义的值 @param[in] key é…�置项å��ç§° @fn bool Dtk::Core::DConfig::isReadOnly(const QString &key) @brief 检测指定é…�置项是å�¦ä¸ºå�ªè¯» @param[in] key é…�置项å��ç§° @return 如果é…�置项为å�ªè¯»è¿”回true,å�¦åˆ™è¿”回false @fn QString Dtk::Core::DConfig::name() @brief 返回é…�置文件å��ç§° @fn QString Dtk::Core::DConfig::subpath() @brief 返回é…�置文件对应的å­�目录 */ dtkcore-6.7.46/docs/global/dconfigfile.zh_CN.dox000066400000000000000000000410661522615770400214460ustar00rootroot00000000000000/*! @~chinese @file include/global/dconfigfile.h @ingroup dglobal @class Dtk::Core::DConfigFile dconfigfile.h @brief 规范é…�置文件读写的相关接å�£çš„é…�置文件实现 @details ## 概述 规范é…�置文件读写的相关接å�£çš„é…�置文件实现 项目目录结构如下: ```bash ├── CMakeLists.txt ├── config │ └── example.json └── main.cpp ``` ## CMakeLists.txt ```cmake cmake_minimum_required(VERSION 3.1.0) # 指定cmake最低版本 project(dconfigfile-example VERSION 1.0.0 LANGUAGES CXX) # 指定项目å��ç§°, 版本, 语言 cxx就是c++ set(CMAKE_CXX_STANDARD 11) # 指定c++标准 set(CMAKE_CXX_STANDARD_REQUIRED ON) # 指定c++标准è¦�求,至少为11以上 set(CMAKE_AUTOMOC ON) # 支æŒ�qt moc set(CMAKE_AUTORCC ON) # 支æŒ�qt资æº�文件 set(CMAKE_AUTOUIC ON) # 支æŒ�qt ui文件(é�žå¿…é¡») set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # 支æŒ� clangd if (CMAKE_VERSION VERSION_LESS "3.7.0") # 如果cmake版本å°�于3.7.0 set(CMAKE_INCLUDE_CURRENT_DIR ON) # 设置包å�«å½“å‰�目录 endif() find_package(Qt5 REQUIRED COMPONENTS Core) # 寻找Qt5组件Core find_package(Dtk REQUIRED COMPONENTS Core) # 寻找Dtk组件Core add_executable(${PROJECT_NAME} # 生æˆ�å�¯æ‰§è¡Œæ–‡ä»¶ main.cpp ) target_link_libraries(${PROJECT_NAME} PRIVATE # 添加需è¦�链接的共享库 Qt5::Core dtkcore ) # dtk_add_config_meta_files函数,部署一些"meta"çš„é…�置。 # 函数定义在dtkcoreçš„cmake目录下 # APPID 应用的ID # FILES 需è¦�部署的文件。 dtk_add_config_meta_files( APPID ${PROJECT_NAME} FILES ./config/example.json ) ``` ## example.json ```json { "magic": "dsg.config.meta", "version": "1.0", "contents": { "canExit": { "value": true, "serial": 0, "flags": ["global"], "name": "I am name", "name[zh_CN]": "我是å��å­—", "description": "I am description", "permissions": "readwrite", "visibility": "private" }, "key1": { "value": "125", "serial": 0, "flags": ["nooverride"], "name": "I am name", "name[zh_CN]": "我是å��å­—", "description": "I am description", "permissions": "readwrite", "visibility": "public" }, "number": { "value": 1, "serial": 0, "flags": ["global"], "name": "array value type", "permissions": "readwrite", "visibility": "public" }, "array": { "value": ["value1", "value2"], "serial": 0, "flags": ["global"], "name": "array", "permissions": "readwrite", "visibility": "public" }, "map": { "value": {"key1": "value1", "key2": "value2"}, "serial": 0, "flags": ["nooverride"], "name": "map", "permissions": "readwrite", "visibility": "public" }, "publicConfig": { "value": true, "serial": 0, "flags": ["user-public"], "name": "public configure", "name[zh_CN]": "我是公开的é…�ç½®", "description": "I am public configure", "permissions": "readwrite", "visibility": "private" } } } ``` ## main.cpp ```cpp #include #include #include #include DCORE_USE_NAMESPACE int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 构造DConfigFile,元数æ�®æ–‡ä»¶å��example,与元数æ�®å®‰è£…目录的/usr/share/dsg/configs/APPIDå��(å�¯æ‰§è¡Œæ–‡ä»¶å��)对应目录/example.json, DConfigFile configFile("dconfigfile-example","example"); // è§£æž�é…�置文件 configFile.load(); // 创建用户缓存 QScopedPointer userCache(configFile.createUserCache(getuid())); // è§£æž�é…�置文件 userCache->load(); // 判断是å�¦æœ‰æ•ˆ if (!configFile.isValid()) { qWarning() << QString("DConfig无效."); return 0; } // meta 返回原型对象, keyList获å�–所有é…�置项的key qDebug() << "所有的所有é…�置项的key:" << configFile.meta()->keyList(); // 获å�–指定é…�置项的值,é…�置项å�¯ä»¥æ˜¯å­—符串,数组,map容器,布尔值,整型,详è§�example.json qDebug() << "canExit对应的值:" << configFile.value("canExit").toBool(); // é…�置项的å�¯è§�性,其余é…�置项标记ã€�é…�置项的æ�ƒé™�å�¯æŸ¥çœ‹æ–‡æ¡£ qDebug() << "é…�置项的å�¯è§�性" << configFile.meta()->visibility("canExit"); QVariantMap map; map.insert("k1","v1"); map.insert("k2","v2"); // 设置map的值 configFile.setValue("map", map, "dconfigfile-example", userCache.get()); configFile.save(); // root用户è¿�行,save的数æ�®ä¼šä¿�存到/root/.config/dsg/configs-fake-global/dconfigfile-example/example.json // mapæ•°æ�®å¯¹åº”çš„flags标记为NoOverride,é…�置项å…�许被覆盖,如果flags为global泽忽略用户身份,详è§�文档。 userCache->save(); return a.exec(); } ``` ## 从æº�ç �构建 ```bash mkdir build && cd build # 修改路径å‰�缀为/usr,GNU标准的默认值为/usr/local cmake .. -DCMAKE_INSTALL_PREFIX=/usr sudo make install sudo ./dconfigfile-example ``` 结果如下图 ![一些简å�•的输出](/docs/src/dconfigfile_example1.png) ![用户ä¿�存的数æ�®](/docs/src/dconfigfile_example2.png) @enum Dtk::Core::DConfigFile::Flag @brief é…�置项å��ç§° @var Dtk::Core::DConfigFile::Flag Dtk::Core::DConfigFile::NoOverride @brief 存在此标记时,将表明则此é…�置项ä¸�å�¯è¢«è¦†ç›–(详è§�下述 override 机制)。å��之,ä¸�存在此标记时表明此é…�置项å…�许被覆盖,对于此类é…�置项,如若其有界é�¢è®¾ç½®å…¥å�£ï¼Œåˆ™å½“此项ä¸�å�¯å†™æ—¶ï¼Œåº”当éš�è—�或ç¦�用界é�¢çš„设置入å�£. @var Dtk::Core::DConfigFile::Flag Dtk::Core::DConfigFile::Global @brief 当读写此类é…�置时,将忽略用户身份,无论程åº�使用哪个用户身份执行,读æ“�作都将获å�–到å�Œæ ·çš„æ•°æ�®ï¼Œå†™æ“�作将对所有用户都生效。但是,如果对应的é…�置存储目录ä¸�存在或无æ�ƒé™�写入,则忽略此标志 @var Dtk::Core::DConfigFile::Flag Dtk::Core::DConfigFile::UserPublic @brief 该类é…�置项å…�许被其他用户访问 @enum Dtk::Core::DConfigFile::Permissions @brief é…�置项的æ�ƒé™� @var Dtk::Core::DConfigFile::Permissions Dtk::Core::DConfigFile::ReadOnly @brief å°†é…�置项覆盖为å�ªè¯» @var Dtk::Core::DConfigFile::Permissions Dtk::Core::DConfigFile::ReadWrite @brief å°†é…�置项覆盖为å�¯è¯»å�¯å†™ @enum Dtk::Core::DConfigFile::Visibility @brief é…�置项的å�¯è§�性 @var Dtk::Core::DConfigFile::Visibility Dtk::Core::DConfigFile::Private @brief ä»…é™�程åº�内部使用,对外ä¸�å�¯è§�。此类é…�置项完全由程åº�自己读写,å�¯éš�æ„�增删改写其å�«ä¹‰ï¼Œæ— éœ€å�šå…¼å®¹æ€§è€ƒè™‘ @var Dtk::Core::DConfigFile::Visibility Dtk::Core::DConfigFile::Public @brief 外部程åº�å�¯ä½¿ç”¨ã€‚ 此类é…�置项一旦å�‘布,在兼容性版本的å�‡çº§ä¸­ï¼Œè¦�ä¿�障此é…�置项å�‘下兼容,简而言之,å�ªå…�许在程åº�/库的大版本å�‡çº§æ—¶æ‰�å…�许删除或修改此类é…�置项,当é…�置项的 permissionsã€�visibilityã€�flags ä»»æ„�一个属性被修改则认为此é…�置项被修改,除此之外修改 valueã€�nameã€�description 属性时则ä¸�需è¦�考虑兼容性。 @struct Dtk::Core::DConfigFile::Version @brief 版本信æ�¯ @details 此文件的内容格å¼�的版本。版本å�·ä½¿ç”¨ä¸¤ä½�æ•°å­—æ��述, 首ä½�æ•°å­—ä¸�å�Œçš„æ��述文件相互之间ä¸�兼容,第二ä½�æ•°å­—ä¸�å�Œçš„æ��述文件需满足å�‘下兼容。 读å�–æ­¤æ��述文件的程åº�è¦�æ ¹æ�®ç‰ˆæœ¬è¿›è¡Œå†…容分æž�,当é�‡åˆ°ä¸�兼容的版本时,需è¦�ç«‹å�³ç»ˆæ­¢è§£æž�,忽略此文件, 并在程åº�日志中写入警告信æ�¯ï¼Œå¦‚ “1.0â€� å’Œ “2.0â€� 版本之间ä¸�兼容, 如果解æž�程åº�最高å�ªæ”¯æŒ� 1.0 版本,则é�‡åˆ° 2.0 版本的æ��述文件时应该终止解æž�, 但是如果é�‡åˆ° 1.1 版本,则å�¯ä»¥ç»§ç»­æ‰§è¡Œã€‚ 写入此æ��述文件时,é�‡åˆ°ä¸�兼容的版本时,需è¦�先清空当å‰�内容å†�写入,æ¯�次写入皆需更新此字段。 @fn static constexpr DConfigFile::Version Dtk::Core::DConfigFile::supportedVersion() @brief 支æŒ�的版本 @return @fn Dtk::Core::DConfigFile::DConfigFile(const QString &appId, const QString &name, const QString &subpath = QString()) @brief DConfigFile构造函数,构造é…�置文件管ç�†å¯¹è±¡ã€‚ @param[in] appId 应用程åº�唯一标识 @param[in] name é…�置文件å�� @param[in] subpath å­�目录 @fn Dtk::Core::DConfigFile::DConfigFile(const DConfigFile &other); @brief DConfigFile构造函数,构造é…�置文件管ç�†å¯¹è±¡ã€‚ @param[in] appId 应用程åº�唯一标识 @param[in] name é…�置文件å�� @param[in] subpath å­�目录 @fn bool Dtk::Core::DConfigFile::load(const QString &localPrefix = QString()) @brief è§£æž�é…�置文件 @param[in] localPrefix 为目录å‰�ç¼€ @return @fn bool Dtk::Core::DConfigFile::load(QIODevice *meta, const QList &overrides) @brief è§£æž�é…�置文件æµ� @param[in] meta 为原型æµ� @param[in] overrides 为覆盖机制查找的文件æµ� @return @fn bool Dtk::Core::DConfigFile::save(const QString &localPrefix = QString(), QJsonDocument::JsonFormat format = QJsonDocument::Indented, bool sync = false) const @brief ä¿�存缓存的值到ç£�盘中 @param[in] format ä¿�存格å¼� @param[in] sync 是å�¦ç«‹å�³åˆ·æ–° @return @fn bool Dtk::Core::DConfigFile::isValid() const @brief 检测é…�置文件是å�¦æœ‰æ•ˆ @return @fn QVariant Dtk::Core::DConfigFile::value(const QString &key, DConfigCache *userCache = nullptr) const @brief DConfigFile::value @param[in] key é…�置项å��ç§° @param[in] userCache 用户缓存,当key为全局项时, \a userCache ä¸�会被使用 @return @fn QVariant Dtk::Core::DConfigFile::cacheValue(DConfigCache *userCache, const QString &key) const @brief DConfigFile::cacheValue 获å�–指定用户缓存的é…�置项值,若无此é…�置项的用户缓存值,返回无效值 @param[in] key é…�置项å��ç§° @param[in] userCache 用户缓存,当key为全局é…�置项时, \a userCache ä¸�会被使用 @return @fn bool Dtk::Core::DConfigFile::setValue(const QString &key, const QVariant &value, const QString &callerAppid, DConfigCache *userCache = nullptr) @brief 设置缓存中的值 @param[in] key é…�置项å��ç§° @param[in] value 需è¦�设置的值 @param[in] uid 设置时的用户id @param[in] appid 设置时的应用id @return 为true时表示é‡�新设置了新值,false表示没有设置 @fn DConfigCache* Dtk::Core::DConfigFile::createUserCache(const uint uid) @brief 创建用户缓存 @fn DConfigCache* Dtk::Core::DConfigFile::globalCache() const @brief 返回全局缓存 @return @fn DConfigMeta* Dtk::Core::DConfigFile::meta() @brief 返回原型对象 @return */ /*! @class Dtk::Core::DConfigMeta dconfigfile.h @brief æ��ä¾›é…�置文件的原型和覆盖机制的访问接å�£ @fn virtual DConfigFile::Version Dtk::Core::DConfigMeta::version() const = 0 @brief 返回é…�置版本信æ�¯ @return @fn virtual void Dtk::Core::DConfigMeta::setVersion(quint16 major, quint16 minor) = 0 @brief 设置é…�置版本信æ�¯ @param[in] major 主æ�¿æœ¬å�· @param[in] minor 次版本å�· @fn virtual bool Dtk::Core::DConfigMeta::load(const QString &localPrefix = QString()) = 0 @brief è§£æž�é…�置文件 @param[in] localPrefix 为目录å‰�ç¼€ @return @fn virtual bool Dtk::Core::DConfigMeta::load(QIODevice *meta, const QList &overrides) = 0 @brief è§£æž�é…�置文件æµ� @param[in] meta 为原型æµ� @param[in] overrides 为覆盖机制查找的文件æµ� @return @fn virtual QStringList Dtk::Core::DConfigMeta::keyList() const = 0 @brief 返回é…�置内容的所有é…�置项 @return @fn virtual DConfigFile::Flags Dtk::Core::DConfigMeta::flags(const QString &key) const = 0 @brief 返回指定é…�置项的特性 @param[in] key é…�置项å��ç§°, NoOverride为此é…�置项ä¸�å�¯è¢«è¦†ç›–, Global为忽略用户身份 @return @fn virtual DConfigFile::Permissions Dtk::Core::DConfigMeta::permissions(const QString &key) const = 0 @brief 返回指定é…�置项的æ�ƒé™� @param[in] key é…�置项å��ç§° @return @fn virtual DConfigFile::Visibility Dtk::Core::DConfigMeta::visibility(const QString &key) const = 0 @brief 返回指定é…�置项的å�¯è§�性 @param[in] key é…�置项å��ç§° @return @fn virtual int Dtk::Core::DConfigMeta::serial(const QString &key) const = 0 @brief 返回é…�置项的å�•调递增值 @param[in] key é…�置项å��ç§° @return -1为无效值,表明没有é…�置此项 @fn virtual QString Dtk::Core::DConfigMeta::displayName(const QString &key, const QLocale &locale) = 0 @brief 返回指定é…�置项的显示å�� @param[in] key é…�置项å��ç§° @param[in] locale 为语言版本 @return @fn virtual QString Dtk::Core::DConfigMeta::description(const QString &key, const QLocale &locale) = 0 @brief 返回指定é…�置项的æ��è¿°ä¿¡æ�¯ @param[in] key é…�置项å��ç§° @param[in] locale 为语言版本 @return @fn virtual QString Dtk::Core::DConfigMeta::metaPath(const QString &localPrefix = QString(), bool *useAppId = nullptr) const = 0 @brief 返回æ��述文件的路径 @param[in] localPrefix 目录的所有需è¦�查找的覆盖机制目录 @param[in] useAppId 是å�¦ä¸�使用通用目录 @return @fn virtual QStringList Dtk::Core::DConfigMeta::allOverrideDirs(const bool useAppId, const QString &prefix = QString()) const = 0 @brief 获得å‰�缀为 `prefix` 目录的所有需è¦�查找的覆盖机制目录 @param[in] useAppId 是å�¦ä¸�使用通用目录 @param[in] prefix 目录的应用或公共库的所有覆盖机制目录 @return @fn virtual QVariant DConfigMeta::value(const QString &key) const = 0 @brief metaåˆ�始值ç»�过覆盖机制覆盖å�Žçš„原始值 @param[in] key é…�置项å��ç§° @return @fn static QStringList genericMetaDirs(const QString &localPrefix = QString()) @brief 获å�–应用无关é…�置存储的目录 @param[in] localPrefix é…�置的目录å‰�ç¼€ @return 返回应用无关é…�置存储的目录列表 @fn static QStringList applicationMetaDirs(const QString &localPrefix, const QString &appId) @brief 获å�–应用é…�置存储的目录 @param[in] localPrefix é…�置的目录å‰�ç¼€ @param[in] appId 应用唯一标识 @return 返回存储应用é…�置的目录列表 */ /*! @class Dtk::Core::DConfigCache dconfigfile.h @brief æ��ä¾›é…�置文件的用户和全局è¿�行缓存访问接å�£ @fn virtual bool Dtk::Core::DConfigCache::load(const QString &localPrefix = QString()) = 0 @brief è§£æž�缓存é…�置文件 @return @fn virtual bool Dtk::Core::DConfigCache::load(const QString &localPrefix = QString()) = 0 @brief è§£æž�缓存é…�置文件 @return @fn virtual bool Dtk::Core::DConfigCache::save(const QString &localPrefix = QString(), QJsonDocument::JsonFormat format = QJsonDocument::Indented, bool sync = false) = 0 @brief ä¿�存缓存的值到ç£�盘中 @param[in] localPrefix 为目录å‰�ç¼€ @param[in] format ä¿�存格å¼� @param[in] sync 是å�¦ç«‹å�³åˆ·æ–° @return @fn virtual bool Dtk::Core::DConfigCache::isGlobal() const = 0 @brief 是å�¦æ˜¯å…¨å±€ç¼“å­˜ @return @fn virtual void Dtk::Core::DConfigCache::remove(const QString &key) = 0 @brief 删除缓存中的é…�置项 @param[in] key é…�置项å��ç§° @return @fn virtual QStringList Dtk::Core::DConfigCache::keyList() const = 0 @brief 返回é…�置内容的所有é…�置项 @return @fn virtual bool Dtk::Core::DConfigCache::setValue(const QString &key, const QVariant &value, const int serial, const uint uid, const QString &callerAppid) = 0 @brief 设置缓存中的值 @param[in] key é…�置项å��ç§° @param[in] value 需è¦�设置的值 @param[in] uid 设置时的用户id @param[in] callerAppid 设置时的应用id @return 为true时表示é‡�新设置了新值,false表示没有设置。 @fn virtual QVariant Dtk::Core::DConfigCache::value(const QString &key) const = 0 @brief 获å�–缓存中的值 @param[in] key é…�置项å��ç§° @return @fn virtual int Dtk::Core::DConfigCache::serial(const QString &key) const = 0 @brief 返回é…�置项的å�•调递增值 @param[in] key é…�置项å��ç§° @return -1为无效值,表明没有é…�置此项 @fn virtual uint Dtk::Core::DConfigCache::uid() const = 0 @brief 用户标识,为全局缓存时,uid为é�žç”¨æˆ·æ ‡è¯†çš„特定值 @return @fn virtual void setCachePathPrefix(const QString &prefix) = 0 @brief 指定缓存ä½�ç½®å‰�缀,缓存访问所需的æ�ƒé™�å�ŠåŒºåˆ†ä¸�å�Œç¼“存的ä½�置由调用者考虑,其默认值å�‚考é…�置策略规范 @param[in] prefix 缓存ä½�置的å‰�ç¼€ */ dtkcore-6.7.46/docs/global/ddesktopentry.zh_CN.dox000066400000000000000000000410631522615770400220710ustar00rootroot00000000000000/*! @~chinese @file include/global/ddesktopentry.h @ingroup dglobal @class Dtk::Core::DDesktopEntry ddesktopentry.h @brief 处ç�†desktop文件的接å�£ @details ## 概述 DDesktopEntryæ��供了处ç�†XDG desktop读写的方法的接å�£,这个Class类似于QSettings。 有关该规范本身的更多详细信æ�¯ï¼Œè¯·å�‚阅: https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html 项目目录结构在å�Œä¸€ç›®å½•下 ## CMakeLists.txt ```cmake cmake_minimum_required(VERSION 3.1.0) # 指定cmake最低版本 project(example1 VERSION 1.0.0 LANGUAGES CXX) # 指定项目å��ç§°, 版本, 语言 cxx就是c++ set(CMAKE_CXX_STANDARD 11) # 指定c++标准 set(CMAKE_CXX_STANDARD_REQUIRED ON) # 指定c++标准è¦�求,至少为11以上 set(target example1) # 指定目标å��ç§° set(CMAKE_AUTOMOC ON) # support qt moc # 支æŒ�qt moc set(CMAKE_AUTORCC ON) # support qt resource file # 支æŒ�qt资æº�文件 set(CMAKE_AUTOUIC ON) # support qt ui file # 支æŒ�qt ui文件(é�žå¿…é¡») set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # support clangd # 支æŒ� clangd if (CMAKE_VERSION VERSION_LESS "3.7.0") # 如果cmake版本å°�于3.7.0 set(CMAKE_INCLUDE_CURRENT_DIR ON) # 设置包å�«å½“å‰�目录 endif() find_package(Qt5 COMPONENTS Core REQUIRED) # 寻找Qt5组件Core find_package(Dtk COMPONENTS Core REQUIRED) # 寻找Dtk组件Core add_executable(${target} # 生æˆ�å�¯æ‰§è¡Œæ–‡ä»¶ main.cpp ) target_link_libraries(${target} PRIVATE # 添加需è¦�链接的共享库 Qt5::Core dtkcore ) ``` ## main.cpp ```cpp #include #include #include #include DCORE_USE_NAMESPACE // 使用Dtk Core命å��空间 const QString fileContent = { QStringLiteral(R"desktop(# A. Example Desktop Entry File [Desktop Entry] Version=1.0 Type=Application Name=Foo Viewer Name[zh_CN]=ç¦�查看器 Comment=The best viewer for Foo objects available! # Next line have an extra " character Comment[zh_CN]=最棒的 "ç¦� 查看器ï¼� TryExec=fooview Exec=fooview %F Icon=fooview MimeType=image/x-foo; Actions=Gallery;Create; [Desktop Action Gallery] Exec=fooview --gallery Name=Browse Gallery [Desktop Action Create] Exec=fooview --create-new Name=Create a new Foo! Icon=fooview-new )desktop") }; int main(int argc, char *argv[]) { QFile file("example1.desktop"); // å°�试打开文件 if(!file.open(QIODevice::WriteOnly | QIODevice::Text)){ qDebug()<<"文件打开失败"; } const QString fileName = file.fileName(); QTextStream ts(&file); ts << fileContent; file.close(); QFile::exists(fileName); // 打开一个fileName为example1.desktop的文件 QScopedPointer desktopFile(new DDesktopEntry(fileName)); // 获å�–desktop中所有组并返回列表,对应"Desktop Entry"ã€�"Desktop Action Gallery"ã€�"Desktop Action Create"三组 QStringList allGroups = desktopFile->allGroups(); qDebug() << QString("Desktop 文件共有%1组").arg(allGroups.count()); // 调用allGroups函数,传入true,ä¿�æŒ�读å�–desktop文件时的顺åº�ä¸�å�˜ï¼ŒèŽ·å�–第0组 qDebug() << QString("Desktop 文件第0组为: %1").arg(desktopFile->allGroups(true)[0]); // 获å�–key=Name,localeKey=zh_CN的值,å�³Name[zh_CN]=ç¦�查看器 qDebug() << QString("Name[zh_CN]=%1") \ .arg(desktopFile->localizedValue("Name", "zh_CN")); // 获å�–key为Nam,,localeKey为empty的值,empty表示没有localeKey,å�³Name=Foo Viewer qDebug() << QString("Name=%1") \ .arg(desktopFile->localizedValue("Name", "empty")); // 获å�–Desktop Entry组下的所有key,å�³"Actions", "Comment", "Comment[zh_CN]", "Exec", "Icon", "MimeType", "Name", "Name[zh_CN]", "TryExec", "Type", "Version" qDebug() << QString("Desktop Entry组下的所有key: ") \ << desktopFile->keys("Desktop Entry"); // 设置 key 为 Name的值为"Bar Viewer",默认组是"Desktop Entry" desktopFile->setRawValue("Bar Viewer", "Name"); // 设置 key 为 Name,localeKey为zh_CN的值为霸查看器,默认组是"Desktop Entry" desktopFile->setLocalizedValue("霸查看器", "zh_CN", "Name"); // 检查 section 中是å�¦åŒ… key 为 Semicolon 的值,包å�« key 返回true; å�¦åˆ™è¿”回false,默认组是Desktop Entry qDebug() << QString("Desktop Entry组是å�¦åŒ…key是Semicolon: ") \ << desktopFile->contains("Semicolon", "Desktop Entry"); // 设置key为Semicolon的值为";grp\\;2;grp3;",默认组是"Desktop Entry" desktopFile->setRawValue(";grp\\;2;grp3;", "Semicolon"); // 返回给定 section 中与给定 key å…³è�”的字符串的列表。如果destkopä¸�包å�«ä¸ºè¯¥é”®çš„项,则函数返回一个空字符串列表。 默认组是Desktop Entry qDebug() << QString("Desktop Entry组中Semicolon对应值的字符串列表: ") \ << desktopFile->stringListValue("Semicolon"); // å†�次检查 section 中是å�¦åŒ… key 为 Semicolon 的值,此时为true qDebug() << QString("Desktop Entry组是å�¦åŒ…key是Semicolon: ") \ << desktopFile->contains("Semicolon", "Desktop Entry"); // 删除desktop中 section 中 key 对应的值,默认组是"Desktop Entry" desktopFile->removeEntry("Semicolon", "Desktop Entry"); // å†�次检查 section 中是å�¦åŒ… key 为 Semicolon 的值,此时为false qDebug() << QString("Desktop Entry组是å�¦åŒ…key是Semicolon: ") \ << desktopFile->contains("Semicolon", "Desktop Entry"); // 将数æ�®å›žå†™åˆ°desktop文件。 true表示写æˆ�功; å�¦åˆ™è¿”回false if (desktopFile->save()) { qDebug() << "文件ä¿�å­˜æˆ�功"; } else { qDebug() << "文件ä¿�存失败"; } return 0; } ``` 结果如下图 ![example](/docs/src/ddesktopentry_example1.png) @enum Dtk::Core::DDesktopEntry::EntryType @brief 桌é�¢å…¥å�£æ–‡ä»¶çš„类型 @var Dtk::Core::DDesktopEntry::Unknown @brief 未知的桌é�¢æ–‡ä»¶ç±»åž‹ã€‚å�¯èƒ½æ˜¯æ— æ•ˆçš„ @var Dtk::Core::DDesktopEntry::Application @brief 该文件æ��述应用程åº� @var Dtk::Core::DDesktopEntry::Link @brief 该文件æ��è¿°URL @var Dtk::Core::DDesktopEntry::Directory @brief 该文件æ��述目录设置 @var Dtk::Core::DDesktopEntry::ServiceType @brief KDE特定类型。规范中æ��到过, 所以这里也列出了 @var Dtk::Core::DDesktopEntry::Service @brief KDE特定类型。规范中æ��到过, 所以这里也列出了 @var Dtk::Core::DDesktopEntry::FSDevice @brief KDE特定类型。规范中æ��到过, 所以这里也列出了 @enum Dtk::Core::DDesktopEntry::ValueType @brief 值的类型 @var Dtk::Core::DDesktopEntry::Unparsed @brief 未解æž�的值 @var Dtk::Core::DDesktopEntry::String @brief 字符串 @var Dtk::Core::DDesktopEntry::Strings @brief 字符串数组 @var Dtk::Core::DDesktopEntry::Boolean @brief 布尔值 @var Dtk::Core::DDesktopEntry::Numeric @brief æ•°å­— @var Dtk::Core::DDesktopEntry::NotExisted @brief ä¸�存在 @enum Dtk::Core::DDesktopEntry::Status @brief desktop文件的解æž�状æ€� @var Dtk::Core::DDesktopEntry::NoError @brief 没有错误å�‘生 @var Dtk::Core::DDesktopEntry::AccessError @brief å�‘生访问错误(例如, 试图写入å�ªè¯»æ–‡ä»¶) @var Dtk::Core::DDesktopEntry::FormatError @brief å�‘生格å¼�错误(例如, 加载格å¼�错误的desktop文件) @fn Dtk::Core::DDesktopEntry::DDesktopEntry(const QString &filePath) noexcept @brief DDesktopEntry构造函数 @fn bool Dtk::Core::DDesktopEntry::save() const @brief 将数æ�®å›žå†™åˆ°desktop文件。 @return true表示写æˆ�功; å�¦åˆ™è¿”回false @fn Status Dtk::Core::DDesktopEntry::status() const @brief Get data parse status @return 返回一个状æ€�ç �, 表示DDesktopEntryé�‡åˆ°çš„第一个错误, 如果没有错误å�‘生, 则返回QSettings::NoError。请注æ„�, DDesktopEntry会延迟执行æŸ�些æ“�作。 @fn QStringList Dtk::Core::DDesktopEntry::keys(const QString §ion = "Desktop Entry") const @brief æ ¹æ�® `section` 返回全部键值 @return 返回所有的键值 @fn QStringList Dtk::Core::DDesktopEntry::allGroups(bool sorted = false) const @brief 获å�–desktop中所有组的列表。如果 `sorted` 设置为true, 则返回结果将ä¿�æŒ�读å�–desktop文件时的顺åº�ä¸�å�˜ã€‚ @return 返回所有的组. @fn bool Dtk::Core::DDesktopEntry::contains(const QString &key, const QString §ion = "Desktop Entry") const @brief 检查desktop文件是å�¦æœ‰ç»™å®šçš„ `section` 包å�«ç»™å®šçš„ `key` @return 如果desktop在 `section` 包å�« `key` 返回true; å�¦åˆ™è¿”回false。 @fn QString Dtk::Core::DDesktopEntry::name() const @brief 返回“Desktop Entryâ€�部分下的“Nameâ€�键的本地化字符串值。这等价于调用localizedValue("Name")。 @return 返回“Desktop Entryâ€�部分下的“Nameâ€�键的本地化字符串值。 @sa localizedValue(), genericName(), ddeDisplayName() @fn QString Dtk::Core::DDesktopEntry::genericName() const @brief 返回"Desktop Entry"部分下的"GenericName"键的本地化字符串值。它等价于调用localizedValue("GenericName")。如果是“GenericNameâ€�ä¸�存在。则ä¸�会回退到“Nameâ€�。 @return 返回"Desktop Entry"部分下的"GenericName"键的本地化字符串值。 @sa localizedValue(), name(), ddeDisplayName() @fn QString Dtk::Core::DDesktopEntry::ddeDisplayName() const @brief 为DDE应用程åº�专门显示å��ç§° @details 这将检查“X-Deepin-Vendorâ€�,并将返回本地化的字符串值“GenericNameâ€� "X-Deepin-Vendor"是"deepin",å�¦åˆ™å®ƒå°†è¿”回"Name"的本地化字符串值。 @return 返回专门用于DDE应用程åº�的显示å��ç§° @sa localizedValue(), name(), genericName() @fn QString Dtk::Core::DDesktopEntry::comment() const @brief 返回“Desktop Entryâ€�部分下的“Commentâ€�键的本地化字符串值。这等价于调用localizedValue("Comment")。 @return 返回“Desktop Entryâ€�部分下的“Commentâ€�键的本地化字符串值。 @sa localizedValue() @fn QString Dtk::Core::DDesktopEntry::rawValue(const QString &key, const QString §ion = "Desktop Entry", const QString &defaultValue = QString()) const @brief 返回 `section` 中与给定 `key` å…³è�”的原始字符串值。如果desktopä¸�包å�«å…·æœ‰è¯¥é”®çš„项, 则函数返回一个构造好的 `defaultValue`。 @return 返回 `section` 中与给定 `key` 相关è�”的原始字符串值。 @sa stringValue() localizedValue() stringListValue() @fn QString Dtk::Core::DDesktopEntry::stringValue(const QString &key, const QString §ion = "Desktop Entry", const QString &defaultValue = QString()) const @brief 返回 `section` 与给定 `key` å…³è�”的未转义字符串值。如果desktopä¸�包å�«é”®å€¼ä¸º0的项, 则函数返回一个构造好的 `defaultValue`。 @return 返回 `section` 中与给定 `key` 相关è�”的未转义字符串值。 @sa rawValue() localizedValue() stringListValue() @fn QString Dtk::Core::DDesktopEntry::localizedValue(const QString &key, const QString &localeKey = "default", const QString §ion = "Desktop Entry", const QString& defaultValue = QString()) const @brief 返回与 `section` 中给定的 `key` å’Œ `localeKey` 相关è�”的本地化字符串值。 @details 如果找ä¸�到给定的 `localeKey` ,它将回退到"C",如果ä»�然找ä¸�到,将回退 `key` 没有`localeKey`部分。。 如果destkopä¸�包å�« `key` 值为0的项,则函数返回一个构造好的 `defaultValue`。 @return 返回 `section` 中与给定的 `key` å’Œ `localeKey` å…³è�”的本地化字符串值。 @sa rawValue() stringValue() stringListValue() @fn QString Dtk::Core::DDesktopEntry::localizedValue(const QString &key, const QLocale &locale, const QString §ion = "Desktop Entry", const QString& defaultValue = QString()) const @brief 返回与给定的 `key` å’Œ `section` 中的区域设置相关è�”的本地化字符串值。 @details 如果找ä¸�到给定的 `localeKey` ,它将回退到"C",如果ä»�然找ä¸�到,将回退 `key` 没有`localeKey`部分。 如果destkopä¸�包å�« `key` 值为0的项,则函数返回一个构造好的 `defaultValue`。 @return 返回 `section`中 与给定的 `key` å’Œ `locale` 设置相关è�”的本地化字符串值。 @sa rawValue() stringValue() stringListValue() @fn QStringList Dtk::Core::DDesktopEntry::stringListValue(const QString &key, const QString §ion = "Desktop Entry") const @brief 返回给定 `section` 中与给定 `key` å…³è�”的字符串的列表。如果destkopä¸�包å�«ä¸ºè¯¥é”®çš„项,则函数返回一个空字符串列表。 @return 返回给定 `section` 中与给定 `key` å…³è�”的字符串的列表。 @sa rawValue() stringValue() localizedValue() @fn bool Dtk::Core::DDesktopEntry::setRawValue(const QString &value, const QString &key, const QString& section = "Desktop Entry") @brief 设置给定 `section` 中与给定 `key` å…³è�”的原始字符串值。 @fn bool Dtk::Core::DDesktopEntry::setStringValue(const QString &value, const QString &key, const QString& section = "Desktop Entry") @brief 设置给定 `section` 中与给定 `key` å…³è�”的字符串 @fn bool Dtk::Core::DDesktopEntry::setLocalizedValue(const QString &value, const QString& localeKey, const QString &key, const QString& section = "Desktop Entry") @brief 设置给定的 `key` å’Œ `section` 中的区域设置相关è�”的本地化字符串值。 @fn bool Dtk::Core::DDesktopEntry::removeEntry(const QString &key, const QString §ion = "Desktop Entry"); @brief 删除desktop中 `section` 与 `key` 对应的值 @fn static QString& Dtk::Core::DDesktopEntry::escape(QString &str) @brief 支æŒ�转义åº�列`\s`ã€�`\n`ã€�`\t`ã€�`\r`å’Œ`\\`表示值 @details stringå’Œlocalestring类型的值支æŒ�转义åº�列`\s`ã€�`\n`ã€�`\t`ã€�`\r`å’Œ`\\`,分别表示ASCII空格ã€�æ�¢è¡Œç¬¦ã€�制表符ã€�回车和å��æ–œæ� ã€‚ @fn static QString& Dtk::Core::DDesktopEntry::escapeExec(QString &str) @brief 必须将å�‚数括在å�Œå¼•å�·ä¹‹é—´ï¼Œå¹¶å¯¹å�Œå¼•å�·å­—符进行转义。 @details | 原字符 | 转义å�Ž | |------|---------| | \` | "`" | | $ | "$" | | \ | "\" | 在它å‰�é�¢åŠ ä¸Šä¸€ä¸ªé¢�外的å��æ–œæ� å­—符。实现必须在扩展字段代ç �之å‰�和之å‰�撤销引用,å°†å�‚数传递给å�¯æ‰§è¡Œç¨‹åº�。 @note 类型为string的值的通用转义规则规定,å��æ–œæ� å­—符也å�¯ä»¥è½¬ä¹‰ä¸º("\\")和这个转义规则应用在引用规则之å‰�。
因此,�明确地表示在desktop文件中,引��数中的文字�斜�字符
�求使用四个连续的�斜�字符("\\\\")。�样,在桌�入�文件中引用�数中的美元符�表示为("\\$")。 @fn static QString& Dtk::Core::DDesktopEntry::unescape(QString &str, bool unescapeSemicolons = false) @brief 对于类型为string和localestring的值,支�转义�列`\s`�`\n`�`\t`�`\r`和`\\`,分别表示ASCII空格��行符�制表符�回车符和�斜�。 @details 有些键�以有多个值。这�情况下,`key` 的值被指定为�数形�: 例如,字符串。多个值应该用分�分隔,`key` 的值�以选择以分�结尾。空字符串必须以分�结尾。 这些值中的分�需�使用`\;`转义。 有关该规范本身的更多详细信�,请�阅: https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#value-types @fn static QString& Dtk::Core::DDesktopEntry::unescapeExec(QString &str) @brief 必须将�数括在�引�之间,并对�引�字符进行转义, @details | 原字符 | 转义� | |------|---------| | \` | "`" | | $ | "$" | | \ | "\" | 在它��加上一个�外的�斜�字符。实现必须在扩展字段代�之�和之�撤销引用,将�数传递给�执行程�。 �留字符: | 功能 | 字符 | |---------------------|---------| | space | " " | | tab | | | newline | | | double quote | | | single quote | "'" | | backslash character | "\" | | greater-than sign | ">" | | less-than sign | "<" | | tilde | "~" | | vertical bar | \| | | ampersand | "&" | | semicolon | ";" | | dollar sign | "$" | | asterisk | "*" | | question mark | "?" | | hash mark | "#" | | parenthesis | "(" 和 ")" | | backtick character | "`" | @note 类型为string的值的通用转义规则规定
�斜�字符也�以转义为("\\"),而且转义规则在引�规则之�应用。
因此,�在desktop文件的引��数中明确表示字�上的�斜�字符,需�使用四个连续的�斜�字符(“\\\\�)。
�样,在desktop文件中,引��数中的美元符��以明确地表示为("\\$")。 @fn bool Dtk::Core::DDesktopEntry::setStatus(const Status &status) @brief 设置desktop文件解�状� */ dtkcore-6.7.46/docs/global/dlicenseinfo.zh_CN.dox000066400000000000000000000032671522615770400216400ustar00rootroot00000000000000/*! @~chinese @ingroup dglobal @file include/global/dlicenseinfo.h @class Dtk::Core::DLicenseInfo::DComponentInfo @brief dcomponentinfo 是一组用于查询组件所用开��议信�的类 @fn Dtk::Core::DLicenseInfo::DComponentInfo::DComponentInfo(DObject *parent) @brief 组件信�类的构造函数 @param[in] parent 组件信�类的父对象 @fn QString Dtk::Core::DLicenseInfo::DComponentInfo::name() @brief 获�组件的�称 @fn QString Dtk::Core::DLicenseInfo::DComponentInfo::version() @brief 获�组件的版本� @fn QString Dtk::Core::DLicenseInfo::DComponentInfo::copyRight() @brief 获�组件的授�信� @fn QString Dtk::Core::DLicenseInfo::DComponentInfo::licenseName() @brief 获�组件的所用开�许��议�称 @class Dtk::Core::DLicenseInfo @brief dlicenseinfo是一组用于查询应用所用开�许��议相关信�的类 @fn Dtk::Core::DLicenseInfo::DLicenseInfo(DObject *parent) @brief 开�许��议信�类的构造函数 @param[in] parent 开�许��议信�类的父对象 @fn bool Dtk::Core::DLicenseInfo::loadContent(const QByteArray &content) @brief 通过内容content加载�议 @return 0 加载失败 @return 1 加载�功 @fn bool Dtk::Core::DLicenseInfo::loadFile(const QString &file) @brief 通过文件file加载�议 @return 0 加载失败 @return 1 加载�功 @fn void Dtk::Core::DLicenseInfo::setLicenseSearchPath(const QString &path) @brief 设置�议内容路径path @fn QByteArray Dtk::Core::DLicenseInfo::licenseContent(const QString &licenseName) @brief 获��议�为licenseName的内容 @fn DLicenseInfo::DComponentInfos Dtk::Core::DLicenseInfo::componentInfos() @brief 获�组件的相关信� */ dtkcore-6.7.46/docs/global/dsysinfo.zh_CN.dox000066400000000000000000000273611522615770400210350ustar00rootroot00000000000000/*! @~chinese @ingroup dglobal @file include/global/dsysinfo.h @class Dtk::Core::DSysInfo @brief dsysinfo 是一组用于查询系统信�的��类 @details ## 概述 dsysinfo是一组用于查询系统信�的��类 项目目录结构如下: ```bash ├── CMakeLists.txt └── main.cpp ``` ## CMakeLists.txt ```cmake cmake_minimum_required(VERSION 3.13) # cmake版本�求 set (VERSION "1.0.0" CACHE STRING "define project version") # 定义项目版本 set(BIN_NAME test) # 定义项目�称 project(test) # 定义项目�称 file(GLOB_RECURSE SRCS "*.h" "*.cpp") # 定义项目�文件 find_package(Qt5 REQUIRED COMPONENTS Core) # 寻找Qt5 find_package(DtkCore REQUIRED) # 寻找DtkCore add_executable(test main.cpp # �文件 ) target_link_libraries(test PRIVATE ${DtkCore_LIBRARIES} # 链接DtkCore Qt5::Core # 链接Qt5 ) ``` ## main.cpp ```cpp #include // 引入DSysInfo #include // 引入qdebug.h DCORE_USE_NAMESPACE // 使用dtkcore命�空间 int main(int argc, char **argv) { qDebug() << DSysInfo::deepinType(); // 打�deepin类型 qDebug() << DSysInfo::ProductType(); // 打�产�类型 return 0; } ``` @enum Dtk::Core::DSysInfo::ProductType @brief 产�信� @var Dtk::Core::DSysInfo::ProductType Dtk::Core::DSysInfo::Deepin @brief 深度�作系统 @var Dtk::Core::DSysInfo::ProductType Dtk::Core::DSysInfo::ArchLinux @brief ArchLinux @var Dtk::Core::DSysInfo::ProductType Dtk::Core::DSysInfo::CentOS @brief CentOS @var Dtk::Core::DSysInfo::ProductType Dtk::Core::DSysInfo::Debian @brief Debian @var Dtk::Core::DSysInfo::ProductType Dtk::Core::DSysInfo::Fedora @brief Fedora @var Dtk::Core::DSysInfo::ProductType Dtk::Core::DSysInfo::LinuxMint @brief LinuxMint @var Dtj::Core::DSysInfo::ProductType Dtk::Core::DSysInfo::Manjaro @brief Manjaro @var Dtk::Core::DSysInfo::ProductType Dtk::Core::DSysInfo::openSUSE @brief openSUSE @var Dtk::Core::DSysInfo::ProductType Dtk::Core::DSysInfo::SailfishOS @brief SailfishOS @var Dtk::Core::DSysInfo::ProductType Dtk::Core::DSysInfo::Ubuntu @brief Ubuntu @var Dtk::Core::DSysInfo::ProductType Dtk::Core::DSysInfo::Uos @brief UOS @var Dtk::Core::DSysInfo::ProductType Dtk::Core::DSysInfo::Gentoo @brief Gentoo @var Dtk::Core::DSysInfo::ProductType Dtk::Core::DSysInfo::NixOS @brief NixOS @enum Dtk::Core::DSysInfo::DeepinType @brief 深度�作系统版本 @var Dtk::Core::DSysInfo::DeepinType Dtk::Core::DSysInfo::UnknownDeepin @brief 未知版本 @var Dtk::Core::DSysInfo::DeepinType Dtk::Core::DSysInfo::DeepinDesktop @brief 桌�版 @var Dtk::Core::DSysInfo::DeepinType Dtk::Core::DSysInfo::DeepinProfessional @brief deepin专业版, 现为uos专业版 @var Dtk::Core::DSysInfo::DeepinType Dtk::Core::DSysInfo::DeepinServer @brief deepin�务器版本, 现为uos�务器版 @var Dtk::Core::DSysInfo::DeepinType Dtk::Core::DSysInfo::DeepinPersonal @brief deepin个人版, 现为uos家庭版 @enum Dtk::Core::DSysInfo::LogoType @brief 系统的logo类型 @var Dtk::Core::DSysInfo::LogoType Dtk::Core::DSysInfo::Normal @brief 正常 @var Dtk::Core::DSysInfo::LogoType Dtk::Core::DSysInfo::Light @brief 亮色 @var Dtk::Core::DSysInfo::LogoType Dtk::Core::DSysInfo::Symbolic @brief 符� @var Dtk::Core::DSysInfo::LogoType Dtk::Core::DSysInfo::Transparent @brief 水� @enum Dtk::Core::DSysInfo::OrgType @brief 组织类型 @var Dtk::Core::DSysInfo::OrgType Dtk::Core::DSysInfo::Distribution @brief 当�版本 @var Dtk::Core::DSysInfo::OrgType Dtk::Core::DSysInfo::Distributor @brief 当��行版 @var Dtk::Core::DSysInfo::OrgType Dtk::Core::DSysInfo::Manufacturer @brief 当��行版或设备的制造商 @enum Dtk::Core::DSysInfo::UosType @brief UOS版本类型 @var Dtk::Core::DSysInfo::UosType Dtk::Core::DSysInfo::UosTypeUnknown @brief 未知版本 @var Dtk::Core::DSysInfo::UosType Dtk::Core::DSysInfo::UosDesktop @brief UOS桌�版 @var Dtk::Core::DSysInfo::UosType Dtk::Core::DSysInfo::UosServer @brief UOS�务器版 @var Dtk::Core::DSysInfo::UosType Dtk::Core::DSysInfo::UosDevice @brief UOS设备版 @var Dtk::Core::DSysInfo::UosType Dtk::Core::DSysInfo::UosTypeCount @brief 记录枚举数� @enum Dtk::Core::DSysInfo::UosEdition @brief 详细uos版本 @var Dtk::Core::DSysInfo::UosEdition Dtk::Core::DSysInfo::UosEditionUnknown @brief 未知版本 @var Dtk::Core::DSysInfo::UosEdition Dtk::Core::DSysInfo::UosProfessional @brief UOS专业版 @var Dtk::Core::DSysInfo::UosEdition Dtk::Core::DSysInfo::UosHome @brief UOS家庭版 @var Dtk::Core::DSysInfo::UosEdition Dtk::Core::DSysInfo::UosCommunity @brief 社区版 @var Dtk::Core::DSysInfo::UosEdition Dtk::Core::DSysInfo::UosMilitary @brief * @var Dtk::Core::DSysInfo::UosEdition Dtk::Core::DSysInfo::UosEnterprise @brief UOS�业版 @var Dtk::Core::DSysInfo::UosEdition Dtk::Core::DSysInfo::UosEnterpriseC @brief UOS行业版 @var Dtk::Core::DSysInfo::UosEdition Dtk::Core::DSysInfo::UosEuler @brief UOS�务器欧拉版 @var Dtk::Core::DSysInfo::UosEdition Dtk::Core::DSysInfo::UosMilitaryS @brief * @var Dtk::Core::DSysInfo::UosEdition Dtk::Core::DSysInfo::UosDeviceEdition @brief UOS专用设备版 @var Dtk::Core::DSysInfo::UosEdition Dtk::Core::DSysInfo::UosEducation @brief UOS教育版 @var Dtk::Core::DSysInfo::UosEdition Dtk::Core::DSysInfo::UosEditionCount @brief 记录枚举数� @enum Dtk::Core::DSysInfo::UosArch @brief UOS使用的架构 @var Dtk::Core::DSysInfo::UosArch Dtk::Core::DSysInfo::UosArchUnknown @brief 未知架构 @var Dtk::Core::DSysInfo::UosArch Dtk::Core::DSysInfo::UosAMD64 @brief x86_64 @var Dtk::Core::DSysInfo::UosArch Dtk::Core::DSysInfo::UosARM64 @brief arm64 @var Dtk::Core::DSysInfo::UosArch Dtk::Core::DSysInfo::UosMIPS64 @brief mips64 @var Dtk::Core::DSysInfo::UosArch Dtk::Core::DSysInfo::UosSW64 @brief sw_64 @fn static bool Dtk::Core::DSysInfo::isDeepin() //FIXME: 显示错乱 无法修� @brief 是�为 deepin 或 uos 系统 @return 0 �是 deepin 或 uos 系统 @return 1 是 deepin 或 uos 系统 @fn static bool Dtk::Core::DSysInfo::isDDE() @brief 是�使用 dde 桌�环境 @note 此方法仅在 linux 平�下�用 @fn static DeepinType Dtk::Core::DSysInfo::deepinType() @brief deepin 系统类型 @note 此方法仅在 linux 平�下�用 @fn static QString Dtk::Core::DSysInfo::deepinTypeDisplayName (const QLocale &locale=QLocale::system()) @brief 显示的 deepin �行版类型�称 @note 此方法仅在 linux 平�下�用 @fn static QString Dtk::Core::DSysInfo::deepinVersion() @brief deepin 版本 @note 此方法仅在 linux 平�下�用 @fn static QString Dtk::Core::DSysInfo::deepinCopyright() @brief deepin 开�许��议 @note 此方法仅在 linux 平�下�用 @fn static UosEdition Dtk::Core::DSysInfo::uosEditionType() @brief DSysInfo::osEditionType 版本类型 显示版本类型 专业版/个人版/社区版.. @note 根� osBuild.B && osBuild.D @note 此方法仅在 linux 平�下�用 @fn static UosArch Dtk::Core::DSysInfo::uosArch() @brief DSysInfo::osArch 架构信� @details(使用一个字节的二进制�, 从低�到高�) �0x8 sw64】�0x4 mips64】�0x2 arm64】�0x1 amd64】 @note 此处架构是从 OsBuild 获�的系统版本的 Arch 信�, 并�是指硬件的 Arch 信� @note 此方法仅在 linux 平�下�用 @fn static QString uosProductTypeName(const QLocale &locale=QLocale::system()) @brief DSysInfo::osProductTypeName 版本�称 @details ProductType[xx] 项对应的值, 如果找�到对应语言的默认使用 ProductType 的值(Desktop/Server/Device) locale 当�系统语言 @fn static QString Dtk::Core::DSysInfo::uosSystemName(const QLocale &locale=QLocale::system()) @brief SystemName[xx] 项对应的值 @details 如果找�到对应语言的默认使用 SystemName 的值 Uniontech OS locale 当�系统语言 @note 此方法仅在 linux 平�下�用 @fn static QString Dtk::Core::DSysInfo::function uosEditionName(const QLocale &locale=QLocale::system()) @brief 版本�称 EditionName[xx] 项对应的值 @details 如果找�到对应语言的默认使用 EditionName 的值(Professional/Home/Community...) locale 当�系统语言 @note 此方法仅在 linux 平�下�用 @fn static QString Dtk::Core::DSysInfo::spVersion() @brief 阶段版本�称 @details �版本� A-BC-D 中 BC� A.B.C 中的 B 返回 SP1-SPxx, 如果正�版返回空 X.Y.Z模�下暂�支�返回此版本� @note minVersion.BC == 00 正�版本, minVersion.BC | minVersion.B == 01-99 SP1….SP99 @note 此方法仅在 linux 平�下�用 @fn static QString Dtk::Core::DSysInfo::udpateVersion() @brief 更新版本�称 �版本� A-BC-D 中 D�A.B.C 模�中的 C 返回 update1… update9, 如果正�版返回空 X.Y.Z 模�下暂�支�返回此版本� @note minVersion.D == 0;正�版本 minVersion.D | minVersion.C == 1-9;update1… update9, updateA...updateZ @note 此方法仅在 linux 平�下�用 @fn static QString Dtk::Core::DSysInfo::majorVersion() @brief 主版本� 主版本� �20】�23】�25】�26】�29】�30】 @note 此方法仅在 linux 平�下�用 @fn static QString Dtk::Core::DSysInfo::minorVersion() @brief �版本� �ABCD】 ·[0-9]{4} �A.B.C】 或者�X.Y.Z】 @note 此方法仅在 linux 平�下�用 @fn static QString Dtk::Core::DSysInfo::buildVersion() @brief �版本� 系统镜�批次�, 按时间顺�(��回退)从100-999递增 @note 此方法仅在 linux 平�下�用 @fn static QString Dtk::Core::DSysInfo::distributionInfoPath () @brief 返回 distribution 文件地� 一般在`/usr/share/deepin/`目录下 @fn static QString Dtk::Core::DSysInfo::distributionInfoSectionName(OrgType type) @brief 返回 distribution.info 文件中 SectionName 字段的值 @fn static Dtk::Core::DSysInfo::distributionOrgName(OrgType type=Distribution, const QLocale &locale=QLocale::system()) @brief 返回组织�称 @details 使用类型为Distribution�获�当�deepin distribution本身的�称 @fn static QPairDtk::Core::DSysInfo::distributionOrgWebsite(OrgType type=Distribution) @brief �行版组织的网站�称和网�。使用 type 作为 Distribution 获�当� deepin �行版本身的�称。 @fn static QString Dtk::Core::DSysInfo::distributionOrgLogo(OrgType orgType=Distribution, LogoType type=Normal, const QString &fallback=QString()) @brief 获得的组织logo路径, 如果�存在, 则返回给定的其他路径 @details 使用 type 作为 Distribution 获�当� deepin �行版本身的logo。 @fn static QString Dtk::Core::DSysInfo::operatingSystemName() @brief �作系统� @fn static ProductType Dtk::Core::DSysInfo::productType() @brief 产�类型 @fn static QString Dtk::Core::DSysInfo::productVersion() @brief 产�版本 @fn static bool Dtk::Core::DSysInfo::isCommunityEdition() @brief 检查当�版本是�是社区版 开�者�以使用这�方��检查我们是�需��用或�用社区版或�业版的功能。 @details 目�的规则: 专业版��务器版�个人版(DeepinType)将被视为�业版。
Uos(ProductType)将被视为�业版。 @fn static QString Dtk::Core::DSysInfo::computerName() @brief 电脑� @fn static QString Dtk::Core::DSysInfo::cpuModelName() @brief cpu模�� @fn static qint64 Dtk::Core::DSysInfo::memoryInstalledSize() @brief 内存安装大� @fn static qint64 Dtk::Core::DSysInfo::memoryTotalSize() @brief 实际内存大� @fn static qint64 Dtk::Core::DSysInfo::systemDiskSize() @brief 系统�盘大� @fn static QDateTime Dtk::Core::DSysInfo::bootTime () @brief 系统�动时间点 @fn static QDateTime Dtk::Core::DSysInfo::shutdownTime () @brief 上一次正常关机时间点(��也会被记录在内) @fn static qint64 Dtk::Core::DSysInfo::uptime() @brief 系统�动到现在时长 @note ��`cat /proc/uptime`命令 @fn static Arch Dtk::Core::DSysInfo::arch @brief cpu架构信� @note 此处架构是从gcc编译器获�的 */ dtkcore-6.7.46/docs/global/index.zh_CN.md000066400000000000000000000025611522615770400201070ustar00rootroot00000000000000@page global global--dtk全局工具组件 # DTk global:dtk全局工具类 ## dsysinfo:dtk系统信�工具类 [dsysinfo.h 详细文档](dsysinfo_8h.html)
这里放一个最�化使用dsysinfo的例�:
cmake: ```cmake cmake_minimum_required(VERSION 3.13) # cmake版本�求 set (VERSION "1.0.0" CACHE STRING "define project version") # 定义项目版本 set(BIN_NAME test) # 定义项目�称 project(test) # 定义项目�称 file(GLOB_RECURSE SRCS "*.h" "*.cpp") # 定义项目�文件 find_package(Qt5 REQUIRED COMPONENTS Core) # 寻找Qt5 find_package(DtkCore REQUIRED) # 寻找DtkCore add_executable(test main.cpp # �文件 ) target_link_libraries(test PRIVATE ${DtkCore_LIBRARIES} # 链接DtkCore Qt5::Core # 链接Qt5 ) ``` cpp: ```cpp #include // 引入DSysInfo #include // 引入qdebug.h DCORE_USE_NAMESPACE // 使用dtkcore命�空间 int main(int argc, char **argv) { qDebug() << DSysInfo::deepinType(); // 打�deepin类型 qDebug() << DSysInfo::ProductType(); // 打�产�类型 return 0; } ``` 其余的组件使用方法类似,这里就�一一列举了 @defgroup dglobal @brief dtk设置全局工具组件 @details dtk全局工具组件,�供了设置全局工具的功能。
包�以下功能: * dsysinfo:dtk系统信�工具类 * dconfig:dtk�置文件工具类 dtkcore-6.7.46/docs/log/000077500000000000000000000000001522615770400147735ustar00rootroot00000000000000dtkcore-6.7.46/docs/log/AbstractAppender.zh_CN.dox000066400000000000000000000101211522615770400217240ustar00rootroot00000000000000/*! @~chinese @ingroup dlog @file include/log/AbstractAppender.h AbstractAppender类是所有�以与Logger一起使用的日志appender的基础接�类。 @class Dtk::Core::AbstractAppender @brief AbstractAppender为应用消�的线程安全�互斥�护的日志�供了一个通用的实现 @details AbstractAppender为应用消�的线程安全�互斥�护的日志�供了一个通用的实现,例如ConsoleAppender�FileAppender或其他的东西。
AbstractAppender是抽象的,�能被实例化,但是你�以使用它的任何一个�类,或者根�你的选择创建一个自定义的日志appender。
Appenders是逻辑设备,旨在通过调用`Logger::registerAppender()`附加到Logger对象。在�个�自应用程�的日志记录调用中,Logger对象都会�次调用所有在它身上注册的appender的`write()`函数。
你�以�类化AbstractAppender�实现你喜欢的任何类型的日志目标。它�以是外部日志�系统(例如,*nix中的syslog)�XML文件�SQL数�库�目�D-Bus消�或任何你能想到的其他东西。
对于简�的�结构化的纯文本日志(例如,到一个纯文本文件或到控制�输出),请�类化AbstractStringAppender而�是AbstractAppender,这将给你一个更方便的方法�控制日志输出的格�。 @fn AbstractAppender Dtk::Core::AbstractAppender::AbstractAppender() @brief AbstractAppender构造函数 @fn AbstractAppender Dtk::Core::AbstractAppender::~AbstractAppender() @brief AbstractAppender�构函数 @fn Logger::LogLevel Dtk::Core::AbstractAppender::detailsLevel() @brief 返回appender的当�日志级别 @details 返回appender的当�日志级别.日志级别低于当�`detailsLevel()`的日志记录将被appender默认忽略, 并且�会被��到其append()函数。 它�供了�外的日志�活性,�许你为��类型的日志设置��的记录等级 @note 该函数是线程安全的 @sa setDetailsLevel() @sa Logger::LogLevel @return 日志记录等级 @fn void Dtk::Core::AbstractAppender::setDetailsLevel(Logger::LogLevel level) @brief 设置当�appender的记录级别,默认记录级别为Logger::Debug @note 该函数是线程安全的 @sa setDetailsLevel() @sa Logger::LogLevel @fn void Dtk::Core::AbstractAppender::setDetailsLevel(const QString &level) @brief 设置当�appender的记录级别,这个函数是为了简化输入而�供的,它的行为与��函数类似。 @sa AbstractAppender::setDetailsLevel(Logger::LogLevel level) @sa setDetailsLevel() @sa Logger::LogLevel @fn void Dtk::Core::AbstractAppender::write(const QDateTime &time, Logger::LogLevel level, const char *file, int line, const char *func, const QString &category, const QString &msg) @brief �试写入日志,这是由Logger对象调用的函数,用于�appender写入日志信� @param[in] time 时间戳 @param[in] level 日志记录等级 @param[in] file 目标文件� @param[in] line �输出的行数 @param[in] func 输出的函数�称 @param[in] category 日志类别 @param[in] msg 输出信� @note 该函数是线程安全的 @sa Logger::write() @sa detailsLevel() @fn void Dtk::Core::AbstractAppender::AbstractAppender::append(const QDateTime &timeStamp, Logger::LogLevel level, const char *file, int line, const char *function, const QString &category, const QString &message) = 0 @brief 将日志记录写到logger实例中 @details �次当用户试图使用`write()`函数�这个AbstractAppender实例写入消�时,都会调用这个函数。`write()`函数作为代�工作,�输出日志级别大于或等于当�`logLevel()`的消� @note 当你实现一个自定义的appender时,需��载这个函数。 @note 该函数�需�是线程安全的,因为它�会被Logger对象直接调用。`write()`函数作为代�,�护该函数�被并�调用。 @param[in] timeStamp 时间戳 @param[in] level 日志记录等级 @param[in] file 目标文件� @param[in] line �输出的行数 @param[in] function 输出的函数�称 @param[in] category 日志类别 @param[in] message 输出信� */ dtkcore-6.7.46/docs/log/AbstractStringAppender.zh_CN.dox000066400000000000000000000130661522615770400231260ustar00rootroot00000000000000/*! @~chinese @ingroup dlog @file include/log/AbstractStringAppender.h @class Dtk::Core::AbstractStringAppender @brief AbstractStringAppender类为处�纯文本格�的Appender�供了一个方便的基础日志 @details AbstractStringAppender是AbstractAppender类的简�扩展, 它�供了一�方便的方��创建自定义日志应用程�, 该程�使用纯文本格�的日志. 它有`formattedString()`�护类型(��直接被调用)函数, �以根�`setFormat()`设置的格��格�化日志�数。 @note 这个类�能直接实例化, 因为它包�从AbstractAppender类继承的纯虚函数。 @brief 关于自定义日志输出格�的更详细�述, 请��setFormat()函数的文档 @sa AbstractStringAppender::setFormat() @fn AbstractStringAppender Dtk::Core::AbstractStringAppender::AbstractStringAppender() @brief 构建一个新的字符串appender对象 @fn QString Dtk::Core::AbstractStringAppender::format() @brief 返回当�使用的format字符串 @details 默认记录格�为:`"%{time}{yyyy-MM-ddTHH:mm:ss.zzz} [%{type:-7}] <%{function}> %{message}\n"` 你�以使用setFormat()函数�设置��的日志记录格�。 @sa AbstractStringAppender::setFormat() @return 返回当�使用的format字符串 @fn void Dtk::Core::AbstractStringAppender::setFormat(const QString &format) @brief 设置日志格�, 以便用这个appender�日志目标写入字符串。 @details 对于那些使用过标准sprintf函数的开�者�说, 字符串格��常常�。 日志输出格�是一个简�的QString, 带有特殊的标记(以%符�开始), 在写日志记录时将被替��它的内部�义。 控制标记以百分�(%)开始, ��是{}括�内的命令(该命令�述了将被放入日志记录而�是标记的内容)。 �选的字段宽度�数�以在命令�直接指定(通过括�内的冒�), 有些命令需�一个�外的格�化�数(在第二个{}括�内) 字段宽度�数的工作原�与`QString::arg()`fieldWidth�数几乎相�(并在内部使用它), 例如, "%{type:-7}"将被替�为消�的左边填充的调试级别("Debug")或其他东西。更详细的�述请�考Qt文档。 @details 支�的标记: | **标记** | **�义** | **备注** | |:-----------:|:-----------------------------------------------------:|:-------------------------------------------------------------------:| | %{time} | 时间戳。你�以使用标记�的第二个{}括��指定你的自定义时间戳格�。默认格�:"HH:mm:ss.zzz" | "%{time}{dd-MM-yyyy, HH:mm}"�能被替�为 "20-9-2022, 21:24", 这�决于当�的日期和时间。 | | %{type} | 日志级别。�能的日志级别在Logger::LogLevel枚举中显示。 | | | %{Type} | 大写的日志级别 | | | %{typeOne} | 一个字�的日志级别 | | | %{TypeOne} | 一个大写字�的日志级别 | | | %{File} | 记录日志的文件的完整�文件�(�路径), 使用 `__FILE__`预处�程�� | | | %{file} | 简短的文件�(去除路径�的文件�) | | | %{line} | �文件中的行数。使用`__LINE__`预处�程��。 | | | %{Function} | 调用`LOG_*`�的函数的�称。使用Qt�供的`Q_FUNC_INFO`�。 | | | %{function} | 类似于%{Function}, 但使用 stripFunctionName 剥离了函数�。 | | | %{message} | 日志内容 | | | %{category} | 日志类别 | | | %{appname} | 应用程��称(由`QCoreApplication::applicationName()`函数返回) | | | %{pid} | 应用程�的pid(由`QCoreApplication::applicationPid()`函数返回) | | | %{threadid} | 线程ID | | | %% | 转译为�`%`标记 | | @fn static QString Dtk::Core::AbstractStringAppender::stripFunctionName(const char *name) @brief 剥离长函数签�(由Q_FUNC_INFO�添加) @details 字符串处�掉了函数的返回类型��数和模��数, 这对于�高日志输出的�读性是�常有用的 @param[in] name 函数�称 @return 剥离的函数�称 */ dtkcore-6.7.46/docs/log/ConsoleAppender.zh_CN.dox000066400000000000000000000023571522615770400215770ustar00rootroot00000000000000/*! @~chinese @ingroup dlog @file include/log/ConsoleAppender.h @class Dtk::Core::ConsoleAppender @brief ConsoleAppender是简�的控制�appender,将日志记录写入`std::cerr`输出�
@details ConsoleAppender使用`[%{type:-7}] <%{function}> %{message}\n`作为默认输出格�。它类似于AbstractStringAppender,但�显示时间
你�以通过使用`QT_MESSAGE_PATTERN`环境���修改ConsoleAppender的输出格�,而�用修改你的代�。 ��。如果你需�你的应用程�忽略这个环境��,你�以调用`ConsoleAppender::ignoreEnvironmentPattern(true)` @fn ConsoleAppender Dtk::Core::ConsoleAppender::ConsoleAppender() @brief 构造函数,设置默认的日志格�为`[%{type:-7}] <%{function}> %{message}\n` @fn virtual QString Dtk::Core::ConsoleAppender::format() @brief 返回当�默认输出格�,�以调用父类的`setFormat()`�更改日志输出格� @sa AbstractStringAppender::setFormat() @fn void Dtk::Core::ConsoleAppender::ignoreEnvironmentPattern(bool ignore) @brief 设置应用程�忽略环境���修改ConsoleAppender的输出格�,使用默认输出格� @sa [QT_MESSAGE_PATTERN](https://doc.qt.io/qt-5/debug.html#warning-and-debugging-messages) */ dtkcore-6.7.46/docs/log/FileAppender.zh_CN.dox000066400000000000000000000016331522615770400210500ustar00rootroot00000000000000/*! @~chinese @ingroup dlog @file include/log/FileAppender.h @class Dtk::Core::FileAppender @brief 简�的文件appender,将日志记录写到纯文本文件中 @fn FileAppender Dtk::Core::FileAppender::FileAppender(const QString &fileName = QString()) @brief 构造函数,指定日志记录文件的文件�。 @fn QString Dtk::Core::FileAppender::fileName() const @brief 返回由setFileName()设置的�称,或返回FileAppender构造函数传入的fileName @sa FileAppender::setFileName() @fn void Dtk::Core::FileAppender::setFileName(const QString &s) @brief 设置文件的�称。该�称�以没有路径,�以是相对路径,也�以是�对路径 @sa FileAppender::fileName() @fn qint64 Dtk::Core::FileAppender::size() @brief 返回日志文件大� @fn bool FileAppender::openFile() @brief 打开日志记录文件 @fn void FileAppender::closeFile() @brief 关闭日志记录文件 */ dtkcore-6.7.46/docs/log/Logger.zh_CN.dox000066400000000000000000000226731522615770400177400ustar00rootroot00000000000000/*! @~chinese @ingroup dlog @file include/log/Logger.h @class Dtk::Core::Logger Logger.h @brief �常简�但相当强大的组件,�用于记录你的应用程�活动。 @enum Dtk::Core::Logger::LogLevel @brief 日志等级 @var Dtk::Core::Logger::LogLevel Dtk::Core::Logger::Trace 追踪级别,�用于大部分�需�的记录,用于内部代�追踪 @var Dtk::Core::Logger::LogLevel Dtk::Core::Logger::Debug 调试级别,用于软件的调试。 @var Dtk::Core::Logger::LogLevel Dtk::Core::Logger::Info 信�级别,�用于信�记录,这�能�仅对开�者有�义 @var Dtk::Core::Logger::LogLevel Dtk::Core::Logger::Warning 警告,�以用�记录你的应用程�检测到的一些�致命的警告 @var Dtk::Core::Logger::LogLevel Dtk::Core::Logger::Error 错误,�能是一个较大问题,导致你的程�工作出错,但�至于崩溃 @var Dtk::Core::Logger::LogLevel Dtk::Core::Logger::Fatal 致命错误,用于����的错误,在写入日志记录�立�崩溃应用程�(终止) @fn Logger Dtk::Core::Logger::Logger() @brief 构建Logger的实例。 @note 如果你�使用一个全局的logger实例,�需�手动使用这个构造函数,�以考虑使用logger��代替访问记录器实例 @fn Logger Dtk::Core::Logger::Logger(const QString &defaultCategory) @brief 构建Logger的实例并设置Logger的默认类别 @note 如果你�使用一个全局的logger实例,�需�手动使用这个构造函数, �以考虑使用logger��访问logger实例并调用setDefaultCategory方法 @sa Logger::Logger() @sa Logger::setDefaultCategory() @fn Logger Dtk::Core::Logger::~Logger() @brief �构函数 @note 你�能�需�直接使用这个函数。记录器的全局实例将在你的QCoreApplication执行结��自动销� @fn static Logger* Dtk::Core::Logger::globalInstance() @brief 返回Logger的全局对象 @note 在大多数情况下,你�应该直接使用这个函数。�以考虑使用 [logger](@ref logger) ��代替 @return Logger指针 @fn static QString Dtk::Core::Logger::levelToString(Logger::LogLevel level) @brief 将LogLevel枚举值转�为其字符串表示 @sa Logger::LogLevel @fn static LogLevel Dtk::Core::Logger::levelFromString(const QString &str) @brief 将LogLevel字符串表示转�为枚举值 @note 字符串的比较是�分大�写的。如果�供的日志级别字符串��法,则返回`Logger::Debug`的枚举值 @sa Logger::LogLevel @sa Logger::levelToString() @fn void Dtk::Core::Logger::registerAppender(AbstractAppender *appender) @brief 注册appender�写入日志记录
在写入日志的调用中(使用其中一个�或`write()`函数),Logger�历appender列表,并��个appender写入日志记录。请查阅AbstractAppender文档以了解appenders的概念。 如果没有appender被添加到Logger中,它就会退回到记录到`std::cerr`�中。 @param[in] appender �在Logger中注册的Appender @note Logger对appender拥有所有�,它将在应用程�退出时删除它。因此,appender必须在堆上创建,以防止appender被��销�。 @sa Logger::registerCategoryAppender() @sa Dtk::Core::AbstractAppender @fn void Dtk::Core::Logger::registerCategoryAppender(const QString &category, AbstractAppender *appender) @brief 注册appender,将日志记录写到特定的类别中
@details 调用这个方法,你�以将一些appender与命�的类别�系起�。 在调用特定类别的日志写入时(直接调用带有类别�数的`write()`,写入默认类别,或使用特殊的`dCDebug()`�`dCWarning()`等�), Logger�将日志信�写入注册的类别appender列表中。
你�以调用`logToGlobalInstance()`将所有类别的日志信�传递给全局的Logger实例Appender(使用`registerAppender()`注册)。 如果没有特定�称的类别应用程�被注册到记录器上,它就会退回到记录到`std::cerr` STL�中,这两�方法都有简�的警告信�。 @param[in] category 类别�称 @param[in] appender �在Logger中注册的Appender @note Logger对appender拥有所有�,它将在应用程�退出时删除它。根�这一点,appender必须在堆上创建,以防止appender被��销�。 @sa Logger::registerAppender() @sa Logger::logToGlobalInstance() @sa Logger::setDefaultCategory() @fn void Dtk::Core::Logger::logToGlobalInstance(const QString &category, bool logToGlobal = false) @brief 将一些日志类别与全局日志实例应用者�系起�。 如果logToGlobal设置为 "true",所有到指定类别的Logger的日志消�也将被写入全局日志实例appenders(使用`registerAppender()`注册)
默认情况下,所有到特定类别的消�都�写到特定的类别应用者 (使用 `registerCategoryAppender()` 注册) @param[in] category 类别�称 @param[in] logToGlobal 是�将日志写入全局日志appenders @sa Logger::registerAppender() @sa Logger::globalInstance() @sa Logger::registerCategoryAppender() @fn void Dtk::Core::Logger::setDefaultCategory(const QString &category); QString defaultCategory() @brief 设置默认的日志类别 所有到这个类别应用的日志信�也将被写入一般的日志实例应用(使用[registerAppender](@ref registerAppender)方法注册),�之亦然 特别是,任何对dDebug()�的调用都将被视为类别日志 所以你�需�用dCDebug()��指定类别�称 ��消默认的类别,传递一个空字符串作为�数 @param[in] category 类别�称 @note "category "格�标记将被设置为所有这些消�的类别�称 @sa Dtk::Core::AbstractStringAppender::setFormat() @sa Logger::defaultCategory() @sa Logger::registerCategoryAppender() @sa Logger::logToGlobalInstance() @fn QString Dtk::Core::Logger::defaultCategory() @brief 返回默认的日志类别�称 @sa Logger::setDefaultCategory() @fn void Dtk::Core::Logger::write(const QDateTime &time, LogLevel level, const char *file, int line,const char *func, const char *category, const QString &msg) @brief 写入日志记录。 将带有所�供�数的日志记录写给所有注册的应用 @param[in] time 时间戳 @param[in] level 日志记录等级 @param[in] file 目标文件� @param[in] line �输出的行数 @param[in] func 输出的函数�称 @param[in] category 日志类别 @param[in] msg 输出信� @note 使用`Logger::Fatal`日志级别记录日志记录将导致调用STL `abort()`函数, 这将中断你的软件的�行并Core dump @sa Logger::LogLevel @sa Dtk::Core::AbstractAppender @fn void Dtk::Core::Logger::write(LogLevel level, const char *file, int line, const char *func, const char *category, const QString &msg) @brief 这是为方便而�供的�载函数。它的行为与��函数类似,此函数无需传入time�数 @note 这个函数使用了`QDateTime::currentDateTime()`用获得的当�时间戳 @sa Logger::write(const QDateTime &time, LogLevel level, const char *file, int line,const char *func, const char *category, const QString &msg) @param[in] level 日志记录等级 @param[in] file 目标文件� @param[in] line �输出的行数 @param[in] func 输出的函数�称 @param[in] category 日志类别 @param[in] msg 输出信� @fn QDebug Dtk::Core::Logger::write(LogLevel level, const char *file, int line,const char *func, const char *category) @brief 这是为方便而�供的�载函数。它的行为与��函数类似,此函数无需传入message�数 @details 这个函数�接�任何日志信�作为�数。它返回的是�以使用�函数写入的`QDebug`对象
例如,你�能想写: @code dDebug() << "This is the size" << size << "of the element" << elementName; @endcode 而�是写为: @code dDebug(QString(QLatin1String("This is the size %1x%2 of the element %3")).arg(size.x()).arg(size.y()).arg(elementName)); @endcode 这样会更优雅一些
请考虑阅读Qt�考文档,了解QDebug类的使用语法 @note 这个�载肯定是最好用的一个�载,但是代价是它会比其他的�载更为慢 @sa Logger::write(const QDateTime &time, LogLevel level, const char *file, int line,const char *func, const char *category, const QString &msg) @param[in] level 日志记录等级 @param[in] file 目标文件� @param[in] line �输出的行数 @param[in] func 输出的函数�称 @param[in] category 日志类别 @fn void Dtk::Core::Logger:: writeAssert(const char *file, int line, const char *func, const char *condition) @brief 写入断言 @details 这个函数使用write()函数�写断言记录
断言记录总是使用`Logger::Fatal`日志级别�写,这将导致程�的中止和核心转储(core dump)的生�(如果支�) 写入appenders的信�与传入�数相�,�缀为 `ASSERT:` @param[in] file 目标文件� @param[in] line �输出的行数 @param[in] func 输出的函数�称 @note �建议直接调用这个函数,你�以直接调用`LOG_ASSERT`�,它将为这个函数�供所有需�的信� @sa Logger::write(const QDateTime &time, LogLevel level, const char *file, int line,const char *func, const char *category, const QString &msg) */ dtkcore-6.7.46/docs/log/RollingFileAppender.zh_CN.dox000066400000000000000000000063061522615770400224010ustar00rootroot00000000000000/*! @~chinese @ingroup dlog @file include/log/RollingFileAppender.h @class Dtk::Core::RollingFileAppender @brief RollingFileAppender类扩展了FileAppender,使日志文件在按照用户指定的频率进行滚动 @details 该类是基于`Log4Qt.DailyRollingFileAppender`类[Log4Qt](http://log4qt.sourceforge.net/) 并具有相�的日期模�格�
例如,如果fileName设置为`/foo/bar`,DatePattern设置为�日滚动('.yyy-MM-dd'.log'),在2022-05-28的�夜。 日志文件`/foo/bar.log`将被�制到`/foo/bar.2022-05-28.log`,2022-05-29的日志将在`/foo/bar`中继续,直到第二天滚动
logFilesLimitå�‚数用于在滚动期间自动删除目录中最旧的日志文件。 (所以在任何时候,目录中都ä¸�会有超过logFilesLimit的最新日志文件存在) @enum Dtk::Core::RollingFileAppender::DatePattern @brief 日志频率 @var Dtk::Core::RollingFileAppender::DatePattern Dtk::Core::RollingFileAppender::MinutelyRollover @brief æ¯�分钟的日期模å¼�字符串是`.yyyy-MM-dd-hh-mm` @var Dtk::Core::RollingFileAppender::DatePattern Dtk::Core::RollingFileAppender::HourlyRollover @brief æ¯�å°�时的日期模å¼�字符串是 `.yyyy-MM-dd-hh` @var Dtk::Core::RollingFileAppender::DatePattern Dtk::Core::RollingFileAppender::HalfDailyRollover @brief æ¯�å�Šå¤©çš„æ—¥æœŸæ¨¡å¼�字符串是`.yyyy-MM-dd-a` @var Dtk::Core::RollingFileAppender::DatePattern Dtk::Core::RollingFileAppender::DailyRollover @brief æ¯�天的日期模å¼�字符串是`.yyyy-MM-dd` @var Dtk::Core::RollingFileAppender::DatePattern Dtk::Core::RollingFileAppender::WeeklyRollover @brief æ¯�周的日期模å¼�字符串是`.'yyyy-ww` @var Dtk::Core::RollingFileAppender::DatePattern Dtk::Core::RollingFileAppender::MonthlyRollover @brief æ¯�月的日期模å¼�字符串是`.yyyy-MM` @fn RollingFileAppender Dtk::Core::RollingFileAppender::RollingFileAppender() @brief 构造函数,默认é™�制日志文件个数是0,默认日志文件大å°�是1024*1024*20=20m @fn DatePattern Dtk::Core::RollingFileAppender::datePattern() @brief 返回当å‰�的滚动更新频率 @sa RollingFileAppender::DatePattern @fn void Dtk::Core::RollingFileAppender::setDatePattern(DatePattern datePattern) @brief 设置日志滚动频率 @sa RollingFileAppender::DatePattern @fn void Dtk::Core::RollingFileAppender::setDatePattern(const QString &datePattern) @brief æ­¤é‡�载是为了方便使用,å�¯ä»¥ä¼ å…¥ä¸€ä¸ªæ»šåŠ¨é¢‘çŽ‡å­—ç¬¦ä¸² @sa RollingFileAppender::DatePattern @sa RollingFileAppender::setDatePattern(DatePattern datePattern) @fn QString Dtk::Core::RollingFileAppender::datePatternString() @brief 以字符串形å¼�,返回当å‰�滚动频率 @fn void Dtk::Core::RollingFileAppender::setLogFilesLimit(int limit) @brief 设置日志文件数é‡�上é™�,最旧的文件会被滚动覆盖 @fn int Dtk::Core::RollingFileAppender::logFilesLimit() @brief 返回设置的日志文件数é‡�上é™� @sa RollingFileAppender::setLogFilesLimit() @fn int Dtk::Core::RollingFileAppender::setLogSizeLimit(int qint64) @brief 设置日志文件å�•个文件大å°�上é™� @fn qint64 Dtk::Core::RollingFileAppender::logSizeLimit() @brief 返回设置的日志文件å�•个文件大å°�上é™� @sa RollingFileAppender::setLogSizeLimit(int qint64) */ dtkcore-6.7.46/docs/log/dlogmanager.zh_CN.dox000066400000000000000000000046371522615770400210010ustar00rootroot00000000000000/*! @~chinese @ingroup dlog @file include/log/LogManager.h @class Dtk::Core::DLogManager @brief DLogManager是dtk日志管ç�†ç±»,æ��供对日志的基础设置 @details 使用此类å�¯ä»¥å¾ˆæ–¹ä¾¿çš„为自己的dtk程åº�加上日志,一般情况下应用如果需è¦�写入日志å�ªéœ€è¦�调用此类 调用相应的注册方法设置存储路径相关信æ�¯å�³å�¯ @fn static void Dtk::Core::DLogManager::registerConsoleAppender() @brief 注册默认的控制å�°è®°å½•器 @fn static void Dtk::Core::DLogManager::registerFileAppender() @brief 注册默认的文件记录器,默认的文件记录器类型为RollingFileAppender. @note 输出日志默认文件ä½�置为`~/.cache//.log`如果获å�– $HOME 环境å�˜é‡�失败将ä¸�写日志. 如果在创建程åº�的时候没有指定这两个name,如果未设置organizationName,则是 `~/.cache//.log` 如果applicationName没有设置, 会fallback到进程二进制文件å�� @sa DLogManager::setlogFilePath() @fn static void Dtk::Core::DLogManager::registerJournaldAppender() @brief 注册默认的journald记录器 @note 此方法å�ªåœ¨linux下有效 @detials 默认输出文件ä½�置为`/var/log/journal/.journal`,å‰�æ��是此目录存在且有写æ�ƒé™�, 如果目录ä¸�存在,systemdå°†ä¸�会自动创建此目录,并将日志写入到`/run/log/journal/.journal`中,此目录ä¸�支æŒ�æŒ�久化存储, 将在下次é‡�å�¯å�Žä¸¢å¤±ã€‚ @note 查看日志å�¯ç”¨`journalctl`命令,查看详细信æ�¯å�¯ç”¨`journalctl -o verbose`命令,也å�¯ä»¥ä½¿ç”¨deepin 日志查看器查看 @fn static QString Dtk::Core::DLogManager::getlogFilePath() @brief 获å�–当å‰�的日志存储路径,包括文件å�� @fn static void Dtk::Core::DLogManager::setlogFilePath(const QString &logFilePath) @brief 设置log文件路径。如果文件存在且ä¸�是log文件类型(比如文件夹)会导致设置无效并输出一æ�¡è­¦å‘Šã€‚ @note 注æ„�,此文件路径为包括具体文件å��çš„ç»�对路径。需è¦�此文件ä¸�存在或者存在且为有效类型(xxx.log),一般情况下无需手动指定路径。 @fn static void Dtk::Core::DLogManager::setLogFormat(const QString &format) @brief 设置日志的格å¼�,如果没有设置格å¼� @details 默认的格å¼�为:`"%{time}{yyyy-MM-dd, HH:mm:ss.zzz} [%{type:-7}] [%{file:-20} %{function:-35} %{line}] %{message}\n"` @sa Dtk::Core::AbstractStringAppender::format() */ dtkcore-6.7.46/docs/log/index.zh_CN.md000066400000000000000000000110421522615770400174220ustar00rootroot00000000000000@page DLog dlog--DTK日志组件 # Dlog:DTK日志组件 ## 简介 DTK日志组件,æ��供了日志的输出ã€�日志级别的设置ã€�日志文件的设置等功能。为了简化日志的使用,我们æ��供了两ç§�使用方å¼�,一ç§�是使用å®�,å�¦ä¸€ç§�是使用类。 但是更为建议使用å®�的方å¼�进行使用。因为使用å®�å�¯ä»¥è¾“出更多的信æ�¯ï¼Œæ¯”如文件å��ã€�函数å��ã€�行å�·ç­‰ã€‚ ## 使用 ### å®� DTK日志组件æ��供了一系列的å®�,用于输出日志。这些å®�的定义在dloggerdefs.h中 如果需è¦�使用å®�,则需è¦�在你的代ç �中包å�«`DLog`文件。 @note DTK更推è��使用CPP标准引入头文件的方å¼�,å�³ä½¿ç”¨`#include `的方å¼�引入头文件,而ä¸�是使用`#include "xxxxx.h"`的方å¼�引入头文件。 示例代ç �如下: ```cpp #include #include DCORE_USE_NAMESPACE int main(int argc, char **argv) { QCoreApplication app(argc, argv); #ifdef Q_OS_LINUX DLogManager::registerJournalAppender(); #endif DLogManager::registerConsoleAppender(); dDebug() << "this is a debug message"; return app.exec(); } ``` 上述代ç �中,我们使用了dDebug()å®�,用于输出一æ�¡debug级别的日志。在输出日志时,我们å�¯ä»¥ä½¿ç”¨`<<`è¿�算符,将多个å�˜é‡�输出到日志中。 注æ„�,registerJournalAppender()仅在Linuxå¹³å�°ä¸‹æœ‰æ•ˆï¼Œå› ä¸ºjournal仅在Linuxå¹³å�°ä¸‹æœ‰æ•ˆã€‚而registerConsoleAppender()则是在所有平å�°ä¸‹éƒ½æœ‰æ•ˆã€‚ ### ç±» 使用类的方å¼�需è¦�先创建一个logger对象,然å�Žä½¿ç”¨logger对象的方法æ�¥è¾“出日志,具体请å�‚è§�logger文档 ## 注æ„�事项 ### 日志级别 DTK使用的日志级别与Qt的日志级别一致,分别为:Traceã€�Debugã€�Infoã€�Warningã€�Errorã€�Fatal。其中Trace是最低级别,Fatal是最高级别。 与之ä¸�å�Œçš„æ˜¯journal的日志级别和DTK的日志级别ä¸�一致,journal的日志级别分别为:emergencyã€�alertã€�criticalã€�errorã€�warningã€�noticeã€�infoã€�debug。 这是因为journal的日志级别是从syslog中继承过æ�¥çš„,而syslog的日志级别是从BSDçš„syslog中继承过æ�¥çš„。而DTK的日志级别是从Qt的日志级别中继承过æ�¥çš„。 下表是DTK日志级别和journal日志级别的对应关系 | DTK值 | åº�å�· | å�«ä¹‰ | syslog值 | syslogåº�å�· | |---------|----|-------------------------------------|-------------|----------| | dTrace | 0 | 追踪级别,å�¯ç”¨äºŽå¤§éƒ¨åˆ†ä¸�需è¦�的记录,用于内部代ç �追踪 | æ—  | | | dDebug | 1 | 调试级别,用于软件的调试。 | LOG_DEBUG | 7 | | dInfo | 2 | ä¿¡æ�¯çº§åˆ«,å�¯ç”¨äºŽä¿¡æ�¯è®°å½•,è¿™å�¯èƒ½ä¸�仅对开å�‘者有æ„�义 | LOG_INFO | 6 | | dWarning | 3 | 警告,å�¯ä»¥ç”¨æ�¥è®°å½•你的应用程åº�检测到的一些é�žè‡´å‘½çš„警告 | LOG_WARNING | 4 | | dError | 4 | 错误,å�¯èƒ½æ˜¯ä¸€ä¸ªè¾ƒå¤§é—®é¢˜,导致你的程åº�工作出错,但ä¸�至于崩溃 | LOG_ERR | 3 | | dFatal | 5 | 致命错误,用于ä¸�å�¯æ�¢å¤�的错误,在写入日志记录å�Žç«‹å�³å´©æºƒåº”用程åº�(终止) | LOG_EMERG | 0 | | | | | LOG_ALERT | 1 | | | | | LOG_CRIT | 2 | | | | | LOG_NOTICE | 6 | ### 日志文件 如果你选择使用journal作为日志输出,那么你需è¦�在系统中安装systemd(一般的linuxå�‘行版都会自带systemd)。并且需è¦�ç¡®ä¿�`/var/log/journal/` 目录的存在,å�¦åˆ™journal会将日志写入到`/run/log/journal/`目录中。 如果你选择使用控制å�°ä½œä¸ºæ—¥å¿—输出,那么ä¸�会生æˆ�日志文件。 如果你选择使用文件作为日志输出,那么你需è¦�ç¡®ä¿�你的日志文件所在的目录存在,å�¦åˆ™ä¼šå¯¼è‡´æ—¥å¿—文件无法创建。 ### 日志格å¼� 如果你选择使用journal作为日志输出,且使用å®�的方å¼�进行日志输出,那么日志的格å¼�为: `[æ—¶é—´] [进程ID] [线程ID] [日志级别] [文件å��:行å�·] [函数å��] [日志内容]`,你仅需è¦�关注日志内容å�³å�¯ã€‚其他的信æ�¯éƒ½æ˜¯journal自动添加的。 @defgroup dlog @brief DTK日志组件 @details DTK日志组件,æ��供了日志的输出ã€�日志级别的设置ã€�日志文件的设置等功能。 对于DTK日志组件,我们æ��供了两ç§�使用方å¼�,一ç§�是使用å®�,å�¦ä¸€ç§�是使用类。 但是更为建议使用å®�的方å¼�进行使用 dtkcore-6.7.46/docs/settings/000077500000000000000000000000001522615770400160525ustar00rootroot00000000000000dtkcore-6.7.46/docs/settings/backend/000077500000000000000000000000001522615770400174415ustar00rootroot00000000000000dtkcore-6.7.46/docs/settings/backend/dsettingsdconfigbackend.zh_CN.dox000066400000000000000000000021321522615770400260210ustar00rootroot00000000000000/*! @~chinese @file include/settings/backend/dsettingsdconfigbackend.h @ingroup dsettings @class Dtk::Core::DSettingsDConfigBackend dsettingsdconfigbackend.h @brief é…�置存储到DConfig @fn Dtk::Core::DSettingsDConfigBackend::DSettingsDConfigBackend(const QString &name, const QString &subpath = QString(), QObject *parent = nullptr) @brief DSettingsDConfigBackend构造函数,使用DConfig为é…�置文件å��,ä¿�存数æ�®åˆ°é…�置文件。 @param[in] name é…�置文件å�� @param[in] subpath é…�置文件å��çš„å­�目录 @param[in] parent 父对象 @fn virtual QStringList Dtk::Core::DSettingsDConfigBackend::keys() const @brief 返回Dconfig的全部键值 @return @fn virtual QVariant Dtk::Core::DSettingsDConfigBackend::getOption(const QString &key) const @brief 从DConfig获å�–键值 @param[in] key @return @fn virtual void QVariant Dtk::Core::DSettingsDConfigBackend::doSetOption(const QString &key, const QVariant &value) @brief ç»™DConfig设置键值 @param[in] key @param[in] value @fn virtual void Dtk::Core::DSettingsDConfigBackend::doSync() @brief 触å�‘DSettings将选项值ä¿�存到DConfig */dtkcore-6.7.46/docs/settings/backend/gsettingsbackend.zh_CN.dox000066400000000000000000000017441522615770400245020ustar00rootroot00000000000000/*! @~chinese @file include/settings/backend/gsettingsbackend.h @ingroup dsettings @class Dtk::Core::GSettingsBackend gsettingsbackend.h @brief DSettings的存储å�Žç«¯ä½¿ç”¨gsettings @details ä½ å�¯ä»¥ä»Žlibdtkcore-bin中找到此工具, 使用/usr/lib/x86_64-linux-gnu/libdtk-/DCore/bin/dtk-settings -h 获å�–帮助 @fn Dtk::Core::GSettingsBackend::GSettingsBackend(DSettings *settings, QObject *parent = nullptr) @brief GSettingsBackend构造函数 @fn virtual QStringList Dtk::Core::GSettingsBackend::keys() const @brief gsettings的全部键值 @return 返回gsettings的全部键值 @fn virtual QVariant Dtk::Core::GSettingsBackend::getOption(const QString &key) const @brief æ ¹æ�®`key`获å�–值 @return 返回键对应的值 @fn virtual void Dtk::Core::GSettingsBackend::doSetOption(const QString &key, const QVariant &value) @brief 设置`key`对应的值 @fn virtual void Dtk::Core::GSettingsBackend::doSync() @brief 触å�‘DSettings将选项å�Œæ­¥åˆ°å­˜å‚¨ */dtkcore-6.7.46/docs/settings/backend/qsettingbackend.zh_CN.dox000066400000000000000000000020341522615770400243220ustar00rootroot00000000000000/*! @~chinese @file include/settings/backend/qsettingbackend.h @ingroup dsettings @class Dtk::Core::QSettingBackend qsettingbackend.h @brief 存储DSettings到QSettings @fn Dtk::Core::QSettingBackend::QSettingBackend(const QString &filepath, QObject *parent = 0) @brief QSettingBackend构造函数,使用QSettings::NativeFormat将数æ�®ä¿�存到指定路径。 @param[in] filepath 存储数æ�®çš„路径 @param[in] parent 父对象 @fn virtual QStringList Dtk::Core::QSettingBackend::keys() const @brief QSettings的全部键值 @return 返回QSettings的全部键值 @fn virtual QVariant Dtk::Core::QSettingBackend::getOption(const QString &key) const @brief æ ¹æ�®`key`获å�–值 @param[in] key é…�置项å��ç§° @return 返回键对应的值 @fn virtual void Dtk::Core::QSettingBackend::doSetOption(const QString &key, const QVariant &value) @brief 设置`key`对应的值 @param[in] key é…�置项å��ç§° @param[in] value 需è¦�设置的值 @fn virtual void Dtk::Core::QSettingBackend::doSync() @brief 触å�‘DSettings选项值ä¿�存到QSettings */dtkcore-6.7.46/docs/settings/dsettings.zh_CN.dox000066400000000000000000000170361522615770400216010ustar00rootroot00000000000000/*! @~chinese @file include/settings/dsettings.h @ingroup dsettings @class Dtk::Core::DSettingsBackend dsettings.h @brief DSettingsBackend是一个é…�置存储类的接å�£ @details 简å�•的例å­�: @code { "groups": [{ "key": "base", "name": "Basic settings", "groups": [{ "key": "open_action", "name": "Open Action", "options": [{ "key": "alway_open_on_new", "type": "checkbox", "text": "Always Open On New Windows", "default": true }, { "key": "open_file_action", "name": "Open File:", "type": "combobox", "default": "" } ] }, { "key": "new_tab_windows", "name": "New Tab & Window", "options": [{ "key": "new_window_path", "name": "New Window Open:", "type": "combobox", "default": "" }, { "key": "new_tab_path", "name": "New Tab Open:", "type": "combobox", "default": "" } ] } ] }] } @endcode 读å�–/设置其值的示例如下: @code // åˆ�始化一个存储å�Žç«¯ QTemporaryFile tmpFile; tmpFile.open(); auto backend = new Dtk::Core::QSettingBackend(tmpFile.fileName()); // 从json中åˆ�始化é…�ç½® auto settings = Dtk::Core::DSettings::fromJsonFile(":/resources/data/dfm-settings.json"); settings->setBackend(backend); // 读å�–é…�ç½® auto opt = settings->option("base.new_tab_windows.new_window_path"); qDebug() << opt->value(); // 修改é…�ç½® opt->setValue("Test") qDebug() << opt->value(); @endcode @sa Dtk::Core::DSettingsOption @sa Dtk::Core::DSettingsGroup @sa Dtk::Core::DSettingsBackend @sa Dtk::Widget::DSettingsWidgetFactory @sa Dtk::Widget::DSettingsDialog @fn Dtk::Core::DSettingsBackend::DSettingsBackend(QObject *parent = Q_NULLPTR) @brief DSettingsBackend构造函数 @fn virtual QStringList DSettingsBackend::keys() const = 0; @brief 返回全部键值 @fn virtual QVariant DSettingsBackend::getOption(const QString &key) const = 0; @brief 获å�– `key` 对应的值 @fn virtual void DSettingsBackend::doSync() = 0; @brief 开始进行å�Œæ­¥ @fn virtual void DSettingsBackend::doSetOption(const QString &key, const QVariant &value) = 0; @brief 设置`key`对应的值,并使用存储å�Žç«¯è¿›è¡Œå­˜å‚¨ã€‚ @fn void DSettingsBackend::optionChanged(const QString &key, const QVariant &value); @brief DSettingsOption的值å�‘生å�˜åŒ–æ—¶å�‘出的信å�·ã€‚ @details `key` å�‘生改å�˜çš„ option é”®,`value`对应键的值。 @fn void DSettingsBackend::sync(); @brief ç§�有信å�·,请勿使用。 @fn void DSettingsBackend::setOption(const QString &key, const QVariant &value); @brief ç§�有信å�·,请勿使用。 @class Dtk::Core::DSettings dsettings.h @brief DSettings是设计上为Dtk的应用程åº�æ��供统一的é…�置存储以å�Šç•Œé�¢ç”Ÿæˆ�工具的基础库。 @details DSetting使用json作为应用é…�置程åº�çš„æ��述文件。简å�•æ�¥è¯´,应用查询的é…�置分为组/键值二个基础层级, 对于一个标准的Dtké…�置控件,一般å�ªåŒ…å�«ç»„/å­�组/键值三个层级,对于超过三个层级的键值,å�¯ä»¥é€šè¿‡ DSettingsçš„API接å�£è¿›è¡Œè¯»å�–和写入,但是ä¸�能在标准的DSettingsDialogs上显示出æ�¥ã€‚ 一个简å�•çš„é…�置文件如下: @code { "groups": [{ "key": "base", "name": "Basic settings", "groups": [{ "key": "open_action", "name": "Open Action", "options": [{ "key": "alway_open_on_new", "type": "checkbox", "text": "Always Open On New Windows", "default": true }, { "key": "open_file_action", "name": "Open File:", "type": "combobox", "default": "" } ] }, { "key": "new_tab_windows", "name": "New Tab & Window", "options": [{ "key": "new_window_path", "name": "New Window Open:", "type": "combobox", "default": "" }, { "key": "new_tab_path", "name": "New Tab Open:", "type": "combobox", "default": "" } ] } ] }] } @endcode 该组中包å�«ä¸€ä¸ªbaseçš„root组,两个å­�组: open_action/new_tab_windows,æ¯�个å­�组有包å�«è‹¥å¹²é€‰é¡¹ã€‚ 对于"New Window Open:"这个é…�ç½®,其完整的访问id为base.new_tab_windows.new_window_path。 读å�–/设置其值的示例如下: @code // åˆ�始化一个存储å�Žç«¯ QTemporaryFile tmpFile; tmpFile.open(); auto backend = new Dtk::Core::QSettingBackend(tmpFile.fileName()); // 从json中åˆ�始化é…�ç½® auto settings = Dtk::Core::DSettings::fromJsonFile(":/resources/data/dfm-settings.json"); settings->setBackend(backend); // 读å�–é…�ç½® auto opt = settings->option("base.new_tab_windows.new_window_path"); qDebug() << opt->value(); // 修改é…�ç½® opt->setValue("Test") qDebug() << opt->value(); @endcode @sa Dtk::Core::DSettingsOption @sa Dtk::Core::DSettingsGroup @sa Dtk::Core::DSettingsBackend @sa Dtk::Widget::DSettingsWidgetFactory @sa Dtk::Widget::DSettingsDialog @fn Dtk::Core::DSettings::DSettings(QObject *parent = Q_NULLPTR) @brief DSettings构造函数 @fn void Dtk::Core::DSettings::setBackend(DSettingsBackend *backend = nullptr) @brief 设置存储å�Žç«¯ @fn static QPointer Dtk::Core::DSettings::fromJson(const QByteArray &json) @brief 从 json 中获å�– DSettings,返回的数æ�®ä½¿ç”¨ä¹‹å�Žéœ€è¦�自己手动释放。 @fn static QPointer Dtk::Core::DSettings::fromJsonFile(const QString &filepath) @brief 从 json 文件中获å�– DSetting。 @fn QJsonObject Dtk::Core::DSettings::meta() const @brief 返回JSON对象 @fn QStringList Dtk::Core::DSettings::keys() const @brief 返回全部键值 @fn QList > Dtk::Core::DSettings::options() const @brief 返回全部 `key` 的值 @fn QPointer Dtk::Core::DSettings::option(const QString &key) const @brief 获å�– `key` 对应的值 @fn QVariant Dtk::Core::DSettings::value(const QString &key) const @brief 获å�– `key` 对应的值 @fn QStringList Dtk::Core::DSettings::groupKeys() const @brief 返回å­�组全部键值 @fn QList > Dtk::Core::DSettings::groups() const @brief 返回å­�组全部 `key` 的值 @fn QPointer Dtk::Core::DSettings::group(const QString &key) const @brief DSettings::group将递归找到å­�组 @return @fn QVariant Dtk::Core::DSettings::getOption(const QString &key) const @brief 获å�– `key` 对应的值 @fn void Dtk::Core::DSettings::sync() @brief 开始进行å�Œæ­¥ @fn void Dtk::Core::DSettings::setOption(const QString &key, const QVariant &value) @brief 设置键值 @fn void Dtk::Core::DSettings::reset() @brief é‡�置键值 */ dtkcore-6.7.46/docs/settings/dsettingsgroup.zh_CN.dox000066400000000000000000000050111522615770400226440ustar00rootroot00000000000000/*! @~chinese @file include/settings/dsettingsgroup.h @ingroup dsettings @class Dtk::Core::DSettingsGroup dsettingsgroup.h @brief 一组DSettings选项的集å�ˆ,也å�¯ä»¥åŒ…å�«å­�组。 @fn Dtk::Core::DSettingsGroup::DSettingsGroup(QObject *parent = Q_NULLPTR) @brief DSettingsGroup构造函数 @fn QPointer Dtk::Core::DSettingsGroup::parentGroup() const @brief 获å�–当å‰�组的父组 @return @fn void Dtk::Core::DSettingsGroup::setParentGroup(QPointer< DSettingsGroup > parentGroup) @brief 设置当å‰�组的父组为 `parentGroup` @fn QString Dtk::Core::DSettingsGroup::key() const @brief 返回这个组的键,会包å�«å…¨éƒ¨çš„父组的键 @return 返回这个组的键,会包å�«å…¨éƒ¨çš„父组的键 @fn QString Dtk::Core::DSettingsGroup::name() const @brief 返回这个组å��ç§°,它å�¯èƒ½è¢«ç¿»è¯‘。 @return 返回这个组å��ç§° @fn bool Dtk::Core::DSettingsGroup::isHidden() const @brief 检查这个选项组是å�¦ä¼šåœ¨ç•Œé�¢ä¸Šæ˜¾ç¤º @return true 表示则这个选项组会显示出æ�¥ @fn QPointer Dtk::Core::DSettingsGroup::childGroup(const QString &groupKey) const @brief 返回给定键在选项组中对应的å­�组。`groupKey`å­�组的键 @return 返回å­�组的指针 @fn QPointer Dtk::Core::DSettingsGroup::option(const QString &key) const @brief æ ¹æ�®é”®å€¼èŽ·å�–选项。`key`选项的完整键 @return 返回对应键值选项指针 @fn QList > Dtk::Core::DSettingsGroup::childGroups() const @brief 列出组下é�¢æ‰€æœ‰çš„直接å­�组。 @return 返回所有å­�组指针列表 @fn QList > Dtk::Core::DSettingsGroup::childOptions() const @brief 列出组下é�¢æ‰€æœ‰çš„直接选项。 @return 返回所有å­�选项指针列表 @fn QList > Dtk::Core::DSettingsGroup::options() const @brief 列出组下é�¢æ‰€æœ‰çš„选项。 @return 返回所有选项指针列表 @fn QPointer Dtk::Core::DSettingsGroup::fromJson(const QString &prefixKey, const QJsonObject &group) @brief å°†json对象转化为DSettingsGroup。`prefixKey` 组键值å‰�ç¼€ `group` å¾…å��åº�列化的json对象 @return 返回解æž�jsonå�Žçš„组指针 @sa QPointer Dtk::Core::DSettingsOption @fn void Dtk::Core::DSettingsGroup::parseJson(const QString &prefixKey, const QJsonObject &group) @brief å°†json对象转化为DSettingsGroup。`prefixKey` 组键值å‰�ç¼€ `group` å¾…å��åº�列化的json对象 @sa QPointer Dtk::Core::DSettingsGroup::fromJson(const QString &prefixKey, const QJsonObject &json) */ dtkcore-6.7.46/docs/settings/dsettingsoption.zh_CN.dox000066400000000000000000000066001522615770400230250ustar00rootroot00000000000000/*! @~chinese @file include/settings/dsettingsoption.h @ingroup dsettings @class Dtk::Core::DSettingsOption dsettingsoption.h @brief DSettingsOption是DSettings的基本å�•å…ƒ,用于存放一对键-值数æ�®ã€‚ @fn Dtk::Core::DSettingsOption::DSettingsOption(QObject *parent = Q_NULLPTR) @brief DSettingsOption构造函数 @fn QPointer Dtk::Core::DSettingsOption::parentGroup() const @brief 当å‰�选项的直接上级组 @return 返回当å‰�选项的直接上级组 @fn void Dtk::Core::DSettingsOption::setParentGroup(QPointer parentGroup) @brief 修改当å‰�选项的上级组 @param[in] parentGroup 上级组 @fn QString Dtk::Core::DSettingsOption::key() const @brief 当å‰�选项的键值 @return 返回当å‰�选项的键值 @fn QString Dtk::Core::DSettingsOption::name() const @brief 当å‰�选项的å��ç§° @return 返回当å‰�选项的å��ç§° @fn bool Dtk::Core::DSettingsOption::canReset() const @brief 选项是å�¦å�¯ä»¥é‡�ç½®,如果å�¯ä»¥é‡�ç½®,在调用reset方法å�Ž,选项的值会å�˜æˆ�åˆ�始值。 @return 如果å�¯ä»¥é‡�置则为true @fn QVariant Dtk::Core::DSettingsOption::defaultValue() const @brief 选项的默认值 @return 返回选项的默认值 @fn QVariant Dtk::Core::DSettingsOption::value() const @brief 选项的当å‰�值 @return 返回选项的当å‰�值 @fn QVariant Dtk::Core::DSettingsOption::data(const QString &dataType) const @param[in] dataType æ•°æ�®ç±»åž‹ @brief 选项的附件data,用于未选项设置一些é¢�外的辅助属性。 @return æ•°æ�®ç±»åž‹å¯¹åº”的数æ�®. @sa QObject::property @sa Dtk::Core::DSettingsOption::setData @fn QString Dtk::Core::DSettingsOption::viewType() const @brief 选项的控件类型 @return 返回选项的控件类型 @sa Dtk::Widget::DSettingsWidgetFactory @fn bool Dtk::Core::DSettingsOption::isHidden() const @brief 检查选项是å�¦ä¼šåœ¨ç•Œé�¢ä¸Šæ˜¾ç¤º @return 如果显示则返回true,å�¦åˆ™è¿”回false。 @fn static QPointer Dtk::Core::DSettingsOption::fromJson(const QString &prefixKey, const QJsonObject &json) @brief 从json对象中å��åº�列化出一个选项对象 @param[in] prefixKey 选项的å‰�ç¼€ @param[in] json å¾…å��åº�列化的json对象 @return 返回解æž�完æˆ�å�Žçš„ `option` æ•°æ�® @fn void Dtk::Core::DSettingsOption::setValue(QVariant value) @brief 设置选项的当å‰�值. @param[in] value 选项的当å‰�值 @fn void Dtk::Core::DSettingsOption::setData(const QString &dataType, QVariant value) @brief 为选项添加自定义属性 @param[in] dataType 选项的扎属性数æ�®id,对æ¯�个选项必须唯一 @param[in] value 选项id对应的值 @sa Dtk::Core::DSettingsOption::data @fn void Dtk::Core::DSettingsOption::parseJson(const QString &prefixKey, const QJsonObject &option) @brief 从json对象中å��åº�列化,并设置自身的值。 @param[in] prefixKey 选项的å‰�ç¼€ @param[in] option å¾…å��åº�列化的json对象 @sa QPointer Dtk::Core::DSettingsOption::fromJson(const QString &prefixKey, const QJsonObject &json) @fn void Dtk::Core::DSettingsOption::valueChanged(QVariant value) @brief 选项的数æ�®å�˜åŒ–æ—¶å�‘出改信æ�¯ @param[in] value å�‘生改å�˜çš„æ•°æ�® @fn void Dtk::Core::DSettingsOption::dataChanged(const QString &dataType, QVariant value); @brief 选项的附件的é¢�外数æ�®å�˜åŒ–æ—¶å�‘出改信æ�¯ï¼Œå�¯ä»¥çœ‹ä½œè¿™ä¸ªå€¼çš„属性å�‘生å�˜åŒ–。 @param[in] dataType 改å�˜çš„æ•°æ�®ç±»åž‹ @param[in] value å�‘生改å�˜çš„æ•°æ�® */dtkcore-6.7.46/docs/settings/index.zh_CN.md000066400000000000000000000102241522615770400205020ustar00rootroot00000000000000@page dsettings dsettings--dtk设置工具组件 # DSettings ## DSettings:dtk设置组件 [dsettings.h 详细文档](dsettings_8h.html) 项目目录结构如下: ```bash ├── CMakeLists.txt ├── data │ └── settings.json ├── data.qrc └── main.cpp ``` CMakeLists.txt: ```cmake cmake_minimum_required(VERSION 3.1.0) # 指定cmake最低版本 project(dsetting-example VERSION 1.0.0 LANGUAGES CXX)# 指定项目å��ç§°, 版本, 语言 cxx就是c++ set(CMAKE_CXX_STANDARD 11) # 指定c++标准 set(CMAKE_CXX_STANDARD_REQUIRED ON) # 指定c++标准è¦�求,至少为11以上 set(CMAKE_AUTORCC ON) # support qt resource file # 支æŒ�qt资æº�文件 set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # 支æŒ� clangd if (CMAKE_VERSION VERSION_LESS "3.7.0") # 如果cmake版本å°�于3.7.0 set(CMAKE_INCLUDE_CURRENT_DIR ON) # 设置包å�«å½“å‰�目录 endif() find_package(DtkCore REQUIRED) # 寻找Dtk组件Core add_executable(${PROJECT_NAME} # 生æˆ�å�¯æ‰§è¡Œæ–‡ä»¶ main.cpp data.qrc ) target_link_libraries(${PROJECT_NAME} PRIVATE # 添加需è¦�链接的共享库 Dtk::Core ) ``` settings.json: ```json { "groups": [{ "key": "base", "name": "Basic settings", "groups": [{ "key": "open_action", "name": "Open Action", "options": [{ "key": "alway_open_on_new", "type": "checkbox", "text": "Always Open On New Windows", "default": true }, { "key": "open_file_action", "name": "Open File:", "type": "combobox", "default": "" } ] }, { "key": "new_tab_windows", "name": "New Tab & Window", "options": [{ "key": "new_window_path", "name": "New Window Open:", "type": "combobox", "default": "" }, { "key": "new_tab_path", "name": "New Tab Open:", "type": "combobox", "default": "" } ] } ] }] } ``` data.qrc ```xml data/settings.json ``` main.cpp ```cpp #include #include #include #include #include #include #include DCORE_USE_NAMESPACE int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // åˆ�始化一个存储å�Žç«¯ QTemporaryFile tmpFile; tmpFile.open(); QPointer backend = new QSettingBackend(tmpFile.fileName()); // 从json中åˆ�始化é…�ç½® QPointer settings = DSettings::fromJsonFile(":/data/settings.json"); settings->setBackend(backend); // 读å�–é…�ç½® // 该组中包å�«ä¸€ä¸ªbaseçš„root组,两个å­�组: open_action/new_tab_windows,æ¯�个å­�组有包å�«è‹¥å¹²é€‰é¡¹ã€‚ // 对于"New Window Open:"这个é…�ç½®,其完整的访问id为base.new_tab_windows.new_window_path。 QPointer opt = settings->option("base.new_tab_windows.new_window_path"); qDebug() << opt->value(); // 修改é…�ç½® opt->setValue("Test"); qDebug() << opt->value(); // 获å�–所有keys QStringList keys = settings->keys(); qDebug() << keys; // base.open_action对应的组 QPointer group = settings->group("base.open_action"); qDebug() << group->key(); return a.exec(); } ``` 编译è¿�行: ```bash cmake -Bbuild cmake --build build ./build/dsetting-example ``` è¿�行结果如下图: ![img](/docs/src/dsettings.png) @defgroup dsettings @brief dtk设置组件 dtkcore-6.7.46/docs/src/000077500000000000000000000000001522615770400150015ustar00rootroot00000000000000dtkcore-6.7.46/docs/src/dciicon-tree.png000066400000000000000000001626611522615770400200700ustar00rootroot00000000000000‰PNG  IHDR» ~Ûè pHYsÄÄ•+ IDATxœì}wœÝ¶•îyûÜé£QiÔ­â"Ùª–e[î݉�ÞœMÛ}»É&qzsz}Ù’¼Í&›MOìljKÜâ*7[¶Õ{ïšÞn¿—|ÜÆ€ Þ2â÷[—$p‚çÃ9 �µ*Ä•�!52ÿ´Î…ÊIh‰�²©‚利Pìmà Õf"Õâºñ2czãSVÎ’a.Xט©MêÅÎÂQÞþÅ–^ek»ƒ 2Øá°¿¨<†‰E;YŠ€f*‹�œ ãÒǘÐ^·Ê¥+£ •³½õb«Á¬2�*vö̵ãÅ“#Ö’ ªq(V±W‰÷N±¥çhMÛ]¥Z<.‚ì‹!dSiWÄÁUJàèµ…äP«iƒ~kbD<°JÌ÷Œ”ó�‰…VwsíÕšÆ 6ûX�Â4ì°n7l+ïhÉ®–JChŽÈÆ\ÄÉw‰ø‡d\Æ]\¾MÕ6? q4·Xe7J°¸#8…úQ3³ÚjßP•*±*uò¬U’„ò�þ›h«Tb|Õø§–~ §[Oû7…`•ªá"T)dÄ­‚cšD„:»’Y3ž-±Ÿ b<æ°*°««qVps(Ï*›¹öCR–”"„tD«LÄÐ|Ÿgþæ¯ >`Uä„T•þîPò{ uH\3g éÂõ¬@ôÅ!®qpµvì­g›D Iqnr âl¾u ;¬ 2ÞhJd—jž!˜—!žôNP‰öª‚e&GºhÈ”É)¹© å{ÌœîÕyûsº/ÁYq·ÙŽ0¤[Ø`›HÄær+î&œ„€\e'ÙxýEpó�¨ *VîJ(ª¬ ž·nè°Í¾ü?!I’rmMªaƒì¸¶פ`(­›P/[äeJÁ��_H¾UY3•î�K¯UèQsÁoAÕgR„W¡ zÊ©ª«!ª ð¢V Eg­t&�.^@fý?ŒÙXùÀ$Ÿ‡!ªÄ%¢ª w•ᲕÕ𓵃ê–êqôjóËjdÈÈgaT1Ó^Ô4ÂÞKáWM„£r Ð\DaôÒœY]ŸÓÂ`dº Å=ÿ¬�9CIjÞ?ж¯À4‚×$âñ}pÙ] å‡Rìëd„È¢9m2(æ'×îïȬ8[±6<7�Ž‚N¨sˆ ‘U3ÉâŸ{àËÅÀNÇÿ5ÅyX˜&V`L„ˆ3j–¥²eMÄX9ì=« cB™Y³Y@w­¶¨[B£}u©µÑ-DC-O<÷�õƫ؉5§Ú0|À)ÞMÿÀJ„½ë¼Ê\mo¦kL% Ø-«œÆ �E~"M‹gb»¾ØT+P)w[¬Fì2/DÙq�Õ÷énSÕ:¹sç �±g,ó [L*ê)�‰•!2À¡ Ҏȹ,E#ÄÙg1îØqj\Ñïqí™)JyqΙ öÀE��Dª½›! b«æÂ\hdÀÓ#¹ù€O £tO;Û0™®Û(¨Q:M„5I•´r¶ÁÝè“�þÇì"Ž¡'IÜ%syj…t%3� ¼jU¤ Ï€¹µøÆú¥”Œ1&„OE Wð•„¢”?½£‰UÚ ë9뢱å2SÙˆ�¯D@ã6êg‹pM-xr[p­Ý%aѨ͂Už˜bD||ÀhÝí)áõ*Îb`Á „,À8{¬ ñ²> ž¸mŒ¡­«ùŒòY3Á.S>/Å©‹*@ nßRùƦ«E\Y„JÐÄxŽ|š�Š—xFò¸H1#ÁŸà¿›„?Ïr©·Ab]S„€Z2+6X£ŸÇ‰`A•30ªØˆ�0vÃù‹$ðÙËšhq·P��žT€ø �‹| ™?`#¦SŒٴًå!î••ô€ò�&(Ð 6­r±Í&`¨P€�¡ßŠ*Eœ4…rä9,†™¬YµÒ¶Ýà1˜Ãó5Áòîð>xênPÍ!hn˜´ìÜ·\pÎ�[ö>üÌË?ÖŽ/£á¶åç¿}^÷åMщ™Lü/Oéèé׈‚xgøù€)ÂÅ'”Y•=1å_…Vuâ.�Í?F0ãš"£`ËÍ4ƒMqä.X‚ëŽ *ulEÓáB”É®ùfšIá¾uµ;¯Ý’!„XƒBs§]rÓ¥Ÿ;zzËðèiCÚÆ† ·_ù­dzì©�?ì>¢‚O %Ž>pj¢IÞÅŸ:DV¼¡Î“‰×<óöXèF©|Í]b`„s÷‘iÉ/>�«F qúcÔ¨«*ëøž½‚n§ˆ2-ŠU»\ÁE ¬¦Ÿ„#§^ý僌%n»âëÚÜТsnI¦Fïö®t&NÓ�ÿI†.QíÄ‹�îÛÂ,àXNhRMž'ÀØ ”�YM•ŽéKK:"@ÿH±gaU…IÌQ,ŽcJòäp±©ùZ‹Ùc# ¶‘9† 8r®•@m‡R¢Ú¤§ÏµnÌdj¶à¿*í ÷ÚUÃ=”`«í.dÜ7¬fù �—@7è¡-³a¸ 665LOmÝûèÆí¿WT…*�퀚‘ÕÎó¦3×háŒSPHG ¦ˆ’e¹W¬ìñÑwÛw�u*Üi`îÌ*ØRŠÏ‚y$ð‹\{h,Ûè8µö„Ûjœsqþ×Úo­[#jÅ¿!t�Ô&hލ™œ�A]ôÌø›õ‘P™’RY)¡^W)GüÒjÆøbêÁÛ1¿jþ¾�¼Wø¶9Ôf/;ç´¸6£Xûb/pÄÇ–Ÿ¡BdÀ‘N{ª.øŒ±ÖwŠY™Ý0NN3Ä‘€˜D‘!Ôa¾5N„aC=x�µÆÜnø1Ú™îÕƒ­*6Æ wUcÍà¨øVOOpy.>¨'20âGLÄ  Y$G˜@2³5g ñ„�ì„lÜ�³þbîßÌïØ_(C¼mNê‚£~~sv �°‚½¼¹È *ŽÀt:°+Žók6žýæKÖ…ÄdÖ“„’—NXd2tLê1ÎJv­£X~M=˜ªd¼+ ·º-ÌI4÷™Ò ­EØ“Q ™ì i*ÈebîɺJØ® Y;9nk'7Åv1ª§Ø]+ãÓ¾.蓜¶`aG˜ÓR ìYj.*˜N¹ÒrÆ®b‚;_e(±�jpà­G3Œ‹‹€ôñ¥R%¬,24˜)ôj«íê…ñö'_ÌDz¶åþÁpç,Õq¤µÛñ)úô"‘]63²6„ë°º‹P9.Ûn1&žs@B‰7Ú¢ub,Qß'ã,íz—ˆlp¿y0÷Œq8+ÍÙ×q3ºüúðO�U7töÔˆ wºHKãηœ¯‚U!¿mޢȬ%˜Û‚æÍ2¤b�Vd€pÿðæ6�Õ ˆ{®�ÐÔ‘-ªÌSYRs‹Xb^A.qÐ µýNôÐñæ‰^+#Æ� ȵZ6QÐ̥ؾ&”ì·Âü²«‘)F„KBÈãhE7:–î)íªîtÞ G @dØ×åi„š’²=õææä¯6û-º¸‡Y‰(ÙäáÓb3ª Üý±Ás Ò˜K\–Š’�ÃGN`sdLÉSÛd §½Š55*ý[þŒ�}z00¤Tü±…¢‹Ã,p--nTeyEX8']Ŧ�¡Ñƒíâ ÿôÕÅØoH1÷_¨‰gÌR�QQ¹¹C‡à®®EL‡î¢Õ}`êÄ þòôçJ[ôLí<ï–K¿²aÛÝ›÷>ȤŒ Æï ßvÅ·Nöí|éõ_L­„¤›/ûê¼ék@U•u[³aëoxÍ1´jñû§v^pÿ³ŸÇí/TÖuÓ¥_¡ëšÒyîÍ«¿¼qû=[ö>…ÎG,LÀ~ãšoõX»éÇÆ2Ûòt—Y‡^H/ÚjÀlsVÁ† FXwób w"M¬qQ È`ïã¡ÌÁX»Kb¹ e“$*à Å|UÒ‚œQ‚�¹8¦AGR�Î&GOÄ“ÃÖ*©œCÄ!EUÿöü×F_¢o¼âÛÖå$ bH£¨ÊÃ/|í‘¿ 4¾qÍ·°i2ÙäÐèÉDrXS#T´ìÜãIŸ/pëåߨwì…­{6¥¦ î¹^JЧEÅä<¥å|\*ê*³ª9H¶‘¡ü• âVpIÌ °î ?±å&+ {*lçÂéöqlAÏ«C˦ŽÖ¹¡w`ÿŸžø¸ejþŠi#5 ¨*(j¶Žªª¨*(JvXì÷ê�Gb=ZfÞté]­Mݲì¿þâÏ\ñgTUÙ¸ý÷/¾þ3EÇ ÖÄ€¹lgž Ü¼ôh˜)9õA¤0¬£ÒÛåÇ¢C¹ó³N†ð-VcY¬ÓéjzÎ,D>Ÿþ²;4€“úÌ7^t(õª/_JÒ"Iò¥‹?0wÚ%Onü�S}»çÏXsÉ¢÷õ ìÔ_ÿùºÍ¿lmšf°LêXxñùwlØ~÷Áãëý¾PkãÔX¢?)“M9õÚËÛÿOLl›{Ų�&SïîºB g]óòŽ?üæoïomšzÕŠ;e$?óÊ)¦]BµX8ëÚK½ý¶ß<¾¾9:éŠeõû‚k_ý1¬^ôþÙSW=õòžîß=¯{ÍÅüCïà~Û ¥‚úâæ_¬Ûò«ÖÆ©oXóMÝýFÒŠsß=oÆ_÷½3ûgw]¼úÂö.%˜Ó}ÙŽý�Ýóè?77N¹vå'/Yôþ¿oøþÀȱûžþtC¨ýÖË¿ºyïßvz @Mgjqy“Þß°p¬¹Ÿl��‰'(ÚmÀMF±°ç!嵺mÌãwBBînÁš�“**2–ç[‘h|N§—t¢«¾¼Z€hBªh¨cV×ò×vÝ¿ïèó°yïƒÓ'/ øÂ¥lŠª&R#9%k�ä÷ð‹õŽÄN€Ö8ÆÛ÷?šÿ}èÄ+³§nšØ>!9æx϶M;ïÍæR£ñž×wýeé·F:FÆÎhKª-l0½`î-[÷=¼mßÃ*¨c‰¾WwþéâEÿÝù'˜1eÙë{Øwôزï¡îÉK¾¥QXº¦¢*‰ôHNÉjO6„Zçt¯Þ¼÷�ƒ'6Àö�Lê˜×Ú4­Ô¹GŽmÜ~w*��Ù{díôI|‘dzt,Þ€rª’L�ŽÅ{ ºP±¬¦X”-¿L5·cÞñ�g‡-˜Uº.€/z�Ï,ˆ X®³®33ÂzE›|{à òSÇÅ pؤ�òpeª-1Ž8Àp1n‘¥`ïPad�˦û‡�Lꘇ�´ñdïŽ×÷ÞݪÏ,ê»õõ½=|r“R´¡‘PËòsß1{Úê†pøäÀ¾£/”æ–û‡åréüï�Ñ£²ìoµk)Á€H¨µ©aÒòóÞµôÜ·çÏHHÊd“Á@T’ü>9Ø7x• xRû|JÕmß·H¸-à ÷É*ªÒ7t¸µiZ©CöÊd“!P!™‘$’dvùyn(ôlæieëçVD´Y#ɲý0 uº~µ']ÅÖZÀ„,O&â\Ÿ2š‹ц',Ð4¢NYbm…�­Z…½—ùrŽC PÕü¼nñ:RòAÉ„]EÉnÜv÷öý�ž?ç¦kV|bhôäc/}g$vF–ýk–~¸9:ùáç¿Ö;t@UÕ5Kÿ%j·]rUUU5÷ükÿsàÄzíÙX¢BË,UUÍ�UZФ–åù@–L©jN;SœU2qÅ�cŒYrÅx¹(V„”È"©=`jI¿½bÕ ÂüÂ_/3y/ÎDh»�SJÇ@Å^ã‰[r–(5鯪¯À´Z¦’{/#ÍÐB…†„|×â©¡L.ÝÒÔ•?”d¹µij!Ð�•Z†�?–ذíwzâΦ†Î™SV  ¿¡³uööý�ö îSUE–|Í “´YÚ[fȲ?ÿ»­©;—ËÄ”†H¤†Fã½­MSc±žÑ±Ó…¿øEÍÆRC™\¦µ±+_C$ûZ›ºÊ¶ü#+Å4Tr ›Mu4O/¤ARkÓTTh'‚˜|"¤ªªª*² ªÄ•Añ+›s…nsØ*ŠKÊšMXî“ëEq¬¬˜塹qvE2¹Ð,ørÒ9TÏ”±Ðœ|=‚·HHû«ôÈ!ÖÕ“.QOu­Rñô—BªX¼ÿЉ K¼yfײh¤ý‚¹·L›¸¸” p°Q–|~_X–ƒ¥ü]�ç-˜yMKcW4Ò1e¹>_8žÙ\:žžÕµ²µijK㔋/xoI`!ã„ó/œÿ¦h¸£{ÒEÍÓá“/k#ì²äG K²_B…ÁQ:=¶uÿà f^½âü;Z›§57N™=mõùso‘$<Ñøä† ç¿yÆäå ᎠæÜ<µsq±è… Μ²âC·Ý;gÚjsÃHE]HÒ}   UöÉÁüéx|àÀ‰õ‹Ï¹mvת†pÛ‚WÍŸqU¹-‰7 “MÄâýó¦¯éh™ÕnoŽNf_²[꨸ûjßìó订­æ*Šýj ,þs=x,’Yœ8 f6Ï…T¶Å;MÉØ#\£ƒ¯B¶§—yî/óy[7“IQ•—¶üJQ•›Vßåó…�ذi×½3&/Ÿ¼ùÒ»fO»! Z}á.Yü¾‘±Ó}ö }C%ä_2ÿö¶æ;ý¾ÐÐØ©M;ÿxèÄF�É&^Üü³Ë—üË?Üò«DrxëþG6ï}°9: ?^V6l¿»£yÆ?ÜúkUÉí:üÔº-¿V”œß¼îâÏΞºÊç !@“&,X~î;†FŽ?ôü—û‡ï<øD25ºtÁ[–.|BhpäĶý�€ª(ª²në¯U¹qõ}rèÐÉ ¯íþs÷¤%úJ# IÚºûd¢®á±Ó7®þâì©…*_²ø«½odìôýk¿Ð?thý–_+jöºUŸø£'{·ï?úbkó4BÃêÎd²‰µ¯þ÷åýŸwÝðcI’wzêÉ�ÿ‘ËeL¹Ønþ-(s®áÄa¿±4úc‘A*O5ÃROŠtŽ»*:(gŽÿQq�36a,�›SÓš,Ü]µÌ+¬üyúë/P–u xêk/\ý•K­“ÒdÐÎ9¢d[N»]®v¦Þ¥9±ôÜ·Ïœ²â�µ_¤|<ÃZºiÒ€[í˜ï²M¥Õƒ£ŽÂÙvNÕáŠnKš<×ïn¤b­”±X\¥ç]gg¯i¸WUÕ°!æ#~™ãŸ J(I5œ�$¹½yF2=’Ë¥ÙÇ;é(ŸE8ZÍ‚yÛÁ:F¥õ ºGQîåvg¦•ú,:¶Ú¤ÑžiÙ�%ÅåûPx‚q\€x…—PÝG–pƒô¹2AMÓH’|Í»}$væTß.EUæN[=«kås¯ýDQ³ù¥­‰ ×5ÿ�†lˆÁIØ OŒc˜Zëdó4_H‚›!X%ã+fðRÄìôtáªÞ�09¬Ð¶•Êú¤XIÓÿQ'†ø6=C=©»\ù�F /•ˆ�2™4 ]a1„µël²Éˆø9$ã(†ýMÕx‚+½ªN Æ…¢-+2h©e‡À V¡÷EU6ï}ÐêóàFgÁ67”å"TÎÎY"ŠÅ�å‰ûrÝ�ªñG¥F¦aw4›áœ‘Ì]kUmÏ+)³E|1U¤7ÊäÎÆn»íE„QÉ�6uà ähg}ZCLŒ ÷Œ8—Éw�Ô!„­žDtœphšS5š�Ê®¢±ióìe³³bªò ”„Éc–†½fnU©\àè~6>ÔP¬K¬À•ØÖ\eHVMèi@€8í/§ò0ù]j0j,�5:`-ZGb¸¡x`bÛ‚�•Ä•l64ØX É �?ê7nÂÉwm%ªj~ØÉ$á,àƒ¯™K»XËGU7ôd ƒ%!’ú˦(û2DëÈkzŠ-zÐp»Òð¢ó˜¹LÑžDmƒ%èétÒÞ– ¬@g£F=:%")cå $aê{\C{cfóå’@+¡¼äÁ˜¾"Çý�XPWhÀ~ùœÔÌYXȦA'¸‚è°-bð$ :Î’0ƒ›akþ®Ç¶L‰+™Tðë¤ÙnŒ¡:u°išÍ —¢êÓË8h,«{eòJEXqg¡7Ç ÆŒ8Ô&=`5O‘LBþì8' j—"]´?¹Ê¢§Êm§ÂL\œOƒEòbÇC…˜Óä ßâTrQ„O*T�0~¦»>Š@oLc…¦È¤ çß¾pÖu;<öÂë?Õw‹Zð½°e v‚A·Ê†Õ¨o³›áq|s›FdÕ\»(º7{�5UÓNT¼ –Ž�¶>Îlê¯s> ¬N@!¦U|\¨ÑnVÐE/X,+ؤg�ò¼9­„¡Ìë5é`r, ˜5eÕµêxÏÖ‘Ø'*ÜhV«OOK0ï6½Í ÃÀ¾’¦˜ÜÚ¼}ÓµRWƒ™Ì¡z=„•ɨƒ8Pãfh«nMðTز±”¥`vµÃFÜ* ›¬ -MQª@VðiÍ¥¸0MuÆÅÔÑ¿3m•õXÏë÷<öϱäÀÍ«¿Ì$°‚à±1„ÈààªCváÚô�Ë}ÅÖGplF~TÅÀÐÜ+C‰i}Ò�‡‘ŒÉ´ÃÉòY¦Iks�4ɘ]xRB^/¡b X…ÊgÿþåçêºþkH “Mf²IŸä7l\@{¹0bcã †¢>y8’à”_ã°×AD¬/¦;þrï!Ó÷T�•›kÍäw’�‚0ÉÊê‘>™£(S!™É!ç•Yë+ŽÈÞ¥uÚ®ûú&Eµ·jùïUs4¢ÃöfÏÎ?˜rÂÂAä!"$°À¤îÀè»Ó&M8Õ¦s.Nï› „Óe1¤a ›B‰!Ê|OÏ"øSˆüШŠ+4Ä ›$UmzÙ¡ùeOd‘¹bå¨.Û’´ó=¤ëƒ--Cð+—ÆÒBY©¬M Ñ_è2ì×ÛNÙ0Qi÷ü>œ.«øcDÈÐóóCIM(ˆ˜‡&¹ùQÍ*ÊBYXS ꓌LÏR5¾„Šì)sZ:6¨XŠÚsd˜Êƒ-C Hhè‹PkïŽUÒøkºÖ—Í~¡ÅÜ’ÐLJ˜cò¥4{½ãò3tÌþäZ¡y!Κ7„Ò¶…]/ÁE“'LtI�Õ´¹ãQ>¢Ö8âCØë ù5 ‘)¡ãÇŸ±õmÍKVd&‹e: IDATƒ_‡ƒÈÒX9x˜˜¡eql-sÀÏðHƒ¼™)÷bÜCÂ8Ì·¢dù¬0{

y¬I‰éðlÔˆƒh!x©Ž• ¾¤O¨(¸28}¬¨žËàÎSI“jãàÌc¡Ž#“µ ˆL©lΣé‡,ŒS!ÈH/š#ãOK!š¢á£=ÌÃ/¼<Ü›Kß‘ñ€/«�tT áŽ7]ù›&Ë’æä‹æ¾ñDÏÖG^úš~¯J„ùå¬z–óaÖ¢õÂhIpÑZj~‚8cNîgÞ9DÝ´ÊQ‹ýÛÉIü•P°u!d:âë0˜^œ�4à¢:øÌ¸E:‚ƒLB1 0ÅT 2Ö(H^ %TÈw0WH 0;é˜ Kôýö‘÷ãrrz/•©H¾_–áð:. ƒ^| ³®:©0œwüvA•Ë-©£I$l$ìQyí`N`ýú�ébi€Sˆ Ñ9ŒÑ7±�%·±„ª }HWáÊu¶ª¼'>L£ÏéŽë"Ô€€©8ü$aõxÚ �Ú( K“×iX�«ß¸hzIÂÆ­ÎqÈg¤µw<ôP´ÌÖóÑ‹\ȃ�J÷ÙñÙõa(ÖÉ 6 ›�£jŽRì>�ÍZp†¯jdD—Ÿ½Å.ä|RùÝBqÄQµÅÓÎaYŸÊ,.¢ËÞ¢V±ºº!8Óüƒþå}7P-2Ê3LÁo"÷{"1ÓKs\¬ ‚Â@ù7ý¯àÐÍ”Ô~-tÙè*ýÒ3Õh+Ç`¾ËPéÏNõØñtºZé¯öÁøÐ‰þ+ÞH j« ePF;ÁÓùô2‰E¦¨xK( ˆ™Y".ì-Tõ�c3•ûŽÛÏ�é"ŠÆ µÃð‘>‰­/©­‚NV9¸²RÔlvLb6¶;duÚZw¦²&ü ÓýÔæ$¬ôAæëÆü¦ùd£ß€¨ÅA¥Tq˜yZvd½n„.¡W)Á‚Û\“íH^°hë_]60“Œ„û>™#Ëiˆ(9(àçâm¡†”1-ó¸£Bú_˜a‹ñ”…:ã8ÈÈxú(\!ô¥"7X-4Ò]-¯pRñ °Ùõìd¡‚úÛËÕî�âõWÁ ¨v#b`.’€e©Ln„}Ux¥Xðhpùîˆ_sN 5¦‚óz\Zþâ˜Yù¾$�˜Q¸Éu äRl©¨ŸìMM62jf"*1X²BÅ?{‡L?*¨ÌU@41µÃ „©d®Ôì"0'H‚¥$¼¨9ó ¼ ÊêfcËéc­Ò貂�òCwüÚТ²Í-s"¯çÃd/äIŽ#Ʊª}à¨v — Ò¦Z"jÊ?D²/ÑD¾A£6Õp“ȪàB-? N‰/´J5¶5 `sæÏ–A!ƒ�IÅÇŠ¬>†�h+Pñ&»`â üÀãgàKJ’à«é®Oó[ Ô¡;·VËe•og�Æé4Íhpõ×ý»¢[…}jŒœŒ�*4 kq_!8èK6Ç1–s—‚a«£qgÒTSÿ£ÑÌà廯År TŒþcÒ‡øEb@ä§€È(l¬PõG: Ês6Q¨©Âh¡D&ÆçÝ›qmáǣ›Æö´Èñ97ÇϹ=×Ð)�õDöü9rð1Psl>ÍU6-�•EJ' s†qÌi”¢&DXµ1aÃc®$rz…b�Ó¢bòšÜU—HÇ+ÈŠLQ¾aÈÄ@qÞ‘Jä$šŸ¡I‹MV��ctqjs¹pÜP%ï*5eåðòOz·ù û<3!9ýª±…ïŠîú£¿w[zÊŠÑE”²‰Ð‘§‰�éÿdÂò²ëËnhÝß:7EŠf�wýÜ+üAI“H†qCtHà ¦Dx˯=�{Z¨+DËGáƒq×T¿Å‚N/%c)­9™X/¡¶¬<³N¶r-­maÁžÍO|XJ ­º‹QŽ*Ó¯ˆyºaß*’³nÉŸ˜yMèÄK�MÒJ¨ªJ ihågRS.%9úttÛoQf,=iéØyï‘’C©‰†? ’œè^<¹¾ù•¨ƒ—|Í?¸7ר•î8 }®aûo¤Ô¦`vWVfX<(.aœð ñ¹~ŒiYt!M6{eű8.…ňÛx¹#¢C1i¾àlÆ!CÚ²^zFmðK›Œ¼âÈm{]ÁQ%=€G¾@z³áæo_E¹Š²I9›Tå€jÚç™5ب4L ìT%Õµ*3ñÂèöß$g^§šd%h;B(1ãªèî{›ÿÇlc×ÈÒ�©È×ôÚ@¦izã¡'CÇž^þÉðÁÇ[ŸûÂÈŠOgšgø‡BñY7¶¼üï-/~#íYùù±óßßøÚ��’³ :™Ë Õqïiu?VÁæá ëàÁ3[ÀÁx'€ì#@92FŠ-¡Ò?„èL³ž¬YÁ(³8çÀÖBÚi�*î—`ü£zBqõ-I¢t‘`.|Î$£ôˆé[øÎð¾ý;“³®Sü 2Yj¾‹zw4ìþ3äR�xOdï_ãóÞ’‹t€œ ôn„ää`èÄzߨI”MªÁ¦¼ˆ`ÏæÀ©�€T_ìLdÿÃcçß‘‹tøÆÎX�Øk6NFݼ°+£l‘øóULÝÃ"‡õÀ¸ì@X{Œøx-~„³Â%½E¥b0æÕƒ+à½�BÔŠeÒ[¤¶¦—Á¦•¶ÊT1W$2¸ÛTU•c Þ.Åû"‡ŸÈF»õúG¡\:ÿÛ7rL‘|J¨ �’–²qEB.…²1P�”)'z‘ªäsI‰>Uò+¡6 N~˜ß1ÕWŸ‡ g s¸údž`�ᜓSVá m:�i§Fú¡ô(Dâ©%êm4Á­0 ‘Êßä¶`¼LTMÉ¡¢#\7U!ê!³E^Ë\¸c`Íw³‘IªäG“–ÇæÜèÝÚºþ›RiŸg„T�´š@øÄKŠ?Ÿÿ–±óß/Ç{£»ÿ9ò¤¾ë`r�ªDwÞ“kžÞ{ã/ — }ºqûoAQ�®Ó`>þ\¶eFÏy¿€\.rlmtû¯‘š3'£4Ž‹#yÁ·¤2� C{ˆh²J=ÿX=¶*`–dz'sÂR”qæé.ò!|Œ¨,‘¡"ƒ› ×JZ…TÚW3Œƒ R„¯rÝ@\x¢EŠt»5åDß„Ç>HI:õò¤¿½ÃxVÉ5|´áࣹ²Éöç>Ÿï:Í/_{%pzSÇéM %¡ãñåOv<ñÏ úB eb�[~Öüò¿±Õ –f<›@ ía‘Äîr#�WA*�³è“J2õTá Ð[r"7�cD¥ñ“Z¾´xŽî'�TòËVÐWƒÔ¬•›K0rwª»Gý5z}ͽJï¶›/ú¡ ¢ÔÁˆîi\òØætmÀN+㻹M/žYÑC©CÇä[œ^ªDašYe“IFFÖ)'£˜oÍZ$ŒJLF¤j+Ž„Shó)›5«Ë© øVbXÖ"·ûÛ»×06ÿ]¡ FÄ%:t)6´þ†*DÖñÄ ;‡Ê¡"¬˜¢ “7EwÊÉ(_ÐCåÕ©x–¢´°WkdÅ´ÞSO¡ªJ÷”³.ès ¶†väÖ°ä 5Áx¿p÷�ï~Ðf3M’L¦œS©…€“ƒŠÿÃO¿” FG.ñœrHÉšO ”ЖܡCGL#ÞJV#HUÍzàTω ã4d“ík?Ë\ ^�¼!uÇüàŒÓNÌcã9%™Ç 8’`Š”¤1rΧ!fœUÖdZ<§<¤ÇQ‘Vš6³¥þr*Ù¸ýA ŠDaÊ*mw-ÆøŽŠSÙø8=ŒC–á‚¡d©¸à8“€qÍ N?Xí$åö©�™!¸é¡`M1“³F ¸ ’AkŽ &ºœNç& +hò“Ý\ôW\N-Ùø49¡òÖՌꗠ¡á�ªÔKDHç• z–yÁÛ†"ŠSùûf¿ÔÜeu©rNÛÝn È”[˼ô`iîµ§HßÃW(LÉŒn5Ê_"œƒ¢•f`\Ip™ób}H¬åcFM˜~¡A$DJ5ÀÒ!'7 Ò¬¹�z¼âJ]=ÿ†«væ“Y³i³Ú£˜ED˜x=�‰Áø }2dþ‰è¬*"|Ú‚ì—àJbÎŽjyzÙ90ÎO½Ž÷«N—€BÔÞ8®#4Õ€Ã~Z©ûaYLJœ!6“)(Ož3Ð\6Y|c.S@¿œ2ïr˜œ ìO(¹ ä·Ñ+` C~¯®ˆú¤Z7߯]£Ïuœ¾…Uö¨}µ+~v€ý!q?|¡þÕ_ôïjÜöküôªµN›sìÜ@wt‘|Ü̾v§Ëgö ä)PÜ„TSh«p�­Â”DƒêQ‚»+ÆVWÙâ;S¯„;Gç½9ѵJ µÉ±3 ûŒ|”¬eÆ\xbìœ7æwlnÚòsçOr.‚¨"96û¦ØÜÛr �¾XOÃÞû"7Ђ'¥Ù{_ÃÁÇAµ®2*ä"cón‹Ï¸6rèñ&ÍþÕªä‹kuí¹/rè1¤`¾ÆÁªJ’ã³o®e� É1½À†C�³@ó÷vT$Çæ”6ì¹/rð1D½_¥é)ÖÙ/ 'Q®�46“ìh/˜fqµYTj@Ø%¯w¡xDc(wÂøHN‰¾$Æ"š(¡ÒöR¼>³Ä Õ©“ HŠÍº!Û0±eóO䨙Ôäe£ ß-gÆÂGž¢çKN^9¸ôÎ`ßöŽͬO€n¾àƒ�Ûã‹�Ö \¦¨Abú•£ ÞÙ¸ûÞ@ßÖÔä#|e‘#Ï«‚S˜ · Ÿÿ¡¦¿öÅΔúi¢;/ðO�Þm©)+F/ø ”I„�b¡„Ú†/øPãŽ_k Ÿš²rpÙ'¸ÖHêt-ÏoR>Ê´Sžj7ëJv_…HÙõZ+Ûò¢&Ê·¦ŠûrGØæÂíÃ|°É pú•Z�#‹>ˆ²qsЀ{t‚a pL&¾ƒG'rLgäõî‚ñRóÿ#RM±0“(RIŒœ/Bµm™2ÖJ Ç�rpKU•¦¿)ùÇN$;¥ÚFŽõ¯Rj`på—tôãÓÖ4}&ºÿU’â3oP‘/>ýêðÉu(CÜçY£ÑŸkîVå”ú©Œwç>¨")>ëùâ3®Ÿ\‡ÈG—ÚB•|¹æn�CÚÆön™ðÔGääààÅ_B¥z@QWÃþIñY×—té7©Æ7uQW°|JÅ»×DŽ>Ó°ÿ@²^`+Ä$p:h[^Kh!ßµŠKo„iš÷}ó¾Di^ƒ@ÕW®²ê Æ»¯h8úLtߪTx µ,±hXñ™TתüFß�Û+¥GS“–Žœû99”š¤ÙèûÄúÖM?Pû/ùZ``o¶±+Õq 9ú|ãŽßHéCàé�Ì ¨x™ê4PŒ~i.iЬ$ �±í–o«áRP Í «PGÊ£ÊYàZ±õZ8.Ó¶£[úì“…¼á{×2¦T‘yp„\ôb‡Ì&|Ù„*Ôò`ˆ,wÒ�%¿4HþâDX1o Qi˜8ð€’œ|qºsqãŽß&f\«ø›dJ0&X¨*É)�¸�£Í¥Å´5›ôe“j±ð¥K¹`4¯ ©JbÊÅéÎ ‹ºõºðíW<‹JJóƒFªš˜²‚,�^ £ÀÀ�‡‘ª$¦¬Jw^ظã7‰×)�F™�cÌ(6ïà*I�@ZóRÊZì;A jÊŽPbÆÕÑÝjyüC™Æ©ÃK>ª"¹ùõ lóŒÈះ�??¸ì“‘C�·?÷…Áåù�¾B±Y7µ¾òïm뾑mè\ñù‘óß×üÚ�´�J=XpCÙ¨cráì<™°“½xû_‚cÈ;¤©á"+€µ»`*‰¶àõ9½Ì øá~~韯‰ŒDתl¨­ùäò�ÇTsœ…Ô£87&‡V|65á¤ú#½WþT%з½mã÷P¶ø!nÓ("ç ’¥Ì¨î[ðÎÈþ‡‚;3¯Uü«3XõW|®¤«ïª’®ïæä¼ÀÂÆÑ‘ýò}óÆÑe©rpp%F`ëÆïJ�éÔI‘Àd”ÉE&Œ-|gdÿƒ�þ]‰™×*¾zmè* +PÊŒ[#/ð:Å× “ï©Ià 7”š+�Ò¼!¬À¶ ß-w€HçØÂwEö?,Ôß/\a½Û£{îC¹T0ÞÛ°÷þ±yoÎ…;�” ô6úŸØà;)åRJ°9Ÿ+ØózðÔFÕ;=ððÈywä"Úx¦Îöcè�Æ å0ЈÁj.WÅ&ÐØ0qgâB#MIðî†LUï”য�5úµƒä¤¥Ãç¾·iÏŸ{… .’F.ÕúêUÙŸ u /ýxÓæÿñ�GJFÒŒFUCžR@ ŒÎ›ï�y2�@þv Òè’üÙpÇðÒ�7½þ?þ±ãHÉ l²(08:ÿ­R¼·áHqãhêæO(—j}õªȆۇ—Þ™JZÒz*xºTA ŽÍ›ïm8üd¦Ñz“j”Kµ¼ú(>¯ë()“TBBþÄ?v\+°Ô¼ì[_ý�ª˜o^Œ5ûr…âæ2(›0v€ÃOd¢S�Ò \|ÿÈáÂFß|cº�¾åL<ç ¢\JÊŽ•6úÎgó%ú�ªäm}£o#¹€È ?sP>¦RF¡öƵFwtg�´q#+`fEȤWNPmJ¨ž±E†ë (ѵzhñ?5î¿?zðú,6;c:)5œÿ”¬œ”Ëû©™%Îä÷yŽÏ¸*Ó:¯u÷Q6®eâtG¥†€ (Y)5 % ƒh)«ø-”M(�F�Òq ;˜Æ ¤ÕW£«e÷P6¡æu•¶'"eL€ 2(Y)9 Åû„ 4 ¼ºÔŒQ2ßÖ•Ò¾ÜL }/p}Y ¶˜AZqTøø³’+ì  *�Ë\]U*1HVÁŠ´y ZÉÜÀbþ�6×Ò¯52ÙbR+—ŸêD˜^BÀ³‚¦03ÖBùÍ`ReÞ¹[÷€¤Øì›†ÿŸ¦�¿mÜûWöÅ‚¶«Ë‘MJ�Êc§ÓÖ4ü[`ø €”n?OJ –÷y¦÷ dÔW9ð·âÆÑçI‰A93f³*Å?d:)¥GJºÃåu H™QÖ^­/=Ò *~@ÊŒò•¹Üe�~�@™G Ò 5 <_J È™1¶ï©FàC… ÛèÛddš¦«r ÿ;Û8MR²R²¸e·6­¾“d¢SÀÈËË6–6ú&j14-²wL¸bT¦OfêÝå#c*Í¡ˆ²á&2$4uvb6’ÑLWÌ´‚±ò„­œë,Õ–}#óß1|þû=>œi�“i;'Ó:üá’˜ä¤e§nú]²°‹²Èñ3�O}Ä?r„Zôâ/%Ýpä)”‰«’?Ý2glÎ-c3o }ÂM5ôÅ{:ŸúˆähùnÆ@ögZæŽÍ¹µ(0ÎÒ`¾Ä™ O}˜PxSßÐéš36ûÖ±™7†�®El3·rIW©�j¶Î›£ÈPz³@À |² ‹GBàKœé|êÃþ‘#å“�Œ%ôÅÏt>©k^”+ ”éÖ|¸QÓò]ô滓]« iºã¼±9oÌ…;’�ÆæÞ:�ÝèÛD$í Æf߬„:R�Ææ¾1xz“/ч³×tKHI޹NɉQ£I† F™¯bN�Hn�ôå$TÁ„ªm¡ƒÓU?æ›.ÔFñ7%º¯PüÑ‘sï9÷ŽüI)ïxñK�¾íE½� ú¾¢„:z/ûv~ÇæÔ$ulö-Á¾mí¾i4vÌ!(%ÜÞ{Ùw´}ÛÚ7|SÊ$Â'×åÑØ9o9ï}r¼·iZ¼6AGøäºœ?›WØXhn_šO¬E.ÔÑwy©ðËÇfßèÝÖ¾á›R6>ù’^×½ GŸrr'�÷Ô¦À†Ø¼·îמ{9îNqYàù�:CcÜ耪4îü}¶yú™ëž_„Ú´ãw (È ÇdÙ"ÇžË5Ï8sÃ{@ÉEŽ­mÚþ¤æŒ3É@œ\6 f\^DŸ9À¬ B†ð2Ĉp§@"|¾ÿR®œÆe±øîÔ‹®Îÿzð³O¾á{×àÒÐa§7>øÙ'Ø—Z:„H]îp–ÛLÈ;ÕP ‰µƒñ\·z‚Å}P@õ…û.ùj`è@ó–ŸQ2/X3œRñ§MÉðeR ÿšriÔjYÈG»j86-¯-§·HãkœÎ ¡µ¯�¦$•$îèYóÙ†IæKr¢·ó™OÈ Ì² šD4ÝM‰�uÅ{;Ÿý„'è"@‰´÷¬ùO¬@)Þ;ñÙ;åx—À"0u®+iïåhÍRJ¤Ãª„œÍîè¹/PŽ÷ظ_ÜÀö1ÃÈ\ç;[É8ü·:ó¸ßxª|`Tl–ãìt1�ñßRµÈ+Hõ}C âW³1…â®ÍÕ^qäÜd:~yµCy¨ §;^üH¸> dåd¥ÐLciM~)5ØñÂTœ.¤d¥dõ¡Æ@JQösÈbÒõyUòãte¤·.™O uça(¡…‰5 L v¼ðybóòWY L•@˜Ÿ¹�›èÙˆÛ¯YAŸ‡ürÁžc×!å¨ÒhÈp –åÕ%TÖœ²i«5Ï  (þÑä44 ÍR]~%ç;ÎR(V¨z�®Æ{”œ�ÖPõ+�ÜâŠb%�“Ã]ÆRƒö-9>»bàsŠBŒS ÅŸ4&¡M-Ý<+*‚Š?U[” ÄVĨ禘’{ȃÏB;ÌO”ˆú›�©WàætØl;Ël(›ìxþsøâ0ÐÞöƒv"šº¢ßD V[åà¶?0Î*[N)ë¬89ˆ„¿Œ¡7ýYÈí½—ÅÃVë¡bõ n·Á¶n¡B0Žz‚ 3œeÛÑÆòH™És€µ’ú �6¿UœžnÃMö_“^n&x¨T>ìþ™å˸±" ÖÖ"Ôꉩ5àÙ¼ÞáÔíp.ÔC•o5›aHV¶`¯–‰Ár”���aòoÅùY Œ@aìšXbÔ¯66Ú�uýÄÖ0¨ *rRùš¨€lº‘Ö†t÷Þ*:d”@ Ê(¬&Ь`*,†Š1V½,a渵 óô°VÎ)Áö£[ŸLàZ©ÝknI/JØ[‡mY5Ÿ Ý7ÌÄ€îI†5‡àœb ºñúÁ¹Õ”2&ˆd±• xy†InkwÁ{/A|¥k­èyÅÕŸ�­µ¨Eýµ¦ͼáNá#:˜ †8.À¸8b°t¬¦”MäBý†)%ˆT¸‚Ÿª0¸ úúµ8ʃìì·Ì w.:çö™S.‰„ZGã=Û<¸ãà# Ã~È5 ‘,âÜÀž•f�±tU‡-Ksˆ`17Gˆ&YÍfoKÉèSʤå§ùcr˜‡üelTfS¹‘±�ŒÛ•Ô%TvL&\BÒ‚™×75LziËOÆâ=Ó&-]:ÿ]©tl¯³ûÔû"EÛWvVÁ�g¯â �ñ!ðn�ÓÀ0s@¸+€6L„a\à©È øjhbCô R¹ŠÆ:Woª]¼Y]­–ª*¯ìüméphìÄ”Ž &¶-ØwôiòV©t”î{ÁKéëÉò9¹/‚'H\B=Ý Ü|:YÅNãé�ifÕt™:sÀ8û ¥Ùd|‰Â ” ’f£•ä.�Û¢L—õ¾• ÷úï%ÜöýëSJÈðGRÊ~È,°Íz.Ök õ1¾WÊZžßÐÁºéUÁ êí(1äט<Ãu.bpÉ]г‚±P¤ ’+} KwA§Õ@àÈ}°ô"̽‘õ‘œÙuqC¸ýð© v]„ÊãlaKÔ�Ù­eØkD " Μæ IDATc®aa´ïå|\Ä€ØèXÁìÑË!²‚ΰœZ€²Ÿ@ ”¹ç.�|šñM NÆÎvÐ=qé²…w¼¾çÞÞ�}•ÑX%8lÏñÉ(ìÂépуŽtfÒ"äŠt ©£lÀ¬#ÕË)þÏX^½Ýçd£°R M´ Y›©.(¡FoЬ®K.YôO[÷?°óУL.Bå«U+¦Øc 0wÌì1`©ƒ‰ôN¯»@ "áמjÒ ¬‘ư‚Né«E¤å§)Åò0¸ .QË3_†ž $$-˜qÃEóßþòÎßî9ú´ª*5Z¹q"Û¸µXCxเ8§ ô»kô€‹¨Ÿ™ ˆJiXYÁ˜€ä¤w?0ê312y¯ª€£zË’oñÜ·.:çö­ûî>2¡y(jn$v2�MÔWƒ»¸+¢kµs‹j·�j \`aâ�)¨3ÉÚ,– �Ê«ŒhCw�¬ î‚nb�@ u8âö÷Ô›%ý�çt¯ ú£Ë¾gÙÂ÷äO¦³ñG×}ùti?ä:o;qذqâ ¸Š “Óøj_#=�ç (Ùéøôôo•Z‘Hó¿&¶aaMaÖMy䚈¡z”P�Á™:©Á?>ù�.®8oOë§N Æ— t !í[“mJ b( º­ÓÝü×OÁ:ˆD[�4µ@žU¦-?5©ÁCÍí—àFj Zð¨¨Y:kûyý‹c°ËÀÂ]JÁM[O3°Ì$kÓ!�¬ K@ rQ–ŸêòêŽ “ÐgÅ«jÆ7¼¾d�*6f5�È”Ž&Ã6t“ÇP²÷ì¡!Z1ÊCm$wÁVrIW²» ¯ “Ѓ]üõS�W»<ÔõÏ"þšÓÂh~Y Ô¤gK x‘Hû?|d¬±æ¢1‡±}(RéjÍWÆÝôr%@ïãcÌZ“1bã ”gEÅ^ÆœåÉ‹9½»`éX 5ÿ?|°†´Ê¨�„ü¶á¥U÷ ï. ešL6%—+Žhƺ2ÕVµx°¼áG¤SBˆÁþL²)%ejÁ>+`J‰cÀé½C²:¥^ƒå‘Aµ`¯å="ñ †!ŒåbÕ|ô…u΀™pòij`WÑ@…RÂYf¦IůójÑP9C]•Fôx¨~@¦ûÜP4¥,î~weL2”²`VÐ¥¡‘4§‰Äpv¿½\‘êÖc›âûº“šÔ�½­Ì�ªƒ†¨'è"InàhnÍÌÛÂS†©VVÀ”T?y KCðhLN9ˆ:b­?S§�#ày„9v'¶¡ À  úBgVÜÜÓ²ów6 f# õmTk¡ƒÔw ¡�iÙ @ó4ÉhA$KV(ë ŒüMùª. .œ„«�ö€Z—»ªñʨ…§P ²áÎÑ9oí¾ºñÈ­ÛÉÒáU$�μqtö²‘ þxoãþ¿Fÿ©9÷ )¶Í1ƒ¡*¢î-ª�ÄLì~ÖLŒ`‡8üêÔBÞØªVÐéÈ `Œ1@å·ÐA¦¸Ÿ¸¢ÉÇ‚}ÛýñŽ\Ó®ž÷öæ½ömKN^>xîû¤l¢áسî•S,œ÷‘¦«ú.kmµ ÂþäTV 2Ñ31d(…‰È1"*+€­/[äÏšRã+QJSµ·—=ØC¸Ëäg?&§{—}ž1‹*G».�{¶éàC*’Æf\§"ßè´«"§Ö£l’šrþÆÞ%ŸHL^ J.züÙ–]÷H™±Dç’áï”’CÉÎÅ GŸIŽM½<|jCÇæ¨g–ßÚ—‰NIµŸ 5¡e÷ÝRzT@åÀëÛxTtE§ é¯Ó „‰8XØ¢CH%Þ®˜Œ2¥LgÀPã|²©Öº LÒzžK¨Iüå“�9”ð¦¿�re“¾lR•ü*óÓ¬¢JCgèð£ *‰É+S·ì¾;Ö}MÎßè£RB(Ö}eó¾ûÚžþ—t´kpñ‡‘ܶõ§�nìn=útô䋽~,zä‰Î—îê_ò‰Tcwpô 4:ãúŽ×Øùòw2‘ ýK?3¸à޶­ÿãjœÊCMƒÖU‘Á6åƒøÚ3bHB?{Ì!–ÑÐN�S8e]¹Ma!¢„«5!±G ‚A7è"Á<¾ËÉ!@2J�æÂ†ç½=zðoÁ�]±é×(¾ˆ¥Š`ßΦ}E¹T8Ñ›=ðàȜ۳áû�œ öm„|©¡Èé—ý±SR.¥›a@¨wKøô˪?ÞÓxèÑ¡ïʆ۹"]Î"˜{²Šô×ËvË)=Ø#†¢wÁjΠ”Œ™0¥ÃM-›»ŒÄà}ãhü£0ì’Ãç¼EŠ÷6}ªÐH%0zåÒùßþ±ãŠäËÛRÒr6JåRRf T@$åÅú“}HUò¹¤d¿*ùsÁ6jæaœéÿ4ºÓårä@tͨ¼vÇ* >™¾@¸˜ÓåöÐ5I= c-4mêQB½‚½+KÙ$¨¹ÑiW$',nÝuÊ&Ô`¤LÜŽ^ (9PUª¹¬!�ªY¶€�¤ žGσ¨ôàH,ÀxaÝ)d<�/2×y”P¿`îÈRzÔ7v*>õò衇#P²í\99(gÆ,óf§«²¿ð;:UR²R¢ß² ™èUwIJVJsyð`:¡0àµÏ Eš±°ò†,µÁ ¸jãXÁ¢fù,'ò(¡NA¼Ï‰‰K�_ÿ›Ä”‹ËI•tôØ3R6®JþtËœ‘Y7�θ!rl-Ê&(¹òH¶/™uk.Ô‘œ°xtöÂg6ùËÆ½Ø‘Lƒ–Të¼Ñ™7rͺ5tæUŸ‰H™=ˆ„Ñ‹!ÀÐû …*TøCy@éÀ>³úÛC 﨨_‡Àðy†ôÀÏ„– hI‘î:&%2¦Ñ�¶>k:åy u†\xÂðÜÛc“/Î[}ñžÆƒ5~ )Æo‘š‘ wŽÎ~ÃH÷UMGžhÝñ+çád’@É#3nÐîóÜxä '´.0_ø‘Ùoí¾ªñÈmuUøñ#°à®^x�wι*¾˜7Ecqh‰ñ À£„:’Fg\—‰LlßúS9Þ“˜¸dhÞ;åL,zìz¾øÄå}},Ô¿Ãïá�ÙÏ…ÚÎ}Ë®ßùãguécS×ä÷yõoOLZ–ßç9z|­m]Âê ¯Gí~ Ô®pÑ5*`r•,— Ùa|bÜœ³î ö¬ù‚G uUiÙuwé(;‘ì¸ Õ¶ zìYzß ÷o�²öã\;6—u"_¦qš*É5áb986õòÆãk›ý­´ÏóX÷U §7XìóLÐUø¬(�†ÂkùQ¸®‚Àcž@�ªªø{—Ü/nôݺû÷Rz,1ñ¢¡ùï”SC‰ å�¾#§6´oþ€Ú³â®Àà¾ltJÒÉFßî±Báí31¾X}ÖˆîPV.x” ;Žo»ï�:òæÿ¸‘1¥Š|ª?"gF,SÚØ±Ùž@%ÍE:ƒ‡U‰OZ‘ìXÔ²ûžX÷Õ–û<“ \ ©ðåòW¤ðL»^Ÿ�ë¾²yß}SŸùp::e`ч‘ܶí¡¸ÑwÉÂFß×}¹ï¢;ÓMÓ#‡ó}Oxý‡nô]¾`&œ�dâ-_`&eô(A$¾rïg+©.6ye6Ô>µ‘cb€™T9Ø»ôÓ‰öó�ê�œºìß@UB;'lú¾¤ÙhÁ 0¿Ï³”)ïóÜ›~5}ŸgŠ.ák ð»^Ÿ…óõïlÞ~£ïÆüFßûÿrz,Ô¿#¿ÑwCq£o%Д�2…û¶„„lôÍÏ ¬ï+0ú À$�%ˆbÀ«5Ø‚B �êñÎ%ƒ ÞÓ²÷¾àà>7ä£\ªcó©’?j¸ð£­[ÿ7;�”ŒDë!U•Ãç¼ENô5{:Ý0¥tÁ†.áëºðãU`�óFß­…�¾sråRR6VÞèøå�¾åd¿*ù•PØ àf…âèžÉW`RÎF3¦èÍ#`~#¡p‡/pf- ¸#ð¦‘éÆ�¾ã�K°]4Ù¶pxæ-¹P{¢cÑèì7Dz^ÕlôMDªuÞÈŒ”°f£ï¸µGh�j³Òoª@|*bFã7x�£z‚âoŒM]£ø£ƒóß=8ÿÝù“R6>qýWBý; ‰p»(çBí§‹;6':—ϸ)Ô¿½ó•ïHlO¾� §×+;£#sn\p‡/Ñײÿ>ã>Ïœ0 lt&�«ð�ÇEþ,˜ÛÑ0:÷M�ûþÜx\ÿÞ y£ïlÓôãWý”\㉵†�¾Iˆžx!Û4ýøüÂFß­»ï!}s}J/¦±É*±n€-ˆL¯ª�¦é�a'4sÅ ù_÷}âQöå�1^uyðà¡bP}¡3+î (¼žŸn;µV’Ê’¶ø ¼ÀÄš‰ 6±´´4 ¥kž—pö"n?ué¿e"Í—äDï”ç?íKØZ¶Q]^áëK`%À»Š”Y&ãl3×$ÆÄÈê{¨ÄòbÒ2­Hõ(áì…œš¸îKªä7_BJFfãòëÂô7¤dmè.°’ºÎB�B~€ë§–"]0ô\‰M».³±-­6dgLáQÂY %ç;Q¯º¼Â×—@×€]^ã+p%®2+äA}UÍ�¶�á`¥³M¸õ¶�ã(›œ”ßès  Uóñ§º˜g�Á=Vž÷ 鬹¡�J¨¼Ñ§Ãvy<.ñà€stÏ&­ª¬ÀüÒ²9£1³:¤'f´’&¸Ö̽«¨©Êzü䡚@©âhÁ+°KŽõ¦í÷@}„TUQ]À}?l>Ð5G=5W ³YÁ½ðWúüKËú¹>b¼“àÍ%x¨Øäôš ÔR�L‡jø·ž!ÚW¨>+fvlèû¥G ÐÞ<ó¼YoœÚya0ÐOì>òøöd‹Ÿùõà¡Á@O¥o”^Š­krÅ ÜßÄfNhC>á]:;Ä�‡G N��4¡u^"5ôÌ«ÿ–J�vMX´hî[É¡=GŸ¨vÑ+ññÝ4«•§ŒJØq|ÛŸï|Ä¡�·üçM,Éü¾ðœiWFBmÇz6y|àáìé Ñ5Fˆz·Ù´ô‡®×mVÐ¥³þ *`SŒJøêŸ?W-3&¯¼bÉgeÙ?2vrÝÖŸœ.}ªÚƒ‡³yª(òBMpƒ?�[ŒcV›/¦Y¿êPÆø§„ÊàDï–žû¸ßîš°øÒÅÿúêî{ö}²Ú…òà¡f€4ÿ©¢?am§8b®5©`›ÀúSvÆ\Å\_³�D!“M Ž€ÞÁ=ÃÜiW<ùR&kg¿YÆ9v-«â+d‚?�ç2+èTv^LcüšxmŠBI’$Uò½?êU}HsÜbŠË±8Usj1æâ�Š˜Sú?ÏKp ¿/¼pæMc‰Þ‘Ø)UÉuu^8gê;=”Éx.‚Th,AJ¼aªžô…Q?ŸjÓËNßJÃæô(Á)%'Kþ%óÞ�tªª:;ñÚžßï9òDÕ£¥<ÔÍúòéõµTNo�pzì¼|`È©ÍïQ‚Sä”ôk{þðÚž?T» <Ô=Bµ0ùl6èÌ)+€ùåGí–éÍ%xðà¡–P…éc˜Ý¾þ¿î_ÞŒÄùûð(Áƒµ„B‚Ì4“:ArÀ+ؘ�.f gµÏ %ˆ„óפ=xð�*­U­ˆ.1r ÿòe³ST¢!< ^zð(Áƒµ AëDÙ•UEŒ¦–6Ë óˆ2˜èÁ£<Ô.*÷您×l‰rÎ `&š$Â[ €ô7I£Ó¯U‘otÚ• §7 l’šSÍù{.º3>i(¹Æk[wÿ^ÊŒ%:/œ÷95œ˜°(zìY�ä±®Ë"§7NØòßêée_ íÏD§$ÛBÑ/¶î¹GJ� ¨¼à:+ U¼ýÅ àö§=J ·÷yFÙ¤/›T%¿ÊdTÑ\¤3tø1P•ø¤ÉŽE­{î›vuÎßè£SBcÓ®hÙÿ—ög?’ŽNé¿à_T$·oû_H7v·ûuôä‹=‹?ÚxôÉIë¿Ò{áÇS�ÝÁÑ#€ÐÈôë:7ÿ¿‰¯|7™Ð{ѧæ¿§}ÛO½8•ç(EýNc®¨ì(ØŠó1Ä» Zx” tƒ.ÌÓN99H–2£¹ð„¡sÞÖxèáÐàî±î«_Ä2o¨góþûQ.Nô6|hxömÙp;Èé±Pÿ@È—j8ý²?vJÊ¥”@S>W¸okøÌ+ª?ÞÓtø±Áùï̆۹"]—BàöÂ#A/2 á]WŠèQÂø‡”M‚š�vE¢cQëî{P6¡¢ ÙÚ÷­°PÉxEU —1¤Q‘ÆûD’Z¹åƒ<Ô"œ¿ƒ†JB�ù´È‡Ë£„ñ)=ê‹�Žu]Öxø‘àÈ!”l;WNÊ™1˼éÆnUöçg¢S%%+%¬s5LVå@1Wc.ØQ‘!†H%B<2­#�Æâ�KŽ^û«øä•¥3HI7{FÊÆUÉŸjž=<ó¦‘é×7e”\y$Ûϼ%jOt,™uk¤çU²ß² ©Öy#3n(äšyK¸ç5_Â:—µ·âGN?aD–! ´Þôr�!j?µê™ðDUò':—ϸ)Ô¿}â¦ïJ%ûŽ� ’¡s4œ^Ÿó7ŒÌ¹}pÁ¾D_Ëþû�?£“‹ËªÒ²÷O™ÆîcWþ¸´ë…CÑ“/fš¦›÷Pr�'_hÝ}··Üȃx Â4™+²]˜½u8Ϭ“¤9f+ðÏfÏZycþןï|¤b«e*©«’¯õb‡ê �^þ¥àðAÆ×ª=xpÜ¢„¢pÛ�UÜ?N¥q£'Bày nÊ /päA$P69yÝ—ª] jbÃGZA`9ß\A§G ÷‡…8òàÁCýõ•¨î-q5½µæúÇ]Í0ÃóÏnl]¿…? Žcà>oQi_Á�ê H™~]&2±cÛÿÊñžÄÄ%ƒç¼CÎĢǞ¡ç³·cs¹P[ÿÂ÷µî¾Û?Ã"ÐÉ>ÏX]ÂÖuáÇ·@GpÕ–VÔPW“7ä£\j–©’?jï_ü¯mÛ~ˆ�@JF¢Žõ °×ìóœn˜Rº`C—p�u]øñ*0úFß99HÙè;o8‹}·¹B ¸;ª”::Ïé–s&lúû>Ï$]ÂÖuáDZ@,B*0mô]ŒÈ»²ÑwEÝŒ²Š²‚÷^B½I#3nè;ÿC­»ïn9ðËg•„“}ž+#°’º<�\ÅmôíÚ®®U{m rŠ=J¨'¨’opî[¾·éÈß#GRͳS-sSͳT_¸”†´‹²mø=]Ï}<0z”%1Ë>Ï\º„ ¬ëÂ��.mô�,nô-ÇÝÞèÛmõm‹ ±‚8ª'(þÆØÔ5Š?:8ÿ݃óß�?)eã“6|5Ô¿£�·‹²õŽÍœ ´Þç™ÂÖuáǃ@77únÙ5.6úÆÇŠ*Aòö^öàÁC]°ѷf?cWì¦Øm“i*ˆÇ.ª.ÁóÎ^äÂí'W?™h¾$'z»^øŒ/!lÙ†p]^áëK`@xçË]mÕP´ɲmx”pöBN MZ—*aúR²²Ð9:ẼÂ×—Àʢʟ ² žr»E %œÅPrþ±õªË+|} ôÀN6O %xðà¡.Qí�¾«;2'ÊÃ^ytóü%xðàÁ3Ü'_µ0,T%e£­gõ(Áƒãõ:‡` ›³ó*ƒ÷ªšÆ\Ø*Ù‰\º*¥Þ£³yß½»?fY ¿/tÍò/ ŒÞ¸ý–Ú=xðÀ #UÕ ‚y”à"UyfÓ÷žEÿ7à�^»ü.�¹²¹äHìT25"¤œ>9pÕk ¥— IDAT²/>µ~Ï‘¿ èÁÃxF§,ÜWíQ‚»PUEUAQ²\wÒ2Wÿð¡GÖ}APÁç G‚­¢¤yð0^Qa.¨ÆËËã”ü¾ÐÕ˾pz`gcdRׄE~_äTß¶ ;~>; >9°`ÆMóg\ O‹÷ì>òøÎC�æ”´ß¾jéç¦v^Û<˜L�?û6¿/¼qÇ/Gb'/š÷ŽDj¸k¢}Çž•$yv×eGNo|qËg²‰¦†ÉKæ¿kJÇ¡@s"5¸çèS[÷ß—±» $Ð’ï^4ç-’$«ª²qÇ/¶x@Sëðâ¹o�7ýŸ2wÚ•§¶?ô§³¹”¢d:Zæ´4vï;öëC'_¼tñG÷}ò±õ_¹ìÂ�·6v÷ îÉd'z·lÙ÷—Dj°£yöÊóÿ)•Ù~ð!‡4CuӮ߽¶ûž¦†)×,×½¤ƒ�´xî[gu]úüë?ì>Ø=qÙÒw i¾Z¦ÿÖcVI§³qŸÌæRélLUT„$›/˜ó¦îI+#¡V�%ÿáSë+QC ÂÁÖ€/<8z,¨¨ÊàÈÑæh™G�d³IPÿ?{wßVyç�þy΢]²eE’eÇK;v!‹³_¶@ËZ2…vÒ eúšá5}q[.ü.3Ãm™)÷Gï\úkí ¦ËZ&½ó ô× M¡MÈ�’=$qœØY¼¯²eÉÚ—sÎsÿ�bLl˲-É–ôy¿x½�ŽÎóœç(²¾z–s¾„E¢>Ž(Çg¹‘�Ni‰GŸ]ÛšÏ!AV®OÓJ!ŒM>*Â>³Q–c쳉8EfŒBS”q `9NØxÃßuöƒ'¿?âmgŒm¼ñotê’tœÁ $²ÔŽ£0yüIMþn@N›ãÒ„k îRµ`Ä-ÉáEE5c[,¦%’ ¤�åuRjQo)Zr©ëƒáÑ« S8N0Nv—ùL Eܲ5+âO)åŠ e)^ÜÂcLá91“ €f²¯‡‚ ¡ˆçjÏÞP³­Ú±E«6W;6ÝX³­½ïÏ¡k·€5Ï«xNÆ%4NB’£¡Èh…}]‘¡Ü¤w¬©ßá°¬¼nŽ ”p'Pzý?B…­qÇ]»ª'K•C°óž×üAç{G¿ë¹6@?©˜:yñß7Þð7_Úú“pÄÛÚµÿBÇâ�WݺúÉÊÒ ‚ ¡„ZKêWÕ}Ùëïûã‰q�­¢”~6m’R¾ààÖÆ§+K7RÊQB×-¤±á«þ óýcÿÕíë<ÕòºÂä[ךÕJrL/ÌE^]ă�  �€� ˜^NƒÖvãÒmuw^êúàxó.¤ ($ù’5½„´¨´oøâm?Òk­þ sú½ 7eÿ[?Ë3×½„´èw�Ûsè©PÄ}çºld‹È�‚ ™Îó“Â1)Ìsbž-G€BS!!k7´˜�  7Ä¿½0—  Ó›nn9O† ! bz9ÓtË}[ž7hí<'VØÖ-¯¾ÀuþO'_@†KÈ- i »Þ<ðø|·æW>\ÃŒ�#€*û!Òiî—IÌ#„È9?�¿ $@B$ $@B$ $@®^Î=’Öæ]ºÍ[q§©ëƒ’æ]Xgé‚^BŽ Ú7ôÞö£˜Ö*"Ï3¤z 9Fë:W~è)>âv¦œç™ š�õßQ{®Ä eá’„RCïasëk\ÔÇÍÀúokG.Ät¥!ë*EÐi†›,Í¿„EÐzê¶ûª>Ïxµvð”zôJȺÖ~üy·óÈS i–é<ÏT R˜q"›QÊJ½UwÛμd?ñBLgZûôHÃ#–¦— !„rž%Û5½l=ó’¬.\÷Œ»a§õô�)ažºí�ò[¬Ÿ¼¨m Ø×�,ÿšÊ×5·“€ !!Ͳ–çy¦Iœ´Ãç´ƒ'abÐiêØçnxXÒZ„¨—¢ñ\Ò÷!LáÃ#º¡Óû&êN :6™:öêOBL]û£æº¨¾<§ æ …¦L‰?æÃ.Ɖ²Úœx)8H•Xb?)B(O('©ÍŠ UùºÛ™"z»hž$€É!$ FÇõ)Ç¡c_ðcñ`úÇLUÝõ;ˆ"û>2·ì¦LfDœòHL)ny�0yhÍР׏/êû�ÆŒ˜^Èg 9†»'Íó¬H8Þ_~«nà˜õìO aSåyžõI@Ö $¤SsOS¦s/�ǨÀD›þÛvÖ›ý[‹¯¼e9øÍ¨¡ÌuÓãŒò–¦W!QceI÷¯ }‡�«Ÿ0v}Pzä»CkžŒ+վΩò<ãN3E³>‹��NϽ1“ßàspl’4%º�c3øØÌpªXãºPte•#ÚÐ�©í�Ñ¥JZ !„�ú5®fB©ñ莋�~NŽ(*S¼Ô¤yž1f°ðaÅQ® ÚGv]~Kí¾œ¹£¨|�c·>ý= 'Ä36S%ÊKA¢HTŽpR€0…Fhâã”$Ï3,(×ýJD/!Ñ€c‹kåcEmïuîËrÏ’Æs2+×ò03…È×§nN–猉– ¹†rÞª{Ü˶—´ì6v ×~ŒgHÔXÉx1ÞQˆÇ36+Ý4¥ôÆ«¨!©åy€G¹„q‚»nûÈŠGM�﫼�‘¢¥‘âºHQ ´cûL•{9¹©J…KVŒ.y ‘±¹f›ÎyJ 'ËØ7Ó<Ï0•,÷¯ÑKÈ%Šh ,¾] î†�î†�ñ�œ,=úœÆÕœØi²ÜË³ÌØÌ”âK¿‰+»ïøÙØ"T¢L¿phÒ<Ïs=yÈ%…|È BÂ\QÊÕWÝmÔÙ�4½â:Û×.Û�.O— uḭ–¤Çƒ�0WŒ)§ÆåC ô:,+mæ†+Ýnò Lò°‚ Ù̇ÌQA%ê")äC€Ü’ýLÈÙW!!›wB­rlÒiJ:Ž¡‹9+ŽÒ©ÂÖØØ°óìå·†3™ C ¢—�”ÐjÇ–Í+;ßöNKç>t í²0r…��åê«îY½lûÉ–Ý—»° çC˜�i¯®@H˜+ŽVÕ~yeíƒç¯¾íöv.*ZJQ˜ì ôÇÆÒX@V ð¬¥rµBÂ\©EcíâÛÕ¢¡±agãµ|ÈQ)øþÑçÆò!@>™¿È“é##$ÌU(â~ãÀ7æ»P(2°â U äNG³hFŠErÏŒ¢Bê;#$¤ÓÜ/“HQŠ_ô3 ˜K˜¹…±¶iìë~Ò¶Ìb| ½€œG'<�Ý´z 3°0º“HËÔ7z �€�  �€¹„Ü#imÞ¥Û¼wšº>(iÞµP6 ÷ —�c‚ö ½·ý(¦µŠAç|·ò z 9Fë:W~è)>âv®{&Å"LÐ ¬ÿŽÚs%f( —¬ ”z›[_ã¢>&hÖ[;r!¦+ YW)‚N3Üdiþ¥ „(‚ÖS·ÝWõyÆ«µƒ§Ô£WBÖµöãÏs¸Ã+@žBHH³Lçy¦RX�Œٌ–œQê­ºÛvæ%û‰b:ëÐÚ§G±4½L!”ó,Ù¶¨éeë™—duñàºgÜ ;­§L óÔm”ßbýäEõh[À¾~dù×T¾®¹�,h i–½<Ï3\„¬>§wÃÃ’Ö"D½„�ç’¾ÿa Ñ �Ø70Q§pbбÉÔ±W7x‚bêÚ5×Eõå™8X 0—P(Äð0½–î�»'Êjsâ¥à Ub‰ý¤¡<¡œ¤6+‚VåëNlgŠèí¢ ä>� A>þ9 $ FÇõ)Ç¡c_ðcñ`2·ì¦LfDœòHL)ny�0yhÍР׏/êû�ÆŒ˜^Èg 9†»x<ɺÁ“Uû�¸�“‚%Í»}òâø�T ;>~vü–â«{Нî_¤¤yWü©§ö¡˜Á1§Öä™{[ÔÙÂÀ¤†ãcÆJ.ê£rt¾›™‚^LŽqÂè’ÄÐ�ÚÝJ™âwlÚ×[š_¥Lžï¦@¦ $Àä(S8%êY¶=ª/#/úûÌ-»õ=‡æ»]�A ùoâ„AJ˜bjßkjŸëý9 ‡`.ò ®�™ „H@H€„H@H€É1AÓ¿å{îå�`l p`ÅQŽ‘µVOíƒÇfYm‚NSû»¦Ž}T‘¦-ˆŒÍ0-„„œB9oÕÝ1�}QÓ+|в7º—íàcC÷�äå‚ö CkžÐ¸š‘± còágBBNaйe÷Ø3U 7dY67º&ÿ8Î"c3!„0&‹FçÚ§‚¥‰"{?4·¼ÎÅü!ÛZwý>2²®2t$ï/¿U7pÌzö§„°©ò<Ïú¤ kÒ©¹§)Ó¹—ÇcT`¢Ž�Mÿm;ëŒÍþŠ­ÅWÞ²üfÔPæºéqFyKÓ+„�¨±²¤ûW†¾ÃÎÕO»>(=òÝ¡5OFŒ•j_çTyžq' Èyw³»O!$¤ÓsoÌä7øœ›$M‰nàØ >Ÿ3œ*Ö¸.]ÙCåˆ64dj{gt郒ÖBá£~�«™P*D<ú�ãb Ÿ“#ŠÊ/5ižgŒY,|Xq”«‚¶Æ‘†�E—ßR»/gî(*_çØ­OE� ñŒÍT‰òR�(•#œ L!„šø8%Éó �§ò¤Û€^B.¢Ç×ÊÇŠÚÞ)êÜ—åÏ"�çdV®åaf ‘¯OÝœ,Ï3,` ¹†rÞª{Ü˶—´ì6v ×~ŒgHÔXÉx1ÞQˆÇ36+Ý4¥ôÆ«¨!©åyÈ9ù:�€�£\Â8Á]·}dÅ£¦Î÷UÞÎHÑÒHq]¤¨† Ú±}¦Ê½œÜT¥Â%+F—<�ÈØ\³Mç<%†“elŽ›ižgX ÐKÈ%Šh ,¾] î†�î†�ñ�œ,=úœÆÕœØi²ÜË³ÌØÌ”âK¿‰+»ïøÙØ"T¢L¿phÒ<Ïs=yȘïFÌ BBzĤ�Û×Ir·ªD}]ÅçÚúþ“‚óÝ.€Àu éF)¥ÇqH@9½„¹íŠ%÷ûCCÞ@?SärÛšÚÅ[›Û߉ÅÐE€ƒ�0WŠ"óœØXÿUƒÎÆózO·¾ÞÚ¹+Žò[^þ…#$Ì•¬DO·þútë¯ç»!s…¹H@H€„„tšûeÒó!òR^ÎþfB$ $@BÀŒåë°B$ $@®^Î=’Öæ]ºÍ[q§©ëƒ’æ]ùÛ…Xøòí¯½„´oè½íG1­U :ç»-*ßâÀ8è%ä­ë\ù¡§øˆÛ¹.ÕlqLÐ ¬ÿŽÚs%f( —¬ ”z›[_ã¢>&hÖ[;r!¦+ YW)‚N3Üdiþ¥ „(‚ÖS·ÝWõyÆ«µƒ§Ô£WBÖµöãÏsR(“§ó!!Í2�ç™JaA 3Ndd&ù(õVÝm;ó’ýÄ 1�uhíÓ# �Xš^&„Êy–l[Ôô²õÌK²ºxpÝ3î†�ÖÓ?¦„yê¶Êo±~ò¢z´-`_?²ük*_×ÜN4„„4Kþ…žN3ÌУ>§wÃÃ’Ö"D½„�ç’¾ÿa Ñ �Ø70Q§pbбÉÔ±W7x‚bêÚ5×Eõå™8€tËã¡�ÌÂ\B¡ÃÔ)ñÇ|ØÅ8QV›/©Kì'Eå å$µY´*_wb;SDo2ÅŒ“‡�!¡P0:®GH9Fȧ©@ÇâÁx”^ÿyg2ayø7c ETï`¼*þ8f(ç‰ �$Ù_ˆ¸y95V$žSN2”Ílr BB¾ Ú»îÚtlºn{Ä\ï­¾WÖXB‹Vy—< užB®$õða·nð¸·ú AûYmö—ßæ/¿-“ €ù‡éå#k,ý[ž�iíŒC¶u£Õ÷k\çí'_øta(¥ŒpgŸ }‡c¦ªîúD‘�}™[vS&3"Ny$¦·¼N˜<´æ EÐkÜõýGcFL/ÃB‡Á͹@HÈ1|صøÀãIvÐ ž¬ÚÿèÄíœ,iÞµè“Ço¤RØññ³ã·_ÝS|uÏø"%Í»âO=µÅ Ž9µ6 Aj8>f¬ä¢>*Gç»)�)è%Àä'Œ.y@ ©Ý­”)~Çæ }½¥ùUÊäùnÀ‚‘w£T 09ÊN‰z–m�êËÇ‹þ>sËn}Ï¡ùndBBþ›8a�¦˜Ú÷šÚçz€<•wBæ` B$ $ÌJ>!$ÌT>FBBL… šþ-ßs/dƷလ…G9FÖZ=µ›eµY:Míïš:öQEš¶ 26À´r å¼UwÇtöEM¯ðAgÈÞè^¶ƒ� Ý’— Ú7 ­yBãjFÆfH!!§0Åܲ{ì™*в¬ › Ý“ÿêŸEÆfBaL�εOK7E6ö~hny�‹ùC¶µîú|d4d]eè>H8Þ_~«nà˜õìO aSåyžõI@Ö $¤SsOS¦s/�ǨÀD›þÛvÖ›ý[‹¯¼e9øÍ¨¡ÌuÓãŒò–¦W!QceI÷¯ }‡�«Ÿ0v}Pzä»CkžŒ+վΩò<ãN BB:=÷ÆL~ƒÏYÀ±IÒ”èŽÍ`b`†SÅ×…¢+{¨ц†LmïŒ.}PÒZ!|Ô¯q5J…ˆG?p\ ôsrDQ™â¥&ÍóŒ1+€…+ŽrUÐÖ8Ò°³èò[j÷åÌEåë»õ©èïQ8!ž±™*Q^ E¢r„“„)„0B§$yž`!C/!Ñ€c‹kåcEmïuîËòÚ!Ïɬ\ËÃÌ"_Ÿº9YžgXÀr å¼U÷¸—m/iÙmì>@®ýÏ�¨±’ñb¼£3,ŽglV ºiJéŒWQ9BRËó Žr ãwÝö‘�š:ßWy;#EK#Åu‘¢&hÇö™*÷rrS• —¬]ò@"csÍ6�ó”N–±9n¦yžrOž^؃^B.QDc`ñíŠhp7ìt7ìŒoä¤`éÑç4®æÄN“å^žeÆf¦_úMÌXÙ}ÇÏÆ¡eú…C“æyžëÉ@æÑšM÷ŽñÔÞÔ—?LŠ š� ϪGÛp�4ÌFHb¢+ƒ‡`ùúéÆÀ$ $Ì#ùÜFH€L/C:Í2Ï3, è%@žÉßa�ÌCH€„€Tå}!`Fò9. $@BVWYŠ–ÜXóÅŶ5j•)ié|ïüÕ·%9J1h­+k¬vlÖªÍþ ³¹ýÝ‹û”R ŒÉçðY‘½�@)g5ׇ"ž§~‰úÊ­«VÕm…=­]û)åê«î6êìGš^ñ�‹í�k—íˆÆ—§K) i”½�À˜ÒÒñÞØSp°Ú±Å¤wPBSN�K)<èuXVÚÌ Wºæí�DžÏ„„¬å mmÅ:MI·óäÄ/}Ž *QI!¥0@v-ô©ñöÍ:eÕgBBî„ZíØ´µñy^ôúû>>÷ó�±[:�S娤ӔtC ul܃ÙE…lßТwèìÛ‡žm¹uõ-«¿uªåµÖ®ÆïPakllØyöò›Ã™L) e;$Ĥ�Û×Ir·ªD}]ÅçÚúþ“‚„JhµcËæ•��o{§¥sºY6·½£”RŽã¸x¢vŽrõU÷¬^¶ýdËîËÝX†S ÀDÙ ¢ ]±ä~hÈègŠ\n[S»xksû;±X�ã„Uµ_^Yûàù«o»½�‹Š–B&{ý±±L�Ó+ÜÑ6áé,¦²Eæ9±±þ«��1æ ôžn}½µs?#L#kß® � ;¯¥ŽJÁ÷�>7éü3@öB´É^H�•èéÖ_ŸnýõÄ—B÷¾‘µ–À¤p�#€|ÂæÒŸAH€„ù s¿LÒ½H@H˜^Ž,7bÌ B$ $@B-ibW IDAT$Ìß=Ž2I4Ÿßð숷ãØùWsâöy”ÐÆå;K-7¼ôÿNrŽr[×ýcMÙÍ„Ɣӭ¿þ¤õ××� ½dù�ÿpæòo/vì›ö¸9÷F@FågHÈW SœüþAúßT¢á® ÿ4é>’öúÃoZŽ(ðª;×»£ÿHkçûi©2& w9BHÈ1Œ)ŒE‘¦ZQàmßûñ·Óu8AÐêÔætÕ \>‡ž—?R_ùyQÐt ž<ÞüoþÐ!DàUË«ïo¨¾Ç µúƒÎ–Î÷.´ÿAV¢‹ŠkïÚðìGgþµÛy*^C…­ñæÕßúã‰r_â(·¤ìæ—~Ñl¬ŠÆ—{œ½ôÛ¨í�ëžYl[Kiºú»pÔ³r郢 =ÖüoÚ?U)BˆZe\³ì¯––ß* ÚÞ¡3‘èœ~×LJžVÕþ%ÇñŒ)Çš_mºúöØ«¢ ]]·½¾êó¯î<5¶Ûðh›À«tZ‹?4Ô?|î¦Ú‡ìæåm¡Ã6s=Ï }Cg !Zu±Ak[U÷—7Õ})^Š$44VÕh ÇrŽ=MRŠãžS�\k†,Ç<¾n«¹.ïƒVmV Z·¯;þTaŠÛÛUdø4$LúFe¢%°ÀåsH�•Ø$[›|èƒ1Bˆ?ä¹XåØÔ5x¼²tƒÓÝÿŠgŒ¢¿°«kðøø"ñßÑŸQŽ1&æPS”*1U'y�òÙŸöiD)½î„&�?øäož‚»T-qKrxQQÍØ‹i‰$GñAEîì?²¨¨Ö^²ÂZ¼¬½ïcE‘ !áè¨?4\d( ††ýAgâ¿Ð�2.L”¤T(:“£&½#¾'åø"CY†FéC·,GÍÆŠÄ±(Wd(KqucŒ1…çÄŒ´ ˜‚ ¡ˆçjÏÞP³­Ú±E«6W;6ÝX³­½ïÏ¡°+¾ÃàHKL ­®Û.Ia§§5¾1 ´t¾W»øöÕËþªÈPnÔ—V•nj¨¾‡ãÝ,APó¼ŠçDAÐŽ+I©Px¤Çyò†šm‹mkuš’†ª{J-+¯kj…­qÇ]»ª›&žGJ8Ž(ýÌ7;%T£2ðœ ðžS%N9ìî<¾¢ú •ö ZµyiùmKËoKñí’äp0WȾÙü©æóÀѤSÎ]ù�˜Z·ü£Îî _ìØ×Üþ®Â”ø‘¨·gè“Uuyöòo#ã.øºÜ} õ¯\úÅ›j"„xý-�ï¦uö{6?_¤wPÊBvÞóš?è|ïèw=¾î$¥¦œjy�1ekãÓ<§îqž<ßöv¹uõgÚJ)%ÜøW�WݺúÉÊÒ ‚ ¡„ZKêWÕ}Ùëïûã‰ñ·6>]Yº‘RŽºnù#� _õ�ïû¯n_ç©–×&ߺæ QÐ;Ý;û�ËI bRèèù_n¼áëqë§”»Ú{èðÙŸ²Œ�qÀü¢5›î‹?z㩽YX”ýcÁD7Õ>Ta_·ÿØóInž�‹3…ƒeãÿ¿ WbO˜%¥³è&ÜÀp_l¬ŒD}²�ï¶äŒ0-¸�£Äq Kð‡†œîVÆ”jÇæJûúcͯ&Ÿ€\CçÞÉÿ�€A*ÂY‰®^¶½H_Æqü¨¿ïTËî«=‡æ»Y�9³ìÕäH…)Ú÷^hŸëD ïa. dôº™\˜a¦“<š ä“9E.ô !0p”­íÆ¥Ûê*î¼ÔõÁñæ]È3¹½„4¨´oøâm?Òk­þ sú½ ‡åÂóZ‰^Bô»Îí9ôT(â¾sÝ3óÝ€‚†îùDHÈtžç˜ŽIažsåÀ¤ "$d톳¹ñ @:¤áG˜K€1ÑK€‘–_ʹkîãè%ÌH>#$@ŽÒ@§±Ü·åyƒÖÎsb…mÝòêû\çÿtò¤±È3y?0…��Á°ëÍ�Ïw+æ G�€�  é4÷ˤæBÀ äóT„ƒ�  3”¿ƒG �€�iÃMÿ–ï¹—?’Ï?¤ó®^Î=’Öæ]ºÍ[q§©ëƒ’æ]©\`/k­žÚŽÍ²Ú,�¦öwMû¨"ͺ ŒòÞê{½5Û$�U ™®î1vî§LF…9WahÑMƒÿY´ñ§œ,=úœÆÕœ‰‡��c‚ö CkžÐ¸šÅÔóTº~dÅ_sRÈÐóa!W8i©$H…ŠhÂ#–3ÿÊǼ„”±WçòBŽBHÈ1Z×¹òCOñ·3õ<ÏL1·ì{¦ ô†,+ÃæC÷ÁTzŒ 1cãÕŸnáÕ¾ò[�=µ¿Ë(竺‹QÁWq‡~à(•Â[áÄRɱ`*”5f>ìR�^å¤àL+œ¢)L�εOK7E6ö~hny�‹ùC¶µîú|d4d]eè>H8Þ_~«nà˜õìO aë¿£ö\‰ÊÂ%+¥†ÞÃæÖ׸¨/•sŸyz<„„4Ëtžg*…)Ì8‘Ív¬–Q�‰:>6û?6Ee�u6MÇ>”`éÆð¢UæÖ×üŸ“E£�Â.*\HRYcŽ×vßñsB©ÊÛYÜö;íà)BØì[H©¿bkñ•·,¿5”¹nzœQÞÒô !$j¬,éþ•¡ï°sõÆ®J�|whÍ“c¥Ú×I(õVÝm;ó’ýÄ 1�uhíÓ# �Xš^Æ8U–!$¤YÖò<Ïzö.àØ$iJtÇ’ÿÈa¼ÚÙøtÈr#!”‰º¾[~@˜¢¹`;õC™×Ês1Ÿ¬µz–}ÅØþ{�»Å_ù9EÐ`…IJqSß}áTXÔöŽÆy†�z˜ óUÝ=¸æ¿Ø>ù±nðÄìÞÃ8�ëBÑ•=TŽhCC¦¶wF—>(i-„>ê׸š ¥BÄ£8.ú99¢¨LñRÚásÚÁ„01è4uìs7<,i-3 …t@H(,A[ãHÃÎâËoªÝ—“ïIåˆõìO'Æ4×êo•4ýBè¥JŒ“”BãTžº/ó¡aS÷Ÿ¢ú2B¦‰RùZa’RÉŽµ`*ä"£ÚHS¼•¯3¦³ù*îÐ �žÝ{8V•£ñÇ¢¿GáYm&„P%ÊKA™WS9ÂIÂB¡‰u�bx˜2%þ˜»'Êj3BB–!$plq­|¬¨í�¢Î}©Œƒr‘QB#Q$>âæCÉíR˜0ÙW±5Z¼ÌzòûT )*!„‹“U—¿NU*Ù�d…TŠˆþ¾˜ÞÁ8qÖïáä5SÊ!ŠL#„¦9vÝ>ŒŽû:¢#„R¬dÍ6\—P(ç­¾wxåcæ–ÝÅWß&ÊœÆg¹¨O Êo5vìU{Û ¡á’ø°›�ùQaNWÈxULgçÃ#TŽÎ¥Â¨±’ñbüq̰˜S$.<2})½ƒñªk¥ÊS,é…��o‚¶Æ®»v›Æ¶0Np×mYñ¨©ó}•·3R´4R\)ªa×–¢''„œå‡žTùºÆ¶P%jì>ÀIAƉ‘¢¥£Kî÷VÝ£ï9DSK,š¯N,•Ä©�ñ*ÏÒå·DŠ–†-7¸núF´¨ÆØõG”T*œøa‹ —¬]ò€¬±„­òÖlÓ9O‰a×´§1×{«ïM”Zò€ÖyZM_ Ò G9FÖXú·<ÓÚ'†lëF«ï׸ÎÛO¾ðéÄ#¥ŒpãG|ÑX|»"Ü ;Ý ;ãÇ_‘4 ú�#²¨÷Ö>ä^þ5!4\|åMcOJW9 Â…U¡"JÝõ_�i­”(jw«íÔµ®¦T+œða#„¦_úMÌXÙ}ÇÏÆ¡¦Ò15ôŽ™ªºëwE6ö}dnÙ�åFÙGk6ÝôÆS{³¶ZÇ€1LÐ lxV=Ú–âÕøÓÔFX¦¯øôywiz …KÖZúnþALgŸø*ÿè„ÐÌ{`…ÙìÖ ÷V!hß «ÍþòÛüå·eä¬rS^^ÀŒ�£\’RåIÓáN‘Ø–qʃ1¥¸åuÂä¡5O(‚^㾨ï?3bz Ÿ!$ä>â^|àÉ÷Ñ ž¬ÚÿèÄíœ,iÞµè“ÇoœxŸúâ«{Нî_¤¤yWü©§ö¡˜Á1ûÖd.`ž Aj8>f¬ä¢>*Gç»)�)è%Àä'Œ.y@ ©Ý­”)~Çæ }½¥ùUÊR�ÐÈ{ù·´ !&G™Â)QϲíQ}áxÑßgnÙ­ï94ßí€ BHȳLlËSû^Sû\ïÏ9s �€�  �€�  �€Gi`ÐZWÖ>XíØ¬U›ýAgsû»;ö)ȇ ¹!a®(åê«î6êìGš^ñ�‹í�k—íˆÆ—‘r BÂ\1¦œ—y4Ðë°¬´™®t̳ËrHþ]Wœù²œ™£‚JÔERɇ °ÀäHÈr>ä*Ç&�¦¤sà~¡@ÎÁŠ£tª°566ì<{ù­áÔò!,(ùßKÈJhµcËæ•��o{§¥sº�‹Ò€£\}Õ=«—m?Ù²ûr÷Æ”ùnÀl $ÌÇ «j¿¼²öÁóWßv{;-%„(LöúcRh¾[0 s¥�µ‹oW‹†Æ†��×ò!G¥àûGŸˇ � æ*q¿1]>dÈ[ù•ä+Ž !Òiî—IÌ#„€¹¡óÝ€ôAH˜=šO!Æ $@B$ $@Ú0AÓ¿å{îå�äÕ”k!ÁÕ˹GÒÚ¼K·y+î4u}PÒ¼+•K'e­ÕSû`À±YV›… ÓÔþ®©c�CvhFyoõ½Þšm’Î*‡LW÷;÷S&£Âœ«0´è¦Á�ÿ¬ÚøSN –}NãjÎD óU>epCHÈ1Aû†¡5Oh\ÍbЙjÊy«îŽé싚^áƒÎ�½Ñ½l RË-kJ\+¾nnÙ-Ç6ßîYö•âËoj\çC¥ëGVü5'… =r…“–Jb�T¨ˆF!˜JƒQ!f¬`¼úÓ-¼ÚW~«±çâöwå|Uw1*ø*îÐ¥R¸`+œX*Ù!L…²ÆÌ‡]êÑ«œœi…S4…ɢѹö©`éF¢ÈÆÞÍ-¯s1ȶÖ]¿ƒ�Œ†¬« Ý ÇûËoÕ ³žý)!l`ýwÔž+1CY¸d¡ÔÐ{ØÜúÍ�„µùr§#„„4Ëtžg*…)Ì8‘Ív¬–Q�‰:~Ù¡•AÖÙ4ûS‚¥ËV™[_óW|N�B _¸¨p!UHe�9R\Û}ÇÏ ¥*ogqÛï´ƒ§a³o!¥þŠ­ÅWÞ²üfÔPæºéqFyKÓ+„�¨±²¤ûW†¾ÃÎÕO»>(=òÝ¡5OFŒ•j_'¡Ô[u·íÌKö/ÄtÖ¡µO�4âæCÉíR˜0ÙW±5Z¼ÌzòûT )*!„‹“U—¿NU*Ù�d…TŠˆþ¾˜ÞÁ8qÖïáä5SÊ!ŠL#„¦9vÝ>ŒŽû:¢#„R¬dÍ6\—P(ç­¾wxåcæ–ÝÅWß&ÊœÆg¹¨O Êo5vìU{Û ¡á’ø°›�ùQaNWÈxULgçÃ#TŽÎ¥Â¨±’ñbüq̰˜S$.<2})½ƒñªk¥ÊS,µ€äEüBHÈ7A[c×]»‚ŽMc['¸ë¶�¬xÔÔù¾ÊÛ)Z)®‹Õ°kKÑ“BÎòCOª|]c[¨5vठãÄHÑÒÑ%÷{«îÑ÷¢©åšÎ× '–Jb�TÈx•géƒ�ò["EKÖ\7}#ZTcìú#aJ*Nü°Å…KVŒ.y@ÖXB‹Vyk¶éœ§Ä°kÚSˆ˜ë½Õ÷&J-y@ë<-„¦/é…�£#k,ý[ž�iíŒC¶u£Õ÷k\çí'_øtâ‘RF¸ñ¿XÑX|»"Ü ;ÝײC�¿"iôGdQï­}ȽükBh¸øÊ›Æž”®r@… «BE&”ºë¿ÓZ)QÔîVÛ©j]M©V8áÃF!L)¾ô›˜±²ûŽŸ�-BM¥cjè;3Uu×ï ŠlìûÈܲË�²�Ölº/þè�§öfmµL6�•Mùz^ÅÍÀ†gÕ£m)^�Ÿjµ,{W $®^ÎýKÐK(\²ÖÒwób:ûÄ—øÐPùGÿ „f¶Ø£+Ìæ±²Ùx(X …‹�xJ�üã&ù PEâSüE…ÙºÁ“Uû�¸�“‚%Í»}òâø�ïS_|uOñÕ=ã‹”4ïŠ?õÔ>38fßzXð0p©áø˜±’‹ú¨�ï¦@¦ —“cœ0ºä14¤v·R¦ø›ƒöõ–æW)KuBrBLŽ2…S¢žeÛ£ú2Âñ¢¿Ïܲ[ßsh¾Û„��ÿf™Ø–)¦ö½¦ö¹ÞŸræ ! !Jèºå�|áæÄq·¦ÈP©ë,¯¾ïËwüL{í®¨PÈ !òóºQÐ|nýw†=WL†²Ò’”Ò¶ÞçZ_‹D}¢ ½sÝ3‹mk !MWŽzV.}P´ÇšÿíBûï9Ê-)»ùÆ¥_4«¢±Àåžg/ý6* !åë«î¾¡æ &½#&…‡<—�žÿ…Ç×=ÝKSV¨V×,û«¥å·Š‚¶wèL$êMåÔ’”2é� _-[t“FUЏ[»þxîÊ›1)œü”?û¾ioYý„QgûÓ‰ü¡¡´ý{@Ž˜Ÿ��…Å”Òúª»?:óÒ�/èuÖ­kŸ^×ðÈ‘¦—cRè½£ßxÕÍ«¾YWqÇÀÈùw>ú{IŽ(JŒR[qǺ†�§[ÿW×à £Î¶yåß ¼êXó«Š"[Íõk–}åÌå7ºŽ‹‚Ƥ/ ^Ë7�䥩*$„¬kØYUºñÏç~6ä¹\SvóÚú‡]£mÉO™ãø$¥bR¨wèìÙËo…"îEEK7­ü»HÔ{¾í�ä§<†çTV|½Ø°øO' Ôü„„ìä(î>×=x‚æ:/vìklxX§µøƒNBˆ,Çd9¦(Ò©‹¯y}ñýU¢¾¡êž‹ïµv¾Ï †]MWö¬mx¸éÊhˆã8BH 4ì9 !îq‰é§z)I…„�ŶµÍm¿ïè?B¹Øñ‡2ëj‘×$?#�º$I©PÄs©ëƒøãç龡O×QÊ1¦LuÊqŒ1Žã×Ô¥lÑM:ùýQï\ÞvÈ]ù9p³kÙ†aω:µ9âF=ñ/ñ8­ºØ µ­ªûË›ê¾ßB •äˆJÔ“ÐÐàHË…Ž½·®ybÈ}osû»½ÎO”k7€›ê¥$rœÀsªo{|»,Ç<¾n«¹.ùiÔEIJiÕE7Õ~©²t“Nc&„ðœ�ã]wÊqŠ"5TÝ}cÍ_|Üô?Æ*€”Ï!�—m˜£#„|6�¼,ÇØ¸ûz2ÆQŽ_ØÕ5xœŒÛRé̥߶v~ÐPu×Í«þwo ÿÐéÇX¦z)I…%¦jòÙDÆŠ"MJŒMUŠã„�7ü­Qg?xòû#ÞvÆØÆÿF§.¹®‚ëN9®ÈP^AÖw ž¸¡f[ïÐÙF� U>¯82éüµlÃE†rE‘‚I³ ‡££þÐp‘¡,ö�‰ÿBCʸïÐPÄýÉ¥ßìýó· Zëb[ãøâ_JRa(:“£&}"# åø"C™.×}’RjQo)Zr©ëƒáÑ« S8N0êì)¾Qјÿ??ùñŸÏý,õoXñׯN± ä™| 6sýòê{uKÙ¢U7,y Çy:x-Û° ¨y^Ås¢0î"¯h,ÐÒù^íâÛW/û«"C¹Q_ZUº©¡úŽ!ö’嵋o7é:M‰ÍÜ ðšpt4^pª—’T �ô8OÞP³m±m­NSÒPuO©eåuí¯°5î¸kWõ¸,ÊIJIr4­°¯+2”›ôŽ5õ;Ÿ­pÒSNœ¸ E¼‘¨ïhó«vsÊ%÷Ñ y: äóÀQ[ßa³©êËõ;˜"·õ}t²e·Âd£ÎàéU’ IDAT~Ïæç‹ôJ9BÈÎ{^ó�ïýn|ÍèååÒ/ÞTû!Äèoé|Ÿ0…ÂQá†%üo7=.ðjop°éêtžŒ(ÉKSU¨0åTËkŒ)[Ÿæ9u�óäù¶·Ë­«?s”ÒÏfQNR*&…N^ü÷�7üÍ—¶þ$ñ¶ví¿Ðñ‡xG!ù)�ç½úÉ¥ß46ìö´õ ŸÍÀ¿ ,h´fÓ}ñGo<µ7ù²Î" šÏoxÖ5Úv¼y›v8òcÙþÛÏþÓ.ŸŽ`F !ÿCÂÜ/“(ù9½“˜E¶a€Â–ÿ½HB$ $@B$ $@B~®8Ê>ƒÖvãÒmuw^êú—L@ŽB/! *í¾xÛ�ôZëød 9½„4èw�Ûsè©PÄ}çºld‹È�‚ ™Îó“Â1)Ìs"Á=¥ —DHÈÚ^)"ä2Ì%@B$ $@B$Äôr¦é4–û¶U8&´hÕàúg´®ó¶/Ä+Ìܱ`~!$䘠}ÃК'4®f1õ<Ï” ›ë…ˆÇvê‡\Ô¶®r×mçÂS×þTJËš׊¯›[v‹ÁÁ±��Å·{–}¥øò›×ùPéú‘ÍI!Cχ¨0G+Lv,­ÅÝðU1ìÿã#CÇ‚y‡��c´®s凞â#ngêyž™bêxoì™ 8¶Hz!4•£BÌXÁxõ§[xµ¯üVcχEíï2ÊùªîbTðUÜ¡8J¥0*ÌÅ §<'ºëV{Û S$­e®ÇbL�εOK7E6ö~hny�‹ùC¶µîú|d4d]eè>H8Þ_~«nà˜õìO aë¿£ö\‰ÊÂ%+¥†ÞÃæÖ׸¨oÖ'I $¤Y¦ó(=òÝ¡5OFŒ•j_'¡Ô[u·íÌKö/ÄtÖ¡µO�4ê׸š ¥BÄ£8.ú99¢¨LñRÚásÚÁ„01è4uìs7<,i-3;…”!$ ÍÐÙòCO*‚6d]=¼ú[æ–׌]$ÙŸÊëÙŸ0NŒi,®Õß*iú…*ÐK•'…)!„0Æ©•BŠÊ@ábÉjC… ³BªÄ�û¹rñÿKÔ Å¿²#Eµá’áE7¹—ïL‘ÒÎ{m;ù}µ·cvÇš¼”2Bˆ"Æ!„)DŽ]·£ã¾©(Ç¡+Y3!¡ðPÊ(G8ŽÌö�Š‹ú„À@ üÖ’æWÕÞvBh¸ä>ìæc~T˜‹ ¡!2! fäÂâCÿGbÊŠRϲ¯Èª"Ëù_ˆÁAÂØ¬�5V2^ŒG�˜a1§H\xD1L3âÕ;¯¢r„3”ÇKM{,˜\ª–o‚¶Æ®»v›Æ¶(‚ÖS÷åÀâÛ"æe‘¢¥žÚ‡|‹·êœ§RüM'„œå‡žTùºÆ¶P%jì>ÀIAƉ‘¢¥£Kî÷VÝ£ï9DSK,Š `…Q9"ú{Uþ•¿Gåëá£>N‰þ^*GR9ÖÄÏa\¸dÅè’d�%´h•·f›ÎyJ »¦mLÄ\ï­¾7QjÉZçi!4})˜ôrŒ¬±ôoy>¦µ3N ÙÖ�V߯q�·Ÿ|�ûk¤”nü°.UdƉîú¯Æt6˜*Ðkn}ÝÔ¹Ö+Ž!ú�#²¨÷Ö>ä^þ5!4\|åMcÏ�¹œ*\€ÎéX>‡„”âK¿‰+»ïøÙØ"T¢L¿pÈÐw8fªê®ßAÙØ÷‘¹e7–e­Ùt_üÑOíÍÞj™,Êæyåë{0_˜ Øð¬z´-Å õ?S–ÍþGÏìdÿˆi‡^Bá’µ–¾›ÓÙ'¾Ä‡†Ê?ú!4³¨°*„ü†�P¸øˆ§ôÈ?1n’ÏU$>…^TX€B~CH(`Š,ú{Q!*ƒ� •ÂŽ�Ÿ�ïV,B€„H@H€„H@H€œ„dΙ€G9FÖZ=µ›eµY:Míïš:öQEÊD©ä¦J�‰¬¼yy¬¬0ÉçÉœ„„œB9oÕÝ1�}QÓ+|в7º—íàcCwÒ[ÙÌ®Ô5“¦ùM’:í)…óõXWaÒÏ!’9/ 9…)æ–ÝcÏT�Þ�eeØÜ`è>˜ìö/³+5VzBš_2u è´§Î×c`…I>‡ŒWe'™ó¢3?!„ nxöºdÎÅ-»‘Ì9!!Í2�{yʳ+u�©R@g"p^«+¼ÎøÏaÖ’9GMU*oǵdÎ/ÚŽÿ¿1�u¸ñïÝË¿Vrî`œŠ $¤]6ï„pl’4%º�c3ºCdŠ¥’¤ùåÆß‚ÿ³{iO)œ¯Ç*À ¹Ïfnÿ9ÌX2çó„rñd΂¿ïºdΚ�±dÎp7|ÉœãrUÐÖ8Ò°³øò›j÷åL”J’æ7Y)BÒ›R8_�U€ŽßíºÏa†’9s± "LŸÌ™ !™ó§r 8¶¸V>VÔöNQç¾”»3.5UšßdEÒ�R8_�U€^3ÉçpÖÇš’9Ï®KÈ5”óVß;¼ò1sËîâ«o§’‘jö¥fn,°±coZR çë± °BB¦üÎåXñdÎñÇcÉœ§/¥w0^,S-Ur ãwÝö‘�š:ßWy;#EK#Åu‘¢&hÇö™˜ó6•RILLó›DÚS çë± °Â$ŸÃyIæì[r’9O„�£\¢ˆÆÀâÛÑànØénØßÈIÁÒ£Ïi\͉�&ä¼M©Ô %I�ö Àùz¬B«0ùçp^’9÷Üùóx2çâ‹ÿË�â�{9W�ÉMš ™ šÁ�ÿ¤m3Ÿÿ·™&sžÝs z …+›Yyq,T9!¡pe3+/Ž… !' $°lfåűP!ä„( T —þù;óÝŠ… ‹P ! ò`¹AH€1 �€� Xq”c¢EK<5_ ÙÖ(*“1v¾Wtõí±›ÌBBN¡\Ø\/D<¶S?䢾°u•»n;ö˜ºöÏwË Z~Ì-„„ÃSÇ{cÏÄà`À±EÒ;¡IîÖÂÍÀúï\—lÖÜúõ1áÿoïÎãÛ(ïü�?ϺeK¶åÛŽ“8>r:7 !�HJ8„@Û]ÚÝvK -] Pº¿–£¿–nùm·Ú¥e W!H !WÉ}Çqçô}ɲniFÒÌ<¿?$+ŽY–%[Ç÷ýâõ–ô+úè™ÍWÑ>ë¥ùœO•˦JŒJa:“yö/¬«!$1Jë„ûcn!´\Ùq\n»Ìfäù%Þµ0 "!ÊF¬ö²Ä(E‹EE†Êxlð«wŠÍþ¿œ£/ûT†Î?1W¬Ë<ó:BaÊ:veÖ™× §þŸ(×uÌ|ÊRñ�áÄbD¬îs,0œ|Un»êÊ™e®|8ÌKIDB”�À•PÝys;ªþ�ЬÌÙšYý§0/p­4U+;‚Åf·Y*”™Œ×ŽRX/ªÛ""ѼYÕy•3›°*‰bÝysÓê?WuE¥5n÷ê'xÕ±}n€Q‘�x�§ öþHb”œašiÚõµïhw Úªg±Yš›õGëîÀRw%BÁƒ0�0%Èõ£”9𷉵7ú4 $3ˆ„ÄC œÌÑ€RX.Ví(ZªnÝO ƒT© UlVê]™!Å’^]t³$)ø^B"Ø` Q £’xÏb³>MÁ Åf�…½^mQ÷X” É'J–Ð[Òœn„ ‹Ä(­îq.ôèË<éã­¥«…‹TÆã”ïÚa µ}¹½dyøÅfiÞ¢ê8b/¹Ã�3[”ë� � cò¬qv%,‰„b-åk}ªlDˆÌÕ¢¿ðnZÃöëÎ8ê·Dmw±Ù¦òüÅfõµ0 bŒHºÚw;§?&1j…强í�O ÇHf ‰K^ý…÷ôÞ ñUDZ1Ûé{;%¸3Îþ5ëä«×u(ðyžíy‹îÊ&Ý•M=›dœý«ÿWkéjŸ&oXOß`ÇEû´Å”×Ï §d:�€`•B(Æ6öN–ë”[.`"9óæ¹sfežýLÄÑž V @ÿ0‘(Ék-»Ï«ÎGÍ:[õµÔÍ{G{^€‚HH~}„…HiuŸ§Õ ÷ú€Ç@$’P’õ1  @$€þFÑ6ÿW–Êu}¿ HV ‰ŠËšZ¿ü½ŽÙ?#˜çñ‚2Û|Ã?×/Ï<é;ð.èDBB•™–е,ß5x=5„BîœÙ- çSX·1Ös$.ø^Bâ!k)Pn¯CD”™á4QvUì}œöXŒ3ŸÊHDdµÆ�»sç IÔ¶ìÑ×¾Kùœ\ö Kù´ÇƦjšv#Švܤj?l8ýß‘�ê¢nÞ«è:;2#Ê ÁKŸ²Îf‰bD¹!„%/-¸‘$`ÑC .D$„Â�—S¿užGf€á€UB"ñ¤—òù¬)–ʇBQã†åïeûµÊx|dæ€ý5™¥î:ÌDBbïÒÍ¡ê<âDB"Q˜Ïî]8€±µl�(KϬù3ëîˆÑˆ^m1¡YÿBÁ§)ôWl–4ªAZ©ó-â…Wç€(‚cËÃ;Ž =¬³Eæl–9›eŽfÚë DŽu¶øß|ýª½Ú@­øŒ‰¶±w*6�[©2gùP›ý†Zç€h�<&X%$�þj/‹ŠÌ¶ù¿ô)sÅrÙ3m%+]59Ç^¦.D+D$ÝÅ|Úâ¦Å ž„ФÁOê·ÎsÔž f𸹷ûúðñÏ=ý1%ëóŠO„Q´Ï~Vn»šqö¯a~�€(ùUB’­K`ÇD(ÉòA$‚H$‰äûÌ>òàð2ˆ¦ë<âD á�Êú )%°ã@D€ˆp,�À’r‡þ(‚Hˆ�Ò0¹ô®’¼yJ¹Þé6ž­Ûr¾~›$ £=/@¬$kA$ ÆTù˜Û´ªœƒgÞpº�…9U3Êðú\—šv�öÔHfÉú¦<º †‹éxí†à¯6WK^æäl}Åå¦Ý.òH(É #S9ˆÂŒŒUy|P}�x’?F rOcòæª í‡a‰@ìŒî^£$Þg'¡FSQvUUÅC§/m4Y.�ö\HZIüŽ<ê’•020Â%yóçM~´æêæÚ†m°D êâ$ âd1‘¦ÊÇ,›Vvß±Ú —šv"�öŒ  ÃEQÌÔÒ{&—ÞUs勽!+}ÁG–TH)X%âK*¼óÆ-X%DÓð¿& @Ê"ÝF{") V €Q–1�“>ˆÀˆJÄ÷ÖDœsd #$uÞXD ¶= }þC‘ˆšä{÷L¾gÓó §Ú“�؆ô‹0ŠŽ9Ï),tçÞFp]Èx«„Ä#*³í¥«ìEKÒwèkÞ ç_—O7Î:î›\ötI–ÆðfmÃi—7aÑñ¦co·�[)¨ ¬»3íÊ&Mý—˜ˆÐa2uĦuÌzJÙUc8ò’¿ÃØ�WRðDB‚árçtNLÑu–uÃmƒ)^_Îx¬ÙÇKy¼aªeÂ}oÕ6|NkQ‘ažô}íÛŒ«#x£»h‘µl�îÒGŠ®.w–yâ·(�S7톴ÃPc)3-kY¾«ç‡��WR0DBÂQ˜Nìùå±tÎz:Ü6DÒÖm þƸÚ]yóuB8¬õ;f|Ú"B˯õGË7i›÷¤]ÝL0ås+ÁŒ£h±ªí xè0!;¡XkÅZ¹½IPfw,BDVÛYõ„;w’DmËÝùw(Ÿ“Ï™a)�öØ8ÃTMÓnDÑ΂›T퇳Ný!Ò1ûY¹õ²O“ÏgLDkZöéj7P^¨e QöÑ[‡ÙÃ=¿»=ĽXài�'KŽ s‰Q:‹—ˆŠ •ñXÄûs%™FTe+ê·!"qysù¬©ú ï8‹–J¬–ŽèÝ:ŒÃýœE‹½êÂìc¿¶•Ý…±0v-Ò]Þ˜±ë>MA×ÔïLgT¿Žòj‹3šþ¦iÝgœö˜¶qGÎ�Ÿ›f<îÑË cû˜Û '_Í>ò’Oe0U=i©|8£úµ˜î§JÍ%‚HˆºÐoèÑ4ÄDàòçuTý;¡Y™³5³úOrSMèÇZÞ9óI.ó„0aU­ ~‹ˆ¤0Ÿ3û�Ä(¦)ŸCT¬ek´uŸ),µÎ⥫¦¹Nè0�: Í«+uŒ»3³æ š7÷|Á g,E×¹´KcÑCs�iW7ÛÆßå_|Ð^§ÜTƒ0fÑQ´È«+Ë:ú28‰Õ „°×5È ÃøëK¾ÌÓÔŸû[ çËö¦Oà3&òYS,•FĘ»ýýìc¿–Ùêz�EdZ„å õrêË!c‚’DäÿlN$$úz?÷x§ÂAãHvœ†5«^" ˆ„T„1Á¢(é?*Êë`\í®‚›2Îþ�Ü^‡æ3'Ѽ…ö9¡ÃDì�á:QŸš°róÙ‚=�Yal+¿_”¥gœyƒuw B"Ë«-&4ëOA[DIÅ›%�j�Vê\Î̦ÛþÆåÏ Þ"1J[ٽ=ú2OúxÛ„»…‹TÆãa~¦c8cþžõ2Gcð,yµM»(ÁM(Ö“>Þ>îû˜eêæ½8¼ZÓÐavØ=¬³Eæl–9›eŽfÚë DŽu¶`ÑÎXî쪦ÛþæÎ›Û«[>c¢}ÜJQ‘ÉeMµ�[©2gù®A'ãÑ—;J–û[9Æ­TO0Üà­† òÁ*!ሊÌöåSæŠå²gÚJV(ºj²�¾Dÿ5bLÕs2–DB±–òµ>U6"DæjÑ_xW[ÿåp¾Aªj; gÕöÒՖʇΤ»ü‘¦içpžt‡k¬>¯C„"’îâ>mqó’?OBEÒà'iZ÷ùÒKš+D’¨mýZwþí¨Ÿnyà‡ÇÎYîÿé£'¶ŽÜÙ2I ¶!Ñå¿ †Üv5Ì/êG8 äA7X%¤.Q™Ù¶à·>UNß»h®3ÿO2ÜÐÎè€S¡ÃäyÐDBê¢=֜ϪŸ×–:Œ=¼Ða v8J`}0B R˜$²Îè:LY�}A$âøÜý?‹EÏ�ý‚H¤ƒà{ €y¬)!¹Ã øì†y©X%’_ŠäÁðA$aí7¾`©\7èå^!Â;ŽŒ¨4Ø&¬våÍåzÆmÔ^ÝœV¿ KB,Z…&(³�ÐÛõ5 ž9N0m/Yî¿Ê_•W{ùcmÃöa^~ )ÇJÁC¼cñ§ < ȃ¡€HH(˜r”ÜæSådV¿N»�\N•µüAÚçÒ4íŠ~«nþ2¿ºóo³îe~sf›f¬ï·´«ðf[ùýé?ôWåµLú6%pšæ=0V¯±R®CLÙÇ ø:ÎXýJî$ð‹Ås„HH(DÒ�ßüMæj᳦x2*5M»C}½3²VÁÖ}Êü"„”]Õù{~DûK@÷èƒÐrgáBmÓîôº-SÎ’ÛfœÅKÔí‡Â©œ:c¥`‡ˆHúÚþ_‡„–E8!«íœñ¸;o.’DMón}í»Øëàsª¬Ò+g˜¦nÜ…(ÚU¸PÙvÈ_ÌÙ8ç9™å’ Íç3&!ŒÕÍ_'\1çØDB”źörO3„UQ^û�ú�¬U/Xà™þJ@û«òÊë¶""¹sçðYSuµ\Å·ˆ¬–‰´pRŽ•‚öÒóuùX;‹§_ú¨p×¼š|óÔ˜1�yæ „�W[¬oÜ©nÙ×9}½¦a»¿˜³7mŒÌ^�0v”,3œ|Õpø%ŸÊÐ5ó§#PÌ9Šbº‚Hˆ²‘¼ª+o® ÈPµÒ`ÂlÕ«ÌoÛM×ÊüR=/Áý�=‘¾V•×V~¿æê…¥Ö5æ‰ U#%ÇJÁ©ë+7ô|F6–Ÿ¢ë\úåMHàn£öʧöÒÕÂå�!ÚëTt�õsV·éSÌù´¢ýˆ¿˜³¶n«µ2¶Åœ‡oÄöƒA$$*wv•¥r]úÅå–K±h,óëSdš§?¦¯~Cæjñ—ù Õ ¡žUyÓšvú«ò†YR8uÆJÁ{>¬×ëðÚXî ,?Ö^�Oàgg ˜3Bƒsf¸kÅœi¾‹P¬¤È@ñ #D"!aWÞ|ó”ï¦]ù4½a[ØK„!·êYæ—öX‚e~C5xDDgñâk€eFUÞT+;ìÖÏëp¨c…~£Œ´˜sè§5¢FñØ8|/!Ñ`Ê^²¼kÊwuçßÖ]ù$œŠT‘· OÏo°°¦î³@UÞŒa•NÖ±R°C„|†9éÖóF_ÚÄÈ?k Ã,ËìÓä:ت€’ÌŤ˜sF÷\)ˆ„DB(Æ2á>ˤoië¿�Ù<éã=º žôq„QÓ·æm8­Bè[æ7,y5�;ƒUymcW8J–«šöD\R8YÇJÁC¼ ùÜÁpgW5/{‹ËŸ×k >c¢mì�’2‹7LsŒ_¥ì8Æô·ìëõ>ëÑ—;ÆÞ.*2yÃ4Ǹ•ŠŽã±(æ :׋Ï÷ X%Røœ}ÏŒö,b›Ã9 '¡ÀˆŠÏõ�DŒœxΑ#&ÎóA$ÀȈÿ<@ 0"œq”p|ºqÖqßäsfH²4†7kê·¥]Þ„EïhÏ 0 DÉ‘�`0ÅëË�ÕpìË IDAT7”×Á¦ZËÖP¼UÛðåhÏ Ð¿Ê‘�`ˆ¤­Ûü�qµ»óoÔyáß"ŒÂ_lÖ§É÷d^Wl–0 ãœg]g}ª\>{šÄ¨¦jý™?³®v„�Ä(mekœ%·Z®h?&·]泫 ‡þƒ ïZ˜¤¸Ä ?ˆ„(Ûøãmƒ?(¤»_YÎÃ$Fé,^"*2TÆcƒc´»Ølö‘ëŠÍ"„¦lãVeV¿–uòUQ®ëœýŒµr]ÖñßaDlekÜ…7e�ø½ÌzÅ�;Û2ñ‘0/% HP QæúppùóŒ3Ÿ"4+s¶fœþ£ÜTN+Eg?Åf¯!¤°^Tµ@D¢y³ÒxÜ�;‡°*‰b¹üyںϔíGBÚ†/½ú >MalŸ‰oÔp%ÔÔ"7žÊß³^b”œaZ×ôÇtç7h¶ÚŠåû+6ëµ#„W;–º+ „i„)Q‘!1J™£)p;‘X{£ …H ”Qσa‚HH<”ÀQöz„�Ü\KXµ³øUË>J¤"n¨b³RïÊ´!„ûì�"ÝÅlI ¾—�È0&˜BN)ñ¡›¥y -z½Ú¢î±(A“OP<Õ, Î$úA$$‰QÚÊîuÝìÍ(ó¦—Ú&Üí,Z¬ì8Fù®-¸œ™ý–¨j±Yš·(Û;ÆÞÉåÎåzWáͮ›cñ¤HñP69*`ÇQ"Á’H(ÖZñ�O•�‘¹Ztµïh뿼~KÔPl– vÀÁˆ”~þDDÓŒõ£VXΫZ ip,€Þâ* †slA$$,yuµïêjß ñeûÑ¢/Öõ½�Üúš73Oüþºû\;>ýòÇé—?îÙD_ó¦ÿWÛ„»mþ°žI'®ò`ø`ÇEû´ÅØc‡‹g”dy€`•B(Æ>n%ËuÊ̵˜H®üù\î쌚¿`"ŽöÔ}É~  ˜H”䵕¯ñªóE³ÎVÝù·UM{F{^€‚HH~›%’öêgÚ«ŸÅ`F$ª8_ óØ2‚c ¦8σ¨€H€ÁÅ ‰€ `P)’Ž%@ñÑ«Ð?Â(:n|Á:ñá¾_„$+ˆ„DÅeMm\ñ�qγÓá<^Pf[&?Ú¸âË ÿïò„Fº�öDFDBB•™¶‰ëX¾kðzj!„¸Ü9m‹~ïSX·1Ös Ñ%\Dë@‚c ‰ˆP¬µb­ÌvIPf†ÓDa:�·{=í±tÎzz"²ÚΪ'¸¼¹H5Í»uçß¡|N.{†­r-Å[ùìiêÆ]ˆ¢]… •m‡²Ný!Ò1ûY¹õrß:Ï‘>]FNÂ…Šj ˆ„èªiª�ÚË΢Å>M‘áè˶²{Âì <#ð„b‡VðcWñâôKeìü¾W“o™öoLgT¿Žòj‹õ�;5­û:§¯×4lÏÞÿ\WÕm±ÜÑà¯óœuâ÷½ê<Õ0ˆºèæ‚Hˆ®çÿþﱓ>Þ9~¥¾ú5š7GrH`ˆ-䦳i—>Æ¢GÉu W>µ—®”!„h¯SnªA3«ªí0ëj£D�$Kó·RtžVvíUçöY�¸•ˆ‹ƒ<@p,!±H2­eÒ·TM{]gGfD™£!xéSÆÑ$QŒ(×#„°ä¥7’,z(Á…ˆ„A8ðrêYç™âL„bý­ˆC�=Á*!‘xÒK=™“<†©Ö‰ëBQã¦dyIe<>2sÀ„�Ô]‡™HHì]º¹¿:ÏpŽˆ; (–ÿ  ‰Â|.÷Ç0¶•ß/ÊÒ3μÁº;b4¢W[LhÖ¿P´E”$P¼YÒ¨i¥Î#´ ‹„� -ô·ŠÑ H51ý€;Ž =¬³Eæl–9›eŽfÚë DŽu¶øß|ýÜÙUÍËÞrçÍRϵòdN²�[)*2¹¬©Žñ«”ÇX>TÅf?oF…¿Î3—55œ:ÏŒÒÃhÏ%±^pÃ*!éôW{YTdv|ãŸ2‡P,ŸCìcï�›Îd}‰¸­‘Ò/¼ïÓ*67ïÖ�IƒŸ8Ôo�ç¨=ARÕì€Å%³—ùÚøãmƒžþ@h„QtÌyNn»ª¯y3̯Ñk º èedÈÁŽ#ˆw#v‚ì8$§äX ‘=aV €$yX%€hŸ»ÿg£= �Ò’& Ðh|¡V €äy0L°J$¶dŠ� ÑúÂ?D Á$eô4Š€�HÄ»¤Ï¿x¸D î¤HÄ¡�„¼¬)Ëçý‚e”þ_½‚{Û�Ÿ·w_çY£Ìž\ºª¬xé…†í‡kÞ$Ýß}Õ( S&¬›?_)×;ÝÆš«›ÏÕm•$a$gˆ©”Í€xXô4¢‘ `µnÞ¼÷Ä«Ÿ!$ÉÙ} ÏâœÙ7Wý¨ÕT㼾РÆTEÉ2­*gÿéלncQî̪ò½>×ÅÆ�#9s@t¥lĹ�•2ÃÅ™L¶+>ÁÝë®¶®ê�»×sËÒë‹";ÿvðW›«%/sr¶¾âRã.—Ð q@ÅÛÊ §k‘ëºÁa•BoÐOX³ôuŒq—­þÌ•Oš;ŽûßÙ}ïxšbC—‚¤0#gUÔv`4Áû{â9 ‚®EB¬ëDj®|ÚÜq’óZeŒª²dÙ⪟ì>þJcÇÑž ½ÑJòç©”™õm‡`‰ÀH‚ ˆ@Bd@/#ºãˆóØ8ÏÿÏGƒF•=¡xIsç )ŒKð#„в«fV®;uñC“åR,§ € HQ£vª xlÎÖ4uM±ƒFF¸$oþ�S¿wæÊ§çë·Â€¨ƒ ˆŠD\ô4j‘@Ó2­*ÇÍ›EÑú‘¦*J–O/_sôüÛw"�Ì Hn� ¯‘‹†–M{‡“ë´;[FQ>æ–,Ýø¯Ž¼,…|‹§(fÚ„{§LX}æò&³­>+}ÚÓ€A@$Ä!!H’ôĽäŒ–QÜ2ûgíæsZUnaö4–QµvV¬ù³ÃÕŽº¯ÉZ9v¹Fipº�çë·�½ú¹(yYF¹tÖÓE9U¡êËŸð^ë”ÒÕ,£Ÿ“Q9oò£r™öØù >�Ûvðç -[0í‡eÅKÚºÎ|²÷Ç‚è‘$_–®T§-¾Ø¸³®ußMÓ×_hØþùþçn®zB¯-6Z.ø®¥óô©‹qKVúøùSÿÕ㵟¹òidÏ‹¢èY•ëJòæî;ý£åÒø‚Uk»lWý÷4VˆÉ÷윦ds&}G¯-ÚqòÐÛèDB¬ë<ûuX.Ôµ�ˆäæÍMÆãcrç°¬Š¡eã œ¹üI]ë~„P]ë~­*{âØçë¶ùß"EÑ'Š>IŽ�Û`wµ{óz�m¦Œ1ç±Ö·¶»ÚDÑ£�¥!„8�õBÃvÿÚ�'ZŒ'²t0¦"«ö£’gåTÕ\ÙR×z!t®îó|Ã4£ôßz¬�&�"„P=£âþÃÔG^²9["˜ ¹%çŽ#?§»#øY<¦1¦”r=CËMݺB�Ö+ -S)3{~j¶:›œœ±go‚äõ n†– ¢Ç+¸‘"S!¥<}ê„{ÆäÍS)ô!šbëZD U@’Æ y€à{ ‰HPf;JW9Š—j¶ëkÞDaÔy&˜vŒ½Ý1~• 2°îNíå�5õ_b"F<è0;•Û„Õîüù¢\ϸ�Ú«›µu[±$Äb,�pÂÉ‘�p¸Ü9¦ëå¦v(užÝE‹lå÷§_üPÑUÃåβLú6%pê¦Ýá´æIßÑ�›uw@‡1éÐTÃå ­Ã~`ÊQ²LPådV¿N»Œ\n•µüAÚçR7îŒþX Ñ„™"!á(L§óv¯§=–ΰë<Zî,\¨iÚ�vu3Á”cÌ­3Îâ%ª¶ƒXàoŽ!­1rè0†– ­ÃþÆ�tçßþƺšù¬)¼¾Bݸ‹Ð²Ç"Ddµ�UOpys‘$jšwëοCùœ|N•µâAŠ·òÙÓÔ�»E» *Ûe�úBÄ8ç9™å’O“ïÉœ„0V7­«Ý@y‘<)0â ¢,Öuž±À3O(6üªž’L#ª²u[‘¸¼¹Ã4]íWñ-"«e"z÷�ã°Ã^f«¢}Ža�…±«xqú¥�2v~ß§-0Oý�ÓÕ¯#„¼Úb}ãNMë¾Îéë5 ÛsüÜ4ãqoÚ™½aì(Yf8ùjö‘—|*C×ÌŸZ*Ψ~ öS�–ð—"!êB¿¡GSØe‰Q"LS>‡¨4ØÊï×\Ý¢°ÔºÆÜBX5â:jEhyçÌ'ù¬ÉaªÚnzIa>›uô7Ðáhu>wþuXc!„XG=½�Ÿ�ÍÅHŠ „–¼´ài9=”àDDBˆ îZî,oÂDòÿLó]„b%E‚HH É�xDDGÑ"Ÿ¾<ëèËXà$™!„½®Azl!‚($ ´ÇLs¦‘îÐçŽ÷Žx‡Xòeœú£^öVàW¯;ø–í¿Á�£yÊwÓ®|šV¿Õ6Úucy œ$× „¨Á6oÿÀˆ „$‚BDB‚Ðë1÷xcÁAáïæÑ4Ô%‚ï%¤Êë`\mîÂ…šºÏd¶«a>cÍ[hŸs(Ýô¨Î�Øa¤Ç$Gn†£Ñ!Ãu²¶zÿ g¼v2¦coïšò]Ýù·Ó/oB’ØÏXö¡�åÓŽ!4øYSHIæÌƒ·ÒäZÖýsA˜­@<€HH6\ÎÌæeoqùó‚·`É«iÜE nB±^]©}ÜŽ’媦=8¼:  gÌÛýkoˆv‡�ÐaÄöE(ÆZ¶Æ2é[Úú/dö¯®Ô«/óêÆFÎX}_6~|æDû¸•¢"“7LsŒ_¥ì8Æò]ƒNÆ£/wŒ½=ÐjÜJEÇq†¼ˆ°ã(ÁHʬöåSæŠÅÙÄ>öEW�áÈ‹TðŸ7ÆQ½ö«Úˆ¬Ú1ánëÄGΔ~éCMÓÎáL:Œ·%Vë.Z$±kå:kå:ÿ�”àÎ9ø¼ÜT3øXý½l‘Ò/¼ïÓ·,}-xjpñ‚ºåk_Ú˜@«–èο §% ¨½M¼mäÎ8 þFaœûs™õJ˜ß«1Á±X%¤.I•Õ¶à·>UNß»h®3ÿOÒ=¾j FÐaÞÞŸ0ÜÐN³•™í7½Åˆ„ÔEñ–œÏªŸ×–ªûÜè0âé0v»÷B{¬Ùû†º�è^GôEÐ!C‘�Â$‘q4C‡ñÖ!ël‰f‡ D j°Àçì{f´g!C=œ'¡@Ò"dhù! ™ )  É…Ÿ  �üÂLˆÀH€bΣ.œT€3ŽŒ¤Ê¶–ÞÕo}ݨ· !þ C‡Q)°ÆãnWOk,Šq.d8“¢³:œ)�˜(`•�PzÕ×u^«¯êz2‘µ ¶ÆŒ�VLè("†ãªCD±BZ1b=oS˜NçïùÅ›M³¯+ôùX!‹9Ó+g°˜³ Íç3 ˜sÔ\Û‰t}8@$DÓÙæ3±®½ÜSÏúºá‹¬Õu=ȵýÖò•ditDuƒ¡Ã8ì!„žxB±äú½ÿ‘�Õ]Ì9s×¼šü¾ÅœÕ-¡Š9¿$¨³MUOB1çh"¤g…#ˆ„húù?ÉáºëëÒ%'ÃlEh¹iÖ“\f°nðoƒuƒƒµ|%UvϺÁ£¢¡Ãdé�êY¹áú} ‘�å§è sV¸�þb΢j#Bˆö:]gƒÅœYW[ÏbÎJS ˜3ãêðsUYŒkh×( ¬0F ‰«G}Ý‹±h…EOæÉÿB´Ì§Èô× –¹Z�è¥^BÈ_Ë×:áž!"†¨ÃP­"Ë�µ÷.æ,Êõ¨w1gW¯bÎ ×»˜³(×C$D!cˆ„DÔO}ÝX´ò× fuƒ-”»3pûuƒ­å &P‡¡šD:V¿0ƽ‹9‹¾^�鯘3œÉ„À÷ÍõucÒj Î<ö~ëG|Ä:ŒÃc4–/­w1gŠ�¤˜s8­@ IˆúºÁÇô-¢N«hwGtk/C‡ ÑaÃ*æœ1Ñ>n¥¤Ì sfÂ(Sá/æh5n¥¢ã8írq Øq”Hˆ,-D}ÝÀƒúÑ «ÕÅy!bè0*†(ô=ÌbÎÍKþA1çæŠ¡˜s¬Aíe@ü‚bÎ# V ©+Ñ+C‡£Ò!Hn°JHa-¨ó¬ìlòÚ:L…G¬F¬RX""†ã®C�Ô`• NB‘ "@D€ˆ  @$€H‘ "@D€ˆ  @$€H‘ "@D€ˆ  @$ u¥±ëcüÀ�¯™¿öàÅ}‚$øo¬(˜ø«ûë½W:.ÅnèIèɇ cdw;oýíO®»éŸVÌXes[ë;¯úïêû”)ŠzbÅÓ?¹ó™5óºwÞƒás-5£7w@Ô0!CZöŠ«Mºeûé­ïî‹â¿O­ÐÜ5뾕7§)ÓÛ­­[OnÞU³]”ÄaÉûøvk›�³w1²ŸÜùì‘˾:óE´ú±ÉÄ�–}gÕ]s&ÌOWéMvãÖ“›·ŸÞŒ[�ZgÕ]sJçg¥es^÷o·¼x¶©:œn'O[1cÕÞ9~õˆœ•[]–à]}Ÿ²$IÿùùË¿ßúkµ\óÔ7Ÿ�îŒ"fv鼹屚¦êN»ñº;(æ‘›þylöø?nÿ}›¥å†¢©kæ¯Åo?½u˜CÖ¯þâç†ÙI8¬R¯ÖG·Ï›|¿(L-¹á¶œôœ7w¿Þi7N+©ºwÞƒ.�kï¹�¡LmÖOîü™Ëãüëž7Z-Í„«ËfÏéªt·Ç}ìê!“½³×]ý>e‰Hˆ Q"Ã^€8ÁT7žúé†Çlnëw<Ýó�:£²ð†w¾þëéú¡]¶í2F¾ bÑþÚ½.�+D�…öÞ¹ÜX±PÉ*O7žttºÄß?Ý]³ï£)Z"Ò[{ÿòÙñMþ»¬ò'+Ÿ™:fBè³ãŸØ9ë�U«¬òÿñ?_œÚBQÔü²wTÝU”9Æíqí9·sÓáÜ^·¿mY^Å7gß[Y0I)S¶š[Þ;ðöÑËÇJÖßþÓ<]K³ÿzëú½u½D¤OŽ|è_ÉÙ²©w,�ºûþ“&‡1ÄSaĶ êÞËñ^Ž¥e¦¯»ƒf0BÁ¼¥ËÑ™¡ÉÔ*ÓCDMÑܸnæø¹þê¿/w\œ_¶àÞyký{¥ !ïíÿßnÈ×ütÕs=[ñ>îWŸ“1²ï-ýá‰KÎ7Ÿyæ½{� úB7O\²fþº�½wìꑜôœï,ú9#{kï_DIc(y|ÅSu�W~»åEg/Ê,î°¶!„š»š~ùѳzMÆ�ïxz{õ¶}µ{!œ—#„P˜Z={͉KÞÚûç ­çËó+Yø¨Z¡ýû� !¦bò=gx¼îhvZvÏ–åUÜ=çþMGþ~ìê…L‘«Ë·8»†ýWëÞÚ4£”©œ¼!¤d•“‹§�i8ù­›�2fº ú\Ü·ùèGÁìì—Ím}å³—hš¾±lÁŠ«~³ù«Û"Š¢�³†~Ê!\û{ÕÍ`k½zDí­>Æÿ?ŒƸçV·¥ÃÖ¾°rñ¥¶ NÞQ�Y´¢ê› ™BÆÊCt§WgL+©ÚvrËáËB_žþ|rñt…L|€$IvÎ.ˆBß¶>Ñç}¢$|pð�vk«ÿFµ\½tòò¯ª·}uæ BˆÅÙµåØÇ÷Î_»ùØÇ]NÓÜ ßðü_vþÑììB5šêý­DI´¸Ì!‘H.ÞÙå0GÑ©õóË|vâ“C—ö#„]ÚŸ•–}ÛÔ_Uo39:šFˆÉ÷š¡Ùa ÎÐäè¤( !drš:í¡&SCˆ­7TsJçeh2Ž]=LQÉÕYZÂÊE[OnÞ|lcvz¾£UhßÜýZˆÃ?‘¬.3BÈÉ;Q4»ÌæÛ*ð”yG¿¯~õþ{·ÆñM&»1¸5L1Ø€ácºƒ÷roîzý;‹¿÷ú£o ’Ðfm=Óp*7=Ï'xCt—®Ö±´¬ÑTçÿÕ'úZÌ�¥¹eáO¨ÕÒl´uMSé iÙßœ}ßÊY÷øo¡öµBcvuåë Z--6w¸{ÌBzM†ŒñžüæIDAT‘7tÖo©7^•1² m–?ú�F!fhrt^h9ÿÅéϾëúËSoßvbóé†Ã?>ï7cìÌ5ó×}rôÃËíB VÁPÌ–ãqê3„P«¥E%W=pã#zu¦Éa¬³¨ISëûßrµ ¡Øm @T  ¡KÓ/7>+cd¦=÷œûœÝÅ;C4!„Dzp ÿ¦ŸWôIäÚÛ!D"Ò†¯ß.C“9¿|AMsµÏõ@ln«Wðæêòü¿Ò˜ÎÓçç”gër˜òtù]NS§ÝèÿÏäè%‘b´µçêò4 m¿m !D’šíy£Åiö|Iö¸à-c c}‚×éNí3 >Æê¶l<üþó*Kk˜>vfdùQuë”Û¿}ów?8ðögÇ7Gqp³³kbÁ þ�3¡LM–(‰Î�uÎÚ½5:;íþÿLãõ[üñðûÏÿýé,­azIÕHNZ¨UKË²Ò ¢$Œ1Œ[=û>BÈÖŸJD ÑÄâ2Ÿ¬;zûôUm–ֆκ¹nœX8¥Ù|플±F¡ahFÁ*XZæ¯í†’3r#c)VÁ*½Ý»§\׎êm/ü''ïÜa¯ ņ±:•nwÍAŽ\9xó¤¥ß^ô½­'>u{\†ô·Çu¡õ¼¿-/ðf—ùÆòçšÏØÝ6+ë´mnë¾Ú½+¦¯2Ù�µ-çÊò+VÌXµ¿v¯ÙÕb!&z† i9—Új=>Oy~¥œUØ9[Ï> 3‹žZõü‰º£ÛóçÐÛ!ÄPÌ]³ï½³jõ–›M ãrJB¢$¶Y[9¯{Ϲ¯Ö~ãÛ—åÐ¥}ùú‚Õsî?Qw´{9¡/„M14¦šÁ8°\ÊÖ¨è»5£ ÏX¼ö÷½œ©Ébi– "ˆÂ¹–šW¶¼È{¹ìôœçïyÑ�–cvv¾´ÿÓcÃù(­–«ï™÷àÍ—Èùɺ£W�W¦Ž™þÒ¦ÿ Hzlù“³ÆÏ¥0å?”-©Ón|ù“ÿà}Üsw¿�«Ë£0…"„tÚ�/lz®¹« !Daªjüœ;«îŸSŠj·µí¨þb{õç’$!„n(šr÷ÜÊòÊ1¢Lã6ì¿ð�àdJ ãÖÝô�Š‚‰Qûj÷¼ñÕI`iÙ­So¿uÊrCZN—Ó´óÌ—ÛNmöø<Ùé9MCÎÊš|£©>Ä 'MY·àÛùErVn´uì¨ÞºíäŸè ÎpÆØY?Zñï¯íxõÀ…¯ݶ:•þÿ¬ùuAFQÏÝ^÷K›ž?×\CSô‰‹ï˜qW~F�ÍmÛ]³ã“£…yBêân¹{ÎÏ}ðdðOâ)·[[pÛã3ÇÍ‘³ HDj·¶þf˯šL�ÃـхKf/í9¤´Õ³ïûFÅÍ¿Üøì0?ÎÀðÁeïFC1c³K_>`u[4Ĭ„:¼ †iã�· t×ݯ,É™@8`Ç€€ÿ1L¨ áIEND®B`‚dtkcore-6.7.46/docs/src/dconfig_example1.png000066400000000000000000001656071522615770400207330ustar00rootroot00000000000000‰PNG  IHDRÈW–f$ž pHYsÄÄ•+ IDATxœœ}yüeEqï·úœ»þ~³ÏÀ   0 ²ˆŠwÔ¸%Æø1‰FŸšä½$&y&M|&®‰I0‰‰¢‰»€Q‘à‚¢²/²Ã°Ì¾ÿæ·Þõœ®÷GwuWŸ{‡˜\å7÷ž{Nwu-ߪ®ªs.�²öƒ Ƽ „ÿX>Cf0q8„äWÄ89ŸÀ —q:–ºˆˆØMú<9‹*#�,ãûž n}ÕˆˆýQ&MA ž’7#œ¨°òü"5îèǧ9Ÿ+Á�gŽVR Äy"ÝjIxëØÎH™¦Ø–\‚„½þí(�#¼HØWù ž¼ÊàãÎK>þe–ªŒ¥ ¯’îu…˜˜â™ŒÈ)ª\âG9LΤ‚Œór†@£×»¹¼(,°I”3±eb‚3!fX(úí¥ÙÒ¥5ª@ÄN5éÊ9j ‰ˆÀ–. pÉèCÃNƒd×H*p9Z��Ÿ–¢ ¢u©Uyõä Å#‚a0ÜBGx˜Š7,Å_ZÁO63k5I,&àN»eX€™K�3À¦MLDÖ-‘XÌ…˜­ƒ Û)JMw•È—‚�bËŽ ƒªˆUaNà: w@C¡.¥:Âê�wA?•ñ0`2Ã<›Ës›-ZJíÅÆÖz¼ñ£z �™G,’™Á¨×1¹˜ò&ƒP qàLc0¶êkü²‚‹¼XxŒx• ¥Ž%Y>h´ûN% Øá –’¥"Àhÿ WNÕ&¼!ápRŠT‰'RvïaÝYA@kBPâäÊpq`׈Ƅ³F&�æU� äÚª÷9T Æ #]|@}ÖÓ¤œ ô+§8ZŠÊ”8¹6qg Ž"]¥q°£HG¡^qåœHgŠG*Pˆ*XŸœòh¬[ý¯¥0òâqŸÞ‰ª7Áñ8ž†x±¹/`íH’8‰Õ¼Ñ凑9–pužÅWÔW¥ Q‡³7NõC/|Ä’À(Â*ç�ÓE•t¯ñã9?ºÜp�H¹‡wbŽ‘¿>co(ÁÎR ¡›ì”Hƒ{5ªˆ{eijdV媡§Ê�‡Ew}]0cY¿Waõ8Ó¹4=82/˜§1«‰æîÁ&h}åŒô*e�ã–vø3ãÉD!b`0QJ£¢"ú›¸Zg1^°†a}PæA£BÑaÜÉýúÅ”TQSõ8!Ÿ!WÄëÂ@¬þÛÐC…Q´ƒ®à£ž,lK1ò}byŽ"�ŽÄU¹ jwù®‚GìGö%ŸÒ WqŠXñ+y±¿PpG[ǸÝzåjL污Y8ÏsªËLuC †õ3¨ÙÈË"Û·«?±Ô,[Ö0uë€uÞÉÁk (r¶ 4Á–è/`¢ ²¤.±%fëp[(·Ú°d¦ÜeFØçst ¤QNج·N2Á('‚Ò] :ó@áOP%†ea•ì¬Ù;y(Œ•‰‡”¡etXˆá<£FYß²8/çŸz.E…`J�.8d¿>&Q´—eÁÎý•$.ËyYÉbùí·÷ô!¿à“3r–Œæ–a½°ÆtjY¯Ö¬Ó¢UÔh¶˜%YåÃPöZ)ò±nçí6ßÌ–²Œ[hNÀä``a�öàÙl˜!L±!ç‘‹n¢¸÷s3 ³ A`+© "3¬µ{YnýÉD!ð�K h¿¢4ÙA%¢.Å�QŽÈìQ;FµY)�;`mˆ55Ò ´ˆÂˆ (`Ï, ”†V>*r9ª„'¾br9؆Ù�Ì‹¿?úàïì\¶uXO‘®L;u @¬Œ0U’””\†%àùwÓqø³—РÆñXK~O)¡˜†RçúMgnð“0ò?ÄÏ| ‹;èÖé;ÏÄ]ëýõëöóko¦ž†[OJÇM\‘ä9p›ìhÕÄZ²c³ÝA•ˆrdmÿí—±ö5?Æé[OÌ÷7ãûgŒL˜£^:EáÎq1¼ØŽ¬( ‡[»Sä@„-™% ü|ƒ>(å÷Ú¬Ô†Âåá„𕜣ïÀ4W—¸g– Yœ"Œ’|BøÒóDK1Š~DÓTÕˆ5F^ !µ• …oR¯™Ð ˆIš™I²|-G꘹A$¡»Wƒ,§ÅY£3]ìêvV,o´&3·a„bÀaAÄ7ž�!ÓZ[ð`�i@%ñ€È!Oô‚ƒ%“?°1!ÿ�x`¿q8V– GvÏr ×õ±�ìÕ�Ò†À27�…Øù¨¥�m#G}Ê"È,ºXÄábPJá:ïÞýàLqXt‚€šÉ\p[TJ]i†×�G#Tçv¡§s§~¸�‹÷é(Žg&º&Q±ÌM‚™\~K(~lŸž1™"7�<æí 3±µ:1ˆ­ÄCFò!¹E©t‰ 3Û’É`b’[‹`jÄÌýöÂÁi”Á±9ÞD°ò’ ±¬vÈRýF…‚‚Ë$Œå½z{@F}$Ù ™� ˆ×L—I{­€8£À:‚�ÁÊ*b I,@;È8¡¸mUéRiª SÞ&ac0êsWh S†<=IÕ,wΠÿµböW—Í­ÉËïmØóh¯vÕÔâkgÚ£€È`‚I‚UÃ�uÈ.ÍMêv\q·ý—KéÐbí­Ó7>ç%¶ š¾«Ôþƒaº«Ô�…‰à„=|Áƒtãfã�Ž{À°Æ|ñb|™Ñò¯þ úíØ�"|[=LqÅÑJãn£”ë,š[R>Í‚RÛH(‰;|Õé¿Zg¢z{‹B ˯$-X1&uîªvÂjˆ^²ô@DÊ„ƒØŽU™¨ê’*×Á8´b§>“š1*'Ó€ÀÌMc¸LáŠÐjÔÊa¾÷ ±¨X±¼ž×%YáJd¾°-°ÂR vN*æŸ SCs‰©Ü_@m[R?ãB„H.ÃáÃ'&ÁÂu[X¥=š!‚rœ€òßDd½‡ ¡™âc)Á –2zèiðÜôœ&†¥¨-,òvá °j…f%5µ,ƒƒi¨3¢/Ôâ¥(°å.ª¶d©�…Ôš;¤QD‡XÔJL'øµˆHº[^ØÔk——g­•o”á[¦_˺µ:e‹©=I&#X°å˜<‘¨NlÜÕœ$ˆlÉDÔnq{™ ‡88…ý‡P”îÝBˆ£‰Â‚ ‘b+Q1Ã�e6.|³·&ÉŒ‘Íš�ZÃ*ˆ"Œ ¾-Cº0šSÎbüKܱê2 °„ úo ¢œÅ >]úR.Rƒ��¼Ü"er ùš‘×ÛXØsAX¨Ää2Do[>ý{«f÷ÙtižäëêE“Âö®Bf¥¬IPæHd–Ï| O¬¦éIµ,$ÃFè×\™X°ÒŸ•?Aè˜VÎg¢‡~ËÓ­�ÎõCîYFÿü|EUäzu}•n ñ¯Ê…ÊI±ÔÕ”}&W;Næ—�$›ª¯`ô„’¨4v|èû´×ÆmºŠ,ö®F¡ªFÌ@<é£E¬¢,ï�”÷õÇ+Ž;|9úþ°Ë¡xfµ¢à¸cº=Ô,ÁŠ$•0V,#J�÷C‡ ¦P)R2ÔîÓ÷K$é¿h~Þ1WêA�IÑ™ÁCöŒ´SÀã&§ ®÷çìÎNgù²ÆäÒÔ XŒÎ䇎&y‰óÁ9�aY‡MÐí'ò-14hü†›Ì“GðŠ9œ°—›}<¹š¾u6O-Âd¯ÿŽ˜¡V*ù¿ €g&èªË1½È>ï.ºäAdLô­gâ'§DF6|é8{ êYK»–ó†Ýøü%èתq£ ˧m勯‘‡Ð«Ñ]臧¢ß@k`_û#ôkôµ‹¨Ÿ!/í+~J‹zôï£ÓÀò9ûü{é„=¶ÝÃ\‹î:�~t96ì²Ïý9æذ÷XÞü:Æ\s@ö ?¤]+xù,­ßÏÌtÿ:úÞftšÿEè`,NÛf/|ÈSx÷úá&ôëcÎ|á€B‹‚ÿÂÁú8½Xx¦* Á(8úÑK‘1ÆÓz¯š¢VÔÔì“ñÇRc„;¤-CÜ’:O€8±ˆqñE+é ¸ "qzˆ/F±©«'–­êÇpAè�Ø5ξ‹¢FÝÔÊÖÁýƒ¹Î`ù²f£•ùj½Ã.JG×d#ùhfš“†Û<ìbØC£ �ÁÀøìp Œ(.�}FZ°#”ØûQáVØÒHX¹Å!fÍøª)û€�I�ŒÄ_…$V*4O3iw@ìAg;Ô ¢ éžw*H²Dn ‚É 6Ž¢ÕDÎ��FGIbé A¥9BLt/®�ÖTÔG‹ÙÇ0qr“aÊúµ¬W¯�Ú‹¨}å¹±¥¬ÍÍo�Âò*å=¸4›hO"kÄe�™9웢^�-1‘dÐüX–cTDÉ©|Iþ:ÞÄŠ^8ÙxŸÙ¬Þ˛Øª©9¥4ÖSý£b»Þƒ%*AQêQ¶Œ ¨NLrB Y…(Y ’ⵑH¹<èhª ±Ø!‰ž˜Pah5Kš¥¢~€@ÙŠEÏYhvÏŸ>³5X[/göÚ™öT‘YI&Gq'¨TçÈ/#EN�ÿ(êÿäd†ˆØXzáÝØ´ƒ®;—¿{5 >ÿšoáÞãPf8òýêM˜kÑ·ÏÆÍ§bÿbì_B M&Æsï£s·˜ëÏæoŸe.áçÞËÍ!ž8’2ЙOaÓ6ܲ‘¿qÝy=ã uˆ\Kƒ:YK·oÄl «f韟Oßߌ[OÄ\›ôÄQôÃÓèÞõذ›v®ÀöU�ÓüÜûpÆStÍy¸á,ʘŸsº ºw=ÊlœÇœõ8¿àóÓSè›çâ±£ø‚G°r�¯¡AN»Wð€í+qî£|Ú6úúùthd– ãǧšïŸA»VðE€ m[…sü¬‡Ím'ãþcqÙϱk…ùî3ø¼‡±íZhaóS|ÒNúÁtÍùtßq|þ#¼z�¬&ø›rËg>AS‹ñ䑑س·—ßm~v*]w¶¬åóÆŠyz|�v Uu}‘N•©#!â � Ç£òRrm•—N¿t¾¥TH obÕ0XG:ÈØàÕ Äq*’4½!BŒxÔç§ŸýXº22zšÒ¤©ÈßܪF&tŸŸ0� ··qXBIÈ@¾å€(ÜiH 2TËr;ȦgâhÖsSq¥A^"eG¢ñ`à«!¦ÉTk’É™ ä20–Á†ØC�*[بU9�QÑïq�Œ~í†�]ÿˆ8*È>Vk*¢ qßPõ]ð�WÅ’EØù9Èf\&ùÝaø?4“•ÇðÕî”.¦dm©ž¤Ù#ÉðKüâ"4Ï1œ)äõN£Ñ­Oäµå+ÌâåY£A†ˆ-Ä-‰€L:sj­�/­&-ZŠæ"˜Ê33´}/Baá…&ürDGœŠõž�|#´g/4 ` Ë@¦¨µ»Y½¨&¡ž&QIÁUŽ“LEŽÁÞK’:Á'LfdxaT(Æ…‘b`Uš#’ÕA®V‹ ¦¨-6ÎJU[LŸB΄€@Éô±ý‹�®—LttÕ±>±wÉõó1'-ÂJƒ›ðŠ@[ ´&;ظ?݈~î‰XÔ¥“vá§'ñÇÌ?;'ìF½ðמ¾ ƒœ®;�gZhïÕâNߊ›Oæû�À÷·±tç=J·n@·ÛWâ�ud æÚôèZ>u;5 t2̵ NL˜ka¦íÝ€¶%îÔa�¬‹ðD§n£Ÿ�ŒGŽ&€o?ž× U³ÿæ6|îº}ß~"1h¶�›Oáçü<[tª�ž ½KÌ�gÙ+î2`>ÿQsãfì^î˜oáÎ ~”G×ÒÉGñÚƒ Ku[xò2–ç›æ¡cpp†9µû~Æ'WãÑ£ÀÀô„¹õ$ûÜ{iIÓª„6‡öÜÇÌí'âö `Ð\?9…/ý9MžŠ™ %Çý¢…%F/ñP®ª’õHSEG�vTÎö5ÙL©Ç0Ðûra™+ãU³}B4|™�eÕw‘ð«ê÷ܾ\Afp-Ë€þ@` ½ Í’]MEØæ{)\Ë)çF¦ÜÞé,_Z_´´×MmA²÷ñ¥04Óâ:êÝÌßÙ�7MÖ`;䢃|ˆr` ƒ" DÇ8À á@;|.ªTŸH_¹UAáÃY„f`Ujœˆò0Õß8¯÷ÁÄŽ=ºX§·aø.ÞŸ)ÔWÃr“™’,q¸’:RÄ«ÅÅ<Ú´B–Ó:VÆ@Š|±‹^Š’i@p¶Œ¬¨eý†=}’&v ò7l=â…‹:ÿ﨩3ÃO{ཻËÏL-RzÒoS�=ÀlØüå(9‹Íd�ó{—ùÅ–9ö-ÁÚ) ¦#fyÿbž«WÖÉêï^âìZFµ‹».°àC“Tø"†ÇÀ¯“Šª¤Rå+e¦‹{\/°o‰g´w ¯œó_ç–_NÙî?>z}áR ržìÙestÉ]ü�ç?Y j¶1 LÀýÇà˜ýöŠ»é–�|ïºè�&{öÙà”m´¸€³‚<Öi¢-ˆú5ªfèÖÀ&6’dž™0œy2fÛÈ,/îÐô#š[²øÉ/�çKî§‹„¢�›ò�E•_•Ô_ýv±c½˜•ÁWÜ|DÉ1!«wW?†à8EüÔ—‡S¥î©"ž@?ŤÄä7ÅÉœM7|þ@’x®LWé¡ôJlå4µµJç�È釈*Æ.»x°´àNÆ K5^û�†|k„F=«•íéýƒÙ¹î²%õöâ Æ#œêð1Ÿwd&� ƒ<Ñ(àiV§¬Áõ’† ûl‡¦ .2XrÅ4VŒŠ!‡¸^Õ—Ãê½ò®áçÓÆ�BŽž�Z�Þa%‹¢RyvDÏæ ºœ"Þ!.IÍ‹ xºžW3y¿iQúª�Wjd¥I!IõDÍÂrØû#×Ìïø�‘¦Ìó~^ÔòíIß•Ḛ́¥Z’8 Rp€}hÍ!u3CÍ nN�©1ˆË’ffùà4:=8$÷…yX!”�-«.®d_P‹D’ _n�1(�æÍ®É}wKðÄâõ<ò¤ýZUF©qЊ* …"I`SA´p5 0ú¨B>Ƨ1ˆ¡iÕu&©obf"ÃV$ñG²ªd8RÔ·äŰBƈ�Fä2n€‚q[§þp¿þݹæï1}ù¢Î§';‚B¡í3€üç‹–)õ!o~ �åÒÊ‘HmÞ,ãC?=`üÔ ä8q‰ãRl#&BNÓJnæ`W¨"°z,iaèºsðÝÍþ„ACÏC²†®::\LL<+÷›Ô‹»`ðâS\ÞÁXûKw`ù¼ùÒ%ؽlø—nÇâ®ç�5âÍ qVY eÑŽÙ(3ÁØ�kÌõgãá@!Œ�i¤gŽêy`Åá_NÙ‚i°¢ ,šz"(��ñD*üt¦±„Ñ C‘Êa„A(P¨â‹1SVîïààBƒÛ c¦WjÿÏ2Ž<—`L­ELTƱöiO#g¯Ë¬, «%¨¥C=Ã%lÃFÆ»@› MS+úØ·wИ®XÞh´ G8÷€."•G :(–°Kú0áQÒ‚õIªMÀ1è¢èQ . …!Î=C·ìaÍÁw&‡‚6$QÆXMNŽq·*z_¦b¼Š4‚WÑmnD†¢Fê+´{�s‡…¨H²f²A9ŒÌ .’ÜDÒÜHp(�åc’:‰GRìõ„Ù�>,³¬WÏŠ¬žQ{’Ú«(ËÓx"&ÜTT Áo}YøËµ�–m¶ ÕâbˆÙ9˜æÞÀ•<€1d­J$º¥{ÉÇÇÅF6«Ž€ø)îfÜj™†À¦ÖÍ›ÃPcaÑ[„"Ÿw ÊêHkX°[ç+á$d‘¦¥ ƒ¢6±²ƒ˜)ðBŒ:‹Ê«zbn‰H9\Ð…õÉñÑ$•0<(FàÿcLcwæœÙ6 ¿qùìƒú¶a–¯ÈlÆË¥¡¹Vʇ`阚4;Á+gi¶k*£¥W%#ÙþÅ1ª1„úR½'…|2?�žª& yOŠ‘B³OäÒȰÁÆö‡¯¥.«VeS.±)*9¬þ&-–*w®�Sì{Òó�1ÓÅ Ýâi¿âab�*#R=3`L¸?€†–¸‚åX‡ò õ¯,G›ëE‡wuûí Zº´ÞhK?¿( x†l™H³ÚU˜­§ÈÔѬOÂhÐe;¤bÈà 6c[Ù2ø·äô#žœ…!İ~Ç—°:Õ@3šÞP9êÜZRQ`éhÖ�ï^/ƒîJb-‘TL{8oÀ ¢ÜdC[ÅÖ~ÔTô–Òx§Ü�M vŒhG!ª`9è7�Á&+ò¬ŸçeÖÈM³MÍ ªÕ ëïòöÂp Eb åò ¡êãÛ "²–ëu´&Pk�r`8 éžš£ÞÀ«Gˆ…Ü%^ª†à›wø»*„‘.·/lrŸ\ˆ+´Šr€13¨5{Y�µ$! «sü &9R�Õ>ÈÙS¸86•€ 7d"ÄHÁ�ªn@–³¢áP:�·cVÙ‡,á>“¤%N0˜¢ÀƒíHFÒ[­5oÀ�]c{+)'¢Œèù‹º—NrÏk÷ö ³Ï\4”žÉÉøqI˜éz7î2¯¸�¯;‡VØXíÞG0”FÇ[Á¢|ãç¤"8•,@;�À:ïf¥þÂl‰:7@¹�cZ¨\˜AyN×óv×B¯=‘-[^«7}é„}ê׳Ű€ËÍÐÌ,�C&›5©Õ2\rÑ£a�‹¾]/ IDATYF‘¡ÌÙç =Ü!¸{]ó˜Ûýy&r0qÐZJqŸçÎSßÒu%œ*jHwðˆ(|‚W¸š D�µj×(¢#Üñ2÷u,ù&$h£cô¡žû|`cM>¬åÃ&€´êÄ8‰‰ RÈe®¤EÀ‚$@ᤡQˆCG4dÙúƒs�¿»kå³Û½Sšƒ-Y¸zjÑ—¦íÊïù´–ŠÞœvEÔ ‹ÀgG貎ٰ—¿¿‰‡ÒàeeðŸ›Á¯ù‰©üÈQ|óÉØ°Ç `Çr|ñÙxî}ô–ï�Ó¸ñt`@ü£SÑÏqùÝ´l�§[¸e~v2Y–ÆÏȸ "Õ÷1H¬üš›é”]L%üü»ñ¼{ph’>ûÚ·”o<¸ò´†¼u%<¡Ç"âtÅw­§N�Ÿý .zÄ8°ˆî8‰´t�_x'î?–ï?–@üðÑ8v?¿ð.Ú¿Ó“tÙü¢;í;¿‰N·o [OÂòùÄy(æ%+ºïX>ršß}[ƒŸgnÜÌe†ZÁ¯þ)oÜ�Z½Ÿ.~Àœ¤Ï_Bû—âî¨S·Ï~=�P8f®ÿÖ+åzÅPCHQ9‡1ÂÖÊÉ,2úò€Òá8¢‘ûà ø!¶LawNá zÒ éË%Âpf*îL:š¢ÇÁÅ7¬¤‹Æ­U�ˆ°ÝU´$áýëx¾¹¤¨Ê¢*VzJ�†™¨—ÛZIõÒ¥=ü®OX¢1ªeY�³Á|¹³ÓkOfKÕêm)ëØ‚Ù|Fwk]¤’ îçž$ƲL†j¨µÁEÃ}*›¡ÌØf1ƒ\­_xÈa/[aŠ:·rBd}ÎÊàéî”ôæ2€:Åû`àºáa6‡}— ˜Ëlˆ2˜’m<+hûøT4*b„©¶³~­LY‘eÃ,æ5“5šÜ\Jõ6÷ øÇ[«…xð‡»ZI,'A‚5–93Ôh¡ÑfScÊŒ-¹×ÁÁižëÒ°ôz=¥ {Å%ú‚û‡3JÒYZ©}H“ˆò´À1 š™ j­žÉ‚�d—¢}±Ä ñjÅû0}´=:G:Ub FË2b$#gZ¨AšÉK©�ŽB�±PÞEÉhPÕT‰ž�ÀÅá½I@£:HNYýç–L¹ŒÍò¬|÷ªÙOX´·¿!Ry%!˜^È”�fÙh€62�Œãó{JL G»Ä,BÒ$n…Œ$™�µÙ#„‡Hè• `<ûAÞ¸W_Jþ‘_8r‘ržÚk�Ꜻ2Pî?Ž«.ÉW�’凼k™¹þl¨h•Â8b¡º±à=ü(8öÌd©A)£�R¢Çñ5 ãú«±Ç‘ï$-W#…t‡6N 6å3§@ä¿Q‘Ž2 JÔ0Žn¡°BîÈð™ N/ƒE7ŸBß©¨+1€ÜR³0l™á…�Á"²11ƒ™K[³a»•/[Z«·«aŠê¡ǃ¢û}/hHHù%ƒ©J¹° EÕ ,U+Q‹ _R9ÂgP˜1ü›‚€ŸšýP¾}F —•Q¨— ÈȘ�œA§ŽA6Ž-ÿ…LÓeÁÕ‡+ÀW J�RŽ�½ý Ú�,7¢3ÅßÈ9l¼2úJ)üï½HýE«ãÐc™†Ã0ói¾rv(JðºÞMâ®Ôqm§iÑAÔáfÔ� ©C Drl‰�ùÆd8¢%(ùŠhuPîá™ÁÁ˜Xä«vî�d5Ýö© 3ÜCý…-¥A§nëe‚Ÿ ‚Tå& Ïò Ù`Þîêõ›M³dQ­9éºt÷ƒËÔP¢„©n¯KL–ÕCÚŒ!ÓäZ˰e;¤²Gƒ—} Kà6Ó-ÌVV( —à_¹ƒPI1ùÔáQ=q* ¯£ÐÁlTÀÐ?e&UCÄ�[Ù‹’å”õµ®ÿ‘m$÷(ð*t‚Øde–3Sf9›Z†F�¥”×É_ªbÀ”¡d¤à ºpCf튻|ù•ˆ›M4&�×� ô17Ï3 èãí¶’3Á°ï f í| Ë6´Ý[A5gŸA‚°žužõžGTïæõ�´=ˆSq)%‹xH4Ö„‘bW5õêI¢ê<‰‘ œA¼&˜o,Õx‰SPJPƒˆR D<�>ùè”GâLºRqbƒÑ)Ç1�’Ž ZÑŸp (‘_pOã1²P?ˆ*Uèé½Å†1B3`€x¹PBÉV&á¾æ_œA³%šf?·™A}hBSùÛýô}õžƒyf2[tìžn¿6ÃKÕ'&3“ƒ™Ø2BŸv�XGµ”é€/¦¿JrdrΖp��Ò”.ô-Í`Î` q&8'€®…¡ð£"ß„˜=`ø®aFâ÷eTŽ'£_›¥„6(EÜ컈J^7µ�ø(S•¸~¤Xc�)²|˜k2P#7µ& ä5¢ Æ•¡’6ÿäMYŸc×ÞL—X|¥7äŽ�7š¨5 9à,Ñ[ÀÜÍvxP@F¡1dˆmø¿ëš@�¯qÏ¡7>ñfmA†"”ØÛ ófÏdÕ=�ê €·$v—kšÈP‹”ý5ϧ�·H$”ÈÊRî�'á �.O—㕲N�2cL=$œ"%¤FIÂñq7’¤ä!ôÉËâòÝe¤� s®ð¿0¼k—²v#‹)”âè÷õ<‰Ó×n&¶™Dµ®Ö*ƃBtÑ©?¥-ÌõÛiÕ çKîêYóÔbºq3ßs¬ S r¸ßïÐÆ‡­V7ÊpVg÷TñÜÉŠBê,®[N Àhª"ªDòEE£>ÌŠþaÁhT�§½œ£Œ?Ìðò¥ò*á"w8 Èø+êv˜Ó<$G¶{µ$¡ @ÆX&«'Æj�,ÎU!M%d���îÃ-lŒ4z®ÊOG ( Ù:× 2E¤XˆU p�»4‡É`lÏîïMMä““YÞõ¶l¼™¿ïÔ—E.ÈííÔ¹ »:ŸÉ欉¼M kØ¢P1@9àÒ—Kˆ 8'›¹"°lÜÇñ%"u Jêb²T,m¢¯þ¤“”ÜB…!ø%»°ÛƒŽÌffdÈ~Þ5Iý[ìœ[Ce–”ÙÌX“Î릹µe5"=9�¬Oû\üR¼È¸6VçêT²�óõ&×[05��e.†Ôéò\‡z(½³óKw¬0Á£ƒ`CXFŽ÷Ì0$¿–Ê6„¢ôªÏ^îRÑmbR½›ç%¼!†("¸{yž$òMT¾8"l ZG‘—*™«;¥ãù£¶a”ôV®ÊH#Ðè9/·ëkR_˜ ˜~«‘©XÈõ*ù¥f dÌ(ÿÑ)!`S9G-¼‚Z ,)FyïŽ1*1ÓX24=ŠÏÕ ¡2Î/‚Œ›WCï¦#93Bþaj»Æ ¨Ó…Ês€ WK~¼2(Î^ɤ‡Q+¸ã¿HÄ?B¹*@M$Xë|5?%Î/aŽa«Ÿ�Î Ê _Ltíý¾´Â>k �%K˜,±{XdK·›fñd­Ñ20ì€\w¨¸5³ttú¬½Ž—%[ºP½D5'×â°ˆÙɹ¢bX°eb&¶98€¼3–ñõ>At,mÞÒF¤kæ,µ�Cb­TòbñÖÙsHçAñ>&$ëÛAa Q&&bS+ Jc,åeV#c ò:×jT¯SV ÈßÑ‹ lÄzqÀˆºÈÇ%™A£Éõ&²�˜2”Ct{èô0ßãþPJÞ–É[‚ßÁyÙ[DSϤ$Y%ÈÂ?îy òôDOêܼ!æÒÔzY}˜0[RÓ‰ÖE%I�HŒçE\ GB0bPÁÁ•õ1"LXïUÈÅsã “ÅZA•ë„m‡Ë+ ظ‡}±"/RŠ3rÔ‚à T íŠQW!+C嫜㠿àKaœüHq4 ùJBi &b¥ÐÈb½©m)"ú»� C…£1 ó×PÅÏê¨rÿaÒþBa"õ[-%¨H<ŠLá¾µ#gF¿¼� %µ%ˆà½Â"+Ž3ña£ŠX ¯HdŸC‰†„L 3Bš¨¢E!Î�Ì üáèíÂ�±<rÎŒPŸž6¢—¬�+÷—KÞï~ºhà D &,½S!Mêψ�r ƒ‡a“åÈà¾ÅËŸ.ÌJ#ž¸nÑ’�ð‡e ‘Þ³†b Ž„%³Zw²»v£G?7FmýEþ äEÎ6C>$*…uú>·�³do“Nïj”‘¥n§\èôk5³h"›hgyl–¼Ê¹yýoµÂ•�a½uÂÝ­‚`¡ß#T>£1ËÏ\q^'®£f˶$.Q\°”=”–-‘Ki ˆ9\:�¥¥éB?XtËìEÑÀHV, ŠÄÒ¾$‹_ä5jì!�JªÛz>Ì2KTšŒ(³”˜ µêuÊj”»Pšu`¹?BÂVŠD: 0Ãh¬BTuâƒdéÄÍMÎê09܃I}tû˜ïRoÈÃþ "|�áàÄ8h'üÝG^¨Ò´ÊÒ_w˼(œž°SË0Ò!!ƒ1L7¯÷ÕÃÔwD©µOðq€x\PºrÏ+ 6! #‘LBÛ„‡ã!d^¼OŒ¹JÒW¨æh &¦5pÌ‹@qÓœ¦[†y"ª"\TPBRn¨é|4<2?�¼ú– ʪßü�^"=9EוÁ‹t0GôÄøðÆ ?A@÷Ïh%;í°Ó~=yÄøªãŽÚR=~˜§¢PX>r°2ÚØñ“ƒ�eºâ>ŽŒðô+DIð7ê½ÇÇ‹Jãµ§íp4.à;×XòFߌ¬È £+ Æ(ƒóN¢BF*°êøª©æ�Ž¥AM!S…~sa"QÍm‹Ú*C{Hô+¤‡–™YA`².IëXœäQËÄÌ–€%ö…"\²Í24ëÙ¢‰¼Ñ¦,‡ß¿Zy,g&�¤/žeï¼µ¶?y`û&ûœƒÁ%¬E9DY°-¨,™K*™-K>«A0`ãCÔð³Û HbÖ8$ÃSÝ�²ˆ¬O¯NVèm ”l,qI†ÙÌÎ3d9euÎs“e09c|k`ˆTÈ·¬¶Ã;pßîèäAgÝ?(Þ4ÂL4^É#ƒZƒêu›7Èä`€�b€þ }ê¸?ŒòÑ»œ�s y€p¿çÊ¿S. `K¢|¾¶ã ׃”Çòëqt…g¯ÂgHY4T!ËQ¯£Ö„©Á䌵Ü`0@oˆîý‚¬ É/BéV ™;ÈZÀXÛ¼”C( ¤,>Ä!lÂk‰@†d}“—1‡Ä J›îƒ CU¹[߬ªÌ- r„ÿUŒî ’Y< ‰â<%ÁóÏ«ÑkB¾& Ž$ž*è6ÉœñÞæq´%ÿjü—3”³•zg¼\å?bÜ6ñù˜,FÅë=Ý«ºº„ð$�Š}î$¿?'âàÓò#Eöð¹êhÃiÚ‘¤N;¶† G§ªYtF8w-Ó$Ä‹àSÇ3ž #¬«Dú §6ýwœ£'�¼RJâ$žqä@0Ddi�P{ôÃ¥´™;”1C†0>©Pó°2Œl©‰Ú6¼QuLH¡dÀ¤¤)#úàÎ"¡Šý¸—¤ÇO5‡U€ÔlPóKhŒ†¬·Ž:z«ö‡l³Ô'’,Ôuœ^ ˆr%6ŸX™,:Ô\\æ°†ÍÐ�Ls, Íx U• 2 Pf€ÒòÌB1ÓA-£ÉVÖžÈòöÊ~ÄåTÙIHÍ+Y‡sØ$QE Üý±�æÔ/“çlÂÀNí­ËÊø‹-=_Ù2—°Ö�ûa ³/¨[Ñ/ ò o3¸ß¡Œ�1 "¹_ƒ$Rê =[¸ç ¹^短�‰8¨7Ï})n*H=ŠÎÒƒ]PB_w'àœ×Po Ö€É ‘-y0À`Ƚ!º\”U—A!&€Ê·{…e"ïdµô Ýn¤/8±hzldnøgÝ,<<�}ןÇ2�K©U#bYøWˇ»t“¥HJš¯œ�‹«ÄÜÀ‘å°¬(žé<¤‰SúV Pȃ ˜väã 2óˆ åê?Ê÷ˆ-Æ|ÎÈ‹ÈÝËGD'¬�:}ýþëo?¡ëëœÛ�â²3·ÖkÅ5?Ýh­*¾Ù�¾ì¢‡ÿäŸ/Ûup²B]@LÍšß{åÏV¯\xßç.žï6À¸pÓ¶·¾ìÎ÷þËsžÜ½4ÅÂô`ë×Lm>~ïwï8¡Ó«¹Ã­ÆðÒÍO¶ŵ?ÝXÚL2©~vÇÑ—œÿÈË.|øÿ~æ¹»§&9Ânxþ/_Ü=ù˜ý™á8%ãàlû¡í«|n\ÜAh·qÖ2;Ñì«gÃWeÂŒþ ïj¶>n9jÅ܉kŒúNf<µgé¶}Ë àé®û�+²fÅüû¯¾t¾[pÁ©[ë¥wüÙ¿^ö䞥jdRb oç+^)l' ;XEùEgÇw&.Ÿ#‹âWD|â°ãÒâÍdž§I«)›Ô��ú6M¤2©¸0ÍgPà�^¨6A©q$Ž8Îäï•CœÜ+Á˜Ä¢\b2Ÿ2³pFPt…>ÎqJs�°ddª‘]Z˜Zd@‚ú�z°!Û`*@C�%YNñŒ “×mö³ù'B»ref À¥¥CóÅ¡…¢^3íz6Ñ6yÆý΄d=C¯»ä(üCÄ#_¢‚‚²ÇtQBûèÈÞø/æù½»ÊT6Î#æ  È¥ ¤]Tû–èhÄ÷î÷¨Þ™‘tÝ%>ÐoÄa”·Oô/ˆ6�ÄŽ˜é‘Œø¢\ZÜx ÷'J惛 Êœ×`j^4ìcX¢7¤þ�ûC2Eà?3ÈÀ–ðá‘K–‚ÈsVã>Æ�âN*ª÷EO©Á?"ÄZ"¢3—l:&/åBR½ŠZy•�UÔ>­=–ú‰ð6Å¥ˆLÞ6cø¢·ò�(—‚âDºÐB#8D ²ó¢RŸïØéÍÍñ!ì8Ü£?Äu„ \8™5_¢–q$OY˜*Ë~¦ Ê�1dèÙ§o»è´m'{àôuû�Z975×êMYš³OÚ}æ†=gŸ´{¢1|hÛÊ;]½uŸþí?W=/_zÁË[ý™…ÆÈ· »W»9<ÓŽw¹ã׳NÙqÌÊÙùnMÑŸˆû¢Ó¶]tú¶“�9xÚú½kWÌMÏ7‹ÒôÙ3NÚýŒwŸµaÏ¢Vÿ¡m«î~lÍ“{—Ì9ŸÂõܾäüG·3�†")õ¸ ϯ�¤+”1éÈ£r~šÚ¨®dÜñˆµÍ“UšԵÁ4u#g%i–Ì“l +m’ãiK¤¬›áߪ¸µŸpòøI#Q Í2§1¼£I2º0åŸU¾ )²GHâ8·f@4¤¤NÒIéCØÄä÷#$Œ�1 .JZ(¦PÏ©ÝÈZmªÕÉ)qRÉ^H� K÷Âöý�¡uC’gˆÍÎÿ„¶Àp=+âbHô!~‘Ùµ‹*ßï_˜ –Å#Æ„¾evÏ,w©ÿàÀTœæe‚üÈV0|Â,’ÒxÃ&”,†S‰M ©a2CÈkÈj¨ÕÙäl2Ç*- JîÑ/¸,)Fs$Ý Ì,Oš2îq�”¿víð ¶Á3Jj%zDá Øú´“cÃß›Ì&#ÆÐR×…Ôˆ9%ž[Sõ�1z ¥yH}+~¬¨éä€d#lúwÛ aÖè©)D#|<ù¾IÓÆº¤tŒŠå¦@¥ 2f+µDÑI1w‡±JmVx¢HU3ªUxå £K^Â/œÈׯY2ÕÝ÷Æçß{Ѧ7Ýwìçn<ýž-«o{xíÆ£§¾ø¿6,Í=[Vêšs|ß1w=vdic�ç³NÙùù?úÆâvêõä>‰ôÕéåoúðËxï:GU–ñiÇí?qíÁ�žºkËš Oݱozr×�É ÏØ1×­?ãÄ=%ƒ@Ý^~Ç£Gõ†þ17Æð¯<ÿÞ‹OÛþ£ûŽýü�gܳeõí�®=ᨩ/ýñWK6÷l9ò®;ûæû×ÝýØšai‚@ŸuʎϽ§JáãW¢Ja¿öæ¿ü¦Ÿ¯sZ~ÃÖ½áwO_¿ç¯~ë†ß·î˜U³oÿä‹ ø‚MÛW.é¸K6­ß÷ò ò¼ hû�ÅWþé놅ùÒ{¿ü¹ÎúÜ ›ßxù½o¼üî×¼ÿ—‡Evõ{¾šŠ�Þúâ[ÿäW~ä" f|ö†³ŽyÝÿfƦuû¿ðÇ_¹ê›çüý7ÏU”zÑeoZçxxðî-k.8uû¾éE»L^xúö¹Ný'î.™t{µ;;ª7ȃJ¼ñò{ýw¾æÏ_»ozb$Îðít£TуϼU�¤Ä!F8|T|Y²IçÊ€’ð@õÊ1±…cu Áé é Y„(Ö ‹‘:P@:'Ò#ãB µÔ�HÝ¿ÑS{û÷û�ÑYôz˜âz$¡ìCG·w3#| ±YùôglØñÑßþÆUß¼ðßðŒ#9|!€Ì5 Ï’ŸŽ‰`m¼«ÂýãÄãL¿Åг *Ó�bºƒœL«N­VÖhÁ g”*2ÓË—Ü·Rñ™$¢Õã§b�D΢tíÎp÷ çâV¯þ 3×ß ò‘†+ù$/]yÁ�¯¼ð–wþý¯œ[Háˆe‚,˜’^(2Á}¹† O¿ nQBRVºÃ,ICœçÈk\«Ãä0™TÉÔ¢(0dèTZÈ Á—º<¿%C!A -…BBMH´G`–ñ¢ø+xNRê¶bgÎ [LÔ‡ÿò›_¼këÚë2ËCK]ÊKwí…ãíÈ/>YòÈî%h�¶*IB�äCdÏÖºû¢#D…uñÓô@ D°þNh¢EK”Ör_[f.‡ãôIïQ H/\i ¤~q/  ‰qQÙ·ðøÍH¬Ý _±¸5‰€Û]óŽO^1,M„EöŸ¾ìÛ·mf¤%óèŽåoÿÄ ë¹5†ßxù½Ç9ý×_¾`G3t IDAT®[¯H¯°ÙOÅm}»1üó_ÿÁ³NÙà]WÞú®+oýÆÍ¯¾aóië÷.i÷?÷‡ßp§í=4ùÊ?ûåÇv.SÒ¥;[ó®O½°/¿jF a™ýÑ?_ö·œTÝø1xdÇŠw|ò—êyi Þøü{Ö­žþè—/˜ëÖ+~§,³¶!0‰ÜØ“�=°iÝ�vc¸zÙüòEÝsNÚõØ®å7ýü¸°þ™nãe<âɨpÌÊÙ»þáïÝñ½å†½å÷þ¾ú”#êÞÇ×p/þÞ]'웞¼òÙ­_3õwמûÈöUgmؽ¸Ý?÷”�zQXséæ'™±mßÒ'÷, ‚n×ï{Ó÷Î;y€w¾â–w¾â–k~ròçÿóÌMÇí]ÒîŸ{ò×=§'_ý¾×lÙ¹¢â~ÔÇDVAƒËpç(ÀˆKö:J¤ë±©G2֮Ñs7îø‹·üçÿ¹êw=¶†Åœßóú›Îööo?¶cÅŸ]}™2l@‡¹ � á©�3ód»–zá9�ïúòÇÝÑïÝ}Üß|ã<¹�‚¹ú΀©¹Öwï8 �G\¿úÐ×n>åK7m²Õ:@%ñ¢ùп]ôѯ�g âíß�h ^÷Üû·ì\þ†^95×$¢?ëÑ?ûµ œÓ–<óñmÿþ17ÌM÷®ûØ×Î�£JÁH»–Cs­î8„“Ö¶kÅ–Ý+O;~ï’‰ÞÜr2‘ý÷?ùêæã÷¸¡ß÷kß`-}âçÿõ—/ÔO¸aƇ¿øì�ýYÆà£oýÎd»ÿÚËî{|çŠ_ýË+Í·¼è¼ÇÞûÆEø©éŠ x佳ްBJ¯ñŸB(áì™!é2•g0HY_ì�Ðõrfžl ÞõÊŸ}ÿîõ÷<¾ÆóŸÀô|k¾Û˜ï5æ:õéùFh�NÿøX‰FÞ§ßÆÛF8]¶@$=¨GHâ0fLϵç»Í…^cn¡1=ß�\5W —% H+’Îé¹Ö|·±ÐkÌwê3óMfŸ …:5¸ùhâ±±êÔH»¤ö îÙ²öýW?¿'�>óÝæ 0Š@‡¹5]ß°ÑíÚZ�²þGª°$›'ŽìÀ\ø)îÎãi\¨g¡Û³c¶Óêôš�ac¡Û˜ë4 ʈÞ=IªOêÑ*ÕQÓ2æÚ�~saИï6fÝ€J»Fòdq?ªg�W5Ù*#“½þE§<üž_þæ=�¯Û}h)»çcÕØäÈsd5 Ý·M®7:ƒÆ\¯9,PZ*- ׆Ù/PXˆ7bE‰{&¦c¢ô^ZÌ,´çûÍù~c®Û˜é45ÅÞÌBvˆ.EOÞ@A²G,jåî!Æ€Á–Œ‚MIy‘ ¡¨¬bYênÅ\ «³§ LwZsýÆB¿>×kÌt1ý<°ëÈëÜðîË~vßÎÕ3݆·U’íJí%ÀÄ Ç ‚”Þ܇ȃø<| Ç¡¿ábİŒ]3}”»I’ž¡_ÇOäuBrìÂyF€°‘&]D‚¨8g\o•çQ¥s·ÎzžÝùèšO|ý¼ÒâÍ/¼Ç}m Ÿ{Ê®z͆ Þ¶ò‘m+ÔÊÐÈË·¿üöµ+çÞõŠÛÞõŠÛôWÖÒÿûâ…ûš(¨Pè‰|ÖÉ;kµòW_ì¢ õ¼`ÆÀ;Å@/ݵeÍ'¿~nYš7^~¯£Ê~æÉ;sùõ[?º}åÃÛWú�êyñö—ß¶vÅì;_që;_qk…ÂéÂ�ýY/œ¿,Jú£zÞóž¹eû¾%û§'/>ã©ZÆçoÚqÄ’Ç×ÓÖïudoïD'®=ø¥?ùÊ ©•„×'ßñ-ýqÛ¾Å/ï¯ì™š€ˆ.ƒùò…sÍy—�õÄÞC“[÷.ý·?þ*ƽ‚U8wãÎz­üà.qQ€FÍñ0qÁþ5ÙüÕo}÷賿õñ—î:¸8ËÊŸ÷èo¾øÎ�ÇìŸYh|õG›>uÍy³�æië÷^õ»×þþ§_pó}ëÜ…lÚú±ß¾þ­{ÉÝ[ŽrB|ΙOþÕ[¯ïgž÷­ÛN„R8"pò V1q@眴kýšCüÂ%Òì}Ê¡¹Öl§Ñ/ÌÌBsj®òÙÇyè÷^ýÓ OÛºbQwßôÄ—n:íï®=·Ó¯O¶úW½ûºKÎx À?~çìƒÓ¿ñâ;&[ƒ\}éW~¼éªw_¿š™ø�ù¯þõ†³Öyè÷^ýÓ‹NÛºÜxúß_{n§_;mýÞ«~çÚßÿô7߬[ËE›¶ômß~ëÇ_ê–|h®5Û©÷ 3ÓiNÍ·É{ªª7wf‚Vß„à€škÏvƒa6ÓiMÍ·¤—š@|æ†]o{é-çlÜ6Ñ>±gùG¿|É�w�àØ#½û•?¾`ÓSËu÷OO|åÇ›?ýÍó;ýZ«1üûßùÚí{ìêCœúÔd«ëCë>ø…˶ïóÉ¿î ß²kåB¯�Ð` ,j÷>ñŽo,tð�/íôòF}ø—oùöª%óïø›+g;­w_ù÷¾ägyf­¥¿üâó>ó�sXmc²<4hÎuƒA>½Ðœšk»gb‰ Ru:ˆ7ŠkxöYò{§ŒuÛs½Fߘ©Ns×tsï¡2]zÆï|Õ�§ç'Î;å‰ïÞµ9ÏÊçn¾ÿæNþ믾¨Ó«½rêÍ/¸éìŸX2Ù98;ùíÛÏü·\ÔëÕ›�Á_¼ùKo]sôª©ÍÇoñîÙôÏ×_:»ÐbfÚó½Æ`˜Íu[Ó mIiúac“¸ ªï4e¯«ÏðL§=ßm ‹l> ¨ânç¬ÚÍÞ{~ùºÕKgÿøêWí=´$Ëø²Ó|Ý¥?[¿zï|§ùí»ÎüÜ÷.ìô['­Ýõoüʇ¾ò’;[ï‚ûgžðÔÿ}í5ïùÜ«Ú~Ì�Oÿ›Ÿú�™Î䟾î«õ;À~ÎtÚsÝÆl'›î´öÏOÌõiXð°äAl>ê‘‹Õ|wŠ9 ‡ZsÝÆ Èf{­©…¶3÷v½ø»7}ñŽÇ׳rê ON¶z·lYÿ�k/ß6µléDﳿùùï?¸ñ“7<ÛÅø¢Ï^¿ã×?ýÚ³×íø�Þt`~⢓žøú›ó¬|éY÷_߆ßÿò¥®OvÅD÷“¯½áòÓŸ,Kóµ;Oþëïž7Óm0s–óKNì­—Þ½qõ�™Nã+w�ú·ß?g®[Ÿlö¯zã·/=i+€Oÿø¬©¹öo\r÷d£ÿ�ÿ¸ø3?=“ñ½F¿Ìfz�©N jm̸_yÖCž°õÛ÷ŸäZµ¤’ó£Ý»mŒ;Éç]FS¶%bŒAWŠNÐø¡ÎÒSÇg—p 7"ÃäjU¨}ÑhüàtBâ¶Ê(ꤘ6%!gAô™Î¢ܳ¾_Ð ÎybíÊY2cû¥w„ë­¥�|åüo?’8&C¯î}/¿à‘Ùnã/¿pÑö‹ÃTK&úøº›G81º@<±{ÙM÷®[µdáÍWÜó¯ÿy¦-ѬÛÁ0/­ñT²¯îŸnÿîãEvÙYOÔ4€ŒìÛ^|'pg ðãß8ÿá/® ±!À¯¿ì¾—]ðèl·ñ¡»hÇþ%aþÅíþ¼öÇjÂN£^+Ùš¢Ìäcñ®+oq.ʽδÕjø�§Ž8í-¿½fÅÂy§ìÈÈÃozÁÝÌøì ÏpYœ¢4·>|ôÞC“†Ç¤¢(DÜn Þþ²[o}ø˜q=J˜Š‡?¾ï¸UKÞô‚»?÷ŸgZK�Z9fe¼…'Yh£Vþñ~´á¨©ßúØËv\ ð«.zð¿æ'ÿÚù7Þ}Â1«fþü׿תï¿ú9�îXyÿ“G¼è¼Göà1eiˆpñæ­�ï^öÈŽ•�„ÒÒ°0¥oÈ‹úÅ@øÝbD»ñAú¥g>ñÄ®eOì^&«÷nÝ»x¢y¤µôàÖ#žÚ»LJ×XèÖúÀ±ÿðÍsöjŸ~ü¾÷ÿÚ÷¦çZÿô�³ç»�7üåÿgì;Ãä(ކ«fÃÝ^º; IwÊYB�I€“sN Æó‚ ŸM0€m0Æ6Ɉ¤@TÖ E”sÎ:ÝI—ómšéú~tžÝÓûΣç´;ÛÓ]]¹«ª{®Í »/Þ=ïš);~ÜÕ犧oŠÆCq×鈆oyþÚŒpòÅ»çû~"€Î˜ì°%{tÿÚçn_ÔÒžùÞœ bÊ“v¯ÚÙÇóáÌ“8V¸çhaVfc¸ópé¡ãráé.µ�R^éå‹\P‹ w*9|¼H’—†ö©{óW³wéù‹×¯ljÏÒ§îp]!¾+úqGÅ?¿;­¾%gTÿãOߺ µ=ó?s'ÝyÑšç><ÿÉ÷.î‘Ûù想¾zùcïþÔ#™C”+r{Wæóÿ=ÿí_qÃ9þ3wâugn9y@õ/߸¦µ#ˆ¯Î8ç�Ùgõ+kzû×_ª ¨)¾ë¥K ;Þx`Ƨ•ã¿Y5Š;£a…Šª†‚ì¬8EhסÒC5=€C:*a,ÚU,IURrãÆ 7/ ap¸6/;£ÌÜy´ôpc‘“ äØÀ“êžÿtÚÌeÃ_ºï›KÇÞ÷êͼ뫊²úÝÕ½ãÞt¨ÿô¥“›Ûr÷>þÐåsÚ:#_,�ÌǺlò†>»üé¯íYØòô-³î½¸òµ™z ‚ꆂHfœî«)­n(B“”(ÜB¨Úö?—„ÄkO@.ʱº>?’Ñ‹ì«)«n(’l Vî”J>pɢВÆß~t]]s>"^4~ÓÝV~°ð¬å;‡ô*l~øÊ9™Áäß\pàx鮣=ϳsÃþ FN0€“Gî?ÚT\ßUš[@uRAV®2t€\Œ‰ÀÔöl‰9[«JÖ·tJÛ…ˆ¼\�§ä&ËÚ©`­¶¨t¤±0+3ÁwÕ”n*n4�ƒt癫ž›}ÑŸ]Ú#§ó­Û¿üŸ —<òÉe*hOÀF32†CzÖÍøö¼ï6�x醯§ÿ8êÆw.ý¦ùÃ{×ï<Ö€®ž°ëo‹N9ç/§,iyþêÊP�=5óÌ$s®·ó7ýøÚ‚Sîз°íW-‰Ýß3µ=¾ùŸWf†Ü¯Zxíø]?ì}ù[×GÝP»T7æeg–8;�•l,DTʉèHsþ®ãÅg94wç æÉ£I•;¡+$ ãVd[ò´¿1WüRùË€‡@<Ê,’Â:¦øBšy휧AY÷  cE&PÂg1탈Á¢Z*…Jæ í¼)ȳŒ€P”ýéäš–v·WQ8HI7pëóW,X?à­çdÇï|éÒx"¨GA¸jÊÎ'o^ÞК•IvDíš�©�—dNDxâ¦åOÜ$ÜŽYˇþuƤ;/Øüð5«÷V/ÛÚ7NÆ“ÏgüòÒ'D(Éï:kÌ!×sz—´�ƒ,éîzéò9k½ö‹¹%�w½tE4ÁOæ‘䫦ì|â¦e ­‘ìÌdG4£µ3Ca‰© ¤ÿ@¿^-Í™íÑ0‘T$-<ùñw/ ¢ó&xñž…$’è‚òˆ8ºí‹÷Ìß¼¿gG,\Û’�¶ò²â£û×>ðÆOk›sLgQh¹„%}\’dË^i4"Âã7,{ü†eü‡Ù+†½6sòíço~èêUûª‹—o«ˆd$ã®tÎ ®aäöàU+Oyäþ×.9p¬€ò³â7�·ù“E£?Y<†k›rÞývÂÃW¯z盉5�¹_­þ›–÷îÑq¤6/?+vúð#³VŒìŒ…H?lé7é—?—¼§t”q*‰Î¶ öËÊL íÛ°i/“7dåöŠ•;Ê�àýyãdÈ‘±¡-{zåh>Jåæœ¥Ûö�pÜqˆ1Àx2wƒ Ïyùó)�ëÒ"ˆ'Cq7”ðœ—?ŸjþTßš=½r4—½ÊÍT‡ñdà«•#~sý²ÞÅUuyyYñÉëf-ÑÛmVî¨X¹£€ÞŸ7NèD¹d%öšf:.*½+-§\G­ÚY±jg?ü`Áí "\|Úîh"ôôûoÌÀ=UÅâ1€†ÖœÏ–ŒáÀÿ°yàòqûFõ?¦ömÚwÒܵØçÔµä.ÝÜÿ¼ û²#ñ¶ÎL~dã;°!¾øÉ¹ÿšs* ì­îñꌳ~sýbØÍlxýË©;�”_¸z¶tD’F’žS×’®ç´vfkÊÑœ†€?î¬øqWá“嘋N€˜+Î�ÅõŽô+Œ¥–JhJ¾!D¢•;û­ÜÕ?\8AäÊÀÁÖhdÝÁrÇa ­Ùs7Þ^•ß %‡«¨¦&{ïÁ±á0ef:-ÑÜõö ¯8Ê`N�aþþ«v dÇš f¯×…?ôÈo;Þ\H@÷÷߸Í\qªv}Œ½(f-€<‡Iþ*hèpmްá@ÿõú#á—+&"¢ˆlsÅMŽƒìöó–Žt𩯩ª+"ÀœÌèe“×½jÜW«Ç3‚†¶ÜO—Nºë¼¥Ÿ¯œÜО¿lç¨;§U,o;ÞV�‰Mx¨rǘ…1ŒÀcÄA’Qg’<\FI\mï¿`[@úpù©Æ¢e�¡`!†$³@ÆL弤jZ} ßêýð£IZ8NâMGúÌÙ2œÈ©kÏ[ºkÐy£vçdÆ ä– î÷†@ph�e­Üsa¼®=2{ù¡Æ¼h2T˜ã]®>Ðû�ÆF“¡š–Ü÷–޽ÿÜ�= :Û¢·œ¾í“Gþwõh"8Þšýî’q_°æ�Æ×´ä@,ˆ{Á„‡/Í;ã`c�¹~Õ¡òU‡ÊàýUc%S ±€¸ØV]6uÐáœ`¢ÍKÙð¨R$ãT²™éÅ벘U/%õZC_¢Oý¤öMd�Ô£JÉÈp(Ǻ®fUUPÙXÿÂ^9.:n!+·4>̇È~$åâ @ æ84v`Õ;}Æ[´±_8àQ<¡–¡¦¥«¦îzå¾ùK·U,X;ð…{½õàßÌZ.ˉ`zå¨K‡#—¯åÓ™^9êŒÑGž¼iÙî.ÏŽ$¢‰`Ò È2ZâûÈÇ>öÑ“¢ºó‡-Á #‚XBGû…�æâ@põÔ�/ß7ÙÖòë¾pÏ¢7õ}*„j4郺lÒ®ÿ÷¯ó\ÿpWeQNôëÃLZì>Òã¥ÏN?Þ”+w“+ï‚ÀeèyÎù×Ôhƒ¯(2h�«žºÖ^|ºdô¬e#áþËÖˆ;•£Îuèñ–í~©Gvf"&ÝX I7pÓ´-÷\¼á©OÛ!÷ÊçGû”´=pÅšû.*Ça]ñp~N¼¦1÷Ç]}ºb¡sN>ðÁü±ÃÊr³ã˶VØ!=Yk¹‰Òxp°3d…“=ò»ŽÖåùü}Ñ«CÒ+ƒ¢ü®û/Ysá){K º #äÎY;X!„�½¿¦¨º1×™˜=í¯)ªÖ'¬çuÝ©ÝáºÁ|0>å³Çøhþ¸a}ër³c˶U� Z]+-`®R”†¹Jgó,e¹„¹2ÆЫñÀ±¢†–ˆî^üHEy]?¿dõöð�J¡äüõCÕðUõù 7ÀÑO‡9Ž@ãæý'=÷Ñùâ0rêyà æ­zòÀêßÜPùñ ߮ia–Œu“žWÚ›êy� òM#/†‹ˆÏ#8¤3ʺvI»¤ZÁ Ä¡|»Å�¶®pv$MÛ™˜á0Ä`„( rr:ïûÉÊŸŒß]’ßɵpÃðæfÈÏ ¨oËÇP „@ÍѼPÐ+-î¬k+äôbÄ�Y¢" LHÀp˜ô…ÄÏÆ¹¼9É‚.µd‘PHÃC (é.�¼áú©«_�}Ñ�Ú²@СžÅ]½ [n=oÅÍÓ~äSw�Å’á’âx» Ûk*bÉЄAû¾^wJï¢ÚHflÕ¾þQO°“Gà0r$’ÐÜ ž±w^MÇœ€ÿ¢°zãªøQì²Q7d’HêAƒ�«š žŠÇ“N™ã€ÇD?ˆ W›%Ýx4m /+ƒÅÜ`k4ƒ1dL;Ÿ»ŽEÝo½¿¡0ðJó:CÖ§ í—ÓÖÝwÎFSYW2”‰×´ ãàþú¢êÖ{¯¨´ò(]’iÎ/ÎîŠd$[c|ò†”Š”�Tzdô)뉴„ú\t¡ô‰©7ÔbLü =ƒ¥mÔÛFd@ÉàXY²¡:4O ’>‘š3Ê íæ 6ò55aôP&?t ¦Z ¼oóÔW’ͱ®˜{áÄýŽm¼hů#×îîýÏïÇÿýëS¦Œ<ÚйñOWí8\¢PÑ#¿ëËg¾0ž±(yèXþÒ-åŽCWOÝ‘r 3|cæi>1û¦iÛs²âÑxHòbÐaawæòa¿xý§*wpþ„ˆÐÆË… ú(*­ÝÝû½ïÇ¿ýÍ)§�¨ªo‰Üôçkvé¡ÈÕ#¯ëó§¿°È'·‘1†ï}?þû5ƒ®³lkŇOÎ2Ô  YËðІKÃÏ>¢ C}KÛþý›YŒ0#ä: R<écZ ‡�,ÛZî8pÕ”íá�K]ñà›³&ÿç±™7ž»•;g2¢ùs@¯¦ó&À¢�îºhÃòíÕ yœ&Œ9þïY 6 Tôõ<¨oÉ€ÆÖ¬ë]têî™Ë†O}hב’õù~²ú/RVGEþD{@)#”쌇”¶6K4¥•Ë‚pÐ{æ–Êò²Ö_¼yÙöÃ%Œ9Ïܺ¸´ Ã!ž ñ@—ÿJù)ðž¹5¥ÃÂ>0ŸòÅwÏZ>|ʘ#»Ž”®-PR—ê4È9¨ÔAL¨ær ¡<ЈáªYé@щá˜(”†‚îïn^Ô·´õÁ·®Øq¸”‘ó»›–pl€Há ÇÌ�wUc [5±€ ²²ÂFXVØ 17îä=e±¸!mcL¿KiT¶1À@6yz ð\õuuh<+Ý(à{$PíÀçÍ‘Aiô<Ç#dŒ9®`$ ~(è>}ÃüòÒÖ_ýëšU¥Äœß^;¯4¿½9Qb ˆÆÜ£5 `0ˆ±žnp ƒêðâ›G¸[€Ä(À7�ÙÑpå^ˆx²€\QÝAnuÐáû‡)œ‰å%�SGíY³ðug®ÞYÛ¿¶µa$pþµèüU{‡’<êÙ#hjÏMÖvd/ß=ôŒ¡;¾ß2zÌ€ûŽ—í­-Œ¹à1ð<€pF(©%†ß“¤NÁP•A$ݵ‰”T˜\—ð©L”£ $øPŽë� „(L0æ%©•œ¸Ëø DÀóœ$ .�4–dYGÎ 9üvê‚íý¢=Âú¶lBˆ'C.sRùÀÈ.¤Hv, )è0ͦæF9Týùƒú«ÝÄ0…©á5%ÃPUÈòTý˜xP­¤¦’Øá·tÁ·˜¬rn §P&¯•–³–.„ÖG*�/Öÿ~¾+$ð²#ñÃuE<_�›ézÑŠž­]ñÐñfk‘§ÀG€ªº¼?þw ¿ ²Qýês# …¹üìXV¦›mÝ][–<ÿÉ÷õ¼ë¢�í¤ûÚÍ IDATÑŒ8?;‹B!7;3YU—gº}奭ñ¤£ !%xúÿ#uyúïT~#d£úÕåFä™ùY±¬Ì¤B„]rzì†�ݰ‚õ<çëCM PYAW]k–µ��ò²¿¿£Ò'E:í%�<~熳·ÝyцáåõÑD°¾%{þº�÷^²Šs£Å¹]�Ùfˆ“r:MŒn=Tòâô©›ö÷¼óB�CójíÌ|øooÎþÇÃß>ëŸ�|}Ûù[Þýþ”¶®Ì�žü»›—´ufÎ^9ÌM:ÃÊK :>[2š'SöWm?Tzë›#áäê]}Ô˜¼ÏsÇxþîOýgÚüuMT¨A-Š`W"ØØ–ݧ¤Õ^Hì/U0w2b‰`CkäÜqû×ìîÃ\öÖÓGT-Ù\¡ '3CnFÐÍÊt�CÓ€"a73䆃nv¦«¶Yú:¼áœ­§�8ºdK…zluѶC¥·^°)’á®ÞÕÇÎ*JH¹íRuêUÿŸÇf.Ú8ð¹�Îå ÆQYÿ–±ÔÉ0œ¿vè5gnýÝm‹?˜wJ[gfï-±Œõ{zǡƶ¬³Çî_»»/cpÝÙ[& ¯Zº¥¿µ*$C©€LµDÂî “¢ÆvÓš†<š4âÐmç¯{þÓi Öqzê–ùÛ•.Û:PqW^v,`ÙÉŒ�OAªÖÎX¸®)÷ÂSwý¸³¢¥#’v«òÉ<ÙC� ç†€lHïÆ<üYåæÁ¿ÿpZ"ÄB¹ú²¨ã­J-2a긾 æ Fr§ùœ1{Öì­`D×OÙ4yèá¥Ûï<ۯ憳Ö}·nä ž wœ¿fù®Au±<Ì@/ à ¢Cn8 èÑðú]Ó—ïòÚw?@ÇC©œåS\##‡q9Že™xt&ÃMñœæDÖ[ /øÓuŸ_rÊúÿ®šÔÙ™9cí)þd~SgäûÍ# gPφâܶYëÆ¹^ö+ÙYÓóúIë2CÉu‡Ë•æGa:CêK±2JoØ ‰bXRÿ÷;¦ÿ°kÈŸ¾¹PøÇˆ¨ ¦Pæ)%[ó­Ñ*¤aº0bgƒñ.Ç�.7´¿¾`ÚˆßnêYÕ”{Åø}§ô;¾»¶H-èÍ8€©@àÔ�5wOÝòåúaƒËšî>sÓ¢5-9s>Z5úéK—µÅ2fmê&�a½šJó:?];*ÉÈ »‘ ¸Ya7–äëUÐÇÄ‘\¨*Gyîô)lmìÊꊇ„!Î&Q›ç %““ô'‘t@OºðÒMãhR1IK%hâd“î¶jqJ·vXÅðÂH¢ÕVkà °PÊ}1ÔHÒk{*Oƒ IgKúGD€„Þ=š#áäÁã%ŠžÃËk' ?öʧFãAÇ~¡º9UÅ2 -‘þtÕÎC=KèTˆŽȱž¼iù“Fñ¦ÙanWÿ²ÖM{{”ƒ¾¥mÙ™‰½UÅ*(7¢¼þ´á5ûê”ÎXÈ>[ûsZðTÈŽÃbëôÈïúüé/ôCÆnAˆdºùYqÈÉŒ¬ø`Ða9‘xf˜¥Øê‘�óÂÇÝE,ds!„oÍžôÖlí¤¹žSݘûÈu+.?}ϳœpàÁ›~8{ìÁÇß=ßœ¥ošæ¹07ZQÖ²iŸÂaª‡Û–½1sÒ£×-ß~¸dù¶Š/—Žlíȼ÷’µ?¿d-":^øÉ¢1L*É„ë|½rø[~óå#Ž7gûzC$ñjÿšÈp"ÍÈ!QW,¼÷hñÈ~õ¡d,R £;vFÃ/~:õ™Û—,úËš:"Ÿ,ýá‚“ËËZ�¨¼´í“'?ï׳…³Á–w߬ªÏ¿õùköÖ——¶¦ûéê½5=:c¾Ljå•ðœoV ëÁo¾\:âxKIäËù˜ŠÏZL”÷l-ÎïZ·§·Ï±6w�ký࿴ΆÍz=ôÖ忺rÅGO~°ê†üW¿œл+zé³³~wëâ¹/¼×Ôù¬rìŽï[Ú¬@TK|ctA�±ƒªg=÷¾º¿hÃàÞ¸ªG~ד7.þ~í°yk†ò›cU?qSåÁ¿7¶å¼rÿìó&ì  ‡_³ä¡«~8ÚXpïË×í­.! ÎXèÏŸL{üÆÅ3žyß °oVŽ|úý‹’, WFˆöäû÷-m.΋nÜÛ7dFÀcÌK:®GÌ ª�.×^ÈßÊÕ±CÀ#LŽG2nB@�ñð‹3ÏyúÆ… žû{SGÖôeã>ªœP^Ú òµ&ß­1´WÝCÏ,ñ<ç›õ£^ÿúì¤Eò|@”á|}À°¤¸¹ ·kÍ¡¾mžÃcˆ ‘ãÈ�ò³Ì |`4AŒAsµtÂê}=ßY8õ�óo:Òsõ¾þ_®ÓЖyû™«n=c%"i,úrõÏ$=gî¦Q/Þøå×ëO®mÍU¸.-èxïîz¶„ƒÞÔ¡ûn<}Íúƒ¿þøÚŽx&‚áU€\äÈ,ö.n.ÊíÚp¸/iE¯EW¸{ZUªy¨3åÙ,"pÀÓE耟bÞël늿üýØ?]Óþå/g'=gÎÖ�o,8eÚÈCÊG‹sAûÏ?uH¯¦¥O|È<çËõÃ^ž7Éc|±nDkWäçg¯¿ï¬ ˆt°¡à“Õc<€òâÖéwÏìߣÅA€­Oÿ½ª9ï–]µ·®Hô,ªÁoÒÄBFÐÓ»nÏñ¢ö˜ÚëdžR¢|é%ÈÏ \ T‹ ^0ëñÕJÃTiƒ »i”2�&ˆ'{IbDO´õé)°Ö†O:ó�æFXaTMÇOô€úDá䑇:ã�õà0åfÅ~~ÉÒ–ŽÈÊ#µeÖÀh7� ˜”›5 Wóðò†ÜH"/’°k• Ÿ/ñÕÊ¡üÆñ¦ư´ ã÷w,-̉äÆË ;Vîè«C8sô¡®xhOµ8B#/;þ?×­jíÊønõ`3H+™<Åí2ð‡ý{¶ /¯Ï�$ò²âžçJH ‚öÜí•ê1Ïs\†±D``¯æK'íf ó²ƒ{7Î[3˜ÉsŒÂ!¯0'Z”mnÏøÕ›?=p¼Ètxßú¿þbnaN¬gQgKGf,àž&É"\ è߫型×]~ú®ŽXèÞþÉܵƒ`ó�Ò—ï›ûéS_þú望$€|ùÃȯWñ’R:ÞœCä”t>}[eaN´ 'VVбr»Æ!¿>œò‡óÇ*4M_u/ ýä™{xT`Ã�>Wþé0€‘y@h�…_˜yÁc^ÎÑå ô"HjÇX íUw¬9Ýþr�àï%¹Ôò˜R6@ÀÄÑLª†K@"Ðô•§L_9Qű¿\3nÆš±$ŠœÊC+w •† ÈÑH„}µ%u­y•;†sT‰DmkÎ¥¯< h`H¡vxhuñ?ãû<€†õª«iÎ_{ Üb^n=�ïÒ.m«‚â2¸�ñà­ïÜ8äº^¢+þÊœ¯ÌŠˆì`CþÍï\¢8þ^9*w•W¾p@kö™/܈xÞËœŸñúw®”P©…–� Æpîö�s·”œ/]Õ”Æ_î4j@OjK޲Ùd÷JP^Ø:¸¬ñÓ5#ENPÕ%¨j(y ð5‚ “$q—jÚ}$ús:ÿJ©Ê¼@w }¤‚‹3L-LÕÝ[éu9ué-j㪥^`ÒªY7<ù1ˆ›÷õ‰'Bµ­ÙüfÒ l;ÜköòqÍíE9‘xg4YÓ˜ÓÖ•ÁäiüŠH*…eÂ\’ßùÚ/çeg¸{�Šp(mŽO§/y¨¶àG­yšÛ#ëv�4zàñÃu¯|1iÝž^ºS‚õ{z¹Ì9Ö”Í=¹¤ëlÝ_öÅ’‘Uuyˆ@ �5æDãAc‹ŒB½ß>AI~Ç«ÌÍÎp÷-ZºµÀtŸˆ[³nùóU 7 €ìHòñë—©ÍŸ±tij·ÿðί¿ur½À²m}oê¯Xí쓪W—}ùìg�îzã—ß»žóÀ—|½r¨µln#²WgLþbÉÈ–ÎLÕŽÃ¥·>ÍÃ׬líÌTL�H?«}¨¶À—•hjË\¿ë¤Qk�Ô¼:còq€•–'h"¦'?cÔáÆöÈÆ}ezÍ~|w|.²¼£EWíìs¤.ÿò3vîª*Q¡ÃÕ2gf“Îo �ÉÙé0åìQ|!8cäá¦ŽÈÆýeRRÑþÝB+¿BAod¿Ú¹k†ÔµÚïø•Õ¤¤Fþ¨¡Rü ŒFR‰£åÊPeÖ1�{fb¤wz £òˆžJ•7Óvg°´r:´!'=`ÈñFTŸ·nh}k®‰ ÂPcI=ÏÈ4êOø(Þ×ä0GeÞ„@–ÛEiÒMBRºÄÛÁCÇQÞŸðH¦W)ðFô>6Ëð†Ž\T=ŠT¹Ò±Ò«×È;È_”‚„’#e…‡�~‰ï¿Q I䔤I!ñ™#pÚ Í]Y[ªzÉžøÀ¤Óò$Þù%Š!¸»„@äH÷�À!Ä�“qÒ±ùÛ†7v䨠½IqU•lp¤:ÅEùˆ�ô¼®Î˜Ç\@×6gš¯T†Ñ–Z-¶:ÎgÖ�VŽ/Võ(³r‘=tPLDü%#†6Û´dú@ðíåcw״䮨ߌeù³à �R\î»4žÌ|‹O£Ä_ÍÞ¦šKs¥˜7�B'¸PþRÍG¬ÚO£S!*rV†¡—’¥}TQÀlÄ´ð–³ÞÛœ<„¨^ÀÁ)¡[5µÅb µ]ɨ‘ºÃq €L•DX(Ò{s|æÇ§)}6)í‡ô8%��T{)r Kz�tãBZ]iKΉ¡P�pMfY �qmö¤LIÓ 5�9®æ)=3Ë–v‡0PmbÃ÷kwúq°ÜÌäÀ>�¹gþžüï¹ãÒu•J©îðe>B“GVýñÎE�¼}Ѧýeé°ÁÓVÏêÄz &WQg­CµÚJáI¨@€åf&õn|ñžùÿ]8ößsÇuCz Éö¼3ÿB e: ô¼|Xæ³ ð|ü™’85»2ñ§Ú‹4n·è馣ùÖ®I3X6ý“ʦÌ× ‰=ÒrKRÉe¼†œßw¹1â§¼8Cò5#¨°‚(êi'¬°­¨@D€¬Œä{¿ütû‘žÏϸ@ÏPùÁM‚ r7‡¼‰ªÄ�ó”ƒR° i•¹|2Í¥Ö®8R3f$ßo…DÀ£&!EÌ#`Ù‰�¥õÏ^ùík&|¼â49B' 6P¡’ô’‘;"¼ä¤›)åfÊ©JðÈM"™LºÉ¤›ô4&ä'4a…÷Z¢¸Òd$ÍçÒºê­&i.”Jº‡iý�1}ê^»nîÓ_Ÿ³|__00¶qÒWwbfšâ|¥x#Mc´ž$ó¾Ï(¦Ú%”[xtæé# £˜©ãžXEp†î‚är@;TʽêïzM6(Ì�Ô·t¹ž§ôh,2FÄÅNOŸl»ÉÛR &Ô„Õ­ÔÝ^–ÅT5* ¢cÈô¹<¾ÑÍ樂€^&j¤‘ám 9$ðÉB$WxÊ¥P#ÓÔEV¢[‘—TúG–GIö±Žm»�]Z�Ä´ÓhÓVÜéUÔñÙSŸæF¿X2ú³FÙ�›Â¥ Ý­ÙØÞªíåÓ½3�fφ®ÉKºô³Jk¡ÙØfB5„r>Ðèzµö»ÏŠr£Ÿó)Ÿˆ…€ûyEÊ�€µkEûd7B“§§+ÿ£v˜[¾„j +¥¾Õ¹o¹íÓ´|öt8'+›ä§—Ÿ¤ÕÄ÷–å”Îå2ƒl*h¡ 4PÈÁ`‰Àeè1`b¡‰B¼ r%M�üüH ¨šƒ0„Â\q\9*EÅ-7ò*pPÎeu…FwTý1éMJ``.Œ…�æp ]b �„ß$øÉQÕ$Š’J‚²¼¶ÿÜûa~V×WëÇÍ\?N Fàí kÄYE”{HnÓÚ™_L× kžÜë"ÄGÑß&::à Ã\‹'’nÂõ€L­Ê Þ‘šKÿ œ4˜>ŒÁZ×zÒ¯¼‘t ÿ‚Þ´dôdAâÂp·ËJ0l9Zzî_o3ÜD™-`™´ –ê�dÖ›€¡ÚJa�ÂM™‚Ùö[”vHëÖÈFŠŸÅšUšv-þ…O¯Â�ef¼dDÞU5Thô. ¹ù¬nIF X¦J >"¸.«o�²”7Œ™€õ¤eÝ¿B•1=ÉiMæÿâmˆ`¤ˆ �©Ëì®R=Œ¸¹$]ÃfX�k˜“4ÒF&†´Xûg§WäJxɇHÿÈép�b¿ûNjcÃ6§ïÊç+ M_¾Þðÿ@;Jé*=�Rî@Ê|MàíÆC¦0¡�E­AM‡€‰Ãõ‘0ixV*º4ÌgBè5Á ¶A¥§4Giʇ1ãÙTE�jö'X�œŸÖp~JcwÔKyÍè~î�Ÿ¤€T‚ÒcSbÀ\�€ù*ßPKÄ_c ^ó€Š((OR é xV‘ùê":œYÔ¾fT«7¾õ´A¹qKL“ ‚C¦%3)à5¤ò7”ïæN #p<~.žÈPžU¥}&�%áÂx¡“f<¯ùÐaSSÃk_AœY%ÃÝÖ1ý|‹Ý´7 øAØF²�ô·$ßéU�‘82dÏæ)%WvÚeÒ£PP‹- ']é93< Ù‘pÒõºâþó4ÍÒòÿå+‹²…(É5‰rÿ—œˆÀÔ;FÚ�Ë• *¢Ts \FB%w¤Z;š'Í@Ì”#j'ó¯BMÓDÆg«g%RP% y+ãL;”ê‰�߇  –Ù©ÙüæÜÇÞfo¢Ò`ý´²¾RJç©�›šL¥@öJ÷ÚÍ|C�ÝÀ7ÕAK…Ê røæž†=µ"�ÿ ‘MÕ¾J»£° &ãsã£ò¶>ÿ-˜TÒTʳÜŪÿÔ¸®šzZí&ï˜;YÒ�› º�ý›lîÑи 8_‹¢²D²*D‚=}Pk/ ƒÄ�< ’öTàJª~þêA™!T­äù"�g2/ÁI#´–xm£”HUáÁ÷𰉜“ “cHŽJIø×[â“8“JLÀeÙQ¥A¼¾o¶0Ù* ë›mLü§þšÚØGëÔ±Òv‹é€Ç”©sLëU˜ŒiŠ‘ohÌj W&¦S\h³™ä  uòh®èýn«V² IDAT†ÜÂVºaRÂr¹+¸d2�ƒ^X“TV‰‰æpËR©d�L Tg$M#¢r&R§aê+”pJ[«Ç2ô—p2 (ο"†ÈT€�KG³R$Žáé åL ’Ô\ Ëêåk`I½³„H�~!õ0y|#$�±‘P4”,"ÐÊ÷˜0mH¦6¤sŠ@@ŽB*q+)ª=õŒ™|VS«DÑm0àyä¹�¹‰„›t“ß©j˜Iq)jºp‡�ûKâ«ôP �AP�K3*ŠÊÒC½8T&×ìÂ’S1ù“Ñ1È€è‚ í»š5² �òp�žÕ(þãe•9 ßM!Ú·1=N³"[# •ñ—@*e±L·Û|…OiÛ ŒéîÕ:Ä0¡RHåÒè�4I9†C@>ä�…âz”ìU” 8éÞóÔ½…I½ b¦š= ‡¿cLù{"øˆôâ½ þöÐw¡ 'IV÷’(e3~ÿù—¯“á Sã[¾"üÏ5+_úù‚œ¬¿súˆ#=1«Ï–téÂ#�üåÞ%y�„H@ãÖ~õܧ§�8*gdþZÍž¾ ´É£œ@"ºª&Ø�Q×LhFR%×ðÞó~÷þ�©ÑèDuè³î©ä#û‘î®Ô_Ó:�Ž£LMäÓJéäÍßÞ7£î†ë É씊ǔ‹ô`†Ý$0WdiC“± DI r ŠY)Cs�0¾D¤¹CêRZ‘”{­= þ¨Òn¾Yûs ÁóãÁ÷…Œ�š)5õ´êSö  ‚ŒB…˜ç0�ˆñeŽWN\€6Õ‰É÷º�Œñµ�ªAdS*›¬Ô #i2 qQq,eV¥Áá®Jú•2G"¬¡xeŠÞåËH$îe;ñ"&úE!À€D”Lx±X¢±©«®¾µ®¡¹±µ¹£³-‘ì"Hj4Òd )Eaù˜^‹ >"’ÊDº$ ˆyJ—ŰZ¨† C¥Ê±d?¾ vÞF¡äsJQmò&¨–†È¤\Ê„+r[X­Ï-MkdÈ$š™:,­Ãƒ""4b@Žz’%‡7“ä!…[¤¬Ö$±­E’õ ”’=ª¿ì^3Z#+¦q,Ê‹4´tþ¯:Ò‚TQÕg:5éßù~–²/ŸYÒBªW­0'’ÌÍJ7á'„D jhÏÚs´ø†s·ÍZ>´¦!×tÏŒà PVFròˆª£�y]q±YwÒð£}z´uD�WT ø!ǽîì­ÃÊÇ >M„hâ�ê¡}‡—7Æ“�­ÊŒ÷\�1SÒ_ �ô%II‡éUH’YÞ«ô\²�íC*s$~:_e�S»&rüë�tÀÐ2hÿU½¥’Ø £ÿ2�*Ó¶™c¥ú4d?èƒÍlœÚÆl¦3é)㦺5æR�‚¥¾é€Îøšù ²PåÛ¢G‘ÍÄ8(mÖl¿CpHò(%¦Ë>4`ºÐVªzF¶žT¬"X�4æD~\€nhŒÒj(×Díž5p¢4¡ ™ˆÉ¯S$p³#"߈âÄMD$CÐÑ}ž»`8AïA—/bú«=©Òuµ#Ê(‡Ø¶Š¶†2‚Ã‚ä ›z€1agÅ\õ3¡ÜÂAÊO2‹*ÐáyDbä1ŠÇ\×ó Ïõ\Æ\ËÀêK㥖Ú³¨JÑÕüÒ]‡voYH©+µ>RðËQ+bgõ n£Q)g¢?Z! =SÝ¡�y ¹ÖÛëîà‘jF8Cßš`š›¼é:˜9"2#GàSHQÝlVxS[4&Å�„ãÈ’D-uºaw¤eAA²~'5+�þ6�¬M¤ uês~…‚NanfS{ÌîþD—h!óZJµ¨ '’Iˆ0qè±w~ýݳNý`ÞÙq·ý�¨¨ÿâ™%ù� ‡»«J®ÿãUÇùчzvF¥>Áe§ïyû×ßþ=´ÿñ®úœHî~å²yëðçoT¿†Á'5îÓ´a_¯3FVÕ5çÔ4æL}´=?ø8‚h<´nÏI±]‚Þ«h˜2ºjŶ¾{è»ÜHB ñ§Ÿ-äêZ²¯ýýõ{ާØ'sî‚%DUºÎ’•ƒvŸ¾Î-�œ—¯sl:�R/Ÿ Š~üÙ@Cíé&Ü~©µƒ-ß á´BÂ+@Ã^‚0}2°n9$ZG‹m–¯¢?ªÂË °h¤Ð¥Ÿ&=qT“¹ÁEW^�T|©ªNÛsW�FÙ0“¡™@Ú—Q+\þ~tpp�ø‹ÇPª Än4J ˆÀ‘KsgP×Ô`(oTµ¤¢11uSZ Þ ãÎGž„ü#—âGX!dQ#ð<ò<ð˜—H¸cÉ„ËÈ#ï62Sršz¦N *aNŒR͘e€;_äkl1ƒ["Ó\¹q'Agͺj,RÙ'áF*GÜ· ²DUpe0©sP8’  ŠÙPuŽJĤËE@¨ù˜s½�4Ÿ H[-W¢`ºÌ÷ó¥e³O¦­ŠM+ÉYR\UQª:VÛ¬+U�AÚx©A=€¼‚¼è9UGÚzĺ 3ÌËÊh늧`Zàð÷w,¹ï’ &‰ç­ð³—/K$ùÁc2FB${uÆB�4¶E”LòF™É=ò휵?^8Z‚†Uuy�¾}~FXÔ*_9uWyI[ÒuìÙ€d ä‰CNÂŽXèÍY§­Ëƒôy,°y™b�ì°ûÜ•“†€‡®ZýÐU«g-úÑ‚“Gö¯ÍÏŠŸúÄ,þXmsÎ5Ï^··º@pUÀa·ž¿¥¦!÷™ÎùÕ[@Ða¯ÿr."=øæE ˆà¬,=!KYšó‰´òÓ@—"ÁÔQGî¾xÝ+ŸŸ1ÀH8Yßš%aI³7�1ç¾×.ýÅë—ägÇÿóØL­‚}ép)¢)=øl ¤f÷ùÌ¿)jª+¿­5n¦Zñ4Lo\iôA7mÒ;Ý�jOìYû[”å ÁÔjé·¼§ƒD¯µÄ²F­ýµ7ÁÍ‚4SÖi9Z/ »f¥sµ –ÆËÚ"4ž¬îC; !Ò‚a7H6¨A~ÊÈ´æFã¦B¸F»R�ÈJa#©yu…‡CjÆó$Ç·“8�€Œá!(‹‚¢r �‰ô 8:ª!@Ñ;E¥xY¸àaBFÀCªD/é<�¡ç1FÉyŒy ð1�X¨ €È÷ग़ZÛÞvÑ*ÂPö]öq‚sâec™<J]~bÇѪ)d%U²Êõ•4…D4Ê;QsU)&)kzÍ … +!èå¸À¿‰#ÍÏ’d6­L  L¼ˆ É – ŸnS| ¤çK(ãc–”J“Ïç!©´3dLÄ ›-Æ PÐHTõ3J}蘢 › ÚËMû Z6ÌxŽìÖ~Ó�˜“Nº^4áß$¢Ú¯ßÓë·ÿ>;*ß]ÙÍH$e!¤ß”JQØq¸Ç5Ï^˽3¡„¬L·´°SÞá’Lí]á9kpúìÂS÷À÷ÏOïWfU<þäµ7gŸúçO¦ùgŒ'B•ûm?\ D™î]n¦WAdò×�,eÃAª}M¥µOÛ§u|7S¿ú~2}H×2½ bH½eÉ`Û`SºgOä¤ó}¸`bº†–ÉO‹_¾|Ñ©(±ámÛ²¢@_aôf”¡1©àPƒ`ÚmÕ�õ‘N�P‚:²®m ª)š Ìé ˜åR_Û8²ì¢ÀÇ€icŒ`¸ÙÚö«Ä¹âqÄã¼’ßÔ †[€€¢Žƒè 8b€F ÜáËvây iºÈqˆ—€ ·ƒ˜Ä#`žXšz1ÁMcÄ11Õ •«Ð� +1C)ìc46Ü ‰ ¥ %-´ßd [ãOñ�´P܆�&¢LoVRu­úÓ'Ùi‹Žº+0Ž;1óâ!�<4½d‘,’_åwvY™M ³<Âô“HCY)0ä‹Ìݪ'dw YÞÜì'ý ƒt 4•Ù³•ÑÉ#œÑ˜¡ŽcŠXJI PzPä³òsÊETØ3àè].7èh$#qèx�·¾:wé–Áا¤éþK8uØÁ‚Ü®†Öœ¯VŽý`Þ]±`V¦û÷§f,ßÚ«oióÔQU¹Ùñ•Ûú>ýŸ3×p DÁ=G‹;¢asÄü¬Ø?ù®3~ð­ŸtÆB‘ ÷¯÷/(-è¼û•KZ:2¿aÅCW­ cøÌgýã›ñÌa}Þþõœ�½š3Âî_ï_ð×û0†oÌžøü'S  ¬°£¬°sË�Ò¬pò¤âŽ­‡Ê¾]9(/;ÁÑsûO¶d†’ïÍ¿ýP©e€>=Ú½~Õ;_�ß´ï¤S‡ÕŒP·p}¿¤Ыõ²É{v)‘4d±:8mXu(äýéã3›Û#œá�G Wm ƒÜ¬ÄCW¯ÎÏŽªç/|ôíó[;#üÆÈŠºßݺL±…¹ÌB€sÆzåþyOý{Ú·«%ìº iõ‰¥�ÿxøë!}ó²Ç[ÿÎ;PÓ˜wÅÓ7TÕåU”¶)èx7MÛvç…ëû•µvÅC÷õúýgï­)&¢@€.�´ûÞKÖ íÛÐÚ‘ñ岑oÍ>µ­3ÃØoí³ý>ô›j‰RîœÀ�HÛ^}MU¢'ðNÔ-&S»dÞ‹"¶~Rë1ÿ~çRXÇ¢¢²;Ñþ�â\m"t…8(õšêW)»,žW½‘T.~ój}@Õ¹ÿ%W:†&,¹ÒJ ÔÊPÓK¶ÒF¤fVËD´Q…Ê:XÞÿÍ;V'$`–î�öµ¹©ÕVE¬8µvUY>9×xLu-AAµýÃAJ¸$Ë7Ð6OÙ!$u_£\5A7DÁ„œ¿r¾ÔP]6‚š4ʽôóîH 0bæöÐ×Ó¥‚öü”š õxª¾I¹Érdáþ�ìX²ƒó° †äò�H�'Á!Ð�T¾ õSf2ÉB‚á(ÏDï3PiJ-Äò;1�ƒ0[Hnà]Yc¦ÂCüX4�I噘 J‰O«C[ù(î—¬£šHp”ϧ�}ùqµCz×þåžÛ÷zä�k[:²žT[]/üƒ®XxíîþÌ?½¡5{xűǮŸ×Öùdñià ÝûÓ ¿ý×Ù¿}^I^ô½G¿{üÆU¾u�ÇÔ¶K¢ µ+ãÙ÷Ï~ÿñ¯n;ë?¾wÓ9ÛÆ>ö³—.miÏ$€§OyéóÉz¶¼ÿÄ7Š8°¯ºè†?\UVÔùÏG¾ýhþ˜™Ë†`G4D öËË×]}æÎGÞ¾`_MaŸ­ŸUŽX¸±^V¬¥#â8pθC¹Y‰Yˇœâ8™�cÐ÷*n»à”kv÷^·ç¤ëÎÞ^œ=Þ”3fÀq—9kw�¤ÞuœÎ\Á�c…K·T”äwÞqáÆæŸLÌÉ y‰dÐcR!"]wÖö3FT™Øð<§=šÙÚ•Á{팅‰ÔÏ$ëk€ƒÊ&]ô˜I8²AÒV¼¡-òóW/ :ì²Ó÷üìâõ÷¼|Y]kŽëac{vÆB+¶÷}û›Sêš³Ç ¨}îŽÅ-í™ÿü~XÚ\°œ`/‚qƒ�?tõª7gž¶`À¬ ·ÏæÚæln¯�ºýÑëW¼6cÒ û–´þá®E™!÷¹�ÎöX*®|ÆÈgqÕÒØ,»™ú�Æfwÿ¸zÖg¹ÍŸµ 4qZÅ®4�Ù�qÓO”´s‘íÑH©P¡òÔiØ Ìß¿2Žªj“[gµz”Ñ‘—7•Ž�Æ‘Èî™à0¥,ùeªÆoJÁDIJ¬BePœT�)X eKÉæ™Š‚ižiÖ�QÁ¿òÒ³ ­‹ £&5I*}ÕdÂ[”öÙ°ÊLFZÈ(­× ;;Ë�Ú`ŠyQÙnð‚ð¤ë¤âÖrr’¨ha„ã%/`üI(@ „öoMþWö”€%š·å©`²NAyêŒ1$µqŽêL(ÙH𻮦C[ÄDæE�Æ@ºéõHLêkƒªý&5M¹ÊkEéj(œÉNR&ò‹&€v‰ôï2q¦ar!‹)jÊ4º¡h ÁѼä/QBƒùu$J%•H�7½`âööhÆóÓ/jhÍ€}Õ=d©-6¶çÌZ1–ºbûàwî^Q£ÄdëÁÞ+wŽ!/QÛœ]¹±ßO&ȉ$øZüŒ‘G÷}ø6oÆÿðáÔ·¿�»ªŠ^œ~úooY†ÈîºxË‹Ó'o;T"QHžç´tD’®©ÃÁõœÚæþ¡¥3£¦Q½“<ÿúåiå=[^¾Á‚uý‡6íëù³‹6]Öö[^¸²®% ¬K² P�1¨oÍ\±µ|êè#…¹±MûÊî¹xà“š[:2ÏwhëÁÒƒÇóÍ„!Â7.âÆå¼»Ù+†þuÆiw^°åá«Wï«.^¾µ<’‘Œ»ÏoI‚®Xhá†9QÄàÞ�‹_yß«�;šk@9K¶TœúÀ½ú= Eü+cN]K5wd¸Ì©mÍ9Ö˜«×·fO_<Š^¼yÀy[ŒpÜqcŽÉÁ$÷€šÆ¼£õy¸çh×yYñ›ÎÛüÉÂÑŸ,>™1¨mÎy÷›S¾fÕ?¾�XÓ˜+Ë2XšˆœÛÑž7}O™�û<ñE)º³Üê7Û¯à{³ÓË=¦›DKµh+ ¼nóØ–GÿWcvúH¡¹­ùq¯AZ•Ò³–©.Ù$M*M GÛwßOJ“êg˜ÔxÙ(�°Tª–YÞ“©þ•öÛU0L¨^7Ðùï¨à�¥ØM üë;Ur'µ¶¢©újëz ‰�O|@Ysõô•ücm6@tÈJûl&Kå å2Ñi:–j±«CQ –Å æè§´DØ1 ý£®â2�«cÜ‚ªŠ©%"lwÖé§Hݵ+Ž%HV> ÿEù`¯ÜÞDy? |íÃmå }BÍ'â'¼…ÿòª±ÍUˆGѤÓ‚ –H‰™Ì�¾ ·„'�È€ AEe€û3 �U”6®-jnÏV(P˜ÂÜ®Û/XyîØÝÅy�%o&aÂêÆ€pAŽÓÜ�%œ€ÃÔ!ööüí¿ÎŽ&ø\·ñ¼ÓoxböMÓ¶eG]ñ�§V¶Dž‡ÂA‘B4¤Oãò×þmÂoD,„ûo0½ÆA7!SéÈ®A þ(dÏܺ¤¢¬íþ7.Ý~¨cÎ3·U–vJ©TqYѧÊÇ%½àë3O›¾xô�çnyþî…‡j ~ý·‹ªòˆ€‘óç�Ïš¿~€Šì2ºæl],,´bÈ-ƒ(Ùº³n*�n�ƒü”öJߘ4£ ²Æ_>ÑT#¡9 Nõ(í¹�ш+�ÔZ›4�åzE�á'½z“UëQ�•u$­Œ)xl•åsŒ§mLš÷̯B1*`–”çáÅça0žÃÖXöû°fB8G2'í!/-ÐVE×Ú+Y¢ –Ê4‰Á�ï:“ËW–7/­�•­ÕH” �ž•‚’tgÊ’3¿ ”¡"LÈaKÌ`„±ïÀïÁ¥B¢½.ÙPæD"Í×™dWÎ麮Bi*oxb€¬‡}e*Z@t”H¶ÐÞ±æóYƒéEÄF'Í$�ùÕwqhtÆËž¦ÙŒó©ÚU΀–ƒ@2Ã;AK -~P®€&‚ø„ÒA±Ô £áâ¤([ Ó¯:æƒk=éú §-O:ÀÈ©n,èSÒ”Ÿ•2¢£Ü¬ø�¾u³—�Ýu¸cN(àõ*náΓ‹çÌò²3B�@* --n9ÝuÑæ‘ýêïyù’!}šî¾x“ãè³ÉdÓ�Û­p€ÉFšì�ûÉ©BoXŸÆÇ¯_xóÖ Š'‚ÅùQ«¡ä5DèUÔÑÚ‘OšÚ#»�——´ÅãÁ'Þ�öÚŒÓ.w]ïmçŒ=Mm‘šÆœŠžÍ5M¹UõùGêòªêójó\%(Qe,MÀÕ$‰5)êTK2¾¦z*©ÏZzÑ‚â"u•�I÷·;XÂÃÓËV-À¾9úÀAƒv`AQmºMM‰RXÓX/Æ_?Dš`�LÐ4ø0’Ë;"~¯;AÓ!U (˜ÁZR¦ŠƒÑµñŸ›ôcÚBHn$2L9í¸b4´¥œ‹tütL gxhW_drßä>iTß¼RÙ9q‰>5'c® ½<Å;©¶”ë¤Þ¯¨±Ú}$½ õ�kYËñB… 1!Ë{Ò˜³id|Ö´áÄçïŽ41l±/™ä3¨£0Jb¾(?èGäWñ�‰ÝÁ†VHÁS“’6XKA&¦aÈ·Ó *rjÐÉâ “QL´ŠòbD¹µÈŒðú^‡*ò‘A�lå ZÈRT”ø�«5áUK/Å4k:«¢À0xÑCʈ%Ü‚�naÁÂõÃ/9më£×Îÿ´rbG4ó¤â–Žhææý½c‰PS[dÊè½÷W0®˜²iâ�#+·÷·ÎH‘’ÉêP @$ìéÓ(ëDíÑŒ£õy€0eÔ‘Ÿ]´ñÙÏœ³v€ãÐïªÜz dÉæ~жyÙ±P�²3“™a/–ÐÎJg,|¼1ûÒ3ö¬ØÑ§¹-33ƒUÕår¦9uhÍõgmÿç÷㢱Ðý—¯_°~Àüõýúÿnt=ÃïÒX¢Œ°;¨wÓ‘ºüÎXØõœÇÞ=¯µ+ƒyÎî£Å7Ÿ»­0':såPÍqºÄBñ>ŠƒÅ8Çzž3½rT8è•t5·g&=GÈ�Ÿ,#ʶÿëmó+b¡Îwð…{üî_Óæ­(¦ Ä”»‡u…´tþMè !5¶F¦�?°fWÆà†s·�1òè’Íœ³y­^(ä,ô=þ #˜8´¦O�¶�ûzF¡S†Ôde¸�mhíÊøï“wËm�™³WM&�aå�¥…�ŸUŽJz¦‹©ö4�x|êå—ã>vÿë .†¶œ(æ0,¿97ÀpÒ�Ø- ©!�ÿÃ%TŠŠÓÛ&$í^8Ðhva Û3ÓVÌØ¾¡ãù†ž°+²äº„S«Ò"ü?]\/å]d¢±;ª›[L””ÎORúYv“ IDAT-S`3ƒú¢SZÏ›&�ééi}*b¶r.È÷Qkt å.ŠV”%FMòyjÖr‡I×HkG¶›hO+µ'0Ö¶ ‡ög#¡Ez!HZü¡ø+…&f)�œºÔZéø¡d�ÕCƒ¢­Z H·IâÜfzQõh� ~»’}(RÝÈïdON| šLèžÑ}«#”¸°Ø€!ÈÓ¬d­%_ìû–¬iFÕÁFuCm ’ÒË%Ð,Å�1@R`fèˆ4Ê-¤©H†�Ú� Fôýä]o;ÔçÉ÷®¼ûâeÿxøã€Ãjšòÿ6ëÄÞ]±Ð[³Ï}äº_<ývKGÖÌåã¾øaBï’f C¾‘q›†�€ã ¨q›0䨼§«Áæ­p×K—–t>{Û²o~üݪA0oÝ€ CŽ=sû²ýÏÕ·Fþþë9?™x0èxˆðÄ�+»~eUCþ-º|wU1tÆBÏ~pÖS·-›óüô€Ãf.öØ»ç%]§¢´åO?[\Õ�ûÞwããIgDÿúÖ®°Ç�‘“²,áKç’ü®þ½ZÖÿpÒ´q#I¥†2CÞÿ¯ì»ã´*®¿Ï<Ï>Û °, ‚Kï])RlØ0Š Q±ÇKŒÑD£&1–Ÿ16,Ñ(Fcì]»TA°� 4Ez[Øe;ÛŸ}îyÿ˜9gÎ̽K|ïG—[¦œú=gʽÏUÓ¾+«ÎÑ«lxÏý°a{çM{ ­©(¸õüe·žo6oÎY6P‚`Ǽæ^ÅÕ«7¶™+™ÕV°iOáµ�ýªº^o,Åá½Ëî½bëÄú š!aríg'¾%;#©Œî·÷·§¯Ø¶¯Ã•�¶qwa"-uÅ)ßõí^•�Þ¶³<öûc­î«›~kéКú¬«¦­¸jÚ ¥pÛ¾Ž¯-‘B;É«”ò]t’ñK2†ƒä&áê(@¤½Šœ�‰k?(ZÇób¡¨ÑNÓ–°ƒ“ÁUdÚn+Ò4/’ Œ7C}Ž>àš‹�›l.+-ÁHü ,æ\Ñ çy#m Í…~7^ñ»ÊÂbH”(ì„ä@½J‘z!Žì9U‰qËÈ¢ÓcIÅáÍË`€:bi1Y!âQœÚ˜mpò‰[/ò&Š\Ñ×$IC=A‘Jƒx+peËe]{Ñà ´š7ø„�¦!zÏP¯ÖY̲Áˆ°néµÈ @®Ò(!jžÌ±�GúŠP–cNŠž '·KÊbá¸5’iÉÏY\p™ñ= í†Û¦+h»Ü`9Ón(ý”÷rˆÀ#¥gƒ ßFf‡i–É��#BT(X"9)^æ¥'Jð^¨„íGX»ë‰”Шó�zzmÛ.¥ÄSê��ÊZ’+\í œÞ´&Sµ�näBžy"›WX=Ê­Ì…h ÙɰÞûûíg�ò›®|øÔ•?u€xSA¬ »ùÔ ›²ÒSç»nOEÞo:5ÄYj3�]Ç%Koÿï1·�¿¬GÑŸ:‚@=ðú¤GÞ¯/ó²Z^úó{»Ëóç~5PßÙW•»v[—.î¼dIǼ¦Ž¹-=»Ô\|ÿ+~:D+ •‚ŒôÔ³|¿¾9½¤¨öð{ÛëëÑ9G<øÆD ؤŒ ”BY|`±Š çU„ù9—hâÊ;áC"8#¢xìæ ¿ÕÎýÊO½DR¨Çð¶KöA¤úäÕÆøüÏCYK=.^©v)Tºh¯Š­ÛÎÎÛxé’ZVìQÍ9$+k‚_É�3Å3¥‚fgh—¨'E/Å9s¯ À¦¶Š¡ÉU”ñFPêº#&ôôu»qØ’GÉ�-“¢Ot�ý¢;Å¥@Α´K¯O¾8÷,ýϺú,½9ˆ¥8à€+†e§~¤+É›ôÖ¦|.²ï·-D@•Õý–”%ŸÏ®x£„©dmáÕne‡ "Š+©ÅûdOî4‹¤A�I ¨AÇ (‹µ­èG@BBt¤çx„$xwy¨/}�|¯]¥ Q8@cNŠH"Š>˜fן8Z9�?` s Û"Í«ðCÅ #¤§Å:ädÖ44»è#†NÊaâ509áë{3ænKk¼´2÷¶g�ÕY´¥”RÐÄΜüÓÄ¡»wWäÏzsB2ˆKÀݲ·Óû_ ütEß·–ŽTÚ´× »¥-íõ…C·—uøúÇ’†êºÌ•?2¼oÙβ³ÞšðÝÏÝXRZA 6—V×e>õþØœÌV£mÙ=ùö—[tÄC‚,M¯–ù&c1š|Â1zºtÜ�§³¼`i{«À¨Ÿô¡¬BÞ·ßãŠÜ`˜yvéôõ\ö]»ÛHöë½ é`ÍšØÔ�?N«¹qÓW°v-‰Š†oÏ¿¤ôÂå ˜£s"§=¤f=Ô�œÖAŠÇ’S°“í2~¹Ëxh\´úÌú�7°•i£ç4Œ÷ºñD™Iº‚òh2f#!O^ÍJ}v™³&i´4ƒÌ÷ù4YiÙÇœª˜Í+à4Œæ-=$Á#c¢0 GÞ?Šå”¶Êr[;è!óÎ\³Ä(k�+©4¥R„x޾'{æ§bt£]ڮȪ0- gé Ì♋I²˜â‰4‹†[Ö.£€«¨AŽŒQs�R§8¢W^�ë¸&RÀTÆ™�¥4ؼ!â@K��ì¢*í“ü"‰!Á¹¦Æ#Rýþϲ‰kª9�’�Ëa�`;5¸©,Ïf�O‰Êêü£ž^Ó¶3fg,G€bƒbã¨Ã�«¨Ú†æú¦VE?ʨD_‘"öK‡Pêàõœƒƒ£‹5ÀÊGV”uÜ|öw+(@/ eÄ)“Äàí­7+Û€|DÐÔ³\Hó›pÝÚFQë”qB¢ uä²–�„±ˆ•HÑnÊ™³v‡óny7Y‰*�‘üï¶ÿ¿b�pKŒý}l¿‰HY�ëµÞ£˜m·u£9ëæ­²Ãñ¬Ý¨esή,»JÄwŸ&îkd2Ãí##`;BK´¬í$[Ä ¥EqõÈC@1‹û¶ HÙÉv¤ˆdw‘|;UeYtBˆÍyÜLjéõöT¢Ioxeà¸K{!¢”ýß4îDhE‘P¢Œê¬KÛ�¸$(!sGÙħr»ç²¾ˆÉÈ|Ë'®YE p!Ì·U þ ¼rÖe„ÏÈØé ™Kºœ�Ž˜Ô‘b £*$�É z˜`™T@ïÁF…[öY%ÁT^Ò-G–1úÅ;þKû;uáõ2« ×d̥͌hïLANFfzš1 Åjb¨RBä9ëKË×ñQ!"t/ÝCeQ,ó}îÁL 5,F–Ç‚ êQl!æ†XŒ$D³çŒ |v$¦¢ýë”0 ]„\¶K<åØHÒ+Èkç`‘71nËˉ.íiö ß%ýö>‚žä¹�5´ù�dzrë’FXìG^ä&X3 ÔAû˜aÇ(F«,OkTœ½ù"Ïœf…w[s2ãÙ(ãTHÚ2°YÞø?Ž$¾½Í¦&}‚¡ÂvaF¶H;ß@ªAvçqªÇdT�{¦Â¦%D0¯™0/L`”:yÒήŠp047ÈÐ%2)÷2$)ÿ>ÙIÈBÚI1TEcÛ2P¢‚„¾i× pé“=E2wD-;Ô'ÌžK>í£þP·i9c!Еðƒ`5'A.`E¢‹)Ÿ~תlD°Í¾" Ì┥úl)fV•‰U>Á@œ³ôÜ"l,Ó®¿¢WÎ)"PpˉŸð"QÔÚ¿´$FEû¢,ª”òºÖ¬‘-Äô*忺EãMɹNþŠÒ'QPÝ)/+�ñ»6¦¨l9dŒòÒÉøÜÇJÂD裈X¡€�ãó}¡W!‚%#*Dfø�á M>hG(NDþ®bÜÓ�8|ð;Ò  @ÄQ�µHoÆù³ÖàRÂÅ\ÁßT~y*d²+dèâ©gìBÆŠ��îp6&é#%Š!�C¾ü×vÃàÕ^náWW¯ŒèèZ/(/FÓÐÎM@Ø%3ǹ@Ì‚˜„¤|˜ïeÏJ‹ßeVû�]h‰©Â‚ìXŒc¸Öy`#‹»Ò�L¨�ƒNhjîÁ!Å ]Ô~2”Øãb«rÊŠÑRâ°¯ÍJ4ì%~>Œ<…)Èbâ�(nQHŒr­}ØGZ ×+{¼†Ôd¨š´vù_† ××”0ûÈ,$\×>£˱‘W:–X˜gpi> ©OLZ v%Ù ‘Oh¯t}F €“'è˨RqÄM)�A˜‡è!µ—õ;¢µ£‘LСQ4 aCf¼GæÛÕµ -,p=F¤7ÛÌr¹ˆ%:äzBKÆk_Ù>Ä‚e-Ò$Fzí;(¬t4r%³Î(Ézô™È%ke3E;åëå¡VQä±áGŒB>d€‘»[Þ|G p˜mÎfŒæZi` 0<*z£½æ#¸¶*‘DZ#G±/B4…B¢¬JThÔcFlEIJ�Š ìÓÀ ‚xŸ#(v#×Î�\Ñ), P›ž ¸¤¶0ûѯ\€Àq[‚¥Ied\C’®E;ôhqõÎ̇÷ˆê[=Jê ЯÏ”A'd§$´ ‡cpÉàiƒ˜³LÄ8cGËz(igB�HàÍ`�©NyYZ»$Žº¶ §w”hý§ífg¬'‡ ÏA=ŒUiÇ;;6ò<ž�#êŒÌñªÿu„¦èÀS «ža–qOë%e™B—~Ù—˜ð7Vh&DÙÁɶy^ „ *Q¢úBÑ©'¥»�4Bˆå™‘eiä˜(§%èPeàÝ1™6£¡ãI6;ѱ×ðjm@²}�ÀÝ%ãJ Ìu;6B~®éãY0†Žþ$:3ño‰Q˜oâܡպt"�­þ bÄô…dÑ]á¿~ÃJ1¥í_#ÍQ¸‹ðk@Zn¡H娅ºÐç¬hSÆBÈ*èðѤú3NèTrÜÄöìΖ[§³Íëì6,Q'‚F¯˜Û-ØßX�fýœ£)ÅÞ ý�*8ü;jrÝ™jª¢ßžÓ�€#1N’_ÿ“ }ˆa™“Ë{!ÿ1þeL�Ža»µ©k�FP{¤JÅÍ»ÓÊÊÛlní É>Ey¹�Ûu2¶qOÓ¢£/ëú ƒ7ÒckT„;.@ðDˆyB‰nN)ÚçXBi­}݃›µ>¡è"çÌÊÈì—ÄV‰x‡œL픫ڴÍ-ËTxΦ(Óá!Cº'> E{‚ ‡2M6£GÊÚ;™1…敵Ý_&FŽ®hm6sÐíBWÒ¦y´ÀÉ:™<�:ÅO?xY(]¢ðúH^БÎAYnÿi\Í�­¯ZF\ß Õ »zâŽ�Íšé!%7mp›¬´ g„d¨p`ÓQ²Lï~‰æØ>7 Âf9DZ€*ëZoŒhÚÉP܉¤�´e"Q…äeVJѼ…<Ê3{®}ÝmBZÌ/ôÛ¢e0¢cý�E�RNA‰yÆ Ë¯LT@iˆv¬± ÄMüèÂ!íÈ�Jàæ»£èÜÉ)Ü\×vBuGÝrL¡ûr˜™}A={B{^/A)œ¤ËNµ™Ñ²Ž$€�\‰ˆPo`-lÉŽ,ê0\´ï�,]çNàMŒ+ñPùúgŸuR}—A×ãJ¤R­¡SÉìgwÃŒräæ¶„6�¢)q›cmXåöi ¥uÃàh™aÈ*:Œe¯à¤�ŽÁëæí%ŒLý¤´¼}¹Ù™é¹™éHoÊèmS .Ý$Ž(T,Zs‡¼]§D@”õZ’}Ù¼I¦8hÓÛ¿ÓZ=*áë(R¶vÔèÜ!£E°hnöYòD³j�ƒ¶Iÿ)>q6-r5cpó×}£eË^ä7"’Aכּ+q©ÜËða%#'y¬(‘±ÃI2Mäá r2Ãý�ÈVa@ˆ´0í;Î6ÃÃX,Ûá½!ôã`à‘ƒÔYĹ2Š0a†±ö©2eåàÜ@·6MMÚ2n2\xܺY‹0Pi&a9…LËN‡N-Á5Ï?ñú"!b ¿FÁî $ _zÌ’èØ¤å»Ãðf‹_{«!L™¼ÄP�^ös�«Ð,8y(Lø.z°ƒ3þtú4 mPÌ1±ë Áاl@ü o»lÏeˆv cC�š�â�"ãR!Z}zÎoí åU!>AéUaø ò�Æ2PwBæÞÚ�žÂ7�"®!žJÄàÊZmØ¾ÂÆ'â=±"q�õ”"òµRvZ[´ @ÌÊÐ/áêÈÜB 9�R;øYädd&â”U-ùmÈ DM²©‡OÚ~àDi�" `EHÿ˜Q;7üwö1#wZúÄNv ¥þxöW]=?7«Uë~âÐ]/ÿenï®ÕÊ­#(˜ù¶_ÈéJ8Y„²beZ²³Ú& ݽ§"¿©5¡y=bðžC;×hL§™çÕp�DiñàÜcÖìY9ºÿ>ýSòãìthåà’Šx<€ÖÖØšmÅM- Ý-º(Æ„t,`#t`˜##A‘LÐÏhéê•Ù‡ƒ¡¶c¾½ ÑëšR˜9]Xo=…Óa”¹Ú¬P€AK8^™âÑ¥ÑÂDˆB–„OLoüZ»…0Z “NfÛÍËJöíV�iñÔùÇý°aG犺솦Œ�%û'Û9ºßÞ�=*à£oúßòïë3¤Áge$�º{Oe~SKBß?hw�¢Ú†ÆtG÷üMHÄ‚sŽ^;°¤rdß½ÍÉ4;`ÏÀƒJ*âq€ÖÖØÚí]ÍïøDvƒ·¦„oo-”Í�öïibDIt½Ø�B–ãšõ®¬Ø¹|ÝøÆŽÎ•k�!àqÙˆ|„ÒRÝxöu ã›àÐfs LwÒ^y7ƒqîÙO#EÊ•¤ $ö4†‰@ÿÞ©SJÇ*TvòT¡ÜYlúâ1WH¸xh ¹ïQ£œí¥]sLóôޱ¸PEqÊkE�ãÕCû=bØ%ÌÉËœ¾ds¦ü’¡�XÄ�â Ä�&Ï΃¹]�Î0ôö,+@Ùd‘¼!ŸÓ0)Ý¥ã€à8›™WÖë�ÍœþŽ?Þà´gìAl²—ô ”¾õ)ëHB*¦Ta^Vym£™ì· ÁŸ5��TúÔ�ÿóÝq/ÌazŽZ�¹·´¦=øÑa?në¬Ë�´ïÒ¿îÓQ«è#˜©@­ÚÔ‰S¥àÿ.[|å¯V{2óŽwäå‡ßô»ê¡Sù'µâqÚ«b@÷Ê=ªVmê:ièîòêœ=¹“Gì:Дqø€½)Œ@SKÚÊ�‡4'ãšq …ƒ{VL¾ëËu‡>yÃGyYÖ·ï½b¡>)¯É™~ÇŒŸw²Bìîç@ðM"ðì23Ú®™öÝÇ­)îØPÛ�q÷KG¿ùùN&ÿ¡×Þª<ÙP<†C{íïHEÿî•«7w›8tçþê¼=•¹“Fì<И>ºÿÞ(@hjIûîçî-É4‰ä{îׯöÄï?�ÆvÏeóõIyMιwŸ÷óîÎ’Åp¤úàÐè€}ex%€¥¿/ Þ¢H‚x#…UïΤ"ÎÄ›_á-;‘�Æüúä©p9[–ã ½ôïP�àו–ßî7,ó)†ôv.�+V™RAÄDb’7IGïH¡˜E}âJ‰´H÷ß B@e–d5‰QB•ä)y*NH{Ò®0侟Šã¶~å1$,"×�ðè”pÈ‘(èšlÐѰ¡ûˆ�óœÎÔ f¢¸x}J´CÔò 'B¤b¥7BXÒù+)ºg%òC�I½¸ÝÎW!ÍJ òyô6_àÞRwÓŒyÿµìtÉnš=£S^Ve]£nÀ‘é@}SÚö}*ë²¼^3Ó“ÿ¹é£O¾íûò‚átÏ@U*+6tûqWçܬVpÜaÛk2¾XS²s>¤R±Òʼ–¤þI2ƒLo,²c_Á1#w.XÝ»º.spÏŠ+NYýìG£ÜÑ9'+9sÊúï7¿ÿÕ€¶À~ó?;#yÏe‹�¼n˜þí Ó¿�³là‹óF ë]^�Ýòâm{t±²êܳî8{ÓžB&âÁE'¬Ù[™{ûóÇ\÷øÉ�»îS¥àw�OM¥bDÉÒ.P)=HcÅr!ä9¤˜ñ»�®{ü”5ÛŠï»b~VzòžWŽzæ¼±xø¬·'’3ëøkºÉÎHÞ}éÂñƒvÀõg~}ý™_¿·|ÐKóGíUV�Ý2nлºXYuÎÝTZ¨(”'b©‹Žÿ¡´"÷ާ\ÿ¯S!ýíÇJÁ Oüª-ˆ± C1Â*tÓ&vTÅZÌJO>}ãÜÏVôuáH3­€`¼Lü† ÏŸ!é@ÄHSÂ�Þ<‚$…+ ~rRŠîX=µ¯9y�dÙq/‘ʧ2u¤D1Õ{y¸± Á¶S£/)�åŠÜh$â+¤¡jMaot&Ðgl(â:$yÚà�H•«¹ÐêZˆj‘É´+Ê€LwzÂ@®¢8[·” ?"kÐ82ßæ%)liNîäpa31þ)`."*zöNŽæÏµ“`ØoÛLCÖž¢¬\Ì]û‘+ßÀõ‰SA$à€r&.§)K³hfýJ…ȃÿ¢ l¶Žk·v¿ÿ�©zÚ@54g´´Å3ª '³¦¾Y�E›©†EÓï8[$J×3SÅÃR×�‰Ô¿Ypò¸­|ÿ�¿ð­¬Í>û®³Öoïb(€µ[‹S©ø5§}÷Õ†Ï9²º>ó¢Ö~µ¾Çç?ôYÑooe®G ›n£¨Í£-€¶¶Xè'™í†7tbTLäÒ€ %©dr’ ß÷S ýaóÊ$ˆ<ûËò,D�8'[µ©Ûíÿ�ÒÔš¦;«oÎhMÆ �e4S^Ÿv͸{…û$;£­KÇâ—SBµ½¬CM}æ¸Á»w” ëU¾tmÏ–dˆщ2dpÿëG>úα8<|õ'¹Ù-3�]·eOá…ÿ8«¦> A�:~ãß.þ<Ù3‚P Ç *�6aã{ËÕÔg^|Â÷¿lÛY“7À�ÆŒ‹ï›þÍO=B“öVübÅ1lÄ·°TvF[—°òM IDAT mpsl3Wø_QÞ º*ç7ëÅF6ƒfë-ÁèÆîðºƒwØe³ dÝv‚=‰†f‚iE8¢ƒˆ@Ò~&>¤0’d ExÉ>ŸÇ‚´TñÞ”¥kúÀ¡EUל¶tÜ mó+jrç~5êùO'6µ¤ge´ÎºæÍÕ›JzU�´='«yåÆ^³Þ€¹_¸êá“S�}±jÚ›î½b±£*:~ÜUøþWÏ;ný»Ë°-d¦'/>é‡�»;}úmoOóò}1¨4‘HÝóÒ‘Uu™Zâéi)Dhm‹³ÓäfµÜ0ýÛ‚œ&®µe_Ç›ž<¾¦ÁLÉ é¹ÿö‹–:= û™2zû¬k>»ý?S>ü¦¿’6…H]:4<ý‡ö¨ÌÏi�ÇR«Ÿ~J+óN»ý¼Ýåù½Škn:÷«ÉÃvæ7•Ug¿ñù°ÍרœŠ½â°0�ˆ§Î?nÝeSWõ*®mlI¬ÚÜõ®ŽýywG¥T,L;â竦}7ðЊÚúŒ·—}ü½q3yÍ.:ˆ×hýx‚KÒè~{¯;ãÛ#ïÎÉLnÙ×ñ�×&¶²ô*®þã9_j¾Êkr^ÿ|ØSsÇ5¶$²2’ÏÞôÞ·zôìZ3yØÎÜì–¯6”ÜùüÑ;Ë;j_mjMl*-¬oL{OT~vóS7~ÐДqÓS›™éɇ®šß¥CÃo>µ¶!ëæs—ýîŒoµ‰ÞùÒ1Ï|x¸®6èЊ]ÿqßnÕ‰äCWÍ{èªyA Ÿ;î¾×Ž,îØÐ«¸æÇ]Eéi©“ÇméÞù@emöðÞå鉶¾Ý«OkRaDܲ·ãæ=�€F‚uTãîI$Rùèêú, 7éimˆ�LÅysC^vëõg}-�m뾎7Ï>©–ŒmpIù_/Z"€ÞQÓ±£¶=tõ'·?wüÇß�fà‚¨9thÅ×ا[uF"ùào>}ð7Ÿ�zbîøû_?:'«õéÞ;zÄvxæ“1•5ÙWžº27«õž—ŽywÙ�—o{kÁª~�½;A£[Î[2f`é%÷OohJ�ǃSÆo¼êÔ•Ý_Û�ñöÒa�Ï !Ó5Å©„ L¹£F׎èÜZ˜ÅP¡ÜôÅZÑkèp,XùR —tS›È4AưÐÃd&|*J0L¢cÒ&DŒ©X ½ÂѲոÝÙ"-D»ò„I†®tIMíì;v"œ.eÈÛJhCXècÛâ@JD*!“ â@ÊΟñ€G)þ¦�3à ›ÜXÀ$;¶À&¦ÜR¦)³4h~l/´kI¾-x0̦%¼—ƒ½„2 ÿU@G\,äÈçèÓhÓyj² 4=•1 {ùW¾³~G·?<5£¦>»o÷ò=û;èê�Íé+6özá³#*js÷ÜwËyŸÕÖg¾ºp<Ä^pÜ7¼~Ò�/žÚ)·á¡«ß¹æô%wüwZ ãd8NvŽ€š2g½uâ#×¼qùÉ래;ò‚)ë·ï²‡N­®ÏR þñê¤ޘз[Íó·~`'w6ïîxîÝg6<û‡�^œ?ü�¥ƒ@A}cº–RL!‚Jq8}âϧOüÙJem6+×|êý/û=rû!…õ|opIÕˆ>å~öغÆL_ôRg°uoÇ%?”4^vò÷Ï62@•™žjmK3™ "œ{Ì�“†î² )u )£Î`hhNˆ­gr_—…©@µ¥bz÷FØ©=Xª¨Ë¹êáSãq<}ÂÆ+NYuùƒ§•׿¤Rªâ@–îèËu%O½?¦¼:gDŸò»½¨æ@æ3.uÄ­“;ãè~{o˜þõ?ß7UŸœô¶Þ]kʪrôãGn¸ù¼å�¾=aþª>‡ÕÝsùÂÌôä]/#;ÝŒûF2ùJB½SÀ?Z1ûÆÖï(¾rÖi•²º{YGÝNCsú—ëKf0¶¼:{xŸò»/]Ts óÙ�S1WžòÝíÿ�rÓÓ'uÎo|úÆþtî—7>9µ�)tà Ö5fÞýâ±ÿ¹é½‹Ž_óÌLJÏ|zM}6>ðúä‡ÞšØ§kÍs7Ï•ämÙÓéü¿O/îÔðô `äœeƒT}SΜ´áö —Æb¶§ÿûõ¢²êÜ–dlTßÏœô£¾êÑ9|s¢? бuoÇ¥kz4üúÄÕ/Ì ÊH’Éx*ˆ1Æ�sÔ†IæÕ#ËT*v 1£–�­%�œÚéì ƒ@%ÛbAÀ?y¯„R¤¼@mÙÓé‚¿ÏèÒ©~ö ï¿¢YV±†Æ"Ô7¦_pï9™Éû¯øììÉë¿þéÐ3n¿°±5­5‡vD€é“×Ý|îòGß™8ußC‹jïùõ‚Ìôä]/MI1/ ¢{Š‘OÌ…r£ ó¢œ0rÓ*9¯«™²Òi¨î#´ÌtÜ$)lñíÄ‘ÿ‘RØROÄ÷tɘ‚Æ£¶º³=Èî�!¶‰³"XG®8 ‡‹Qè=m‡ ”g"\Ú|ì`Y…K?ø™è@ vPŠD¦™¬ûö©ƒ`¬øÐ»A‘ùa„ 9ÚFN€˜-ꉹöMD仜‹ÜBëŸ2$jß™ûæ­�*$ðÓ ²ýPVÁFŽ<õeg¡Ò4¡'ŽÝp )ý¯NÝ_›€›K‹€^ý¨<�3gÙ(ÝÚòõý¾úqÓ�ž{•yMÖnë¾`õ` b•uy_®ë{̨Ÿ³3[4eà¸�;–?ú ®(õèÛǽ4ÿØ\ZôäûS~wÖÄàÒ©?Ü÷úë¶�S©Xu}V’–4ÍÉT¼¬&Ú‚XM}FiU®ä1M¿UÑ€«zýõ¹cS)£8eôög|ë$o N³å?7˜‘0å>þÇëúä-Ú¼ùÚ_ç@[*võ#¿zÿËÜ—RpÛùËn;™¾œ³làÃo�ÿõIkn<û›M{ ¿X[’•ÑÖ’Œ·¥,��ÍióWõî˜ÛÌ9dÿîU‹~QpœdçTKÖô{Ía¬rÍØØ]@yMT×g´±òÚœ½•¹lûks^]4T^ô}¯ã×ôÑ·, ‚@yædˆJ©x  ´"owy¾R°qw'mCùÙÍœ°æ•Ã_Y4ʪsÿýÁá7œýõìêK+ó=ÂD”ò•€k³%ì’ºÂS&üÜÔ’øËŽß[™wr ûk³_[döù.þ¾÷k{�è³OÅ̤äªMÝ>þv@*ˆ•Uç~þ}ïÇnÎÉj©mÈ€‰Cvýôß'¨;uÏËG=ýáá pã®Âßœüçó—(\:õ‡ߘ¸aGãD�ŠW×g&S"yBH¦be59Ø–ŠÕ6d”VårŽøÔ‡cŸú`žw̺ߞ±âì»f”Uçd7¿üçw^_4ìÑ9n:ç«)£¶Ì¼ç욆l½Ø¤(Þ2ó‹[f~¡;yoù GÞ�pé ßÿ~ú×›ö.[W’•žlnK#cCÕÐ’¶`uŸŽ9M,ÄþÝ+Îú¯Ô¬~ñ„¶ý ÜGøü‡žã¯»*´ÊFAcý4ÄËjr •R5 {«òdÖˆ€Í­‰–d¢5{ðÍÉÛöuÐ÷ rlHóÞ{ËÏi¾à„5¯,ñò¢ˆ°¯*çéÇÜ8ýËÙÖï©Èãbáã ÆŽ”�»rùWü¯}F j„OÙS¤p1˜òÉ ï]=8ý"*²ø½t¦½Zí*ˆCLIœA^tç©;Î;Á¾Ýc#˜“ÈÙÍ¿g#•�µð`+’L´Vig:�¨ÖÎÀZFÊöÀ›50p6m¢ŠÔ¥Œü RQ4K¥úO œDå4‘CŠ21!iÇ@Ñ'2 9ÒŠÉ㟼e�×O¼Æ}h (�8ˆ57½±6‰i*®‚žÅ•ÛË «d Ùpë˜×péI_Nõsa~¤'’‹VâB»+;$“iš˜–d< b4´X»í�û_ŸÚÜš@„xE]3ÕÀa½wýõÂ/žûtäœ/x*ñ2'»hÈY¤Ì&•ÊÎL"ªúÆtˆÅ0#ÑÄ-è'µI9)àš­Å×?>53?ytäÈ�3Žú1-¤R±·—\òC/]7ÔªMÝ„„^]4ôÝ¥ƒ•‚ßž±R«æÕEÃ& ßyÛÌe?í8-'³¥©%­-eGfo.üÉŠ¾O\ÿ)3ùóîNW̚ƻSGö.›uÍ|щةd5§@@ú-YEÚ¿ÐŒñdø…Mמ¶bêØ-E 3ÑöÉŠ~Â-"<WþÜõùOGͺfÞE[º>ÿéÈ%?ôJ VXÐÜ£sÝug®¸ú´ïtéx,hlI/ÈiÙS^EÇOüÃè—³c×¼1 úR¹¥´Óþw 4\3mÅÔ±›_ý¹ÄÎý-ɸöŽæd, b1ÃëêÍ]oÿV½+¯ÉFÐ(ˆ}Ýt¿Ò¿\ðÅóŸ�š»| ;ŽHP ­3@>PÆŸ/<~ÍýWØ�?ü{6¬ÚÔ-+£­¥-a[¥dÎŽ…^_<ìÝ/†€‚kO_¡åôúâa“†í¸uæÒ_?pfNVksK<Ù0¢}kéÐOWô}üºO@o@ýyOᕟV%ŒíÁ«çåI�W-¢‰}Ê6êò rky´¥´ÓžŠ|Žr Ú€ÂüÆ�k¯;㛫§­Ðw´Eåç4ï©È“Îp�L¢½Ã¾ãô/Nwc=IÁœñ„8Ñj±ÈÍUÚ›Û'%„E±í€nmÑ :•x§ïØAI¦Xƒ�*ˆc,É\Ñ« d§ãÝæ"¹‘vÐîHe^$á¹ù{3ãÄŠ±5G<”ñˆTM…² E°Èõ•ál,t¤} |ŠÝn´¬¢±�m^±•yK(Žã ü�6Á+¾ï€ò¾-Íi/Íc ù|6enÀoÜ9LîÂ1É•òÔ4¦ñ¯=�ùêšT&âÁM3æ÷(ª¹å™³6î.‚Øg|VT`RmñvR=ÕԚغ¯sCS:ð, ’H Š:Ô§P•tiÊH`[Ù€}ÕÝËM¾¤¨CNK[*®'{§ŒÚ1eÔK^3•µÙnÒ¢öUåÎY6P_ŒêSvËÌå»öçwëT¿sÁ„¡{žûä°Õ›‹i÷»ØÍ¨vìë°tM‰Šáô£6è9�Ææ´¾3þÅÛÞ»àøõ9Y­M­im�­Ô–ŠÑ×) zT-ÿç%…ÎŒðz?Òât°‘+c‘ç¥|•HÃ;/^RR\wÍc§¬ß^±;/ù¼¸C½,†Ô€�l‹?öî¸× =ÿ¸u÷]¹pû¾¿ÿ×ÔÒÊ| 0@õ÷—�š÷]¶Ñ PåÕ9ÎÇ15q <9TÒÜ£+eñê¡FØF&ÒRw\ôyÏâºk;uýŽ" âw\¼¸¸c=7•l‹Ù¤ÅJ@ï±ØSXß”Á†Á™~zZеSC¨®�êÓØ–âk³<û×ìj%�îLsó¿ëÛД>¤wyNfrê˜Ío.Z} kÓîNw_º¸®!ƒwËFÆÌû:.]Û3 ¦¹>#‘B€Æ–ÄãsŽxþ–93�[—›ÕÒÔšhCû«l©T¬©5]¶0 {å²Gÿ#ïÔ5fØNt ÁhŽ6­s¢>§ œ5g·¡°#@Kk¢-%ß%àGæ*#½�ZSAûû+ÇÌû®K&áó$ä& Q�Hd@rÍMcÿŠɨ£¨Ö)ÏÒ%íª¿‡âRly6 TaS±ðņÀnƒên€5oŽÇ $ËQÃE3þAcÉÐ*¤À€'a4oÂóE¸€{‚^äBöå‹?º[;;`%äÐôBY7mƒ®"p‰‘MSQ/RZjPfi†h‘zDæ'yfG'êÃóŽY1ðв?Í>»o÷Šß�±N©À·6uØe¿9ýöC.ûͺmE^šò1ö>sÓG[övºÿµ õMé³Þ8bãÎÎÿ¾é£1K¥ÿKzÄa/×l+º÷•IŸ®èÝ!·ù@SFkk„Âذ£ó�Ë®î2ý]¦ÿ¡Ëô?ž|ëùµ 2±°ä�Ÿ)xŠGý†mÞ•Ÿ.¢›ÊÏiÒsÿk ‡®ÙÒ%•RéiA�¢Z·Eל¾Êkr}güÙwÎè^T7eÔvD¬ªË*­ÌëÕµº´2ogyÞÎòü]åù{*ò’©˜ÜЧâ€Ç F�ÞTªr> BÏøÕ@€ ˆí(ëг¸¦cn³€PùÙ-CzU¼¶hØš­ÅAK¤¥zt©uZE!ßÁV �™ô7†—N]=¤gùU�œÖ¿{åeSW©˜±s™e2Ø,èÓ©Œ¸^b3ßü/«Î=¤ó�‰ƒwí*ËolNä´L»©¡9‘‘ÞVV�Ã\Û8¾8¬Ù^tßkGÎ[Ù§ G1Å·ذ³hØ×u�ñ§n3nî6ãO§üùÂچ̨–mŽ7Ëk%.é&¢ Peįš­î!B*ˆef´j»NOkëÓµFçsUuY¥•¹=‹«öTæíÚ_°«¼`×þ‚Òʼ¤˜ÿv¢4PFFc£¥·˜]{ A ¹lU^�e5MšA^æt¥À¾‘¢À’{�ñéX`ß©‘“7®q*QÕÓ©—²sæâ, ºU0|®PÆ•û�2HÃ\ŠA’^ú£r 1ÂdÔnâËÉeâ*¾†¡”K5©A·ãÀ‰ü+vtß¼™4+Œzìar·Žd âÄeØXJ0Aë%žI¢2²lZ‘¢Hl¢ºÕXk¢Ä/v¡¸…žvØW-÷â!ÅP´vã„€(À¬ܹ áæsæï½»w×ÊÉC·Œè»š[Óªë²'�ØÔ³¸êТª«N]2vÀN™jÚl�ÙÑWYéÉ>]+ûu/ïÛ½¬o÷²n…uÚKÇ Ü~Þ±+ž|ÿèÅ? ú×{S.8~ÕÉcö²<”‚‚Ü–DZ�“Ñ–™ž¶(€†¦´}•¹Ó&m\RUÜ¡¡¤K�R�ˆ§÷ªØº·à@SÆq£·?vÝü‰C÷pS'�ÝòÜM�sÌ�*æb<–:ʺ—o›»kÞõÿ{÷¥‹hW£%\¼ülãÇ'ß (ÌkºóÒ%‡(í×½êØ‘ÛÆ ,À¦ÖDemæ”Ñ[ût«îÙ¥æÓ¿œ4d·�ˆ¸æctVz²ÿ!•ƒÝ?¸¤bСÝ;×iŸ�$?§õwg~�ã»ÐQ›…pð­SAìµÅC·”v*êÐX} “â.†þ )Ù¿îÙ'ö½õÀÞ·ÜûÖÝûrAN3á§8eôÖoŸ|úÄ1›Ã ñ;kÈ4´$öUåž2qãÀ]:4”ձȳғ™‰¶ôD[vf’+44'¶–uœ:fÓáý÷wh¸ä„ïWªÅZÛ˜ñò‚QgMþñg}Õ÷�Ê’âê“ß|Ññß'â)Ñ!"#gàap7ÛÈI;aÄÌJœÔ�G‰�¢Œ>ŠÒH´Ô”¹!‡ 'FrG=X¡‘¹#†.e&� ¸¥èê5+«øCaÎJ¥Òþè„,ÃaÖ%�˜aÏw¤/»�Ø*»?åˆÄ£�%Wdý€Ðs  ÖCY:éÇ0{Ÿ<Ø�‚)Ö „F,ô¨=ߥ0nÅŽ(æaÀŒñ™Sg(ÈRÿ@”VŒä9h5-|[| @´Æó*áTËÜæ¬]‚-¦7oªµÛºÿùÙ3®øÕ²ßøJ<”VükαÐÔ’ñÏ÷޽ùœoß1»¦>ûÝe£Þüüð]ªýi¢Ð45 ï³ç•¿Ø9ØÏpÓS3 êo<{þüUƒ~7—ü0`DŸÝ¹hÉæÒ3víOê†ON»--–R n;ù-ç}¹sÁ…÷žþÓÎNÐÐ’~ÇóGþí’eŸÜ÷Z<¼óÅÀ?=}\q§†¡½*žÿlÄáýËî»rñ‚U½^˜7\ÿ"¾ºpx·Î w\üEõ�ÌÏVÚùÕ!½*n�¹|Êè}ÓïÏÏN©¬ËܳB^^›}Õÿº÷ŠÏ¼zá‰c·Þ÷ê$ú¦Ò[‰o;ùmç/×íðzŠ®Û)¯©WqÍ÷›ùIœ®NÛ´§Ó5�ž\u [«rDŸ²˜ïoÊumƒJaŒ§]M8l”DSÉŸÐoA}sâ¯M¾óÒ¥‹g½Py óÕEÃ_ølDI×ZÈÌH>ríg'¾5;#©Œî·÷·g¬Ü¶¯ÃåNûywa"-uå©«úv¯ÊNoÛYžÿÔÜ1 W÷Ö½¼µthm}ÖUÓV^=m¥R¸m_‡WŒHÙo¼ÒÖ-"š]JºÖ4­ØØ=,2¸nBƒ1X½¥ËoÿyÊ Ó¿~ý¯oÅãÁîý½9à�ÆæÄ}¯yÇ%K?ôBU}Ö+ ‡¿0odIq 8My‡¹yXÿ½ÿ㾫?�UÔ¡áö‹–~ðuÿ�¿é¯@Í[Ù÷ðþ{o¿ø‹­÷î¯Ízâ÷ŸtøÖx,¥üé¼e7�³|WEÁ%÷�ùÓ®BhhJÜõÒѽpé‡%æ,|Ë3'tï\÷冒·¿2müF(­Ê›õÖ„ß�ñí®ò‚]åùa0gïV n�¹ìÖ™f§ð{ËÛ@@€ŽÚØ6bÛ úÎèeÓžÂk;¥º>K?Ñ»ìÞË�áð Æcg9h™7Pœ•öUß”¸ë¥cÿzá’ï}9Ç9_ ºõÙ»vªí/oöîZ£³ÆõÏ<¾kÁ÷NßTÚ¹-¥}ûˆ»/]üÆ_ßL¦bŸ®ðø{GwØ�^o.ZSŸyÕ´WO[¡nÛ×ñ•#R(^Χ—`¥»€�’ìyN'ò·s?d86¶!gÍæûTˆ² ÷ÍaC8­¬(œÕnˆ#—¿ZÁ¼„_¯u -�R‰ÖÈÆÆP<ý«Ü>\¥{îÝ;¡õäˆÜ5…–a—Ûég²GÅEÁù¢ƒ.F¹ï"ó ‘‰¢?ó@ã‘®ê¬H[vo£Ñ­³yƒ7WJo°ïøÚMJ1¯e™T°õºoÙÈrú›ClJ€Š·‰Åe§½°œX`²bGì8FZ$sŸ"ésº`óg¢˜ÝG¥Î›<{mj—2»„Ñ|´,üzÉ/<¬ {wR@‚Ø€TÖ6¶ê¥lÑû„u¤.9qÍÍç~}Óìão�ùeE]ö­ÏÛ9¿±¸Sý—~ç G½½dPVFÛƒW-?xïÌ¿Ÿ¾yO']÷”ñ›ÿvñÏ|xØ‹ †·&cpÌÈOÝðé5�žüù% =\zÒWOûî�×'¾ñùPMg^VËËyoWyþÜ/j‚öUç¬ÝZÜ¥CÃ]¿^Ú1·©CnK¯âš‹î;cÅOÝ$©é©çnúà@szIQí˜�{#%ê‘w�xàõ f–LüN=+�Y�¨¯ªa±ù#}Î Îì7ÛXÑ®p¹­(%’c‡7×8zRL„K€ñÇëÏøöŒÉ?ͼgzYMn¨‹(D;8‚EHBñ'ú„•€1 â6Xµ÷WÞ Âcb1¼ó¢Ï/;yõòõ%—ÏšÖ£sÝ«~÷éÇ<ýÑá àæs—;jëÌ{ήÑáäe·¼xË»»÷ç¿ÿÕ ÝÚ¾ªÜµÛ‹»4ÜyÉçr›:æ¶ôìRsÉg®ØØ]8´ÊHK>óǹõÍé%Eµ‡hר�3áÁ7&¡«Då‡+Gþî¶I™�øR¨’' 4!¥êæúò”‡«�P!ïA{ "8Š¡_\‰Ša9„¹ S~!Rš´Û�âÉF¿/NS”Š!Dz°kºI=t‹¡Ö Ha¬5ˆùï�ò°ßgX>vm†ŠY²ÝðÀK)–¼çßH�(÷KR(*Óÿ ݤDž8Æ;Ý•��ÒÙ£-± S€¦ÜøV/ åIDATs×g7z gXe¢ 'Ðr·û¤ð$ë?n£…ȨM#Ôl¨3ñmJ˜"lœ ƒé÷îÌ·É8gŠ@@ùͽ)Q[-Ÿ»0sVçH R€1yL T§¼ÌýµM© àj.l «3lX±ñ�GÞ¿hu¯uÛ‹šZÒ2m�ýy^Iñ�µ[»|¿¥ 4¶¤ýí…£{v©ÛRÚ‘[þøÛ~óWõÑ)…n²±9}ëÞýµ(hMÆŸþpô+ †5¶&Ú™Ò’L{máÐíû:|ýcÉ^Õ�¬•?vÞ·lGy‡Yo�ÿîç®ÿ¨M¥�ªë2Ÿœ;&7³5RHˆjOE> ™ñ]àÝAÌmúhtÌÚô J¿—db¼Ü' §&t…Pv×iN�¥FµI¡¥ÒãÁ°ÞeÛ¯¼&¼´#‹ŒêÑÆ³ƒ´·ƒL3,8‘eŠt;TåÒ®Ó…"f8ìÍy€ê‰¹ãæ,¸©´s}SúO;;_þàéÛöuÔ^·¿:{ki§@ZÃDYhIÆßX�ž&?q/Û“øAæ-B\¸‡µÛÚìG¶`³„¨îÂá�f,0mT*F\9ùHd/Þ-¥€~eÀQbå†B R_L#cAƒž½§|ÀÊÈeʜǀ?~¥§Jl±ô´xÇ<3,^æ—›jÂá�Äa¦Ù9ð×I\�„_^Šeîš.�AŠÝ-%¶•ö!Uö‹àÄ~k§¢:CG·ÈZŽô.% Ù¿D©’«¹J?� /`ˆÚÇ•¨%] Ѷ~3Ïå–8’Y¨g•:Ï@ŽLRP®àœuq3£¦ÚQ«r/e§:BxÎÌ�x¡'ô�ĽÈáÉ•yFïò¸@�!tDEÉ¢ýmQ"ÂP7ØŽd5õyí@Q‰ÝúüŽ­ð…Šváz-ýÎIèMqé;Ö Å5šNA7ŒÂÁ,ˆXS4ÿ™=@(;1$ �K±›�ÌEr..#lƒMÉ Èþ% [‹r0Ay¸„¶$¹ƒ#ÊëƒߢðJ3ÖÖ^]kAçT(R€¢uÉ‘^‹i'½#£3òP*"œ¡R Ì+Aº£@ø„c?,ݧ N\å0gu£œf(Ç1!YPƒFíž•[ãòîx:AIœ ž³E3}v)†YqPÐmHìÈs…áìX ÉJš °ñó\‡Rn5÷mX’€]Ì¡Æú�6Iè´4Â>Ç.fz$'§>]䳆.8µsA6–g&âùÙtŸ\´�˜ag`”ˆÈÈì+G"Vô¡MˆB1Í!Ú‰qEHE6àÉ×É¢z¶Ù›óÁçÄÀ€­#›ˆš&hèÛMˆ$ó JÚ— |]µr388¹‹Ã Qq=ÿ¾ËùêeÇåÍ(îa»&q!PQÊ›áéwYÜ-•A!�`2a4ä"2"†gü$É 1QÉY¬è1]N³²*Hìc]€Å<´|›xd �½#b•Ë£“dHÚÛ *¼‡”ÌœÚCÆ@tCCºK"Ë ú„“R‚ë+H>Åûê™-Ç®Dþ ÁF0‡hÉt"“¾c~MJÙÛôÖ‹¨"Ù4`Û'I³D5†ÅT`¦«e€%l¡W*ÐÒ1]É”ØÇàÈc+eD|(–””ˆo69æ�†Ô—Í„„¸ªaž4[ì7!è—öýŠH7äîÝÙ,Æ¢B‡%ÏüQŠ……L�™-V2€(Û„Ó¸£/óquÅÙ ÍïX÷q:@ýåÍõÿ¹7R&0üŠ¿I9Û!�äÄY˜ekó"+ÈF준‚&“ÈÍJoK -I)RÔ©bÄ—$ÈC¢rš¥)‘—‘ÿzì°­Ût(Ì_ˆÌ#¢]4âo¯K/ø5é‰YÏxPsöBÐʆ߬-¬í×]A”û<ÈóÚ­,wb“CPè@wç´³Ôý Î{ü/Ž89`&É<ƒd”àË{ªøtÊCH(N<Ðý«Äe³¡[l}�Í-!+ ’ŽPÃ>‘4Ø¢©`­}A;­1%,}^É>ífXñ˜�BT¢�6ÊÈ CÎè_) Ü&2ø{|(ó™xIÌvxo(äªXQеePˆ)ìàT÷�+Joì°_dŒL¸EVd…Âì2ÄEDRp®ç‚ Ò1ÖDaž¦�i?#Ê¢ôWÑÎJŸË:Ø Ü^Øs©SâÜmÅû°¯5ÅêBôpÞ˜b XüY¾³†G_V#lµÊ oFŒÜ‰"ý›®£ã[¯³ÛÔd'îhWÉõµ0ȃ† ±C,I<ƒ`à †÷&0¡NZαÀNüFuªã*×ɨ ²¶Aîc˜1÷5ãS\�›ž™ˆ{QËx¿˜zub’ OvÏ©HJI è×u9Tnkæ�ç–¾(”Cƒ€TÊ*ÃÁÌ%^¶•Э¢¼Ç’NEà ²w^Ed·² t;4?‚‡v+¨` TËSFÝ u!”6cï9êþ!F²kV&Œi–ªw [ß-Á£pË‘ U‡�¬<ιstÃç|¬A_ ®íY*¨ïyC’žp=ŒQO¡;ä! Œ�Ñ�fMÈ�éüŸvln!Ohx  nåx`ä%ÕÚž‘â¡U!ϯ˜’&‹Ñ# 1ì<“Ná#løvEüGSŠ÷¡X#Š´âª�ûàË…å/)ûÄë%ˆë�nf‰ÌðЂ®(¼*æŽR–w¶«ˆ¦•{ŠþMîÈDÕ(y � bšC—¤d :•3¢ �’Š·÷B2¤©¥NÜxµ�[”Qy׈äÅN!8áÛÁ‚ëÆ{ f¹eÀÀ—¢ÌqÝ-Ì£ÿ+8Ei¦ÍIEND®B`‚dtkcore-6.7.46/docs/src/dconfigfile_example1.png000066400000000000000000001473331522615770400215670ustar00rootroot00000000000000‰PNG  IHDRÍ\ˆ pHYsÄÄ•+ IDATxœ¬½wœÅ‘8^53oßæ¨œsŽ %„D²1ƒ9çtøl|ö�ïœîlc�ïœ#¶ŸIþ’A !´ÊJ(K»ÊZiµ9¼03õýc:T÷Ì[Áï~ó�ÕLO‡ÊU]Ý=¯¼ó�-�踀`t€â/Eå ªŠ‡¨œd9‚¼Ñ�|íˆX5ä¯�ŒºæÅ++H#ƒ5viø@ ®�~ìþH˼g­5.‰ýa|4N|ƒžz $J„U÷*Û ìÕKd|á—õJ=ÚåÉ­ XTMƒ@&)vo(�DÍPÂàÅÒ8t‰xRáW¢×D÷Q%À¶lÅÇé{p)¯D„ˆ\DãH¢}W ¿üâbo5@pÀK«Š¦–Ã,áТ)$Ué…&)j¡M:MCU-"B �ì¹H51a‚Ü'(c eLà(…€ŽÀB)˜ÒÐO õ“jŒe8FúQYgÝ%8P6:Iæ¿i'ã&0.Ç}Ó�!¼(&ƒ Šb;¦J€D¤Ù†&= \qyˆXo IA¥Šõ¡G y}±ëÝȤ¨iÛ|ݰ»ÆxQDs„€8,Éæ}PäSLɶ¨Àô» {txï¤ìX„Ž ¼`X€ bËQ#^ -c.@ëŽ)o†>Qìc�Fd¾æ/Q:,Œ`SÖÍ®Ê;F]I>Ô7P芋N<Úâµ9Ò¤ IRØÔ)Î k4’ª¢ l8t”x’.ãõlu3ÝjôÈÿF7ú­$3j!•PaÒˆ(û—Ô"›£ 6I5Æ &<†ad–Žä€,$I ÓE¯8Ëââ <–¤’ žBƲq»–€?ñ'ë¯õ*á…4<…4,ý+! ‘BTVÌ‚>b‰ ¤¬è�¥­$MDÌQbÄHgT“�Q4…®XÛêGšKˆ ”“´E[CA ´|g„mDàX”@ ÃET+¢×^YZSn \ûö‚ŠÏ–â*uì»-–Ý´0X¦Ç›ÈGD5µ0ð"d€t0…Ô’#ƒhqœ šÿZ�º qCD²K#È(€àè&Aðø+‹â�NLù*ÌÜ+ñG¥Ý1kDlöÍßöÀôGs”©P5fD$xI¼b13QD$Ä^©›Àq²K ‰6• | R7„ k� 1­ î�ûmZ 9 ĪqkÁ\çWc[80¡PÙBödG  � Ý¥´ÒZ¿lE³Gë3!tq‡*ˆÂ”A+Xˆ,§EDZfbð[ÆP×Ba°½¤Œû¸´ˆ’f ŽUt÷¶²û„ò£ÅjYNц­OØãÂO±·Ñ¤Ÿ º&#S°óØeµ²H@ŒæC_•# + o"ú ù–îVÛbÁM4ø”¸Ý¤xq³û¯Ä°�¿•˜Ì€M0’4iˆ†\éOäD„¡ì¦jhÞ¼—JlE$ºší0MÜըʅ3µëK€¬ˆ�­Ü ž‘tÕÈB(F é}tЉò-‰QPMÀ°ˆc™-"ƒþÚ+1¿A\¼ñ £žÑ@S)~¬¡”+t&Û‚ ¾û”íÆ©è�Lä!�mvxd$C+Rà%Jƒ <‚Êgp/^ªYx¤ÿ(µ#dä¹ÍŠHjšÅt®] 3q‘@¡d±Ù#úEšn*¾D‡¾D–Œ«:†-µ`‘LT*®{(Rª•€‚l棲ôfSåó´äIó¥¸'S4ûUŸ—„F?}eh•c� ‰Pº'UnS˜½dâl›&_²r‚Äò`B¨IbÀCQ¨hOI#(ètYÄYd„9�—ÿ%®_ó?]ábsG†%Q¯l³úº�«¨ƒ€ÂÙ€ÔNM|R]kiUr(�¬žŽ«Éq¤´…DD­B‚nLˆX(c1ž0�>Üïr“É€ MfN4xm9rCjLÍG­uLw�L€öðÆÔŽ:ö”WVà0ô™N0/ÉbÓU$§Øå[@Gc Ì�t(ʘ›4A”{¬lÊÅÌIR�„öj�Àd­ést¹n\X8”׊‰•Ç()„Ña…€Ž=ñ’à¨D/.Y$Á‘ÆT~ÕζbJàM,$-¥1Çn  ¬U#ïÉ6¬\„ÁÇ"�ç…ø¨(ÍkLÌt¨`cUøâ�—@†ÔB}ôJ wÌ›*Å"»çB×Eçy¦­Vóý I¤¬G,é¨D¬àCE'|Ú#fwlá•d’ÌTy¥BˆZÖ£W¨þrá‹%‡,Êi=‘fÐr$ܵ(U�Ñ.á² �X†Q«ÿËbÒâ̢ݾ½*㸇Y‚aÜ­`$1Ÿ•dÔ�ˆÂ ^c”ŒÇ<(=ˆasT‰Ú�ÃOlȈí¥àACaï‚F+²8«� ¯Ÿ\ ÃŒ¹*êGÇã¦VU¤Ê¯Tg„ò„Š˜ÄºŠ¨¦Mò¦ W°²ü‡¾‘îÑä‘­\L²4ÄÆ[+´IiŸ$óç “ÈÉžŒGÄæFÄú1¢(ù–IWÒ•È/Ù 1].ì‡rKÒ7²œ G�§ÆYXÒ¾æ 6¸Ö�"„òbFû‹vMv1Æ¥ƵZ‘¡Ýä)MÐÿiéɯô > ÅFÆ›õË…N8j“õº¦¡JV˜ 7påçm¦!çR/^‹ù"†´D'Žœ(PûZÔ;Éã‚’y§¨¢1„à 0–C.¥ DÓø÷m‚/âõÀóÃÙ»ƒÉû¨¼³ioýgßø¨ÓppSpíkÞ¶Ù¸g² qዼ œ½ËìpBd8¨)Xnvˆa°üµpÜÑoógËœh$Ëb£i(ø#³l± ¹L÷‚YÙº_)[¤ì q¨jF¤ fäþ²×Hâån™ãl™¤6åHþ¨ÜªUs�ÆÅËP=4o/þ–5�'k‹@‘K°tBY-IFv ª©9š=‚1¦ª H0¸É1"'ù)d�1<ôΉD寔Äø}|›§a²-Ç™œÁU Ao«L`wTÉIhÆðBtLL „{DÉå` :—uL’Á¸þèžQkF<€P5)©Ž7æÔ�KÓ™à Zµ•p0ù—Q�=2 /]�]Aw"7{ʽϼ(Áa³™‰ã›LN.NíDexõ�†Ž˜ò¬7€³€Äî²ðuÑí¢L •Ù ¸H¯ÉDK§¤+f×Ô�Žõ [FÝŸU+uࣩæ;S­ƒœü  ‡‚ôC¹º—ò•x`¦1”rŒ)¦;ò€2|‰ . Y·û¤4yf„ ÄªÊÓ˜[°9õ §½’‘Fº+ ‰¶0~²âïÒ…ÃNû3vy[.uG‚›‡ÞRmùó)l«„ÞâÂÝ$õ<ì”ìp¹>ö–êÝ=~ Ûªx‡HŽ·òp Šòþ +ã òô•òj¤—uC`vƒBL‘�WÀNÇÄ o(Y õY+vèx¯.ƒÕE9ÿzŽ—Ò>2úPA¦–ZÃÿ æŒ.�“Ì˺ÔÚ!©Oö¿šàZƒdP‚¢[�Û,¨Æå;¼”n¿$<·öH|0và‹L{Ãb{•ôr\E…�”&îi8�<ª‘¾;z0‘ø[�Ó`•çGÅ�L²Ì<Æ:áX$>‚QNrK(àMŒBÃÝZ¡D±¯󵑡ã½E�$®}Ä v9R´Uœâ0k2ˆ’ˆQ°EÊÄk2šn%À*0b/’a(KfZPñHElÑÄ¡XD<ÝUØ‹ ÿŸŠZYøqñW¥ß ‰âƒ »á’sfI®‡—�ÁB¥£Â2 ]=�g¬}À“ïãJ öň^~Ì;ÿ¹tsS˜j'·!,áäŠÑò¶æ%ƒeËÜj}ת!7„ŠÒÈ É}7JºäòOÜ$€- Ì�£,˜$F^Û ýñ‡�SC°³Â¬`öeoQRÞ~i)œu£î©¸óiçè(è*“# Ëî4×á³7ÆÆ´@‹�$: ]¥Ö„›k½goHè*@b[q%¤…Ö˜Ó°fAV4ðn¦L*á!ŸÉ° y–h?cù$‰rH„�k­:ŒÝz-CZÿˆ·†K¡-¤h¶ÔÇ •{‘¢mH(»'£²`À@H"#|ïÀèN7Ž‚&'l|bA¶x‹)B` ̆#D ó â Ž Ú´­È¯¬³Ŭ£o;‘ Zö×8ÔJv¹NU«ÿ¸¦rËe!jÚ–(Dä¾Vé‰r>Z�Pÿ¯¥Ÿ !È0 Pˆ²S”N1•«Ê¦¡.d]ë:ñœ ·ˆVަ€üÓ)�a„]Sž-°»–&CQ/Š#YGF@J´,Ú E˜Ê¤K‚)1b¥R Ú7pŸ Z:`|�AùgÖ–‰+)|IˆLÂÁ™¾¯˜ÍÐ,d‘šâŸ?J ìܼ%Rj&àp|‰ñRõõ¦Ž7¢œbò:ݘø¡tË¿õ 9M©‚zT�JLÓúÓwSeø)§©jÝl­�â|îÆÝÆ‘îÖÙQz-?s8è\ÑKË!›‚âLnîöpüQHåðÄPÌ”€È"xù`Ú;þ”ýTÙ…�ÞÞÉîî)à»Ð ûF…+ @m+õoöÖ\ ¡´²ÅÙÜÜm$À†lêO4ðœÉÛá�³�Êc[µ·i®Ó0ÀÍÓßñ§ì‡Âw&;{¦€ïA*Ÿ¿î÷ô�°ª�†ž¦tO IÕ/€öJ*íɯXM5­Xœ'r~ «¼èÿ¾:Ëýy›Ã9;Á Ð{k�³sºÆ¯(ÌÙN>@žïŽçûÑðSÞËׂ—ϯXE5m²ÃG¢Sÿ÷}ØY‘Ø!Blªj‘Ò ilC0k7Õ^€l‘s`¢»m&æÒ<ÈHÈL8ah¶r¢VE9ù*Èyk–BÎÏ÷¯zJ{½W®�L1Uµ—mƒ¡§©¤ºK�ýÝ·gCÞ¥á'ý¹Û°·˜†�v�'hüQlé½¾ýë^Ásý¨ª†4�sdŒ»ùRȤ�ÔFBCÉ Ã1GCÂY˜OË ´*IÁN”¢¶"jòÍV¯mŠ¢RjKéâæK&a|bÀ¬B�ðè‰×‰"‡OÄ-Åë’ ¤åV´"Y!šZ€.hz¢hÅ<¨ÀIç¡·ü(oÍ�ˆ9i8#ûÓ"FIÁÐÜ$ £ŽÁõJ̸5¡%V¤+k‡�ÂÆËuÙ‰•½�ÞÀ„�Ì.bޏÏ3kÆC~£³Ð¨,é¯�…%²V?üm<¶f#(e‘7¤ƒ½wA.ÀaŠve29a$ôX,”ÛwTgA¸e;ñ`ÛÆ¤ ZŽg²[5ÕËÍÖg]d_2MÒ÷"È»¹”ÖªG’‚X�$„ ™¼Ò}’ÙPÅÚlÙÒ—iåäÎ’WŽô±ô…R$òÍ Ìn”ÆÐ óþœmÞÖÙÎñàúTÕ�ÝeÉ´Qp¹aþ²­á¨c©7cSÿpüÑüÜ­Ns? ósv„¦êâ™þ4ø|~Ñú0�MmºT.·sL.2§"äÇ6`gž¯rí†þ¼-áècEãŽæç 0 ¬½�_¾›ëŠV.ƒÞRª½€í•@Hþ¥;‰Sëâ™þ4伿h½Sœu7ΉtÇŸ¹Ë{k¡³f ÷ú×½æÏÛê­ºzJR+—�Ò¸£þŒÝ©—¯…ÞèM�·il¾”ª;üë_5Q pÎŽpüQoÍp®FŸðço†Ö€Þoå2t w$˜±Û[y-ö˜n¹ª:ò¬Ãx�a;˜ ‡ü˶z[ç`ãpªì –Ԟﮟ��cY#Ô˜xÈŸ·ÕÛ6FPeg°¤>ô|wý|Èyëæ¯{…¦îÅÓÂ)`àywå5�)F@ȧܓCaûLè.�üÅõ˜I»»¦Ô¶¸çÓá±ÁÒ7œý½®Ï_µ–êZðB„Sö{k®ÀW—Ay—¿lM0‹óÆ ·�@8á`0o«·m4 ‡Ê®`I}˜òÝõ 4ó'R®bÛO¥ñ°Ê…$:vÞad‹ÐPtyÃóØ*IQÜÄZ«ÎtG(ü/q7U$�†¶F&B2R1&A”Ði:ʸJB…B Íz€ër”Á’/¥0’ä¶+”ë�1#Î 4®>LDxI—tUª•tϼ¥eÒ”T7FÐʳIvÞ�OÁIb_pâ�0" ¤�•ËsI–3æ}âP b•å…m°‰¨éËáu‰ª‰)6§Q¡F~ö¨Öc IN¤c¤æ°Š…þ…G©¥d”YÊ€ t w,üÉ>׺8‡,ó&”HrÖ‰Õ™oå�Z8MØÇ†ú_+¼0´Œˆ%Ô¯¤7yÒÛ5�ŒBw÷”`Ø)(Ê !ãÀ÷Ro\Ý¥€-ÕQ‡PÚŽ;êîœî•–wúÓöz{&A®�¦îÑ1:Ø[æŒ>éšKÞÚ%*Ë!õ a‰–²ŒÚÅ'�cÀ¼€y„anøˆÙ�q¶‹SG5dÁ&» ËA'qè»ÁƬ©¬sfÚh^“á…ÀêYÊ‘€‡iº&— d˜�ƒÍJ*&®YJ×ÀÃÅ>vÉ€¹†Í\Œs[öòšù–Ȱƒ(Ô»1€‘:¢ ¢.gTˆdÂÈy0¬Q5‰„ÈÑ #Pe:H¡*V@&±@C€…o ”{Ëyhªïs¿-pŒÁ=‘Ðv÷º\­§ð³è цUÀ�m\Ñc!E! ˜B‰€—Ñ‹z8¦>Þ=ü¯óÛ%g¦:™Ÿ•ž|°wÐ#ù:-öˆpv€·{jþê7ü¦ÞžÉxl’ Vd i�¥p}¼P+Þ¶VÓ€óH¥=àùØ\§A>_ žOeÝØÕGšDÇ”<Â�%4ü48䜮¨I¥½äúNK­ wèbk5 h €�jÚ°µšzÒºŸHªJ»Áó±¹VÞ\Gž–u;¹‚ŽJ \A0ß Á‘±�bgß jIJ yyl©h„ŽÓZÔtÊ™$¯šÔ\„7¾TÚ–wÀœáœÝ¢BôS�ÎBW9¸¡¿âÕpô1ÑóñáÞËË)ïRi/•w—ì/Ñ­ÀOQQÖÁr"€Ã£``S°p³³{*£€¥ÒÞ`ÖÎpt#–g€œ¼Ó0Z€8�Ka*�G™"$Âh  »Áôë.#' òì*�é�@9,)a:‹]eÜ$ °KÒY›ÿ(W!c6 Ü�‰Z©Ô„›3F%DíˆähäEzE@ œ‹ÜØÉPG $«ª¥9,�‘ä·†@òØÅ�·��oBOj—PE7ÔI‘X`!Ý0BŒJIW²ÕæÖÍB•—@Ÿu”�‰“Œ$^¼‹òD�ñD@+é`K”ZIá“uâö–ó+Žu�=P GVn„¹hH£’º±sR†å¤#àý™ÿ2/ÖçE,Ú`É.T‹)’¼k¾ïÁQ{<9ÆÆÁÕÕ2K²Ì ±W<¸à1•y–@“gSÊÔØ­jÛ”Óå$åR§5©TÊ”ñãøÊÒà%„b=$²k€@ô�ð·%Ãâ×òå_HŸ[šêxʯé5d�÷N€¡ãm›íì›LÙ—_R�•©ÕWbWE5\_£GÈECGm‡´¸%L8Æq+ˆ<ÆÞa*ðÇvŽÇîR^�A‘N`äŠw¥>ÌŠ”JBèh±”(¨ÛP�tQÏyDeµ"ˆCä§,,5OjžôšâR="�ã­Ÿ��#4Ü„Ô]8Þ›‹iã\Ñ:_$vÌ„äxæCÃF+‡ºŠEÜŸ,ï!*ëÂA.zú 7@UWjÕ2h®rüE멬'ÂIìå$rÔ‚ˆÄåç"£ozM{ñ/9î†ùNãHmZ©»X„QcæáÄöq$ËC Û'})HEæX�¡–E@vV “�|0¼£± Ìwè[ÆN…4âVìf%ÞƒêÖðý1ëÇhÉ÷gØËã²I€“› Ä|ÊmÎ,¢´Û²xÂ^Òâ› !ŸñëÅ)µ¬/½P¢’@&Ñ`…ì3fð”vó@Gýkà(·?‘ˆÜ�õPá wD\uö$Y8í+¾Ù Í{L#q*Yˆ±ˆÏ K¸‰Ó+,dV² ÖÈ膊Ëq� T®=t—z]‹½³Q•KÝž¦Ð{8Wë›1©5,„ƒ›¨¢Óiêy�5Aʇžb€ÀuÚ«ÂÑ�aãHl/Ç¥Aç°µ°»Ä9>Ÿ¾Ûi­‚ µáØz[k�zJ¼Cãý™»±³Ï¤�çý™ï¸‡Æ@WI— ‹H4âDþÊ·¼·¹ÑÁù*›k�–£Mƌݩ¶*h® Ç6ÒгØRCD‚{tL0é€ùw×4ÈAEå<çÌ è-uŽ÷gîö:+ðì@x.˜ùŽsp t•‚'sûÚdhÒócëD"ÿ*ƒ{"HçÀ !僀ïô;ÇF3Þ�¶ çÜ@v2œpZª5ö\xD‰ÒùàòÀ 5v}p‰œ S´\‘³gr°hc˜M;Ç9PÓ e=ξI"»\‘óÎdáFÌ¥�ƒc!pÂÚV(ëÁ})thØé`úoý|§a:à/®Çæ~x|øô‡#�á™AB8å =‹'‡*JhñÒ; äÌa@3MÝ ‡ÆBm[8ó<1LoL!7@‡À B±¼’+r%„xh,Õ¶BY�³w¢He Bª ­_/ôê`‚ÔOa¡üq¥’æT�ÍÞ¬`�À8º"™'÷{ Ãd(ÍvvF#æÊQTÐÀË/d$x$iÛAî0±c“ͱy�a¯eâGa®ÇÑIT±FK‚F§f6"ZD*h”­9"ØÜ  "›rš,îX=$¨$ÑTt'< )šI(Xl›¬ tT‰ˆé’öa¨+±¼�úñæ`qÚ°¢±û¤ù�x+–ª*o¤‚¶²( ‘U“�«·úQîIÄK¾’6Árðd±ØëSIÑ�mY‹b`§—I#z‹ŠüÓÇT™cjA,‰L JL¥™°Xb(¨ ìá ù·áå‘,ñ¯›P¢Ý˜�Ó›Òd}D™Dßéê!üJfÈ"·{‚›Yîu<ž¯y*WÓDžl)¿ìc"„èþ¬=ùšVð|l¯ð¶Ït�� oóìü’ ù÷½H!º £SÛfû#�"‘“ÚtižœÜµkÈË;dž»;¦‡ÃOJ½ò IDATE¸Ûg@ÎË/ØB�ØYæîžäíž¹ �Þñ® x;DNˆrH0¡²+vÚÛ2[úZYŸoÓ¥>9yư“‘îà¹~©W¯ ænÏ¿ïErBì¬ð6‰OgºoÏ€œç/ج twOƒÐQËO¶=Ò¹¾$þ§‚ü²Õ0æAþüÍ0 vTz/,Ç 5î¦K‚ƒ¥où鞈GGRU;Ó"Ö™â²çç—­�1ÇE‡—m†Ë¶`Geê…Ð^á_³6u¼< šÂ9;¡­Ò{éZl©ÆýãÝL:¸dW0k A[¥·o²ÚÀ¨HN*ŽPÚ?ÞëM—ì fÊV{'Ttù‹6âáÑxx4`ÃgPS°p¶VAg…»qn°x£ד�)vöNr÷L¡ª%œZƈ ½><:¬k çn…Ðq�u7ÏErÉõƒk^G2¼.Ù m•îË×:­5p`¼›I‡³w‘„ÐÝ7™ $4Aé,w*:�H*ÐÎ@'ÙtG8~% V¨aä9’�ƒ~–ßV’ľ-MÒµ¡ü‰A E0’˜_KÕW›\‘…5Ú£J«#÷:Ê�Þ�†RŸo£P®  * pBBGH Iá2asåoÄÝ<’ò2šJ¡æ‹Q;ù‘í2â¿×ȆÑ(I„L²[q‰´œL6tÁæÌšT’û¼‚‚5z"­¯¥ÌPT+t±:|s¢iø4Nm¬Ð¬hDÕQo™_×`“FGËy¢LûsÛ 6"é\„Êí’DŒÿR«Ã;7#•¤0Uˆ!�E$¡4j„¨©*à˜¯æñ„VØãŒñ ú„ð(bØj› lE‚�Ù%�°Ö@r™Í�Ù7O ˉ!ßùÎWR´œ ^uûïZ�£ã`5äÿ±¸ù÷™ºs”bþEâgª %1MÊk™%»ÈX8Rº\€Û;-bëPb�P»7Õ²:dþµ0�Ø=ÄêðByl\P†;®˜@±pöÎ`ÔñÔ‹Ë!WdÃcPÒ$“X2LììQ™�0�,ä 5r&ÑL‘´›³[1“®"?¸îU8_ën˜Ï K¢ù|7—ey•q°O”ŠÕÒ†EnШËéµ¹µ¢À¾ £±=PgóÄ0ȺÓ;$áÌ'*&ñÏzj+Å*ÅÔ‰0 ¥# D‡í£’cºã‚›’@GõH?rçA‰ì1nmÿwW¢Â[:™hVЬoˬ‚YFZÂ_*¤t’_y$#ÕÏ”´,5¦“aáf ³ L¬sËä‚b”Iº¬Ì�Dr—ƒïªI„©u«a4èOÄ…½ nV¥>H!+Xì3ø~±Ö}w“yLr |¨�„(£r1�Å\n_W¡:–_ˆ§êLFDàPHBâ‰ÚÀ{03è<E¦ÍúŽ¡pà$Kä_dã ½’6Vã‡ì/€!FvóNÄîcÆÆÞX/.Ö{ä[¾$„Ê„]Ý18uÅŽB5e¿¨Ë‡â¤¾)ì¬_´‡CñÀžçÉP¶Rª$… Il B·E ”&Š@7 û1-!g�¤V�sHFQÒG'Zy�Á/xÅ­ßÅeªwr�Á+Ç=5ï$&›õ¢vÄ,sê!˜¾íÞ�·2ÀTC {Ë”*[ˆˆe× ‰^‚ß1: mè Ò��g?ÚjØu›éF�AJåPµA¹‡ƒ;uÞV7—Keˆ Ä,z²qL2¹1Á°ÈLqWg÷(d›7�ñ+~HíbAhÐb µ_W1Qõµ²�müÞâkAh”¿@^b˜ÏXŽR5 ˜¡†RÈ|î·…þÿý*þù§’_Ȩ�‹®ŠnÅÉi;Ó…1Ñâ)öJ9^’ëÔpF$Õ³œ= ;ÍJtrÕ_>(†áÌÝØ]‰M(@Û@£N¸ë拽™†¥°ib‹ 7H Œ^ÝW²Åfnž™#ä¿võAu˜è×û¼’8@†ôêÁP?jURµÔ™y³K¢<6B|÷^FPi%jH$«e€¢c'eI¹Ë,tE±YœPJ)™@)åubM¥:"ÕU„¹hŠ‘’dc ¼™¹b@I„éÇÕ­žxlHDñidyÒõ ØÏ²$ü•^«î›˜æq� ÈO8pB@Ò£Ú–Èû៦¶Ó‘ŸÖ‘ 7‘m]Ôã°�ŸÖÅ2kbšàÞ6:¤þIBÙNˆqdw˜pHÛa%!-ìù¬qɇýÓšbVР(/5Ž�áb;d�)1ÞI,dêGŠÜÅS¦6VŒDÒÂá IuT«¨jT£r‚<½€ùŠßZ¡ƒ47ª—æ6±BçAL[o%ÅÅ�TVYþC‚$x±|†hë²8LÀMDõÆ*$(þù§lÞÅýLÜÌ—ŘpŸfõ ±Bi"-0lV2çnQˆ“¶»ÑJ§VDÅbekÈjÏÀÒ �(T;©@‹|/Év¨i ±½ÚÝt©s`l nN9¸ð: }ƒuFšÌVÊþ€R„”�šIfNìÀFú?£ ´-’'j¿]HšâĿŶ:º¢<„ÉTí“E(ÍeCá,€¿µLºÔÇ©Dï Ía�PCL½�ºaçÝ MF·Òàéyd`œl1Q=Jß*z&»nu€v�†[`)ù*MOèƒãE�«ïû¡Ø8Kr3`¢ŽƒôFQf‹ÑpÆ…ƒ ¦7Dæ6[VIlNÔÄ7DŸÓNÏ,õÛa¶³DyYM’éeµ1 憕’°œ‡!iŒbÚ—'\f!q¤”‰4haÏR% Ò?îÃH¤TDf8‚”Ô¨œ‡ì¤ÌQ” rd´JŒd#(‘†ž1ÍhK:H 2=0 ˜dEuÏjχ4Ýšê“ùu(öQ鄟±BK ©–p¡üz:oZ¶•yÓÑœe¢CsC¥´ æ˜Üß3OÄÎÐéú%ã©!�bÏ–œE€Ia¼òÖß5¶G§ÐÇ›“¯¸›¶g°Å*a퓪½;`ÞÃõ®{6*ÇÝi$Ì& ²�Ú„ÇZ™Ž PÇïæ2%Í“kÙ@0™•VQ}Ú„{D6‰Ì?{”½’Ñ¡²BœŠÿ |c—�Wœœ\úQÁh6P¦™é¦v»º•rºf÷†Ä+# 5 �¬+3˜„˜½Ó᫹—Ž•ËdHl¿¿E3 ÔÞΚ%q˜™çÖöÎK#:&(ïufyQ3}V(Ô›ÕmŒÀ¤¢0Õ¿i>U…XJCmH  &fÞóœ;ñzOÖ-Ñj "ËeÝø\–‹�*Q&ÏÎvD1¦y**1Â�]iéS°¤ûdA€… ‡Ó@–l2h\˜,hŸ dæÛYü.ý^¡V`°A\1”x¹1N¢ÕMt²0A³t|itSj @ôësïÙæ#usQƒÀïûí]ÀbØ ”“Lr_ÓÄKõÆã9uK’R–ÕJƒ9ŒÎ?&º‹8³ß“�1ë¢q“¶ (á ÈÀ]Àò,g’¤†¨�…˜(áƒÿ¶©[‹(tÈåžØn»[¥á‰x£ˆ·$ò%rŸ‹“U"=E!“:?ÅŽ²ž•Œ‘äCiøõÎÛ<¯À©§dØ’¹�“Ì 6Œœo«uB€ÀgÛ€ììâ{bJhcëK§PÇ…Ê#OcõÉ Õhj)ˆ^ëÙ¨ô‰ 2€‡•DvŸü§ãPoé`Ô,L!+ñž¯„6ïºG©úñZf&aRmT�D¡ˆ|щþ±[©Ê,�¥ø¯¤!™ŒŽ·JD�mëKÀµ§&Uj(¢Š0HæÛÔn –“3{�Ü—¤DøâŽ4^�©5Z•ùcJ‰1ÃÓÈ) H¢ÎµÏROµ$>ˆ™`ew±;¥l¦%1ÂJеá� &Fk07¥vNùœÄ8"ƒv…/F õãõ±*Âö �ÁÈj_Ë5…Á§J¹ß«N~�ö½êÚØRDšbúeÕDeie`a¸2¹Ì}…´MÓê%á÷‹VOzh¾p«¥;ŒÔ€›!í²ˆ‘„’JõIÒ:¢´‡¼+uU‰aÛA8=Õ>Põ'¶¹(cØ{à°`H©Iе½¢*¹&9§�ËôËõ$1†Ö?þ2úŸXȆˆ„!PXPýßËYņ>lGß “h‡cÚÁë³Ü»¬Œ*†@»ßó –È% §ñ�~TÞ *7ƒA j +îûÄX«ûkxdºn»Y÷bœÒÚRJ´~JáPèè�™L`…~€tÕ@k-Ä[îªP£šÐJ»À(Æ·’ùÜã “¡—Û8+mzê¦<{‘@y�§B�›Æ°Ð«xŸ…´M�Ãq‹ $]hØIa‚Ax?Kr4ƒtæ ÑQ+hÔÅY¥há&±Að�‰K¾FÄH™O0÷˜Ùa©-ú?5UH@&V–€³fC_¹Å>26BG´·é©<ƒ´–±,Å “?üÃÄ„œ)žÝ«Ò8eÔX|ÏÏpÛCn±Љ±í-Ù§á´,[ŸjN"KBYÌŽ':VU˜¤§¢ jÍ eO€UÖ<ÉXÀ!I�ÍsSe+ô˜I$(æ–U §ÓŠºY¶Z^ŒØ~U€Å©Î¨¡DÿÉÓ+ ŽY�°¼Q7¡/­Ïv²c81ºY„aev!š÷<ÁX&ÐÚÇH[«ÃÎ9Ý+ó’j ‘ÑF×2È�&è()E&Mâš‹z $Wd’Û â—éƒñ76dsN¨¨(îy¹ R3¤P#i”ø¶M9YWÁAü‡�x¦Ä ¼”Ÿ�Ûºø,KØšA4j +8 —ÈP(õE6r $’»(‘'…®8‰ãr †õ,Àt]ŠÌ ‚ÃÉÁgAqÉN5d%…v²'b2ŒïxG³ù"7ŽŒÔÚ‹ EsÄÈfI,¯I–�$Õ,¡$Z𢄻ÿÍ%äžÍNˆJ%,II Šx!ßÎCÉõ±øÉz§Ö5”X‘æ¨vQzë–=šKeJ"ó›c! ­dEéÌåþ6£Oð>.Ë—pI7¨ÐÓG8Í‘ÕÔ …Ž« ËOW0Ç­|´ü±Ôoõ!$±úB¥6˜’I̘Q0•E°Ÿ'Ì”“b艈 ElÀ?I© QeœY[„ ¤Cy`udp/ò4ÈùÉc™ü ¦Áaùsˆ_rÞçk�I.„½Bæ2 tÎI¥@fÅE‘ †)}âÇYÙ„Äýµ\ŠGð¸Ä¤‹ä¬ñVñ0‰2‰¤ˆ~oxc-[’BU­5šR{DPŸk#¹Z¤ÖPöÅó7 ¦÷ :’óì¾]›æ;ÃOÏ�Ðøx¼‘I1è ÞÊôÉÿΓ(cbÒ]É%�‰qÁFƒgäl$�Ö‰J¥ÍG2ŒÚ^úb°Ã°©Däéü �Ý¿yê°¦Õ{&ôæRѫҢü’IGR®ÿÂŽ©Ü\pøn˜µ÷ÆKvëï×�i¯¼©àsËÞXÝùÝç–ugÒ€0lÃÇ¯Úøí§—c¿†Ç“ ‚ðÂô¡gV½3¡'WٌҢüå�”åŸß15 ˜rÂ7ÌÚ{Ó%»ÿóï×�i¯,@;€Úòž ›\×@¢¥«lÿ™�}Çc)7(Mg£²<ã ·!`RÎ/êÍ{T 4RÝ>nÀytØ�{@$¢ÆóµÇå¯ËJ¦Â?-{cPMçwž]Ö�IÀü± Ÿ\ºñ[O/o¼P§C{2³ ìÔ ñ}lê½môÄ$õ�r); <œ°×ò”¢bY”3=±/” ×=_ÔNàD¼XÑ�4ù Éͪ *‘tí‘{ÒŸé•äæ5…E•Ú-÷Y²OÄJ³fì®"TœÑC[2cÅF–sà7Ò˜“ /TWFH�ʘɴ𣯄Di™Å ˆžÁ}¸†ìrþ˜´‡ŽíŽuXø¼ëE}-€Ò%í;E×¢P9?»cŠ>@1°hª9 0ˆ@Çž `äådt˜ °¹È$%4ŒõÐ’2²Ú²c>dY©4 wÕY’Ì"@Œ~-*Ù¿ù�t¶9 q[møÐIOÓ®1­”_ռȉëDcŸÐ*î³4,É$QÙTYNU_óIZ%6¬Ï¸ü(F,&³KÕ­�©Õ^8¡aáø†ñƒš¦ =7¸¦½µ»4ç»~àÌurƈS³Gž*M眸ãØ�-µ¶!H¹Áõ³öTgÛ3ÅÉD5ÉSšÎÍwìt[U&ŸŠJæ�9>´¦½;SÄjÍ‚ñ� '�0èü”¡g‡Ô´·u—äC'›wg�>5sÄ©Y#O—§3ûÏ Üqlhcs­aî‰Ñsƒfí©(ÎvdŠõIì»dä‰_}äÉ"/à…›�ŽH{þ̧UIKWÙ=¿ºwßéAªäæ9»ÿÏ]Ï»N."øó[—ýçÓ+ ¯ÜµÓ~ó–—�Ø=†„?{功®¼R»v€Ò¢üe㎟j«ÌÈpð²±Ç‡Ö´weŠÔÌcVŽd¤Ì¬U¤b(}¨áÃô?Rç<ÙùCÃ]Jª”>j¥–ÀHW×~]õ‘¸ñéâe]J.ãFÏ TeadTd Jø×y%’R(¿kŰ”ì½µ‘Õ½ñO_pø#/ŽòÃf�ÁF—ÙÖ}Kk˜Ó`þ€ýÕê;i#.JZYV0ÃÖ# Àã*Ì.fȰÝò¸`‚NŒZ \‰†Z9K«šaÉ‘ˆBÐ?A›’©<-IÚ‹'Xož±PC ›Ñ§Vg•ŸJD9œE¸è‘• ’u!Þû«¬?ÝdŽ+ Q‹›šçÈ~´µˆ¯É×"¹.‰&ð.´Ê¦ÇN% cv"fÕ`óZÑ…9Ym™Üñs§Æ¾àØÅ?Ÿaè‚,eC±1’í–QÍ¢‹²ÌR0:È„Ý�¬Ð*‹0D™ú‘äø5ɼG€Ð:éï€ã„\°uþøcõ‡F?¶á’]LJnk>nàù?}ú¯~èì>>ä÷kÕµëø?t%�`ÞØcøäcÅŽê;ßÿžEåž\êÓ¼ó-ñápÝpòÐsãœ7°y籡óÇ6žï¨8ÝV¹`BcW¦hÖÈSѯ¡÷æRÛ‡gòž$ݵ`ëâ �ëŽzlÃ%»ŽÞÖ8bÌ€ ùÔ£!8»Ž þÚùõ‡Fï<64º ×¹cŽýñÝAø©?ÞõÖ�1Ñãêw&NøÒצ ?óÝ;^¨?8zXmÛ¹�Œo¬+ï‰êLvö}³wÇdN¶Vßù³ççÑÏ>ò×ú¹�ÖϹwѶ{m¹÷WÊûîŸ>õ? YŽô‰+×ÿÛûW;rÛá#õsÇ|ñÒ”¡çþÌ£¿_³à·kªîå1spœpŠ áù·� ™?NÑðXg¦höÈÓQˆÔ›Mm?6<+Ò'÷.Úú—oúà/ÿá|gpùC9É–¡»p*z~ÀB`Ë\ŠNTôªÃV™~RQL– Èõ<.òâ´¼‹K«^ÒvKì¤MýЉòäâ+2þ‰9ôÒ¸ ,’' ’i i¬3ð݆Èê‹xLY&J ¶[ÓIoúAù´­¨B’)aŠeõoõs¦ ;[Yœ¹tÌcQµsüå}Gšú± %loúåÿù@Žý"šºÿñÔu/ïšÌ„EßjêÿÀ#7§ÜÀuàƒ ·Œè×öß+—teÒ–Õ ÈÛ{j€zöœpÂàsS7•åUuÖ–õÌuâð¹~*T€ŽLúÆÙïÄø ÃjÚ6þçO¢ûïÜþÂwnAÐö;?"ØubH!!ÀÚ½ãÏwV¼ÿÒ]£û·üöµEÎ ˜=òTE:3wܱtÊ÷ɹbâaõ¯õ—Nv¦²83wÌß ïúå}Gšúé3Ê´*µáVAJ¥2ÒÆ37fòV“Z)IÌѲJfmœ;ú؃·¿ô¯�ßøö±aâ[X|åÆÕ3Gœþü#·üøžg�éÿíç–›ß \dücʽ�r–ˆÿzê™ÃOÿÓ£·üäƒÏ:ÛÿÛÏ-H éᘠŠ“õHÒÝ~å†Õ3‡Ÿú§¿Þú“»Ÿ9t¶ß·Ÿ[R:H‹íYAMd r¶ÅD´¨ Òv˜Iw Î(sUpþõ†Õ3‡i¿õü DjGjÙ`f.§å/Ä"}åúÕ3‡Ÿ6õÿöóË)”óƒñêk"Éß vo±á߯{å£ 6pCôÚþ‰ÿøØ9þsÄDÛMvçRÇ.Ô¶ô”�ŽŠSù_ÜõĪ}ßz©èDN¬¿¼|ÕŒ!§¾øäm?¸íéÃMý\¹¢ÐúJÜTdÄ™(=D>ðÄ­?¼ýÑahºCd(V$.Ä/d ­j½oá–Ûf¿ýä¶Ùße™: ‡_¾võŒ¡§xò¶Þúôásý|y9CBw'I L.€‰††øËËWÏzê�'nýámÏ>×ÿÁ—WPhnÑ@†š½x¡‰,[8ÉÔ¨sOÎò‰É0#|yùªCO?ðxÄ”~¾¼B1qêг?¼íé_\^xŒÅà†Íš„Ć$¼í¼Íž¤ªŠÎÊ'ËaD1‰b¿j«TØ /ˆ‡ ¨Ã0j1�Ù¹V=J¬&k!/g,›~ðÀ�¿Ý¿±oìoV/Öõ™¡]´v—®~g"Œt~Tÿ–g·Mÿû–™aâ·ÕMÜB¢¿¸ô«.G¤Üýlyqööù;Ž6õûÈïîní.E€3ö~õæUyßAG�Ã5Óø‘€ð­c~ñê0Ý›ŽÆ$„ãžÙ¿õÙmÓÿ¾e– aìª,íýñ=ÏNrÆl€ùãŽ}åo7=¹eV¬®4¿iÏß}rð‡~}¯´6xŤ÷ÎÛùà³×6µ—KoŽí=ņ„Nd�ëø|ÿ©ÃOW•d^Ü11|ä3�1\¬Î|ãæW $üŪ%?yùJm‚‰àG/.ýùªËé‡w?[^œ½sþÛG$ àºû¾vó«¾0Á$D�‰ˆ™Èp»i)°ä 0H˜.0ÑW.Pꃬ]Vœù§åo­Ý7n牡¢…ÐÖ]Ú•IweÓ�½éöžb‚ápmÕM¾¸«4[„!µu—ve‹»³Åb¬P‚ä� -[ê§AÙÔ ÛºKº²Å]™tgoQ{Oq¨~m�SXº�¸ªÈ4R4‹ãK§v¼D–¬+ä$cý-³„% 3UÉAó^`pUxlë)íÊwçÒ�½éöîâ0Œ @-5$ìÈãÒUèÞ›`ljaßziE&ŸŠ0íÎóY‡ILãÚvà‡þtŸöù’œ%Eù]Šþ‘F„jï)íÊwExõDz*fÚœgÝ0 @[wiW®¸;—îŠ: ¹$ëšÆJJßW�jK'øÞ-Ïmiy²­Új@‚_Ù¢®L¤_–PlçO¼‚†8ê°+—–Æ€dA,Eó <¨(Ìhƒ’€è¨nu&’+{{˜¼1ó| zlï)‹¤·+“nï-‘y€½g½ºwòç–¾±çÔ�öÞâXkŽ¢Ç¶˜@šÏÂÙ[i`·xcõ 0BÏüáVã-3é� %`_} ¤™‰ˆQž"ÐÛ�C»z‰Ò‡.ß•8]:ö„Ú©@Ï 8t¶?ï¬(|òêúÁÕퟹfÝg®YÇÇ úÒU¿xõòÂ%ÀÜ1'R^ðý箉‚ H{¨ÌŠ2û;�ýÕªE~àܳh[Ê "çŒ9ṡˆÆ�éwàÌ@Þ‘|êêú!Õ퟽fÝgcþ䥫~±êr ¤|à|ã©ë—N=p²¥º¹³bñ„£ž^6¶±eW4ÌÔágП@„±›ÿúÙGkË»­®~rÏÓüñÄ…êÛöѳíq•�""ø¯•WþrÕ⫦:×Q~¬¹öáOÿÕ6q±ÐxÞ˜)/ø?Ï]ÓÚ]UI{>§!Åd¿¼$÷ý;ŸZÝñÙ‡o;ÝZé:á 3÷}üª�5uôÿ}ëÌ_­^Ô™)ž6ì̯?òÔW¿©þਨñÂñ�?¾ûÙÏüù¶Ç£ø®˜|øûw=ÿ¿îå]“P††©ýÊžÏ}bô€–ï=wu:æa’µ IDATúËà­=¥½éœï¶÷–D"AK&ùüò7.t•-šÐð̶®Ü4û�U{&þûS7ôd‹FÖµ>°âõEãjË{Îu”?¹eÖoÖ,êɦJÓùß}ô‰]Ç�ê×2oÌ @zqÇ”Ÿ¬¼¢½§4r“­Ý¥½E9ßiï-ié.U“uyP†ä&•O�â }&@}/UŸÜöÞÒ–îÒˆ0ª®å�o,w4‚ð‰-³~»vqO.U–Îþú¾'—L<xó²–Ί�]¹¡<�ýîsËžÚ6ó×÷=±dâÑèÕ…Îò�_¹±<�ýîóËþR?od]ËËu‡On�ý›5‹»sÞ´ágsßÿúäMõ‡FGô_4®áGw=ûÙ‡oûøP€åtÎwÛ3¥-=¥,‰Í ¬‹…�*¦AÙaÖwÛ3%-=%2ŒB€pæˆÓÿxõºy£�•å.ÔýdõÕ¯˜#jZ>õë F­-ë9ßYþÔÛ³·nqOÎ+MåõÁÇ·6Œ^ײpLCy:³©qôƒ/-;ÑZÉTo>u¤¹¿‘4¨,Îü÷�OugÒÿòÌz²^q*÷Ý›Ÿï_Þuÿc·udJ¿°ôµÏ\Qï9aHøÝ•˪Ÿ¡9a@ÓOïxztÝ…´—ÿÞͧ¿wóó!áoÞ\üãÕWG«µ§´³7�ó�ŽLIKw‰¡p}ætòߜķõ–tö¦s�Ûž)ií.5œ«¤oY:󽛟RÕþ¹Çn;ÓQí`pýÔ½[¼qü€¦ŽÞâ§wÎúÍ‹:3ÅS‡œùÅÝO~õ™÷­?i%.Óðƒ[Ÿ¹ÿo·ï<9lcÃèüúç;ËvçS–2@[Oig&� ¼öLIkOi x†f²PHæKhë)é̤ó¾+:$Ä’Tî×÷<¾¥qäˆÚ–…cÊÓ™M +몊3ýÃ#kLüåZax¿´lõ%#O~â‘»/~âsK߸ÐU¶hÜÑgvÎô0¸qÆžÕû&}íÙ£p¢¦¤ç‡·>}õäAè>»cúÏÖ\ÙÞ[ŒˆŽ^7uïÇo„Ú!U^œýù]O^>þ2²©£œHO!mVJn•¦³Ÿ¾º~ó‘¿[»P‘�Í �7#€£çêêŽéWÑußâÍ�Ô_J„锟󽀯k=L:åÿÛM¯�páÿ|û™ÖJ¸uή®ýç¯.ymïøáµíÿqËËÅ^þÁç®=tvàž¯Ÿ¹wãáAè Âå�9_w¨iÈð% ßw"4•ô› =ˆ~˜„믘tøhSMCs?ÓwÁñæê²ôà�pß©��ÍuŠNŸÿþ 3_Ü1õw?÷äæYþý=?¼óÙIƒÏmoÖ�Mm8<úwkžë(›>üÌ7o~¥­»ä¡7/‹ˆv÷ü·ÿåñ›þñá;†Ö´þ÷½OÿË ¯óï+|r€àø…ê²ôà€pßé�Çšë@WÌv•Ð""!©ãñjþ)œ´hC@Çš«ËÒÙ „}§6^¨UiÉîlцã~»vÁùŽòéÃÏ~óæ—Û{Jzs~w&}ßïî-Nå¿{Û ·ÎÙ½éèˆ[~öÑL>•õ�®Lч~÷¡â¢ü÷n¯nýùG{ó©¬ï‚êðõç;ʧ ;ó7¯lë.þã[ó�í¿çäÀëgìÝxddºˆtùÄ£GÏ×lÓƒãªËÒ¹pßé�êXCMª$¿$csdF©Ž]¨.KgCÂ}§46שmÒàs¿úГ{O¾ÿ±;ZzÊÆh:Þ*Öþºs©�GGýþ­…ç»Ê¦ 9ûõë_nï-ùÓúË"*~xá†o¿xÝ¿?{S]i÷Ïïzê�kÞø—¿¿/ ½3̼°#Sò½•Ë}÷cwÏÙò§ óï¸dÇÌ¡'ïìŽöÞRøékWÿlíÒQu-¿¾ç1¦1x´¹ÿGþrï€Ê®ŸÝñÄc[ç<·s: veÒj~üBuiÑà�pÿÙ�Ç[ë4UtÖ!2ª±ôßTÄŽãjJ‹r!9ûÏ ll©�#“Nùÿºüµ1ýšïìŽ3íUtˬ]_¸fí/^¿bÍ�ñëۿ~ÓKÅnþ{¯\{èÜÀwNZ1mï¦ÆAà ÒâñGšë�ë@=¹TO®ªÈ GåLTŒÇ[ªK‹…ûÏ ll©3fË–­F%ê(½‹–™2ƒã-¯:‘æ@¤�,Üð­®û·gnêWÚýó»Ÿzàš7þå©÷[~ˆ™&‚ñÎ=óö5/ïžú½[Ÿ}jÛì�üåÞÜòÌÄ�çœ@7ÏÚùÛ7ÝðóÏŒêwá?ozÉóÂo?¿Â'÷3w~ášµ¿X»dí� Ã"Byùï½|mW¦ø#¾7íå¼ù…[fïÞÜ8òöß~4“/Êú‘a¤ãªJ‹„ûO8ÖRÇ"h¢ã­5Ïö_2áð«û&…¡£â‰(¶0˸W~÷2«Îƒ Té Òù“"`¡Ñ‰õvåØÄ¥%±7q¦ÒÈyH;Í2ˆPež€ÐCt¢êµå½‹' gPu8æ÷¿¿kíÞ ?ºçéªÒÌgº#›÷”â ÂM³wéÆ5:ËJÓ¹î\º£§8‚� ì £÷ÿ|Ú¾aMTôÜö©¿Xuù½ ·Ýí[GšúÕU’ò³�„Ž0m$Žü÷«èY<áp@î�št0ôC÷ÓÝùêî‰?¸ûÙþ]Ÿ~èÎÞ|JñÍAxßìÝ_VfÓ½%Z·‰B¶zl9z@k[OIW& laàÖÏùê7†DWO;ü�Û_”D±åaú°3Þñ®・²éså°|æ~¨(ÎL~öóàìÞ j6,äÙQà€±£�#¦ ö EÆþK7¬ù£á¿zù}‹¶}îÚ·7õ¯?4ª¤ÈÏžèÈ4Ø0t<'¸Ù› Æ7Þÿç[Žž«A„ÊâÌ] ·?¾aöc/!‚sí•\;ÿsËßüÃë]§Ú*Ÿ{ú?_¿vhulj–šÊâÌü±�ÏnŸÑ�M)ß:0fÑ·?LŽùæ«$ºJŠrŸßy|H&Ÿb. €`ÃáQ�„‡ëçrÙoï-Ýtx„ã„Íe«vOl<_Ó›OÕ”õ@sWùã›ÄªÖëûÇ_}èÐôa§G ¸áð¨µ{ÇÐÉÖêG×Ïy`ùƒª;N¶TÀ†#£6¯›Ë¶ï)#+܉ą§d¤Ö»D7½áÈhøKý¥Š©ØÜUþئYQòöõýã®>8fú°ÓèP"dýTÖOå}ç'+¯jl®Q¬G„lÞË^Þw~²rics­Ô8ßUþøæÙA_?0î­ƒc¦;ã`˜õÝçÞžþ¥ëÖ­î8ÞR]Uœ™?¦ñÙ·§wgÅI®Bx¸~ž²>œSZìØ¿<‘kЕn<2zÑQøðúyª…ƒpýŒ}½¹Ôמ¾þ|O…ã‚t"~=±}v4Þ›‡Ç¯;rpÚ�ÓŽ#ˆ¼ãİ•û&‡¡{®³â­C㮞t ,�íÈ”Àü1�;¾ú} ~ÿ•e¬Ÿ›úÿôµ«¾|íjéžù[ÿëµ+ö�Õ{‚ÛzŠ}ßÑÂà‡î¹Îr B§½·ølG%Ç76ŒÚØ0 Ù4OS…'ˆíù¦qÝžVll½±q4=²y�aÇ)t\ ?{Å›óÇ4|þo·EŒ®,ÎÜ9oÛã[/y|ë%!Á¹ŽŠ‡ÖÍÿÜUoþ¡~Á™öêvM`Ùš!U'Zª+‹³—�j|~猞\_bGTÚ£9,ð�x'‹(‰­ê�^û—8K|76ŒÞØ0 Ù$ñB±7zlja¯ì�ι®Ê7�»fò�²â ¨ ‰ð˜šæÔž)ÝÜ8ÒŰ¹³ìµ}�_j�½¥qäCõ zó©3mUY?ïc—oTÕÑÑ[rç¼m�o¹ä‰m—†!5uTüiÝ‚û—¾ñ‡u δW@.HeƒTÎwþkÕUÇ.ÔqÊol½±a4<ºižÁN"DÌùÞ;§‡,w¤,•íÈ꥓¤e>²4è]^2šO(çý¡](e2ù!çãz+†Š˜4m%­ãÃé­îX†Íú£j2±¡ÏU!:êhkTæE·ŽÎ}âŸ[ߨ76å†D�ËëåO‘?– Ü4{÷wïz~ýÁÑköLüÖ/ýØ\ €�bB.~rÓ¬g·MG„O.]DøäæÙ &ýÒ ¯!k˜ôA_4tOT'mæ ¶¼ûÓWÕ_;UC¸r�ZcÃ9ßïT[;Ï©ipä|¿Sm•’ÔHuåÝŸº²~ù´ý+Ê"µ»©adO.uŤÃ�¬¿tâ s%™·ŽAÍaá-+òƒ9—Ñv—SÁL×ò}jrÁ=Û¿ùèù~:J ä60ÝÔ–wrÑúe“÷÷+À¿ºo² ©O¶Uç|±ž›Í»®ºbòI;O ýÖK+2ù"pÎw–+VxCTâ:aO¾¨²$s¦�67ŽèÉ¥–Œ?ü×Ms' lª(ɬ;2Ä\ó]»¼„xÂÄÞÆüU†ÖDq£cB€mÕ¹ ÕÍæ]CÇ�0½Z0F2•õÝ®lqi:›ñS™´RóÈ8jêŸñSQÓ† ý‹Ü EWÊ ‡Vµ}êŠu¿œ*WTU’‰âŒè:ÚÜïtGe!Ê�"…Ò{"D<ÑZ]WÖ]R”çq†¦‚Z4a®÷tõ]Ÿ©¡šæðÍ›šìÒך[Au„,’Ð!ˆP)ß*^á0ªõbšþö�Þ?§>>|\—ŠÜàé-3¾ü?7«ààši‡:³ÅÌó߉�í Ãÿòæe¿_»`þØÆæŽÒÿö¾1¢®¼çÑÏ>¬á4Éy¼¹¶þàéýsvy>ôd½_­ºü÷ŸxìŽ;ÊÒÙÞ\Ê�~Vš<‡Ò)ÿ¹íÓ¾ðÈ-a(h²têADèèÕK§ì Âö†6!Üo@ØýègaäC€Âþüæ¼WvMÎnýÁÑüÔß´À­Õ'6ÏæŒRvÌ何;¦œj­’ €Fõo�4ôœ 8£=™ò¨yHÃëÚ~÷ñÇC‚´Øwžª=nÒik.*"Òæì,ò|èɦ~¹êò?~âowJäH±Æmtÿ WO…µûÆýÃ’Íõ‡Çœn­ŠT, çûÏ/[ý΄äœë( –®ÒÕ{&¬˜ñÎ3Û¦-žxôÀéÇšk̸Á^"Ñ`¸<7L§ò=Ù"+°æˆQ9 ˆ¥™ püÐUbžrƒ¯¿ïÕýÚ>÷èm{O ÉùÚû_Xѩڧ\ p]@„0T»£â0ª4¸må¿‚l]VnrG&"Ï�Pä_ß+#êÚïÿëm{O $r¾ö¾•*;ešD˜·¬Ÿ BGú5ñ;¨û²¾ç‡:;Xäú_¿éÕýÚîÿëm{O¤ÐùÚM+TvEŠÞÒU¶zÏÄë¦ï}fûôE�83ðø…j¯óOÊ*ãbP]Í“x謼n´YÑ“þŠî䯅!8 +FH¹áWW¼:¼¶íóOÞ¶ïÌÀÜ_¾r@E§rÆù°ÐoG£ÜŸQlŠ@Q*XÙ†8 ¢£È ýœ—ÔA7©¸Hn¾a†U­�iÇáÎIÍÞ€y_¾z"ËKXðh¯ýИ~®=8þ¾›Ö7Œ>ÝVÕ Éùá+×¾¶¼ò,AˆQtÕÒ]¾fßÄSö>»cú¢qGžx¼¥F‚¡Pµ„8摳Žt­Äˆ ô_Ì0‹ý"1CøÑþ0ˆˆïp¨ÿ  (å«&Aà!†¡ã“g‡Ä±¨ˆCE¨}ãAèœï,ãDz~ÊÓ‹š•˜¹Šl>åºäF[#a!>:ç¸T}ëÓ/ôï5‰ƒ%e—A'©!élï‰Ø3‚^3õ×Ði�¢T *Î2­Ôq6‘)7(/Î6œ¯™{@Þ¯­'Wt®£‚ƒE: Å-Õ?x~©0å^8uXSEINQ£ª¤·$�7ñR¬b/ƒ(ïœô£–î<>ø¾Ë·te‹syOµMy~Y:²¥Zúf€µíÙ¼{®½œ ÀhEp¢¥êÏ_-{§ ;[^œ͉ªJzK# BÐqè‹×¿þÅë_�ʃÐya»ž!E¾d@e÷ùÎråh”*Ug¿~ËJë#œˆòd¹’j@D¸}ÞŽ/Ù»GYj¯4È$O�k<7c¡{¬ÅÅ¢6Øâµ7Êâ˜hQ2§ƒÂTO3Ò‰Ìèþ Šcy°¡Ak0®ª>�ÌtgÓ õèþzr‰m%-�…ûZÊFô;¸¯u¦“HŽq>npdÑ”ÔÍ–Ñ…©žL6ÈEÅ »ô~0Ã%j¬%ßÃñPC±Û욘 q€©Œ–ð|ŒÅ"d\ç+œ$–sžn¿$9GÓ¾ ’:Ì•tW•µí>Xa ˆÖéTxìØêuýÛŠ½–ü�T}‹»ò®›ä9´ôç T.§æ¯˜–JäªÊÚÛ‹²a‚ä[RÐ3°¬uÉÆ DD:È;¶ºú@ÿƒíÅrà|…¿»î¥^(ä˜;›KÜùìï|6J »sÍ>Eˆ¶7ßyñ¢]Ë÷ú\�¯‰ŽØ9ØÚç¦?_»µ¶J±G§ŽØ÷×[Ÿñ¯²´­¾µøÑg.^ôÉĖ΂d"Ü^[ÙÚ�¾vΚ®L²¼¸ãêãWÿø…s÷7—iíÍ–â"{.§æ4=•ÈV–u4¶ætÂñ�íÝéÆö>Í�}î^pæŸo™à «~çøæ®Â§?œqçE‹[:‹||d6£& ®PÖ6ÿ£é™\ ¶ïï¿q÷ÀëNXU”Î|ôùH§Ó¹“·Ý}Å«?záÜ%'x9cc¢ug&u°­dh¿& |–D ’sëêIl-ž{Ä–•Ÿ�5\9kíìq;ßýl hÚˆ½×Î^õÊÚ)ã¸ùä•ïn»¯©ë�ÛªpãxäÖ§—~:þg/ŸM³\z.xT¦è R“”Ò]=©ƒ­Ås'oùhÇ•³>ž=vç;›Ç˜¥3…ÉL:™-Ngº{’r#K¦0Ù“Nf‹Ò=]™T¤@]=©ƒmÅs'oý¨zd˜ƒ«f­�=vç;›G¾ôóÚÊO÷ º~Ϊ¢TfÅç#µ!2êMiû¢÷�:ã«êùâÓK7MøÙ‚³iM�{b;Ô,� FÚ‘Ô°pýäËg¬ýѼE{︖Α›ÛzÒkj†wgSÛŠO�¸ee͈0WÌ\{üè�ïmÆ9B €!Ê*JeÆUÕwö˜T|{wQ´÷üøÑ;n˜µâ— Ï\¼iB r?<ï��{¾·}Õ.+êJ&Ã>éLA*Ó�¡UèèI×5—žsä¦wŒnê(.Lew7õµCMË�ÂU)Ðz\Õ�¿\ÿÔÛ[&Üýú9aÈ0‡sXe�a›Š´­'²Êâ_.<ëO×#ú7®Û94Ô6m;¬_sqA÷¶}•äâ' ©;v쮇ޜÓÑ�¶/êæ`Ø*h³n²—­›”¶?ñµÇŠ\±ÂP˜Î”u@IAW2 D«™¥$•.)ì.JçÌ+Ÿ™¨û—¶/øî_óä3œÁ€–œøÀ’ÉõdÃÄÞ¦Òo�óöÇlúù‹g%}Ç…KN™¼ýÎçÎçbJ�³¹PZëŠâŽ‘ýÖÕ†~ì3�oØ5è�‹Nüö9o}ºwÐ[F½°ò¨æöÂ[ç~ø¥S?TJWè÷ì‡ÇäŒÒ™\â•5Sÿpãóÿüè¨Ú–0q1 ‚ÍÌÓû+�Âwô¤¶ÕVNZ[�ÌteRš9¬_c¤IH¦¢™ˆf|ÚðÝ/~åaˆ7?›xû3WU–´þàìů}zD´CåÍͧ ßýýs—ìx¢ò`{Éo¯xáŒI[*§|ëô7ÿã´¥»›*n{üš-uUÐÞ�úÅgÿ×9‹ÿù凃 ü×'Søòù�>' óf~ox¿Æþ%kjF„šÄàb‘ø~îé›§-ýtÿ ¶�zqíÑÍ�Å_~óc™\°ø³É~çy)‚Ì IDAT¤S&nAÀ+*Ó™µzàí“Æ ¨_øÊ…ÁËk�ºoé©Ù\/®�ÖÜQüÅ“–Ýz"”VÃû5ÿý ��ìoŒhÕ�¿ÙÝT~Ëß®Û~ Š™»ÁLZãâˆ6£ŸNf�²okmU{O�P‰^/æÆ–RÞ Ä–éå MrЃCsÊ�þÊVâ­@�«‡q™»|{þȽƒ�Q�:©Tpâäêöî‚íûúG„•v}ãœwÚŠ–l˜(hÔ¨uÎT²>z@ÄAµ%…Ýe…ÝY¶ÿÓZÃ?WõêÇS¢;µÍ¥¹P (m»ë’E}‹;*út(k]¾m¤¥‚'lïìIo««ŠDSRØõ�sÞné*|ü°�Ç%IˆÕÊè= aâà:N!¢vƒg“‰ðG—,¤ò¹0È…AW&9zÀÁó§}†ª´¨{ÜÀKÖO6¯>Ô�NæúwôëÓÙÔ^ø­'.ý¼¾?ïqÒàÚ{®]з¨k`ßÖ¦Ž"œQÙ‹¨ºå”åNߨÞ�þÞÓF¯aý¤fð¯¯YðÄמøÏ§.~óh5­5¼°ò¨W×Å¶ÚæÒ0TÊÚþ{Þ¢òâÎò>]ÊZ—oå(ÍÌx⃻Ÿ]>ý™§GÑPkX¼qââ�í<’=X[k«ö7•-Þ09— " C²^úéøãòMˆ;PM\è†êíOÇþäÒ7FW5nÚ7€Ç¨[Öðî–±ïÞ3j[JϺç+Qùó÷å¨íu5Ã.»ïf¯š!±­+ýËWÎúÞ3�‰°®sg˜× & ®ÝÓÐ÷£ÏGHÚd|¨½Ê Q~\3ì²ûos Ðj×ÁòS~ùuªÉ³Í»èգᇵ5Ã.½ïfĆ¥êKmÿýÍe‹7âxYr�žG{´zÄàº=�}Wnî$T©j‡ MI¡Î—oµ|û(ì’¸‘nÝžaW>ä�tt'oüû ¼Ó‡?˜óð'D­ÞýÚÙw¿v6+nºÝÛÔ÷¾BW³¹Ä¯žõ녆ݯ=u•ìD""¥6íø…¿_O3!9GGnÀUšIƒj÷6õ]Y=œM÷YE±b"¯Ó�çO®˜ñäŠTà¹UÓŸ[}L¤ aK6MX²ÉI*P ÃP)µµ¾²¶¥lÉg“s9ûᕺ–²sþpuã1Á�àɃk÷6õ]µƒt^᪑á‘mVqET:j®£;yÓ£7Øn<üÁ ¿?'’jMcÿ[»Æ áá÷�¥ÞÛ6îýûÇk­¡¥äÜû¾ 䢾‘÷…¿]��Í“®^‡!,ùlÂ’Ï&ÐOT`WCßÓ÷õø�® \&Ìg& ì•#*卉Ÿ¿jZô\XTf*ô>ÄKoó”qœ#+&¢8Çñ €}몃?çl#¯+›bok̳ëA?{ÆX.„D|à|ì; Z¯ù|hwOª÷âvgƒOj†Ì_~Ìž†h;’Úß\ÖÚUÍNåÜN»di]YÒú›ë§3ÛöW~°yLT†8éÉ&Ÿ_>}ç�Š•Ÿ�´ï…hl/Zóùð)Ã÷înèwß'¼smb kª‡fu°¿¹4ª’Év yqå´èéD AmSYWORÛ'i�1CYYÒö›k_Ž(|óh[ç[‹nyèÚ¥ŸŽ×J {¾}î[»”¿´êè»æ-ºÿÆçƒ@gÃÄ[F½½i5zò¤íÜü\ôN³§ïøÄ÷^ÿb6 þã±K_ùxŠ?šMí…„÷/:ùùG5G›[lÚ;ð–¿\ûõsÞiî°»�»³Éù˧U¬X¹}$±«”jh+Zýùð#‡ïÝÕPñ‡…'¯Ù9Ð�0ׇšÏ�¡ý”(È{`ÎøÏÚ‹?®LÙví½*ã0µüóQ5+.:fýæ×N u€Th×h8.'ÕEÍ�^l¡yx p <ÑD¦Î?�GN%rGÛ÷ÆúIõ­%1n ʵFbÓ¦ bGŽœŸ‰Þ C³5ʵŠ/« '(¥ÃÝ¢Ò:3ÀpÂøj3^`Ö8ìú¾©âfÄӉܔ¡ûÞX?¹¾Íì_Ñ¢è‰_ *�ñzÎK»b@C˜ƒ ióÎF�1{åØx™ý°®µˆM¸B àŽ•›Ês`"–×ø$³Ð$`c€¥u*N¼oá§‘ °-EQ“V[°:0ƒñ³œTsÝù鬶P¼‡9cv4t¯‹¾f`E.D%ÏØÁ†t*ÈM¼oáÆÉõí¥Ö�¸/P^›VnÔª†è€V'\DÂ÷�bŽ�*‚ Ìþe¼)czÌó#æÙ$Á Œ¥|¯…[‚t¤ÇLÛ°¯¹ïòÏGsaZÜp¨÷t9·$PˆwA‡Ä*ÛË*û4¢Òšb?Ë+“?f¬�˜]k’/ãb£«„L¬¯&Z¨¹óÚѲSId ÝœÁ WbBP&”ΆAÌ]qpÁ.ÇÇ踿¬¶3Xù;dÃ(�P!îc�¥MÞ�‹�‡œñ·÷�£ñåºIO?8!,ꈞ°/þcE¬¦pW$]„&6Œk$T¢P]¾mòùë^�Xõ“CÍ'4`|Ÿ²!ÍiGˆC¤ýµõÝ"êûæCŽT†CðÔûS’*‘È•¤{ÆTÕÿââWžY9óË�•,ÄtïĆˆ6¬¾A°ha±š3àr,ô&‚-¦qjIÓ±tX6òEt @Ï!)K?o™Õ=rØþ{.{ñ篞»lÛ¨ØÎ’bÈ“”à/y>c&yÏû Õ‚xY±(n‹�l)AÕËÁéæ:£]–è§5 ýh|°]‰�r)põ…Gwê@i²¶`T@ðAò©Êç8"ö˜³R1MrNb~EUéj¨U¨‡ .|±IyâêµbäHð>þ_A†ç®G¾l“Œ4ê¹ÐŽ“ëÖj`}.`Ç êÛüôí�Wôéx~Å4ú‹íÀýn€c+–PC4ŸC,ß6ò¬ß|Ü á ÛFF”ŽJkGG´PŸ{?ŒÄ‘K ºSæ1­èT+¥hC™ÂaSiHø0àôN8I²uà”vâ£cpß–§¿òXEŸŽùMnå4àžß†G}Щ˜ËU&$ Dç&f˜Hís°’z­”Ò!èP+ö•“z=ä¡”Ò´ç(î>Òâú-%izêX™Û—ÖÂ~püT´ßЧzD˜7yáØ%•ø)šTÚòø-�Uw¼°fúü5GËE®^-FÌ®¡ó‡J,.³Ú&±½å!NÂac€Q×5”Žœ»Ég`A4asx�šÊ'^Û§ IöÜ‘°ÒŒ9LK°8´aÏ sÿðU¯/wš\UœÃ·aÿjÜAË»dV~tW¨è<ÔÊ¥RS5­lå ‡sFoO×6ðHå˜a;$øÚ-‘æÌr­9%f7"ö¥0òj)ˆ$�ì/M«Dž¨v¿kŠII÷ {Ñ øæMgÀx Žs—š7ŽÅ¬g Ë äœÿœÇXXÖ‰÷Àµ‚S‡ñÄ � Cö¨@<Bã­£èh2ZFÖô7¢LIͰ®Ø„£IÊ6åKðEñüŽŠÈ4Ãݣˆ³·!ËíÖÑ‹=ó<�—7L NçÓ>8¶q©6Öî!¿˜cu²o­ÉrWñovÁ:³oGóDUw3fôOD6°xa«ä.†à„°Îós…³p»#�1/~ˆÎÝÐÊ ÑÖ*·E¤ã’6‘Æ—Æ÷šÜ²qìÐUk‹�ÐòhÕ)žw´/òèõŒ•išB³É¹ñΚÙ/@bD¨`}5ÎN¬›3>V dî:^Ss¨ñoqS1lQðïxc~ÄÉ�¢•3 'ÜŒ¿l¸bƒ%›�{VŠœ§«;,Ýä’¤bÏãVF8EÅfxžÆR@ûmQi4éž±[»ÅÏöÀ,MEÞ>ªªE Î>ÿÂ\‘Ý&VA,µ¦µŠáÑÖ0I:‚rí�f´ñØ´žYʽE:èìrŒýÆŽœBãâ„;áMÙš5MJ݈‰ í5¦+ÜÌÇu‰ö¹!H ëà˜,Ú™® À¢Ô¢…’ŠQMëOYˆqþv0Å’=G׊ŠëqeÿUJàŒ^ý¼bcÆÃ‰…ƦQ1çòaºðÑê¸a³1³dDe,¦SåL•1þÞ‘·œ°gšp2}÷šÏKá Äm âá-?¥¶+~bµóð%º‰©+úò@7®ûÕ´,/\¸òzu™1zÍ��.Ú€ÈgØÅD­i€]â.Ñ&|„G�ë[9nk‘oõ¦TK²+çb׋õ Ø.6�³°ã–Ëö ý岡ê~d0•å‰Db®�ª8–n†Å4ªNPŽ#YGoâòB†¼V,YB�i½Ç¬mCÛÿ{7|1�f�—Ѹ‹B¸‘¨¼|Y­r|>€ÌŽù:.f[p£q‰X«(–Oƒp8…[+=;åÕˆ'¼6ìk=geäð—N43Tú©½ÿ%;±�ÊQ/ï‚<’¨*¢”kÜîb$B¥ò•ëyh^d»Ò�£“ˆÞ2Äü °0;Ñ×<´h6Ñ2X£R‚PÑÛ`z&GÛÈ-º`d£*ðašR¶º£B—Ìgô4, U”ÜŸ#¤"À*iàŽ–âD�¼SÔ¹áƒ/é0÷Ó»8ÍÙ‹#R2£ø-Ñj¼9ÂHØØT/ãGXÚ Y )‡k¢’`æý]žd¾à¾"i‘[±¡?&çÉÆÇ’¬jOu¸á³ðn“– ð-^,ƒe:Êà\ Mš4ÅFs" 4(w¨=g†ŠCùÃ<®ÛUN¥Ð}ž¢çlY;èPël¼}‘?LòbÀG¾l'&‚ -FØÔÆ„ØTœ"dÀ¡ N˜ð\vää$xr)ÿ0(÷—ïšHíEôuïæ‘�W— †r¹ ŽMA#aiêƒÜ¥ê¨awçäÓ$l¼YnîbŒâã#FktòÑ?N¼;ƒëê¼É æèe³mï"7NŠM75“>»æ›3ÞMÅ¿DĨøÕé& P\aå9™lP © ˜‰Ñú:|úŽ«1¹Ø1C«³ºÆ\ŽFmS¬5ÒSíè2‹¤àÐÆ{s•X’á”ðDAÝ4] ôÿ\ñêïoüg*ÈÚF(�k Ú`@YëÓ_ÿÇ—Oû@áW‹QÈÈÖUß8ë�_\õJŸèk)Ç�ÝñÈ—ŸUÕ@!Ö×q 0{|õ/®|¥ª¤-jùè{çãoÇ�ÝiIÎ…r9Ê£Ë(/\×übæ8ñTª�Fs”ZæxeRé/,ÂŒèDZù«< I‡_˜6èø‚ H“¥_UѲ|*¢]3�õS‚Ff ,9¡”ý0¢Žß¿@éCæ±-“z¦èœ þs‰Ì¥Gˆ›?Ç*J,L¡‹Ô”}Á+%ð„ÝC$K§ ³ª’Ëþ,Ð'’fQb˜Èc30ÁRÖ!±±¡‰ ["äa“[öW]1{Ý‚5GîkêK-(k†€¢tϬñ5{Ë:{RQÇ�­ZÑÜÖ•F™‘ÿÒ´ÿ.•È]~ìdž8zä¾®L½5sTÍ„Á& ©K&BÝ�InØ=¸3“’NƒÆÉ �·Ñ¨ŒMoRÁëØŸaˆßu¥æUž§·5Æ�Ø„¢–'´%ÂoȽ¢¬;>3ƶ•{•½Ö϶@îO4…Ë‚Ì"5îL7Ê�[ueN‰ZÁÍE(0sï[&Q�O˜üœ¦¹�bA³=åvùˈ°G%†Ÿž³øÂ|û!#¬'[Ñš·ÖÆž‰�‰^“:TŒãØ{%R†,Iï5 c-Ì„¸)¹³g&>é>îƒæ<’¥ìà¶'°xÞ”kYÇŒÅãÞº–OìØ+¸·ÀmÓTeY t±µ(˜õA,¦˜1™£‡ÚúŽ™ˆ † ÃûbW.l,Ž Ðz Ò¥�Yn7B\~›ŽŽºдŸr� ?äœPE�!´Ùq`òšð)ă¬îzìX5ò˜4ÜI�%­Ðò'²H/X#˜5™m4¶A•„˜føOr¬\$2¡*L«è¯dÞeœÃjnÆè]¸éŸ.9ñÉ÷g{¦Î¸WÍ®& ©}âö'*KÛH[ö¼éÁk÷7•ÅH˜qxþôOÿpÓ É tJ}øÓßÓyO6ñµG¯0ï_áCkÇ <0n`ýÚê!³ÇV×·–îk,›3qg[WÁôQ{sTgwrMõðîLRcœR‡ÔÏž¸sù–‘¿¿ñŸ¥˜€Ÿ^þZtRßRrÍoܺß~OÈBEglbÅMbó|>øÄoL0¡›5þH‡÷ÆÙezáªcÜ_ƒ84ˆ¸iiÂÖ#,¢µk~É)qèŸÜãSFÌFR7ôPTDÂ]Y�¶¯÷�X%€A‹j¤î" ),£�Í�̦ÅAŒ÷àèÉŸ="ÏŠŸÄyLŠÖyŨºŒé½@÷–­Â,$RyÔ&o+ÆñåÙ—§bÎU,eš �„ 3ý$™ nü\ÿ™æ‹1Û{´UTSKÎ鵫„½›�´,QÜ…,ß�À!ÛœJ 8i›òa“EBŠVY¸  át A*…žƒ G‚ФIÄb<žÆÒ¸ý“¯˜ˆþ Ô{ÄÁáỦã !Ž-%NµïÚ™Ás[óÛ¶Ëz’.�Î(µù+JÜX$kŠ\V[•ÖšÒxÓ¨¤ÙÉtûæ+’ îš·ð–S—sº—l˜pû£WôdQmÊ£  (ãÑ4tt§wÖW4´��“fòV˜Î>póüEë'=óá1„6v7”ßùÌ…©L«.œ±~x¿–ž\‚;MOnFòí]é—œ¸§¡oœ­j• ƒõæ�¾Å©Ì�.y㸱5pûYïß~Öû VOyêƒG ÝWVÔ5sLMT¬®¥ôšûoÜ^[ 8¡O¹kç¬ÚßXö³—ÎþÖ—@2þïu/)ßyb^ô) ¼û :ýXHÈ̼ �yå{ ßE›,¢A§65¢hˆžÝ2)zíê¬kzSq§’ìÎ!d=ö�æZBèÃU¶†Öè oMï™È_óUH0ê-�_M©$‘µ‡SE OÌòdÀš$dʳ…oWOåD‚F®7w ·ˆYû ^ì9cñP/ºfu")6ÿÄBuX T’S¿sÍE-‰’Î9úG‡¨YqF4D«Ôö#àlÈìOßx}3ãØ‚7%ŠEŒ[ í<:^ä1‹#.ãbæª-Nµ�Z$ÁTŠÞuÁB+©ñç”Ë*ž#O„ж…Ú1•+Ò„wè]ÌÄ‹e‘‰ÓÄÉÑ)Ž-_gþƒéª¥ƒòQš ûß»\rÂ=¯žfß´¦uw6õΦq›ö …©žO\U]ßÑú‰PѧãÛç½½dý„ÚfúÜ¥‘äo_9íþE'©@ßsíË} º¯<~íöÚÊ›ÿrMc{1œwô¦».Y”É‘ÎF¡kƘÝçOß´`õ”探N\ýÓË^K$LeÞŒõÐÚYxóCW¯Ü>*&pŠõ„¸A¦1VATº¸ 3 ¬=:‘Øq�€#T3ŒFÑPkù¼+NÉz1K \³ÑÔYl\1=àŠñ¿‡FsÌÁøô(¶˜ÎCOTÜÈ„™+óâ–P�~]ÀÔdOÞÙœð‘°PÅzmLÐ`ÚÃýÿ ¬°G]üÁ�¶£À@1+ å$5—Ä,ÇcÅ–ËA"öB *§FÉ+¦L–qJôNÈ/›89 +óÆZÑÖpò@êi7»1ÉðvМxu‘º8 ÌÁ2d†/Qܩ댸£t‹‹ ¯(Ê aEgH�Ÿq*Êè—FÒø­p‡Sga²�âÿ �i¿ÆM»%Š‹ìII_'�ÒÓ‹Ûé!\ '°yæ=lÐrÔ— Œ7ÂÆÌ® 0Û#Ü`«ËFQ)kä l-üà™xu› òl�sib—LWÚ>�ˆ!^Ù5Ä$â8fôž¯œñÞÌ1»‹Ó=ÛkûÿöµÓ–n¯FV6|óÜwgOØÑ¯¤£¾¹dþGG?ôæ Ý©âtσ·>·rÛÈU sÆW—v­Ø6êîϬ9XQЙIm««lï*´ÀBAYaç}7¿ÐÖUð½§æut§ Ó™_^ý¯ªÒ¶;þvysgñ·Ï[úÕ3>H&Â0Tw¿|Ö#oÍŠ`âàÚßßøâ誆‚TæWWïýÕÕÿ Cõà’~ûêé¡VÊZômÛ°kpq*3¨oˆ=ƒÞøxRiQ€VJ_wÂêÂdöïï÷éžAl Çœ «húæ¹o?¼töºš¡3Æìš2bßÒ�ã²abTUãùÓ>åß‘_Í47fW*™ûõ‚3"�édVkÈä(q(-ì¾ýì÷úuP#;ôÿþÓ4wE£6yHí÷/Z¢âz€S&oûõ5ÿúÉ ç¼±nr:¬OTû‡›^Su° iõÀ›'üï«§t?ð…ù'Oü~gVCkÉç./)èþåËg¾¸zê?¾üäÒ�î[tR”Úÿîyoγ狽º½+�H„çýé­sWL\ÛÒQøÂª£X|bkWëžIü¹˜‘ƒ´6ëjiXXŒtÃP¬¹GžÏH$VÑÎÛµ¦dXG‡0ÀF¾(Çã¹ÀðÌ– �‰„¦�ˆ�C¡?7�¢XÏN fîë�Ì«Š•¸ǃ9rIC°së‰Á 8ÞÊiÞ”²É-¸i) � ¼ˆ£3NˆWóqò°Ót±+Ó2�D < Qp@7fùL™øs‡q݇q×c*‚7¨ù"DœÉø ¼¡øõÞ'ü–Q"ƒŒÆ“Ìi©Ë“ [¶`Ÿ%SÈ�[ž0%tò2�,e/ØÆR‡‰Ã{­çႌ¼®�Ú�꫔̰è�+ëgDd¿ë0–\Ú)æ€[Àƒ Œ•HÎUP$:ç4oYSA2êgò�ºûnzá“]ƒ¿öÈ íÅ×íª/�¸jïJ/ß:ú¡¥³ë›û9bÿ�.]ØÜ^ô·wfEÎãæS—ÿì…³ðôýK:þxóóß<ï�ï=yaN'¸Áð]KWá/^:ûÏ_|öš9«}û¸+g­=zÄžÛÿvESGüîÕÓ~ÿÆ©£*þrësLÎðymåM^;°¼ýþ›žzÙ1 VOÕ ÚºR¡†D"üòéËæÍ\ÿƒg.Ü^×hEó M{kÓ„ÒÂÎæŽ¢ H":™ IDAT€S&o/)ì^°zjw6àÜGTµ÷¤•·œ~ä–UÕÃ?®vÙqëú•¶×5—9|oVkv CÒ¹¶ÇŽúþïoSYÚvãI+Ÿø`fª‚T®'›Ì™o¶\vÜ'³ÇU3™C. Úº Z:Í'XÛ»Ó ]¬¨BdsAÊ9oŽù„HPú¶ýé¦çŸZ6cÁê©ZA[g: ¡­³àƯ/LgqÅ¿.›¹~Åç#.ûýÍ]™tw6!6‰•V­5\6ó“o�÷öý O~óÓ Ã+š~rùë…ÉÌÝ/Ÿ…Ë=ŽHz5Gßc0² +¶¨¦UP1a(@ä;ü[qž‰LÛ.Î*BfáÖ>Ô§5¹dé§Ð47×g¼†t)Ø‚ÿH»X‚^‚÷Xá]ñx÷Å-Pí'V¢Ç—ñN Fh/ž ­i³:Hð<„$…n¹úæ¾N[óI­²hã‹q™ö ˆ Vøü5¾ÝÝ9¡p«�—·jV>oHCÖÍB©÷¨gÔœCÇÈÚJà y4Âb•Á˜æ]Ù ¥êÀ7¢8;9¸þàÅùc£ÄC´†%a\ æ„â"gÐ¶ì ŒÃë6þP½ ‘& ¬4.qÎPˆ½á¸L§+ʈhvž‡R"�KŸ¦`Þß.Ι7Ö[Âö3ð*dò<¬ €R Î;fckWÁOæŸS×R [öUÒux ­äÙåÓ¢Òïl÷þæ­S‡ï 3Êk«‡¾ñÉä\˜¨k)}wÓ¸3¦n.)ìnî(€ãÇí\÷Ë{ˆä_½|ú#oÍŽÿÝks¿wá’ÂëO^}ïk'oÚ3�„æTsGQ&'ÜY& êZJT. š; ÷5ÙµŒ\.¸áIÃ+~qõ+onzÝÎ!7�ôÑeÇ®ýâ_¯­ké#GˆU)€C8ÐZ¼|ë¨&î(_ÚùIÍ�›OY1vÀÁæŽâ“'oÛ¸kPõ�~N]¥à»,ýîK£Ÿ VO¹oщ7œ°æëg¿·½¶rÙ–ÑEéLO6™ÍÙ�íèN.Ý8¾¼¸ƒ®ŒPÿÆ÷ÿÌ¿Õ`áý£ù{Ÿ�9ñ§ÿ§1 £50vdÃD]s©Ö� ƒæÎ‚½M¥ÂÁ(èÎ${r©L.¸÷µ¹Õõ†»¾Å]ÀÊpc++êºzΚg–Mfù1ZCmSÉÃK�ÿÆ9ïþõ­¶½þN[Ÿ@~p+v ó´ ‹àÒ¡9Ó{±XíÆFÓ8šº}jCÄfS.¼c YÊ[M W‚Åé›jklŸ_·K*šÃíÚ¹ Èé×qj ¾¸wAň-ŸÿbbÒ<å’ßïj : �8„‹çn9¶� ŽÑM¡”öuexêʃno’V™MN6¼ÌËmÑx=¦–ß— Mñ[^a/ƒ'®X¨¡8vàÄ1HÜìàbŽèýqŒÓê-F1ÀY‚�ê4ÜÚÕe•¸XL ¥í–,@BÞêø!¬CZa�h¥ÃýP9]ñÉh$î—cã!»&bŒÁu L¿=û°ò§6eue ÅGSZ”'0 ÀÇ%©µN(=ºêàçuýÚŠ‘®¨a Jõ+i¿íôÏšº¹²´ R™EŸL"!ïj(ïɦ@kÝ�IA¦›u;‡Dû3 ¨oéCcóÆÚIÓFîþÞEo>þþ±¯¬>ÒÅmš„1’7ÚdÇ´©£øÎg.üãÍ/\9kíŠí£v7”¿½iÜM'tÕñkÿ´ø’–ÌRqA*ê »'õþgc.=ö“ÉCjw¨èʤ& ©;ÐZrÄ�º?-:±£'Ú\Â_²Ï­˜öòª© à¶3–€Õs+¦ÍÿùwÏó¶}W÷)èîìIäÂ$ÙÈ?W½hý„{¯™8ÜZ[õµ¿]ÞÐVÅ�£†íýÕ5¯:LòmlL41 ˳Bkd6 +€íu•{ËÀ«"}Ž¥ú—v «húê™ÜvÚòèj„=鲢ν�eÖ³1VA=r48gÉŒüþ Á±GLÈܹó¾|rs(ó • ¤Òtb,Hl:0î€u§1JXlÁ¾óé�`ü²} AÔ�Å=¶(>ˆ×%‡q�ch ¼»2‹…e¨i[-º&>¯¥•†ðpöäGC†*0ÏÑø0ˆ;G‘§•%±˜•ƒd$Ú´HYb+d±¿Z´jCS5‘ÖÀ¥Ïîj�¼Sê"6²ú0ÅåmtkùQFD:%KÆVd…•ã`´‰$ 24Ð'ºÖŸÇ…m�Ÿl $ íŒ2FE�[9+Z"ARؘrªL¿¦ßej}8*ìzWÿ?sÍ©¥ UŒÿ´Ð «MùkÜ� ƒ�8gl ]Ì¥(@øåAPÞ>Ãoì€(RrhÌÕ$›&*¶Âaî§¹»æ-^Ùô�\ºiÏÀP'îš·p@Y+5‘Í%<¿iäЙIm««j7 ùb,Ò©p@ßÖP«�}[ÒÉ0ÛcWt̰9J‹+J¨­%÷¾zê÷=S\ÐSœî©®ïÿÚÚ#.8fýüGYþÁxú¨^EŸŽŽžtGOzó¾MEÇ�ÝùIÍ�}Me“†Ô¥3=©·7�Ã#SSßïƒÍc”Òóf~’NfTGwê�Å'?|ÛÓWÍ^Û§ »3“ʆÖâ²¹ +SÀ™?°~é]âm¶vÊ g%êè¥t!nœw¬#.éÎ$³þB Óªt*z­™ÖZçÂà× Î\²q|dΠuNuÍ}X{¬�^S þÞÌq`zòšàlóøê4Ä��ŠK;q§^¾b7ÉÒ¼Žâ?yÀvIÓ`)åP�NÒPŒNSaÃzE‘ØFqï§æO¨3a¡‡¹Èƒ&i² Ä—Öµ¦< !>àœ§?øòbÌX3Èuf£/¸ò‘ÖÞ¹Hç:¨ ”2†ˆ” jØŠ­(Ÿ1¦›|ºˆ˜D Õ‹2‚ÆD§^æÄ"²J))~=®€+uYE�%ÀAØ@ÔÒü§ïxL¸VN¾ÍÁC"Ù“_„0�wù¬K<OÎCP.�hž œeËü$àÝÃzݸ¨!&A¶ïÒÃŽã—Ð8ççô�X�õÎh1ÂŒ‹2Ø:Ä‚K¿[»Ëïít"·dýÄîlªi»CˆF×1¨¼µ¹£°;“ll+Þ²¯jX¿¦îLò‡Ïž÷ÇE'Ÿ9uó«k¦ì�ÞÖËÏ*€ »Þ󯹋×�ï[ÜÙÖUØ“IÆŠ ÚEøÙÞ�ÓïüÎÈoü8úÞïnmƽ6Ä0}%uȇÜ’Zi#¨θ¢‡÷{'€C,KÄb2Ù6+¤Èäƒñ"°ÇL12¢â$Ô‚Ý Qq‡¥-[Ž,­qZ1à]ü¬wy¸Èƽñó3 Â6 3À¾û(¼âÚ…}Ñt+BÎX§”–€Tè•-&©ŠEFk'ÈÅFÑ…h“KØ6OjmdbÞy ØËïæAcÓlfórÞØì@u%F!Ú£ðà”ɶ”)ÄhO+øAÛlè1V6ž@ ¨Ø×aa åüÀ‡(©7 2:bîý»@0%®¶Ó¬k¿ŒªXب˜¢sþØ—‡—da­íãHÌc&£æßX;yÞÌõwÍ[üø»Ç¶ví×ÔÚY¸¦zhW&u°µøÔ)[W}>" Õǯ=~|Í{›FKRø2˜µá¢TfÜ€úÎL2ºØÖU¸·± @Ϳ㆓>úåËg,^?!ô/ycã®�ïm‡Mè²âîT"ì“Φ²]ÙI¤½;]ÛTrîôMnÝÔVX�Îín(×@뙣w]6sÝßß=®³;õ¥Ó–/Ý8aÉÆq—Ý{‹Ù«HøÅÌÈ¡ •3ðÀî†òöžt. þû¹ó›; Ã0غ¿êªÙkË‹;|<Å † ÀL4…b܇aðÜòiédXYÚÑÔ^”eû@ùMþ& ©ýø¿å×[; ­±¡S§NÞz÷U¯ýøùs¢×…qTaÊ`X!-hïIïo*=wú¦·�jl/*Lew5”Gä¥3…ÉLA2[œÎtõ¤°|ªú@¿³¦n~sãÄ]û^x̧njܽ¥¶ ”jé,xzÙŒ;/^ÜÒY´`Í”L6˜4ä@UiësMËæšÓaEžP|ÊF%’Ò¬�hãrºBfž‰ôz(K¾â½"¨Ö̇Š}šÚ8j› ·¯õDS°ÿڟʘ.bhi†·¬ßÐ"8FÞF<×5n·£+z¥��ZløçOšÈGNbœ^9+lÇwm u@ u˜SAB�! Û<¹tˆI°¡K£:ÄxRöÖöì à ˜†…z‰Ø)ˆ‹üõÇ’UXØ8 ;÷ŽÉ•IÌû¥Ð^ÇéƒF*¦˜¹¦À¾ËGaÎF$*¼ä„(戂å�\ŠF„;!Œ ´¦Aô„— ßL÷§Âüœ]ü§öb„…=Ê›‡4œÃÀKPo�Xïí“ä!/“waB6¥ÜxÏàÉ lÃîƒÌè7D]%š%‹À1fÌ™[Éh:µ®zè·»ä«g¾÷øíOA¸§±ïï^™ 0´£;ýÛWN»óÒůÿÏ�íÅÏ|8ýÉ÷f �&»ÎÎyìÅi£ö¼ôÝGègôž®ÊÒö\¼øõu“®›  –¬Ÿ0mäîÌ{sÇ_+´ß{ã‹gLÝšP9¥àÛç/ýæ¹oín¬¸õ/WoÙ_íÝé»_:ëûó–¼ø­G‚ \°úÈÿ~îüL.Ñ¿áÇ—½¾»©ïßߙՓMLVÛÜY†‰ž�Ž•û—¶�ªl|iÕð¹Gl-LepUA*sËÜåu-%GÝwÄ�ýðÙž�[ëð�J)o(€MÖ÷iYÙðIÍ‘a>ÓZl««ú�\ÒØavÃ9lïÏ.=¾8@@ žã÷ßרÞ�¾ûå³~pñâ¿õH"_^}ä]Ï�?¨¼õñ¯>1ª²!’ÉÇwß³»¡ü ¾nkme6Ü÷úI?¹|á_{<› m˜ôÀ’ç±5r /¬<ª¹£èֹ˾4÷C¥tu}¿g?<&ÔõûúîF»g]ÛpQ‹h3¦"v®eØ1¤h7`ó¨T@~£—$ªA*rŠ '¸“"EÄÛ;M�ü2Ð.|§7gØzU 7�aú‚¥¸)Ûi#=‘KÑ.FÚ¡ÐóPônþ|O†õü-iÔ„*ÌDO�P�RÁ…7éH=oH*$Ÿ�´ñKˆÃŸt%ø†àÀ>ÅJ€Fƒ¦0Ý HÈbHã�Z8ËÅ<„`P´‘E‚ F­{xÃmgQþ]„Ô³™€tìEj^Ñô &¨ /lî†\ùe“šxv¤dMÜUKm!Œ˜òi›}S`¶U‘)ò—ˆº`\5Ù Ð`žÎZ[„Ql�—cqä·;¶9”}Dk…o¹àËÐÊ¥Â%š­“bûò±UV@ÄqyÝ^µ‡Q< (¦J©S/úKuk�ÂÇË„q‘^rÎârbšo¦* ØJžXµa›àcdŠ€§CSpÊðÚ{®YPQÒqÇß/[³c8A. e…�çNßT˜Ê^6kÝÞ†²;½,&ŽãåÇ­½sÞâŸÿó¬ï^ðÖÐ~Íy†ÂPýîµ¹\xRô³¤°û‘/?µ§¡ü•�§DWj›K7î\UÚv×¥‹Ê‹;Ê‹»FôoüÒ_¯Y½c§¶ •}ðæçÚz †W43zw¾¾î_|ò½¯�Ô|§å Ž5ÎTIä®Í#’ÛU‘×ñ S>òÌS  À ÄâY¤žJøÄ‹ÄÕµa…ÎìÔ–”¤:´çu1NÇöý?L{íœ/ÖóX“@™Ù¦*?�$Çv +°õ(™£xäL ÿºväÈ”ÉCG�fÈ­�®¼bD�Ebå µ·–,ŒöQ@œøŲ)^¸{"1nݰZÏCˆ6)йTK$á·ãPË_¤’¡JuþŸ‡W2&œÅŽ,𓽰éœûe€©�ëò±Þ„™Uôâêünb¸Žf\çq›¯ãŽÃßœ‘‡=qÙUY¡ˆ’YÒ/À عk ùHö 8�§‰TLË^ ±I2%Z"ß–ÿ‰ÝR„ È¿8R©Å˜ÝLºˆþ‚™uÅå eaö.ß¡tg’ûšKüÂ9È€0L€ÖÙ0¸è˜ ³ÆíÜÓX~ߊ“³a’{•õý_[;eñú‰ÿ\y”Ø=m=„”(èÉ&ç/Ÿ¾ó@ÅGŸ�ä–ÙÐV¸æóáS†ïÝu°ß} OYS=TcÝHaNm¯¯jl-úë›súØ�›pV´†=�}ó� 'Îji5F}•,LS8V„U<*Üîbn#‚>�š<æÏŸ©ÇØ´½”lœ"6Ek7Ï,Á.säá*OÆ+ì½¾ÐhüÞ;W4QÌÓJÜn�0·²Ó¤žÚ¢§[ÙXÐs:ÖT�Ea5,ç$bw H´ø®H-´2ÛD=_ê–'–¿ qç2Wç@‡YH¤™7޼pצ- FÿÈަЭ]ÄûMªkõ�‘‚M|ñD/Ì~ û‡¼ò1·”,†ºé~ó » á(ÀGr¸f‰ƒoÕÔÀVCè“9lj�¹ýb2ˆeè:× Þ!›èÄA F 1³âÍ9±Õ8mS;ZüƒgÌ*•ÜXs8òàå<æÌ±C%ÇV¦Gq,vAã I¿ ‚|ÔÁŽ-V�ª¢AëƒlÐó„aji[Ò•‹[Åq*±}¹ 2¤?&†xL�;̓Rï³a�zo€ìŘˆ~8½QA å‰PLÛ°�îsþ”M’£·u¬ý0—/¶î޹:C‚û‰—è,R6ò\™¢ u–ùPÚLâ5ÀÂ�ç\šùfO¦Öºyïœ W–þ0ÄÝç§‘Í^\¨8M¹�®äQ#)1W™L¿ÜÊÙ““ڭȧõ”ɰYXp-Úq¦½à†|GL9úpH¾°°Ýw‹Žó›á|±Üsì k1ðêÎ]ï¢éŽ.Æçˆ=g²OŒç¢èŠÌ/b¿Þ³«þ›Èÿ/‡ûŒX³á?cÏñD‘n)yÑkÊîÇCàžÏLLuïYYÈ_0uÁ^Õc ±Úbçx^3ÜÝC€-Ï ÑRñj)ÂòNt·�<*¾-ËôޱIÉ@´ð‡W"/ªâ�ÖjŒ­¬YP€>×@?tuÄþ'h$8A«; ÜýáŠû± Ä�ÂJÔ¥v÷i+d0AÞ‚>-¤$ñ>ÿË1¸Ê�àz\Å/Z/d®i�òq‰xwz7eD‚Ï”(§ý&btÛw»Ó­Ñ(&4ªJº*Ú�£ã¾h;…ËYkò± Ì7Y8Kq+êMÛ ´ò/#AôÞB Ž ”ÆÍŠ”CÙ÷±™GcAAô9l¦iÎNuÊm•§I¿1a±L+h�ý�tÉiñOÔ5Û±áÞCŒ÷Ã,‘EºL' DkÒ³ŽJâP“ÆDá-”½ÇÆBe›ä·è¯;=ÐÖ]ä;ü*¾®¢«fCŒ)OGØ {˜¸Ð�YÀÅ#.KrbXŸ7a½¥PÜGÛìž(Q—3M&¦c-Ì1ï8ÁZ…Ì E†"}‘vA(p§ÿ§#d B‰Ée=ù½j6r¼%s®í‰“ºêŠe€„ˆ” ä¬BcëŠÈR­H¶\™w5X‹'†¬z@`÷«)ïõ ©ò=/¡!ˆè�:�TEÛðM FDj‘ ˆlÀÔ1N\im¼œB“‰ôÉLz"T!£šp8è89¢EçÍ5>ŠˆÏ8±3 ù0ÞYS¡Àв{Ƶ ýT@µ¤rÄ)¡×çмù ”-‚ñJ% bHE.×÷gyhp赸QÛ±&µä.ˆ”X€ÄÊ\³y¯N\äÄH=ÓÒãQYÇ ¢×¤¸îO\�Ÿ”†㪀I[¥ “åO£1Dz óÑP¢ÊiQš�íµÆƒ©¦›Ú>êGD5ó5Š'c0_âŠIãâåÎÕ“‡{Áö2>àÚËáC ç" œò‹uX†ï-1‰«# „…F™ƒ”s=&ªbL‚Š(W¢€ovùìOáÔÇq‚²OѤ–DCö�ÐD¹ùì�akA³òç‹O™„ zaLY-�ƒ,±ÑÙœ™°¢]Ý…iÈ^Ì>Ü#NŸE�t;w·šé¥Š+ÏB–©¡Ü:ç˜@AŒù‰ h  h‡ê8}‹†ŽtÀM˜)„H‰b˜ ì@±ø¨˜H”qÄrDEc€�ÌzNš[)Q`!�åœÎic|„'DŒ²n3œšÑ¡i4&64â+vQ«6ÈR³vL“æš 7]“§V8‘£2Lq„ˆØqèÜ�œfrJ4ê&I}l^\´h•×ÄbûÇa˜Þ0pƒM÷Á ”í¶–glGY#ÛÜCÈ�Ù¥FGž…bî=òa�9ð�ÀGšÛ“fs1û)8I†£9Ú°‰—Íxjû¶~å”–‡cTJ\³¥Äz‡ñÂlS˜ögºŒ~Ô]jÍ×cÛˆ6sÇØ‰2O�°‹Z\ŒuôyB á†Þ0þ4pShlÜÇ‚”¨ÂßHmv¡ÞYïçûvN^ aʉùÿ~~àá{!”w¼…:�úß2dì\‰X‰îÞC .�Šýåms:„"U^yW[zñÅ,ÿŠsudIQ·ss‹ù?zÝŸ)RþÀQ¼0)˜Q‘™{ÖŽW…V8Và!Ž�+cg„'�ZˆQ)eVÍÍþùHçùû‰1>Úˆ’È€hÃt@ïÿRÔ‡¶]@hhv›.ŠT$—…Ô4ÉA*ƒ#NÃ… ñ.ÌŒQ¤,ä¡U´äA©£<êS‚¥]P$@Ÿð–'EÍÇù¿ü®Ca›Ì«k6\îAãâûÅP0�†q cäÜ‹«SìëhþX~)5\D(ÑÇœ 5*0I˰F4kkœ ²ón#£fÔŽ~Fal”B/‰fRTœà˜Î­‚EÚÈp ŠÌÔçr¡´Â’³)�XlAÿûN˜üs‹ŠÑ­q3 ò0´á‰ÑvE¢\¡pa1–¯â @.›ù¢+ï·å#ÏH%ÉêÐ})¹Îª�€!öv(‘„½¨M&„èå}öÐ8ifB½íó÷÷ƒŽ#J¶’Þ0Æ…dÞL69JL ´-"šÏ/L~‹{Α²T3iœâÀkJ¸+ _¢YU ý¯„Ñ3‰ˆ ‚³ýÃ%F-ʸ¾+ üäì•£mŒk¡ñaš•Xãùê�dFžO ?î‡0‡ï‚3WSà «JqRèŽ|pŽ8'4æàÁžIÂÜ£x9rpÆÉ˜Œ ˆñvÇB÷p Üö\v¼CóÑ�áÌ‘­3]EòE=ÄÈ•¯O n¾ Àê¾¥±ç¸¢æsßÄ4«™í ·û3S¢‹2Æv#ióHŽ)£ ÚDQù,gë(3"Zô1%Q¼¨¥äv K‘­G8!BévT¥Dù‰�ðœÏ‘Œ\qî«È‘�o”ÆgâRÎn¢@…¦F�Ÿþ¡<ªíª¶¥�ã #<Çy®¬Î|‰9F?ypˆÃñRåÝ`ÆÝ�(Ök§¾sÃ8®Ò`‡)¦íH“!4—¶ˆ@ôÚÚ¢I,GfÎFÁ­g/ˆÚ<"rÝ·ÆÄ¼KWˆÅ‚¼úc{ò§bΘ0w«5³  ìËvù¤÷нs¥Ö ôå@9öx£~e˽­� û¿À.`\  ¬V¨T`Á)¯ZëÀ.¾™BŠMù-�h·ØZC\`ÎsË ZxRž•¢7µq=$÷f™ wo:äÒ‰N -Â�ª ÝÓ-[Šù�MQŽãð/ö¾!‰ùKE#OxÅëÖAÖ�Ñ1Œ=×{I¿£˜k�úï)ó< 3pÜ{ì ¯$¥ƒù�Ø^ ®Æ¢Uæw0zÚ*йbK¶Œ šÏ^¥»ÁK›õc¥œ‰Edp$Zmœ–£ÀˆŸ…â[GZ{öbKâ0‹l­½p…!Ð�4j•1óV r„È„VYªåÖœ­±‘´ñœvi0'£y‹ñ‡FÚ¨¤0.ahÖ*¦êLh¹^ ¦hXXEëT ÏKuÉ•¹—z…âˆ0¢€lùçb‘;*ì bRL¨#× ey·'‚M¥ü$e5 F)pK ¯ŽdzÃ$f’Œw…�PU.aåœ.ñÓ{°Ñ¿îìzy\ú4· •+"Ã’ s¶h(v"Öñ9=d1 ��8ÅG�€µyN4qR‡�Ö£#âÔ¨f–Í\($µ+J:'9 ÁÚÁÖâÍ{h&rÜtdЩD®OA76>7Ö IDAT½MNp¢ Ê0÷dS�=)áT[CÊ›Ç <àd"#&«ëûÕìÇ´E+¥¾~ö;ƒ*Zñâm]pü¸ê/�±üç/œ]]_ቹµ}rnÜC�p÷Ø×Î^âa$MõåÓ—M¶ÿ¿Ÿ9¿µ«@© (J÷|Þâ½ Y:çjÚ¨ {„à�Ú¡‚1dö z0~ƒM‘Q…�á¿^¿Ñ,Ü á¬K‹ïEtÞeùaúÃ8Œ;A×iëµâÎG¨Q¿Z0 dÆŒ3´üaÑ–¶ÄƒôMŠ=]¨$%Š5EÑɰ'¡½³©Þ w„à˜A9J«‘,¤{•²PŠ5dã;n¹ŽÎ©E­Ýhi‡¢a"tÝæyR¾ÇÇ;´T&¼ Y˜U‰´S� @Œ–¥uGÙ'ZtP–CÚ. uHÄËø±ÓIrx¤óC4`¹óÆßmLTŒêh`Og³Úd·Šì åŒì0?1 !(ÞsJ#Ç,ˆŠì…¢6‘âX½[V‰ñµåÌÖ†poûEtÛ}¢5φ†˜‹~I?Þ8çü¢vË� í¾o°&˜v_,¤�½Qƒ­�:”Kãç‘Ü:[úT$½´Àa•yœÂ®-€"I £È Æ_'A©cÇÔüñ‹/¦v¬Ø:²¸°gêð}tå@kÉ ºî³=‰Ò‹g®ÿÕ5¯$!ä9´†¿¿3ëçÿ<;´otáoª€³ŽÚò£ËÞwÃPÝÿÆ)÷¾~rÄ@$‚ât÷¬q;÷6öíÌàrÜØš¡Íí]i)SÓùYG}ö§[^pøò�\.ø¯§/˜¿b:SYõµ3>øÏ ßô ‹hûåËg<´t �z¯,kÑϼØû‚éŸ~ûü·¿ùØ¥“‡Ô¥\è2’Ø�÷}‹gðD“÷ÇλŸšÓø(4FþU”¨!Û¿Õ†⨣�ž/¬°Ã¥Ê¸ ÚŠÈlÑx6Á€°7pXåS‚RûmÓ æQ•½£–Û˜|¯¶ v¤ÁVwœ‘0KÚã,|Y…�?{Iùyïõ9àÀ9€}'¹uˆ x ´be‡ßÔ°niÓ¸Âmô€cOóGIÇ£ žq¬f‹)»["j!Ì@�òµ ÙÙBF‘]Xì +`¶ŒWÜXd]¤2ò¡ ¯AI¸²4°© A¾Ã+ë^G¥4#­ó™¾¸®I3”[ÆþkoikÝNžì+›.XÇâ³oeåÍV#Ýp*�²G‹^´Î�FIY(± “†ÚAþ�Ùtç.9“ˆ8*`'Yleøµ' EÏ® ǂ͠ŸÆÉ 7O~ÎㄈƒøÓ±É(°¶ é§84DñÓ4§‹`9- ž™@R,üdâ¤oþ÷Ô{zÕ++¶ŒÔ¯åÛÿ¸TAnÎøê~eQ¹)#ö]0}£i‚A�Ý�åWßwS&<þõ'ž|oæ“ïϸþ¤Õמ¸òÆ?ÞГM<úÕ§€\h¸í´¿±‰ßZÃï;î›?Ô&­ýÇמ|xéì‡Þœ�²!}WA1´vÜ€úqƒ¬Ý9ôøq;ë[J÷5–ΙXÝÖ•ž6joNtv§ÖTëÎDïSŸîüÃçÎK”Ùãc J »¾8wŧ{,Z;iõŽáè]( é¦öâGß>®¥³ˆK¬¢´ý–SVÄùQ²yURØÝÚU0ap]GWº©½PŽ·@WWVÄW?Blê[4-b’}™î�´’emÛÉ §ÄÔtÀë3Þ¯yQi Ø8µõÓD,W´öÊNÑæ‡6Њý”Xèi8…}ËgÃüÐhÅC~Tƒo¿ç:^0ol+"ÖQÀf]¶;þ†r:·_@`râ¼Eㆫ7ÈוâuPÀð«é�=²nõÁ¸rL]PCŒ&y|ƒRü°abr @‡YRÜQúR•v$c"� Zˆ2 ò@Ë$v1CðŠÎ9�øÉM¡'"ËÑD*ûæcîg|�8‹•ŒµJί–©<‡rò‚_Ð4òÑôÕ´|¸J°o(ˆš­Â ‹D –Tig6}¥Øp“«Ê§A–´¼%¢�%1ž5rˆB˜û&’è ¼ü–‹â ° DÌÏí•w¢…]Y ÒÞgáßµ¨kÉŠ|F¨Ì àÑÔ5ªATšgÈ»°wtRkHáÄ!û&Û×§ ;°¼µ¢¸ã˜Q5Ûë*ßÛ<–úoë.8Ú&ŽðVÑôáÏî�ÎÿçªWÿçªW£ó•¿ømÔï';‡rŠÞÚ8¾¾µôâ™ëGU5<´dΖ}¦�ÚSZÐu츚‚T6ª“'o×!Ô4ô«®¯ ®‹S=?¼ô�ãÆÖÀíg½ûYï/X=å©÷g1lYQ×ÌÛžŽ:­k)½æ¾·×VFõv7ô}fÙ1@�D@UiÛå³ÖmÜ5øée35MѬ)@kwÁü�¦ío*= á˜Q»–nߨ^¥Ñ€vî°L‘VœœK)§�UňÏáX •nPp„ä¸uã /ò�TxS‰b<‘µ©èŠb>RI@Ãåá �·"sfÑQJ¤x ö& ÎJ°|Y»áH¨Æ'ƒ]¡±× ¼ðG7ÌH‰ÅfDø_±@m°ƒ!Í#NŒ‹waN\Í5_°qjRrmljeëÊÖ€óµ‡_Óqáʵ¯¾1‚Ro�@ Ò¼Et…-ÃŽ5;瘙£ç1˜7ë>\dûp„ 4‚Ek‚AÓŽ²»[ ÞŽÜϱš»vw”%.$õ†ÒZ ½gYðàHĈº¾” ìD“K™¯ ò¯²sÿ¼‡G¢$Rú(Sƒ:'ª¸ãtEÀó¾ÇJJôÏ؉®ãÚ5ŠÇŠÂSx°ñ& }‹»~wÓK×À¸�õ0g|õ÷žºèŸ+ŽÊË@:™Û°kð�\Os¹“'o¿ì¸u¿xéÌÚæR¤\5w$‚0›3_IÚV[µ½®êˆá{ûu¾¶ö€ð±;ž< Wg~xé"CõÇÅ'ßûê);fS›†ßþë´ûžú7×-()ì¾röÚÏkûßüà5�}@ëó¦oºó’ÅÙlÀE¹cÇìPÖJÜè=�}×ì&S ´ÝL§l8nÌÎï\ðÖ†]CÛ‹m-D3 ¬ãŒ©[ëšûì8Ð/“MÞzÚòIƒëöm=zÄ^7ðÀ wÀ¾¦²+SMw…Ó;eü pñ±ï8ç½—œ°bÛÈÓŽØò_-éèN½¸j*Ð67!´CY-�†‰hì#=bÀÿbQ΢=Çpg�zÞ#Ή±€ ¨‡ÜçsÀ�ñØŸé CRïœáphŸ’¨¢údöÞzæŒ èÂ×¾›k’!¼#±œc-J8sY‰®4›f+îH¹$†�—˜‘·qÀf.=¬èM¤'$äƒ;v¬þ– VÒ�»k¢P�Ö:Ìð/ÅsÎ8ÿ…%°à¨Ðq~\²ìDq)S ù@.e&|0`æú.þð÷*h©(¥6,{!ÓŒ¶/Üú@ÊJC`«Ì¶ rM�µÏ¬©èác2ØàJè¥é¯íKPrΑ�ç¡©Œ“„˜êR"¢aê×>¶‘Q!Z*"½õÑšž6‰M¬QÈ�ã ;áËÖ1e¨swB[Ù©Dòõ ˆý¸N�¼ê³8ß <�m>kÒ�Müè¹sOŸºeoCù¾¦¾s�ØœPáñãwT•uDæ6eø>¥B¾!eìÀú'n²_i»ÓÅoox‰ÿÜu°üÊßß¼¿©”øâ¨)"é¯�òÀâN=b[]KéÎÿøÚ“vù‹= b%sì˜]©dî×/ŸÞØ^5™Jdµ†L.Aè4$r_=ë½S'oç$-X=åãê¡Ø½¡2úr’ �NfsaÐ�MÄ��å-a¨š:ŠJ »WluëÜk›KOýÙZKýÊSÛöWÝùìrþÀüt\«EéÌE3>yqÕÔ¿½s\R…WÏ^“Jä.™õÉë'wv§€¡$ÓÆKàä¹~„Û,Šó4ƒ“E2­.úŽÕRç0·"°hÌݴÁ wûBŽT¦—#á©KâÏyl ±‚ /jÞ¦¶ îHYœçÓ¤Ûuá‡2è=14kÛ©²ãг-'z[¸Jfî™>ù€9üÅÝãk¹rì´Û‘ Ìj€Âº8Ö ‚V t:Œ¾àêG‘¨u&Mo˜"ð¥:¾Ï6ÍΔ3u}êÜ¢s­­Â€ý|�Õ­ßãqnâ$_�5{#kÇÊŠ)7“FÞõË2X‰ibP»Å,D5!Е/KÖ/3…ù¹_Û¶Dß”— 3„j�ok p»C"ªÐu ê¶”³9{³WJ¼=�K�MÙ|†;'PÑPRSÒ¶M!”Â=ž8,Â4Ln £¯u’•Næra"š|@a:ó�sß›=¡š h-Qä6í8ãÎï *o=nlM Â Ð7œ´RkxâýcÃP@6 VnQÛTjAâæÁª(�ùÊ|´}ÄCKOˆ(Ó†5ŒHæCíŽú~|6¶²´íÆ“W=ñþÌ0„ÂT.“Mæ4¾™ÔˆRÀS̸ëÙóµVédî�/>Gc@„)g+#Ë÷è²¢îΞè©.zmO5bßÞÆÒ¦Žâ¡M¯¬9âô#·¬Ù1l×Áò¢tx9�qïÜë[Ü9´¢å‰w�Õ!œ~ôÖ9ªÿú©—Íú¤_qÇžî2ÅCzlp7ÆY^'qšQPÀ×F]'öâ>|ÂóÑ‘ÿ”aº^n5ˆ™URÝ� ÏŸåòd w¥i/ø&Þ&+”fÁ‚ek¢”³;ôŽfX$ªØ•ÄdJxŒ”š „b žøIãíš#Ïu>i×§ ?@€æÝ:£Z ÇZ†o…O¯Ù/¸2C¶vÇfÜ1®^±¾HïY–BëP€Âmb…ÈpÒ”8£õÎƨ‚�o’°’·y@㬭°„Ø�èÂ+ÐÑ£Éd`‘z(/²rë’xEyœ*VÞb&n‡V[@HÆ4ï½ÈA“@ü‰JîþŒ:EÐat�ÅÁ¤œ^ fË£<Ì[²; °Œ€P(i6H¾ßGÊg|h䫽o�«ºfçÄ—“Ès·jYµ$G§œNÁ‘cv�å‡LwÞè'#Q F hlj+lëLƒV¤T�¿wì�Ÿ;Wk8cê–Ÿ]ùºP*Ð Å9lßÿ\õê'5ƒÛ» êZJàì£?€Ò®#‡ïÿæ?.1k(²_e…i­SJ)¥CkÌJÁw.|ë;¾•[°zÊ} O¼áÄÕwœóÞ¶ÚÊe›G¦3ÝÙD.ç<éËrrB:Ö iIHÎÖä@EI{sGAW„3\»P  tªe[Æ ©h€] åßøû¥m]…Ù0�ç³ ZHÁ¿ß§ 'Pº¹³ppyËíg¿ûø»Ç®Þ1ôòYkûö8šëè1ý$…²�Y&òbUÛqž± ‡ Ä3ÿ.Èèå@Ï,\ÌA† Íî0Àâ½zµüÈt„ £ý yÙ5ýä×iRŽ­jmñŠðE±S.¶`,¶kD,GÿÐnsë(I&Vtäïó † %0³P´.l¥&w:9Mr  YcîÃ�ÖÑbŦ/S)ÌB"zªLøDÞ’Œë*�+vî ­Íg¬#Äé­©;Ó8Ï[8Dœ0[ª¥°ìTËf¡í)Vvh‚^Ò ù ¬½Bz¬ø¦Á¶+$Ùfø(iÁ 6QØLÞ¡Ýdz˜·—˜Ã±L;à™ g.…@Ä|À�žn?È�ó~0p²n P´v)UrÔ�Áˆu8 jMDÜWõîY~Ø]�}`„{ÇÈѹFµÈ… T,THI8.Õç�ÍK$( ɨv:™=oÚÆ>{~ rw]º¸¢OçK«¦òö7ïxï«§Ô5—jWra�Í)y……(!«  Ð3±|Rý6êCîhþòi/­šªÜvú²èÎüåÓfOØñŸ,ýÒÞ«úôtö$3¹Àµ|Æ®?Í¿ ø�›(¥R‰Ü¨ª†¢‚ìÓ7.X=ÅrÁ( Cõà’”‚».Y:T�mÅ/|ûÑ¡ýš£Ç�­¹ö„ÕðúºI_ôòL˜ Wï ÓüµÒ©ìWÎü`_cßçV=zÀAs캂Hïk¦¡LµµT`Æ xKi\äÊɇ$¯*[†÷÷=DüÓ–$kÆæ¢–Q‡¿¬J„zjX–óSÉ÷d°�Ñ-×ìJ¶‡ÉžÝ+žåÛd¯Ü"ˆ‰Nì{ $l+œ•CyÅeA­ J¢\áh¬Ä8‰Î¸ðñ¢]•âøAóA4cœ a‚$*¢Öø%eƒ¦´¥\Ûa %cI®Œ YZ³Ae¦�¢ô�„=ç|°')¤Ÿåû!¬,Yhi.¹^% b„µ(Èó èÒ°+¹*xEŒ‚âe´�$¤F:2ùÿZ»ö`;«ê¾Ö9ç&7¹á&!�ZBPy©ÆWa¨ÆZЍ¥ÎT«­SµÖ´íÐj8Ngúît:ÓªX+öaËK*uè@y)‘±H!–b “ Inîͽç¬þ±÷Zë·öÞß½�ö›pùÎwöc=kíõíï;L,4"Ëù<ßÌhe® ø…‚C›÷ò–uУC–õG®®d†¤ëc×æÐš^«Eá ±#c cŽRÒÝ…KjYp5S¢6Ûyœð =x%†ŽT´Ú•~[ÇÙŒÁ§é‹áˆÿéö·Þ²éÄÙQÿ®Í¯úòÇ® @O´m÷òm»O,èàÓ³ƒo¾ßãw¿ñÁEƒ9"šš»ì泿ôëWÿâ™ßŸ?4}hl(Ê9¤ÕkW?wÁú‡EhЮY±ËΕêÛIZZ ñB–“|ÌòNóé‹nª¼E×Ple¦÷¼å�¾í¾“ŽÝ9=;¶kß²[:ñþÃÄGN\5qð‰]«õŦžXy"!~ø©5uý†M[�ù•ŸúÞþ™ñ™Ù1\¬¤ÑÎ:iKzÜ#[v®t�ƒ„l!¹æÞ×ßüÐI»_XòÑŸ~`¬?üö£§\°þa"zê¹É|îÓ³c¯yÅŽGŸY3J³XΡ³N»ý‘W“Œ–-9ô¾3ïßöìÊ8D‡–it.í™ZºõÙ•®ÿÁŸ|ýœGžz³¼ù„m;÷.Û3µÄ ÑײdlÙã1;=†˜·mÁÄ¢ëÁÌzÐk¤¯AuÑH'ýD“hE”{TÛ3–aˆ¹)#¦D•G>°Ô›}Å3ƒ% {KYVSœˆ¬<ÉŽ‘šÄ°j!óPl†/{A~ó£˜|˜âãü�Ô À`úbšcg±ý;žjø]X¢bu•¸AƒÔAˆÍøšªò›� …ûÅZÜg""-r@R`³›2Bö€‹ûÉK2•uÌT(ÃOeЙø '‡±j� 4(!á÷ð²Ya ¼éŽH¦tÏKàåõÚOÛ„@¨Œ{(î}ió³+¬úö#³Øâ%\"©êåÆVoÁœ ›x—˜[´Òˆ"OoÎh¢]¼ä2Bµ5¸[!9~j¾Šø£ t³ª×»g¬h^L,s4‘¼±—= ·×ÅUD2ˆd$ÍSÅ:¯™Ê˜DiÛÕ¡¹Þï]qÁÝ?<�ˆŽŸþ‹_¾ˆˆhÐ]ú 7oÙ¹êon|›)ѳû'~õ²÷=¶ã(×k�Ûñ÷½: €˜·zòÀî}ÿpÕ…·l:é…ƒ‹ûýÑ�~¼ú…™E¿tÖ÷gf+'¦Þû“÷ÿáµçîØ³\PåŠL®®^Ãaï«÷ž>6­ž<ðü�%sþKGÉ¿òîõ—^½Q„�B0�÷&q>»oâ¹ýç¼nóG6|÷Ê{ÞðÄΕ©õì\ÿv¬>fžÏèÚ?¿þ�ߨtŠKÖ¹mzU¤E=:�l‘if¶ÿµû^ÆÚ§æ^sÜö7­{ê½gþ×_߸ajz¨¸ÈóPá5L‰¦!„q ûûçÚÃj,0ÍF”*<Ô^øÿw ©èÙb—Èâ} ¡°Ög~ €2Ö’1úøícl�fG8P,·]&åë«ÂÝ�ÐMO<�Ìs+Èå…h­TQdϸïH%xÓWU•5“¶—k˜ÐÂd¦g’ô!ðmž³0gC3�0œ£A�Ö"¼FÂ#�nMɪnŠ•½­ÔËFü˰qáÕÎ÷µšœªC7-’‘™í: ¸Ð \Øt:Œ&–µ¥>[£?x‘Kè½@‚B•dL¾ÃÓ[„�a+tüÞy'Ž`…m4a$ �Ù0E)ΰk¨Dª¿åQC{‡¸µ+¶ÇûWu³Žñ}Ynîï•Ç,“l2Iu˜›ªhi$ï¹6x4؉TE à œ¨©H0›QþU‹¥‹M.™’#ÆÁ¶‰,…A´lñ¡ñAcWãªe¾þÉË+]Hí@$ô…›ÏúÂÍgÙ…á°÷ÌóGüæyßÚ¸þÑ?¾îgú,_xëÛNyüÒkηq&ôb¨Èˆ(ƒÐÊ¥Ö®~þÁ'�ÍKQ‘„ƒÓsƒÏÝtöÁCc†î*¸›ß²­µ«ŸÿÈ;î}Ï[øöæW~éÖ·¼ýÔljÒÚ‰‰dõäþ^�vï›f¥�p•�›yB�:Ú$ß´é¤åK¦?òŽïüÎÆÛ¶ïYþw·œuÝ}§Q²lؽ®+Î|“5œr²Å¶¡K1Z !X(kº$Çeê!åûä å"]-Ê«€ó&ì:¨Q `.ùÞu»gQLm›1•‘BÔ^σüÃ×(Ù#8(WO»øŒÊVFOŒâD’ŸäÌŠŠÕzš¹E)U])ÛÏIäl;bT®ÉÌ2…9‘^�‰µª!C[u |™_ý©Ô¬BÄ‚�gž6�6R •bsÑÖ^Ù«/‹zUÖ¢¬‹]–QÇj¾Ž�y½šÌÉ}œÜ­-«5Ø±Ú pgöV9T•�éǼ&ŽcTCõ‚Jtz2NTt¾[ÔC®PŠ¡kç‡ÆZ) �w[Z)Hû0¡ Çò ^çª Gi+П’µ;°™ò.–ü‘¥ž­ˆä� “ЙsÅÕ©š·”U~ óýϱ�|æ=7ÙÕá°77êOÏŽ½rÍ®w�þ¨M.�9aÍîÿüþ)Vü_4®X:µrbjÏÔø%_ùù-;W!Ã'ûã¿üÀõ+&®Y¾oÏÁ¥3‡Ê·X Ѻ£ŸûÐÛ¿»qýÌ,úÝÝøÍ‡N =´õeöþÿøÊÅW|êŠ ïÞ¼Î"°]wßi7ÜŸwbîØ{„Hï¨ÉýŸ¾èæåK§VLÌ=¹ïÞÇÖ*{ZÑ÷?Î�™ˆ�šÜwþ�ôû£¥‹æV,=83;H;÷ÙBôæžüäÏÝvÆñO˜Yü…ož}ùío�š<±ëÈ%csw|泤†zßãÇ=¶ý(W¹O[»ý³üڑ˦ŒYÛ:ö.ýêyWݳ4—êêÕ§,熽«îyÃUwŸ¡0ÍñÛçÞ”ä`õêBòéZ™<´< M5£¿Å)"4ÉÀN:ëÊÔ]pÝ[×^Ê�tx@qpÁ?��4‚� 5ßÀUšã@[QÞpèW(na—‡]Ú¶!n¾’†a{‹ˆ°Â�”äe4¿•ižR4£º™ÊN:û!)Œ’”R…ö–/f§taM£Ùô€«Þ¾1»gbm €X±HL™‡-Óíb(uMÍTƒ³�×ÙŒêjžØw5¦,ÕdSÒ #�¼Ò€õžF73Š(1CSÅ)~Dyj1Òg«ó•VänKA0©ªÈ;�²"¸ñ­’wLAf¶`(ü[Õ´æ9˜4î6L³›¬ÃxÌ$Ð̃­$郅0"ÿ­ùÂN$Ζ›Ä;nèð‚QyZ,BÛ6ù»È<»E«{Ë …ÞpÞ÷ö~ø·ú÷ËoÈ�¨~EIDAT=óŽGN âeã3—l¼ã¶‡O\¹tê.úæÑ“ûz=™õïÚ¼îSÿrá®}ËÒï|ÝcŸÿ𵋠üJÙܰ÷[ÿ|Ñ ÷ŸᄉdÅÄÔoo¼ýG;�ºî»§í™7öW1õ‰w}ëßî=ã¡­/K;™äÂõ>¹{å}�¯eÏPyоÿ¬ûOý‰g ÇnøUw<òêшMÜb—�Ï|ùcW½é„mÓ³ƒGŸ^óûWoüïgÖ¨H˜HVNLýƹwnÙyä œúì¾e¦¶—¹çäcw.ê‰hêÐØ¦­Çì=0 ŠåãçÜõÚãžù£ë~öÔ—o_<†’a³¡MO¾bÛîåJWÖ¥î+P†нÜ�®Æ¥¤_$ Ù¹’¡'bwç°À ‡¢–$× ¤$Р¸þÊÂý|IFs¸ùš�1Ǥ½%-†Œ-êúª|ô4,8´ tL£æ1âr!GÿF4®dcÆS&±fa ôÿf£«¶!^ (ÅÕ u)9ÅÌ!Öd0T3ÉØRè@äl-Ë8"(yU êo«(du”yò#¸ÓÄò·»ŽbBà+?Ds÷+Õ€�Áú‹„Œˆ \×öwëˆãÿß�%‰jùÇ6åœ]X± ¦"9åSÝ5¢JÞ*L=ËÃ�ܼéE‚üœ´Õ„ùº^C �’[C…BwðÑÝÁÀä§å.µæWÂÎûâ–[ãk~ )•§Ò^äÁ¢?ƒY¤lFEd-‡€˜Š(5�æòPNŠîLåh‡Å—ò‚Zw2l‰¬ ˾xâ¤çÁ½Ì*š9‡ )ödf”‹Xã åÝ”¢`O‘§.î ·šwCe}ˆF�…,«Ù¦@ê†QÅ�ÞùÅ“áðˆi±h«Â\pûZ�…@®#ôD_Qº2š‚£iøq«P; #’ô·–ujªaÖÈ:Új�ÚÇÚ±�¨¿8=àJ6n4ݸEƒ¢‰Äç~zÆõ�T­àç?ïê»ðQøðÝ•5®ÔBíÈ3B!LI…¿ÙŠ ÁB§è™»ÄR�]) �ZéÆ2UfPð9íº -2:î¤�f ǯç LhÈ7DãÆW%—ƒ,€°­�á:À ?O¤Ïý6š:ðm#:rQ£ èDDéå©:>ë?ÉS üÕ¾Äé_‡ªæ‹èJ€…=^/*¤[€âàÆ�ä±M²ÐPÿ§ÈkƒcÎo‘Ag Á¿áf£` Na Ò�é• 9³Jžs‘TS¢‚2LœŠˆ\HÁ½î­ˆ½Qèöh<ÕâJN€ûØÅx.j´JÆCSóU› ¢ÓáÃ#ú:A'DYG£Q­…ÕnîÁ÷ŽkÛ& ßVNY©†En'X²¬IK|÷Òo–É:3�$+ZË󭯥žÚ– Y·µB@´bB¤ëÁ.L= !32lÀluª#}YiŒÖÍ®¾@l‰¼[?�1²ˆI6j°d¨”€‘©-Ôd{N!ðÆaÊë@]I§•T*kžëŸØ1㥔Fœä"ìØk+t±*Å¢t> ‘Ö?RIq”EH Àt”Ì … ÑÈÆµ¡ÜšSûàûF)Æä‹ÉT�í¡ .±`..2»â5RÆ�¸d6‰”TÅ­!QážD�œÚõÆ« Ê*ßü_*îks!¢ÑP �04:�x£°ÑXEшšB¶r˜?|fpÃéüÄì´@NlÃó1•(´\ŠMžDe$VEé5SxìG°EÉ›p“ì|ÞY%Ê8à×­t•¥#4}_Úä+ ×_�Gýu¡ƒ.‰DOq\­ƒ„ :‚D½‚"kŠ,‘ÂHDŠ ¤ ‰ã…îdIFÔþ/P]8tz=YKÓ³Aö¢Ë¨<ØÍ¬úåßêл€ÃÍŽ„Ùò�–JMƒ`H¤cDÑI„©Ñ¤ �ˆ£º¿Ìû±y0‡q€øYL”GH´|× �Ë!#5ñ“ØßË� £^¯ríê M*°¯j(X=Ü0œL¸‘c¬Æòº#??‰ÿ»i¶¯ŽsÜ©ï�!£9‚òŠXFú©Æ —±¼Ð»çèÎd5QË+>äʪ³%l˜ªõYµtvFM@«¶Ô§éHNùm -¶4t´ó\Í[ˆÈp.ÅZò„ÐàÕiK¼R„Rï.Æzû©<¢”¢©¢ø‹«äCu|E2ÖK98º„‡a–c{©®°f!)u £yvïqÊ&(XÌ•·˜í†s´\ó1Ôz CùsË«Y'%? 74 _ê�°\Œ…€hqĦŒå¶ãȘvHÍ:‘ýâeèÈÛ:°9ÿl‚f*�^9�°Ïi*ö$}ÃVWb¦æó" çz4=ð°Úè ]³Vkzé�åd¨2Ù²,OjýfÏÞ0V!€fœfÁ€:¿(Ü{t:ÇüÚ°ýÚÌRc:W¢g"9‹…*cR»ô¾.¢‚m+Ó !b7(Ën^è.⦞zõBgroñm!qÞÞÕVÖ­ñ·ÍLí£8‹ëbh\qƒÍ̃±@ú”0xY‚mêw¨i-ù´5‘îZHãeß@pV§E&ˆ4À+‚ež si+ꌉhÆø)ëGO–딂b¡È’•¼(UíÛ°:4�æ@$7�«WÔs±Àszø­”ö‹RL×(ÜlnØX¤ã%9îõ ìT[½Ø•ë[5ÜRrÇCøy”$Ù˜”X1 Ì6¬ i�¯²‡âQ߈<èˆvãCôzÜgç©MpªpÊ‘�N2ZDÕª*Œ¿k8Üã �^Ž_OÞ��Ý$Äçòh_U�= û§÷ö•ùA&™Ã¢\  à�åÊo«MN)Ý,tÆLtõ ‹š>\‹!mÓôžY…î“Ãas„�|†É2Ø…¬ÏÛLHº{¥ÿ²®…Ú–Ñøc•l™HŒ§þñ#ÆPL Rc·*Ñ4‚c�੺FXÈ_ç ‚Ê³‹Œ�ËfÁpQ¼iˆ�£ñQ)5Æ|Kï6¿¯»1@`úZW{Œ iÐ4‚¼åÐ×0j§4\ŠÓ öÒ˜-þ|rµ ß+feP¤³Oé"˜²=~H^nf™åa¸Çò)ݨ Â0±£>ÛF±Ï*-}�'ÓÏ`Ã=_Ãz‚“øÈŠRSï){j]L4¢ÑP;‰Þ·)”Z,Ê)ÄH{«*f@K»î^an×åeó~ü‡íþ:�ÓGË<´ §‘SlΫF¤°‹<æ\Ã3¤ŒªÖ‚¡NÊ[UØó“dÈà>9ÉÀàì–¬0"¦y©ªŠ2FÇálÖ;F-Ìs¼ˆÓ㹿³Ë’²9Ù0À4c/ÅÏðôàÄ%˜GÅ„ l)N¤ìbzqŽÊ"�8C³ÞPcv×cù5ÀY&­ß¦îIEND®B`‚dtkcore-6.7.46/docs/src/dconfigfile_example2.jpg000066400000000000000000005764351522615770400215750ustar00rootroot00000000000000‰PNG  IHDRt”3§(‡ pHYsÄÄ•+ IDATxœÌ½w¼]U™7þ¬}z¹çÜ^rkz%�„@� "MÁ‚Šm,Ã(2£(*ˆú¢8–gÆ® bDZb”"!’ÐÒi7¹½ŸrOßûyÿØ«ìÒ«ïBtŠù©cÓǘq c`À´“=oÝç©ôßu¬þÙªÿOíc€(‹€1†ˆL°âý`¨õ"d‚Z×  é¦:‘—x¡¼Ä€é5<Ý© 4ÿ0Nš¤\‘Í@ëÌ«î¹N<0¦Ñ`šíO;ô¾� „´]EèrV�Ò À¸¸)ÏÌøKNhoŘâQ‰‰°ª³Ì€Ó :uæašÙÓD£È•¤Fž4K$¼×‘§CDW2üÄ•'Ó4#Y`²OEƒ&U?ö ‚i¡WuA!ó2¡›7!–~åüøœ{Ì“k�qÎ*Ê™²ýD產�·`4¥áv‹/í_ÿÿ9\·aÔ6Mb4|éíÝKèµ{‘�"r,slrÊ€�B³šÍ$Ô¢ÔAºE"ÿô�èRˆ ¤07à葼ªKÄŽ‘‹Ç_õÞ–„yG°¬0O´�}ݹfJ&¨¢´®%–а‹îdXá¤p-rŽ¥œL>‹"Ód<8J‘Ú�NcO �*-â"gjF,¡È/� �FFŸè,«Ä`TâtÑÔ¢Õ¸ÄS ‚).v.jKá‹‘ðÊÉ´ßn&ÂvjR4.Pq)‰I©Á ’Ì¥0®}3ô ³ø™4‰"CtÒ¿E‡RææpÂŘI¡tRU¬ÔYö=d‡G©4\-˜AVÉ) f¤üf�êó®x™7 e±\®.7ˆˆÆÞ5’+;õŒK¤è#FOyÝ…cYAù�4&Ÿh ™µrËáÔ¨(C‚\ä’$ ¨¸hZè\�N[Mê˜ú4˜£™„Š Ò„i B ýŽ½Æžo´ÔB:10«Oº üW€H!’ «ëb@ÿ©þÉ Ó"‰ÖóK"if—_½s;ôáYs}¸ÿ =¹‰ŸŒ$$7¢@7$]Òüt�Vþ"ÏU`=Ä«;/Ân„�… ÿ¡+Ia|uÚÍfÝ+Œ§° –ÄE¸aÀ˜J�(”K dJ†¥µ*B›»ìHaH‚ªêŸè¨mX*!Óä€�¢æ¯ê‚bAÌ9ÔiÁKJ�©"m|TˆÐ³*y0ÊU‡ÄMÐl"£ŽT�bx-™%áÍÐ ©ÅxV•¼€ÇS¼Œícn%®~‡ïÊ ²#Lé%Z=*F:‘ª˜K�†â“§€ÀÍÍÅ{&IÌ5Y�L[Òx hô>ì¨ÛušHýlCë =Õài…2£%õ)ʊ鸱‰Då猴=ÉìÁhkAY�&3!)YAw6êñ^ÖTeN•¦&ÿĔݖÔbˆ¨Ñ,pÔ=§î¦VVäˆ"”x<×"·2£!Ž©{ Jû–•´]K$˜ñúf$ÿ ‡"TËj ³—·$i¡ïœUêB€Ñ ·l74¡„Tº¶a`èëïøÍ­nùÏÇ7@bÈ”÷èCzLθìA7"‚š"©"`@‹¸*ÍÓVYAyÝ(…NU%²t̤£º%ç€�±ê‡×Ml]�O„�éRð'š~üB«[ýâ¾ìM§�ퟋ~ô±îL9àFL¹úÜ„½(Â((æðÅZ£ö�/8Ö«]³­÷©‰W“äGmcÔP–@s¡`B“͘’ßÉDO,s™:âÕëN™Øº 'õÃm.—ôeoÚ0z ûÈc 2•ó±¢(~‹”€œQíHWV!wwƫ׭�ØÚ¥ÈøÑ‹mŽÜG*8ríjqºüãó�1ÿðXÿ‹Ù‰›Œ|ٙĂ_i˜Ì¥Ë¥ŒYìc«Fß¹dÚ¥âÉÉÄŸè�¯Ôê�’1@\×\¼eóñLÅz÷£ 'K!!oTÕüÆàckÆÞ¹Ø3§ÓÌ�h?ò¼5ZýÁ9ÇÚ#µÚÞ»k:á?Œ) &mYLª¸,�´CGzìŒ×®]9~Ng.rfÊÁŸjþñ¡VW_ug?µnô@6vÓÝs倠]ƒaB¹±ê‡VMºÄ]Ô“ýԺљØõO.ÈT‚JPD)ØÞ[¨‚¢ RÛáQ(\Y– O‘‘@ÍV”’ô\~5@Žô'*k %é�î�°,öÑ5£_ÅZAó=; +Ë82Z2•ã EYd B‘èi—¼eÙYÄÓÍg¼ö=ÝË×2SýT´ù:°zçOžýðÓµ—@o”ë?,h9¯[ÿü]¹}ïÿeûM_ùÜìjÊ*ô!yƒq¨%-�ò—)¡X•‰±^QQ¦Ì…rxpªy&g¢Sy7ÔLõé§ÐK-c²  ÑbpÃú±ÝoÙq†V#ÙY'tyå››h"³H==Ñ�KJÞG`  ¯9eêµ 3ñ�s$É”'òQis Ê�ÑÚ¢T¹1ìð1åÚS¤ �1¸á´Ñ§¯ÜI–¬iŠdÐG—¢7¹¡„Ws%’-虳€Ý¸~ì™+÷_ÒŸ¡*{iX!>¤Û[ÉbxÍê©×.œ‹‡œÃ™H¦8ž�ʳ¨¡Ü­-j(5† wR‰>Puì“òaI:Å)ãLŠ8´ðšÕS¯˜‹‡œÃÙH¦8ž�jy©g§Ž'ðƒú?Æü*¨Ô˜Œ!Â=Ã�·½ØþülT�‚¾ú!–—]cåJhe¢_¿Õ,Ê©½& ®¹›¡´È¤emâ–£[¶ûÚ¿»¯  ¿@°‹w”JÕ7íùà‡¼$“dés†kð©+c°w.¶w.66\Õ8JØ�³nc©HAJ%Ì2"î™�î™�Ž+O«Ãtƪ[»rGs‘§¦Ê™´C_ö5eÍòùœ2²ŒÌ™�°/QA·½Ð~ûÁVž¿‰Öÿy¸ùh>2Zž˜ód?ÆœOÀˆý²Ã¤ò?ÿy¤ùè|x´æ"ÀÞÙèÞÙØh!°êÔ1!@C§ +ׯ Ñ`îéÖ+<—”Pv„+ð絈N¥¤«åaLD¶½s±½³ÑÑ…ÁUM£õua^ñ[Â0� �µV Š&MmV0hWʉ¦@ƒÑX­T4å#Õ�åŸýdÿ7XÿæÅ7Æ&¿ôxîDÅÚxÑŠ¯ž¶œêS;†¿·;ûBÖ‰¦ãg¯ïºfSC«+�:—œ¹©Oþtô©LmÞF¼û¹Mwë?{ùÏ_75¥¶¼sìâSößüû‹/:eÿ×ßq§eá]»×Låâ—®Ýû“Ç7*,ã€ÌUIÈ._ògk¢Ó\0€ÖáEÁ'7°RÔíØé˜¨­ÚéƒP•eƒ;6Žõ“ñu“Æ|äâ¯yåcAËq�}á® ¿¿m“{-®Ýúî_î<Ü××:³yé±d´ôÄá�ÏÿþUÇgš•Í(æ…oÓü\ž¶tæzÕ[Ÿoœ.gn⌂°(ÝÜ™¿jõô)-¥€…c…à�/6ýè…fDZâ!ç˧_»0³ Q�)ï>–úþ¾Ö\Õ:µ­ô�óŽ?>ß3»rélG¬z4ùÚsíÛ†’ɰóáuãgwÎ÷$«À‡×N|xíÄX!ôÎú†òÑÿØrâÒ¾¬Kí®©ÄûÿÚ“«\J§*ß0¶¡µ0Q }wo˦Îùó{ò×<ܳsR-¬�Ó•ïIToÝÓ8S º% ª×Ÿ6vfÇ|®øÃÑtÕ‘  )j¿oåÄE}¹–h-W ÎD~s¸ñ�ƒiÙ↲k_˦Žùó{ò×lëÝ5™�iÑ9�¹žDõ–=�Ó¥ð|7wä¯Z5½Vêׇš~üB‹�,Âw,›~íÀÜ‚Du¦¼ûXú{û[rÕÀ©­¥Û¶>>šx~&ö–¥3±êÑ\äkϵ?<Ü� Ù×­›8»#ï 꺵ã×­+„þîÁþ¡ùÈ—7½º/#uõýùjÐUߢTùÆõãZç9ñ�…ó»s×lëÝ9™hŒÔ®^9qQ¯bùÎ#ML;bÉ‹;\6 2N¿îEÆyÝù·-�^ÑTN‡k³åÀ_‡S·îm/ˆUVnåðúÞ¹×çª�vöG,çÊ…3o˜íNT²ÕÀ_GS·hŸ(E%Öªb..L–oX;¾¡y~¢úÞÁÖ3ÛçÏëÌ}`Gß®©¸–i�‰�ó¶E3—÷ÎuÅ«3åàO¤øbK®ÆÍÃAvi÷ÜëæÄ«{fâ_z¾ã@6ÊlíÈ¿eáôò4çkÛxê»ZÇŠ!2ý•N}…{vG¾;^½í@ÓLÙH–?ºfì̶ù\5p×ñÆš£‚>³à¬Öì{–MŸÒT X8^ Þy¬éŽC-6²DÐyÛâiEüqN¼»¦½}<±g.úæ…³Ñê±|äû;¶�$“!çÚÕã›Ûò=‰ªpíªñkW��Cïz¤¤ùÒC—ˆÉôî™Ä?>Ö›¯º·]`QCùúµãZ„xÛæÏëÊ}`{ß ™Èµ«'þk!ÇŒC 8o^8ýæ…sÜFR·h›(ÉÌÌŒš±ˆ…W.šzmµ¿}¢8³=ÿ•3‡£–ýùgüîXã™…¯ž1ÀŸYðÛÁÔy]óoY8½¼Q¨r,uÛ�Ö‰RøÚ•ã—÷ÏþéDÓëf�æÂ¿>Úüþð±'ú"A¼eóàöñij3ñ+MwÆjÏÏÆ¾ôl×�¹ˆÎšyD,çÊE3oZ8K(tùòÍžÕ¬Úe6(¿·ö,^~öÅ®+,9ã|·úšó_;;v|ÿ£÷ÚÕŠ’-m`‘·½ëԷص¿ÞµïæçŽÿGgë ïX¨ÎYa œ}�¾~Wàí—-ý|w0;<õÕ»¤´ôöW$"'¹”jþø»ÒÕZî·NŸ³âæÕAŒ”}fð‚ç®8üÜPתcëû‡.ûÊûÞqÎÎ�™‡ö-ÛºâÐîØ`ÛîÓF\ÏFjï¬:|hkà/¯Âd¾òª‡j›v·�Àæ™ê…°éÖðŸ/`ŸÓ3[ÒX~ß꩞†ÊM;ºÝ.îËžÕYØ>–¨4²å�¥O¬;<7�«²DÐ/†š¢N*T;’�LCÓe«X³€á#à ¶Ã–7–—¦K®Õ¹kÙ7Ÿ9rzk!_ Ì׬7L$Bv©fÑ¢ñ�}iv¶¸ÿDƒ»@šÙ7Ÿ1rFû|¡˜(…Þ¼d®!d—lË áï[9ñ®•3™R๙X:äœÒRxàDƒƒ¬!lß|æðé­E>Öz>ðœ“ÃDȹ´?;[<0Ô ÃÇ9]ó_>[ ª3V­:–�¶ðÆÓÆ®X<ã jqcù}«&{’•ÿóÄWÞ÷eÎêœß>ž¨¤Ùòté§�ž‹æjV" u8™,†fÊ—’GF’ŽÃ–7––¦KRc  !dö "(E2Y ÍTeÛBÆKÚ[ž*-I•ÅŒ5íO¯çâÍëâ 0|‰m¶<­w¨ˆ!)‹áÕË'ÿ~ÙÔT9xÿpj ¡ò†�ÙÎxõ£Oà ådÈ †ÎÕ+|[õ<5ÑðÓ›¯^1ù®¥Óûæbï_>™ ;¿;ÚüÇãi–pÍ×bKS¥7 Ì´G«×?Ùm±ÚÖ®ìL9pjK¡%RËU+K›ÚòOÏ&àž̆Ö““qÄÒé-óŸ>mäšÇ{3å ”šÆ)c&…IAáŽîB5 ¶mhÏhÈY�›>]nqn|hß¶»»–œ’hj=±÷©Îŧ :Cûv•‹y§V•ÒåMõI¤$‚P+GßôšÎ )$ š»sgiŹ«®Z¶Ú–u}rKî-�Lî8;±•Õ¿¶š,°Æ"ÑP{*¨ň»ò+`¯\0¾ãðÀYKŽnqáô|"*Ï—B3ó‰x¤ :7þ€|é€ /°{rÉàž•µ3vA²ù{ñ¨C�l�|œX3MÄ®Œ9«´j@Û¶ææcU×Ùd}Dxæx÷½Ï¯´mk<Óðè ‹/X}0-ÏâP爇ì9k茎cP²­§&âSÅ`W¬úÑÇ{*%ÎÁ)­ÅUÍÅ¿7 æ¢RH¾[a dáKf“Aûžã©›vtkÌ`ƒ•Í¥Wõær•à·õ윌¯i.ÝöŠã[̯i.U‘@ÙwvÜ},=�ªþà•ÇÚbÕþ†Òc£ÉOlœ[¶ž8½ÝþÑ�æ;5Ë�n8šþÃÑôå 3_Ü4ÂS!Æ`MKyUc9S ~`[Ï®©ø†ÖùomZ qmKqusñ¡áÔ±\Ø%~Usqus1Wµ®ý[ÄʦÒwÏ; :€`v$j aûDâæ§º³e–aÍaÀ`UsqUc%S þÓ#=»&ãÚ ß>w((¶É»zYÛêŽÕp,vM,dá‹]A¥oz²»Pc€e![ÙT|UO6W ~àÑÞ]“‰ÕÍ…Û¶ߺ ¿¦¹\Eà‚ÚÕy×`z ¡òÃó�µÅª}ÉÒc©ŸèN„ì[Î9qz»ýãZ~u¸IáŽ6þáhãåsÿ²i„ªlusÉÔ?=Ò»s*~zkáÛçžZ€Œa{¼ÊŸH~vgw¦Ì!ÇvÔ£<ÊÂÅr*È”ƒ7î莇ì[9Í¿:Ü,ÓÍ?�hüÓñ´»Š¶¼±üýóŽ­l*µDm9ÿXÞPúÐ)“aËùÂs K`W´üê¾¹l5pÓÓÝG²áD?·~h]ãü²Tå™™˜Øˆ@­`USyUºœ©¯ÝÑ»k:¾¡yþg åIqÿX6@`ÖŠÆÂ+dsÕà‡vôìšN¬i*ÝrÖà¹ùÕ�å*0¨ØpÓîžûGR«Ò…[6_š.¯l,ï˜Þ3œ¾w8í XŒ-K¿{öàŠÆRs¸6,&å'9Ö6—V7ÿ:–œw':leSiuS1Wµ®{ªï‰‰øŠtéÖÍÇcB¾a`6´ïNßütO¡0×lñ½»¦k‹·lv‰Wþõ¯Ïvþq¨q YùÞ–£mÑj_¢üøDòS»{bÁÚ·6�ØÐjßq¨åΣMb)ï:Þt×`ãe}™Ïo©sÄUME.Þí½»§ãë[”x3•à'wuÇC¶ÛáOµü樌lx×`£Þ!7 ÐoÑcA¼òêþ¹l5pÓ®GrnMóKSåggdd£©•Ûªê¶úô®îùH"à|nÃк¦ùe©ò3Ó±Ÿj>­µxf[þËgïIVÌF¿½¿­‚€÷ §ïJ;ˆf-K—¾»åØŠÆRsÄÇa?|¡5t®_;ö§�‡s‘=}¨)RsG-Ö¬Oî\ðøxrIª|û–cKR¥•�•!©§ÉWLñu4‰œÏm^×Ä [,[Ó‰¦øœAL(ÄBvÆ Ë…Ü|fÖ ³S£¹™ñj¹HïWù¬šˆ#ØÞ°¡A}ur¥c•ÐiÝ! 2í݉öjîpÏ Ô½´µÍË&U�¢DnàYv,\Η"ÑP%_Ž0†-ÉÂX¦!ÈìJ5X³i‡Æc(l>É Àqw>�–�‰›O`s†Í¥a>"¥¥Ö¡uîUŸˆ¬ÞÖDÆàÄLc¥Æwß•*Ër,˧®<,€‡‡nÜÞ› Õ®\6{q_6ЄßÛך+ófÁ^Ú—µþt,]±%)L'Y±Ÿ co²VCvÿñt±ÆÁa€¾d%²÷ÏF^ÌDa0:š ŸÚZìk¨ÎF Sî™�@¦Ì²•@SĤLjô�}� OÅTnÇe׫FƒÎá™Ø¡lå"Ã…P²Â„Z]¾ÀŸŽ¥jŽår² Q‹qÿltÿLNäÃùðŠÆØÈþp¤ñÌöÂ%½Ùs»æIþü`óî© vÆjÑ sx6v(ÆgùXÂ0h᥽Yð§ÁtùXɰӛ¨Ö�Ý"]¨1p‡@¿Ô\sácJPaÈT‚{^x˜´ IDATf£�­X® BAþp«ï…a$ôh�sâ_̆c‡raI¼í°»Ž6nj/\Ú›ÙÚ•x$ù³›ŸžŽ» Yø‘uãgtÜ~vOÆþýéΊãC€ëшȀméÌ¿ÕĪæRÔr\Z&ŠÁ`€«0À­™èŠUŸœJÜ?’tͼ3^m Ù‰ sûæc²Ï’m¥B6 œ¯;½�“ñÌTìË{»*´G«‘€s8;”‹0ÆÏG‡‹¡þxŵíá Bq_¢’ Úû3‘³ÆØ`.t,^×\ìKVçÃ0W ¹&:8œ�¬k*tǪpvÇüû–M¬lÔø |´ÁPð’î,¸ç¿€]ñZ4€ûóÑý³a81>>^ž*@"äôÄ«5d޳AtlÀ¾x%´d"/fÂ0˜sâ•Ãùˆk6{31ÈTX¶h Û¡€+Ã= åÆ^-þµ=ZsÅ{8€#y"^&ŸR}YªÀ¯§l¢°KÀ–Ay¡d[îf¨�…^=¾±½àRúôTìËÏuUd«ïn9F[¥Â60–«¾¶·ã››Š •L5øå½%wg·çÞ·bÒT¥˜V¾µ¸ìXn>ÀÓh€ÙJàH.Â&K¡ÑBhMsiA¬7n¬Š…lìŠ×|ùJ…m ŒÙ ÅÄÖZyöÅM]}î•u¯ºâ©¦Ž…+>þ—‰c}‹@½¶bzó«¬ð±Î¥º‡Î…XjbŽc9h˜s|ºyMÏHoóÜ¢ö©r5¸´sòðd[Õ€2 ñ&#ú^VËV€`‰G2Èê�Z~ò‡¬!©¿Ð „7—˜—qp&óÕÀ�´°q|ñ©Î/>ÕiTèIT6wåf¢»'bå ¢Ä7Æ�!,‡f â:c€à®n©=GþEt€šíÎTm±3—li¸â¾EW,š½l óê¾Ì=¹/ínÿù‹-šÜVô‘„ÞdÕk÷däzª‹6Œ!c€Ìr³=¢}NMÍ�²HéÄe†îc„Ÿðæuz°I»m£©+þ»bÑìeýs‚原jv9ëo¨¬nâ»%fË�F +ÃUÖŸª|fãpSȾ}oëöñds¤öÏgÈi4€Dȶ,ÌTƒ§µ.ë™ûå±VדÙX1ôµ½¹Ïù‡í™‹ÖŸ¨¬Ns2æ8–êUlPrämKñèÙÕ-Þ¶ÁË,¾K©‘n’s�<ÚÈ,h¨ÜtêpSÈþþ ­;&“ÍûæÓ† akSr¡7^ÝÜž;˜�>=­b›ã Ø6€x¯¤°CÆÐ 0â_ |€YÜ¿ÄîQ™�ò¡l �(ý0õ)K”ûù½äˆnœæâ‡Ü6mOvâíMjo9ZÜötäªüw´öÌFÝû“•UÂfK�€…`[Ž#ÌfO{ŽßÖEÙžÙ¨ËB:dóÅæ¤CÜ%ûS•›Ö�4…ìïª\?L©: H‚ît,‹�”¼÷N8œÂçÛsü¡#×°£@~v… ƒ‹]¤ƒ €Ã:Úö±g?¼ó‘Z¥4rðÙ¡}»íjuðÙíû¹{nbDÐ$³�—>¬TlQ¤ºg¸*ßW=92?Œ,jd'¹$ɵTmCÕ.zˆ°%þלÀÐLãÒΉŸm?½³1ûU¿øÉ£g4D˯XuðwO­U¯Ë&�1YLg0På—SsÌ °BÀb™6ä ZÖ&©Là19þ ÙG¯ÉÝ<1:ñStêõ½Bç%¯èηÅj÷ ¦r•€~‘À)-å÷®žZÙ\¼³‚m�‚ _Ù›�ˆ¡7YfÇsáù*ëKV§+П¬4TŠ5ëX6¬"—ß# ‚ f¸òñI˜'Š¡RÍêM”¦*€Ø“¨v'ª@fv¯X�o‹Õî;®øbc…`±Æzª½‰20¶ Qíopç:`1\ØP™)¾½§ý5ZüãZÂçU½¹xÇݱâåE©*ô$j Üùý…W,ȉ±,î$ ж5^ ,|eO.@ˆ‡ 7Y)¨DeIº Œ)Aå"R$8Ê_EëÒÓž'/ âÓUèI â�,H–gJ�oíi{Í=K~ÄYÎÆCe‡]óHߊŸ¯^þóÕ+~¾æª‡úжå›í0÷‘ÙÎxµ)䌿8Üôôt¼l³HÀJqS=ëãÛ{®{¬§Tcï]>½"U`Ã…ðT9ж!|t,µm,µm¬á…l´P³°â°<Ñ¿æ÷«Wÿnõšß¯¾úñ�¢mÀD)T¶­ž˜PJ\ò%ôâ'�çÃóUÖ›¨,n¨@¢:�¬kÖ±|Ø­Ó©­k*@o¼ÒŸ¬”m64îˆÕ\¾~=ØüÌL¬lç‹‹\“‡a®[;³­ÑÚŸ‡S¹j@ªi¼*Ù¬'Yí�UpA¬ÂB‹¶5^ ,<¿+“þ•(À I|Ê >Dor™êñÍ·Î3så¸xãåE UèŽW”x½fhî£ôŽ·H>S82š*¹à<:î@ê`6Z°ƒXq¬lï_óÛÕk~»fÍo×\ýXÑf8\�­à‘±†mc©mcé2±‚Ñêu«GãA|~6´ðƒ«Æ{â%`¬3ÊUù«cÍÏÌ(Õèò  )b¯k)bO¢Ö¯”m�w_óÀ¨H€)„9…axt´aÛhöцƒÙ¨ût¯šÃ¸¶J³V‘]1ÈM�‡# D˜>žliµ«åÉ㇋ÙYí2f„ þÅ©ÕrU€š“­`kD46¼ñŒèûÿ6ø½¦ž×÷ó#S_y´Ð³aéYa8É%°"-ðÀs“O,l[ÅÙ2ën +�7M™È’àáýË®õ¿Øqú[¿ýN·ƒßî\§È$`Eg¿îÍc§mÒY½ß:´›æjëöZ'z „À‘Eöòj[vž_ÃÊlÈa%뎘Àº¹·ØŽüÙ³T¼ 8‰H5ª–«òMõ�“]åó#òÚa.öT¨va_n¢Ü6Ü Ç—‹8±�ýÑÓÆÎì˜ß²`þš¿öjD,UÙ]GÓ; —dÎì(L•‚½Éêo�¤þ}wçþÙè_‡.[”ùÖÖ{g¢ËÒ¥¦Hí¾ã©=3ÑåÍ•:´¡qÎä$ t.êË®h.mh-Z€KÒåÏlÝ;¿g0½w*²o6rz[áÖóNÊDRå¦h­P ¸Ä§Âµ‹úrÅàÃCIù|0cì…ÙÈÁ¹èi­…ï½bðP.2�¬6Ekî6�HþÏÆÑS[Š#…P¶b-M—Âx!X±aïttß\äôÖ­[OÊF6ˆ±€ƒtȾ¨77Q ><ÜÀW̰T³î:’ÚØ>ùÀÜ™ó® ~s4ýïOwî›�=4”º|ÑÜ7Ï9¾o&º¬±Ô©Ý{<½w&º¼©ì¯O9�5R&€�ÙõeW6•6´,À%©òÍG÷ÎÄÿ4˜Ú'ˆÿιÇe# åfN|Ñ_‡f›þá{ošIûˆÑs¨'²´—˜0þ›`ÂFÝj;JËšJ8œ:‘j+: ¡b[ÏMÅV5—ž�ŒUì€l}ï` öw+g–¦Kéˆ}d.üôDÊ6ûüήÑbèòþì¦ÎùÉbðZ¾»§¥d[$·•6ú Õ ·´ÎxíºS'Z£<<§Ãµ× d/èÍÍ…· %o~bÁÇ7Œ�Þ>߯þü`Ó—Ì%CŽƒ€ÛKËšJ8’šÉ÷B¶úìS]ŸÚ0¾¶µÐ±¿òLÛ¦ÎÂù=9¨:°k"¾ ^íIVBN‚÷Oߺ§­æ@α>óD×�&No˷Ǫ?c¹‹1Û‹ËšJ¿?’Êœ¯{�§Ù;VÌ,‚zf"Žˆe‡}~wÇh1øÚ)¨Öïîm‘SCÙ‹¹¸§Å4ùœ1t%ª×­o£‚êÏ\Г;š =<Üð™'ܸaÜ%þç„øj vN$t–oÙÛj;ü>Ði�öä�¹ºÇ‘LøkÏvüã)+‹/f¢ŸÝÙý†EsKÒE=¥FÇa?:Ð|fÇüÙù+ÎþðPËO�6�Co]4³2]êMT¦J¡‡ÆRÙ*Ý+Ä¥ÊÄh®øç§»¯_;¶¡9ß«þâH󳉠ƒ�±ÚGOk�pi4…koèŸ+õd‡‹½ÛFC_|®s´º¬7sfÛüT)ø£C­·¿ÐRËÑަöÏÅ^Ý3±ì''_ÚÓ™­óµà7÷µ¿åäòtñP.úùg»_70·8YD€Îhíc~c�ÃÛFÃZ‹KÓ¥»Óƾ§L5ð¹g»>qÊø)Í…Ö°ýõ½íîƒ..�÷ 7:h½}Éô²T)¶�fÃÏNsÿúâs�£%�ø®Ù�KOå3šô²øÚ«~hõ¸$>ª½º'óʮܱ|xÛhòŸw/¸~íø†–|[”Š—·õ}ÿsg¼ö¡5>ÍG†ò¡�­÷ j¨ØóÈhøŽÃMÃÅÐ[M¯l4 @Ç@ˆÀî8Ü<\ ¾uÑŒj5šÊVCug.ë›+T·hšþà@뺦ùW-È<5ÿݱ¦oîíxÿª‰åéâ‹ÙèçŸé~ÝÀÜâ†"Á'aÇòáû†/X�‰ð±ñä¿=×™­X‹Ê[«ÀÀ\ÉÎB�Œ5Üq¤e¸æ|%9…nØ^HQÊão»ôª»ìb~êØì cüÕYÞ·TøÑ‹°çíÿs?–¾æ?WY‰4<ˆí+6>óÖ³v/n›ª:Öþ‘ίÞwÞ“‡û�ĉѶa»rÉŸÙTspû&&Í98y–9ù[ù7²µŠS ¿#ݼü…u�Ó@¨¾ÖÕ•w4_“ÐiQ™ùô"'ÉHV4T:@O˜(Ÿ9Y ÚcÕéb°ŠŒÛÜ•ÿÚ9C¥šõîú�dåò…Ñ�ø\FUÐ_w)‹Anx³€µÅ+ÓÅP lîÌÝëÁ~w£–Æ"¯EB9>Y Ж*뽤ìe¨XOœx}µ¾DúrUÖ�ƒÍ�ù¯o*ÙÖ»ì?’�†õAuIxIB?íšÜ�=ÆŠda�00±`O†4¸2è o¤ÄöXmº¨�gµå¾rÆPɶ®ú[ÿ‘|T5U9‚ž$†´-„Æ]C¿›ˆ/KAF®ê ž~|�EŸ h =…’_ÍÏõ€Ç„a{IÕoÄZ€mÑêt)Tèlî(|ùŒ%ÛºêÑþ#¹‡j«-ox¬›i4+ӭ〦püb¥bV—0�ż@þ¸/—W^i¬k-ݲyp®l½ç‘EEñzHÐÌ»ÇJàæœXUWg!®Ü¸3hÄ'x‰h-{Õ¡åäð™ï«7êB¥øÙö ?Û¾ê8ðW¥"ÙY.ô$Þ³€Ä�€ � {ôÀÏ䯒‹Aµ žÅ¦*_Q‹ìÎè^X-Ù€¤‚K› Ù7²ø¹¹fáêEžò½­J,„"rßùÌ$ˆü€XÐù·³GV7'‹AèNVƒÞ¼áD>„ºú™.ó Ŷ[qwÉ;Z„œ�DCö¿o^ÝTš,‘Aw¢´ð/'NäÉtŤ_I8`ÂÔŒ ¯‰�£^@ÖEÈEÅd¹éQ± ýïg sA)âSCù0¯�ò�$GmÖ£I‰ÁúÑÈ”ÜݧdÄi À©A  Ù€‘Ó ’Œ Êc–X2ÃxÈù×Ó‡V§‹Å 0X¯-|`$54æ? ‘•rY Eæ¯k¸Þí}™»ÎÇKD<^Eà!è›\4{`U(ŽÉ�äÔ´Üu)·Ä›_Óäƒø{,èüëÆáÕ�~â• QX5±O¿´Pg\?†µx§KÀGbŠY%]�7Ñ…qy•;Cã5)âAÝŠ C¡Ö³VG:¡nNŠ\]ƒ dŸ$è 0ª«RÔþ¶gd[ ±þ[¿þ›#ÿQ–+îñkÌe�¿OA2)uÉhîAp–X�Ú¿Äßlçy‹p@²E)p1Q�…™ÑÔµBé…ä ¼¯}å ù;œD‘4f!Ù•iò%©þl‘†å´‘ti§†²èQµÙSãñÎxµ+QE`ƒ¹È½ƒ©;^h®8fºÁY¡pÉhiõOVÈÕW³ÙS‰ÎxMŽuÏ`ꎃÍÇx Êʩԇòb¥bO¢O3áõš¯w@r©f[OM$¨ îLßq°©ìød;àc²±_Á� ܽc»ËPÓ—(ÜßÉac4j&<©ÈTkçd¢#VíŠWØñ|ä¾áôO7UÜM­¾S4#Ù� ªÙ¨ë†FÒùëp/ç0<Ô8ÁWÐm‰¸¨f@¤Wك̚i2§^MÐ…Þ:eä%Pµ­�Sºx‡¤xõæþ“{?6µ n]gñ8=©)C£¹õ€(c‚MùIÙäÕµ ƒÉ}‘ƒC©nî(‘ˆÀ3Q”c½¤�xáÖp*e¥ìÒ«îr°VÎO�;n1¿'¿NzüO. ¯þÏUô«L¼ù*®Õ‰\TÑrYx²9´}“‘qúD�}º©1µ4&`[Ö”€JJ5zx¹–¨'2ؤã][9™ã3" vªC2´|xɇN#ËÔ;ÖùÑÙ÷’ïWoMñé:ž7ËãÈe¹×ê!Ô-7é£aŽù0¯ÙƒŽŒP$aî?ê°NS£†«>ãPr¼"@�R_�òúˆ,Ä!j´.A‹Ãºã(É�–¢ŽëXôÕÐ>^Iüþ¥@ÔŒý*è¢|{µ(„$'ñœT=uÓÖ9OºØ«ù¶¡¯#×o«·îºÞ®^â0ð’–x˽ÆâEbo�ä1ã«'‚_ˆäÝ0ñª|P²C2})º/½`�4#q¬^Äb ¹ï/O`ý—~½®“ÿ÷ĘM%ë{¡E„Õã¬l %S †ÿp)훟‰Ofü•@Ä»ç�€*[Y(ê½’@£<‡B”g Ä€LpÅò¬XL6²ºz9(€YJ5'ŸVóê’7BZÁœé’Šrò.�Ï•ªju‘U‹à„<½Žœ9¹¿û­j!#€$�¦…¢êß; :™Eû^b¢K’_Dk#Ã5 K³<ѱÚðDª9{Ha|¹\Pà6”@è¶c:+F/~c�¾OÝíùü¸’¦S?Ð0V!(wÕñU¹úí)þÁhÒ;cè‰k5=óZãð\ªÇ—Q�W³!T¹¦M_ã!bºAØ;›D�&Dá^õâ“oœá4`}@âý{ºò•“Xex„Tu+©tæi¢r”ê5ózE« ¼ ­›TxbÀyäÔéôüÎ1hÚ`<´ûOV˜!q@¤VŒb± 2ÆÛ1ïï¹Řã Ø&´FŸMÊ«zOüÄ• c–�!5'ZŸÄõi~CáP NŠ€ð.k v‘)†¤¯#¢ëŽÚç…‚7: …UY¢Uj¼ø‡tßÊDq3KÌžÙI#†Ñ aŽÛ-7 Wë| Z %M¬  ‰2·f>ÔÌ^𢛡:ôxéS®ãj}ƒÈoÜp2þö ®R$Ìj¢dʘÐstó@r&ß-¢ˆ6&H tÙk¬Ñ /ò`&Í�ÅሥJ¨pS=ýgÆ5®cÔ‡W|hûˆÝ¸ãÖÀ j¥I5ê"$^3q"F¥¹•—b£PòÍ„GP‘ßìR„&eT¦u™£ù<³D.×½$y�·,ë÷AóKŸBÆïðIPQ6ã¡ß›CËZrç«4ˆDé$‡2QT TÉ«^ˆÝû”×ÍS«Þ<ŒwyRÚ½Æ�ž«rîNäêÏLÝÎ=‡Çi9™»jtj²‰Ð˜š±1KeA`Œ�$«õI$ù ¡ÔïÿåðÍUèUÁi½qyeZWŒÞ2á PÚú†‚L «2nʆúIÝsáÄ «j&Jè¼ËQ%n·;™0I‡–0ƒ\g(ð‰‘¼�ˆB �Ê´˜¸Š|&gK>dÂ1¢&…J7�š·/¿ŽÛ³gU ,––P‹¨Æ)ç[®Ñ3a”%7¦I’[LºÑ$ѧ|&‡Êên¨×‡@ÛCGwWËsô<–JC­n¨¯Oy¸` Cu»•&È,K@£„’Ipý†¨+*.*’xÉØíZ,õ ":.sq >™úMâè�ÂŽþ:~äÒPVö­ Dº@yAŸ¶šá• A†*ß»êgo9k·Æ ÒFH“bT‰R`š×`Kâ¨èBe rD¢²ê õDZ>xÇ—|ô¦õ7]ÿô`ÆÉã®— ã2k<›>1ÕT©�ô'Ô_êø/ «Þ h P÷ÝI,!þ¨ÒPb®Œ­`f]ô’ž˜R¯7 2¨j@«#«(VÔ��Éë/…™éæƒF'à§áz`LJdòè�4’êM‰ÀI.®—R³FEŸì[#�†<ÚALè³æ �LÒ-˜sýÁ±©ô”ÿéaÝèY=u#61ñA×Ò€ ¨¸oâ3}”#éMäÒ ST˜¹SÿŒÐ¦.¡GׄY?ù€RÖjã)4uAw9_H6PG.)+ÓªxLA‰[•è­@óBÁµ6kw«£¸Ù|¿•fÙz'Ò‡Õ ÌèŒ7ab—¦1Y§ð¬žåkÂÞåt5ÈÍìºâaÒÁŒ¹ÅÉ"¨Œ!ü›H„%‹#È€YÌrñÿªàä#SãN(ƒ�£N¸ÏªD5Ðñ! P›Ø�¬m ›ÜÙÄK€Å£v[:Ï™7AµRi^4Å@ZÙTH{¡µ¥2ÁïÑ@¤ÐK¿„ ˬÕ,íA­óÄþ(­ÛúÆ_ÎñŒ©±ùRÇˬVç 6#ó{5)'©’‘øzçšÞ:Z92åS‹rÖËÌt½�†|ŠCð•ùÔQêVKµ*-E0›…ÑÖóNÓê=…|$ÔàœéÕµÐ�ÜCE ±Ä�Š:Ý3@;кSM¹„ÝÀ§êPrä*ŽºÊ\Q¨×j @dŒ9U°äš4…è Ÿ9Q3 `Y/΀kˆ¦Š¨BV¿H9'NË ÿ3<•F.ƒQ=¶ » Lþ®»¬ŒÄs4S؃eUª#ï…0Ë×â%c.O’`~Ló4+ë^ÄT!éZÕñΞ5 Ñq¼Žý#ñ)á¼5Å&Y³k™.È<]‹F {­…¨}# «—æáJ´Ô½60"ÙÒŸ7I󄃷 r�2ç´`iÙJ™ùDaÁ†´vD6ìxùº¾ák^ù·�‹Ž'"•£“-_¹÷üû÷,€þ–™]²mó’£ÍÉÂd6ùë§NýîCg+¡å]_}Çï¶MG‚ÕyóÈ¿¼ùnÙw<û?îy%y­)jC@À²/Y»ÿÎÛ¾´s"[ˆþv׺ï<°%WФ¢åo¼ëÎ|)|Ã/^W(‡bá꿼ùùüø�s…X_Ëì‡/~xóÒ£ÍÉÂD6yçS§ÞöÐÙ…rèÜe‡¯½ø‘é\üìeG¿km `_vêÞû÷¬ø?w^ŠÈ¾sÕ/Ÿ?Þ5Ð:³qÑ ÆðOϬúÚ}çÍbAšÂΫ×î¿ê¼Ë:Ç] o}pK®hþ…Î$v¥³¿þà{šçƒÁéæ7}óÝãþ’AË~ËYϼkËý-³…Jø™ã >ÿû M´@4T}çÙO]¹ééîæÌðlãÏ_Çã§—«Áx¤ú�÷üê©Ã}}­3g/9–Œ•vøüï/<1Óür&µ8H3W=Ù’R½KÞ鬌 |DfV{I¢0Ô¶¨hHa„©œJ€ˆÂ ‰¯@wÍY“¡SP, }XBŸçv°×Ìå)'™w‘“DW×miÊ@ëxCðodWf]È'gúb§ ß“‡(*ðU#´�@É“ñV$\‚<áY‹ˆ˜ˆˆ¢‘ÓLz�ˆòH¬$»oNn8¨Ÿ)�¼Ä„¡A ®PUVÆÊ¸éŠe^Ñ 7ÁïÁpÔ»ôZo ×kzó\­½P«,ä/€ L“5ú¡W½ %!˜�ro”ËòªDÝ8�xIQM,u25ö¹GAñ›‰÷v1)a4%fÜk�œkÕL®åxººeSu7�!bP:P` ƒI†WE¦ã °–Ùµ¢ ¤™,ëÿæ;ïÜ?ÒùO?zãÌ|rY×ÄàT“[³PŽìxqáímžÊ%W÷Œ|úuÎÌÇ~øÈ™‡Ç[ß}ÛÛÚÓóß|篱}Ã]»× °|)â÷Âp�×ׯîºKþÖýç>´oiOsæÓ¯¿7¬~ñî ³¥ÈÿpÑwÞó‹·nÚõƒGÎ|óϬëþ§½ÉÅÂB9¼ãÐÂÛÿºy2›XÓ;öé×Ý77ûÑ#gÀÒΉßí¼àžgVÿë[ïºóÉSßsûÛÿíÊ?,ïšxa´“!¼uÓÓÿÅåøÉ›zš2_yÇï>úê¿þóo.ª:ƒ*N1"\±þ¹_òð·þrîCû—v7ÍÝü†û¢ÁêîºÐv,ðX«rÉÃûÙå5 x¯sèÖh¸˜‘/Ê_@õ[Ã÷JIàEù—UGÜz` ^Ç äº#p°0Á¸¹‘™ÿî+7i9w_4£2Žå4b‹‘�± HHkÙ™êˆqÐA�s+ÙPÂÔðÌÛ’AŠœƒJU⟤Ðű̱! ,ƒaé451_þ jPœÒu¥îÎjV½]ø'AÖzŽh">ËVÂ^iK Z¹)Ø�™Šž©Ñus…‡N¶Ppÿ²rU*2,âîƒ_Âá�Â8ÔIÓDyýP­3ªƒ­¼*‘5\“Ò#‹‘È“U_“~òQNŠýÞ#�¢IÈ­Lü¸X݃º¥P”^Ãí3|�ŸÙÀ¾]n[`Õ¶r웉á[J­ÔRO»äï@Iq+ºäÔýÅjè3¿½t|®޵É*Sùįž8Õm²íÀ²¿½øâšžË‚šp¶­L1::—"DC�sLÅÊoÙ¼ë—ÛOûÅŽõˆ0žiøÁÛ>xá#ß{8?:—za¬õ+÷½â†W?`1ççìúÚ½[÷�tº�'óq— Øv`Éß^\tJψ;³ÏãOîgÌžÊ&x~ùàds±jJ]é<þâÀ_÷-F„3éŸ=¶þCoëHç†f}… ÒÑò[6ïþåöÓ~ñÄzt`<Óðý‡7]{á#·?œ�K«ÄW‹–Ê0æ ñ™|ÜxÚbŒÎ¥‡g�Á‹ã®x¡½!ÿšS÷ýðÑM÷>·î}nÅ‚¦¹·Ÿµë�Ÿ6WŒÀÓƒÝ÷>¿Òv¬‰lÃ#_°æ`2V3ï—u`×0×3róPÀ)\œ‰¨­UíÉ&ÑJ\õú¤¹i =Ä�V“e²E<ΫϺ@æÎ+ÍU>ÁŽ÷1†¾ ¸Œ1/Ô•I³óW�ñU̺¥¬••;ˆ¥Wd8P*ðå€lWÖ¥€Œ�cCE£^ˆ„F1$‰�"caþqP§.V/¡/‡½&W¼¤IŽªg7B˜ª\Õ3ìÏÍMTMjYuµN‘Ðf,ùÞ’nò4G:Év/ùŒ§‘vh Ž–6ùL„Ðl.² ¡B‡ã®–Mó‹<ˆf9AnŠ@g·„kuÓÔ#4çjv21ñ7>.3­L3`Ž�\�b“¤He‚.ùîHÃNèæ{/æ>]m•¾úB±óŽj‹€>*³,gQÛÔщ–©lÜ›4%çß÷ŠÇ/\óBkj"Áê_ž_aB3]ª{ÞÒPènÌ\}Ácÿpþ·$ÀœB5œŠGçÒ ð¾gWœÚ?tÃeÞñ·�wïZ-ÇhI 2þüü —ÿr5�+…ã‘J©Ê–¢6‚ã¨È3šIÛÀ§zc™T(`·§ç‡fë¡MKC¡»qîý<ö^A¡Åœb5œŠ—FæÒY|â½GxüØ}´çŽ¿müÒ[îzûñîÿmÃß^XìN�ÛrÑ`uÿp» ÷wFÃÕŽt~®€³�•ñk¹XŽõ_Ü&E¢´Fšt šxƒš�—Æ (´êÝ:=ƒ‚40z“»ð½ø*\Ú'RhqDY³X1–èEÿÈøÈÑÀÅJ—&*|P9µ¢òHLI¤û’ä~U¤< Õž¸ ‘AL@%ÆÉýưTŒ1ÂëâÒJ¼Á„¸Â_5ìfOú;W¹úth*°‡�GJ~‡*G0Òd•–ÀIëø“è™óEë�Ô†O�pj…L‹’i)�–!�·õýĽ¦ÏzÉa–k¹Ó¬QZ]�°D�U ‡Gt´?ýo�Xâ9�@,YÖ`r­XˆW± s­, ÑÒÓ—sLo½¨Fõ~ I¯½h•"*M$Œ}‘t_úí> 5`»íØA'ú`5ùáÈÄù¡ì�µ¦¢&pöÜŸ?ST‡µO]þ—¾Ö̵?}ãþ‘vDZ>õÚ?·7äôµª�:^-C°Ñú·»_õྥ²±í°ÉlÂmaG*ç8¬#� ‡œZ%¡€ý©ËÿÒÛš¹ö§oÜ7ÜŽh}êµnkȹ]ÖlËA¶mUmcÉ”…5ù%@ÆÀ‘i Éuø S>°w)gŠ¡ã°‰lƒžëøëÐ�g¨Ú�oß¿å×OœúæMOá�÷›nüØÏ^72—Fú–+šêŠ V3Ø‘Š©Øõ2b›y0;e¸_Û0¿Èjœ×�]¹âŸèøJ—ø9á9 ëî6X`hÀé®ä˜OII<$È*W}Atæºx'Ì%‡".e…‰,W„b”»5©‡Kç§â7 i²[ ðêëžgüŠZ­¾hâØ`…@Ï]4òÈã ÔZ˜Œy²¡÷ñmªêAÖ:kÅ^@½7EY7)$hŠž• �¹ó3K-ðš•ź¶IgrÆW-9Dó¼%”fb(ÞrÙ\‡–)ZÉKšüç¢Y°KuH¶æ‚¨/+Ö‘†HZâòù¨j¢sGmåUÊ1%XDŸù+! ºŠÂ+IøÒƒ$Àf¹GßžÞœo`Nœ&f[€Y Të!€ÈŽO7õµÌ5ÅKî¦bå•ݿڱnωNÛ¶B»»i¥*-Xزyw/5³¹øX&Õ×:=šI Í4ºÿFçRîLβàïÎ~rå‚ñþøÍK:¦Þ¹åI×°bå•Ý¿Þqêž�ŽÃÉ�²"8¦ž:ä—Z§£Aޝ [¦ªv`:×`„Rfò±±¹T_ëô§0=4Ó8òi{ó°Ý®¢N´êýΜs’““œ LI CbJŒ@›Ð‚ÞðÚÂm…VÄ«�8pïµúiÛÖÛ\yôJÛ Ì¡Aˆ!‘yC0!$9CÎ|NÎù¾·î«†_ÕZûý¾Ð}7á;ûÝ{ UµªêW«ÖÚ{ï;åÄ|¦1“Ä—�T R`Y¤qï�­¯ýð�¼à/~îÁ§¸âQß&¡{÷o=zbý£|�öÎô¨Ýs|yÉwBMÊs5ä\;²rr­qq"±²JWž"ü‰î^àvÄ»Ýq-ƒÅ\ýt±œöFKDúTƒÂ2»$$}”ç¯1¥ÉÍB3=Õáë¤)�˜‡ƒg¥Ü‰¥•½Ø(‡On{t�ñn¦Ñ »�B!„ù%iæ«nÉUÙ¶^6ï¡R5W¿–ývãc:Wœp Ç)œ-è;¢ƒN@Å¿Ãr2"k‹·`Z– ¹Ì>@±Êë®é0?UdÒ[Ò|…Pû¶ýz½­ƒþê�ô �xˆGTÉðÊÁ)$äm8¡¬DاûYŒÌœ†ÂÚ´ÛIœ/�Ý$mKƒh¸šý´c8Äd¡„3a™ñó•ëýÍ–Û®ÛzËeKG^ºq×YºæøŽå‘vzÛó9}øKí8éð+êC—œ{çùgì~ê#¿}ɹwÑÑëöÜrÅEß:oç};mï¯=ããO|Äíè^_ϾmW=áæ ÏÚ½sÛ¡‡�¾ÏMRFî?¶ñ­7^úìK¿ò«O»þágîyØŽûžö˜o¼àIŸmðü¤GÜúsOùÔþ‡+>ü• ÿôWþ¯OùôS.ø":v|Ýžƒ›¯¸è›HFŸÉF ¬"ºøœï½ðòÏœyòÁË/¸íçŸúéë¿~þ÷îÛêÂX¿neii¾nieÆóVãÀ±Mo¹ñÒg_ú•_{úõ?s÷Ãvì}úc¾ñÂ'}vÃÒ ™Ÿ½â¢[nøý?úc¿¡‰;Å!L`ÀÐ1]zÞϾä+眶÷Œ“]zî�[6œØsh 1ï:´õ}Ÿ{Ü‹䟯zÜ×ÏØvè�ý拟ú©|ᢻ÷ŸÃß7èŠÞ»¾¾¬èüÁßú‹ûŽlyë�O¸ö†Kzú}¤ß¤¥#÷oø÷ïyúïüäGÞùò¿ž-ÍßûÙÇþþß=ó/‘ÐÌ–‹ Áïøôã÷Þü’ûäK®¸‘YnÛ½ãm7^²Bü S÷ÿî³®ûÀý¡/=Jˆ>òÕ />çÎß}öGn}ýiwìÙþ'ï¿ò•?uÝë/öÙò6'#‰Pu-Âb"zÿ}áY÷~øw>¾²2{ßçó§¼by¾´qýñÿø‚÷>í1ßÚ¼á83]ü°;ùÇ?yÛî¿òúŸùÖ½;ßù™Çï?²ù%WÜø‹Fá[o¼dÅñeb–ÙÒœiî<æ�¨©Á†¥å?õ¦óÏܳyý‰;ölÿ«�^þ±›/ ™ó_~ìI‡ïßð¿?ó£Ù±ï{÷�|í —¼áú^™3jͳ7tøá"\T}^!p�%¦¥(£ÝT$c‡•)Ö,ùö é宀½¼›+X·7å°Ì>¬˜YÃGM1E©“dÖþŒmÇgÔ¶)Iü®æÓÄ[vlÖ„°Ó“‘�…^½˜’g¹e—t¼â®‘Eö()X*úÚ³¿1Ö1HÆJ×mÜNGQ»fÈÜÒžìç+4› ÏlHÍqð´ l¯4à„¦Ù“ <—h³š¸îõìaúð“ýB ›`ÉÊb/êé6tÃÍ!�Ee£�œÖv‹˜4kZ–ÔbS'Ô•Á.$1�ó·n\¶aLɪ²^2ÜdK°zÞH´�À9d›¢}Á÷Xâ\c”ÁÆ)UÅfª†Õéö¶Ù×TíM>Ó‰s3µ±WÁ|õ‹ß+2?vx×­÷Ýγo§/Û´ûÿ=vÚ½²ÞÂLÆ^JF¡§ˆsw1PR/‰ß) ©?kß>&h8¤€Ê•aÀÚ²qù/ÿ··|í®³^ó¾§K!›ºsd›»‹Hy×/¹·¢Ÿ¹ìó/}ú Ïÿ~þžýÛ¢AéÚ)ìôÅ8‹)6«¶ƒW%[q‰/ŒJj6Ⱦ½N8Ó–ICö}Å݈µY‚1@tƒï‚È Šü¢âÄ$UŽ ÆÚºëq놡YÊ.qÄø a”ÄÔf=jÍÍû óÌ·ŸÆƒ>[¢¥õFt+'ñ§QÉðÓ׫&w?°chðS¶4䇺±6ër:íb¯šؤ¦àÞœ5<ô�g^�’µ Ý›ãÛØ®ŠË›¤€:ÉŒŽ2Ÿ®‘“{“Ñbó°J‹<<­[*öŒd×àK³2I1°�Üãb­ë†/�{ª=£9‘ˆÌE‡Yd­ûãcgí¢ Rä7Ë(j‰]±¿Y@Àá?½o^Qvµ:•‹q¥çÝ k?¯×gýD“éFvò(VšhOä1h&èX£¤IlÙ~ÒýÇ—×Íçœ-–s-AnaDt´Ø*ºôôHX*:È ÝzÓL0Ý|7¼5ÁgEs³ç_Y�_(Ïùj°¼:ärÿ—-�_Q¥‚²è×€•®n�ñÉÙª8¡ûøÍÞÕOhë²>%"JVÆà·%”�E—ùè.²hÄö¸H¬ˆ�59ÛQóñ!  uZŠ‘Œ6>I�YPóeº ²HŒ—‹ªõ ¸!±‚”.y³8Ø�[½ C`ìŒ ›ä›Ê­%9–¹™‡I˜,f޾Hä½Ò:b²qj%ˆô6NÔà…ì—|éÒ«ûèpá}žF¨ =:r,PÄâAãÉEÑj(¯$Op›è¥›@\cÜÀ„:r�¬¨H"s&>e˱W>çºGŸ}÷ý+ë>ü¥GþÉû¯Ô‡‚†j Îê( Aç®–Ì!úÊEÉG¡{õqsw¬�Š25 wKˆb“¢ÄÜpliú"5\ÀW Ã¥QõKî¥4ãÌ·‚ •� ÍC’ _A ]þæm�Ü2Æøªó»­'‹ A•¶)-ôˆp˜.UM¼E4ò�Qj;æÙ¼¼‹Ö’­¢KŠIxm�ûËg¸eP iŒæZÇ-Ö|½©ÎK ¥�1ì²!ý܈9{‡Æ° p.ÌYd‘Åõž{ÜH`v›4 $68 ²óΞM9œ�Øa «öA†OF`Yê#½‹PÅÁê VlÇk�-ÁüpWAyúŽÅPVyFUÜè^¤2£y£†“Þ¤GCÊU.²7ãfÄA(sJΣ™œ´¦ 3èÒ’vøâº$ö pÀLwmÀ³]’¡� y`.e2Õï5¹��y½ŒnÞ]™v$Ù6’^J:)ØŽÒŠqýL N�n]×]¬‹ÉS—7ŒÄ2¸Ö9¯¡…"ì±AL:œê 7"‚ÕG±R(k"…°hŸ…ئK`( 2Åغ‹R�â ,@hkœqá”Ê�˜9³o!nÿÙÞcòM² òÚÌ|Ù¼æµ`u'·"¸V/r>GÜå®(t8VÉH@®®šlÁI`C:£ Ãï�¤•×2åú:sŽ4öò !‹-möG o)ýíf?ð£ Ú¥biœ Øvžè´s⬉9%ÜdÛwû—r㜸Dn½¯ë§„È��5²3ç¥9 7_†ž;’ÄVôU&3æ­o«è ýÔЭ0^†Ë€ÌR§¤‰�eÑ‹@½5°”t鯡ƒ q¨“èzPlb àEðàŽw=èMÒ/åž§m‡$F4ürìA¨½Y>'n>©‹¦â +hf5R›•ðGq >stÂÎ^�Qx�wC/õ'‚.‚q–‹�lºëc8’ÌP½3ÁóêàS'¡[&¡&Õ’ïõÞÜì™Éß%"– gqãD!µ%Ÿub�Ä,†¶wà/Ƈòœ9ÉAïÚDYˆˆfîº�X;¾GÕw§>VïÆNyt¹vgÚZëõeU-[Pê�>Ì> Øý.$™%ÛwßHÔ\d9tmäp¯ŸKLÌm'»‘òÓ·–jXリÄ>¢ç¬éKûO0sÁ u Þ<¤DB©ÇD‰^¦RjžaƒÝkáxD&¶)Ÿ87œJBGŠå­YàVmY˜=kæ’ö,Uˆ½ø0:)̓)À×ÇVý{ZƈÈb!U’�©¹#ý¥H¿RäN^�Êuü9Þ\=ö¢2Q>ñ´øPVK Ÿå4�_3,Ôi wb°œ¤´Õdú!#Áx=†Ð�Ý {M@”åqÅ^ÄÅ�è=\ma‡ 0XrÇŒÃÑK#(¥‚T‚‡r�Îllæ¡´¶@¡M mÅûNgóyÍ$åpÙGoõÐO ÆÈK ®ã¨@ "ª*‹LeS§]xÉɤ;�Ÿ^x ~0hؤ…T…­?‹×|‚ªFoÚÅY“—âôWU«‰Q„X|²%™j_ÂL¬7—ãa]ÊÍ0ÐL0ä™èµ…G¹j š¬�G ÀÑ)Â!Ãèsê}×A?ð|µ!ðéþÃ+âÜ7-X! ¼h…ð/„G}(fÂ)¢ñºCR4Ý ÖA#¶B%iZth§BöÿܵtP:¨›!3ò¢]køàìj‡$ÒEBî«îcOÜ.¢ µ=X_‰!‚Gn¼šÏh ÆôXŒéP Á¦üY‘ƒA,#ïL°_bÚƒ ´à›ƒ8.×~qÑÆ &�Á¨_ì2º�Kakx¡—V�ža#Ó씺dSŒ£ÛRî‹_#ÈìXc‚mÑŒHôkŽFWg?‹ø‚Ö«=wE«U†)'ñ&_Ãu®¶Q64:8#$´1á¸'«”ÖA/FZ8èZèÁ±¥ ‰Ý嫈\ö“�_.3ó�½=îT“aDyk°§x.ØF: dãø¢[+Ë„´ôNÃ;2µ0£m•¤b…á@bÌ’¾,�w˜°ánöe.K²tlã,ú‰à¯¥—0µ(îA2·|éIî’;@ñ£0Ü!ŠPŒ(Ä]²§`q‚ÇfÙ¾U˜|0‰ˆh>§ù EFÔN½U4vV÷c9®“b ý)ù\•*zá`—«b­9„ã$©…H‹ëj›A²ÕÅä'QH+åbÛpeMò”Au°s²vWPI߬$¨ŒþìÇÈÉëü®Õ�põ™¬ÂÍ!"0”tcrÉö÷ƒ÷ìßöŠ7þÔ}‡¶à­®]‡¥rÊLÝÀ”œ)j�ë8:8ÂAÎO¿Ä¿]§«Ü¢hz G2˜Aã5åÎ#2ü\ÍÓÔûм�þ©üDæEU}ôz} £C‡ÑI*oîX b”¤TZ`x‰<pÛâ<†k2ćê©àcé^XðTa¨9„,ÿ7«®0“Mb\€bN©#T§¿ÌS·”¦bÑô¯û?‰î)MîLƒ ÔÆXc!ýaO¸úÌÞB%¡¶­ÉÌ·g8¥yÆçÀÜ:¦,Fç#Áœ®©,{’À¡×üJ�ˆÌäŸ%ð‹�k†Ù-«‡]lù“ùa½ÝW(&nŽÊÕ™ N@¡u=OZ3¢ÇgŸÆŠ‰ÎX&›¸ãlFF3m´ -òñM Ž©•AÄ�²ùyuüˈӌ2æ‹Èö-GOÞrì=ŸyÜ{vŒ5®†É-P‚¡qKÜL€=1D ê‹#Ï)­E«*êZ�È…ÄŒÂñåÈ0)E™Ê©“µ¥áÐK¯)-“›C�lÔâðÁ[GÈÅån¬&I¾Ù4¿Ü ‰²E]j`0}x›ái¸…˜F8~Š#Ü,ŽcêÏVξçVvº ‡Ï‚Áí²m�eù9b®§BŽÝ@DÄPŸFq[¯i—aìVS5&Šä´#Œ»t�¾½Êß’å©t©k:P#bµXržcØÎMJÎ.X FGÒQ„vëœT¾¦F¤–ìûrú=’€“&|äâ­–jÜÀÖú”¸[KÇÑX&bž‘.`†y.«Å2å% m²È¤zXBt¼ß—(­Ù:¹É… ÷}88³V¡µ˜Íe",ŠHhä‰áCFt¸¥^ÑËà{m€ì‰Û„~=?æ-$L ½Îš{zjÀ�&ôì’i¥€ƒY ^Š ãI ÷òÈÃÔ í<· Z)©Û6ûM!U‚�²`.½À4•�»  0˜ãQÊBZÞ/hà̬6‚Ê—4M³J5Ã'Lû”„âÕøN¼x€#�ÓÇæa’Ô%r¦îÏ@Eášo\Y† #´«OmdG/&¹)†ðé%Ÿ£å#x\ go1¿4‚KÚ°h³92_bvÈNÝÔöŒsQSÔbþE ~·Çk„ò@$ CÌF®Ç_« ¾FJË™²$@cPB�Xü–}ø/�~¸4x[ËÑ$‹ÁÜB“¶Õêw¹�vÒ¥ÆgDÄ<‹eW“‰´+’ÄîìwÂ6>up9õw!a÷õþN[°~Ðq�G�ÀVÓÄ0¨'Ä€pÒyFb”EO’7e°®äëF¾P$óã 7SXHM±oyIf^¨õñž * °kÀe³ÙAsÎ=3 |5ïÕ+îš¡Š7ËRèêüCrí™É?×z$åwÜò> ­š4ÊQ,ÉîÈ¿+¦ÉξÅíî“„2gÝh¶!×5âŠS…°2G€óŽ¡äpŒ8ãü¯¹v¶`ƒ|ç[G¸jÀÁ!Ï—G�g˜˜2ÃÕž`®—Èás²]ŸZqº 3'ª7ƒ%qµA¾R‚tÊ�ö¬¸ÚHtÙ[­µ6ZQ–ŽV¼‹-›3‘é]ËÞ` >$  „óN2È„€�‹O[½Šº†8®—s e"u1ãD˜š.®ç†Ê"ò�æÐ}�V1Ræy– Ífó~ÄwDèž}ÛØs F�qŠ�m Í7NòPkA´Æ� ApqÞirQx+» BÅ.ZNá€×+õЦ#ŒÁs ‡Ø×$<œe[«Œyªi]8ëtð‚òQ.ù!1i`‹Áµ‹‹ Ä�ý\[à‡?v’ºIyøêAÉ‘÷f…K_I‰ÇÎ+—7:¦ô1’g)ͪm¿¯?£C`SO“)µoO1ŒbÑ–F­é³9­=ôÒ1ÙÍÉ¡r±‰ZŠàDmcÔV"§[¦°H ^)^SL …a¶âR4-$’elŒ=‡ÿåÙ›…{ §pwí׫>‰N¿¯dI”âMîhí�ysÁ-Ü*ÑSoŒ%Ä�ÊE•À0“ã^í˜ru2=yWj-»û+®Æ§òØVÑ6ºÐ¤ªÂø¶Úù¾Æ·>9® S¾©=€”Â:,têÖ#óËמqò¡W½íêoݳ“Ú@wô�…"å9\qÁº¢ ™ÀTÉÆKÅ& €”í¬:í>›n˜¦’ËJß9Ò�"¦Eª ˜>u. çØ zõ6Ä®!Î…Ñ)mF¨¯oBÓ(|Æ¿�ÚK2w-¤yDu�ê2§6Ã=fÁô8¶BIï+¼�ßÏ\¯8 ã×X†Ò ®ûvÿ7kW�VhH…%å²ý«À†g[Yu“ìêEÁ¡eIÄG³ÔPã3 5HÒZ…dØw¨9;É0ˆ-¿XP�!9 yõ¼ÿ«­YÈ5ŸÓl…xÉÇ‚#âË?›HGÙ¶)U*F±ÀËô³ð f x—CÆjE'2�©3LÔt`ñŠ"€v‘“©QÈ«ŒKêˆq~V]mç@pè°8U l¹‡ñ.|÷‰Sz=ÍAÝM¡z–™!¦ŸØèTŽô_Ÿ¸¸w:±VÉÎRj2Xdµ’«“4âfúÌKüÀó‰dùÄÑ}÷ï?¾²á¦o�»yý‰Ÿyâ>~ó�m"³vy ´HWT“;tÉNS[“ �Õ+Àhuy&m‹Y¾RÎ^U ν:Žt¡JQ°1^+†k¸srÆ­âÀVÔ·ûí’ Ñv1óÚ”øØrÈhÑ%ïÂ¥ÁÔpH£À\*�Çðb}‚ÕGû[6ª!:pä\*ó°-rý�1MDî4žÐD ŠË}¥NEe)!®ä“"@Ÿ÷W¹õ4§á`F©´¥ò[ö�ô®8]È~-5/¯pJ옩 ÎWˆh>ç[ï=ím7^rÒ¦ãçîÜ£d°E¿ª�w²î�»Ø›´‹(‡dŠÐtÈ,Ç—¤®Äb‡M°o8—>ñ &œqÈ¢žÔ»mq#–>DèË=Ŧôä§¾-K<Ú å´A.�‰¤X(L^Ѩ4"~óü¶z#Ë F‰ÊÆè¢ÉJ9«`ÆX°wb‘„ãZ©³¨êi÷µgœMßKÅV  7ÑId´Ÿ }ºÂö�>è£èðÛVC¸ÑŸ°E ß�� B-Ðuì$¸°°´¥ÊÏ�qÏ� »Ó~¬4³–®Éù2%uÇÄ¢Œ/ÝðâÂ@i‘1/¢+ÊäFØ2úΖHü‡Hà?ÝT%ÆC¯DËÕË�»ä›¢dÛöW•/¹Ï�‚g体I¡¶€\„ð¹‘2«NÿFkâŽ#5zŒ'/áœuà b,‹¡È|®â,tq‰Øzdˆ=$P’T±Î¡cš«aN37+³",ú¹wGʬv]Ñ|/^g‡�¢´ú0J„Ë£°d¨NnÑq&f]cdÀÁD¶eW õàÀË„ÕÇ—VLÐv¥!fôÚ3ò ‚xÅo¸§¦ûÚisš¼ØžNÀˆ¹c)ô!&ñìˢώ—>–6�Ž[ys¨; �T6k×2u«Ê1»^RêG» _‘ê§Mó"D€ <­ý°(&loÇÖnµxè]u1 M¶gmý!Ú‰¸°º-C+±±G„CåsY�ÿÁÓ � ¡{åļ¬ªR_¯»’øÂ6ýO8¸S—¢õ™ht¿G!w0, 'ƒL8ñizò,f\žMì¹óÖqA¾yÖ\2�b¹[2º¢+®È®:"u ÊäÕ«Ü5®}¼‹($‰dØR%ÄWÂäò^ ¯«ï+4WOÝÑ­YŒ!òóŒ ¯”NU4aÔ“âæBz­¤»¬á³ûuÉõ¯lå K:˜©Àd"t(_f•(X�Š›€¬hr=–ñì›é-(L9&¡?õQN°XD¬&,d�…IdΠ==LDÛ‚ðƒÀ@6ïè´¼`Ù5ßÀ2:æ�ö  7â+ 5‹æ(l”pØ1ôaÿ0 ͳ¸As‘9¬¯x–[óØ;í6ñ(:PÞ”¿` ™›Bh| Ú „7X- ±S!b¡Xqû¦×øM:pe¬üv¶@ÁŸj++ƒ™+LÇ O ï4>89ý‹zà¤+i'\Êé 7’‘GÊP$PQ`jKp=3_m!Á˜YÜÀ˜"†>…iB(4:bFDj¾!xŒè~J�S?œ…ôÎQAgotc&#Ç©þðêârÜ$#fL)euïL|¸ázøÏ!A3‹»­gæƒG6Þ|ý>âÎõ³•L»Dˆ’è7S8�8"Ê„âéŸö ñªâ ¹$x¤,«¤Ö•‚R±3¹ÿµ­©uðæÕY…Ãñsá1,AÅêL³eŽ0=&ÎYµ¬éVÄ ®y¢½buŸìêÿÝäM£9몇éc£.î!ý.uR_ÅP^o•+Ðx4z‰,c†1–køh&! E-ÇS°¤AiÒ&‹Xñ9Ÿ4‘ý¢�%+2Ù¤™EædIÍk¶b¢¨aÅa¸wàèO"HP¬EÔŒY8 Ú#OÄ·VÓ^5œƒ¥Î›£œ†Ù9».PÞÒ�ÕÐÛê @²O:�!¤ñ²øA‡ ÷œbÄ:Ÿº­æŸ¥0;È‘!(Ji(Ïþò>„.ô¦%LQ+hÎA\3 ì­ƒáØ çù“ 1…Äœ…QæµÓÆÈ,«$[©^Ú̈,Ú#˜|tŠÏ_ÞåYŽ¥ ß64Ùwÿ¾ö´ë‘÷Üò’+ozÖ%_ùð—yôøóy˜|0Ò‚nJœÔ’ΙU�]ˆeC‡KE²„ŒŠ¾`&§ÊaêßçÇöÑ®4b’ø} ÎBòÊ}î®`§½÷D(Ë%Õ:Äü¦² JË]„Íöf¹ˆ)s¾«W©IBŽ®Ý²“ Ÿ4¢bmÌ#}YHú l¸vµ&NñØ™zTnÎñ¢úAóaήBiöÉ(LEØ›4G=Ã�«ST� ¶0Ï`sSX7ƾÙý$ØhºÈijui>‡Ïá,Øî´ðêÀ «_öÉF£>QW’lQFâjòUòµØP¯LkM<õ^š›êfª<õ>9„á?íÐ’b�Þ`hK”ïI1…ÈÊ;7$<ÁÈ,IoäüÝ—­~°™®RÑ·ªDuÖQÈïŸ%#"¾êgßE$Çï¾õÀí<[²!f:iãñÃ÷o„3�šFËF±^®D;ç�êZ”Œ©èè)@v:zo±Ô˜îõ�×î[ ÿkùu/Ç9¬ Ï&îjí/»OH¡ÛÀØÿ üèåaàó>ILÔBvH2Ö’fœ}_Çvœðªb'ÙÕ2lÇà?Á†øÆ¨¸%¾8Š&•]½ °cS•DÙÁš* t�‚G»Ž?‡GSÙ�Ð|U÷›Eù ex¸±×òMÈ)d(IQÆEM«ä'¸{ÕŇÓ;h-¦¹%™\)NìNâó¤¿ÔõŸÈѨ;g¼Ô pž pÓ˜yx=_ a³FÜX%@Ì3�ãù›« ê 3œ±�2d#p¹×"Ú ëE„¼Y6⌀„ë» DëæcF¾¹4Ì£ªÈ5‘ Ê¢ Ø“½‹Àu ;õî~Áùµ–Á†²ѧÖ@ô"8(ßßa{–zz†Ü1–ý™‰~Uǽ€œ÷$‹ÅP¿è©¬˜ª¯U< ãš-�ÉWÓ8ÙÆ}d Be)*ÖóÎçâîÑñ†cˆ^cî1Ø÷Œ:½<¤ÈÊq–„ùJiè‡ ;rhžÚÌ ·2Ü ~áLmÜ8¹eövIïù~‘¢ï%u€� ž>G²öSssÂ4_N7zZÈÁY€¾<+Ø3g5öÖŒ6Î0S:b*Ò$rU EÍP:h{Êa Ðzö‡ANÔ­‰wµJü�Tnb®;µ¬â0Q½Eóö~iáŽÔ·l§�¬ü°M V`pqü)i¡:l‘°øHe:áoÉa„(ÚÍy©F)ð(T1&¥A‚ÄÛÊ˦yXei²G¾K|wDlæ´‚ßcLü#§80‹¢:L]­åX Ä¸ëÚÅÝ2SÊW`®›-ˆm^Œš«$À B9S5Ôf¨1˜!rdòS.“"|ðlõc²\Rb�ø�ŒÕ�äS¦LÓ¡~áÇ«ŠÄˆ ˆ®¨Óù5ÆQEÒ¯…>[ÔŸ IDAT}u'Ëh·…—Äñ¿Å]¯•Õk[ûb½a‚êè�—Á² €=F ?„%ïÙÑS ‚%…EŠÝZ¤^+ŠÕ0Ï`E %t;ƒ½¬&Á•åþŸý/Ê–’ª÷îP+ç“}W\UŠ¥ë°hTâÕ=~Áð­èÍh†šdˆµ†d%,¸ŽÙhCâ¿Å†®†&…ö[fŸ­<>–e±™UÚzÚ¹ŒP¢s¡ Ø3%SdÃYB¥˜z #¢]‘ìíSûcXÀžsµ"fúiÉ0~‚»Æ”NП „ÔìXê -Žëj‘¨×Wæ%à*uA0î>Äզю£–G‹>w3MhÁ€‘Í©b–Ø8T)ÛýÊÐXÈï&Ù:W>0c�ûçûÞÕW ²7"2i�1SC´¨=V’UTò›“B,00hX`Ȥ¬5¾È¶%'÷…È>Ÿ¼QZ>„Lm”¹|+Ȇ”tªƒ¨€O\0`.›ñø\±Íi ¿-j6£uM s’Vµ€ÿ�Tû¹S_d|¹*'³YcÏs!AŸÊ�v„˜d.²<¶¯©¬)òˆ;•×aòKa­íÏÌDÒ%ÖM¿m–`ç¹£2ûÄ4Âô0pýÕ»&Wû9õî„ ººŽ¯Ã�ÌÆˆ«.©p|öž¢œ°r—v›2'9VH¼…×»†Q8~1†ÑIÜ�Y6ˆ¼X÷@¨~u®ï�Ù\æs¡yo=ÖÇ„+5U ƒ�‰‰˜¡5„¸0M¸¡ºíW9€! J É\O´Û싼0˜˜³€Ø&Ê û�)éZ™¹tôg?°‚… yx[@4…£‰‘5y1aÌÐCl/ ‚™ ÒH\) qb]M²‘DX¥{­QP¥aÀH4¾8rª  2.Èäšœ� ·+Êä=tj˜¤4h¸ »s¥Ræx^WÆk’ž(71Hžº�¢#1BDh¡s˜ö¤!Δ†Š2Äæ¤¦MP¶ 1ÒRÉî©É²t¡Iã•å)í�žHß#i‚  ÅÔC8$ô ¸åîŠý–ö‹óTw,5ˆËÏ®8¨P†iŽ·¦Mœ÷INÅIa-—B>�Êô�¡lq§›¨104¡¤EDQÕÚÔ’¼pŠ� j9 N@2wÙ—!—u³c{ve½'F�Sf’™hÆ4#øZ'8¿�­ïU²XH·Ÿ1À;²…´¢èOSi\º6žtØ"˜ïuÀT¿UO‘OÀ�7â±X¦1—šÒSuª-àÓ/Ϊ˜†‚µº}1Že§ f®pÅûu 2ÄÄé w§g«©‰ù—d"3ðÚhr‡}Ýâ°ºT½62ÌüÛ?ù‘7ÿ»kvn;ø†—^ûûÏýk©åì܆´Ù˜?{ìV¦Ô{ / ›6,ÿ×_zóó/ÿ\Æ1tŒC=ñT�Цõ'´ÁrÇ×JT8ôÛ?ù‘7¿ì gœ|èš_yÓ<çCÜ+úT²ŸCÊ…ˆè çÜuíKßøžßøëÓ¶. N™]¯a"¸h�“P{Yq¼0�’ç.ÈŸZMªXƒ "R#b'T¹{ÖýsÔhQ¨M Y­š}ú7jÐÕÒ“eºŸÀ4ÚLœ Cø†=ÿÛ0Õý“Š;OC1»™9/~‘¡Ž×”›([©ÝÄK¦bMCÁD4_žXÈN‡€rç� î kð¡ÌDÔr%™§HÉ"ã†,NÊT•Ff�Tm$Ô‰adÄ1™–AÅ‘‰ÿ˜«®I׈㥻0ò€@º¶�)Ûyš.B,2ÉQ'0‹8cÈúuZÒ8®ô0$lÌŠXšk4¾u÷àà3Ï<{íÞUûåRjjî^ÐÃZ$¤PcRpiÄó¹ì;¼åб�‡�o:xtãþÛš³ ËÅÃôÐ<S»e7«­ Ê«¯È —éæG‘ÂÒVƒq7¤÷"›‹Ôe{n$¡ºÆ�¶ùH+ÑdܲéL:à &[5è8›wppKà,#7übCš³ælñ”ª�’œ¡.T^Y!Zø®–iàK9I`È£~k®~!ž);M!ü?†G*ÊŒÓkˆ»F·vçú„3?)å³ep=ÚÌ®5•/޳4%ùouËA31áË~ XŽÆ\\X˜m{7!£Öb”»Y¬‹·²S|[ÚúîÒ8j/�|f†³HÖ¨«¹$}�¹~µN®ƒVk·ª}€–ãî›B¥? Ä>ºïðæG7_^:ptóÞÃ[°å‹Ï¹óWžvÃeçß~ÒÆãÿ²ë´?ýû+¯ûÊ…D´iÃñŸ{ò§Ÿùtêþ»îÛþÖO^òƺôø‰õ›7,¿î%oûÌ-çLüöÝÛOÚx|eN7ßuæwvïð»�<ûžÿò¢wÜ|×Y/û¯?½çðÖ Ï¾ç;{N%¢ÙL~åi7<÷²/ýûw?ã³·>øÒó¾û{ÏùÐÉ[ŽþÙ¯ ¦É‹¯¸éÿxÇ¿úÝ·>ë´“¿öÅoÅÕÿ­kò_î9íç_÷³gn?ô_~þíoùä¥ïùÌc‰ùð± �Ãçýà—ýê|í‡ô£_½à!;öýáOÿæõ'þø=Ï‘Öà«ßñ]ƒ§ÿüë^xÆöC¯m ~ö±D|èØ†¹]|î]/{Æ'þ⺧|ô«lÙ°|Îé{wØæâh,Ï…ƒå°aZ^^™ÍçÙ}™ž:f3"&™k|íÙÇÐ^Ÿ™ÒpÄ1ËUjùœi4ï‡7¨ž>zÝtÊœCQ‰ýJã�Tæ§ŽþÖÈ“b#;,ê¾¹xAÄýPx}ÿ™à/'ÝÂÊ ]ƒ‡âb´']ÈÅ;V°+l¡«w‚FŸsj§ð Fn$N�Ás'è€p¡ù²Ì–°….,¨1†|'>ÍSÁpzm)©¶é&v>ð ?+æ÷8*„åƒB�ò“~ÜXcߎ佷Fʨ•C²ià-×"qãJe-¦3ŠÄ¤¢2ë$>1ÁEhq=@‹ã~Xæq\2`8†bÐä,Œh¹ÀêÚº%0\×¼ÄÌ:Ï.Ó®ÉýYÆb`3¢BJ'ÚpÓ-çÝtËyDôÆë/skg–«.¾ùèñõðö«ïÞ·•ˆ¾ù½�íî'|ænþ›�?ñƒ_|4‘|ð‹�|ÐŽû~öòϽõ†KöÝBD_¸íÁüÒE++|ï�mŸ¸ùOÜ7·n:¶ïÈI÷ØJ$+óÙþ£›îÞ²’+rÊæûŸÿäϽíÆ'¼åÆKHèîýÛ^ÿÑ'þêO|â¯?vhߑͭÁøÒ£WVf÷ØvýÍ�øñÇ}ã¤M÷ï?²åÞÛˆHÜwrSÏÆäl&Dô½ûN¾kïv!ùæÝ§#Ë7ÞrÞ�·œGD×\™Šv„_ÿõ‡?åÕ/ÏBÒo-¶§‘ÅUg4g |êÙù‡R¦ôÓÂ}uÌa0Ó”u¤hy÷¨‰ZºK‡Ò kJ˜Ó¼hv>r1C1v±£±Ú.ÙÇ}[ýÁ„¾ÛȈ›�´)lšxZa+î`R%Ö>^Ç`<>3: p±ßK€Ùõ.ñ@lî›@LB„“ëio%B²L´D´Š_CÜBçÐX(4ÿÞ’ºž‘°�÷®¦mC{Ë´–L¯PØØW“ÜŽÐ×¢°Q­¾”’ mÒ›]å\MºøÊ0%D. Ë› hqT¡Ã?Bg.Æoäò½úùpKÕeŒP,ZC7Fdt�V™V�Î&ëÈÖ%ëš]êã4Ê™.ûÅ"¤æ¬RÔ#Ήë½‘ÏBš#{E® ®£óüágì¾õÞÓöØŒB"¢�ÛmZâæ»Îð+_»ó¬�ëOœ¹ýà¾#[ˆè޽Û�//µ.ŽŸXšÍæ³C¿6RèiÛŽ<øÔ}¿ü´~ñÊ›Z7K³ù‘ã¶m>ºïðf"¾}ïöãËë¹ÇNÌ–f2Ëï‹ìJŸû—¿éŸ.û/xß—nÿì5ÿôƒ×ýü+KÑ0ö)$6:ŒºMÌ–æO|Ä­"ô½ýÛäëRCÍrӦљ@›¿1ºž Jm€¯ï,AòÅL+ÁŒBÍxÚ¹ÑbÅýçB¹�Ž�0DæmµÆw¤£6Õ™kà©(š"°hücŒ²„Û-$¨3ЇÉwX×­(s_Lk£¥þ ’±²»›¤éÒð¦eX­]³7¬¶Qa¡ùZvT¶!žÏy¦ =ö£’2¼Çµ ¬ 9dFÚV_�!ãä,·~T-¥t@úpWÄx÷IêTr8¸dðNEk­…‰ç»};}¼åûC3¿‰–†¹Ä ‘UÈ·-ø-2t+"ù ‚ôãìßÑĆF9³g€�S¤JûÕŠ�µŸµ¨põ®xk]{6Ž�DÜÄ™w.YÃ.‹³ÇÑ•€á2IkF¤PÜ×Ç´9i¶®„ˆN¬,YwEíL´ˆ±pµ•ùì?¼÷éÿý«x7+sÞu`ë†us"Y^YvA{ÆfMDtb¾îµ~ÊßÞtñÿòÄÏÿ_?óÁÛvoÿÍ7=ç»ûNéDü’ —IQ¢(M'iûIGþÛ¿}ËÙÛ÷ÿþßýëo~ïLh08Ÿêu*›š× µX*"—ÜÈ"­„•H 9�wf�y­‡N ‡Êc-B�yµÙ½ÙÁM_�î:¿n·Áb.Ô›gPŠÍS°ÍVÃŽF-Þ•“Y�ñx«)\« ´Mqñ: (âŒ�)-Üöê‡8­Ît¾LKë)�´tç¨W5” Ö[Nn�©ÖÌZÿfóWCJ×r«NÄi ¼–]̰1ÜÆS¯„0x¢@Y�¨rè|R(ú�€�à9±–àÏ Ø&(T´ˆ¤iý´4V�wŽu("œbª'õ`ò:(ûq·§I°»kzëaª‘Ž÷Ksh~ƒ©W½—ÝRÔ˜È�LD£úÄQ–nß}êÃNÛwêIGs |Ͼ­G�¯ôCîv›Ôƒï9¾¼tÏþm™�tCbÚ¸´b #D´÷Ж»÷Ÿ|ÎÎ=ßÛwò�{¶ß¹gû�{·wß)ËsŸkŽÐÔIx.¼ai¥J‚ˆˆî=°õµþ‘¼öç|ê�+.úv׆sFÉRE¿ 6äu¼èþ£›_ñ¦ŸzßçóŠ«?ö�ûú’Ռ䑄�4�®©šÉÖKˆã|%V�Æ¥ÍÖ+'g>rØýóšIá8]®“ÝžüÒp .¢��Ø– �¡ñÙ3}œ|ã“-¶nïSR˜)¬ÉYÎ0mù&Â<�>9(ôæÓCÍÚ!8x͸KÌZïfõ1BGY†Š8C v×Þã_4—»*~+·×Ï)Ý™2C𡑤ЌÚe}ùTLlÛ0å2´dÊ1o¦«S5„UÕšµxvž‹óˆm¢„£yWk•‰¾±RH@üO«hÈ Ý…7 H8�B[ðf;�²ÜËÜWŽ¥Ó <|éÒßÐeDzÿÕ¾Ö¬\~h;D¤e‚­6Ôl'Æ˜Æ ®ŽJfUÜJ¦4Ê0¸®ûÒE;¶~Õó®{¹w>âÌÝO}ô·/9ï"Ù}褿ÿÜã^ô£ÿ|Õ|}çɇžñ¸o¾è©ŸúÀ.º{ÿ¶¤dÉg«Œ�_ϾmW=áæ ÏÞµsÛ¡‡�¾Ÿ™Ýô–.yö¥_ùÕg\ÿð³v?ì´½O{ì7~öòÏ®Ÿ­Œ…gt2óáû×ß³oëUOøÚ…gï:cÛ¡‡ž¶¯=Ïtéyw<û’¯œsú}gœ|ðÒóîܲñÄžƒ[º68„Ç}ë†?úó§=ö›h^‹ªÄçü/÷îxó'ð¤�Ǿs· ž0»jàØZ¨”A"(PzÊV£E'â6¯ܺja—£ydåiA}]ýËÆMÇQsâJ ¦˜=­»$¦^%U $Åì5#05¦Aèäḭ̂“q“ cœ½ó†KÈOÔ½m-°qQýX#*&Õë…Ê#øl%g˜‹þ¢‹dš¯ôh …IE; Ût Ђ —Ö€A/âÏ:ÇÉ€äÓ$]”’Wo„˜½Å—¡Ô�,<äsÍó§qAj ¶ì#5½¦[ÃX“çínš’&Yµ ,Ä’j™ª6�_ÆÑð˜U9-àCµ‚šÌìü"úU Mè]g–?Þš.b7#¢uD$2o�3‹Clÿ]‚bö¬A¥ÇGÈFc"K²a‘ð†Ê}á;gýú5ÏýwÏøÄ_ú¦Ùl~×}Ûÿì?ú9zÈ|>ûË�>éÐý~ã™{ÈŽ}wï;ùÍ7\ò†OüÐÊÊŒÖÁ'¬À®tÑŽéð±�üîgüÎs>ò®ßxýl6ïgûª·]}b¾î�Ÿþ�ýG6¿äÊ_rå�3–Ûv�úÖO^ºB¼…•]\ ÓŽ×ßùŠ×/Íæïi ʺ KË/¾â¦óÏܳyÉ;ölÿ«ÿ~ùÇnŽœ3©¡ù^ó4a’Y/ÒŽ0üb"ýîlP¦D_\�±ÊéüÞcqOR`û !ÊøW†Rp™Õ·‚T4†!âš�{Œ0ÏÌXù8iFÌÍxÈÂ]øQm<‹âÐÁmúkþG%YŠ;e\Ûµ‰*dðbƒ·oLñ‡ˆš}òFd/E {¨‹ÐöaÀ:+‘ÞðxËU«>'âù‰¶gØ{”T’Ý_ggš8­·í*&r •ÅùÁL€-±Â–¨�oÅáõjÊsÆF‚4Ü(‹†ØG ¡r¬¹!Sý|P[�n˜Ú5÷wÉ P@8¶uª&ybG˜*wqžÄ]ßÇÓ­†^�LÚ›ÎÒâ2›Ö! úu«„›¢Çš’GhHÄ�œ' îI7´Q„¯~á»e¾rôÈîÛÞζ#>iD85†Á€6 ÷ V=#f䎦¸#’ ½¬ ¹w#1bˆ$º ³ Ëõ+cMòÅi˜ÔK,ß9ø¥3oëú‘p?8¦®/<†�yîé{¯ù•kÿðí?ñ�7_à¢rÔËvÎ2H4Ô,®SÊã!yp‰;(°�iîù«k{XdT7|)ÝtBÒÅpi‰ö5B´çÁ ^Çe¡)eR“p…Œ4–�Ÿ‰ “Ý$¤Û¥™c‹Þœq¬ý­vTd ò�¶±6ïQªòˆÞŠ å Òåú×mjk£4Q¬àˆÑ§¢{r1“-dž֣_¦Ô¦»îJu†Ï¾�B->𼦩g/¥©ZÓ%“¯®—àŠ觘 Ø,ç}5¨~aòz0+NïÕY­‰è2Ì$-~âXû‚ë{L$mÍ5M@±%‚¡€GMoð“RÚ‰i‚£nˆ(¶Pùžíäk¢�,Ç9‚Ã’Dâ ÁqU?óÎíí8m®]‘µÍ6ôI ›¶;Å2ˆ\;[FÃ]»9~jSktÛÝ�V¤m2Ñ¡c�ßpÙùw¬[Zn|²’ê¹Ë=±ƒÜó8 „à’±¶sg')ó4å3k}òÝ@†:é^”E�µ(6Â$7Á|<7äÊU{ñ�ÏÃØ‰^�ÇxÔ³’eЀ{æÀ§ÍaOmTEM‚UamÊ6e:åR™„&{¶+ˆ´–,Ò /8µL‡ï€m"©Ê#¡Æè� ˜›b2P0#]yµ‘Ÿ|_@(ùxH ¾Ébps9\°2æ‚aIÕ�µÿtŸUüRÒ˜ÿwJ?áÇàçb>ø.O(cÀ”¿Qe€K˜¥éÎ:ã.T9„ ÅÅ¥»ùz([îÐeÊToâ3. ¶Èy®}KÂ3³Jèxû.¬z`9δ–‡@88DvBçØ½Ý™ ·ä 29ÙT¦¬«EÉêCD|ü¢+vùÚµ`»©ë07͉ 8g#ÓQ[û!õ,§Ü�ùxˆ?üºûÚÖ�„3––þÍ~1:ßsè¤?ûàSŸuÉWßõsÚ¶#”‹…;IÎWûïÇnjØdL*n½Ïد‚4ØÇª Õ‚.H&›¼�Ærtê�€mÅW7Â�Äh^‹UyÞÅÙçì>ÂD­mAT°²×É\²º4&ËÓØ&©†«mäÐ[¨ÿ�C<á�¦Ñ@†/C ù�m¶mÀì-ØÃ‚ÞóXÅR0zÃDF@×<}„UÀ1µÆ |D¬ÙÐI0oý„ˆÚOη:îÆ0)î9&ŽœKÉ·H)dêÆµÌ.Š¡h}fÿ¢‘™²HÏV4Õ;ÎBï}¿Tû‹ò4™Ì Ükû ¨�T ü{f"ÉÆm¡耣oÆQ·ý>jÂö©³ÜBÀš�ôà¸!"¾úï�´°áVˆ°2‹þ¦Ò aÿÙµûÒÆ ±ûƒ)v-6lBf[›­#L¤ÉÞ)5`³‰Ø÷õpÁÊ�\x~ ãå3Žô™ÐHhpúeþ°J’\çŒ?q�&ÑÓ„ær!ó­ï?tÿF‡u)5rF$©EB¤ûí(Óáñ�ãÊJÙ7I èvñÂÝ´1»¹ŒQÕÀàòVn€[ÈŠ•õ:\ÁCI ’-ýA§6i ‚U…`¬‡¯-̤'nK<ÑaT‰�#‡M.Ã�¨^û‘†x¶¾=“ƒwÁeE7½ X¥ø˜¦nùaTM‹�QÇ]¨~ù™ˆRq�_æÞsf饊ªt…»2æBë›èÂ87Û©›4�»3ØÎ¤WeŠÕ:;êÇÔhß ^¬RbSc jŒGyÍG¡¬íLd…6^04Ž:2'ˆˆ¨Mj#/ÚWùHÝD‘8�S¼Q7t� ¦=?Ó&¡L 5üR¤'X±v%˜V·ð‰øjÄX»±9G 4IÌGÅ™Bņʒ»Gy0)Wdðˆ"O¯�"tèØF™Ëè#™Fáïè$Äï~H¢å¾Çá•*ºè$Æš­ª±@#ç¨ƲôÊ ¡Iãì¶æÔ] On“•|ãZ²èørÃ5]4.FÈ Ž¼ÉWÕ¬½ƒD&ËÆP ¥©\�4DBJk"â7%žNðæô8¦ÝÆu²²„Ó�‹CëËò¨âˆËóåq‰Ž¥TwÑXkŒ‘{i¯Žë…9ŒuLûZqF-¡w’õ,Cµ·Lt€‘ ôf7eÆŽ&µP ã 6Y¹hÜþÕQ0#.’¡¢YÈ`û¹(ã“E*‚꧉è8 J:ºž¢€.–¤§�è #î-òºý1Òçõ¬íºê$XeN²(ÜFe–èCÑS§ -“à=d‰û¶Æ¢)°ð8ClÓ�­ *Žëža˜4*ý¥t1So­²x³ŽL®>õÄô^a(ãt¦«§#pªdñP…#�9Ì™›c(L€`ZB1Ä V‰]+ù>S ª‚‚)·ÝÃÏ`� IDAT¬»Oh/R5ÌÔhñÆ™úSk+”W(öß®á°Ä€b,&W;tdCM‚MÅŠ 6ÊžÖ*¹øYdÖ“2ì :ï4»¶Q�¼™«ÈÊ®ÄtV‚Dÿö@&£hŽ(›vYÇSÒspk@d²Ü–!ó�ÈN7©úMwq*Vô8±Ü,v� °VÒÅz+W]ƒÉ¸3ÙøSc¬¤±£usªâ/&$“¡Gåáýzߎä Ã=5‹Žþþ4Úö^Èä=¶Ðn…õ²uÎ +ÍÝ3ÑÌNT5«ökòtƒKè %«fݱ 1lªÐŠ%ÿ¥�K|¶_“fNÙ!–ì›ê>5H›ç ÕERÁPà¶_d®vU S(UtåGÛéDY}âØnuŒšnº[b}’J�p"{¦ÎБ¨ BО(J‘N2™à‰½ù‘ÑOÛ [›àʆ«>.½Ae×]�¸yínED2q&çöÍðŸŒÝk2Æ6j–3<¥Í’7šÂ¾¼�=¯ ³mÂiÃn›ÑàË"̵ ´Hl6êx"ÉÛ¹Èg!�3"Ñãx>™HÎ$>䋲+1yªÿǃë)ÑÿÇÀyRæ– $‡[¥ÍNT[àJ"„«PRþÓ‹^?Ò@ýÊæ¤`¿ ”Ï=£—t«3÷Åœ‰sJÁÔ·³+]°&ím‚Ú?ý“ê¤Á„¦6«ŽýpÀ)¢´PÊþ–»? ÿŒ©Êµ€NDB4k¹f§Ãˆ?}thf=�ÎM{E[gLc)U$æ]PC:¥ñ ×|°Y¥>hàº^ “ä¥]˜³ÁÈ®wϘYf™c×:ÛûcA´´ÒidçåF?nÌ–È݈éj k”±ŽÚk÷M½KŠÂ(Êk?hØm8%� ¾†Ðûª�Ù”Åýa³â=‰¾‘Øþ ïãH¬.Vtµ% ÙfͬÉñ؈É]œMõ²z(ŒÞ‡ÞˆUÇ®£0?147wO®ö.ß§Ãa®>¥6hqðF2*¢ît�ßTú¥žôe¼‚E·,‚‰£8¢¾Š —Õ'|X€{â¾L´ýJ\±è[ì é + FSÈÒ‡„~aFõ倆ܳ«eÊÙ�ÎÛö†ùa?Y°Ü›“q™Â·°Xr¨l�$’¹Õ躋–Q³‡Üêeö„õZArUcYrˆ™‰ð6Èmlúh{œ¤‰Þð¬`D#É7¿°aV˜1�F¬­|)ПTáEùf×ÌÀ.¤PHL?Ù_L ›­0 Ÿ½ (a\Fg5àr|HÔ0‡@®ª  þ&ÏZÓ–4�Ç;KNØÃä�.›½Eâj€%qF¤/Aí»42Ù^ù™7 ©MDPê()ÆÂ>©÷ïƒÉ�âô�tÍËÞôÏýÐHTx 3Z’fÑνëÚ—½ñ=¿ù×§o;L£—E©ÓÁbá£~Ý“xª’þ`†¡F‹pøª–>`�· ä]›ç £¶),Ìí†ìºókÐU3v=MÉïptãñKû�l¾ïð–Öá�<òÛ/¿ú»žôäGÞúîÏ<~ÝlåY—|õº/?ò•o{æ‘c¶sï+®þøåÞºcë‘{÷oý»O]ü—×]~äøú-Nüå/ýí—¿sö¹;÷^vþLò÷Ÿ¿èÏ>ðÔ}G¶4Vî;|ÒÁ£�¯,í?²yï‘-æ}Õ{]ñè[^óÂ÷½úíW}ð‹�2ÖÅéœ:¶o9¶}˱÷|ö±·íÚÒ$_�smàî/ŒI)�›�äâ¨/¥�œ­ÉC<^íM81èð¹Jço¥á]o#x÷’¶c£L'Ø7ä¨â‰I` È¾SOk�†(Tû%0‡ .€¹ÈË}�xw†Äb¨�FòœlîÊE.ƒqgX°ÂßèF1a§¹è­ÔŽe¡UDlum¬)Á¢0±ÌIæí;9½ëLx ^¹ó(œ;!‘8q¼õ¤Œ'Q%ßòsC/s©n¦›7 º\jL�cÌB}YàãJO».á²�6MTÖ˜ s>™¢ßvÍ÷‚kåi0– XœtV:Rm¬,Im&ʺõ—íœGÞxmÍÚçê Ê[„ Ó¬·5"j«/3"â¶­Izã³weÜ=++µmÁ4ÖqäçGŒVfž¹uó@¾ šµU.3Ø´U%õÎDÄßÙµý«wœ5'þú]gÞ¶{‡7}ÁY»®¿ù¯|Ë¿þéú‰•¥½î…Ÿs×#Ͼ—ˆŽ[ã7Ï}Ñ_¼ðI¯úõß{Û3ò’¯<ÿòÏëÜXäOúü»>õøzÕ+žóŸ~á±½û7Ÿõ�ëfË�½Ûw�òÕ;Ï^¾ù®3¿³k„�L$sáå•ÙŠd½¨çèM„Hfúù¢Y¾N� *ÁJ=ELvîè\Â"ÑJèU@ŒfabUdÍGDXdNÃvc!vV¾lG·€‹ÄTÄf´aFàð|½¤�ÞMK¤dh§y2Xb'[9â 3†‘…‹êßpfì˪x`Îhð .'Xd·ý £E�àÓðÖaõ¾Øü\j8‡Þ{ˆ¤–"¶ÑIOTdÓâˆíìëÄö�JÚld«OŒ”ScÐQ#ŸebÐÔ#kù™Â+¯-ˆCx¤¶Ï®ÒÅ  >‚ Äc0�ì—+à.‚kû;0²£²:e¦‹&ü†„Zd;û²Â®+Ô;7ÍrdòŸ¦zj@ï™Ï–†«oÞµ¿al�ØÎd2ÑX°Ñë\.Žødi²—´éŠ˜gâ‘­÷W¯�ôÜ$m ¼|Ü@1Æ2ÍD|Ê( ¹é4´rӷνé–óHäšO\f<í?ºåS·<ŒgóÝOúÈ—.üήS�_êÖ#D´ûà¶¿½ñ ­��íÿôØo=î¡ß�úò[ç~ìkç‹Ð�{O¹öŸ.ùõ«>qööCwìÝND7Þrî�·œGD×\uÇ'¾~þSþèå.I“Ìh…&gÅçp]o–¡ÐeÍÊ:�ÕpÇÊ%�1œ*&²ìÞT�ïëôw'¸¬ƒFÏ>õ Ô'µÞ&üõ£I’!¦©±¤¥¾ü'^Ï>Ê;MFÍ·Ž‚kØô”6@‘;&û®†ÍtÍÎHg`&�äJG‡úGŠœÿWØW“Cj’å”› b �1÷LQÒÁZ$£¡Vš/ÓÒzó§©2åæó¾¤6:>au…Æ¿bï¦7‰áð~ÔÞò'GDé&ëT+zÉÞ ipö1D˜Ëñé)Ürš±Ýá룸c nw–.Æn‰ �¤ 8Ç}?ÆMyyED}ã("•RΣÎDëŒê¨Ü̇*YŸ@Ûc*Fj1Ыæ  Ñpº@°2¡ëêeàÄóÏL$½zZIëý'–Û¸eÓñc'Ö<¶i.³ù\mî´m‡éÇo|Æã¿±sÛa"Ú¸þć¾ô(oè»ûNY‘uíüž}'¯_ZÙyŠ‚«ÑÓ a0¼”õ¾¯B$2[’~Ä­"t÷þmq9†)æ7v#Ü ¥Ë X]c]j,¶x€0ô›¦UB(ìïû=’Ó— )t7¶àe§-îs¾| –§©„´pz×ewJð¢ÿ.@2qJ½R¬Š —…)âBL;AhÞ3`8‚k„ÄI1{ÍòN«[·JÀI;CáÛÅHº#h ¢^ìÌŽù ÍÖ™"ŠØ Ìm”5„€•dÁІk€Pö•)RCHïê[�ßóËax+�_ V_Éמ³ ±ß…1\xÃà ˆÉ´Õ…2ÒÃgÖÈ"&šG A–`›õ:7XÄ� Ú xæ �\–„‹,ûŸÜ]Q†dêgÁÝô’í®[-uøZgç!µ™i¤‘ä�1 k ¥Î²@­¥y.‡U‰,ÞìƒOäÂP ²+žf"XqSƒg"Zžë8­Ìg'V–L iÃÒÊ«~꺇ž¾ï×þÛó¾v×™2Ÿ½ò¹:ãäƒ>ø––ÝfK Ä;Õ“ 0¡¡ã“—JíÔ­Gÿæ—ß|öö¿ÿ·ÏüÆwÏôbÓ™: /»öÖç†0n½VªbËBf¨pPùÕ5É­ÛÀâ•ÌK;-Œ.{|…›½RÆW܉Ðæ#š~Úö¤ªS† N¬uÀç�ÎC«Àð¾âzp«-d +HÖñš¤o< 2…›@7L.„jž&÷Úª?Ž#JRV•Ž3¯œ Ù:¬\šlx0÷T¡ÍÔÄu ì!9™’÷àè¢Ü"ôWý‰¢@ÖM×`Ã"bþÀ4¡ßò0„„{©–)0÷2wÆí„ÙD‡ êÒ�M9 E¶e;+©2�Þ& £$RØG'Ü�¸¶%¯4ÑìÈ@WÅε «E(B¹Î„„ç2WM‰c^/hSÚ6ÑT0bl Ç\Þn ¹¤Ü˜Š�&ž¸u z·íó)m³ë¤ôLx¥àÜ Êu"¢m[îôƒïùÛO^üåÛÏZYáõKËÞ±Kž{ÆžMëO´óóNß}bei×�“Œ,Ø,?d•ݸ4¤'4Œ÷ÝüŠkžû¾Ï?æÏüLJœ¶/â" ™p6*†@‚¨Úþg,ô¥Ù"©é©LJ„…(ŸƒQ¥cÍJ»àhž‹s·Þµ€·Œ<p]ñõóïÞw²µ–FöOýØEߺáÕÿ÷Ó÷�Ü)æ ÖÜæœoݵãÍ7\zÒÆãß¹™ÇÁ,¢ZZB°-™îÎ|AŽUí’zµ¢ÃÅ�¦úKúÿï(� ›2™ KVdÈ}³5¨ÌîæR�à™»Ljv2&çXH�m–{ïçóŸßÅò|©5Gö�;:m\é’™»S9C›AæÍ*˜e>#"Üo›ML±Ô~t]‚m”˜`Pm]Jg’h: „ý�ÖÎ?&=ŒJ*ÏcêôlÐüD‰zÕ [@ ^ÐíÞ³/ذ”léÚw#EÔ¶F à’‘Q(½©\�”�àn¦a>-ü(¶ÞŠsh½Ô‰†[º[¢é"©ÚŒ[÷d¡ŒAŒæmMO|2'2¯XR-Ò.ŠR%+6kO/h4d‰‰‚ót}ZQ'ÒtÖ¤8žgOÛ€› 'oF¦ÃÙ;èe™C’½Jª`ƒ:Å@d§0k›²n±kAp¡_Ïi$Ì“Huy;·ãTû<Õt¾¶K†¾1ÝÇmOÌjñ*†©Õ\­R—6§“É=ðMîF(�c\á«ú�s–c‡wÝv俥Ê.%Â`Mh-4øóv½7K½H&4ŸØçRõôž{€™æ$æ\±‘m¦]%ID¼e㉿úÅ·~õγ^óž§§è35(‘RÎYf§µÃùŠûæsOßû†—^û‡oÿ‰üêc‘Á#Õ}·‚\j$�Q'3oF¼(d)ÇÔ.èªUßß�µ{¡åˆ#§�Ö¶ûÆ1µlÃèïÌÿT:E1œ\çìoì+K;•¦ŽbÖÊX±š¾rˆ¥q™èÀÌ_ÀC_9,9™´a7¾¤ŸÔ. ™Ðl=-m æ§­÷R t=�´3ÄKÎwÙösL•W¬/muxØöœÞ#-ðQ«¡BÝâ"=l°à"/5Ê“ˆ‰çe•w¹/Ràjœªà‘Ëò@’V[UÍ™öUà nÛRôjGÛz'œ {B–ѹkîÆÈóA-X+hÈý2\$”#¶Fñ$­àâ|Eå$Yˆ£¤*x¢”0òep&àø´¤Ù¤ˆµO�mú>Œ¨aý¦Îïߵഹ/ÿ沟M7`$`¸j*ÊSj>zY^Áî¼6§‘Kͱi Œî—˜)ƒ¾}n!¹9U›�#°I}ŽªšV ƒH¾Gþv4Þ¥Î.4ɯ"±#L°&@̬�-)á ½Ž"²]é†àè� ÏSðl7•/¹º1;TLe2ƒ.1uçå/pôHT¡p§Î“ä˜@�â“›_Ó(¼P"׆JE˜uá!ÈÄÖóµhœ•‹åog:˜¹T €6z‰TFÇq2\˜¸˜Ú’ÝÕÅ"KƒQVÈqE²O°æ†Ü—•G“}¤ÿWÎVOÒÏ艅\½Ñsª²ÏùÅdP!TäFÛ1¶Ü#¬ËØhi•“un§Û„æšÀ#g�Ý!Û—�ð0ÚY™O‰½l/¯ÚÙ– tÁÛÖÇÈ… £“ç%ést]Ï"d2¸±‹>h”�¦C�ôx÷sûÜóü>cÚ‡úÛ21òB:‡äå1~• 1P‰\ЇRâ˜.³0˜m£l"Nëù©äÈ3'º:“Ž5­*çw�w'ÊtÆaI�@b¼Á&@ˆ`E²òêÒs²¥MeØ*¬Wíx‰]qÉy³‰…;@y ˜8H?A=•Hø”„ÕÉ‚bËÈÊÁ´]� —ŸÙ”£ ÓÌöeƒ±DõZB,ˆJ4ÏJ•ÃTÔÙw�QMLBrãø™«Vê]Æ™B+ ¿®ÄÑä³½½é\­Ò˜©êkôJ¡ß8"D%Xvâ#^v[@0$2*ŽŒÛ\„ì« b¾ig‡©â‰¸Ì»E ÙF<ýìê1$»À�ŒüDˆœ&Z�N›–…‰»5Ñ®£#�’’¦0 áêh'ä*ËÁÁ ol^�ú@YE$y/ñ¯8,¸Jü'?¿L$DfìÉ$à�B�}¢Ýa¬@jªJ×T#e“'Y²Ê‡¨˜}¬±1²JÈ2P‰WtB#F;¡·r@‡Èìš¼–V2bS IDATÄÖa£V˜Tjv¤xiÎCv&µ Þ‡=–“`FHÕ’9žÕrµ"�‘*£·Ozoú’—tÓ€ .?±œÛ&YÄñ‰š�†"òY…BO‚P p ²ä+¬{Û¨bÀ¤#Í|L¥T[ž_%*“¨¿êâ´õöPh A¢Ô /%‘œoG•c”«yW•·¤—,[ ¯zOvFO²Uâ]bÙÔØvtÆ_’Nr ™MéËIt@+œ<ˆ&�èäìlwШ>PæË&®§þ¼ý["ÞãØ”Q^>„�‚ð„ò|…']ãE¼‹R™¡Š«(“�-Ld‘5Üb^$ �~=8v†PŒ®6S×JdlKahÔäÓ!ˆdÈc¾’” éÇ a0%/q©¬G•€4'scÏhaǬÜF,&m0eg*1�ÁXøýy!1ÅH‚P®+t®ÐS©ud” ÒrkK±ܵWY³ÍÈ•!¾êŒ¢Ž|hf.ÑOI÷¢ó’âk¢¸éª4+9ÜDbæþÒJ‡B€DÌz›ï›Ìq¶DA½(eVLU' bo¡±ý�–HH’ÙdÔüu€Gîö„µÛp_|™8gÖz ã'g3*?;qD³@¢™ 6;*ò d ¨ºÝ+’#mæ8¶DË(ÀïH:”øgö.¡½+ÈûrÝ´^ÌÍì£æ¯* Sü­�†/½¹R|Êc o/W¤„`¢L€Ä<) ™äÕ~!¯!Ŷ/°V+;¡>¦NqÈàh2*A0¿üŽŽ^N¾\i�4KñgŽ�µµ[$¬é‘<Å…|{ BÑñª€C°©UF!e—²î亰ciL䟻 ó’^°ˆ@äy—ûxHSÕA“^Ú3¹ÔÒTyR²ÍôÔÌô Ã=¼`›üÝ•¸œÉ·�Ë»ìe·½@¯ä ú+x1dS�,yô´”ªþ–TvdâFà3‡öñæD¡$ïXAÓ• Ã#pxKhžyðÂED{ÈPO%æÌEE&g�ñ7œJ‚x4…P‚âèF*n C°Á"KNUÅN9Ðóÿˆ–_€²ÁÙžyt’;Ë"(ø¹©­FV4fQ$í qœfÇ{ž*ÃR;M�Ó¶Áј ºJ²nòþ"QÍHoôÒ”!Š*终•dÇÏk|Ò§ãÄÃye™,³‚À8?@S‘³cTùåDÍ$â=EqÕ¢sáÓ+ÿôO$ÔœêÑ1Øù­L-º@Êžœ¹¢\î,ƒF•BŸz�#òûiÔ¯•¢ëÇu˜ Nº½<\D”í’•A“á²ï1×fÈêù,æö½�£’ W1cÕ‡$lêé!¼sP�ä;¿Ñv?:‰6Ü¢½]H³�D¡�ÑV3C€Q^Õd1=“e?H2¤·Ç�†Y8;‰³}Ë•LŒÓà'ªæåöpžä“QéÖª%ÞWº‡%'½êñÔ®�$ ж ¢ÆH0 Y�äV�2ɳg’ø¡7‹v–Sí­ MºF T‡ Н– $*U_ù|ÔÐ`8× NjzãÓ äzÓ”VÔowId@ ó²ÄêÒs(>fµžÃPü^åÕȃ‚~�ê‡Ø÷¤…ŠÈŒ\•;HæO ó¡,\2jƒ(ct0Ù’*ÚD«QÀÎ —åœ7® ¤zrñÕª\”H•¯lä‹ö>ƒ~˜mF‘ÑE¡&Ãù¤3NIcSµ…~u£;…®oaKt*a%§Ö4 =³­Tãt²B_bûZWL‚Ôy*�ä €§#QpöÙ$U›ÏìȽLßÇÉf|fÔ¡?)…·„ÛÜ ˜_�²¡ixÔwŽ#ÔúcUrÏ­0¾À!ô}èÀD$vŠèú`çVEu*YŽU‰­°3¢ÑV3ŒŸ"Õ 1�£àK¡ãôƒµ/Ýr×XŽ‘ ›Ì{«7QÓNæ¢ÜÈ�÷öd¦6GS¨´1OÇÿÙ±(L�!‰0|²Y‚+ÕF­~ OæÕÄ$+áßÂ7º+·„>A‰j�lñÃS(=ÊÄçY�dZãŠs*÷ÑMX=!Mɨ"ª2LOõíjÈIˆ- ¾ÞˆU"îH'S7´CT’nñ¯‚ˆBDAP’ë0z"/1:¬À¤›xCôp“ÛùÏ•QxgÿÝŸü(•#æ}¥l:™�"ú×:�6j†ÆÂRœ¸X´2q%�±'˜zÁì±u!@ eƒo".K'JM¦_à—ãói«i)çÕ+ÄíšBzZ¼ßþgÛ‘ù/Ñ©?¾J¸å9Ip²œŠ`c2QîåQKÍ—N‘yO�§ iE´º&l Ù¸OŒ¬6"©%3Œ�hž{B€ì—Û“ k“ìsf¡�Ø[ÑŸ´Ã&'ýgYÅó)PAÔˆ“WOiš›'PëùÙF%„XçÑsÌHPB|‘azƒÁÿtÄí˜_&¼$¸{LÄg ÀöáÃ�ø“ôiàF@G'þ‘;�{𠘘5²Óƒ¿pÎókÇ�Úʯmÿ•I– …BuÚiøVaêÉ™�ŠKyÐÄ0ž•E<dÆ1EÝßpIN¤È mâàù¨ +=�œwVX·.é7OXÊvº.ã èŒÖvCÊ…zc41ó -êu18@eÀD¦ÛÐàyÑDÀ¬CH>+:°;ç!3dš�ŸÌ¶·;Í“DK÷~7µ�ð ê.-ãçœ$(Ê$Açp:K×#L&ùªñ5‡8oÚvˆj$óT�:áWƒ¹œ`ß—�ÃÒ2ÊÄ AŠ´šSf“t„ìÏç©èíRÉG07¦”`¡¶i˜Fq-Á^Y­Q!C!;½íp»Át¡Ï�WéÀ(­$’ŽpµŽX#j@ ,k}Y(ñL (q f,¡Õ„U˜±l®âò»ßdio 7ÄŒžŸsÊì}û+-±·dT�Þ^lk ’¤ÞõâÇÒ)û`/WR(;w÷·pÞo®¸÷è_7œ©aùŸçÞ|êÁK ,ñ{÷ÌÿÞ=óAfRÅEý¹ŒcݼMò¸L ½àEæ «ô°0@ÊŸFÔk�=Sžã­kE㇟úÍ©s^€’ð{÷Ì¿üÞÀ�ÀM†“#"ψ<¯­2˜mÇ34P)‘ÅD567©ÚDÃ�Éi'\5­ªÓ8:Ý�þ3ë¬9PUaWnè&Î�L°'Û‰š‡Ð¦¹—¯„@úø©É[lB§™´ž,Ì&6Vàº� 匛\’ôqj…x;Ú~\âšJž+:t–�íðÜÓÆ7�×�8‹ãÈ´ÄÄTP üsCdG:Ã×Ü£%ÇqI“G‘ø {lŽHAMHP*ÎÚ‡eó—9Ù´<Ó4dYhÈBÞÑ� yùV¥)Û8á«§?pÐŒU—þüŒï|úÖåk¦|ó–Ä„b!Í*ÙŒÛì�Ú<½‹™cPMÿ`Ë›ë&voîô^«�äÃ9_=ýþƒf¬ºô¿ÎüΧ~»lÍT¡ÐgonL´+áÀZ„¼èk§ßÐŒU—üüŒï~êÖeïp‡^GÖ“Ðá ŠÞ“f`½AöšolöØ\õ¨Ù+.˜ÿäåw-¸ÿå½:Z†×m#—ú‡ZÞ\7©{sç¨éT:îQ³_O:¾ú‡ZÞ\?©{s§ÜÕ(‹‹¯=ëK×ÒøÎÁ«?{ƒçWãkn¤(‚Ͷ){ʦV‘QÄåHå¨ /.ãT¡+Òç¬ ¤…Ûy†©QÖ¾xíY_ºîÌ®ŽÁŸ}æú@Eʼn‡羜“ Âÿ>õ¾9»®þËëÎüî9¿]þΔÿsë‰M¥#Éßä¢ Q9 õ6TfThÏØK"F•¸…•ì?¿ñª2¢Nú—{Zô–œgñΨœ*‰ðíöŒöfÀÃz¥ø†˜¾çÆ=?–Ë*B¼%œÔ±Gûîkû·ÊÉ,>…¼K⚥71r¶Ø )ªh|–éö7€§°â°ä¢hÅs�¾%7Òå9×@ö�ÂÈÍ€‘U£æ)¥­À4 HhßpÁaÆÁ.¢x-ÿ̈> ±¢ÀŸ¼¼F­èØ!б;ó«ŒpU*©ö>¤²ÜØß±y¨½¨mÓ–¶ÞþöfPF²wó:›É7+F0ZwRŸ_Y=íìÿø”¹%M;=�Tööwnjß<غiKÛÆ�6ÍYuþA~ä�ZÙÍ#�z7wnlïßÚ¾iKÛFfYïõó‰ÆZð5éÉ{êØP¬ÄñÕßâ%Éé'�Ù¼i°ýžö^ÓÛ%—Â8¯¬ž~ö? Ó’ð€’U¡éÉ�›Ûïyqïwz»È·“íQ–€##µŠ9Íwf0S‘T0Ñ—G’8'LCÒt"£pDɈ}<ºNè‚kÇiªS8#uø§$(¡h4 ®2rñ$1.èÚH€D°±̦Áöþ­m›·´õöw$rW#G¹"Cö˜Ðs)ËFåQ+ÄõßÄÞ“œ>)žÙ@‚RO6q×JÀö#�ÇM3°W(Ç&Í0—¿ÀÀ^y8Ö"x�È�y‘„]'}냈"Q—”Pˆ0o$UÌ*çÈžÄ2T/�›$�麈ªaËR]…· Alú#9•G” ¢M;Ðîç3qû7~uÒ]Ïïí¹µ)šd Š·tt÷wŠaŒï¸ô¤GOŸûò˜¶¡Ç^ݽ{s§¯93W}qÑã‡ïñÖ˜¶­¯¯›üíßwß‹³ ½uäÜ¿xúãGýqç‰WõLøïǹî±C‡†ëmÃW~öÆß/Ÿ9cj÷¼½VŒk|rùnßüÍ on˜8­«ÿŠóµ×ë»:‡jØøý7/€Õ=ãÏüþy«{&\vòƒ/Œ‚úæ­‹®~èáklûÐÅ ûèÏu´/^ºçK+wü‹½_¿ðê�u¶n½â<ÓáÿÕWõL¸ì×áU‹¥Ãf6‚T+ÊSæ¼rá±OÎÞáݾ�ö_ÿá +î›×7ØŽ>Y�^Ç@S¯Ñ)-uwÝô¦Á¶®ö¡ÿ<÷Wýƒm—Ýðá�¡–ŽÖáÿèmS»ú¿ðó³z:gNîþÊI‹çíõƤ±kûÆÞôû9?~ðè�¡–cö^þå<²~ó˜£g¿~Ë3ÖŠÆé¿|ßK{ÿï_� €W^pà oí4kj÷ỿH¿{n¿ËïZÐ3Й•ImkEyÊ�K/²>pt/@ôôwnÚÒ64\Û¸¥£»¿ƒËTÎSµ‚Ä9½ßg o%Ó£1Bµ!!I 9æa#o i…Ôí¼SË[æ”Je§G§˜pì1†Ü�Š™• ¡Ã"õ–XFȶù©<@¢ˆÅg;‰÷âBÿµ’[œåƒ™>jlæÀé#•Dʨ~÷{PfªìD›?Šãcð¶�\º“Ð&F“ç\yU‰Ó@ÛW8ê@HDeYÚNd±ÄLdˆW•5*ºB­ÍþÀïÞöÓçÖ DX`EçüI?¢pĺ�c÷ŸñÎ?žywoÇÏ¿? xöQüÚ/O»øš³vžØûýó~û×§?ü�7- b=û¨?~í¿O»øš³v™Øû=¾4RÖ¾ý»c/¿kþ¬©=W^x#¨`½V^vêâ…û¿ö÷7žôüŠ�O�ûò¥'=²tåt¡ñ­uÆ´m- _Y9ýÍõ“ßn”8Ò(ömQ‰p £¤ð­õ¡Ãâ•UÓW¬›ZÖ‹ò¯N[¼ð}¯ýý�'=ÿæÎ§²ôÒ“2öÞií/¸y骾põY6��½ã»o®›H@Â=~æaÏë–<óÆÎsg­ú»ß3~ÌàåwÎ(ò™O~ãæ¿vý©SÆ\qþÍ_9åá¿úÅéë7�ùâ5©åi‡,=þSŸ¿ú#kûÆ4ÊÚ†þβ„oßqÜåw/˜5¥û§Ÿ½ ÄN ¤‹>vÚ!K¿zýi/­Üqáû–ýõ).{w*­ß4æ‹×|¤V+O;xéùóŸúÜÕY·il£¬mèï €oßqÜwïž¿û”ž+/¼É È U2ÿ 8óоròâÜsÌK÷ÚuÒÆoœyWG}ø›·-i6mÕ)ž9÷¹¯œ¼ø÷óÀÒÙ»NêýÆwµ×‡ÿé¶E}ƒíߺõÄ+/¸áœ#ÿpÕ#ïÿøáœ3sÕç¯ùhï@ µ.Y6ë'µ¶oÌ»¾ó�ßÝ;Ðñ³‡�€Ù;®ýÍí ïxn¿ÿwöm7=5çÓWžó��ߺώk_Y=>qä³}Ãé_ü¯�ì<±÷ûŸºå¯Oyèn>q¤¬An\F:sîó—�)ÜeRïÿ9ã®ö–áºmQø…ã7×OèlÛ±$|eõ´77L±�YñÂø#E¬I_ðÄÆåÆàŠœx›b&Êû¡*'d‰ÂtV*Ë�ìL¦°˜Þ+¤WML%ÍÍ iYq2YðHâX²ý^S3·#}°Œ2&z\öP æ¡Ñnﲇ9ÃÝ#Ž—óK¿ÒÉÁ”'JĽTÎ5«–ÌõoåD6»Ë5È–d*e"†Æ} ywÁ¦Ïð1Ù•T‡’�±pSÏô6K¬ºB £�¬Àûü‘YwB÷ÎÛ`q©†Ì%“­¦¦šÐ ÷­È.1Z•ÈÀEÙ$*“šŒÈ'–,Ÿ¹dùn@pí£‡Ù!×o{ãs·‡_Ùó±W÷8`×5ƒÀ’×v{péD°²{Â/=äË'?²ã„M6�‰—^N/­ìž@�Fѳ¹}¸áÞZ5­kÓü}ÿ|í£‡Ýýü>xÝ£s�šýƘ¶­Bì“Ëg-Y> @(tÁGÿ´û¼¼$‘¨¨³JδdÙnK–Í€k–ajWßü},‡5ûõ@"œ|ð+[¶¶|ýW'¿Ó3^]3%ø÷ô ›N;xé5qçóû À�Ïí½Ó¤ÞOÎ{æúÇééo€?®Øå®ç÷m4е}ã~e�xmLÇPo纾±ÐÛßÖ(‹µ›Æ­éU‰@e£èè‚MM·yÑ�¯^ûèa¼<nxrÎ�3Ví>­Jµ›Æ@o{£,Öm·¦wœµ›²QëèqûÛ½M¸ðÐÕ>töQÏÞðÄÁ×?y¼³qÜUqé¹rñæÕ½]ïc9FÂÌøŽÁ³�zöú%_ÿä!e ïnîúéâÍ«{»þ´fÊwî:ök§Þ_@ùécžùÎ�ó—®Þ!heÝæ±7¼ã„M+»'0]FõøüÄ‘Ï^¿ä�ÿ~j.¼Ó7îªÅG\º(ð5žøónOüy7øùc‡pãüµé-0ˆP"5 ÐzzôÊU30Èâ–�„h΂ßÕ39ÓçøIYѵOnwÆËÍÉ´ÕdÿiOn: ÑQ–ü-¶Æ×z¡ËïLÜjÎ~\Û‰¿"+5œÜ�°@ ·L¯LìpŽõQŽl’ eÔ±@*åå.©‰@¶i­À'œ ;&Àî[²ÊcŽ|—¾±�I›ÑlÂù³öêæ&{F%h²?Î,VÉɱ|“ʯ܉ˆ`ò¸þÏ-\²èÀ?M7m-Ã÷¼°�ܳzãøÕ]ïlìj©5¦ŽïÁ5\éíî �Q„–ÉãúÛZFþ´jZàwh¤eù»Sœ±šb½ˆ_tH¼´ üwóD¶Í@„U0e[¶#YÉM7 d €�X”{L[ÿúÚÉë7v„ö’`M·©­exéÊiÀ‰í+«vhož>~SO;¾Ý=~ëHøy®ÕŠ2ÿ¦ö-\zøO{^xõǶl­O7°ËÄÞ/.|üsÇù»:Wõt!Â�Ïï3gæÊ¿9ý�k;ü¶g÷gŸ§Éc>wÜãØÿÕ©]ýÐV¾ûÅ}‚Œ‡k}[ÚÆ´oiéÛÒ^–%"”Aƒ«7v;€w7vµÔÓº6¯ìžàE Çð(|ìsÇ-IøZÓ;>ËÅ,T¯ìš£i&í=–€ÃTo/’¸"FŠöÅÙév”…F�@Kéy¹”É¡2Ī_ T¡qv—s¢p#»ª£\üW€,cGQ,g¼©²xNY4µAÝLCM³1"^åäÆa‚¦g *~ûoT.¹Îª "Lwó8ºë¬éf¡$ýñ_™Ùx£Pä6ÀÝ€Ý[×j¨Êøh–öfFã4²ÚtÒ ÈŽ©‘nñ(ÝFÀ¹G\Asô¼» ¦gѬ ¤±’ùŽòI.R\¨ÐÇ lÐñL»Ã7“ÚAk­ñõß·ëÔÞ¿¼æÌ¥«¦SYüý÷NëÚ$´´ÔF¤ïZAhÒ€p)HÞ^Ér8½ˆûËË’E 0<âfl1ŒzÊ3„Œ7h­uaÕS`Éí,vÎ`G%Ì“§(Ê ”áF�Ü`û"ý'‚�doéQè�ÛÆcd¤ðïÄõœû£JójåIDРâ_o;áþ—÷’Ke‰ëúÆàÖFíë7Ÿòo¿;.4îj®5¨ø×ÛO¸ï¥ÙÒSIÅÚ¾±�ò–z9}üæ²Äé]}­õrdk-µòë¼w×)½_ºî¬—WM#*¾þÁ{¦um t5EÐ}Ù(FÊšVÉ ïìPcãý¡ÞO"&4¨ø—ÛO¸ÿåÙ±‚áº�c)ijF'šé‘[…€ ™H  ’°ÈbðVÁ¬w‡„ìJ~Þf›…±ì|H’8}º#UëÈ/= Rv.6CõQO*2bäžc[?šD^á]ì”Û%ÁôäjJáªåZNh†a"bRfY^åq ®+kÆ�‰œ„ 2nJм«Ž¸ÖÚt:—Õ„ Ý`¬1LÀÝ% (}š³®S×J( ¯í�®;£�¸ÑÎ ™þÕ胎x”ª ¹½ô¹FŒƒšóäÇ`íç hÅ‘jËuæ"«œ±æÒVƒ`[!“”‘Ï p\çà>»¼{Óãs^z{Dz,Zj��'õZgMÝÐ^æÏ뇵õ}cBßáR`·)뇵u}cä¹G?c$Xß7fh¤>kZO»^4fMÛà¶!Æ ¨/àj†iàdÎÜ6A´˜Œî0V½(#To®›8crï„1[üý¸¶gìàÖ–ývy9Øw—µ[Gjk7Žbl�Ä�¢ÿ % ƒ‚kûÆnÙÚ²×ëBË¢ Ý¦m(°¬ÂÉ&=W1/aÈj¦{sçšÞ®S6¬îíz»{ÂÊî +»'¬î?\ÁgVõt½ºfzøoe÷„@d÷¦Î5½]3&oX³±keÏø•=ãWöLXÝÛ5R€Hçýô~;½óÅŸtÏÖ�÷OÁØ:÷ÝùÝ›–Ìy1[ÑØeÒFpJ}‚/³¦t·×‡1~^?ܨ­Û464óÎ oÃæÎ5½]3§lX½±keÏ„·7Lx»{ÂêžñÃT3ÃèO¨Õ:»ÍBJš`iiÕXJFš„ÒÈ/+rÝ•k9BâÙ”[#MOŠ·»á�ÿSˆ £•�ä]¡Q[dP_”ay·¡‘È $ ¢„¬§swyd­<ýz�…èìá ô”A›¢äGL76ÚU¶%K¥Úû‰�?IvÌ¿Ž”fI )•ISHùZó1‰"íF!Å8hOB?3Ç´YdOÒ"ÏQÎr åÀ ™Þ·�ˆNë�Ê\»—!ßc‘¢˜ˆ�Ñ*¿ñ³Ív·¶toê\°ÿ²Ý¦vÏœÜ}éI9û-¹‘æì¶æœ£ŸÙaü¦y³ß8oÁÓ�¼²‡,òÍÙmÍ'Ž~fúø¾y³ß8ÿاye�wøÐÕ1ØR/;[‡Û[FBgkûÆ<ôòžç-x꘽—OëÚtöQϱç[Â((˜À,ó»ß²'þïîÿâc‰3 IDATªa[i¤“ cfîkûÆ>ôòžç-øý1û,ŸÖµéìyLÜó¾“ÇöÿÙ÷2kÕž;l˜¿ïò¹»¿ ë7�½í™ΟÿÔIýij׿E¼vþüßßñÇý„ep¶®Y : Xiè¡«}°^+Ç´ ··ŽÜX·iìKgŸ{ÌÓ ß÷Ú´®þÍ}ñô¹/ƒÉR“ÃZ"Œï¬×Ê1­ÃmQòê-õ‘zQÖk�Ë`Ï}ƒíÿýÄÜúÒ¥‹Ýcúú“ºíÿÚ9G=ÓRkD�ä(„°‘ïºdÑ#{LÛ0cRÏ¢÷½vΑϴ ˜·×Šsÿâ÷ß½{Á=/Îþö�Ç}úè§�ÞëÏ0¸µ¾aSç±û½6kj÷ÌÉ=_>ñá#÷|3Ê-C']$€ƒg®>ç¨?L¿iÞìçÍúá?íñNï8¾“Zj�z­l©•Æ©ìÛÒöË%s?4÷¥KOxt÷iëgNî^´ÿ«Ÿ<ê�B#ÎÈx"(ØkêºGÿößøð]RV�Z´Ã@)B4µØªVÜåÖvÞfJ‰�WÌ›Ã첈‘ÃX{5^öÈ[‡ü“åUzE2\R¡ÕØáo”d†LçùªŸðTt iðÖɘÉH*ÒB)8�Êm *v”f�³Ù•¦w¥)ÊÞ”Dú1Ú O¹rÛŸL‚§tR«p6-ïuÀ tdÙ'®)r‘{Ås䬧ŸXåÌ.‚ž‘¥?Pç }(!gÔ�о“Ú¿ÆBuiö¬<¼›ð%Íuh%”[6W- µþûmÇ}ý¬ûîýÛw÷wÞðÄœ_<:w×)=ÒòwÏî;{Çu÷ýÝ�eqÛ3ïûîóGÊZ+”pdzûî½ãº/ÿÝ�í¥Ž–­ß;ï–XVÃ"üÕ©}åäÅ+{&^ð£�½öÎÔËïXРÚ÷ÎûmgëÖ‡–îyõCGÌÛûÏ ja§µÙ C*P+QX)o')0"S94Êâò;4¨ö½s™ŒÅGÌ›ýçÐòù7wºäçgüå‰�üââëjE¹ªgÂwï8`×F ?yàÈþ­­—�úஓz×ôvýò±C~þðá#eÑ ,.XRxhƒäÁ‚;Z‡¿ÿéߨ Nyð+'=´²gâ?ùø«k¦~ïÎc ü·³oïjzfÅÎ÷¾¸÷îÓ6ä �F“ÐÑ:üýOUtxþ•kÄoŸ}ëÂý—u¶nE„93W~aáo¬Ÿô¹«>²ìÝ©7?}àÆ�Ž �}âÂc— ÒŠõ“nxâ�2I¥”�䮋ð]Kiî<±ïïN¿ïŽç÷½ë¹}ñþ—ö>xæÊ¿ûÐýoütÊ[ÝãÿýŽã¾þá{ïûêÝ�×/9øºÇæÎ˜Òk·èë0êÄ¿{nßÙ;¬{ào®h4Š[ÿø¾ïÞuìpY´· çì[¾ïµÈ׌•_8þñ7ÖOúÜÕ}íÝ)7ÿá �-XrÑ‚'…×/9¤4  à8öpÆ”žÉãžY1£,uëk“Ê/zÅE¤ø¸F9E=ø)±Íò£«aµ‚c ��Žy¤Ôh‘¸´Å=Ë£VÕŸœÀ t.ž’ë#9a³–®êF$o*5³sù½t@ýù‡¿ns¯IKccwIÀ\ÑÐ,É‘—�¨Þ¹G!Rñ¾:ƒá®yÿ–v'ÍbÒb²®TómÙ»+d�~6*DóUÉÓϸ™¨Ü2°aÅ–·±(L„4ÇÍÒ†Í�$:¹Îµ¶l›˜ûÅ,¬UòZs¶5΋ì=Íopa8'Ò_ÝŸÏ>ºM:²$‹€ .q¸ZGÛðO/ºñå·§ÿËm'¹ Ý�­ÃW^tãÒ•;üË­ ·QúÎøcw0$�²ŸÓ„)œÊÔš&î–*Îe%&爐OßU$Ù­¬×³JB¯7åH8N”¢²‰�}þø'ì·ü³W}¼0¼¤@™}¯:Ï­ÞÝì¶Q·�SÇpú³X –íDHúÚ¾³uø§Ÿ¹ñåUÓÿåöE¥l5)¥�>.C¦ãt)�ól}P„ àKÇ?úÁC^:çÇŸ\»‰+dÂ�µ"Tø#óD¨wš.ɈVÍëùI2Žž=¯)v�€±;Nj,Í̧ҧ¼M$`ËП16�&Ϩ–É(Ëi¸[…ýf`DÚ+% #ê‹™ªú°ï‚°�n瑃CP(oM0(ïÒu(Na#¦¸¸ÞŽÆWÃP€º‚Kq~+ÚÁaxõ„}â­ä,^[†ªŽ ®<Ž„¬uë£6üz£3(mº­ÃïGnjú@{Æð°�ãT1,`Ñ´4äl«lòÙža™ ˜Û¤²™µSÕ•$”¤WͨXuË(çc¡6UaaDMÕ8�ÛŠ¨’EP²K ~Y ^+÷Üq]ï@ûÐÖQŠ¡ï)²F DÅ™¨’ÒÉö’éRšXnx¾P[Hj’ YTIhtrG&)JÍ Ž­X#¬¡ÙG¢Ýñ*.Ä0�„~[‹Æþ»¬¹ë…}Ömçt)@"�Ù-«L[ø\–T6„dá-Žkµ�èbSË«~h¶"ËL[iËÂržU%Qõµ1Ußé¦ À…C%²Ú‘“ôÂsÌÆ˜Eh嬻j“7°y�Ï�83ð륪Žl×Ò{ˆ¬àÔ¥7SÚÀÅžmEV÷¥sm'Au¤ø£�NdTm]ß,+O ‡ð�`J‚OšÁò2'[¶d‚¦êJ°Ñt–ªU¢š¦M«W³7Ø6jÞÂx“f侟më>âlÚ‡(‚+–D¦Ï&®.¨“Nî]oªè86”¦sY9%#5³|+¯œwó–`2A7Á”Qî’ÙA,|I”%BWÈÁˆ¿h¿æï#l©5ΟÿÔÊž Ͻ¹s£,N<àOÇí·ü[¿=!¼ýÅšè>é͉#ª‚*S"­*Ð@• ÍÔ…ë� ’'x ´I™‘õ挆2’à1·XèüÇ“oÀ„4–GØH¯Õ¶iFÛZÖ>ÿó�Š�rñNCBtù@¬ ,‡¡h—Iä #á5šiõdÆl••z"»’¢¨J$;°êC&gÖ1—ø¼{'JÖ„Rã}‚«¹ñe“xûòÑp¯š_ç v›òFÙˆPß8 ¼¦‹ªü”Öøüù½”ïxÊc~3@·nÃÞo…oML-Ãw¬ó9ù–V@Äý¡œ°åQ»�½9å²ÞÉÞh/ˆÏ­5ûç«PÎpet©‚l+�ˆ¦ ˜Õ4ê5+ÛÚ§Ѥ@”†HbBÛZ¾"%¼xNÙ™��'”ÿá³Ê�- ƒ¿�‰–’¬y´ie…a«xà5ƒ�äCà“*efÐìâá­'¤ #C¥�b¬) Í†€[¶¶\¼ð±Ý§o¨åë&÷η=ó>0h¦·è&}W õ$*ùNj1Öz�e.¢~[rµ!骢¨?vÊ•W� º[ eÚ&CJ2­#76I| ƒËëºÑô‰3Ä_騎\1‰Ç5_ô>6‡h\Ô0õfȪ¾1 –6Ùâû“C"¥‰O©/'H D$`n¯ŽrÞP$I°qóÊtúÖüØ¢XŽ5!�ÀûØß•3³aŒ �¤”{YUÏ\mmÜD å(èßܼhv,S¤ÐŒé.å×çM\l�Ñi‘ »üAà'-€|ɇûKG <ùÿ!*׿1ð6b‘‹Ò�”¼ØÝ¶ÔX¤Òˆ®–ÌY¬À½§ ÌòŒ§›ÄY“P!�™Œ¬ XsþA¦Ô™ %" «¹"Œû 6:ÈŽ ÜÕÒäÕ ÙX¢×J\]‹yã¶ÙNÓ%%cî6…·kϤJ�ÆÙ¡ãÕ Ö¤Yl)!,Y“¶l§ç‘ä·åªÎt0嘼HÌg«G` Lp©é¡ËÆ@±ðÄ´ˆ%]*7öí9˜"´h'Ý6‘-™¯ö¨�ƒÎ7O&Š`½j{µ~gS%¦£‘28‰{w}¹ó°k­Xk± dc�@‘‡õ´A‘ÜÞJPEY¼K¦[ô·kwŠ&니bºaÅÀ{“Ã9g·L‘Žã­°2ëO%‡PÞ¹7-÷§%£‰Ü×¼c²Ô¢~åê€Æ™ˆ¶rÆÛ,7wmÇ÷DETó¨‘ÙøccŒ=H¿„êþ9ÄqÍÊÕíƒhøŠŒ~b-”Ý¥7³Y;ñe‘€†ŽC¶”AR©`,@ƒQò ·Íÿ?Ch×\�ó‘0aç£Iÿ¬”#9â±Ît–\½ýÕ…%‘Ju³,-ÈŒ–œû"ø±,…±G"*íæRÓͽ‰Å(ñ ©¹©»)�AjˆÕeÎgèQ…BÓ#ÉìyVx²Ð¨›Q×¾¦Ø2„<Ű�l#ÆfmÒåè­p[‡Ò 8l¾&ÕÔp{Aáb�=7èîày^¶,T¡'›ñÑÏMAñN²@ݳÂù�[‡S ;‚†›±r\KH BN惋3›dq@ø ¢NÆ3då/ÉWÛmfUe·8Œ" aܬB\Íf¬ð‹•!ôr՛⻾üALº/tëøÄ�ç�"Ç›D«$Ç …ÎdÑuÇ/ "õXtþ¬ñ]r U,d9‡±ÄUêGí gñ;×xÀôG¦Sö2ðM¾à(—ó£LØÿ $:Énÿì=9qg‰Æß%¾¢k-òZ1¹¯È½Ø»¤© IhËeñVEÝZ‡|-gÄ�À—EuåÇq*% âÎutnŽç�eÊcðÍòXÄHaÍy•Œù@4Ôû¨aÑ,†4³ %Ë+Ü.DŒè–Œçe ÔàÑ$´ˆ@Sº³3Ù­IýFÚ([l>9ô'Ñ´ùè91–Æ%îXWëbÔ3©ðY_gpø# vÉbŠ¿%a½ú+û²XŸ ê¤&`e@ié·z�‰íÞ›’3¿êÃôè-³ÿêð"s¯•š~�Å"p²AïŽ�+§TdéפŒæ[Z0•3”4eŠ´ÐgËMÖ“ «|".":2AŽÇJŠZß#wÖ9q°ÖYº±r’uñŒªœ9“DÜ”°—]ßÛDæH0Èvôx†—ߣ†t}1"�äÑJ=”eŠÆUÁkÙò‚¨q0ž‰=Æ­#&�TfÔ¡¬ùëäÜ „K^å°å·ílóhV.–«êuìÙ¼¼í _©ðîª'w=õóJ§#ŸŠƒŽ¦ b‡LÒRÁ¨Ùë"WsLZx¶EFŸØ‡…w Åð©Î�q�t×±Udkˆà¤2.BÙ›îEm:zÍI{i–ǘ꽻‡#�Ï?½C§çIw jdµ•&žä®h›ž¸Q…Ѓ«ÂRžÅZœqÿ$7fó3Ãl%iäþÉ>Gjäc2zOƸõµD1~á'¦�í$VÇÔ�× �€ê® Êíjÿ¤rg«æ§ÔÌ\ŸáϳæX%b™kϬ¹’dÁ¶/_¥�œÔ±ôD<ƒ$×Dð’ÒŸj¢øˆžŠ]âhÜÒ#�F_™“H>ë—$©G‘Bx†Ð>ÞeQæî¾òçÿæŠ{æýò±¹"tòT0QT+à?οùÔC–@Yâ÷ï:æ{wÍ—©¾*µÂˆ0íÌ�à—O#ÿê“ðiPFå¢Ë}h»MF$Ö{r�oœãc¡u)¯ ±Þm1&<ðš¼àmÍŸ”—øbÁFz*¡H Ï™Dw{Š ˜ÈB€Õ^Fl\R¤ãxG -t™€œÙMv—5Ù¦«ÞFÖÚ¨©,šÃ®Å¢³A&\d4B„*É!;ïX$#YtÖ5j•Hoªà¾ú¡ûš±úËלñíso]¾fÊ7oþ€µ-Ádh¹G:iB\0 NPº¨eź‰Ý›;�WyêÄà%|égg^rÍã:¯þÜ Î´�ðkzà «.½æÌïœûÛek¦|ó7¨�Cì®R@fF]/çÌ{ö‚cŸÚibßÊî W=ôþŸ3B5p+¤U@¦ ŠA;†|=AÇ6‹ iÖó)U† ø†‘žÄ 2ê�~8²¡v]ÕÓ@+—ÐÒŸ{:€á† `¸Ö¤ÌN)dúÃ-ïúùsç?5sJÏÀÖÖçVìôO7/ZþîT¨Õ§Ìyå³ Ÿœ½ÃÚ¾-í7ÿþ Ý3¯o°mlÇПùõ1û¼W->¼»oÜgŽrlÛÐ?ß²ðÚG»ìÔ‡¾¸èñz­,Kü§[N¸êÁ#„œ™Szþ×)ÏÛû�IcÖnû«§úñ½ó¶lmµcu"ZìÙÜÑ·¥mëHmã–ŽîþNïí°`¿?ÿÛ9·ãW'Þõܾ óñ:Z¶~pî‹¿yzÿŸ->¼^”?ò�-µÆ‡¿pÏóû lm)H€›È†Kàß–²Àc´]Ȱ›¬ñH3W'Š~§©OS WØšÚ¤rl-x:h=ÃJQ°�¯‰Ûç‰ š£eE´@žîµƒÏ”ò#��iÎÙåyÅ@…_œ$eM;_Ñ@J^qY±6ˆM0Ö*Ô¢›]$ÉØüÊa(j6�ðFÎkyܼ•É!�iPɨ"è(ÅV߉bÅììæˆÊ�zàèw§¹Ü 8i¦!€ñNÉ7ˆJ²«Nv½†A¾ %Z‡Hóc Aü¿éÙà™ ?„�µht“ìEqt&­Õez¥ü“Ýv%IÐÃR–Lp½LcuF°Lý"0¤ô¾·˜êÅÍŸ"!{±¡OŠÀèïwv‘Øß~RMœl34Ý pºœæAh†MÒò— ióÖºñcÚv *^Y9mÅúÉ�W8xÖê/�øÈï™÷àK³;[·î6µçÝ�cC‡göÂWN}ø?îú‹^Þk×I½ßøèÝíõ­ßºeQÿ`Û§ÿóœöÖáþøgöÒ“žqæwÎn®À·o?öò;çÏšÚ}åçnr¤ô¶,ym·+ï?b]ߨýw}çϺ»wsçÏDe2¶ö·ÖOÓ6T¼²rÚ›ë&y S£Äá‘¢Q`ïfÉǯ dãÇ í<©ïºG+Ëâø_=jï—ß9ÿ¬÷¿8aÌ–þ¡Éæeó°[2Ð¥}NFpÉŠ ñfU`´T=Lær֥дª…e­½$Q–oQ@¾Àщ€ÁGÌË+Í“†4o|†Kì¶’J mà–´z-reQI—£†$.ò *IYýšòð™@�ûjB©S®�HЀ²„¢0 ]ÑÎT>U8<šíÞK0;ŸÁVÞ(}“ãXÃûHÔ®‚�ÚaQ¾Yeþõ~2S1oðGŠS^â§– æ7$鈱o СÈ,mrµ:ª+¢0fb#àù™–OšlíLM[H%ú ƒ«!²_ÉEM·’ê}0Í@3ÊÜŽ�$H˜ M ¨Ã"aÇ2$VdŽÛqTµ4,ò¼D‚¡ñsˆFéÕ¤Xf+ÆP¡Þ0Ýg]uð¾fîÍ‘:GB;à’e³–,›×>r˜å½V¼Ó=~Õ†ñ´lÍÔ@zWÇàÙG?{ããsnxâ�’`íÆqW=pÄ%'=òÓ6­îCÃ-C#-[Åå¿[°bÝ$¥¡,‹žþŽáÞõÍD­ß<öÆ%sÂçůìyü«{0cu�Tºçµ "½ÜH´äµÝ–¼¶ ^ûða9®?úÊîGÿã%ÎJsQG�AgÛP�´qKûN7~é�^ûð¡Ï¼±ËGŽx~lûV—K¡Ô„E;¼O |–’‰ A²ž‡ÅâIðm”J“#ÓFŸvï…µ{e•ÙX‚X*ch [iáÖMÓ›>Ü—��YAFÔè…¸’¬Å€žÔ¹KI*É2á@‹a0FmRÊôn FÒ9.U—Ò w#8^P4Ð*ªµånó ea'GbóÀy9:a�ƒ6=“÷&áØlL/`+Ã@®[!²²8¬5|�ÆhIÚÖì(Ù d# ž¬ó ²~‹äÇK°½ñd›óº$½c³“-3ïÔðim¼ëeÆ f�DVw¾îIŨBæCΧ›Œ'iz»�hŒAóH2k±W‰QÇ~cƒlÀ 7&Xëà IDATš²ÁÜ¿ ã9•KŒ?~ÿ! úªžyöõ�¯{øÐûäíŸxs§k9ôÑ¥»‡Ÿ6›pêà¹Ï'!Ö•qªâhê©n}zôŒGÂ+­åU,P"zZx¯FAߌ#–Z…i¾n�Ôu‰DS¾“2¯$Þg£sV ñ%H7ckW¼{—­ËNXe!– UÆÆB9ŠÐŸ¬æ4D*þ�¨’ˆF”&‡êÍ+]Ïgþžº¿ÿO47š3$Õ™ƒ‘jä‹·„NAþÚª‚qUWþhB£ÞHÖñ,ñ†qµJé ¬*8ˆ—9[Dô†d G‘Ò±¿C'RZMG>â’­œC�;µ1ÂJDé�(MõÂQ„ ,˜}Óš5Ï3M¨Ü®úx&”*LmYg±@ Ëð î yíV"Ü‹(Ìá¢VåVªæ£ YÄ�Ë(s%®ØÐ+�Šçîþöés_š9¥gZצCv_ÙÙ6²as'ômi¿þ±¹:ì¥KNzt÷ÖϘÜ}¯�sô³­õ2ÜßÑ:ÜÞ2ÜZélNq|çPK½Ó:ÜÖ2(nÙÐ×yìþËfMëž9¥ûÒ“>rö[‰LZke½V¶ÔÊ¥H›­ÇHy€-÷Øý–?ñÍ,<ð5­ÑS´4ö�¡áÚÍOÔ·¥½µeä}»®9÷˜§Ïž÷ÌíÏìß?Ô"”=§¯{øþãgÝS Çg©Ï�ðÖô áðU'ì3´øî¡YND¤kbǘ~FÈ š@ÎùÀB‰‚Fé0bVˆ‚5™Ž<˜%&ZEl†ö£àRÓKˆÆ�LTŽB6Hæ» oTâL?RD Ý’©‹Î_Aº‘J&k{#íŸï (t-!6µ±å—Å’9cÕk %­Jª2l;š‰¦Q6žB‰š Då–Ñ($sKHs´�4èÚ³ÈÛv›í‹w� vºÂ(Ú Ér^†Æj�TÔ$Ó²aœÁ¢¢Œæ<7Öɤ•2¸§ÕÔåÉ„Èä¨#e9(©jž”ųy JV¼ÞÃá›É"œ_²Š TnÓŠíä"›Ÿ©|Š;CSû6lgȪ4s\•Èû·6�|&�:h­5.8þ©=¦oèh~{ý„+ï=rñË{….n~ê€�ýŸ]¸äÂãŸD¤ë&ÞøØ! ‚]§ô^wñ/w›Ú]ü×o¯ìžpÞÏ^öÎÔŽÖáï�wË .«a.;í¡ÿuÊâ•=?ó£�½ºzÊÿ»ýدŸuÿ½û£îþΞ˜sÝ#sgLí€ö–áoò¶ãXÖÙºæÌ\õùEO¬X7ñs?ùȲw§z‰Šcˆ“"²ã}€ M}%ìžç÷ß9xáqKþú´‡ÖôŽÿñýón~êÀP~ö6cJÏäqx}×Rö0q À¬€_2Yþj¶Dq{V_Ž] ³ûrMÔàÒ8Ò½�­Š>O§ܒ0›©ÉŸ}–/Xç*"åYeh 3½äæ5mëZ0}Ì-:æMî™x]Lh²ÅrTã± D›ž8¾W(ÄT‘*<(‡©¨i\U³��Ú•Ën*€í?¤üy Ò,G?¡Ì˜‹9a¾Ð°,�h•^“�p^øqáM6™“ pW=âÂ2¦XWQÀW+$-äÏÛØlFìn;¦ª‰UT·iöUG¯²óduÖ\Mö'Ú²ÏÑ‚'�þk"ܲ~ÅÐÊ8…¥E—² ÀÎòhbÎ(¢íP6\âlhCëÔ‡›¸VØ}.41|¡1Q¬ਘ–w.w£<.tæZ寲TC¼£ž_;1š› '¨N‚†˜P¥+ñ�œ/# /W¦ÖC,�zãbˆÛÀôâE�ž~èËŸúÏsÞíkeÍ©ýHaÂÿµÏÃD8¸& ›ÙÏ£éÔ[nÔŒX‹Ø´H=ß çìOôî�]×Þì�A¶žT9X5#•� Éáæ�{cà8gýÖìr"3›ç\TvN$Iƒg6Ö9Ŷ¼ÇD7;C@-�’ÿŒŽEUƒë¥ü36!Ùê$V›U�no"¾CŒŽÙÉÀJ�Ó3àƒ«Ÿ]–S�ÛþaËK†o¶>�rSªoïac…|7 Ηš¡¡m™Ý˜¼¦FQÕÁíp (�µ$¤OGq$sÁ¨¥�±ðz›†·@Õv{³g 2†*Iœð‚_€‘þã/E:©¢¡D¥dì)ðFv Ñß•ÀR3ÂbB<ã¢qT�Öë!NârUµ·ÎØ–ÓgÆ—ªCž[ÅŒlW)b™TvC\fCÏK¾Ì#ö4B,Q‘1ð>43ªÏ[€Zj#ïÛõ�»Ÿßgݦqµdo E•DÕ# ¢d¸|YF7+Tü¿Ð"d4‹¬™DÈœÓÕywÉ/ríÚ ÔIÒÿ›ŒÅûò俬FÉŸÃõtSaôNoìM|±â¬Ëªh»­ &!…§À…»]!=-šÒ=H�ŸÔ£dpd°ËêB…Xü�¡ØR“óã>(ɾ™=išÜh²aF�E-E˼vqTév¶Ðë Þ¡D!aoE-IräP´†�š¨ÐlVã¤TÃŒ¹ƒµÄ®ò¹r‡¶Y­èD„hE Nm=ä*¦¹Þ=Ä,Àï("Û̆\ð7Vxòé¿.ãÌõmÄšŽ-+˜ {Í-Îf/ /Ôdì.röus‚³Î§(»ÝIbqUÓ@`rh{žò®ôCÆ úmPio±Ã¸U¹™ªù|°]º« ÍdÛä==øŸd=›)ƒçõ#D%:ƒŠLWð„ á¨wA¬¼ÇUS P$`Ašùëhr3skâ`œîBà–l_ák¶M7±­Ü8R]&â"°F§·{Û€í1‚Tõüý½˜�ï=´‡SHòP² è!›Sªì gઠ`&qz4S¡U–Ä’z¸-r󹄄²r–™ÛÌ«=“¶ÌŸÍ4Ô©µ§JRcðQ¸æœË#c*ÒQyi´StåCI›E>¢SÝÉÙ#4¡U\­<0›rè%ýù‘yG¤Ò;ð³€m'Y¬†•q²àÉ”YˆNî�PFB›mRÎ’Lˆ8‡ ÐXþ«Q.™ð)˜ßוÑ%Êùá°Š˜6²'’6ÊRF†Tr=µ:#¬ðw¥œ(%å•±Îøˆ¥'ç�š‹®ò 'Ñí:¶ z]àI\E˜öøƒ^Æ\i!„Ší¸¦6&¸&¬ ±>ôpUM€<ë’ AⱩqJ&kmB¤Ï“,§ŒØ§níR¾%dšïa›"î¥+L:I{N�ôÂö›M³jQJÈëÍÞc#Í!Ô.�D×Ð-Ls1‰¬r'�š�NÙ_`?�`APŽx–]¨KDÞÁ›blÈÒÃZy‚o&.zvBk TL@MÓèè18MY#¨ˆãOä]·¶š™4Æš�Ãnùk¬’7¶¥®Ö-�¥2 t’n0Ž´ðHfìÊó�КÛL~)¶šŒÁþü(ú¦eÈ ‘@}B¶^* Ae)] Ë!šHLQ•�!²™±«¥ûðDTVBwù{ˆÏ$ëð¡öËÀ$�' ƒ&ì™.«ÆP,É‹¡%W½Ó²õ¨Ø³Ñ‡ˆôžìàõP�¢ùgqìØiÔí°-·•ÙŽœ5{Á@½=YÙÜÜCZ.ÖXÈu^Ó�¢N2oá"ä‚!~E*ÃRÆZªD(õ19‰�À{ ,pZ+E™oÉ—¹Z�T¡$¶œ¸»€˜Àš°tpOIÞhPÌѬëd9¾¯4x,§ß¬mŒ#Ë3Ãtã=Uø@ä´  oáÒ±«°<ì.øÙjÿ§&üÇ;uL<¦r¬¶³=bM–NѹC¹RHd�q¸Jûôi�ñ P~×’zÓ¶,TÌÄ�@Á’ìu€l®ÑÛíxäe²€®ö¥ªŽ«fgYúÎ…‰ ׉wÛ‰ià!ߊ›ä²N&WM|µœÙíwê¥Á«ã+·� ˆ�˾¦›ƒ Y£µ|UYiB6;·Ÿ�ÞU÷’¬�KÊD¢Kn§Z—*"„�ho.õ¥9?ètªý‹_%Þhµ•§EpA|JfšÆ #—Š.)ã½òƒ¿+š‚¬ÔÚ6eäZ¢HHDnÏðÌÅ?jNªÕÆ…^µÖ—b"I®¼°‰¡Ä³(¿°?I\E¤Ã°â À°ãK†9 N*Ì…hAšö†oYÒbV¥?¾Õ ¹ÄÊÙôB‰çäíäÂv‚¦1ˆ*.r ’[ÙTâ†XÎW£AœA°©í•ÃWÊ—irp)ÑK¢²9­ÚÅâ†@–ÕvþÁVíÍŠš7bçuþ«ÈQ•‡nÒéf®dæçbÄçvûª>7Á�¤AlÈóºÿ˜ûz@œ�JÀ%TÅÏšBHq³H`’Þ�@SFüÆ[ _Õó*ƒ< ÜÅ~ ÈXÇ|;�`Ñ8ã'¨‡�:ýe„B•@pu4ÁCDãØò“Eò\›‡š¹­©÷8,—îÁ*Œa—o†°iBEDäTçZÔëL�Vƒµxšh¨ Sö@£2ÛL?“S’ž”Â#ðTI7“lÇõUìªÃŽ›ÛR“ÀìDÄŠI Dèɬ ‚ÉK2:È^%�Q– AÔ¦nÜ€¨ñŠy†³fàDÐ3Eº�kÇãá�Äa ©£u¥6×+«<]0忼ýŠX²ñ,Æ·T(F@Æ»²Ãƒ,ÇGá1Œˆ´G7ˆò’$ð$ƒÈˆ™Ä¾É†J&šÉì„ò®iÑ€ )iyfí�² JŸœA61;_"ÍHKÉö‹Öz<Ì¡0S>réy°©ÑØà”!�|ãî\³D§–l' �4%u` z�ÕbüÙxÒ!-Iü�ë¶bæåãxeÌSz\ì°’0 NÂ�HÇFAër&ôêÃN2œLŽ8–ñÔxû7…õ »¦Ñµ¥D¡ð±�Z«ìÛ7vìl¶ÒµscK„—Ÿ ¬X³ëbZŒôS†2 ½!‡·SX_[vJ¬:HîåÈ™‰%Þ²i>ø‘©GJ ( * (Šk„AÁ›[jˆbø‹XvCIÀRÒ#ò¨a‡mXVn¡/Ø�<@%b ·5öB1‰ }*Ip¾QÇFØpKPƒ2v]"”P6¨�F#Ô(Á�#ÒlD«Sic�kg�Fq+û=¦3¸“V¾oùÊÐ(þIL'Éù”4’Sd»ðôhfª¦è T­!aóùbêx•‡ ¤ \èFå5 BDÅRŽ˜„|Dë�,§Xpö4ØÝ)‰[,s1W@”b½¾™�H™TÙ3ѨÓTʘã”´c!�GÖ8û“µ¨ÿü�5r’²–AÓf7Z4U²ØLâš•õ¤}ÜÉH\,53͵óŒ\��²àp[æ(wf²W³¹òÚ f²çžÂ~aKŒ›Ãìp ¡4“¼$V‡¸„C§›lL¿‘èr„°˜€-ºpq8I¦ðVùz2¿×ñFò35hd/sY2 ±r‰gB¨áŽÉ¶±kÛ€eÅŽu v V�{ÏJÅ!® ·„ÀH5¤¢ˆ%†hZ ­°À¢(Š–0EtÉ�`µ¬“ƱQ‘"ž‘™€MµQ«3.IG$oײqÔµ†ä¥&bx@@ÀP�gu’P”%5D5Àzø­›’°, †‘l4 ,ÅeUjµ½f€F†z}!0WÑ"8n§[në ð4Ά XŸâ¤(HÅeþÚ¤îÛ Iler L�í¿¢cWdv1k,>Îp¬Æ”P6w÷·}Ù ×_xkGi‰¢|_^–µØ±<%hZeBMHÙ%TöUƶ¤#Xî4•³  ù�?™èˆæfïø9‰–_9+‹FžþdjNø\¸Û¦)‚ŠøMRä×@#¬äd¢ x(��‘ŸÐ?‡�U Ð÷Æ<éQ…h,�Ú¾Êä!<&Ï\$dúÞò«Ò“gÁ²† ð”4`æ‚W¡#ýÂÚ‰39… kdj-EszíÎA ¼×$é5T( :§w9ï¦ùqQ?$%_ÄLwx¤ˆõbäœyÏ~fÁ“;Mì[Ù=á§qã’9ÃeM�N+ÄÀk"ºƒÞì?:ÿWK–ϸøš³†Ëì³Ó»»ä˜}^Ÿ8fà��ã®_2÷ªÅïÜÚ"ú °™R­h|jÞ³Ì�d\µøˆ–Ì)kP¯5>yTzi¸,þ?ko®YUÝ ¯µÏ;Ü©êVQP€H1d TfŒ¨QÔNLZÒ­"ÒšNb牚|I¾˜V»38tÚ�"’hEd D ( Š‚ª¢nݺó}ß³Wÿ±×´÷yoÁ÷<ßyàÖûž³ÏÞk¯½Öï·öÚûœ1À§ß~ÓQû>ÿñË/øÒÿ}ý »ÿùwÏ�dNêö* >#á»áÉNT²ë‚Hò\V¶*­tH:iá93bÚ81EÂÐ4~¹Qô\zAüÊ­bUqÒ(¶¸Q¦³® å3·â.jèO�Ù) ü,ÙÏVe&ÀifÁVu¹­Éb°*@uÕ" 5Vb» -lWˆ¡'ô9:×~n ¶yD1�OÆb‡‡Þ§óó²îÇÁšýº£ÐÈY§ªºúæ”ࣣ<Ì>×úQ7)T‘ˆú�êµ:Ô„B ±­Ô{„àŒC£­lj&ÍúV# °;Pãn HeD¸-¡%FM»%Òu¢ ¿Ò Ÿ)]H·{k*KVëh`Ì®AV¶ÂaB),YHH“Ó#ÓóCÓóÝ©¹îŽ™!nŽG:½ÕãÓàF’Ü[¬~µiÏ÷ÿíÐŒ‡j,þð½T›#r'‚3#ÓóC3ó�©ÙîäL7ÿÍÁ—eÖ´ï.5DZΙáéù¡™…îÔ\wrf8¸ð”Ÿï»ÇÄŸ]}Φ‰ñÓ}òo¹}rnèÚuG"àožðèÇßrçWo8ùÞ'ÖœqØ“ôŽ›fæ[ß¹ÿ¨€ñ}§<ÀwíXqê¡O^ú–Ûw¦»]xʃûî1ñgß>gÓŽñS¥ÂkÖ)V^˜ëäì#ÿü®»oýšç^wBˆô¾S\³ûÄç®>çù+N=dý¥çݶs®{ͺ#¹£^#’/ HÊ]›v¬8íÐ'/=ïö�sÃWßw$œ}ø¯?ÿþëî[¿æ¹í+ÀyÂm¿:ðœ¿úO!ÄC_µåO~óÆ¿¹î̇ŸÝ$lZ¹ IDAT‹(úñsïøÊM§¬{r¿3}â�ß~ÓÌBû;?; ~óø_È¥5g¼nýŸÓÌbç;?="‰1132µÐ�YèNÏuvÌ Eg_Je2!IŸó±òÊ4î› p¹2ñ’ÆFb¾-4ä“uZ]Ê…ò-Ël©ô©¼ŸµÒ•`zc6If²z#ÇtåœÅ'Q¬­b�Íh}…R£{T&ë‚7<Ü„*V!B‹0Ô l…ЮÚŠ‚8`{D÷`¤ÕІ‡.KÖ ˆ²>acàZòD¿Ôá­!›�%š�Hbq£Þ!Ÿ—j�*ü‘ûe›¤$ï8@‰\èeär±]$@œ˜Ù9Û]ì‡�sÃÓ#i4ÞgËßþîw\½½Ûî}þƒ?øü#~冓¿ðïgÀ'ß~ËGϽ»UÅñ/®=ûë7�˜¨úM‡>yÉ[oijô”Cžþî}GT¡~ûñ¿¼ñ¡ƒÿÛ·Þ2»Ð®BýÖc~õá³î=hï-;g‡®¹ïȯüøä©¹á$ÖÄôÈιîbÝšœÞ>3Rèè´Ãžüü¿ÿ¹{óõ2X‡ä#'B@®°_MÎ oŸNö#|éû§êmO½°ûI?sì›®]wÄp»wþñ�|ç¾Ã/»å„V¨ßwòÏÛU}ÁI�üøá×Í.´¾xÝiªå§^Xõúƒ6wà¦kï;’"~éºÓ´Â'_Øýõ=slºdÐEaÒ,åîÇ<ÿ¿xË䨗ïj1‚2ø¥ëTB|ò…U¯?è™cHê°è8#"A$øâu§2N<ùÂî'½vñl¼öþ#‰àîÇ|ûÿðÖ�£_þ½kÀYÛô|÷ñö@€Ñn¯«g¶®øÕó{j_¾øë×ú¥ÂûŽj÷Î?öákï?â²ÛNha|ßÉ´«ú‚úÑÃÏ.´Œ�þºõóþïöêó~øÐ!à„î¶êKß|Ëcϯ®cØ{ÅÎt2FüæÝÇ)}lÜ>~î‘�­YµÕà´C×ÿÍ…ßÿì5ç]ÿÐ!‰L†“?=â²ÛOha|ßI´«ú‚þÑ#‡ÁùÇ>â.=Ø®ê Ö>ô£‡™]hÀÄôð”ÙÆˆ÷½, VoA:äÅHG4AdàéÊ ïê9–Øè4èØWPN¨™)±k†‚³‚ï�Ê]§ü>&›­Ê_7SCËçóiÒW;îD�Òñì½ù„«Ÿ£y$¬b«ªúXE¬° ¡B;tª J–48 -�lAJ%´ó2LF{Ké�¦@þG e;*ØÐjâW¶aÊŒl;G ¶R‚™Ôj¼®XpÃíÇÆp_N–x ¥,0¿Ä.¶(PŒ€AzçÇOsTlèXšJwq(u£T8¸ª†[š­³/#®©w©{ÈY€u9sm– Á�=9ü@€g¶Ž?úÜ^‘ÂcÏ­Þ°m·tïS/¬úí¿¿ð]_üÐ3Ûvû«kÏ:ñÓ—¾þO.ýê�ß@‘à ß;ýµ—|úŒÏ}ô©­«D D@DtÐÞ[oÿåkþÛ7ßúî“ê×Õ‡þáýGï¿é�}¶à'<òé nºê®cNýìÅýú»ßxèSŸ|Ûí­Šß.ùì¶�>»W$xlãê [Wj©#öû¡ŽK½r JˆxvëŠGŸÛ+¦ =hŠÉC»G; 3]�ßg·ÉûžØ�"žyÄúSÙð?~pÚ^ãÓ+FgÁ 4´«z´³°}z¨BèTõhgaB/±íØb–J9»ÐÚôÒ8"„À2ܶ´B‹ÞRø–|RvP  4@§U�u&f†RggÛ›&Æ1`„F3_zDé×Xgqbzˆ€ÆGç÷Ùmç}ë×ĈgñÄÉmøÒOÛ{|z·Ñ9]ü© {u¨£Èé¸`íïY½íïüFŸ[ñÒŒuÞuÂ#{�Oßòèk“òÒí1†^bd€@€£óû¬Üyßú5ñÌÞ8ù  _ºžÅáK1♇{ g“’ž}iå/6î)ürÓž¶íFÎGwMÞ�’Uâá�Ä”¦µ2IcdK‘4]K^U÷ò3™8TÖ¦ý™Á})$Ï"yáAgµ^Ð÷è…Y7»�nÎéGWµô/WÛ ä\dj·b»Ûk Ï·F[£õØHµbdhE·;Þiw[­€ äi(¤ƒÀÿ —»™† ¤ë>ؤPUCÙüDp^s$ùü„‚*9rÙ¬Ip³iÄ�èÌfkTÑB 6!J_Û í<Ü´çÈ$*‚Ž»…ešgnÉÎ!? WNY‡+p]]øÉ¢ ¥çnú�-éIùJà2ãm’$æ›Ç.¤(.™:¤ƒKí~ Íš±6 à½�pïãûâ7n;>­ Q¯®¶N.€~�“sC/ìX¦î—žÈбÚ1;Üëëx°“s#÷=±±Þ¶sôƇzfëʹÅÖÊÑÙåÃó¾ñ�«î<ú[wC/NŽ}ý¦“.yËÿû¦“žŸ {ßÿžÇ÷ÀËo[+ýµ¸åŽÇ<åO/YB]̓ðž'ö¿ç‰ý@*4Í&##¢sŽxlÏñé›>”Fº `rvhï•“¿ùÎËo=þgO½ú=¯ÿùXwÑî%ÄsŽüÕžãÓ7=|ˆ‚­ŽÐ9GþjÏÓ7>|ˆKßR²ôlq€ïÑQ"@€¨Š´1;W+Ô¥ò²¦+  ØçþXºËŒ˜lþáã+òÐi•›U§Žœsįö\1uã#‡áhw¡BšœzÕÊɋϽãŠÛ×þôé}ÞsÒÏG‡Iœäö_½æäÏ}Â+œŽØ÷…½é¾Ï]{îÖ�Ë2—@€s�xüË¿su·Ý{jËîúíóî{j�‡úÛ~uàÉö •ŽF’sÃ{¯˜¼øÜ;®¸cíOŸÞç='þ|´³Ð'L—öY9yñ9w\~ÇÚŸ=ýê÷œøóÑîbòŸ»ŸØÿîõû#À7î\«$bÁi¾7¨´,–YAYÂËÀi™×Ú±{\FÀôLŽ‹˜�Zƒ³,gÒŒdë¶}uàcycFŸ~É™2 Ó²)¾ë—Þ.5 Èä™dDH¡êAˆØ¦ª mÄn»ʱó@iMÖbzæ%Õ‡H§ˆ¢<.A穌,y·ÚõÝêš^Æ žî@ùH)U*á•“ô{èF3‚WÄI7Û»edsCz\�É^Ó^û~ß‚ôŽ”ƒ°‘ÐÚÍIK,FþÕºÊĬ'àÆaø×¤D[ëÈ7h@ZdUf•;v±Ù¯â•]¸·ÜÔ› ¬ƒbëvÚRú®–AÉVp!Ù &—yɽ¨Óì€p¡¦æ»#C‹óýÖιáH#"Ъe³¯^9ù‘sïþý³×±jBœ]ì,™~bܳ^C0h(šx'�lp²W $ÃÂ3{òSçßöµN~虽�(@·ÝûÈ9wožXþo÷uÀêíP“8""žvØúO½ý¶¯ÝpòÃÏî] ÑéÒ�'?òìÞɇۭúk}ûì#OmßúØk~ÿ½w®×òZ³¡INžþ:®ðáçö&Dê´ê¯}8¯ðkv±#£MxúaOüÁÛoûê�'?ôìÞÉHÇSÕ!^P(Ѧ|Àé¯{âÞvëWo:åág_DHÝvÿ#gßµybù¿Þ{ä«·B´=²¡Ik[1:ûGçßôï?;|Ý“û™‘)ÏÜõø~oýÂEcÃóo|íSÿï{¯ûןvÕ½Gñ£Ž%@¯Vï#gݵybü_×uÀ)“Ly(ÿó™wmžÿ·uG(‚.¹ø]Îê+ÙŽ /¬™•ÝŸóbA 5ä º�È^wŒ@!ÐûOyðâ7ßùÅï�zõ}Gñ¯ì˜~fëÊó�ô/¯=û±�{ ¯yöÅc;f‡  ñýoxðâsïüâ÷N½úþ£(Z¼Bä ¿êÕ뎊n#>lzi9àø ió>:ø UüÀ)\|î�_üþ©ß¾ïH¢ ÑàÆíãˆãÒU~i†`w]}ÿѵPµN"ó† |ˆMÁ°ªâN~ðâsîøÂu§]}ÿQ1²ýï˜~vÛÊó�{ô/¾sÎc›öB¤µ>·erÙÄì0ˆ“ˆ«É¦J€ûŸZsÞßü~4Ä�Ÿ{çªå³võ¹i³ÊˆÔ ± Ð�  »€vÌ?ûÒÊó�{ô/¾{ÎcÏï'øì–ɱ³Ãu zé—›ö ˜.-›˜Î{Y<Ñ!§s‚�LPp~ªÍD‘vÞF¦l›A* ò5ÄX§gr ·pý;�qwyUS¬ë”c.>‰ ¥lX(o™Ô‚ÜRôYI"q*„ElaÕÂn«Õiu*ÝS¢“ø4õs@áx¶=‚¤¤+A‚Uh^ä·£¦ø¥\îÕ¨¸ûÜ'Ê®rdæ3‚ÆÒ™+ o#/2M ÛG�ó¬4"©�q é¸3 ɧdDý9“§AHÍ`‹¯ ðÃ.ì%ÎÕ$jºÓYü�gÙB•…-¢b'ŒŒK˃Jª¾‚9g*G.k-WÇÒ¾QÒOQTt]è<}-‚‘�µ»52v3 �'–�wÜc÷<±ÿÄôðP§ÿÜK+x�<àøè|»G;½n§^X¬Ò¡†³;熾uÇqŸ¾à¦�sÃßûéa½~8xŸm«—OýÛ=Gõê*ï ¸‘gí�~Ø“qá>ûoçÝôðAKua© ÇÁµ«ú£çÜýá³îý§›Oüõó{þê͈Ð�aÖÝf:×®;ê˜6uZýÃÖl^{àÆ OyàK?8mf¾ÓiÕ=û®Ÿuï?ýäÄ_oÞóˆW¿@D5… [Wõúá£çÜõá3ïý§ŸœøëçW±ïfèǰaën3 ]?ô(zF'­ï/@§ª?zÎ��¹îë?9éWÏïyÄ«_ ~ ¶í6;ß!}f�Á‘î´âGϾó¢3ïMw¾Ïf¨)<½uåìB²ßÝ� iPúHý¿SÕ=û΋θ÷ë·œôëÍ«�xuêWµaëÊÙ…Î5÷}Ìþ›:­þaûn>áÀ�ï?ùg_üáé3óFÄ3[ÿ—ïýÁg¾ýæ›98Õ9¿Ð~jË*UÄÄÌðP»÷ô–•½X� -üÎ~ºqbÅ3[WÖ€o:è©wÿÈe·�¸s~HáìôCŸø«÷þð3WŸwÓ#%C™_l]sßÑÇì·©ÓêöêÍk“ן>»Ðé„7¾ÿõ?ûâõ§Ï,t¼Y›HßÓçߨsëe]uó/_ûçß=×v¹0³Ü¹ Ê!Ê K†*.9æì%[÷°ÕUa ²{^Éá Ø›#ÿZ‚Z»Cž².¤)o‘7±Ó­$ÅsQe¶‡!Ô€}hÕU+ ·;ž¦"E¥wá›ù9¯”žäß…€(óˆ~u—­¦(Q __^Aè3�2R�ãeÊTAîŸ䣹§ãÙ3m ä(Ô-ššÊä„f�g#ÊᦟŠQûITJ²i=‰ÇKÐ2ûלP‹4 íM YƒÚQM&óÙîšýë�Kø|*œ•GôJÇöÀOÎc\ÀkS¬°Aă‹+î3zµ©á7ÉD™z/ÑTcà%$˜]èþÅ5gú‚›¿ó‡—U!þûý‡ÿɕ絪ø?÷»gõD…5"|êü[þËÛnÝ8±ò?~ù½�î¸F‰®YwÄäÌЇϺ÷¢³îE¤ [V^u×±1ýB¯zò 1€1VòK¾•ŒÀôs2!7ˆ¸btþ'þb|dþ“o¿í“o¿-��šúݯ¼÷¾õk~ôÐÁËGæ.:óžÿzþ-›wŒíÆ“ÓÓ¥+Fä®·ÝöÉ·¹»¾ú¾§·ìvþ ƒ/­[¿/º_-)Y˜=Çw~ó’Ùw·�V}úëžü�7Ý¿îÉ5ùú»G:½wœðèøÈü§Þvë§Þv«Vø¡¯¾wÝúý¬oI/Ä9®#³ƒïúÚûÖ­_³×øÔ7?îÚzãýëž\ó‘ËÞ33ßU*3à/+FæÞ±öÑñ‘ùO½õÖO½5¯ðÉý~ôðÁˇç~ÿÌ{þðí?Ù¼cü«7�rͺ#ó`!V²­ÃF´Ô@€ýºê´úŸ<ïÖ}WMÄžÚºêotê•÷ë19 TéÑYGa,Æ÷üáÛ~²yÇøWo>åšûŽL7 ¼”Y ‚Øß5»ïXµlö§Oïã€74¸CI¥pûAe–:駃:åõg!{&gWqå4pÎà´ïh ˆãÓ$¯}ó:rb{7,Vk’µ<‡ºŠã2Oí%Njµ;­nåµZ�é1¤×Ñ#¤ø�S­h’2ª‰×€7,Y²ÍuK¦€ƒÂ QŒü6#Ýrbê–!ò: ò’&7íæK˜6è�r59²—'SóG« 7Þž�2‚’äw¦låQÚÖ}QÌ@Ïâ[Þr5QœŸÛöto#bž1qùêˆÓtØ4îÌe^«rKµ&vÉênÄBKÎ_�4@üæ1¹/g›L=9 ¶×›ìå¥bÃÛœåw •Räö˜cDà»æÄ�í*ª¥�8!ÿió¼ÂÿG1”Ðì�:C.Ž�>ЕÎ4GEÏÞ.õè I@óf±øÀ/IÈ«Dà‰¦z¿‚“El&G©Õ‰ÏÍhC4H ±fš�7¥¸Ë~· ~mŠ•)NŒ šKÈlöÎÙ� \|ö�ï8îüÊ·ì£! ¯Ã]ô-.ïuj>›öq_Px(A¨:Pµ½›Xå GÈ¡BP LÑ>øqP—üÜ´™.Ïæ-ùó¬R!B€¡Ø í0ÔmµZ‰²Ô¢*Ê4ÄìÍ<¥Í:ÉeC�q¢(¯ÓKdí¥µZ²Ø¢Ó€7ÜÅh³ ÿÚn¡gûÌÎ’ÜtÀ¾ÚÔAEá>‹ÉÛ>_–!PÄðÜ dß?y“ðšP¶’‚�þÚtER×h›ª¹hNrPP_ÎÀ…%�á³Ëã%íà&äÜ^–ˆePÔŸ7Z�™’×ø²~_ЄŽ|LÀüer¹AÏÅH‹2�U�µâ6u¢sc_B~ñts×GæÓI߉áŠN;vľQt⨀tåFPó)÷¦qyÇ©%nøE!þ^2(:áGoobR¦P�Ô'¹aÒwãe°ã‹2„üé�¨ˆ¨%�½º߉$=‘#KYs7:”qcEE¥|I³f|Žt ô�Ó3A§ªõæë:dËÔ5j€bÓFsxK�‡œ�À\Ãç]�EŒ=m2|öÊ)™Õù%‚BŠXn#$mfzUG“�ü� –+’äýBDÄEÄ´¡Ûn µGZU�ü!WÊž^Ù˳=pÁ¥˜�½uÕ A6)HA›¸¥F"ÿ\‰Œ;éÛk%÷JÜ«gÓ]is’î|öÝå¢2ûqɬ Ó&Îëð$5+Æ9a§Ö y gäÀ…/ó¨@íÁ +ÜŸ-Ñ,ÈP¤]œ@~ç¨W$‘½#ùh’²JÔ}—¶tU¨÷ú@¡àWŸ6P¡ëê?_ön4ÞuÔ �ˆÝccºKŠUžÓü¡;�)Fù²ò�jĪh¾Y“WsyÝ1«z®aŽ-|‡Åd‡ߣè@²Á(+#…EýªÓî uª²{5»}®zqÌkÍÂÏ \Â~:Päš}y“‹�áeû�Cæ]Ø—ЧìÔ|ÇQ#’dúÚx^7SçΧ*5þBI+Aò¥ënMAҹ饪ºÃÍ¢ækô]3¦N´Î¥ 4ß%¥ØÑ,Pj_úìV†}«f” ªEÞPÊóšB€ ’3.ß)�¢ˆ§S;�Ê@Méò3…½©[V´æ_íˆ=•ï4J)O™ùaÑŠêÛy¥¯úµÜ¢S4ϯ`ã.å)>Cˆ=‚>t`¸ÛjU"‹,™ë¿BânXx­T -ZªÌž?¼T« ‹Ñ’¬Ó¦baaí­! èÌÍ6AÜyIšL^fif`�i3›Sº ›n>0"¶•”õ¿«cbƒ.}#}u2ˆÃ ëÚ¼H«@ ˜›9zÓ/‚ ‡2Dåm®Ù¡Q†¿„Z¿«” ôWSW½Û€H§‚¹f𿀾q’U2t<2 “ ÿÔÆJ:diü\>5Hàû‹¾GEKù�/ °zx ðÆQåN’ïËzá”Lz ùñwYeTCñI}û9Ú@g`*•Bƒˆå•Åãë¶Ð+öh Wt[>cѢѪßÑí1qà�ÒE[@qÏžæ]v¤‘|ObèÜq…¿ÈTDn ‹¾P㌿DIž¦ý º=WHVÞq1ø�ºIX—²æÜWŽoHPXÆÍæÖ2­t>b~],†'�ÈDhdßÄšg/¹°\AŒ1W¿Î»üô>n+ÁF I.¸�öü’) ÔˆóTÍTCq|Åðª±ÑÑv;¨ThMÈŽ)n*ÕÅy`ñ&$.òaBk¾g27‰‰Ò&#´þH0 ‘(x£’_mÕP�Y¦-€0sJ’ä§âdœjˆtþ)s]A~^—º#´¨Éôí0^±¡ ø+Ò†&ä^4�“,ö:äYŠÄ¿ŠÃòÊ’ªƒ¡œQÀyÃ.‰2´<ˆ}7¤§òr¿å®’Ø ¡œ°Eã`ºvAX·"Z9õä3^i\âÆ@¬6«… SfÑÌ@8¥üjS&p ¡ “N[ùqxKÃX­@©‰wÁ˜U=‘4W×ÿÉYKú”÷ÍÝ% IDAT©ŽüM £¨²6>·éÔ—é `¦4ç'j~Kq€ ×l+²ˆÚé|¢Äʼä8ÝrpÉÝW±$ÔÏ,FB†R”ÿ[`¿ÃË%�‚¦š¶X3ßݨùÂÍ"•¥5!ðàÐEÝDÎ{ÝDÏÌyµ)/j³gYE@{K•�†sXqôAöüng(~¾«À(3MwUz 8 ­Ù¡Ñ°jùèøÈP‹§´’isäÃŒjêbC—àO—·ÀŠ E€ô¾•è5'ÿ$Ï·õ2™®ˆ‡Tˆô‰} †A¼„"Až(QŒ ,@’[BT tÓ,:Wð!Ñâ!EÊ X¸ÆDlpáØÆLŸOjDkIGØ2@³8ÕµÒÂ2yÏL•ä\�Yo–ò÷£}˜–+Æ—–܆ Bg5¾$Ý ÙQ“,­>[#çíé€nÎ(³A?ζÜú¹+ê À@RU‡Å8øÛì: -Ú‡¦ÐšÉ�+žéýL¢Qì™s’•‡”ka 4E©æüÖ_‰$^s¤GÉ4šLîþÖ&e AÙ3PôÂA?è: Þ©ÉÍs¤ ŒÀJé� M¹v&[°Ôâ š¤ašlÀ¼šÍ@cõFƒæ†Í¥Ê=åúAIÿ“ [KcHÔ JÂtÃý†e²Nlåû©9ÀBØbë@Cs–ït— p¹ÕØÇª‹¹‚‹-Ä®ZÖ¦X#©­s©ìL&¸êˆ‡Ý�à©Òb =h㲡îPUÉœ�á$ÏŒ¨ý´Î&¢¥E Iº’ªÀ‘göô©�lÜÁâ5ݵ«N.S0_ç �OϪ,à&  94×9ÒÙ´bx>lN™ �Q—£çŠþeP�¢å¬V]¶�ie­d\¦Ã@:²#1�&@ ÈóW“‚¯ Õc"­œ<šGé2�‚…ß°ëR¶#¥YaÑŠ7â¼5Á9‚X IÙßF‡|×Òøƒ,`hÛE«hû;òÁ–,‡^ÓºÎ.ú›Š,HAÖW³^‰ÆÄcÁ‹¡„Ï& ¸šÌªeÀ1Ÿ×)ۉᘥ×$£ËIÌg8Nv>ób÷ók4¥¨ä>§jƒä]…ÿ»‹uó€K«x÷µ›Œ�Ø­ÌDŒ8¡æSÇz/ƒAéEgLEƒ ÒëD?Ø‚„2«õFË@V©êÙŸAE*�Îkha›-ã8 £NËò&¼,¨´bˆSÜÐ0]cÖA•§š‹dÿÔ=*o±š½6“DºV¡6¡š²¹+ŽMƒ1]ÞK,}A$„yÀéV·^¹|hÕØÈP«EQ²±L¡Œç~YÚÓF‚Ø P™áé´U³P…–ýÃb™©y6?@y”ÄÕ´÷é½ÿ¢:um�u�Ȉ‘�]ó‰Šs«N��NWZ\LÁæ¦dÝ$`RE ™£cß<©©¶o�t�ÚàÜÁ"ù´Æ&¼I(*4ûÑÑpõIn4<îgÜùbÂÕ…þßòF¡(ÌîRX²‚Þ<‹3ŠGb%nŒÒ^/íRKà¢�»¥«WÇ�/P1NÚ…d.•F¢Í <6dË?äÔ•iÞo|™Ô­óš‹á A·;FÉZô´”I"å3¶p›¡ô†Ÿ"`@.ã컣 '[ðM&˜£"ŠvK&=:W¸°\ޝS CLGp?¹7ñ-&¹Ø {> �M|/Û™o¨é6<²bäÆ˜|±¢jžô†›º¯«PRÔÉïùÄn3ç%Ýß• ƒ·cÌî³y¥ç²�SÁ¼¢»âëhjpæŸ�¸‘(.ù#têS E¢¿+�,¡(Cdá 4$“ñÒ9_2£8qª5+WŒ®n‡Šd«¹…–R¶Ž1Q°"(½y 4Ö‚U"Œó!ò�joäô n”²½Úˆ�Ìv äY7“Fí4¿Ê–� ØøYf 5Ò?Á¥Œ•i¦�¢*v¿'’d`óܬw|„B1r Ûlµs×DÃõBúu¡¬Í¢cëR‚M9‚8 г§;£¸jŲ•CC-Ì÷ç©ç¤Uyfµb�‰å €€0Ú‚XÑ�n€—âæéŶ!H¤¢¬ãÈr¦�nòz?u% ^Žå¤±Ó¡H¤ÊFÙ9ï1RIJ)¡òáaÀÙëçÆ#…·Šç²��q†¼ ¦@Ü<ºaÕ$úêÝðqLãe !M4û3`Ðm3’î‹–¥¶$Mf ÜJÐAî9*PXƒ:ï¶Å<Ïtç¸K@ôNù0ŸQÒ:•·;“d«•6,/"KÊ' ¤YÔt…ôºFâ�š›^'÷ zÙîëAÀ´*Û^ñ¨oæ*È»?XíAU Q¬Q~'§äÎ\|òBp h�ÚIm9©‹€ëzZqd¤»¬;‚€ – ÙwåÙhú[ì@@‘ ´�†ZÐ €}‚‰¹¸}ªžœŽ‹=ª Ç–‡nÕŠ [Ñ=2’r;Jd2Å’�ÐÇÆÌKù>Á6=¼¸É‰þh»¨RQÕ«jÔUä´ÂÀÔÅÿW•´£c�ÆVˆÃ¹ újïÁ¬” ·$µ5W°´ϵʩR:̉• !È&¹l–÷RÌAÖ Àg.ebèYëä€Ãwœ Éа,ͽ*2ov�47@‡Nz~ãºfÿ5»F~ª§:43Oò‹iýÑ;o¾òÒ+öX6uù%Wþé»oùﻣ¤ 8�"™@ë‹uG Å�$ÿ'¡q*Æû* /é�/¸ù[—^¾Çòé+.ùægÞsCR@3íçE£|¼4Í—fþå’o~ö=7È,ŽUª²ÙÏ"b4“‹³/ì™nœ%–?5’<ªTrж\–³‰²JÒ'm$ž "$Û ’FÖ&ÜÈÅœ÷gnd�¢A‡ZZM¤øÐÌö@³!×)ùŠ’ãÓ󨤹eg:Gç6Š*²5ÚäT+Ɉ6ƒ6†ô#:ö.ú›ÃÑ` Æ7‚Ø/4Mî¿�µ¥© ™Î$²¶­|†¥Dë™§Æ–wöX1¶¼Û%{ꘓгk ‰_„XÁH•Ò¿Ø­`®OwÔ¿Þ8ÿìæÞÔT D­ ÛUÅV0˜Õ%Œè¬ A¦Äæ„DÉ+ ø'¥±Ü?ý‘1J9Ûe+»š™Ùƒ"i»²Ê)A 4eòÍj‹Î[d-×�Ä46iî�”y6œ,h&ÕbÜQ¬IÃÚDhÅ1=¥àÛÈ\K‚o° ›€$fõj0”6mc)Bs,©H:á¶xÅ|ާïU¹z�qh¶³ �Á7iènÀèû’úÌòi´”Šì˜™žš^èNÍu'g†üÀH0§4è>;IEWII’…2•$•IbÌ$1¦»àÌÆ?Ý‘g¯²¼&ÉU$Ò ‡¦æº“3]Ò(”š]ö˜¯®~oº’ª¶?nÚœœ4ï冓 iŽzJ{Ê�/žoõ‘ïFv›ð«wædªÅI—ÙA7õ„‘k6í.rè>7º:ÀzòÐw�&ÜH¹‘§œT:+ÑŸµoñ­dZàÁÎàO±B2‡œdÓ^Z¹�³=H*N£!TîM©€×bS1 0±‡U» ’Ǡ˥%²*#¿$RžrKQÏÅÐ]>4Ò Xƒ‚ÉËA %Æ€˜öž¶+oA'@@¨ ¶Ïö'¦âÜ\¤(Ž� űnQGYÕR­x�øô>hêF¦¨¶N¡9oTx°©6¦|§ ÚÈFµ vuusïw’É+Jèƒò¢A”‰*éV&|ò®å�ž´Û¤¿oa¸#Þé’�çñPXêüÞzÊûl U…PG-¡YW…BÙ3 ü“ô( (€Òåýñ«ÖBŽùPÎYdòÍÅËìkY´JŒafùF¨à;%JÛåáP×�j®‚Kä‹�lSD;¦GvÎuûÕäìðö™‘¤éåÃóßøø•?yä ¿ûáÿë;n>î5›~ïË¿53ßm…þ…o|øwN[·ß;f:?ßðªÿçÛg­a¨*zë1�}øì{Ú{ËÎÙ¡kÖù•�2574:´ðÕ‹®~Ó¡OÀ×rÂö�cÿñìucÝ…¿ºæ¬oܶ&¦‡wÎuz,†ŽLø´Ãžüüøþç®zó~p�($C(jf;Ÿ˜Ù9×]HýšѱC€‰™‘�sÝÅ^�K#†ùì gÍsê n¾tíB– gÃÙê�Ø«³ZÎ9ëc ¢œ<�"ÒêÀ«Š4pô�õÜØ—¬³ ¡g]ÊUTà�“Y–£ld uŠÊãîü¬«D˜’[0 +Ú0HÕË åxD‚h�PŠó5 ¦ògU åk̤�Ä,wÔT�WsC/Ü]‚؇ÐVĵuMÎ4ï�$#Q·ÓH" …>-Œ.íŽTˆ5É[ìƒ{°SÔhLƒ@˜8 †*ª¨€jÚ>Uïœî×}FxYfb:ëŽ�Ævz»#*ré¬Ú‚lpë ²òʼ£J³¹rFB‚~e[våN H1%s,ì†&·æ$/9âfI«Ö¾É�Øýœ»¶LuDó$¡m7äT7Ì·˜q÷4ͬ–,tþçì6Ú+%.`%óÌ•"ÿºŸ«ªJkƒ$ÆÐæ¦ÖþýüÁ½×y&‚ ý´jÔé?äùaõ{W_ (öÊÒ5�‚öë.ÙpQxfëøHw¯HøØÆ=žÙ²[SžæmǸùâ·ÜñåëO¹ù‘ßéôØcÇ–É婨'<üÉóoûû¼ñæ_¼vßU;>÷¾ µ{yÍÙ3s�ßþ» uÿêý?|׉¿X·~Í»þæCs‹í…~•Ú{vëŠÑîb$|lãê [wK=W[¬#öúXGÌTZêœtè à™mã£C{ÅÈJ €g¶Ž�v÷ŠÛ¸zÃÖU~ø°Ô…Ö–0üN�›@ùàZØk‡b¼9�»q¢`OÀ¥YŽƒg/¹É�®—Ó‡ázÝŽ'-OªoÎïsÊ4&7÷äh/۠컘nË&UƒSæÖ=S‹ÄJƒÅL”$= à Û3«é�YÂŹ+£�PQCa…&%ßja‡+KäË7c‘XQ’Eñäjy]µb7îNôR‰¨^ˆ0?<Ò^^$€¾¼#0 ðO!¦4�"EÎ:R0ZA·¢ !M-ÐÄTf6BÔ Í�H×k¡CˆÚHüò}Ioë& È" ÍíqyÄ ¯L4#þ*‰ ÿÖëD¹�¦z)T°Ñò–¥Õ`/Í þ9÷Djœð`ã (Ëa2°ÈŽ‚„Dé÷i £3hYŸÙ༨Њi‹ô'P¦–¬hÖ£ÌÔ¥˜¤ÇVÀ 1‹"’J«'ظª.àœ#¿„Ž;ÁuŒt•­EË<6 [’ói0“¹«Yº ,0³rgUÆõeé#'~p#PÞyÏãûßóøþpÅ­kU#ÎÕs¹1yÀæíË7½´žØ¼:[>¼pá¸êŽ£¿u×1Dð⎱¯ßxÒ%o½ýßøúç'–ÐB¯½Ðo÷úáKß;mÃÖÝ$$¼ç‰î~|D¸üÖãIÁ�G€îxìÀSþ䨂ûP <Ö½�pÏãÐ7n;>ÐÁ½çñîy|¼ü¶µž�<ü˜&]Ìšë$Cñ¥¼W8#‹¦­ÑéngSCû—«EIm)X�%i[.#žÁSPúi´/– sIÍåº …^¼IĘìˆÑ¯A¢Ïü7‡ S)€¸$çYAIGÇ2­‚$i…:ü|Å÷]7­ËNôR™b¨ñyV,ô–éÐÍ®ƒ*•ܸ¨ÝkÛÞ¶±¨cM±ÆP9öJ03B̯#¨S`\ì׳�áöò±åíÒl•"¥g#->Ѻ$ý¡‹DPmÃP€°iût=1Õ_\ËFв‚þŽ/"ôj§n«â¬‰³l«wHÛÔnλß[4d•|l´W@hf˜[ˆÝnþú•G‡$GùAˆjf䯕eˆÄ Eåò“fï`Fa.ÒÀ‘í•òD?nC÷”=Å®@«5³¦ô´(‘ˆ°`©EbôÏG: ?–Ôy ïp=ËŽ�Ž£¥«Ä Éam-;o'åeÐD ‹´@úùt]EÈŒÊÝéÿÍz忺ÙE~¾î¯8RèðÀSû\qëñŸÿíë>°áU—ßvÜí�Ø�¬Z6óêÝ&?òæ»ÿœu©|qv±³|tþù‰qíГ/®Ú´}™a¢¸­ˆ)ÄC‰¼°Hh³ð�îóg�´Žhg4+ùž:­È‡AŠ(šÓ³¨¾”†Ès•ÓçåÌš©zðyÅM ?´”€uð™%Êb<’¨‹ ·«jà¡&R”AG‚PRW~r& €JQý®�q}D§Ù\P¦;å=\uÁd�âžÁø/9Pyò˺­©&§5¯ëZ2,ä¬8³JL¿“ãèÓ‹ÂN�p9©�«™ÉõëþLÕÁ•ãcÝV‹@v‰¡ê–yY¡äª¤G jW8ÜÂn X¨iÇTr*ö{”a�ÝM¶ô¨nÓ²áJ’�„ÏÕU65cì$$ jÓù�*YÇH2Gy›„W1æêÍðhÛN? ìeÄP*ë„�H%9B ‚ ñ F[6%™#òVjŽ x©Y8ÑBv^µàÁy-–tV˜‘MÎGÂÓØBª €@-±ï�çp!û Îäkî ¢ÒQPðuèèƒI­¿œñØÞtWÌ€ÍEë F’ï¹×Ýoe©*¥RPœqfSªÅõ-g$Ñ…Á«_�(:Ùi÷ATÓ««¸þ”½ëè÷½áÁ¿¼ðú [W~êïx~ûr"¨)üõwκùáתXuÄ­“Ë<ú-ôÚu¬¬}ߌ˜¯Ò­lzȵë1Ï^�]ÏÊ'M%£s»¤À “àL¥©Xµ…’_E �ÇrHR*�};]ñ:ÈRnÖ\ieàA817B?¸<¡Î³û,R/àÞ}vÑÚ6õ¢FÙê=ªRŽt /m?Jäï{ór‡Wk,‹¹Üšhz Æéb`}ÙtÓ™�õÜ)65 ' ™ó4ï®df#I¬•%igýnõäwr0ýZ˜K92ææ†å‰w²ôg¨ªW¬î´cŽ˜óê^™í9¬¦vÀÑtÀBŸ¶OÕ;§êèv÷2 ñÚ´“à‡G©ª(” ~–ÚH«¹YŸ4Z#?M·zè’2¶d  [Ÿ¦,`#Ãb’×4qî—ÅrÜB*›’X:‚ù»ÞJʲO0Lh[ùçß ä¸@”bY½’Hdq‡ý‹ˆZ†*j#Á|¤­ ±%}&"bI’3ݸCGÃ;#²6M3ðH“{{ÆfË£ûfƒ¯³XÈoç¿êºÙ>¶@ë–Ô¬^iÙ‘ fœÍqN£˜+iò]¢§\ÀÔR¤:†¡î""a§Õ;põD‘!Ûºsôïø†ïÝwØŸ¸ò´×=yå�ÇnŸÝ<±l¿=^z~DZu–ß)E*ZùÖ!9¶Ùè½Á#ˆîýËFÜódƒ,Åq,2,qf~– Q í¢@Ÿ­BíúŸ�q#Œ²ãÃ)ª)3‰}’ӎɉr� XÕØ(DÕYg}?½‡kŠ€R§´ùÌ ´˜ëQ{çp”–ÖfnŦù "¹ù±Â™Ð•lsºZšÔÝYÓxóºº#÷qpe®¢Ag(wGqBã²É¥»bªN®OÆÊ+d´ÔŸ¯ãÜØ²Ñ壣P3ÛéÝéFGP€@1(Gv+iA+Ì-Æ—vÖS35E7È"çV汈} ÝGÚ@�S÷q‰F,ŸO˜ç�}ʈH &� É?ÒE>Ïa¦r0pˆÇ<¦ŒPjB4¬Œ›ga-ç oFNÀë»êF<,ì°”šPΦ 0 +€¦R¼Â é‚��ÆÓb%€‰¡B®B "ÎGzq>NÌ÷ê~ ”VYÀ~‰ÑÝ-£Væ„3øÈüÌ'e!tƒïæ½ÎÁ(/�‰Ñ „¾kÒ˜Ÿ;„XrÈ�¸*]ÜÄüÌCJ„R¥å´Ñé*Y1 Ì.v6l]uÎQ¿>öÀ�«—O}ðMsÀ&mõø×l|ÇÚG×ì¾}õøôq¯yn¤Û{iz€vÎu¿uÇqï8áÑKλó5{½´fÕÄÙG>þ�7þ¬]ÕéÆáÎâP»×iõG:‹y2Í ?z¥/j†Ó[×_þÝÙG=îìÅuÙiXð¡Ä@²¸¢õVþòÚ=·ÞþçÿðÙ÷ü8”‰,‚ÒM\1 (Çó*̪’Ùšh§ �5ašÿÒô|ݯ¨•b $/ v�«€c*õaÛ ¡’iL¤±†çLm­e€�§É_òE¿Ã4ÆI¹ÊÌZ*™SM›êo^ý`KÙRnS2Áuâ@N;ÉRôcø»ëÞðÙ÷Ýð/Ÿøf¿7ø·زsŒ¯ ¶®¢é¦0Î8«Ëf×Þ½|yr¸9èªu•[*+Æ_Ä ²«Ò}yÿÖǬIsÍ$:b&ï’¾‹œ§Í3À>)uµMØ(aì‚ Å–¢8Aá�¯Ðž)Ap]êÈ%ÉŒ¬‘ÐÞu[ƒ›Vês” Àà‰Û#"IÖ¼m#Ô ýþÌØò‘e# ¬ BðÁ–�M­¼²ÚŒµ¡æã¶Ézrªj|ą̀³yDÒz"ö`_µ²shSTÓ»“)ÉÒ#wJ_�H sð�lJ.;¹Š—*2ß0tJèÒmæUޤó¥c­ZV…l< ý¸Ò ïÐhðÉ _8f?ê¹@„á¡é¥¼0³Øï÷¹IÐåqh™ñIŸË=8Κ0ùAùËHꔕ¸�ó�³äX&¸Èš2pD:Œ¢œ´"Êõ`Ùú"ûRÖ_ù@¢c jÔ&ɺ̭ª+�„FãwÓÇ@žÛuy0vBH3â6Tøö¨†îo¦¬†Ü¹÷�‚uZõák^¸þÁC¶N�ñÌëÏR:˜Õš�1¤þ6#’ÍN8¨�ú}éVòlQjŒ„¿SX*ð©òrÄ2^˜¤†„;å<€5n45È{*œIÊÞ=´G?TòYßÎμ^ðÝ/f³–Bé\,%U <ܰø^óÅ^$’¡¡¬;t[Ìæ\^f“\`–ÚÌ_þªPˆTEyXysR½0:aõêñV5 ¦§éxû®Î«8ï!=�à VÆ:0T,ôiëŽþŽ�ýH|Êl†A:'pŠ@Þÿ•` a`�±à‡ÕB<Ü:-ëRY4K³7ÁD(�täx+– ˆ¼Gçä m!ï3h‚Óöƒˆ]!hò×@lÁvËKÚƒC¥ýÃÊd*v«™^ÃÖv áB$xi‘6ÏôæûÉäë”Ó&«¥%5f~’GsÅ,¶Œž °õ„âE6|@®ì"§ìòº3g(Ü:+@)¥Ø:¸c7ˆ·v þ�¯˜Z*,�çăéÏ$·�:ÂÌ(¾ ›¯Ð½’#JnI&BÅ ¶•+™•ùM—ó/T@°ØùÇwç‘U^æ•ñ©æ@ðW�á)j»¤'wù`óF» l ‚(¬8�-Câ²#*ºÀ¿¢N©ª¬tf•ÒõTE§ä#È$n¡Ù=ß!ƒCKé V]t;miצì¬�e ’¨tD¤ˆƒàFÀ©B>ÛvoGÙ„Ï?…õŠ�|mZ& ä<]6>@¬{Ôêr9×õûs‘–¯êAäݾ‚’µ¥ÍÃÉŠÒ~–š¨…°¬ Ý *„…l�¬·OöjáÆ(ÙZ˸zd!±ǬÚ1¨ Z]iµtg©˜!yüÎ(ÅŠÐïyä÷*Öö#6ö¤†H!û¤€lÑ%…’{p9—Câé.fk¤n•¤Ðô “l€’t�ÔƒäF²Õ`VpéГ d ¾mV)SØ„h,Y4Ú‚ôã}S5<7Ó›�ëDDà¥qŸA€VŒ²Ÿ–SÑê;²´"•�¶Iu×f£5ÁŽÙÄ^–‚LÇ�j?™CdüWR¬‘ è»è#¿9‹>›Eš�æh´„G›•¨…¨�4uNŽ_³Ö .!Þ�7¨UU±›ÿï‚k›è-ͶŒuò¡9:’lHAEL’dQAÅmóÓ@|l¢; ,�˜‚4§©rZ�dãÂ!‚g¹js)Õ›³wc7tÛ—ÌšÈ|$‹Ý�u¡Ût)äc9*KÀhåö,°Dóv£éqcvt=ËrŃßd߯áe-j³«ìgÿ†­¹YtíÛDM o~ ÌÙy­ß„Õ™Ž_ÿXÃØ#êpž”(©;Ö ;;íËW Ñ’€ÄYÇÔ.Aäéµ> 0Ú‚±vz!0¾8YoÙÞë×Éx¾¨�æ±Êg×:ÿTÇ7Å"„ù«Æª€!‚D8N—u Ži4ò[¢²0H3Ø)cŒ¼ZÌYÙ´øJò¶ àmGa„-2*Y8„FV»‡Î®I¶,Øð:P–ÙÃîÌÌiES§-$Q§˜�ÿÄHQß›Å]taÉ¡ßp á€´aÓ|½mf#ÿÚH-i¦4,"-"P tO¶êÂõÅL xc"v¯uŬ`nàÒ‚Ø”nÐP~4¯óGd<Ä·i}XÞihœ‡¾½‹vI’sªëFv tË´é}YŸ=Ê”oŽåÑ¥Q¹ß­5ûåi�h¬ÆüGàÚª…6#¡fÚÁ–‘„ ˆ?+}±L†ˆzã/‘Dbî’~ÈJjwÉ[±o LZvs®É =u®AGÙx�¯5á–ÃJ>Ý÷o@Uâ!Jdý§&3�dߊŒ·—@ºâØ×÷VAÀ¼T•—«Ù©©ü j¯àS¾ž UnJ�|¶tY.ú»Ud�Í&»R¥ÌþÈΫ©Ø† 9Ÿy£+ޱU'ÝE±?ãÜønËG»íHéÝ™ˆòr=N>ËØ ·`´ -„H°}Š^œXœ_ˆÅ,G†»tà#¢…‚Ò/‚£øHŸ êÂX§MNÏI‰‰S.?¦Ô¨¼¼"…v† ‰"!J<¤N¸>�É¢ �P‚-à&‚$·È÷Nâc?H©$�n´àX|C£ Bp3ië'è+¢@VTP§þ€Ào‚$½ø]<Ê<7L¨‹@�@ÃZ}¢-‹ñ…é^±Bz“)µ±¨"5" `‹x¼!2Ù x|DQ9ÿdb�’¥‹dø¡¨Åº`äQf•ĺ' Amwdˆ–ƒ¦·øìf¡/¡«’;—òQèx \g• ¨AŠš.ÌÏYõÒ—œYÜgU‚šP±Aä$ä}דZ¬PÚæjMû$&0ô/'û$w’“Ïñ�hXÊeI5›,˜Ð½?ì•ÜyôPXúÑ,è �$lÄÑ –8fÍv†ËnæCÍ±ÇÆÊ"³‰N!]²ŠŠz­z bšR ¿JžKst¦öô¯m26/pýʵ¨2dJ…�‡÷6jCë*N±£ìÆ‘m¦žzµßl®`gýÚ½"9¥J3*zØ`8Áe&WŠýùÉöpk�ñÝb…c\pÀRx¤ !µ,ï@·B"šš§ÍÛú3sµ8tÔü£ èt¢Úô‰ƒ‹4ª©éÑøHUaHö„½ÓsäG· ( ÖüÚ€ÄdéUG ä!Ȇdc,JóEÓYÊšyF½()"BDv)Ó•Ž*wÃÑ¡Àˆ|Î ‰ÜoŽ©[ÉÖ*ï#›êâQ†FÁ4o¥¹ÙÔD$h WÐF$‚‰>=;Ý[˜ï¥Mâ5¹uTg>) ˆòàl‹sP™… &$µ‚¯¼Æ¬TOá–Ñô�€€ßW¡So (u*%ƒÒe9%�û¨Ù<ÔºÒØºHÁs¡ÓÍ@×ôTšÝ˜•É ‹Á.Kå ae \ÐÄËDBC²kÀËáY'½t¾ �uŠTÙ¼)ÓªöWÆ%›MR#Ù  0ƒèš�7–u�Ê ›åís®„r=:sÍ Íi÷P.;’æÏ¦%È´ëõ©4#ûiI„¼$ƒäÇ@ŠÈ†Àƒ…Ua|›QëÌ«¡n¶DĬÍÂÆíÒ’nâ!C “‰”¦ã�^‚ €Ñ÷¿dYf§Hj%5EÅBá YèÎyOŽbD¨çç f—ï¶l¤Û³Óræ:ú¢emmÌ÷è…—êíS}}I´ +�&ºw/Bàì%hFØ rBƒ-X>Ü–•7�XËÜ‚Í-8—‚2ÕÍ=”žŽu¯~û¿Šº†ršèNôÌ|0e£Q��ƒ>1ˆAPÚÆO6̹²]RB4´‘™LÜœHc#­Í�ºŠ‡rÕì—Óó€€0\Áp˜'xv¶Þ>½PA„ô|­ãJžóB6ûRú[rhü ãÊÝš³«P¦;‡:Z(V€Ý7í5à  ¸•ý¢8x<²g.å¯-.]ÃË(å…LVt]²§%ó`U“êyP'š‘µÜXІ«_^FÍ|PöC�ÔÝ5 y?¡4üJé"ÉCe„N:ô$²�C>·v �‹½3qÛŽÁ4q—�`óTrŒÔû�tÈ“>¹%$ëŠÛÁ¯‰,žÖd�´“ä¬3Y|¼ç;k{C,Ä6ÅïRÍúXDª€HÒ¶X§F÷æ[Yû‘÷K‘¾˜ÒOÍ­zÊq|�FA5MXêÑ¡‰ò8�LËu�iY9F²$ª1¸2«Ï0qÃÌ¡¦“Í �£/— "¦ÇlÚH5á )ÜëU@‘ :¹�tò†Èi#OË Å�ÃpIs–6˺^ ¦™™G!x˜3Q á;€ÑÚMwJÏ+V<œ—ÍûˆrÐA‚ÅD á=.ÕÄ•r a"»JAU0€��«ŠžäEÝÎÍåZv•`)›«‹Zr¡¾¯€|™˜>ˆ‹¹ä‚ uvp,·š¯s©ÖY6GÀ„Q)*çÁœÑŒÜÍ9o¢ã!/¸Ú}·i„óX¸œí‹áB_'{…¤"Ó’—¤ÓT¶Ô ·IÖ;:è0•)bðZC9…žþ^½eHÜ•ù­²–ï–×q�vzƾ�¿î*Ç”üäW¥ èÈÒ&?>ðµøŒW³ÅˆÂ4Hì¯L¢*¯AqäYb-Gz‘¦Vì1¶l¸Ë¬¨€ªg~ ’VË:Ô­"M[û³ u*�ÁGÙ„a"r^‹@ÇÇ6ºJ†Ï9§˜¼qÙp$¬FYvsÛ¶Á]5A�=bd�ŸØ˜´|P“$�.§'OcÚ€�<3€Q|É Ú¹¢L´ÔÐÄ#ˆGŠ"Ða¶8¦gS ;u‰¤R5g…>&Ed£€±Ý ‘h²ÏL/ÎÏ÷ˆj‰MÕ;²�®k"†Ô—ÔfK¶¡Ûº“™™·9QÉ€¬<ܵ9ï$”/ )º‘ê/Á“ç*˜¸áÓüI'“Ÿ›ßd.“ ÞÛ�œžž†Ë¶5V•¿ÌÃSyC1 ?‚ä•$ìí@qÕIOT”uÌJ ³15:¡K¿î”õ@&nJ ~#Xæ ¥5 ”9Óòÿ¨mä+2&4†ëÕ»­lU�lú(â�ª5Yˆ¥&†Û4ÖXìãóÛú/í¬ÅµdÆF@òÃ6QÒ¡F±Z‘pp²SMÙ£ÃÃf¡ÁNU¥†RcœˆñÙTî7Ê‚³E’›UK–çÉÚd^ $B<Èb^Lø,ÑQS§v†�ÙxrOÁîu7¿RŸ‡8ã;ÔMöé.žµ;• ¬€{©ˆž:F*¨"mœ‹Û¦æ‘"ù<0‘H—!z’ÆT%í†–ìº ‚àÂ�Š\Èжém /®—ÎÙÜ8‚jYÊè��ˆìŽ"tuƒÂ‰`>mUžÈ“dâ³E±¼kþdóXrjœñ€SåWs.Êçâ”Êo´gÓÙ¦deל®’²'À$^nó‰7ñ& �3» ô”—:õ½î)»Šr]]†+µ–B6íÐêBûœá+ÚG«GB9Îác&G‚ ]]²KéºÆìÞ¿}TïUàh¨›ÝÕVǸyÅêñ™+>qågÞóãàèÌÇ•'–hÈôÌŽ9`Ó•—þËuŸ¾l÷e3êÞ\e `±ž� + +¿LNyǰ¸�ìVýšéf@¾A,˜{ï¡Ï¸ŽGH«öyÞn)¤ËB7S5.DñtFN³Ï�b€n¬"¡)?Vܸ:‚ÓŠ˜¿dî]¯©¡©Á"'sœð©ŠlÍ,³ Y�p•ÉU&rïŠhrŠn€Ü ´}È:»„Ñô3B ˆSíá…½÷Z9ÔiÕšðÕBÈϪ¥;ðå¡€«†a¬1¦mñ—O/NLõˆ°Žk¨kè×P×±ŽTGŠ1¦¹ D€@€Q>G€ ˆé7¯ä<¦ì9!À CUaª*„e#U�7ùØ2š<ú”pÏ£±�Ù„–×H#AðÓ¬¨[5†#Ä((‹ê!˜4E@dºÈôžü:ð |UH"Y|×µSå/ûaV?š6B¼™yØ]Õ-kÁX Dxq‘�Xœ˜ž¢:Æ#QŒ@”FIë²0w?·&dÄJå[ImMy³—},�²6fv£Ë�)ÙWÍ«ç8_4Ê[ÄA'µV™þÓVrã"�¹Îþ_ÎÞ<ܲ¬ªü­}ν÷ ïEFfD¦€� *]B29V•bZ%(euÛU~øé§v¡”ö׊m•Zv+VwáX­”¶–‚ v;v© “L‰¨@&9gdfD@fÆð"Þ|ïÝ«ÿØkÚûœ‰uH^Ü{î>{¯½¦ßZkïsNQ]½’ÓxûŒ8–u¶µ³¶½¿²}0½º7»¼³’íNïÀ�BRãt¢¿ó3-@ËEªoF®Ž�Ö£ž¶M�D©ȸ¼½¶½¿²³?½º;ÛÚY)Ï5-¼©ÜÙ`²þ²ò‰µýÿæ?¾ïÓ7üÐo¾ðÂöúð¢b.ÞsT4ÕRfƒ3Wn{ŒgA§2÷áUQ”Lm4,5.Ž\Bôzî¨c¦æËIqMS™QƒŠ:BBbäá¨aÕVÿšôÍžngÕOrŠJ+ç#…®UëÍB†¨ÿB}Ǩ3P)´Zçí0¬.Wâ A?W) ¨�’ÓT¯J0ÔBu.6A9çË'×6�¯j©˜Êvž,¡„yÅ^ŽO±Þ3�®îñýçæåV1—ZÌ�Ã…¤¬\ÒIëçÀ}IÂÁ@ (¯~QW2£DDÝk+}X[%”§F”P€tÑ�»^TÍt%—´BËúÿ¢1 õläkåå6Á`Y;úîž¼è`á±È8ÐG¶’Gryï�ÊNv‚ü)Nœ™IžÌšR»ÛsÅÕ✖֬¾¥ ŘvX#îˆ÷˜îß^^Ù9 d02–æWb%*L"¸Y1\ NÛ�TÞƒäšli>ÓuTx”‹?ò'hŒˆXb|©¯ÏáÓMsb�Z%Ù>ÐÈ ês#±éÞìPÞöѵõÙѱWŸùâöê•ÝÙá<]Ù]¹¸½Zøýì'Ÿ»í'îÅϺÇZ¾èY÷|øõ?÷œ›Ï¸ùÔ¥Ÿ~õüå¿ÿ™{~ñ'>ô“?û¯_ñg«³ùÙ"Q›kðƒ¿úš¯þ 1ÔÿòõïþíÿùMë«RÊ_óŸxÛýê'þõñS?óßð®ã«ûÐÙ_Ú^»²;;\t[{+·×ˆª®_üù÷þùOýìW=eaèæÚÞ‰õý?ø‹ÏàÑëF ×G)‡·eÝæ$Ü=iä ßµ¡T0ÕÝQýat|1vðmS-’×@Þ¢Šƒ£Áó±\!úoÿÕÂf¹•ÍÈfÔVÆ®©a "} •۶̓}᧸6õƒ›8‚ƒºG³ð3 ²’5!µ´xZΉ+&vY,dWJ4Êv�HjD@­îýl S>_¾áÆ�ÇWY—ÚpqŠr°€Jßáä*ï‘?¶¼ý¾Ã«»Ë%c¹D^òRöÀdÉzd¸¬3c Î(KæJÄT>$¦"N¥Žº>u}J)¥DèºÔw‰º”R×sZ_M}â~Tæ,K)®)æs%ɘÊÈ®è–!5Gy«É˜äIO³>„ ’ÒzÁ†Þ*£»íÔxÍWƒS*‹”¤uÞJ­…e`€’b²gL(Ùj)4ó“} ¤AŠûgëq<�Ÿžãã®nï8gΜÅ@´þiî†LµIgY�W€We&=@dpâÊK²¨Þ:™¡Õ4Gu Õ§¢‰øZù-‡”˜Ì™—�9ö…CÒV‘Òú.Sǰ!UÀ+³G2j\G,túf^ðà£'Ög‡™ÓŸ>óÈõèžO�ºóÜé[o¹ó}·?-çDÄ_qËÝwž;u×¹À¼³?¹íΛÿÓ;¾ä‘­cÏ~ʧ~䟽ýòÎ꯾닌ocüu…j³�~åÿÝ÷½â}?ÿG_ö®�=ãI×oýØ7ÿÉJ?ÿß~÷Öå2xðÑÍõ•›2Ó�~àÑ“àŠ+ËLóEÊ9Áw4.6Ò£µ²TT1áïyÿ¥RömÂQ¹£H,%«!¨qéöpï†òFk#jè7| �†ÐkŠ=6µ0’žtÇ1Äÿ¶QÍÐ wúŸ,ë�V1=gppl«&m‡¥²¢4PÝòèƒ+º•RßÁõ`u­Ø�z¾0/ÜxŸú™¿¯­²Ãµ� vóN?;¸á†ë&]·t'ÀQ ¢4ê3óúǦèÁW÷qÿ¹ù•Ýe€®FÚ¥ÓáÄJûSb@’ÀRy.À†¹§#•“åVU%M1x�õÍIÁ&6�CµµlY”…FSN\'›\žÐ$îžl¥XïÍeyR-½^ÙÍTÌÁË%¥shÊ(ó%°>uY`OÜ )ßVU{L˜F’}�èNKÅŠÖZ(ØKÓÄk‰'D{gö–—¶‰3£Të-]¯•š¨q8^ GD� æ ³z}p$ÕzǃKŽ>ª½•Ÿòµ{CÈhâ.5Ÿ��-jR»È¦T%ü¼šDÐ ŸŽ»…U›fÞ~-T©ô±Å͉è¶;o¾íΧè×ßó&†ýÃÉÛÿæó^ýqzsçS—ŽŸÚØþ¢g<øïù½à �^=ö;|né㽟xÆKî¸ûÙO>—ˆ3�¸òænÏÙXÙÿç_þÑßúÀsßú�ç1ãÓ—�ÿÊŸ~ñ÷üÓ÷ÿ§?ý’s—6|è®›o»ëf¿ñÞ/ s+!$ÞûÓþñ½ {‚|GxG#| 术¬ntן¸$�œ%A¾Ö„rl¬`Ö�™Î^ÌgÎ.rV/WºîÕ)XùW¿z B·Yù_¢qáK©…Õ~Ñ%ôi:_™¤Ì°gQYä+ÛtÁ9!†MH \ ®¤$œ51(—�\‰$:ÐÎN‡Ò IDATDÌö¬DèjÌ”H¶~•ç)–$ÓÌT^°Ã~£pfcA¸OE`N=¹©S€|CV›€#N\,ÐÊÌ Xï±B`Чç8såpyxˆD™3²¬ßúJ•©lYQ5hh(uÔ®=¡—žrÖV�ïTÓv'ÎÕt†îEÚ²Vºmòƒ³FÅ‹Ÿ¸~Ц~ÊC8 mHØã<ÌHÃ3(ÛB`AUÅ sHfhâ›àK�3<–Áðõ¶;nþö[o{ÁÓú¯õžûÔ³“>ðާ OßýΗÞöÒçÞyjcÀl2ûß„Eù²* Š‘Y_%$›‡Ý{3ç”l;”\ÔI¿«/öš³œ˜$:–¸'Ì�ûvó…­ƒŽ2€¼XÖv_4ã1Ö+Z²m87K"ÕÈð½`0Q$æEm(v•�1 ܤ‚Ž›—m_Wáé:fmZ5žsí„FQ„ê»q[zÍ„ºUëz”‚á!_k þ#n¡°¿^L‹G<|qó#÷=é+o¹ë�÷9/¹å÷‰_Ü0éò¿ùÆ?}ò©­×üÊ+oèTÎÝÓ;nÜÜJý¨3i1n:YØ÷%§×ÿÞW¾óïžam–™Ý:“!´ÎZ¦éÊ<Íp 8±¾ûë¯ù­Ï:qå‡ßúÕŸâÊ)N åÌÇgXŸ �nñ}gæ syrX¾ä¨ˆìä£ìK¼ˆRyŽ/QJR¼-Ï-Td%0¥û¤~Ùuúúm2-×W&¶- �ÍŸ²ý…w´l¡¿®nê¶'yVAE,¯œƒ²=ºìv*;¸`ÀB‘Š ˜¥ö@Tž,Á @4XV[‹zrÙ{¥‰�Õ]Ø" ÀZ‡õÄ.-qæê|oože?°Š…e{OUUÿ£µ£F*‡öò'•MY$¤B7^7–—¸Fß ¬ÌÎvcu³–£45ôÅšB"a0KÃjfÖƒþ­Î׿ۅfŠCÇÀ¡�ˋկ—¿Eܲ}¼‚9‘�,´‡‡-,–éíyæ-7ŸÿÂg<üÜ›ÏýÉGž¹Ì ÀÆÚþ÷Ù�üöžó±n̹›ô‹'Ýp¹em;b¦eN«³Ã‚5Ó~ñ´S—Š�¸¸½vþÒñ§œºpîÒÆCN¹FÇ'ã¾sù“ì,–2(/™—„ Μ³B)ë¥%°,Ÿ‰ ¾–Ê&_¢D©K)•›j:J )QJD‰R¢„”�(%Bš,'³<deÈ9OV¨++±†CZÞÌšì[Iªÿ®yÀ�Ý�J(,4eÑžØp’3ÊݶP¹%{¡à$"5{K¬µ�ºPõödÏ8î·)I!'[GˆƒÌ4‹gNÀf�õ„ó™}¾ó±½ýƒC 缌&ߪKh%}©µ“B®"Y(f9¨‚ Ë7i™CX¡ph×ä¸ÒUS-«‚ó½Dº61HàƒéêOŽÐ� ;#RöŸÂă簫jçÎmÇá³ú¸jf5 IŒþ+¡'•)KÅß ÅiñGïâÎþä»^öÁ½ùä£÷?©x³ýÃÉ…+k/~ö=O½ñÒ“o¸øÚòþ/ý܇”NvÒ/û.÷Ý2ѲœÙ=˜>ðèÉ—>çÎç?õ¡Ó'®~Ë—äyO;[h»²;{Ëûžÿµ_ü‰ïý'xúMžrÃ¥[Ÿs×ÿðe=í–a 2‘ Æ/~Ö=úÉŸûÊçÜÅ\I�m�Z­¥Ì*3ÝÿÈuoyÿ Ög‡O»ñ1“Ÿ& Îö"‡‹~Ö@.öæIb9a»#jüi##‹Ã8În¤ic�*¹¾º0À1…ž¼g-•’ŸP��su;‡ÚkÍÁ¨ŽþÜ•²ÄλðÕnõŒ¤sC?¨‰*Î{øk�}cŠúÕj©>¼u,~Ìڞà'z'4ÆâÅÕéêÁé›®ŸvÉ“:­oÂ\½:«ÌXéqý*­$Þ=ÄßÞ3ø±}¦ey„;ñ²4ÓL®ø5¹QÕŸýK $ûÐ)u«‰RBùš%¢” °ú�Ô/ûÙrÖ¡|€9/×gÉÂ; ˜“ùÿâ€%Rdý]^ «ZŽDâ–c¹�*'ZD—X¡š™3 LÚÃÆ|9í�BµWòÌ�X¶P…ZtÒ=6QÔ!„ÊÕ›Re@7y‹ú<›%œè1%ì0Ý~uyîÒ>À¼dÎŒr«`G’û¤^¯ü‰•aå“-—ñäl§Äi¶?�L{ÀÀT@¯^µõCyq�Üž.i¿"ªª¬ñÕ¯Öiú#–†c–à"t®ÓhL[Jöƒkkg»6l 2¬.a�Ô°ÐæµƒùBì…«ëï¿ýéßõ²ýÇ?ù‡—äÚ=˜þð¢óªw½ãGÞxq{õ·>ð¼7½÷ùO>}ÀÊtþþË·½ä9÷¬M‰ðÜ›Ï~×Ëo{à‘ë¾ó¿é®ó7üÜ~Ù�~ó;Þü¯ß²X¦wüíçýâÿ£=ûî"ëßýó[¶vW¿ýÖû­&â¹î·Þÿü%ë†u^ŠzuI§­|,±[Èó¹™gÎ …š=é^+5¡™ybÛØLÞ¶ÌïǨ.«ÚÀ…j¬uò[­¬I†ç2 `àP¤ŸÔð È•nÄÕ×p½j)5B¹â°ñ´½8xÓy·îDzÑ�B™�õÔì÷šfF Œäfh5†è[Îhj]òkãH,—�ÜRºª%=ê–,¬ÉD”[ë'¦'¯Û`6ƒö²†�¤÷™Q›àØ xä2ßóðÁ"/ ç€éìq8¹Û׿æ£VR¥Ú«u�‚¡êÅKW@,§Ytunhö—òl2 ˜B\6¨�F07VþQ7¥*FÕ¦Wˆ³ ‹Tª`Fë¤õ…بÈÊÆ§$Ï’´ØÅÄÇ*P{2L\ö'S)Åe°[4À²�¨¼µ6�ÊL„õ„õ„Ìxd�û¯ð|A y¹ •"Ú”EmÍE㑊LRø AQ&öKPÄHýaß/:)n¾ì+~¼ÜÛ¿p&ŸµßM­Ž1äuñ4ð¦ÄÛFOÿŠÚÍ´ö1ôˆuoƒñ›>‡]6£EJ�¼*Órøá@YœAþS¹ ‘€vDE\¨K‰•ÏfÎ.7¤À å¨¿ÖóT/”§×§ÓŒáîHí Ü|úÒ›¾ç7ä·^þžO»è„%fÐ}eWpOXO˜%ÌgöòcWfÎ¼Ô¼×Æà09ˆD´Pms“@Y?­ê:šáK¼„ɼï½…¥`„»UØAïB–Hyh¯•R ÚVd¬Õ¹Ö‡Ÿj{“!X¿Y\×®‡”òà+×.²9-)^†(¡è‰™$³Úذš=×ÆÒ‰¦úFO<¨ú;êJÌ3Òð:r7l}X¨m — : ¥úב‘«…/ÛûÓÝÃé<ã¡I’ⳕ—üWÝ»ŒbÖzVvU ¤ÑMªĪ zÆ×ô¢f~Á%�hA´xó V +¢,c‘™«™B�FM£üê<·WÔTQ=[q umŸ£PŠH'4Ch¯}|Ü<ª…iƒ�ûŽQÓn?·—šxYÿQðË‹§>ksóتÿD…âíJR"(®°K8¹†•ûsþؽ‡çÝe]‹.©Oy¤ÁRžü@öxB]XMê¦S"’µUJ„DTþÓk¨ƒ!ÉjBš.§¬Èã*ÞÈ �–¼<¶Ò™Aq€I—URXÝ($|jdÕ’K-·Ø™>z‰lý]3p¯\*ãu“²/Q²VFP€¶Ø—@DÕA€™Ìz4_¤jmÞ—V =ÉNêÃï`æYÂf‡YÂvÆí[ËÇ®‚s^.¹ä¬êt�nYÍ�j@$<ó€@R1F"tË´²7ëÒ…æÒ°ûœ§¾ ”‹ý-\5ƒ•øÀà¶°MKBæÉÇl£ªÖ6†¯&P¼qs$¡§áIÏ`Ì.<”ñ¬ŠUçßúƒ™zô\¤[kjÈX_­y\#Äï¨{0pÑøF{ªåͨ2)³’#¹ÔÖj B„7ò«RÌ��aî‘#‹qü݃é…+ëß~ëŸÝüíû̽ƒIl0¢/„b&f´CˆÍ«XÇLØîëÔiJN•¡á¯qÜ~ju! «#F\tÂÈvæ«'Rk,üba¦+^;ù±)êܸ¦rÌB"Ńþ�:hð:¨†*•j"+Žô¸£fa˜(š "¬Ï¶fÃÊðøA°µ›vüøœ3k®4íñ5k„y¤ï 4Œs*ž0ª¹ž_ª¶R´ñAjš®1+²UîõLrSÖö«fÃÏZÊÓj§M7Ƈˆ“l{lTll¼ªÍQ�?sš�jUd�)]9}ÓõÓI—³ÓÍT33é½?D”™×§86AzŒï?·Ë” E9³8ÖÔΩ £î’We«ûM€»m…ƒBE·.§ž&�Ñ��WgËåêñ¼±:a}ð¯í�Œ`ÕL™¸Þf£®YÝ—¯fÔ®•ªt˜BdῘÆ�TÚKºR62P'[âµkj‰rm\mjà¶ÔêñFGSâ9ðÀ.?vuNÈ9/°Ì ²n/–ÿ™ ¥0à”ÛŽaR‹ThC""ôón²˜’“VCO¬Ïh·…à”E»L?lµ|hàÑæ ݸ‚œš5þmÔ‡�¸âëÒ2šUÆmTŸ±—/«îªnÕ«@— D-}ve0²‚‡U�µ»*kͲÝbšÊÔ[ÍÝ D×,¬Yä\ülaŒj~ÃÒ†@À7™Ç~t娶h­Ã„°—¼¨É™Ý !W÷§Òo½4;<„C­[¶p© nÜ0Mž†µ�¶Y�·Ôs¾]Gè¶- ­?©¹Tûc]ƒ>ö&f•8Ô­ ‰‹œh~Rê¥�P†MëÃö†Žc0Ãùæ% Àœ Ü2ˆäYõ®T°ŸÜ9ëO-Ç(¯ñøhÈôñŽh7ô Îû]¿{ú¦ëû®Ó‡ã�nª“&ÉÓg0óæ ­õœ™î:»øÔc»åv†@Ÿ&ä©¶¤L$Å—Êévêû°¢·†§ž'‰âC‡SÙ/ÓruÚÃÍ_øªRn�mO5 ´±’R’9{ÊãšbÚ Ñ7Ãô†á&mWY`”íI$À¦©¢Ð¦wÓRyûlpRdëeA{ãÍ8¤FÏ1gæY±=ñãÞ«Ëݽ9˜s^è­«¬|�G<…šª¹˜ YMÃÌ9RÊ4›O)Kn�æP.÷å`ë¦X™ßGäpQÍ5œªmxg�úäQÞâèÃÁ­;µü°&`-jø³ÊâWÑ -«o&­ëó¹êKÙHêèòøBù•Â&¦zàeÅ(jgÒx^TÐ1ÄKo\O#¸èälX˜{-Ò—PB ¹ÔÇÔÆ'\l?4é�‘‘Ô«W½jZ�•cºe¼óí¥¡Á¶ãU� | œDí¨¦;œ‡­Àúd *šÃÒ-T :Ú�„ÁdïÐê†W6ŸHÅíÈ\ÛêHq^ §•¹1Œ‚´Š£ñÏ.Šž" l“¤VJÍaDìÆyèEí¶�v,v§+‡§o<™¤ ¥»`‚Ï’ïft 'Višø`AŸ|ààòÎu¬Uý2ó¬SÓ[/æ‹CR MB]Àyd�ôYK¤ i+¤Ã92¸Ÿ OB�(DxªŽq†�DjJ:[¨¯)ù– ž”$�çʼn‰�syÎ!G¹H‘ISZ'TXæ %lC“ ês›ù›e{³VJÁÌ�-èþ­År1çœ3gÒ‡B² Ü!ı¼jžêFCjõå…Åî�LϘë[fÆ�5êÌ(ôZ³�¡æPíœÔG»w*·ì¥Ë‘ÑLsô|$a€Åîtu~ã�×±"œ4ÞµKÜ�“›+˜v¸²‹;ØÝ›Ïõ]gWF‘ɇ$_ÊóË^_¤Nï�$qÓPpÏ­ÿ'ê–©'½ÍÆÊUæÇUg\Ò /ùøñ®¼$DÉÎÄÒûYŒ÷ ]Q5› Ð[²)»m” !F#¹ÈRÈ%UYá”1’Ô§*c¥à0ÊGøe™Q4©BÿñžV Kà¡|êêy™—K°¼¡@7)¹úXjJž9ïìæ îC¾£[Òt>KòpFƒ]ÏßÜ+_U‡@ v†Ïj9*M߈â!…Üq¥Z çHd½HÕpÌÀÆÁ;®7Ž~x4?q| tá ÈÔA8‚QQ—˜úW/mU;÷´Ñ¥’Ù�Q5«Bµµáúdmƒl—“O‘íÚhN¯ÃX§€-ï~}µ ? ÞG)}sýC=DͪޑŽ»¦Ú�‡ë¼��El,yˆH9dºê¸æ‘qB[çÂÅ}[eXV¥)–kæQCrÅkùD¤;$ƒ„ÍKZ+¨Ÿ,qâä�0¥øCkì®$ˆ¡väºbn¥%«¬¦Õj{�³Úi{4\R¯½ØYY_ž:}Âû/ŽRÑ=ºµeÆ¬Çæ*&„ [üÉ3» ^ˆ]úö6P•iî@€<¶�4[MhrVC ²c’'‰ºÒ•ʽá =eAtyÚ÷²‚|ˆë�H  Î¹^( »’ìÚêzùdÛ@d÷u¿ì'‹I 1| ÀÈKÁõ…ö^œFµ+ÖxUɆoDL\ÊîD”*FÃüòȳì}òÞ]ô¦Mɰ°îˆÁ¶‚4Ž“JÛà�Àéèþ¥¿QoKâXÆÜÊ8Ì»S³¢Í½ åU×TÿÄp¿Û€%Tʉ¡mˆ j>Qåb?ª9ÀÑ€ |ÂÜI¹12<;«yÈÂ0:PJ9¶2¿Õ(LŒPJ´ ¬s‹§Ðy¹îáp6³ÒªÄ|ß àHÓ> ZuúÊU�`{lÅ¡vˆh7&gÙ­hÙÔȲ±óÙÕµ­µquÍà¤ëÉb{å8Nݰ¡ÛB¹¸Ù¤wiÅy0°6Ãñˆó™Gòƒ�ì²T£ÐUÌkIñ2!É[V\ ?-K�5d@Lž&ê‚wµÂjDSÓ¦ r˱ÌùØJJº,jkÈ ¦D%;´Õ‡ªj’YnySŸé†YÖR³m,RqfYÉÚãcZÜÌo ¾öOqŸ?ëÃë%ZJ˜Ð¶2;· hÚà ¬vt¼c�-qÿÖr1Ÿó2˃KÐTfÿB—VðMJëÝÍ‚®Ä!ŠB"bšNzîLT1Èe§|³L8È­7 %݈@JœÌM�º bHdB>’‰IeVp^yÙ×”mG˜d³©]M�ŒŸÚ�Á~3GVãà‘ÈíÊ:¬=b½ýÇ+¾ÙH�ÕAë¬F…Ø}è»u…Í4D ÈTE~I“A4@fuïY P"g&KÃs2‘í<8S<àE3Ÿ0ÓÀO^¹æTPÏf‚µ«~s±éë‚…ÍØõ}"²*oÝ:([­¯º_¢ò�4Â5Jè­f~”jÛ¸Á5@ßF8µFë÷ìÐ¥5kIŠ£30îR(£5C�‘\ pÑâêÊq>uý†Ô8åO’[A¸xÍ»9ó±›L÷œ[ž¿¸Kzç¿“H&ËuPn)µýJ’ªÚO`ÞÕR1“žûUÛBw²ä@¨²ºbZSu‰Œ.ÏúÞVøÈTRoa2§$¯t%»44%EÁª ¬²%­CmTý$x£À* EDv¨J—Áá(€Ãtð©‹;�—1¡¼9D¶oÑ×O%JH�>[?Ry˜l’]ÒÆ�Ô§ì,ÍÓ“Æ�×î•£kô]”‘3ólFñ¦zÍSf•Gòª—v®JíØ…YÀI Ê…(¤0bs±$Ë™*ÅÒefÝ¡Dh+ØöfußGwúöbs5Y’h°Ñc=a ºrhb IDATg�Ï^:4dåÌ,K­¹J^Õr%2i 'ô“lS�O\¢„4;œ®ÌgdqGSiÁ2Oã)Fæ©àe/)9 •+ï(Ö‡õ“z�€óe¬31 “9êz­úä(ò(ÛpRfgw-–‰Yö¨st¾#höQ| ãQã7}è@šnhZŒö—çãZÔ¾¸¡Ìú&¾ò]oýþ7�ÚØ~Ókßúo_õ§¡¦>:5òoØúáW½ëï~ú ?ô�ï¬R4¾òÝoýþ7ŸÚØyÓkß:dSVß�>´c—….õ# ¿ïM§6¶ßüÚ·üÛW½Ã¶zŒá„O¼þòÓŸ~ì ÿá}å;£ó!â×½ò]¿­þè«Þ!Ï w HhÝ•/ó4%çu¡'Âpåçƒì‰ug«›!Uo×0Ný(Ü ÷2õHÊP¯QѧíóPË\ ¡ød�7‡lýã¨êI#m¤ �ÊãT)šžQ8v7ÈGvÐ@f5åùÕÕ ¾á†ãZcIz?‡ìzÍÙošd`c•Ö§È·Ÿ9|ìÊ~‰ýƒÃd}ߪY�ϺÖÈØÂ6&tU›[yÙ ;Ò q­ÐðŸµ,ï««5*=» Ÿø®ú”A¿M^ösþ6ú7RM�C¢uu“ ãm¤È£=´‡OŸ³yZè§*c,7Šº*9Ã<øàÀëPêkýøÒÎÚ•Ýéá"mí®\ÜY³éxáõÕƒÿø¿ÿû?øŸ?ëä€Ûî|ê+þ÷Wï¯|ÝÙ‹›P²¡„KÛ«Wöf‡‹nkwõâΪäA½èY÷þùOýìW=ÿ“Ö½,>ÅPŒŒ÷ ¢KÛkWv§ó´µ·rq{­ öì§œÿðëþEϺÇ&öâgÝûç?õsϹù<€ÝùÔWüÄ«_óí¹‹›5;àÒöÚÕÝÙá¼ÛÚ[½´½ ´Êj dƒ pl@IÏX‚H½!iÍRAµtÂ>}¤ˆÿ\’öž£„0J-­Úò�\%CÔp ªB ½&TÞòˆ£Â÷£¬CφšaÀ½Ê£‡x NQÉèÐ;ðŒ!p¾»²¾<}ÃF´~ =F‰dÆæ:V{ò'î?¸ºP^°ªHQBÅLR.J&«Éi²,5Q"„ôÒ ÄiʳŽú༞Wü\õ8kÕ3䜧êJ$·¯¦J�Iâº*—b‚ZTaM�´‚ DT*•Lªx,£$å¶å»¤9ªW»ôe“jNÅ ‰¢½U$WçÌå�¬œÀ�,pç¥åÞþ!g}mœüg™+#gßEÅEVö !NGQBݶ¨CZ;\�d]�êf.ßÿ§RãwøL}ySz�º‡OZˆlõØDYÈR“©ŒJ‚¼ÚðUȺ7 …ÛÅ�Ù¦n¶öõQÇz# @²ƒ�^eÙféj~qº#ÝÙì-¢#ÝðÅa3Pí•)ú�Â|ëVa²®¬Ö$“M·¨§[Žïd~ð‘ÍõÙM™ÓßøÀ#'Þ0ól²ø¡W¾ûi7=öÝoüÆó7ìô»Ó~YÞEêóÊP>zb}v˜™îxøô�\oT–—ó%-s­b‚¥nÕÌÈ•‘îxèô�ž,„Ý}þú;Ïž¾õ9w¾ïö§-3¥„¯¸åî;ÏžºëÜ)»“݃M£ÐxV(<óèæÚì¦Ì¤å•Þbç JAŽUgQ@¶d›mM”æ´#Š3lK¼aˆ®-‰¦¸ ôáÃÆ…£ƒ;(›="k$l¦g3ÚOãÇ�4 °…ªAí7Vöö7²ZOèÃ&` ¬³vœFtËÝÙÚüÔéÍêÙD�P9ËåŸX§ÕŽ÷ñ‰3û»‡s‰ýĉÙ[¼U¤fÉð‡â‹² æÊ3õ-’uÒ›m .Xxî÷Ê7LW·Õ“ÈW̸ð,/°¾š\HŸŽmÜ"ÁU}¬ƒe£rQ3õ†·:ß®b›�•=s–Õ=½EUàA¡åaŠ 0éê)é( ÖÙ*æ"—n àõžŽ%pî]Yæù¡*˜ö¦"¹ÍÈ=)‘¼w=Üy,Jd WÌSêD“E?Í2ý�Š‚hYñ³âŠÁ�»ÒÜQÎ2OÖ;,¢ؽ<*1òšuE—x%CS?dàäWéIƒð0P˜†¥Îf‹q+¦…„VÒ–äèaÄ�D�‡˜(̓‘³#‡gƶ!š¬Eu¯çÐ a<¨¥%üV\�÷)¿ª>ßv×Í·Ýu3@¿ñî„(8§.ñ¿úê|éç=ð¯Þøõ÷úd=bU�ThÁmw>å¶;oðïù‚�Ëæ÷ßþ´üº×HÕIÍk@ô¡»n¾í®›ø�÷~¡™Óþáôíó¹¯þŠ¿<½¹sþÒñSǯ~ñ3üõ÷|ÁÞá$°½¡PhÑ)ã×ßó¦4J ÅÓ1òBŽuudHW2� \rMqñ]�볨lÇú9B ÂUÚŽSO¨|j̾šàgvD“®æø1Ä…‘)P”]Õ½“f]‡ð´ñ±@Û�± Àr2Ý?}ãIÀx¦Ï3®[Ç,ñîßþàÁî|.èã°"Î\ËoZö ˜Šøƒb¥ÆÔ¬´E¦ž']y:ă JÖ‹G!A ­C8Cú"÷n9ëz�´&„£¾Á™EÍŠ@U¹#ëÙÐÏî8rÄ'°ÏVTÍ#ç‡û³b%\òyÝÂkæ0p-BU�àã=Ö/�‡öqþꋹ> Â`ÕÓh†�¨²£¦è©µb%'¤Ù|ÚsW; �ëNé’ýy@Yïév�ƒ”šà”›jš”´½ËH³&ýnë$,É(8z–ø× ÿ¶È¤U‡‚”uV!¾,äwíNQ�ÈÐ5ÖÄùT4‘)3Gx†]”˜ªú�(ÜÀY�ñ¬C•…Z˜æ%�0˜{¶^æËîŸùG¿í+ÿòÿèKoøÆÂŸÀùÊüÕžH!ÁÄd¶= ›Â|Ë£ƒ³Ø¹ë¨ðÁ;žÚuË<ý!Ï{êÙIŸ?pÇS+kÆ' J6ÄæTIœQ¢�Û–ý%_©»6¼múw(¤¨ñ¡~äF¦(Ó" Ó]¨²~4Ä>¯áÍUáàF5„zÉÎ#›Ëõ·JKÌqƲ¶\“ëºBŒæiµËas¶´¹†•žöæøÄCû{ó-Ε…Ê—ZÞó·ÁÉ–—¹¹äOPÒažhgšrIši©t²Aµvb–G¡¡"G?AWÕ…«Å<忝u”†Ð†›ªøÌ�7®b�*Ú¬†»@×hYäõ D6!$}BVb°¯[ ²Èm³ÇZœqï.Îoòbž³�³n 6ÂmÕÀV¦‚+& ‹D¼d›@Üs·6_é¹ LÐÅ8fMÔšJSA3’–dÉô“‡J&ÒÐ�ïϨÝbùGM¢uîšGd/²…!8t:0ï_£…ï¼·ø’ª!×¢ 9eŒºtØXTHI ž—ÉWÜ}œÊ:[¨ª“U‘Q.x7– /1<õÆ‹/¹åî÷|ìéßú’¿|ÂÉ+‘Öº*0d…8`è¾íZv'ï”�š„f;PÕg/nþõ}Oºõ–»V&ó—Ür÷_ÝûijOx��+[ª•ïਦ¦ÁÔö�L‡ön [ø´fg£Ï·„ž³†0#£ÕáÂÈDX[)¨W⃽a£çÃUæ^ Sí‹öÒÊúª3 6QŽàeh£.csÅ"€òœhûÆ'^G”´¨nÕx݉ûÚ\ÃJ‡Ýýüñööç4ÊeÐì\n¨‘üÔî®!�Sù¨ #ÿן°Ÿho ¦å!*îTF]3ÇÈ¥Ôe®W/s^]í(LÑ^#£?£Í6]zJª%ÑZrž?Õ�á2‘Áv9ÏÆÖX¯bO®¢@^j^Ê`Ø�7S«8›RB¸/ ’«ºÆÙv Õùlš§å�»`SnR›ÛË?CG¯¸�|s¤‚‘ò¤‘žÑ;¹Š ‚‚JØÑ¼Cƒvù*\Rÿ5Ó4PäØ˜\)�¢ðyXë¨+EŽ&#~Í=Lé3Î7Žåÿ…öW Ù¨q16êPTµ{ ®OÂy°Š‚˜6ß9˜^Ü^ßÚ]û‰ÿ÷%/xúÙÿñ…õPvt+rOSös àÅϺ烯ÿù¯|ÎÝ´¤> *—ŠP[�‰OJÓ>?zÿw÷'ßý²îÍ'¹ÿIze»21Bà‘?ñ3n|ì}?þ ?úÏÞž’ÙC–¢R°%ÈŠù.…ÊȈ°±‘lŒ ½Þ§S]ÅïhZ‰n©ÔØV�á5:ñÞFDñ×û=›a †4´é� uF>Q$ŸÀ¼Øºñ‰›Ó.-‹ÚêsJC"fl¬b­Çþ·?¸w¸˜ Ä øšÕ¢ºÔRqy@„ži+ _Xv&´°R0œç� Œ¥G<˜¬ rÔ¹GoÁèzt‰ˆRöîØ¸•l Ýj€ã_ÐɃä㈬T�Ìñ†1uûNÑj.O²«HÝ’d],÷.±¼O› „ïšÁŒ|¢Ç¸’qçVÞÝ=(;�©NOK}Pמ""@îGë%›‰£,õËníp¥�Õo³Ò¸æe`pG­Ê‡~BW ôšè‡ê©’ËîÄËã¡ÛjÒ€ò¢ƒB§ú7Ïœ#¶Ñÿê€θÇf× ·­ 'àñ2Ú@oÐ!?Ó66‡:ÄZ­—¸ì<ŠÚ›ÚéL�$O^¹ú/ûhû–ËóÈ�)êºøøƒ7ýÂýGß÷Š?ûÄC7~ð“O¹qóêo~ßo>éú­i¿|ñ³îý/ú«¿¸ûÉßõÆoØÙŸé4]5MwÊ@‰Ð‘ÉHÄK€ÙI4ÍBŠ·±ÓâyùÂöÚûnúw¿ìC¿ð'ÿðÒΚ‰÷ÆWóµoþl¥ð_¾è¯þâž'×_¹½?uoe/U®Äƒ'Ÿ¾|ýÆÞ_ÝûÙ™U9EöD…8»æÖ©ø©Ü¼I@žìã…ržTž•¡©@É�ü 9ήÖÉÅ¡BÄ.××Ýø;®Õ1Fqªj3 Ó8jÖƒ–•$ µ£›ðaá.e¼;5:í„(¸˜’/ͯœz±•I¿”'×f ykVc"cc�Öz>\àgö÷ç‡Â3–ðÂ×8*õÀâGJÞ#UK}¸¡ÍI×ìø0ÑþT}›;�å!ºi£žÈ3èí ©+)[ï*)ß–™×ÖdéÎöYñ')@¼sÒ½¾ÑƒlÌ7©ïŒ,ñBñNÉ%H(—Ù6|¸á«æÉ†y‚S¤¥6bƒfÛØÌLD™¹O8Ñ£..qïÖâð`¡uQȇÌ#g§ÌØÀ²FNVT€Uñ $‘åÙr2Í“à`+¥UAΫVm-£­?Dï¯'  —¾ð·s^^8Ãç£GÍ¢ÜÏ×Z�!ÿh ­SBK8A~лjX=é †£Y7«_ŸÁÑÌ}à[C;Ôìõk¨auøûÓÑs„§²È`Ðq8 ÜlR_Fh;2i¾UœtF*·3Œ ¡?»;Æ��GxÜkµëÓ×n”´˜O¹ˆÿ§¯úà×~ÑÇ¿ågþûG¶Ž·LòÖ¥ºÖpT¦E4† Êí4#ÓF/Špç5²1<窧kiŠ�´Á­MÁÜ_%ÜvFGhS{p+F§”ê&C‚i¤ñhçË"nožîOl®.²ÝÔÇ2NŽ­`}Êó%>~fçà€ÔeÉxa·�V I!V«ÀЬºÕB‡Ðæ¼×Ñ|RS¬r&êfè&Ù‚Y±Í~ò ¸åçb‘O^OS"Ö¼Ú×ßþxþ L @:5CJnœ ›Ê÷øD~çWi˜Y—©Ôs@6D—·�º¥|šh³ãŽðÈ\Z, ”‡#3dÀ9Ô� Í:¦î9+Ëæ¬·ß@D(E~´ºœõ¹ �…2hÈ“û5|ºríá²O”9aèòÝ¡‡‹l®1–ÁåÌi1†Ss)ìd¼á!ŽƒˆˆÔ¥¡çgºÅ+ÙeØö�1˜ÿXË!ÙòïY�šA-‹†°ð•'ã[&êâÈú—ız0 XÆY¸¢a·Õ“¹víÅ–UëlÅP´Þ’cQ»ÈuBšd5Rtƒ1µÝxJ?–_4ëC=f°ÌiÒ/ŸõäOýñGŸùèÕ€¬…æ¸^ja­ÍžYïËoEQŸ©¦©¿�s ˆk æw¡µ-ÒåÒ»ì˜ö9µ¬¬�jššG ¯x¹È°æÃgzE="WMªx!|M´¸ñA¢#) i¾»v’Nl¬.3Yù‘BúðKbæµi^›ò|‰;:Ü98Ôz è;ÈþH¹I †¥ì;—´®h–LPµ;©‘ÕH)Í<— bîTAi¤Þ®Î•91¨ãIy뎾|�£KcŽW¸C![ù-+Q¤æ¨*«„Ê_ÈÄžØQhÏN®Îˆ;ÙÍ«¼µ^ŽÚ/MŸè¹#œ?Ä}‹%ÊH‚¬ž¼¬†ˆ¼L3!É ©¶d^Ȱ„¶ãn}±ÚçΙ_Êœv¸µ9²’ãVÃ�*U�‡Ý ô¬E‘&6±oÕ–±¡]Eƒª1^Óž*2”ÅÃá E(‰—ÅpÅ2=#£s4?®g6üuÔGXã8zœ¾TÈÇÔz`Ñx|錠䀥©Z~Cvù'>± lÅ’;’-c³4±º±Ÿ•iPUSÒI5çmA˜ý F™ü�-—éèlçÃå¡´¬–n˜V„Ÿ/ºï|ã+IVyÌs•n}9ëêxm3v�¢Ïä`–÷?keªZà€G Ê..¶ËôýÒUvgNÐøÖ�jÄ l¹´RT]o¦¦eœÂjßv~ÔE×ä[Óùµú©†_ìÏŽ-o¸n#³ÔÁµ9 vÆ1óêÇV3ß}v~eoÏvÊøxdÂÕ$•ô³À§õ2-å!ƒw'”‡¯m©&–—ÌK¢®�’ÌäkßXJÑL�£(ç<[°°'¿“**ƒ“¦…‘\õìçÜè4 ÈŠ…ûK¦yÅŠÔÑ+ïÜØ•X÷ÆRU•3÷–™í¹Še�;ƒ3ÓjâÍžpö�¼Tî·É`Ø�¬àL¦ÏН–#˜… ÒgªÄŠ’Lòd%O³å‰HZ—‘M&P6P0K³æ*ãõmŽÏõóÄm-ÿ‹ÇH.Hõ§àþÍÜmæµ ^V\ÕU¥é iúkÝ[W¦¹å—�¬Y0á�«Ï²ó ‰ã^F5¯Ž¨jöPj wB¦kNó3ôã0ÚÆ.h­,ÐP"Bò74½…1þà!e¬LšI½YÄ"g¡ài˜@¥«lqgùSžf�É™Þn² ±p4l×]ª[[‡e¾j8~‰¥ˆ>¨uÆBlè*(>�±;h�ËÐæ:�eFæú˜CgÀ‹£_ÕIø_Ĥ‡MÖgª]sͯÁdÂñ¸:iJâ `„<ž×z±\þ„ ¥¼˜Lç§O�¨Ú§¨âäÌÓÇWæ»ÏÍ/í²’�Cðähé7 l‚¤®®@Å9—“¼oO°Lª'G¨`yÕ‚oŸtÅSÆ6âœyeJ€#ké®ü“ 7x˜¹qxKUM-Aÿ'¿W0È@¯�bµì @(™Ñ5·¤<“ =¼,@]2QbZK¼ÙÀC|æâ<ç Îlú£y!33/‘9ðœE@‰(u¤uah5XröDZYLW²nÔ0ú*v†µ:WTóìä˜Úu$fÎ¥®Í€nβ#&‚|›M¹þ$Bó ¦ðXùSGÛª&›"„Ä´Éþ†$[V‚v˜Êpð±ÍA@†=¼r #AA)”YTøÚZ— ´œ6×y¤”hð�gmâ‘>Ö¸Rü�ŸÑâ³üfB!‰ØX—î íaA%h'©pYžÜ-jÄvç ×tÊ}�Ä`÷p©¡ÆÔˆ( <¨‚»€ÍŽe8ùàõg©"ÆI¬aËHŒ1ƒ™ŸMÃ|8ˆôMޱØg�‹Í„ÍP„ñúMr%¸©¸[o¯RT ¯ÃÁæ¯×>.ŽŽWmàHOà ·Ô„ËÈ9Yô‘3açÆ'4æ#’²¤VwM’“›« ™G—�m퇠Ƥb."Tψ(ÊCJÊuC"”÷™Ì‰v¦Äú@\QÕ#ÂaByü­+MMAÍ&·ýN Hö<í½ÔõIE, ÷“µŒVûÔê«ÜMZ€f›jÕáÒÊݱi#(%ór *·=ù’µ†(„Âg`¥ãÍ 1ðÐ>?tiÎòˆ`Ñvι¤­ÈŒla‘Js¡!%³6­9²±Ñêre"ïû ƒPÁ€¢§¢œ™˜òΪ’1…U:#ßÚŒ «Ks¥U.˜š %i‚¢ÚK2žÔ@Fq1-ÂJtaG1Š ú¬ßnîP³7OÐ k$?zV`,w¯X)$A ÍÒ(:U ÉŽ˜·®t‡ŸšfÐíîòc¨ØF–qR10ÕL±m‚k8{èt‰:RqHV[$“½ûA]í‚ø$+€Ÿm,ÖaÔµIš×´YA(6‰šy§B�Ø+ÒUuÂê+¡´©UÞL¬x}–:ƒb-9×]Á›¿mq­GµNVÔ8fø¸Fwúrõ£œãÑ�‡0MlŸˆÀ4ß¾á¦õD âj ¾ ]þ˥׎xs�R¢O]Êg/ìPòâ„×}ퟠîúÄ%ÍcÅ÷é­S ”‡&Þ›†¨Õ5s,|‘ßó¼å˜ª»ÀÉô¼X[wå{ߣK%1Õ§çÐýá\¶Ð†°>ßr‡‰¸Ò“P6ê/ª"뜚°Š$}S:‡£ïO& ÁµT%? Ì™A ÌXï±Ù�™ØÍ_:d-sfdf»™5—¡ì®Úp/Ÿd¦T–]uâIx@ès·¶Xí!�^nÈ—¬Öâoó6 ¥¢·ÃÈ1®pÒ¬WÜŸÊÊg¥ˆBÔ((^U;•ÞQC 5ìrà¯ñ?œy¼£1]ÿj¡ „‚lÆÂ«]çD÷GŸ1Uá¢ñOIêëCù)‚Íg<„ùÃxU�Gqµ¹…?Ù²Z¶ÒpÄ¥X¨°ô«éF/ñ@dd™`„€Ù;*ÙtçºÜ9ûÊhÈ%4SXY°j¶Ñ”�Äe�ôkì Ø]�íÐΘ«´%ç¡=˜ —³Oal;¢”8BAÉ/²=Æ%qP¨�–.W^Ãã¨K4ˆJšÄ h¤²¦½º¶Œt¸»qzº:›dVÚµ ëù$©%o¬£O¸°•ïd·¼NzÕÅ ùNJdÉVËÎ%@kˆFŽg@‰Àûö'õÂ}¬ë IDAT=S ݺÊDƒ»'@TW†IÌ‘OâI£=©Ê™§ù)LD.´ôŒL¢"dEZwßêÿÄQfÕ%‚å~ ¸¸)¨C«„.¾ê­ÁPóÑÍŒÙ<‰NŽ‚�€óZ�ã¸ogùé­¹‰•µ³ßØj:5ºÌ:™?1gŸ¨lhJ˜òd5¯$4‚QF“Ç]Qµã�ŽuâILÊU㑃Rö.î�õf>¥A»ªòã1£1�ÈŠÙá⊰fê�¨›Ð/!Ð12˜`�º%S§Ú±>Õ ¿¡e굎¡óÀÀµa(ŽªF„Š£~pnªX"ˆ}/EÉT5dVÎ6}Åñâ¨IFtó胉üu_*+…ì„òé C›S퉀Ý-£]¹ÉèõK¢¾ À× ÞtÍI¤h=~EOUàšB<3NõP"nõÚf�¤âŽÁƒ�w@õþjŽyœb~³¥ÏŽ4?X=�ë6Ö–Ê4‹”`›kÊ„˜�¯Ñ4ak‡ï>¿ põøRªëÅC)–ˆl²å¯eá’@Þíp8iJŠ�à ¦ ¶ò"|QmSØ“s!‚lQ63¯LKéS�ìx¦$k#°�Xcv/(UöÎEû’ºàFcIî©SnYMQÔV\Ð:›‰�‹Ê‹01Q&ZÇ:ÚHœ÷n/¹²P× à€²„+ξ[©!Ö$•MH4[LVòÔ uVD 5Ym< ÚD7¬Ib¤Žš€ò„&Š#¹>�ìeÑiêò·"® [³±àv*Ç7Úò¹–Âæ{P\«­9Xr‡¨lÓ`A.”©™ «—|Úþǘ>BV°|?_õÓjˆÁ¬�X�üªücùhV/ú=†-Jp ,¦XÌí–±›4'�é13×çGú!?…“£ ´S ìç[_ÏU–0„¶ÿWV§©œŠâ=k¢¨ú8”�ôNÁgUÜ Õh„òýH÷MÏ$3õ3ż‡Ørø¿á¥ëMÁD¾VãÍDZ.&ÓÓׯçú5}Å¿’& ¥Ž­bµÇÞ!î<»›KâTXð–d§ 4cõ·�—Šbj0X"¿Žˆw;è-7µ×Ñ¢zqÇ&劋 ßÖdš�lt‡�?{›‡¤LI=&ºå˜= %@�ˆ«b§Y–Ý�[œ�ä�4ÝÐPÅrª~!Ùd Ê¥7‹Èl@kKå–½Ê$m¨‘À`¬u8Þñ¸ûêòÑ«KÑu}ç¬ᬑ†Ö‡Ý‘R¢ÔÙÝR¤J…ZZ[Lf˜ºÌX5Aå&unpÓBŠEg™B¯›WÔáÀFTò!¡ÔôëÊz¦HOñܤEý ÁÚ¾Å/n�ikMâî9d4óÈ7Õ&Ûç©ÚAжÍʨÊå�Shކ”8ª¿B·%S5;].ª&,´‹öHÇk¢‚´hÄ:Tôéçw—*éj6ârí>õàºùI¤*œKJ|Ë¥ÏÐ7´³-°£p̃X›ëH©ÖîÁÈO™qP¤šì©n‰G¾DÅVØm�Ùë<•>㢩Tªvl&Emwgݹgc�V šÛþ‹WÒE¾š_#]]ãkìÔZ0ªñޏ$æ `0sâÝn:FH®)¥uf0åÌ«3¬N±Xâîsûó¼¸y{8Ô§ew‹e8^,¬`BY)¨Mà¼ÓcÞG{aïRAa9m0MxIº/>Þ³Ã@ëå+fÎ<é˜@öÈäy˳� Þ¤ÃØæaɃs&SJ÷~6®gF�¶c�‡šˆsDÀOè·{d 旌Վ7;0pוŅí¥(6g]A¯r¸¶¼Á%`²åH�$o¬/ºµÅJ�Ii˜MîW§ùµq˜�¦ƒî™3"ª–Œ ò æky~<÷DòìŒÁi»àh¬/C/R3‰#Õ#ê‘~¶±ýу}Ý2"�%.$9ÌæD+WsgÃ*Ž lóšÑA—‚C>tô÷"{RÒôÊ ZMYqוùÅ�,ÅÉÒ}Ž‹¬òF9‘†®â“V÷µø‹¨eW%šän-¯Ê³pJ V_ÊY–áYœ EßÍÓ©�¾WC˜X>+j�ÀSÌWùðXž_ÒñåêÚòÄ:N­¤ë§ÝƤ›u©#ŠšTì*,+˜«j¢zˆðÈ©*¢ Ù]Xçj�:€¨íæ6ªªÆx/ºj�ÐÈóèC† —ÄÁÙ‡òcðÉÕ�c‘'®jaàèý‡ jyQ_èÃRªÂ à•ï~ÎÍç¾ç—¿î ßö¶»Ï�úñß¾µäéjf–}zO¸îÊ·¿ôÃ/{þ�§7·Ï^ØøÏïúâ7¿÷y‡Ëò8þAéðëßðmo»ûÜ ÿî·o­üƒÛ Gøp"üà7¼û97Ÿ{Í/ÝOÛÞ}î†÷;·Úëì†Ó.¹æN^ùö—~øåÏ íÝ_ôæ?{Á|‘ˆ�„×½R:|ëÿðžs7ü»ÿç¥9Cµ/>D3ú#j†œõ_Ù½‰ Ñ£õÒb¸Âxë¾Mm½x,ëÀ´ÃL*<Mő׭† d“ú9qé6ýx‰Á'Õç5d°µÊÑ ‘•ãIjê@ ­ [«XåÓª9H]^ô+ó×—P&–”Ì~µÃãkè;º°•¾°WœPEù?E|VÛôÒÖÂ$-Ù™ §šEÐh :´ X�‘±G#ÆåÝT9R8ím*2(cso!@ˆŽì²?º¼½º½¿²³¿ruw¶µ=³LKýrŠ_KüÍ_þÑÏ>}ùÇÞúÒ³—6_øù÷~ï×¼okoú{º¥´Ö§Ò¡ ÙÝ Ò‚ T Fh{ygu{¶³?»º;½¼3«*ñƒöRÊßüe}ò©Ë?ú[/=wió…Ÿßkÿéû¯ì®ü &f¾¼½º½·²³¿²½7»¼³’Yor`‹{Í«9é³/Ú›t£TxQA°jpP¿7À%3“ÝÏ_w¢¾”ƒ1 Œ�º’RãIspXkk�TkLUZQùfÑØaíC†ª‹ž›±�º0>²§iV]BÌÄ»§n<žtºí×3_Å´ãÝ}Ü÷ȧê�ÖÂÅÊ-ëöJr'Ð+^µÌ-ïôX¦ß`Rg�ú ‹8šè+Ϲ›ê[w´ÄVâƒQ™²äÜMä.É8=C¶}Fzƒ©öVï*HŒ¬c�RJ™-6âl�KÎI�FÝHAV­p%�8¼<"kñt–p¢wo//n/¡Ë½’·J®�U`¨À+“f§¥ ìÅ2Yd¥Ùr2á¾Z» Ót‰sVµhöø”V9ä-ì¯L·^;äË>sÏ]‡•Žf)M4ø Ë‹Ì$ÈH$Z™½/À0Ò[ü1¦HEpêùtD0o\ÿÇsí�xй…oåOÈ€µYY!>²Ž\ÁQ[N³_„ Ê­F%+�jY� õ~¬ÁÚߣŽÖ Õž+L¡r±ã}^Ú^»²;=\¤­ÝÕ‹Ûk¥Ã°0ÖWê[ÿ¿'^wå»ßø ç/nü‡?x¡²‚î=ý—>óÌ ž~î÷o»%3¨tx°è¶öV´Cw/zÖ}ÿþ[ÿðGÞòò?þÈç!îWÔx&p6R8;Xt[{F!žý”OýòwÿÎëÞüÕïùØ3Ê™?ëž×ÿ‹?úŽÿëUûÀ�oø//„¢Ñ½çoøÒÏ;óü§Ÿý½ßRÎ\Ú^»²W¦¼ri{Ív^¨ë Ÿ}ËkEœÃ!x‘v·^T:(š_ïvdÔ]êÐøÅ(cû{lÆ!,Òâ¹­ T/N�]fÊÒÊx )9c×¢ÑDõÒn6G :ò“øçØw}�+y:ܽî‰+}ŸJùÁ*™:›l•ØÕ¯N±È¸çüÁ"/Ž vF²R°}·¿ú‚Á”KÎÚȼþB~!éIn…4ð9œ‰L½Pöê!¸òr33fºO™ "™;*H&Û‡uædâfÝP@`¦DäKMå'÷ì¦(‰’8\ÒРa<\cf$*wiâ,m4´$€3c’p¢gîÝž_ÜÎ2³Ì²ÁZNä‚©RÒ̦±:‹ê?ù_yxÄêrÚc2ĵ‹Ët;4vÅ6qP…¾=ç ¨Ë“Äk]š¤Ô§DúrŸâ.(”A’ÞPg�H¯c…�.©q¹²†5-Óá¦r'Qž¬�ªæÀzó%Wµé¬/hI¥ô†#¶!ªÓ£WŒø„x¢ö„y9¸ƒV­“üidô@Ř‹: •iÐLÒD–|ôÄúÊAfºã¡Óg=Ç)„Í&‹×}Ó»Ÿ~ã…ïþ¥o<qé`0ò´[®O/^�Ù0>º¹¾rSéð�G¯×ÆBxfš/Sæä:?kÍZ À™G6×fŸ%>R(Ä=箿óìé[o¹ëÏ>ñ´œS"|Åsî¹óì©»ÎÞ`¬(„NúåúìàÒöŠŽÂg=±¦S~@¦l< ÈjD ¤q¼�¬G®ºw‘¾Ú�kˆFŸÕðN‡æÜ,\XèÖ|¸Ö¡oŠq‹F�ibŒíL�Eô¤ôØT£‘ŽÃãßȼ‹0¨[,VOбµÙR“¬â·aœT§1éql`<ðéÅöá!ÉûLÉ.a…òœ¤ûÁÕd-™Õó‚¬�}ÃIÙ©(? a‚ýfŒT§ÉËCôRtˆ—åc0f}òŠ·•íKKùKöG-�`w´+L;ÐFIr…4ê�_ ]†µež’n³çÝŽ¤h…Ÿ$\7á¸w{þØÕòÚM»dñ2ëýwúFt0ÃGH¶§ò &+*�e µå´£^ Ñ@vcLŠ.ìï(q‰Æ‚ðÿÏÙ›ÅܶeçAß7×Ú{ÿÍùÏ=çÜ[U·Rî 'àŒ»ŠHÙNâb+"…#E”¤$Fàz0âKH R„È"XqÅ ŠIÜ;åX.Yqʹ©r5®ÛÔmë6§ùÛ½×<ÌÑ͵Öîµ—îýÏÞk¯5›1Çø¾1Æœk® RF9lQÇZ Ž9†M Š”*ýðBàg:»m‡¿gægfHÁzrxˆÓ‘µ Y?£�’OSÇß«vÀa”—es�­L…Î6³zþÅu>þu¹¹û‚2UpÃ#ô9³™;› Åò§T=û¿³_a 8újKùôç¾þÓŸûz?ù‹K¥�@­eê_û3ÿìãßôå¿ö¿~âw_¿ŸLT[òï|ëç>tÿñ?ù¿É“[ŸþÜG?ý¹oð·ñc�+GBä—~ó£ßõ_þÐ .ýÃÌ[[>ý;ßðéßñõ¸Üo~æ×ÿµ¿ü§þùŸ¹xí�;Ï�=þ·þЋû>v¹aRmhðï~Ëg?tïñÏ·|úsß�Z˜;Ý`Ö26eª Hnq[BUhFQ÷£[xIs)“*[ynòqM s0®rZÞœPogÖTªY¶, ÏC>¥�)†ÅØaÂ̼<æÝ†­ïíÚcG©u®<{Ǧǔ)=á×gÇ(…o¼SßxtÅ‚„î®lð¨Ë²IVvn‘A êcÖöuÍ`±ïNÕ%¥r`:`˜À¢|na �g@“ ©e�¡xî8WšWüJn@°µ¢�¾8Ý�ð9L Ó¯äÛõjÅÕš�Èè[µ"HžÞ0gh¹7bCþîùÍ›Oj-ì©`{ù¹F®Ml¢Ê2V0YÝ$ˆRXÀãºÚ[‡’™ù jËPR-ÔÉ”�,1aWqØ@†Ã0âdàÑ0”@°Bº•ƒˆµʼn,ˆFu¾t 9>?Çô_FŸ&ÛÆÊY d•ZRQˆîéðØ(ÛÈçV¤EP.x {[ù¹ˆyú Ûî˜ÙUò÷8mÿ5»µKÝéÓ¿’§¼ÛDÂŒ¨Tú{g “Ågö2Ï…Ä�ûiøÁû×ÿò÷üÚÿö?þ[/?ŸG¥}ø“ßü…OþûŸúñŸùøÿ÷‡SšI¢€6…CÀfú”f^¸c{Q܆æü•ßþú¡LûÆ—~Û¿òÊ8Ö_þí�êoöð?ño|ñ“ŸøÔ�ÿìÇÿå †i� Î¼mJÌi¦•â�g—�òÃÑ6éÞÓ0“Ӣ鮇pÁg.ÈF�a2•t˜é°…Ü6ñÕÙu·QÚjSÙ�k-ŒøÇάÜ‹¤åcõƒ)+÷b~ÁÊ2rµ)‡ë{:J©Z˜�7"89Âfäù¥|ùÍK–Ð? Xý›­Ê‘�³¾ ÆzÑ >p(ÉY.ξdì”\Ht ‚uo´mÁ«6ÂâA!�aÔ>hÑ"æ[ùBPú6X§[ps†2§°À²²vO”Ðöƒô`6ã“ÔNª­£ª‘ж0ÖÖÙ÷·Ü/�ß¼ö¸ê»ãô�6-Z©mG~{&G)Ö‰$Qè/gufPNêñÐv ÷Ãee«žI5_ÃÀ˜�Ç­¹#ovruVë�ÃééôìÉð�£ñÎ8õ�cô�çá³5ØÉ’l¤@Ûê�ºJ¢›' ]ì6Ãð^…‚¤â-jqfYAØä˜y'$ÿÄ¿þvrv…ÑÈyi²ØuèvÌï  ÒQÚÍJBTQ£Ý—[)¹u³þ¬4΄/)Y­…dÙ®3�>úÁ·ÿÔ·|áãÿÒ÷üó�µ?<¡U˜É„K”Ž\6¿�Cd¸¹9yÀã£q²™6zÛ ÉZq´ÅÑF“|éõëI&�a´fÑqÕ™µ5Ý_„âמ‚”znOÝÓ½‡S• Ÿh&iAXçBOû–ððÞ;ÖÇÍ>µ: âÞ•óFIw™ØC ÊCÿ‘LqT²èªÍ€š Å_L.bZh anºÌ‚óš®]<3byõúðÊc‘)£¨/fJ"j�¢BÁRн¶¥íHA”R ÇÓÑlÉYÇ—€‘E^�ŸLj«KÙÉÕ�z8ÛŸœÉŽù�£ñ´Œ#‹=^‡õœC�`{€H‹N“ˆD¬5SM,æàÄÐwNœ;0iz¶W6ƒ¶¼®bEM%ÝßûÒTø³“9¢�–.HkFÆìüVóÊV«\‘çì.´-Ò�â‡&5¬1‰3ž”@‡wëØíƒÐ±SÆH,õ³z<¼Ø}òoý™ÿê'ÿôËãùs¿x¼Ý·ó¥Ôÿè»?ó£?øsÿÓ?øîÿù?v˜JBešª21Á‹_É8zYô௧Æ1Õò³Ÿù¦oþè«ûC/}ÛG_ù™Ï|ÓdS_¥Ô¿ðÝŸùÑü¹¿ñ¾ûÇî�Mëo¨î½›}ÅgÆWóH[©×X|I{46÷=�7¼­D33>6òãRfù�>ó©Ÿ�[C0±–;&®Ñ|»¡ V”êýd†Mžöä9ÂPÊß«¶c¨u{|¸ÿ¸íaÔz:s ’�îƒà‹oLO®ot‘³)é8a¢¢˜·\Ódç#¶�»7ë@ðÞýt„ðñŒd…õlšª©£ÔAê(u#u¬u#u+Ó¶NÛ:íêaS+e·1ä€!6-C«¦Ö(m6F„¦§z½»¤ ‚ ÜÓŠTøc“[ø#&�ØvÒ· 1ð—"rwƒ“�_½™^zwª“’©Æµ:‰j´ŠÔËÖæë5f-EãW²ŽRNêQé¶*›ccûK]š“ÏÁÿ°Åõ©\ß™vwês'üàns6”�¬NwØ{εeJÎ-ÙËУœÓ®° Clå±ÇvÉÍ3Z�+¹KjNÃhýç°³E]=Ÿ"Q¿Û;šéÓÅd6ýkuÜn?y™’˜zﮋ)œ‘lS_€î½+yÑo‹,¸Ø3E±|Z݆%oµbŸ\mß~|úðâä¿ýé?ùð+á»?Cb;L?ôý¿ü#îþî/}ëç¾òÁoþÚ×þͯå_ÿÚ×Ov7Ö3áÅ ð'¾ù ¿òßÿÏßû­ŸO 4ã� :á ͽY¦~ýK9¿ÚüÕïû•˛ͯé#M0›aú¡ïûåù�_ø©_ú¶Ï½ÒZøjk!º4F/U„dyΉæºº.ÛÊ?]Ý"€Åî9–ŸQxD,õ³û–›HdêTìnÒ.mxû3:é0E�¹pÄT[í(¥ |³uù_�Ÿ}á6•ú��ekI L×÷>p¬ó¬–ô]ýþ[Ïœ\ýð'~é‡?ñKí‚Ç—GÿÉßüó¿úù¯£Ê¤ã(¨*(6 Ë�“®KHŠŠ“Ϙ½õääŸýæ7þ•?ý+?ö�¿ó�óö”ï�^ýÙ�ÿÖ3'WŸüħ>ù‰Oy ÿÒßüó¿úù¯SQHtt¾Š‰f¦sæÒÜÆÚí¬fnI¹gGM.«7NÏå¥7zÉù¬1 Ej¨«šmõ§ôRN5ΕZ–PnÉÁ¸Áj š¥?€æ,zŸÔ¦n?2a·¯2ì§Ï•Ýv¨ÕÝ�#Ó€F‰\NwØŽ¸º‘޼ 6µ×9:Μޚ¶ÚFŒk&ÜHÂìRbº4 Ξˆj�sw2Ò¶÷½jXs4âN‘‹ƒ|ñá~ÚCgeÅØSPõ]rmzµÂ÷‘At�¾Y0,n 7c9Ù�Tç¡ÔÚ¦É,ô•öÚ×°�nTÉÃFöcåFŽGÜËXJ‹#'{¿ƒÀâ‚úœ'@TA¡Å7F8–•T8³´ˆ>*¬Ë�Ã|ïwý”H½ºyëE¼B JKk@³Âava¯†Y»€@ÓÌ~¹„õCn«,ZâH²VÎjm> N´+�ßm­Èí�4*NlêÍAB"Κ�Ä ]¬N€Á”iò@èc?)dÇZOVº—Ó±ò‡U¹¦ ž&µî·E듬ò\\0û»v�?¶áÜ8{Œõ}µTòCƒäLwÞVÅ> ¾ IDAT­’É·d ϼ™Þ­ÉêŽýKãÞwCìÈŸ¢§€¥k�×6ƒ�÷¬}Î9p¨u»¹úÐGNÛ�bd§’‘q�ûw(À¾²ûòš–™Tû²ùU‹]‘?g—Ú/#QoŠ\<…Y;õNƒÛ :wU²k'Ù‹ ” xªÜ,~ƒgûˆAx,|pVà wÙ=3¶’ùw¦¯w7”*_|r¸¼Ò¤¨ç:ØFVÿt׈ôX�8­³¶?¥ ,cÚ; �¬³Ÿ.3%U†²)Ç#î�ÃÖ3óV[MÊéfXEŒ>-6%‡B)D¡°½žH7¡´�UôñBÅÈc«V÷̩ϰÔÉ2!ª›®‹2Sû|8úA•ôS \Æù§@႟»®Åõ批8=‹‰òŒ=†Á®ì¸,Í{ØŸ¢îÜqb,É1"‚â5¡’ó-s�÷�HHwÚ\cµŽ�\zÊ3åsR´>”t"õÃýVÉ”�ä2?8ûWK\�ðbÕ‰]%ªÍž‰±‘u¹ª“�D¥�S‘ýʾÈh"ºÊ‡k&Ôµ12Ó½�×òôŒdë�“HrŽÜ®KÍîʦ¥“éš`_}²WÒ©ÝÝPäáz�ÏéÌ ûçÙÖ1¹™XÆÃáäÙ²Ûl¦šÔIÄB¥ðmN�°p~‰—ÞºÔµ%ýŸÜ;Uk÷! ҕêùÆÕ!#æ¬=‡%/nn�KáÌèðHˆÈ5yÜ®¨4=¦Õ1’›ÑÕ2ejÚ…ÎÓF~BßÕA|{[s¬IÛ¢jþ6ìÙ]šÖm�yÅâñ¤t«+ÃJ–äþ†â‹Oö�/Z-,_j¢äï8lÍ‚´lvËÓV“Ô×¶ŽñЕIèLƒ.šå`‘¡Œc9Ûðd°B&{Ø´˜ ·æO‰iï²Û”!PŠÃ·:.�x'@DöUª ŠLUª }®‚©ÚÛv«lƒ©™|ÓÕ%Ÿ%ŽÌZ4¿$3êâ}à°}My¥¤Üqc*"¶áMí*š‰Ÿ‰™æþš×“Ó•]þK•½Z™nµmÂ×â’åé³ùÚ4ÉB›7 v±Å¦KÎmETä—Y Í”–ŠÑë"=§¡Þªz|~­á>b+)·Ì¬À(IuRã"†3é0™°Ò5RÛ•I[:wÉD¤8–†(|kžk»Ä÷Ÿ&:WÀ§©‚ w‹íº*Ì¥Í q¿dÆ©49vúêmsNõ¢fyøt—•McGìp�ã�„áúÓuÓ îˆeÉ)ªæÊni¯¹-DÆaÿ̽“ÚÞSbtÎJ»(ÀfÄñÓ„ß¼©¬fMQTò’Àú6y³Ú¨MçYœ6�¿óÞJ:½”麔ã>“¤Ü€G6¶ŸœÓïc¡_L÷Â$¥à³HM›ˆ¥aŠŠ2œSS ‰Îê¤i¢©êË× اE6é¸3b[ðòÅþ­s§Ò¢a¾´ézó9ì¼gÁшTéT)άH †é²�v–‡:”qÃ{O6C!ª´-ŽÕS€.lùy”Ó‚]Á`F[ÖtTáþFªð0áp�zÀTq8È4麇IêÔª`{,ÇÒ\1®ˆ:Ú4FÆÊ¬.3�i—Y‘ Ó°$•¤‘ùöV.“Öâ¾u™îâ§•ñ7BJå/¹,70)dü–¿³9a-�Ѫõ¼G„¦‘M+ªAdNÏ­)ìÊ¡�ô¡bj±ÈLIÄaÜa'1s™ˆ*f.©¬(¯—Z£½¼š™Ö›füó5·Ýê0S'qðž�¥òøšmp ŸfßÌ|:‚OüG¸¹/µ‹�æñw·xÂ{´Ðã°§ùÔÈÜk�.„’4§kC‘à>‡ŽÌj¹ ¦p­ÄNå³NˆôwÍØ·3À°22�/ŒûýÙG6…eªšÔë#)µmÍJ!pzBмñn}tsÓ›cõ¢géÙ©ÑÍ€BÁôdƒZLÍ;‹ë—=zƒzù™P¤;—…ùžVìèG¹‘²S¸È?SPˆ± u^P’oe¥øâ/ z}´1éeXmÌšíT}ûºçS!:q˜—°ë,·51¡PEŽGœxëúðÚ“ÚüÞÆwZ³ó¨.È f]gM�d-ô"ÜÆ=+a l] XÆ:–íÈg¶eWJsjÕ<ü¤Ù°âd#Ài‘Ó�…²>¼‘ëC¹º®Ó^¦ŠzÀá Ru»‹ÚMæQ,´i»z´0=ÍJ»z®# b\MÖ”eßn‡Œ=Ïh ãZÿÔ4¯-ê¸Mq×›¹‚"Ívç»2$µyF·VȬ�)ÝJ_M@†u«£·ù,CDŽ�cyÕÒ}É_gçÝ+Q‹1]™ËŠg³¹îyº ª€±¤¸mg©é®:Á^yb2�ͬ÷sÇmñ“öîNÒqs†[ aÿ§Þ€å3Âñ°üÀ,bt6x"7; ’0Þ¯¼¤ÃÖ€Ø×Wgß¼ô[a¿¯*:–`;ó««®ô®`§HÌ7¦ÕyѶÈ>€›I6gÓéñ®êF²¦Cz‰M€'G²ä⯾så.«µVÁÝïtIÓÌi°šJ.†öºeŽÖ]ZÝr禚 ï¶¹�t©}¸¡ìªˆ³¶ €C ËÌnZ¨¬o™�ŽP“ù8ʲñ5PÓ%PlùL»‡þ´|ŽÃ3Îl ÎF\êKO¦éÐÈ´ 2iÏÞŹjv ¿õ YXFpô-®$ÔuÎ!Ã8Žx°އÛ£eav X›Œ†"wîÈk‘Wã�‡u‰F4‘.ˆªšóÂÔ@çÔ„ÐtK Óe©q©ú ”=CGý…~teø’JÞ’›Á¬‘_M¨å6ŒdÕÞ^Í]¬rììD_t°ªEÍ#?)bVTî_jW47¬»}ˆg7S4*~Íœ©œ­;ñ½ÇÑgƒsAyD2)¤NöË|Ð1™ @êÝ‘ÜYs#ÖØ·#·$É…Âd�6+ ÕÌ.™��ã× �0²¼B—H^NTC3Ó^ˆ¢ö–ýƒÜ]m©%@›~ëxÓPÜ~8æ…'�Þ«0�äFµëc÷éEò²vtf›ˆüŒÑƒ‹ÌK, i·Î(& V5?‡ê 0Êõý玤ÒåžÖg¨À«pådÇ©ÊËoì:èmÖä SØÈH‹EµJËÓ%åfÌVœÑÅ@fæ:w_òè÷à;‡±§&4�L(b£ºgé6¤ #-6÷fùBS±UJ>c«Ú­ô–}Ò_Z¨^�Áé7æx–¶]=|\M»ü�I9Í Iîn0UùÒãýÍ5àÔ ãÞF«öƒMÉù‹†©Ê�m%Ó@ŽC’pǬPë0ÛrÄÉ8(q…¥†JÇ.0 âÁÈ�òÎ ^x].·§ EãæÆ÷^_$ëÔïk ¾a€f@&“ƒÝ]Áhí:*êtbÙg°c¶êrÉJ-^È %õ³wÑŽh¾ý.ùkžx´^÷F² º[�¢·�61ÉR˜¸\°ž"VÀŒÈ•�tÑ@†Ô\{_×ì(³?¤»iï+3Ù>8-Ìj°Ú÷ÐõÎp :ÆyÐübÁéB‘: ëÁÞI Û§ÔëØÅ´=�N'CzÛbâVŸˆ!zžóêØU(×î3z2cH¤‡_-ƒMÄóƒ4x°%^Ú´I€ÓÃp„ÝØvÿjÛŠ €Z¥JAÅT¥N¥VHÕ×øv±KRw;“KIãŒéKø^µ=ô'Íìçy[‡�%OwÈ’ð 3ú§3þ]û/â,‹0l[ªFרeû;ÔŸgߣ…Þ’†ëÛy›ä}På �Ôxh"{ôß�L"” OÔÐn06€ŽU‚g·ß\\Dr‰?¼l™y è»dÚ�Wstmõø:LýÊ¡„ßLN@b÷îƒyÆ©æ)ûš7¦éŽ:yˑЧµÎ« bØRl¹â›!z*é«‚ì\s%̱ìì§kÒ¹Ùìw]«õìf:ÜùàF[¢±G´µoR N�)"¯½u¸šöjcvMH÷{¾CÖάáOêg’iªUcö×çœê<‹¢¬¥Öüµ~­²ìÔìÖY�¸Fè’½„d÷óµlsCõ{ûÐ/èmÈê�ÃèGS/íT@¤ÄðÁ³aÞÈ^Rѯ&Õ&àÎE´é­Ð>¤�cGê"\‘¤¶FÉ`Š¡g\âÊߣ‰‘Xvóµ=’Ú‹Øö=Å ò×£m„AhS¢+FÞÒ�a².¿ü¾çTo^b)ˆ1ï1 lêþ΃�We@¨ÓŠE Æ‘Ç;L¯¼}êc°NúmPÚÍ´¢m¡i85n™Óe?bò褖z¼°Œ¸ #É7÷æÕr»ñÚý¹‰Û h%݇ðK}é<ÂÚžVTNu­4F cߪ**ôÉZšG ËŽúͪ“RT~r¶Ayñ|}Õ~isž ÕæŠÃpÅìmÄK)`al–µ”]Á„ ¶›ûÇü'ãQ)‡@W2¶­1ÌFÛÚ„*¸;â˜r>á ¯ÉaRÛ!DŠ©º’V`µ¹™:‰½`wïæƒgG+†çèíëjU Ææ!e˜s…ÉdÂFÞ·Ý'š‘) úgõ®mâÎÉ ¿>�Ð#»­ÓÒ�HSÙ:ÞjÜÆ:IK5¦kf?µŸ½OÕѯ`ªœ]þïÿÙß«µüÿçÿÕÏ}m»hцTªœKiÚË®ÐÉr6ÜÙ$»¼YÖ†DŽF:F=iÀ:ñ÷’~pgÂøÅ2L9·ê¹;Ce EØ/�µàO/Ë9á…W�t&ÂÍUç¢ÿHË@ ůš[÷±Ï…'±FæÒϳk¼Ø–à°©Ù,Tº¤8Àe‹$Y(ä“}�¹ø úõs±¹0Lç ‹Ð’jžêÒÈ©(³Dõ½Â¶ôÆí„Í�ºÛ©6ôéjÛûFàø¥ð­wêã«k}îÖ6”óX•9ÀÈŸÝZfp�z•¦Zs³%Ý!ë“~ye——2™¶æwîò¬@,¾ÎZÒšsZKË HÖ¢�l‚uk§%T“šÞ8ˆÔRJÕ íU:μ¹p[+˜Ñùv¦Ô %â�‚*<dWä+‡Gº“ÊGš>»íÛg]}H¿-!L@IÜ´å´6ûâf-Ãn‹gwÖœÚvV’@¦EM UüЄwx6Ê)qUñÙWåꚀT�°u�1Hhn›#nK–ÌØE,¸9Ï®?|ï8‚¼´v<¨FKø{¶„ºFJZV9i†@¤¬¢b튛´² |^ÜŒa¬ÕöóÚÑÜBMzæ“ Q’޹ó«úÎþüºMô?9»§öØùwžÿÕÿå~ç•ç~ô?ø¹gïž/ Ý¥*Ý× �æ7Þòe¥­ó~¸=¬ß¨™,#�Àó§¥·¸8“¾‹—˜=†Hs0‹èD탕îrÉÙÕ•Y6c“ýú”µÛ\ó£ãk�%tÓÉìÌ‘>ˆ)YŽÔg-pÓE/ÌœP¨]k«ÛZ6«…ÍÅeÚ¡Å�‰a´\ØRo$Æ ~WÛµüúìÁþNx�¹lJ؈a»Án+7{¼þî¾Mýuv¶ì(}ε#óÖÝébƒ ˜”(­sĽðôB““SlpÚ S×M“oµ™8š¦NDÕÕ …K‡ p#à\!òtïöÆ ­ô•BÍŠFQ}Á�!÷¦M’¶ýàûÅ`nŠÜÙàñÍôúã*ÕÖûµRì�ëmÏÀößÊ)“–â+Eÿe)…SH¯ N‘ÍøìIyþh3€6alÆíŒe­t¸ïŒrVpUñ›¯áü<ÙV{ÅTÀZ!¢/H\IB D)ØWðôæÜ?n ›&tŠD�FF´m¤a/ŒïÇ_ãWxÿM7Ú쉳ðœy ­çêæHR¿n˜Eú[VÑ�6D:n>½Öl Ѽ¶ª� 9fÝ\~�«·t…R�š+'Eðê;gÿø×þð�ãë§—«¨D¯k»¶vµ,ž b1n«œ§*áùOû%åpz@ÐÌd{È8–òre& �üô´Bb†È¯-›ÉüIÜÒhëK3§2Ð/Õæ^×ùÜÂåøöKÀ£¯Õ²}¼-iûÕYynfiHÜöôŠÀÌ%,3 õGÿ¤€ÎJ+m7þ›çžÞÇ!=™8Ó{ú “!]2Ì¥±F[:º=Èö^ÙŒ£â�I“•mVË¡ðä¾ùn½¨{Ðý†HÔž¦ëÎI¢™Br:0­õÚ±+5‹é»vN£YÙ:ÓlqФïHŒþêõÚ:3q¼�ÍútDUÔiûsòTZ [b¹€loqUDqD•XvTlh3‚4(«Lãi²½»A­òÂcÛ/ÂOÚ™‚YßZ¨ª¯hm«™8ÒŸ}IG)ãv7|øt¸3±Ùi)⩵T‘/¾·ÙI•ÝÝg—‚ßx O¡‚2™ðÔ…W‡¯½¯ ¥Rj¼«€�Y9º~þþÑØ†%‹%Cã#åg‘5t‘öŽ(à€õ‡.ú¸&)˜~ŠS Ó�Y†h6Cû䶘'±Ú-ö¾t�ZÈž¡�h›:6c¶hE”Ä­uOST7œvxoÙŸ_Úcø<’r÷–áHdvÐçD£ ÛpÖMCÛæ'¡_°—*ì“�ÖZIפúSób· ̤Ð1±¤[Óÿ\ö × Ll›aºöm B+ÚÃÓ|‘ÉB­;)M4Þ ï–ÃøÌf"šÜ·Å#! ñly1“œœw%é¼Ë —0ŠŒ€ðâ!³ÔèTÒ”5æÈt˜dþ­³•‰Ù†×ä-é=»hÁ"2ðæÎÙnBaj  6ÛºpuS¿úøÆ%e¨’UËëñv†ª7‰LW”›ÜéG…X•I²a$©_•U¨aW°'#çåôÍh—.õÚ%¥$Ä�‡°mÈ퉚´:¤"fOˆÔöÎÇ»·1¡½/WŒ¿“e4O.=ÿÝÔûd� ñòùþòJ… �¿ l §ðÔ}rP �* ^A¢ŒDÑ©ÖP )2”»Ç|þxYª3‹O ú<´ Å!¯9#í×{#OˆKáo¾†óGÀ€êo‰èú +P¬¦I£ØwƒØÓîæÃÏm†R-°]dÆL©yÕ‰{›öÊ9A±XD¢kæi²�7ÿ ³;çŒÞ†ƒé‰DaaèášÚ™@3%¯·}ô ¿¸©AvUÊXç®åÎJ>ÃÛ„0—o�ÎÛ¹JâÑÛ¥šY|ž-}õt«-„ï&WXM )kíBGÄDÎ7ó{í˼•Ò¦Ô\;ÙÕЧBÛç½îp5fÒc:>§_S…Ú�€^6•M?q'�¼‹/ܲRî½£¼ºÒ-Âßb‚@|£.±/ ™SÃLe·™IT̳Ċ¡ÔNåYJq­¯V°KM— ßaÿ+¸¡‚× ³}ÙMuwÛ8 ¶¤ÕÑ@ÔNNŽ(‚¯¾+×õ@ÀrÆ i:º%²f²@¨—£’QJwõÌÐÛÇ5¼›ëc*&—!�`žrd%ð:`{O�!e^´žFܺ�mË$© ·zÛ²^_f1’@PuQqPB+¢B™»†‚hªc´(�Cd3àtÄ£›Ã[)^�'ƒ÷µ”›^!m7Ŷr ¥XÞaS0”æ˜^A8 #>p2nJ™Úªô ´¥¯ÅÞ„ä ¨RUbî�ÜRMøì«rqº}ƒ®‘iýjÛÛ4M©@Å$�‚I0‚›²L››ßÛlÊ€x`LŸYr-p^Qk·€¯€÷7|Õ˜½Övéø½Çáh‘˜5y›#òÑüùb¿ ©µcM*ŠA~G×@1Ë¥õvùx­[ #˜Çë\cß[�´ } ¼öîY­üÎ?üå±L}ù¿§cµ1b-OèÙÝ’‚«fAïaùÉåÈ¶Ë ;•uÞƒaŒÉ.ÚT攘½²•C‹‰@Jf¿Ù2 «TÍUÕR®lÞC™K³›;ñn¬ÈFÒæÒÏZîA©„Eÿ¹�Yl!9Z¯¢aQµŸ¨ýóúŸ\D†¥É¨0?Õuж÷››àËŠD‰Ö"ò(×ÝÚÖ£Ëþìî¶�×ù,%°ê]«UŽ�8¸¸Ä[×êh蹩U;ë24:òõ‰1HÛ™þËmwF"õöæ.I IBN,¾g[é(U›çã¥Pæ ïÙGxöžR°�d{¯{ =9Þœ K�•‚£#©o<œö‘n²©mo^(—‰ˆ b'ÓeÁ¡-m9ÔlÈ&Ý.ÕÐndRÂnbdkv©�<`Nø@çÉÅ•®®�þh‡TpO&±Vø¤º«´‡@5«œj«�ŒoD“ãúJr)@•ZH &]꧘ãç}µôËÉFvÄ+-!lýÉ6é~ui$D³,¥e z�¥r¸ZžÛ�¾&DÿWÑii%G+6éUP€³‘÷ä‹çøíqsãª\[‘:bª - ¤°R!9ì�C•ý´]?ÿhWŠ mújoxw0Tñ¢%–¡$Ô~—³GÄÃyñ•–^ðDDÜ«(‡²Z‚±z]‡šj'TV’OëÍ%²@Ömô©�Žì[?ì&«ÙÿXX7vÉMûµËe·lUžƒˆÃó~võŒ½yú�Àó÷òŸúÙÏü«ç¾ãÝó£§p�P;ùÜ~ל}ÅR\¶Ù9ÿC'Wºªi Ma¤�µ³-X�™ãå².œL½â«¸Û$e—oìºð9t,†Ñ3I¾]Õ-Òd6ðŠ@©\èjû�!œ(7FU´kÝY/°Ó}»3~aJÖù¤š -èÑ»¬²’¤KÐtNhgŒñL ‘E�ta>‘réˆÀoó-âñ~ÎX?’Rr,×'gÇúî]Ø0J¡ƒñ醂'çx÷ò¦]fc’¼œèn'uûHRêžÓÕHÃ;3GKæfzœ‰N“èZ‹mƒïCÕ«Dß’\äm‰mÌìlRn¹�Øåùg㪥»aI‚¯9úV€oÌÁ¶/¿´÷ËÕZ ‹[@¥š¯åzu¹ÙHœŽx²¯_=Oë“€Žˆa sFô‚÷´µK�bKK|«° G~è¸ ƒíš­Cßzgƒ) e<¹yÃkyfÄå øâ#¼þ:ÄHL›è‚*n ”ƒ(“Lw�ŽÏöº³‹. i–ÖöE$|»�î?ï�gž¹¬øÂ+¸9`4Ÿ#)Iz²p®?+'o¹0+¢ ·g#_öÄ›‡®I†/^–“„¶°ÝåÙ>»Î©’6äpWÁB¬ D({ç-:µÄ‰P퀭mFÃýÐ[wO¯êSßö…WŸƒ÷>)Ïš;Û½�YaÓ05�#¼WG0¨z5›œØË¦SCO!]¶ÓÿfÖ�>ÊÍúÛjŸf’áü×he?Þ9˜o¯lEŸ~°gØ"1·[Ãz³[àaØvÁ·ÞÑ]“–b|f3ÅS:Cíq¯#d§1Óé9e*èJÅLlËA0štù´.æ ÄfLµ0¿f7Õݽq,¾¾„êð´žVµŽB9Þ±VyóÝ©BŠ=Ð &Žòñ〜ênbLçC×— èÐ=wß;ù&Aè›É\²KEõy¶ÅKâè…T™þvw0…â*Ë` qãrê¼¥`gSšs Y^¶4E16„JR¦ŠÒ¿Œœ†Obdq²EyéÉa:(7é’ŸÐ1lw äæÌ¯–Bll½– wØlð�ãq,EáѵWþm2AˆVÊ ˜Z˜.µÍï ž)ˆG|á«xô¡¬ú`lNÖ¢¨ÕM:G:µ¤ïî¥xÿþ3÷8Ým;~W ˆ 0\tV£Kr¹3àN‘½àó¯`Úº¯ŽM’=¯’çüX±ò >yGûî×XN¢šù€l"~0U„;bNS¢ïù�z¡» Ón';mf.�ÚÐyoý?=JÔ©Ø .ánví÷~ˆ5ɹ+ü�„ËÝpZËß«Ü%öJsƒ8ksα¥4²õÐ×y&BÔÌ݉\kO¢ŒùÓéwöŸÓ~W/S°03ñ:·²;X÷NØj"/°»ÕðÞ„üê/@ŠþS„šº”é1s‚D™!¥W<=ß÷ÍÇ Í%x–öh!×è+:º8prwÓ^�móv°žªÉK•£#”OÎñèæ¦U­ÓrAêÚ�`<·œ›LÔË‚Zzd0z”-[®8„×uS,FWqAöêá~äÒbn�,Ædu bE3 Ÿ‚1ñ2y€æºÚ¸‘0QÏfAuµAñÖ ¨O¼Š@ª` k53µ¥fm·#�¼y==¹QOä|ô¡A¬¸•ç+ølk~º�½¾ÞU¤oñüɦ½¾…µjÉŒ!*d57¢-+Ò)XÏŒ|0ÄKø—/áÑ#’¨:çÛòãls¸­Íҧ’R!µa9îQ¤<ÿÁ³òÁÓ­WêyMî441üº6ª Ž ÎFL‚/¾�óÇú2ú¤Øœ¸kH�X§O;œÙºS&õåiO¶;=\LL¼$=K,(èh<˜ªC¥®‚ÒíÛ<­§)EìßTmé¹Ud�xß☋ê=yêȨŸ±šoð»—ÕumèïÌŽ5g×Hc ^s†„±rð„-U'º\]\4÷\rVaí<×Ïç ]ÆÔ3Â’žþ0·H ‘Añ6Ò`¨qí쉔Õcöœ}Ãç”^ŸO¸hß³=pPMNðB>®Í‰¬³X‚͌ك ‘[&¢«!Ï·Šl«lîr(5ß¡=õ÷‡”ÇG¨“¼õè0¥ÕÔ¡oJ‘è͕ʀ�ëõ¨"t‚™i«RMvœº¹ëx\#ˆÙ t\ièm£íÌ6V›€óË ]îÚœÙÒ죑Yiïa«ê‘™ê…@ ÙK•�ÐÔ´ñ+ÚW ½E5Ø"�ja½k!§#U^y<ÕI ­ðLðéUcJ#ZÓe² ,($ 9Ck¨ÏŽyÿh„yŠ…nœí €Òºa,¶véîÀr!üâÛòÖW¡/�#ô­Œ…¨‚ADPôq!!Š.¶BEK”J¥ìëvïŸ<{*÷vÛ&QJÕ{Â3 ¯L¯ X‰M‘»# øòÛ|øŽ E÷Öu—ãxµŸ« ò™ßÏÞnÿÙ+1M¥zÆöÊÆ: ‹XP‘¯rBõ߆w½@ÚžÊÎð°fq xÂ%nlÙ‹0oŽeúØ|éz¿ytyÔ“±7Â'H–¼k ý{pl ŸnûmM Ž Jì¨l9 Y1} Ú«¼»šú ÚdLÆníº´–j)ðÜ‹hoJU¹ ›¢„«ä6©ä´–5°|¯h^#?þÈÌ ¹×’>ܧbëóÅ¿˜UÊÈÙâ™Â¹ R¼¸¿2Ú33}ël4vÅ—É ÑT¤°kžõTpt\‡M6<œÜÝ…H¨¸.& ‚“JÁãsytsèÆ8:vÕ<ŸƒIíàá|pX¡{*W§BŸµ¤ºI¨p¹–mËÒë‘ p¡bÝ)™÷w(m{ÃÂä‹fw8Zíj.Ñ *…t®œ¯ô+mÇ]w/DZˆeg[.º¹+xñ|uÓxÊ0ÍPPìk‡_¤u'&–¶`8/‹î�òÞv´÷›ú@¹'¤šPÛÊ5)€»Ž *ä•+¼ø®.ÁÛP™ h/7P¶´T�¢Y­À�8ÔÝÑæÞø�S¹³Ù˜'IY»Þù⼎ÎÚc¥‚rÄ@¼ð.Þ~³êF(¡®4Ü×ÍÊ1׋Ùù9Æd6�3kºXú“6XdÒñŽw­ùlLc¬½_œI'ƒÃè-ÖÎök¿Në¶ÃPÜ’Vä3'?ñ_üô³wÏÿúßûž7Þ‰¬†G—'ÿñßøÁóë]Më�R–˜®XÆS’ú›ðã½+Ÿs\Ž’ýs¾(�r ŸÔîõA°"iûÀÅÀØ7xY¹Lk¡ýM„‡Kïid–Ô#AWFê´ýþ ÍîÀ—Oë2¼´„Hê'æ0@Eä#ÍÅúHéí2w(ÍÆÃ]°ÁSv4„‹‹fâËÝËÕ­›´Ã§gNRÈœ…Ô W§%Ûøle:¹Tx/l…—ïÑÆOÎñøjÏ\k+v%Çc«Àœ�©R¯6æB¥1¡rÍLù»ÿÂóÈÉáH´ÍÕßÕ'vã}›·Ø�ªÔÆA0fpR5ÔP¡Fó%q’ËÙ5Éwh¤wÄÚ ÉÛh‚*@ÁnƒmÁï>Þïot6‘V# »PDJ¤Sw_!\Z̪˘Y9<{Rζƒ¯g`j¹É¯õ�µ½äN­KN Ž Æ‚ë*/?)¯¼!Óž,2Us<Ä_jô.êU˜¶‰ ™*!¨S-àÝÓ³Óé¹ãqŸ�#0¤†ˆbô›¨+1÷Fl€WÏñê+•@­á J#Wêtá|èéUê­ðX§jO;neÖÛ/#w’½ùcѼ]ÏnŒË˜â“%¼¾çáº!«ÈãËí«(� •=gê\$ÀÃyA,; !'–X]¢ƒÉj…3‚qîŽâ»ô\´Ôäuö~I¶£ùuiê½ZœoK:t�ìÛ¥x>ÄÓ9F«V.,M¢ÕŠJ«qÀéÈ'‡úöEŒ¸7]¤9š´‰Ýjæ pÓæH ²Ð&QÛlLypRîl†¡©ÑvŒÊ{ö2´·»“;ÊiÁ@LÀËçòÒWqu�÷,Ó×CPŠâo{pƘUtÿg©DÅt�í°¹7<8™îí¶™4¿¥Ô¬�nÏ×&ÿÈ¡�rƒ ñÚ^~•Ô&©ÓF‘R0ºøMIeF´6_”õÐØhÅÓ”[Ôé¶ã) –çí—Œ—€ÉókÞ‘€Jo§Ør€¨ZËOML3_Q;\¬$u”úÒôËA;Ï%\ì ÖæT”ÝH¯;Qú`ƒgã‰Èø…©Ö$‡2ºÉ�&šP¯¤™*Ã̸ô–¨´,ij_%¬Îºibî…�@44À¶KYÁ ‡#_Ó€´rA¢�z>Õ'Ž—y2+”ªá]ÊðÚϹ͡‚iD¸ú¶ÔÞ™tjóÉZ—AÓš¬4ƒè¸<w,Ò`ƒ‰‘|&&=÷‘¡�ÂQ=ÝÝú1Ý«I›ãWÁÑ–e�«K¼ÛÂÖ˜ƒŸŠÆ³hT[/¦kÈÍ`êcüK�2i�#Š5‚¤îa`†bˆ�¼À7[êòºTp¶�¸Ã'±Fúœ¯XƉ’$Oo¡!½ilp›!L›Ÿ¬¤ûÒ–5×ОPÑ¢Aî*Âã FÊë‡io¦èÖpê댛ÚÕv%KiïBçÀÝv6ƒˆTÁõž÷NËÙvÈ›•Ôæ9F6Þ:\�r:ò¸!Uøú5^ü*/ž€ å ÔUK­]ÒžüÒ5[0Vån}y»T©wv'gõ¹œnv¶±U´AÓ$æƒÒG–Ú¥Âă ¶Ä|ù+öîå¡i£`$)-Œ6›÷,[ü�©y¯*Ò·f¦žés.2Ÿ|?ÇŒY�ú¢²Î::¡ÎîNø”z¬:Œ5îLI ðGÑ ÜFÁ]’OÛçsíè2'K¯55w)ÀùåY¤î�±ÒÛãyãÔÉ~�A{HлedÄ\Uâ(-ØäÅ�©‘2Ï»„ƒdÓ§·Å@•ß'§mn+Î>®.íÌ­ÌYò.N½ño1Ç¿.c%1�—Õ“¦–’âÁ0Óý¡²ÑzlìÕvLoù4¨f�™™ažE5•ˆKlŒÆüªðº˦m7RÝ%/£ÕÐôewD>®{[H˜9É/5‘'QÒü*ÓÅ�®îe�]uT¿Ö'=#ÒGó9NVÿ#TÄG¨Kv¬ ¸µLúsñÑ]UǬ[±–&¹ùPöiÉR•PMþz¶2°i˳á«xú+¨@HG#ÎõÝ 1Æ‹ktòHŒ�,Ä΂¥”ͦœo”ÇWxæDînÀ˜ÕèÝW©xŽ[€M‘£;’�Á›Wåµwäñ#‚B©¢Ø ©s›­U`Þ–DXa�áÉ„ Pxos÷lúàñ8°´—»W %ÆóX%pØ!ð<Ø`Wä� |ùÅ<ä.‚4y£ˆ—¦kÞ¾°sc!I¢²dHy­í*/¾Ï#««ã»Ê­à&W_ìÏ2‰³n wj�«éÌð`�±|VÄW DO5Zµëý/ÌÈœ½*�ÄÊýiCo•aÂ*“yáöy‡�8çñb7`׊ÖzÊý ¶äW¯ä…—�IÉ®@ȃR‰ÒS£â‚K€¦�®7FÊš4î½/B-'àÅñžÄ‰÷qÁ-Ð�?gÛK’A�ŠtI‚„.ÁæKá^®÷W¢D·Aw'<Úa´¤f÷¾˜u>ù,»«g;z«  Íô“‹«&Ûñ©8Éú;þV»Ž¡ÚTðÌ™5ZÑgå;Œî�'‰4ÎÓž]Ìi:ñ™�’³ŽÙ˜ã߉µÞdÈ   ¬ §(ÓŽ¦Ù¿ºóâòˆY@Úž®‰hó½áÊ4?ÏkDªÝ¿Ùb/_õhóâì.Ë2’W¼b’ÞtÍŠó K¦HÀq•á CñúÝibd³å4ááå^Z>ÓœÝôYr;ƒäp>öž�dÙ¤®6CsÓóAœI#ñkôYþLC»›hؘÅi•fÇ>ÝÖŸ!…e™W©Äh+`Ír ªY„O¦z¾§W (ÙEN�lFnмþäPjND|F3ðö6œÖT�þZà m¡0#œlZ�1R_hOJ� Di£TÊÍ$oßà�s¼}Ϋ C$JŒ³B€"Úhs�ÃÙ¬¢;F‰  vãö¬Þ;=Üßm‹%”u$�ÜF�Y#\ëŒùd$l¹�¼q‰¿9@­mM´Z¿­èRRÁŠÚ6i’~P޶²†8–£Ð°Ør�ÚÙ x¡ïƒ_߯“ K·ç}¦I[ΘT5¡Y¾3nÁé!ú˜éBE;ôši‹dæ�u!w»£œ¹‘[LŽ.÷�d-²3¹Â€`ÀR"4fF�F5qZô·t!·ß 8‹*_Ó�÷ZÂ#ñ™ÝéOÈX,.’DbPªn·O„·AMGîÄ:íµÂTh«\-˜*¦ŸÎ2[×oꪉ<îΫBsÔSôÔº™.´áŠQó¦zäÕåe²ü»ÑÉ)J[À* ·2íN7Ôçøs%]Î{·C!Î/äâpð_»T|ú_€FÀH¹˜zÃz“^˜Öu•èú-ŠÃYbs´sqô¤›ÏÅÑñnËôo4O¤ðÅà d,¬-çÙyÃ0½%ÔetÎn®1]ŒÊ²æ»ÿ-¶>Ì“FFjE:Fän”*øêyÛPHJ[qk@¨ £�ÒeÂJøÔÀµ”24¯F ï#q<`;r€€¬í­>À$¸©¸<àüš/åÉ%{J ã3?4€(Ràî7êëÔ¥õÜ¢;Zž�Ã3åäôðਜl¶"ŽrQ¤ÖDs>ÒÊ!C‹Ž›�÷62B^»À‹/µ„)UJa­R˜–;iX�Z1J]ªÚ õÖàÀè2†L;­“Èßôl9õ·<Þû ôú>§"Mµk#gdfUH¡@8“ºuÁ?'|ñ+beŒ�õwÝÛIEí„z‰ûõ/Ò˜Y¤¤Æ›Ç¨d>¿‹ÉªÕíqÏNQØ>9¤$í0`Ð }Í\^€äÜ™µhé+Ì!*.ˆ[/›)Åì« œÒSJK‘8l¨ò�aÏ© A9*• µLG2,šœ{ï>MÊa¬µ®/]Û:=Ï25ýôŽ÷îbÃa‹êõFOr뮘Ü-ca0äæ| GØ© Æ ÝJߢ)Êv‹ZåáE­¨®º¡¬ª]° ìã/Š´ý˜nˆJŒÆ=Ù¿NÎ Ó÷5µkÒ¯2ƒ†hn�Þd3è�‹{5V =ôLeØu®yºÓ²#Sž¯QKõº�HBäâÕŒÄnà[W‡ý\ºsq±´9DGÆQÛ½÷ òìÉðì®�(à ððÀ‡W¸¼Á~Âõ�íµ©µ²Ö´ŽªÃf)gƒ¡P^w&ÞmR¶»a{÷pÿ÷¶›NmUQ_{­C«À6Ç|¶׺57¬÷FnÀ×/䥗Üe–¶F«%~¥ívb°+ÂZe$†´qÝ{b%R¦…Šîžn0@ZÕ¢äüZ ˜ý䙋÷´ci`O³:@îŸ]þ­ÿü§§Êÿñïÿñ_ýì×&¾t�™'oÌjíÅöóàÙª<þIÓwI°b=ŸëYï#Ö††k2N~†0;s– õ5—ýMjz óº1®3¯†q5 piˆ·ãõÚeL‚M ´Bë…øJ±^8h§dE+JfÝS’H½¯Eò,:ŒK²|oi P]U´bÿ«CõBZ+�¦ª2ë{F`kŽ)›wµ‡vÄeAëx/!±7MåržŽ<î–¢Ór‘Úü�[ÇM^^âÉõAGÇQ3%ÉSc;} q¸††¤kÒý«©´ˆê�ÔÕ“.*Шeµï15L4cçÒ™xÝ_ÍŠ+–å7Ï©³.%…š‹×h1 À‡>!"0ÏZIÈ”»ïœš†u¯ EVÛQ¾q>ž»"P•/`eqd{hªMG•¶áaP+ÏNʇO†mÁ�à� ¼ñ7טŒ� R…""m¹¯>Q£²«Øí »Â²Áh$lÏúX¤©Ø”ñÀ— IDAT¬œïŸ;·ÃÐæID›NêlOC8\¨Úµb7ȽM!¯>ÁË/· 1Ì!mV3©RÙˆ¾ØË f —–ެD™7ü²P3Õ"{Š Ó5ÿâ´×·OA²•3°�ß}rüW~ì>ÿ•çþëÿð矽{¡X¬$˜_¤k5SJ³Ž>ac6lnwgz$èýÍ3>fü>Bj´NbQMú�)š:‰ú_µš^íläBÑsë 6+°»³¡œL}ÏWfýY Ýæ…µåó·é=�žUÙþ³ÍÕS M8éh-²#1œë¶Â· Ó¨�.4'¼Üu?ƒDýË*-{—?g}ï�Dæ_ÔiŽ‘2õ„WŒ°ñ¾ÐY„mІ�™ˆK=:`Ó±m?Øb°îùö££àâBn0¹óÝŒDñ9Ö2 ͘‘‚ébbSƒé,Ñ2ꎞ:LBï¸7^e»6‰YÓìûBö¡öRÊÒdÿY§�à 9IÌ¥3`Ä!LW\{U32ÀÌ_�k¹Ø,RÛ½¸[°F€d¡ì .ÓÅ•z.ô^­K¬E UG­-eÒÂ!»¿îlؼ½Ço¼Æ—߯õ lwd_ àJENNi=izKÝùj\T·F•°½0€B©mÝr¹;Üynÿü3õùÓݦ UbøDqÞB‡;¸;ÞAôŒFAØ ¸¿a�¼ôˆ/"hoΓIÚÛ4-¥Ûcª2UŠà0á0µ‹“)©–ŠÏ_­Í‚¨À‹YLÒÅ&@½ˆq#3‹¼¯puÉ:³ÃqËØ 4yáµwîü£_û#wŽ®ïŸ^F­â4'Á4mà�Øf-¡:‹ k)¾ •\D´ËÝÿ1›OÜ!�X{Ø^Ôüšxµ!/}2¡ÃPuX�ˆÔ«£D©Û‡L0O¢Î³˜Ò[T³ënÏ5à–Ÿ:Û™xlC¬áô|¯AЬô6ô šM X‚šÜ'!Cá8àíË •ñÍo†²+5�DÑœ0ˆÒjø5w‡ñÕ~éMÜLÉú#g@ôÕ? ÈJiå› Pô•ƒÒ°È¸¶jˆÝ€éwÏM¸¿ÿð�í�q“×ÜÒ7íO†.¡šZÏ&k¿Éñ€ûòÂÛxí+`¥ÆÕ´·áŠÅ�¢¸)Ó7{ÔI¤Ö¶ý¡:GÌ cœ© mÐ-Ø*þ³@j ê@uøÒkXï öϾøñÞ,ì긼ŸnvÊ2x„�°ñÐ0/ñÀlù¬çâ~ÌsEÞŒ¦ò3†˜±u´l>Ä+Ÿ¹øiùµë¸ÿN{²+>$ê…É(ûSbö‰ª µØ&Uh=Ò�BÃ�þª•Î Â[ú•5�ïC^ VÈO¦ºÎ‡QD¤ª›Ò$Ehÿ*ÆZ‰Ñ×F4îk€mËŽ�¤mR2ÞÈ/ì.³© =µµ�Ö±Eï\TSe¦áF’Œ¨#¡QSswXX TÞ½ÃÓ¡œOxù‘` §¾ììI{ý¤6¯m5½¶·X k²õQóøÜ¦}yÂÍÉál7Ý;ÞnË þ…ب™ã#f�Šññ,‘;6ÊÉ "xá-¼ý†E½�>�¡"Åó"UP'´Í-DªÔ*eUjµr »Ñ¦«®0HròŸ×x –ÏøèÒ5®½ w†Ý‚ÅÈ=�È׳Ï4q�ÎGÖ$Ú±¤únbpëu³š±·³i˜¾êŒ3˜Î µhyb|zUÈŒd×ÌÀWngVtäÈIâü„Ñ”R¢  ¤’$»4Xµ+rkÃaH@ÔˆLê0�_pð¬§þ5—őϷÝL+’üý³örÒh¦žæ¨Õ"u1ó –hµõvÜu³žÙèçÎéå5Uçmk”�?5»ËY2Ûº�Á·Búê9˜¹fip 6#¶»’ jwz!BÊf >¾8LµZªx…¿ºOæñòæÜsðb�c¸„ÄÍ&"ù@‘G¡šMâWk l ÐB©’Þ‰U®ýfŽÜÌOì¦ û"ͧñ2؃¨÷ ,Æ•BVHµ··2V"(i�!ÕãB ÛOöõfw<=Kàó»ž_ibÔJ{µ\iÃU<8.…x¸oÙfT¶­#CÀ¬m㢟 X‹„€Ð^ÊÚäHw&µÙµá q¼3�OÏlÇ£a#‚ Ýú˜áH®Mq¸¢´3‘¨Ö+EêÝm9°¯øòx÷­¦i¬ÂF¨Fg–°í±(˜¦¶T¹¢LäaP,Ð󦮄¡�§ÑôÓ8O\H̱#M®�E‰·Ç•ºqºŸ™’ÕåBàÕwïTáwþ‘ßýÒk÷Sl’8Øt»¿"r�Ë<²ÉHÝ„5ïS¢a[}ÐÍÐå$ƒ’ò‚¬¼ÒYÓä‘bº#°C3ÞŠÙÞGĦ¢ÅDå~EnVw•ÞêRéš–meØ3ÝŠyÙáZt?÷zɸ� 1÷A™)‹rZŠ-þz�á'9Q¹Gd–µ±îºÀYÑ._·A#·#+Úå“€ö!W—MDæŸ$Èi™ šjêoG@9ÆPJ{)tžÏ<´¯ CGÙßÈùMeñÅ>î0¸øÚ$Öáªø©L£¹U7‚¥CLi=m–�ºªÉ;´>öY¨Ì¬1^"ièý6QwŠ˜�;J {á©°VøÆ€ÖØîZI=0­�ª;Â}b}}-[ž[݉CÁPøîÕdmL–ÿŸ´7·-¹êÃ~«ö>ÃÞ½ïõë~ÝЀPËÄBè,d ,3Ç ‘HÂŒÆvc‰/dFÇìØ†|Ä€qp›!�Ç6È �¦e�%µ„Ô’úµzzOÝoºã9{×ʵ¦ª}nK8çë¾ïœ=T­ZµÖï·jUíÚêä(lRÂ%]bS’βÓxL{»´Ý¥UÆÉ=q&yÕyNòN@d*ý^¡MTVÁÓH w&j¹Ëb„õçÆ�Åx~Ñmõ ÖÝ�Ë �´SÈñGŸr0õ³Â¹ä³¢]ñþœ¶:øðÃ8¾%“©yÔÝ©±l˜B�×Ü!gâ##�e—²XƒÖII»UzMçt9F�núÏæsAvû¥åºi8°�Æ“b8·ÖcÃg#º4Å}è¡‹ÿèç¿ðoé;þý÷þ›ÛöŽôEÔ°[ 9Å’B°I9x|i–6"v9"‡º7Çç@¤Ál I›¼­ñ»ý�Äë¹>5N4Wýv¤Ž8+QÙŒ³ÞÇñ.ïE™ó…²Éæ�\lCŠšŒËß.nÚxÖ§¾1ÌkÁl£VÝËPZÕn1¿¬†Pœ@ŠwÅîñþ{/I\wšé("xíhÓõŸÔª˜ÃA%i ‰ -¦C/3*€%ò|§sP’ª’ÇlÆD89Áª¼ªL­ŸœYý°¥Š“ZrjåÑQ]¹+qàSL>×,ë: ª«ÜÓ®ó C×’4•h²ÎA©z«”6f‡KKt4S3Ö<ÕBâÒYýÊì@p•-ªðÕê™1ëàÆq!ž†äžW))‡2åHê gî;lÏ;VYöUH‰R'¤X.%Ý€Öœƒ”äb""Êe�TR—>N‰Q¶ Þ¢þâ¸Çê){t×öbÙϤѹ&™ÈQTZ`6/VO¡s%HcFGtaŽíŽn®ð'—qtäÄTÖ1À#3�RÈŒ< g cÎcfÊLCaVäã>z…ñ™c GÖ¨ ©ÂH£T®xG;R ¹VX·êä‚”]â(3;¬óM,õ‰>OºpëÕ/ëo¼ëîŸû­Ï¼~¸í§nR,ϙϼ·qæz�*ÓÔä1Cu·m�¦_i½™láJèˆÍÔ‹ÚHœ|–¶œ\ñdS=œ\ÂïÐAýõ"òfUs½6ð©&ªÔ1Oþ"¦ Ÿ¨Aõ�&�§…Qœ²Ä¤ÉÆ@‘}DÛdšêöêåò[Ít!åJê-˜uZ4îʃâ¬`Ó¨ð+8‡Ò}ÕûUÖtª.6¦ ± =0›ñ|Þ1J _‡$ëåñlŽ<âðD®ðɰÐ,Ä_B³(Ž2SÝÝúŒ„ðMLÊžù ½ݧ6 M›{2@S“v§NÚø4AS»=,§#u0%¹–QÖÇGžõF‹-ڭРÉÒè\®±2V+Q#”CbLK„¾Ãñ�Wƒ6SnµìNAf©^ÈÖ2¡„ËÝîvJD™1ukFbdÈ󬤅‰Ôe¤Ú�Ë \ÙJÞ‚�‰™»Ž¶©_¬·—Ø_tËnQúË&ºãŒ6`yèÀN·bÕ:éì³HØ›s\=Ì—&^•À„R™ftª“4ĉ3ƒGÊÌã ¡1� 5pÊXÑb»Ï¶Ô €L$8øÆ}D³2ˆ%�-‚˜¸níêš—[X¡É·ø›ª«ÛÏFwcàw=¶·}úš·<ÿƒ_ÊÔ.*hkü§í%$= [ë”/×A5…¨P‘±îÄsƒ}U7F6ý¸_" ›öäˆ?¢Lx•#A­Ir(\-ÎißãA ŸŸ;yS£ê+8Ÿ]‚bP8ä…&Kø?ZZ-¡z6k.dÒ¤å¬�zi«þÚbU$ëX¾³òŸveù^ÙI£¨ø |ÓõÜp†u¤Ý&¤J•(Þc€2×¥Šè{tV§t<Œ(¤`<ÃQæ( «#'­\Õj¾ªÓ7ÑÇê:Îh=ÞÏŶ¬ñõ5½S�ƒ€`¨hZ�SP=€4`Ö‰MxÌ'"~T›Žw ¼fÕ|Q«ôñkµ!¶êõ ��Å (xŸÙ½t…dšbM §y��Y" gd`µæÅœÜF’P‹“¾£VEIÄew'0óîTÙ<Š8%,x¾\ï.øÜ|6'ÒE²þ> ø>£ÞFëhIvC]ÖžBi̼Óaw†MfÓD–б–댘úމpë$˹,�)ƒÊl¢.qò6’Œœ%TfæL;»Â’«Ló#aÑw̉Æ,‹p.;ÿë~Èà®Qb" ƒðn2˜Ò˜Àó¼è×»K:7›Í’>¤$âdèª-é;oYè)»WÚSÞm{sl'ŒL| �_e*£K¦œ@Ò�‘93±¼(gsÔ2Ò@C¶Rߥ½s·ŸçÞ5g½Æ&o‰ 7Î�5pl'&õ©²Q¨ùYƒë´ƒr¤AR4…Æs ³n’±±üªQñ\hj”¬¹ÄÁt:´Uÿ®ËM'Miè¶ «ãú sR µMÛMɆä�2Z*š6\!6^Z]²Y}þHF­fÞtO͵Å¡ª]¬6Ë v³ñ†ëLšu·TaJ@R?ÎUçjï+i¤¬@N:ü…5!2Ü)ž•Þ´¢#PÕbcd{3� iª Øt«-šZ`ȶˆu@Jó<ŸÍttQ¢hÖÙãBÕL ¾çœùhUf[Yû¢2QJÖà)Ií‰pzDð‡GóÚ/f…Ô'fÆáše#|#«ÚªI¸’•éf¶ûÎÀiÈØ�ãæ!ïnÓ º‚9�2��8‚À)!�ÒŒ:¤DŒžˆ12�kbJë�9ÎÍ»­~!ï=ÎЪê¡ìdáŽ0…í]�‹êÁÀèïϰ ޏï!>>€,´bBfÝÄ:�S¦‹˜F1ŽLÄL8ƒÖÀÀ8ízÐîÅ‹ûyoÞ÷TâÞeÜÚ0*2DPqÍA«‡#-™‹·ß)’°êÁó‡qHÒ8SÝ#BÕܧüYÏ~àt=»y´ŒçíË|± P�3 `ú>y¥Ùuê˜Â]V‚¡c¶Fæ™âêÅT#ùšn≭op3V=å=Ô >èD[SaÓÆ“‚Ã!OkldÜIÉatnG¦ÃY• „“K6Ó¸ú¡ò\¸¦žˆc&é_™£•Î5õOŽh·¡“<¸F57]ÀØzÒAý nûÍÛg”ÄÚûScÓ^¦øR�˜óv¢´@×ÛÞ,›¼•‹IV—t=ºë�pbÙ¨Hh`ò‡'d¶>JÒÜàõ&œŽå‚VUE憮¹fBÓsÒÚÓJÄkíQ"½•õ¨U\;™Ó"ªï“– W#ÉÀ‹t´TZ!©e¬l^��©X[|-ij¡£“!çQmSm§K”KÌQv�Ð&Ûtk.ÏÄ2cL;»©+›@8yIGkZ¯y9ÇL–ÚæÌLŒ<Bdu =¥¾C"ŒL§9�4ö³|Û¢Ûég³D�GÐHsøœ ~Ùl´Re { �bwÒm6Ê(3–ögèˆ?á=„á„ôQ1–œe¨˜9ƒÇ2nNãÈ9s&ŒLˆ†L+¢u?g,ï¸p~¼mk6‚úѬ‘�- jÔµâsd=êÐOl�(M?C„éx·ÝÊæÄž*«®ìÔE˜àzøáÖÌØß9þ7ßú‹÷ŽþÉk?ÿÑ»µ¡[çYÒ�êº ƒÚ+´!|"ËW…4à6Í�xÙ´¦œÁuµ·z²Ü³2ë7í”ÆÓQ UŸ"1둘 –Ƶùa»u—ô9–3>q-Ð4-¼‘YÃ8õ¬Ò7ê>&Ö« &uTq|ÔF“·°GîØµà özXlç9_ `Z·;* .´*BLcO[2UNUzÅ>ámú�dõR[¸øyß3V§¼3É“Š&«EËjÊåªõ1qxî3x:Oõ?É…“ìv l²DsÝÂF©IAdž+l+ÍH—H×Õ˜UɰVŒÑåàš%wš•ç@)�™˜s¢*X45%JºÃçœ~+®×ܲÚ(%î®�”çè�ÄÜèI›N2¼Ûbê¶æ©Så3°$:ó¥ÝôøòÀ}ÇHàŽyÌ<9sÎDèº.u=§Ì9)å­EÚ�w³4K²ªÉM9‰ÌœÑn�^)…ÛéZIVžGªÖð3ÎͰÝ1!=p>¢½v:#_¦_t97ʦÁœ38�L¥ÏF¤uÆš°JsÐòö�=ܾ3¥îárf4¨NCB¼²ÒyòÊô݆6?.k<ôR K++“GýipL˜tpB'µAàÆÑÖ×ÿàW�.J¬Ãº¢h;Ú_iÕøRº–HYе«’UÀF~ÊTÔ0lãz ž¼ gcÃÃ)U›œÕñ@—?M».³{”×hzЍçTV{¿þš¤ôå,Ë“‚›&Ê自v£ªZsªû­×Ÿp¶µ$4Ñ!Om²XAÞÔ¿FQÞŠ 3ôö>"TÌ_È.: IuO­W�KK:ÖóV`öYàºçu–ÊîŒ� md†¾ø£´ ýl\ÌgºòT[.þMŒNèg”3Ÿ²¼Ì›êV‘Oq]C ^¥IßH¶¹èIÆlP~qåI§³ æJÝ!½g¤¾��3eêDdå°¾D³åîS˜)ki‡‘çI¨™ë`L([@è„>«å˜¿D$ý­ä"|è‰4”®$ðÉŠ%ò‰Q©MþÒÑ¢zBY: "dÚÞJóD€=î "luéxäs ŒHœÑ'Îã0FÎD<ö}7KyIC7κqgF˾›w³ž(›—(+Ѝc›ze5ãÒ>7n5ž¸b–À™Ñ'ìͱHt2àCWqýFÙaŸÊ3ƒ’L¯ònƒÌà�† 5 ´Ö ¡›3mݾآKçQ3'¢^S°1Ш§šãSi§VÒF:¨åÄU­íô8EÙ·¢fC— ºÓ&TT0qz±©ƒã…ëœMÿ^F $cC5]h_ιsh¿ÚººzóÝÄ#kÇ&mmÔ¢Z¯MÁÚ÷júÆ¡NP«I%8N6g¨*ª�¹ù¹YZŽwû÷�À"Ý©=°ñSÇ!'¯j7‹j+9cPû <¹Añ_ëÍhZÕµ!ŒÐÝ��Dª9Oúª”Ää‘@¸´…ePu†ÀÁ+œ>ÐÔbuÛU®{S7¡0™ûK¢n‘RfíáBõµ‚©ã<ÒÉ8µ•‘!£æbã Ѹâ¼;Bëãÿmؘ­€Al#| v ÉÜO«°Â&¦Ê™¬ÓŠ6 /–ªÙòJñŠ!5Llê‡öL8ÊÀÈH£7™…du>±#ƒØR ëУ}Ò8/0±:OêÀÀÉ� &¡#¶ÉLs/�¬à y&…Ñ!í.ô¸NÆ–Ú·{2�y]Þ)¾èæs¦í.Ï:$Êó®›÷³™ÆFFŒ¥.†îdZvˆ qŒ Hjaµº.uŠÏ ­žÏõH Ç�ùC�àôÄHF'¯ {d×%3q.£Õ2’ePf@#°NAc¿¤nûB7Kw�O}ê²>s܃r!gK ç˜çäÊ`Œ¹¼þ´Œ›úmøΣ[„u¨T'ªªeè=t4‡Þ3à  ŒE�Ä«üS>› ÆÇÀUÞ²‰cÌæ¼C¨>Ф[´Ö;Š5êump+;µÿ¹ãœõ‰¡FñÚ¢wb&ÖW[Ph¸h™–©!¬ûÄÖè�U¸ºî*žÙÐ#TgxA*ˆÀóDý< ¸†Æ—.ÐÍð¸Ÿ3¯V<2ÈV›“¨#’<çà™i}š¬wÈÛ+YÍÚbƒG�7i(%âÚ2â½ÖÓ,«Z`��vŠ;M9ëI!ë2$;ƒšn‰¶z ¦Q² Fäå9ªpš"0JS{-ÙËòé`�uA�ô‰x9sYH[ˆJ—“”Ä«îœÓÖ‚:À7Tò¥‘eS¹¦z s¦+--»(ªfØFZZ é rÃÔYÊ¿4‡¢ P×ò¼ ¾m�­„£5î}(]¾‚<‚™²Pål[4rfÎŒ1cdpffŒL4€FNkмÖ)�ý²Ÿm�ã~ëŽýqÑw£®Ï)”ßËPWh`éCXº[ôט�﹉0 "KQn#61îX‹^¸.#Ч\ÎÕEÙ©˜"Wr)”Iˆ&’(ô¸3…=šýa2…éðxYPžcy”h)  .æLÊò$^·Ÿ~KȃԔ報‡vx¸×„àp…ìðš•%òvj©uJQ&I‹$5‚7?Ñžâª\^ NQ+Š4´Á£Ý ô>I®Rl48Þ(¯'yã�ª+Vq`Y⊠ŒðØÉVxØ—” Šyz¥ZÀlú‹ò‡ú\·ðÅ!\‰ãÞ;‘0›å¾ŸxZ ¼ IDAT±OßzX3ˆÐ÷àŒã5[ùIƒOO7* SÀ Âé¡î‘¥KWÌ4·> —Ô~šÀŽ$z–Í1ÂL Mn-7jÓëQ“ö¤N…ªß ¥ø¦þ öNJ~´Ê¥qDß)³À¢=Ê™©A‹5W�éØ¿€¬ÕŠå–Ì+׌™9%Ýæ¿ÖJ5uFÂ8Z|À‰±5#o‚æÃfàI¹½|ÑÅ} 6ÏnŠZÕäÕžÃò%Á³Úh¸¤…ed "pïΰL`Ð#·pÿ£¥ÐrE&s@]óžÊó6™õ1VfPF ƒFæ´NÝ0ÛZôÛËÌË‹{ã¹å|Ȭ›#‹S¶¤†Kó�^ÄÑš“v|2$D{©S©�ô ð�u(l,},L?a¼½xóhÆOSëÜÖÓ›ª�ÔØä\£LE'ÖV-‚ÍÞ茦ˆ°á‹‚‰ÕTs=WSh-_ ´0“96WùX :käŽMŽ!‘ir夕©wSl½éJe!wï­ôQŸ 2w¤sjš,÷YÐ% /áìÏYf'¥¿ìýÍ<Õ¹‘hÅ\Øeº›´ÿJ#6TÏgŠA¦7O;qÀK¢´”„.Cz¦±²Ô%¬r.#/ ƒ#7²VÒÚ cur1EŽEñË'àçm»L€$2o(©ZÏfÿjìm/Zy,"[b,²¬rR[¡(ŽˆKÂ1#�l<µX]•Äœ¥;BzµDÿ6+ZÐMHÆ"¶Ž0RÂz,èïd¬ò1¨�Ê£5–æ)ͺ˜úÖV—·Ì2ˆ«å°‰¡¼€–•”ÜëJú¹U%·�š&KѳæNJ€bÝ'x‘dÀz¼ÆûæûÂ0p6¢R×ìÈ™ræœ1–UÁ¢ÍA™i`¬ˆV©çÙör¶³5æí çòù嬬`*zOª’>®ÂÒ.�ƒ§²¹ÍY{ÍÐà*[²Ù¿%¦© 71Oá~„ˆL-dIUwmøXÉkí†3"‚¦„1€JgÖ¡U�þîœí=õ�1¬¡ƒ¦ØjÇ#?Û'€Ä”±ô=>–gðôöHÀâT�ÅEê5¹uSêm®š"x Ñé^XÛÇ&i(ÍY{ʘȵº¥ø¹ü \4© þLY*¡kTÝ¥mÚ "�jõD-5â›XZK=úØT.¼ÑÁiÒ(?ZY&¦…›rö|œÖÌ` ë˜À!g¯Iæüt“Çxe\»^!�ɦpM" ÜDU$åöïÕ·© ‚ßš7K •§QØË 1 ½'-ò|zÃ&Fdl¤/׎ ëÓ<Ÿk‡Û;.”à g¨ƒÏ6ñ )9kz²‡Ôj†Ì¶3·žÔÅÙS(ÅösFY¼RÌw>£Î.›Ï–œŒ?ÈǯhÞý\jP³I¾Z-˜ªÂ”9&4koϼ–làdÆ,ѹ9ÏqÆ#·è�+|:èy[%%1(3� ȼ23™‘‰2fy× Íh¶5›o/Ǽ<¿»¾°½È‚\Ú¨�zx ÆjL•1hg6üúÓ®]ÓK}aHÐmÔ‘pžv�Ì>UÕUv „fà¹:ËzŽr¬lþˆVËê+Â2¨ªé¬Šk’T*Ù”YC.½–"–HÈÚ?ÅüЉ*›v”X–>T ¢Øüb U ¬5 §�æ`ÁÖ‚Ú5UÖÎoÞpp"[)°=kÈFYå.¨¼–žÝ�í8ÅCÝŽ W„Ž¨Þšª†¨R¨ù©s PÓ‹ÓÏæiÖ^–b(ÄÅ3,÷ƳFy\ßCÍý[3êIx§ Tµ­«|I˜ùt­îƵ,Ó~±%ʶ²™p4)S®‘I`LL~ÃÇ´[{½)"†#á2�²RªÇ±ê°'f¼Ï@• ÈXËx˜­ ÁE³Ó4§NIª[—K,ޥ̙,a¯ gËÀ8( ä†Q§Ã )[ïhšHž£"ÊëB FÊ´˜Ù¸¶Tä©g�Ù™…Êò0åÊG-€67Ý©{IóE‹XV žJš†(ÃÞÝ[=øè”î¿‚Çoé cíF¶gÕ,wÃ"g0˜$,ü dÆ*�ÜôýÖl¾5‡å¹íáâ¹…‚‹†>Á†úÙnê13=,®’© ÜR'VF°9sSI”C•¤EkÛYK*:%câ0Y«¥…øv½Ú”‚?˜Çœ=Æ®ˆiS†©!+»¼9�%ÞÀÓƒíGu#Ñ+o:;•%œ­Œ¸)!�Eh§öôKÄŽŠjå N8[î 4ŸÑØ Š¢iUlÚÌ…ÖtVõuÝ--*æÈt”´6ä5(´ UQ:™TwÒÔüJÛZBÃéñN7�8]rlÔaY¤Â{³I•¸¦bI•’‚¤æN‘ÚÔúŽS§Ë8µ���—!òˆ‘@"”D{Eí)H£ZÎXŸºO³�Sc6ǯÝl�ÑÆ_ͰÑ?Aë^§Üj5éb£ Ÿ WÏ +K<·<�«’튢½SÆ#gNÉ ÅÃâc²>×m¾`''’·9Q*d Õ§<ÜÒZu j#eãõ¢rC‚˜f´HV-êÃ0gm©ee«@6ˆq¯÷%+òÁKЮ2@‰yÞñn�¼éáÇñÈ5¬Fiiå>{DöSV4¡S)ƒG ƒÐH”»å¬[ôó­ù8Ìv–ÃÅݹõ2³,/°P6‘(s;lxCÞ%¡/ ÔÎ0¶6WxIõÍîñ·íÿÄ·üRÎé^÷âÿò¾§…¶i"ò«Ñ~UCÍ>‚Tˆ#˯6~Ø2ÿÕÁæ»wsƒbSCn>gðatFbå·Pp¤Éž!\Ùð®øç¤¨€OÅÁŸ ÁÕñr sËmfWgh€�µýEpÉ�ˆÓi*ÛXØÜÛº‚§O¸ÛÅA8-7/‰hî¡Iètü¤[Œ¶æédH«1“]–Èu°²T·>�ž°Öu;P-EÊWÒAÈO>g�$5*mœZ m¸•ªšä/ú“é(¨ØMëLá-*ÍÀH4®¹[�e0©òBõ'·x°á+}dO2*~&ë 2’î ÎËã¦ò#$2Ä8 ãPµ.1õ:õNAUZ`ÑŒf5Ä&ýi9ÖOˆ™e{ãBFUr8®U4�Ç•±ÄÌËŽ·{Ì #ãêAzà>’šDqÌ Ä™½#™•üX‘ SyðfF¦1%î–³~9Ÿ-:ç;óõ¥½ùþ2òlH$Å’t'BÒæH£©1—Ö$ìˆ>òŸáxCr3Ëë8®l½êG^ö'Þþ=_÷Æ‹{‡¡2j@$°LårP΀O$y]®Á•„MkX±§j ÔB>ÎG¤‰-äV+¯ˆZ˜häúl>S¯�Ò*BûhrACÀuô^}Ñk› «ÀË:EÖú—/«b—¥‰‘'¥µ�Õµ°›«†sóSØHÖD ‰Rk�†ö M¾9âl…z´}7�’µÆØi¯UróqQ'm¼ìѡ҃æ„ʳ ZŽHEÒ2[]SW\Õí£“ã¿ "Z)•U«‚ƒ*ªç¤‡ ô=ÎoõQ™OµnK„å$áôH1É-4h)ºw”Ó·6V]*_BË*Voóø¦e¿ËCÏ2”R«¨úÖ½i ¼ñ«(¥ „ÕI±ZÒ°•H$Ëd¨¬*Á01™Êšky‘Ž­OA™/)x*M €U²À¥‡,ë *Ñ8 „DTÖ CÌ› HeÙ|JC [•ͤØèP^BPxÈž�I˜¤YZ,ö‰x%I  ÑŽ0?Çþœ:àÆ)Þw?þä~>Äúeß|ždG‡[È;m´«È¦Ê ¦Œ²upÊiNýÎ|¶½˜-{æ[ýêŽýy‰+Rk@Å\‘™g‰Re”†DÓŒƒAi èà¥ú�¢˜ÓNÈ#=|íÜëçSw·N/ìcb¦,Ðǵ-žM|frÂIdæÅ–EáiS ¨E•*Ù7΂-´_fTÂK[Ñ|œü.ªo�"S[�+˾p}lÚ6 —…ëÙW冰Æî‹í 7 ·Á‘7ª¨¡den…rBœôv4Œúbh_F[j�Jg£ä”ý4/‰š\±é¡HØ9,™�ް¯ìP'º7Ç,V›^ÖŒ_C+LwS°™)"rAÂ¥¡mÓ.š^M`Ñq7WSè³q¿‡GÌ«ŒˆÐ÷t~«W÷Æ kœ e®Q½»ŒÔ<)â)R®\Xª·¥¿›5z^ز¶­\• Ðhàh#Õð\K£>i¥ß4Ñ*Û$`Ô=G yÉJá.@ˆS:] U}2ôYØìh#ëß‹hn«wYÇ…,uØUŠM„¤Ébf9?³ZyŸfþ3¨°ík˜ËPºî�DBE3‘z`\,+ç5—H…lg„½9ŸŸó2ÑÁ)ß÷ ½÷>úØF]¥U¸³þOS,òZ9H-`d‘2(ƒ2S¦”Ó¼›-g³ål¶èÇÓ~«[ݱ¿Ð—ä0kÄ'› $ÂÞBön��£�µo0)bG°pWwsõäšG! ÎAÇ—äv£'´˜¦Ôp·¯Ä�îðLOí!I�ªz=Õ”íwo„¾Pl+Ô¤©××p±�núÅ#�û¼Š «eP/§ZŠpœáÓ/S©ËæŽjó±µOZZr„¬b |ªŸ’Éâ•©s „ø0´åc8ö¥Ï†Áuß7{�ˆ¶’¥™1Gé|A€:IèS«ƒŒtš§6Jûju¹«P¼Ö®Ø4øù˜F¶yíÈ8W­Sò*9lV2ðT_B¿ó9§®×|­ÈVÀŸìýíú0êzE]J<ŸÑ¹±¿µͬÂZàô�8,óço¿«Üá¨P)¬¸˜†M¤ÜèfÕ6Ô�NÍòÞÓ…÷ ú]j¤E]È)ЗJ�iѪ¯“7z aÍ`ÆzàùÌ×%»†­Íº!¦††6á!ÈŽø^#?VePPkŒIÙŠa8;1˜3�íeÆR,+a Ï‹k³¬GÕ°HA›ÙûŠHÂ$½5•M�—@u–°Ýó< £?ú1¾òV©Ì‰!³IX3ÌV‚U2'FDœ™2�SBšõÝ"õ³®ŸwãqÚ]¬ïØ_H˜)¥8r·™‚œ±;Ç‚Ðk½fjRf–5†è6 ‰÷h}†+ÑŽ œZl®ü›(ž¶ÛyÓ÷xð¬�Ÿ @Uü á³à{›Jiñ†&WNo¤ú8«¡®´ò š5™ajt[-¢Álʯˆ''}>•Ì»>(czŸCpÉ £Qd1Ï'Ó‹g;…îlÀG†æÎ¬Åéj%l”I¨�ǦöE¼ú¿E¶hÅ]FŽà$çœUù·g~¦2è?¶º'¬”Ù0;ëz%Í"”y2Ø ÍÁò&�¨O›èQq⨋.u}³«ƒYs ‰À]ŸÖ«|r@‹¤Û‹4d>Gòhе¥œÓ#ýÊÞK*�ppÛ±Ñn¡½ÎÄ&Á×óRö¬m/§Y3SÐáM8gÌ:9¼³Qk5ŒñsêýkP:áÅeâŽuó¶¨)v]ÍPaý/K•È LÈÔ¡›wݼëf]×¥á8í-×wì-`óÄÞë%ñ.«Æ2ÓrÆ»3Z�HšÊK±þ:_d]Ê*KÐpðÎ#È-Õ…Þ^qÉG®íæLáÏ~¤O£×^]ú�C+ lÖäŒÎiU4òê=lG«º¦BM’nðÌÕô.® kN(G@ð“k5làìú 7KÛYÉV5"N^N‹Ñj¹©­¾£EùÚX�ĪùLKŹHuI– TXpˆÓ@ͳԶm�Sw�’.›Xz'ƒÂFMz¥.Z2Sr�¨=Z¯Zø»Ëͺ>‡tî´1ð ³ÑöKóÝÙeÜ6’!áÑrÒäGcárnIÄ3Ò]–âYo|`}žÍiøø&òˆ”°»èf)¼óS HXy1¬,.’K¢PÁk[V²†Wmo¬56�9<ÓQ�Sª}†,Y � ´¯Oƒ°wsÄì³Ö×… OøD ÇyѪˆY‰ž*¹Õ/о¡Ó›«Jz–8£³·Ùé ¯BsÇ€áåß>Ÿ—”j‰wKŽUBaý«~ÊŸ²Ó'ëöÚe.Ë·¥Ð�EÔ"ZfaËe�ósìϹ'œàÃâÞ÷ÑC�óIBîP¶×‡ñp ‰¬àSŒT&Ffd¦,³”�L‰Ó¼ë—³~Ñwó.uÝxD{ËÕ{³ÌeP,�-ÎÒ DÄLao0_~ÝÓî|9Àc>¹Õ�Å Óàj“5h,g†dTdIŒBìa™u]äµ[Û—¯žÿޝ|ËË^ôž×ÿîsŽOf›ªÛ MÄúP¸0€aêi‘ššÕ†ßPÎøÙÒØ&•møLŽ ­XÚ%ˆÆaYO-'…A=ƒ=úÞ ûF©ëƒT_ 5¸|Ÿh É؆™u®�üJáD3J5K‹Í×"ô¬=œøF%•¿>oŒuŠÀLÚ~3V‘õ¯¼¿*¢ÊZÖ–$×­� Â)öž¥`kAì~ÌÇMÐçÙö l¬Î‡‰a¿£Å9êg&2ƪ&ªm(.¿»žræá”úuõD«1C4A&ÑÉ!VÇòjt€y+Dû‚Ìàß*вr(êÚO„q0UMºÃ:½11! ‚Yz×Ê r›˜bÆ.¨›sêÔvÂÚï¶%'¾UÚì]] e�v [�­»œq0 Ú|uÀ”|u.3NVj²¦böçv(%RŽAJ%Yª“˜jøÁþƒnH/С¶Ú ²‰æmϰÛcÑ�×ñÑñчéú Ö=rIF볉YÖ.:–¬%á%ÉT Ù:m8uè}·HÝ¢K}—º>ñ…�ñ޽|µl{RÐ¹ìŒ ÝŠþüÍy �?ˆžÀ² ¢»$ɤªˆ¬dU[k¯ 0µ9Ñð=$˜õs×m·^ýŠ·þÆ»žý³oüŒK+W®’êbèÇj”Ñ=ZääêK7_*yB~§AœÆ»êŸÌ›®ùD>^KÑZ8貇'çîØ$iè•`l›ë>ë``Xˆ �ɇ&÷ùªà«ó À4[½Á ²|º(C ‰+-ć ŒÍêxÎTêæÁ­Äf¨ºj>¡Q’µÎÇ�dïF®õœ5ȯ$C$2�·Úh�v>:š ™»Z&hZU•L¾z¬.V¢‡`Ì:îz\ifj§)Dçös6ǰâãlíb>K縿yºV²"”w¤NO(V©ÙfW~ù×ÀVV�b�žš¸sÈâ²¾rƒåwsdR�T¶­†·Ñ¢¿J~B÷ÛV•{Ƕ© ‰ê+?×ñ¹ýàdãy¿7t7ŠìŽá^}y5,•,ÉХòUaû²:‹< `´M.ëìʪo^ãó·u¤[£ìÿV:ëd12�ÊKR“®üFÒ9Ë,à^ÐíÏ;,:îqÆj¤ë7øÊžÐЃ;d¨j�EÕºQ,)IÙ§ä^ enW—u1qæÄ©KiF]ߥžRO ]>oßËçwæcHE�5N\M¾gðî‹Ä7ŽèÑ˹#J yKmˆk£¥rIÒ?V™&1õjëßÀ¦ìwˆ–"Ÿy×ã{;«×¼éù|èöqL±üOyÒÇÞòƒÿç÷|Ý“¯XÑŠ£7|‚0¨âPÄÔWÊ |¶¹üø™¸é¶‰Ä»,Z7Ò8x"5yí¯!þĤ9ã£÷ÆÙ(6³ÛÇFÊ™Vî§Ù©h2å@»óþ„ÞZ"ÑßËòšº—Q—IAøjá‰êµ^´R•#]S…A ìЦ3æºú§EŽÏÚÑÚwÌÊá5xVV4¶1oó¥­Õ�ß®Ûé€DèSN}ÉŠÚŸv¡¬¾d–MvL|ÐÏS">9à<òbF[³ŽPÆ ÒÀaÀzU9žÍ©XDÄ#“«ÔM³*n’-ÙrŽñ›5 !ãUl¬PL«lËä7Zªl¸¨–¬*™å(ãTŒ‡/4ÅÆ!'²§˜e˜l —Ò®�k9é(P¹kö(�H„ú,fi(r„‰�ˆ†‘M‘Ö‹õ­[tt0ƒ ÉA×I”E¾dMֵɿ¼ÅšÊ=a§çýöçØî‘×nò}÷ã=÷ò‡À�‘Ö³, ’tBwůã‘ÿô;w_½q®Bê´&+1M¬º´a¡æe°Š¾ öA±„³?kp5GMˆM?kà[ÍÓD!•,ÄT"UEúÔÊ4jS¤òŒ«EöÓOo"&3”‘M7•æž¡pЏRâ“Ö´eùÚ“ÒÄZ"¥ø1”ZØ)7–kìsrqLBB:ÞC7ÃrÆ:^’ÃjC E`”hžj8ª”©rÎü8Ä¢þÆBlßë¾)¤ë,’>_¡·�7ôIo ÀåÝ'Ú;ÕXIᡟŸÜ—»i{ÞœL`Æê8æ,Þx”Qû,ò·¾¨1—ÂæN5⌠£*° m±=gÊt8—•³�hÙòMÕéšÄ7BJ1¤[Û q䮞J²) ß_8,«“ôd�$ m1…5M`̉ŽâS¬türOvûP©C æ4­Çóýú¸;y˜w–ØÞÇri›Û•ë$ÃÉ”@ å­l #†5ŸœÐ­›¸yÀG§X3ÆÄ òˆ(K¤¶‰;¥9æÝ6_$-Éâ‡dÎYNË–”˜¥>Q—ºžˆ@]¢D|Ä[XÝuǬëR|3›Ó”™k0-¢ìoažèc×ù±�¢ëб�«ømá !rÏ$­lSWJºÏ(:#XÓþÎñ¿ý{¯»¸wôO^óyW®Ÿk [ý+äe.ÀÇ•xMœT2®­nˆ‡oÁeMìRr¢å@½¡|¿ì ;c»ñ°ï:�D¾@òGkuœ%Ñ"Íø!ž|§öšfº/€Ïd)\]™Ç7Í)VË #Q…Ý>̰Úè‘k1+$ ±N.;Ý5ÓÀ�ñÇáµMëz«dtg[­*“RÛBЍ`ˆwS¿MÁ¹EtDÃÅЛqzPOá¨'PO¦G Z®õÚ|õ¢pmf€º´¤“^ìÐö¬;ÆÕ ã@ì}bê4š^ãK¢c­«^ÉEU³ß.'ÙhåFö+ ®[Æk6:äFÀÔ¤�ë ¢ IDATú’NOˆ�Uî[µvŠêgd¬@é(oïu¨¦<\Oí4j$3lÕZÌã0�GÌ;Òíh¡Æ+Åa=´)èX #(Ñé0_®ft<ÐâqÞºŽå‚ îèz”%ŒD”ÁÈÈ#ò€!ÓÑšžÒéÀ«Ì¹Xe2¹¡ƒ·Ð³Óž,4i§RàK[i-Kz)!uõe¨šR"tH |ÀûóõíçJ:€@ùTP]êÍŒÝ%ñÃâ.!v{_«mê­Ô|o`4: –K¤©Õ`™nÆpóhëëÿùWžÌÛýñkyÎ�jãå¾™ˆ†u5hµ&å踼 æ,î×r(¿.²ú¤Ž ÐÊCfnc{¢x“Ó®5ÃÊúɃ8>­Wxœ�ÓºoúèÖ‘H…œòo%HÐPÀÁªlܯ.;Ô/´gbwõÃJ�²¥:Ò.5Y¦´¥ÒæˆMî¶ÇÐdyëŠ vZå`IS§²K6÷MoŠä8¹Üs¤ØI*þÀ]¢Î±ܬ¬BV‹ªÖl°H\ê �KâÅ’Nó|;-z>¸™å û’Å q†…ÔÞäç*ø Õ;O´Z—Æš‘.„Ò`„ÏôVékÂÚ•& ‚VàJ3èãPɦ¾fï@:Lè‰w5T ›ñF"÷öY{ œY*&BÙôOgA-œáŒ.ñ i”ªï-\˜m-ÿôk 0÷´x¾êx•p‹+¤cÌ€TëaÈ#�‰G€Ë B } µìÓþžä–”�Κjw“Œ’5…Á–<,#O€Kú—:¢.¥JDåÉ£1ñáêÒöv`}VÆÞQa¦¥ºH 2óö»3œ®ùò‡€Ásåñ'Û¡É4ÆÑ §ã2³Áˆ†3M—¥�Ùݬáïœqp¼Ð2¢•¹Ñ‡¤÷c!ttºi$Dzчap"g…ªòca¦mB_ 3M_•É’[ŸH+]âÀ“ßCæÌÿruÙ”ê8çO'R}'·Ú/Í÷þ4÷V�5 "…ó¦^oe sfÖã�S=Xf]è ˜.®a�Œ˜Ø¦Fô¤�ˆI`>.L±!ƒ ¦ŸQ©°‰e|¾ö¬v›ñMÔã�Õ/:™w”Ê"_ñd5èØN/ÚǯMG¢ÅVZó|™x0Ñ£Õ6‹T&üªaWW”~'o€EúÃÂ.MêÅ™oC³ˆEÔÏ<‰á*¢6æŸ'C°±�N3€pœ±:9·w:Ÿµv°Í‡=U%R”1‹1 A–}ýK9e`DJ˜�FS•B.)ÂyÆ"v˜Ø[ÊÝ0Çl�u(Ï<&Œ2±pÉÞKlƒkQP~Ô�"©îô³pÐ]¥`j‹€¬ì*…̳ð<%JåU)ÉÓ¼]J>B?œ^ºØm-ú¢-£ö oˆ,%YÎpnAcæûïÃú�)~—«Èw�І6Sr›Ü”§ÉFó€zµ»ŒÊÅ0mI7· Á8ÖcÝô S”«ql¥E‹�¨pîE ©‡Ž‹¶Þ„f‹Sþ9ù�YèCßPËhŠ©W‡nø…•¬À‰R´Á銶Y)í×�úSþ+Ù¸º�ê~©Ø&jN2RÄ0»NÁ“ô)öZZÖZ5V ЪcMJWÂ4m§Vx7ãp¿3£JdNS€•†ZÛ=Åä­!�q6bV?£Í; è»,3ªT [Q›d>µi;tÝS7èh=ó-ZŸàÒ~·³] ÄÖ�(`ÕàqžÈ¶Ü‡2,õ½NC`/MûÙ :k y‹9–U5ÁJæÉý‹¬”B]FÂAÇÃM„@œQmj­¹ÒI2Ô+q'Ý>B†m£Y•"c‘:"Ñ©lëdþÀæujH cV02a>[Ï{¥B() f�æÉõCò>™äíJ(ÏÿÉw�¼CIN%P"P’ˈ˜• T„¿¹”^H�R—º>u³²/D—Q—R—é`½Í«§\šoÍ{³” §ƒ3™Á3Ì;ì-À̽ŒÓ›º%–t©|-ï×õ¼»¶�7}/ŸÄ“R}Oû‰p^ôÁ¨G嵂ªáʽmа©\­ŸæfÜj»61WÁNÀܨ¥ö½ÂÖ ÕUžh¿Q¼8ȶŸ'˜�ÁƢ͓ã¨9TU%ºµÑ ŠÄÒˆ7ž8Cš fÿÿûœU7)8R2 ˆ<”sC׬¾`ýX×§rm|0jæM D`=«Õ¦s›:²F6Ò3š@Œ½Â�2Ôø¹ƒøÔ*®M7v‘·Z¯rÑAòfoK½R Å‹É%„#e¶6K¢ÌO¾½»°ç376YxfƒÀ†õ�¡¢È�ú*¿1ôZ«ÖP�RAR¸‹Lý µ�H°DkH$…Ò˜)*Þ:Cv˜‰™VGœª!O)“dQx+´3DrP@0X§ˆG,é°ßºYú,Û@6¤Q2¤CŒû3žéözäÁŒìdéj¦”8� —é•+¥n=B©*ÚÑŸ¹¬H*+¤(‘3+•2ˆ©Cê(ÍRšQ7K©kŸ¨Oó4.x5Þʶð¤Ûç=‘L$ÔNgX.d¤Šì{K$£�àæÕ’“`€Ñë‹+ ªgirÞ.3dqºåÚÚ¤{¡“¬©1³ü Ãf”¡*+Øø‰65H­Gá1DŠŸ€¤ìm"¿:TSÍØ…ÕO†¢dß /Z¥ú޾øzÚº³›,�¦yx!ÏIm¿Lr8BM;]ˆ³™}ƒPíEgÅ!<9ã ¡ê-»ˆŒÃEÖê05ÆÑŠ (!Ø@N·äv"ßYÁÃí²šCâÏ�›Oc«±Zàº;²‡Æ•>7)Ö²ƒšÕ�Š\»†E æI—™*ÈŒ�©ÖŠb¡_f¢ÔlvÀ ÂlAë_:Ÿf=_}UfU ÈåK—òœ†ñ”ù”žt¡ÛZôºùI±eI2[bP�Áƒ"œßF—põcøØƒdig|' ë+eI)»QâЩ­*ÿVÎ EçP²ÑJÈ^Ò§ý'YûXAòV™°½ŠÔD‚*Û<ÓgÙxó%´ù°!šýÓNÌ9›HÙÿnðRU!ipOg“èFº � ÿPÕk¤¸X_1\;'vÿSøÓ|¦YgÐSä¦'>Ø!mo´°r³'ÐŒ}=«f³3¢y�Õ’³ìTïSyèÑéΆPnÒvï{7y¶¿Qzý^±ªaÙ‡jA®3û‰ÛSŽõ±æ†YãÁÒT€1ïˆ;±S²&#"µÕ1© Ê,)åéVEÊÙ<°¿…'_ ¯xÝ@£n³¥¯UoS¾4•ë_OÑrhuDƒª9šS•®ôù]ïÏñâéˆDÆÑ% ÞMA´C(�g²éYͤӗšbÉʬ §&5žŒ2”)¤B�#¶So¹RýR¢&>2×ÈpÄ4lÏÐE#ÙN‰‘€ÄÔ¡$xÑ!%J„De*ãWê�:P‡T®Oò�%›–Ÿ Äåd´ "¦ŽS‡®ì_Ø¥Ô•»�ú®ïh«[Ïxµ¾…-NO¹}¾œw9ûZbU&i£-_NF›œßFŸèñkôȇÃì½¹%ùx²gˆƒú,ºi-µù˜¥D åpuaü*è æqBB,3/" ‹>´­Æg\š¥ Äã}ãgEÏMÔ`¨= %™d�'V×(õÆ•|Rc˜)A`rQíËì ¦+2ðÆ�V“•C°Ô…à¨d¤¥ªOÄÈå¬ljT[Qi¤†-ãTŠ7ó©ÜœzÌ(ÑŠŸñäôÑGùä4ÊúÄžQÃV¥9%E}„&º~ÑSË•ÍÊ_ âÜŠPle̾.ѳE*qé ê4ê™0/ ð!èÒÑ­q{¯£ÐÂT­Ja”Í#ÔI}º$U‹WXᶈ�8cý�¼*–*»�àQµG Ë€–&dÆ�átw±œ¼K®Ã¦üd©³yJ™‡åŽÅC -B>Û)Ê+#Ó0%s—³å-v}Â" À8Œ4ÞJ»3\¼½O]Êlcý¤"XW˜#i{;¼èpp„�Þg K7´à…_©{Ú¥ÿŽAy<ºÕ”�VL^5Þän<Žé 2‹·ÜM€Y2[˲„Úp!VfÔ³¤š�ÞmûÌ»|Ý?ø¹ÓuÿÇ~R-ù0_cV{pú%è¡£ãuuMdÏáÕ_ñæo~Ù~ýï>g=ôz‘^¡IÔR¬Í@ãØ b{2©ö4öÐFá ¢zôϩ–óõ«¾ìÿÇ7ü‡ïþê7ý�/üÝÇní¾÷ò¥r곞ýàëþþÏž®gô‘'UÐõñ>l@ú‰Ñ0LTÕ¿i�6THÛ‹á§¿õµÏ}Æ#o}÷'s[ÆY…o>µá¨ô�ê�Ý@-á ×5_ü>™AR@ÓÀ‡ªŽ‰*5�FUúÎøÎ“Xg~$3t®OË]t3YÕY•¦åâÖæq¶˜·VE¤Fï ñá”Ðu”׸°ŸVV«r¥f*m…’jXRñˆºµÅïÈÔe‰ÆÂ@V¾Ëа¼Ü\'Ü dË­Uìøš�úW˜Å“�“°f$Ëùu‡å1϶)uòòަ0#,t&Ä,×ÄÔ!U E DÄ™zÂŒºò¨hðd…ÕÀˆ5 ±tE¹ˆxÅØé©CZ 2ƒ"+•’¬Œ£RE§³ rD@G’4NºŽIÔbcÉGêDetKòèj""¤”Ê*§”ºYG[ݺÃzd^¦Ù îÜïöwgå]5f1DUœA ðÞ6–=áò0®PxwœqI`†‰-°³Oüµ1µé3½ŒÝrµ-�ˆð]_óæ_øî×ܱøsßñÚïù«¿U“)CˆëÖI“’’2 �Fö‹mx^|ôèdvÿ£¿¹=3ømlá;¿êM¯ùΟ¿cÿðg¿ãµÿë×½±B% ê©„ `×W½ù5ßõówìþì·k�EP€åµ‚�p³»Aè,¡aµ¦ÝHe¦ È¤½øP‰mW/ ­´ØÁ=©ò¢O½ÿüâwþø¯¿ðs¿íÿÊ?þ«oü½O¶Ú‹æom5#2ŒëóŠ-g ²žèó ²q7JULnµ~×W¾éµßñ_Ú?ü¹oû…ïýÚ7:>[!¢o]9«½åã†IéÖÝ6 罪¥‰)UTø5\�²š¦0Z ,´@„Tð¸SçÙuákVèG虓 oDlŸY i˜ñ×|‹xà'_¤‹”($SâM^°w“¡tíÏì—úD’Y:4.sʪ5)ŃêÑ:L7ϰjÖ­³aÉ�a£¯VýÕ!9D`œ0¯gÝÑ Ùê—˜ÀÊ‘¬‹…Y–‘) ²Ê¯16 XTél€ç;e¡Ð„’®Ú2Aã‹5_¯·¼ì‘ÊãZø,)(uHåo�T²Á •įæ�I6J”)|#i²•JRZ¡XI'¤D‹žvûõÇCÎÃqâk¸8£§Þ1_,ú\`Ó…Ð,‹2Ôà´6黽m,{óýàáÔ0+z –Å2†ãH=S3å Ó[aÛ2 aX8Ån[•E.‘QvÈŸT¦na¿k·¶n/O·Žæ×¹ZYg Ø2ŸBŸ›VýP¼La™J;î½|ékÿ·¯‰2×M ÙO5¤ë·¶N‡§‹[Gó‡KvéêO�a¢‰ŠøèúÁÖÁñòàd~ëhqã`aZäTÿ¤p_T¸þ[صŽ[�Çñ‹ù„„ 6ZÕä´Nž•<¦9Š·Uë/2ø¤Ùá‹»G·Ž—¿ñ®»¾æ›Y–Zî}àÒWÿ³¯™f2Íçý¯­Ômsx:ìã}60²SCßz¦ZKÏõ�Õ¸�×¶n�,NG‹ëK¥�&oÌAãAËop�  ø•Ò1§£æE,:Ý¥*i¶êµÑ©ÿ"Ì:ÄQÔõ Oˆ»A ,wôÎ|ĸ®`Aò J0_Òz•/îÐrN_ͺ·-1²Û�)ŽatɈT_ý —Z±²°Ä Pß0Ë Ýd açfñ*‚õjM¶zõÎfŸÚœšrÔž+zœøÒqZ�‹íž³ ,ò—"ZCe„ºólÎÄj(K�rÚ¦Ùa·Ò.殫÷¶a×§ÝG[7ÝÊëÝ­ù0Ò:ƒ“>ýC¬cqæzz)8•õµÅ´Ì¦‚Ø†á Œ&M[-ztX ãpÊ„U¢cì-hÿŽy×gpI¤»Ø÷’þÕI÷#ÑÏþnZÎp|Ä—?€ñT»[çfÌϊ팙‡ fŒÌ}e,!Œàñê8QµõËôãØɼ Šæ!3¯ÝÚºu´8]§‡ËkÛEÌÚ‡ÿîËÿóc7¶_ôÜûÿÝo?·KãK_xï~ïÙßýS_rx2{ú¥kßòŠ·¿è¿ùÈm{ÇW®íüÒÛž÷¯þã �Nfïn�¾êËßñ•/þ£­ùðæ?üä÷|ä®Ïyî‡ÿÖ¿xùáñüÕ_ñÖW½ô}—s¦ï{ÍçÿÄë_ îE?ÿY½ò¥ïxÁsØY®?ôÈm?øKñ ¿÷ì[×¶o-VëtãhË^jøéyúgó׿÷g¾øõ¿{··Û»Æ˜¢€e𵃭›GóÕÐÝ8Z>~°e(|~çøïþ÷¿ýå/|ïÎrõö÷<óñ[[VSŸÆ¯ù¼?úk_ô;ϸtýètö÷=ùû~þ >ðÐEv–§¯zé=_ùÿpk>¼ù�¬É¯88^„¤Ž:¡v <ÿ“|åKÞñ‚ç\–&¿îÅoøýgØZ íóßõÕéŸrûÍ�>¶ÿš7=ÿgë3NÖýÎbýãÿó/¿óýŸô´;¯½èSï?·uúŽ÷=ýýüç_¾zþŽýÃû¦_½ûÉÛÛYu4¾ó_ü€‡ß{ù÷ýC�íÿ½—¿åU/¹G4ÿ _ðÿéjYØÝ:}ÕKîù*þݹësŸûá¿ùï8<^¨¬®Jczžÿ̇^ù’{>Û„ÿåÿæï?ÀÓ/]ûÖ—½ýEŸúáÛöޝ\ßùÅ·ú¿ú�/<^Í`w½ôžÏ¾[îú�_~ñoþþÝE˜y?~û+ÞüUŸû‡[‹õ›þèYßÿ ŸÿÐã{º.Ùg½ÿþÛwÞý”+7¯ûíçýدýù›G‹â–×¶o-¬+£ ~5*a‚ìU ™‘‰ÙxŽ-ž8¢A£!˜¸–¦k¤Ò)Û<ð„«Å "ù„ÓŠ*D@"�áİE®>¹ð±V +kX7QiŽFÚ#k^™˜¨ŸSx›ñŒ§¤‡‘j¯ ÃI¤=éi‡ãêR™µºÄ´èA‹s‹2ªöƒk�‰B�UŒ¨*-@�Ú @3¸cGhdÜš®åÅÂV•¾WZ5Ü­ìÈ9Êà Ø@Z„ëÀ§¼`¨;M#ÔwšÓ(OÍ�€:X$ðÍqØšu;‹îæ rÖU eU0€zE¹G;…ŸRÙS j¤¡!JŒ1ˆ;¢� Ãz&¬z:æ½9í]ìûž˜SYÆil]‚°ˆ«(”Â)0öwxÙóñ.ÿ Ö'ÇAfö_Î3Æ fFz¶fµªƒšhºq)ÅĬë`ÌÜ-Ä–õçò•ý�å*3Ý{ùÒ‡½`0p÷S®þÓ·Þ¯ý—?óÏ¿áõ¿øÖOûë?ðW~ðoýús>éêï}à)‡'³{Þûôÿµ\½¾óÜg<ú½_ÿÆëËŸü�ÏJ„W}ù;^úÂ÷}ûÿõ¥ï¹ÿÎ/øôû¾í+ßò�oƒÿûë^üC¿ò9ϼëú¿þæ_Ñ~ü3ŸtõG¿éÿ¹÷ò�ç‡_öØ­�»Ÿzõþ+Œó._ÙßYÞ™™î½ÿŽ�·øîÿô%ïüžŸû¢oÿ©/½ýÜÑ�}Ó¯¾úåo{õO|ÙÇní¼òG_ÖwüÒÜû?|ñïüí~ùÕ;CŌøåÿЯ~î3ï¼ö¯¿ù—£::âozÉ=/ýì{¿ý'¿ìÝ÷ßõŸþÁoÂoÒŸ(ø9O¹ò/_õ«ï½|×7þÈË;ØyÎS¯~äÊ…röèd~ϽOÿñ_ÁÕ»Ï}Æ#ßûuo¸~kùSoøsˆwýèË»µóœ§^½ÿÊ‹ÿòg¾ÿµo{Þ—ß_Ú×ÿéßxý·¾ìmßùoÿò0¦Wüùw¿úåoýáÿ9¿õ‡ŸòÔ‹7þá×ÿær¶þþ×~á0ÀýWö·—wf¦÷^¾ô‘+·©©Es°|#NMK²::GVÜ�õ1‡®èÓØ�lep�H¬‰c�•]o°$ˆmÌS�œj-ARF‹-Êev´AÂ$©ÒtüQÄèú”¯NøOî>z%‡%N•¶–b™­ò«þÂ¥_¤g¨Q³ÊU%6x�×ûm#Vt°qBÃcåÞ:�\ãI(ýX¢;¸>ì^œÁ4Oq' Hd ©˜Ò;Úeårm!Íi8ÉÛÜóœ;& O�Xd.=.«05f g~l½º¸X,‡t<&NÊ—ò&w²€Éu.6’$+Àºˆ£a€€Ybâ5x\g„U¢CÚ�óù ³Ù<å\fEõ›ˆŽý ‚ÎH_È~~óžŽ�q¿0«I)ª3ý1cÌÈcQ1­c_L&o ™jà �ÄÑÛë7 .Ûz5pϽO¿çÞ§øé7|†]ÍÀ�£íw¾ï“RÊWol¿ñ]ϾÿÑ Ç«þÂî1€«7v^û–çyË?ëmïùà§=ó‘D|ÇÞá—|æ~æ7?ãÿýƒOð oý´ç=ëáO¾ëqh<’swý`9Œ AŒDøÒ¼ÿd5û?ý%�<¾ àO>zQCœ"áÓŠ„?óÆÏˆ´ç#€·½ûŸó-¯¬›ú‹¿ÿeogÉQ܉#«ê½î×ÝÓs�ftŸÜ: 7ⲌwYclÀøÚ]ûã�Yïo—Ÿÿ¼€lðb¯¹} 6·Ä!@H „®‘FHšK3Ó×ôùŽÊøý‘‘‘U¯.DÏ{õ²2#ãúFDfU7Üuæ w�ÉÀ‡®¹T�ûîÙ•g>áÀ‡¯½ì‹7? ÀG¿zÉå�ýñÔä Ž™ÛrðÄ,�î9¼#hù®-+W]vχ¿rÙ5ßS¾ðÂs‡)ÛñV'ÆÏÒ]ëƒê>|Õ‘ù"ܦLسuõE?s×ÿùò“?ó£|þæGíÛµôKÏüþ'¾vÑÒjÀ÷ï;õ 7?Ú×îØâôu?8ç9—è/¬öŽ/MXXéÖÞ;9}daFU�€‘w «“£‘³¢ß¹eõªËîùð5—]äõÍ /<çð¹‰ø1G0Ï<ù®õAõyîÑ…i÷Ú©úuìäÔß_wahüõžûÍÝ{áÙG�3^ðä»Ç]©÷´•õΡ¹­Ÿûîcžþ¸Ou‡~ñŠ[?ñõ‹?þ�‹™qtaæƒ_|òÛ¯þÖ_q9äµ×ßuæõw�ð‡®}¢õcŠ©ya™¡n>` I–ÔBb5Ø1J<¡­ôÊùVë ,m“¬eByá#"õáÉïЂ£ÎBiÓ×®ýù? IDATÙ�çh9Èļ' IÚ?Áöfë5�ž®û3öÇüâ²^bæ—;¹ E;LÛY‚КÃ(%éƒÇkT#b0–;ÅÒH «û6R é*¾%I.S0D*úÛîÂÔ .—ݰWWŽ õSûÌNIf�ó—ð‰[‚¢‘t (»4Úàéºsrr@ŽœCí“XsD�»?µÀqåÀ�ýü°?Ó™®aäÏñnœ@AxÎC:äÓâ•Ü6‘ËÑìícÇ#‚÷µÁÀ¹Už*iëöªªa‘‘ÓEz—¡šP(]Æ€ƒ(-µ…ym™B§Äê*¼›GC™¾nQ |öq§LíQ×ð &ÔL5hTÈsíà2»Îô7•| iq–¿&%„­Š<ò1ÎmÄK7Åòz§71Ü”Kk]Ïä=9b€wÌ®ýÊ ¾óÜËöïš]Ð팾xóvm[íuûï Jæ}±ÿÐγOY|L椄†ÍΟsÊÜ�#ÛO,M8KfŒËhü¯jÍi‰?ܪ}ï֭ܲFw>¸+(æÆ°¼÷ÈŽ Ï9oÿ¾�\{Ù»Þø¹×Ø÷ák/½îg�|Æ®­«SÝÁþÃ;COuíöÚ¦lœ¯ºsc( >wïÜýGvœXêEº(>¾b×ìêD5¼ãÁ]�îx`÷Dw¸gÛÊâjÀƒÇg£x+bP¸pwƒ¶Ú%£Z&†Ÿvo[™êäàk·ÿЮs‚¼rÖ%Î2¨ðçž2ÿ‘'–&sËc;fÖÞü‚Ÿ{É=»f×t;Ã/Þò(Îñ¹§ÌW™.UÑï>´ku£€™W'ŠÂ…ß:µqÚöÅ_{Ñ ¿ò‚ï†fŽüÚ Ú2µqx~‹ô£J•‘Ý K ¯tc‹ø&- 6½JþYIÝ& Ö�·‚ßt#P4ƒè#Æ�8L( Ù]Âr�~î^Ñ6 7îޒȲ@³�‰Ðõ}FÜB!Eîhh�I7ìû][hr‚ŽžðY�›¡ˆÙ„¤¶œ`܈!-–d»ÌVõíwº0«Ð p'®ÞFš6‰C¶)hrŸ5;³š’�ð@ ¬NŽÕÛN#r$S‘gºÉ»XE�MIPK­Êôãl DTN¢^ç-«ÕÉÉ!u¸*©î‡G,ÅýlâÍÄð"æ¡33÷¹ö´Þ«ºõÐ1y_° ›ßƒž7-ëÚ!#ýjB©ð2Ö\¾ŽQ¨ïŠ5L—ز­ª:Ç=¼‘½ä\Rˆ‡¤ä3Yš¼­2ÌÃ9Þ2…ªÀòI¼ÃAÐ^cògì™ÌuDYÏ‚¼§ÚѨô)¤³sA𔑹� Z]¶×Q³—nÛž%f€ÚSxn†÷ÅÈzIUÖðꯞ¾gé­yõìò¾øƒ×\³{ë g×rf�\TÚl¡¢eºÍ?“ß#D©Ð¶·|jâ öäíñXLÜ{²{u‡£BÉÔÅ_|ö©ÿð� ÿÝ3nû¯ýÒǶþÖ^td~Ö‘†wQ•FòvÌFZC¤VÌ@º•MÖ¼"çÙ†¶†/Jû¨.{¾ÌlTQL#F¶Éý©¶„ØÔšP­ò2wMy™á«®JÿŽW_{úîÅ·¼ÿ¥w<¸Û³{Ç«¢n0³™M¦‰¡óÁ¨h(o ½f÷Gÿxå5·ž§'kO!MoYЉ—Œj¤ÔáÛ&f]rÚó7¦Es\�,¸M¿|¥ÆwXa$S~!Ü‚™Vi•n?1k”$¤À$ÉÎB²V’13kÒ FÕ¥zÄSŒ3Nq‡�ûáh“`FýeÒFÉ• /Øi\¹(&‘2rKýÆ6B7)g³Kp†Ó†[Ù ÁÊ¡ˆþJ€¸xñ…r{g\¯ŽYï20Y'�ûÙ=¹„gá/ËJ¼è�Æ9Gï Ž™ÃSþY‘›Ã «+'Aë¼e¥ZïùN1ì§�3ÞŠËh¸|-ÖpŸ!ê“´>é øÂ�\MΛ×(ð¸‰)¨A¸˜4Üdfö5³g_C‹_ιš±FUŸ¶LÐÌŽ²¬ ïu¥B ãß[§ÅDÏ^Ò缎ã£/eÏUE3S(�\àƒ÷¢öRëföY!þë={FØÁÄTƒjPÍ®&RÉŽ=·,YkølDgìÇÞL`MÖî³Rl:ÔVcÁl<Âméõsæ±üÚ~x`O]»N9:mçRh|iz½_�ê DäŸuʼ£”/fñ²h‹÷îÁc[ÏØµ¸uj]ˆ±þ±í FV›Rž{*‹<ÒkF͉ũþ°<û”… ý•�}ÊœÙnBŽ-MÿùgŸöê?úÅSwœ¼âÂŽ/M¯oTçï› �:‡³NYp”³—R,œƒ÷ŃǶ�±kqëô†­8¶0µ>¨{ÆÃ:•Çœq|0,^˜ÎæÓø,¬²¡¬Ÿ]aÐòøÒÌúFuþ¾áG|f�WNRã`ï8¶õÌ /)¨†c¦·ñ˜Ó�ýÃ7.úáý§xï:…?uçVôª K 5ä”ó˽#ó3gîž?¼°å¡[:±õ¡³‡ç· k‡1·æ µš±JÞDYß”»'Å$Óy»7÷SY—YEQÐÉð×Q|,*dk±A¥• …$0é‘x.�Ò¬×JtK2[ƒ^ZŠ&¨(]Õ¥pÖÞb*mõ³“o�Ö\›°:FØ& Š‚w“ô)dÒ �´3”ù·GÌh”»æIÉÑp2EAz9‘5ü0_Â÷imq$^JS4ø@š…Te‡lv[Fu’ªn1IUE½e·gØ�ˆ³ Q§!„ì(<ψÿÉ3ÿdAa­­—}�õ ¿ÑãáÕpxø—CϨ=³¯ëápÔ 7ÖFƒõz4ð< ëˆÈ�\¹àzóÅ)%�¾»Ú¾­SÎ×aD˜UPÑVW_ÀìÜrªcÊþ²8§‰.ÍN£ š;ÎÞÃ#ÏÁÂÌà½q˜"b¶ZÇg× Ï1ÕŒ‘+QtK×p€ý¡­“¬1ŸB­Ä¹UnæC®’B[éÓ ß�ýº1¨æ–zW\rßÙ{Ïܳøö—}û©�}(´<¶4uÍ­ç½öªï=û’{wÍ®¼ôiw¼äiwÚþˆ°eª_<ÕMTñ †Ìü¥›µcfíÿþ«—žèÜ}sÏxÂý—�ÈL¿}¤É_qÑ}׿÷/Ÿ}ÉþV“œ…QÕIÃ%“ÍÀ±¥©¯Ývî|ÎÍÏxü�Ý[W^}Å­OyôCÊ�ËÎ?xõSî8k÷ž­+—ž°×Î-÷|l©wímç¿öª[žuñþ]³«/}êí/yê Bžyá}7¼ç}Ͻô]Î`Æ—n~ÔŽ™Õw¼æšKÏ?tÞ¾Ï|Â�ËÎ?ðñ“Óÿrãã^wÕM/¸ìîݳ+Ͻtÿ믺ùs7=æèÂL>�ZJ)O8 Õoä°¥×/K?Õv«Q¸üøRïšÛÎísnyöÅûwÏ®¼ìi·_ýÔ; øwÅ…÷Ýðî÷=÷Òýq„øk/=÷Ðyûæžñ„—�ˆƒnœœ¼ò¢{Ï9eáÌ] ¿qõ7Ÿö˜‡T_ºåÑqÊç>oïÜ3ߥçJr’�“hL³´ÖýØ×/}éSôöûܽ'ÎÜ5Õ%ûé™ß¯ŠÚ(FÕ”|œ¿÷Ä7ßõWø‹_q®­ä›Ùz½¬»ÕXqÜÕmSRdiüÌV@æÅAH…śŕ)^�·¼²g-Jé-KmÒ‚,³I+×mhKñ t'§s¨&ˆj>u§Û¹ÍŽ„,10v·ùœõ›DË YPƒØªAR„R¸€(güSqS:Yé(îZInqƒOÂ\Ä*–hI,(=�€å.m,¹áºWÙAy§X^V3ØúViHžb.×A5E“Œs¨»—:äaJ}`šjºK_•Tf0/×õâÆÆÉÕÕÕµåÁê ¯¯úµÕÑúêpmu¸¶Ú_]¬­ 6Ö766†Ã¡÷5àÂ'ˆÅJÑ�sÛWÜéÓîÔ½�™™Ž#ç}Æyë ±!Ûè 1„†�šm3{LN`¦;„Ã÷±÷a/R�yO-Àì=¼§Q Ïì1rÍ%gì^à½ûÓO]îkz×/aËäà–ýû¾|óçì�ÐëŽÞûkŸ}Î¥÷Táw^ù�ßzùuç¶¾þO^y÷Á·Øû¶¿ºúׯþöÇþó?…?47ûîO>ûOŦGªe±MŽ“LÕ™7M[¯«½{ϧž^³{ï¯þK¯;üÚmçüÍ—ž|ùcï]UÅèõÏ»éܽó“ÝáCÇf?ð¹§|í¶óäk÷ÞO_^×x×?¿erp˽û¾|Kœrº3‚¸(|ãÖô[ì}Ûû¯þõ—|ûcÿéï‹Âœ›}ϧž~ËþÓ¼Çû?ÿäÕ�Îoÿü7Nß¹tdnæ£_½øï¾üĺ&”iúfin*5+ÏÉîð½oþìU—Þ9ÿŠoüÖË®;8·õõïþù»íüÓO_îkzךħ²p ž _o»ïÛÞÿÒ_É·”øwêé SW7ª?þçgüÁk¾ú•wþïù•ÉO|ýâ�\{Éé»Â¥·8E®úDœò§ö{÷žºy È>yýã—V'Þô¼ï¼éyß!âÛö‰¯_ìᬮ#W}Å×3v/í˜]¿åÞÓ}ö:G2Ͳ±Â¯6¢VdåÔL7Þt_LéíXM|5¦&q9)E½Š‰.>m/ÿ·mÝ{ñ¼–ÞĶ:™–…ÖÑÇ’pÆ^f9”“Îü¶ILtŠ£'üÈ#_Â͸§¨Qq5’“ ÌÍQƒß¬�P—$[:~Ïʆ¬Ú ø™}³vþ»0q²„Dn‰k5ÜmÖ<Ò˜X¦{4Ôï<�Ë*ó˜�Ù’qÛĚ̠¬-yj±0_ú EÅ�vn[¹X@=‡Ñ0<Œ^U‚C¹t¬‚™ðƒ$L"xÀ{ŒàQ§‚­Fá9† p9†ÛpU“5ÍLÒÄŽª¨Ès|8ëÎeÑ'¥� T‰º%}KÓ5éõ¸7�z„Ã?ÆÂqŸB)5fi0Ç]Á‚¼#�÷4bòp5µ«Šr¢ª&KzÊcþP÷G G&�Å×!3TÆòÇr™2oºH¹ä˜ß9ûÚìùßx4/ó ¿óÌ‹¼ñ=¯XY -«hØQèMÝŸ9³™_nµG™�m€Zi FÕzÛQ±™û›_ð�g^tßßûÊÕõ.£í|­GÓ’�®‰…9fØúÎ;u‰vföšæ¼²U†GbSÎ�7?ÿÆg^tßÞûÊ•�nÆˇœg�¿‰ƒfc ¢�xÒHþXB7{ÞD^úsŽdçÝæqn[›’™UîeWN@t :k Ê]EÊ™‚Ûc«ZÊ7çX…Ðs‹ç9a†Yv—¨w“VÉ¥�¸`äðð¼_]¤^û.™3fãÍFv54Á*È,ØƒÔ >ëi“óvTùÃÌäÐ KØa2Óe>Õa}Õï:½pŽd“RG®=ºU(‘/rKUlv&ãÙ�Ø÷1ôXòõB1Ú [S�ÍúqSÃ9k™Ê÷²–KÏ`é@eßUë4éÑ› ‰ž«&Âf%I8IÕÕÆ@€©£ÚeU›åYÂ)¶pަ§¹SaЧƒ÷úå¥Ô�ŇˆÏ“gfFíÁ`�÷ðL5à™Fp#ç|Ñ-ªnÕéUe§(�Þ…’… Pm÷¥XÆËg[ †Ø•!+Ócµ�M-ý'¬¶�ƒ^Î"»ìײðç�6·¸:Ñ”Øü¾±ÄMJÙ6ã4{ ¥�Éå-»ø²ºpªªZM°ÙJšÕ�ÑÊŸwê‰Å•É~¿zlW9jÄE4‰*R+™>«S'“†³dýËYƒô¬™Ì¦31@(�?ï´‹+“ýA91Ô±*Ÿ�Üv˜Vu5Ÿ�׎y‹!_#rY0²,o{p§ô�?óènyÔñ“c‘ùÕl‚¬fEÖY"dž@ÖO“¶Ôƾ)NN!˜6‹—Íäy/ïmàTˆjP CD¾MÁø y߈>h)ÞÍCË�dDI(Q: Ïû¶»Å5>±nâãdl’0Lj±ÁVÅ5«Üɤ}ËF­äÅ››î£u$ Œûs­öE£ËV"¡œ©@ 7¿½W̪wì+ËãnN6´¢+�CJ"±..G(:ÎU\ ÑéۇņÇÉb¸L~©êi|Â&"bE\öEt¼DÞG7DwPtFè°ëM¢»ÍÁ…ç+øÔ}dQLb<*ã$~½M$É@¼w'Æpe‰éi. ¬¯à�{|Cú`•}\ )~ŸR°²yPͨ‰Fä¸èe·¬&Ê¢r®teƦ°ß™bwãŸ/ˆÜqsºwø'ð6™RÃMÖ_ãwSrI´uŠúuϽùàÜÖ[ïÛ;ªÝóŸxÏ•ß÷Î�_ÑÚ~bRž¦pœ`ô[ãè†Ãjã ßAÙ§¤Êf„Ó¥$«Ù9k¬ñ²m ¥SÔ¯»ê¦0åºvÏ{âÝW^|ß;?q¥î¯Üդìú&êÒ_Íeèf‚m�:ê¯xkýj€Îº¿ª¬_ÿœ›Îm½õÀ¾QížÙÝW^tß;?ñ¬@˜·ÓÐΔ×ôÔ–Œ¨ZBïÜ÷Rƒµér^ñÔëp‡ÝüÑáö½%…{“Ã,¥¬­î¦1§f·Ñc Öx’cÐí²  e劚«zÕÎ÷¹Úp¼AõzáðuÈôÈÊBûNÃ"<½Ÿ©¹ªvÕ•§.¡[Q5AE×¹J“PÄì™ä‘�i¡‹Òrt¤‚àˆ|ÚPF¢cì“]ô¦˜ˆOàà™�躚òs+|ðänÝ­9–…kì**;U5Q•+ŠÂ“/-I1e¶÷Ñm =eXf\žØ©½Ý,üÓ* qþ¡«Æµ�qIc Ñ5ÜÚ |Ë‹¯?gïBYøû�n{÷?ÿìg®ŒôÄf’Ê4c´‘á•cEß°˜dðU|SÓl=9]ž^D5ÞÙ™à†LÈ–.$9Nëƒò-/ºþœ½óeáï?ºýÝŸü¹ÏÞðX�ZW¿bekGÍ£�äµÍF buŒe¡ä5 ÜÆ«=Óú jÿ™£Â*›!ŒÆ¡ÃD°9(igÍÏYÖmãzJý�+cn Y›c5›Í8è݆¥\ŸE ,µ@N™tÆ�k¾�5pAž¨¹Ñ™Á²\¼“1r�HCïÚ8šÍQr?¶mLA8{Ã�UÎ(2BÙe˜OßíŽ-ú•5yK [‘û["Ûl0�¬ÉPfJ;2\Ì÷JŒr1ìCA´]hQùÅTæß²òwt0‰¡cY¦œà´¹åráH½moáäVWöfš,óˆª}`à¯ìGK~‡ró�ˆá@T*=ukž¢8?¤ºæšy œ=à‰=PpÈMAP±+GTU(Kr³ä ¢ €ÜMãÃðá¶(èªN ebaW‚ˆ¬ü×Êu†Á�zûx43S˜è³{ø~ø0‡„–}¾*e˜1ÕRã o¨Faí•iÔ®à¢rÕDYNTeåʲðŽ×yHOyÌß~c0÷pïÒ§dq�ÅÞ2pÈÔÑž¤L&Æÿþ¤£Qg¶m¢Ym¨N¿ ÕÖèõÌ&ž/M­ŸÚ_ˆ›±(äôŒea$!ùúGèZÈ¥ÜbäC&4U•æH›±AâÁGnÕ¢+!hî,R'B‰®;DPl×H xL|–HKð˜]Üà^3‹í±U£¬ƒM— ›¼ïú~¡ðÓÐy2AÂ#w�qFù�Í|ÌXÔ+j –ÄVtö¬+wºP‹¿i.fLBâ¶…Û’òí0ÍÎ *·�.vöõ„ÅuœXÐgý�9¹°-ôl#T¾�ºÎ�tn¶0É›UÛ˜íÅmU{$�jеG¼»‡þxä·ï+]™ª—L–ÓtòÅoä²U� X`*Æ��µpØ^ë™=PäÞ�PÅ%*À@x«9ÈÞ“MeŸ™®|G:$ثمÉû¤>#JGT†g”%¦¦Pu¨¿Î‡ïÃÂ+�fžˆåksJêúT­IÛ3Æ"aäØ>Æœo†x›Dãzdƒõ�|´¼½¸Á)5XÊbÇ«øCzÖœq• §#3[‰‘½.é+�‘’D IQXOH}J6¥]|M£E"TTyk“{Üѹº?l"_4€B¬.Æ eªyì@„¬„—ÍF­ H¡aDUá3ĉ© rŠ,q ³ÁU�­Èl_2°ÊXÞÀô,Knîàhû>Wt�±Ï`º›�ôŽU$Zͤc^(-c¥�ÁLñ�œDÈ8¥� c¸0lmé=nòPødÄÿEÖ«S$Ò{M•a‚X|ü$êä=Oöh²€OÎñÁûx}CäfXÞ4!ÉjpNÞÜCVÀ»’Šª('вS¥seÁ„ /›“µ½Q¯@ܪ�)É®ô?Q‡®+Šå†”i7´jÓC×8qSj×m¦€q^”¨Û‚‚w0”ë1Î*ƒYu ÖS¼"Ã7è&õXz–íóws—¿ùÁZ•Â#!+Z,14ç±IÆ„;Â[ .Õ˜Ú7JQ4°à/Sè,šÆ±1ÔSswÏ#„K Ú,Qi–3EWE~ú#ÃiyCzmÒôZµ#ujµoôa®ˆ!¯|øIGrÿ*]ÌRVôô̾ž®¹sÐ"k~F›fB*²¦fMߎô(B¶|.%0椂á•*'©K8cw¹m†@ÑG"ªQ¦ÿdWO„€2Á�´é�H¥Ki1Anéš©Ž·5NbÖ† ƒRë3&–|mÃÐÂõ�-(&Üü!®ùt¹êwf5qÄ„¿ˆ¹&$œfÙA6 Éœ‰È4Éè€Ü&Í"oÒ|�Á_GªDA*ê Ä[„¹Q•³ªBÔp�¹Øtfö‰Ü=;Ç[f©7�zÄGàÀ�YÁ6LÅñ¼GX— «,²†ç�€\íJ.ª²ì–U§*;eQ:rX§¾ÓîN”Á¼.ÑJMca+Üøÿ,F3_Sô§Ž6_b0=·G”#™¦Æ ­üÕ"‡tOc{3�5þ�u‡ìov}:“T?ÎÙ8TÊ/I…ÎtœEŽ`Ë+c•ºøMÜfŠ6›HëDY“Qý„«Õƒ'á[ä‡ÝÃ×5_7¤ˆ©˜h)¨Yaˬc!?v¥µ„�‹Fö«rF9R”;ƒÁ“=ÌlEYñÚ"üGsžYè£ÅxÏÈOň•`w-!FŒ0±+Pvªj¢¬&Ê¢S…ƒ£5ø€¨žpÒéfZ«ò¹�rû‹½Ffé_q¦‰ Næ®[x&æªÈÓHµÈƆ+ !c؆ÒIêÁJB¡a\uQ�8Å×adu4¹àchÇbðÊtjšÜ0ˆã 3ÿ'³l�Ãè©9eœwÈ™„Íñ2pÞFÊ ÆÝ€ÈÞá£þ+/)kl¨ˆ€M%šª�Œ¸'wi’Ac|óW©hp¢Z¤T/Þ+ÍŒL' z¢ØÃM�64F^:pK/í—±FÁhh#VIYØÅNÚ¥rŽZ½§öF’Ù$2ÂG—¬=chONÅÔ‘S¥:=e"Î7²š™ÙD×¥²CÀ»ifŠÚÃeœ±šfx”î 2Q™””�³˜~C—9­´½jMŠBÄiE'²É¡ÄlâÌ¢ž¯Ã-÷=®ƒj VæhåášëðàuÁ3‰,jf¯2�".´Š³ÛÄG4•OŠäiÍRçϬURVçi�#ÆœR,!Õúje¤7ä¨Ìá�ì)bb%¶Ì¢ÛC=ÂÃ÷ãÞÛýê˜9妥sV樸V�4b…]ÁL5œw%ÊNUv‹²SeQDÖiP»øt ¿Pîú'¡ð IDATÜŽö�*æsô�jqHœ´gÆÈ:©ƒÖšH�]£UfûYo,Ú�δÒG1ç×¶{o^¹™®n’¶Zm€ÖèeÏ«�(6g› Òú 7¨jC&7Zéô¸õ—LJ¼Ùlal›L$–ˆö؉¾œ ƒYø”Ì–#C2=‘Áò¯ $ÊÍã1ù�šräV ïh'Ùp -ØSäjc!™ó¶Â¬6”ˆ„’G@_…ó–6’³ËÆA¬KäÈõÆ8ÇØ_å>�|V"�W˜dˆÀc¼i€e2Få÷RˆÊÿµPaBÕÐU㨤N�JÂÞ-tê.*‹ÐSÃÍH‹�Bdª¨†>]<«¯îIÊ’f(Wk¥ÍHÙÁG¨¢±�ô{˵™OA¯ã©ÅÚ�êpÛ;ª-X_uKk¿!ÛAlZ©Ê'H¡vj´ECs 1ÇEÚSÁc !ÉQÓn²˜1غ&Ó¡¬ïü ]F’Ép¤!-«A)'$T`ç¸7ƒ™­p–�áÀm8tÐ�ê ì0 hn9“çb0£F„Ý4Šg¨öÁù¢ ªS†ÿŠÒeAŽÖݰ.VüJ1]òT¯Rp5:³ñU&\Ï⻵î•å<§®¹©.éŠÊ–™RróªÉùx©;CAìÑvH©5©a1t V¶ÔPú‰�*c0~G=„ðQ×o8é7›"mš‹”C¤Ú$!Bõdê¨9E7¿¤Ik£¦½\�M~7OŠ—NÈÉZÃׂ�¸l¨‘fôØ/6gŒçT•L"Ë<æêT3NÚñzÒ:Rx`Ò~H:–o´j`p“ü| Q„°€ÒYKÛœbsPöWg’3Ha‹Õ5•WÌìGÌu¾EÇèŒÌ—ÍÊr>ã1 úÄ4F¨Æ¾c�9“úO5 -ÅR5AeESŽÎÚSÌL¥ÊpRÒŒq­ìÕ|2ËO)\– †IHýSÎ"·˜ÛʰvœW\’C°^”óaôúd¡"QÏ÷AÄäªi_Í?Äkó#h L'„þEq’ûE@ðÆßÍ O«›ð:½ä;X’�1L–k£ZS@¶ØÒœBçhÒÈ au2&5ÉÞ¦·RÕåþ*¼îÆÊƒ‰™Â›ú7.™Ç½GÄLÌÁ ö1jFíŠÒUݪìVE§p¥+ÊënPC–úEg�¶ï¨˜¹8uçÕ�굕j=r-ᨺ±¤,¦A+.QÆÈ g©‚¬À‘í9}{H)Þtm?‹#µD?r‡æRóé‰úçw|¬?¬~pÿ)­–�a£†5±´¦çÓÕõ1Ę Ûî•‘²Mƒ²ƒn<£î!ž¢qƒ6iÈ›¨©þÛ.kýœ,MaÕö®ÿéŒba#|挎¸þ*õó0«øÁ,TÊl9cDª1)§…¼q…6å¼8Ãe›§j°¥øJãd6“ƘBô& :–kjóºŸ,0¹0óð6ŸH¶NâûŒÃœíRÙ#*LsJ&wÉÉGÚ„Ò$]í“OV&yauÚ»$-ÃÀ”ß@¢“ñøú3È¡èF<Ý¥î­m¤ÕCeG‚½'—É´Œî+­eJp—ŠSŦ�ZŠ"¤rkhϺò•y`°ﯷbËÅËh*�‘uŽ@,»Ñ—]òРú RÈfh儱íYJ·-Z@ rb!³–j vÊeÌLÒ(¸ø[óY:e+KÕzÓ(»¨4÷?t/N®²@i^­;+R¨{�gòŒða‚+PTY˲rEåŠÂ¡ÀF1¬IRMn¡Ø³§, ¸âÔ/!¢š×VªU"Ñ*ú›þ›=ÉÉÔúÑ5Eþ½WýmWßxÝÏùÀoüß'œuôºž“»Œü¦´t˜h;a†¹í¤5ö&Gh3;Õ¿øœ#ß¹ëôýòúîŸþ0 ´ñÃï½úëoyñ ×ýðœüƧe^Ú6j°àPd£"hPfz8¢ß}Õ×L‡ãös”øÓv-½ýe×ÿÅ[>³mfí[·ŸýÓL»tõxÖ÷ÿìW?ûû¯þÚËŸö£‘ww>¸Û#>áô÷þÝ×Þú’®ûá9ïû§/<ëèu·Ÿ“_ÝðH”‹¬ñ´‰&ä±Uü(ØÉ¥0ÊÖèO„lPÖÚ-´ËS-’ZÔ¥q›p¡vYØ~NFÂcHkæ¯2f Ð3´þ©5š2A˜ÄN Ð|‚ò2} Œž-]5MÎE�˜r(¤æ'^Ž [lúJ naÒ>'�eÊ£IúLÄ$$5®µ Ò^\.™ZŠÊP2f§iä1¶ù•É"œ/7òÚ“ÃÆnDèL`r� 0Óâa>tæ1 ÏùÐ}NæÁ¡Ê€áƒ¼p2<ÚЃؕpUQvʲ*ŠNQ”EQ:.°Q ¼˜+yâåž]nb¢w>”H&À†¿-i¦¯2§f¶ÆÈ^bg_¢Z€iq¹·¼Þ]Yï,¯u–V»­"ŸxÛ‡4:�PŸ×•i®ÑåOLcCƒ»Üýê?zÕøi�;l­%A É—'WÒ¼&˜µ}h�<½’×€ uíxÆâJoe£»ÚÏEÀ³.Ùÿ®7~á»w�þÐñY«†›!B~éåw¾íêëÿê_Ÿzãݧ]yá�ßý…¯¯mt>uýãÂu‹+½•õ‰•�îÊZgqeb\Á³ÍQÎ?a·-ÊkÅ€y˜T‹á¢FП"kÍ€R;yL¾#ÆÒÚ{C§R¢Œ4ÎuÂ*ªå�y¬âÙ6c›�ØiYª³0×NBÚä_—b¸È £*êmµ|¢¯ Fæ(~2Ê-P)我†E€É‹L ©k?“Œ±ðdÝXŒ‡ÞY+®.‹›®D§ á:ï�¥éŽ/øaÝŒ·,�Ñ£X_'þ]–4dÍ/Á[¼áR‘#> !‹¢ØJMÕ1e®*ŒöçŒÜjJm:Ïì‰æØ=Aì<˜P€kv%�õ’«W¸»Ý¸\sÌn…QáUê�[]…´D6�b < ê>½D5¤‹ÁHܪB-F*'Tv�Eä„Çâ¿C¬m RB@Mú¡ìRg’©€ÑÉ#|ü0/¯É[k˜8¾çÜ2‘½¨ÀqçsT0‡o†aò® ²*\Y”U|´¡+‰É¯#&ÉêÁ~¾Ø9‹‰né먷ebI&4ªLU a!àÈBÁ¹¶ËÊ,Ëü@ ^X™<¹ÖŒŠ¥µ‰ùå^æÂ³�þïßüÔïþÍó¾v[Ì™®¼øÀÿ|Ãßôž—ßv`¯sõ Ÿ|÷›^pÓ§?¹Úýço=á/?û”åõîÔdÿ¯Þö™g<á~üÒç§ÞøÂ›¦'ïüغæÒ²ð¯¾â¶×>çæ³v/­ ª[ïÛûß?ú¬ý‡wá·_yÝ[^|cYxïé¿üÊ¿ù“TO&:Ã×>û{¯ºâ§î03¹qã�gþ?½âÁãÛÁ +½8¯Õ‰ùåI¨û˜éŠ‹¼ë�ŸÿÃ?ç 7? Æ£ñ&VEÀÂòäɵnè–Ö&C‡á¸þ޳^ò_ÿãñÅ©÷½õÿÂøÄL‹´kfMvFW?åGŸºþqûåË ç_õŒTeýò§ßþÅ[.XëWV&O®u#·´6¹°2Õ9“ì˜Ï¹²dÄžÒˆÓúæçÝ&‡“»AY¼3ˆÉToÇÜ‚X!Ô®©ŽÊ�µËöçæäÒOiXuJ WFΰ9íÒLJ‘N=\;pÃóô«ãÌÁ5šÅ!HÿŽ˜9¼ñOŸ]%Éæ†Š.©U¬âNòw±Å-ó “~C‰²`ïÉeËœR+6+¸²£/½ÅF?#…@D¨¦ÈyÆSoWqb™—Ö²nZìÈ`À®×„¥G™=Ûkbä ØüTY6‘aû¥²F›ê's­\–”“îƒú¼­Œðô¿Â¡.yÍcxŒ†‹ÜÝÎÕ”sÞLjaíX–qsÙ~‰e]L¡/ާ1iC1dó|'u’ÔV¯Š:Î$åˆÓ |'Ïì îL š`WÐh€Õ£˜;ÊKka_Rẕòе›¸:ï쉈Ÿ÷àà OŽ‹Â¹Ê•UY”.,²ºžüF5ÔR>ÀX(·NÒôLS)0€Q 2¥Š›(¿³z–>T£½zeBbãÄŒ­ÓÏö&5Ó�ìþñÙxÿ¡w?´ëªËî¹îö³ëÎáÊKî½ûàλî`ð+.ÿÑo¿ò›öé˯½õÜÓv-ý·×~e¢þ��_¹²Öùü ÝÎð¾îK¯¸üGß¹ûô—ÿá¿_”ƒaÁÀ%ç~ÛÕ׿ï³O½æûçöºÃ³÷,>¼0¦ò'ÿôsïùÔÓÏÞ³ð׿ùi‘-vŽ~í%ßyÅÓøÎ�=ë–ý§^vþ¡ß͵[¦ûïþäåü†çßô‡~öþàóvάý坿·_ùíßþëŒjà�‡g§&öx¦;Ôy%¯X{Ö®ö.0S–lÉêPƒ— º;ØõãcÛµ»õ~µÞ¯:UMñÙ`9²Z�Ì{¶NmìÛyò#×\æ™®ºä¾§=î�÷|êg_ù³·o›^àúÀó½‰S<Ó�îúñÃÛ�(Ó,Ì¡óëÙm»„6iìêRõ ™Žm–f“R9*D‘Ñšñ‰ªÆ¿†¿í‰`æ(Ÿœ qiÄÏé«A{3Uq5ê?)ÿ+aª!ÙO�ø"g·ÅÚ± ”Ygßh¢1T’Q]ƒëÄá´ÖˆPHn@TŠØÌRb “ ƒ §Ò-¶´1çZŰQº$�ÈË‹ÿ60Ò.]å:%�6xÏ méѱEßZ'—øjç�²']*íÊŠX™fiÍ3f€”·°ó O5b‰WL£?²ROl`¹·€e�j„éð¬ÁÀ†#bÇâÑ££®êr5Ë�iG.Þu"�†Ú);­èJ™=m1 †˜WUÒ¾g¢p»h@ ÎPN&›FÓAã#¦^7îq'>¨¾xËoxîÍ»fW�ÎOïܲò3�zèï¾|éú ÚÒëÿâ•·~âk}üë1ãèÂô?÷¤·¿üú¿þüÊáù- ô‡UTGîýÓÏÝÿðVÔ9pdnË¡³ÂªW×naerT«^€�Ý[W^ô3wýíŸôù›.èó7]°oçÒ/]yë'¾záâJÀ÷ïÝ÷…›íëâáÅéoÜvÎs.Û?=Ù_\™è†;ϼñ®3™Ã¼ ³f¾î‡g]þ¿j’XØ8$ØÇ wžyÃ�gøð5—‰«³ë ÑÎð`í¬H` èMô ðÒjgßö“o}É·?òåKo¾÷ÔWþܦ&âJÔ w�yÃ]gøÐ5—Y2äƒ%�6'Þzµ6îFª�³NÌ7˪ SEfJßEZ9 ¥ëª’+‘Š Â+6ŒKÍ¢�Lˆ&J X�¼ˆNHöÉ|3Á. ©ãPÇ—÷0Å‚Ì5aÕ±p÷aê.rg†ª- ÔÕ5ßÀØãÙ'—#-—MK÷§±tóh Ú€…£.©@¸RêÍá‚]‰²ãŠ»Ì®ÐÒ1Z\ð«} �*´ñ0‹4$ºÑÚ„�;8f® 0œw¹¢(«¢(�«\áœ+ˆ £AUKˆW¨WÓö=%'O%Væ_�ì;ÄŽ‰™úZè5kã6-i9¯lÙ @Ø£$¾}ûozÁwŸxÁÁ½ñÑ—žw¸,ù[?: ÀÎÙõÓv.ýÚKnü•~7\ï¯ ªÙ©þá¹XLpß‘‡æõ=šð½ý§~ø+—¾ë—?ÿš{?ô•K®ûÁÙC_ds•C(¡]³+�á�îRVÜñÀî‰Îp϶•®ßÚ–ÔºÂygzL÷sX7†HïHïЩné¯y�¢YHfL:†�J2� Ë Ýª~ó‹n<:?û�ß|ÂÙ§Ì ªÕ}e"ˆœ‰Æâ“Öò€Ý“°D½offÊ/`)Á5ÛG%‰ð)žÛ¥Y ›ô“&¬ ªÒ¡uˆq=D¯N&ÕÂfGSÞ*3ƒø™Å4p´ ÒÂ!Á‰´Ÿ`ÜàökÒÔüKÙEbÉ‚D )¤»MØ0]@4ñ¦½Å�¹­êùòkEh`AÒÌ$jÐÈpVf(åÅl?¿ˆ–Šnšê¾ß9é¶Lò±%¿Úç úDÕÙiMx¬ðe\é€ôò¨­±raªÖì©ÝSþkäº@¹Ê �vÈæz|À§tQ803{ÀÁùxÆ*q¿�‰!:KTö¸šáb’È‘÷l莓òÌ vÎI! �EDz Œ%Š3ÖÚoXÕer YÒ¯Lð,Û¥äˆÊ E®×Z�ã…ã8y’Þslª| jÀÂûp_¸çã¯Á†¿^e劢(ÉUEQ¸¢tή9ôËa]ɣʂLV\¯O»ö”�§YÙ¨„„bv¥'÷ÆééÝ&÷çHŒ§!X õ`Ì,êHœd*¡èà‰Ù[öï{Î¥û¯ù޹ϺäÞ[îÙ{èÄ,ÀÞsíÝ}⊯|ÿ\õ˵DZ…©@A0¿þ° åY%vP»¿øìSÿá¾ê™?xçë¾òÀÃ[ë/<<·%ÓÌÜØ‘|\cÓ0DδFGÜPváyà@òZV²Ûm¸m(P›Ê°é>rÒB{êom£S{zÙå·_tîÑ·þÅKV7:[§7ÀX^ŸÈ"‚¸âÁ©GC|>¨Óke‰ hò *ý*-iíÁ¤VÌ1ê‘x.smòÞ0<º/æÄÞ£%ÊZè¬ó‹Íì ›•MýªÃ 9Ìã” Ayã·qõL%Ù,æ>ò!8XÚ�‰x,5ñ ƒG\g¯t…aÊ�beMc/û›4£D–½O”Y�’Ð!(>†,S´žcq–U$9£\¢K±0‰£�Kž˜@E—\làÔÙbeÈÇ—ý`ÄúSp¡¿å§Èh›êÅaÔ‚òuè–$7Bi l*g,LA‚p—í�æúšq¬�Ý]8vpž$:uÞbŒ˜–k¦&è.Sgå—½ð8†¬ ˆ›Ö¥íô^>Rd™¬b ü„P‘d3O 23ñÕ¡èRY1• ‚¡¿ˆ“'°´ä×ñaıˆѾ‘KšB¿Py�#¸Æ}Lðä¨( Y[¥¢t® çˆot†uaÖ¬X.{ع» ›šœ¾ç@|L@/³³N¼!z6bm›¶œe»ú’žtet#{Œ™8qØŒ©öî‹7]pá9?éQ‡.9÷ÈozT@²ùåÉ#ó3gî™?2¿å¡ã³Ÿ=x|öðü–øzð̵‡Õj¶ó9¶4õgŸyê«ÞùªSwž|æ…÷'ºÍ'¹€^˜^ï—�=ó˜vñ˜3ŽFÅà 6'f•^‹ôg‚*´ È–_—Ì3A(ìëÏ™qiSÊÚ3 +Ûö’§ÞùÑk.½ãÁ=Dxò�-N/®LÀh%Áö)ë,ºn¤sNkfm4>›- J X÷ð‘Ð)«"bÍù¼dRá ³T~8É.zeZ¼ŠcÊA,ÂH©¢á»�â’’d ‰°U×?F ”›ëXFñ¾5Û�­¢Žk`XÝV9Àð¤�ñ4îšÃÌ÷l,nŽ$'ñ\d�,(§§•…Cç\áÅPè ú6¥—•žh/a¨1<0{dDs›€%Ë™#3J‹¨ÎQÕ£²Ã3%ÎØævÎ8r »åXçoáZ•Èp1x3Òßå'ø¦=*v;­2ˆ’&Ae §Â*a3²Ï•)*2 ™Ž÷É;¦ÂÁ�œÜ8ÿ2àÓø×<ÏüÜI^<Æ+yãOÂ{PW‚œÐŸíäJ+£ZT�¤"B ¸%uc¶*Á­æð~rr(;¨¦01Í3èL23ú‹tü~|;ï¿Ó>î׺e IËBL=Ì‹8‰È!<äá˜ãgŽ¥`b8.Êx³M¨…s…sÎÕE½ÞÔK™Œ À²ëõ±{ooX¢DƒjBiÔ$E'2ÖØ›:Úô»©É„hÅ––ìU*r–�ŒOb¾wï©«å[^|ãú úÞ½û9'×&>öÕK~ÿ¿zrmò37}n×Ö•ºî ÃQÁŒÉÎh¢uʺ×n J%ü‰ç:mçÒ­÷í]ë——�¨×Î-OBÃO–©�²ðSÝa·òýaàøÉ©¹áq¯{î͇NÌÞ|Ï©—žwäõÏ»å3×?úèÂt·¬7TZ¸U)|_qÑ�w¾þKÿõCÏùÊ÷ÎSû'yg;CªXZ4Hß—Ç8�¥ñDr¡ \qÑ�ÿ÷u_úÃ�<çË·œº?,?ù­Ç_rÞ¡N9|üYGŸtþ¡W?óûÿëS?·¶ÑI�¥‰Å¾%%¡P¿7³¸”ÑB0«‘¼Jj�æf¯ßmd!öœþ"5㜦�fXá$  « I†$“�+Γ„G™TåBuºV–]cN6�¡Ò˜5aÅ�T&…‘7²9X"X‚«XÓÆ&$h‰ÂлªáN³†š–©ôÊ ¡~Ë$égÔÅéÄœ•fµô+ñŒ Kô…t"n-ó46%&2³Üg‚¤OÁ!“íä*¸nÀ;Èm™pÇ—ýÊÆøÆ2š›'Â�1‘S�H“„U™ÍţؓÔÛhB�Xæ\)˜©ÕÓ`À8>À®Š &fv fv €<.l[‹|2‡XrµAÝetKêLp9�bŠ\WÂ× ð¦6€­ÅCâ‘ú|a¯SØÇÎ!¼êÕ•DŽ)¼œ¦¦ÑÖNòÚ VW°1L¯éM5hq É?±$Ö²å¦UM7SxäÅÒADEQ¸‚\AT¸Â9*Éœ£aY:#Ñ`Yà?Yh5ØÈ+úVÆ5å¤&6Œ×Q:ÑòiZ dîš/C²¾“E�‹0˜[ž¼îç¼åÅ7þùgŸ²°ÒÓ«ÿù›�[Z™xÓ ¿û¦|—ˆüðÖO|õâšéôÝKý/ÿpÖž…°wé¶¿úÓ‡ŽÏ¾ö�aÿ‘:eý†çÝ|î¾¹ÉÎè¡ã³ø×ŸùÚ­ç˜è ÿô×þåªËî+¨&Âïüüu¿õŠoœÛúº?yåÝw¼ÿs?³²Ñù�ŸÿÆé»N™›ùèµýÝ—.«k‡&¸ŽçKî¹õ$ˆ¸È6ÁÌ�És'.f�3司Ÿ²måcÿåïOÛµÔ)ë+.:ðÚgï»wŸþ«þÒ•õnޏpžà-~é– f§6~ùùßýO¿pÝ‘ù-ïÿÜS>ùÍÇ[ÀÖP 5G»¢nÎ éB^‹c¼Ftƒ&~MEB9Å�jŠI˜»ÿ/±’-ZSàf'0h-Z8.žLiE>3� Z“µ°4’^²ùñÓ$²¢c Ö:câ€1«ûY£T¤Óàøl8ÕH[¿å–e³¨®Ê� jÆQ %œB'Xé† 2O�´3ù&©4k±,vúF4MqJ¢qX‘•E—\ ×ç}3´6IÇ—}¹Ù˜Fô-­~%^[)î‚M4šd½k^Q— §¶hðZB†46†Yý 'FØY°ó ¢Â¹ðèAGðÌRg W:c?¬iyä‹uêTÜíP§ƒb’Ü$»(ÙIìBË´Æ�5 �|.ˆÔ9�œün›ð x¸Žõuî¯a}�ûCöæ5t(ƒHP%Ø‘ à ´QÄä…Oêp`ç@D®pN*ÀÎ䜃C¿�:5ãW€…bªÆîS*/‡™É�½á~øð¤ >ÈÌÃzþh︣Âzá¦ZÀ…­ñkü¦5ô˜&q›pF®WüàÈRKYEÆ·¶:Oœm_Ú’Zf©� IƑќ¢48ãטÃv"}ƘC| L±œŸ‘9¦‘šn=a]c¢c¸‰ç*=kå§Mð‚’ëË5$Uq6eLò5q;h2£–L/�­˜™³“9&ubsIðò²9 5!ëÆÔŸj�Ì:z)ý‘Pš¯òjŸ�´;ú3 Mß[bh �tŠ™()WÔ¼pz¯œÜ‰rÒYǦi°‚Ó&S�Ô)d ÁcÿÕ ÜÝ£¬ehAÚ3$A°‰¬C|bX—e{£�©¨®eGäGõ™KCœ8ékYà bd¹¶q}¢«…­–ii¸ £«IFËÒ±ªBIiB3“t§ ¼Ë¡ð@ _³gW{ŽÏÚ­ÁºÏ1šÌì3N› ¢Ê¡¬PV¨*T*'@\AT0N^s °šôŸákö#ŒF<b8İ�áý�F¨½ÚmÒ%CË/µnyþCøcÒ#ÈÄ�K‘Éa…Î9Q3D IDATr9ç(Á*‘#ï|bÄE˜qHXAæŠGÛw”ˆ°"_’4(Ißè®et±GŽÒ —#ÏšE9½MAJ¿›-eMe2µ–2 Y9‡Äݦ°-¬·yvai{r�m¸“\lq†Öeå Þ˜r:8!…&´Äö–¥z Ö™ ?bg¬½[·• wŠRŲ̂‰mõ)Йýr*V‰´¶Wm’)BËÄi5"¹fÅg¢ìâ”âhÅ9?Õ�Œ<ë�~4|l‘ªõ+–E] ‚†^ Àgš"¡H“4Ì™ŸæÐ|2§Då;®Z�s2a?¥BZr{M§yEæ~Í#àÍ¢'+Q ãI 2Ó¸šaä–«XØypʘ ]ÍU‰Ä)StïFÒÉ´e0bE¼)6Î$ÐÀr9ëÄ *Q䇘ežÞQ,¬ûÅÕÍœ›vÌh8¢„e”U3Òg4„I˜ÕQ�‘¦�rûPBŒþÖ51™À8æi;q×Á1…)9‡Ú‡í7÷$™ô;ï‘Áà0òŒ  3�ÀWrŽ]A.棲*öð 0×,oQ•zD#oŸ)WÌ4ÓQÚ²½²Ñ dk/êúX0‚õ+ *Šˆ¬!s {’‰ˆ ”ÃQÇÃÉÚ„V6Ž•['0»µRë±|縱 ­â”€<«ÊJ‚Ò4Û;åŒlõPÍV¹T8 ¼Ñ’Ô§V…Ó/™.EmÛܱĊ6U¶bIþ 1•äèÒ�¤¤Žd'ÛS0ýñXln]b;Ô­7$@H».uY L…ì<ì¾kMpmŠ`ü.›q*4 4-Äç9J6å8®4³m"lÅÃûH£Ff¥_ñM€–c¹ùƒ†Ì~ �[ÂR9 °$úY¸*$Q~iCª¢Û Ó7ã(XÉ›!ÛȦuíæG‹öO¬�åk MvñX¡gÞ8H&Òœ€D#j-tÛØp“sߘuÚ¦ëög†·�œ¸Þ´—ƒ â ?zÖõT©×äY¸šò`½,¾�.)ŸˆþÌUè”äØ5áf'xn•—×Ùlf�€teƒ) °Õ-%66ЉsY0‘±¥Õ7�õŒ†�ü˜G#àÓ6Bϱc¹Ø9ö!½' ©#££‘ÉåÆÜcÄ„áݧ¨�ÚX@¼¿%Çþ´(Tyˆó"ˆNšPBV�L‰"©Âln†›cc�ŸÔ&’cí±9uSŠÈÊ;ä”™E´ë³ÇÐY§¯0؉?¬¹¦ö-‚“ȘY~/¤ó’P©Z -Ç&GlŠjš_§= ‘d£N€¹$jH)-�º\T<ÑÇÞi·­G'Vyu#¼Q`c•d›dÞCþMäYH6škÿZEÈL¬°¡Å®Ôê¼X}•‡Ÿ Ï2\xªrÍø€ñ¿l²59Õç!û¶âô’?!¥ˆ"'Ê,�4ÈÉ29õ/”˜Ê–q2Hé�@}Ðbi „ûeCVv©“sÖeÉ9–£a·fQ’D¥]ß¹ã´k‡›œ*} ’õ­#Z]÷IߨTÅ3G*Mp8$.ÈÏb†›msÎ6áxk1ÛFjP+Sq4ÆR6Âz³ÑôíT“fywÜûÔÃ8G42¬á¸Â,ýÙ\X´„&}R„a³Ÿ3%L,q}¼2 ŽÊ×h"ô|ÿ‹!H�—³s%½>cHp8¬:¨ù›æ6ÑJ™ÍÒ»ú¾4S�5e²Ðø1ËÐ[PcEÚÈ_³ˆ¢h8ÏìÙ ˜Úð�#¸äd*æ|à�bssü4Õ„TD¦›Í¡—‘%m 1�±%ÎÒ-ÔfZÙkG¡��Æ#Ë`VŒÈLY ,ê%BŒà);~£^+~Y9'/ÍlI1à¢>ˆíÏRªÑªq,é1â¢,‚^ÀìÃFK�9Ä´7$·” €ÀÎa’]Í“}œ:å6zþÄ ¯ Ìr03È¥U*ã9÷T ¡•I4Å´ä^¢Á kHÒ€½øð´wŒ³tÈ�°^+»F•c�,a�“{>;BÈ5,©šT{"·)©i4â8˜ø¶µëÌ´r"gãб2+ýˆ�1|// €èÇNäCV\¸ É»žÂW_ø�îˆ É×Cë°nÙU'±kOÙé:_bAÉqü·§E6¸ÌýN<Ë0žLä¢ÖAêL›Àg&lÑ V…Qae” $­<Ô•+Çe÷¿úÖ|,û!³=qžÖ“HÔ`\fCȬ­ZÌ’NóD6k, !�áœ-Ú±vÏù‚nÖÞæp¦œ\‡ò§µïɲ×J!+(ŠõØ$9A�bjƳØÉØ}1‘ï�µAŽ@î,ONQõ v�³V–‹‡’Š¥–;Hší5yÙ^~ËñÔüµ,JÝj!ªhÞtçÂÌ#O~_saæ[J±Ó,Edsï¦â‰;œâè5 »Ha½Ü¨“é C,TB%±Ä�ÉÁ‰°]! Î0‹YÓCÅë};U=bÏn�NŸu«#ž[åõa–åj€˜°šÈˆ†¢OËb)ƒÑƈ„`VòÌ7UûÂÄû¸®›,#É@.dÀ ˆUýí¨z\ÄI�ø…Ì“ÉgA‚F2ëvƒø$�b±Ë6æ7’ˆ,YJÌÂNeƒ¾¦'|'H #ù»wIr V6¸0 AVˆ‰¼ãAg8êx„ü2ÅP#ŸwÓ#lßW‘#ïI¤)L^ÄÕë¤pÞ£i1"-ØÄeRc!u�Ö¢¸Á’vŸ­nu†2ºÍ=-½D·˜+ÚOqX"ñÃcw dµDÁÂÌ÷„¯yLAVœÄÐÙÕ8¢çȰ#;OqRHM@K¢Ò°°šv9åŸÍ ”|té–`ik,DhΠ”p‹n9Ÿ|™8~Š�CiF0’ãˆÀ�F“Á‹0£³¤¤ 0”�ó¹D؈^•Ã"ôfÉÜ„²¤Ï Œo_È™ZlLæ Yìf[µ)µÌG3i“0-+ïµ:R"B$äÙkWŽÂcÈ­ô9+iŠ(“‡�Lsg `�%\Ú6 Utk5�H”4 ©‹LW»æ°…(hoxX¼Š%á°@â—"Yre8B5M~ˆi ·Å­×|bů�Â<<ÁÅ— 6ÖE-³;'L0`k`AiI),ˆAÛ8e`€¤BI˜[]È¡ðÅÐÕ'ªá¤«g‡U^2¨K é>–ˆÉQ^ù�ÊBˆ‰Ši³0˜Ô°)mùÉñ1š›‡$ÁgX­V{ŽÖ“Ù%¢ðÚzŸƒ‹q!¾=>àë°ª‡]ÏŽc=#D€£íSnfg5QjZœVrYn§ ?ë\r\WVZ— ZGb6ºviÕ1¶ s~||�y´ü'ó‘´g³lfá¤u�ì’1"ØüëXÒ2Ïag¯Iã׆mè�ù”ÔX©5pé4¼Ej¶AF<à8mœIyEZ½n:41~Ë ƒ¯Q•› +­­¦ª&̧l2ý%n±a·>š4´"©Ù4¦µ–‘´ÓdªÎ‘iÊtõ<¢�Íy±ú†M�†^Ñø_5�'‘]BfVDcT@³XÎ}åã“Yf þ;[©/–yµks å‰8Àõ=&F†3 LÉèRU+ó…‚YIÙx(¤UÕ(n ²Ìü4f0:%û]$S„ºµlÇ_P2f{6™O\[ÕéB|;1ȵM}–Ÿ"üéEºk¡æ„!Y�),%©Å3ö©0¦Î#Ün¬ÌŒ S²™ò†çÙ¡:À$»TËL:—._É fæðF9FÈê$ÂÓÚ¯ÊÊ.À¬�˜&u÷ìË­5)Ú·"¹G!Á°4M’¡œááºìIiÅ×p„ *á*ð3Ľ‚6z3n}„ù>¯ôYJ/6 ±‹h>ɪÏÌ-%s~aJ’¶¦ éLëàèá"ÂÈ#$cݘȱ<ñ�˜AÃÂÏ÷|g8šê—å°`…6âD ¼á-—Ò´l@^A“ÀŒÃ4q£ÔwãQZK°.;SéXÇ�«ÚV%$²ØI0*GýNíKާã kR·âªEÚ¶…ff«X &5¶­4v‰˜MfÇ( $ï±ûÉGò ÉŸœ£Á-zë“3Q±´Õ!MÂþž`9óX·0‰ &a:Ûu]™nØ|µéQRsJH¹Ù‘ƒ8õÕ‹ãn f7œø0ÖÇ!kÛq ½Yá4öiv¶‘ÌÒ°UK-¤7Þ¥Õ –‰°:ù;³,JÆdÄ$Ð`°¸E­F´³(–j¡ºßD†ÎË$¸êo"ãMQƒY5P§•¹ìÜ5Ë‘Zd² ÅTCå×qÞAÞe6”Ñy[NH£  Žm:[ƒ$¼Ï/þ)AðÐ�œ¯á -¥ÆØ�”àèéõ!‰éD±Œ©�dALí1æ"¤ÊÍhƒ=§IY I…ޤ²ŸH‰C|5@,¾Æa´¦gH‹Ê#8h¦£!žY‰Ú$Ñž+õ½>w à ·°Ž“Cï=i²™bA$Àƒ81•¸ÖxUþZ˜‘d!鉤˜R�ÍœƒXžŠLj q0@•5F¢ÌЯxP ;Ãzj½tµò1EQ2 jêï àP+PE0!HŸˆ J)jÿuâ�sO@ê¦Ù2!õ¥F¯«0‘cøaYª‘ÿÿ+ûž_K–ä¬/²êÜÝýºûõÌc°�%lXBo,lØÁ öü H,ذ2¬ +@l�@bÃÂ;�ýlσ™yo<Ýýºï=çT‹Œ_dÕm†š7}Ï©ÊÊŒŒŒü¾Èˆ¬:+lýŠ�Ϋí²þ¤=ïòù÷ÖõF2jà# Õ^v /Byä"•äeìQÚN QŠ9u*F´Å�¼øŠ å=ÕnŠ�¦ð5ú@‰“‚Ka],ÑÏÙª' ™ÅýšoÞ‹½~tê“F0z°ËS>–*)1Ý9ì‚Fª’¦¢ÀƒoödËDÉ1ä Uõ]ü…�y©9Oc„t¹¯“‚¥‚º÷¶QgZ~aúß•· Û‚Ò¶Œ“¸œjµ ^9Õ ìàü:Ùìf_P1©Éq?æÓÌ™*VÊnywÜ*¹’O]õ²érE[ÒgÍúƒM‹d1�H­1}VkPË®g¬¸‰ûæêò õW}ä©+±NRcYW‘yÞ&úÐOj¤€›»Y¶#þåÒ 3Ü´r¶˜]Ÿµµëú€Û¦o¶ööŠŸ=ôKgÁyõ\ï³ÝŒ5êO§ì1ðhmhl˜Á†0ìE׫\Ó•�‰ö¸nçÏúé*÷çe½.ÎÐ0�"¹ÕrAÞª½¤¯Ûu�ÂÓ+Nî'70Zê7’/á Ú&MsÓÚD×óù´�˜K®¨}\G…í}»û©|þ¦={±‚6|ØÚ*gâçì{:bf]DÎÈX~ñÍßé[xóá;¯>þ›ò¯ÿÞßøí/¿zý¿¾~5áÄþóD·ó4JÓOJ’rû±GÍÆ™Oz·J•^±gH¬›éêÌ(E|º$ÇÙߺ¤Ä€ê’t¢¼”ÛM ÚÞS‘z—_i$äSÇ$?_q‡Óâ’úáÂΚvÞÿRagÐi xËÎxû×RY×õ9I"¡%É>}Ô±–"8�4V÷’ý;ËC¾ÎS‡Ô/A)!òtfºEj±ZM–‰…H]È:Dí„‹hØá¡ïE°b§EnW]b\hž{±UµOˆtøšóqÑ!%±†£f@f[Rè"ýËn¶<þê'�BíÛBجˆF/Ç¿š8�Äi7sß7 €`¹A;µµáxu#w«\;®ÕSsQ'D|Óï<0>•#Ò̬S×ï™{#�^£›ÐaäRØΧí|ÚmÚü}ž)}.[Y«ã—Bý#éØ\ÆKhi¿#{ê_Ç»âjž—f«c{„ø; ã–&½´ëÇÓöx{½žT²88 à>DÚYN_//¯òÝ?¹ÞÝ/©(ZPÀÜw𩹔3;H�uûW—_|ówºbë?Ü||¸Üþ—ÿù+á—¿þûó·ÿÃÿø³O49|óÉ£°"4G`¤å«+š�Y7#‹æ×¡VbŒ-2¬Ê&#‘–ÁÇD·ãî$ÏHcØÏ�N£�/ò —RÖY- 7< ¸;{]îD/(†AÎ�ÄRs×W¿WÈaêö‚ƒzX$O6«þíÉ!˜¤dÿ+†•�v/3M…ƒî]§¤O3‰VÝõúÀ×’GÈ¢>1›b¤äÀ”âääÿ¥�â9x]v{jâ¨]“.s¥y¹ÊòŒÒêak�ÑI‹íÑǤ°ge§W�åj¡Èì©öV�ÊúKÜ«�ýKx&5[‰Ù>o1Üñ¢ÒÜd"ñÝÐÅÃݦ¹¶b¹“¥É x}#ÏÖèeìoM7(çˆçc #—¹‘d_L¾íFÙÙ¥”¸Êõ°ÂÑ¿.zYq¾é}éiÚêô6–Òã3SdsNØÊ.†C ­yá…$×àZ¦[‰“MZƒŠn¢—ËÇ›írê}QK´Ò×Ñ�¦²~Ó^¼k_|¾¾ü|߈¹l‰[¦D"}ªÚ�“b¬ŽÍ¢Ptüð›Ïþýÿsí×þàõ‹ÇoÞ>C…Š'À üËr¦ð"¢ˆM­úŠƒ"æ³°ÿÓSÍ)–Ú;§¼»îÕh~N@)êš?f�,ʤEqMe^þز�ƒy\kÎת#`Ÿ2K¢ÅùùyŽ2(ÞÁp¨b“/5Üç»YuôåSÎM<•ÇMõ"Ú!Ke—Ñ\n¬%|ö£„Ú•t2Z�Œ­ßÁ~�o›é*e«¶NLÁÕÄo*BÁâ¯zÜð%ÞVŸ•œ¶)ø™ÆNGF×¾_=è/àIUNrº½ê‹³>[ä‹»öö¢|Æy³=/G““¡4l&ƒ#IFSIo�m5ÙB ó�F–†ÖÑ£SneqÜ¡«>¬}Q9mr³-§.¹¿‘và9Tø!»Pø2P÷paŠM’œr§ôp´ÖTà¢×ÇÖ/mëmà3DãTOyÅ*²¾“ûwË«ÏäùwWdP:’î¹A™ÏÖ4€\]rH‡JüjŸÇ0V3A‡‚îÊ÷AzrÙê,S&0�§XºÀ‘e3¦ÒÓŽøeô��+÷ÑøD3so³Š›n¢í)]¤%>gÅ·jð@{Éõ*·3 8BñÙ#H½:r¡»¦„™” $�ÀNZF&1'ÞáVž½!~ZÕY&ø~n†¡h•»0kœ_³ùÍ—›¨ùJ·‡´1±ó°nEf�*þ§]×:À:»Q:æê“� 8ûû zÛ]’�8ašYVXw®™¡t2.;Aß @Ñ·Þ.–«.mŒÅS lÚÉLYn륛ª¹," \—Ä0W⻨h”ý#Ö 37|‰¤¤=#1�™ë~°˜ûÏè™÷³)Dó'6 ‹Ø¦)4•nÃãû° É|€*T¤a¹—åË#Þ^¯òqÃÏ.úíU6ÍÜ!Wiwe1D!B'£Ènæ§2¡’' ¥* •|}ŸÌ÷•J7ÑmÕ‡UpÚ䦷UÛÂe�Ø”ÀTJ]jïz“¡oq£)scP•(T:âÑ«ê×3úµ©6õÀ¶Nµ¹Œ8m†±~�Û·íåm{ñ Ërí6¦Ý™Ä ÷C¤ç¯^ úpð]B*‘••æ„$¡”÷O¥¨Œ‘V‰³,­`À&C›LÌ X\òC‡ç/M3â]U‰R…¬57ÝŒqô åÑõ&uÄ6(�Qcx‡~{u˜q[L6ß“°SFÁÅ¢ÆÌ­µXÒ¶š6c]>MÀ=NCüQä‘?Lõp·j5Áøq“�Þà»,('÷OêŸä$ÿ}Òî¡¡rE¦Ë² ‹"S6Dœ»M4¸MŽ3â·À-Ù2�TU¨®ˆâ¤µï!YÕÔƒLJŽ.äB\ÀòOýg¨öîrgëZ~ ÕÇŽ›,·>VîæG¯�mkOªQY„üø$+ø––ÐfÜ­Òd¼ ¶p¤ªÓ¯ï¯)69au&´êlÁ”�ËÛÊ´jñfDõ—€ÞÍM 18r!bKQNŸÄæe´[,·Ò¯XÏx±â¼á}ÇÛ‹>lÚ‘¹>¥=5Y�«ùI\�’N–ë'qÛoϽ�© °`½êÕ]ØÎwØ”JS}\T°-Š“¶So dQ4#º´j3ÌôLv xñ~­ ºâ‚í*zÖ~Eï�€™”­“�FÛ˹{Û>[åÅër#ÑMãÑ ¦¨"wYW`O;‰ÚÇîôqÞ;§š/‘È©òÕ7/Tñ×í÷¿ü߯¯c¥Í‹zr/£ýý 'sè"pÌIǦa&9¸šý¨ú\f1RI„‰#ŠÉ"°žŽYäÑ Îñ1ëí3>� L¹¢º>v$Žc?Èó¾5VôóC�Ĉb÷Ý9äT©rJvÍ\6×0׬{�'��ÒíÊ%NÊy³áqZæ>»’�¬åà¤ÖK²+£4„b3.œ›¯�n8¦;µ”êcNGÇ÷r²�ePH¼Ò´Gqn]ZŸ¤Ó úÊ"{œ+Ú�á¼ßúËÁK_Ÿ¦Øè*Eõ’`_c§OÏ=¸ÔI§` ý1eœäàaG…¯v †©‘æC±.¡@ÆOko4âö¢û è…Ö…‘�ìý_—Èk›}d˨ô¨ÐiÏTU– nôõÒÎÐ÷W¼½à±'¢rÜ”ÁB}GÑsD*mÐpR†x g¬eY6(�O}±@÷€q6‘«lÛ6fãYµ-�²ˆ,– ¸ ^õ‡),à ãìôÚq•~é½C{sÉâ…NFÎBIï@ÕÓ·Ëí;ùì$/¾XN·­kÈ;=1j {ò¥Þx(bŠppN p´s@ƒüú÷ÿ´?^¿ùÑ‹ÛSF"û×ðÏþáüñ?û¿ù_¿½7iRâp ø˜«~‘#”ɯ <÷œ9AS�Qî¬ÏïsšuôŽFH²ÄÆ>Þ¨\ÍûiEW(I˜lá&x{j.�P‡“k$‘Õ5a¦€A +‹ì�xBÛJöò²5ßÈ_½€Û§I�ˆ"ÆWÿ`·FlàP¶cQž°œOåÝ>ÝuqBʉÊpÙ¾9ÈàiiwAµ¸3KB<è€î|%m}.ÏÒ�c�üÊgró'š,Y•Pèˆ?û=ƒÆ¾¸«ƒe«úéý\.pF”Ì6B^¢@À;�;Œ¯“ÜsøÔFˆ1t/ÑZy­?Í8Zºä4äéÁĜɑ/CcÐo•Šè¦ý¬ýŒmÃÊû«¾÷UÏ»IDATßpî#ª“$…$æ±4¡¸‡Ã>Ȫ?ÊG›Œ®egô*»‘s¸P;ƒŸ€3Ð\‡�Á‘è†TîŠønR›­H†�‰ ²ã!£”tœ>,÷ß¶·òüÕ²ÞŽÐW1›ô-\M1RþÁ*C¢ÈOVRK1šÙë~Ôé»oÿÑoü×÷ßþüoý§¿üÓww^Ýdæ“Î)»XÿthÜ‚<ÔùdE4XŽ˜¥Ve°Û§F�©%J©‹Gž® èkù€+4íÝê¡Fzšp±’�bå^ÿ�N>}Œ‘”Ht•u‹k´šÐS¥)-ÉÁU©%³å�4ÊåÈ$”L£=}®hmõ…ìâÕWeï%:fÖøW4‘l?.ÿ¿,{Ü™£ A«(=Õx?êø:~Q¤æ Æ\(X9’šó.ŠU§“]˜#nfØ‹ÜÉ~®z5ŽãCÒ x¸ÈrÆúŒ°7L}¤¦vá_AWpuJ´·^[(8¨o,5¶ék4åÛ)L}-*0ÕjÎwoZƒ™¨* ”X¶"ª?ß‚‘ sÏD)V¯ìO£¦4\Ó26?†ÁˆHB”6,÷­ÝérÕõ¬Ï¯ø¢ããÖÞoú~ÓK†'ÇËY5ðqç—”�$HŒDcìÍ¥hXz<�T�JÍ ÉÉ©ÔÄQxêvaxˆv¢1Û_-?08Ðo¤å“¸Þ%þ…ßkú‘vÁí·Ëý#žß·gß[–Qµ—ØcÍðMN7Kø~¢-á=+ûÅåÑ…Ãõê“²Ç æ~úâþü/ÿó_ú�?zw ¤š�XÍ‹FBö_�÷­Ò!kÚEÜTQc´’¢fUËeï ‰³14d§°ž‘UÖ×à:õ{|ö¦±í¡È<¼Œ„ñ‰;ÝRº¥jöŠ„û¶©'D+ë:Ÿ7�±ˆ“ÀãCÌ*ÜÌÀ?�ÇH=…iw FÄ#4†EœI¥¼¼�d�h9 VÓrNJQå¿ìEšŽc[¦»&ƒdŠ­ÄiŽ-'qÕÔ;Qc­·‰ÎYP²é»T¹Â÷lÅü!󡽪.óøšÎëèÌÕûų…sÜá¿+B3�£ÝáAhUKâYòÀ˜1žI‰Ïœ>1¤u÷@ü�' Óz,q,ßÓ¼› G€oBŠÖ“=mg4¦wºÉú‹�J}šñ/I(Ý�3_»´å™  W,}~Æ[{Üô½â}ÇÙ¨/[Uo¢Ö¿C­ƒ™—Y°v<‚Ï%8{ÿb¬’ðy¿0xìýµç±Ù"ÜSw¶2G9cªôb¥½—cHâ§ub°¼!‰EC�͆¥ØG{.ÖÓcJQŸiQ£‰ì£þ“tùzD�™&®³©a¸Æ�áqÓ ·ˆ6�# w™e¾Ò|R¨¬²¬"÷ª]–³Þ?â;W¹ôå£èû ;®ñèO©y2˜@MM.s=ϲˆ,X¯zQéq_eEåºwŒî^EÂÇd¨±±8„„¤®,®Q†`T"‚F^¾˜¦N—v÷¡=;Ëý½Ü½iëm’ ŠŒôyOS pføÔ–Bú¢&X`˜¢ÂÓ•ŒçVR?ªöúC< G'9ø¶_=Le§¥¥Š7šù ðÉ`žwÝ@Eõ ªwÛ}Ø(eæ/‘¸¦ulr&öìú�*ô¦‹ Œhé-H|aÁ¢¿ˆ0Ù\ež‘4kS†ðßlœ5ux<�Éã)QHzW›º—§›»W~0çc‰¯9¯‚/ÙÆ¼³”Q,ºñý/UÄÊÆµ;õë!/~Bg²ûP›:¸tXg@½GœŠùh½qßÐlÿÕ>’¸üQ”á�Xg•*‡ þ:5´uÙä²a9ër'FHO8JuNÆ2N}IëʘÜíŒ cÄ{b›�ŽÄê�´kiÎp¹%Çc<¾K8Ôl—é÷ÂRµšv8«ˆá‹r_€æŽÐ4& HŽ%|s´u?CùõdšA¿>ÞW: Ct¹Ü]OÜ�ñê"×MÏ�À‡ ª[0Ȩ|ÂÆøàMøvA÷\I¨Ëꉃ2ýÉ@bÒ{¾ÍúOk"2¡Ð¬Ú Ùy�ÐzI-Ä‹ B`àæ"·–»+î×vÿBNÏÉ÷Ê[fˆ.›"݉—šÿØø <ðÑÝ•÷«Å$2¸¢ψæBµ«i̵{Zû_ý‹øp>ýìý­�‚oòÒÌxr¢v@š–'[NŠñ›³÷:Ý2]ÑÝu3[øJNt'-œût:ã øÒF5;ÇÙ˜­#R`1ŒÚ !U=ñÔ°ÂôÅ!=ŽÈOâþ‡ÍÚ}—\¥whGùÚÃrSa-�‚þ^,=ÀÒÁByáUº†™S¦Á/!V�'Òùd52þ5Ê®gzPL£¹=YþœÇ¨'‚Kòïx½^Ñ)ûÏüÊat„·eKZ"ƪn}>aŸˆ«†• @Ûs²%Tû}Ò¸Öá`úç¨Tr |h-—ÆT�öŽfïv¬XOdUô‹Þ^ô³3ú†Mñù¸á£â¸ªìÌ‚— ¹z‰|�~Å% ª®&ã}%~ ÿ)jw[5Z«$/9VšˆfüMqÚäö¼Ü_äm=áö3Yï¤-¶3Ê#´fZ0U‡RÑÜ$�' £�÷EXŸ5ÇÁF8iXÁ˜ �"쬪òW~õŸ+ô²}ó£?jÒžß�¿}¸ _­‚} “Œ©ù£NU„¦ù›O'¤ïS-"Ák£D `Ý‹àØZ—Ô±-qªü±B*'d)‡&‡_ª×1ß,õd*5faÅw½Š¡ k¥‘ž¦‡š©#J¢—Þ£’4ˆX�WIØÙv4Ž”™[ç調ÐY:×'UKû&J_÷ÖŽÚÄSŽÝ�OQï®/öÑsÌóÛ«½e¶”•þÎ X�l.bOXkx÷iÆå^§¨;›§qÙ< Ê®¬—QÏ~WÑ'—@Âu¬1.Z�ò:8”€ûƒ¾b~ê ­nf0±ó-K@µñéæ�ÑŸXáIfõÕ„­)¥Î›©p‡_•2"Þ�¹¡ââÕÖ³€ßmp¾+>}œz$9þÊÚ¡²Å?Á£‡ežǧ§É“5ï &±ad+»½ûÞÀ×Q8Š\õ2s5´ìôG{.êC$˜œÇ ð„M;ý~ëouýœÆH` »Ñ+훉ñŽݱÔܯä›Oö¯ÜÌô�=Õ ±Rû\äÙ[@œõiP¶—&šc±&iW‰ÁÑ,�(!¡‘ã >… ¥pŠ7�ñª‰,� íàØ—ùÄ�{�R%J.`¹È‹’,O"Á§ÝÜp:àâ¹"T¦$ƒëãÝU_=Hïhg« ÍQvÐÃhΤӚ©�J³h¤y­�_�˜€Â`E›wa0Z¢ÌômPv5§î|Ïw1¯µø‹nG3FxÊ›n44¹SR$jMÛ>™® åìMyAã¥ÖÒ²Ù.¿q|’.§¢7�­®XNm¹· ª]û¦/.ÐÍÿSœU.Wèí½@®PÑõ,— „‚€>»H½õ#2Ó.¿éÓ_«¶Eå´á¦·8An´­‚å$ËÚ�,7@óŸ1ëÒ¡ù`¬“Ž‹…¢CÚp0›AY¤Bé.&Ô}—�Ž• dhû¨Úb $â.­Wôgh²LÝÉy™PY/¬²b¥eŠ"+ݤ¬ç鮬ŠéÖ• ˆ"f.*lö4Ñ–Kù´FÖpȯúô%oÔ Œ”]ða hÌ$ç ·pVëîö’°N!è]EêûRü�xŠøŸP; ƒûd”8I)4ÉÛ˜Oýÿ.©»'ƒXmE#Ħ>*F©·T¬@xÒ)��ËSÊ…¹&É œð"Ê6¸Ù Å Œ¦Ú²¿µ¥)Ni¶Úq³):´Kßt¼]XUt[¯}ÙT®Ú»âŠÞtÅuìrõÍ/0=°¢ I•iª ¤ VÈ"‚¦m‘vY 'i‹Èê{ ót‹4þ„þc4œ ýÙ­H" Òén·ÅTS[<ôa>L.¯h~jš]uQ:Gˆ½ëºâå+i«þŸ?ÔU öìOÚ„¸NN�¤fV1¬>Õüc˜½é*µÅÊ«¸;H C›ž$+E½k%//tgˆ&$ÃÓ¯·v�à zB´é«S)íù8Bt5Ä:@HïDýJ™fš«‡ýGLCµX0¡ èöžû•5”�—`ÄÔ”ñ3:Z Çì`wo©!¬%LÔ_ëV~Íô•×�IÙdŒé6eŒV!’¸¼r:Yœä…ãx-Îhó9e3ÛõSG  ýº]—i•>HÙ®s$¦ ø¶ë›÷XïZ˜b€Ì¦wò%õÆ&«^`tU"|£çUÑ»]â†h3dYÒæ�â>zJˆzjÉ1†fÍht!²ÌÓ³7Á®ð 0;B±•\×9šškâDGÄÒ·ì~¤qcØ"‹ŒÅÍ #½� |gó!£,ï³\hºhÇíøÖ›vH_t¼ñبLè›=ªŠüE"×ÅâÝZÔ–•‹Úʲy‡»ª S37‹MƼ:çê ��·z©Eï¿hœ¼Íq‘û¥¦°¥ I€eñQUM¨7›3e‹v]¼|�å¤?ù¡þÁï?®Ö ß`uDiÌ}Z¿«ÙhY„'/åÞ¿¼ƒƒ�¤¸‚Ÿ>¨ÿêl�Rà[�¥8T4e-k¡ïAŠ–1b/âÎá8¢ƒÂò‹‚c5Ä9ß\bÒâP@µˆਔ_ªÍ9 ;ŸbÕæ£O9DZêwÔ%ÿÊ},–Kz¿rÍ+]=8$§Í!±©”yåÂ5¸Ù9¹ºÛµìS+2/yµ�h'£€®–©W§~Œ÷¯§¹“C*ùÿ¡ªY<ÍcÌn)]º§$Å™››ä'ݱ17î ±O]ç¾’Ž´|­WQÏ�yÕb,ßìûÄëÕç§?’6ooößt4Ëà P¸ª~¼âú�< • íÂw ¿Úfˆq’œ¦dÛ ›„’<ê�¨haïšÌjÄHÇ1L—Ï¡ÉÕ²bûS”ÇtRm<Ä{dSdŸdIUì±ùè‚5Ë¡º»"šz@TÆ›jºÂÒµÛ”»G\Ãïrvã1–•1Ì.#5g ¨ÇUT¡[¼‚XС› št‰éöî Ñt ¢-15[®º¨cª1ã—“7 ¦f€‰,×¾ç9ÔìÔLKêr‰ì@X×zùU¨mÐò¹ÃÚðús,'ùú+ý½ß}�Öhßûî³/^ß1ƒN³¬°bNdo5©‚»æ%S@Á4Ù%y¼C ٕ8 VS+õîk÷šµD,oaÅo.h¸›k9&Ï ôÇ þ(x¬ôIÓ[�….잀å}«Ò…µŸ=V†V„Z·æøŒÿÆ ¾¬Fuö®!x¶Œ Eéc¢íáñÄi;}DÑ©µ×]W’L̽!èòjËG„('¯)l8è!¯�ÀåЃ.ìnò �X°cþY�ÄOÎ)éá)}¤Ú²Þ·½ë;%› �‚‡ Ǧõá_Òüʱˆ:1ˆ«Ùç²\7““H+Üä†#"iäÍzˆXíjõ¹ç}ô(žx¬•ôát#4µ ú .‚Äát©'\LAcjeÇ.I¸§¾Z,?�åþ•‚_E“TDTû$>xòØŽk$@‰‹eº‰1Ïi!""Í5,6T!=–—áú�z#hÜF¬Ô}ŠHdØs46ÆN}äJÒ«kGÚ à–å l¡+NˆQ%�¸ÙN™VEPZðCc4ÄZpoJºbmxõ¹,7øÉûïþ΃4ÛM× úý_~}[~Ø•š­îA94ÚÞ]b/)ª*ŽuîÿÚ×ê§ëd?Â_ÖËD[ æÁºÌY´´j$üöJ’/¢[3{׋ÝD£Í´²· %ù(Ù9«Õÿ KiêõøL´uCè‘w±�.ÈekhļfQ î8Ñ:ËF}‹ŠEþ”†)ò˜o>—ç¥\`Û É©ºB4eÅñlΠÄ"…Ó‡1§hMËe”Ö¼<¥¢éƒì[¤žŽ3�Ï×#P×èŠ@7oÐz»îCVŸwÊiDWyù¦ðþ¢}“íÜC– …ÇÉ)ÕZ*†%Ý�O£"¤á£TŠ/�tãU™DjCâ�CôûMÙ}�*ÞeSkNDS¬÷®ƒnÊ0ò•Öxr‰²È˜*"TÞæqkÁs>Üc(œŒd´$ÚûH7†N¬Àx%ò˜ÍlÛ™c>�dg]×¾P7¹“÷>Ú‡fUx�Ä+Ïè�/¼U=9š‹oxò:ŒáÅ[”I·ˆX‘óœE|`Å×5%j8ªÄ&„‘ˆëÏbíq_ª7N»® ^¾‘å¤_¥_þà¡-nd¶åýûêµxÚ?D8b3>˜Yo +òÍ•Ù`‡;0Ó»@ñi¼q};Œ søJZe$zð ™E+�@f¹¤ÉÔPà^«,ÛÁnëR6íä8HBO¿«}Œ Ui‹µd$í‹�'ãÔøŸ9zîp›éSí UÈþ ÉÆ'÷ÈZ)Âïõè^úˆ†)™‡î„J9òpÙ�ÃÔ ôWú’'¡ßL¼MËîFÔ’Içõò‘†%ÂP™8�&»Vò6_!ØÔywÕí�So®VÜö´P y—¿šíKÃ�LŸ©!—å´²C~#ºëkO…±ê4ÖgB6'àÐt†]5¾fŠñuQÈ"2»�€Ôt[zÚbÍ”e®€9PÄ;”ê�x<Ž­È÷Fåª]CÿÞ‰ˆøh,¼8hª’äUSŽ-6alj \S³£7ƒ”‰+G�«Ü½15ª£…R¦5bîiÔ”¿õ�¹Ø>#r¡‘Ù˜£CôÆfF Åx E�*Ú5¦•8›Ž^Ѻâ´âåȪ_ÿ‘~ùƒ³,ž`U�êÿ£iNŒL4¾'IEND®B`‚dtkcore-6.7.46/docs/src/ddesktopentry_example1.png000066400000000000000000007601311522615770400222120ustar00rootroot00000000000000‰PNG  IHDRÍÓ²âg pHYsÄÄ•+ IDATxœ´½{Ðe×U'¶Ö>çÞû½úeI–,K²$ÉŒmÙFØØ˜Á ®©È0L‚L%™$S̤Š*R•T¦È¤’ª0Å„CA‘b 5�Sƒ¡L0~lù!ù!£‡e©%µºûëþ÷Þ³WþØ{­õ[ûœûu«jr,}ï9û콞¿µöÚûœËoùÎ_|ìøñ”:"!&fb¦rˆ�ž/Ÿ‰„ì°oÏ‹^õFlÝyƒñ�péxz7Çf‚g„„áF½Ov_>ÿÆÿþæ/ÿò…ç?y a ÊPaÔ.Ìûáïý�¿ú¡7ò_és_½åg~ÿmûÒ Ev¯Ñ|=|ÿûèüKº<@ÒÒPå©­—y|zZ‚#ù˜&„9 I¢÷Vú'D”n»w¾Z×�ZFa²q9Óò$�úõ×F"™OÊ‚*«TûRë}Å©åÏçwœZþÔ‡nýýGϨT^ ´Ù)¸ûôñ/¿ó‰ÝYþ¯Þû_œßúGÄL±|ícs#šñ^>$¦,DD·í®é�Ýuzù?~ô–÷Å—�©;ª°Êyì>"ÌLD"ÂÄRÿÊ’"d)2ƒþ«¢8ñl§¸�3ÍÑ06ð<É_Ãzs²¹—ÜuãadÖ½T yí ‡?ÿm�_û�Û«ËùÒUÖKu™’oX~µ\w¿þÁûýƒo€eì "þWy`fè~®gZ‚™Ævˆ¾‚KäYD“$&¦|l�"�Ĭ™?SH»¡ãÈ[sp•SBxùˆ–FÄE·<éfŽRÂnt®M7"Ä:YjŒä¤„˜|×éåÿüæ§^}îh·ÏúäÞûŸØ«C‹¦uþctÕ°a#}åòâ¾rúǾáùù†ç>wᶃµCD#8¾¾X׺2(ÕÎ%„@÷U/ü“×?{ñ¨¿ygyj–Ÿ=ì?ýÜN—M�j,Tù3+›Š•6Ó ×8Òö[‰Îká^˜’q¸¸5³t»F“ø:yoà­ÚíM¯�`Å÷&{À™Ú2Úwu—ÒF(ÓTÂ�Abœd‹F§�v!$tç©Õ?ãS÷ž9ÜéòŸ}íÔŸ}í4³t,©'æÌ%±î*²$N)¥s"J%™&7øŠÕL‡)ê™’ëŠ2§ÄÔIrtIÕ•M= ܹÆ ¬s2Qx`b⎤gŸ{—[r–’wÄ=I"¢,œÓ0ÐzEë5å ‰_°÷”gdt$mrÔà8ó¢I¸«ŠÁ–¬vaÚGÀ“ãü›™$ZJË‘P>Üâ~ÍÓðISÎuð:b¤)Ô1£C¨N}ˆÊe;€ú‚òÅDÂ2¦WrÍäÚT©Œ�Öl¯&ÐH¼&…l¦T}DM±* Í>ÓR[TŠÌ$Ü}¸ùL€ú!C R…ŠØaËÿEfõ5nMb#œN–BU¶'Ѹ”]jQ•°:&ØÈ¥Z#< Ð�8m… —‹Ô\ìÂ~Â�™C½S�zsZ°á*Ci Ë'äÁ6hBì� PuªvÒ«½‹†'§¨­9tE­Ûµ�”Š4+ Œ)fPƒ‰`:��´Â›ædõÛÝÎËû[ÿÖé§ß·¿º’9N;ÀÎ$FgÇ~p‘ÉM²‘w<ÃAž¾M“›ª T©÷ã-‡f³ŽìÌ&ˆM$jçÁƒ4 iì­Ó”¬EDõÁ¥MÍ«;±1ì`Ÿ¹Ázfa±¾2zbzÙΚ„÷Ëgþ÷OÞ|uÕQœN£¶³Ó|…~ýá—ì¯:95Ö½Rè¨�´6â#jï®<1Õw£ øX®ž?œ]Y¦Wœ>^gzð¹Ýý©~aAêÒìâ׫=RÍž!Öb$Q\%ƒ?O¥ÄLKˆ8¯¨ïµ¼tí�P½­Ð=»™ihÃ)2ö`i G!Rü îí�Û?+Ú˜ÌDHó�éÚ¶¥8aõr‚(Ë-Û+þƒ'ÏüŸ_¸i5_ouÂ3s—RGi–J�ºÚ¤9³0Ѐ'*.5 0U(o«‚Í7Åí'È^tzÌ$âS/ãѽ©‚©â™ÞåU?J‰Ñ !w´Î9͸_ä¾ÔÊ3ÑÀ«%­V< ˜B$ƒ ~4�br~ã¡Ua—BÒGÑ®åðÀu‰_w’˜}øH^csfÇéU¢�]-óp­è' Û:�šÞL†#ÜSAÊèШnö²GkÙL2õuÒ¾'d ¨æR®¦àße+§UTeßÄ4Â…DE¹ A“ÛöÐpâLE.�I0FÓ“ÙŸ<┲tê�›QÙ-b»GÀoczÁl•'†‚Ûl›8�©3§·ùÕ8PO >‡¹,ßO–-E¤îm+ÍYOŽ©ÚóÔ¢¤…ùæÌ�Û“Ž_„ÓþQäìw‰RÊ]/’î„'æY—zNsb&ű+sè²)ˆ«Rò²»5—ÅE„ VÞcS+»Ê¬ØÀ„_Ǥ6ù£F¬¿µœÉ0Q¢µÈ`aw ”S^Óѱ ç<ÝÏæ�X$3'‘�æ»ãž0qtÕ�‚‚•½«¨šXRb Ѝ"Îß°:o‰PÚ^Î^z>½ä¹ 9cÙN £§\G;F…íro—z‚ t)Þ)Äý ‘0vË»}¥ è('=M+¤DÌuz¬.Na$a{¾:³sÄB«�/ìfI8É'˜©m®£˜Œ"c±&‰Bnøm£´¶9Á’¯eä"ŽÌDD”’ܸweÞ Btñ`ûêñB;B$áF—'¾(ám+#�Ó[]ÌR+‘`‚Þº‚‘‚öɦ1*¸_÷1ÉàIÙÄÔùrgM¢Ñ¥*ƒÞcͳw6˾˜€ŽÇ&eò¼ÃáZ©Ãb ÖeM—€D‘Oš…ˆ‹I'Þ¦ÖÔÕ —††Ñi¬ü…3‡ˆ‚…2vë×l”Zãvɸ Õ‚}‹vÅ=•çŠÃýM¡6 ÆSmðie•®€èÔÝ@ƒsmÒôäW$Ñø¸ž°«8¨÷�}ÛB丿FPbiŠ3€öÚ6—4€�0T hS VePëðcÞCŽØfŒ�$i:Žy6sû·²A©§~ÑÕp@#%7,ÙÒ% §˜ Wš‚·7ˆ ÐÈq*5×ì'ÈbœTY¹0DˆR“În²MòމR']ÊÔ §�¥Ä}J³®ëX+±uù>ð‚¥�:·áäKØQîŒ�¿ÖÅÊ“Ëÿ ü‚¥2ø¹¤ës¬qhé-üát T§“tYKŠm §5ÉÀ‡Ç´Z‰ÈhQ YpµOâ9é¦D…°Êâfkëh¢Œ­I^›…OhØS¬Ot>ÙÛ‰ƒTªK¶Wp»æˆŠ±à¤íCÁ»·Æ¦u\Ë` “·I_àIé™L6ÁqfÔ³#F‹>íiz†½‚ «+cƒm§¬ udÜQ O¯Ñ$�c”©«L„ {r0³z]¬áŽq�®…²ÎÔ9˜ÂLŒ`ÅZá‹HÄRA"ˆ4zÆHoik2ƒkùR¼hz”›yëkJ ÒÐÕ\m{¦Ñ%{®å:V9§ýDZޡ9œ(%B=Cu-Šwà Q±°öàXÖ.Ø~ÁPÑÔ»4nj £Zx…Ê“ ŒaÂO^�šÆS˜7O,v”x&D¸ËÛ`„|¶˜¥Dª]…êh3DÃMU &°Ü£–S]LÈ´k|(ÖÖ›ÝÞ=!«…PEc´§±Ö¯am�¸$m‡�¤ZžmH =¢“Vù6¡°%ˆMVÆs¡¾4DmI’†k/y5ÉÉÁ�#ïZ< nŽXÍ·Zã¬�‡Êê>´ÕalTÙÍk¢¹‚q{ 7ð?"´I¸ÕØÆ·Äµ§P×°§}ã³™j3é®mŒ5ÍNt/x_­?Ízƒ}0 w¹ïHº5w™;îRš§4Kó.©�aíÇbçB‰%Ædj²Ýô!ˆÙ‡tžÈ°C™K«KTØ*N,f5(+CQpÐ�㾞°¸ á¤9+'×Qb^p}šhȲœ‰ÌòÖïËšVKZÓ0 ;X0ª) oè÷6EQo>¬!od(T¬É]ºÞ°ZBáÆP"H¡É6BՆú«èÅÄÖºƒqœ&") ¼ùÌPpEÓ†ªƒ™æÅÓ¶†/ð)�ƒ•lg�¨f¥R©ÕÈ#íp0„™™æÖJ¬s�€Ýäâ�|îÛ6ÖT@ AÌJ4Р¢M<9q £9ð8io›<,oVdf’ýÀ¦jçÆ>3Q-&:êWIC‘¤†Ì9@#DŸúÁN`÷;Rì7âÕÍ®¢—7 ZÜC¹iÉQ\èD2šAzð¸TD×Ôý&Bm Å<'¶°ç,DÖšÇE5½—Hð±Y&²Mfƒ¬=°+¿Þoä9nL‹A‰âçÆè®y\£j«œ°õ—òæ-&//8lÈM©tÈ �=x‰]2PÙÀh¶åÆÆ¦óòÑrF�…îõ+¬xGiçL¢Û &;9¡ÿ‰TÁ@S,¥À¿¦¥ â�Âêux·;[䃇ÒE»bvßC!€$.7š—€Ù)=Ü �N IÛ «Écc{©ø¼¡žºw¹[#„EFcJ÷±['W#›Zˆh²3ôâR7h)$6EÏ:²P³‚ËÞmñ4²�^£Ôž´ UJß�S;Uñ¸Êv­kÉØ‰ŽÕ ¬ùê#€¼-û÷‚ŽO¶ÁÔG+Û–æâI´rØq/*'‡XŸþ`Ÿ4úniÁ&/s U�Ûœ0ˆÿ S^S7§)£�dSƒ� �Ö 5‰8[uh_•Å0Á"¥7ä™ÀÓM8H ¶4¹é\#2¶š0SbIÝŠRæ™t]š1/f‹T Oí9+µNŒF{.¯g(ý1‘¯\¥d;Pu\«S$5»È¯n‘Ò\¸4Jêé ¼3Îê ¿F¬ä+µºfäªnõ ɦ{Ø£Ï�@9¥3 ã®Ì¹­«w̳>‰HY'â^¶·h/ÓjI«cZ.9KXE"Hõ¨JUeçfœÍƒ µve–†çëxÝ8˜Ž#@ã°0ð¦x¡Ó§r“Uµp­ÃÈrÙ+´ÔˆTZî÷TÎx8PH–‘«ˆÍ´�¥QlB�UhÊñj\®Î¢HìkS tŠwp§qÙ FŽýV©Å/’§Úr­c|ȹ›jÜîô˜j©•Ä�뇛–JDC7>,%Z“Q™3ZKñØ"]¶LÔz #T$XzqO¯´nÊ÷ñ“VS<•b0,Éímªê`§ÂCóu g¹À®;tSçêq0©¤â:Þ�f£eŽ*>£ò}¢2 ¨#ÇÖ¸=:x$�Æí¯yÆKü€aKÈí˜U*¾xM¤`0¦Æ7|FM¥‡E.o*«�ÉpÚÂ?Æ-K³Xç í¤R4Býre§~,N§3Z1µA e�MMÄèëÌ"l;l£ª¬°74\vMŒ1PFL�Hçæ¥¢’�(#£¾…XBWþÄ’T=µë¸N¿`PG«W'+Ó#'íÛ±�&’%¯9ùë•yÄ÷X??—a¤¾"n›O¶ïý¨VÈžSuð1!…Õ­‰4_)”UeÔèšrfî;¡´¦^ºŽºŽ·úYŸ8•=à˜E—™(q-Ù²r-$V3($b+È×ÈÄ�v•ƒ¢þìr›‹ƒg‚B´”8A§D³0 ±ˆ$¤Â\ΓŽ S&ƒªä!\-äÜy* y\˜Í"ÌœˆæU†q_‘eµÈó/2Ñši¹t·a`¯â& Ã=Û›Õ~=éÖécÒQ„Æ›M;åËʹj{!ºfË+|î¤Ô�£ªd·bsXÔgG™.ÜÚG®”�5ÍŠÕLJ}�W�,¤vk”l$ÞJÞ‰úŠ àøì#Ò;±2VDU6XL¾‰›@j‚Ë#9L '0wòOçR QU;ž%€¢Pá-V3 õ8…ñ†êkV¿ây±n3é3¶ÈÆŒ¹!Œ9¾?^åðÙ& l±\láN[õzßñ¼�lÚæ íåúA"ýï£ZÜ—€‰b–Šj¡×‡Ö§î"!¢Ïƒ:Ý|ÌšÊêo�kI`£WD¦9~%T®¢º½©¾„<È3âÖó¾|c7àÍj8sÚ¥-EdÈ¥ÆJóK‹QÒ¶´Ý'&hÝtRð¨�˺‡Dl÷±Ó|w_L6¦bôµÈAbPd¢vß�:ø4rW�úÒ˜‘јÁj=vƒ1Éž’…<ÌÝÍJÜ[7j%ÁG£„º�1I¶Ù sH²p²îAþNÆ�0ºíƒddŠuóâ’€”'S¥‰!¸æ·Ioix&·^I)SZrÏ]Ï‹¾Ÿ÷óÎwÏÛ~'Iu®[‘¥üV S--¨árÑn&JŠun*�nVtËhÂ…E8Ò8Å'´´<*É£pS/`r”’ÎÕdŸ¡ÎCÞg¤ž:Ä�­+Õðb}Á�ì¯ÿ@:õX…Õ5RÈ'O ¥ÞB»‘­È 8ôPö^§�xMýÐõi{6Ÿ×â5 ü¾ŸÍq®{KHJœI,]³F�.[ÉdÓ4„øqT�tS…F!w±¢§dwOp¢{ÃM€Õ�`ƒµ‹LlKI�²zf4Zgœˆ4Q±Új­æ+ÞRÝ®®k¶’àq+Ld�OhÏ6( SO4ë’�¬DÒ–ìm­eyÄGG4 4a!"ñduìÖ<TV>'¬(è¬�›r#G‚(¡Ô &>–¡SÞÐi÷ R^ÿƒ=¼�ƒ€cŸV¾±�#�/bLQ�Y³rº*'OL�Ó2Ð|µ3 ü>V×îf'‹Á�@ê&oÈàQJ“�±7…v£¹ÝxP‡cc�½[*•.åÔ-y¾ì²³5ÛÛZìÌú.Õ·T˜¨€k} 3ƒU;¤Ú¬>° q´˜DfNXÍQÖX3W£`+¿"™S"¦Q bxÒeÂøt3ÎÕ4`° 4Êh z&f.;»”V‰\i{ñ;!3Õ5/$]·4€ÏhÄœqØ*}vÌ=s"ÎIh&Û»¼='É2dQ+RR7bp°ù@Ïô¢O{ûux%mL¢°P�Lðg½Ã�šÛDb¡Äê‰ÞTt¢UM7d?•©4šWèø“x| f`ÍͦUdjÒ¯þ$«U2`žÉÎ!qÂã“zfD† Â8� Xf0Ö«¦\ÍL{Z[ IDATQˆ ~¦trâ¶‚Í·��Σ­6:¢ëÎ-¥Ð0‘´] AW¤+nf¼Ù�@˜Ž¸\˜ˆ9�¾Ñ‹=N¼çdGzñ-7`n_„ócÛÏý·»Ï?“g—¤ûÊzvG¿Úâ¼é~"¦úÛZXÚ¨ŽÐwy}ߣüÄ­|y/R�ôàÉ6B�NÖÆ0ÛÍñá–ŠñrD)ËÐÀ4¤P‡ÅqK÷µ^‡Îw?6|÷ùÉ[øÒž»½`K¶nêØxuä@í ãNlÞUH� ÏØƒÄre³!°Ç^zÁ>©sëÉTàÛ:Šó9$´d RñÚ×"X]¸:›@—Ë¢ž­ÅG:ãˆil:lkUåŠ-aa9To”Fþ·ÎãØj|ÈrŠE‚A�Üâ2þ%ÙA¦ÆÜÁÚ+kfV‹°N¹•Þ\ãÆzì´™sEJ]Zd!Fü/AxµÌÌ0 kêf¶„‡L/"Ãuò÷@MM}ºþØÀznÊ6\%ÙŸ‡E˜’0%JKâÏÒÖb¶Õ/ÕpšU¢„¬~*ú:´Õ‘Ø—·hBcïœc¡\Þ Æu»h&�kñ‚3iÕ®½ZÜ¢L.•\sz+Î5²òÏOíRÅ»ÔC´{† Ñ/m2V«×D¤Ï[y~D&:ÓTLjµsÜÏLÌå I'a¤¶ªóÒÅœ“ YV3Ú9G;kZÑáaÝ–ë^t«'Ÿ RRæF/_·û§j“S=ùGÛr[cmÀJݪ¯Øe�4ŠP]4ÉE3�õ:GRç‹^ÖUÂŒ=¸’~ NÉ|6„. �ÿbAÌb¸‚ CjŠÜl †íû�tŽ)ÿ»žCÂÇ©”2läæ6�–Sc¢,Èüºg¢åûçGW…zÿ¥ÿéÎ ?yé–§òl3ùR)°\Vb}iºá¢Üülÿ¾�Dçj)ç{¾2¼ñ3rÃ:žwŸ½'}ìµ¼\Ðbµú¾?áå¼ÿo¥åŒúõê»?À»‡ý{¿“޶äÌ¥áÍŸ”;ž’�Cº²“>sO÷‰×Ò²Ïw~uý­òÕm¹ó©ôù¯ä¾GùK¯èÞ÷mÌiýýïãgn’³—è¶g„$=rW÷á7ÐáÂímJF”$ßóh~ãC…Âô¹{ÒG_ËË9 ¥'^ž~ýÝtegý}R{ª0c)U„ uãVg/þi”:9¾K2ŠÑåz©YL8‹©‹Ù>)†!D!CÚ¯y�b7¨_R±I ê2«Lt¹S«Q¾ºäýÕ}›¢9·êI<Ͳ8¦¹J9Sç�¦‹œ¦h½ÝV烬]΢K«Æ…nŸ f èJšN5*’…èè•ì¶$ÄØ;ì{ Hå]iÁ;ÇÇf0kÁÏb%$¾TIÌ+J³æ)V㣉ï߬~[-w´èlùVH£a3 u֬ �’È33/™W4£Å¬ßšíô]ýõVŸcUó©2.“@�>–V ¢:© ù¶N6ƒ&Ñ2WmÈ|Ê Ù~¨°Z\¶½Ÿú4ª­€‹òL£î+ lb|ô_ä…Å ˜;i¥QÝšÕE^k@¢0 ª,ˆÐÔÝqW¯“Tn¥„r·3·�ˆ½ßШñuï Dè™ßüII™ˆhÙÓå=bi9Ô ™ã‰ H¯‚ÂDÄ¡aÃÑ:¿)ÑíRŒ µ&[©ê½ÄÖdåO¬€p É: @OöÁ·¼ÙÙÂt Gj5‡ÔÝð«–ß<ªo¢5KyM˜žÅ̱Ù�PÖ! úHÜ­y#«fàK¿�á+GIÕ…‰=6ÔutÇ’%Xü‹> yPŒ}‚’ÉÆÎ¿Ç¼)Ê€f3†q–¬Wû…m‘,2 ¥ÿ³31|F ÉöX.a Ò�v— ÜC¢¾V«uVf %ÎÜQ¥ÛöNo½doçÔbÑk9&âÆ(Ržâ-çS, P'„ºâ^wÍZ–Zé*Ö^V„ªß€”ÂBL�Žr‰%\Á¨¢«ˆäâ\³L·l!û™Ië±|°A�WD4÷Tu;�p©l3¸Ú}ýìðžîøÿ8÷Õïš_æIÖ¢‡ ‰ŽæQÂDyûªÜõX÷ùWÒjVï_,ókî?}/ú^¾²“žº¹ûÄk†;Ÿ Ý"âçÏõzÓpÿgò>=¼é¡þÃ÷§go,ÃòÁnzèÞtþF>Øá¯Ü–¿-ßü\Õàñ=~ ?wŽ¶Ò—î�‹§iÕÓÖa!(=~+?z ÑåSÝ_Ý'¯x’OÒô"�-VùuwŸ*nIŸxM¾óqÞ;¬<‹Mx@¾݆õ©¾êŠ#³¥*=h!šgÔØ§8H$ai?óÆ~ç”â-'¨ðù.qÝ x¥þÅdËWàì+Z+«}—Ø'ú˜-SªÙƒM wâyƒ¥Zò)IŒee8ÆÀš ›÷XÜ5°?�ÇF>­ÿ‰V3v+ïãN¸ýàQÁ¿ÑœAPîÐC8£Å3Fió,ji�ŒhB*•C”9�vÈ56¿æ•�H†iÕHÌ¡æj¢¨,–§iP·ÜVF&ÐÌ­R.xF˜%¥%§ZmïõçÎì�ÝÞZtÉ‘ö!ZQ@m—ú7e}:0{Ä©«Ìî?ÕùH´™¹e%Æ^�Tw…',íÕ©˜‡ ±vk;ÉDƺ�¼Ä5¡îa;É`ŽÕ³RœZ°¯ êͲ\�ެ;ÕQÓ16èE‡³Ê¿T„òÚa0b;Wµ™•�è‰í�ÍQ§¨óéo'f&šÓî9yÉ ¼½Ù ¨¤Àæu»­…ãè¾ ÞM”Žïšb/˜ö¸ +ˆáúA V%Öˆ¯uD.ß•ë%�ª}‡µx ãŒçê䤹䷹Rƒk³#¶„yôXBSr�Q;K¬ 'ÉêZ%`ÁFä±`÷™âÑj»m¿ùp0¤ÑŽm“ᆠHm! âe®ëqÙ9æjb tÖ“¢j¥b&gDO؈MWGÛ ëœíú¦f�“«îÌÀ™˜Ô�ÖÄü’.îÕ/oµ=LÄ Óõ½~_]Ï~ô…ÛÞ¹¸òÓ§ŸþÆîøçÎ=õÓ—oþµƒse|//¹‡x ‰ü\-vØ’:Ýù5ê$=v›Ó½s”OïçoþógêμšÉâ˜÷÷ˆ˜y¿ìüúÛ?‘þêëéów«*Yv‡7}*¿ê¯y¤[¥/ÞU;]'^Íi¶âuOGó²·Q’"õ•]¦®É•IƒìðåSAG(ÙÝC9µ?<ð©ü€SH«™Ì�™ö¢‚à~4oßPà§Ä7žj^$uË�Û½bNˆe@F¶èžÏíu‹¾Ä0Gµ¢’„Nj¶À ™,¢RÒžƒä3˜¬ÅvšTàŽ¦3M™Ê�'”pxÀN)oe»UÄEOFæA¶µ­¿›jü°²’è‹n좷ÇÌOÚÞ…tÍH½®aÁ0¢$ÆÆö5&}B)–]¦e{Õé­ƒOÁ£ðËÒHÏAŒ›æ®(ÓCù.ÐLÍ$˜95,jT‚3-]x·˜Ùt³wkƒ,â�±=ÁW½‰Ñ7Õ~›µWÐÓÏ÷:Yþnká—[_X/þäxï'öžýŽÅþ¿;B{•ˆœjú(‰¥k 3ù ç9ÈD$D’º<À_º#äW¶Ý 1ü«Ô]þÕ$ƒ¨ÇÕ ØòQ�R£ÁF7©"Ò]—ð4 Õ–^=jÅL³8Âxì©X 7:å5`‚•>asÁä†äÀ“Mؽ­¿pÃ’HQÝÿfMj�e|Ñ·w•¯9l7ƒzì|¤ÐþeäP‚` “‡I»ñÞÑÚ¦ä´ß&P€â¥Ú¡ª�¡J x“ùžQÓ«ƒ!Îm€ÊF(¯¤[œ€} Ø„^·b6ë w%ØÞ8�O5y¢@̉֙�©Ï[[ó�Ùnýr ®%q Úcvñ™¡ë£¬�Q­®C"™)I&f{FÛ3ÍUÜ#4+pëb꘩þDº”0a™£=xP>íÀ–X(ã¬�jy`€9¨‘„¦P‰ÄƱ‹ki‡)Õ¡»¹3 aKwÁ±&FÌØÆÄbq7�ILm™qGWMÐ õ7NÍÀ¸Ê r_¥ž™‰EhÙËâTÞÞå£+tõ¨âÜI-6Þ^¼së©.Õ°-àD? QM­F¿¶·°2(�X΢•Ú§%\8ËÓÙ…21v^“¨Œ*1q^nfVfXg«(ÐÀ*=K¼¸iÓóm½Ô¤Úc±—ic-á·¥iÖH„812L`’Õ=7Ød_±”£²àЉÄI愦0ØÊUŽ ós‚Ä{EsG¬F$#†xüm´Ìq€ñx³L�³^&å‹q?Ò2vknn™ú\S‚DD[,ïÙ¹ð¶ÅÕS)w,çxH"—¥[‘íÊat½Éôa¹À¯¼ô‚Üp1=r·U�ˆˆ·Óþ®œ»ÄWvùò)¾¼Çû{¼¿ÇÒ‰�Pίûl¾é¹þ½ï ^ȯÿlaP¶–tÓ…îÓ÷òÓ7’$JYNï×Á¦$E¯rî"õëJëÙ‹œ]Ý6ßÍW·yWÎ]®îŸâ˧x�0ƒ·Ðãñ— O<ãDMÃh¼$E:Â�!šyD¦ d«A¨�kEœG¦É:Šøx‘VÁ–ÿMH¬Ë=h!Ñš[öÅ+ßJ§>k†„Ááe®è>yâFܤe Ë·šþl5�á?=!*:X㢅+]S§†Glß|À°Ç5Ñ&Uà‚¢`Pº–*Eüç»#õ3èªõ±èÒ´['àîœaðª’õR^óHfVQŽ÷RA.è5˜)äÈÀ&lM× XÊyvÙ ãm6¬¹40o\´r€~&Hw�éÎ*Œ?R;©¿ÉZ•¢Á¨=tużGó�ø 06nNVï³X-†�o!‚z]( �8ly‡ñ§Zz>q7Fc'[”€S×aY4pcm6õWtô• 'ÖÛ KìÇn‰žQ5iø‡¸bw�^ÄÏà„žôް·v,|³÷¦‰Ñ:eJ…l¦ DD½ˆ$¦ïغò–ù3åÔ›fÏ ý¯œ[ëFT,Ô9QJf¾ë‰õ;?Ô¿ÿ[ø‹¯€¬F†{¿LçÏ¥çÎY1ˆ™åx–>ýêá­ç£?|7 ,7^¢Ýƒô™{8§üЧ֝ÿlÿÿ~súÒ+ˆeýágn࿾�W=n w?Î_½…2åoú‚Üþ4?örŠB�f÷–ç䛦Gî¦.æ7|–ÿúvÚßõm7p'’²¾P‹i9KŸ¾oxëÇøhο’–_à½C~èÊ]#h®¨,M ´Ÿô· l­»ÄÜKÈÒ(¿ùR!’W²aF½Ò�ëÉ:WbÚ=¯c›¦¤®àèݘ/Ô“XY±Öâ[‘GŠÇ‰-«7™¨–´´Üå=ý•ú�+M­§ØˇÔiªj–0(~~yHåLЛ]ó`ùÇR8™«„‰[Ão°@|‡º-ÓÃõ†‘éúmMë©qÐB”g|XI7‹·(A­z)]Ñ]#¬ž–wH-\ØÐuWŸ7`¢cáU?ïv··f]Gå±M»ØÄm�÷‘qnié²o%ô§™­Ðçµ>µc£l*ÁÊ%ÔP�a§I­)é©ï2™yV=¹ÝÙïoWØ`P–h¬Ò�d°˜+\¬óu±› ›Z;,ò’²wÅ%Ñ,Ê¢)y˜wÔ€ÈzÐ gE0Qï‡`‹>E..6uIX™«¨Ú8u ôcÅu!Òß* ÏÑ2É|Ov÷º+ûùðÈ—éãq�˜ä ×hbÛ™€;hÄ„ç¢ZÀ6¯¨ßÁð¯zdÀJ¼<ÎÜ`NâT!ž‚U»²Õrƒƒ8ñ#¨Uj‚‰’¦Ñåßìõû�Aúv¹º$ç꺮"@VôÕÜ­·Ú€‰à…Â&ÂI{½£åøŒžŠ—Äi‚)@œØ :-þþš¦;«�Äa-ê{ˆ‡[´±ùZc»,’aÙ„H2ÈWZoó!ºøš?·´D¦˜¤ýH±ð ÷àê «ËU{ê‰ä óO^zÙ›ç÷ôGß³µÿ›‡gçðÜӃ男>ª®T‹¤¬çj´�ÓWäΧº¿NVÚOýq]áÏ|]w¸Þô�¼é!b¡ §ú‡î!:}eýÖ�ñ#wòî$"þòéÖóÃÛ>Þÿ?gyÿT÷ço\¿ýc«ùm:ÜJŸ¾·ûÔ}rv?2•asƒGîÊ7]Èßú 唹»ûàý$‰fÃð7ÿ,¿òqêWÄ$·œ—>MNu¿ûN¾p–?óªîpž�Âî¡ûêK¼ö®ïåôê²ÜõD~Ýçø«·tïýN^ÎAµ?¡ybr 'UUcñUº0—õÅ/+  Ô(È�ÂÀm�¨Hó0˶ €Æ‡»MM¶f*?±=Hhæ`V|NHØ „^±(»Ap©7fØóO¢L•÷ýZ€ ÉèÒ\=~]V Py¡M+”o|¹VïǺÌ)<ÒÎYŸF5øM°$ Ïêb\öÑÙ · 2Ðhcúú¶Ôñ<1¯¸ó·ƒŽE¨"š“8Ûn#Ê÷‡”¿ãŠ*XDòqî–óíÅÞb·Oº%Ös)aKª'ÃÆáuT¡ÄÔ‘,zZ$¹2ä£!ÍÊ®ºâºÃ0”ƒ8èŽS±×"ƒZøöy#™HE‹„LÅ,tk¸îÔ*_µ""µ†WìŠi°*¸¨xÌk&�³gÖ·¤¾T¸Ðì–“í‰F–fÖóöfnê�j5MíR¯Ù>“lŸ ¥`Çl†T´Æ= 3­s‰äuؼ!6›gf5A%;¼¨›œDd%ÃÖiÞÛ¥Ëû|tLñÃŒãô`ãµ¢DŒ¸:Ùj0Éõ¥ß¼˜¢Dq(T…PRSMNÍ»* ®tUk“@?ˆ—ÁòôƒÞ…ˆfùt8»È˜5-+~[©>ԯƠ):ž��ÁiÒ“Ý £F|µƒˆôWJ”ef~ËÛñ±åãÌ�åõ½÷ü/]}ÉùÜÓX ¬‘©¥^— 'Ùb·ºæuhœ»Æ‘ˆ·…ËúK¦ùzýî÷ñ3/é>ð@kÛ˜ˆNv�0Wáè¤l‡ õ`W”�§-áQ]ÔДð4Ø‚þÇõl0‰@Ð ªœX/ƒ¹éh`:�œ¶}�¶­hD�­!�'Öð {.bºñ'­¬PŠ"‹c/jCFT! _@˜BþÉá^é‰5J�ø„'ŒDcɶëÞO›‹\ëh•©Uð‘!¢øø ™Ð&\b~Rm°8C)õzÆVÓ}�–ð›”¾ˆæ 3�Õ¶äúÐì]l8juybw,ûM¨ô±€gfWLs¦y¢Ä”‰†LD<ˆ BƒTK‘ vjg¶^']n“švË2KÏ”V|ñ2-W›.äô/þ°Ð1 ì Õ@ÂT; ³ I¹›èߣŸþã`â u^”p|�d-Ö&&èHo ÍáõÛàÊ`´J>¦Ý±w›ý1™Yl° ‚d%®[×w„´ØÕYmoúž |5¼È1ãr¥oÈÓ*ùW¨P0=ð›#Éÿ¯ÇÉáOÉdÀ� ùÓµF™lÉÄ5(.õÚLˆøbîzÿfm\)ñÜÚ½«é9d–1ÔkƪJëöħ–;Õb‰Q 9@­ÑÖfFC£dÁ5¤qT7„ôÈʸ°h‚ûºÂ6ßꓞ`A¹ ûõ±¬‚/QL++ã¢|ƒ”ôm»`‚»‚´ý¨#UóÁB¹2J0}€á)™ØùˆSäÝ¿z@×ã°ÃdÛ5mнCD‰xèëS–#à–3ÌMe”3èϘÎ'y´Dº Q«\ôm`+_U2Þl¹[}Ä„éqFaŽºsmÎ@7{d¤Ü;�ê¿ß8¬¤ïÆ�‡õÓ¢JLû|­ÞA†U&,C–#éÖÛ;[»óí>¥A$[.g€ó^Éå}2FçÙç‚Ê„u妩+63muÕq� †ù¤t[±‚(×Å ÜQíŤ~TÖ\·Ñ›ÆÚ.m*%ö»Lú6"ØÆƒò¯.cU¤½!]¬$ÇÑí«8‘š@Ú/¡j–TïåªëÇ#¸•ã"й¯†º¬žÉD"ø_Çá�öÄ»6EòB? ”íX#“>RZ¼ÀÞSVÜÖíå- 'q0£ÇËb1¡±aZU¨×=$M뇴ßGR‹”¦½´÷Ž7™„K�+&Šù%13q_÷¯©ü #VŠBØ.ô1±ý¡¸E—ºÇœBÕ¯>ÖöxYç® �«Ì ÊKÆ®Œ”f‘edÇLöÆ#“ƒ›P d�T¶bÙXcºA¦‚ДTÇ®e(iëH>¥ÄœMçM¾¶N`5!|¡býd#×Pkìœø×&6%É”§–%¡ª�%±UJRL1‰û’7£UoVúUx>l•Q÷Õ•ò¢6#Š)Fùš¢ù.›ÎZÑñ§BwBÕ #ã¦RvÊj¨eìÄ-DÀbNâeÓ+Ì1ÂXF|4¾jꤰVê !óÍ(‚È>Ú¶6©·x´'‘<°dáD‘¨¦k4 © �§�[D úÔˆ‰%Ã!õyggÇø¨À IDATqj±ÃÄ™Jå²Â*†X¬ø4†HH²PbêY¶zZ$b¦µÐ ‡ùÂþpéJ^®dÞ;�]Ÿ+dZBKc–Óê«*U¶×³Yk1­8Öï°Naé�ŠÒƒ˜*@ABÊV›RÄ­¥ŽÚU‘Žé è¶‚-º V³ÅðžÜJ…R²$DÌ Ì8 ak3˜v[z­­³ÃœÃ§!霨–žÕâõ%W  a µÁÜ3M#£Äïh a„6º�x´ó? ðIÀBX² ‚mîî® ´qòØœ@-c°à‰B~C,XÕ Ítß.xÞæ!Šï1/Ç0‰£‹òÇ!DaäÑÈ/ŽàÅu%ue ‚>Ô¿Á�®y4œnÝ´•¶6§ì�hcqh0>‡¾¤·Ÿf~óÛ~þñå“e6Ž8õ~ÙÄ…¶‘ÕM“LSÃMLo!Bnm>!ÁÇ£Õl”ȸìÜj’ ÁdcTÈ"±ò0Ø¢{X® £ Æ¥ÐØvc@~/4°úX ÇvU�>ÂT”Ý g&�:ª–ô4EÒ¯´TPwY6(*l²ò�Ðc§ô^ãÚŸð±K¡b5n·�ÕFâ›<{|—�KàD–`µ&ʶњEd¿Sà«/OLìëŸ79 ^¨ÎçóØ&|�œ—!Ü#Ì<Ûi®”{�]¬ç‰-4â1B�J¤Èp(i½³·µ3Ÿ'&1#iWü\�È—pšu´ÝÕí¼ƒÐ¥Ãá…ý|x˜% 1çbŽB"$ zùMý<õžXG›k`Ú&3µÀ†áS·�šQÔJsmÖ¸)æg�Úʉ˜Á5pÇf}E†%þ¢ê<Ö+ à×UpºZˆ}ª�¥x¿jO‡°NÍþZêýúoD6¦%$DÓ¢l˜®¬é¹ã|°\眹Xsbšui§ïfœ†¼Þ?:ÎCΙ˜’ðV?ë >5£­DÂ4Ø‚!§úÁF„ñÙQÝ:/D”‰y•eÆ4óÅKeSø‰Ç5@6Æ©£+Ä*z@›hÞ¸<ÅŽZGŸLôÎ9uàØSx‰™¨_Œ{бZpÑ™¹ÀöÉùø)ÂöH�ÅF!-åÖ±[~¦’ÕƒXwp2®Ž 6Q¢,œÓë ÌÓ=«;i¨hÑ]íÙ� �©ò�*. ª¨©ŸÄ#“ÆýûàÖRO|  úi.ú?ôǾ)×Õ&Ò ÅBd{%Ûó£Ÿxx‚#ªÑBK 7FSYL�ó¿0ÖÄ`J ¥Ûrr2öôVER©2'3cg]üáÂ+C2³ÕáyjÅ'ÜËáV±fWƒ›„3uq,š´†Õx"@Œ�pÜeèÑ̨ÜVì‡]†5u(ÛÜ@8Î;R‹à%~Ò7?qË#ù¼\¼�昌¡ÆâwE8¶}@AAŸ%¢`š³h^nEPÕ‚› UñO'xæ£ÞÔY(;�…±(ÒýC[êÕ# TS"@1�äRÙÊkJúâwm‹`.ù5Û ®®¨'ÉñZŽwOmï.v:æADˆ³3%a4û6ú�™¤¦×D,´ÕñV'³ÄDr<È…ýáò•õ°®Éže–%‘] ïíæYêDY¨‘ ¹í²ÀdÚÔh\‘š®÷$öD×Y±-ã˜Æ8±d)ÏØ¨‡iïZ *.¡Kq£ oª¿¿nn±©zU¢{’Î)F³067ÔÕ‡|.ˆ*h.ÖçNzdÑ ÞL¶Îb›|D¤c^$š3Ñ rq-Ï GË�9[ÿ¢–´†UJ}']ê·úá`X2K’«ëå,ÍŽ]¿à½íõLÄks$Ó�²¬– Q@–“ðœi Éó|ãM|uŸ¯ÐIÇ5b¦ø¿£öÊ£.^¹:ˆˆ¸¾ž…íîêl¶›Wä!u| #ŒCH#0gª¸ªÕW «È²FìÉÀm\«;f]¬+yú‚MOšËf …ŠI8�I¶Æ?m ²³ÙÄÕAÆGˆ*jMè0ˆ·ñ&ºËÄýÀdúV�ŒæVà¦6Ú%>Ô($MNH‰˜™o$&Ÿ¥ÓD`to M648Û$®ë><ƒñª_Øh`¹…�­}‘*FuG+E^K�$¼W„ �œ0Ob(Š.èêZ€1b¶¨¬Xrqéì¨@�H퉻æfGšpÐÄÍckn¢¡J×c=Ç['ÍopŠ\¦®h5°{š¬S—�é ÷ÑK’e‰ÑÍoǬÈÛ[óó:¸•ë%a˜™zÀQ9 RiÃ0‘¤ºY¥è‹Mm€@žâ‚ç_H§­v™3.”öT@w’Á†u­úAL.ìŒòªÊhËBñ¶0£š^Îsö\,:ý0ˆ1Ù² ¥t^fŽdé Ã: Gû2#k£ìØIjTÑhÚÚ{<}¤`”b •̳ãÆy2ô¥Ÿ4�d’á8ÓÑöÎboût—XˆÖR_»Q~Þ1Ûjk„{+å YR¢ÝŽ�tLYdÿX^Ø__=È”-Þ:˜xal.§¶f\6õ’-癌ýÙA²ÀMºWDA\H˜“ýnŠ…ÀbpKŸ5½6À®½¡«ã×í®}�ªås²=ã$IßÄǬóf5Îò+îžÖk%štH$lå^Î`ÐU³,`%3аâÒ‘º·PýW½‘K�…Œ�š¶qÏy«£> -Ež_Ñ…ÃÕr5X^ç²×‚ pZ Ã,ñ,ñbÖëÕj( jæ�‘}ÎÝ…EwyÁ»[étÇL´v»vt±Î59eÒÀjrï˜;â¥Èâ”ìló…‹²šØE2ÍâÆæÃÔJñƒ¾ö˜ E´ÿðྚ™ve˜gçÕ¤¢ÿ3¬Eì€ÀÂÀX«ÅM*µ1D<å€)ò¦ ¡>BÌI€fM¾A~5¥f¬s«�€2I½Ïòé*�DàQß»0Ànüö ·¡}Õ™à»É§˜_±ú_Ó}Ðbq3T1<–fÒ«_‹Œ°�+ßË®aË#ŒÆØèñ)pÞ| æN€ýr{c{xô Ì b@'ŠA®ò§w@fÂØ+›4¬.ÏAZ¿ã_UûÇ’¶Q©Î:©xàhó�¾`<7¼�zÄý?4’»õ&pÓÔ€ádô¸yÖªÔ\«ªd«�Ù`Œ€ûZ)„"1âlØç€‰v2f+Y‘Ù@¬Å{}Ælã¡]�Îi›†…CÅn§'jòf±±`ç FK²¶ùC³–âÉ¢…W݆Z@ÕaÎâö\4Ú çv¯ÑƒÁ5G±Ìj«eú& ×*aË"±Š‰ÜìË@zK€'E‚#j´Ÿ-ê‹”ß`¨!oࣣžÉ§£KD™C›r¼ÎdNÁy¹æÛ³Ó{§g)•¶dIæŸd&M‹¤5 ¡.Ñ¥Äë,® /쯗KÒž +ÙvjfZ ¼{F}'î—&Ó€6š {gn]ÄVi–’‚ZýŠYH²¿;UÈ7�h9AÓNØc_«v„«»e’DÌDÙÌL@¿lÑNDÝÐ1¶æC¦br†5ËQŸôm-öÓ*–Šó_y×ÐävEÖ­›µ”"¥ QD¸O´Å2c¢e–g�åùÃÕ�‡Tø†­ÛUýµMÉÄ«œ;æ>u[}¿^ ™…ˆSqf:È«ãté˜/ougéTG”x=dNI×uõIÔ º¢Qi4c!™1Ó²“oâƒ+tù ¦ÚÓð¥¾Ðà“ÏsL¿£C@OÚy=o¨fµf·Q²Ðe¬ê„p☠ÄëPž¤"dÆJ¦èþ¥Q1$ˆ¤þþT5˜O"Íçf›H¬sûW[‘’ØÖ�B¿�ƒ˜lDÙ "‘WÛ\ƒ„´MLz'”®ÝVl±°˜̬š¡Ú‘G{Bª€ps_ˆ ã¹$GIŽ�Fâ�h3Ýua¸„›Ó%MצbÍ@,J¾Á‘ x…‰¤GOôš`øÌ’öh˜Ë´OÁ}×ïÄA|!õPÀLëÚÊïWjí»Ð‘à ÞÌQLjewÑš+V9”ªM³ã¥Þ?b߇° XuhtSªY›ZFćSfÚ ggÙÂjQìcS:Ûê ÅôÓ� çÍÈ5Kî5oKÓº2*Åb„`LBKð®&p B7¥®\�éHëî!ø :C¯×0>»yy‚%k�e’);Å䲨y??7@©}ÈDoSY‚Âèôám­ZÕ"`ÅÁ*9¯(uâ6†Ú°²n ¥z+ƒuæ#ëa}µ›ó¹3{‹¾’ŒìUL"K†X».Ù]"‘YÇÛ=/’0Ññ ÷×—öóz•+ÑâÕIv^ðfrj»g]z“ŠŒ’¼êi ˜S(ž ‰0Q&ét£S¡9×÷–s§JF¡ßHµ™Db[9î´‚dqPŸáóòg!Ô~O¯t•½–#Z(g®/c©Ó*‘Šlw�§°$¨U@V 1²á•~�‘¦ìBÜ3muå™}9:œ_8Z롨m Ýê­å´bf‰ÝÃIdÈ2$é™}دò2“OtÔK†Ì‡$Ëá|Ÿ.nwg·úS‹îr°2ŠR_ÙñP§"3nu|<Èl—^ºà i=¸Åš¬t¶RVâS¬ÑX[1ÍOº¹÷gçàΠcdšìB5×góSRY€n M7bõ¥"-¼AŸ2@ƒ˜iG³iû÷Ûäá[é«ê³ KŽYõ/2C.X¿‘�~�†SÑø„c²ù„Ú®ÙÍæË°%nO´ž…]˜y[¤ñmiÚciWO`2e†gR£.þ£�=!÷Ã7¬¶ Š+�-LÂ(áy+–[¥»ó®w].³[W“�p9HñÁZÖØá@™,@ë¶äÅwbÔü¢,ÕØÀZ)œd‚åZ“d�[oêRþÇßó¡}ÇÇ>ðÙW¯gp•'o¿ï¶óïyûÇ=ãÕ£…Ý|æÊO¼ëÏ/l?sétll†IL|zëè§þÎûOo?òÔM…Òï}Ãçÿá[ÿâ/¿|ÇѺ�À°«„‰ø]oøÜ?ûÛúà—o¿r´ˆ´á(c¹È˜‹ÿäÛþòþ»ŸzøÉ›‡\+ b‰�Í@!þ‰hèŠÝ[†­È2)+¶D­6â²®ì?¯¡tk½K×J”ÄàÍ®›Ï0.¡™±VMu’É6¢K™j õl�ëO­zn<¢’˜P^š?%çg£…�Î6þ L³ya�’t"c.Y×"mHöx*“O«Õ ¥¾ì5€ÕL惦š¡EÖW%Ÿ=»svo'¥ÔT„2]”+Vff‰OÏi¯çŽéx-ç/ Ï<·>8È9‹É ]¥Ã$‰h)¼8%g¶æ8eÔ²['ÌœëÎE“¼¢—¿OÓ•àHó“KM],þE�N•äØÓò°rUº˜À]ª  ?½•j £r•PݼÎÄÙ¢Ä�ò2Q™ž¨ÁäÓ`Ea£O´ÓÑv¢Žè8Ë׎òãW–G+‘\ܹIY)N*üBCÙ]›˜sŸ“¯‡’ª±éžtQ@ˆ²¬Vë««õUJ³ŽŠ „˜u„z¿­öZ†ßsb’ËéÝDBËõ§¬›È¦;â]…гP […—¶DÂà›ÓqOD`´B$‚ô¦˜A¬è»Ø£ç…a‹ÕzKROk‰Ôü¦å×€“Õª¸`3­/éx;[QÜ|˜ï&$Íþ¤ÂýhÓ¸’(Ö½ž`JãyG“ §þrzê™ÿò{>ü]¯ûÂoä5ÌM¯VÚ¾÷þÏ~Ïëþ·zÝÏüÈï}õ…³¿ÿ¯þþ7>ô™ÇnùÔc·Z@ÒPëEÍ­ùúÛ^ýåK[Un,¯¼ùù·¼ú+?÷ï—t¸U• ª²=ï†w½á³§·�/.,Õó¡e �Šé¦ÓWÞóö�âËw Â7œºú[?ñoî½õ¼µ>8žýø¿þÁ?ûÜ]Õ+ËRh „ƆUÞIÎÜ(¦±uQDz%ê@§9!­Â1é¶P!š=€æQ»žy&ê†M_Å$ýNMkYåˆ!ÄWø7{³´¹Œ„¶‡Ô¬¿FG.�ÀëMVŒÆq Ä­)´îh¸|Â1®ÕÚscwBå5uóqT†.»¢ªÿõÑ�÷NížÞÝ¢¡ÈEìîr£ÓÉÄ$™9éö Zt´ÓSŸ„ˆ—ùùËÃþÕA2¢î¤·oÀLk’wfD$œ¸îí±É—JÄ7üXµ­nˤï&Ó}Ù¬öFDúKÕ´K?õNÍê”g½�(©Î³ÿ¦#lSßB•jõÅu ‰šù¼ä΋öD‰`IWSmå©cñ”¶ňJ>nÆãòÊêX¶»ÔSfâ£,ÏåŽVÃ:SÙI®ÂÊ›ªHÊf‘¤Öd)ý 2ˆ$¦Ål6ï×ÇË¡bL²š|¥ªð<¬òÁúàè¨ßÝžß°H‹ò@å¼ ™R�Ɉù¸¾¬�…ˆçÌGY¶OÑö‚Ÿ¿DyòU$L@ЏkŸ½iXM `…zWœfË}k·°z:A™¶!•©�Ò€ž¿»Ú˜d+Ñ›Q-¤Š;H�0Œß(¶¨šDÑ”^5ñ:ÿôDr“S¹ôÙdÅÀ¦µjIúâmÃãì¤RôµŽš#9¸¨ £N�«O{RÎ@ˆnÃ/9ùˆI�|ƒ…Õ쨢ZØù4ŽTNg<™G�[IÀ}C@Ìma4ÞÎpÊW ãÐ5ÄÖMݺվ„úØû˜ÄÚ‘«Ö',ÛÛ«våÁµýKDD?üÖOþgoÿø?ø—ÿðüå½Ò¡T‹6a°½¾”Áþ˜T¹ŠµºµQ;Ä´IOøÜ]OB"ùÙÿµ!ûàxöã¿øƒøüÝØyC¼¦?L$oû†/�Û;ü­½n�Ë/rÑo}äuüW¯&¢WÞòì�¿ã£‘žÅ,ÃsHņÂQ/Ø<Ȫ_Vt$sßb;¬é Y„V}ú‹l­Œ0Ñ!ã³zjW DˆÍÏ×ÜB7¨¡w2a, @ŽÖwµ¸¾©ê¯s†Nú0¼N èE¬ÑCœìÞá:V¨¼l$xãÕ»fFql–¼ân~‚xÌé•Ò¼^­¯Î¶ºOŸí˜©k¢P`®<Òg‘E¸TŸ) -:ÚíiÞQ:\Êó—†ËWÖÈ‚ø¯¤kÂȶ¹E«~LD´Ì¼uJ]¢TÞ×åA›�$u•‚…©–vÉ™¨&uóO�bú²£Å- ëjŸä;ø«¸E$³¦º—Tˆ‚µ)Ä’nó@}k@ÖT_KïVª£Ôoº¥‡te“ʳ¡º˜@° ¼šõ­Ý*« ›ý—·õÍ™™äXèé£üüÁ1eÛ(doÑB¨,_”ìB K¦˜nÐ:}êóÎbv¼¤¾[DìiÆ’«H…M"‘a¹¼´Z^�o�Þ™Ý0çžyMð¬\ÝÁ_¦H—‹F‰³Ðj./½‘.^ä£e½=$©>}tk]EíAüw| ê:¶Á»íšûM³f!>¤ÚÀø˜¬�),[A°²n±Ú1í-<5^Z� µ�øb#ˆGá…}2r|,ÍÎ0�¶›j È69º”¯þ ímR8M¢Êu:'ÍÕ°"qò¡RD7#&-5FJšÝ�(i��PE/ÕZ‚Ý"&ùÊ9¤EΘ»{ý*ƒ™h$Œ&Fò …¸%ÕÉjŽ­Â`¯FíãV“Xkô—P©<ˆH¯-é§þîŸÜ÷ò§ÿ鯾ûgÞó»Ÿûê-ÿËï¼C„n:}å7ÿÙ¿yÕ-Ïå̯nìKwüÒû¾õ“_¾fѪBó~W°{ Ã!Á)Ô¶[óõ/ü£ßyß§îù·~¿¥xRË;¦Wì•Ér#�ú zN£íÚü÷ßüÉñCÿ¾ëÚªÂ×ßöÌ÷½ñ³ö5gþß~÷;~þ�¾­é]oøü §~÷c¯¹ã¦n9³ÿ’½«ßñš/l/VoxÕã) ‘vÓ™ƒSÛG§w–_÷²gÿvBèÞ—Ÿß[,ßùÚ/^>Xì->ò…»ŽVU#_øÚMÿäWß=놔ä‡ßòwÜtñgÿàÛ÷ë¦?†œ>÷äÍ(‹û^þÌ�¿ã£ß~ߣçöž¾xê7?xÿ/¿ÿ�£åŒHÎîþýoûË?þô=_9î›_õÄ“Ï�¢/~õÆ?úÔ=DôÆ+ÛïyÛÇUyB F)ñO¾ûO^÷Чþ›_ù;ÿòG~ï‹_»ñúíï*ö¤½·Ë‘1ÏPÔ1¿,ÿ²V†ì7ïªòÈDaCX§ ù½×Àô4¿‹Á%á†.j¶‚¢n9…äù«ùà‰P L‡}Û�©Q0Œ>)îîš-ià©1Ö÷n{¯q¸}¢oÈËÇÂ�8\Â_¸Ê¥H^sêªÜlÖÌÌÂL2 ««ÔånØÛšõƒ”�˺ Dg¢T·âÕ¢­0ó,ÉnÏóDBtpœŸ-v ŸÿiïèYQä‹Wõ7Þ|çÞÉ300À†8D�!'D’DÀ]ÃîªÏ¸ëSwW]å=E]Å5®¢ˆ,A¢H˜�aÈC&ïܹ9|c×ï�>çÜßï(wÎ÷œ>ÝÕÕ>]]§�¸I~Ó‘�… E¬F¨Ín+@‹h‰ €û–»›ª2ò– ´+Ñ f*·…$ߗц\¿f9/ ˜ø¨� \’!ÆOy}rÿ�®BÀ02Q Žn–YâÔAö¤hÁJ˜ƒ¾p��“yLˆóø¡¿Mìê ZrPD05‚­•fÿD½Ùh‚o‘ïH òøÿ™ ã`üH¬t&À4¬-årÅ\®TÈM6›²xæ(r ¥g)®W'jÕñryZkaZ¡)½XE ±Ý#oÔÑ•«@]=Pž€áQÈDUZï�È&>FÃCf(àÏÄS>¼Í(G +I¶§ò#Ì …(!¿V�¥/*ÏŽêgF�xê'î!j=˜H¯kN˜Æûag:ÎM²Ãî,Û˜ÆÞÀ¥r 4|Ìr~±$(f[{¾‡º1ûe6�å§õEåš¹8Çç|U‘æ'z&¡¸Dw)õ—qêŽFUf^Oˆº¶“‰ 2)=Ðꇨ«uº²È¡J)=(~¾‹ˆ”ç7pqh¬e¬Z«G«¥áñË«"ÖÂ÷ï<掋ç÷ ]¸ô¹_~âÆ/þöŒûŸ_„~Åøê¹]q«Deĸ€L‘€ µTŸÙ5:•â%t™w„sÉÑ¡4·—¯^ð¥ëÏh+U¯8qù†�îÛ–ï+ØÆ �ûžçwêúùï™,¿°~Ž®g×™—ûÔª·g½±uÆÇNz¢»mòÊ“–»Û9nÅGŽ[�¾²ð¹uóÇ«>¹T¨ÿÓé�µ×zW쌃W�qð*Mß\|7¬Ù2ýC×\Rîp Ž·ÞÿÂ"X4{Û.3o{jß›–`Ã†ÉøŸsÀiÉ }#mÿø« �·µ×úOžöxÿhÛ?Ï9âÅií¿|ðð÷]ýÕóøê�§ep–Ôx:?8<Ö::Y¯–F'KCãe™r ‚Õú8g�ýuRQúà§õ¬ÏZp"{ê<,‡E²‘C›a}Ã7 Ñ*8, IDAT¨ ¶Ác )Ðôq\‹!µÔ± enÇ>b%Ö\HY4¹&í“ߌ.ÊÊßÁ‘2Þȹp[á^†7= "|üž*©Mabì§Gd‘ö6k`Z•ÏV |aè›ÕFc¼½³µ£µ„õ&#ã*s-¶)®á(A!í·6LÔlÿpsx´ÁO‹@â–‰I,V0؈H`- 6,”Z±%—spƒ·w]WœDð)"2{P9vJ%HÛAT”_œ:¢å_ �ŸC”í9š8" 第#�àužN ‡äyi1Pü¾·<íYeи—&Mxˆû‹z€=æw�@d˜ÞPÑ@‹ƒÐ°ÔWƒ-ãµFCÆ®7cr“—‘bü0`XÎv([¤Üw„,a“ÈÓV*Vª–3@$·\V!‡y±cbr¢VË�¶–{[òíìì)‚ÃûüJ3«¾L`°ˆT'ʵÀŒn¤f3‰(8ÝH�cbhÓA1�¹5ÜðžÚQ ­Ÿ_CD©\™³ØšÈrÅ?‡SäÚ€ˆ,ê�DzýàÙÆ.t\­ÚÅŸ|—±sJfO'‘wX‡ˆ �BX(e䆊ÂêGøfìï²Ø!@4M6‘Ò¦�¹ŸÂ0 s‚ÚfSÓ:�ðE!yNÅëb„¸µD¡XŸh<6DNE¢yF¦Å4©ç‹}Z²¢4²¯Ä$${YÁïØá‹ÓW9yyfp¼ex¼\käGÆËƒc-Þ.ÀàXëšÍÓ×n™¾ìµ]¾õá»?õ¾GW¬™?0ÚjrÍÓ—¼zÅÉËÍé™(ߺ|ÿkï9r´R‚B®ù¡¥Ï_vÜò3†&ªÅçÖÏýÆÿœôÆ–éAb ½\ýö%wÏ›6ü‰Ÿ�ÓÑRùÁ•·/œ9P*Ô¿sÉÝß¹änkñÚ{�ü¿·�`Ê…úeÇ®øÐÒgçõŒlèºá±%×ýeIµ^h-Õö‰›^X?{—ƒ‡íñ6 ÝýÌÞ×ÜqìÐDË”X»µgíÖD˜Þ9vê�¯=òòn›;Ý­y=#W�üä½Ïïù«‡m6µS€–bíÓg<²ËÌÁ7¶Î˜Þ>zÚ’Wý—Ãþýæ“ÎÜ~ý?]ÿÍ[N¾}ÅbA ÎÐÑxµtÁ÷/À™�c¿ÿôuzfñ÷î>ÖUø�ï}ììÃ_¸àšK··'$Ä X)ßüûSŸ˜;mø“§=þÉÓ׬ÅïÞyÜï9š¥À^ÿØÁ^Þè>õ WL@„c÷Yó©÷>>8Vþò\²pãŸÞ÷™uó ÂWÎ{à+ç=à*™¨œùcßämöàxëèd©ÚÈ O¶ ޵†•#&–ƒÄ¤7®íBy ì dF�8Æ8Ÿ�ñ¸ï‘Hw°q£ ¢¹âu ¢L&¸œ ¾!i_IˆŽsXOnD*žÐûD-êPæÍ½W¼šò� xPҜİßPT€™¥hÀˆ×åw™̰oE³ðø¯…HMö¶þÂhñ‚šÕaS43gvå�i¢¼M‡~òƒœ�H‚—D�3Ð^„r Ú mC�¡‘†UKƒÄ´kÿFp ‚,c¦ÀŒvÞVLäŠá Ki.»*G¡Ë eœ‘ˆC0i,”ŽoAÐGè)Xl­¤Ñ3†è>‹'ÛÌ‹\1Lñ㥈ã–ÐJìƒÙµ"2!=Ô«­¨ ^´”›à‡µ`¨Å@Ál¯Ñæñz¥Öp"ïßU¤P z“€œð�N&¼{‘àÉ „ŸÌDl’µ„9cJ¹\K©8:Q7§cd"ÙÞÔ„N4š�‘ÑÑÉJ©³­<³l AQ’4 ¤lË"«Òfo:±€`‰ê9;cº‚JMÈeE’U‘•�6˜IfJ„¸gÁ ¨5� �š&9�&YªÙ䑘z ɪÎÐh¬ŸÙvRÖDCUÐ:=‰åÉ�`•#C)t)¡ŽHŠ[Wþ,Q»—äEÈ,¯¾ò „Ô¬4tå“ÄšW˜{HͲAâ¹O Œ•·€™Ä)¼MºåyySË>Õù@UW¨!ÁÂd[©h…Dñ)XQ}1º•õ3á~§<ô¨„E5EQ"Ç á¶¤£Éä#ÆóAiP^Lá›}=Åœµ¯¼={}_8VÇ‚Qkäo{jÿï~äöEs¶-]pÎá/~æý�üè¸ûüÞá¯]ðçr¡þÍ›On4ñ€]7}ê}�]û§£|q÷Öb}—™ƒ}à 5/_:ç¡ÝfõâgçoìÚ6Ü~Ù.œÙ=þã«n¾á±ƒo[¾Ç*E0HŸ8í‰s�xþ7�òÌÚù/Üð•óïïl­\sç1€Dýܯ;ã“??w~ïð÷¯¸íóøË×þpJÃæÔAbT ·-ßïìÃ^þà‘ÏýàOÇX ÆàY‡¾ÔÕVùãòý .=vÅ©¾:^-!Âá‹Þê(WnYæŠÇí <�EvÈ)˜“†ÄRˆ?ƒø¡#Ÿ=óàU£•òÕ·¿a Kîv¶T?÷þ‡U§RÒ�Ð^®žwø‹³»Çziw"Ê»u°}ã`ç’Ý6lêøùG4›†n|â€ûŸß›€vŸÝïò³CÀŒ«|s[wk©j _y{æúþ^ŠEµeƘ£0w€2¾"IÿR¦U[vJjWdË”·H›WFör�ÓC½¦° Ë�ºCB·^§”ªÝŽHKÓ‹ÑýDõ±t )8W.�@Ð9¬ôh/…¡R͵ø†wwÄC® òî�T‡›uÊ—|9Õuk“–ª�Ýmíå"Xÿ™;®†¡6{>ÿaš&Q¡£¥äªuØ6Ü®7&Û�>«VÔheyáñänø?M‚|‰Zóy?™ C2¼—g@ŸÜ‰ÓAŽƒ#`Óå�3:ô!7O�uV¿½B~€_• 9©ƒµÚ2⬀Ãqâ÷&'r=(ó]þ�4›6~1�½-½ÆLMKm ú,xÖŸP[ 0Ú„·Çë“u‹Öúhd?¹ª0¨Ø¢` Tà[›DhmÞ˜öra¢Ú°MÍ)*ê–•ñ õzm`¨>ÙÒÒÓVèÎû’H¬Y„ô\”±‘1¦@T#šÖƒc#4:á;ËœOx„ ®¡‚Tî›ö÷úšD)³êôm¦ @Ò-©p,&Ê).%›Ï4,¼´Ê+󉡗A@ÞXÝ¿\;žNZ^‘™ù 5æ%R �q·R.:Ñ�äER·ÒN‚;ÅdñQØ›,ïã ŒÎEˆ¬¬XмV²ÍÓüv'®f˜*pc"~SwËûX¢ð›’R�}QHNiB›S;¸%tE2”8‰Ï R +”"NIe• o "K?µ+Êò²Bòø« uøõÇj¯ À–� 8½s¢«¥ráÒ•7>và?ÈZØ2ÔñËû�ø‡3ýùýGlèʀ̓�·wÀêÍ34?,™¼±ŸzïcïÙsý?üììu[§@Ãæú†; aÍÐDyËp§°df÷؇¬úÕCGüùÙ½àÏÏî5¯wøâcž¹á±‡Æ[àÉ×vyø¥Ý€àíþ®ëYòé3™=mtÃö“ObáªWo™~ëò}/>f壯ì¶rí¼=æl»øØ÷=·è…õ³Sc«6ÌúчïÔ;ÜÞR½cž�¼¼°¬=°ÆcqKƯEBҤ͎2�ìÑÏ:äÅ/|àáþѶ¶Rm¬Z™(A ð¨Æ]%§ðú�®¸µT¨¯ÝÚû¿o8õé5 àÁ÷xè¥Ý/:zåâù}ÿvÓ)[‡:z;Æ `õ¦÷>¿Œ¶^~ÜS¬ûœÄHO¾¾Ë“¯ïB@¿yäP×J†5S@ú¤ÜŸ`ä�!#^³ Oð3QD/Œ,úŨߦЦڔÙF¨È7I˜�Üh¹! º‡«žeެ¶ó™66>4­‰š€!QÒsF°Ÿˆ|•:×f"Ö»Š$ù”Lš£ëR VâŸÑ²¬GhëDE‡}” Û¬Ž[òÝ�Ý� K€ä^­�µ>è.»M´å¡½¡I¸u¸Ù7Po4=Ô"ó…ÆDβD¥™‡Š±¡b¡·=ç²#tŽ«Öm.'ÑY´þ›”ьȋ‚r“r‡n’t‰ÚÄÄDDD"‹`-X£räû1vèÙî]`ˆ¹/+‡á j#!—h}Ò�qaTø{ï>OBôÇ Z²†7½¶¬.Ä튖y“…Øb¨Å U-l¬4ûÇ«h]¢;4‰D‘! D ÷%J™L#—‰Ã û¥N¨I�s¡ô\®½œo@°¤~vÁí{.GHÁý;>9Q¯&ÚʽeSDä4jµtàX jí܇/P@S!ÛÒ åô¡ûLQ4BÒuî¯&•¸¢¾—톶 lËĆ[!|¬ÌuöÎ÷¾§áIM@€dØ.§±{Üc ª)õ3É1“!28±%swÙÓt¨B‚‘0n#rBiµI¥„—Ÿò©D ž†¥/Æ• J8˜‚ç¾ÿA’ƒ;Š]€›Z ²jF¢âçöDñbµXVT�¨†B=Q~à»<Þ™o™þI?–ùûÑŸþú §¬Ú0+æŸ(‡?³s¬\¨¿òöL)·êíYåbcV÷ØÐx+lìlúúaË`G!ogv�o蟑PŠ‹"‘2"üõÇ·xÍWλï‹×�ùųl4ÌOï?²ÞÌ鉣ä±W>þÚ®ßùð]ðÁ#Ÿÿ·ݣߤüÏ+oýÏ+okñ[·žø³ÞãTc×YÛX° Ü{�{Îï;çð—Ü#{ÏßÚQ®½÷ÀWG&ËD°jÃì×6Mwdž}È‹ßþð]}m×_XôÍ‹îùþGnƒø°V¹•›ýõµ§ÿÇ•-•£÷\ûÿéš;�½ñÉàøÅ«?{æ#¾¸Ç>óúÞ{Ð+÷¿°gÜÁ¨¾lnbYC‚èr¦J"pÀĵfSŠ©‹;@d*øo¼ kââ{¼ ðº9 µÐìH sQmÎU7]W×½� .K˜—Å]Ì:g£O±‘ V‚,s>1r w™oê§²* �I7Q¥’4ë#º.¢’Ì苬jn ­C®èž"Û˜´v²«§³­T°äw€Ö$òW½½+"K.Y€ZòÐV€<‚%¥­ƒµJÕ&cŸlÃHÃZ+/È©~ùù°åaƒ W‚öb�ŸPvÉ>ÖåNð÷qÜL0\ñØ”¬ì"`¬´ÍÑd/‹àç>ÌìÞ¥d à"+ÚS ]œP¡‰XØ&X7PÀŠwÑCMÀá.W|,Mà�ÿ=Éãˆà?gãG™€¸A €¢¡y„Q_Ín«7j cÜw+IÐPáMdW&ƒ^¢ï’Q€B‰"@(€ÚKűJ³Ù$Ñæ�Î J"¦õf}p¤1Y-÷¶ºòH€üR¬hqF>¯© -hV/ö`Ãrý ØÄ?‚Ѫ¤%žàdCt=Á’ê6ØÝ à‰ÏÂÁAÜ4‡Ó4¹‘îðõðñŸ`¸•ÑRÁ+Ñ'¤ÌX¦V€` M¢*©7#%u^s@Ï_0.›î;Åz$² JF¦7K|T™W?A¼\&øæ ·"�uõà`xwF®„[2RYt„ š¶ÍV°BÅêU%I¦V¨2þÿw`ª é®qÁšø>‚Š&øÜ. 2Èi?Âv–%gQ"ôü(¬¼{W^õ-“Qá˜×;dÀö�´[‚&™ïÜzâƒ/ìÁŠM‹}ÃíXoæü§£nzüÀõì7.ºgý¶iŸûï÷oì"ÜuÖÀ‰û¯~ø¥Ý?rÂÓO¼¶pã@gB'iï bt¡�ó;v!B.'{V$¦ò¤ÎÅà¶‘¶oÞrÒ�®ºõæÏÿ&Ÿ³_üÝéë¶öp¼’÷. Üó#´|õΟÿíû];³»Gÿî”'îxzßçÖÍ# Bóº9lóèØ}Ö|ýƒ÷Þ×{ÎA#ï;è=Æÿ~á=ÀùÖ¯möùÖ+ÖìôßöÓû�xÏ¢·ú‡[/ùÑE¯nœ)fuzûØï?ó»˜ŒÓÆ+¥×7—�håºùí­µóŽ|îîg÷Z²ë¦ïäŽiíçñš]6>ýÆüñJ!#?Û3G qR=cû¹6eÒ%Ç ;Ú[ÆGì#Ʋ™WÍ!&õÁKqAª€2L‰zCõ€A�’T3Ôf+.‹øÁ›¹ÃRmœ§žÌHÿ´5ƨ‡‰ƒ‹k C«*vY°ü=.òUxa6³E�fcSäÄÌG:¹r{xQ¢‡)°ëü£»éq6ÙFe¸Ð’ŸÑÕc›€¿�¨ÙL�«ÇK”7ÐY„R‰h´B›ûã“MVh+ �HõÖ nêu>1—Že^¼êD]­¹ú}² y÷Q.¿/ «Ô 6ý^¨uVtJ‰ÆpDÍ °wQ²˜àiÈiQˆ€‚g²`‘�ºðJFÕwC!cdUd}‹ß?’-€QŒ,k·(‘?E^ù¹F%FX“DmÀäZrP@$‚Á½5V¯Vên›™&IMärÜÚ J ©ž¶™$”3Ž;®¿aQ*„âˆGj#ò¹Î–ÒöñŠ×õàyD­ÃÄœóe�™\¿h²ZÙÒhŒ·•g¶äÜÜÏ‘î•C]Ê#Ëărˆ„Pš9·@­$¶Mä�‘Žû٨ʸÛÇh1N$=I®+á³:~¤ÆRi ƒ†ø ê�EJýŰ#±î©Ç%àN�͘ÇŠ1ðÚ"D*úÉÀÂ??Ù²¸Îǵ ò.Éè=«b°Ÿeª†Ð,Iˆ¼•.œîHê> °L�à`¶ˆX?ªöâ�„ñN]af•ô ‘�äˆuš˜–ˆLNp!â%ë̾²EÆKßíÁ¶#™I«©x©ä_‘o±x�Û(÷U "ŒªšòÓ‹ÎIÑF6o-ÅÚ¹G¼°a{÷›¦â–ÁŽ36 vXŸ �ª«€}Ãm?úÓÑw>½øººþ¸}×þþ±ƒ\eÃã¥Ïýúý[‡Ú¯ýØ­Ÿ?û¡/ÿöôÉZ�›D",å8á ¶µOÖ ûì´õ‰×¸VöÚ©¯VÏõ u¸»Î(ê•Zv™Ñ_o˜þáöw1.¾ã«6Ì\µaöÒ½Ö¼üöìçÖÍ Ã£MD¬ëû¦½¾iº;ßcNÿ¥Ç>ýÔê�oz±2$.~…¿þË¡ÿý°K·€¹=#-•×7Ï$‹ÆÐ~;mÞ0ص}¤•M“ +mèúöOpÍçíâù[:ÊUi½«e²µTW½P¼w#懜òhsH`ÍÖžÿºï=Ï®›ûÂ[óÆ«èí˜ ‚ëÿºäž•{Ñ¢¹ý?퉴ÂgÅ®:e_2VþØ}#ßVæL¶×eW¡UŽn„ŽùzüŽ$)ŒšMcâÈ4aJé  ¡ µc·T Ý‹®¼ñaÈÅG¢BÑÏdѬ‡ k…qu„ëO�“‹¨Ú0ñŽ�ˆ0âÿ”@e‘Š †‹KF‰pû8� ¸�…f¥B0ÑÙÓÑZ*@�žÀå(Ý–9áÄ¥£m@€J�¶loŒ6ø5>`.H¶r ]¯„‚Û�ÂÍ P| 7B4‡ÓQ1òÁà ÂêåJö| º-§óÃzërñÖa¸˜<ä»A~}þ ´ä ÅTÞšhŒUs`À)ðÄsΑEÁ<xóœð,jìôúp_1!NN°‘е µ:m®`LÍ69 38I |`«îÑi€0î~½QiVª¥ÅÎ<6‰D‘¸iåQˆ‘(„yVÞà$Aït„ñŠ ¥ÙDέp¡¯(äj¥L©`PAMÉM±{\ r°$Úà+•'5îZ"T�ƒ€E¨Uý$gle–ëÏ$t0Õáø êîå„XœPÂ22îÀÑ T§�%SãgçÙ-ʹêDÚ!H)mîÙR¹…©˜Q(öB�ªŠ"I9vrYþM-7M4C€@äf*Óž'=’Œ¹#EÞUΚ”ÁÕÐ_ÕÌßv¸±×ËŽ�ÁW»öm,6ʹ‹Ä+e ù†z8‘ ^¬'±òanÁ¾,†LÝíã»Ï޶ˬÁ —>»ß‚ÍŸýï³F&ËpãK¾|Þƒ#“-w<½¸Ñ0{ÎëŸÑ9rÓÖš¹ƒwÛ0¿gø¹us'ëù%»mh-5¶�¶p7i¼ZmoùÖ-'ýäïoþð1+ñàáŽ�ñJqë`Ç{yåÉ× ޵”‹� Û»ûGÛï|z¿ËOX¾q{×3kæ´pÓå'vå]O/Þmvÿå'®xtÕn›Û€2‡LÅÛáÈ=×ÿËy÷/˜1tçŠÅÇì³î÷Ÿ¾þ[·žxÿ ‹ô{�“Èšœ§Ç[ŠÄÍ/˜1xíÇn)êW\{Áú¾i{Ìéûá·Ö›æ‹¿;såÚ�A?ë Ow[åû—ßžh(Êá¡kk©^vÌ3º×o›f —îµöìÃ_úÕC‡�VK#•Òµ÷5»{ô„}WºÇ›»ÍøÑŸŽ"€u[zYµŒWKÍŒo‡N£øëTÏÓ—œ�t\òÓ=î�“EïäQK³h=ï^¢tÏ;em:jV4Ç]Oìý¤p˜6á•28♟}Iy Yý¥@j´k–j:î'A†ô¤[-wîŒýXèk*5GšML`¥ÔjhYØÄʪöµÉ~(�Ń–²­¥‘BÑôtO3þ3ìá³) ©ÄF�•óØ^ BÓBÿ°Ý:Øh4-7�Væ‘™ö#–WB~QÔFNÁZ€®6“3ˆ„�Èe�]¸GêÄÑ%âݲv6Š'Æ Id͹wþ¥'²F8MAÙ<�ŒÌÙ½�GEeñôqF!ïÒ‰JbŒ<÷uøÖ9­hÝÉOf¼ó¦UáÃ�£.çÁZ �š„[\¢H½ž²ä–SEze¥yNãkñsWÕ�`dÌ"I”¡ä¾·�Í*4ª8Ñ0n&Ó mE¨× ^ƒó3R>6Τ¡�`#š¨T¶4šíå™e4ˆMð»OrH[mtf[”@¥I�ݘ…ÑñdRxضƒq ¶;n˜™_b�ýd2VgQ‡€ÇÜG1ÿ܈kÓžò¦Q½ô?¶AºiÙã/aÚ¸Ò¾<íº»ÔTE;•."= Ÿ¤AÈ®ËÕà3½Œ‹[L?³HOecV$–A W–S8MÙÛ”ѦȻÿýbÍM“LñBðˆ {ŸðbñI"–.Õ¥ô‘âÑß|8¥Hx�ØZ�¾Å4¡ô>“D-ƒÉJS…c1ô=�¡©mQrŒ�:ãÑO�þxßPÛã¯ízé÷/zu£Ï“¾eÙþÃ-Wž¼ìª“—!Òú¾ixì & s�ËOZ¾Ûìí-ÅúÛý]?»÷ˆ‡_Ú#-#/½5ûÇ:ú3gþeÕ†Yî-̉jñ7Ÿüåóüã—þ;gìíO-þ—ëßÛhæzÿcÕâç>ððüÞá̓×?²ä×nß½|“î~fïEs¶ÝÿõŸ4›æŽû|ïŽãš6§ak<&¹œ=b�·>zÒòã¯Y½yú?þà²×²ûÛÿvÁŸ¯ýØ­O¾ºó/<ü±U’VŽÂéØlûØW²#yc‡íöæw.½þñWç¼Ù×@¯ošuÉ/ºú’»~ó©¾ýÇnxü ¦5Ê:¿Ò?ÜzÉ�.|uãlѸé¿ÿÌoÃ@‘÷‹�F¾”o|挿ì4}ÈZ³¶¯çw/ýýãÁqû¬ùæÅ÷Ìë®4ò+×Î{äåÝúGuÈ?1%IHlìW‚ÌEÆ%ilÂï\TÎÛ;yšZÊÙ�D•!ç*ø/îÇ„R ðª:7®‚g9$ÊçˆuˆÃ: HKGÈx (öa:fŒM4"HدèéûªrtÙ¾qÖb„nVig*[”¤£>#Y$Ø] „;«AŸˆ{Ð}Pô°”#uK£Ý3Ú;ZJ Ë"1 Ÿ•OàaÊ!t©”³D82A·5&ªMWÔú>XåE‚¯Yªä¡�#Œq�b¸uáhàÍ¢;Z À3lDO†�_\¥Ê©»\ÄÀdט[<–@8‘Ûò/øPçݾ üûUÎöXÖ¥ ÐJý(£kÄkÖ*'%¼ÙÈ•òÐp9IØ•0àJEœÅô‘ÊÙp-¶(剆ðæX­R©#5yš*Ú¡, ǪÁ¿�ÄQm¦CÉ{°MB’#Ú‘#¯ƒºôø&ØPÉ¿’êºiLŠy(¶�­A­µzpZƒ"ðè{d¨Ö¨7+õòÌö|«ARÕÅúÉ<0êrÈ#ÔˆZ: —ƒ¡. ºDü¬ôZY=¦—ÔdÁG×x‡Ê´_Œº®êT莛÷ T¶.‚iŸC Èz(ƒ’@ÉÁ“²¸y°ë—öû¿4Q)º[­åÚÅG?ûÑ“–Ï�6¼u¨ãš»ŽùÃãKN„«/½³§}âã?=¯ÖÈ96.š³íúO_ÿÍ[N¾ýéÅZ Ü?�-Õ��üÄGOX±rݼ¾þ½oõOóU!AGKõ_Î}àÜÃ_¼îÑCþÏíÇV8F¤ÿ}K^ý×þù’]ôꆙ€¸ëÌ�=çníh©}öŒG~ûÈÁ×Þ{dp¹�ßÊšðß=çö�zÀëϬ�¿rí¼‰zþÊŸþê¹÷IÖ¸nÏò«ï8�±î ¶H,ñèh‰Ç‰½ô…QHäÂ,aQí®B±‘)ÕÒ4íàºRBÚÑ($ŽmªZ%ÿ8:¢Er‰>¨Y@*^‘¦²: †,«G!O-Y=‡¿™¯Ž5¯Ú-Ê,G�„¯Uˆ)3,a%*b,Ks´cS¤"(y#®±•Ôo°Q„!�IŠF‚IO‹nN¡Õ�KS³"~„Ú¤6.†Éòáxé­9+×ÎÿÁÝKïY¹×Dµ¨oMTŠ?àðëÿzЉû®>lÑ[}e¡µe[‡Ûk�¼IªÛÜæ¡ÎñjÑÙR¦Å­ÃtµU~p÷Ñ¿ùË¡òYu`ã=:Yúê §mèêl«”ó¶RSÝ ¦XüMoýîew¶–êolî}ìÕ]ù>« ªGä^Û4óµM3™Étÿs{¼µ­Û  cºnë4µ£RêâÎ#K[z�¶ÀÙ/oáÕ�ñÚ8ìn¹ûâÅÀ*™“F•- Ú¬i¯$ÈþÜ•'iE*B|".bgÀÖèIO�ÂëJ§´cB¬`ÞSÆ\ÛåM¹±¹ jÅa‰A>–ã®±’ª ’$aŠøÄøø®‡1áwN¹ñ·–FÚ»‹Ó:;<ÂF’7ªä?-O` :JP4` úGhã¶ZÝ�ù–X9D](¨ ³Õ'Ý2ÏœUó6Ög*xêJ"aW[ƒãu)˱ysÀID…G‚À¿L`´Ë#ò›h ý>Öáüº'×°4ºdB²øû‡@`8Sœ-¼Ÿ»ð Ë·wŠ:<ÆÎP$–M¿ûä¦27¨ÖÙȲûqÓY|ÇÀs™ºX‚bkžJHDØß„·FjõZ€ˆH¶Ì ºÀª�`Ô( h�à [Ôü?HÆ«TÐD ôs€:R5©ï!p)ðÆ·æZ ­Ph³¶•q¬‘Ìr€ ñ+Qï£+•ʶF¡ÒQœÝ’Cëw�QÖ¹09‘ÊrÖ`Ætضݫ6M‘3±¿"Ý<ÿáh\0²~§\KÒ\¿\£‡/r¿;pÝq&I*­8'šŒu�Ÿ f< JåÃyø£t.´!y#Áøúe˜ðœ>It� `q~:‹qYÓ@�<ëèIv›‰K  ¤‘˜BÑ뎗WOQ�[OL²q’ç]ö¦v2±§Â,n¤a Ä“Å)º™pS™Å1'N]›ê²ƒ…‹Ù.×Q´…ibäÃf!ˆ´›ûs`B!#gˆT<[‘Êx(¦ ”܃FÙœšÈÓH¸nˆ$ÿšªÅwÓñìȃg�MÖLý],ÌT·Ä›A4û䡊,yöô/2.D` åÀÖlÕ˜G3aj¥%3è‡ %cB¯²Ö1µÃubú�c¿À¹Io‘ü„ieh1²È®þô «>†2W=ƒ¬@Þö·ëí½Žî³Lº”0Æ¢á'*ìøHôu/ôâ ê&@R’ƒ—дA§,6%ê’øwrüuí)fPó=Ó»Z‹KD^t1XÃÀhoñðl/`k�`¢o÷5†Çêà¢ÅäœRøÂ‹Ù _�ÉD Ù[Iï‘ÏÑPÝ's…|~Þô’ŠlI¬:ÀT ’ÌrëÈ�äVG÷ },€%ŽãpÁf8' lGŽ™ÓõîÉó;ŸDÉÙŽ þœ”Îé"Û`CÄž„¢� çb¬œ&¸]©œÃ¤BÅÒ›vh¼Š>„-¢Ä¸Dž=Ç^VÄ…Ëá&òãü_‚�b-çßItà]ê#åªXƒZmVR²ŸÐZÕ\M¹­<§Ý”ŒiÈîæ(›¯‡–bÝB²D�kÀ¶?# ³‚¤šz'ä­“Ü–KYnâ]™:>UUV®ëÀ©2žUÿ�´°0hÀ­Öʈ'NÌtfŠ¢4ÓpfäFŠÇ1Õq�.²q6+s\?¥ZW‡Êê !j¦Hb¥>ŠÀÆý‹eXšÌdˆYãÈ$;#:åÍ£*¯Bã‰gRùµ¬h�âÝñ*£ë”ºŸ.–$bNqì?Z"à[ŽSê=HpX„Í `¯ J£âQHÄH(„¬óó$&KêAx’ÂÀq#7ÎñçJ=bvíðÐ8„ THY\>ñr©EQâT !Ç'Ö¢…\B•@�?IÌΛkQc-&Êé"’X„˜‚bVº•à™—±DG0z\Ay5!‰#h@ÊA¸à „mfU¯ÔHhçäZ!]'—á·ª’tz+¤ÂŽŽDÔc%’#Kû�±Ä\ňxHµ”`ç”cƒ/Ý‹Çbó-H+<ÊÏ¡+‹˜q—Ñ¿�Y¡-µü)„6SÏ\(v´ÐjgôNCcšä-Cè "BØFÚådBÙ`G‰ MØ2`7oo4l­Sie—+î–Z$u‹D£‹‚ôaSƒ ƒ�¦éhÍ4Ĭ³^4 ѽÏ&¢’‘±’×yý_ë_¦$‡÷ÑòÄÁPøbqØØ’,qÏ�™®@6ˬƒd —p»‘¸‘µþÜÏ&UÅ<À‰ wTd)Š5¸ÑôU¹!tä¡„d¶ÖhÃh­^¯#`“¬Ì‡”nø" ÏñIîˆ Î^FèÜ"Ö Örñ<8h‰{ܰ�dwb´°‰�‡r/•jTÃZšžR3�„adßÛ;1^ÙÐ,ÎèÈwæ±é^šUé6¤ìM‚VƒHÍ<Íê…¾´Ö‡ì‰wddÉ&ý$ˆ�æ!Ø)üNôp†žSê�%�Ïm#)ã7ÉßÁÖ‘‚rÃÔ[6bO¹•h2¨èK]RqMv%¤E;ˆa Òˆ a²ƒMñR·Ò‡†F‘ Ï*/ÞªxXð¡Z—81‡B©Øi@<>ª 7©ÔmÑ9Cä7)Í»$´z¦{FÉ{jâxy7Y©ª(*üâ<õA±ä@©2ŠÕþW†ˆ 0ผrßít<;Y�¯¨-ª¢ƒˆ€ýÆÎ;@ͦik�‚+ç…Ù%;pî8Kè²Ñ¨„|Ïÿú#PPGÙ(€€ �7ý ùr»¤&øh: ÎICÀ�J •€ŒA²Ö‘-#£—YÅ$—Ò¡%‚Áå$l—”ÉÙ> 1¿ÛòPB°[ëðÖpÕÖˆ`-‘ ½Ä �EÀ¾ÛMÇÌ ¾W~#DD ¹šFØ,">ÑlHÔ-©SX/R=‚‚�R¯-V¡6ŠÕf°° ŸJ½¸Têµíƒ¶ÖYœÓbâ7©¼<„yƒì†à£îh*@³¦ã–mDåÈ*V6¥+ÁM‚¨ ›åôvTÒ®�O¢ 5©+¼^©ÚS<Ñ}å¨ß�™âà|'ïz›N/¡�V^îö�„ê7ž Ìêßôå2â\’äà×0“ØAü§ä�Áÿ È sÄZà{Æä³©—Æ$‚QËʼ«sØŠ·ÇðEPrëÒKó$ ÷yÊ#½þJÉïð¼ü›`o¨.–-ŒŸJŠ]&‰(éÒ†÷ëa%�ÙÏR)B�¾x˜c>‘™‰¬ žJ-O�tQÁ+î JrI* ÜIN QE"‚Q`ÿÇ�4¿”†üHq_ÙÂŒJÂ.2™‘°A¦yŠ=�pE 0ÿµÌ'ºü€úû7‚k‚Eõ€ý\ 78;ði£BQ,™á�ïå ò2íiàŸh‚*¤µBu!K1"#.Š[Òj"åuÎ\¢‡Èw‰ÿïßKC�Ñ”Y�L‚¸uþ‘T5 4`\rêƒ"ºEšEÄv‹fV÷7à�„­‰aû©ìVœ(0ɺ;ž/U§OŸVÈåšÁ�/4.��`‰Ú Ð^„<ÐhÖmª�L4½S�h ? ¬#ŽIgÇä_QCÿò2‡H ø âÈFoù :‡ ¨m]ƒàò5ü€K+‰1 £dÈýcý«h§ñH¹}¦d·¬éNñÜK�Nø ò•3ÔàAEðQbßK z!D™ûÁ))n&ðG´­Š¡S~á’—œ‡Ç¢¡VCÄI oN6ÇjH–À½ðH~òN±P#& ª¨µÆ-ÊJ{f¡ ³péͤÉ5 L.É�ØÒhÕà{*�ímt2Ì ZÙ@ÈAi:+PÁZ†^¹ysõFcdÈ6li^«1ˆME¥ôÚF$ØL®¨£�Õ‹}d›\yüC�@ŒWñ~"(ûCWä%<Òw¢°×µ«]ê—rÚ5Cò4æIÄkqÔÜ?»ç´&ûxˆCþ)[*ˆ<�Š�ð Z¸¦pá‰A•«,|‘�N{Aesnù›]yꈥ1I�¶s󲫠�S_ Mˆ™|»—Y.—ö͉‹é+;êÁTå²>U9vXJ‰’܉t’aFz¬@Á-7È•ñ�¬ÖʧGÔÌ™ˆr;ïü¾auaLN¨;›ï¸nL>$Æ9º+dꫨ¦•Á$Ÿä|Bßs­äÑÁ«¸Ò×¶šRõÓ7ˆí£ªŒ2Õ%L [üÓK>:˜ŒÌYÒL½“ÑŠXœy¤Ô>U^3^~By5IÁ@} Óñuý3�ƒÊH!kHV~MS¸5*A85Yª§¨úÕªM.9Ð8•éRª‡z�±ÅLXOiSÇÌ4}ˆ¢#Sùå‘ÄZP¢›™Ïy›¢Kò(F,ºœ;�^¤†¦IiéĽ]†7ŒDÿ•–P±~ž€rÝeh+n ×ߪMT›ÀX-äϺÄÕ J?Ѹÿƒ;19ÅÈu4Æ 1€Æ `¡™ËSÑä©»=ÏÒn Ãp†÷sö�2€~7ì0³ò’ª9€}äÛ%«èuŒ�‘_!w9.ì�? ÄmÏáxÁC~r$ ‚:pŸDÝ&5º ÕR ˜ãÏD.ŒÝfûêðúpmb¢ DÖ'Œx~·ïô‘W%CØÇ°ÙVB‡Òž_æf£ž5ùZ®P+ʳ°Gý&5Ccàníø ‰,bóT ºäÈ%VÚIˆ– YmN�i+b�—] N��œØe@@k¨£'&Ý  ($æÀïÒ+Ôf`òâJž­ôÆ�¹$õª¨žb2:× ”ÒŒJïKˆ”LE�kó(Ð$aXàŠ¶ýɘ¨š3°nœ˜Ûãçïø“ûžq/¿h, tᙘ9þjjv¢žõÝ"a å,„)úU”±VÒÊÆ*$’ܽÃäo=ÞÂèæõ‰ýBÔ;šZYìPñi B¦hm�*"Òake1Ño3—õ¾'ß ”±‘̘$'Ð^]“Ýôqî˜m$J,iCqH†A¶úòK´æ£w�&ÅÄhHÜš— ß_L°¥l&{ÔuíÛ"•RU'¨ [ŠëT­g•¤*¦Q}L�<$ )š¾&Tê0¶Žj'x‘¦1!'š.1�šxނɾh ‰˜2É¿’¢Åg¼9^d$Z%êSü’uoŠœŒ†x™à(S(øš¶ i @ /ãŽq£LP2ù�5„^�\Ÿ~FÙ¯CKd3´™)²Ê Yk‡:{ÛºÛË6êºõ^Pý#ƒØ´PÎCg 'k´vccûHݽÎHL¿�\ñj8«³#Î aD’ˆÑ¡;1àÁ‚×Þ¹ûƒò6Ÿƒ i4­mÆ ñ ü'È }FÓ§4DZԥ·ˆûwÜ4œŠí8mUp87×6n²¤Ïc9qCD \€Їô™Ë<"j™-Y×O/²�DÖð'#‹ÿf[̲Kà/ ¶Ê#ÔÖNØíÃÕZ°�f¬÷®AQa½2v_È2Å¥Â?ò°£C@À\-—«çC¨Ég§–¤ÓqëÌH¶¿•Ü$Š{-æ_]Go¯hZ ¥Å†±R‡hŒ^Ò@cÕ TšÛ %7óaç*J蘴˜Wp‰°a`ÖtØÒï^l�Œ‰—�œ@Êê&ŠÏe USe€ªÝsØÖn§†È«I b¨J~òr‘?­EÛmésõ²cò½GcƒT‡¼:aQR”ÃI§%õ#&:i�=g’W,D}ÁbY²?r\‹¶ÇÆì¢jî¥ç•Š&/qöS€ëžáS`¨vŠ º <¥ãxí-9Ä”äO<(R0|)ÀOÊãê"âYºª~1œˆÚK�Ä¡�ž3™>O¤›»àì'wG ˆqõ ¹�œ1lGs‰îet:ãú�†ZAô�° ¢.ðYüÎLt[ãì€"‚ òȇ�·”äYÞØO¼÷ñ+NZþèË «�BFgcH·ç¼­=ñéµ[§�MqFçègÎ|ld¼eëp@ðsºûó{‡¾vÁý›º¶ ·»«‡ìöögÎ|ô• ³G'ËšM�4Í_?–ª»ð¨çZ¸éÕ 3›d@Mœµ²"(ièj©,œ=°m¤mFçĵWÞRÈ5Wm˜í[åâé1N\ЉG"¯ñ‰¿ 9�•Ч‡[‹MtKœpr(™Kš¤é` žIîŽ.D·(Lä]+€ c /…läÓ<×¼˜äw¸ÅB ª›Òk¹ÇŒ®M9™ˆZ̘»©÷{Ø A¢:´uÂáޙݭEë– Ù÷†Ùÿçž ¢Žt– ‡Ð?¯¾Y�¬K‚0‘E§÷&Ξü9ú[hÀø¬k“3ˆ` šœ1Ñ̃ˆ&ƸülÒ†\Áæ P4àÔPŸÖ™g�A0†_"ך„ŽŽ  ‚ÙÌaTë‹J|´�åÁÁ_õJ“g:òT8ÇÜ]â­D|Ç ’F^‹³žØò¡¶>;}-–ãôZä( ™Ÿ®¸§[sЙƒ0Ø„Õ#õѱšA ký ¿£CÒ¸uÇE¯" »A[Ýò´ð™DÀ|3_¨sÍ\Òò¤Aö»<0ã,¾_öÉsˆ MŠ€UŸÑ“6eb�õæxÔKPR’#$ð¨ù—ÐË:y´Heœ˜ŒD dÜØ[¦«õ·YÄ’=öY"É®OùÆ¤Ç ÚÜêæªÖF;”öELUÕ-¥÷làÉš²oÚ0GEDê(°";Iè+~ô8¦î¿ã�©“wý¬6úÁ²{¤ RêA?å5º >Lé¨{·!îmæcZ²Ü€Grü7™ø)*K<ËUà8¢€la4²ðIDÀO ó>x¤ÆEM™4Ɖ®«ûYŒøUR.ÐÊüyp¢Z¸ê'|dÕÂ` ÂGŽ_qÉ1+>ñósÞÚ>má¬þžö Å8SèÉò±b-ðHØî;Mò1+ ÑŠDˆßÎò5{(!B'GD“xR�Üp¬9:¢ðtç̾k“Ðyd,(”…W||$…$ΤÁ)Ø�ÌMT毸†hµ>šbF°‰2* d�†®©Í µ9iŠ“½3zŠy÷ ¾ˆ)Ö¿6¼Od r†ºZ°dȬÝl7õ×|/�û^ Ëü�²z]Â…€l6kî.º´ ƒ´¹Dlä0hˆa;òŒÃj9ȱ< Xk eÌ¡Q!âí’ùMGÁÛ~p €EÉ#ާK&¿LÌã᱓¼œ aØ•Ñp·nC`½cÞúCL¨¯]6Šá1C÷mqV¡ @ŒÙ‘“‰m=Ϙh"È!´ç¡ˆÐ ÚX…Íà @ÖêÐ)%þuÕ/#Èê(ñöü TÇ6÷Œiš|=o,²GŠEÑû² ·ïêLeð¦zÓg Å�‡ê84S Ûÿ•åÃÚdufwÚs¶#ðÃ"¡E^uð±DKhs0}m€$+”b‹=%nTulÍRF7’i†°)‰ ¸Œû�+‘mŒú0jC6Õ¸…¯¯‡ª½ÍÂ\41 X˜Qq‰F&¾2ÕNXSJ§ò¿sBPVê¶¶ÚºV†M_ÑØß�½S J"&�!RU܅ॳk‡`!øžô±£)ñ”þ�C\ÂpߕԊ.¾ãøA’4Ô;Ï8êbì¤Ê²°*�·Ã¹0‡Àeþ”×íøç“VDÇÓ4‚ŽÞˆQ”®Rzîß…ºä¸g/;~ùEß½dÛH{¬ˆ„”�5ß>ñ’jæ*RØ KEïRè¸xUIö=ºjáÛýÝÇ/~㎧×êþ )Õ'® qV×è)¼þèË»Uê…}vÞºvët~MEä*ñÖÌë¾øØg¦wŒÿê“7ºëol™ÞR¬Ïë¾ùó¿qWšMó¿®{ÿ-Oî'*)ð^œÇ�[üÆ´öÉŸ8 Þ4@7>qÀýÏíE»Ïî¿êäeRRåãï:äÈ=×}áì‡ÿ÷ §!‘ñ ‘¿Ÿ‘�þ”¦{ SN�m IDAT§Áo,Ì×pEϤ€Îo^ö ôD�Â¥Ç>sÙqO]xÍ%}#íì!„Ǻr³@TøŠš4Îî^GCÔt/ª) èjµ�.�Ç�![¾Å1Ÿ ¸¤Á·›Û2…jÞØœ‚&±|·£3´b;…w§tQ.)Cæ“Ò”'½¦[ÊÔ¦j#©Ï™¯âÕ*õ-4»§Ø‘Ãf¨‡‚Û ï¡LÞܶ˜ùövÃö¡ÐUÁWÒ¦wFI›£�º<–ò!¦-~°Ð*€"ØMü²¤±&xè­ȧd|Š]@݉ñàήdd#ˆª ô9-DµY?DëQ±LQH@ [ÂY aêÁ$ÍQ5XÄð7‚!�¦*ÒU`�¤KèþÅÔ%Ba®-Ì,¬ÒN"~iOþK _à]ß[ôZe!Ó —“Dm‘ƒOIž;Á�>›îAWˆÄGô3î&Ÿ¡ÇËÕÄ./uþóùî=oËg~yÖ5Wܾjãìÿ¸éD"˜Ñ5~Ãç~»ûì~kqh¼eù;ýìÞ#W®™ ɃРÞC©·Í0ÁŸXd¨\lüäïn¹ï¹Exì ïHu\ÚKâio—ðv9�S¾/\ºò[ß“ËÅA€}æo=óЗ姵xõO¸öÞ#•Ç€3~¥·sâ¶eû-˜14»k´§cü„ýV·”ê‡ìñ¶1@}ÃO®Þ¹Ùô>»­\ýò¹´§üëßýËùljÿÚNýÊù,Ý{íI_ÿøÑ{¯ýØ)Ë>ö“óŸ_?‡-›ïgÞ4/^ºò£'.ŸÛ3ºa{×/<âÆÇhPŽº[Ç/8úÙûŸ_´~kÏa{¼½¡¿›Voœqïó‹``´õòãŸb ó9jŽ#“åïÞqìá‹ÞFÀ\Î6,ó4µ+`C¸©í·•Kvj3;Çþð¿®Û#ˆÍÎÿuß‘+×ÍM”A×Ã* !„DD¿ ¥œág¹Øø¯«n¾ïù=ÿ×%iJ…Pà$Юû®U-åZý/Døê¹÷]yÂ2-Š÷¿°èï~q~­ž÷ä‹ò0P.4~zÅM÷¾¸—§PÉ>Åå.£^³1ð¥÷?pàΛþá7ç|ï’ÛÞØ<ã_ÿxª<Â�|B`,¦Œ‘xr‡e¨ã‘Ƭ €@‹ˆ¶1ÜÖ]ì™Öéa5çxxGH>ˆöO@l/@{ @ß½±¡Ú°M²lCëÄmSpÞþ/Ã5¨f„-àݦ"À…|EcM Ê÷»ŠyÅÁØR¡XÈßqC‚Þj²$Ê%^ Fèâ‚zØ1 ­—-GŒô˜7ÚLK¾ƒÝ†÷Ûön1¨bÈîå`ƒs{þ%HÃtyµ†×œ±&D?wPõ¹î´h3` ú°n¤Jõ°Í&�JÑ.OY³04lh<¥È|ïŸÜ\˜n1_Ëç9@Yû”g½ÑQÊ#FAjžrÇ¡ª)®‡mUïãÒ¨®G�æ{07ik£ÐЮOëœ{¬Z­oÞÔSì(k#±¸€¼¾!“°bƒ¨Ø ݆F='’/¸zôÃ÷˜{÷B�Ô¥=uúH0A¬¥K“ä!û–0-�¨¶TˆšÌàÊõš¶/Í€uH¯Ò›‘ôhVè!ÆD/bâQõ(`5”5ý‰^'CKŠ^†ÒDy¥–—|4›œû4'>œØl‡™+ P4nÁ¶³;‰^Ñò…‚ҨؿV1º›dÞ7 |'`Š#IXú ”Js™%U8áÉr™Öl,˜·ÑÓÂ|Ϊ¦1Ôï'.˜%Œx"ãçä�Ƚ¦ @Cc-cÕâxµ4V)�µÈSÖÂ÷ï<控Ïï¾ð˜gùÉÿùâu§ß÷Ü¢,ë“°Aš‚;‚!Û£d[Kõ™]cL»¿­“F˜`ÿ�r@úŠ Š‹yÚ‘/}Á—~wF[©rÅIË7 L»mÙbrïÓ¤s�|a§Þ¡Ÿßÿž‘ÉÒ ëçèÙuÖÀ¥Ç=µê­Yol™þ±Sžìn›¼ò¤åîæeÇ­¸ì¸ð誅+×Í›lº Æ`¯yÛö˜³í¶§öoo©¾¶q梹}§øÚþ;o~ø¥Ý;['×õMÛ2ؾtŸµk¶öŒM–@º pÖá«þáôÇrï‘ËVï|Ââ7¾töƒ•­Ë÷€s�xiZûÄ/<ü„}Wõƒ|õ§Å<ð\WNz;ÇoøôõûÌßêî~ñÀ¿~èÞýн�ƒ7>qÀwfÓú!ÒöU�c¤dÝCdçu­…ïÝuÌOï;¿g袥Ïþê7~ñ·gÞûü" nÊHBòÅÖ´¥‹'Öi?²Jlên ²º×ÒZ˜ZœŸ]7ï«7�6Y+¸"c•r­ž OêZDêZ‹õ]ãíÊòÆJ?U*I¨�, �·ŽVËc•ÒØdih¢Ì°–T©Œj"ž:u�M6y8ü£ÝÊÛ¬÷wÏhwŸ¡A‰XpŒ9ö«WǺËÐ’CKðÆæÆ¦mU@˒7æiB�rqk/oÉ,Éñ¸Ú߆‹hróTpUHϵul•Z1ÇæU!æeŸqmÈ©&�÷¥XvÈ·ä?ìfJÌŽqAÒ€2‰aÿrV1þ†&T0·@kA9{+­Yÿ%7R’"Âá5D"Ê#´(¨¼9iûGkàÀuÃO®XmT總›·~î7n<é�-3¢´•+ß¹ôOs{†?ùÓs:Z+?¸òö…3J…úw.½û;—Þm-^ûç#ÿÏmÇQ©Ø¸ôا/8æ¹y=#ºnxô ë9¤Z˵–ê?ûÄM/¬Ÿ½ËÌÁÃöx‘îZ±÷5w34Þ[Éh¼×ní]»µ¦wŽŸzÐk�¼¼Û¦�.Wv^ïðU§,»÷ù=õСͦѲÐR¬úÌGw™9øÆ–Ó;FO[òê¯>ôßo:yáÌí׿úoÞ|ÒíOíË£ÃVñ™5ó¿rýi¿þÇ¿ð�‡ÜÍ㯀ýlv¸vŸ³}Ùk V¬™,Éåbý¬C_¼uù¾¿zèÐ<Ú Žz¶�kžóžï}n¯Ãöxë“ï{|p¬üå³\²pãŸÚwåÚyá+ç?ð•ópNT Ú9Àx¥ôû—NkŸp¬ØmVÿ‡Ž~îÆ¿°fë ¢r±ñ‘ãŸ&Bõ1á —Ç/^{õ¥w}í§Þóì^LcÐÛØŽú«Ccmk¶ô®ÙÒûäë»|ûÃwêôGž^3`¬5—£Óz媓—-šÓ72Q¾yùþ×þù¨ÑJ‰ ¦yáÒç/;nù.,6ÿvÓÉ«·L÷‘DV¤¶rõêß=oÚðÇqngK函͉ÍÕ¾ëêße-þø¾£®¾ý"(ë—óô…G?;¯gdÃ`× �-¹îÑC*õ|k±þó¿ÿŸÞœ³ëŒ�Ãv�îZ¹Ï÷îõÆÎ f µh}GKåÉÕ»üÛÍ'¿µ}Ú^sû~xùm gl/êW_¼éê‹ï´|ÿQWßqB[¹ú“+n:v¯µð‹¿¾}¤ýÊ—µ—ªßüãÉ+ÖíôÓ+oúÂïÏ|üµ]\3G-ZÿÝKnÿø/Ï{öÍy@08Ö22Q¬5rÓ-c­ŠÀ¤íÊt^I­qað�‚R²vxÆœ®Ör‘,€ñ@Ë›'çsœ?q“ל�®( TêôÚ›õáñcS—–ìò+ç’– Àá6Á·n»kWƒ³yz-iˆ† Ð,Ìe…çCx£I�iåœLä)2µ|Ø÷Úƒ‹h§¡€«Ä»~²Œ4‰çCâP³AG‚<‰ò9Œ°þ⢂ÞÄ[„„”ЮÏÉÓQ ä¿þmY?»´†÷ä!*h7�C³°f¤9Y­Yk-Síé$×=€²‘Qs˜= ¬ ú†@#òÒ+B®iе‚ñ­(9TˆA‰ºtÏÏäõp;y6)Cõ.Š µ®%É>uÕÀšiÐ2FÕ Rʇ®ø¾Wkµ-„½Ø™7M?Ñ ™S9Îé7ܤ¨`p²I=]Ðh@µŠi@Æ()sauæK R† Q–HèbÊ>(Ñ ƒ¬®c7AĘœtd>·H@*‡¯E4˜‹a 2¡ —€›”…îCêbÀ;¦YÏ¢¹Aê$ùbÄÒØöê^ù9°Ø(’L½U%f5\§À‘¨pÌ…˜&œ‚I‰»ïp%:©›šªŽXGÀš'?i5êCç×oåYð)ÚB”Çp‚®5©¤–S´[M™#È %oöõsÖ¾òÖì7ûz#èïÃ5Tmän[¾ßw/¿cÑœþe£ Î9ìÅÏœõÈ�î^úà‹{Ìïúú…÷– õoÞ|R£aZ¸éSï{ìÚ{Žzð…=Z‹õ]fö w@4Aƒb¡ñåó^8»ÿ“?=oÓ`ga¸íÒï_8«{ìÇ»å†G¾mùb¯‰À }â½Oœ{Äó߸锕kæ-ÙmãWο¯³­zÍÇ8M¾pés_üÍŸüÙ9ó{‡¿ÅíŸ?û‘¯ÝpJ£™‹‡Msß³ðöåûŸ}øK<òùÜ}Œ3)gúrW[å�Ëöo6�‚Ùuéñ+N=ðÕñjÉ ¾èíŽrå–PL�£¸uÅš�ÿÓçE,NÚÿõo~øž�üðC«6ÌBÀ£ö^÷½Ëï"Aw[enÏðoÿrˆµxâA«�Üký5w{Þ‘/t·MäŒÝ:ؾq°sÉn¶vüüþÛÖçgàn³¶]uÊ2ß÷¶RËßõÌÞBÔ…KŸ�¨o|üÀW7ÎvÒÑÓ>yÖa/NÖŠþ%@h-Öh­‰µŽ„dé5¦$»ÖÈýñ©ý¯¹ì¶Esûž|}Á¹‡½ðÙ÷?òÃ?-}ðÅ=vêúú.êß¼åäFÓ´pÓ?¼ï±ßsÔ/îÑZ¬ï2c o¸Ã 9÷R¡ùÏg?´Û¬þ¿ÿùù›»ú†Û?üŸÍêûÉU·\ÿØ’ÛžÚÇ&‹D` }òÔÇÏ=ü…oÜrÊ3kç¼pãWν¯³­ò½;�uãzÑQÏ~þwg~ü—çÍŸ6ôƒ�Þö…³ùÚ�§Ô›9A›iƒ‘V]9 Ò•',ÿÚÿœö…ëÏìmûÉ•·|îÌG>{Ý™oléýð^4«{ì'WÜ|ý_—Üöô~0^-áØdé’]\.6¾}Á]çúâò5;Ÿý/Ÿ¬j�ÜDµôÒÛ³N?hÕ²Õ;7­A„¥{¯YÛ×ûúæΫ¼Ù?­­\kZ\µaæúþ^ôX's•N÷ƒ—ã�L°±¾`´ «Gª�̘Û].äýVÐÌŸ-âŸô«»ÖB)Ýe0ˆ£ôÚ[•z£aõ›$ÌhµÀ9B=ÂÉ1(ájØ$e Ј†CXhærP`Hì¶­NØaoL�ò†w4$¯‘‡±�‡`t`´S2^”}AÆäûLm‹L«ÝÁUñ¶H ’ämÿ¢ įl‚xâ@~â PFÆ×%öY¹Îé*mÏA‹ØR£·F¶Ñ ²d-­‰éÍXAqÆÑm׊Q_öu-{î ¹ÅB=Ÿo敇�ðGX#qŸx“/r‡—ˆggzµ dH2> E¥ÉÓ¤Ž�Œ€ „V(—°>bëM½ÀìËù“z­±¥Ÿpz©#oš~%Å‚˜µþI™Øä Œ[˜Ñ[¶AÃMTýŒARÒPmÄÆa¶,ni<‘ÔF=tVÀDÌ»ðýB †HCü0„‘]Ur@#•0 °ú9,ç‚¢‚lÑ•>^‰âÈMÒ§¡]Qêâê“x:óh0Ô‹²—_(ÆL“ýgýÏËö¼E;�÷›�kƒ€„¼ÄáÔ£*}@Ÿ|˜ð(¤AQö±ã»áx_•®Æu>0Ü¿ÉQôúM¤ÑDa…d|Ãih;ï‹{K.Ï¡÷˜À~/ô�çÅ’=þÊ‚Ç_Y¿~øà†´ÿuDoè°ÿko§GUå�ŸSõl½'éì �²ö}�Ь2ˆ²Šâ¨¯Ž:¸Œ~FgÞÅÑQGÜpg—MY û¶$„�}ï¤÷î§»Ÿç©{Þ?î=çž[Uxß߯”N=U·îrÖï=÷Ô-‚ÉíÃM£�´ôÏK¹uÉØÞ×ú»‡�ú§³—üæá£·ô¶ÛïTlínß¼³ƒVm�Þl€1Q™:ã©cöY÷Å_Ÿ·fûDh˜BW+4LÔW-oí³{ä!L�0tÖáËÿØQ¾²>øÊûfuö_râË·.>¤o¸ž}k�ÇßœG„wvÜüä‚>{ñŒ‰ƒwNoLx‡ZOv€UÛ:ï~îÀKNzeñŠy¯¬ž5ÆŽKN~éáW÷~}Ýô,¯—oœöÛÇŽÚ­³¿µ2ö×÷{rÙž;[=‘.q+¯,¢Qdþû“÷�wÔëšeýÛoä|ÀníÇ�l®Ôb¤þjeæÄþ/žñÔ�‹yÍì�ûjk¥öèëó{cþÅ'¼²ÿìíÿ~Ƕ÷µMn&‚U›§<ôêÞpø¼¦ËO}!k-¬ Q1JŽÞ{ýæžö÷[ó­�<öÕ?ž½½¿5ŽL¥˜ �–PK'wxñŠ=�ûÖ—@„4^»ÖœÿIy«6[{Z àäöjGÓØE'¼rÛ’Cn}êP"ÚÞ×öÛGŽþò™‹óè1›{Ú#$ØÚÛ±©»ÞÞ:Ù¢(Ž“/~hñ1û¬ûÂoÿam×$h˜¸«¿ öW+[ûÚ¥Ó:†Î:lùïõÀÒ÷ÀKß7³³ïÒã_¾eÉ¡}Ãxæí9�¿9�6vO¸yñ¡WžµxÚ„¡M=AßIÑí�sÌüõËø_nôˆWß½ð7�e ±tí¬^}_’`WÛâå{½ÿ •­•±¾á–®þVj$Qµ²µ·Ý[x «ÇÅzýèo§¬Û9IˆvïKüËÙOÌš8°¡{BGÓØ1{­¿ç¥‡ÇJÖˆ<»jγ«æÁŸɼÊcAÊ1Pú"ú‹–ò°M £�i3:KÅØ¿¥:?‹Dä¾2A€ˆ†¨¥ ­Eˆ6î0k·T /ƒA�€ö'7o©ŒÎryìlCÕH˜8]ÐeŠX‹�±‰ XdÉ^_l¢7æ “4µ äU[ëÊpÚá\·ö“NÅf qyz)$X§ ÖͰŒQ ‡¦”ÄÙhµpÀ{Kë>#�Žâ…Ÿ~ØÀhT¸î¥ý;q6?”Úc,!ÕÖUiç`ÁJÀ¦”ùýHþÇÝäù†ƒ®#j™�W¸—:ø]¨ÇÅF9‹OñŠñ4†+³^ŠU<;s%üù ;„Š€ ›¤�pÝß?ª9 Én#(NŠ ƒÉè($–‰„*0µZc[7âä2ï@‚¢aŒ¬Á¢ôçŒL› [·ó¦ÐþE/r³¼4`Ò$J� O�Àæ�OP£oMO (éa4O8-Ü¥@¶œ�,ÈØuDLTÏT Ðn3.Í#«PÊm QÂw½åQ*}d&ºÒœ{$]•þ™fŠÍ yašÈîÚÏKDŒ°9è…ìÈK‹2ç¡Z oˆÄÓ û<�ÝÅ%O>„Jê22“ÿHNÍÊj³l¤•6ÒöÝ�ÅWág™š/"»–ldØ –ÖÈkr” ò­�“H뤈Ä4¹  ö¹€êaÑ ñ4ª³16’hR[uÖ¤þÏ}èÙÏ|ð[$ŠÌH­ÔÞ2º¥·ý•Õ3o|âˆk?yÿÅk_¹á‰Ã—,›Û0à0I=‰/mÂ`ßp3léëHŒ‹^oëm+ÆfJÇðÆ�œ³UÙµVOacðO‹Ž8ù€Õß¾àáoüé¬oüÃã�FtýÃÇ4LÌœ)¡%Ë÷|ú­¹×^v|ô¸×ÿã¿ë7)ö�ùÙ?þÅÖyÍ]§]ÿðÑÀ±RH¦´þíåýo|â08lÞ¦+>ÿý»O[¿c‚r#‰Wnž"`€€ìªl¹ØøüéÏlíí¸ý™ƒçNë¶f§°ê+ç<ùøë{í7kû V<üÚ>ÒMm'ØÂ‘Wb"˜;­÷è½7üùéƒ}cŸ Oxõç=þÍ[Î,Ħ©T)“aõÀ°:Hâä�U[ì—ç ‹=D‘ìl«ÎžÔÿùÓŸùǸ|ã4åds•œ¦´ VŠ�›¦‰’.ß8½RjLïìn€-½ Ŷ‹ÛúÚŠq25ÀÙ<|†|öç«ëfþÛ§�Ô H„;Z€‡½¡{B­aç®4Z�¢È~(�” …î3ÜùÕÛ;7÷¶ùÂϯޣ:VlŸÛÚšG—¬œ«€WÚèÉui&�,z`ã”ÃL)2£q¡:uzg!ŽÙ—;«Ì{Š”'$¢Ž 6Ⱦ½¹±mg"g¼ØÒôS¿»MÅv@Mâœè¶ðs@M’yå @DQ�ЦV™ä3W€0i*l5qÒˆD‚¬P6«¼Ž/rè¹Í¥QïD YI­„ú ³÷*ÿÖO^˜Z`ßjGèP—B3/¢ Çbïƒ}[|ŸçÎ[›+Ci˜`õ`R©‘1 Ë1 Ž©»�3´ŸFø"áeDºÿå}Wo›tíݧüàÒûÏ:lùÒu3KŤ¤âÀN˜£ëiçóá|Ø€ƒ%$n[Ë Ìîì�Àìh%‚„¢ïÿeá#¯Ïö®¾V¬'…ë<þÏOráñK¯¾èïëwL¸òOçléé°­ï9µç´ƒV=þæ^Ÿ<å…§Þž³¥§Ã’˜HöU­ž„ü†Z z€‘ëW1®ƒ³ïÅŒEÔ¢º<¤]ÃH­øÎ¶ÉC£e`Ÿ"²RO‚ï=°YÈÚŸL0i´^l$èéGÐ=Ðòèë{Ÿqð²{^<àø}×®Ü0w÷×Î{ü7œ5Z+8ºa1N<¥‰¶÷µŽÔŠûíÞõÌÊ9Ö4ì»[W­ow¹%0wjO¥Ø©`îÔ�õ$ÞÑߢÉ�¡2ë ¬Ø4uùÆé'ì»zÙÆé¯®�•K©”®횸rs§­gþŒ�—�üâ oïæßƒ!%Ä©;ÛF.=é¥KOzIªÓ9Ùd7ú¸ñl Á o¸iýŽIç¹üê;ß¿|Ó´áȽ6võµõ 7­Ù>éW³tíÌ×7Ì-Ðä¶*ܼdÁß_Þ—öž¹óóz†¼bcXxà;ûúï?òí-“`Ñ›ó¯{ðø ;&¶•kqdl W†ë�FHDq´n¡D@{?MêJ©ö‘£ßØØ=aÕ–)°µ·m�)=[úÚL‡þÞÉúŽ�–Ÿ=pÂ__Üÿ¦/ÝrÊþknYr¨•Ãþjå«R+ÂÜÉÝõ$ÞÑß náR[Ÿ�„Êð¤÷ËJ䧯€T[^¾<ôú¾ç¹ìˆ=75oý­OZ71õ F®š_*§g¢ÚF{Çw‰Ò5ª¥¦ú´iÉ­óRÄaT™kÙö¬�)ÆÐQ�R UX±®:R¯£Mq Èûñ~î{¦à>¿há|£ÛÈbÆÙÄñˆq"‰"n�œp„ЫÕÌD FôµÅ‚!t%—в¼òæxB{’ôáZ'ËK¿ª¨øÍö–''ìâØñ¸ð‹ã<ÛFä¢vä+ô.“Až~S*8܈tÌÓö¿­€M ÀÆ1Ø6X“˜$Yµ(Å;‰øHÀÚÇÂíd§>ñö"Ä –êåÈ}“u…¿‰�é¹…†ùš9.È—©®JzqÐ`nˆeÌuz6¸ª}Š¿£2"D…I ˜Ñ12ž‰jî=:2¶¹vŸ\.²´ðdÎ~ UcT3ÐÒJ£5UBgk»à×8ÄFùA©Ç$4 ž%^žCC#qMwש¹m ±rzô)Îè\“ÿ&ƒ‡ÃT¾W†oviñÒ}sTÈÜ'6D>.®Š)ðÆA?�A²ªÓ¨Ÿré "L±Eæ¢,qyÉõê8g»žÄÆ‚æù ×§MfJïB‚¤¨å#ù®ˆ‹)“˜9äI5? çã6àú­Äšo¨6½4X©r¸Æí—â‰íz`Vّߦ´#ðQmPæ ±šË<:Ll­î5}çœi½�´ôÀ=¶|åwçTËp듇~ó‚ǪM}q¿z=ÚgÖŽ)Cw>}p-‰›·ivgÿ«kgŒÔJ‡ÎÛÔ\nt6»†ÇJ=CÍýÃÍ×ܹðWŸ¿ëÒ“^þÍ£GÙ/¾ �•·õ¶�qø[Ï­œÓ;\©{&ìh¹ï…/?õùÍ;;^Z=ëÐ=·^~Ú‹}a¿m}­å¢!€Cæn½ä¤Wî{q¿½¦w_~ÚK‹—ÍÛÖÛꆘ#ÛéØ}Ö}ë‚G÷˜Òwß‹û�¸ÿº[®¼éš»>òÚüÄÇ&µÚ¦æÚ ä+ÖÙóE‚ef,øÊW`ÎÔž]~ß¾³·�Ö —ü÷Å+6O€ImÃ7ÿóÍÛú:Ø‘ŒÖ w=wЂ=7— �vßvļMÿÊßwÒðX±:6á—;}âà©®:b¯ ó¦õ\÷ÀqD°v[çËçÀðX)iXÁÀTÿŽš¿á?.úûëëfüþñ# E0Öˆ¯ô(XxÐÛÒÎÁ¶~HxÊ«®¾ä�ïÜvú#¯íòÂêM3LhÞkú޹Óz/>ñ•ƒvßúÏ8·¤Œ·,9ô_Ïl Z¹÷¥ý­ØLíºý™ƒëI|ø¼M³&õ½ºvÖH½xØž›šËõîÁ&éÆÐh±g¨¥w¸é?ïZxýçîºìÄW®ì(Û™áZi{_Û™‡­xöí9½ÃM•RcãÎŽ�-÷½tà§NyaKwÇKkv[0w˧N}ñÞöÝÖ×V.&°`îÖKN|ù¾—öŸ?½ûòÓ^|rù¼­}­ÊŒ`RŒl*ÖçOßYeˆ?4ZÙÜÝ¡% #€ÃµÒö^Ûù½Ã•J)ÙØ=Á QS±Q)ÖK…Fs¹6Z/*ø ïlë\¶iÚÇO|±©Ôx~õî\ýøù”yÒžò„¹Q^]ÊŸSc¸Ò’L™:Á×o] }=‘K ” nk‘î~zk}µA ˜Ü+5 ÎR­ÏY›†`‘.¸\@ÿeG…°ÙZ��ESŒ0¶U…‘¬{•Š]¬wÕ±) ¼m±dBY,¦”}FÃPÊ“(Ï×Ñgw ðb¥£aàÙÔv~èâ € Y ˆ÷㓜—Âáê´M°Þ†ÉÓ!Bà„×¢Eií("�¼3l†ê†Œà ÄÄÑ7|b¢ðR3'Ø¢ú¬½:iqËßî}G´¡häáè² <ú•M®Såd�I ‹)ô™9(Oþ5âábžKRDÑ2¸ètEUÊþ DíqsF‡“º`òÝ£‘á±Mq4gRQ4dËHàÔfô'DPIpòDز�ƒyzά îH§–`@ µ⦠Á;¸úÕPYã$f� §5`óÎ,Oò-ä)W•#VÃ0ës«ü¿<4P‡Ÿ6Sþ‰Ä;rø0ÞR›#¥�‘ÉäÜå�0¸à>1…„d\ìÃAóL YË")Úòg7ÂM—IU\ÈÛ(ç¸Lþ¡Ï‡xÀ^ï2½³fP,°%™Óy5˜Âbfìüžwèvs6ÓŸÒ ºá{®°¤ZÛî¿9-¢¾|öâ/žõtW_ËÓoͽôǯÜ4ÕÚ‹»ž=°o¸éŠ3v\ùo¿LLtïKûÿ输¦ f^R•§s7ß÷õßÉïG^ßûs¿¹Û—c�†G‹ÿûîüëy�ÞûµßÙþë­g̘8tÓoš3¥Ç¾7üÚ÷¸±{Â'~~ñª.»Ù"ÔM|ßKþì“wÞõüAÛûÛ€ÃÈ)öØóÀ³(Ì i†…Ò}v&¬1ØÔ S¦´‰Éñ“¬_r{@S :*mí¡w6�h¨‰žý$’{ Ã%eÉ%G òNw·y;÷·ØÄ,f¢Q—wiðd}µ1T*C!âíTnøù€[àpSJù 1ÖsN! ù³Ž<š’™\à äõ.7â¬:Ç@4dì§0yIÀ~¹†—˜¾jŠáúšÝD¦Gí1ŃÞ0£cu€„CD²8þe%HÃdyߺ=cÃîKC…¤Pl#5�·@Ò‡'Ñ#3wžEÒ*ÌœE�U]ݾ˜\B§«Ì¦ŒÈd…Ç €Zà&)ëú!˜D €¦¸R„¨¯1 ij­ØVF7ǰ[GÉ0ËP}½ÈÁ1�.ÑN¢F §v¶ÜAÏ1pá…„È¿‹Ò¾èǺW „DÝ‘ˆ1ݸ|�,¥é ”µÞò¨ªScÐÆ[©ÎÖ1ïvÈþŽsäÜrª‘St�­J�W†m~à…õ¾æÜDE �\„t RËð4ÁrÓ7 ¼ æÐ§†$ßçÖ6€�âr–&è‘_¡t  ¨+ [;D€ê:¿ )Œm’Ô �}n ¨ÜÀã�ùùÚÌéS!Ã2)3 ‘T‘<ûåÚßUý�³ÏÖ!ÑýDs¹qýÿº}ùÆiß»ë4ϾgfMçYG,ÿÚ‡í>¹okoûï;ê–% ª£E[¸¹Rûø K/?í…™“ú·÷µýø¾o{j��# ýà²û:ÛF>ÿ«ók ·+âü;Ãý³øÓÚT;ÿè×?~Ò+�íÿþûÑzâˆã÷]{õ%~êº�¿ïÚoœ÷x™µ]“.ûéEëwNBæ3Œ;|ÚgæŽòöËkf/]3k¤VüÔÂçÿí#�X ¦cðûƒ{NµdÙo·í¿ÿŸ×l›tÕ�gmîvï_FW�»è §?Ed ÞõÜ�_¿ñ¬zR€ÌDAQÖÝõTZ­×©‘+Ñ–ÎW 4ReR¸1¥c)¸Þˆ�VZæ3¥Ò†/0ÈÍåúo?÷çe§_ó—…’¥œ>pü»N»$v¨K§êÅpp!qœŠùcîÔž?}þ–ïÜqú¢{©äkμq¿·Ã×Úª´Ñ”Éí¼±!€!ˆx}QƇ†¨¹me@¢ ]fCW•\Z‚Œ‹Ôٸ솈¿�Înˆ–#€·™L9â\Ú€ò¨X” ˆ®öÔc ÉÁÿðÛÅ^ epμ‚Û*Ü¿ü˜Ñ %uÐA[ Ð�ÀÚþ¤Q¯Sb·Ç&²èÖùõ—;È)>¼òÀ§î¾ «À4D–ëÅu¢àø‰!÷Ø%‰Þë‘Ò£|ç•z$в,Yí/™ÿ¨…>�>ÁO5zë#‰ä—k9„hò”ÊŒ–bBœ ž³< ô&dJ1ŽU¡§òÈ:ÞE¹%„PzÀë¼züÈÃ!¸Ájtõî\ sKò»è­ z[ÿÃIGìr‹½—‹á!¼~/B™í=8ƒáóð%),·Ö(òB–Ôª¤ÌO]sF^޼CeÁ»ôÿÝûtµ©‘½+­Qm ²‹Æ´û+Šø¾"X>im™ÄPx—U²Y·ýä_çg“wfîB¾ËN;CZìB°œ¯‡¾¾<›%ÖJ)‡S/å­[gßJ¿o¬Ü2uå–©rëÑWçoÜ11ƒ ‚5]…×Ë6Nûè/Ý1ØZ+Š8‚[–,ØØÝQ.$[z;žZ1·–Äv˜)[¾3©–”Xf¸Æ¢ËÔäƒK)ù lTÚR0qÊ‚lðo€!Krd –ïiZ¥ôÈÇmŸ/¨"g$‹üyäÒØÊ×`eY¿àpü>k{†›–®Ÿ™Aàøì #¤û< ©‡ƒ•6šÒÙn iñ0Dèèk”EàÆPkZK„ïlI¶öT) p¨xnÃÓQsޝl–,޼u. @…‚lŒíú!OïO¼`z³̬ؔ ÉFëuìÛ1†¢ È6Ož~lÓ´óë¼Îf±Qidùˆ©ÀQ*�Oi´¬•çç#ˆÜ:½ƒ`ò š>ˆÅZchF2„›ë°¥¯A¦F YóAd÷ ³ÄËJL^†ca!b:¸ ˆXHâr£ä¹H:êQ‹>†ºã‡ï|•±£c_º¼DòµyJ�üÿ@§kÔÔ��mH ŸNWjÝ–ÚÊÐ\"\¹qlgÿ¨K%´7‘ñ€m!B·ñ¶CÏNÝ:uN?°y$d‹º>b„E²ÙØ®Ï !‰�É2"‚1T¨$[‹ÚMÉÓî”\ÇP’ïD¸Ÿ�–,iý˜ï4Qˆç;FA>)ÚÌl'¸ÿ(É&F'®q®E3×vHü $D1󣽄Áêê¬5,ȶ›½ï×ãÂØÞïªy‘Z†p+Â2Éü±EKõbÑXúBꨰtµ3 ø¹‹c|gŸ[z¼êÒ}\ÃàE¼!bDd\O¼5äÜ|)ãdÈ Ô†Ç(ÉôK¥ÂÓ*åBlxµ„»Í½w"àn"RÃ@S[¶ƒáÉR®;à[9!Ùr;ð?|âúà]€Zîð`DI¿¡ôõ]¢×ÁÌ9Þ$ô>"íy[©Øß9:Çj¦²ãPù-ÙHÏ59…O‘�Ä�#¢)‹•K:Q6åòÜ9ú‡4iò%�/"r×gt Üöå›&¶Tïxö�ÛŸ;80«¤ê%Êù…´8ø‘eûÀ�Õ›Úaòäv[‚ý(‰-0¿EíMØ\ ÄÀŠ µÞ¡Q•‰k;%;7 ‹É~TÆ!îHàðë'.¶¢rcƒ,»V¹ÃoÁdœ¯�@Qžï$&i+GŠ‚¶yFÔškÞµr')gr/÷ùi �2Š{å"�WH üSûDãÄÖ-(ˆ ôÑùPVb«—À(\s"!uÄPF!xgˆ«u²Ûc¹ª»¿Z>"¶Éd{x ‚·½›’‰ÄI\n#ŠÀ÷] u ¥œûáÅT¦3Þ·e +´9euï ScЯŒ©›A="_Èá{î³e7F>`á8$·ÂAÈ b{©e¸>RMê©fjõz×p4»½âˆ#º,¦–3 êFu‚Î ´£G¼JÌQ:”ñP {5E'ÿÁB ø¨,»ŸêpIpST8m‡w}ǃ ¿—'ÐßÂ,ðôUwôÝ\ƒ N{˜A0N¬:efÇ?ÛkÏ „<ÔΑc=ð&M�Ò‰=k`› cM¢¡ZÕ¼¹ò(D‹kÞ(ÓAR®B@KþrêRð�OÐW*'vÒ§+ëq§*VS ¹ž|æ´z‘ßɆkP2-ö†Hy€Œeí�k�?æçÌfL}Ö1 D�§ªöÞtV¼ËÁyr5¢¢Žn!Ý­À€ú!}KýL§3áÃú¢êBºp¶íTU®ãAî ªM[^‰ ·!¸P8ÎÊBþ\÷ Yô){9­÷YêêîúYq† ^ÿ(Í�°�?×/¸ ·›l”ëõ%}‹AïY÷2:ÌB}¦SùRœJÙ!îJ€Æ=Þý¡¬ËGËqéeÆgücî•l#¤.?Y.·%S'w0­Ùjó“pÍÐT„z–­¬Ž�{ÏÛ3Ìš YGÓk°I½N˜øž…pÒmæ ¦GgŒ¹J�rü “ŒêTŸ:©h÷ÛÅÑ…}9732`­QË>n ÙEè\mr”ÊD–d„€Qj¢ cå @›Ã•—mQÌ”¢Ò¶ûPˆ°£1Ѐ�5fd¬NI>›@ÏV‰€U I6= O� üí¢.€ˆPn‹I1 ¦‰ï ýžŽñÕY¨Þö­»IÚÿ“Ëz×Þ©s=²43òôÀeÖ�4F‡5¹!›¢=¦´”&3‹E9ƒ±[)…:AKz{i¨ªû•Ba�í2S^’ âA9ÿ²W�2‘–yå¼v½yèRžÒ¶=-4º9Ñ›ÊcÙuìÜ7’‡!k^Æ‹C¿—»9åÓª€zŠ˜Öx‡Í¯ªÙ}މ—¾(0�j#]¥�]Þüx"Mm {‘õŽÙJE)Ô-K )0}D–íE¿(L¿ô‡ªYø¢„ÊWÃÆ¿nE&õLÐ)‰œ ³ÙÔg‚(5äæÛhsCFqÓÄâ=Þ}‰;âŒtÆ•ñLuHû»,f z•'ŒY%åçœuAý @IR£äØ<;1\Ä—@Œ¨Ú¬W/‹Ø›)ož¬fúÐäÕp�{†ą̈AÕH!uì/Ô] A’›a°ÉöOÙÜ_=!±°Oò�Á{JµÒâòätö|š3À—sxï¡î#�2�dçKãY)e›Î×�D ”„)³ è+µ!]ЀMêÕx:¨aÖ‡+-É”Éíþa¿„â0:„‡†¨£šb«ÑŠõµÁÚ˜ÿð-ó”Øk#8¼lЖ@àlldˆøs3ŠAèRT„úP‚ÿĤ`�žÔ¥é¯,ƒ!S*aŒÀúDô·i\Û:”-¬�Ù]@`/½GÎ�Fã 6Ø©‡�¨à$øsO"JÊ–¥àVK"@tØL��Œ«Ý4EÐV èjÀzûÖ£Í öÿ7nüDAt€ ŠÐ!iªõš”W*Ù1D•Z™_�TøÄ›|mãŒ'¦Ä}8æÉçj5–¬57¨SóÇ…P)w‘ú¢M®Á ’ Žc+¨²C¼zà�§Êæ'ñ˜\·„«dqyE[+M1E#¦^Œ±XˆÊ帽—#4äÓЩ�!Ë7+FYz" "bµA�pt ‰¦Z�IŸèDÐ(æÀ\ˆRƒ›mÊÈ ¥³Ì-¬ê§¼¶^·@ ’H¶Š½° ׎3äc–ŸÚ8cjΜe·c�š™Ùú¡`ú˜>œR¼ÛÌ?Óýì5ï,)?ˆ=•5`ö–j%˜»Kn’Žž™¥�ì9¤è¹koGyÃÈBL§œ+ó Ú �~NÎÞ²¹ÅNx*œ!L ¯;rÏ�‚û‘yÀ´â?xÛ“T$²ýÔA5_VcïcíE^3³%ú[IQUšw|÷”çpbšyéš#å @XOÈŸ]4Šþo¸”Ÿ÷ +)X”‡êáTO¼<’¿ÌF‰}ŸJªKòlR-7×§Lí¾„¨:ÊßβhB 6Å4RƒeëG«µ:ZÀ–=2/gù±ÞTÑ IDATɾä¶¶Å�7ï/ì³È;÷±—fšûý¹2�óù<ß™–ÄÙ0¦-M‘—Dþ�xXg¯ùË5ä¾úΙ¶vpÚûZÉa²É6&Lkê Ûtbt ¬OçmG�Ëësx��°½(2é5L&ê-l�¶Ô`ã@bê5ÆÖ@D6oÄ…%K†e7�Á`ËE±ãÀ�ÂlD,6 %S ¿�M|Pk–>׫זr—¿DÎOY:f«PÒ’2à€YÃ~¶ÉUÌíHPÃ×Ê� û :©óHÚ2:Ð{[­ö,!!Æ�€‰bcbÂE”blŽ‹%,EbdÜg�­á#§‰Ø�†zïlõÊIz„0b`òDض3T~o˜³æ™SÚ¦üFH:é0nóNâ‰¬Š†ˆ¶‰"wÜü.d—Òëx+0ÐûVm«íO=×BÝ„§‡Gz¨TžJ[Òû–(•´;ˆ¹†ó7ÕyÎ~a[À½–%Ñm¤ˆU_QÇÑ™9è§f™C‚ï¦öŠiæØÀù¸Þy¬9�å?‘¹§Ý°* ~]D´ø¦Åb§;æ¤Z+!è¡û¸’«ˆä¥~IÀÃM€;KV%Q_!¢Ôwjd++kÐÑ[:Ö]/³ðJ"ÈÄRˆnûÞ9cŽâFÁëŒÈrPZS> SêP¼fƒË±mõ+¶C Ö «fi“’A+�œfV¸ôSÊê*‚·æ³ëqd iÝ¿ ×õä/`yAA¯»Ìv5h÷3p1™ai©³„C­-üdڸȂ×ÈìQžXÇ͘¤©zÆW|uWB�º�p@bW¼/O 𽪠æ¡d®!Èö<—w�>xßàgªÜ€t=ÚØ$£ÅÒèÔi“Àpž£/'V†¯Ml�rDÕ1Z¾a¬Z¯;³†Îàã:ŸAá"(^[OíVÖ¶±˜Ù²`°@Åý§ìC‰Ìdñú£œ°ŸÙ¸}]â¤xxÀÑhŶ žXA „?X´ :S" F@ùÑÊtÔoïA5=H¡I÷w´&ÜybÛ€Va°–ƒsóˆÚ ÐQ°q¶6 QçoЖ×KÀe 1lÄ4˜/Ë@-[,ìCŠ *×KŠC#Ár¶ÁrOb˜A­ "CÐ$»¯¤èSQUSÈni1°ãª !qxdu�ò :?( �ʌǣ|¿íâ F�DG Å„1ŠØ„TŒãF#Ã-vñTC"¾%å$.%å2´6ãаZF£pÔ$íÔSI~Û¼¼– ÖRyú'Ÿ;š2ò—¨³r|Þ€¶ÀñÊ˼»�¾žãJÒ‚‘‚!95 v"2€âÉF€·ÈýÕX@̦Wam?”OÑÊ`Y¡Ý2�ö�ÚMêÁ ¨G¤¤®œÂÃÀé'ž^ÚÔ#ØP½haºïYSû^ÌHX&K*ÇR½ãU¶Q ×cµôÒ'PÍÇ‚’[9IjQ\�>cº 1G)o¶Xð;š©RÀê-Û8:Z¯¡Vûé,…Ó=Δ&¡n°Ûú�[7Ñ!ÔG‹QSfk¶yc­›cá+ ¾iGþ ,!VBÎf„Ý> “<‚ 3 í†å”uÃìÌ&s�,«˜ëÍ”VN`fõŸ!&DOÐ)r_Eш; P‰ N°vºkd2öµ.ããÙ–Â$äò«)¨ü–Ì�„±~j„T ¸Ò(+¸åH¡—Ï<Ó�5³"k‰Át™°E‘dq1AþÀ{;Äv‡*ì}–*B䦖6„`"ƒC‹T(`9ÂF±#Ÿ—<ß!3’ŠÑÙmx ïáèéý ¢Ûð¾Ú€IPEcÔpÒä¥mÏID;Å”t44nVôL^3�S:ü¬I*‡[°‹P6þN+¹¶lý6­H<{æ.ØdƵy€±kß3UUw f9Õ¦b[`ЗÑFB¼<²ÇRŒ€àA ÿ/*®å86Ò�’ªB ®¿W%ÊÍ¡¦.£,¬üL 2JËcªòܾx;$Ã&Ör¿>Ž@Àâ… ™-•}*üd ôÀ‘m°D¢ëK¾bâr£Î,ÉÙöƒíö¥“aÜA¦ë®NÉMK™º Ù2y¸Ã· €f& žšø{Gò 4úH±»½iôÂã_}ü�½Vm›ÞÕ…EHPó]lûQó×û‚G¾qã™on˜žy\�� Q£T¤æR­¹4ÖÖ\ŸÐ\�Ü^�1q`÷É=}Õæë<¾:VTOS[ÓØüÝqäÌpÏPóº® ógìl«Ôlõ†à�­Sû«eÈ?¤ç�‚뎥µÚ£ùLÐ ÇH»wtˆr�D8sÝgx1¯€ôH;Ï pvX© vý¥± n§òÈÇKÔÖMþŠ×Ìi-°¶j*%&6"˜:âдY½«ó¯ þÓÖ×Ñ •ª£æÍõ£c�ºU´�9{äl…ÍqLÒE�q C S·F#+@RƒBSÆFøÑ‚p€ªY…4EÁ�=1¦­)F•!jøÓŒ  ^{�¤[¨<M ÏäTÐ×[EkO€Ä-8%ðéw(¶ƒ€oÜLÈqÕ ›‘L®Jm†¬B¸¸ °=Â'ÄTF%X=ýÃc`ÆÖ6'\$Þöß’™íˆ =Ø0� P @9)íwÔ]—üÊµÝæ$àJÀÍðZˆñ ïir°u¦lÆ©ç‡ft‹ÜJÄÀ׈›$/àø!EÆÄcS*b!¦rŒÅ(Ž,$„c˜]¢£!’u$'}r7£±»+ƒ&y‰ cËB„X#êœ;zR®ÇJlä"r©/.�ŸÔ+oˆk_ŠxVuRYk)¦Ø l–ˆ7q)D"2hГr¦aK4>OïŒÁÏÞid’Îïç[œ€dµKô%Õ¹LŸ2CðB- BÁZ²3 d\^[ÊÅŠDrÅv„nQئ䜌çSÒ?í?»ø¸}ú�Ù×íØdP¶ ¥{­n©¬‡Ô+Uñc­°·½Øû…'âø´ºÇÓÀiÜì]Ûj8bر ÷Rëø™y^zT–Ýê—´$ÒÄùµºuvø¤æ^)�ò>Z‘Œ÷ò&/Epäjº<ç{Ä:Âö“£6æÔ¦š°pO øaÉ™!<ùÀÕ{ÍÜñ­›Îèl«þå˜Õ9�êJ­îWyôµ½u-º½R!™Ú1\*Œáà™ýƒVýò³wWJng("HLÔWmêhéêoÙÜÓÑ7ÔÜÞ<êp6÷ùà9[óù;Z+cö÷ƒKß÷�›ÎøÞÇ8|Þ&ݽGl÷Ø'd2Ú�}Ul ö~b#�zÁG‚ìu&›RŸÁo[´‰ž[˜‰ ýÂWεv[¿ k°~¨áßTÍ)“‘-£¼‘E?2K•;LDU3ò wàWõ£¡…‚P7ÝOœ¶ÛÄb™TÊ]Š«@ÐÖ•˜ª5xsÃh-qé"’!‹¬´>Ûõךä�-“�x" A)`Ã~? MCæ ˜QîTÒHàX”™fÊK €¦Ç’‚E¼- »<¹µX6$¾ÀÉ[ÖûÀ†øWî Šä3¢’¹¡c& MÂvÝD…¯£ˆm"à ý—�¼ñákh5Š& 0D°j€ªÕPâP�«�pjœ­èŒˆvwë¥1Œds“ˆ@¹^.@�%Ç0ÈF%N¡Ò²+bÚ;JúëãXmä#uiÔ'Ÿpù”{Ê>{Òë!h«ÈÚ ã¤P rK1–#Œ N»�ìg<�ÁÑ“¼9²�­'FÏB56}6ÿˆ"V>@£ú© ÕFª´4AS™FÆ”¢ðËŽ$Ÿöäñ*H�Â;±?šªÀWÕºÖÃeý´áM½•èÙ"žÅ뎜ÿ>3Œ y6eú¬:š1à‹vÉ+Q(fÑß ¬.¢~‡RF ÙôSýî“ò¼Kªl½¥¼%J¦+W› ÚK´ŠOñ¹§B ßM^HO›\q"äl›3=¹¾O�#G‘äZÊÛAØ)x£šböàÜ\G´FÌ£·�’“­µ›ÜÛÕò.�ò…à\ƒã‚~™„ã~œCh/™‚ê2=�4Ú&§Æ©q¦†)ò¯p{fü ›•×Ûu]ÈË*Ïó:gc€šË�ë¿pûÊÍSþóö÷ëÜô°SÞí…ýT£QC^='áÇô D0<휲`ßGËzüð¯ŸÿønSú6ww|þ×ç—‹IŠRD¸rËâT“…¯úÕçî,’TU÷~ó÷úgÃÄ_øõy,Ý—I†KVÌ[øÝÏPÃÄûÏÞþÃOÞ÷o·}àžçI™ÓÉîÁæó®ýÄÛ[¦þðmiª!þ×=§üÏÇï7{Ûÿé61 ÿ8®€¬Ç"}ž¶j±ÖsA•2¾-eùÀgÔ°¹U™ãI�ù#L©Rüʺo*auž’±ñ ¥Æå®O;C”(9 ™„LÚÕγä)eÂQU ˜dûA�þé»u”â(!å˜E‰Ôµ7AsFë°|ÃH­QÆŒŒ¬}°tCþD–m+R±jqÖžÿ|±�0RD >0aê— $;û™\²k3.¸Ê;H‚¸q„ˆ6tíéÂýB·ã†3(þ­o׬ÁRæDGXþEžÁ÷5?YÊÊž7ç–Îd»n0$‰Õ‰Ð}ŠÃ4ˆ}kÄH( X5`FGÜ[�(l‚‚—Î0ŠP@¶—!ˆv8’¸’c%^7!¼V@S…‚RÅÅÕ¢þÉ‚n“š>X¶ra´TC$§AüÒ÷\Ùo°Øw$‘�˜°q�Ê1•â¨C„…ÈY%4Dh€"Qv±ÀÖl’' ‡ÔEt¹°Š/ä’FœÕå¯Í¹­´S5-pŽ2FiPçÚÜÈ-�MÛ·<:Håòeo–V¦²‘çrÈÀÔ \ Ø?[•a‘×Lßåy…4”OŽñQJú�ºPX£žCU.|<%𢄩fs�,l iï­�uº¿,\bTRŽ‚Ç„ˆõ®\ý l‰Á®›¹Byï}é �Í�‹šV©¼1H† R‚ÂNQú~Pc–—)óÁÚ«§ŽèuZ$S Œ7s`ïò d¸‡�Rg+nû#o¦ "F)ÿ¯}lßYÛ®üí¹?¾âž›g\sûiD0µ}øÖ¯ßÔZýÄO.^¹i žsä›ÿ|îâ ÿëÒ®¾¶4qƒa¦IìP¾H[ˆ‹N\zÍÇŒc³qgÇùß¿|[o+(y� M°õyñlYÍI3bÚ„¡Ï�þÌé Þš:a¸w¸é™s¾÷©õFüç«nl-�]öÓ‹ÞÚ4•>|ä²+Ïyòc?ºl{_ÛÔöÁ?_uã¼éÝÆàwoûàÜsÔËÅè/žqè[?ÿì_ Q‹þã—«·Oþѽ']sɃ[«ÒcðG=ùùU»kèËkf_úã‹£˜`jûÐUç-šÒ>\ˆLÃD[{Û~xï)݃Í@ßÚ:…‡I´ßn[oøÒŸ'´øÊvÅ=?»âù™$Ñ7oùЭK„"­èâý}À(ïsŠøæù�2gË—~{Þ꯫¶Lþ�;>H©ï†çYLë…CEzxX“î¢óv.ÈaåYü¡œe¥¼¹O€Œd@AmòÄ�y�ï@ŠÁ0Æu¦dF$eU„²Làjs•šX鸒 ,H\¯uõ�)3[+ÅBâ6 ³!T‘]V&$ hoÆæÕ°lýèh½æhÆ~„#Œ²ø-xët\@þªºŒ‰ó{©áhI¯ZØ¿I âRJÜ9/ö…™Û"¸,tK 57ƒÝ˜W”Ëp64Ò¹¡žìÂgŒì@¼—óí ylAW §í!V¢ ªr¨Ëù,çJä'ã2Î@‚ˆ¥×"˜P€@O«ûµ±†‹¸C$ñli÷/Fˆ. ýÿX-ÏlúB9)–ŒÞ;Zò L«´ØÙ�þDbÛ®&•û¨ÖôݰÚ]J‰P±'ìJäD� PL›¨¥˜Z Q)Âb„…Å�‘,–G²Ak ·¯ÈD貕@â,HÆùÅÈJÁ(UÒI‡!Ø :•‰êPˆÚ[LÿPÊ‚h<£ 'e4ÒRÁ?ÿ«=¸Â~…i†Ëê ]× ÍÃÕ5§Z • ûìFmB+“2¤N×ó,©ÔêßË 91~5 ¸ìâ@g«A„CXAž�"N9-+3#…Ux›x6âòO0ÕmR'�PpF+ZF· ee�éã Mälcäæ<’jjZ‰ÈñØØÒ¹Ú˜†ª5ß¼Œƒž þ2kR”3r†Ðgû¤ò¾¡ÊÐXix¬<4VîªðÒÔjqRŒÎ;úÍÜuŠÝŸ5äé.Dlâ•e›$x{ëäÏþü‚�ƒ-ã¥üçE€¥?ã07+è€3' üúÝQˆÌî>uõ¶Îζá™�ýÕrs©1V�›ŠxÞÑo^{÷)Æ(Òu ´}èfRkõ7ÿëá¡–žîÛ‹/½3ûÓ?û(FTŽ“/žùÔöþ¶�-ƒ£å¿ýý«6O –ÊØ¿_ô°xW+®=MÏÎ! Ý:û¿xÆSõFôƒ¿œrÅûŸûŸûOøìž½øÄW¾qÙëº&‰o–‡Wlšö‘\Çɤ¶‘k.¾ÿ� 3ùбþõ"ÜÚÛ˜V èl«>ò�ëm™G^Û;ƒHW}xÑU^µF(+cÿpóàheh´ÝäX·/ªêÔhCi`Ø.kJ³"ô <}·Ó5íRæßµXöz»%vi¾Å§‡Ë¦64aj¥¥¹Ô09èÍ£ÜË­h.P=�eFGêc˜rç–qlÝ�5²ÿ0òK¥Wè€s‡�Fb¬Á @àg’:ÅE`¿¡¼©Ì—¬(æ’ɬÛpÅDT.ÅR�¸ú#ÿMQÙ�µF`0¡>·DâÓˆe?p®®Š“n¹Ö|â/[t¶Ö6–Éû�»§‘2<½DÕC"*EØS ÐÕ€u½�F£†Ø#P�+"®ÊN,-$´ ;ŠfElÍöv½ijT &Vs &43+ˆ±¢c€bJ&c[ §ps®wÏ“ïqÞyH—÷ð¦LLÉÄ I1ƦËqTŠâHY3rÙ v/hàÓˆõ…¡ ;i´†Ñ(Äàç‡ÜIcRHÿç:�d{m"²Ÿ\u[Ɔ´;Úq¨ ‰Q„ðÛŠÞ…$É’”<” €®Ä)TgyÞ¤C,‹¼h¦ãÇ©©¨¶A'Y€U± ͈6žY¡G­î¢elðÒšo/õô.Žw“4ULA4ߩ܋lT2ÃÒ³]£ÍQ"�àáõ °"åQK†£¬@î8s¼o82}ÖXAÊV‚\4”JW!9Áµš§wó´þ� ¸�6úé/ª¡tR@b§ <†´¯Þƒìjênª5âþá¦Þ¡&Ýû^Þ÷ÄýWß¶xÁÚ® lJö˜Ò{幋�Ýwí¤¶‘®¾–;ž9ø×[+ž¸ßê/ŸóÔÎÁæãö]wÏóÆQröË}uï½ñCÕ±R™3{ëŠ>¿÷Ì®�jù®gþåÇŽ”ýx’$-�x�-Anü¯:æ{wžfÏË…äª?ñÑã_k*ÕžxsÞÕw,ÜÒÓžfŸg7"ÂÅ'½ÜVûäÿ\¸®k’¿IÐ\¬Àý¯ì{âþ«o]¼ÀÞõD%­FÆŠ‰±K»¤þó^›Ä"ìh}üÍV8nŸõÓ& ýìþãFkE0 6  1ü¢·3“nÊEÉyû[<62Vüì//˜Ò1 Ë7N»âüôÓ÷ÞqÕ ?½ÿ„;ž>h¬nßhD:eÿÕ¿þüM%ÿÙÞ¹ÓzÏ9bYJGkÅÏ]þc¯Ïaz}ÝŒKza!68¡eäÛyôÛ<öý»Oýúy‹šËµ?>~ÔšíßÞ2EWb�fÏPó`µ<Öˆû«Í½ÃÍl,XÂ\ަ¶ 9™1R)°M@�K¼š)Wàz�*ùŠß.ÓОòªÑjèz“Ù�Éð1(ÿ; ªÞË!x Â&2a6•«R•Pæ$ì>„¬W›'á„ö¦Ä`Ä$B5 —]HD-ej.a=�kÃc5Ö³\I¸�¬‚!# ŒP¥ã‹+@{j€FŠØP»Šø1:Lu„¢à·¸8LySà‚Šž¬›S1B绉P„膡d€º¤Bo‚ <æ#ÎÏCåÁˆ¢Ô+Ú·bЧø–Iñš¸f%Î!òï+Ø@`)2 l­Áú¾šI\š°Ù @Î˪žØYˆÍšF‘c(XöºÀvLq%)G鹿É~ûS#o?µž­¡[*t�=·œÏË«&E1÷ËM¿Î©ÚÇ5‘ B“‰ ĨE•ŠqCyîËò±ؽöxyÅ9qå0g�DLM$öFñ!¢bÞRñø9=Ë_@$°b&�ú¸„ã&@ÍÀ„èîU>/X�anÈ–íù€Ž„ò(±Q#&ŒgN*zÍŠöú^£ôŒáœZ÷ );¬NÒ…ÄÒGêJª$eJz}Ï>—F§¬Ç˜hgâéų™5‘b¹-á&-œ¤DHR…ÄL£æNÖ™(6"¿[K¡^ø§ÔŠcΑKL�e½¬x„�Z$PÝb‡Ü•å ï¹5Ùœ¡¿+�Á]ðëQ€@†|7ÇóBâ( à7>'=P,ˆP¯ïšTŠ�1°bÃt†žqLooš:»³ÿ¬#–]÷Àq ´¢:Z|ö­9×ÿýèý-ÌÙöo>Ü7Ôô‡G�€ù³vÜ}ש¼¸ßµ—ÿ펧þäO/ü¯OÞ·ÏìKWÏ:ÿè7®üð“×ýí„Ç^Ÿ?»³ï»—ÎAÎ.»Šº‹¥6r]ÖVY_ hZ@¡.ÕOïf²Î@¨wš~;µ ¤Â8F']ùxí’n©ÊwUOÐ|c´ÜšLžØnPȯ9(ŠvtM%h­DD´js}`dýÊ¥x^a®e‘¬µº2.‘W ‚5gîAT-b¨øé˜„(AŒ= $î…P=T`ë*Ab{�1å&‡™�€eTŠ88®éGAÍþš7÷Œê¼ùöÐi8$*ûCy|#t³å ¬aw4Ll\ÀҙЦˆ: l®Ñ†Þº1ä¾ïÈ;dyf¨-k Â@×!ÿ‰NðY$ES¬˜€En€N4Œö”tI 6�=¾s’ò˜)ôœƒ§¹Î@òôÀP“È@ ›BDÍ1–¢¨E1 kLŒÐÇM‰$‹è%\ú{ÀD·½—*Ì/'þlj58µISÑc*`4Ðß F Ôì¡lURÍ@{ Q­Îd!R6 ñ{>ìr! .Höð0¼Ë}‹;tUúh"`„аïZ/†'yBÎ�ã%�dCÀï¡7ã埄bÕð+öŒ–yV†Aq?áÐÃbÑTR øœ1¤˜¥Îƒb»ØV+C’p}ƒJóŸÏv 3OÈ+\«4­Í6i.‘»ËàH¨üÑzåt�|[§¬ñ^¼¯FÉ(xzÅO¯Øþôøáä§ €hˆàާþò9‹ïzö@=¸ƒ-·?u�õOO¼1ïÔƒ÷jKOGØûô§IÀ¾³»®<çÉßäŸÏ~òÎgH9Ü�€Ö„™žáæÏüâ‚r¡®I\kw6#@¥TûÚyO¶ç¦··N¸†ã IDATž3¥»Z+|üÇ)B4LÔTªWÇŠ¶‘‘Z©¿Úôµκ줗^øÁO¤ÅÓZeO^|g·+®ûè û¯ysÃtûn  ŒT^[?£¥Rÿô¦´ �uøò³_žêóÓoÍùôÏ?Æ 9€'î¿æGŸ¸OÖ ìñµ/Ò?ò©{9±ûPÉ]‚gVîñìÛs€à†EGÑÉ«¹×°A†?þ§�2Ñí{_þµl¶9�nZ<L"$^²”‰©íŠ…êzä\røtÏ$΋¤�ѯ\ÙÛ•©uOq Ù²rü ‚æÇÑ…ÖƒŠL£PªO�ÚF~5‘'²Ì·Þo¨T„¶ Ѫ-õÞª€l¦ŒË s'Xš7:S”r4D `¸”ÙydKj¤7øsS�q=)—L{62†*% ¯Ô'²Ù×Ç�÷âœ� cCÄmÉ@î¹`ÙC< ª®8ÕOËî Üi"ô9,„öÓ�¼ý"2ãÜd›"j/l£�½îƒêD¬C3&""ƒ¢î‚w1ØÂ9tí~ðÊD¥Q,ÚõöEâ.ÒùÓ^dÄåód#Ò³+>½sW¸EckæN^1ð’ õ!`D¦€Il¢˜ ¦BkŒ…(*`�wï ¦»¶ˆ‡*â•ùcŸ,Ò¢+bÔÆÔ®,ª+¢‹ÐbËy NI¥faiúñ‚‡þI1û7FiФvÚÖí¼¨©Ê; †VЉªàÕäy"<à@¿æRÈ4"$?a,¤ÞzD™œìÚ„ê»–i8ô;ç)ÿS-(QÎmjN…Ò ‘¿¢sòd]»~Ã!¸bMøý17ÙùgT¨îxHŠïòžñ{=Rø-Ð õ3÷QM ¯g�4ÿñFQnŽm”6?<Ó'`ðÁ†ÚÍ9qœgðX —Z§íúx6I·µ@Èøž_¹{ïPó釮ìh„2©mø³§?û�CÞžÜQ€r±þÐÒ}lù±z<4RnªÔFëÅ�‘2&LgûȬÎþÏ�ñÌgNÞ–ŒÐŒÔJíÍc[zÒô O€“ڪ߹èágWîqó“ ´„¿½eÊðh Œ�¾¡J!6qÌ8cyÑ(a ªQ?·r÷ÞSš?´`e÷@‹â³¼åü0!`’Àºí“´[—yB{óè·/xì£Ç¾–¶6�Ýü•[Z˵ŠJí°ÇÀHå?¹ð¥Õ³íbß«kg|öç·5�]|ÂÒ[/øá½'©x|÷‡§Mziõì'–ÍSF  ¹Tÿæ?ßâÌ™ É �žYq]�JqÄÜV ÁÆ.\‚o«&Ù§¤hØ¿Æ"ñ¼ˆ_vóÜ"~I¨É£ cí=Ö·Í2K;ÊÙIz×ê^|lŠ©£€†hÓ(mîs ,r#"cº ³�|PCDŒÐ± IB׎£è’´+I¥`ßÜóªªFÀáSžHšYœÅ“ç•iAe¾*†w5¤ ¶œäè `“)D !•#*Çq!Š"ôb&çª9ŽH@6Û‡¡?ˆ;×½ñk d�-f”*YõöHà—u'Fã0.#¨‰æ-žŒ“€µ8( ,Ãh÷Ï]£„°¥•2ŒŽ¥iåG– ê¡h£íÒ]4/•¦pZvÈaš„@ý=ÉAÈfâdp†êë)AJÝÊ­M•ÏjX vÖô‘ªæ©sÔ%0¸Dê«Lš‘öwñÍ´Ø:T²>Î3ÖAFãM]w‘�帓s{ÔOÝUG¥Ÿ�ð˜5cZÈ+¤¤WO%4ò¦f�L¿Æè,�±½aš{·â£FlåAlµ\G}~vÈØ ±†FKw>uðå _¸÷¹¬.ãäÛ}t·©ýÿô›X¾aª1øí�=:µcЖo$‘DÄ$‰¦ã$‚Äàµwžöèk{Is‰�ý­Ò¨4Ó Qò•s#Â�î=¹Öˆõ”c¬³LyÙ ¤¢êh¡{°e�©½é ¹Çe0pÛS‡\óñ'¶T¿xýy‡î¹å'¼%ˆê‚;.:qéE'.M âùU»ƒ¼ÍÍå÷˜ÒûÝ‹9fŸu�½±×Éû¯¹î3wgGÿô[sõØ! Éi­úÒKö�Ýõ÷¥ï{öí9s¦ô¬éš4¹­zÓ“‡}ñŒ§®»â/¯¬�uë’�½1¿g¨Y©½tåu¼æ¾é Ã43ÔÃÆ—„¬”icpÈýÐÒ¹+œïfc„ÒA—$‹7š”ùæ[yX Ò°êy[,V>WøRcÏP磕RrOõ+>ãÕJÚAÛ`a}hòì–#bè€(7�È#u4cÁÖžds÷0FÊ3ÒsP8F€n+×8z×àsí’D-¢Ñ¢Š {Yá BÈfpüs¶Ñg júÛzˆ«sp¤P€8BëÈ×Ñ�A¶~d6;*qâ‡÷ª‚‚äIð¬µ(‚ÛòVܽË(ak[ˆß.àx‰­Êã.«z.rD¢!h)@[D´®j¶õ×�6ÌfÌͯìyŰÆÁëlŠ6‡t"äIBÁÄSŽÜ±L,-ý �1Rî*„‚¥<Œƒ¢ §]ºR.Ê^Ô¶�0*€) E ˆ±QsŒŒŠ‘ËÇJª–î–èh?¦n/ž@±­Â(ïáD eÚâlDàc´lkü~JJ¯�YÏ%É»@e®ôò Ÿ¦?e üåGüößüèï½ä£O~øm©Øv肇Üñúxú_~ôûccýA Ž dgp„“§ó*Ÿí‡Í°¦ä¨®Ð«Í÷WÅæÁ^&(¥Š“½ïE€p1Ÿ]?ùÔNsºÇ"áÏéæc¹ÅÚ–EéTBޤz¦›«†“Ñ ‘€]æ §w§¤9"Ä]ËTÜ»o9¼I�LÌRqE+1Æò?²å2µ÷Ù¿½¢äpnU˜ ò¹œ">åd ?¨fÊnƒ?µ,F%?fÑåì)¤1òDÞ–DmP¸d›O®¶}`^ä™Û‚MŸ¦äÙh‰ìЫBšÃƒ+Ö,“XÚ@h×;|s敚V+0ãæ�æð‰¹ 8³£¼/îu)ù�H_|VB˜Ê†q0ŠC±-=S—¼ tÜ’<ç1ãílXË®Ÿ*hfM{ p 0¯˜ª*£€º®*O‰yÞ%ÝÌŸD‘k‰= J;©—f™d±œÏGZ…úÜöùFÇ�d)0LôMEu’ìbTA &z¢òfða;ÒäN›80p=ÀÒ˜7·K1?ÇÎaL'Ͳ³)tÛ)1ÚòNëz®Ð+T£Þ² èx°6çôßÂê"g ÿ°�õÊ«6D�bÜÏì<%ZtxÌ£âJV'ËRpFPèÎ ®9/Ö‹AîqÊ}k©[nªmYãTGïcÞ;ó‘Òžå&s”!_ÉjŸí.{¸«¬±"!�3Z±@eÑ58·Û.wömá`ÚWåS`¢@ŒZ«î3T>>^Û}à �ú�/¼ìðÚ2€íéàȉ¥K{ã?Ýøà¦Á Ÿö•§œw芯�ÓêÊãÄÖèW\ø;?óÉ›“~éüùœÎ;óÈé{N¾çÊÇÍšÖžqŸôðÛ~å‡?÷¦�<åøÆä�{OØšVÇ7&Æ VSÔú·”nf¼ýÓßwÉcnxã/½ÿm—?ñà½{ö­l-�v>tÍ#Í2XÛû!·s¤›pëá½þ®UsÓ�û tîŽØ#1âO?pñ‡¯=ï7~ü³»–w^÷îgžÿàÿõ¼O9)ÊâÅÀË.¾öe_Û"KÚl˜Lÿ/½òÂ]óÈ{O,?ýQ·ìYÞzçkþ¶KÏÏ}ó­9Å9ðן|½kË¿þãWüâÿxÁמñúW~p<œƒ™^ÿ¡§ÿé/~äYw¿í×.ýï¸øý_xLÌo­uà¤5ò.Úd"øûîïõ¼Åê¦ïp CS.êtï ¡ˆdw(¢ž¤+á9Ü Ñw5É.Øõ^ˆe7ÈS`pñ{"Zg{å"sßÂlg²{w-Í£æ¬[§ÜÒ)Õwu™†k|Ã�›£ÜüH9"˜ïC×”&6æzXÌ[_K%oV˜ Œ€:0ƒø©Ë+Œ8‡îøŸ%)ùI�åvÆÄñ�˜ãxÈÅÁØQƒ´6‘¼2ŠÅ.ªl´ƒB¶DGK Õ 1”à ¤Ÿ ƒ ²…“5 -h@*i¡: ÷x¥¢]�#ãæõù='�¼ê¨Ïw™¡Áj~%˜-\´"¤­ýFóz„a•ú¦æ!å4žïô[)ó‘uœÕ:>Ÿ‡õŽ*â7�¹âºâA •€Aú¾Ž„œ(2ÍkW¡±ˆ²ô†ºå; v‹ ^Î ,Ó%PÑE“öÄ—� ®z�î]þÊV?‘,8OΦ-›+É­nU¢ûQ®$™w›¼emO•¤dÚjxïnlmë½)W=oÏ*½“ ÌU‰N÷í_�9DŠ–7ŒDœÕ &5¶¦øÖí›}µ2ò=uËL#hØ8Ë^»¢¤4Pâf…Yv“=§‰Ý‚u²¶mf2€fÊ¡&7^¨‡Àn¹¼= P��nZ"ë÷’ÒÇQ¾`�Þ>4ZçÜe¿.Ï9#S~KºAVs'º€œ)H@ŽŽ˜E„¥ÍdgCžjË™ìèGKV+n€O6Gבõ´µ…İ5c$!{)ROZö¬#Y H¾÷d>¨1È–£Â‹ùÛÓ.Lz»EµföOšWÒ2Ü„ôQ‹²*tŠé)2qØ+Mûÿ´³ôÓõ½gNÎÉÖ®º2DÌ<`e €n¹{º¾3ËSZ£jp?‰ ˆ’倎˜4ƒ4ýâ�M» öXéÓé¤3¡Hv¸™¢gA)†Ïjé­^GÝØ`2ÇA…$ë«-ÑJ_�\òiغg$ØÒˆ6ý»Ü4±4ç ÙÕÐAÂì€Î*£j…ȼTaWÝpbvlS]êÄÛhîµÄ³™Ù½¼"ñxô‹�3A @‡I¡k¬Û ŸÙ}q­t—¡®ùÏÄ0"û”„-žs�f¦ˆUàaÀ0P¨¦Ò j´¡—óëÊeFú‚£~²Qʼn(êK­Æª4˜`,ÏÍÕ¶>Ø­ ÏïÄ&’9 ½u.5�°ÝÐu¹(Èbì]ó…Üû)ót $YáäÅ,aS;)ËæPce‰On䪟ž ½axÒ G$yÿÕØËþĹ5ŽTÒiì°óî¦Àrë\Q½±m¡±™î»ï£íÏ´vÊ�š›VŠz*Qh©AÌ„w£±tEtsõº$iÛ"íŸ8Ù¶¨£Ýì9úíJY ?Ü-zÊêÙõ×kJ(o-òñl‘‹gócz]~h’49üÉÐL@ØrнG¤:æÜ’Ü–ardÃ7ßKv€O$úçÂ:NzÑÒÏî d�ÜSæ>S–¨ó@qÞq˜_rñuð²�nl�ݳëñ¢Ãk«È£ó�,’ B]5gŸ¶6¬§Ý¶fM}ðžÝóXõÇÍüp}S€Óvm¼í7.}È�c“Ñì÷.}öÛ>ù„žÁ¥ŸiÇ[´kh—L?ºÌÆÂÞ-8Џ=ìŽë‚#«T‰••§²îwYˆ1VvØÐ%_«—º,x?G§õ©í(ý+ê4(ß2 6n±¥Càœ)_ôT¿{ßC@×`tk¸ïøŠU�팭«Ë”T³�¥½qÿ¾åسN[t¬ ´{™«@ß¹w~èÈFòÂØ�QÅS-yš ZÄW³ùŽH‡èõ±î1YrzTÂä3�I=€á²Ÿ$¶ªl×džVŒqï^VÁ×n°ŽEå ˆò;ÓΠ6IbÅåÎ,°{>Äë!JLY»ÑñK,ªÍÉtHRöÉfà†ó£Q"g1�“Ù¢×rÂj¤˜ubÒ&Ù!H26É72‰±óX9¨FËåºØœÚa”鞇ü$-Eëˆ"É(¹Æ¼b®˜*T  ¤gYê-É'ç-É �š´{*Šy÷ÅgJKYIO@¥‚³à`¨8ï@ÈEÎé×F2YBa¸ìmG;8S�ï°û¡˜ÖT\ȯ“ghxYWÜ”ciŒ‡îê¯QPñ¶²›áŽEFÙõvÁ+ã¦ñ-ÛÀÚ�Ë,Ò縜º~ßE™EËm÷=èN¥,¶s«ÞŸôÂI6׎év^*`F�û;ÆÿOeîóù¾Á|7Õ¶%… O&i7Ù».ž4¤HEyþ©�Ú*£½/ mSþ'”uOŠ˜é©ýåAÜNTiW¬¸w>*�²¾¦ÐÑw{ÜŸ7;lÏKÏŒ‡³=ËÛ`ž7áÈúr4#Xvâ~ÉO»ãùacF¾ä+‚ëv{IÑ{â»7¡aÂñ�ñ†~.ía¥‘3éö4îN{É2Ÿ|—£é½uØ">ÛÈÔDI.z£nÛ�’�œµ¿ý]ärêØ¹e£• Ñê�OͨÄÑ æŠKDÉÈ•_’€£wßQJ¯õ™¸eak¦ç.™o£#‚…áëÉö‹m–vmJߥ*ÎëÁÖ�­\;(˜B¼g™†5ެÅoß¹Áé/Ê”ÿIŽ�zÙ$•Á9‹‰óÒ’Ïè°á‘V[ÐHW”²AHŸ€ÓÙS–쎒ŸÃº4[bR+×9·&ò/FžUžCâIëü •TXÍhG!dMÈöÇàÛsìÛ�“›ˆB_‡KÆb21÷T1”ÔÙ*{÷²­ÜPO kÞDšI°od½©…ѾŸþÈ wkDíòÅ•ìO•õÛ�mèv︪‰ËÍúM`‹9-–³fRα9ßf{y4c«_|)¡~â|WGéÁ´îø›=×N-(¯Õµf¤”«(âÖlÂ÷DCöŽW¦qºîí¢Lwá“Or�ˆœ¬rú6›º(ÖqŸš•e¸TëúC×FUêÜ£ æzÞ§6s÷6X¡!ɱ(CÙ�Sm�¤ ?„ÂÛ:e�>¨‘ã3D}Õ©(yèKò‘½æªk$¬d¤²§:BIÙÞ‘·fíb”s‚¹ < rj^Q¶ ¤~Žzù�IÕêôf8y•© pvÒ�Íj†L¢;‡¹à‰Ì‹:„¬´5Œ_ÖPa§»îD��å<œ<âµ7i/b¢:®¨9tm�ÑZ®æ4ý o²Üú´s%f·ó®Ýd_»ë»#OÛ^d™!»})žÔf‰Š‹ü ë—ý,铵ÚFè(Н3æ™ÄQnTâ)r;û13—äVšóJ*sTJ¦3IiŒiú,a&a9�þA' § # |w©KÞõ¸J:só¹[8 ˆ¶“HöQŒÆ¢Î-Ô†ößÞâ^'½œÚ¿-§V¡–—†Îk¾Š—Z0(‘mFKÚRk\­€1—TÕëênyË>ÕÏÂɶQvèÞ;×·ân‘¾WüHz¬)° @†Zœà…4¤­5²âQzˆáÐÜÿÈHï>38åVHДB @D�BPO›R¶HXjF5jô¸=JÂLÓÃr‚i~çSFKͳ%ÞÙÕÌVšÑr³o‚ãzïp0©ª Ä1Ï[9åá xŽ“fûìœm}A7¹HÒ‘\d¯ 宊mâÛUý_æe"°™p!˜ˆó%’E5vå¥É^VïÔ\ÌS,¾641Yú$f&Ô ¹¸¥$.¼[™ýª.«>ÙYÐH��bÚ`ï.„àêì�5§emÄÎ_‹³[­2y˜fÒ2{‹ª²5íÅ®ÏÑjÈÚYŒêsSdžeHïm>ËNO×r'Niÿ +ž£ßžICÝÔ%‹Íz­ÈF¾ã/õz==G«Ï]ãT�-pú¹ØÇ!gÒá`DÕò›¬†‚†é$…R9O µªLF}Ù€“�̱fõ(r>‰ùí~£5l!�æëѶ…‹<Ú®'ÄÙ¡iÕÙqüí܉VF g1cCk¾Ö:fÑãîiOó‹$!]I@•-Ó!—¨M<�d;í¤UÁ¤ÁO1û—v’„$ÏnóË5Yú þ TE'ðN u ,5É`—RJQ‹Ö›5Bûå¯_Üê¶5l¡V[©ÏJ%š¦HÔ�’Ì-ZC‘+B:íiúS›(º`»ÕH¶sCžEâÎM/FÊXö=ÄXW;ûö/Y°OÖù�ÚªjUÀê!Ð=k|øÄv-q8à“v Á‡±Ió½]ÁDÑT�dó}ªt­,û›v�UZ†›9¸IBÐbb±ÍÍu‰ƒWAHžy¢*I¾m§/¬j[°Ä_A�KyÎ@ßh™jÖ¼a7Ê”ÅuÉ kAYh-±Ô=5ˆnݜݳ£[6§4%g³¼û(d“(#Áø©Ábeo@KqTQmä2 xƒ }[%Ð MtJ˜.ageÞ¬6KKñ´IuÚ¸Ú5¨ë TltZ¥ª™?û FH�§zi²‘–ÕN´‘ C̾ªî{ôIôJ¿Ø7–™$Šu®.ÿqÊžæ¨gošÅ1PœWÊ¢¦Q:Nbª;/¤â°i®�&ëC`$vëGA¯¼À’ÄKú³èA]"Ì„Šv¯äjÄN9_”†ü"’B�z,ìoùÃÔM([Ø¡^K�ò¼{ÅP¾Çdß§}lu.['Ϲ 凞÷H) æSD׊Öl”^þ˜˜¨)Ó¹Ü*c–Ö.ͼqlõja'͸”Tí·qíZœ›™¡ÏÁ÷Úýò¸èªs½1­5óîƒ�I±}¬Âjd…Ô•ÈÏcˆ$óK˱2 %êöƒ’·HR,<º&Û-†œä–Ãæ%õàeŽÜ�öúb�η'}ÊdµÞ(€Á±•ÈQXhÇVܬcö¡ŠFKAnw¬G0K@ñ•ôÀ€Eß½;§Û"Ⱥ•[² ¤ÝÖ,Ä2ç!gÛe0-I±HQäµCC˜%S¨õ •ÖX{¨À뢜ÿì±–´lÁ$7›sД7°£�:]/`FµÒÇ©�´³³  ‘sM°šÁrAOqtu¡ãÔk˜;Ï8kl� .ZÌäžgÑ.ÐcÉDo8Ìwöœ1©BˆnÌëH¹g–ÆÔ´±Å·Þ³E!Ë_r\}LŠ2Úi¼™Ôs³Þ² @\¯0WÀ§­Kdjý(QÖ RÂ:yëÎ?Bq&]GÒ|%ˆÄ'˜ ¨jƒÚ'ÛÍÍ^½"°ßüEä…(‚Š�Vø” iúL®�(hÌE'çnàÙìËí27æ¼ôDØ;¤!áÐÆô®“Q|> U§6sŒˆŒ¼gvò¶5AFC×Ò¦ÙÙÉ®–â¤B•ºìb¢™ÕégZ÷T\10¦ŒÇ©»5MG¼½ãÊ|y¹Ù¿T�>®Wê*öÙÔ‚ï`Ï>–bN“”SEŒÂÙÙ´y¡q@€O¬ ó™’¤FN¯ˆB³ã’ñΖ.o.IVÁ;c¬‚d/VÌ5àb)€hK$d�fò%ÈNµå�  ­9…÷›W”§X I´ÅåjšFì[M»¨#SZÙ+Æ!ÍkdóY%lÖŽ" =7&«ïRâSf$+ j³O¤Eca° T<5°· Ügá¾bÞÿ°.d‡�|A2zé'²Ñ’+ [7!7Ã8–iêgv(†–a"÷ÿ®lœeË8Ô[�:gö”¿Eþ¤4Þ&ÛhóÏn«9ê_¶ìÖ`C3]Q$­HAºý”öÔep)-uÑ2@ÖuG[Ò|’T±‰ºx]~>ä§@Žg ú'%ôCË í•ƒ¹/“¤—íÊ2PeL7‡Í,,û®j‹úœïe+l¤u®8ÑIQ æ²mµÍïn½ìΠψÊZô wä#A7‰>¨'äêP˕ᇵ“V<×gË^$(ÑÇ 2!È4aí§OO%wbñe=gÈÄÝ<Û,·½:f‘šâpnqÙÇ ly”­+ÙQ)Ñ E€rµ:A(µ{¤^ƒOYèpg"+MòKq®ÿãî’„¼Îúw“pîS‘ú»ZM§Kûh2®ÍÊ%ëOˆ(FŒ‡xÞðÍwï4Ü$Ú-õœ“�ºä·›«ËÈ�ˆãF�¦–y¨Äkw–‚–(œ¬f–Â|6zsûòìiØU•3uH‰Ü“vÑð¾j¯“Ó•E%3‚U¡H›ì Z²½ê ªäT¦ÁJWÉIIFvw�øÎ�ù'9EñÍ¿Ïc‹B² $ßœQß:íèG!T¨&͸õ¦ªƒ1Jj¦ˆñet‹bÖ*ž�y{%ÎWgK«|ú„N×Ë¡®)0StP™ºHN !æÕ²Õ;Á4UmXLˆ¡ç"�Z5ó„ Ælf5Ÿ>�~¥ÇʱÔ*r« КN9[äøÐ9hRýèM–í^B”Éé—£™ KÏ)¥Ä/µŽÌw�ü8�mû³ªÈJ ‘•‰2Ï„»WœhùÒ%Øú¸u ©íé Õ¹Y¹B|^ýt…Â2ævUfZ‡b¼ÙºµÌ\ßá“•úýH?€~ìê\õ�ð.ˆ•±(Õ~j—ƒzζ’=*FF´É[CgG²tøÊ[£~-ï~ޝì% >�»Î¾ u¸Â½§nòÂî?tÛup1µ.¾XVOæÛß–C¥”À`³tЂR2nËRû ¡ªl¯Zå•”åó”õFFتÿÔF5Ï}�³› ©Ë¯J&Ð>¥§Tl»æéÏžêå$ªÖªíKk¿ïKñº5[ˆ�:ZNºL¤'¹i*eÑa¨%¶ZSñm¶ûúêz/VžrpÖw'Û¥¸bPÝf�S‘šA G�É67ôècþ çš3R´\ó¼&Õ¡Y1@”Þ9øU«®Ò.X¥ÂÞ%ŠSÅ‚¥�’ÔÿfPy=ÝØL†ûüSUŒÃÉ|ïÞ Gú>G11Çu…• tðp³¾3¯MXF@†wÓHh:†õ\,ìF�y± ‰L-jÜÇaaüÌQ<YÓDkŽÇšã€cã€ã�›al†±Åù FâÑ@‘CºG y‘B'pbˆZ8‡,%ùQ3 ‚âž9KCÈ'Hf`9�K¿F¡µÙߤ8̼k€¥Šî�6‡Ž7±¿ZÂQ|\µæ:°6È Æ‘ì–ˆˆB šÃR‹fÍö Èû™et’aÌŸ±³Ì;+Íh%ž¶DFƒÕ*¤ý= ÄÓY¤Ì@¥µÙ¼@þîš!˜È2kD=�MÙ'Ó™"截`'ÙtÀA]‹„ÃQ§=ÑøÄ€îPdÎoJ8’M¼},HHb/_ŠŠ+z‰ñg�îJýœŸò¢—:@ÌrÈDÄyÁÚq(^™¨„ƒä?{·SCÚ¶æI)D'*ÜDÌ{–©ˆ#;GE÷·¼ã¡ÔÝò1ïlUUÙÌ\:s[샱lh±‰/«é@OáX´)Á³ÇÛ�yÎV¤8Ø?åQØ4ëe¶Éö,pÎìÍP‚Ä3VìU wÆ�Þq»[å¨r—¾ »Óˈâ7wÊÙ“-{Dů"£•åJVfÊ2V ÝV&;�ª¢{¹H•ÛŒ9)EGVÝLŸI“í y ©Áì%•¢h®|·„�Èf•:sÖbV-ÛŠ�o§7„i÷ò…D:*vÿA-½`¥v‡¡)ydÃ0Ûï+ §tË](Â<¹tô¹°,£e<þ{oÿܽág/¾ÖŒOžøÂy(}Ko» »Ë¥ Âð5k±ûb-ùQË8‘¹œiܺ˜.¸yEIUiÖ*Wù ;wÁ}«_÷ DU‡J™¼Ù‡ö•¸½AJd)±Uº˜C$¥ñÏT<”tŒ—¾¯C57îqY‘�K}÷ö³Ð.ûkQuã#L§Üüу`„fgÏé²¼^æäS4%`'Âê*¢#'âáµmr87&ô ¤_!Ø-RÞBܪxVgRá,HkDµÌÀåÏQ�T ¨™bN±ÏÓ3nä/Ç9Çyä9G*" pv>S«‘¡az@>Ë'ý‰içÓjíF l²öO‚Ð艃.$†aY^MÑÌN¨#*¶VG˜—´RÑÚ´¹ym>�dsñÊ£†‚™%�Be•H^|Lžµš�€“8Î;Rbå!GtPfއ1`gÌ›« Væ»—qƤÚ]W…¥ã¨‰éíÍYµh4[LA®+Å,±Ø¬ŽþgÛA¥ù¼YH(�Ya$ä…¼,Mª&@`å“@*G›VÊ®àlf…ÈßÊï@ššxàðÓYœ@%åôQÙ”�ïg Œ,DQ•BÆœÁâ 2d&#“�(qQ“,Y:dŸ`00k0¨1Yn«ªƒòWN�2i¹JJ?kóNWïÖ¹Ÿ�ƒÜã�δ\ŸÜb L‹±�ëÔâCçe½øìκ�a­xÒ+YëY½•äÍ¡®VdwÑ2ŒuÚ}Ó{]‚µ‡| Ä>Õá¡Å@̃S{ÅJ�VÞ52MÍ ‰@9µ(,:‹ÚêÆâª)–‘Jt%YÌŒ®%û(3ýü:GË:i×Û€ÄDü;/¾üí¯yÇé»Ößþš¿û/ºŒDt`÷Æe¯ûŸ_ø“??ï¬Ã©ÚŸ¸èëŸú¯o§øY43»_ùì/^þozà> ؽþ‰ß{ó¯üðU†k›;ÃÛï;¶¾dñ>Gé ¹V5¹X—Ê÷¼­`È2XÔ+( "üöó?yékÞ~`÷Æß¾ú�ÿù…ŸèUÝϽ+DJ`ÛçÂýl©o1Ä̳¸Sž[WUäÛUû ½<÷uÉÑK½í²#ÖC±¤fË“Ák+FÙ5m½à’ÚtÒTBÿ,«‰aßaÖu†bš˜W–u¸ ŒŠëŒ¸šÍ—O £a¥uÊÝá¨!b`i„a�í)ßvÏ6*VÑˤƒ �VïB?^>äš­€é èQ§Ã#¨¸§�jõ§\õ †/£æ¤P^Û¦ª2c ûr’²‰DV�£ú¤’VuÅ<ù‹Q÷šÐ⇧CáœúhAx÷©Ü|\l¿©".©7d”ó}²5 ¤ Ec ¯9Ê¢­­«Ù/A}gGT²™²�Š›—£´Âú»ÖZÂÚúääöpcg¼¾=:¾>‰ºçÉtV5Ãð¼'í�Þ÷ƒÿT M×!p$i…%�UáíWikMˆ(•·òéÁ/ß|æï¾ã9[ÓAªm}{<�WЦêI(¦€‘òÇlŸá Ò1ÍgW~ãœW<ëK�yð�w=7±áü³ï^o_ù�‡U¯ÿÎé/ý“ŸÍ¤(ñ�õ&‡‚ ^/ Ð Á*i†î•dÖÖ'ëÛã�íÑúæðøÆÈêe�WèìËìwÁ:µP[Ÿ¥_né^’ÝÊ™’«²_E)?¥áiÔéλ:Mô-Á²œW˜%&gºØÙ*U>òU‘š¤¤Žœïô5[Š®b§¿'´%Ïd%/ÆNeæT� ´ûáAFd¾Šq0žîÙ½ÜÄÄw‚.U³ît–Ìþ â¥EÆÁóG"0Ùî­¶ø]€jfVŽ foˆq°£NvßáäßgõdRt¿ºÝJʼC¨5`(,B SRž® ¼VÃÉ3^°üDä%EEA ÕvÕÆ$S>÷UÙhó{ÿÉ´\&UFä+æ /�†�wט6ñ†µùÎÔ&Ãä·I拉ý\HF_³!mä'}(TÄuؘ§×HÙÍ@•š«$BDÓ�H3FSñpˆ½uyÉ32�½¸`Z¯ËZj;Õ_cÝGC!†¢ðŠ!»>1 Áô#5Z�½)¨{Û‘ªta=O´ò…v÷¹—ž—)-K„¡•¨�è÷ù�‘Å“«­�[m˜¥“ÚG@=„<åÔR2i¬ ú†Vš‡˜¦Ò†$ÙA±Ae�ÌK^ŸÕÎ�òïB›XG Í"/ ¨šÄùºîþ¢3L·P£–Fs÷K\²!;*—{f»egS_žtÛz×ÑlSŠÌ"d`õ¤0ÛÊ%¢fZô…¢ÍPµðvéîæÂ„ə߯_Áªž~YP¿ËæðÃóSŸ)é/Y«íA´ûÚ� •Æ××K&GÝÃ7Õê‹ÿkøï…µKÀò‘L(6µ%um˜Û)�Ú5rnŒØ‡¼ü¨dM—‰ÔgÝOÈ T�%3Ë݉qšs©…k³ÇÖ''6&ÓYµ¶19¶>ñn臯yÄÓ}ó¥W\xëá½™Œsû�Ÿúì÷?ò–}«[‡�/¿÷s�{ÓGž²¹S?íü[þÝO^y8ÿÖ|á1uh~ì¢o\vÝÃçohs{*þÑÇ_ÿªç~éá:|bsô¾Ï?ö�~ÊúÖj³:sY˜Ûšn¼ó´õí¡ókÀx8ù%ÿôâ§_wæþ·ÙýÎÏ\ø7Ÿ~üδ0Î^~É5Ý[:º®çÛîÙ÷­Û\ü˜›/ûêØžú¨›n¹{ß�wí'âßüÉOÿê�\UW1Fúýw?ë-Ÿx’y±Uà}ü7á¹_”q]õ¸7~ø)Óáë_ù÷Ç7Çÿéïž›]Âk~òÓ?óÞû¦Ÿn˜ÜSã÷]õØ7~øûOl�–Ç;ÿã—ßñù7ø_—]täÄò«žó¥•ñÎ}÷3ßö©'€ùØúÒ‰ÍáÎ,¬mNŽ­/  /Zezz1ÈN¶ÆnÊÍjÌvøWá³Üw4ÐÎMÜ ’ºÙ³N}’ÀË=òê½ØóÎæ°\Nb?±ÌQjUÒ6Gúl1 †›-:< â@ĤßUÓÕ•:?uἤL²UˆY¡Ä[ïØSe…ŠúáõÄiQÙú4’|'5]g $aˆÃ™$7„FÔw HJ0=5r_տɰ–@+‚S"xª-¦Ô ØøÔ"uØI}y ö“u×…yEv9+ˆS=NŘž7Ö<ac hÚ_Ÿ-Ö‹tŠØûd½c-æ”%goÒ^…¹“þJ‰îÄÔõŠžöÜc‰„-k9 ‹m„ÌÂú”;0—ͯt+�gg=7·P}LdœS�ÜF¦¢ßö@ËáäࣙÔ®S›Ã’Èùeîl'ºõ˜æÞÃŒõ»œÆŸ}õž íëRÌÏ|Ôd- ÍI6wœ�)&˜Ì@\@¦ Ö€½å3j¨[vëÝ{‡UŒŒëžqÛá}P¶UûÐ�³öŸø±‹¾ñè¤vf"ll¯úæ9oþÈ“îY[~ô9wÿ§—|üøúä­—=À¹gÞóþ«.ùðÕ�ü£W|è=W>îMû•t IDAT_¿þEüóÿxÞ™÷|ù¦3Ÿÿä~õO}æ/ÿá©—õܳN;þ»/ýøx8Ý»Ÿµwiã¿õ·=à^Oñ[ï}ñ¿ìðÚŠ9bPeH:~åG>ÿü§|õÞýìko:óû¾÷ö×¾ð»V¶ÿìOð+?rUºuÍMg>>ÝZÞþ³>MÓù<[åØÞ|ò«çþìÅל¶²yωåÝKÛ�{û‡®~ÄæÎÀÿ.ù³¿¿ø!޽ùß¾'‹3?ÿÉ_ýÍŸºâ ÿø´4®ÿòÒ��³×½÷Y·Þû¨³ïVñ¬Ó�=ç‚oâºón½{ï9g¿õðÞy¬~æ)_ùÍŸúÌþñi—õag�¶–žúƒw?kc{ôò?{Éx8û×}øùOþÚo8û§ÿð_mMÓyÚ[–o»g÷Òø‘éúCn=¼OGâM¸¬. °ªwÒ`¼¬¨ê¬Z� ¬§¯_Aœ]]*‰Z¸� Ö jÐi{/|¹õ_—�Y\´Þe„14%•Õß–/ãt›ujâ]êb¬vÅ�ðÔçîJ�[fçÄâÙw}äA=Ÿ/í£Á ‰y²f1Àª2XcPac ‡ŽlÉ+iå?:Á0²ÛdŒÌâ9âÆ@ U8Ið6µ¡ŒYéÑ…ã>â´hf”ÀÌ;D“T"ÚJ i5Ñ 6±dg§À¬ë_ê 2s ðƒ™eâb*š”ü…˜sNš C†m‘p ¦ª1€.2Pf(yŠ€÷h@¸i}vr3õ1ª¶Y¾‘._Z‚`꘠{®‘~Y(�JNvVg˜åw²ê \…º«Zª« Á�z²¶ësê~!€@„Q Š8€ ��¦ 6‡a€™€™g‘##27 0æ‘##�GFå¥@Ž Í¨6`Ýl›RöN`*B\UTTqâÀu€nÜ—zB1rŽià )F[IèmÊš§�Òr~UFØ©“)múÍÛ¼³a±äaQtçÁäO›É–h7¥oÙÛü PÉ}v¯·xm-ãBePç4�ÌDK5¶&ܬ£<8÷!¯ŸØ ÛñQ¢L³(ÞíVõ6L¶(¾zI ½<¯u‹n¹Ÿ * +T<Âξ ô=W«§åv‹¶’ÐÓ9$ÖkòÎ\†suøÊ>:í÷Ë�ª�P8FîY%fµN/R…éP¤PP×pZAã>$†Ž·8)û¯XçíŒô=•úL&�s3Øk„ÕObcDz2;L5‘¤zs¸Óìœn]Ä¥ŒŸRLra*G)ã9 §n²^ax¡³"¡ Õ6ŽÏ_Îç¯?ÀÛ.¼7ÿ)­î=W>îßýÄïûüc´‡àžËïºâ1‰SŸþÚÊ~ã¡�9çÎ@ `msrõ·L!Þ»¶tÙ—Ï=x÷Þ­é`ïÊÖ®ÉöK.þò»®¸à�W\ÈŒ»�­¼åcýÚO\ùW½èîµÕ_|ÃÏ 3Ç Ú™×GN,§±=å¼Ûþù/þD»Eøîü«�?éÀž“?öÄëßzÙ“>rÍy>rÍ#ÎÜ¿ö³_ûÎO_9üدëåvë<¹õ™ î8º«5áÎ|á›~Õ³¿ð¨ßýé¯=ôÜÞ³gyóÊëbð›p|c禑�¿ç Ç&5Ai�?]üÊ|@)Jœ¡ ”²9xTØpïB¨U�«Šê u�a�A@8T„ZÇ a4’ë,ÎL²çò×êÕS lgÄ2·ØŒº£µÊ›MŠÚZ´:¡ ~Ð]ã¤�ˆê"Dóþ�?‘ú¬ž�×<6· s%Ä óˆåG <ƒb*ZC–g,f×rßs¼´˜„e¤�ç�\o¬@‰Ÿe™òn«¤s‹c‰=âÓEÚ©#†m[á”ÉšÖYz¤Šì+àrX)i„³lň�…)ÿt³µÒ«ô4¢ŠDØ›Hm~ù!ôÔ9i=c½ìyÐÍa”ÿ†¥Rgve|,Œ>Œ£…i1¹¢‚ã†ÉN_’ bÙ+D™¦ð¸BEõæ¯;áÊ2ãWœŠ¿Žø5¬û¹Ž)_üÖÙÇÖ'?ô}ß:rbIŒ±׿/þÐUϹðÛ§ïÞ0Ì>víyé‰�iurk´4™nÏ'¶Æ‘G Äûwm�¹ÿø¿ù‘«~ᇾ”JŠ[ÓÁ®å�;ŽîήdÔãÀàënyÐï¾ã9[Ó:=wxm‰ÀV×ǃÙõ‡X_¿qðŒñpvÆžõyCãÁìúƒv v뎣»%X[È…ðéà½{¿yû�§=úæ+¾ñÐ8ÿÖÛîÙwË]û3:Y4‘Ø¿{ë¬ýÇùG®úE7®Íép×ÒÖGw-�v¸÷Ä…ß{çG®=ï±çÜy`÷úî¥íCGvïÛµ¹à©í;Žî6-¾é®ý·]í¬ï™d*ŒjgS[~SÖ˜ ndQ¬ìåõ{ER»ì(r�ZÖŠéU«šz¶ ¡‹d� €¶¯}*W£Z£´«ùW)ë“ì7 Nd;ÞS#›ÍÐÏÙOÊApY SQ(`6—Ê"Ï_¨g³Õ3�B%ë#£0qdâ²¼DÄ|øx<1�’ʉ´EŠ8–ÆC…hPÛB01šõb° ]A6sDwè©ôÊ!´î»Ø:ôi&žr%.n§ìÞ:‚¾™m [-|ÒPxòdI{Â¥@®ysh¢¼7É6¢Ô¨GNÙecd—Z¶ôÈNvŠd$ Ù�¬…œ.’øî…Ðõç@¡ŽuÖ´{F!¤ÙBŒêid�,˜ßÅÀràåŠñŒimÊ;ó°½›7qŽùœ9ÊuìÊú¬E*$´,¡#‡"bú¦AÖ¨2ÊȦ۔QEä˜ÀŒäâ'\ŠiåL�CE£ÚFŒ‡4 T ă “e5@“¶x  ˆH(òFÈtLU† ¯,Ñ##²ú<ÎaûGœ"õC`ÜuÕ…uxè„Ö'‚æ*!½Ú*Ù2Ùñ5S‘j b¢yÓŒ1Ÿ+©^·ü3ÿËûÓ ;7ÑÒE|ïB9GŠ`$jy:®ïì”·Ú%-¤Òö›ïçQ€åÍúíº[ÀM×uÄõŸ"cœõ>{•KÂp&M_ÚòUhÍ*LìÊPÙËï‚ ]wŸ…¨sÅún°éorQÞ<‘"•HðÔÇDVNo—±ô}¤D‰)HDCþ)›¥r<Âa =j�›ÒËÏm‹eÄ—xvA“²°¶±¾5zï•�ûùg_ýÁ«™@4¬ãk_tÙÙ§¯ýúÿ|Þ7�#½öÅŸ8°[–šæ1DM )ô+Ýd41üÑ{ŸyÙu³6¦ÃÇ—ìÞ¸ôß¿ýa,òFn»gï þðå‡×V ´5ÜxçþõíQ«ƒÙ²ôEŽQµo-RT¹2�U—_wîË.¹ö¬ý'.zø¡O~õa›;ý�g8Fnbøoï}æe_y˜]o">¾ü ýë‘Ã…½cïòÖÛ.{â«òŠ r;€;�îâˆÞ§îY[Q €�Y=�¶ù˜ÎL{»®l¥[¸ ®�~kETŸ{n�³Å¶'6×¢?*u�Œ‘L4óvȬ“�A‰�ZmEG)6»Œ¾ÛN”Ùöƒí(ª‘!¿s# IV{—ÌmÚ™¥ÒŸù® ŒõT� bû’ùA�³ï[^“ ¬6Ë“QdÎt·h€–Æ<¬xswÛ–ˆœµ˜åI£4¥s‹ ¨Á%`¾Y¡‘äd�ÚQ¿'’mùHþ¢“›y‹FN‹§Ä#ùRWŽ:3¨ êšØbca¤ÔJÑbh ηvêcq ‚¤öœ¿@E"lšµäo¤@rNH‚µ– LfF‡«56çñÐzÓ̲¡ç„4ÎÛÎ~¶X“J“E(€�¶ 5¨¶jªÕkÙþsU×5ö�ªI%ùÇÂ\ÅŽ aìD£*ð®ŠFD;ÌwœÄ±µ8ÛB²”y!7•æ1ä†q“KÙ"Ê*ÙëÕ–î€ÕŽG3}äd‘XÓH³«�H ·#ÏfL‰rˆU Á€Æ5†5'ç;€«€!É+™M@LmiØX$$96Y4ã#+½.d;9T ãGÚ lyºPËn[õ©¾²5œÿà»?ÿÍïIbøÈ³OçÕÝÇWfMp·à‘N·VMP;céþÒ·Ï~Õs¿xñ£oØ¿kãsß8Ǧ+º:vréÎc»¾çÀÑ;Ž­ÆX¥j’FœØŸØ_ôðƒ÷žXúÊ-<º¾ô”GÜzrktl}cЧv5�_!élÿ”Þ˜ë½J¶-š{ì…3\]g·¸èÉ!gœ †Á¹S”›ÑÄG»âœÃÖ" `½‚L$I¼k'Ò÷®æþøF1Á0‹è:•ÊçoÕY¨Û\@så|Õ¬© ™{' Ÿm¬ÖÊèTb€áÇç ›¬WÀ(5ïì=mÌ‘Œî¤[Á#S]óÒˆšÈß9<›KÚ°õ™ :¬OÖÎ)+¬±nÁ f‹xZk$[è¨?”líÙ} þ…æ¿EÁE¹”E�:ÔaN¨AUšWªš4boÝRsˬ/7Zv¹MìŽäÑÈ�À�P×–ì!XÐ.Qg'ž¹l”ÊœU˜°k€&òÍ'gÓ¤¢l%ºŸÜ`–Nƒ ¼AÚPÕ•£pádgÿ«º†½5–êŠ!M 1‹tþN4ŒŠ°¯¦ŠøØ·ÝÍ›'±DÓÕ/0s E$µ‹‰ŒKRRšxMU 2d3_Fç™~MF,b{ÂUI;sw$±™3Ç)v¦ÒnÖ h<¤ñ5Q]¡N6PdÌ™^É©$Ù5¤Iê šSÀY„Ò«˜dþ“é{ÎðHaë5#óèÓÏrbrÉãn¸ú†³cÄ Ÿþ•§<âÐ_;‡œ äaéÙÉÍñ;>sáÿù‚ËOlNþþêóg³ðˆ3ï=}ÏÉw_ù¸ySÝr÷Þ¬œ"_ЬGW•D®"@÷žXþ‡/=úçŸù¥ÛïÝ}ÍMg]øÐ;~þÙWÿýy×ñæ`·þ)ÝzÖÕÿÅóï:¾Ú—œTðúö£»¿ù�/»äÚÛ�ì¾õð¾Ìzæh÷ÒΠŠ+£ÙhÐìÌ*'¶FïøÌ…¿ó‚OžØðêGÍgtÞY÷ž¾{ý=Ÿ{ÜÆöàžµåÇ?ìö÷_õè{O.ýà�â7¾vðÛ£é¼zÇg.ü�\~bsüÁ/�?›…GèSÓ&<Îǃٰn–F³­Y�"fŽSNžKŸÇȤ–Úé/{}PK€>«XfEðéâËší³Ø†ôô”wy­9*šÊ&3=§r®vGSûkCaI͘×VmøFjc áVC¶ÆÇ·§JuEÊ‘mU:RƒHc—€§ÄÛ«FÚpá0(ùD(:òÞAyxÚR‡_Ý£àNÜA¨-‹W€³fªË*ŒÀ ÍýÒi‰šL!2ÛçðòČٰ½pðÌqÔòp’‰SÅHÛú¥Kn͆Zœ°Õ×À�ë³Í-bÙDÉ ÜÌŒóÀsð!RNÈN6Q¨C„bVËù¯ÆP‰«ÕØ;+ƒŠÓÇP4FƨˆVOèöÖ¨Àwlà¶;géÍ[ñ¦u¿–ÔC 4«4Ë´‡9mèÂjj€ÈÜ€"KÔÊ5òÈ S� ¥µ›'ÓCÊ–©T¹Z’òU\0QîÆˆíÞÚI£Àp@“!MF4P¸"  rÊMR¡PÌ�Œ@®Hƒt`0Ò[Ð�užƒ±I"˜ÓËÍd©}¬ž…\�ÎØQìù Å7íP ‹nâÈÜ0†5ˆ€!¨7žÙGÏþtO¾ŸŠL¡¨‰wnUÂa´� €~�IåÂ��UÍ ›­úG¶\Æeì&[/$°‘¤QKµ-JZ×�Ùxûn¯OÛÖ@ÐJì ÉLY o}nߢôbqè§Ã‚#¯‡tâòÄþµ+\Én€Ž’’#Ëþau3ÒiÒy2I ˆòäF‰íƒAJñ”™,æ¢Rœ÷7r†ÙE¦¥zÎÏ:…XL)l½°DA%éÿe_~øÏ]ríÊÒÛÃ?~ÿ3^ûâO~ì÷ß|t}ò®+.xû'/<ûÀqÏr§r6ÞÿùÇ®­O^õC_ü…ç~‘ˆo=¼÷]W\9hˆÔ 3i¹#ó$d@oúè“Ö·‡ÿÇOú¬ÓÖî<ºúwŸºðm—?¡i€·ZšÖÓ¼©>ù•søû¾õÎÏ|Ÿf„c2œ¿þ?ðì n¬¨!Âkž÷éWÿäg¾stÏ+þü…ß¾ý´÷}þ±k“_xn×¥W\Ø0ÅH·Ý³ï{ã—oz3]{ãÙ¯xæ?ÝvxïéŒÝÈ=SEðIf}‡ $Pa'£Mø ˜5VX Øh8Œ©Ùp±¿Î¾"pb£þA=þv±b¹^MˆÒòö¨s’Ä¿| ƒÜ½âQ!±Ùî±À¹ì€•ªQv�¬€Yß<±#Ò“7Rli¾>vçf¦Í-¤ä� =œŲèÜ9•û˜ÝŒö3ÖíV›&šÎiÉ•¸݆ JG%˜âHîŸËºsÒ·-îˆk�Ru’³‹£–;¹Ķޒ͗--‘Óß^:§&žú„7¤;$�ÕG²ûÃÇ<ðžóû(/ åÝ?`£>emþ|7‡Vwˆ]/Ž�–-Ì‹èšn9Fû:ͼ¶ÂÃÙdrKòþ§QÏÇ [Õ ÐpH¤ �Ÿòý+‰š×ÈÚæZ; QWiب¼æòÎÑïŠXn‡Åo1ÏÇ…Ìl™C/ÕêU=AÑn‹v±´èŽ4ËD¹ÞT–èÀŽcx—r™ÞrÚ‚‡Þ¾€ñ|¶ë�´<1gœTB»xaï. ć7w�Ür³{]U0TÒxA��äù‰±j�½k QRÙÿì(¬*UI˜,Â^´©SoÑ“0á0qóÂÒŒVWCä+¬Ác¤O?ŠÕs<$ùfоå—W„¬¢fc'ò°Ëe äw.“À¤·0S6J¢4ª°{€µ�ùÍkÍ|.Yâ]Ë,3‚�˜¾Ï@Ô/X&«„Ö'i¨ ¡BT™à³‘;T1„å!íU¨1ÇŠBt â¶ê™d”\¨~_�!áö Üz;Š�ìÞÀ�¨ â*›‘“ÙŠ©ùVäñžéþ]£qy K!GõÒ;‹”6øãqi¹¢€H'Nbk�IwNÍ¥�¹S¤œZ¢– …… Œ4‚—�4lã£iTzZæUbR­Žèä4™‚˜æk@TP-÷éC‰ˆE£ejŠUû\/|wQÕû{-õH¦OëA&]‘é–)\Ç.Õø c�=€yëWš”üOÇ;P9qÑØûE€¬}Ó¤ûyíY¨®[¢Õ¯EáÇçç^H *´Åt5;03Æ�¦lÜÍ{ب—…_ÛU*YygÔPȨÅOá-Ý´Í��AA’Áê(Sú"êãÁ­q-:×|©QvŤÇú°è†'ù[ÔÎ*ëÔ{êÃYoG‘öÁ®xë'+Ó¹~ë‘ ñ& a1[Ë]xÊa`»ÐÂa×ëŒu:5ÐÍø‚N¤3°rË•þ�Ù€$“ÒP‰¤·æ[8î]È g©Z79í"Š éEOL{�ßD…ò\… Ò<6x*6êu²±@&òÜÀ8§Ê!eÊ)÷Üð�Ù±(…lÀ=؃QƒÈƒI³‡±Í¼Â‡'Œæ%«1T È�1hy©¦#S! wıÐ鉋ûؘDíμyãbÙ>º*‚& ¸…¶ýþ|ëVÆn½F¾.–ïLR¹Ç…3¦ þf• @ÉÝá̺v„“×¢›Þ›Ðg]h܉02«zÆë�*¹%`ûþÑ¿äð& ìzin•wþm(½ÝäòÜ–J™Ð= tCa¹^ÌV=Íl’‚iŽàªÖq…nFo\ÔÑäp¦ŽÃâß û\C›žp(®3j2¥s¥íGÉèrR�‰ GÌS\iõ¥}éº_Ug¬Ö2ÙÎùsC$«’s¶™çé©ô2O©z…·*mRh-åìrËnÛl}¶ð¾}Ê÷ÊaÝ,Ìз¬2(˜‡¥]·‰7�Orï²L*mþÍíXjT»Èœ½êò•k—U’ÓÈ7­*Ò¶Qht�|ÍðåõÁl¢°q¦ ­²3�Ì6*‰³HbáàÕ!¨úº-pÌ“E{4Ó88íprÅ þÆ4Á‘ŒÁ âleßÈ5åæp �dÖ5MFÜDÜqtÎS1J\$eŠä’šÀg¦•DDDÜlÏ*£µ TËCï”?3gÌF•%ZÐâ*Y�ô�¾ IDAT¬¼ yJ4îè¶l6·,ÃMÀ)¡Õ^£4|"À^<0–²ŠžF¹¬ÂÄùYñ� å·mxu€À|pc¶³�î8KŸóŒêXÛê@!€BJIÙ#!°¼ø˜ûž×–�†ÕÞ!V�æìƤÉ[ž²v$j–¾¹�ÝLˆ7ºñ.ž7ÄÚíftª�7x)4ŠÂ4b´gz`5OŒ2«swuæcJ²H.CEØ? I ;7ѨÌA&9‰`y{ÊÄq X¸8 …äFGÍSL"“'éÊ1"Pú\�FøYæHÌØ™òö¯ ë0b<À¨¢Äᎄ†I_RT<ÑŒ%„S€"�æ�a)eNWØ8²—; ±€›'Súl3#qðŠÄˆQ� h�vHÃxIP}‹†d1<Åâ" oOz¶nRz‹¸S¾seÑE3íš�žz€NgyëñE•8Ù2’ƒ«Ì9õ!è–|‹ý˜áIŸÆ2pRÿ³ÔµR-ˆI!×�v˜þ»u²©d¥6`fÔh]L%Z4¿Âœ ¥·Ô¾[…19BvÝ·-!ç¢ág‚£g‡ÄèEŽ]‰ *‰9{Ä M; 7ƒ•κ$otTðÕ‹âÈõm2jƒhíøÙ9<ݨ¼ènjέt[í¾~å+õÁp�íwXäçÊ=âf$ó g­ºG�_n×j³U’ÝðÉ¥ k³bfŸ�»\éŒË«]^¿)�øa掩¼è uO• æUCÝÖöh}'Œ¯N¾`­Z×[ð¥É†êd§¾’3Þøµ9Êde7ºŒ�N�-@Ë\u=#«93Bÿ3�Ñ�ç˜UI�Ö_-²‘;iÙÈtÝȸ|Pi¬–žräŒ�©âaÕ8Ž –Ýp’B10#:v‚OnïHzÙIó{ˆŠÙ�õ(k<x†¸=pýtãuô,tEYeýq�Á�Á ÕË„íˆoÞÉÛ; 2"ÉVÔM"žu\ÖWDtPÀ¬aZÝyàžI“SÊ:˜a€Í"°RcL8>åï&f„JP�ÕƒQ­7Ñ+æ/2H|'(mМ<)`³BEÚ+Ñ`…A�¯ØxÐ7)ÒÎ4_�‡×øî“¼¶ÅSlÎxÞPÍ<&Tà¤ÿ "rŒwÚb?Õ“h‡W‘&ûއySI�k¨–±”T3A’ªž=æy-Õÿ¿¤}wœUÅÙÿó̹}{aXéHAŠ(X°×XMbly£‰‰IÞ$oŠ%1¦5ÆÄƒXQPQº°ÔEª”Øeû½»·ß{æùý1å̹»˜|>¿#½÷Ì™òÌS¾Ï3Ï̯P°’°jÒܶ@BD“\ [MaSµšF°§޳^†‚ ­‰\¿K @ø€Ýì,š?tSïD¹½R ÛTåÆhÈ©R…aĺ�3»Â*ƒ ¯ÈÞ9Ø‚\58-�ÖÐw¸:ûßSï«.tÍŠ^w�\à\nsnïXvPôPa1t1(ÜUuUÄeG�U8Òõ8Ôê�âR)Ó € bºÆ(twÒ*å &¸ç$*#]DYW)c)θÑ�Ú9ºï±LÎ-59¶¶[�ÆvÿF®¯ÎärÝýÁ³|顯¹ã@e{~ÐÐäR/ë¾õD‘îôÌ­VÑœ€¢Öú²8é +�‚šG5]çpê ÓkÜýŠ U�i ä^.­@ 2>ŒM?!‡¦ASLFZª�Ör@3‚›˜Fz‹Vm=ôU[§ún¢†F1PbœsS§èñ™jÒMÇ ¨FUW€R¥~µÅHEõ±tê` Ÿü>Jg )œQ°Ñh¤û@5R[3Øq/pLä^°ÓÜÄ“�TW %Þ] ]ê-Ç‚žåœj#pér2DsiÐB –ðŒ]¦¸Z†Ä˜ ÿ3tªrW d™£!aÕÅl©­iˆÈ ½Œò½Ð•¶›º8q |¤†àÊJÉ`¶zÛ§ ÅöGÙ"Œ!z̈ hæ!`äõ”…Xï€×̂͟jZT&1è¾èéÎ÷Pƒ$‡}g 3d‹#€Hºþ9Ëe&圥 Ã:üi"twòº 9Td7²Lå}¨6©‚§ˆÑ©_h0”ù·‹•> Éøˆ ‘©ÉÓÈD÷Þˆ81J̹k 5§s�¥²Üê&™n+9<¢©"Kž±Iy4¨Gæ/hRõì—ÆšhFdÔ-ÿM…ÔísŽ«ó1„CàrwsYYrmî^€nm Ò¹CrFØ r„USÛ™÷ž~tµàŠ©hUÜ}ÔŽVFGí ³s×ÜM)¾’©rÀ}t<©’16÷ª‚ñ–¯Ÿr~s;Jæù òqT‡ê˜8­;ƒ±z9í:²­4*já×úV¹`¦y0b–@j$•�ȰQí�móX—gèó°`³"#ŸÅ<Œ!Ë Ðq Á¡„œ#ÇV›ªÚ1 ÂUQ:Ojt' ªº!{äØýât¤,!-ŒÛ@àHHÙpÖ¤îÑG>‚šDM`ÕC²Ý¨ÀÝý¬©‘z²âN¹ë $œý.ŸÎ¢tœ sO��KG¢&P<ᄨÝ]ŠXr’;ÖF`PÍÐ󺡞:Û“Þ”fÂJ·’äú§‡ºÁ9â�Üt1­=”p€á’©áÊB*­›Û¢ 5:Ø$§?JY »ÉõÎ×üh3 UI»IÒVº&^uäÈ�Dd¦ãj™QFWöÉ@¨Få�ó‹«M‰å5·twŸU=Ýì©kÄæ­¯d}ƒ>¨õ·ƒNÏZü¿¬Ö¸rxÃhÀd ÊyD›�Æô?€S[8�èâí )) hAÐü!ûE œÙKÔý,’�’2¹î8@ÝÍúÍOʈ©Ü“ÍFuîœ}Úroõ¸N¢+Z¨Œδ]6èª(çVr.æÕÕJËmMœ¯ wãåî+’ª?¤¦ã -§ªL. ‹\lIjaT|÷xX¦ Pœmž�&-œ`PÎ)/ˆ‹bqh‹§”ƒGz ¢#òÀ2Ó�±I ·²q�KìÍÁ¹(ét\{GŠíä]êVܘ3Ar"z°i=ºëW©x=ŽÀCMRf¼vW3µ»#ã}$΂g} :€€‘€ªÊ��JfÆYtJF¥‚æºCJ‚Åäç{ÉæTµí¬ê4ç ´‰´{.iJ:Ô{å 2DCyòœ£c8°¼+ Xr”2èNLM'™ëÂ1—îŸ@‹ À �‘‡as �4P: €HÊ�¯sa†�aœHÌž „€6Ø`!÷"x“•Å~ŸÅÄ›Sr¼7ÍÊ5WÚPÚf*ò‘�asÎÈOŠMü"€…ÄÉò2ž/0'µD…˜Íò‚‚lyÈÛ•¤¶ˆA)¦�«b'Å¾Ž (UxÞ#w°IÝZ]Š©L€¦Zˆµ€»6¥³ÙlC¿ß²ý„ ,> < 8'4l"(Ý¢²Reƒ¤•–òfv'¶B¤îKÙÂqã€h¡�ñ˜ ÂïA@VÚ™"0p.ݬ£rZ1�nª¡æ–—è•ò0S>œ:Ï¢–ÍspÙºThçlÕê†æ&TöÖäsq_¾ÒP�´ÎwQÅ…¢0§·»~> «þ׿ö�Àwtn¹L¿ó· Q¸u¿TùÎaØä®GÍ©éZ¹ÖÝÁü¨Ð”™j¥~5sqÌà‘ꮆ¨ì€ (�yú¡4WÂcV’C®_{¤¤y1Ór«Eyi†\±Rô€³d¦)ïü¢£\=cçSÞôm“Êÿ¥ üÇbÝe_qÂÙ.Ç%s÷�L"ôÜ.uû&¡‹ª’dãR®4ƺyzí×fíòylu�Ö„N‡Qâº1¥ÅºµŸ{WÖü𕞼se^0-Æ8eØñW~s`E{ŽâSB¢x’€ êݾpò¾ ?£kø2—�ÿrá{-Æ5ûŠáé¥Ù+'xéþ%}Š»ºÑ©g2ª0€J8ÑB¥_P«àZÅ‘juú�9FmnÔï†L;F $FÒSŸ;Ç=ŒÅ\U3FFA%Ûšá÷_ÆÁÁ„™ˆ>›|ÅŒ9oOQËbN.cçб3Žó-çÁáf‡¹‰œ÷E"‚�`�‡LPd ²¢®)D‚~ˆ!É43¤¿ºé`™MG€ O=SQNbœ8C”!fM�™äæTÚ?ä%?BC\dŒ¨ñ˜2î^Бô¬3ÔÜ#c �Yê6 �q´JòX¹ß£÷�€©*5�ê¨)Ù¢>n�@�K,´ëcp ÒiÍʃ©“Ì –‘�ÊR6�å”±½„�Tï’€Ÿ1|’sCZJò‚È<Çîx €IS} ¡x÷<1½4Oˆ€DŸ,‹, , -†B6KùyÙÒ�7nSq�•ä‹\eGK©ùÖºZ©ý7�K @ ‡cVV3”S©fAf·*dz<Kw¶§â]v:É4ÄR�µÑƒäe&·‹Ä¥$drˆN7’ÌhSè@źÁñ)$ñe‘Ôjçĉ‚•�ƒ€>Y™�A üa�«'Hj ywƒ¥{iZ^­7IM3ì¾*�æïÝí¡Ôè¶ïÝú’{ ¯ÍµT’ó,éh†Êv�="[6C*Z%˜m¸Ì†iA ©Õ&ššðl#À¯üÚóE†õ3+4›Í]pïá:‹eW å˜c´±D² ^Ó<¤íB“IÞwÖvÓC…S{¢Ÿœ4³bÁuªn�Ï*�°‰ä G}¨KijUèZïôp±ir¨¯ª.Yˆœ»F4KùÊîD=&ç€erˆï³y×ùò_\9U¡®„reOéQ:’lú^èêˆãŠ�\ 5›FåZoKPƒUK ¢^…±»ælßvøN¬¼0þÆ «jÖÝŠ§¼÷þù† û«uªÊÂSGw^+Ý?È|~àœúÖõ• äO]8ìäéöÂdÚ+ÆtÁÐú~e‘XÒ×�nb.§Œ81mÄñ¡U-£Î9SUÚŽ³Ü“ʰñç6Œ«n?¨!?�t&½`pìžCºý’]wÎÞzëook‰ä;·+çb`ií´�nÊ¡‹4n#šû9Wº_*eÓÜ?�àÈ9š T?äô²[Þƒ@ªµL&G”šyÞ‘’üø[Æfm9Ì77Žýdç0ܧõžy[D%:ç`ÌÀÆ'ïZéaöÙG`Ûìá¿]­q¶eÑÈsš÷nÒ·e×±>S†�hŽä7´\4²¾+á?¨Á&€DÊ»£®_*íca n»xç´'6°xýøÝÇúl?zΠÞí‹þçu›ØÇzÿuÕäMÖÖUelµ§`ò�ú>üVA0iöçËçŸÊéa<å½÷¹×í¯Ö3xÇ%;õ–ßÝÞì𠎲è0¿´ : Úˆ²‚£Žsg•|˜KN·¨Ë@…®ZA›èé1pt#i‘%"Dæb o3 Ò"ÉËos±ÇÃô¶4eæÅH¹”†ô#çÔ¶9ФêÆ?ݶüùO/ü÷–qޱ2õ Òƒd$°c–k,J:vÞñ™#ò!ôÚ¨¤¬RG.ºê%»\Š;zÐâÐýWÉ úw‹#³TGÈy½HEvó@ŽC ü2饒�„2ˆŠˆds`jE@²‘£ÅAÔò#:ÍÚYi‡”î„à2Dú@ ±2†àUÛ<%q-¯z=Æäy€: Qji’Ù€"cÉ"°Eðž¸È/÷3(b`!tfáH+tv‚ì\å*ˆN#�<ÍlA²E¨ÙÌÏbIIQI¶WžÏäÊ~€Ú�R©sŽzÎ m¢| òe7@&i˜%yÆKÈ—~åî76VüïûóÒI æ§T'!•öõ*µ<Œq@ð2 z±¼ˆÚãiÛFâÈeN‡ ³0¸è²\&6Ò_d„”D»¥Àˆ… ‘Be?ˆ ‡K@ˉà98žá©T* È‚ž@È“ö€ÅÀç!¯Dh«µtZW‰ž ¹Å+‡´Ì+'I;ù2 ]a!½-x�€Í)àæxeD‚´+QFKœ!K{ª¢€BŸ‘PVjœòoS*h‘kл_ÌÁ!=_žé~ϰh~5Jh¸‚ÎC†¼“ÒØk9ªLcI£=ñ�zÚe¥ËLxê™[—üuÍô76OTÍ-í£É^gs̶Éýµ[™¤×8°{ªG©MªAmCöÜAA#ú‚¹O¹ «XN03ä�V�™�ªP½uÈyX[^”K*¢&åBÿb�{èú ¬s.q®"Âã7}6òœ3ÿóÒÕÏ~ó½ý§zÿæ�YDЫ(¶ø‡‹÷iåñ`Í¡s^Z9e瑾ÎÌ;‹Ý ÄGM…CÕžZv~tؾÌó÷/ýx×Ð7Ö�ë6FwEŽrÓÞÕ{!ÂOnþäž¹[MÃÿIí�ûþr]:«_.mð€4 à˼pßÒ�k‡.^7á«ÛÏ0ÌAÚA,ÊKÜ]þÑ®!ˆÐÖºkÎVßB"úpûðêoüH[&DøÞÂõWž¿ÿƧ¿ÖÉ;[?‚ÞôÏnþä‚¡õðà‚Ï\ðù{5#­�0ªÿ™Â`rÒ�“¢ls$ÿ¦§o?ÒX¦€�u}¿÷÷«ÓYKa.Êrë§ÿ¾ôÃÃ�L}g±îPCùC»ÊgÙÌ‚Ûgìèß«ã˧G“0e Ë­}'+Q*yw‡Õ^A� IDATâì[2ãÜŠáõ- ÇE XPYcN´œjµhB/BÄ^÷é¸ ¾|íï¿þÞ‘†ò_¼uiÏ¢äê¶t&®ÿÍm+¿ÿÚ;ëª2 ^ûé¸� üíšg¿¾üHcù/Þº” �¿eZí¯n]ù¿oÌ[´a� û!Z¦C…±ÛN“ˆÈïËþòÚ·6þþÎ D ³ ³:Óiˆ¥<'ZKÚcAd �#Þ¬ä€lCµ"ð8Î w>Œ|Z©_%@ùáÂÕãœ~à×>{×{‡zýß;óˆ”ÕèA¶5 u“R�Î_=ZUxT�kÚУÏÝùÆ¡ÆÊ{ÿñµHÜ_H¾ô�E#ûžyèß7¬Ù?TP%–òÖ·–vDCd6&8ÂH)vAºžÆ7oôþgo'' gsöýÅ׬¨Ý3Œ/Žíì À÷ë½|õès}ýº'o^vôLù+.ÓùûÝkv7áü¢­><2õèsN« {=¹b”Dÿuß«ùþä=/ß~èL% \9vσóÖ~íÅ»š; L)ôƒJš’>-J«ªâ¶.2ªá:èá{óW�îwúû¯_÷Ä-ËŽžéõäûóHƒråQâ{íz˜ØTÞQ8ìJúcI_WÒ‰õ²çð‡eӗ׌ìWÖyËÌ]è­Ç^¹âã]ƒsœ¬žfÄ ò~ã9$ôg*Šb¢€æ]�>®ã¸ßîÑž¥3=wpW]ÕÏÍM¤½â‡h2Ð d÷à€ýÙŠâ˜ØWôÁý¤nsî\wÑÞ’üøß?ž<{ÌáŸÞ²úÍÓS.£: È™C×Nµ\ª…¤æýíÒ™Z1‘žùúм`ê¦é»�6–Ýù‡›:¢A˜?ñàOnZ�É2c sÇ>úÒ¢®õûýiÅ4§KhŒLr4†cyŸÔ„¡}ZV´¿[sÞÛ›Çrõ®w˜Ay ¹tþê©Ì=RU,ÄÈé>}hÆQÐÉ„V¸I>Dކº’�hÒ�û±9³§[ë ¶!å…Ò]±ñ³½ƒk�÷Ñà BQa,åïJøÃÑ ßïÍÎ{8 Îsø�-£“Š!�ÈÇÉ[ˆ–…¤ÞU¢§&èM—D¥Ý² nS[gÖB„ƒ�·¾tè‰ê�LE%œ(ü'ä)�ƒ55â×Ó J2G…cb\�®¸? (äd逃‹Ô”3»N= �q8êJú£)W‰ôÛ¾úGþvï[^‹?ùþì£gÊÊ âU¥‘p" )/•Cy`†@vL{lD �N ®�a”•vv¬ ªp$É�’€ —Ù @ž�ˆ!o¶,?ªÉ®$J¦‚±´ÿh»·+á '*N h [ªw³q ’˜[/¸#³��ÚZV–ï[ÔIùCžL:kq/»~âž§ÖÌà=xCYOÚnM†fÿùžÒ`üŸw,ÇÙäœ:bÁhÊKúºþp< Šï�ì$­�dF s”®TTÄ! F“�®ˆÕñ´·xì0�æYè Ø×Øï÷Ÿ]žÈJ#Ï3¶G…ÄÕ®V§J?æcDàâ-î®X™Í=HáD(šDÓþhÚß™h_Ú­ �ª¥è¨ÏQ$Œ¦Ñ”/šðwÆZ�¶èù?ûÁùÕ'~wó»ßóšmuŒ~ö`âÿ#”†ÛJ2#ñP4ˆ¥üÑ„¿3$MÿžÐ…1aFlÏL} Ç‚ºÂˆ3.êJzwV÷j©=Ño@y{Ÿ¢Î®d4c |ÙXyÇKw þÅ^w7æ+®�‡Ï½ê÷ßfȇõiúÁ‚Ož]5{ï©>¬1\ø_VCg)�C} ¥MFâA2ñIîszߪY‘våÚc$Œ&õ¤H!B„tÖ²½ìª _üîÃÙ:dÄÈt°Yy(ª½ rqIš6fôÓDH‘X0š DÓ~‹JXf>+Ž"p³º;,çç˜"bG4‰’«3èè 8èˆæm,;ÚX¶ù`ÿ'îZùÀU¶©jï YŸþ—÷ÌÛ:´ª¹3î_úù˜ç?¸¨+î�Åož±ûÎÙÛT„ã)_m]Ÿ_-žsäLYŽƒ“L=u÷‡}K;xáš‚`òßZ>¨²ÝïÍÿá”ß¾3ý¾Ì—l¿yÆîª²ÎÓmE‹×ŽmÍÄTÆ ú3/=¸ä‹c½VtLv€>Ø6âÙeÓñ�«%­ŒÙO¤=‡Ï”Ç~“"!ö¯¼½õËþ*;¦?žJm98à—‹g×·– «jþc�=\zIÈŸzá;K/u ^^=©-’ϼšü@ú7oÎÞ~´êÅû—>öÊüM šN~üwßxÿ¾ç¯)ÉOÝŦp4ø£ë?�0øô²-£wéÇ~ró§?¹ùSÑŸxÊkvœÀ­â¨,ŽÞ6c×?VOÇÄp$¦q÷�KðÄäÁ'}^þÄ۳ȱ3c[9ЦöXÕsL±mëö™;½iâ�S–ŵZ8tºìˆJÅi„ˆ>Oö¾Ë?ï[ÚùÀüϘÿ¹ÙÎñ™e3ÿøÁTŠ)éV�ΤŸ¾ëƒª’È}½¶¡½Ð²ø‚ ¾9oëоÍ�ñÀ’Ícž_yQgÜ?zÀ™ï{ç¯.Øt` •‹†�xæëËï{áºÚãU¢ÚKΫ{úÎ÷¶ø²wWË/*ïSÿˆÑ`g—ÎXáD°=45:ýÃ(©©˜<èÔ Êöß,™Mœ œ:bÁθ?�õtÆƒí± š€åCz·¼¶vµSöTWt8U¡¦�&T×ßwÝÖñê¾ôɶ²¿¯�µáËaƒ*šþ÷šwÏ)móy2�]ÑðØïá;;§½øÙ¬®Lö‘Ë6Ü?«ÆÃ8'üÕŠK^^¾Ó~oæÎ)»nžüEß’ÎÓáÂ7¶ŽûwÍ„TÆ ù³/Üöζãýû„§9QLn>4ðÿ–Ì=ÑZ‚fß2­ö®™[–wÄÓ¾Úã}ÿoÉ¥‡ÏôCèˆ;þTÖŠ$‚í±�¡´4ÔF[S@«G OÒdwÄB� :ãTˆÈàöé; ƒ©;ž¿õXkiŽx3wMßvËE»ªJ"§:Š_ß4~Ù¶I6³.¨>r÷´u±¼óÖ}´¬…öœ{7þôªcªê¿>m}{ÖcÙ×�ß»bÏð‡—\qaÿúÇ/_×Í»dhÝ›;Æz˜}Ýø½îþð[ biŸÇâ׌Ù÷À¬š½›# ÿ>ûÙEñ@p@qú/×,Ýuj@UqûäsŽåù“;OUÿ~íÜÓ�eƒËš~9é€â6Ÿ•ùÉœå?™³œ_Ù:íùÍs¤š&°��X"íÿ²ÅßÖÌ"|mÊÎß޸²¸æ—ÖL}⃹ÂñZöcó>½õÂ]!_ú³Ãƒ~ññìdÖg¡Åe, ýò u¤!�¿ÅüŒÝ6±¶ÐŸºã�Ž·—hRA(?6£úØâ]c�·—ˆ;–‡<ŽÈö#G´¼œy8qq `G<Ô™ô§l+’v㦎ÆqäC ¦RKeò“b†, v%|©,‹$m]�l[#Ì[ìMe(–ök/Ofü6 ¥IPHýrÁÛ±´ÿ—«&3^¯'óãyï—…¢?Z~}g*d1>{è�[Îß<¨¬©+Xy`Ü«[¦FÓÓ:¯÷é;.Ø8®êDЗ®ï(ûëÆY›Žã~†áD¨+åKÛV$hO†ô"¶ [È4YG3º¨5�#¶áX¨+áOÛžH2غu1àœ¹§1çœúÖ%›&UŸùÒÇZËþøÑ¬Õû‡ pÛ”m7LÞÙ·$Ò.~sË„×7OJe=!_ú¹;ÞÜ^7àœòö‹Î=–Hn­«~bùÜSí¥$»ìJøÓ¶I;4fp€šÖcâœ=BÒÓè„>!u%üé,s*D€XÊIϯ>±ûd¿IÕõ�‘¢`BÜ}øÒϾ5k£ÐØO®˜÷ÏõЦ=zÿÜumѼ‹×-ß5Öbö‚±{?Ý?ügKÄS>fñËÏÛ÷Œ-ƒ+›º�e;Çýõ³©Ñ¤?–ôIö€�?›åV}[É¡3Ò.�¬jüÓ×Þþé’+·‘Û½.<÷Ø“7½÷Ðk×iª|î®7÷žì3 ¬ýüAõ´ò‹‘Ï}<3€eñË̶vŒ}iÍ4á'@‡²mu&‚ñ ¦ŽZ¨$0•µ–^½ôŒ¤¢˜Çò¢I:kuJÞp8gÕž‘Ó†}«fb}[©³F�xNiÛCóÖ]8¸®$/ÞÒ™¿tûø—×N�§<Ó†½îúöhÞ”!.þü�ñ”�¡}ÙØwÏØ¬Æ5î¥Ï¦FSQq8®º‘¶»ð$‹B9`ÝdxåØyJwôDS©ÏâDl}ŸãÍ¥n/D>”ÎZË6Ÿ÷̽ˇVµl98àÚ){ÿçšõÏ-Ÿöéƒû•G~~ÛÇ~oæ×oζmkܹ \¹ñùS?Ý=8äK¬ 7GòÝÁWð{³?ºaÍ Þm÷?]C[¡ÇÊ»ó™›*JbùöÒÅë&,Û2 £ /"Òwl¾nÊ¿zsîÎ#UŸþÉMŸæ'Ÿ}wºèÞ-×>öÊ‚û_¼¶ª,òÇo¾÷ýëÖÿìµ9YG¯b˜I¥=_@ˆô�Kk~þú¥�½2¿¬ öüw–}ïš �þ}ÁÑÆ²;ž¹¹²$ú—û–¾¾Võ0é#‚hÒÇïo ø2¿¹cåuî­9ÜÿÚ_ß™L{SY+žôí=Q¹`Ò—[¾ìos†HÓÏ««k*=ÜØkʰú¦Ž‚ÓíŸjê(üÛªÉYÎÈÈÏ>·Oë½2?;§“Ôƒ ø³^¹é¦éµX>}éæÑ©Œ Ì»’¯\Óy¬©lãþêò‚è�³vükÍ" x³™¬Ç&î½;-‘К/glkæè£Õ•í`!ÿæ¥5ºBÎñON?ôn¥ÔC€tÓ´]WN:Е <õÎÌÓíE:òQL=ºp�æW�=3~oöñ>;·²õ¾¯oh/€ë.ØóÈÂuZ1ýÓ/†ô+ÿâÖ�Þ̯ޞsèt¯½'z/8ÿà–CDÈ|ú¨ºº¦²C�½4‰l26³9“-:¢€Ž}PAK ‚ÍEy�>œðÀÉŠãÍe݈çb!é!#"ÂŒóŽ=Sz¬¹Ô5['š‹óüi›`ÿ©ŠãÆ]˜6üxWÒ÷þÎQ³Ç™6âØ�Ó•"4¶Oó3÷½w¬µïOß¾±#‘WÝ«ùT{)žh)dÑíåEÑ_\óÖò�?Ù;º¨S_k„gˆÿnÕôg?ž:¨Wø¥»Þuú€ ¿3«æºñ{ýÁ¬]'ûNèßøøüO C©?®ž ˆp÷”­?{ó²ï¿vey~ì…{ßyôÊuß{õÊ ·ÆW7͋ߟûníÈçoYþïšñ×þõönY6²O󶺪[/ØýøüµO¯šöÉÞ�ýË:ž¼im~ᦿ|~i¾Ç‹@·Žßü»u—ÿúÓ«JÑ',ùöEë~þÑUÇÛË|ç¶^±'æ¿õ«Ž!�„@Näe²º°é 2qè!¢Í׌c ñŠqû¿rõºƒƒ‰çóÇx}ËØy¿¿{`¯¶gn\õØì \{uZ¾S…#bÈNØ#âd3ìâ 8¹öhu}G±ÂN�zjîÕ¯¨óª‘ÿ¼iгz&}rùîuæ%_~–8G²ÏÀ‰ŽÂ¼Ó•œpcE]k (¿]äB«Å¡ V%"äJ‰UÒ®o) ù*ˆàà©^'ZŠ9r–¦ì‚8q"qÈæ{ �8'êJþ¸vÞÓW¿qíØ‹w\xõyµ#{Ÿz|ùM�É"^>â‹oN]óÊ–‹7Ö í[ùÞ¬ýVæÏëæe8.?ó«+ß>ÜÒçñå7v$òõj:.%@Î!`Q}GqÈׇ~Ù\YßYª™UP,|°¡»À»~¯o+ ùSDx°¡¢¾­Ü­zVC{7ýá¶%û<øÚ�í±¼!½›ëÛJ}ó’M 'Ô>µbÞ®ýÆ8ýØ« C©?2Sì]Ó7ÿê½Ë²äÊÒ¼Øo_òð¼u?zëª · ¾­8äOsŽ_6Tžhs©e¾”S¦óÇTtF�l…$Eôþd[IÈŸæÄœ IrVÍÑ“�X²müäs�m9R}Ùèý¢ž?~4ëÏ«g,oÿË�o‚Î!¢Á•Íï휳j÷È_߸|é¶ñ÷þã¶'nxohïæÚýŽßýÐ¥k_øtÆÚƒCú‡²peÀ“yrÅ¥6ϱMÎ×#MûO÷ž7æ@ͱd3D˜:¬îXKÙ‘æ Ár7NÞùã·¯úJ¿½åÝï^¶öWËæe¹uõ¸ÝÍ[û§¯=0´ª$üã…+ÞìS\šµœl-Éó¥9g+ë I TZ øUÎñ¼�ÅyJDt²­8äïC„OWÖ·–ª O²i¬¨*‰,»ïÅ5Ó ö£DÚ_s¤úïk§´tå�ªjüñÕ«"ñà¿6\€ƒ{7ÿþÃ9«v�üÕMË—nwïßoâÆeCû´Ô¯Z8á‹ç­yáÓk ©*‰üxá‡Oæ©.µÅ¸ÚŠCþ>\²¨� Àà^0×n$æ¨�º‹›öÜ´ ýó“ 9æÏ|²±½€–Æ CÉ[fÖ¾¹nÜâõ㉠©#ÿï«&?xõÆ—?º°¡­ÐBQ¸ðtknèeÔœ˜Çâ\¹qʈ¼°ðØ™ÈÚVs¸³œ…cþ3íª8TÇ®˜tà«/X¹}¬Ü>¬ª,rÛÌ�‹×Ž GC°ùàÀ5_œK§Z ­ÿÝ…z—FOµËý:¸ë\S†Õïýóïå@ŸxsÖß>ž,JZ¹c¸ÍYS8ÝžAs'Φ;¢�æH>em‰ûÏth užÊxSYoÆf¿_:ãxs±b-Z¾eÔ#×®«*íªo-* ¦.VÿÞ–Qñ¤oõîÁŸ}1ø–‹w�:§ùÿÞ˜ÓÎ/+ŒÀáSåï @»‚wÏÙêfH#¹Î`ÕMÅ?]tÙÝs¶>qçªë§îùåswï�†ÒG|ÿڵ߿v­¨ç½š‘xê�—ìzèÊ�GË7ôgSYOÖ–G€JD)/Œ_<ª.k[Ue`À³œÝû—>Þ5ôww¿_^ýÖs7$Ò^'”�°pòÞÇ®[ÛÚÊ dbI$0¸‘Hnd¹ÛL» ęŸC 6L~üþ¯©k*A€Â`êÖ»¯÷ú† Dt&œÿòG<|冗>¾°¡½ð½­£½fmUiädkIQ05eè‰e5çÅ’Pnóúýƒ.zìAE<a›“§ ¢øwó¡�›U#À«kÎw1�K®T0^9H¯j©=Þ7™ñš%hó¡�Ÿˆÿ\3ÑkAÈŸ™5æðÖÃý�5—l9ÔöèË6Œ�%} iþùûÒ¶÷ÙU Z"€p¬Y O[4lκ’�®t!% ƒ®dRÔɉ…ã�LV¼œDv²²0zŘƒ¯|>iÕ¾a°j_Aß’Èm“kߨ:&’ Á®cý>¬ÁmÖ)X¿ïܹcåSáXÈb�…§ÚŠ HG²7ªþüP5¼ºn騎žjã«‘Žžã§¸\—Ï� üüÈ@ øçúIº•P S^=ÖTÎÉ% b\WNØÿ÷µ~X;>¬QU¹sêŽ{ÆP4Ú]ßo�åm<<ìtGi*ã- ƲY«+úâÔ@[Ü:ÕQšÌx‹B‰|òêq;–ïž°|ÏDâÔ-xcÛ…w_´þ�í]�©ìkì·îÈ(N¬5VPslðô!_†|©®T^{¬lÎ:“�æh¡•ß >îש„lžèTâµI‡9ј>c„‰H¶<7œ¨Þßzn�Ïzk÷dm›C¾Li0z2\®·œ W’õ.ˆÎºoqí”O� 1¨=>bEIäò‘Û_ª™p´‰Úc¡MGúò殼¾V×RO{Ë Ù ëH„6éo1ÞÜ™÷ážau-%‰Œ·,+ &î¼hç¿6�}uãhBj ²l‹=2cÓ{û‘döœé÷éѶÍZc[޾xð—ù¾T8j‹BVª@xàHÄ,„bXMM„À9GE´³ -Ú§éÑËÖ¾´fê¦ÃÕ2úOp¤©ìÙ�¦Æ2Þ“]E+Œ˜=äXЛN'…Úa ¼- ŠvR0œ(ßg÷Ê‹o/ã3I•œÞÚ=ú»Ó7.Ù3J :g¶‰¸„‡[>ØÖRµ­©óÛ¯n�@¶s<‚Ȳ1ßô¨›„Ôj�)‘  šÃý·@@¯­/=V`Y~AõñmßJ¡@|~ÝœÅ;¦p‚º¶^/}>ë;Ó?à×OØþÒÆ‡[z#B¾?±pìŽå_LxoÏD"lí*X¼}Ê×§¬{}û”¦®¢K†Hf¼¿]=¿%Z€G[ËE(7K²pkýÀšú�°hÇdâ¤:hÒLøæû‹rij¨ ¨©PS7mž få\ƈ0oô�dÆû‹eó›"@p¸I("ª,èš?vß¿6Mùhï øhïð¾%á›/ØþÖ–ñ‘Djëû}´o„ÍYKWÁÆCƒg�ü2äOE! ¨©«®©«€ož”Ûºž$·¾ÒöÅÎ:uW ²æèÀšº�DðïÍ“P×�€H_Ô÷Ÿ>ôèäA'* »o$c? IDAT9þ˜½š�¸Í±`&«÷ƒÈ«3Ú^7€!oëÊûlÿ°­¥‰Œ·8/QLÝxáη·Nxkë"hŠüsý”ïÌYW±~Jc¸èl¾J:k}P{Þ×­©*î¬o+* ¤&:¾bטxÊòe`ËÑêuÁ©öâ76Ox`îºÊ¢‹º�§ì\²uÂÛ['r‚æÎ‚®¿ð;sÖÿC¶5uåT~>©[»Ý3p@�T(F–#ƒn5ukêª�hÑæÉêuªÂLs"Xºmüýs×¼»cŒ®Z»ò–l'iý—Cf><ª_ƒxÝyg"´MÓpß°“m¥‰Œ·8+$o¸pÇ’š o×L 1®uÞ?wý+ë§4†‹¨¦®ºæè@xýóÉÎÊu.?›þ¹ÆÆ$"‘Gb‡§þÈ%Žä8Æ€³6–Ä«ÊÂß^°ùÞË·Š y"í- %Ú v­zíÓ‰OݽâÖ™}ÿõÙÄ {«³¶¥zB™¬uÓŒ]_Ÿ»ýç‹æ¨¯ìÖPΰ¼°+àͨ¯…•÷×W|™Êâ¨ÀÙ í…Yn‰GÏtx-»¢8vªµØñ¤r(¹!¨=ÖWçg±–Î<Ý�“­Ei•÷–ÊXr±n =\Nâ/ÀÑ3å§Û ´£Cˆ5‡û'RÞ£�þ{Í„aýZ BIqN\2úÈ÷®Y÷Ùî!#úµ\>ñàÇ»†ªJsð (wÚ½(`ðñ—§Ê¾ùÜ W_¸÷G×¶øû‹ùûî¦e˜°àon³lóhdð­Ë6{sãØ)Ã�ýàÚ5÷üé†�?•L{²Y¦¼1@F iü Ó¯<ü–heý¾A^'‚TÚRÝps Ñ ö=uç ü´vè¯ïXõ‡{ÞË!™ÌÕvÖŽ�–¶­[fìúÆœí?{ýÒý'+Å�²Âx¿²ÈwæoþÖe³ÅÓ¾¢P²¡½¨æpÿxÊ;󼺭™0¬ª© /¹á@µ‹éUæ‚ñY‰ÜrC*¬m8QÆ6J—Ódz´!oº¼ v²µˆ¸K¿è4F×ãDpnŸ¶s{·½üɶÍ6ìtÕùû‡öi©=VD¨®j;ÕÞ«½3¦èêí ¢3ÁA¸Ë΀z¸ë*ò£Oö`c/ݯ�o¦wQ´3"ê[‹ÓY�˜ÆdÆÃvï¨ë÷¯uç?}ûû·�Øñêºó×ï”å×ÄkÒôŸ ºêŸµqÒ:Çx€”ÉÖi×(ÿÖT4㽄r8] Jï?Ué÷e* º0•±¢)0�Ie½]I¿Í�syo*kES¾ /�²½])?r޼$ï]þÚ…o½`³¨“!Od}ù�T$B€†Hq:k {‘ÎZ 9c9ke¤}TDÈó`4ËÛãrÆÑ,‘8ô“@qÅ•8È=µ"Ÿ‘¡\`’¹±¬4Äò½w^»ŠÂH#Š÷¢ë¹²Kƒ]~+s¢­¢Ì‚ PsªrþÈ %:y“+’äùS‰Œ7÷0ÎÑÊ"¤ÒV4íù2ɬ7œpBn#Cê•í_þî¥[œ³U,æXŒ'2¾|2œ @Cgq&ëA Le-†™<·Ïk *ñ‚!’¦LF0Ó11åùñ_^·jóÑ�ÿþ|‚Ȳ!8ØXKù¹ÇÏ2Y¿Å™:< )h'8Ý Ù,d²ä±€XˆKïPêÁ€n©ïN/v¨-RÅ„¶w19:< YØ@@6P!‹”•§T Ä¢€�8èJ« 怋ï(×Kv㋺>¿\4;‘öbЂ<_K:/É!ä# qÍ—#Fö>õÀÅ«—ÔNþäÀyâÑ’P¼wAøkl¼uÒfQ¯…<‘õ’-±Â¥­õåíÑ 3ÁÏœxÈÃ0#á5ôd„ƒ£`�²Y9éÚÝA¶²eÊʉS2Ð}Þ—Ë™ahêÕz¬¥¼­ËIÆ$//ˆú=™ƒ •ÒFhèðf*‹¢‘DNuKkN”J3Ƹe�Y Hi“¾.Êà´Ú©jÆœ¤ú–ÓmÚ”®¢>KõP�bwª£ðLgá�Ó¶´tœn/Ö0¢�ª1�òœÊZѤ?èO'³ÞÎd€rŽ xi~¬ª8|ï%¿>ÙÊxÆWL6† ÁÙz¤¹F’wÛ±ñ”wÚ°£‹?Ÿ8´wSA0ùùájÉÔ�‘"›¤YoŠz-»WaÔëáUÅá{.Ùxwm)È©4_ H¨¶˜¸Í�ÚŠhrŽCCD•ŒDFYYd[Ý€p[–y�ƒ‹ƒÕïR¦)Ï‘ÆòhÒ¯©¯Œíqž‘ÂÝ;R.¸ÙJeñÀ²Í£¦�:ö婊ÍÅ0}Ô±gï}¿$?~ÝÔ=ã5l;Ü/–ò�-?[Á…8„–Cò8@À¬�ïl½ýp¿›/®Ýq´JÀdŽúæÒ�"Ò5îñy²OyþòÁ´<üæMïÎ ¤io–3PÊÂøߛ}¯fÔƒ»Z€cœ=ö0"t%&ÑD�DKÛ�ôûÇêIý苆�h�„¾öì-OUèbå…±Å�.R\fBV€Aí³Çþlïà»foÛxpàéö" "›ãKf¯Þ=D?È [ÂùÔ.È;þÀ»›Ï›6êø—§*ê›KLÑ6U½nA­'ÏIµSw¥"Ó&šZÃÙ€‹üÞL"åsʉO®·ÈÊudá1]<¼®oq竾¡{8säÑÚãýü<ãñ1.à†:êWî–Ó—ÇBfQ2ádFL¹zÔyFšùÕ…Àx �P,¤*Ç�@ÄŒÍþ¼rú›ÆÝ<µö77¯<ÞRü½-lè(R²¥cq¹ܳNÒ¡Açc·_™[.žò¶uå ,oûñ =Žr�M ”`ØB 8g6yLWÙ¶™ØÈmf“GÖF@6g/¬»tã‘!:6gsh‹æ{½²Ü"ÀÜJ�JáDô‚©)žµ3Ž(ªk,¶ÉH4)&Aœ–Í-ôû,Ëk'He°8�ø,ý’"`À 1žövÄóÎ)îu2p (h!1€¦Ô·¢‡# Câ”åŒ#€ÍY–<ê4:¢,g¶�dÛ,k3ix8'›lÎ~öáœ5õç–!èñr""l‰æû¼$…òD?-tÎÌh©’ç¼”zÁ‡ÐÇpX�䢞²‰ÈÇìG毀§>¸DìYçl‰ •aDY x BY/3BG>†^¤Ö8ÄÂäñc6‹Y‹w¥<ñ¼êÒp­qDå§(:–ò¿ýÅè»'íxoïH"ƒãÀ¥SÈá;p•AB €8ØY„4BVƒrµ.öÑj&æ 6Ÿª(1 ›8 ŠwÛ%ÒÞº3å]ñ   ŒÐï£Þ'–ô"bYaœ^_7~åöá4´ªí¾ù›� àÕé·C6w¢¹ô©w.15G�€G_{ê+ž^2³öxŸ»foïJøÓ�ª}^;/�>ÕZ¬vEê_I¦­3á|Så˜ òTkñ“ï\" ‚Çâ£ú7S$KbQ(òg¯AËÞøû•g: ^¼oéc×­yìŸ o{W¨±£p@E{C¸À¶Q·¦›ÿ¨vøÕSöORÁ�úÅëÇ¥mf\H„sj�Æ4Fœ[gʈ¥^•F"{FN‰ChÕ¸æ²9¦m+èËèg5‡ SP¡ ‚`ê’ÑGÞ©óÒ'ˆ’ߘ]3㼺×>»€2ìL¸dÊ�#E¡d{4O?©ûDÀ0è³�0ÒÅ3êô;idQ„¦Î¼DÆ;¢oÓæºþ¢àˆ>Í©¬ÕÉ·ã–UŽÀè8zKgÁŸVN[¾}Ô¢‡ÍydÑF�ý"'ÕGʵ¾šRQémz†Ìh"æöº�mÇιdäá¾kçڋÁ`è¦p^"íÙï̦C…BÑ·9�µZ: Š*ZA‹‰�»j¡u€4w"†ã¡æhaUq[St"qµhƒ@D~ÅêL,ï›6�ô¿èµlP‘ˆey8Nh"+œ¥ýdîê“ù®Œ1¯—å½Àº’P¢BŸ%1h€KjûOx¨÷® »JÀË(`�1ÏKf½eEMµÛª»:€Î›Ô”ÊXgÂù½`´¯�QT³ ê 8Rodý”½w¼UÕ™>þ¼kïSo¿\Š‚€ˆ(`±a/±ŒNbKì[“Œ‰“L&e&=™$3£™£fÔ4{¯ˆ ˆ¢‚¨H/÷rû¹çÜSöz¬º÷98ßßþ$xî.«¼õyßõîµ±»�Û>ÜzàÄÝ/mš×?öAAA…+†ÃÞ¿&k“`PÚì>FD�)dw±q37I…dž�À¥Ç¬ÜW=àÞ;+QÐ=Øl«Kè#l3ñÖ4ØÁ’=‘`2¬5�ap8ê ÊŒÀšo²Ï¿;3xnõ�ufÈÿíÕ5Çë9Fò;‡Z÷Ó·c¨UFÂx‡äþZhDå«<û°Õ‡MÝ|ø¾›X6W¦tõfÃj©š0uLo5 z‡›†JÙ�ƒ­ûŒéÝ1ÔE¢®=;~ò¹îÑ29�87à£//NóeÇT¨s‹×M¿xþGNÿ¨& @K¾|àÄ]Ztô»[&H‡µ‰ƒzâx<ì+ØÀH~ç`ëdKC—5OÄŠ‰Ñ›Û€lÓI¥Ké©Ù’÷CϾ½edú^½SÇ÷]zò[OÝñÏ·}j¨˜øo/Ïýö…/ s�-›Y­Š'õŽm¾ÿ•CjQxøô­Ç ¾ýÑÞ¥Jê°é[óÙªZîQ8td4Ý?Ü40’ûé}§ÞúO_qò›w±|æô½z¯>í�EïNÛÑ׌ºÃ÷¶ äÒµé{í¶…Å#£Ùm½-{$¯…‘rzgËYG¬]ºvj!›MG[{ÛŒkÊÖ²©Z:UË¥+¥ŠZ‚×fcÃŽ®5›Ç_~ʹtmÙúɪ­­½m¿zþ„ŽáSýàÈ[¦MèûíÇ0°aGçË«§02š‰Ì>˜¾¡ŠT7;O6|ÿâ9ÕHøpǘw7�¿ü¤7réêò÷'›Æt»'ôÁO¯xæ{;sÁ[û'646Áe7êÔGåJtÁ‚‡�”±õÑ)�TÂ¾áæ‰c‰ÀÒx_‡^ܸ”a:`ïžÉ]¿zê„÷¶ŽSCy䵃uíc‡NܹºwÒ’õ³ÿáзÿéô¿?´ü¨Âhf|ëàH%ýîÖ}T`P,§z‡[Ž;pÍ;[¦ö„“Ç”·ö·)¤Dm¹r*”Í™Z&U­ÖÒ ôŽ4?ùά«æ¯ØÞßöÆæ‰s'ïøì1o<õÎ�[w¶¦ìžŽ,zÎ>më¤ÎÁ•÷.USó¦mͧ«}…¼ñ,:åoR³ïÙï?¾çÎ/ÝûÂêýøàî[¹Òãx#l¡-`ÞögüyѼ“g½ÿûkúß—�ØÜÛÙÑTlΖŸ\9«{¸åñ7¾æÄeÛzÛW|´ÏÜ©[¯=iù³+gu·ì?®^t›$Ǹ¢Ò} q*¹Çß:üË'?W(ç¬=¨Z¥ýÆõŒi*<¹jŽe Û-klÒˆF©šÞ=ÜròkÞÜsÿËëöÿÙ“gFµDâe{ .öŒ°;Ô sÂkˆÏ¿;ëüyo}çSÏýùÕ£†JÙ½Ûû åÌÊMûì.4=õö!W»l{û››ö™3yÛ•Ç-rå¬]Ã-™ rb”€ú OÌ·c‘ ÓÇöüþª{^^;ãgO�Á‘6rDNáP'DÎ ÂA]=“íýmw.:ÀÞ�NÅZó£©PæÓÕLªV®†1ìM^OÀC£Ùû_›÷�³ —rO¾=»V3&ôtµ ?¼bn5ò÷&NL6ôt½·mÂÅóWäRÕMñ/ºÏö‹æ¯xæ­ƒ¦�ë½âøå‹×ï·k°¥*ƒû—þ�³Ÿ+ŒæŸ|kvÕë«Ö$zq�Þ,• ž6¶ç÷WßóòÚ?{B»W€ÁÆt:þû£ñª*­ÌC£¹'Þ<øÛŸü{Ïp3€ÑJØ7œ?aæú'³¤ Ž\yÔ~›¯Ÿ¦ù�†€‰†JY5¯áÑœš×zºZ‡~}nU†62«‹utû�ëùÝÕ÷,Tó2xÆèo’æ¡Î™ø€ÃCf�Ïyå†O-éhzuÍÔËÿë’µ[u‰çï;±cp´¾ùáÞ Wí×;ìjÄð6v­.Lt Uúì¶È‚êÞƒôiÒÑ\œ:®ÿí�öV0Hyˆ}ºš²å÷·uÙÆgNê>rÆ–[Ÿ™_,§ˆô—ìˆuO&ýB&˜Ù=˜»â——¼·u ˜íj)Þó�¿ÂÛ�4fq̯՛öúÍ“Ç~ýœ…ïn¿xÍ”—º¶{Í5Z¡…O,›ý›Ï?òÐ’ƒw4kš™P‘AR]47a|!»|¶N@¸×¢ ·¢ìÓŸõ=•R9óþŽ®ƒöÙ• «zlJ:¶E$D|òÁîh^µqœ�þ»[&lïk=ùÐõ–ïûî¶½~ôȧ?{ü›/û“r×Pûÿ¾|Ò»[!™ TªdþøÊé×�ôüMßAB>¾ræ¿?|z(äÍ—>yÚ¬ŠˆðµÓÝxÚ+[Ú?w×§×w�¹mÑ‘#•ô×N_4©cpç`˽ËçÜýê¼j1•J×Ô[u&Ô®9õµézséê–Ýí·>wÌ «÷‡Æ�nÅ6-ÖNÛ?¦¥¸bÃd)3À ç�Ç2m±q„êòÆÝ�×ÜzÉ g.úîù :šJ}…üƒËyê­YÌôûæÊéo|òÅ}:v ´þeña¾zTÐ,\³lØíq7EÓ™”O¯>dx4wñK.9b oíï|ü�yf#o• ‹©–-ž-U3¿yùŒ/�´àöËî�\¸þà_¿xVÑnx¤n6ê3›¢rʘ�®–ÒòM{IÉ �Ú([ I†„dJ§Ñ®@¶1L†\õÑâþB瞺ä²#^ùòqoÍ–ú‹ùûÞ>tåæY##ô߻挤¿ÿ�/LéØ6ÐzÇây¿_xd$íÞDfõ‚\Á¬+#R+ä‘df”o•[ÅËÌ«ÕZ.›·ôòÖñæ�ÎÇVÍsËÞ É½%>q©šþŸEgÜp‚».¹=rÑûÿøÙ³7m 9b Rbºèè·&v üä§~ráSªí‡_?èº;ÎcD`¦TÐÑ¥EÊUø2@Ô”b–ؼQÄ("¦Q•ª�x¿§ã_¿ä³G¼òí3_lË•úйWÍ~zí�ž|‚ Öïw引-™Š•–z\m=EÂe$NNîÓT\±u¢Tæ$#¢ CTA£ŒŠ[ër5 ¬Sµd·0g¿íþðnÛ× +§ßp˹�í…o}æå§Wìÿì¢}j¢üôÒýg�Ýò…ãlè³{¤ýïï:4š»ôð%—Î[BÄ[:gž*æ_³sïï=uÁ5G/úõ�Ü9Ô~û«'½ƒI’9bdã¨�Á’eR€4±³¿³¹øV÷$4G‚�*!"®’Úü>fü6ŸÜqê¬õ?¿ðÑÖ\Iÿåú;‡Gsÿþà'Ÿ]5À;[öúÚ=|éÔEw^û'Èíí¿~îÄ•›ö‘Lw,œ?RNßxæ‹;v´Þ»tÞŸ_=2Š÷¹–XIŒÎXn1’7ÓIc:[Š+7M–‘—1±ÆÄ °Í: ™+uøÌè7Ï�¤Š yã�Áböê—^}¼×—ý€ÝqéÕ–†¯Í‹L> ÎŸyCµ²±qö\[=ÓõL�™óë-Áv¢ ·Å²®Ïá$«VÔÞû`ÔɳŠo@0›½›z-¬ž"Z¹G\†Ý ~T�ËTnûʃk6�ÿÙ§p¢[h1 xÚ®9ÛOû#tn-q³NÖ�½+á€á„…ö�Ð×�÷þàog¼´jþ“Ðû IDAT�˜å“zΘûþNZùáÞÅJêºÓ—÷¢ç…H2BíÒýŸŸlªæì,„’í¯�·è“‡¯¹ð—uª½è¥?_%¨-¹Ê�_½o[oÛ¯ÏRçwö7¯Þ4a\[ỿÐÞTìh.Oîê¿æ×ŸyãÉV*oüä+çÍ_}éM—mÛÝÆàÖ|ùWŸ{lêøþ+n¾xëî6!pÓ5Otµ¾ðÛÏ+¡E¨º_ÂYóÞûÑ¥ÏYœ=m|ÿ»[rå¯�³ðÏ/Í»å™c¼Ô€¶?>ûÉ¢“…Ã0m’†Ì Úw|ÿÝ_¹çû÷œñÒêýâr@V¬d&B[û—®òÃ]�û”+ˆV�Ÿ~èû?¸äÙk{ñ{®$=±œ‡Øy'÷Z®š˜ó-QKgFÑ«5`/=FBp[;É›vV‡k£¦ØÍÕ%ìri­ª‡²âëƒã’ãÓ�½6¤K.Ç&æøOg.>çˆÕ—ÿú²]ƒÍ�ï©ód ¼e½¡­¹“²†MRkJ6uP*¤8£ÍƒÆÅº·q4»¥ ÌôU[¨jö¶ª_Ñ©¾ï*ÀàtHmÞZ¨îP«û,ÉBƒtõµñ2óWOyí¼¹ï}æçîjA'²"�*™%ÒØæ”z95„þ@$ P›‘0CˆJÄCUô� o„F‹¦ôBå†Ý_úM4bba�œtúÍ0]. 0C22"Õ"Û›dG&%TQ³­1à•G!.öVöŒÖ0¡3M)pw‰6ocY–¸â¸7¯:þõKn¹|÷p“°+IÆÓÖ"H )YJ†� 2ç²í�ѸfS1b¸’ ÐÊÝ%ZõƒÔ'~8H!Ì"�a˜Ò…PPqˆ‹Õh8U±XAeñ½¿ÚPG®ô§K|xÕì;_Ÿ k7öœØVÇ—ŽYzÎì÷®øÛ…» MÞ͆€’ƒ*Q (›À†H¿¨JÝÒÛ}H!"PD GPÚÕ{eäHÅ.dwô·JþSöPèÖÂ^9dcOçòõ“}÷òo¾?iöÔ[vwüÏcǽ¹a’¿£É›NŒXìè×’T­«6îõÐ’C¶õ¶« vgËh%�îå`ƒÙЇ0êj¾éÚ'ò™êÛǼ²f_§Ãd‚0�<Üj OZƒÍiOb‰7ó£¾B~冽ü‰3{_qö7¡=žI¬æ«ýbä´뫤*€¥ë&oéé8ç¨Õë¶Ÿlß­ëþyå¡5§‰ÒešR¤ËeýN,Ú™ a¤ÈÅZÍ^5g¬½µú€ú:¶«‹#È �mGSoÜŠƒ"–Žªö(Dí³ã™•vµÄnHº(O�ßý× /¾ßÀ08$¥"F,h AÇ¿ SBDštæû Ö¨% ›°4¯•Ú¥�S”Lx ¢LÈ’±{DªDƒ0Š–>H…µƒ'îzò�éÝÃÍ �‚*‚ !0ƒ‰µç‚�� �)ƒH’Y£"Qªa¤Lƒ%.”P«KceÕD�!R'5!Æ9ê=ÙlV¦Ô‹& R2(hù¦ZgVäSi“Ó�Õ©êž4\>ŘD˜·‹™©€ÚS‚w±y H –,„ûR&Ù§¶”`Vï>‚™!"P•Ã0ßuå½²lfƵ ÿïÅœÐ:P/™ÛúÛÎùÝÕÛŠ­Ì$Âr•`4•P’Ùâžã3K^Ʋyrê¿ïá¿âiêHò ñÝÏ®�Ñ=ÒÃå¦M( € S1Ê4ªöô`%ƒDĤ#A’`!Á`Hfb"’vMFI ñÉ$£Z0Z‹*T*fG‡ƒ0/29ΦGzÖn�µõP2jOËt‡^€Þ–�DJÔf�ïþûº»ŠMŒÐË›‚ ˆ �1³Ð[¯ÄÞ:4ö8æöÎŒ›¼�Ýr܇Ñ`y  ‘8“0 ¤½v*ˆfí½ã¹Õ3{†[œ5ô€§÷ˆ•z§c¦609g‘Í Ìÿ]yw‘<,Ñà0–,ÞIbb üƒ£§oè+æßÞ¼wã6ãœNÆaÉ;=xHþ?L@(j3'îX°úÀݽ7ˆ—¯Ôs³'ýHU)šn�mUÀ×øA}Ÿ�@¬ö™ÖÍ`ÜJtì†:&Æ�ñž£� ¢™w<·jæîBd[;矡cæüjK°�Ô‡\];ˆÿéÙ‡™u7+Ûª©3GöÇíaV/g¬-˜MÉ™:�XheÓG¦â|¦vÛ ¬Ù<þgœ Ž/ 7 O‚ û¡½AcT²ÖÖØ\ ä⋃uT�lÉVöÛk÷ϯzæo/Ͻó·³6èÚÁ'`´ÿ#ñÛ=]7Gƒ(awþÏc7øÉ˸øÕ‘ÌD‰ }Š8 Y•šý¸¡ZL†ÌJGRô¨%쪈QK¶ºß^=¿¸òé¿.<ìÎ÷ýØÉûý�˜á�››¶6±­Gôãñ|9ÌŸ±éÇ—>û/w}J}z=Þ~œ�î„Y¢–t­u¯ŒÚhÄ ¼~^›c& µ B`{·ì…sÛ~•éõ'0X+¦Ì ÊGa¹ŸÝÚ‘¤ÕØY¼X7»äQÏKÕˆáh½\:åó&3‡=öFiζ “1zØF=Úš÷ ÜÇÉS8’Ú(С‘³Aí9ôŽÖ>Ú]3�èÖBÕTeÉú3ëR7 ?I#D(Hm›R“ÓŽÍÙTFjE©‚j„r�¢W#HIRªMšm ÄF‡u÷D±�9;MV¶Ùø)f°$2AªµÖ‘G{:%@‘úì9;ªjsìòYˆçç –’H¿³B¶§Eа«È›·kºhA¸lþ?¿ø©‘rfËî¶+o½´{¨•™™)’,%" æ$� ¤:³{wr6¥?3psšè*W?X§Ô€A B¸m¸]4aïvÑœ££²Ô¢ÞT… ësÓJ@Æ6�ÜuÉCÓ:ûséÚ�þ~Ê�+æÚ?^úk߱·,âÝÏ,ªL#L%Ò2¨ H¿â ‘4åïj/n…ÈÁÊ3HR-R Ȉ0ÍÍÜÔÂÍi!Ùçš Òf›Ô”â¦ÞbW„0 ¹ÌV°ŒŠ88iäB@}ÆT˜µ ‚¬ ªWí„É_†­O?ûïcÓk±R´:so–AD’¥[#óµÃÒ… ï}�å,%¹éû(Ò4d!8�í0¼´êfì ÈžÏáÆ¦š`ƒ:‚@6§+ÓÆ÷üèü'ï_6ïϯi›É§k óÙñÖêÿ2�²“6=†fñÈ¿Ýç 'ü.GI9#ì­(¾'Š‘7>¸8å“Î+‘sÛƒdýŸ�É4Ø(ÿ ¢°Ž�E©®ïgpÕ)¸vÎðèæÅ”‰²s'ï&³µ¢é]峯¡Á’c[ ïG’BîA&?Å£•ˬœ(È}E¡(©�–¢Ý%ÕNG]b01«­ßu6‰%R"lM¹jW6L3˜°§A.Aâëž~‰Öš -v)‘ ¸=%Bð޶n³á½Ñ¥GWòÒšýÁIÑ[hK–$,!#bHPTÁ5ÑÜÔÙª@v̾ Kbs_Çky¤O@èg @‚"ƒÖTÄ„H¥$GA. ‹AmOkôjt½¥¦kï;?HF³léÉÎR4ôÕ~¶Û“oåP´…°Õ*J죡Cˆ6¦QI#àQI‚P»8‚˜IÉj D‚Í$YØ’ tÂÀrQ‰Šµ}Âü¶€s) é™ åɈ-@Б¸9™kZî�0þ×h�d)A`I€ ! D2Xƒ#BMp•ùÖª�3Ð@bäµ79ÃÏõyw<Ò‹9†dʘ¼!íÙvsb:uƒI,Î6j#&¥uræ?•¸TOòï±>”4œÔaJ2ËIlò-P¾F,“|-vvÝZ*:Ćïì„�^ÌŒP4"O <4hËú §<ꢀôÈBñpÈR,ƦD\hŸÍ2‹&¤¡p’S%6´L‚aÈQD…r¤zПÑÒ·Û*mC^-  B¥D¬÷¼·Ž9ÃM9_zb7®v‡7yªûaŒ”olËf(ªÆ3¡‹1b­Ž³îs¤í·<6ÆÅ7TVkT †Ðh›]8El¶ŠcAj¯;]¶ÍdI‚Â;‡#HbÁ&?£ù'õyf¼l覾ãL‚P8„Á I­A†°»BíæšêAž‡HÄ�P¯IHSp®8Ldy'tܩז4ñXÚ ;@ÔŒt®Öž�ZÓéÀ)GÒ˜o�/¢ÄRD1{˜¨%$€7õa÷.et’_¨ÏSØä¶^QÐ<’ÐÑE„*¸Ì©L¾�Æ6‡6�3ö•‰¨)àšÄÖ­p‰3MãÇ¥C0#b„ d‚E‹ ƒZLêØÿAu¡‘=1 ÄÆc{ηÎÁ7^!Ów›L’…Y¦ˆ:ZYŒ‚†£ZXH–pVˆ5´\J�€´BGTîH‰.Œâ,^|½ $ˆ™ƒx®Ïxr»o¦d½ C�^øOK€EˆˆH”Ò*%ÔL=7b ;ÖPÝù$ž6šÀdòØêI®»r¬ÑÀ„,þiÏŸfZ}{gmž}ÖwR¢¬ÛjèÍ).UÉ£Þ}ÇÚmèîý欇“ ò×Û­µµ8ÙŸ|¼p—õ6”ÖÎǬÐ�Ý(ãdo‹Oƒãl×®Âú.û_]‰4³áBC8à?뎺DudsBˆ N°·…u%{0½×�м«ºíX•™—³[8¬á¡ =7‘¼ âÃÐ’›œ)ü§•8×Ó�ý¦ºKõÖM\÷àínÇܺ?ØõÇÊž¾x‚J&[æuhf¤–óŒÓŒßÕ@l|ç·‡yÙ‰“?ˆ=SÀ6¥ÕÝÔo»eº˜ ‰W§%¢@2ÄÑièàÜ»ñ¹¥U»þÁ¶7~ÎHź1Ëžsæ˜ìºorÖ1Þx,ògÇÖ9Å{ö++Üy+Þ‘»–�L7®G¬Û+ÑH§I.Žp1ª)Ë…ÏÔ3V[4!ÆÒÃbª•‚:Ó¯ë"u›íVtô¯zâ«&« –lÌ ·/"u¼!ÆÏ�Ò _Àc;\›Gãå¥pM"”’Úl«²éª²C§RÀÐÌŽà`�}ÎÁº‚ò]©Cߊ™�™Ñ_”F”cë�eTi•M¸ê�+ R»¥AJjm¦¦@ŒDØ:Ĉ"gø<ç¤wY‚… `@(v©{„WÛÇŽú&1¤šÑr–§T¾Ö’‰Úsé´4Nw`‚=/H–‡^™©ÕLXåWç[BÎÌŒM½èëV‹3IG@ faÓPÌ’!#0‘”`–,%«-6Pa!RíÙ±­,ìÞ¢†$ 4…œ"lî£B¿=’`•¼7“ ™  É Ô–¥™Ã‚¬ÕÜ:‡Ojg-}S -PC'É ~%NÅ›Šykß?™ïs‚¢&PžD…1$QW ‹Èê½Ô™Tã2„êÓR ¤£áRMÔDd÷/pùX3.3+õæ@�ÐVW-�|12ĵßMÉå‘y‰“8$“AD3×W�Zk Ѽ (c×½÷”â9OâÍ@5à%á}†jY·Á¦Á›—yJ“ÔÒ¿�ótã§:ê5>Œ97ÿIºûºÛý¹{twÄZ}ÊßtïËÿiŒ´ñ^òB5È] BÖfkN„ïð-&v Ùtãâv6„vcöhîßؾ`éU»“T‹Ý� ²ïƒàyó¸Äè¤$$Ô±Ûž»µLµeÞyÝ8·#´³ù¸HÒ#ÖœÖñÖm™ŽMsúëÑ …ÓrÔ¬¾Yò%Ìž°Ûé| 3¬Ú UÚh¡¶“4“š³SЈ/Æ|cn4Œ†“_ ¸í]>&Ñ­(ak¸{kŽ'fjÿ´£©?üójýQ£¿½ÁK{Õ‹´/†ì8A°ùã‰`d€àõïP³ß›á¾?9}»ôº³cSè0á̰ٷnÚ�Ù©7ð§.ÕêÆDÆYzù~E ©éŒðÐ ` HYf"N¥ÁLÃÅZ$uE¯3…8EÕçøD•‚›£ðøs!Î7³0êè`DШ]\WS·6�ÈBfÿðäÎz(6+ŽþbH,¥ç+1Ž7i40rF…í>îSo‡ÁùK“°Tè�ÕN|Êö‡M`†ðÜ�¥ùV*€œP¨ÊJ6u['’ ûâc¢$!ˆ@$»D€Îœ„Á*ˆH$©o²;'DHB2Bÿ é½ÊPßñVt$WêaKeˆ€,…ÍQK.jK‡Ù ¥2ͤ_¤´1eÂûœ5B¥8Ȱá7³lM‹¦U‰�ÝèU’F’IakÀl’¨óû ³»H©ÍN$DDTc.3IÑÚÑÕ&sA&Ð&"$äT$mÞÄd¿±Iz¿–‚!f "pÄÈ p!^»Lïe_j -5ü’:idvQÚÉZx­=±e/Zvªï™dØóÖ#0[ZÂ+\a ÊuT E4ÀÙåS2‰-•‹$Ú²®��*BRÍl�ntËŒ��³• ’ f„Âw¢Öæ�z—Ä·ižZ’!ÇP&T‘’ç錀E¬b+"$(%)@B ®ªÄ5Ï'Æ\›íÀùìáðÒz®)f³ð “ 3ªf˜d‰Å¤Â×D·ã|+éÆèÑ.æW½ßuÉïYoÚöûŽÕQăR Üp½§çX1w]‡±®��öšRfÂe´Ys ‹a'c­¿Ó醘uU\Ñêã‚çpâ¹Î9l7HöÙOhÌ ë¨lˆi×?ÜÕ®ŠeM½[@HžÅ�CR<ì�964ç1Ï÷Yz�?+¶Çº|'Ã�TòŸ”<_ŒÈ»Ù]7,õ|«·8nã:ía‚ÞÀcŒ6 xúAö*»9Âý¨‹&Ýò+ë˜Þ!�Ä ÈQ%64ŸiuÊ™�»ÂBõ7׫•7¶'mf¤úd´ÎÉ.`»mŸ.d"{‡ ܺ|Àmx›%š¶”aò¦s`¶iKŸ:C”œ‘÷ÃÈfâ·Å D ¨eDЈ¦¾–D�jß#lãˆ� aÈÕ �T$ ™–}á3§\ÈF:QSö”oVüQ™Q#Ø™ î´\t Ö¯#;ÎÄœqL°Ø¥¸üü¡�­ê‹R|åv­à*S“”ºIOEâ†Ë›�‘: Yí l«o©j Š÷Ó.  ŒFfŒ…Ù(9”ÉW‘“‚fj+lÅ%àH´6S>‰Ñ*Bb©8X Ò•EÐcR|W‰KAêåY%nÝÎÌëª'á [¢¦LÔž ra†Y¡y�?0åÚ&]¢V6Øíccøì…·™&Ü–¦\€R í@iX½&i`M‚XJ+RƒlâCF`FTAU Œ¦1mQk:Åø¯”Žói„D›ºQ†ŠZ¤#8J Áé”j&€%� Q«@AA…dÄ0>Ä$JLj€¬¶YÛ¡Ç£]?lþ^��^Ñ0"¬Å‡¼u;+Q¾"#¥0¬àè d;Ľ@٤ؘA��!Y­¡h3¢:­R-…TÄšûezêÿ$ÈhuHvà "–ÖŠ±Æ—zš6BÓúçGñ.µéÖ•`$ ) JЄ‘�”!d@ ®A–¨Ï4Æ}«&õžspŽèšØ*˜±Mpÿ¥!ßsÛHÒ¤çlÌlÁ…ޝd"cë�¬ô°Eæj?îÆk˜ŸhÒ3¬ž©Þ’Yê8IâèÜáVëP•áñšcSƒfK‚m»8�ÇЯWÆ;üøD· ²ÚK1@h±µ²Ýï}Q¬Ÿ³G™zúÇR?‘탶qß"Ø¡ÇDÁ:Éø q•pƒ°Ô7ÆŽ>žk³¨ÚOT's@Æ¡´±K@s/ÂóP»öT¨N}A²¿ý«TwÆ'…8|‚%Iëõê<„s‚ð »ìÈÍì“&BÓMìI=mG&Ñ�eæ_áMÊïeO– Éã(Û&¨˜½y½¥z_•l°h3`äÌ1~ÊÊ(YLØóóneÅRÏÓ!øzèæ°G~ÅGj“�1Âúë&¡åL@<²#"cãõÅ,dº)ðÊYÜøÏ,©atU’é„ÈŸ©Iù#gµ´R$H‘�$ù\7Tõæ™8œ:*ڻ͆4Ad«³Ê½Õe!ŒDÇW&àùk_ê”DÒù7»üá›m ¼¡Û¬ ël¯â¬cÝ»náÛ+ã¡™‘ `°Äúo­˜ä«ƒóW6,º4› °ä0 |:` *!%„zk ,#ãWÔˆ´|¹E$H‹Kûùj†ƒv$ô¾"ÈR˜�š²Q{:Ìè~»aR{F¬7­°h¿ì©'`°8BAm)ά࣭¨– Q¤b C¼ˆ™’RŸ”$E’LdËgÛÚÚ¹3Ÿò¸à€n* \€‘*¶o�ÔK–B¿º@C�0¤0ÐŽŒ BÔjL€dt Sˆ£Ê IDAT« H†dŽ˜%³dޤ'äÖB3¼´';yBB2cEYV’°ðz céšümúà€¢v–­ö1z ‘®t%(‰f]þ®SÚ¬ÀG R½h˜Ð\§,æ�* Ç]XIº=ryxN Ù_ñÍ�lØ[횎G#Õq¤>Èè¶ �T„,ˆu’5òé­WSöàÉùYs[xTö–쪢Ï·PïT�ÁÎ%,”ÿ¼[ਿÇ;œðhR'Ìøžœu½GsÃŒû>c«’íÄØòÔ\_&ÿÝ•„Qú­ýƒ—Ðð]^2ÙïL==uWZT +<ŒGØöå'³IQôÜzŒ.‰�bœjŽ1õt‚çK»ú*ï%â,F£ß{Xª$‘žÉ_úí9ç»=ÿÏ8R'c¹©ám¥ùgq…˜×¬—cõü½÷t½˜ûMYf%d±1µbî'y�/c^K±Ö-ñ;Ši&¹iÅêÂm:ÔÏ^ÇkK¸î_ÄÅaÏŠ?hdÁA3•©63 =d—ç®�¯âKš#Ö˜Ûáë3ª]½6ïI¸eZÒ~ÙçÙàxxÆç»ä-þƬOÌø&ÉÅFÝ�‘pƒÑö!�Jq:0TzOù8'¼ªf_§Ò�FF¥õ‚äÉu¼cGÄP­DqväÍ—‹úØÃ㎯>qÁ`Øì›•iß‚[ŽZÿ¡i3«fèÆ ª>|séü iêEÁ¢ˆS!™i6ñF L5…¯\Žb*ƒË̱Ԯgôˆ(Õd¥f¦i< Ó¢sg>ÝDgÊGÍy!ˆ¤úò(�!¨2CBï“M¦1=j•¿À¬vÔi˜½’˜9(Oa¦šÏ¢-dƒ ¾Ö£uÞ– #=¬ùç¤Ú¨;ÆdZÓ=#róâŠÊÝ‘PµäŒÀÐ$E5bÁ’ÁIæ¨ÆZ8RilF…2ù|Gzl‹P« Æ1¨úx� –ˆø£m¨�ª X@ˆ‚€ …ÐTLHVFƒÕÎjí<”H×D%Å‚X�0¯11@ m38’,ÁzÛsûfwÌÂxÙD~‰?<ïÌF”¼,�ùÇ£½ÉTpÒ*Pµ‹E‹^¦AâH›_A�V!¡#�š”9µp sµh ÿ…~‚dQ EÄú\Õ³ð•Åxu“K¶’i”M’ø €“JgÓ¨~¿€¥ ""!@‚ˆ )¤A ®UW‰8îPöèœ €ð¯;Wï(¬t 9.ÿFßÅÄU’í~Òþ³ŠÖ£‰C%ãîìú,ýÛ¦€È™Qª“§]Þí=J!ØiÙ3İS$ 'Éc`2Ú0OÙ´±I�Ĭs (Ÿ¦¾Ñh¸Ä†�>Š× › ¹ qˆ„ˆ  é�Úó…„0XÔa@2ÁVŸ¨¬�Áx‚Xˆ€A0H¨³C‚ÔŸ„P Oé–Z[sÔÕ”jK)!ìLŒ´ÆÞäŽå|“CddLUfØpž˜¹)@k°mˆ·íQUã%0¤ôµ� ?¦Ž Ɉ"èà€ªLUP�h”R¹t[Ë^íH‡û.Ùp.DKH½#Øô�ã(«7,‚! læöV½s"€”ÚN‘¹ZV,c& ™ \“šiNÚQ H‘ D*Ò¡HA(„ !„*|²ÉmC«ÓžIpb˜eÕØúªh4Ó·/Nz ÄÍàV�d*“ÔYdÄÚÚ Ne2ÈÃ|ÙÞ7W1 @6€þ*%œ ‘Ö,؆ŒQÕî^Ÿrá²›É!Qì¨s³ÚŠÆ¼PC @)¦¬¤º€ÉY‘Ç'µqã¾ ñXçH꼇~ÎØ´¹¬ñFnB¼ØÔbŽÈS¯ÆÓ¯;ܪHƒ"‡==ýÿzÞsL–Ël‰CNœÉ£§o€ã‹Í&ýÇÆ`ø˜Hlì‰Y.y&ÈO1Ï£$Ë$Aâ�5žä�15º7ùH~øp³~löa–G¿sñ ³&í¼ñçüÏ[³uÂOï=…ãZGîýÎ_›3£WÞ|ñÚ-ãøÔQkþùüEýìòî�æºm]©ã�¦;�RrÛþÉî è’WþÇgŸ ¹¥§í‚Ÿ~v—þè· ™lLÆÞ¿Úžz® Ž†þŸ¦¸g|ûðõg-=sÞºqí#ý…ì’÷öýùý'UkÁ}ßþksfôÊ_^²vË8€Ï9jÍ?Ÿ·è¢_\±«¿y\ûð}ßüë~{õJI?øÛéw=?Ïò†ˆ¿ù™—�ºý+8÷æÏ=ñþ¶®ßû Ö…> utŸµ?Jg ¾õ™ÝwûWnÕ þèÞÓ˜qÖákoùÒ£¡ð?Î…(_½ýS�½6V “ÑZL´|?J„ï^üüu§-óEhÁ[ûñwŸ.W“«,È&8†&†àEŠ„o}úÅ9ûî¸áçÞ|Ýãlïúѽ§Û²N²¹™zDÓÐÄ㬂wßüôKs¦n¿áçÞ|ÝlïúÑ}§IðYóÖýî‹�4 Ôç<º|¶É§)Ráµ�°�×ÅWvFþ"’ߺàÅ9S·ßpÛ¹7_÷ÄÛº~xÿévÎ6*ïɂÜ~Ò¼‹DD¸îäîµí'�^ðísÝÔ=ö�¯žADÿxèÒ3YqÍ/Þ9جh1¶¥pçµ÷=¾röÎw¾‚ óÓF k¥ÀhK\;ŒF$c oºÅÑԦá|½Ð*Õ$۲Ʌ’í*F@"·Ï{~Îämÿô¿çÿòªÇÞß1ö‡�ÎfÉüàÉ;yåc?|ðôÅë¦ùf̷ž]S.À·q¤ð' ®J¤¡ ÕFÖæy/ õ`µWii7±2M¦†1WêhFLaÀD•ÄêMÄPïù�Tå±Ê/{b£8m¼�™%55«�¯£")""Ô"„³ Hêo±Þ'[j¡!ˆˆ4—êÅ= pZfÂjs–ZR©”ÐNf8äö­Žqß_ °ùs§•äÒ–únM#/1}Ћ¾6Pš¤dBM“A)™X­"°”I•êfˆ¡Æ¨©d6…�hméjçl*ŒØã¾q|DhQ“¼q3©7S™|Ç ‚ÔæÀVòÌÅ'#e A²¨BJi�3;�ÑP%9Q 0#è"Smb¾ľefçÇ,]¡kL`ã {|°‹p^üætA5Jàr‰N½ÌÖ_�d@×lƒˆQÓ›Ñ`ª·•Ý Û£^] Œ©ôÄ&NÖNÅÜ[$+ØpÆÈ(xXÅâÞÌØ¹Ù?É@d,t%· 0¢��ab⪰¯NºAÃ9f»a+£Œyñ$Ý_•ì·TÈpÖ²�LÌ*yþ^³;XÈ%f—ãµFfðî–F‹�1ÚrÝeC:K3#3æ~ß6YŽÃ—FóÑ�(Ú°j›YãÝ3”/Žfu†W±…!¯ñúiú½X.Ò^�ƒ·}å¡0�ÿùàÉî3¦¥8±kp°˜Í§«åj�K‹óŽ^ýó­'1 É  { ù¾혖Òm7<˜˜<3 r…ÑìÈhz¸˜ÉÆ„">¸Änñ½Û@!_(e ñ½»ïÿ~ 9sR÷¿]ôÂ>tò;'€ÅöþÖØŒ+™•QÏ©€Á¼rÃÄïÿõ´R%¥n(Œf}�íç‘å”cc·¦3.¦Xˆ1PÈ—2…ÑL¡”(d¥³S1æšL§1à:QËÓéİd rÃ¥L¡œ)”Ò#É Ð¢5ûžþ½ÏÉY“výÛ…/üâáSVmšÀ,¶÷µ¸ar\e|]ÓþÛ~*Œ—|ß#ã™B9S(¦ ¿…É¿Ù;B÷çG²•Z0XÈöç|¢?½âÀÞpïÂ9íê€@¦Œí¿ñüÅÇÎü¨³µÔ=ÐôÀâCo}j~©?{ÃWÏ}µw(ìì��.=(Ñ'�zoÁÊÿv÷™#£© à³_{Ý™ËgLìÉ<´ä�ß=9¸˜1Êà DR •Ò…Rš œºäÄ·T’Û²ðÏýóûOUO¥Ãè¼|áñoç2Õ—ßÙï§÷�º½·ÕQ nîD|Ù)+[rå«n¾hã®O½)Ÿ®xjÅ�'¼áž…s7v·ÇˆŒVÂb9I4µû ù¡b¦R ‹Ù¾á\âÁ:â[EªGÅúRÿpÎ4˜ë+äÕµB)³¾”Д­V£`SwǺ­c0¨%Wþý—>aöGîXpDïPóug,kÎVþã¾SW|8ñÖ/?üÍ;Ïzõ½©ª�cÜtÓµO~ñwç½½q"¥JøþŽ®‘ÑŒ?ÄÖÜèo¿øÈH)óõÿýT±œÊ¦«¿¸ê©qm…/þîü�‘\ðÙóÞûÜ™ËgìÝ=TÌ<´ä�[ž:f¸¤[˜³ï¶/�½ô¨[𲕠»:ÿë¡“ž{kuIáìJ-ÉõrÞÜõË7ºž[«µ%�çÔ}àôÛ5¡˜5¡Ò5g«Õ(ØÜÓ¾vÛ8ÕÆASvþáK}óî\üÞÕü1l¼ùš'®ÿýùë·�»ý†ßùh¾ãúŽœ±à'W̼ùÑŠ9��gÏ[ûù3–ÍØ»{¨˜}pé!·<­¦LJ†‹™rU #ã²ÞùÂnSôÇ2/Hd„öó4 ¡`•ò…ÑL%…ÑÜP9„¨V胾öõ»Æ;ã£×î§²žÇì¿aÓîÎ{:‰yÆìµW·|ú¸žáRæ±·¾}Ñüár&ÃÕ?~õ¾gnpÇ‹Gõ6]wú²æLù§~â®—�H‰è’ãߺêäeSÇËé•÷þÑý§°s¬ |ýS/þÓ™¯†�”’~ôÐi·/˜oFÏÙtõ³'¾~éñ+'vmíkûÛ¢Ãî^tx¹æÓÕÛ¿xÿò÷§LÛwì£K×OýѧmêíPìÉ•2åZ0XÊõ�äý˜YJ<þúì ŽZuì=½r¦ÓC9‡�û Ĭt%‚þÔ�5ŠÖ]«HÆ,Sç¢Xd¥Î Z¬gpo;Øü Èxç0 Ñ𔑑MÛa  ³N>[CJD¤^3#MÍ"P_]'€0q[–ŠUªV9›FŠÀ IÉL )lÌ BaAˆ˜ÊRF…)Ù™ šÂTJô~–¶È‡]%.[õ�ƒorù†dl¿Ú£©ÊÌÈhK! êå ÛQ%³o 5¤Ô¾V¤G �ˆ(b)Õ“jD5I¢j˜fdÇv´G�¹TdRÿÒ QŪT@ù€K5lÙ¬,üjZBB C„(D6e#-rj'Gèšu¤X€Ýj˜Û3 z+zHÉDÄÒ%¢T!Š-h (—€Hç¹%«M r5ËÁlܶiד�hëž­ä6HˆÈ,ɽ *Lýàa=½=9«Û»œÙW�u‹,@`UñãËHª: »žÍÐ!¦‰¸ ¦ªÌ®&A6<%7l³A Ýk˜á=ǦŽ˜#HRnµ5}Š)-Á„ˆP\IƒLSTí5­à~Þ֌ʼnÍyÄÍ¿Ÿ�3 ±™º›ü(/Nw9 b¢ÉoÃÁIP²»Ó©ø0õ .º3aI¨�Gwk͋͘€lFcL°Þ€D¬_âwÓu˜Ø±¶Ãn}Ô§‰'îìx/€¡ä#9½[uTHBªaSúB½T6SfõƒŒ�Ý©PJ¦5›'lìî´7…¯ß2n☡OùÞoŸ<Æïed4½t͔۞>²g ù }w~ÿ²ÃÙ;A {~±ää§–ÏüÏëžzà•C®ºé¢ÿºîÉ&õ¬ü`ï æ¯úçóýæ±ã^|{ú¤®Á\ñ\6Uý齟¨EIó“Ö÷.šsÿâCÕg¾ö[¾¸hõ4[Ëzæ¼u÷¿rÈ9?¾jÊØ�ÿ¸êéÏ]ô�»ÎªE' £RK®<ÿÀÍ WMÛÔÓQ9¼~˸Ic†>yÔšß>qlÕœØ%®lînoÊ”%Ó{[ÆmêéŒ_�#ˆNIã Ê~mêikÊNP nÔA5b¥¶c…R抛.ɦ«?»ò™ æ¯^¶~òù?ýl©’ªTÅH9³zãø³ŽX»tÝd)'ôц]cÖokû¬¯ *erïi·ßðÀe'¾ùÇç�¼ø¸·çNÛvý- Œä\pô;_;oѯŸ8î…·÷ß§kà—=—MÕ~|ß©‘LÜuËY³eÂõ·œß;Ü4cR÷¦î;ÖM=mùì)±f˸�Ý�¾àûÔ0ùl‹Iuñ®G]�³¹»­)3AJR ©æØ”¬]b¬ß>võ¦ñgÍ{oéº}¢ÈQãýcó¥Ç¿õ�»Îþâ­çO3ô«Ï?ö¯,üþ_O¯JqÁÑ«¾~îÂ_?yü ïì?iÌÀ/û{6UýÉŸ¨E€âC cŒoèꬄ™2QŽ6 ‹�™¶÷·çÒ$‹ »Æï*Œ!B¥ÌãÁ¢uÓ/<âÍ1ùâî‘æÖ\éð©Ûž}çÀR5 àœCWÝð‰Wn}ùØ—×MŸÔ1ø�|.›ªýÇc§²WüêÒlºö³KŸºà¨U¯½?ù¼Ÿ_Uª¦*Õ€�¹Ó¶å¬W~û̱ϯÚ?Ÿ®í;®¯{°E!Ìÿ~ì”›ŸØÎ¿º¦( ÍŠj%ïÜüäú½Ö®ßÀMOÝÑI*á©fèUëv¿øøU.î¿ÿ…Î}çmïi›zdÝDè®Í¼ë k¯{ü°kŸ8œÛÇ»~úà.9ñÁÞôØqô4ÓÈfò¬‘«oüæÄW·ÏuØR‘°e°{ãŽ^"¼°e— Å(Šdh¢fÆŽ˜ z&ÞvÔ3?¾û˜ÛÖÐmk»ï2ü¾7®¾êþå&ö¿ú•Å·­9 Ðɶ‘®{ŸÙç”Ã^èl«M$=ôÂ^½°'ˆ~rÏÑd�³'×Lž=ýÚ®o\¶®³R�ª12Am—(Û|ÇDó‚+Ê¢dh–�„¥2Áœ2c¡²Ë_µb&pÅÂK÷�K\ß¼bŽJŸ®s€T¤u$ˆâ�Äò‚Àr4µ·©Š"Àm£ "´%jªà®* (ÖHë"Ï k".Ò4É”®QžYRtdTK“J’¥Æ� >“} ˜ @3ù*n&T¬:‹ºItÊÑ–¤ÅÙ�5#Uè® ªh:Ǻík“¤iÏE1‹2M*6ÖbƒsʵĉIƒr†Õ�(O*Lm»TÛh~—"R…f›Ø ì’Jj)UMb`‹Í#1§¸3CÙe‹œ’JA%PÕ½e°;Œ?z·@_÷ÄÞsÇÃÏí~Õ=ËÝXž€6Í›œ®Ó02^M�$º5½Zú©IÀsµ˜ë‘çwo{ëQÏŒv*XPçGq¡”u,�ÿâì‚'=ž¾¶ä½3ì^)Ý »&ŠÂðò–]6v…¥>òÂ’É™lÅ!¯üüîåû/ÞÞÕ>ýÀ³{9cºö•]]~6³Ú>Úî^¼íñýß{Ó?¼ó�?½ûÈßü¦G>pÂc¦ ‰Ò“õ¬«R›òò¶¾MƒÝv.ŒÁÌ«×íö³{ŽþÚÅ¿}Ï««zÏQ÷>³w®“Rã9r4¯k´–åfÐe¸ðÌk k•ÆÂÞ±á‰vzëyCÏ4¥XùýᬤJ:M$ ÌüÚ`o_çD[¥>:U‹Ü[ 6ÍŠÞe `¨œ‘zðaM¹È Ç‚é#»$pÓ4ÈÙ[°ò \›*Ó¹&W“ 1ºÄgç+H‚;vƒ;FÕY•ûÛÚÛSÊ5OºÎT“J…©=QÄYEº’$•4ËdfÞadëÅ §-TJù!Œ#ItÓ®X47Y#—µ¥Ü•B�§xÝVÌLÛ‡œµ´y2ÚÓ’™X›¶‰o3H3ç h3 "­QÒ>'ÉÔÂ^•ªDÛ¬zK¶LRàŽ” Æúõ ­È,xPÊ`kNRŠ!%@š!‘ð¬q²Á”A Š,L$ʘ! r¤Á\dð1”bOR¡Ÿµ<¦rsP¥lÓNNäLÂIB*I(ŒUÑZ€ÖZ:ÌYf‘Z²Š´@ ŠüÆØ8%Ý—NO7”N1Á$€ÅìxA¤x© \ž³B(Ö¶9Mnbº½Û#BI!/‹˜1"áL}¨ý€:ëDžîd_s#¯Ñ¶Ý¤@ TÓ¨1´â:�+ÊItÛO.D^`sr”mO¬A¡�±„ Éã.»$cÖ‹gù}oñùšËšÏ} Þ hk’…éQÖP4éQj€µ¦eű;R—°çÓE\εýCAÁ®,‘¢™Ì*ùŠf Õì­9¾)�-ãÈš}” ›ýF¼ °ÇÖ#MŸª^wÿ¡ï?å±›>Ø,C«$Åç/¸k÷ùßüÞÙϾ6_³úüùXÐ;nÞÉ e:^*×Ñrº‚ÕüzåÖî+-¥B£¸ÃÑ«Dçí²Dæœû‰ð�VÔsW&10“'ÒXUey‹„rr:ëØcÁ�ñNGBzMLU¯½ÿ°œòØÍ$I•Ž�N&� Ûº=“Ø5%äJK�Ú™¢…}ðÅì¬Û—™Fj�¶eŒÁÑŽ?¬YúÖ#Ÿ½éáO8ø•ç7Î_ßßëlh˜Ÿ./¡’ñ‚9ãšiaïX%Ó�éÄt°Ðê߯]y§d]ÐLýÃä§,¥M�‰oêQÔ·Y®è—àõ`%¾y@T¥}Ñæ™€h`´ý«—ž~ÄŸozä |åù ó×÷÷Bf©²$wo%‰5Z£Ðôo×½åOú.š¶�t´êSÉf9»…&ÚˆU$‚(c?�ØmƱI0�™æ†.ˆP/’{žÝ÷üc×,ž3zÔ^ï}~ß©ÜÎK¬¾uÇÊ?>¿�Ñ&EI6oëk"L7²¼PξÔ(’ïÞvü5vþ k¿záï^ÝÞû™ÿ9{Ó`°²¶DH¤œ71Ô«go4ŠDžvçŽGÆ‹4Soºž¦)§ÊƒA§�¥¶Ì¦ PRgªÉcv�Ê $¹"$Ù#ÀŸ’Q®t>_`¨ãgª@=g)Y¬™(�´0\lRÙ¢…JBYšØ³e¬93˜€˜‘*êRÊì2ÂÌ eŽ£!Ái¦‘Z. @„Ý ¬Z(êq€-ÂzG»Ò+tn‘/1mê® M¡`Þ0‚MÛInÕ2`m'‹-ÕÌÐL\0]Àn†ÍÈ‘à:S]©"©%Y[¥µEs¸’$v­�]Ø�ì‘—Ý5J ëûyz„”Cd¥�(!M@Ä @ DÈjY ÕaÛ¦”y×-Ž#0gš(ñŠóJˆa/c¢’P.f=Nt[q k܇‰"'*IÀ0ùD@!‰ÝšíÁ9.^ì`…ÔA-#Ixvi(9é ÃLàJB‹Ó’çÙɧL‡HÅã ç˜]°Q$MÀnÑíø‘ýR2Co'·NsmDð~rʘÁ9‡f¡%Hæ!˜µÉîA¡ˆ*�"ÅTeÔ44‘]7i·c1�ãq€®ƒe•ª˜–Ù¼0{|Ô F«®…Ï·t:‚ß‚ï=×Òš#à+ä Ã983;aeØpŠXâ(!S‚æ_ÃdŒHü:˜O³#zYL @2Oàè,’eL‰ëšÝÚ1íÄ´¢�˜% ZÿW"CD&�e$ ½|TGÐg_¸‹Ä“™êtÞ@êaŽ™g:yïS{7ŠôØÖštµÏ,[Òÿë{{ê•EAYRì¶ËHs­¥ªÆÚ· vï>pó`÷†=z6lïÞ2ØSèÔ¶)èœuV…qþŠ'�[öêqÊÀh{DAÿ)'ßÛòͱ©êã/îö¦ƒ×íÚ7”S~ò¾§÷näɱËÖçV„²eÔ‡�Èì¬Oм8(lsÖ5Äan\>Õºº–W™2¾ Âíkö_8wü¨¥�YºáŽÕKŠŒ\$ ñE+;pɶK¯póP÷Æ�ž�½wôlìÎu¢5½Ö߻ǼáÞŽÉ25šXDåÿˆÊ­/_AÖ�[µd&{„H�’’Òœ*(½}í 玵ï†cöÛpÇšýò"q5ïµ` –6ÌK{ÍßÑ(’£�ƒcm[†º÷˜?¸y¨kÃŽž =vôlìnI+Ž4D§Ô,^…+ŠÒŠò~Ì)=™èpš3×ë\0ˆ €'Ö/©fù—¾4·cò‘—÷4šhÛ6Úµdîà¶ÑîMC=[Fz7õ¾¶µ7/RoGe¬h˜b® ÷�t~ç¶Þý�÷í6wôă^jIqwkÛpÇT=;pÉVÇŠeK¶Í4’­Ã�ñ ì"†â§ì_�±@[¥Qo¨\+rñåX&œ&–ô!¨Ï€©`‡BÌOÊB";'Ý:[` $D,¹°²…9Š8/Øìu&«Ix‚ÿ—˜íaЪ­J `–m9-pº†YûhžI€�c íÊ`�•–;÷ÆNò`çt� Æ&ç†Ø,¼*“o‹ ãr•xnm “ üy³z­ß,ª#mÔ‹Ikw6¼ÙÞ…FÁ`ÍÌ(4˜4(¬ ¸4”*ÒZšµuqÚ6¯§¨¦Iäý’l@ ‚¹šr»â±Þúš€`"• M`ƒ¦Š`vO`RGŠL·Uˆ°7Œö¯3‡B˜Ô̆‹d1;‰33ãN°]L\;5 w9?ÙJ~ ÓÁG–³' Í�Bçº(´Öìå5Qª¢ÒZ’´§•ö$«&I…TB²ù 3³Kv53CL3­ÀNøÝÀªÅÍ ¯X:EPB~ ˆ~yóê§%zoº,ˆ %š ô�¢ib0ƒ…6¡ÕhF¢^mòºð ÃåByç .PÔÑh ‘Ãì= ®hê,¨»�¶©_hzãN>>ÙñO“kåè|G[ù”è��!ŒJòFÎ¥\){ž…5zü)9Ón¥®í9;ë$|‹P*¹ü›Àˆ²|¹é‚ÝMxé•Ú�P¸IgÍZÑ "¬Ñd{K,ØJ1Ë%§pSmÐËW)NŽ„\ˆøá´Å102Y»é¡ƒVòJª4S3éÀhÛ‰‡½´×‚á=æÿõY·ìµð� ï^âF'«Wß³ü¬ãžùÔÛÜgÑÀ’]†NYþÒ…'®Î’BBÂH/Ìø˜ý_»ôŒ‡~zçQÃãµEsÆÍíí˜ Q[Œº8ïõÒ/î>À•—ÞtÎqO±ïÆ“–¿pöqOg©ß™¨ÝôðA+~%K" ‘Ó ©1jU´tÑŽ{ÿýÊ/\x§$/ɤyÀlò>:œe2¢õeï·Uµ¬QÉòöj#ú‰ñò–¾g_[ðÞ•O´U«^Ü]\›·–.Ú±ÿnýû/îßq¿Œ@pü²õïËãß¼éM·¯YúõO¼håão\ö F&«WݳüìcŸùôÛØ{ÑŽÝw}æû,ؽoè”Ã_|ÏŠÕYZ8Ùu¦¸ kbé¢÷õ¿¾xþíJ,€²L§©beÀ|òN‹i Ö˜j°›Û:ÒóÂÖyï>fí–‘ž sŒ‰Ÿ©]÷øò3{æ’Ü{þÀîs†Þ´×‹ï9au–jã«Ú*�¶,¯¤y{5SGï³ñì7<³ç¼ÁÝcG½Ú°ûÛØ^u·Og)wTóZf"ý´}´ó7�òÁ•«N_þçù=ã§þÂW>vëê·w•¤.Ô‘ïÖóB’zKKú†ÆÛ'gÒÀ¦Ú'— ›}TLs]Z…EŽÞ�ÃÎO h³w-Ôðß rö� B%Á@"Ú/ÂCl œ%–8%AkgNX1Ú2 ÿÙY€¾õxJDC±u{lœ«›=“¤‘€ZìÅ‘%öƒ+xZ’À1q°xtƒîÎÐS�"Ú:FO­§‘1†4Í`í4e¬6`ÒÚ mfÖLš©`µ‘35(ͳöjÖÙÁªÖ×]tÕ*šíÎ}^7E¯ +ƒf¬ß@œÛÖ'Ä&9›©""N ‰²'õ0@©N”A[vLa™H‚9h&4M‰Íl {Þ,;g¬M7²cÁ†80.¹BrÙ&þž„F£¢�;Éfs’Bç…Î5ºÐlsï‰�RRIÒ¶$ëH+íiVQijÆç¬JÎk‡!$æœ"{œ•àÑÈ€Ê4�óBe0®k:üaÇæ5¼(lb‰@:K—-ÿ•É êM÷#“Apý'§‹.k  ¢ŽF�‚´C�ª�¹êÉ©­@&ƒ� ^4=èKð”‘0lZz>瘢?凼/+áj.¹Ä(¡~ü"GÑ7XZÊ`I`‰U±–6Ä;ä,;˸Ë:|UR7{ÒG’à¿’'¬…ì®¶ÐF³+Y0¿™9£H6šIâ gŒ�}X£ôJ(�A‚gõq…ƒÒVc&O�ÒÐçÎÕû¾oåê®ö€'g*—_·âÿ^x÷_ýáàxÛ5÷öó»–ï>Ø+¤­ÔÅëú‘Ó%âW·ÍùÕ½‡¡¥ij‘"¼ó�OíÚ7òå‹nÿòE·››·²%°n¥kÉüá¾î©'^ZÒ”seÚʇö™³B»€ýbz\n—¥´Mõ"¹eÕÁßýè ×?tȶ‘.áøícì·xû]_ù~Q¨›Wø�›V4Š„ë>dx¢í£§>òÑSl—¯¾o¹vþ8m|x÷yÃ}ÝS�¿¼›¶™T\#R5�² ƒvMž!�sn •)Î먛ȘA(8¹ïù}O9è…ë?|:Ϙ@¿yò�Ñ©¶‹Žôâ¿ZEįôϹú¾# Æ’y#¿üô/öœgeãOßøú†�Þ‹þó‚·î K:éÑ}´Uvô~ÿöãî~j)€¶Jþ�ÝxÊá/&TáoϺû³oûã†Á9ø¯óŸß´Ë÷î8v|&ûÛ³ïYÒ7¼e¨û÷ñ?w] iáûN‘ʈU#ÑxöO ï*iã�%[^Ø2o|¦j–�Y¯¼QzÅ]p‰MF‚†.Ø h= 7R ]Ö…• »¹òm“êÒr1b‹Ü ÿ•Âtݬ—)%™¸H˜„–e´¤ ñ7 ŠRYâscd&Ä �–Ü5×"EŠeW5i¡iM脘`R`Ù·D…á�š liXv©ðó­ F5ᮌ`²�õ;xp”LŒ46Ýâ|™ÒšÀöô qk�6ÿ2r AÔ Y[-k¯åEÛÜ–™…�l¶yö 5ADšÑUE…°yãL©ÙXÆ „ÄâF6@ÚÜTŠ'• —êYÇÌœq`µêÇH5&ÎÂnÜ!ÒgÇÉ[^8 L�{â)å>„“æMž �§€ÅÚÍ�˜Ù"Àð‰f{;­Í ˆ%G”HÌVµ\$B`‹ðÎ 6A¹­à›½“¹;û~"-.vi[ä:¼â·Î Èç]U š„oÎpô“�®èHIvG„¾ì`¤@áw4²J\Õ¤Éì…ƒ\¦¿æ·„Í 8-‹Q§§ÎN-‡^9~Èa�VoI•/²oÅÏ 5[…X.)L°–Ò„*9¡ð´WòSÀ.ñ‡ä@*‰ŽÂÌäžt®ÜK¦)ÈNæ=¥ÌR”Ùš(BNÔh£IÌ€n¥A-~*éiÈ6²ì{È·7f[ˆÂ5O³—ô§<q_�yÝËZ|a².8qíûÞ²ú½—Ÿ?8æ—â5•Y‚žîÇϔ즷&?Þ4­ûÞéíœúÙg}Ãÿ�ß›%z½©Ÿ`ð'Î|øíÇ>óÞ¯Ÿß?ÜÙÔ·\(BŸn>!îlsÓÐtÖ®ìµpè'}Í~yê=OíÝ¢±q½Nú£þ™NAt¸üJ‰]Nd¬!‹¿†×eg�¸tï˜ "x‘½Ûí?ϪÐ�V$˜Ãûì?Ì*+'4äql—MOö[´ý'—^óåëOúýÚeŠYÙéx—U¦:Ù›sdÝÑ•Ø]–¡—>™”t((Á¡À]8€ïý5ˆ¨³“G§yãhö˜ó¦‰�5k˜µ„VU´F#·ø…=Y¶KOBr@±³v&Úš¼´Ùô—ÒÜ©ü¬Ü�þ·¸[ì … ‡6ì“)êÊ8S`�þ1ÚÐÏ3¹éŸŒYlAÄÚ¥®ÚTl“ƒÎl4A31!g.€¨¡2ÊÚ²J{­Ðµî¶F_gU0‰57ÁG0¨–¢·ÂÓ <ó t Ðv0eѶ"NEÞ†&”îÜ…;³D‹—wf«£‚L‘®óèCÜ´"aŠò‰´àPúšt¼Ù0Dômu€èü#s—"K�ym§ðJ–Û„3ê® » SUëYµ’uµ%æì"È )BçLŒ¾d„çF9&„mVÁu6s agš½lÜÐ1>·BË2=°§nü×­Ëÿ!h›…:2HŠ63hÕ–R“ÍLŽRPv&€Äp»W¼+ 7•ô¿½þ25›×ka#[ˆLü¶weîGù°Úºm†¦IXƒ¤s‚|¹¹øÐbßi%8;ë*75{çÏÿ…¿FO£å�´ag%Yнál 5Ítˆ9µ‚Iä}·¹Z#Œ—£¶šD ý…{!n'sd‡"‚3€…sǯÿ§Ÿ.™¥Œ›kó`÷yÿú¾M;zŃxˆ†JýÂ!�ÂFÍnU JªÚcëïžØ»`G—t(Oü8¾Ôio×› QÈ6�D¨/Ñúøe¯ Ž·¯Y·°™2A½>ôÖl ù ì[þÜŠ¸õì0¡¿O!Çàû‘%ÅÁ»oýÝûoí"’7¶%LdÍ\ékófwçøe¯Ž·¯Y·HŒ¤_Qïø��£¡r{ÞÅþPÂFÁs”%ùÁ»oýÝê¶�v¹ûm¥U³íœ�Ã’%w–(æƒJÀÌ3 ‘:�:-‹5A\¡>IF†Tßı¿i!ò-.GÝXë!Ê#G9FàýKËÞÝØ—ˆß~ôÓ›†ºÍF�¾ŒVÍ¡¦¥6N3²ºÁº¡ØIÛ­ÅaßNÉæbiÖdBŸì�ž[=ÊLô4/dó‚ O:îH“»éfSx(MÕLøj+rÁ6—³Á2?€´ uÇ™ÀÎcÉ1«q\p-K 7o²,  Ü™¢-eOÎÐú~ Ž¹Í¢-íw¶D1*o34LÌ “»¬Ù®},@fÿ¾4mË*mY‘׺Ú󾮪ÃxÃ`PBÜ•Œ×6@×mBHªÀd+("²mW ¬�§\K•Ù[Av#=­8>;™J%W+ ÏDv7þ)ú©Ø^8.ÚŸ#ŸgyTÜÒÀ…Ö8ŠmyûÄ–) †"�29$ ¢”(MìLM!gJ è!ØýmmfÕ3+kmÝö;N}¶¤ù�Â([ “M>$ê»ÍÃòƒIóÅuJèE- Ú­Ü÷ÀP[u7+¬ml±ûBT¢a™­¸ ™-"I�«LU M\'˜Ã&­°¦¹³ÛÕ¸ Ö¾8÷]òõq!�›;NáQΨ ž÷M&.ÜŠÙ`fÀBë H4kJÌR‰*« tn€uàŒ‚ZÃ%�R3$ÿ$ò®;!PH‚HÉ1„’~…éaù-D*¢rÉjuÑë�L©¶.@™´Â„Jâ(’—¶¶¼_j®P~h!ØÁóû/Ù~Ïü`CϾõ®þáÎÞ?tó¦>Žnînï×/¬¤��ææ‘zžnêjnBØäf²sºK÷ÄO>ûë½ µU7qÕ½GŒLø¹‚˜Wƒ† *xÒ?ë¼…±¹.‹”ñ`A¹±ìd4ºO�"¹ä{çºv”…NœZsŠ›‹FŠáà0>Ì 0@‰*ºÚû,Ú~ñÊǯºÇRÚ'ËÍÞ�#67±/h©S'a_£H>þýsÃ~$„4a•¸3l!~-k"è3E&áU¹!» Z#†Fk4f‚ÙJ÷›3¢°sØ‹®ªÅ7¦r¿Ãî»bØíj’m\z´7‡ì¾å­‡>÷…kO�j† MBÅ j KvOêÍ0ºZ³R>nÀâ?LyÙáÃ˼ñ(lr3˜aæQÉ&Ya‹Æ7¦j¨rNî«Í1�V ( . ÎA‘NjYRM+m•"Ï:jy_gÅqÙìž+ßœEáÎ E›yteHR„Äô�$'›,¤¨Y•ͬÁÂ8g«a'Cóicw)%@#&¡K ¸Zk@`mŸqF±�wŒMzf²)㮸ø²V˜Ëw¬ŒC3ÛsZL¢(IS€„”"²·Â£ÅÊ=;<5ÿsN4 £J‘[çˆ"M�õòå�œáh |#«oØHÈSz)6Š~x#:&#æ ŠóÄêk˜MÄ BnNwg(³•Õ€Z�ÜP¨ úÀ�ªíô*ûöØ÷úÝÏ&÷\¸« ȵ"G1Z9®¦…³Rì†Rl'ØDf œ2˜ ÍX%DŠ R ¬D…é¼_–œ· ‘�Ùãσi°Ûþ%B¸G\(Íi•*Ǫ4»rÐÂrâV#¨DÕ8·5´¢®DàỖ¸·ÜS¡Žëò…yá {6ÛÅn0ºYúL„›>ø�Ú‡€F®ÇÛ¥Ò׫ .8×ê•-sš¹t±IªE•›¥Û�Å�ñö}û�YR00<ÑFME¦Ø1f¶G÷-¿ƒâ Í¡ v?„2iì ħ ì¶¹³ëܱ«ÿö—sº¦®½ÿÐ_ÝH C#Q Ä« _¹Œ8Æ'Ý…ƒD~¤)Úå#4Z¾‹$b+b@ókvÞ9*yÆ+”í®Ãm‹æŽ]ó·¿Ë«í IDATœÓ9uí‡þêÁCô ‡=à¶$ t­gÄÕ‡„,ky¨›‘‰«QÅ�RÚd¦ lþe‘£­¢¦sU/4¹ÇÜb'džS@c \�g˜Ý Ê™=!?Œ)Äë$}Íö#‰Š9T6J!È×k`�åýS¯-zËW>d?ŠhÍÚ¸’}4$Õ@AT48©‘‹Ö‘´×aûŠw8¨Êd —¤‰˜ØdËNT˜#ðm6×õL•ø Š<ê�bJåàËOÉ~‚q´�+“~3iggÐv»VÖʃûî‘ç…Øñ`3I3×nOQ!ŒíãjÃVžÈå„ S =W¬ƒÕlbÐ2mm¡2»ø@ÁT(ÅI-Kk•¬špQé¨4æwg,„óȤí:2Ÿá­¯!1Û²h»ð‘&%»µ(°`î†ÆsO‰Ì^¸a‡vM°Ö¬Th¹bÒĪ”÷fi'!rÁìg¼Au�8 ×zY V˜2MÞüDÎÅv¡¤b¥š,hìg‘ V?õ¦ìّ½›Ü¦�€™fq:#åd·d—ýZÿ€¯sqÜSùÚ«™x›ÚTvùAU@ÁÖÈ*A�8G"Üfn¥XQRW…B#¡: É°ÄÛ8J-µ5G�|ÇK®:´nFEû·8ËPêRYÈHŒ ÃÏçú¿F+„FD\¤¹ šY³&ƒ¶JU™Ü Î Uuà�µk\ÜÄXóÀÇŠÙÀI(ô2E)ÆÚ–E„U9—oÄ9’F­±ÒïˆÖ¤cÜÔH×|:îàomȶ%"Ьx½p惜‘›ùÊP Eô„øß_$ æ/ÔQÄDš­yTúæw_gƒEì �´(?°¥  ˆC |LXlh|Ü‹-0Ûz‹×y¦iÐ&ŠËF©Ýb§ÄÿDsA5Fl)‡éJ4 Š#x·è|_L‚×½(¢W”KÓÜAwÓ3Ì-rþu¶jÐÔ—fAaÑÜDõÎçjG*’x+8&¢�f¬h400Ñ�í“ËÒ+nÀÄ*yx;å3*tQ‘ô;¼žUÆZhÜØ(d6ap%6dÕAB`Ÿ„ëHKÚÏ6@ ô*TRîêUj’Ei¿é»ž1Øœò­M$Ûšqãi¢`›“s• ½£ªMÑp¿<äðn�|+Å#4O/ÿ�³™Zp„¬&œTDV­6I4*Bö\ŸFVEš!M©·-œj”J%м4�uŽÜç% EI‚æygùÂŽA$ª,1=[ë±,Q7˜•¡¸Ê_+œ._ƒ½Ì´ à „Bu *–±ˆMˆÁ“ŒjÖ eqù¸…OÙ –"ÒÁÞȶ»6´H�ÝL�DpmÈÕ«�= ÄöH»ÃWÀ¢b�Nj4tnfL…`l£r&‚ ×+¿¬ $¶ŒÜ%¤.�\?Ž%ʈÛ2®*h|†·ôÓÀ(ê`ê¢xVZl6™æ,gÎF±5ƒ‰Øž®M¤U–¤e@v>�tdõy=U»-­Äo‰ Ù„èlÔAº«œÖoÅä0¹zˆH+#Òd/˜U·õ æJMg*q‹ íÙÑÌŽƒÞYº“‰¤— SÃoäçìT åñAgP›`´3€vØÌ�ÝŒ‹C{Í…x›ŽÒå�ÀÕø @”"€”=ÞÈëžu7FXL ³�Nûñ”#`àh ÂpÔI±—FαE�Åy™6èÀâøFÄ ’ÏÆ¨ú`Fd@<=ãÀvdÜÃ4& ­¡arrX)"¤ŒDS›æÁí^îQ \ ¢E„ Ê­ã¦W¤$%Ø�|‚Ø9:[›`/‹X¢F�]€uâD+*ï ͱ"¤F73­2Ò9sñJ¡rçªxßx$‰Uýi¥y-hjÞkFÃðøí¶Œ+— NÑ o4IíÊ—ÓwŒM÷Ò™Æ�còd­ºP¡ToK¸Áþ§Rû×7;qZv¼©[¯DÖý�íiT¼ó’)×°m�¾G¦Ñ§&±pNÚƒ‡ÍZµ:ƒÛcTÑÊ®ˆÅ’’]΢ù?/%.›\[|eâ§É´Ø%.Ú¢¼Ü0$iÚyæïK—]7æVl…À]qžüa˜b×|[ë:bú“Ëù²Ð8O„†³Da’r0 ÇÒþزH.x�yŠ 0Ú¬7®àJ…U’ºø©¥ &r`H'§M4ꔤ Å•ŒºŠt¬Q8±ö¾‰|÷g¦áGs6ÛÙ3ŠÞ2oxWÌSû°e¯·Ä%ÓÅÎjX¦jôSHy¯åñLi<è(™T1”.ò39žû‘g˜ 39W2¦cOa×g–-–Ý�ÄÀÍÞp²6O„#hÙ Ò€¬äÂâåH>EÎ�°Ãn4Mìù.3”L�]Ø"&YLJÅá²I"=€ ¡ßuÕúãAÌ™B{Ê€&ë¼m÷ ®,þ£èÐ’ƒŠØZÀJNÉ�‘k& h¥ ²4©ª4KÒJRL©Îjc^OÕv�™”rVËMAktVP% O`û&NÄx)Q(#×ÊqXļ‘S]�„æ¶‘"ÒLä†xò?;)tNŠ�²ÛÐFåò�ë¹ûì�¤Œ—£ ¤Mò•µÓ#"¡·rúeí»ül™$ñPr¦h\a`’\ bëEÄvÿ3+öò›r,·¡Û-TÙ ¥3•VDawlô©Úέ�ÇxJl¶žd¶0%t pŽ;îƒû-"sô¡ü9þòª]_dD^.MŠÝéU@¤‰¡ ”‰ïfL†7ˆêŠsWB©ð– †µ9?¨cùqÎꊷóÝ”*ii¡õ³Šl¬M²R5l[É`­Q+BBŠ\êvκai¢á®â&È6Ý3Àu‡¼›ö¯K[C0Q)l2ER\$�J¿º�\Ó芣ò‰‚Š}jP¿´é‰]>E,q4píJ)3ªI†[¼X’"Ÿ1¢¹ñ Çjžz%¡)©x“´ÆY9Ö!°Gåy¬˜£¥–9aó7 Fó{�ÙC$aðò+@Gj±iŠù:[Mpˆ:’Ú0¨¡e›ÄK´§—–ƒÉÿn @�ÓòTðÝÜãd(rõ2,oÕùãÚâ�6G†6Ð\òiœNÇJKˆ[QÄY/_yà¥Íؼš¨$•xd”iÇñx‘œ¤ªQ×ÓãTí€JÐ^U¹æ©¢ ?°/+åÌLÊGvu‚ƒ}Äâí|ûB¹…p'ø%ì’X�ì~áˆà¬�8jŠŠ…gÈnú%ÐÎY#ãçío€Ô4WÝA€A Ü0¤l˜AV—šÄåk&—Áêàœ¡¾àÁD&^ÈBÂB� ¶u˜)œ»´úQ0Šœ‘ÁdÉ’ÛŠ‘Žˆœ:QC)ÙWDyír"j.Fœf�-¬  BÔVáŒÆDýÛyÇÏ0q€bnõEÚò›$–oÿÓ¶Jh�&hJ�T’¤’$Y’$*ŸRݵƼî*\N¹çºAféj¦ZÆ�Õ lx••ÆÌ»ØF1ÈZ6fÊ š) NtV¥jE�A`éR0Œˆ$HàG �n(MHëkMSàQcùÌ]²¶ YVr” å £U’x鬌‘a'òáD©œ§ŽšÄl�ø#fÆP(]™¥¥:ôMòŽÄôUBThŽ ¬DÓ¹1ø.E}E©Ža› ªsî–ßÎ= ‚£AØø�\ü}ÅÍî­ÑìÒÅ`B]@H%fœ*£¢‰ uÅue–·‹D‹ar±¼¨8Õ(U]fk@,”¢Y* {ЦüÀ,%HSBùtñìH‹Ë"óÑê·ÑÛr×H$•Þy7A!UJýiNSka†ÂaßK*!Þ² йQj2tõZ6Ïq­¾O®¼’¹ ÛÁ])è§oD0k H?H&y]T \t#ý Þäbj¤€nŒæXg# Æ›d�%•Â}›M€'³—¨h\ÄeŽ ™H,£³ép¬„„B–Ä "NÐÊJŸÌÍî[Ï‚ ÖÒ\}hvâ/e×f~«qVÞáX”Ä¡%'ÜœU¨>ÍS£Të‚Rè¬&ù4®“Ä4ŠyÝÛ7î¨EtnVy‘ÙÆ"›~ üGð“‹š€ƒ[‰“DpøýhÂÉf™éðš×ÔD œV¨L3wC`3‡J#š!©Ú"Ű�ìÉ5ðØÊ¢o«&3"±;É1‘Yiƾ ·b’P¾Söoªg¦T{Í×ç’ÉüšEØ \¯Ûy_‹j“!³�ÔYd)Y+—+B5E-AF¬�ñilß��Aš!­ ¦dçœ%”ê¨lg=ÁÅq³ÄÆœoÐ`MŠUš$™J2¥2¥TRL¢»½>¯»"‘úÀ«8Í’ �„Ð]˜_Û@�)VŠ ­~*˜zVA{¾匙‚‘9©®6¤¤Xº¢âÝ3#t¶0ÐÅÄnè¸&Ä.¾ß:v4ý‘’D=ƒUƒ¢br}„GÈÍóæa=P>v½Š|ŽDÞ­¼XE´LúKf«„Üq‡½$¸`OU¥¤ ™ Ö9³9%>\Z"€%$‹=� G ¡´ÄcçHü²ímLpÈ€�…›-�’³6Í‹Úêˆúº %´Â¸`­ˆ›m^Õ‚jr›ÀÝܸè0»ØV#f¥™9”Z£V“pšÁF�•B̧d5ÉØÇ�¤D|”SÅy¼²ÕÀÏ0£Á\!%XUÁšuäÌrÆ$îg“a§ðf9¸é·ös�ùçgc›ûÕ c€JÜœ|Ë×CÜþ J¹Å‹4VhPQ:z¾•'ŽŒ[ľw¥Î šÃ"þ‹âÎuÛå7^‚¥°Æ˜äÎIÆÍr£BY)Q5.¬t“>ÿMO¦©þÕ½‡Õ ¾ÇYÃáÍéš”cÕm¾5‹e¦É™th¬�œñ çXšçr„J¹4$î“Ä�2@�m3ßúð-ë¶Íýúu+r�´ìW(p®ýð Í…Ï3‚”NÄöÎ…˜‰hNçd{µÞR45“ ŽÕ$a&è‘ÝhyyÙpÍ 3Tò?ö%·9Z™Ý¾ë ‡�\%¢LØáöîe¹X•S©Q£ÎÓcTë¤4Ew5™É5¦QÙÕÔ”³…ìKfxòT¸ãg¿œ¹àü»5±ôÈþi1›G·€Ýâ)!T�(²>40§$oþB‚o®ûàTÛ C¦4º¡Š†N3%íöˆÎÏù¹Õ¶,ƒ9ù=Ñ04™…Š"™ ˜Ù÷Ä«“�vbÖPÊÅõMZ‡Œ�èñ êé6û¸©A‰f³9c(ô eÆ22ɨI°ã¤Í¾ð3@N¯ã«d0¢'âð«PÜs,O=:’÷¬—ë*��Ø9‘’5Š ›¬2™a›0?!"f3Lp¹¼£…ÉÛIÌÎ9šuÁ\°Öª­: ¢U'±yb,ïMQ b[1ÙBOÕæžÜŒA~Ë˳`'•Þ�:,ù5XSA(L>‰b—À] W˜QÜë`ñœ-aE„˜ÄÑÁÚc_k » ‘Ð^È/¾Ì¨²±]n�“Jâ™þxtjùæ›ïÛl¬`àDQ �BR2Ö pî]/{XÒª£RSXzH1y¾¨XâË¥…•+•1œW•¨E¦Oì²ôã)GNûYòF¬È‡.4$IO܇SµlvЪdiî{Ó׿ö_z QrªìÅ(êG©¶&V;{%B:kݳÝ,W'Xó{&ÞÊã�¿°›véž¼æï¯Ú·~÷ääLö‘ï¼ã¾§÷rµ2C)þÒ{n?ëØg[·�q݃‡þÍ�Ï,äp]‡ï½õ矽fNçdëvË5<Ñ~Ñ7Þµæå]9Ø¡Œ'öò1ûm¸þÁCÈHêÅ# ²í¨hNäÜôlL$±¡¿‘ˆù½·ŸuÌì]~èÐÏüøÌ(ʱ¬¥ºß�"ÍšXRnàVí¹t€À`¡E-,·`d '¢|D¶›ŠJí³þË}Í*Èë<5޶NT2ÕÅéèŒìO@afšÂ*%ÅõÖŠžSá…db6Ï}y+º;µ•8ˆWsƒR�9³·4*giF+õÕ…´}¹$�‘ð¼T’Ï|m4É]=®|ƒ°b}eì¶ç nÎUOÐ>Ù%}²†"$Êžëiª'2 Å>Àj%Bž€�zZŒqï\<%C;ôiŽs·Òi"�P Z3©hõŽ =›ÙÙâ=NWTN±F½ áîïÇÄ4å)8a€ Ã@[­ñÃO]k«sI¡ õý=ûß§WÒ½>¿wüÒÓnêŠß7,ÇÖÔsõJÿi³u‹ûF>yæƒs:'ô©ëš{71]ùðwßñÀ3{9TJ ÷­\}ñ[»àkïÝ>ÒÑ*Ø*Q¬‘úf§°Aøî·«–]öƒ³‹BÇh»\müèS×y®‘§¯sŒ°?îÌó9DN#øÑðÌ‘ûløîÇnºò¶ã~Ϧ‰¡9ío™mÆ�R¥Uš’ÒŸ{ûõ+–=€™~ñÀŠŸ?p¢ù oú"ÝN+*¯ëéqT;PͨM'Ó¹à/å9u/ôw�c£Œ(ù]]Òv‡¡9øÝ˜™j•ÆÇOyä‚V/虬}åú“¯}èPçâÈtG(”$úŠÝð¶#Ÿ 5}ûÖ7}ó¶!éËŒ`D�2b[*è6šÐ—b'*ÓÄÝa?|a}»‹_yîûèY_c<–. R G`’ 0ëÿÉjb^h÷®-ˆ @£Ú®U*EGWê‚£qÚçÈ,$2Ñ\q±vgÓ<çí)/©B%á,1±v44FGy`£cå…9ƒ©Úõ0ÀÐfƬI5Ï'¤(ap!qn#Lb=Ù•éÇx�µqà Ÿý¬%³¥P‰Ð%¬'eE¿QL7þzýä�²}þ ^‰/fTÄæDwÅDJ¡ª©ÊÈ5 ×N.ÁC.òÊû+;¹óòågk°¬2œ L^©‘Äl‚r³+Þep €!eÊÂno‰ŽÌ `¶%¡4g¬sæºq*~µOÈGqB®­©=Bð ï¥Ë¹Ý\g˜nÕ*Ð.ãÞpÖ!l‰ÎR—ªø¹ î^¶dÛ_ïíß¾ä7Þ°ð_¯^ÉLózÆõ¹«ö]´Ckž¨=úüî?¸õØÕ/-n*ªe·CŒá惽o)=lD¶Vi|ï7Þ±zéÕ÷,Ÿ•Vö&ÐN$[Ò@cv̬}þü?|øÔUáÛw®YzÉ�[oH¼Öq8p@­Òøþe7Þ¾zéÕ÷¶laëF—>8ø×Ó1uþŠ'ÿ°f¿W¶Í=jéÆ�;zxqã.·¯^JÀ‘ãí8é± úˆhg¾áÏg¾áÏ­:Žë<ÔɤáËÐxûíOìçÞß{áà×O~¼»}æïþçôg_›ÿʶ¾z#‰’%Ȱ­Òø»wÜÓQ›ù§Ÿ½ut²83Kï¸èÍOˆó(èrC9‰]Ši»à Oþ Ó;ïr³Ê+…3ŽúóGO{ô€Ýú™ñò–¾ŸÜuô¯<”ÃÈ¥kèN�¤˜yr¦²¾îÀX[8’õ³É�hÂ��Tª"]ÐWozÇ¿ß|^Gmú_Þqµ%ƒ†G{݉Wgæ¬Jy�§Ç¹ÖA핤М[ˆDn̪93È~q�[?®ÿxÞ]‡í±ù“?<÷[ºùÅÍ»|é×§ø]uIÀ•tÓ‡À ',{õC+ýæ-+î|ji[ÖØ>æÆÏ®2¯…V—þè¼Oüøœžö™ÿ¾äG{¹ð»ÄK£éL‡~¬f†F’Z³‘ ƒ™u]­&Ìì]àÑ‹\Êú'ï.L[HN‰�ã‹ r›xv‚”TŽ¢$âN³ˆ�®¥Ñ# ª÷ÔGvT¹È»zShéˆ ³~Ç û-rB„L!U”’=­&/xt#C4<ÊÓT¤ÌÊ,Ïa?¬mòÿe\‰ƒ‘Ó/�)ßZRH²D¥ŠÌ©ƒ©BNjº¾ OµWSÉfè;n³6û*jNî®@36¬G>ÍD¤¼m±#wT¼©» Ôsjh�$§4W)¸@{-�Ciù•57a„›„šBý„áCÞÖ9ìˆÉk¡H5ùa™)[õ–—�~éµSîà[Ù´rô¶ÿ €Q˜-Æ™�Ä’EÁî4 ”Áßl÷1çÑ΂'dý/;Àš�©Ð)²“ì”Q’@.±„5;é InE£@.‹Ç�-òªh—N6;˜×!qè^ŸQÇÿO·xßb] Ö\€�€L„ #Í© h¸|'hÚrÛMCJÂÁðj³•y R²Æ+0ÐC8 ÓY§–§Èöv�toùÏÎo¹j±dhf³-IJ¤ˆT ¤šsÒ 2«MXcI‚!å2—W;qãÎÎÂi^ÔX.¡Éf)jY² pßéæÑ^jÌ2k �µ�OW&f*ãÓÕáñš[5¥5¾uã 7?rÐ’¾á Þ¼öÇÿçÚøñ·¯^ÔKðä Éì[ÅVW"Kübn«6æ÷N´~¢JöŸYþÙRÃÈ7‹`ÍË»~ñ§LÕíbбéj½‘D¼*‰Õ|~ïÁglÏ~E•¶ ¦žwüÓsº¦~tûÑo9ô¥ÿ{áþù§Ï—ÌCÙܹfé?þô­ºˆF~µjþÍß"/ø±šóiRœûWOÿûþØÛ1=]Ï–îºãKï½só`×wn>þöÕû5$:næR³¤øÔÛ8uù _¼êä«ï;,\°`TnÅAë.xÓšzî’I(Ö‹ˆA`5òÁÓ�|\ÁÛ¾;×.ýÇŸ¾µˆÍ+„z IDATaL[5ÿæ‡n)Uo¾¿ìÕ¯¼÷÷7¯:ðË×¼…�}­ßÞËÞD�™�•ÎŒ¹;Þ°àüË/t³Ë,HÔÍ3œ#�{Ç B%%F4I3ª(”Mß5”ˆµÉ�3ˆ@È6�’ Ðà©q®uª®Z:6“ç�¢™¸É,�—"ÙˆúmÛÇÌoŸ®�ÏTǦª#5ku}lÉÍ ˜™!fôuLŒNWo_»ÿæ¡nKaMøI<1*×”çÊŸûŽIBÆØÖ‰ïð»ö—¦ðäó,L4MŸI�q®V�i4-ÑYk´%­@ä0›y€áÎ�’&ÊT,˜aöHI´{—`‚?§‹ðøp��öæÃC•údÑ5WUke6ž,»…¸×Íh‘˜Àœ�“”q¢HÁîËÖhÐÄ$óè8¦T$Ì ¨Ä `GM,okç‰b-æà扉-Á”3ˆ¡ ReÂØ*!¥ˆq�²z}Ñ.I5Ë´íE (NM »Óœ"ôÔ�6láñ$‰,En=‡Ï~vf®‘£žk$ JI¥`ÔÚÛ¹’øx'kmògD�Å2äLÉ#aF™co;°z±[r¦WD‘ŸJÖ2¼°ü3 ,%‚h$º¨ š”9{ˆÍ~/>Èa´Øì M`3jÏ™|EePw:0æÍbÂ�HA‚ÜÆ¬™¬·C·i 9ép¶JÌ ;ÂÞ¹Q’ƒžƒ¤ZЮ™¦Í ùß\³UÔú ]£ .�“=ò&©¦LCu…e—;–-C&" ¥Üô“+]Hh§Iíkîv\¦3Å @Yé£0~o™!N/�N??€(û;paçY3êÌDHM~†$eΡ-¢äžR¶W~‘O‰.aµ‘¹¥fj»E^xXT©jwŸÄ°T Z€�º·†Æk#ãmõF22^«É`h¬}Ýæ¾u›ç>üÜÿö�ß}â¬{qñàX[’gýü‡ßºj¿ÅÛG'ª×?xÈ•¿=nl² MŠóOüÓûO~l�ùÓ3ÙÚ—wýò/ßòÒ–>v\eè¨Í|íC¿ÛuîÈeWœÝÕ>óŸ¿eï…ƒÕ¬ñÜòü�Ötå­Ç]~í &Ô*ùE+Ÿ8ÿÄ'ï2ºi çê»ÿÙÝGÌ4Òöjãÿ}úú?½²pÏùƒoØ#ˆo]µì›7œ0"‰.ÞÔ̯©zöâ–¾‰©Š¥=@{¥ñƒO_¿ê¹%»/:~Ùú®¶™GžÛãËW­\¿½÷€ÝúãÞfZøµëNì¨Õ¿÷‰ÞtÐ+~tçÑ#>mUg­þÕkV>þÒâïâÆ¿ÿŸÓ|vSï_-{õ¾õ’+ΞÓ1sÙÛoûÇwýñˆ}6ÝøÈÁ«_Z¬Ÿ¿àîÏ_p·yxr&‹™îYxòòO^þb ±`lØÑK±ÌHý¦ƒ^ùôY÷¶×–?þiŸ;Öì÷7çÜ{ÿÓ{Þúøÿç¬û¾óñ›q·/]}ò3ëç;„õž×|äÔUvôüÛÅ¿»üƒ·º*&g²ç÷?³w–13ê Våá  ³mækï¿mqßè¥Wž³y°[%úŒ£žûè©«ö[Ü?:Y½î¡C¯¼õ¸ÑÉêÁ{lûÁe7üýOÎ0„bæã—½ö�ÝrÉç¬yeWSàɇ¿xòá³uùPˆß¶�`,Û­`¼ý»·¿}´ŒÇ^\â&IôGþù£§­ÚoWÛŒ+n=nlª¶â u}Ö;FÛO8ðÕ9$QÅÛßðì�k÷ûÇŸž6Y¯üÍ9÷\vúÃi¢µ¦/ÿú¤ÞqŒ‹k�hù^›.=ý¡cöÛÐQ«¯Û6÷òëO¼ãÉý˜¹Vi\üæ'.X±vqßèÆ�ž›8âŽ'� JB`gûaÍ©JÖxûòU§-_½ {dÛhïmkŽøíê£gò¬V©ÿó¹¿zzà {–ïñj{múOöúúïß¼id3êSDÀ‰¿|ùÅ¿ýç«N½mõ"5¡E‡·lAàÐXûèdµÞHF&ÛÇÛ!^RÜ'‰–Øræw�ïc×í·hGwÇLBÅc_û6€Íƒ=ç\~ñÆ�Þ=ç }æm÷žpÀ+s»&ûG:ýÐáWÞqüäLj*%�–€,ѼqíûW<ºç¼áÉzeÍ«»~éÚ“_Ü:¥Š3—ÿù#'=²ÿ¢þÑÉÚu«»âö¿›ª•ð|d}`L£Tœ$ X$6ìÎÌ�‹â³�…3Çšè «DES¨Mr94¤È+…öÜ–V»€0£EoÚ˜J¦·pG í=¨µCepyàÃl¢K¤@ 0ÿòyƒ§§il£ã<9ƒ£0g†§¦…nEFÛîX¤(SÓžáÚBK‹Yœži‹¼“"•*JT’(Q¤ˆ'¹ õ…ó²$Qštð·>zË~‹·?òÜîç÷ôgλÿ»7דû.Ùeô‹ï»£–åÿzÍʼP‡ï³ù“oàŠ[þꮵûvT{,êé TªiãŸÞ}ÏÞ .ý¯s7ö¤ÃùE_÷üÞñ+/»ñª?.¿ùáƒ4>•1C)\zæÃçÿÔ¿^uÒ/ízä¾›?áº;§¿uÃM3/X±öï~|ÆeWž»¸oä??þ›¿{çý_øÙIfÅ^KñŽõˆ<å¬}ã�ºê‹¿8ùïÿûô]º&®üÄMŸ9ïþ¿ùá/ož{Ñ×ß5ÎÄ•—ÞxÕ=Ëozø €Æ§+ ŒOWÞ÷õók•Æ¿]üûóŽ{úÑv?÷ËMÕ³zžLLWž^¿àô£Ÿ{äù%&±øM¿ºnëÜ7Í?vÙúmC]›ºŽØwã¶¡îýî ¹Vìò³�}íøÈi�†Í5ê 5¾øËS.¿~E‹¾̘œ©j¾…Ó�zþ3çÞ»tÑÀºms?ó£·ýæÑ�=`½ùõéW|ä»ï\yèK_¸àÎkþþªÏþè “µà†‡o›œ©üÇoýÁmÇ>·q>Àûî:pÙ™™w+I`º‘Á� œQ®eÅ?½óž} \råy›»¼ã¸§>sÎ}ßùÍ wýié’¾á/¾÷ŽZÖøÊ¯NzqÓ¼§×/8ý¨ç~~IQÞxðºuÛæ¾°e@Zã ¿<åòëOŒä× “3浯mŸÓÛ1}øÞ[î\³Tøl]ÎyÇ>õÙsîýÎ-'ÜõäÒÝvþ—÷ÜQË_ùõÉ`ì·xûõ­¼õ±e—ðÖ_?pØEßz÷7>øÛvÛþÄË‹/¿áÄoÞü¦½æýð“×YZ‹Æ°¸ÿŠ�ßð솅»òÜÁ±Îývë_¿}.¥pÙ�œwÜ“_ùÕÉO¼¼Û‘ûnú»ïœ?oúªGÞl©š‡ˆß}Ü'¼ö‡w�úì¦Ý\¼é#où}gÛÌÏî[aìä9G?ü½;Oûæ­oïHÆ¿táõ—®|à‹7�>9“91£ÐÔ(”6ûL8$YxSC°~{O{m¡füyÃüWûçz†z‹éYÌÀޱŽK~ðŽ4Ño;êÙ¾eÕG¿÷Ží£�¹VãíLLg?¿ç÷ï8vûhç!»oý—wÿ~x¢öã»�uëq\�}SˆßkÓ§Þzÿýîø?üÖÞ<ÞŽªÊÿ®]Uçœ{îœáfÈ@H˜†™Q&AÁv »ÅFEmµÅ¶}h·í³õ×­>EEÚVIB™Â B˜†BH srssç霪Úëý±Çªst¿_}ò¹9§NÕ®µ×øÝk¯½ë•¹åBrØøîÎþfu݇NxéËXóãûN]ýòÜicûþùÃ÷—¢ø_ÿtN’Mðªh@ʨ‚İ,·&îf=A�拆‡Þ†©+. SòÆ®0�"ÄI¾FÅ )HP%)”ª�$Tìæ†^”ŠT,rXD‚Hçà%2…L�HŽy(ÁP…* W%K¥•ÂÒ 3×ì-íµ�÷5Â_ò-lضœU5»VŸXí7A"(T l!!€ÉAn-ÄãÚŠ¦$…ÌÀE?ÈÄ~²!_2šJ(48Ì{·q <™ª=F4ôwuø’�¤�Y)QLAXR±qCQéhËR5 ÐÃX�néZ­r§uå¦+ŒÔ¾)»ßˆA(z›C�shÌWL`{ø 3]Ÿ=r ;w^¿)�S ,B" t¨µS%3Çì)ƒ‰D[YDåj²ÌÊk=Ôþ’¿*¼­pw!”£IYJp¢6 ´�NJ¶ëN™ · þ1£-êÌ|Â;̄à Ó~}·½.¤þo——Ý’ÄiŠT“ePY¢J\”¸„®ÁÂü±+y*nìÜ,x"ÛU7ì6º 0 Û®­ßözå¢�¹�4ª7P;ëgê|6jcn�% ! («Ü6!µÕ=2ròæÚa, ~a‰}´�Â}$mZD�¾f*`ìS²¤dúÇ”y¬{äÚ�3Önœà懒3„}›%Ó¸Öá–råŠ36Üþر+Ö,bÆþž¦_Þwüç/ZûŸ÷�°§»5 `ßÁ–=]­ ~}Ï8x#{)E äç.\»tÁöÏÝpá›ûÚNÒ ³· ÌI*ú†‹{{š­-u´ ^pâk¿~ð„ûž; ûž›7e\ßGO_¿âÑcÕ¾§^�ñ苳˜±³«å·�,üû‹Ÿœ8fpWWk¾÷.ÀÒ#v¼ò³ê߈þ÷í§ÿòþãÕ×õ[§Ü÷üiJ�½Ík^šuöq[K•¾árgo3@‰}CÅ}ÝÍV°J`•8ª$aœˆüé=ou¶Û¯zzÁ—/}|ʘ�Z[FOš·ý®§�ªDo˜óÈ‹s®eÁëí�qoŸz³´x|Ó¬¥×]KèYc¦¬ïsqý/›g>õúLnyt‰ÏU2á•]ˆÕ˜¡³¿‰€Þ¡R*EgóÞžfÓ,h\±v¡ºýÑ�sÎzuöÑÓ÷’`–¶*Ü<Ø€y"öö´î:ØF„×÷ŽSa³¥4zå©/¬xrÑòµÇI‰ý}Í¿\}âÎ⦇öt·˜d‰QÜa:É „CÄM^e"tƒ�ÓÎ`0�sXª—{ë±Ìİ3ÖÄ�à"Õik[#¡ÑMšÚ”�Ç_ëDâ�â„ Õ€«̨BŒ „—(dF"‘2R@§P{Ü2@j7iÍXRÕKgtVKGSm¢Ê@jÖû ¨Ü¹™Ø`¶#:ˆ²ª¡€(B€‘Z— ªv´ ¥©†^Z©wtc[&*@ HærM*1ïØ$v>V½ŒF3fö›‰Y"‘TMÀ�„”B„ƒÑѰ©)Õu(>?,b3'¶Ã–”áA 7ì१ÿ6QÌôW=:u²Ë"ôÕ¦ïzºØzx…¯+ºQ­G g¿åÕ<²¹æ¤™{d 7Mb§wÌCôîþ�)“ô uXÁ,†™WqÀäPàÿЇZ/ …†ÚDBH‚ ¤©*‘,«ÌDL¡„¶H# »€—é5àð��o®˜äÝ—‚ü¿VlëV2�"M¨M.¨ÈT�H‰ÔûnØSçñ n•ÛE𜉠FîDY¾± Ø$Y<²¬€ÙÆëSÔFL^³v^°Ž2ú­y'˜§’ˆt%Iˆ °¹í,�Þ™“íë �ŸLñ,-G€ÝrnŽ(3�g¥ä_è¾ä” ÄÛœgŒ~-.%©Û2²ðˆ©š+Olœ©~=ý˜7¾tÉã�l˜3ZçyK^{pýᇆnqÛ“þæG—…B.;ò­‘Ñ ['OÓÿµË½í±EO¿:Ý»ž6í˜cª›w�½ê‡—MÛ¿pÖåjfŒïÙq }FG¯ÎP1:ûš~¼j2Ú¤ËOƒ��™¹·¦ Ì�t0:e×Þ42R�F*¡½Ëö»šWœ¶áoÎ~îúßžýêÎ Šþ1ÍÃSÇö~æýO}ú¼gÔu‚œÚ<ýú´áJôÞ£·ÞúÈqó¦t6—Gßx€ßœø×ÿç²PðÉ Þ®Öo�2yLß×.{ì¶5 Ÿ~u† NRbÓÎ F<Ä@5 ~qÿI\{Ô‡Nyåë—=üÅ>qÝÍçoxsòØ–‘zdZÊ£F«ÁÀh±\ªŽÆQÿpI‚¤Ìä`=éÀž=ñà¶}cö•30w´ –¢xÓÎ!ßÜ3¡Åãšôµº¹V§W æöò`1Œ·íŸhƒç¶ýŠa<¶ip`´ `o_[5 € A9àDoþ ö¼DÖÕ ÏÆ™ræ …¨ÈXãží˜ùrÛ™‘˜æákÎyêÜ…¯�oPŒâû7Q QzaÛ”ß<¶äû»û£Û'ß²fÉã›f%i`lËÈÔö¾Ïœ»öÓg?­å%äpµÐÒ0º‡Zu³äuÎ"kß“ÚH›FGÒrc`:íõÃìàæôU×».jl Ô!mºˆòK!"PjYeà—Mz:`Fìö@”AR@K³ê�9H¡v-!C•yí¸Å‘㨬‹¬'%-/‡A[z Ë6ŸPXJElÖUæ¬!? �ZÄ$„‚×�F˜T:Æ Å~]¯áŠI¢¹)f5.)Eh.R*yûVÄCLº0àUÒ7AX¦T¢SŠ„Â„‚X„iP DP”R66è�Zjv_3�mx ˆØÕÛU�0ÉAË*­ι;«ÕÊÁfX¢T’tvPII+‚Ñ#k@^ù«Ý.PÑ㋌ûöj¿Â©–e´S5§s¬;j½±™w113( –¶e†‚à0ÕÀ€Ëâ�&ïnïS ê1ï””B8A$D˜YíU’²Ô¼cC©1d#oT`%*2ˆùPŸ-éöäÿ?è9Ë•w<(+y¨w>!!€ ˆ‡LaJ )bÁ£ AgRÍBÅ�t3YzÕ1õÊIoñ� “ÙN›¡µ¥µ m^™%ÍÊj­ÊWѽ èI§D)„@�ËmWÝÿ5-åT=�°cÝ_k“†'°š•oÜ��6¬d¦•tcÙ˜Ëz–ꛫG’ ¬0O×+Hvö6²D*Å¿Ý~úêõsìc¥¤ÎÞ&€â4¸aÕÒß­9æÃ§½ø�O>ðVgÛ—qÁžîuáaºÏ\ˆG_šõɳŸ_»i枃­¦wŒœÙY¾g� %Ñ—Ga è˜"{žò�d–Oa¤mÙ3nh´èóQ5'�mðPbÈDkÕv%ŽR³šP�îî/?üœó¿ºò©#O>êÍÍ;;vt¶xÏQoþèê»Û›F.=å•…{ö>»eÊÐhôNõÙèlxbãÌÖòèß_üÄæÝãÖ¬:yÎă•jðÚŽŽ5¯ÌªÃ;û¸tÙ+_¾d�®WǾÓv~ùšE_»ù<öÒ4Ü7DÉ7¯\í³®±7ªó¦tvõ—‡«_uÔ=³&tŸ¹ð�G^ž}ÕÙÏ­}mæîƒ-J¼©ß½ãŒÕ/εŒL%èmfà`ãêõsÏ[üê�OyÊ‘omÞ¥Õ3X~rãa­�£_ºèñÍ»Çýè®SæL:X‰Åk;:3]Îzl65k ¦ýM7ÞwÒo9î{Wýù~øª]ΊŒßŸ¹zÃ{gÊÔÙÛ8¡u0•zU¢”"–ª¿S�¼› @zÊB†QuÒy;µj”¤Óx^lðwÕ‡€{¯ÝÆ,•�ô0H$îh Ò8ÎÆ;2š¼GygM:Ó×f¯ “ÀÚª"¸À®íQ^ÿ¡‡¦�ïýì//ݸk‚”týeNhô¦ã|Y9`§ÁOî?åö¿,üÈÉëÿ÷Gî{ë@Û—~sáîîVfNY|wåY½dÕ’Eg£Ë¸X˜Y ¹=6(¸¥\V½¶s¦6ð›jý‡M¬'f&¡“|*‡§Ü£-êÖ&#QA©”DfnÝ›IQ&XY� †$¢˜Ò¨Z%ÂÈŒôR|²ùT+’ †ÔY;t²idM­}I»�V†[<;÷Jl�†/  �Ù¤«±!Bš Êâñ…Ðm{ãˆ$‡^Ýö»ê(h)‚™wí@¥Ÿ…pjeK'Ú¸nM%Wb¤œ"ˆY$"Jâ(6£#ac9‰DÀÞMê‰&Él|„Vd’Ìiª¡Um,4k'`3*f†±—iÖUÁªk ójŒ"Ø §'äדØ�c¬d,Me¨YüŸŠƒFÛ4GٌیÎkU´8ZPIm[jxâï¡U,ïƒíãrà'kûÙC+¡"=Uû�HX#P((€ •æ=8@)š–ØØµŠ1m7*õÐsI“wòаÐVÿwŽw}¹†¨õÚ·¯sW€D(HŠRNU®ªU§É¶ç«µJp³É÷ëUæÒ:!»µ�F:Ö‚ýŠ;í€\ÜÛxËåµp©Š·e�…õÌ ÄŒ”•ÛYÆ`µ'‰ÃÊŽ¾z-Ö?cµÀËg[y8ÓWó¼gÈô…5Dt›ê…PÁ6åo4Šñ¥§¼¼³«í�ÝcÁ´·§yÆ„ž½=-ij6\;Þ2ô5Þ°ê仟žëW÷Þc¶-l¡bGßPñË7½OÓÏ®]yÝå�]÷_ç�V šdbP!�þ“÷÷4ŽT£ùÓ;ÿ²i†âÊüé�Õ8ØßÓ¤.8lBw)ŠUfú°ŽƒqèkªÇî·×ñ�fû¿ ÌÄLª.™<�d‡ôöVÿë/Ìûà²W�Ÿ³óÄÃw®xìØjضoÌ�>iýÖÉ/½9i¨R0®e˜Ë[øçg� `î”®k.xª.­‡Mè�>¾çÞgæ©Á‰€oøÌÊ>³Rýš¤âÚ/¼ç™ù5�áí�m—}÷cû{›|2¦yø·_Y�Œ‘çàHô‰^¾n³ZGHA ¿ÿ×¾ésH¥øé½K‡F‹fúßu»o¸øåÿ¼`oÓÏ?{çuzôk¿~ÿH5ê,ïíi™1¡{Ow³”»K3ÿ�õó.\ºéø¹»N<|ÇŠ5 ãÔ™ûÌŽžéã{î}öý6Á7\³ò†k¼.ÿ⢻u—]Œ±Nuh´ðÚÎŽ#¦(Eq÷@ÃÞž–Ý{zZRIÈ©€1s‡Õ;¿ÅK)¶w¶�qÌÖ¶Æ‘�°+í�N­½û×¾6€ Ì™ÒYMƒƒ- ¸À´ö~ 0h�£Yö¿¸c–rd‡u쫦ÁÁ�&xÆ DE¢ž<.8Ð+{úÙpÁäð2Ž(×57íkg¥³ `Zó§üa.Ëh 4—GLÛÿ_«O|iû$ a:ul_œ.ÿ”}º.iÐÝÇ�þ¦ŸÜwêªg�ºí ·�¾`ëmO×=XÞÛÛ {™âXÇL§–óÊe›™z?¶† d!.™d`u\au÷Õ¼K‡!†Ílt@�4 ˆ„z/&Á IDATÍ% AB�Ò@¦ñ µ7¢­©˜˜ÜºKOjšÛ–ÙBK ‚°w/ú@¿é&mP ÍÕI@¦¨Äœ°D��HD�†¢b ‚BsK{³BÑæ€m•„é8ƒ! B SXï…P7n·—ÌbKç/È蟋®ŒÁð€à¡;W–í»@£a™9ïìá-—$v£kçá¦�®¼ÆH‚µîשˆToåtŻ̠0 b³Öx�¸7Fº§Ô¥8óSvì³ÀšT–|¯’B¿ù“!ÃìÉ µ'·3yÃ�l[ÚÙ—¥Ãf·…Z~4÷°ï;Šüõïê¼ÿÓÛåÑ™™� M�js" Õn€„ª@œ£›A­šÀ`çÐ,–dXç»TÇøØR£T�3*fKåafîÎ1ªcªwæË')s¨üMèU’PÛê[1åéÍÉ€á­&Ŧ³ÈvÏ’�ï¿¥ÛW^?ÙÈI&ê(2¯¤ƒjÙÚ›‡çLêš9©çÊÓ_<æ°½_üÅú‡K-dÑׯx¤¸´êéqLó¦ìh¸ãñcâ$X2w÷”q}¶N©F‹çî.ãƒeÛ�¡J¡{ Ü;TþÎígüâów~ìŒ ¿|à%ø¡Ja_wÓù'¾öÔk3zJ¥B²ë`[WÓª§�üësžÝÓÕúÜ–)‹æì½êœçV==oOS)”ÎÞ{åëïY·`Î䮫Î}þñ—gíën‚—¾fSxä÷®¡Ï�Ü¥ö@00RÚs°Å빋ãþ´ÂP%2Nï,— É®®Våp q)Š aÒPŒ½‘lÝ;vÓöŽ�žùBC!yæu]ݱ««õg÷.�Ø>xƱo?oçì‰Ý7ܽŒ�m{ǨÌôàh1M²9u¡�—œòb{ÓÈEK7ÝóìXÒ�ï>ù©M3´ã•ôúîñÙÛT(ßV=�·ÁÏMéCóA…Û4?¼óÔ•O-è,ïíiþö_Ý¿zÃÜG_ž‘ Žº{†þõwgÜô¹;?vúúÿ|ð„¾áâòÇ}ýò‡û‡îZ7?‰Å¼©Ç· ÜñÄ1 ‡mÝ3v㎠uÆó …dÝëÓ­EB^zòKíM#-Ýx÷³ó0Ó�ï>ù©Wg¨^H¦Í»;ü^ˆ@~héË£IôÖ¾ö�ÑâQ3ö]qÚ†u¯OïnˆÓÀ�Qºë™q,Ž˜Ú5¾uðŽ'�­åFÎp…@kãhȦR\ŠâÑ8Táü�æ_vòK×_¹úæÕÇ÷ —¦Ží-<ÿÆ´M«ž9ê¯Ï|fOWësoL=iîÞKO}æ±×Žìl2 Æa(ƒ@†"à¨g¨iÍ«Ç\¼äé}­wM›?eÏÅÇ?óèÆ#»šÕÖÍ—F„¨Hq•;ÚÄ{�zýº‹þ|ýmç>øâá°3Ýh+ðDïb?Lµ�YaSzê'Ùoe´ì/Ÿ~ô–gÞ˜.™>|ò†e‡ïX³é0/¶Q&a Ã@ Áºj™°dÖ®)cz7¼5y$ŽÏÞY.h¿Ñ7\ZþÄâ¯_²º¸t×óGÅ11¥k|ËÀO/Šëì)i)sðÚë!B¢>Y,³[&²ÎÏÆší–M»ªÁ•[dj D’ÒÐt×!<–¶â1½�@­Häj[±Ô#«w†�yÍ›,º_ƒ u�H sŠLºF5i2èÌY§fÕI§v,CtXuV×^ë l¤úY $­0WhR{ÐP ¥Ñ »@Ð&�°Ê’› ÐVF p  ]»­–aÀ̶’JKN%U™2S�2¥$dqP Ű2*J¥4�ã¦ZD5$Y Rïùa†~ƒO*Yª·Å sGND +Ú=÷i²ä6 ªÙHÚ¸ž,Ö7¥Af@áÎÔÀMÌȵo‚”¹ÌS(Î|Ì¢%Nê$›öðRJ˜wB M8± HɱC2¦ï{=– È$q8ŨM°�rÍ}Š­’õ¾“$tU�Bª¤$5+‘-§É*˜Í~A˜¬ Hpž! þ» ù¿wžßî–Ú§*�pš’No«�0 ŠD qEPUd&ÜtdÏë6¹Á(L*C¾_1 '©Mp1í[ØàB™æÞUÇœ¸}¶0³ê¦®$ Ë� ˪J"›wGg�+ýÁ- +|\dUN;m‹�kY�[Lo Ù%hŒ' ½aƒß-wÂ/~òÚ‹žêìi|rÓÌ¿úþ‡_ÓÕü§µGõ •>uÞ3Ÿ:ï"~kÛí�.”L¢0ùë÷=;{ÒÁ†b²³³õ¦{OzôÅÙµÌ|å­ 7ܵôK—<¾qGÇ_6Íhh´ð�güãG[yý-A ïzjÁ?Ý|nœ„¿øó C£…¯\¶f긾½›o{dáÍ.IS�P¸gÝó¦øâE7¥’V=½à?þtªÞlÄ䨞%,š½gÕ·n±_Z?÷šŸ\RC£ûOqix´ð¯·Ÿùõ?ºòúßh oyßÄöÁ[ÿaÅÌŽU’±á†íìjýä¿xËÞqêþ8 î~úÈ_³ò�k�Úß«síï=zÛw>ñÀ”1}£qøÂ“×¼<ë`cž€Œtu êüã7_²tã¯Z²xîžßþÊG^œ]ˆÒm{Ç>¹ifýû¼hP*&'ÌÛÙ3Øà÷±©¡ÚTªø×“wc¥ˆ€;Ú† óS `gWËή7w×yK6oÜ1Áqdíƒ^Ù>é'w/ûòEk6îìxrÓÌ?¬=ºw°tõûÖ]}î:"~«³}Åc õÎÌÕDÜýô‘?ù»;ÿ¸ö¨ý}M0ºúþã_»dÙ+¿Z½dÉœ=·}eÅ#/Í.„rÛ¾±Ol:ÌwÐpº f*’OžõÜôŽÞr1Þ×ÓôçççÿôžeÕ4`æ?üåèÞ¡† kIWçÅ8c6 …äGW¯¾àRÿàwŸuÌ–r¡J„…3wæ}y³³ýê/Û²o|$sæº96â�]m7>¸ô‘�ºPä÷ëŽénøÔ™O]}ÖÓZ^k�K½DµO†Íêe¼ªaÂÐB¢2"Ê¢JrÅ�ä^µ¢×Û6Xa5;£'µ5VÐãù”Ë"ìçªjÌMþ»ÙUx‡9d4̲‰’r¦¤zá6–YPÀ€09j “Ï<ð‹Tl3ùƒ�Þ¬l ¬æ¥‰¤Ð�ÂY"ŠY¦ñ hŒÄØq‘¤vÈvõ,s;Õt°}ë ÚÊu÷`ß›f¡y‹§¼ªõ.Í$¥DrÊÌ"%ÆA�ưPŒ„G‡åÄñ¤w6ã“>WFèÞò>Fšjz}ií§ „$[­š¤ö~ìÕE“Õ8´£³ÆFåLæËM‚呱[ã42{k³îgš,E‘î¾v ú¹†Ì„P ’ŒD:šlâǦcj'3309²sŸ UdÊZ‘½¯öM äÄX¯PÊ I„$@H¥LX¦ÐãZU[b³¤ @²FA$�Ý7’ËV{¿¼ö~õ£P�+k›Êœyw[‘ç}T-Ë„˜� ˆ€12…)Ê)*U�D�åìÛ”=gÂ% ØÔêuT-'·Á îÕwã–m�Âq&ˆÔiÜÓc=7 §)‡D$BPNYV2#4ׯL‹T¿NldÕ›-gýpgй“¹i?÷Ôü`wa‘àLqYýÃyjÏêy…ì™·Wg¼9Ž“qqJ:µ8Š”‹ñM_üæí¾û»3òaʘ¯Ê4�Ÿ½òœàÛ9Ÿ›ë›çL8ט:i¦  À̉Ý7éŽoýöœG_:L];oj繋¶<¿uê oL©F{î³ÿë#«ýâiuè]ºÿø^µfÿC§¼òÏ}ðÑ—f]÷«÷7–*×^¸öâ“6¶”GIW4i*$Ó¿ýþ½¿¸ï$¿©Ï`í—/y¼öª§Ë×,úÇ›Ï÷gÚÔÑÖ8úÓÏÜyê‘oÖ�36î˜xÕ/3ÛMê “•rÙ-xÎÚ³&öÞü÷·ó¶s{y¶úá²S^þç�>øè‹³¾zóû›J•k?°öâ¥[êwùÆûOÒ gu@©.¼áu–ºC(»ÆÈ/šæ\Dzh¿n÷Á„±EjkC©5”¨÷ U‰¼+_ä=R‘#묲¶#Ž™€ví“I’ë’Hdƒ¡#¾¦ëy7Ëîzÿp&ÀÆGùÙs64s˜™öô qÊ(C= Xž“M†ÊØiRÓ–ç? ­‰l™¨7£‘!‚ÙT`ëçÁd@Y˜+¡Ü¿ð^ÊfYA¦,B”1‡’áÇrô ËÁÑìê&?B»ôˆ^‘)€I…Rï0 W a7Â@M5!\ÐRCƒÀDµŒoÖò4…¥^HÐ èk¯vȪ>DRå @ P ˜ ã Ñ(ƶM¥€‰À$!õª’l%« è–1m�(èïÇŽ×áaQèùWÏH–LIŠD"‘” L ’°(Æ XŽŠ ae$à8?¶ 6…®ƒ"g¤Á†®†š‹AW§T=Fgd @ î-T}IÂé\h‚wIM”1¦ªv‘§lSL.Ê×iÍ4`äï‹ß—š‘¨ý�™�½›‹Ãææ°j—ÌÆû­JFC„1 KÞ>„Ø�—| Àdš0'u(÷ «CªG£ó ¾q½¬Ë•Ú“ÂìWb¯I™S™¦ÌÒØ”5v8Ìãcî:Ô¿}‚ÙYß;]ù?9Þ�½íA €E`ôH•U’ú‚mèʹŒôÆ °¢Fœîyêi‹V@Ö38¼—ÛôH…‚ì{§Ò\%ÈPÿC­‚æ|dnÕn†ý¾RfÚpîN7à–zPhYbgLÈ¿ /d6n'G¬ì)ûã!L9‰qÍ•&š{Wx^ÓW2>Ì%qT@ÑÂ>ÌúÄ•­ÎÏ™Iîk~BÝÐÃÈðÍüD†~0pò‚íÝ ë·N„™#ܼ«có®2|ðù9;:Ûj} K¼¹¿Ý>ú/›¦ÿôž¥Ë=n¨ U¢ÿu˹ß^~Ö¬‰'�(c!tWãD<³eZ–ã88P~ô¥Ù_ù¯ ºúËþù–†Ê·?þà®®¶ºŽ°w¨ôÉ~xþÔÎ)ãúƒ ó2FÉÔ;\Ú°uòÀH±Ö­fÃ�—Î1&Î`Ã@'ûeóßì,¯ß6Éæ×nšñÓ»—ÞöØqC£ÑÐHô�[ß÷ígÏštpR{¹˜Iã$X·ej&Àè¸îDf¡…+°UR¬YFïz ¼”’oð›0é)mîðgvHº*Á:eÏéyI˜Ê˜uNþáÔ¼–n!"T噓Ůý¹\/ÐÒÈÅƒÃØµµfBÛ _5ŽaPœ •H9Rˆ”� £ P …€Œò„Ž€Ù%ìÐÈíY†lÌ ˜‘¤°úîÙÀ¶L[W½³Ñß»åB Ãù>/±íK<úœ3 /Ìd+L­—5B¯ç~LæÜÿ� ’¶ðˆ´í9·¬€.�52Ìó6HɃ(ÆIÖ#ÎùÃ-£(þ¯uÙQÇ‹!UÉ bR[Â�@ˆ ˜‘B¦ÌºòD)£©,±Î*c×nPdŸçmQbÜà;×Rÿ¿Öbßåõ†h'䪷 „P"d4�Š�Ês™lb°`À®^4Ï/Ôz§ ŽñܾÓVmz®—@–K0½ñ"�¯[õ¨mɬOaãÈÔ~Û (ÁË\u‰� ËÉŒðIe�r6NËŸ25ó¤žfæcõÇu˜éÄ?ØUØ'H¸�[²%òØz¨ÞûétŸàzŒò~÷Or͇LCÖ÷PîN“Ïî0ùlòÚÌÓPK';ã—jÁ·4K“e…õ.¾<œËÍ®X�l.VgOîú·«î_þ袛W/†ßKÓ„O{ýƒ=MñY—£à�¶˜êâÿë’“wҸ·¦Qbpps©:{r×÷>qßm�-úõêÅunð�¥Ïjxv\«JÖòYã€ÌÜFFåü{ê^ã%uàbÑ¡‚£ã†šÚœP-ã5œIáä“Ù�‚MÐwU +¸VTC&RJT+,"ÚÓ%•fÛ\³×±\˜ôlô`œ�¡!Ó‹œ ›YG=Þµ‰}*ã¬Ø5ïâ™'ãÓ“³ì6ž—²?e§útã *ÆVeÓDÂLËyÍE¿'0y�9öY~x&�LA‚û(©ŠÔBp&îäÁQ›�®g„.Þ˜àꈢ¸ö� C½’òU^·ç+!³ðJ"}Û¥ ÍNµÈt@3š¶1‘ TeNS¦tX×”Š!#«Ædº–¢9ÿD·”Q ix˜·oARUП#ðjn˜S M§êµl1(A�P$£"ÊQ±†… ¿�"JÇ�‰¤41Ù« lo ¤^ßÞÀ¡@o?úôÈVø£ U^B²¿³�°ü1Ò‡qNnüééGagŒÏz'#?†ç”Õ™ÒÍùö‡½^kÄ$‡¢±í� .“mQ“:Ù^FC@½Þ_±Ùd˜Ó4fµ®$çF¸Væ9"sç¼ÒÞ·íÕÁ$™gÙ»ˆÔþ€nb™Á ë½J<_’•hæ|�0¸¬ê; ìÿi¬}÷Ç¡á™ã‰ �ó@,¸"k3WÀƾ²–v×–a‰_/”›—vŠ`íÀ_îb7“ðNýôDá'¶Ujû?"‚”Ì qLWå s>;Ã]ùxš“¥QõÞÍ.ÕÒª™úg V¡ ~WInã§¼)j?~å8äÛt µXËöŒý3F›3—øCsÅ%Î5cûÆ€™Y·Âÿ`Â6•ŸP¡P½Œ¡ŽÂ¨V¡)ó×Y§¢s_º”�0OjXqÝòö¦‘ß?qÌOíq%“üˀ瞳LªËº2mZßsõîƒþ[“¹|Ç»¼<ïm¨÷&£²\˜ÔÞûW—·7�üþ‰cîxò81ÛFôhË”)šèd¦¥Œ¯Ì7®Ý²j�mÓ�ÉõYìêœj†ŒÑš“ì ¿FfY.(¨b`õªUta߯l¥ÈŒû½“Ìã­»É0_ÇB&Yh x”'�¥®{ý‘¦'Î5L‡ :Ùxc9ŸÿÉÍ)pª£‰ÊÌ9©iV�± ø=RÔäÕŸ™í»KØÖì­äu6@`Œ‚ã(îKšÇ‘b+2Lñ¢1vó…`e" k”† – à �´>Š@�à<‘¬ªeà ØÓ?ÐÇŠA%¦‘ê=ï áÅ=ºl4`†ZéMÄX«'G¿þ`Dæ›nR�(–2I$ñ¨À�m¢Ööˆ‰¤r›&rěΰ�Àf€™[Q 1<ÂÛ·pR1î<Ë…»Á”J¤R’”"ˆAF–‚¨aP�Ó¤‚ñ¡˜³s l~R \M=A™r’¸PêOÅcpÆâ'\tZ×2ÙéCÎ7³iIx´‘7$ì¼DÆ;û(ÅŠØS_ß­¨ký»¯q ‰ÐÑÄžìU ¬ ôB¨L?W¼Ý¿².Ã:A'eïÃDÓY£9ÿ¬ÿW½6ÄùÄÞn¹éµ“I{9gÄœ¤ZFö=S‚ˆÀj!K½Ÿ‰ÁÍÆ\µ–8�°rÐŽ:ß›ú!õ¿ ²³¸üíSœæ ¹ !lFêfïíT­•TûÊD)E’¸"PÑñHßm[öóŠ ¨fñ¨gí�†cV \@Ɇÿº2¯a%åb³ÎÅ)#M9 UñP¨OÉ|ýq=Ìô޲_ ý6…o:c �|–Yeñ��0ÿ?ö÷0ÖOþÐßZ½—îµA!Ç +[_"ynåQcv¹‹ë´ooÌT%˜øá#ÎÞ…,Ê`Oüçê¦>j–©&×Hdß—ãXÞ'Ôt×ÉÎÆÀŒBÕ»:×Ë®,x×ç�ôóñ=Óà;‡ô)ì~¢ü/ùŸÜ‡l_ë=Ã�Ì–˜g^{­Õ<,oØö¼O*‘»K²�œÍÞãÕ‹© ¢– (q¡w1˜C& {ŽÙrÏÅÐûàjÍ0nÎqšŒÆúŒQ_‰\  NÒ$eBUК‹ÔÚ!±´Ê¦âŽ“»â›mR #¢*bnm¥#*“=jj3&ªŽ¥‰3RDÌ”€Š’ ( a±!ŠŠ‘Éà#ÑÞJib‘ÔhÈ)š•[׌¸ŠƒÝ¨Ž2 7¡&Òoµ@[ ô*šQ.Dûv–álÆV3ªâ±Ùeü�è3ØnŒèÜ ¡óÆW(ϳ›~Â#”‡ƒR!jj0厶ÈÇ(¿"$ 0®RbßÓCxr˜“´ õšòúèëš¶+Ÿâ¼«¯ƒÞ&¨ {2w=êÝbÏú¥JöW�á–j£7ú±½tµ4ÙÖÕ› ܲÚZºü‰”·Ïo½HýÎG½ök[˜v?f0¡*ôÆþáq0“~…¯:Ö'‚¿IOwò3ºîªµ|¢¨Ö¢@ P8ZeLÓœ»=Khæc�à B]95uËÂÕg»¤µºÃ�Ëõm�5)7×¢÷ß3|pUe†´š3Ùd§� Îõ€¤qî}ðîóï2¾G‘n ókû`*z3¸cÑq@‡8ýÄÌL¾±JÊ_ãwÇ^Éæ?v¾ÖIÚg�÷!«'*˜ù­™›�=¿u(Wõö‡åCÖvr.”ë}ÎÈ¢/i]£ç~wçÙ R2yA/QZ—2Í’Lø%“AöRÊ.ßì™�Ì�OŽÖ3�;dµÄ–=„wÊb:ÕS›Ì�Þa2.¿hÿ¯Bµy¬"Þƒ¼j”H&\fÌœ"vîM“”à9,×;2±õòOxžŽ­l¼vt’ŽûêËEF–g–_Y…4vI™Á³ïʬs7PœiÇMèÕÓp(e =²Xd"EòäÅÆ�eõÈã³ýªnt„à ™ *"%ƒÂ€½îä˜gÔ�€ì:�ûÓ¤! ‹Aÿ(¤Þ/Dº¬¤P·³Í(€¬v!0JêuÚö¬�P " Š(Hâ4M˜P i„[ Ô26 Cbj¯‡/ÙŠD�P¬æ›U�Ú­�\ yd;^G<š©Ò±:`ÿI •Ìffˆ„)%$AH…Bè��#IÊqÔÚ&Ì–n€]p©\.žhã($©DšJmÁ&(y ©gÏ 2¶òòŸå=ØsþžgÌäb ß”ô`½O&¼»\� [îG†–-±ðÜ�[øæT„‘²CCˆªÅg&5<@ 6+ 3áH¿)ÈÈXK;Ÿ›4èg;É»Ãi¸×tæþ̇ܲL�È^Ÿûìd�J©¤£6¨$¢ˆL 7Ë„¥d¶Ê;zTZÁ¦Ì†AÄþkÆ œu@!;Â7†m‰É8ÿÚ´ôÛ¶¾ ¹_Ý9—6ÕçSÈ, ¡Ô»�Š8\!JLi%û Sæ!¬Ycá]›‡Úô9_d¡Ã½v¶­œÕ£A›¢WI¥º“„¬J ˆBADF„´ÊH¼U¡ì9|òåBú]`0B4�v¾ 5êå…í„ûú>6ãAfË•ù�m‡ýØ0œ‘‡‹—yÀãýFy¹Ô\‘;|hd#«ï†üXîÇ]-W“ÄÉló¡lðÍq�3à8c T�V«.^b·žOgO %ƒ½IÓØ–óv©,Ad<‹–+«?Ù¬¥u3Q dT–9L RL@(rd‘G³’¸Bz¦NÏNý‚ÆÕ±Åb)#©`¡’ÉX/ø¢ŒOÓÒQ:"È¢ ,°U LƒÓX½ô£*hˆš ÜÖE!¥ª v5X~–ËX°qÏô~ Ìm�(„42‚íd[*5뜛fU+‚T±˜bF $L‚”U IDATD)…ƒ°! ¢� ¥•x(Ó„@i}µ¯@žGðb(‘œÄªFÛ9!L”ŸºÖ<'ô°‚hRûžÑYQëÊë8X+´íÙ˜nüœ+`«†œý�±<’\ˆôÛe`(׿Ú�f$p’Ú—®»—’0aßú:ÿY™þxe Ž)l¼zN‡|ÞØ>¼KHš™�÷ZÎxiÌ ë’‹¹Cˆ�ƒ-àv,“÷‡ =N™l¾Þid÷E@ö çë3ë�ºæÿ­=Þù< )! 8P;“P�R#q TâÀïN%“#×cÏ5;N“ýn2˜äB¯É4ä<ú»c„±içÔA R)SI� �ÄA(HY'`"£ÅFtF˜DƲ“œªçÏ×\]#hçd¼³ðgxÄ U ¨’ç¦<Ú²Û¬²mÏ™‰}ˆöQÊ:ýq°ËÃxÃ`C Pñˆœ>!è쑽ö¯Y ²=7jéjd Ø$ä´‚�ô›JèÌ…6f‚_Xá �É…êlü&Ó”·šŽ£Å9?hFÑ=‡".§QI`v öö©©ÔËó*'—ŒÇ©±ïANüó¹K­£cïçÚk,²¾®ÎƒÙ»2ß‹z�L€a˜wè¢ØD"O|Neü³�a6nÒò&g=9Š)à ðë tM!ô~fžœÝgå Øõަ`ÛÕGi0êÌ>“1îPa/ÿm4¦Ð âŠßB %Ú×%Ù¢RX×@–åÎ`œ-;,á‰ÁUS‘+~€3�`8ÏR¶aŠ­^3:ÛGçÒØÆç³s’6åïjó´µ’ð"S •�iûT"a'µL†Rx….{ï{X£áÖ–í`‰@DaÒnŠúb*pRZÑð�ÉPéY´v)6ÌÌ\áTÒH9*¦±`’2`¡òlJÏóŽV YL5eÚÓ‚� ¤à�©êƒ*"FSˆ–ö(*L*‡­ÙKB8…Ð(Â¥¤�¥‘Y­Ì ·4" 0Ð�]o ®*íõL^ç !™Ìjá#ƒ!1HJJ%"à F¥0*a¤œT¤Lû Æk¢X+£QGxÄi vCB¢2Eµ  Ul%‹ ¬ÒŒÙ=N:5öR-ì8eG}ì Nü8BÔÓjç‰Û`y_²d'ˆ¬ë`fÒÙ¹œw÷hõ¬‡D¾‘{4Ù &fA$PuI|7ˆ3Ñß{�§Suݺž¨1-hÝÐŽÐ:ßl1›wäjþkfAvæ¤% {—X lP·Hf°d¶)E"ˆ’9e™€¥rMÆA¹¹e‡Ö9(â3È< &a~©‹¡ße1‰u¯‡ŒUþÅz4ïçîRûJA*!@ P‘¹()!TNkò4^éÁ³±,:²ñÃÇ,<”’1×|è÷6.¾xugV_�§ã„‘B¢@ P™9�¬¨ztç¼ØågØ|¬‡…ÇcgCµ±Ñ1UùaæŽXUyª.Ô­�ó?{¹oø³ÿ”±õCÆ;p(8‰¶s†ÕÖ½gÈs÷8ˆëu— Û)w12·8Þ¸Yb†ýëh û×2Úezã×k"ãì<Ó˜®8íÅ��±^¿O›]oí'ï>«¾–R,=â­Uß¼eÑìÝuâ'5…;¼³&{cý²q휡#Ó�XßQúÏÉú´úZQ럩æ'ªuÄìI{.À1T§T”ÐÕÀÚÈÙÝ+ 6PÈhŒÂѰ�)ÑæéEß”lú$ƒ9æ´ŸF"1Z�i˜HµpΨÌ*I"A‚ ˆ…Þ«ÎÔ¦‰Lª²:*åh*«’SID)h€ ÅØ„¦��Æ�+EQ  䓱Ó/YÔv¨‡Åž¦ôk˜˜%‡Z›Ô߃�›‘ÄlòI†”Z„’!%§)ª)R ‰”)¥,¢*…2(Ѝ!ŒŠa)äˆLä¨h.s…¬]•¢Ê:aÖ3µ?Ôƒ q S4¢ågƒ3 Ï�0{y.s™­�EÖN(6mMÞ¨“´Z„á‡l3„Ö1߉ؑE6 ÔbçþòŽ1­R± ´ pöôG‡ˆBH!•¨æÑ•&A�Ä9NY#õZ5CÖÕ´Æ£ÁûšQ�Lì³–@Þg' hæzµmÞá^e¥](Õ4XÃ2E>1 ¥LS™¦©”’A‰ A„ "ŠH£_¾bŸBfÿ„GnF7½àá·f>×oÄÝœí±ßHÝ»ôuľBg›�à˜’*Ç©†4D!¨)¡Æ”"®s“‰É†ÉÊĈ`Ç”™$ æXÆy™éJ­5½°ƒN{¥ßW‹Œ †·8B2bæJÊ K"DP†(2Œö,þÇ•P{ÃNÃÝsýVìÝ‘?ÜØÌÓuþÂè·Íj³†t ®3Ù•§‚<ÖÕ=ünhº½,°1ÕÌü¶½&fÄå¦êƒN�XðæýßôÆþd™VN{µ°ËdÀa|ëà'Ï~îÙ-SSÆØæ¡ßýãŠyS;m ÕèS?úК�‡eI³þÊ¥dÚøžR”Ôá®Ï÷=œ4Ý© :õE;ã”y„-|ww{]Í\é!´CRTs <©×Ü›?cP”í!‡¡±!nn¨ˆz.ÚçïÁ�Æ×÷Œ½üÔïzzÁžîC›U>wK¤—ŸüâáS»Ž=lÏhX2{ç¼)]ó§I@šý=“%�1À(ªGÏØÞÙßZ‰CÕÞQS·w´ôŽT ¿›'".ñ±3¶—‹£¶›…B|Ô”í?å‘—vÌ´}®_Ü>³šDr¹8rÚ‘¯$©˜=qŸd‘¦ˆ.>iÓ–½í gîVSàq"^ß3~¸RÈö²ŽéÖ³5}Ñ©óßüågîh*U²—à� ‡ÿÝ/>TMÀĶÁ…3÷£ÄÜEž:¶wbÛ Ho„rìÌÝ gìY2{g¹Xµ Ó=T~cß86Û¦ór3³VôÊKÔN²Áj;¹™÷îã+4Ü›4¶…°y;ë{Œ%›Xm%O€ž‚°Yp¨­W.AQ4 &„Å•H[brýldm°EXÍ©v‡ƒ„(‰€’ ‚†�D6ïlK¨%ƒ%¤:X¦ú»c ˆbC¢” ¥ åÖ0„dÈT�ð¼Ši]Ti]0 µó®§&@è`Z*RS:x€÷nc �]�ÂR�HYß‘ª}EÔ=¥ ÉH@)# BÅ0*†a¡ A#²ÊL4´O 4u.8=U)$£(N¯SæRHˆ¤1[ݱÂwÞ¬ÑsÞcå|¾ ÐlÀe %›Ü¶Ù2ã5 ¼ÈÍ-»hK­TlÐŒmžOò Ô=Ÿ!E!TËb…�ÚöN{€‘¤\e¿òzêjÕÍàÒ$ò½@QûC°é:ç«Oa"º×ûú±DÿäÕ@×` gû>_Ø…“ jðð¬%IÉ@ªŒTíS"ƒ€Á‰L–lÊÊ”ºè ½aŽß©|á�7Ùh¢•G¼<ÔΞÀú™ÌáÆ^°þ‘)ûÉaJsš(A’B�ÚF9%)u1‰¯ÔÇ-‡‰ì:_bì.4hƒØ¹h²ÎÜËÔ1ú�÷8ã•r_«�arÂH¥ŒAE"–Uö6$� '>T« ùV5É#2{‹úêm‹�kÀ¢.7¨‚›KÍuÒD‹Ì5 R=o¢Ÿò±³Öâ¬ç®øî•ú=æä.«ËLüøÑ7çqŸ½Ð·1kÒì~Õµ+¶®cY.ZΘâΫ“^¸qPŠŸܺ~ÌÖöæáß­9&M…rп{ü˜‡^˜`ö¤®O�·ÎÐd½°ß¼o}¾Lò�¨V7€Ü5fvÂŒB.ïí^ãª7Kæìþñ5+vϲ[Yä%Ö¸yö…àþºçAúÓ¿»ë‚^ %ýè®Sx×)^9Gæâ·Ÿ'QÇüi–uùø–!Kùë»;þê?>²·§¹žª9N^p«7|zeä—ÿ<óƒŸØÏÕ$øô —>´a®ßÇ#¦X¶`ûS¯ÎøÉ§ïjnp(óÛu¿úp ¿é+?ûØ^.)vˆ@Îîèœ>öÀô±^Û3å˜éoõ 5wõ·{Ø[Õâ“wKˆF«Ñ«»§V“PÉ£©4zõY÷O{ GÞ‹Ÿ»`ñsöëήq_]þÉîA5–f-šùæÜ {ŠQ¼pÆ›â4xeÇŒéãºëØα¯©»z‡ÊÿÑG^Ø6ÅvkbûÀŸ¾öëéãúügýþnµŸwtµ^ò½«öö4[û|m×ø¸å‚¶¦ÑkÎ]ûÚîŽ{ž;Rµµ§§åóïòÌ£·|ôÇu|SÙ®:cÝÕg®Ëùüï\qŸÿõîç|öW—H)ÌX×¹6?8»‹úÁß ÀÆ0˜bn ŠÄ}¢P”QƒÈŽ•µ2±Ë%–Â4c’¦*n©ŸÙ·QQ@�åYTìFÚ¥·lÖZ›4 êLîÒ¡c“Ì\ªiŠ$!�1`+I%kþj|§`ö4#† ¢ 7 jn…†P=AJï©lÁ+ p$«gø…#¬8 Ü¡DCK¨s7:w™Dl<"R“°“RRª—ž¥fÄL QiQ! ‹a"Ãr” i0®‚„t5ŒÈº ;SŽZ‡Cf€) ‰€8å4±4™„ {…v»3«rF‰,LRßmþÅtåuSñsŠ{8O­‰ÈÖ–À»Î޹¨¦}!…„`†-Oe–h!8 ¢ŠdiB›íŠA.PZí5|÷SNFo½ä¥A`Y™�áYP½`�ëžäqb͇ÜOÖä0 •§Â6†+%•)H=#‰0«’’”Õ>@:²œ ‘´YV�ö “ÏÖ˜§¿c•ö»¬0ñ:_s—Ã'–@N(Rµ-‰€€`jŠ Á²ûjsñkuØ �²2tŒ/SÚD> `@ÿ쥒3½ð†tKÓy–L�m‘TS)Q À ‚¬‚�Éð’½ZMuÖØï°¯sÊP¨‘Ñ?]ùÈ‚iû¿øóüèš»7íœð�å§èh¼ýŸVÌ�Ü%%õ•Ömžvã='½°e²W=b™dÎë˶vŽd.’Ÿ_{çƒ/¾âÑ…>ß2NóÚʂˬMªl³ÿ@¾þʇÿöÜgü“­Ÿ{Í�/®&a6¾‘å¥:[*$7^{çÏÏ]ñØ"ïQYÈêAMco6FfHkkþÈ{_|è…ÃßÚ7æøÃwï<ÐÂÀ–]ãx~€%s®:ûÙ\WB‘þìs+Ï[²9ÇÄ;¾~›ÿõžuó?÷ó S©¶$` ÂùÇ¿zõyÏ1­“[÷Œ½eõ’;ž<†s Õ@ f]³ÀdTY1eh4Ú¾¿½{ Á*t¶”Ök7säT’ÓT|æç}îÆ‹ZÊ•_}áwÞ]äërÖåúíd,À®®Ö¯ýúýÅH­·Â…K_™6®¿š ª¹€YO®üP¥ðÓ{–íêj­ïÔ)ÅËÛ'ùFAúÑÓÖïínùÖŠ³¿øË üƒ¿YE„¿ÿå)À\ÄÌ Çi&•Âøïκï¨iÛ\±ì‰+–=ñèÆ£þ¼~Éì {›Š£GN[®žÕ=Ø|ÝòOìègA¡”ø¯Gξãé“�òå]ؕ˞8ýèUpPJ×Þ8xùIkŸÝ6ç¾–üýûWþàž‹º‡ÿùòÛï~aÉ×.ýÖGV<ûÆaÿôÛ3+±¨3‰qÛãÇÝ÷ü ,ž½ûSg¯ûñ½'¿ºs"À—.{yñì]Æ•jW{` iÕsGΛ|àÚóž\õÌQ+Ÿ9fªdÙáÛ�Œ`0±ÒRúöïÏýöïÏ�©ð>mÁ¶~â®Ïüç%ë¶Îð“^V|^øö3E@˜8í!Û¾öÁÕ §ïþÜÍ—þðã+·ìÿ/wžÛT¦î}rÜT6Ÿy4ÓšÊ2Žš¶ãsçßûîùàk»§ê–‰?yÆCó&ïùÞŸ.ýòE+wÓƒç*"áª3W>y÷÷ÿté—>±rǾq?»óÜ6z�DÃî= • d–5ÍtÍàøo\ðÄÂiû®ùíûråý¯ï{ýªÓ)‘’W²V›¶�tÑ’`ˆQUÐ�Rs•ÆFAD’õ«ó1ÅQ@îÑ.££µÿÃ'þå=ó_Ó4°¿·õ�Ïž´ò…ÅI*DŸ=÷Áù“öüû}—^󞕯n÷�çjÔo�Â.¬Á}ªÁ3�””0Iˆ”‚TDAÔ}ý’'��¾ïº?]ò¯ßùú�±ÿr×9%AMå(UGl†]¾¿òQ“3ÐÆœJT+ Xù>±ó§=µìðmmåáýÍw>·ø—O-5jöÕ³Ö3iïÿô�¿øÏotŽûÎê3Ôë'5iÿ÷?xïw:sí¶yÿo��©›°ƒA#g¶I“P³I>œ±³kUÃéŒÂhßí�W‚¨àã¥ã^…43ê 5`TSƒ;=ZŽQF!Ó|,ö¡²9¬ú*[�Íd›=(,™Ö S†oFІ9~ëuCBަ,™°MÞ¯†³æ—œËafâT˜…z H�rš°”l“pflÏ~Œµ¢´�—1°Jý¤ù®õ6Ó‹ºùì ø;@¯sd cí}MJ2%) T�¤¸ TNI�ýàj™opõ„ðÄÂÆ³:jLw`ÉÎ"ú¢"Ç3ÎHÐün†ŽV¢y´ TRD ˆ"£Y-4­õ6¶è®9:Ü@·ï«~0@ %Ü;X- ŽG ½ƒ%ÛA)ñƒ?�²ê©ÓÆõ]qƆ_}é×ýò|…}YÁ“¨­b¢q0knÉ!T¨¡w´ e÷mÐ_w–­ñ;ÉY÷â)+v0¯ß:ù[·ž=RUƒ Ž”*Iàã/—3·GåRÜÑ6”Õ]}‰UŒLÖßy33ÚsÉa\ròÆö¦‘ÿz`É ߸þʇ¯¿õs—Vë M^~sâo^œJðüé�9íÅß<¼xëž1Âô“g»¼¦eÔ²oýëÇXµnÁ·—ŸÐìIÝÛ´™­xó0ÖË;¬ëðm”`Þ´«ã#ß»’2RÊè[æ]æ�’$�¦ª’Ùo�²_sœGÝ_F ¾0W™rÈs¿`Õ7n™ÑÑãß°å¦ïýôÞ¥ßÿãé¾FVâð±—gmÚ9@©òŒçßÜ?æ�õs´7�|åâÇZø¾ž&s9,™»û'¼v׺ý# ;ý…oôþÀdÄ/>é#¥¿ýñ‡ìŸîùn0ã–5g._{* |éü•åbåÜc×ïê÷�;®idð©G¼zõ™ĉðtRÙ‘œ7iïø–Þ$ÓÆ]Ó-YfìMï9bã¸æ¾W¿oçÁ1{zÇ.›÷êHR-ýiÝÒýCm÷'ÈemKÀÓRu>¢�±Æ‹hÌ”tÔ¨µÅEÕûÖÎd{w"�uÚº­�I5€¶Î¼#5¥GjJ×ïñÓÞþâ�k7ÒÒ‘ç8üs¿àpm¹MXÌO¦þÀÛUe=qca2õÛÏ¿9zPkÜËþü�·þÀÛœã“Kç>úÊ|"HIJ÷^ºåÎKvV•wœn*^´jæ³+f¥3n^ÂÿóËw­YÙz΄S€ôÖ†I¿úç¼¶®¤$%B߬@ìM{‡j˺{ãv—òâÙ?yñÆýÆW¶Î›|¼ ™þxÿˆ¾°àD〠CÿÜ›£µÄ½ìÏ?]ûóO/ãŸ\zÞ/^½8?‘ùÃ^»hê1øË{sšÛóÿãê�‰ÌO-Ø|¸ê�_|í»ú£=#…m:ò‰_>¸ôsOÜX’ŸþÂõëZ»’ß¼}õì±§_[?uËá*†ð�»V~箕¢C=i/$XJkZ 458péÌÃ7�¿ûƒ�£ÖïI/{ÕÙûí‘ ñ˜<¬¡¹+ï‰%4´å¦ƒCõLÌaüÚ9û¼zãøªÆŽîø«ë¦?ùæÜŽžÄÅÓŽ>|ãÚ¦ŽüySª_[?ÕaÁõçî[¾mÜ·ž¹ª7ûÚM«ºv½ëpÎñ‡/]úÔ;çè˜9ªæó×®?w‰üDöh]飯^¼|û8JÄüO-زpþöª²ŽSÍÅ/®šùìʳÒYO3¡¯i…xjóÂù;ôSÏ­š�Ê8yñ쟿´xÓþáÃ+[.˜t¼0/½~ÿˆÿ}qÁ‰ÆRXÜYYÚ½ëØ ¼Xvð€ŽÝÇ+—mšP”—uÞ³`[ÂËþmùœ½'+mÓ :0´¬ã«7}øç·ÏÝqlÈÙãOMU·rǘ,wFU¶^;gßþS•FÛ “é/\÷Qq^(“w´¡ôO_ÓÞ“vjÒÐúoß¾BÍOä(-¼-‡=uØ × þ¶òr²Às|"ðG«pw:þÜšKkÛÜ4gÝeÓv䄯Âb IDAT:`ùîYK7Ï>Ñ\Þ•Nhþ¿µ}Ζ걵mî:MI~×/–ÜÜÜYð�Ä�½yx¨~È]~8µêtwjjã–ÝFDþÝÛßÿîíïëV^y$”7bF¡2 <7¸|ú�’üžÜñ®(ÖÑ›¸ïñ;ìò)ãÞ›õ¾³è�r3säé¯|bÍ/–\²çT¥èLÆwÚ #Â!Äû’ÉG~qÏ›ß{ùªeÛ&éFHA r«D­Ýy=ñ´ï´÷&[ºò Ö¼4Ïi>” q™Kj‰ŽYÙq4eèÉ¡e-]~9çÊb@GO²»7žñ�®t²£WäÅÉ…’Ξ¼îT<ã;]©d{O 81Æëw¾tàôàªÒ–i#N Ð꽓ŸY=¿£7OS±4¿ëÇ ®ô›eWû\l0À§W_¢Qȉ¦²™#�OzjÅÞéùùä:ÐÒžWG±æfÖÞ�lȩ́ƒ©DDéPI„±e˜—@ˆ>2râŽw½„ëx¬=•ß‘òº|hO%›ZòKKˆ9Œ8ä%Ò÷ž·öºÛ^vý‘qêŸ3úÈ#¯Þ�ˆ?¾ñå¹£�À‹ç¶u,çøòdz‘bMkñ‚©û†hÑÑ“¶ÞdG*–ñ�ŽT¢¥7ið¼µ{âMÓ÷ž?âø;û'ØY8êP”ÖÿT´„UðšÂÇŽØbŒ –!leŠHŽ”v ¤€Å]ù–+kz« ¤ô0w²>eôr¾íI3P?¢5­�î hx�ËgÙ>�s=©h*ï_Už(‡q³EE4“©Pì' �4:öã¤*6Ó…%­é‰…›ÅFeP€=t\" €ûœs °£�‹Š‰É‘Gºf÷0©#V?š4bNÊÐ!óþ£Ú‘g£ Û�Î̬|ä1 À%ærqê6eu²iXõB“E]”¯4ÅmÞ)¿ ¨Áîj–bÖCB¿ªzˆ ¬ ³«ÇÌf|¢€ÈEdHè #$ÉèUR&^ð«”Ä¢OŸP¬>)7T]? ær¸ïø êú}ò#�e¯}4åןY:¾ªéãŽá·\°û«·¬ýÝë¬Ø>fèÀöÜ»<ËþèÅ~ÀfŽ­ùâ ý~Éy+¶�Í‹eGV¶6´€"ŽèQÜó¿}çc7þw7×4¹,ÿÞŸß^QÚýä^qåÌ××MÄ®^�ùç¯ûø–y»~ôÂe[ž=®ö¿ïz¿¨ õ«ÅíX8Ç#¹æ¡'nª*oÿíçÞ|ä¶¿÷ì¥ÙÀ‰&³G4U1Gã+%šôÀU¿ÿÜåßøÛÕå…=O~áõ¯Þòá×ÿü‰£5¥÷>z{Å€®'zýÅU³^_7»zcDÔÕ»çÑ;1ÿ§÷½}Ëù»7~óÿÞ“ÊxißíIy»«+¯™sàãýÃî Â…S�­+=xzày“NÔ·žn)œ=îT]kÑSoÏñF}äg£b§BÈüä^ac­ïU7 (ÉKÍ]³|Û¸È󷜿ûk·¬yü�y+¶�6°ýû÷¼—ð²?zéR _ÕôÏuÓÞÚ8ñÑÿXöò‡Óïýå¿ü�¥‡6m=2äÑÅÿêõ GW¶þùË‹MC0¡ªá÷½¶÷Ä Ï>qssgÁ„¡ ÇK‰€1zèÚõ·œ¿óG‹.Ûr¸jöØšï,\^\�úÕ?/43ÿðÌóÔ‘ªÙcNgáûÅ©_½v0 ®Üð½®xäékÊ zþð…׿~óÚ¯ýåðó×||ãù»¿ñôµGj -kuíô•;Çåõ¶u%ƒùÓ�&Óol˜’É2ídåšmO&6h@Çe³m>2lëáª[çí,+î­k-˜6². ¶åp•1ÝzÁ®ó'·ûÌ9ëì�wô$D‘žLL©wx�TrJÚ�ÓÍeÛªÇ Èïºî¬�K·Í!‚¸d—[û(ÒYwí�‰ðØÒ›[z“è€çð›æ||×¼ÕÇ+^YwÁ‰æòµÆÞ�àé–²ÑuWÎØ¶zß”áe�£+ëµ�RÚsý)#O#£ƒ§ÇcùõÍ<ë¶v&¿ò—“q_0å¬1§¼bÃãoÍÛw²ˆ°7ë6wä™) LVwö˜S_}æúWÖÍ$ {çoýÏËÖŸn-éSZ³g�:õÜ_*Éï‰øÙÝoÙ_Ûºóîybá¶cšþ²Ñ€0ë3‘(¥ýŠDÀÒÜ›8�°Ç‹óドpï©Êê¦2QYǼňµÔeK»(Î<¾‘€€ÃÙcŸl*­i-�8¯ÚÖÉX†««¨m- ;kZŠÞ ñSMk©\`%@\�9y>䥼ò ¥ÉK1JaÐëð ð@Õ üŽnëxsQ~¼‚î­x¬y"¢ð•ù›¯Ÿqð{Ï~âPõàÓþÆÕÇÊ+ËÜt�øŸ—îñÜìÃ×.½|ÚÎ�'F|ù/ŸNû^&p…Æ]{ÖÖÇ–ÜðÃÅ·U·ûæ>°`õï–]é“* p'à "WE§¸,ÈsÓÝ©DQ!`[lé(î¨Ì9î?^Y]_ªÓ¾e4[Ñ““à—8< ±÷bº1ÏK8ŽÇÇ9ÑZäÆ+À½'*êÚJ òøÉkWøÜÑÁÚ¼Dúú³v ,êZ}h´VÛ­Åy±JN¸¯nàñ–R:¥²�h/>ØPvÑØcïp!€¨$AÁYè+Ç1Ì`iB{sҬ⶯ƒ. )˼˜Èe7Iå*“š©ýTˆ1—ˆ(H@®J é|â*¹Þ‚I9# ©ð¶ÄM: ÉŒ_ya‘–¢ÞÙdP¹ÿ†üzØ©KÚ†údSD­v€Ùºðº³¶Ü5oÍ©–�ÛªGŽl6pƒÀ ÅÔD_ѧíË×,�8äÔk›æ¾úñùÝé„]F—,Ht?péò˜—=Z7èë׿Všß¡ó=­ò¹ó£WnmÙ5qXkhã]=|dekq^JX pœ€<Ä=yâWÌó'mÜy|�&e >}馦μµ{G‹9ÀìÑ'ו7É…2°=£6¢k+î{âN×õ� $?õ•k?ZÖ^ÓZä:ü'‹/ëLÅ`RUcuÓ€ƒµå <·ŠJÀûFŸÿÝ/™ÊíŽt‹¡Ä:\xÔúãàïÎÑå )Có�uº­µÁ€Ác!ß÷Ò£*œ’ñcÆ ÁÎê‘;«GÐÒÍç*/‚¸³zÔÎêQ°tã9!­åHÀcàÅÐå¨0 A†ñ,DY€ ãb¢Ã8Ø·kÜþ]ãÊ–¾s®0Œ˜PQÒuí´Co}8çÐñIÌÅ�Ìžy°nhY3s²YßË^6`Ï®\PÓR*Ø�Œg`[õ¨ ‡ÆA}[ñ››fjþê�ÅÔµ ·ØÖ]ð…¿Ý¯¤Pn€Tn ð û+Š;wÔL"b '¨¾†ŽÁÈw�$Nϼ;‡4`’‡ b ÛDH ÞDÀ }€€9äxÌK¸nÂs=æºg´úØ�UÕCÀgϯ˜3d°+@@Y^çÅö/Þ|ÎÚCã€`ÉŽ™“Ÿ^Ö ^ ßË^&`O­Yp²µT°*Ë"Âö“£VîCNµÿ㣳ºjMeqçéÖ"ºtÚÁÇî^s³Ç˶äêM'«Ð"B뫇¯¯†ÏmžÊ.kg™ ¼=µƒ.U�ïe:Òq!S d‡7H kÁh…®uzž1õâ+†ÛÔcA@KÊ%®·ÓËÃP‹òwq`¹d¥ç’Ë�¥8r¼# µ¡�¨ØH`š4“ Õ'Ãv ¬5°U™'Bˆ´{–³O©£b®~HÓYG'I7gƒ›ÆrèÕ]Pp“¢MD)ý2,V(U®ä"‰ãzPl9F�ÀM‘Oœ À-Ês’»”ÃÓCQ +¥²)@“³e 'ÌÝ ïd‡æ/­©MÓ¹x]ö,€ ™$2ï>A'Ê e˜88:Ú�p"Œ"ó£Œ-J K¡áž�@RôÑUY©‰(ì�ÅqE;)ÝȉÄ)â"2tâ@ñ4�½i£´2ArPókNâÚBC ™‡©úŒ ˆÐXiQÏвöÏ]¿á??!7ê1F=¯(?]ÓL[U=ûþY?pÙÝGÿ}ùYî• ˜œ­d}¶ð’í\¹å{Ï^¶ïD¥ ²’FàÀâÎD,»ïD…^fÙ{¼2ËÐ%pvMkQÀñt}K¡ç%ݧ‹Ct‰^¸ýè`‘Ÿ D¬Až‚p¢©8�/¥§tÆq�Äî9ûuÌÔwŽÔ•�n)´‰¶áÀ°ž”{ñô£Ï­˜5ahCa~úÃ=#.™qø«·¬Y±}ìäa WŸ½ù¶ñ9ùbhÔàʳ}úçöxröAN ³�ûÇ·Ï]üÑÔ[çíþö+¾qí7Ÿ¾zÛÑ!åE½CËÚ>ÝÇŸ¹F³’÷d¼¢ü¤²Ngo,/‘Me½Žž8'à\úW%þÑ‹1>fPóÑÚ²¦ö|Ð @‹»^V„BÅHöž¨LIJ•%]ÎŽ^æ)9|ñÔ ]mÝyp¢©8ã‹ÌLec\¼L£­;ùͧ¯yò¡×ï¸pçÇFœh*Nísÿe›^¼ówKϳyg_qÏçÄÒïÃ=£n¹`פa Ǥ2Þ¤¡ �m“‡6ünéù½•Ï€‹×M{wëøß>¸DÝÂCµåŸyòæ–Î<1Òé#jvß2Nä0=_`ÞÝ9kÕîéˆtëy눽»sÖŒG?uñûÕ w&½t:ãúÜÌd â©é#Ž{NV±€FU4L­:ñîÎ™Õ sÆ™iÙÀÛq|xw:!2Î}ò‹×|8°¨ç«ÏÜØ•Žýî�ºßpxø-swýúU/®=냽£!„,ì´í­Â=Ž.œFìµÙý‡°©—*Š ÝÎZN¥C\æ€�p3ÅyÝum%FíåÒ¤:BN»('ÛëãB¥Å3 Êý0—� NR{8'âLœÀA¦>Dè è Ú›—Èžî¨pbˆ�ÏN4TT•µ€F6€p²©¼¡½Èrq E0AͦÎB× Ê ºêÚŠYE�H¨%á ´œ?áà,XõÆöy{O>}˜Z[H’/íÛÃHuI抈llàÀ ‹.8žë&\/á¹s\‡3ž‚¬Ü\Öæ Ql,+ìNz™c�ð€k8¼¬Ez @†p¼¥¼¶½�”÷s @]Gq*Íެo+òœ ¼¸ûtk "n8<òŽÇ,H¦Ïsä;7.-øà‚—wL©Ã‚ëVC{tât²­¸,¿;Ëv¦âTG­9žKúLÈF´Ý¸‘[ó«£U–äSèQ°¸ga55/”F ã.0 ”i�-xm´Eà ²Pµ:dCK‹½Íû�ÚÅ!ˆ †j(SíEµÚJ×Öíê“Í4&•Ý6 _– G ݉œV!>ꧬºs?‡`}@!‚ƒ ±åŽäKÝ öR!j}2¨éZD×}ÒÞWný.m^"&ï_ư-„�˜›œr¦+PÀÐqˆ1d„qÀX@Y  ƒÀ–i5èÐ%FGßh#‡š}Ò¡/h‡Ñ¨%CCLcëAIžµœ‚€s™´Í€%8i±,¿Õ R·l5$�û �è«Ï!ö-ocÈÛó‰ àìg/ÍëXM¥€°¡-2>{â�ó^þ`úówþøþ÷Ž×—|õOŸ¨m‘ÀwÔ ÖKg^¹cô}Wl^·oä馢¾šÖÓM"@õ.†H*½±˜ãë§#DP¯¹ 3$|’‚ÎÏ#-?�ÇtØ75"°Šoªo¦3žhÃDÐÜ‘·b븫ÏÞ÷ÚºIó¦V89ðx}1\4õØo>󿀂Þ[çí>2ºvÓÁª®^§ïülR“$5¤ÝÕƒž_9Kœ…;ahã�í|nåÌ£ues‚{/Ûf�[Ò ; þ°lî³+ÎúùËþûÎ÷ÿêvNûé?¼¿Ýlo 84¶Tu#bÀ– œ\kkÈÜQ6ßlžÖÒ×'4ÏÕ舓!‹ÖRür¬²¡ºš: ~ùÏ‹žþÊ+y‰L^,s¬¾té¦I×�»ûå§E‡!?à€‚Þît¬;í8UÑÖ�ôÔÍËw�OÄ2 ÿêu«/˜tìÖsw¾ºaúo–Íãœi6cD#CŸÃGó’lEoüêCìTÁn‚ÎC¦�5ŸòK‡0'.0(¸.ÅÜl:—E!l;Àdਰ�ô¨ËYa"é`@¥ò�ˆL¼ÌŽK3Å%EZœt>§(†�Ïø—Ý ‚Œïù*¤/í¢çÈeàÈaÖê*¨Fa“ÕÄBß¹bƾÏ^úÎ[;ÏyyÍì㇨7%Æ�6I8�Ò}Q"®�• cpæ¢ã9nÂqcŽã2æ:„�B?CìtK !s¹µÜŽ /Š"¾Ï¸Ä{f>ã{gbÑš÷Íü +?slèÝ©øáú Úybh~^æ–™»ÞÞ?¾Sœ+oY{_»fg*ë:¹Œ+¸ ¨à§)hà¨6Š‚žªNkõEÒ\-¦‡Mœvó!$Ý?ç#sÐeLã9PÑJ’b'á10Cè ˜Óou¸^O×Ñg h€rŽr�BlÑ? Óì gÀXÙÌ�‰¹ iÊðdÒNBÞ#2ó0—…àýC÷5$#ˆÔ©kµnÛkŒÖ$Ÿ89ÈÄÆd—˜ÇNÜ'îó@Ì5´k$5rP ¢lWõË�hõ”Ó§ #÷—@òBغ2's2`òXôcùŒRˆ�ŒrÈn›0:**P„#º£ 5Åâbx$`™NÐá-«ËšÃ¤m…ÖŸ( p\†ÄÈIùÀ3 Ž/Uz©:YVª"p™I™·mENƲ·^¸ûdSÉ¡SePÛZ8¢²µ¦µ0Pg¥E®†¶ü'Þ8ÉúIÏãó§[´z¦�Šöîø×þô‰úÖ‚'¿ôÆ#·­þæ_¯ÖÑA"ä„1'Ðk:ÐÐZЛö&�¨_¿w„`Фá ß©o+�5¨5Ëö¦=UÙœ œ¦¶‚ˆwU;˜Ãž™r»ý/$Œ9`ÌUÉG}ŸåÕëw¶Ž¿þ‚}sÆŸ>wÂÉE«fdŽÖ•þñ­¹ÛÙQ=¸' ²¢"xaõÌ·7N€ñUMŸ»n½09Ÿ³WÍB¤v�æèÒYGnsÙ;pº¥lÙ–Ù7žóñ–£c÷�f¤°èÆ€uDÝÂù;6ÖÞ�È΋«f}ûΕ݉76Lö³l°¦Šâ®—?œ~:H‹P”—r]žÏ&b~J&áÀ»[&ÜvÁÎÿ¹ûýg–ŸÝÑ“¨*kïJÅ7ªjì(xóã)÷_¾étSñæCCg�©ùô›ßøxRmk(´ä¹�ë�çpDNĈ ±#ß~ê,õT]kaÂŽ]ë¸�žæŒ=uëù;ÿ¶üìÞ”÷™«7®Ø>îý�coüá§t&…ñ˜?fpóɦ’žtÌð[Ï^ÕÑ“:0jÖ¨Ó�Þ³T ‰�…]e…½?ý’Þù΂i‡Vî_ÛV¨z²g—L9ü“…Ëþçå«–ïŸcìÔÚ…™ÖhàO—›Ò¼2ÉÜ>4þÉåWñ©° ¸kÞÚëg­mÃyë6TŒÕ–�$?`ÇjK{R1RoBfŸdP›IZŒ¯j|ö›¯.ß:ê;Ï^ĉ9àÆ<7î¸qÇñ\ÇA`؃ÎÈAè`eƒ˜:³BBø–î‚�ŽL¸uΦãÍeûk‡Ì}ôŠ)»«›ÊµmLºÙ¸›�9~Ò˦²qp]ðpS«jï¸`˲mSÆT6}òâMí[ß^”—Hß}þ–šö’SÍ¥xþ¸#×ÎÜýôƳ:31-rh[2e䨪¤½¥'O{–P ñ$†^j†¦6%³‡ ²4È-ð‘QÛèIA�eñBT § ¯�f�fÌC)`:P}SÀmÃj^ëIÖp¤è@¼š)X Bß±uQŇ5&V>Oá0�¡ ¹¬*t%ÂȨ¹þª ômnP˜€ú¦Ö8 =Açcè&ZœÒ\˱,¢ïœÔ§""ˆ9n ŸsŸncMÍZÓž1]¦-Pú€Ê¯…wÐö}Eläÿ×òGVX�€|D– C˜€�”a"ÝYÅGlÙ]f¯*)Wa¬i�­!fªRŒ/­×Ô$ÐL]sÚ×Õg9@.câ½6ú-’¡îJá•z,·¸`„´Š'T÷è+7­ýÒ�ëZó×îq÷ÏîØ²BtgñÚ©í]É¯Ùøà5©º¾ä¥U3Bðÿ�«6�ÒœŒû'Šÿ´ôÜU;Æ*.HÄ=Õƒžx㼯޼fï‰ ± ³'ûÑ‹ ¾½põëßÖqøë&ÿ÷ÓWfçOo�Ó�ò¾vÛö×6>¿bÆßß;›sG¼¾w醉ªþÙ‡gK>žüËÅf§ù‘4–̘5¦fÉþ®ï© 1O]6ñ»S±-ºôÛw®zý{Ï:cýäo?}åàÒ®çþ륑•­ŒlÿýoN6ß÷è‡jËÄÓÙÀ}sý”Ç?ÿúâµSëÛå¹Ëó§ùñ}ïU•¶§²îÖÃC>Ø9º©3Ö5ÝVfÈb§à¨î K Íœ„OÂDÌ¿ÿò-Ã+ÚòÙºÖ‚e›&ý~éÜLàÑ«MkëNþçÕþójÁÊ‹VÏ ¨ê+Ëþö³K®8ë°ƒ"|ý–¾zÓšSÍ%÷ÿú¶ƒ§Ë·üÅ?Þø¥ë×¾ð_/9?Õ\ü«^PÅ9üáís»R±¯ßúÁ°òöÚ–ÂçWÍ|fùÙœ³D,ûØo]6óp^<ƒ3GŸþܵ«ð™Ço>TSþǾž žA«¹fmxyë>ùÞ©–â§ß›“ñ�É#:zãA€ c¶/3O–v�ªhý纡—L?œŒ™|¤¸ç?xåÆúö‚iÃë¦ «'€ý'+Õ–+j‡¼®+ÿâohíΛ:¼ö‡Ÿ|‡H¿Œ�äËCröAÚ,/Ìë\Òr°v˜º%WX(PgK¨@q‘miþTN$@GOþßV^Á 3AL×#! ÓæüÀ=Ú0èÅ5uuyœáÈŠ“÷ÎßðøRyÞH2îöÊu]½¦EÌ�§¿uëŠË¦úú߯«n ŒË‰¦’“MÅÆ�n;{K6OA †<æ7ÏÝõõëWÍ{òdsñ¿¾÷‘ç¯ûñÂeo}ë/Ϭ>û•õ3jÛL²™ü‹$¶_…éÓÕ‰Êj÷çf„Võ"ëLó‚8²xEÐÕŒA&€�±MGªóœl†2ô�MSßÙ6¡±³ÆnüöÍ+ΟPý£Å—?ÿálÞ—òFô/‚¤µ¿´º ¶k$$W¼‚Aqbø�íBÏáWÎ?ô¹ëÞùß—«¯”�c¯@ë �u“4G¤"¨€Ý~ÑÚùÓwý÷3Ÿlë*$+ž¦û’mÛ†*>Éš´mÞváG³ÇúÁ‹ {Òq50ÐG|OÄýïß¹èpÝ ¿¼9×–By5aïš·ö’i»¾ùâ'{x‘'"èl„º“ÐÕ#&ºH"ýˆ“›jH5ÇÄ–È@ Þ/Ý´î¦yûoûÑõõyŽƒnÌuc®w˜ËÏA½N&` ÷~v»–ŒÔé/Â#Zùî*æðÉóÖÍsè¯.ìLÅtŒLmõ†XZHI/ûõËí9^ù‹7.“ ’ 8È"0„žX&P§ë„d=Wø€Æ•7?µpñOÞ›ÿþ� VÞh.¨“+�J~´~÷gICô˜5¨ìÏ]ù]n2îå9\�ÙpYyˆã@y @s/´g%®S[â@§XH¼‰�ñ3œgí¶mñÒ (—fVl4-tÉÐÊ^(.Äܤ‘èª-ÈÓ¹Hs¾öM¯œmYT«r{µ*äÕ §¬_�Sè«YdÈ$â‘LBœ“Ï7§† Â2[ö]“Ê£*´Œ»1Ç(�x§Ð•ÛU£rjñ‘ˆHA–O ²Õ¦"ÐÆ8Ô7Mß î�K%TcQØTÉ¢q�‘®¥—ýÈ\dÔb‘*bíùÓ4 ¸`ruKWrû‘Áº…§*œªÐµ-ß:ödCqTÜ�ˆàX}©zqª¿Æ¦uõÆ×”õ¤ã!ÜC‘jdç¬{ ?éù zÚ€v#Z›#4êëÒ»§BÇ,’‘- Û¥ˆ9Šv_w ­Á‰_ÒY·¶µð»Ï_±Yœu�À9#Ÿ³æî™;ñÄéæâß¼>ÏÙp´¾lé¦IË·�ÿç:Z¦¾ÿ:!"pb‡ëË[;“z{nA""¾åB±§„{ä8Yß}oǬš¶ÒÝ'G(B"´÷$öž:fpM}{é k/Þ{ªJ×c;XŸ³qƒjîž·&ã;›��=ÚP©Œ‡Ú{§¬*™ôÔd$"NìÜñ¯Ÿ½)�u·V�>RWi¼�uz†,�è% ËcumJ‹â…ùØÙ¡zÖs‚ëçìéM{wýúîÝ'[& `teó¯î_’Êz_5»±=Â1¡´ÏÖìs¬¾ô•�gœj.2)~†‹Y_ ;ÂÙ\¶GýµW!Œ3SôÐfÆx/ ¢|Ÿ¡|§»ë8.9”åA@œ8·ì‚šÛ¯2‹RŠ"{%1ìVÅ×\´üïèd«žøàûˆ8.0 @ˆÈ0–Ámí#fäÀÖ[rÈ¢'X:Ú'{uUº–3K•WáêÝ@ ÐùD‚'�¥‡®KA(k£Óœ3á—5‰z�Ó£ºÉóÃ�žé2R¥?ED5§¼­›Úid}Î x›ZóþS/Þs¢â§/-�ÛW´6@Q­ôÕ­¾ �äÿt)Sé8¼ ‘;¤ùg÷¿ó⪙O/ŸVn³ý\á]VæYÝ^lX†lhˆ!ÿ` êMûZ{ "è8‡r/Ã67RÌö&ᛑºÏµÁöp¹œÎ¹"MõußG?¿ä$Û½�¶ª™pÙPFÁˆL dÌ3™?.Hì`Ð�žœ“t™b½Yj�õ.3å„@›°|‚ŠÌ #K ¸Ï™v /1é¸,hU‰ü~Šˆ + õ-A€< ³FÿƽoÿfÉ�Gš†ñp$[eŒeжD ëU"eë-âG­£Y¶ú,S‰@žËo˜»¾¡½tÿ©!gLÚׂþòÎïoŸ!àfhxª¶D,ûý…/©ôÔûW�~Ù¶ nâI`.øil­á µ˜öe· Li­Ý\ø" lD$[¼††ˆ8 øÀb.sc®}ÑšÇß¿üí�3l±"A%�ŒA[Gæ§7¿´÷Tå£o\&tTè!2D!„ ä œŒ÷ä¥sÄ#¡”×Ô!õ�^·ì‡ï]ºþØ�È_N54ÎÔ2*&Dæ æZfô_m1í@©iÕ_Ò†°¥ R*V^ÊrP¦±E—@Ü…Î44¤å†gÔ¸R•2¥t6-‡C¬bo‹4²lµM–€‡~·¬CßÃ<ÕÓÁ>œŠ*oCy«û�\·ÕŸ×7æÐîE¸ˆ%jd!/á6Ø®Nyu²czÞ qŸ�ΠуU&„|íN)y‡®‰ÎìÌû¾ÎT l¨Âƒ�ˆ.�ƒÌF �2È3,œgUi߀a^P”]f`3�šE:Õç©é@¿ŠÓHPœ´my@¤Ù·[äZõUŸ¢ªÒ×õï Å~ËKy “WL´4ŽÑ‘¹è…rwêïF ´q2XG¢ŽœÞh£%ïüKy;ó¥*< sÑ7 (èyåÃÿøpZN9»å�û yÎJ}ä'P(Õ B -�JDîÄ Ò-Èc•±>«‰Œî±…˜úÙ¤|¤Iù£ž+.G› Õb§°FF&XÚë[óPy?l�,IïûÒ>OËI›a€5gÑB¼©[F›f�̲ßUfA UP‹¯Õê!³saŠé§t‡£ÍiPˆ*�Ô‚w@ä%ÏRQ²’5´SgOÔ׃°Ôë¨Vɵ#µ,H@V+!¯a@¶ÖkKе÷'5pí�#&CÿÚfŽ[ÐÜPtl 0c2/ž9°ãøÈ;þ糎�ñ’ ¯Ôaɰ‡a8¶[¬´M�F@ ƒÝ` :¡ ¬MÁ!2#Dà„élìö × Øì ?Ý\öÜŠù+·O Ÿlab†vÌ•Äü9/±0x€­§xã)èɉ”")„dTHÍ&ÔxåïH"i€€Ä;ÕIìzd®ãzŽë9Žç8c’)'ÃQêräMîÀ�‹1ÎÕRÙ[Lûî½ç8¢¼™!?ÙZöÔ—,ß=Õ�O­Ì Š“F0“å==¡¡‹Â(&]L,JH °ß¾òÚ]SyÍŸî-ch%E5fŒº: Hñ6$–F8QµjÛòù6gÃC€ å$Õª‹žiYw]ðà©@…ÙtG…tYÅÉР–É, kVÁŒg–²¦kÍõã6Ú ©é(…W ÔT4—´VXˆœô‹Üõœ×´¦·¥’&u£éŸBýRjeõ×*Pˤ½¥ ª…M¤•ƒ`Py"""ΦŽßv\"ð)0o—$%C€ÀÁ$e„4^›^ŠvÎ2³D¤plx oà €~ÎÎ]± ò¿(^pÃB!@æùæåí(ê`Pµò�D„¦¡-¡a½´?‹‘+ ª„¼ÿËZ�°Gïws‘KùÄ3Êæ kzö„_Ö$êQij­ù³rç†_j^˜cZúº,i 1äL�„bØgxȬëYjÉAÊùþž;ÛÈQˆ˜Z ­votÜì_Ó%4( íE¤)bsrIn z4W»ßŽšÊ¨�:C�KUù™CÊÖýH�!—€ÑÑÿ[W¤å�ÞÙ÷û˜”[=°Ì\¨ã)gÔÈD¿�S£íÙÀ¦©"ŠN¡‡&Y^ºqPAP{©ßb¨ê*ÉB¡�=Ý’ŠIšoÑå {c=« µ2c‘¡cV|éÚ²½D�YjlåÙ Ê ÷;DÖ Ë65‚PP3eTÑyCëÅÃÜ»ýLNsoZBe ƒ1T‘@â„(àˆ>ƈ—B¼‘‰5wf¢SÅ« �s Yk³˜NJïô™jz„zb§ŽÈÔwÊ+GZŒR¸Ñ06dÔ@ÍîäÏ„ ÝÄ’„p»©±:{ˆ«.�é‡äšHx 2]HƳEœ9sÐõ�³�9®Ã\$佞O:�œšÜò,(ôÈ c¿À"¢å]uàUI � ~ç%¡8[¨©Áç�JÜ@DDiÙ £Ú @ÚËú ?l3Ãf\‰��‘#\J·4bÓ!j-g2Ú‘–#¶Ö¶kVË�iõ*Ê]ƒóäb®:‘P>�…q*J@6ÀÚ^J…!¢—¥v~<#ÅU5§í•’cM¢¢n~Ò÷#NNŘC>Ë”TÏöå}ÕψúX§þ(DT!|åz^Ìù á>Päcß-Ûã„Ó¤áÕ²†ÈsSá[ x�%ΣámõL7@Ô6ƒlBOÝ•m± ¨Ë¿íí‘é©£Ž5˵`˜k ¤°é?úÉ�LZ6¼?/bGUs„G›Ënò󘓗`¹iÔ¤L"C(N"CèÎBgÖLum/¥[ÍûÜ×þH{Iµ:‡j\¹T°{¬+‹ünÿ ^kc Ò¨þÕJWcSÕ6Õöß~ž�>˜“~¢q¤”–Ë1c6ÏD-¤>¥Æ6Ø%®¶²"CtsQ¾«:Ü/eß̺¤=V —5î ¼¤ló'B¥3ÍTû¯ ê!ð€¸pÒø¹À#;©¹ZO0L±�Ö6¥ÝFxr­±å;í’D ò8 CdˆˆÌô˜pž%.­—§ž[Ñ&�v‹ºEû‹-{¹øØž\[}·Â9´ ùÅÜb‘;R¿ä¡#ó`€qîx@>ã ksj-”ÊWR�ÕkÉH÷ÙÒ˜~C3¦ë†iQ_-ðA!bqNi —¡ƒ X‚(WÙMƘ5c‘Ï,�òÁèÒ�f—² Òýé‡E™,\K~‚Q¡pZ7•~@ÁÂÜËJ¥7?«NDN Ð� %«ÝKF]Ì?fñÿ_ÐJƒ¤H:2Ø¡r²‹å®$—…Ûlë«åÝÀk¦Kf+¡1°ÖFÒvˆ¸ß¾…ó M¥©Š¤Yž\–é{”¦/{Gl¯±Wv»dèbK¬!À™I�¦U-Ã,š®J$¡£ªŸËÿûÖ^§¡íÍ ¡)\JöüM×B @•)•öØ´6>!BM¥TÊYØR 4ÂM÷!ÙKÃË�–nÞÚ%N5@£0²´^#°>ɾ†ôWš"eäQ³ ­Èú`ûO=ÔÐ@ ¡¥š[nÂ�ZZWã 1¶5‹1Šw¢@ÆDB7#–¡x=ÆÛ(Vˆ^ "EÜÌUÍ®,C=N\\Ô%5—¬’L’ªJ»1íe€E™ñ$×TAæ‚cNŒ˜ D�íÂölkåÝi’ïH�Zi�¨@ƒi#9HÜç€Ä ÙÌq\OmydŒ9ˆf?#OÍSF¬ ó,­tÉX"Å<�n€1 粓ˆLçåhÁ¬MƉ¶upžÕÛìÊ%÷Ñú7.ñiX|”…,C™ûDVF2‚é®’<»ÖÚyFÂúITaP‘e×D©XÌcdm÷Õ£$EÎ!é!e|Hq]ÀtNÔªÔ€s›/•)Är)f f;SE ø#InÚáJS'÷Š„Œ­úŒ &¯Fr´bP."¼:s›æš«F¬@UFM£�Ó2v?T§TL°ë±í¶ªÔ¦=VΉsõ²@—98Dâ9ŸóÑEd¨' ÑVµO’«�ýI¬Õ™¾;.`÷r82Ph‘Ç<@öpЮÁš"÷}¤ýk˜4¤nÌ�í…µÉʦü^¸ªç:}JY NTÍ,€âMbÚiT®oBi;«�[˜‘•СÉü •[!iYRÅíQ+2éO:Œm‚l’ŠÖúªA¸iDãûÕÙ~kžéŽHó€C—ûÁ\š2êl¬uNãö3¶˜cô/†Ò>A?2è—©YDWxÚÐ&œ×!çœ9¢ê¾^”,}Q�ª Þ’ÝÒ‹fÙcaBgZ)Ö¢ã+À ÍË“¬(I í¼;M!¬DQiœF,}ðÇjWU€úq)­2¤`ÅNlµÇܚ¿Jª“$°íãµXcmÌР88 Hõ0n朠)�†Dbíèæ‘WHNQ¼<Òô[ŠcLM)”„&ʨ§m Öµµ‘°+‚™æW’G JgÍE( \œ0)È`w3µ6BGe8'å×5©@*²¸c¿Ê” ê™3FPÿåšWÌq™ç8s\ƘÃ@i7xzÇu±¼4¬tÁ�¨M‘:õUI3r›XØ)Ã+ß A÷ îaOŠº»¸b»²¹Æñ¨Œ)`�CÒPÛþ:×wY˲À¤?š¤F 3µ]¶Ø ¡L0Ó`¨b=Ôhü[”Éö°ü<5íÒ=Wyó²×D.ƒ¸‹�ò!ÐýÕd´þý”}wàU•ÿ9wæ•oOB'€JPª,Eô‡€ W\Ûºv×׊ º®R J Ô¡„ $Ä$@zûæÛÛ{3sÏï�{ϽçÎ{aÝÙ5¼ïÌ�;çžú¹çž¹ƒüÿš2ÿT£`"sDœ—!¦Ö8~dš$?É`ÏyÁ;rixø?²ý¾~K™ÕúyøMnqFbå°}€�d³¿Ñ�ÙÒvAb6HÁÝL »z¤Ðþ_U‘(%�Rf�Š—”ýá”ÎêŠ %bVà#³Ôê:øŠ»ª9-˜¨´“(yn¡�Ǥ!«B¦HÅYK¤ $¨*5¬ƒËÉxÃϪ�®•˜W8ꬆerâÊsRXÇ‘Ò !FЉò[o9yx6¹ž¼õóÉ\28I¤³ö[�¼ÃýíÞ ò&¸Åú_È»3tÿÊ$\­E9MÎÝÅwÓNj„ïÏ?o«Î““# L”.=yM!Ö÷>;+É"ç…Ä��=€4¢e°¡Tu0E(j‚ÁJ¡£¯ÁiƒlvVè�9°»È ù ©¡ò‹Ï,|gçˆÿ¼ÿCiˆí½›È+›lN¿½läó¥îOîcDË@c)‘’sOÓ„Cqg_cÀ§°MÊ ’ÃØû&Ús.Ø£É3 ”j  eK`7ç­ŒC#OÃDÁœ‘'K8>£þÈÈLLÆÀ{jï6íã~€ÕY›FEÎ$ó-D†øt2“‹ £ªÀLl‹úÚÓ««©­Qæ "J#jøãlL&€ícœ!ÊHág(�«Ì›«o.ú‹ó¾CÈÅÃÃe»+0¦Š(Í� �ÐH�öf„)”«PêÅbÄM7"€€ ‡ _nàÜŠÈë™ìÄêÐ ׈$¹‡KDj+ˆJc@�B¥ zÚ¡»[VùKéÖ MŒ®�œs*ËÏMè5�-ζ¯?‚F…Q™�±U„Q¬T„J!)*&Yä�zãÆ!5Æ|£jqW˜€ƒÿÖÃú(`ÙE@�e ŽnʪHA»µ@�ŸÆYXŒ¤#-‘�³ÂÀ3» h’ v ¹l¢“”�Ó~ÉNÎE+òO UÐkD�õc™Û# ªjlóY!%\—&rD–‹!¥†RTš4Ø Ž -îîyZk&Ó–Ï� ¯>oÊ�ÛÞ/62sÖ]Ç øá¹;Ýùo?©Ê™xhôÖÈDmlí€p�±çùW¸À è’¿Þ%�ƒy1ù"Áô¤q`½y # (D…¨ Ť4ï½ ¶„Ñ>Ú¬:‰Qæhvã ³*ÆMù ?GÈ¿[#ޏ�ÖÓ„—g4PÒTDŠP!•´*hJ”N‚’eÒM°C öˆEü �C‡Á,¢^ñ®�ÿÄ{2x=4A• ’¶Ø7èW˜=!ò÷aº³WC‰IOfþ±‘8Ÿ`ÔM>eƒÚ3¢*+ ÅO¼“v6Al¢R³íUá±r¦&Ê*¼­8ËÖ(¸Á†+nd�ÓÖåG^yù­ÉD8²uà¾oÌŸ1i·ëd R¸æ—>¿öÀ€‡ß¿â‰sç¼õ"¸Én¼ãl‡g hö�;ïüê½Ã›ëÞ⎮þ†OþôâW7N�‹òpÚá�›±ù�%‡¥™rŒL£rR—>×QOä ’—{Fö¿€BúÁOž{üëï7äߟ£©¿Ùîpà5ß ]hùþ¼}à;ýå¼eúÐ�¤Ä3n¿Ý€Ì²‘SXÈq(¿""zçÉ¥ŠÎ�°":oâ<` ̪Œ¹…vrO÷Äoƒ†”ÂB#è„Z†«®!êèÓn‡igÆ"Žsã¹èEfùÃá�ñœ�‹l7‚göAÒaz¦ ÑÙ¥@@¢hÂŒZ'{*0ºHQ¤ÈV�¸� ’"  ý,õC9†B¢&ˆ *�ÐÈËHN%}a‰[jày»S) Ш�5:Jì‚(,@F€HYÕ.ìí¤Þê¤Ìße·€t㡤û0¯Ûh«-ä6ï³›Š E*R±ŠªX©H)…æß,Ê*Å”۵W5V`ôø‚©@GY‹Ëš@nH’6"ë[lÇVâ˜Jª&Ø×›ºý'D`tJb»tð!‹2Ì+€Ë¯`p7p…7¸ì/*á³Áù½p÷4Ù·“2Ú¿Ü”Ø 5Ì| Õ4ÿµq<ŒJeT 3mÜiö-š´bUBĦ@%ES4‚`×BÈxq1CF;‘‚ \ÂÆ9j.^"çK܄LjӺ ¿j#‰—Êë%ÑÒ:rÌï$ÂNÜÑ 8t#¤( –ÿ‘‡&�K7H]ƒ!XA" ZØJÑ3²wÕ²˜´{¾Ä“ÎBŨÍlÚÖ†‘Ý PEŠH§Z§ Å´Ù�°LØÛ3ÐwÅé«>uÆ+—þû¥{º›Ã¾äá„�<•e•õ:ÈÑI˜–LÛ‰¯ b(Ú¶¶Q^ 'ê%^•ÅU×cpRƒ“¢;^³ä3§ÌÚ8¼yð¾çf¥™‰špßó³­<§Nh¿fî 7{´’5š¿pÅ!×Þú1|Î�JÉï¾ô˜0%\ïínû—ßÍ+Å™cÖèaý_8gY’ª[Îéêk0M«iôî®áBšH@“Fö^îÒá̓¦çÜÑ?T¼æW=¿v$o½Wœ¶êÿ�ñò¥ÿqÙîîfx¸ç×aÇTo Þ1²p®8äÚßž›i%%ÓXJ~wÃýl¼yòjS&çìow—X� ñ„'Â=mëÍŸ{ðÖGN¸kñ‘µ.…>ª`»Ê̶hˆ¨PýÜ>4sáÝKN¾{ÉÉÚîÁÌE³æ ˆ,’XI‘êåІµvÿò8±ç”5檧Ñ/þxÈgñ‚ã”I*8Èïœ5f¦Q@Å ª4UkYíéÕ}C�$rAèÇFœ§ô^4·À¢V3óÆÙ¯BÐÁ$q <€5 ª{ª0º@!)"R€¨@Y˜khNˆ’z* a©J1Ë—!jBU‚ÎÉ"]Ç`ÇN#9™:T§f#)¨#P1¢";ƒË0‚�èƒþ>J´û,`°rˆÞøÀ‹\ ãi—„fK%Ðl逈Q©U„©H)ŒQ!(…IœU‹i€°¡'rå"B^Ö¸¤)‹”Q€Ù´[B=Î MØZFDêìÒI…×S…nxƒuÓ4DH‘|�«�+’]’F—rV/gó¢ôÂ.¯®ä†Å …äôZ<ÍzR/“0<"ð4"‚¶a–µ@ÐWQižL• G@€ýUÊxù €È:X—�HuÆÏ⩯µ·Þâr›9ïhÀ¢˜Pr gYÝB™ õ¡‚3ywþ‡äÔkù>‡w•,vëˆ÷ÙܹSkÎŒÃP‚î×ÒNÝ1¤]D'f ¦°ÎQše ì—%U!Rû!÷LÛå2¹ j{ö^ǧ̜›àBD#D»uA(*­÷�¶;ícê5£°�wRv¿mT™1!– Š™N%ÜB®è òÊ#OKÖ9pHàÔ8�˜j Ò<Þbë?!Îð~ëògfNÞuÃo?ú«Ï?üú–±?¼û3¬ÿ¾oÍŸ>¡]kìê+/_?ù¿¿rÃA1û9�—¼š W´€ïÓkŽr1¹íúŸXyÐüŇׇ·t_¹"„%–U"ŒþÛåO_}ÖËRÆ‹^�öù__PI£°C?˜Âë|òÕé÷,>¼–~g7à{p”É%8{´5 \rÊk‹VôîÎÇ´uk{¼½eäã+§#àѽ Wžñ²Sÿ8ç¸7Î9®NJÛ$w].€±«¿ññ•3ØÁÓ”q�ÿù‘GZ+_ýýÜ×7�ywçˆJ š½_o,¦_½xqS¹òÍÿ™ÛÝ_òrD é“Ú?yêJù_Á=›]ÊqLjÂå<‚‘œ}²Cyß!ϪU(¥hÞÑo~v'ï!‚�ÛGþÏSGÿyɬ\zÛ¥Êê-Õœ!*nÚ=¼£·±~¥šªG½ü$"“ÅP )úñ‚�ÿä¡ ›ÊCß½h¾¹1ÄŠüj�ôÚþ%7Y¨ÍëÑL=“ã2Øäó^Á•'?uÐøm7-¸ðË}p˞ѷ?s–ƒ-R$н)Q!Nþõ‚¿,{kÆã«�bfÔeY•PÅ *4¡pO¯®¤<4K¡ æInjíØäÁ)±Ëu ')z6ÁB–ܰ—¨&”#y¯Á�[Í9Ð*A{ £"RšÀ|KB™7óq³¹S$ “ {S b1ÂBD¥"‹5 j Ĥxƒ€v/gÈÀs·êƒJ‘¢½dæ¡Ò*%ƒ08H•¤ŠÛ�ÀÉD÷žáŽY²…”•< jæ“óç@J"ªH).Q 1B¥(¨Ò´h€S�QScÆ4Ã,"Be>êä‚ZÞ•�XZ$/.Yø‹Tˆ¡\¤J::3JÁ$Žl4*e;�ž²8“ñUð�a‰kju>PדË,¼^!ëú.•= ‚QÝß×U,(U((­í{]ÚÝÇ”4�ÌL7%@6ó‰¨|ƆQ›hX*^"ìI‰ÈÃnƒ—b.íY3 2/³rä²®+XFÎïÃÉ™ÚfuÏäÚ‡Eyæc®w;;¶ ½ Áæƒsogq’˜ØXlÇrA½ÞhÑ9DÒZkc‚+ƒÒD 録¼Gs󛣱! v–dŠì&åBÄwÀ»üÉšà™kCÎ fêTdë¶A•4À mv“Àó„ñÕvï29’u( äGà»—u²'`ȇóuõ–{‡Š}ƒÅÞ¡bWoÙåù´†Ÿÿõ¤K™<ªç²SWÿ÷�÷õwóžX9ÍóI†5¦&<$¾î#¸dÚXJFë|pµÚblbñÊôD+)Äb”^Þ‹gùöwï:ýÞçf»q¹G~è°w.ýÐê$UNÄÎ?˧ƒÃ¡&`À(—Ü0sÑŸg,Z5ý˜›¹unDh(¥?¿æáº.ç„C6ýè“O,X1óóO#‚©ã;7ïF‚™à‹å<°HKòW_ß2ú’Ÿ\îNˆ’�¹ç^ÉØ>R�…TÁÂîT«,U.l–}ýCÞvDœgׇ\/0Á¹Å0ûË$‹þˆˆ w°a Z¨–*¥ÞÁ2¸¼8§HH�w¾F¦åB2¢¹ÏçE¬ærºÌpYQ¡u Mj®ºhï±_k7m¶ÿáaHiøßî›+ÎûpøCpœ7-ÁʼnЋÔÍbÁ¥NPà!z°B°;¥Ñ #K)¥2S7¡¸(–ÌJ‚‘ dHƒDƒ @Ø�QĈ P(P¡ˆq0"!F‘KÁ:KrC7{Ï&�¦:M I ©@R…J•Ò2í‰ç•PJ¯d¾(pá^Ì\ÙM4Ø- •R¨PEhX„�¨P+])§�™s8o{£…#ÆÄF©µ­C RvIR0�á1 sè.ü[—á2¦f.ÖÖ@ˆÐ¾W§U^êe °#`—JŠ=!é8c½E{Ÿ,O¯;$¸‹¼ÜÊÎ ™sÓ¸'ðÞŒc£7g_ êÅVVG‡0é�ÚZ”)·7/Š23��.‚™�DD)Vµ[Þ%°ŸV²lTv’H¼å_ ~ÁŽ—„ Ū«˜?;v‘ÿÁþ—$Û¼)»–vTbÕºîAüô<3Ä�Xs-�RËDRŒÛ¸…£ ½“”ô-äxùS�×rl?ãú8ˆ!ÖM¥ûG›‡p½i²õJ)DP¨JˆDQª3[LâßZaÞhœÂ÷–rÿØú&N#„öáOA¨Cný]~)�¹—‚N!‹HE! (P%M ªÒ©÷Ýè^bq,õOõœTÁë'ˆ™FNä&‹O�÷añÄÀKh½åî¾r5�ºû:zÏ¡³§q㎑·�ZöÆ~ÿqÕã×�·äå·&tô6F‘>ûØõŸ™÷òA“öôô—î_ò�[:®g° ±Ò—žºæSg¼rÀ˜®�Jaõ;ã¿×i¶� ÐÔP½éêÇ'ŽìùÂÍç¶4T~}íÃSÆu– ÉMW?vÓÕ�i�·>|üMù0”‹é'O_yÉ)k&ŽêÙÖÞvÏ3‡ßùÔ‘•$n,%·ù¯k6Ž=`\ç±3¶Ò#+þù'uõ5zËñžÐéÀ`µ°aǨ¾�"‡+BĆRrû—þúÒ›“÷ÛyâÌM- CËߨÿûwŸºeÏð“vÿê –ÂŸ\õØO®zLk¼uáñ7ýåä¦rõ·×=ø¡ÃÞ€ß=qôÞîæ«ç½Ô\®þû=§¼²aÒm×ÿík¿Ÿ»dÝ~Æíž8ó½Ÿ}æ‘Ïß|Þ°¦¡/ž»¬³·áëÿôìQÓ¶ýmÙ¡+7LPÿvùâ»|±¡t R¨§„g±áŒ›o®«µ[–|€=‹� ‘Ò:ì½Î[rø”‹×L}råô¯\øü kxäåƒÿù‚~ýù¯¼=é{wŸ¾nÓX·(uù©«¯9ë¥-{Ú~|åã?½úQ÷ˆ�Jáê_^ôÂÚ MÕ$ªÉÖ;ÎSsCõ¦«�8¢ç󷜿}oKÑ9ǼyÍÜ—š¸§§¿tÿ‹¸uá ½ÅÃØuÛuûÚÏ{qÝ~ˆD'ÌÜü³k~þ7ç­Þh—PÎ8âí3Žx»þ�÷Ô~ÓfNÞ½·¯ñ7�¸»» ^~{²S>¥²³�^ÿGÆÒY·.œÓ3Púðaï~é¼Ú{šN:ô½¿-;,RÙÇŽ{cѪƒ¾ñdz*…¯œÿܵç,‹#­5þà¾Óïxü­�€`ö”íמ³ì؃¶4•«ïìñŸœ¼hÕt(“O�ºò’¯ž8²gÛÞ¶‡—ùäÚ£Jæ«rÒÀ ƒ K…ôœ#^:kö«cÚºw÷ {lÕ‘ _=¶šDåbõ[Þ·nóþãFt±ÿ» ¥¡¿o>ðŽEÙÑ=‰43uã g/øís_\H2ÚPߨg ±¨TM£¾¡†žÁFã»M\çYÐÒû�Þùµóÿ6iøÞBœÜ0ï¡æ=D„÷-=é�ÏžÖP®~óü?5e#üõ¥ã»ûšÏ?~Yc±òû§Ïxzõ¬ß\zײõýêÑ“ºú‰¿vþÓGMÛvåo.î,)¥Ï9êÍkÎX>cÂîž�òýËgÝò؉=ƒ%75R,A„Œf0‡<¤« §|°¯EMÖb™Â¬ bs&Ø­qRI�"ó P 2m�+¿ÕââqØ#¥©&¨0ˆE@¨©•ÍRp¤AQF”i»8Ä3F à=±½ÄÁBÂüpm>§êÑN0qY]‡­Éýi@V¡Ù&Ÿmv5ADŒ°'iÑlBf¦a;Û+CÛ°‚Ä™Žï.õlî„ÊU:@JETtq‘âŠ%¨T¡»;£ÌbA ’Y'Lˆ‚F²Ÿ§‘°/ÖDèyâÙj‹jÑî*GdWmå™ÇO¬«î„*$uØÁJQ6””¶ ÉJ‡Àì C®×†"(„j}C4€âd´™Í°Š �h3o“Ù4™·@�®Ýƒò“7]{|û5óVä´’€ð;wžþÓû?äg`Â&‰°¿Rô[�ÁÙǬÿòEÏO¿÷��#¾|û9-?äøC6›«kß{Í//<õðw¾sù¢û¾qÏ�·Ÿóä«ÓÍ�]rXgoÃ@¥ø“«½máqë·Ž€i÷^ûÑ¥æyÅ(€¡DL‚õ`(ÒoþÓ³SÇu|î7lßÛ @žð÷/|áמøôkÓ&�êùî'Ÿ(ÒÝ{Ú[ÛF¯}o̼cÞ\öæ$�EˆðÁà £Fiõ�;?òÓ¿œìð»È TKºæõÚM»‡k:|ÊvƒwáÂ9ën¼ðù_/8é©×¦NÕó½+ž,’Þ{:4±ý�¥xä¥C~zõ#~aÖ'öO?»záŒI{^Ý0ñ§=ùç >tàØÎ;®¿¼ïGœ1i÷-_øÛ[Æ}î– :z›š´{Óî \{β æ¬ùѽg¬Ü8ñ¨iÛ¾}ÉS£FVîYq2/¤Š¸ã ÒÇç,9ý°Õw<}æ['Ïœ´õêÓoj¨Üõ܇@!�wì²Ûžœû«G?:¬±ÿ›çßŇŸýÙÃKudR ™†4SdVÖD¼ãJpN“ƒ3ìèV.VðÝ]c¶w�ä róÀ˜‘€¶íý­ùŸÙÒ÷�óÿüت£¯= *E*~kþ¥brÝYŸ~Øš¿oÙÿ+üôPµ�d‘Š#ˆŒ.«¶2u ¿øExÑqkn<÷ù_=rÒÓŸ>yd÷÷.}¼\H~pÿGlE>[(YésÀ÷Q/·´à¸*î³hF*iØ7Õ­¿ô70÷<(LÚ ‡#4*ûV| ¤iSªêÞz³üö1‹üÞKöoޏÚ,ÇfBÞ,OÂQ�òÐI; X±'¤ )<«à7püZœHNA,ç]l OˆP‚ù`„�m+¥”Vz¨”Pl¶Óñq·Ù -m…,óU;Gi àÄ6p³Év²$3ŽujÌï'X•ÒÃ1ؾ7˪V²†f!ñPþŒÑÓ(Ù³³—x#pš˜RÈwVHDnË>¯¹ :=\—« wÈ¿’>ÕÔäÖ�Äù>H!4€¨¸wC‰6‚�ÄúOý e”‚k�À6iu…9à˜Ãƒ ¡�GÞ6ÃtðC¨=r6K5g¸™ƒDù–¹[D t¾3g#fÕ{8Ÿ÷ØC*Ô>ñ(ÔsA‚*`wá’4uŠR8¡.—\ˆŒªé,3 N€cTˆ"ƒ¶3­™åÈõèûݸ| ¨8Cd<†òW¥IÈœý¾¾Ï3Á5�m€RH‘0Â("…€Q¤ˆ ¨«Êï?IP·–Å9uðv&¢_®­t=èä€IsÄŽŠ×íÿâºýàOY°°so‹&Õ:ÐÖP¹ìÔ׿/žuϳ‡Á®Îæß=rÌ ,½ýѾí­‘"ØÞѺµ½ßÚ>RöG„q¤¯;o霙›¯½ù£ïìމV»»š ÍTWy{G‹£r̰þ³�{ã�óØËÀc/4aT÷'N]}Ï3³ºú`éëû/^} &Ú²§õ®§ÿç ^7âØ-{Úò¢1æ²yím¿´—ÿýž“ïxìC᪠{eF–©Ý]-Ï­™rÆ‘o75TºúwuZ »Ê;;[�“3}T’B%‰“Týìþ½·k¸;ÿвCo¼èù‰#{7ïikmšsðæK*>½jÚ3«§]vʪC÷ßóý»OßÕÙ2²u€ÞÞ2ꉕÓà¨é W~äe#2âïœ<ë�Û¿ô׆bï{$Yôù›Ï{bå £ÜvŒÜ²{øoÎY¸â�JƒWSMê©USÿþîØK>¼fÕÆ <$ê,=¸|æI‡nÊR\½qŠ·ö€ž�RšZCj,W3­+¬qU¤U¬èº�½8gæ¦/þæÜww€ÖÆ¡ËNY=ñá÷<ììlùÝ£ÇÞpÞ‹w<~ìö½m-?ôÆ‹žŸ8¢wËža­�•9oZ°ì°�¡Â)³Þ½ý†þÁ!?þê Çùg^;ðöÇŽýéU�¬Û<î®gŽxzõ´jPkCå²SVÍöð{ž3ÚÛò»Ç޹áÜo¬ºV¼9Y)½§»qÑ«Ó7í>X) o0ÜÊ2ìê+§©·j€óŽys°Zø·»ÎÚÙÑ ome,n̰¾³�y㋎{låÁðØ+3Ó}ùɯ>¹îÈݽm ª>À9Ç‘Í}:dÝ‚Wæ,Y.yóàÑm]gÏ~åñW�èj€7·Mzñ­C´V}-+ß™vüôõ�¥JïP“¡jå»Sþß-_âô’ów¶zÒDEsžsI¸fË”5›$€‡_=ü±ÄõÈÕfÖó¦Zuô6Q–©ÞÁR{o«_¤C¢jW³B’©;Ÿ;e{çHƒ7ZÊC€1F�T®ÀøfÕÚ€Jµ6 ]öáUó_˜=É‘š`gWËO÷¥�¾ð_‹z¶w´ÈPçC–ƒÙÖ;2yÁÛ¼¸í<�c¶ÓÖ D¹åsé3¹ '(-€1®Uƒî¬*j# Hc&m÷Yà¤c\³Ÿƒa¨£Á¥¤DjÊ€:D0¥š*ðæ"n利ùþ™tQÂÝ(æTîí Ä‘?=œl$ûI:…`>LgáµÉa+DEIœ&¥Œ”Ìvr *JíÁÑ#UCS¬3@³Àú¬ÜÃàɼ,€ÌZÕ5¦è†'!“¥šHPªÜ‡Ö-Cí‹…H •avc™"¤LCO…õ ˆ÷¥E“Ý4[»s0;g;ünµ‡Õ×­§ �ÏpÁË”þ�ýR‚50t½q×Àº[€Õ…ÔûÆ©uX-±•·;oƒõ;G÷N¹¼ÂK2Œð¾ Rh©Ìvó„‰�„T ìîFzKþ鮢&Ò”ÛÄU+Mv@C¾ Ê©:"„Aø*h‹cîgß"Ù×ÁË>Ä¿ƒ™EÐ(…4CŒ ŽÌF!F š2ÔU4h›ä—•öùÈP äHÿúÅ"¢ï2e> ÔÙSŸ{¾R@„i¦F¶ NÕý…�­øìÙ‚R4P-´5U¶wÀ«oOüÓ¢#oºæÑO¼3þ�‹Ž|~Í�‰ÈHUÓè’S^»êÌ•ßþãi¯oË#—£2“£ÛúÊÅôõÍ£ÞØ4¦\LÆ ïëîk€­)™¼�ÚÙÑRˆ²ÑÃú·ì²-ÏÂÕÇçÎÓ« R»»y÷e„-íÃ*IläZ©ªHie·³ó‘Z¢9¥&ܸcäöŽÏ?Äë'Tâ“çO‹fϘ¼§¥±òºLëSßðå _xzÕ´™“wÏ=æÍE¯ˆÌ ̧�^{wüU?¿(RúÄÃÞ*®Ú0aÂÈž¯ÿÓ³w/ž½ü�ý<* µnÓâ/;¬ß:êÊŸ|ÂÈîÙS¶s8`Lçæ=ÃÛÅÑww7ÿú¡ØdI˜D1Íš²³XÐ0}ÂÞ(2ïgѰæÁÁja°R¨Ñª¦Ñ%§¬ºê̕߾óôu›Ç˜^G¶MÙý…�.ÿì<§6z Zhm¬lß Ë £f½{çÓG̘´»¥É2jõ»ã>ý‹�ÇJŸxè»CÅU'LÙóõ‹Ÿ½ûÙ#–¿¾Ÿã¼|}óX–b’Å·=vü/~࢓þþÍ‹ŸùÒ¹K¾ö‡³V¿3qdëऑÝ_8gùgç†d4 ÑPõ –ËÕ¡¤Ð=PÎ4jm>ïêBš“Œu  õÔq{ßÝ9²½»Ñ¹^CÇèÖ¾†BòÆ–1N¬k7�-Ò-½{z‡ ådŒÃ{Kqòή±¼æ�ïìW,$#[úz‡`gw[’ÆHDÕ$RJ»ºà=m¼8œ�¦À²ÎtóÞ\Ž xiÞ®ù˜Òc‘4iÎ&‚‹¬[;FíîiåwA½ÃUJA�¦¡á¤a¨¢þI#º¿0wégÏ\!„Rlk¬lï…žÊyŽ>ùDµ-ÇUdÄ–þÐ!‘T3ög^ã¤0/D ÷Û ú€âêè´ Иž©÷Ђ}Û¹Wjîò-–ÛŒH�-Úž€HOóÔ'+O4ì$Ë^º÷l"Ý¿�ÏaÁ¯�ù’ xŽ9@EY™ð J!" BP¦¸Ùþ©#=TJ)â,¾BžDöªBŒKJ›7A +²?Ͷ6òä…à%ë®2Ò&¹®‰ ¥ p箌Þ¥â¬eƒy'E(U¦4)‚Àà]Il ¬"c´ŸÉ‡CK�ëHôŽ+è/?'úOú¢¦&¥jrº.)_¸@Í% Á3ߘ×B�ËðÍM&Ô¼é¬ ‚nÄF_‘uÆ"E® 0s™spÍ» i†Îhj V@X’çëþ¨#Œðªw2a¿,2ƒ~¬+�D‘5°l\Ò/i�Ys s}Êz’zƒ Ð9ð„Ù¯K±´çÉl¼M¡D…XT@dжö D¾'è|FÉý8|©W`{àù™£]ðÕ™�;¿�t¸�QŠi†C¬Ì=Š¢²¦LeUûf ž.&¥Á”s ÌúNGrDÔ�”r>Û-ZYM\Ê9˜8ªK¡ÞÝÝD™V?žÊS«¦º3�{ºš� š©›šsßs³.9ùµ]ùä¦]Ãþù¶³·w´šfSÆužvĆg^›rå™+—¾qÀÖöÖZÆ…/" ñÖžy…8u:En#EÚ j>Ž3X-lØ>²o° ":ULRâ„!ý^ãþæ€æúD¨$…4S’Îöž†§^�>÷è7ÿöâÌ“{oý–Ñ›v €öî/?·pxóàE\»qꎗߚØ?TPߺü™o]þŒ¹7¨Ï€ÎÞ†ÖÐÖTùò…/¬ß:ê—ž8}|G¥½¹y̳k¦ˆ†dLÀE*"}щko¼ðy¥ü(Ž9h«mMpϳG|ãsÁ½0ã'ÑÐPH¿sùSî®Áj¡©œ4Óƒ'ínïi¨B܃8e\Çi³á™5S®| ÙGM5&éÃ=*E5TƒLÇÖø1´VV}pÕ¯år±‚ `ìí©àuv·ðçcºHéc¥ ÑÎ"DßÕ´ µ ƒÙZŒ°Ô�©#Ö¬ÔÏœþè«Ó]lÑ„»»šÐ¥‹}»9¿'ݟ˽ñÒ9I!ÿ²ÚpZFJyOfokßHªŠ¸­P…FŠZM……*¢Hé¸u”(Ò$XW{x³’³r¦Øz7äükm¿±!Kæ•Éwá�†bòñ®Ý²gØÛ[GàŽŽ–ýÇvlï˜�e‘sÎ’úÝÝM¿^pÂC˹ëë>åðwïæ�ðºûK7ÞvöÎΦۮè«?÷õßͬÆdc jÂRœÙèD@»:«ñÌýw/}}3�ƒ÷ÛSM#SÅŽë,’ÁjÛ‘dQ{wSH»LÞÌŒhݤKX¥³:Ë ~»Vi¢y=ÿ‚³oo={ÿ'Vtî osÐÖãfl™¿xV5S@´qçðÛ¿jãø×Þ?0T€‘­ýDp÷âÙ�½4šÔþù�.á�ÝqÀØÎýFw-\>Ck$ Ño®]ð›k˜«i¦®»õÜ…/Ì8ã¦ÝÃ>þ£Oììlv&@#[îú—{í Ùä�î5ê,|êg¯X?É .޲›®züöëÈ´ºåáãû†Šì{<´èî/}ùö³wu5ßöÅ¿vñ³_ûý¼Áj¡£·qGgËþc:vt¶d™|IÙ’øø«3Î=ñ�£ÚzÜŒÍónÊ<ŒeÚ!¯8ØlUQ;ä/þöÜ…+”Ðù„þ¡â››Ç<±½\H:{Œöîè¤([yïˆõ*>‹ÑmàŸr£`e¨ƒÿjiÁ4§GBÊ�êˆç €ggQfµR­Q)¥�bŒâ(J)K´¶›CÊ�IDn;O°»Î‚¶uc|¡¾ j;Ë€r`µà[ƒÖ¨¨"[škŒ‰Ô‰Ý>Q…3¦ÜÏ/]€1-<ý®†ÒMÝ�÷rk)éXŒ†¤«ã£á-Ó'´0®ëòÓVÏ:pç ¿=§g €w?3û_/[ÜÓß°`ùÁIªž¼wt[ï_žŸUÍ¢£§o›4²{õ;ã«…£¦ok,%{{œ^ô :z»û›~8ÿ”Û¿ôà§­ºýñcLüé¯vu4Ï;nýÒ7öïì-—‹é–ö¶öžæ‡—z噯lko[ùÖÄ#¦íøôY+,=xgWs)Î`öÔ—Ÿ¶záòC¦Nèøg®|nÍ�;ö6‡BJÏGC1™6¡Ý sè,oko‘Mj`4 bÿ�¥pÙûwö•ËÅlËž6#…†bR.¦ÅBÚXJ‡L9 ÷µaûˆu›Æ|â´WŠÉŠõ“ E[÷´Ý²ð¸ñ#úN�½áØ[¦ŽïüÍ‚9ðîöÏý}*�î*f©�2»çHé ?¸fxóàù'¾¾ðåC€4þzÁ K_ßß„W­aýÖÑÄfè"µˆ1ªÍ ȃ„îz{†4S¿øë‰.=¤£¯qGGë?ùäS«¦/~m «&@_¥ØÙÛØÕ×ðÃ{O¹ýú?yêªÛŸ8¶{ |Ïâ#¾yÉ3=å+f&‰:xrûè¶¾??ÿ�$‹hãö‘ë6�¹Â0ê­ýœàâH_xÒšá̓çŸðú—gÚ!?tâR[7šÔ[[GsÜ#@ŒTvá k+iá½�Ã{‡J‡í¿óÒ“_[ñÖäî�†jY2úË V’$‘%ã…YBMr¾ÕÅQhm¬Ä±n*%¥BZMc“LxbåÁ�¸æÛ—=õ?OÝ3Ð0idWï`qå†Ií=ͯ8ìÊÓ_ÚÖÞöʆIGLÙþé3^yê•Cww´D�†¡GY¤t¬2…ZS�ýMϽ>ëÜ£—ïén{}ëäƒ'n;÷ØÏ®=´½¯Õè<@~�Å"dD":fê†ëæ.¼õ‰¹ËßžÁ9láH\ºÔëïÉ-wxàª�À«X˜MÕâÞž–“ycÍæ)=ƒåRœíìn3«OåbZŠ’b”6ÓjZ ˆ8˜·wŽœsЛ+Þ>hW×ðÏ\{ÈÄ­›ÛGƒ†�´á‰×Žþô©OöWÊϼvhÏ�;bOkSïŸ_<¼šE�kžÐV�(Ø›aþºi ƒÃt·+¢à¥wÉd_â0�"31Œ²ŠÒÍIÔH1Ú7ðXhq‹Ç‹L¡@cÎó3¶f1#"(ÔÅËED¦¨ÖÍ^T¡ç7úm“�Ž¡ŒÞ5?�Í@u0¨Ú\¶HÚ”˜`ZH«Å”"°ðšg¯¶¦Wº`䨨¡1–ðÇp^,.£�êö£ÝLŽ€P xFªÜ¢ !ðÇ,ZšQ)Ú³‡†ú2’¹{ô:�"¨3ß IeZÙ�uò\ˆŠ™ 8 m/ñ2‹X|÷Élr:á!?$Ps‰†$~ ˆ!�TÁ¦Qi×3ûyF�f• P¤bA÷fn3UQ»£í\�Dt M0cXÏá@¦Êùü¾£É¾’ˆà»rm µë*Ç�œK '^‰|k˜™»$øÏBâÉR°2dyn'ÃÂúžkÞùs�ä3Ã>ñ!5%W‰o· KX{£œ˜ô ­ ZÊóÁ)c>H@Y–ióz³Â£H)J(K�^ &i@Ž6)SÛµp ×u_G�îxXë+’dcÐHUH"ˆ"PÆÝ©`!ÓU¤í<}‡’/,Ø:èx&‰è ¼ØéYοcVXr^Õ²ŠïP þù‚%ן·lwWÓ’u\öã‹ßØ2Ú<ùþëîkøÌÙ/}æì—é½]Ãæ?3;#‚B”^5÷•©ö6Ó-{Ún[xÜâצ‰peµií{co~pÎ�>¿nó˜%ëöG€þ¡âï9õ—.^ðÝ?E‘~péÌýï�$YtÛ#Çö¿òñç'�îÞ±·åî§ÿÓGg™‚8€…Ëg̘Ôþ¥ŸÜ‘iµ`ÙÌŸ?pRª£zöG’GLÛþð÷ÿä®™ïÔäD+ã+û‡ ?œê7/}öÁïþ)Šô‚¥3ÿõgŽÑwçWï=`l§)ÉX}ë/·´·}ꦋ7ìeîM³øáe3o¾vÁ/º««ðäÃßùÑ•ONÑ=”įn˜ðìkš4³Z�TDc†÷K†ni¶¥}5}ÛܣׯÛ4Ö&kÌeí{ão^0çÆ ž_·y̒׸Éa]ý Ÿ™»â3s�Ú Ÿÿìá6ÉÔÃ˽ùó>°ä0Ã(£ïóŽ^Á ëì�ÿeþ3k¦ ÙÆ#–¬;ÀË4€ @¤ÊÅäÊ3Vî7¦«±œììl~ôåCnY8§š*@¸ÿÅúúÊŸ™÷’ c¶¦š qà *’_}î¡�¹! ¾rá³_>ÿ¹­{‡}ú¿µmÔkþ¿Î»î£Kîºq~ém{Û~ñàWn­á¶ÇŽë*~åÂg'�êÞÑÑr×â#þöܱ­�ª±-ùçy ŽŸþV©PE„¶~ü„·wŒøáýoÚ;úþås“â'?üÌØ¶®öÞÖGVõÐ+Çj­R;C2äÙ¯¡Øü¢«.Pȉ:™+"W$x\¶MФ¢]\·’¬vœ¦JRºãé3¯:mÑ/>u‡Rzñºüæ±³G ïýÑ%wNÑa"ø½_úÉ®îaß¾çòM{G“Žæ?ÿ¡Ïžùø�/»3Ñjù[‡üùœޙþ¶!à©5‡÷4\0géÇOZHÛÚG<´âÈrA¥jë<}rØÊ� Jf‡ÎÃj[ëÊÑÂMb×é2SÆ…ú6‡Ví“s9͈â« zŠÙ`D-•¨�D®ÁD‡Æ“? IDAT÷,&BòS$œû–•[{ñ+&Ÿ‚"¹&ÂpŒ%2ë–Vªâ•G`8èÜ¿ÀBÌl‘† -ˆ&“�DiR̲˜l†[ò5âÕ¬qÄ„8ŠQk1-à³ iFñŒžÚok°Ihæ°½Ì�‘ì è\‘X»�¯i G.Ï xk}³€t˜“B.QmN×Ì/œJ›Y¬÷ƃ‘g¦ST¢ Rˆì®ÛX‚¸€”’N�¡ºÙ‡mœ>ð¼“nØ7°øäo÷t¡>NÕ‚lQíF.R¹ø³í1ÆÊ £’æ Iä$ÊõÌN=šM×ù?7þù;wž±xÍc‹OÚsæQVn˜¸òí ƒÕÂÕg½üíËž–ÅÓæÐoYxüOÿr²Qí�pÝ÷®xrñkS¾úûyÍåÊuç-;ÎÚÖÆ §ìó4áÜwòm�çR×pùKsõÙž½\Ÿ­ý§ÃÀ¬±¶5 ÜúÅ<ôݺ¾‘ÖmwåÏ/ÚÑÙZ#ÅZG‡¡ÎÔéïÀq]üò}ß¹ë#‹×˜Úk¼èƒÿþ'-^sà¿ü~^s¹zý¹KÏŸ³®µq¨Î�ÿ|òm�Ÿë�3"xÔFíÕ�RK:Ï�¹¦T\þ_o2¥&·`qt$r.â­‚|"F¨¥{¦Luظ¥@¾½fÞ|Aôr˼àèÌ?(&å§ûÒX"»%ˆ†P¹Hó‹wrD>Júg�qÈQ Q§ZW€Sè¨P_E Üï´ ý y <|c0ðã~ ÄZ/cÞÏ‚0óµ7@U²1…5¤˜`S%Ž“ˆÀnJŠ\¾ÓzJK”óœnÉRÂ9ôÔùS--«œü”@XmÈDþŸHl“0³zã †�o#.J·NaÐä¶�éRvC’Áa¾Ç@)ÜlÐ<Â'æ]\uÕoæB 6åÉwoZcFW˜elÖW³Ë×rAÒ«…�ˆ>â9ϸïCFG2\0pɼ}p»V$þ•mÃpãš?'¸ŠY„…`þèõÆmèK'Î|¯£¯aõÆñÀysëè7·ŽaOI‹^™¶e×° Øa¾³s8Kâ‹ëö»å¡î^<»¨00TüÖÿœñƒ»O›2nïø½�¥•V€�¦jÅ[“Áë9ÀÞކůM½ñ޳Û{¥ûjk¬üàSOnÝÓæÆe§JÔÕ×ð©ÿüøÌÉ{&Žê‰£Ì‰4a÷@yÕÆ ½ƒEv^_J ©Ñ5 £VmçØ»tÝ~·<<çîÅG †Jßúã™ß¿çt7d…Ú<3M£oM Å ìA0¬DÕd+j鬡Û{¦ðæð Ë D#¥Jg "·Ñ¬uç¾êËæçrnˆÏðô 9Ò¸—Rì°1˜![Oí` ]Í…1 WìÓ�£#¢#Ž�‹­Î°�q‹þ‚4²Ìf"ü²-f"âä¥é™¸ÖVE  44V¨„�”Uç ô$Zkt)h¶;´÷²箜œåzjnÎÌ"uØÍ&ž¹b#pÈ<&¡9Œ!­40Â8ƒÔç£*ª’b’5 Æ*s|DÖ ž–¸d'+/"˜o¸Pë]®¬q »|ÿ_Åþ8ô¶èÜ4I&ø¾DbÊ\5[\£"ÐIœU ©ŽLVuܭƸ]5i>6Ž‹öËÝÈÊ`tÞ|sÎx“Ä!)9S¨ ͸¨‰æC‡D,Є-MTˆ©»‡º;SWvO~§jÿ èrËHˆ˜2³f�Ù�_avË‹þ³ƒÃ' ,ÅJ�‹ë(þ%ÓÜ€Äx Pí�›š02/Osݰ÷ä)k*ô'ÔSåÐå%ì]±ÏJšhGQ;gb<*$V¡b>d:Í Pªc­ ƒnÐCv¡`K0!~>G•Õ— Ö{ž—¸G \¯~æGâvÑ 8ÓÑ­§ÄqØ\KÐé‚—”ùžó¯?:fq€pFnlÁ¢ !‹¼]Úì¾&Ò¤ R  Qe¤Ê´E‹2ÊH9ˆD†œÓÊ|V;À>¶½¦°�ï6à ú@¤)bb3•Qét€ò©3ß#I!ûÅ^ãˆÈ¾!ÂyMÈÍ­´¯|v�XíEßf—+Ÿ ÊéY~å-�ÁùÕüÐ F—ò÷ï$™&�¥ìÿ˜Ï–$ïëç ,‹ˆÊŒuü;ƒàB5��µMEº¥œL›¸÷?>ýø=ÏÌþâ£Âé»°r\b)‰Øí¸ Ì™Båì~B©wÔkí3§õ`ŇXpmȋ۟ç.j‚Q¤[JÕ©Ûråãw/žý‡EG…z%†ø�EúÜP¦¶Rí&¬žÙó9äá8÷Vï[Yõ{ï~ Qy4Æ%Žóþ­g#†8»Pý’å�…úJkp²`´A¼àòÇövªQ7Á&^åw,âÛ‚Øæ~¢(áðEæYnÒ/æcäƒ Ŭ_#hʆ@gTÍ '…î!�h ‡ü\ààÿÈJ wž<9ÌjŽÍaâHÞ¬< {gº¦ó Õ¸«3…ªQœFî…?7­âé³V„Zò‘X±'ô†BW éµ\à|§tÄ"Ý̤¢­¦qj—¡®ÆYµ�Q$�?Z†¹Ü®êSåN>B56Ç`çSLh'SVEóFá¿ÑO\„˜xeN¬NI…%€B†C­áÍ7+ÕA>mØèòÙv{ofµù *„jË)�³å¼a{-Îy#¶dy�°7ì^DrŸA ÌÛÿöh€€RUíŒF�*€'ÊÛ”\Î+aTÀöè­ "sõã®(‡{L³ ªÌ5pðûÞ:k2ÖïóCÞ¾¯G;õn\þ™‹çÁQ7¦@MŒ}ÿÈ)àÄ®vAR>+÷do¤ù¼µ¤.ÿÃ>…Øeþk[ÖNÀášÕ†Àe·!*e?QEDé”tÌÿ½1]x_æ€�„ìHjêÚCjó†C²�ÿåÜ# ¢#¿C%¥¨Þ5,o•þ�-øð*³c<.y§Íg×’ƒâ?Ö/¯çr> ŒÏ¬Cþ&yÉè¢èÛ>KîÏ(”\h‘M¹3ÀÜJî–\X“w €†š�°B!ìK£ÝÄÕ}ÞËÄA§—(ñH�`üˆ¾{¿1xóÀ_žŸõçç?`‹ˆ [xþÈå^~+ÍölR‹Þ7 ùøUg9†}i"1CêG€šÆî¹0hˆ%f3GPe×Mo›AŒÞ}ï×ïÞ<ø—>Àï#Rx;s7§&õ’ä‹´/KA�pÌ^úxº+® ˆú>G($n: ©8DP¶¦.Ú ò¬¡™|’+Åà¦~î'¾¿ÅÿÓ2•Öv¦Í7 Ó éCŒw`|œ¶_„3aÀfù«|ÀiYÛÎsœënÉÒ཈d�P#›\$¹ÚîìK Ä�@ZE +4¼ úSè¢!û `ãAg–Y–�³pñÑEirüO•³r„ê[¸êæ ì"P:ز˵S'‘NKUUL#@br–ͼ÷âö1x|èïu’eN:ôϰIPãaµEa¹Oi _4î‡L«1e±6Ÿ;79lþŸM¢ª@Ü¥š†MŒãؤW�'ã.qÖÕ;f M�§ˆd!ƒù©à÷.Ð*¬ñì--@[·êÊ æÈ.ü² ØG›vò¡¬�Qä¹*à'»åXÇ+×V(‡wN½öš„M/hѸn´r €†º¢¶æˆmœˆ X.TúZˈUêM¼ƒ!—}óvòÀȤ‹Ü;¡g(Œn§î}29-1·w}5÷þ/ ÛðJnÇ0iÓî¬Ì‚MëÜé1S ' •Â… òö›¿ á-¾ †=˰M> Hù½F)а)/+;tç„Ýûá�$€Ù"Hr¢´¾{߃ Ê2ÊÍ`cE¤¨ª3³? ŒÉÉ‚@J6—á ó *É;gÁ%Èý™ ½Âï0žyéy¦AW�aŒ±}©©*Ö:A� [$¬£ìäy‡yûÓ–G"ø9ƒû÷¨i7moØ­0�âók[Ü‘«q^' ©–#î6äµCŽyB„J $Š‚Ü˘Xï÷?vŸ$q¡g…;CþO½¿Â+#a›z´H;t?C�4ûÌ)ž“ƒ zßÑ…B %{ë=&7®ºƒÂØÂZ%Øçíáxê°¨ÖÖkõí–¹S9ÿ·c…(M Ip¶6”Ããÿ¨ò¹ä 4Æjb F‰­ÖséaÖ7;ßé’Ãæ¥…:ìæ¤æ¾i‘�Óxf­x«#öÕ¼¦Ïï¨Y ,\rߪàþ�£çþ‰«2<—=Kó p©nÓÊK ¨ i…€` ÅîªîMHónƒÆÅ �ˆTJ­8€¿'7ÏGÛ�©c~ƒý`§ÑgT�4QA„ƒL2N³Ê�`?ˆ2CT/få3±þGîÒ¹yä-èªÊzâÑ£b�fWv³Þ!A*4ax3á–.HÁá)3e lYŒW!¤YŠªšÇÙòO§ Á!ËûïŸ ÿGÒç?jê9å÷÷Ôu© 1U®+Ï w½?³¬ ANîyÿY/²¸G×éÓÅáv$¦æ&?1ÎAŽ<% PEœ_ÐDU�ŠÜv�>˘Y/Cå‘çÿ!¨×² Jäš!>ö0_‘ôeÖÚmcHB¨~õ‚kKÂ'@,âøiÂ6IäÉÑ•@žã:¯e€`5g�|pGö,úþìdÂYtHž¢œv’h)SÏÓå�—‹wf<ÈÜC/�ù#ë7‰6ná.¯ü“üH-Ú¸b7Åô4°…ºb÷œ]rÌÆÑsœR««>µ^,gQ뤂ŽQÕôï/ \$?…¹LÄcµð±Ç@(<@Ž÷^ˆ¡]º™*Y¼váÿx?÷MŒ.€°’%H02Ï çó‹#ÚŸb‰†OÌÓý|ÛÞÔ€9`·VqÌø€‘Cèµë‰6 æÝÀk"XPîëAH±Ãµ¦ÂZ(\º¸¤,ˈ€ˆ°€…"RJÍUjŒptYõ$ÔU…jfÈ`Lg� !L‹S­,YÉ7çÛjV˜#NýÝCD ”íÅšà 4ÓP¬#ÂB†Å,*hëgm€–¡ÊfLXZ‚>[$ $ ú|€´[ŹòÛ�„ûD‚;™Oɵu’n�Éûü� ÎÊÝíR¬ VäÙz̾±þ%vVAžë´t ÀMìI œ¼£fð¿xi0’!;ƒX_¦�%䦶R@±¥L¬uIö )æ.YFÖòXžä af6è„P00\9´ þéç¹»ŒÞ º\ ?<§òû2ÁšKXCŽSMßVFJÇÃôàmÙ6‡ä½@ 3­’ ¢”"eda_7�|ÚuácƒAƸDvö‚ˆÜDf¸áXä‚üò%B~jöJŠoΘ6è ]„ÞZÞ3ÎðΕÁ~0Ãf8-gœý¸q´ùRE¨­xÄ‹5ä¥K„¨ jÀ¨¢ Œ@ã`Ý õ§˜YÒlÐf–ré�.3IÖ&Ö‹ê”û›§›íFÙ/>Ú^s÷�fHYLC1)€B†E­bR‘lË×Çë0–�}éýưnÎ+¢)ü1ÛK }JT…´ :UDŠ\~Ç€okË Ó>€ñ–zTkI5��¢’¶2ÕVÈ‚<71émw\ÉGØ!j"Å¥ ÎN•‚Ö ‚Í›ÒjE³%ú'ÛL?úN…I[³KK VÏ—9»ä�WÄ›œËd¹ˆe)%§Én¢é”У�†£à1AX[L¢b¤Š¥àÛ±Æ!(´_œAÀLSs##Ê4ìéãB½S w6n¼ ¥¤Ñn›‚b`.ùžr$A¹;“ÖîG®“ÿaËÆ˜‹ÅÌÈ}Ü [z|‰q¬!ñh®-QãM‡8Tåj?ä#€» ÉBñ¯Õ 7±w¡üy| ®BÆyf~(‡c£©.ZÆyg%u/GmÈ>M¤u¦P)DDUT ª¤3Ò¼­†¸‰%ìô—Âè’ Ìw>wÐû^­mÃÌòñ;…4Œ1F"$„"¥)�`�í6r6jþå¹(†ýÇ2“G‰ ¢¼cðVåxLèEe¬û^O—ìÙk� ÷,J©†^µò©Ö5Ëó=Ö=¢š±qH©ËSpØ‚n}XrœÄð.ásæ[c9P_Úû,Mð¦VhêÓ>6 �c=»Q‡m 4 öŽÀ`ÅõŒãÐrcI€ ƒ8¦*Î;ˆº‹‚®Ž–5õmjæ¿«ÆŠÿRÔUà› Îû‘H%x lÕïæJô«8ÂÞ2ô/Ž8+]T®U\Ô-ƒw!R/¿å<‡Š5™ Ä벮稞NæŒòÀQÞ× Œ‰e¥;©¶ž˜Â°EEgù¤$>=ê9dÑ;ÌNÀ‘‡â¬«æ µNfVµ!%BΦ„ ]¼yj1ª]€ãeâÕtÆÑK E‘ -±3xCí«2Bä|c˜qÈsW)Nj[†Z8k‰~D.‰Á¿¯A–,Kp™Jýy’â¢Á#[.cb¤Îu œùlpøVq^Ë" tžYͽîXðY±èvòûÚBŒƒàþ_¦ˆ{ "2ˆçk4 D„I ÃÔ–˜PzË0b!lúªMˆ8ä³»â�E!Ý>DÄ(qº…û1]‘`âK/yøXb¬�2@ŠXÁtȤÎÀ™Ä9Ä%ÝÌ–î�±€·!ȺlPÅBmÙZ d S&ßÄ�M=NG_�-};ºòI]6ç±i\’¯3þaOR‹äîôB÷¾)<³çG&  — R/'ŒˆD k¡¥êê°¿ÏnÝ:˜/Öx=îM×g´y.¬HN#¡R¬Ä:•=¥ÁšC 3ˆ/Úäñ¬"u´÷ å¯Z*°¦´Vñ±Ô›Ô×c!o¬z=¢PHÞÁ‚Eh­‡œ�Š…Ž0šåÙTt/[ü<>Rª ’½�v¿!� %�U—œ7 5-a‚"íˆÝUå"ד´ùÇUýÐ1Z¤V3Ø1ÇÃv ¨ØR} zM�¢¶»Jaü¸Š3D—ŸÉŒ¯ÈÏâ`=‚FO\ÂP‹“!ä)ØZ½-�!Ï}ö<DHL‚€“ä))SZ¡”È:8ãí´ŠzÎÚ36�aQ¶W•ŠÕ0^I°`?Y…}È�áD`‘,T0 —÷Çœ5 ¤e¤ ÆE†̇$÷‹¾»ÎºÎoŸpÀÒ' Þʈ9–7ò¤LZ ñò-ë3|ˆbi¹¦:ßÀ0,”©d�¹ûŽ¿Uœ” Zì`£Ž3�éFPþCß­6G2K–(ñˆ¡}èô—ó9{×SG”+I­ii;uw@{ËpC]I²•Bˆó–ƒ#¹îþ“?�€ø,Gnµ‚ʈžÛMõ#?ûô‚ ;Ûô·wWÒ¤ª=Ä<†iöT9*ÂÐJ¢ªÖ�RÚ[†êJµF$"Éw÷׫qAñ¹‘ÚשKúÞPÅÓð 1;kvD5�`Õ¹á2P ”&Á\Å©£ì?»hHÞ %4qUFPçNÄõ�ôF¼YíÅŽlÛÞÃFßf! Õ'«Å[é¤j° à%½{ÐÜ;õÌðÍ¿àCýN¨X`dUaº”ë!ŠYø';0ù‚¡”r%(–`L‚ÄýêO¡dƒïá]:dÖ�*?Í“ÅðìT?X ÷f¢Æ å*Xî8˜ v"1E*ÿÅdKÝ—�_>@±×fúqÜA �V…|!ÙæÕ†S}0ªàƒ©e…÷£JŒËP�„5®bÜ24áŒHît\ëÀUïyéŵûZ2c[ïþæ�Oí�öƒ#ùk~6÷™WÐ0¾û±G/>ñõÚó#¸gñ7Ü|¡¥ÀìÙÓvüåkw�izgÞô Ô쇗¯X?Ù‘/—|3 IDATO‡�5{ýño¹wñ•T}ùù�\Û;£JI¼±+cè{ýSþò.äŠDí!¢Cy­jSÑÎÒwˆ�ÑÍÚ¤¸7Ø·Ô ¹™ç] 0\Ƥ¹ÃDÕý[8S%xÝ[ˆD;—ŽÈÀ ˆŸ@—8¦0°7_)Ô’¸M�Iï X°÷z~ÇžƒI€V!�ÇL#‡Ç ?têÊü JÔÛgʵ×$%. iYé† #Ñ�šÔS¤¤B¹5V`œ…¡Ôô§ÔŸR™üìÜ«|q³£ªÀ@¤r‰ Á´´EöŽMh ±dõݱæ)ê~HvÌâ—Ô´1 HV”–C! Z†€äPž-o)¾J„‹[ü½žÿˆhÊP7�Ô�@c½i˜�$$²súro â$›:ÁX-ýˆ¬':Œ_}ÓY¦+îÚ+£%Èå ¥`ãútdȆ²0Ž÷Xý“Nâö Tê˺ößËW#O® ò&ñ(lŽè QÎA¥ÀCß²W¦Õí#ݦ¹9IDçú`IŸ PjaL$FRØ3ü»] ;Jl²¼ †Z™YR÷ïpˆÍˆ©R­¼.}ÖDØÒç(9:1ñ蜫«nÈäÄBÉRΊ‚vDÂS …Ñäì¼ü ™mB̺ñªsYI VÉ8 5¯°\ ÀD‡»Åè©„ITQB à¯k/:•±øöm#"bÞ$9FÛj±íUõÄBVX=…¢/DšäoäŸ'E€™6~`vE±#÷a¤Li 6‡ ’L 1dS°%¬Ëš—Ñ‘ã8IÌž ¿D¿��è¸È· ß xóJõg‚*|ôìUŸ8÷¥+þÏ»÷6•Uf¸ÞZ”8RqÊpPhŽ'\Û0ýR‰@“ëHJ¦ÊŒ‰‚Ý�Œž0Ç@ìˆ9ç+Ï8rý˜¦¡»Ÿ>"MˆðîgÞõøK3`úä=×\ðB–r? ž?äs¿¹8M@}±rËï�IB@x{wë¿þáüBÎÊÇ·õö¢eåŠùÍ'ô 48Õ+•“�»Ú€A˜2¶÷ú‹—Œi➣c`¸põ/æ>ûÊZ={å'Î~éŠï_±{ocõ-YM«ÆA+D®à¦|ÝoeÊþh(Vnùâ=1oÉk]ä £~«¹š%ÃÐâËœ£=æ m¿ü̼ß-8é/‹æp•ÝÝ:Ó«�a0MHLú�kþ~î1¯¹;n_|úí‹O#ÿ¿¤^Yš.‡Q[ŽQüS±$ˆbÈ[{O ²0|A{&íÒ�Cô�ºä´ã2rå¹'.=oöòöæ¾þ¡â-OžûÄêÙ!«æ»õ®Ä€ýúÜ{ß}è7å;ž9ý¶gNÓ’`H \ ÷Pü s Œ–Ÿ `b’Bª@R¦ÆŒKÍHJýýJ‡QÙÃSÜÿ;T}2Îü$�³0Ï‘Â]ËŠ7î˜w�IÆ‚‚¸$m²¶îžhñ‰¬áˆHòD’ºy׎°0dŠCØHØÐlòí‰{0“Èo(!{9íçÐ…G”À€Œ`xoƒeÄ F´‘(¼µB+kÑ ¤–V@„í[mOwɸDm€„îsêèù‚(úâ¦ÍìÍU Ç&¦øª¥.Á\'¥•‚Ó@W=®ÆØJ–´ à›Ã%°‘ÕÀâ 0Ðõ[LòhêMxǯoàMU‚D±ê�€v÷óÊÜËIÆ&â 3Dÿ-!ƒ¶bŒÇëÄ4d'”ÕÏ@-¯bcÐ!·×DÌÀý�oÑ¢¢èdÔ¾º²€ä‰Ú`‰™�£³D.ÇÒmH™x0!æ§|0ÏK €yAýôÈû5/¹+âoä uªšPU!L¦ V“ô”sµdXãðŠ*D>· ¡mðî$@j§Ì ˆÄŸ&ˆÓ€ \äô�“©Àëš o]à�W¶âd]†ŠA“@â")&6©Gª -AÌtˆÔ‡Ïäxsþý#‹Ýw×õ¿½è—×-X³yÂ�·�AãÛÿúwΘÜi-öô—½±ïM Ž_±n²(>ÇP¼¦†XÀ £ñƒjGa¬X(ÿþ ó]>㎅³!hCˆKa»Q¡e-\½ÈŒZ"üûG^}Þ‹šÅ�¯8è_~qi©œ0s…Bç-|çõ…òﮟ÷Øòw.š­|n˜,Û¥6¡ÆYG ®µièCg¼üøÊwŽ9öà­[;ÚhÝ–±�,?Žék¸êÜ— 0(D/¸èø7.:þ�êÙ¹ä®rà= �¼4ÓOžhÚä¼¥aä«·œ·fóø·w�)K5H¤7õ…ò×>ðTc±ô�?Ÿ·w ˆŠ'0sêž��µœ³uµtùŸ¤˜?¨dï}ç)+iûµ‡1páqo\{þó‡ìÛAë·�ýóãGÿuñ‘U~YÓ :eo¦‚! Ààp~Ó®1�} |% ,©¿>ÏЦÉu¿»ôÀæKÛö/ÿçåw"€ÿŒvþ‘ú ©·78ý‹¾ð§- ù]]èpW�®:㉙“¶ýpþÜÞ;osǸ›Ÿx�¢™í!mï|Ðì7\|ìÒÛŸ9cÙº™Å\¹{°Qð­|—�·�€(ùïû.ÿá¼¹�uÃßþÀ�2VUR¼–ë7Žg×QË+#Á*{ &€„9LrˆõD“Õ�ÀØ –m2„ÔŸÂ�… ŽÇ=C¬Ĉ‰¬e>giAL W¡2¡•û"µq°\ãqurÔI*£¨’‹ð»(jxåw;¸®GÆ'@œ6¢çT¾lŠƒ¦¡„õõXl7¹:ã(‡ œ1""â—V©ÄGä>É"9¿�Àzä£&¿ Ýe¶äÍW�?D€-!µµb¾]vû–c ÃpN £[Ú¡DãßHèŸ([GcËÅr`¢Œ†7œ©¦ ÆÂ½ kmN‘Î+¥‘ù»}“É—ÂK )a9œ�S¬ìÅöq¡xϯ†êà×¹Œiê+AÏpX°ú<ú÷¡¼œS=} R]^ä8Å»Y¡˜“eªY^Ë#ÝwHNg/©tCÍC^±åi=ñÙQޱϨ+×7›º;ᥤ+?H†òøÐk�zIF¦:ס~ ž„¢2�«É¯:“õ6LêÆñ¨OŽÞ9›nU|±µFè'âܶAD“Ç$G¦BT¶.z”bHRåІ�ÊHÄëF�½6†´F†[MÎ9Lo)X 6Á$ãsj9›$`K†|†”xC0£½˜ãàÝ}žáºþ¡º¾¡ºž¾¢h µð“{Ož¿dÖ¾c{?|öê?}åÞ¯Þ|þ#˧;Kuê$úí%°WÒ«@á=/ɲÊÒP¬ŒkÐnKKŒä”?Äž�Âî È>zà[•Þ¬|kò·o={¨ä¥¾¡:²Uôô êë*ãÛF��rKÕéØ ÈßsO^3¦iè>æ¬Ùëÿã# ÿãÖsÀ„Ð^|1�åó�¯8èßþx^š†¶ˆX¬«üôÚjÚŠãˆ�7éûOYóõ=ÕÖ8<<’›1¥ó»b{gó/ç�òèK•m"�ÍB!I¿pésï9zÝÞvö�OY=¯ÓßxÅi«Ê•DÍ®&gj¤&²Æ�TÝæñ}ýOç[þ K$uSfÏ)û@pÒ¡oßø±Gç/;ô{·ŸIh¦OìÜÜÑFY÷ZÓ5‹³çø(¶GøúÖñWüàÃ’c‚�ç Ð&†ÁÙá�§5RÁ¡6!‘Ë;oÛhL�?S¨¼ÿ'_/ýêí`[¹F_AmôŒ$°Ð7X?8R) ×õ‰��~ÏHp€n"ØZ).]{Èž¾–£¹žÅKO‘CSHÒ4ázVWæË>U”¨àekxñ’ƒô$0˳^=G©>ÃḑŠ–òe(– µŒ•”J€ƒƒ) ¥&]çQ”ƒðƒ‡à½\‰¯�¨’ �waÏ—å˜é–HÊ9tz±jÎ’’?O¼á ñ‡‹ [ ¿ Á…2Ö &Å ÔçL}æ Ÿ‹EÖL!]Vo€h=!.Ù"ªë „ÀÛ!–WUî~ò; ¨šH?£Ç;dÝŠj¶Ñ.*øi¨Ím‚¬¸«›URB¤Ä "æóI¡Li™RK1øÝÀ.™-âF«•ªZï¢`ư´/�4€D€D�Bêжq×PRGÖZ*°F•ç ±»¯~ï@±TIö»û¢çÉzzÖo»~ÛØ%¯ï÷ƒ«ùüûŸ{áÍ)Ý}õƤÿæµ¾4sjGï@Ý=‹ÿÍüúë —¤WœùÊ'Î}é€ñ{Gò«ÖOúî_Î|sÇXˆ9ÑX_úÑÕ�LÛû™_]ÜÜ0ü«ëL›Ø]—/ÿðšG~xÍ#Öâo8á‡}7 å�Ÿ½âCg¾tSsÃðÒ×÷¿ñ¶37w´<µã×=à(üÁÕÿàꇭÅß>pÂ�þvZCqä¦ëç¿ûð�pË£Çtîm¼ú‚›Š¥ÿºãŒ×Mùýæ}í–ó¯ÙÁÐI‡nþɧüÌ//nkùÜ%K»ûê¿þÁ§Žž±ý¾%‡-_7Å |ëʅߺr¡#rp$/:Á ßÉÎ9ê­sŽú5TD°eñ‘½bÎØSßøÅKŸ;rÚŽE«§=¶|æW.{æ™WxðŃ¿t鳿üìü—Þœú�ÛÏZóöxQ´+Ï\uÍy/néhýþU�üèê‡dW5þô«äò–F*FéVÖö›êG~ø©‡�”·wµ$ ]xìÚkÏÁ«ÍsGüæþú†Š‡°ó÷×ÏûêÿœÿÜšý]o'ºé'×>ø™_]²Ò׋»)ÿªæ”7»¾�A‡îÛÑÙßðëûOÚ½· ˆ^|s ‡kH{á±k¯½à…™S˜Œ'ö O;|ã/]¼§·ñ”ÃÞ¾oÉáI’¾ïø×_1ã>op¤pÃܧ¯»hi.±Öâ�w�uË#ÇI®fOÛþÙ‹–7sKc±´agûOî=ý±•3 X(ìÌå:}Õ”±½Û:[ïX4ç/ �)%Î; V0äÊ…àÿ©._yïQ/œ7{ÅøÖ½»zÛYyôƒ+Ž©äêó¥oͽûÕÍûOÓ5û€�õuïl>ðæÇÎÙ¹·�NÇN[ÿ…‹æßôèùϾqˆËíy>qÀ!Á1Ø7Ô80\WN“þ‘ú½C (ß~“�,ƒ¤öÆ�{ÿ_÷×ÑT?b ýË~½­7üï'wïm�<¦û#ï~êÈ6´6võ5=þòœ{ž;y¸\`ïFÊapþ91éyG­zï±Ë&µuW on›rócçnÞ3Π±§ÎzýÒ—î¿Ï®þá⓯Ìþëâ“GŠ¢ânQÖjáí.xκŒµÃÃ.ÁY \A®…4•!HG- ŒX_î“AQ bÔ,ŽÛ Q‚ù •Ce§d_! È Í/£P¸(ã(¡G¢%bÔ9Bø€!(”’b ‹%lÈc¡sE“äær‹n�“ «‘ŠÉŽ;†A˜ #wÉH&Û¿ŸÆçhÐÊQÍŠA›ÆTäž“#_9ÜØõ�T)á[o »ïc%¾76yŸÙ`(@ò"0†€0±•ºJ5ìŠèÍÆe)ʼ°›a}ö•ÒŒâeAšÉ’s¹¢`-äUPj‰ÊÿAH‡ –°±%ËäYi"AÎ@S k†+hDo=šc5"ë"ñ>AY«${ †ÂËìQ#s¬S�£´!ª}ÞO^Á©è®jCà6ºWwÆ¿¨v�ª� `UÌ£÷°0ºE†Ï Qî¢e”!@ž¢Í®@‚)Ë™tµK2S®%*ñ®ù‹r�ÔÉl¿U¿kaìš FÛh À¼Ir�T¬JÒ5 [pÊüOÞ8�îôL3\$ÞŒ6OOlÍ�„:D€�°eE¦ ” & ·ÿl„z²e²%Sk²˜c*éí]c 9k _{{ÂÛ»Æ(ö6•*É}ÏþóÏ,8xjÇÒ×÷»ì”×n¸|ñ/î;鉕Ó÷×û�O<^ÌW¾wûijæ´óúK–üzÞ O¬:¨¡®|à„žÝ=Mqš�êòåo^ñôôÉ�ÿò‹K·w6çº?òߘÐÞÿ»ÏÏ¿ýÉÙó–J€Cyç?û¾esOyõÆÛÏ\¾nÊÑ3¶ëÊ'[‡zï)ÎO|øŒÕÿzóŸùÕ%S÷Ùû‹ë|õ‹¿ý¿g—S�®.šñ,ˆ¬ ÚO�÷â·o=û«·œ¿OËÀo¯ŸÿåËßðûóßÚÞþ±|`ü˜�ß~~Þ gÏ[r(ö å-ÁÀPÝGð�b¡üý«�{òšç×îûþÿüÈP)?R6ƒ#ÅW7Ž¿à¸7–¾1Õ¦€ˆ§±qÃŽö7·ísâ¬-»ºš¶u6=sÛήæ?;crç†�í_þý…÷/›u¬ÍNu^Ý8ñšŸ_væìõß¾ò‰»¿qç ¿¿ðÑ3œºÝ»ø°î¾ú�‘ü¯yø¦Ž[»u4¥óº÷-u¹.±0\*-‰Í¯®PùƇžž>©ó3¿zÿö®Vš{Ò+7Ì]üËù'?±jú¾ûô~çc�óåï<ëÍ­ã^}{ü…Ç­]öƾijáÔ#6nØÙþæ¶}ÈZüö_ÎùáßNc±ií"©³ò2y¾°iw[[Ãð‘Ó¶?¾r†ÊK" Ì=éÕæ>ûËù'?¹jÆÔq=ßùècÅ|å{w� @3§ìùûsG<øü!?ºæ¡¿>ó®�ÿøƒ?¾zÁÁûîY±nòOî=ýgóN�6¾ûf.U—˜:sÊîß|ö¾×¶Lü̯/íêkš9u÷¦ÝcÀúìEKçžôò�wž³ü­)G´í›W<ÞÒ4ü³¿Ÿê0k_j±Bq0þÀI‹Ï>|Õ-Ož÷ÚÖ©‡NÝzõY�4ÕÝöÌîê%Ç-ýýcçÿüá÷¶¾1÷ž��þôOî_J‰›fJPI�%ƒ aÁƒ eÏ ¸Ý,vt· “R‚�»&lïK6ì{ÿá’ {°áû¿Ü{Ú¡¯]|ܲÿöÁî�¦Ôšž¡z$ɯ~û€{–žÔÓß4}ÒŽ9÷á¾Áúù/œ ;qBH•É!S·èÔ§ï^|ê ëfsåÉíÝ]ýͯœ}Äê�œþÔ]ÏžöºZ÷~úü‡ê’ò-Oœkm¢ýjØÉ{êp÷X Æ}‘r�Ëæl™êÊÔ\›BJ08”ÂÁ0@…jD7_C�œ‘ƒÚPBµ+‚8¦lJ†tïŠsâ UZ&­F¯ü† Ÿb])©/c=˜\êš1WD“ø*¹„Ã#<Þàl.3ÕC\d²4�ÝOãjüœ)ÈÝR+ rÙ¢‘�êeÊu)DT,BCP ë^/�”þr-ŠGºž»¨!1 oIƒ•ºÅ&udÐY.±×¿ï€¢ ¼kᛓ¬ª"´A1½ª00jèàþo¤;×>6g •V kb¢`Ú›0g¨”bÇe¸^¨øÌÔPxß…5& 8.ƒ˜a<�×èÄ n DZÖÌj32½eš1ȬJdÖwóƒÇnëlNŒ€]-[;ZàÍmí¨”!kr†®¿d鉇nºî—ïÛ¸s U¬ÙÝÓ@•Ôì¨ÛÑÕ$£�o¸è„µ|ô؇_<zqÆ”q=9sõ� �ìé¯À%¯í¿hõ�D°¥£õö'fiîâ‰í}[:Z£à'Nƒ½Ú‰³6¿zóÏE2ÿuçé7?|¬³á•ë'?üÒÁ6ÅÝ=MϬ>ðœ£ßjªé¨ßÕÓ•Ôô 5…î)çG*¹rÅüäžSßÞ5F ìþ¥‡Þpù³SÚû¶t´¶4Œœ8kóü%‡ ž\9}áªé>cÕaûw|÷¶³vu7�m$ 7·Œ}tùAØÙWÕ¹/eF9ýÈ 7ñïõ…2¼ãQN“ÏüòâG^šén_¿}Ÿ-m¿]pâƒÏ<\ ïstÚj žXqÐË&\qú++×OàÞ7Xœ·ôÐSߘVpÕ†)ϯ݈z‹ŸÀ†úâHjÍÐHR팈LbÒëß÷܉³6]÷ë÷mØ9€ZêG>|æê;Ÿ:òާfÑ®îæ[:î —>wóCýÛ»Zæ/=ì+—=3¹½×3ê�Íó–60\8ã]ÿ/S^~0€w1 WO»ùáã~tõCk6O¼íÉ9O®š^ªä ¥~èÃg®ºó©#ïxjíìn¼åáã¾pÉs7?|<ì¬þ�}�±{_1ãí]c†Jù1MƒŽ_65Ýõ効‘1pÁqk‡Jù¿õ=»º›àÍmû8ßÚÑq¯ÿñ±ã^~0<¼üà)ûì½òŒw.𽣫F*T) N$@¢±Í}§ÍZ3ÿ¥¯�‹_?d\K÷…s–?²âè¾ázX»mêâ7gÙÔt 4¯XÐñ3×Ö×�ô78¤²bãô«~ó%fCx§žxMUÌí/½¼ùÀÕ›Ä^:Á€Ìêƒ%ïé!võ7!`ßP]jM×@ÓžÞfðÁ™ºš]5Çý¹|ýA+6L›1i; Ûd¤œšÛ07†`ÏÞÖ]=mˆ¸yÏ8GmcÝÐyG­xtÅQ¯8 ;ûZæ-=áŠw?ó÷e'vô¶*­C…š$œó£FíֻØ�Ò÷• €Hds`ò ”B¡D�e  ¦)TJ%Ä!‚ ÿÃ0"CZ´‹ %)–=ç8¶*Ȧ ’Ælø/[Ñ|C$�qÑsíüxQ�·I]ÉS,Ì×c®LÁ„·¹¦¾¶DR�Îk{hÆ¡-ìØ GŽNü!"×§Qé7wIA ÐÃ’Û9¦¸á¹ƒB›[7®«ô÷WŒáf²DqO;ºob"€û�!èx6—R]xïJvYpŽ8€®àì€7(ô…µsØsà; dQ ƒQ…òC@Àᮤ±ÑÔø…åªQƒ ‹T_ K°£—_0f÷Q{µURäm¬uëhè\…”OÈ’À†Pk¤ÊB2Su;e¦"$³.êÆz)£u@lÄý#Tl‹}E5˜FùF¯.ÜŒzcE d×ø­‘"ð¾M˜¥pÒ�{I A­¿¢Id–9ô£s ÀgiÁë3k k4ì�9Ÿ±8¢”È’~JÒTÈ–m à%A‚z'‚ «W‚¬Åk!JS͵>¨ibÖÔ¦+dS*å 1èÒ=hêr֖н>Ü5Ì�Zï ‹í\3É"Š5c[†¦î³÷³?ÿé‹^t-Œ¡ÁR¾¥qd{gËòuSn}ü¨^ûð•ë'ýïãsž~ù€Ôæ„¥4¹âÌUŸ:oùüïY¯m!èÈdP+ËøÖ¾b¾üú¦q,n|íí ÅBy˜þžþzØÞÕR±®Dwv5å“t|ÛÀÖŽV ÑN=‰Æò^µ~Ò·o={¨” ³{o£´ÙÜÑZ*{0:\NŒ±†w¹ÉhÚëwŒÝÖÙÌ�hÙÚ}Gr§¹ñÖ'fŸøñåSöé�=}§ëmÿñ=›;Ú˜ÐÃ+h³«§éóNRSA‰{IŽŽ˜¶#ŸK`ÆäÎ$ñ©ãöæá¡R~h$¯dçé-UÌg¬þÔ{–ÿÇ­g¿¶y‚;=¶uhêØ½Ÿ}ï²Oó{TXm†·wµ<ÏŒúËsqŒZs¬Ú0é“?½,gìɇ¿=8\XùÖäÉc{¿þA=e ðÚ¦ L@¹bnzðø{~Ù)¯|ム¿xɳ_ûãù«6LÞ§uX‘áÛ:2œÄû† �õåár¾w°ÎZ‹C¹°Н«Cš>±sÃα�{ÔU$€ñ­ýÅ|ùõ-ãÄY¾¶yB±PžØÖ¿£³ÅµH Ò(ê´7örå�»&ð>2�°É IDAT:lÜ5©�/·7÷õÕÀ޽måJÎm”�TclbxâèÒt!´ª²Z~TÄ+QØ`''(¥Æ\2Kˆ@òæi‰Úü'Sí @À–ÆþËN\rÒÌ7Úš �+/Y;+˜´N!ˆ-!¾¾yʃ/÷…÷ο`û”^:vÅúi©Mˆ¨­ip|kÏå'/~ÿIKÝ] Ú¡r¡±8¬p¶×Ùð“a�2&<$ Œ¢ˆøœ*]öø’S€ $ ˜8c¶)Ø Ù¢ X€Ôb™p„h¡P(³ÛQØIŠ6°- ‡Lþ-Äwæ§�Èñ(ôJ<À RB˜·˜O“:‹ÅÔs9ÈÕcRD“G4€€Ö¹@‘ÀRGÙðN‹Àº�”s`Ó_�7£øbÓÒXfå /k7$þä qµ“K[ |ZÚ6½•vv•cÔî¨uåÅá!~#2^fð…îý*iCYM 3?E�<Ÿ¥ºE!ŸVUpœD’Œ7@­0|€g¬­!¿E5[$ŸéÛ•„ÓÔf,�<›å¹-… D€` ´Ôî�½Ã”KÀ¿%HÌÕYD¬9Ö’Ol[J’Š¢‘2A�ËE4b†ø‘,á©‹ÕHiÇ»;ÐФr¾á‚BÞZiuç™ñ¨!åd«òšÑ""¸´àpüÝñÃZÄT(3 L‡œsÌäªÑ9)•c(—�ȨG5"åŽÈ,FÝ,ÀlÓѺ¨Ñ»:÷”¤ÿœd’\.)§i™RàšE�wQ¸KQE1C%B‘vmTS‹I“>ˆŸ0÷‚ ŽNÇËX1`s”øÝã„L‘05¶„`‘�rä­§§ŠY®O·× íèi"‚Ôšïßqúã+¦ËUK¸»§‘ÊóËyÇßµèð�ñÊ]õø¦Ým_úÝ…Û:›]ÿÓ&vŸuÔú…«¦]uîòçÖ°mO³š"Åã:3œ«‘5 3 òIE Î$ʱDóâ?t}vær%MÂ͵Uk`¤œKS#0 ;{žX>ãücÞ¸ï¹Y§ñöÚ-ã6íj#€w¾ñçŸY0¦iè²SÖ¬Ÿ¶ãÅ7§ ç â·®\ô­+¹Þ=„õLA€®¾úg_9 µqäËï_¼vÛ>?ŸwòA“:GJÉ›Æ=ýò�ã”ÿw\vÊ«7Ì}Æe ÝqìÌ­¾s‚;ÍùúÏã�+d´PŸ¯üç•OÊ]C¥|c±\_(@zzû+¤ýƒƒ D¡w‘¨Ä¸4M€w“£áÐør 1‚ƲtÉýŸá)8—ÁÏ//)ØÛÔc­N>Û­Ç'€ÄT®=û±‰í=ÿ}ßevO°©¹æÜGÛû(;òË%„IDT¦ä®gOytåœ÷Ì^ñ¹ ÜÞ5æ§ó/íèm!BKæOOž»ìÍ" ¦«·‘»ðë�,ÿÀ×*dËZºœ°?öãýkNó¡{. IÞ$õàrdɦÔä?9î�°%²… PL¨ XBÊ•°*%‹©˜!•å©" €a%Ê‘Ió)¬Iò€29„$�IL“€A4H@hÑ…n £4Ÿlça.þåßë'‹þ¡Ÿ Õ²öz|ÉZÞ7"Éspª’ËCKš¶m´»w�ƒñ!òÃþhÀ'¶™¥N“sCZàwùiNc`­^£ÖFh ©@¶ˆ VˆD¹�·ü_T‰_ðqŽ·¡ˆJ]I{{‚h|¯aÕOÀVˆ�¦ØÞL¹„Ê)ìè“&¹Å6É@nu@’ÕvôXÒ‚‘¡¯5áW™DÈK5 ðQïÚ¸†W*Jø·öÛµðˆ»T;( ìÒ4ýS‡Œ,ú¢'ŸéKere(¼ vD¡†½ÜšO`èÅGÅs•DªRX]�@6÷!p°j�óÏŒ'4£þ?ö†1‹�»2@)YkÁcÜ·$Á”É–m*^Ú¯|løÈ‡9¶0v †óIîÒÕ#zßC‡ûL ‰;# �Ђ-#09H|)Pb“z°%t9æÀ'çPyò\ ÔçË—¿{Í–Ž¶u[Û`GWóþº¶u϶£|»¤coÓ¯æ�xÿ’Cnÿ·¿�~ä†ÛúVì¨ûòï.ØÕÕxÓïÿÚŸúÚÎ*åÙðŒ%(äREíên*åfí¿ë¹×ösýÏÚ¿£TIvu7¹Nì*æ+C¥<L›ÐUN“ޝmÆXé夒rMÛTLpÅ’T]íò¹ß`Xðèò™ŸüÚ±3·ðÖ;½«œ&°agûM¿rýäÕ'`lË Yº}Ñ‘? Ìœ²ç3ï[¼XÐ6À„îýÆ÷<øüÁdMB¿þÜý¿þÜýnôJj>ÿÛ÷-X6KÑècǦÝm—ßxåÎîf-÷ö–¡Û¿z#±1êÊüÇ—?ÿÆTGF’Ø^óðÍ_¸7µæ7œÐ?TÇÍIÝÞ�º/ÿþÂ]ÝÍ7]?ïkxêkÿsþP)ßÕW¿£»yÿ ]Ûºš­5aÀ#Ëg^|ÒëÇÎÜzüÁ[î\td©Ì˜NìÞo\Ï‚e@4 ýúºù¿¾n¾Lùs¿½xÁó‡Ô!àÀPþ�Mã™ÒQÌU<ã»¶w5§Ö½i[‚Z¬ 1�Ô‡†ÀdͦÝmg¼k}[ÓPGo£ 쮇ÝÝ�C¥ü¡ûíZòúþn®³öÛU*'®Éõ>œY  £ìξÆárþÀ‰»Vošæî:püÎrštö5{l…±Çô…jÈkmkÉárŽ �_DA ѹ>Po}øW‘è@â°*2òq—€Ô[”}R 뇜°kþóÇ¿µc2ä“t|kO¥’ ‚µ–ƒF`5¿Šîhºkñ»Ÿ^sØ�WÞvÌAë^qôÞ�†=½-“Ú;÷ôcõcÝ!¶† ²`Á :IZ‡”ÏA•S‹Ó‹’…ü­– ¶<¢1‰!È»! …”ÀY´)QÀRš«Ø$%¬�µ°ÖX‚Š+Á`ö;Î' „ ÆQ’@C”„`‚†L‚¦˜æÑ$ˆ9_й¯Ô¿—FIM °˜_É ô›æþ‘È(+íqðåE„_ºù%œ%U{ANÑ4dA«#‚µ”ËAK+šíÚBÛ¶Ž$‰¤]À£D0°:€�"nõÃÝ’ÕWDy2¨#¬bô>µBì ‚Æé€ç3Ðú‡áý=¡gçë‚=y3éÌ5Ôc]SKœU$‹Ú[¨/Rc=˜�ýPIɽUÜó×�á¶2Ü F<¡ètŸÐ¤PëPð5“puVBZÀÏûªáu_$ÍTj1ê´êÏjP–‰ÖºM6¬Ôœ “í¤‹™Xë‡ü©ÿ• ê©Æ})h8#oK#Õ©b[x°V÷,‡2Àð3sÐ-5Ÿ":³éö@¼‹ õQe%5ÎdÈ¥1¤Öººm4XÀ$o’²M=ÚÆ°:ÔùuKÑ¿œ�ÔÜ(ð]ÚªÊlyýNÐâ@jü;h.DèÜ‚-�ÍabÜ»ÿˆLÁBs@YnV—��iœ1¹ó€I=9kõ»¦í¼þ·í,ÀíOÎþæ•‹zëç/�U.ã!ûvŽÓÿ×§Ž(¥æ˜™Û§ŒÝ»jý¤¡Rþè™ÛŠå®Þð“þá|WoCÏ@Ã�wœ~ó—îÿèÙ«þððqD–†ó»ºš.<áÍ¥¯ïßÝW,Ö¥[:Zöìm¼éaŸ|Ïòí{Z_zs꜃¶ò¼åó—²£»©˜K`Îô�Wž½ê�¥³¦OîüÄyËŸ~ùÀ��MM‹Ù¬ø\_(4y�CçÐ7T·­³Eö�A,Ð?’ßÕÕ|Á k—¼¾w±X¨lÙÓêbq}¡RÌW ¹´¾®2TÊ¡ò·ë··¯Ù4á#g¯¨/”_X»¯ëpÛžÖß,8aR{ÿ™³×wð–铺=ÿBظ½ý©W‚�áBZ -‚Jšûî—Ç4 ]ròk ^8Èâ/矴äµýüf«Åµ[Ç*ì>„…Ù耫x‘ÛSþ„׋PIñg÷ž2ï¹C»ûê·w5ßøñGŸX9cÑêuôí.t÷5öô×ßxç7aÞGÏ\ù‡GŽí(Þ¾pÎ7¯XØ;X?Ù¬rÙ2uϸ1ý}ú]å4 õ;Æ®Ù4þ£g­,ÊϯݗA6æ;÷ÔWÆ4 ]zòk ^<€xÊû;ÉâÚ­ãô<’ÄÎ=éÕ‘Jþí�cú† ‡ï¿ëŠ3V?¿vßžÁb¹’ܱhÎ7>¤ÈØ·s|[ÿÝÏœ Äi:¿l ¶4 çs¶±X©+¤#¥Ä�±Ç–rÙÉ/ÿû‡ŸüóãÇôÖMÛÛ7\XþÖÔŽ¾¦–~Õ9/lÛÓº|ÝÔÙÓ·_uîK÷/›µ³»˜¡…\ ‰5iÅ ¥ä뛟y툋�YÖÑÓúÚ¶}™¼íâã^xêÕÃöô5’TÅå° “Çàá˜éo}îü¿{ôüeëöÄË´(ÄAk ÀúÈ-‰VŸ+$/t·¡OâÂý¾�dþ|âåO(•ò{Ž™±îÕ-ûá¹³W¹ÿ¦åë§q® —¤Ib“¢±d7æ¬}·ŒoÝ»vÛä‘raÖÔ­ÅBÙ½8h`¤î‘Ç|òìdžëŸZsX¥’8¾£­©ïñU³¹`ÌM�п<„bß© ‚uìñîDàS¯"k6ßSØ|G}b³JVB�Yd¡Îýe Y@›�Ûð¨À¦~ƒ2<©&{� O+!ŸlNÈç› OØ’_kñ&"„ãCµ:ÇìP‚•oˆr¢Tâ;¹7~HÆå´D0Çp"ÙD!™¦(ފںŭ[y�óÌF²”$ÐÒIžöl§Mo�˜Ä¨A=o½£I?»`g£ À¨4–"¹e[T¼ª¿”Ìçƒè‘IfÓ¥ÐO˜¼ËlòFWè�9âËÆTLs{.µ¼øu_l~B–óÔh ­ w„ºÀð[ È2wÔ.c‰kKµ°Äÿ“+ VÕhŒ!£¶¢05}²)í ,ÍBC5ŒÖ'iô¢¾˜á�êy‘Y]ë­æ´ý�ïÝ*>¾â ùÅûQéG0'›† ß»ãŒo\ñÔüïÜš$vÞ’Yßüã{&¶÷ßöµ»˜ÐíJ2Vÿî[:Z?þ£¬Û>ÖuX®$,=ôW×Í¿÷ÙÃ\žÎ8rãÿùäcSÚ÷—s+ÖM~zõ��{›@ÔO{$9\pìï?iÍ;ú˜ÛoûÚ] WO+äÓ ;Ú¿z@]¿cìâ5T�èé ,ÊW�»|¿ñÝ ÅÊÎ^<ä7÷ŸèÞö}ÏâÃ{ú‹×œ“Aò´ƒå£¾Pþùgî?稷Lá+sŸúò¥OoílûÔO/sÛ>«7L¼þ¦K®ßâÛþõÎ$±Û:[vß©+Þkᦇ�ïÎå²§¦î³wGWóí‹æüù±cÒŠ…ò�¯^pÖì·êJˆpøÛ>töÒí]í7ÞóÁM{ö¹gÙ‰C¥º��¾pBkÏžÞ–‡–}ÿKÇ[k0—²cF áCæ¬ ’AièýNØú—h‹àŸï¢�•Ovï­—ºc«¸ÿðGaŸ†Ëu^tÖµç>ö»Oÿ¶w¨á‘•G=øÒ1Û»� �/ù½óO˜ùf]¾„OÞzù)Ïmïj¿ñ¯ÜÔ±OÎT.>~ÙÔ}öóå]Ým_ròKoÍtÚøÄËï꪿ôÄ%ï?a "mëjtÅQ6–»<æ&•Ê!¡ÑP@&â+Meâ:Šù¹H»Ý{߇ñI}‚¡D²¡ÜVTçÁ&ÅßÌÄyfòyW-‰ôð<«! C@üx‘¼œçãV‹8mV²ä‚'ù’}î÷õÿoüûNˆH=û'%¤a¹Æ¸ dUÏ iöKܵƒ¹D~Zh u $yèÜA7 ›e.Á)º`ç^n<¶&®?ö®  B¥X†1° 8“Î \Ëž¾"" ËÞñ‘x.Mü¿Ù]iéLP//^$Ø ”{’±ã’ÐBp¼·]w?XKm��ËQjqû^Dô¥%~åÈ�)ñwŒˆÝœÔ¾Y›ø}Z�’ª]kø"[SàÉãËLÒšbcÆEg"öf_£7ê�Y Fo_;`¨SRœ¹A3ŒOR�º49óîe[ww…½M¾Þ|ÓØ[Àx¡R T2sSDU!àš<É0/¦ü�PÍþÚü£fºC¹Õ=%‰˜À:Lò‰)Û´Â_ò• (†‚OiG >’¡ß“oȈ¨óÓRù-gt‘‰4m˜Z*C9“@8çÀìlì0\e\‹€>¬&4>ÃY#&[´AdÀ�¿êPŽE÷Ì鈪Ôוoùò½kÞžð_w�.›Ãq·™ßሄO“4m1ƒÂ:Ut½F¹NêþóWþöí[Ïyjõ�®å!S;Þsôºå리X7e¨”ûÔù/ýÇ•Oêâiwø÷ˆÿí4÷�Ðå§¾ú��=¾hõ´¯ÞrASqäó—,¹ô¤5- #~›ŽW–ð¿ï>í¦�×]}áâ%7\ölõ@w,šíê³3Ühkúíçï?õð�Y!ð�k6M¸ê'—W¿€%#�jפÝJ`ÔÄîÿ½á¯ßþË9‹^vµ×tÙ©k¾ûÑÇ­žö¯ÿsASqäúK–^zâ«£Nù¡j9ÒÚ®5žhhÃÁ#š1V÷"óðΔwÞÙœS=¨�¦Ô% c¡Ðl¤¢Õ«‚@7⇲BR2r¥Ü_(î ´yJ5p½‡ç5�òN™xp1>ãéð@]Åýzdî�ÜšÀ[‹Jà‰©0D ¶¦ˆa?¢7a22á`óC Dñ½‡e£ 3ŸRB-ó›Ymy³†ŸË¡5…ÑâaT3BcâEQ¤W¼YéKv´´ø :?œrÍQKVŸrVþ5$ªaþÑ…�òf�BW(½»wHË%©ÈakòNړ豸óŸf�0ZÛ )`ç»aý0ú�þr”A@ã EŒûíê´Ýc‘’qBD |š6—ü—wôf³}”=¬e .Š(½M©þ0Ì6xâ · Á R:‚¡]¹æÆ\ccbm-ýç!ÈB±÷i!@غzÝÇéÙ¬» gωàà–b.£@Ã&W]4®š(ãYd5]T!ìÿ‡C{Òh¤*ƒ¾:JWµÉ¨6ôÒHîÏĬQbKd_Yª«nç>³�!j/\ÌvYÑÕ$ªö¡#ŸJD|=‚ŽÎÑwºÇß(ùü§n÷ú?w3•(M݇ëÄ~‘'¢¨Sÿá?âqPÉ: ç¸Rnp4*"ŠÒä0—ƒ°ž­°‚5ÂEƒåAj�P ÎyíÈ$ g4å⸫PO7%ÕtG/ÿ�ßÂÌö¥cQhÜ™¢ 3÷w*ø‚ÿÕ¡Ê{Ö“ÝÔÕW¿rýD^+ÓÚ-ãÖnç8�/Ÿ¾yW+*f¸ˆ`ãŽ6ÿ•FÂçÖì÷›ù'Þ¾pÎÀp~`8ÿ­?Ÿû½ÛΞ6©sb{oC]Å_¾ZI“ç×NÍðeO_âÕÓn¸ùÂ=½�Z‚- Ã7~ü‰­{Z•dÃÕž�†OüèòYûíž²Oo’øWyÚ{êW¾5©¨Pc¡³ºÆªÑþäÃÞîê¯_¹~"‹ —¼¶ßoî?é¶…³‡ ƒÃùoþéœïÞvÖ´I�“Úûêʤ¦Ð�ËÛ!ñ"Ûx8†äžÀõ,6ÿDZÐ]Ïey¦ @‡êàS¼ HPd\,Åœ>¾é¾ǰùsÆRâ,Çt` BBŒ •÷!�Ò"N|†7 (›e(CòÖ ß)¤š�±!Ç Þ“!¡* W9à±»E£ký‚È� ø9?¡Ôµ!’Ïçÿè§ŠŽ.½0�]KþuÁÛ‘n~®Ö–Ù-K+"R¯ôòz@<°�%K–�>ë ûW¯�dÝâE*P¦~da»É†h!'{.L¼%Ê%Ð<“<íÙn7¼5lrüˆà¥ÑÿÏó8ü ¡îÒé$ ؆2QYæˆÁØ'Hº7D»ªÉ¿'� Ü>Y% ¡›@ŸŽbŠ#ݹbÎ46&²Î 8~ùE ˜&@„Þì Ä�VÁ}²3èCXæ°”æ\AZÍäŸæ‚¦˜�N NiÄ&Éì,#£� Ð«F H€´° ÿâu«sÚW‹u(Ò>ÛKPbrœ�o$Õ^ò¥ÚψÑC3�“ › 4ˆ fæD\C,°F�–=… Wj@ær-cȶÌŽqÉU,Ì.âtk­ÃÙÔ"bb¬Ãœ5¦Liʾ�ƒ<Çðxfžª¬�â·‡pÔ… ŸUBõ7£9`Kô¦)ž¸œsàv4t ¼I3Èñ–(OÐÍ9uõ‰ î\÷%üâ^Te8Tk¨í`ð¦™|¶!¡ªgU@Â�%Àg‚·¿WžwAÉEˆsÐ\à?t •Ils±|Д=ÿýÉGîX8çO�´ V{RÜÕ‰»ˆbÅu$°ñë1õ+ Ex@Í£¦^¡þUµ‹$ ž±X‹ˆ %ú°ÐrlOÛT,4¥óŸ|äö…³ÿøØQÀ–7n J¶PõgõÉÌÔjºS}ÉggkÖºMùÙh $kåqDuL& „6$ùñ�«KÈ.ç`/HgíT®A !.Q’©ác\%©�‡öŽXµÂÊžßPH4.úz‰`>a8Œ¥F¥(8^“.@Bl$¬{ÙÆÕ»–²ˆÇ7°€ŒNCýœ@Ç�íÓlôŠj-ãüe˜IqbY'Þy0a»!`È(â…'[�À~¢.$ó¨J^y§$¯íö (\Õ¶ª½RVK$ÑèaƒÏ‹„ûu¶îd@è—@eL£è�þ=Ù¤nÖB.-íhrÔ¹ƒ6¬Æ$ãUx™…(ùl@0�ÑœÖ&4€Ð`ÚX‚ºÔ+.”¢ŸPœ¿ÌW{ŠšQ©jGE»ï0+)¦ñýEñT)½’B:l*�¹qsž{Ì(KdDŽj¤½U@®uC<êhÍ|c=£´¡l²G ‚â§ß²7V¨ìâÈ“)Ý5“]óÇèT¿ŸÞ�‹T DÈ ÕwÕ„ jô,Þù­7}µª�A4î)km‰RKÖ{g½\Ì@‡LW±Ùo…’ë¸Ü‹¢äK¢`”-8qRÍéÜI`ŸsîRòA±”ô~M¤SzÒ·g1ý€˜ý"=‰nãsʹÝßZ¤×»maêÝni óC¦UÙšj¢‹âŽ8BúF“ÚûîúÆ]cšÿöô»î~öƒ¤ vT$޵A ᶠ͢8ÑÄ¥¯ê3ò«*Çn@)£VØØ¬¦[Ÿ¯¥3áŠÀÿžØÞw÷¿Ý9¦iðoϼëîgGžyÈ÷)ÓUª9EÆLš­úwd^U„y¢8ù’q” Íü‡5%bÞNŽY.q$7G«¾ µöA®Ž}Ýûaw­Mx… à3šŠ[œóØæëOT-/sØW}¨R" i}×%iÖ±o�7b€{\ÂdP[u` ‚Êùì´(‰0‹XÑv*+vñ‹¼¶! fH@`ù»A9 Ð盧ÛòLóÊž#•!ÆåÁ 0“½x ®ÌÁx ¥lY\³»+¸i 3ˆ¤'‰òA^aV¼�€èWC²ƒ�l¤‹Á05¬vbGþÔ$»Ü@(ÖGžÊWø¶€ß>óîô½©P IDAT#ÃRà 0€%Èç ¹0G�Ûhã†&ˆåïëâ½…”W"ºíR¨‚ìµ m¡ u) 0‚Qx(ŽBt¬¡ìqAÉX´Â&á!U�”/ÄËê9Ƥˆ2Ü*«'Ó!™1Ù"EˆóÍ:•‹»ƒ#ŒC%O�å% ~íÌ™6$¹ƒóU‹+QßKì@œi(–Ch¢HœÃÛA2Ä@^ÆåŽ0Å׉UûÑ›„=† R—èY€d ¹ ŒÁ�o§[¶•¦W3QHcƒÿÖŽ«É6äÿDVDnIyk[Ê‘3sF9‚RUû`--PñB] Í%B3#A‹ Å·ïåèàF0¼+ר�kj4DÂI+®/ DœÐF¹ºqk7™DA1¶m`|Ž~ù¤Á !Ž˜Dál?e©™\«øâÌ2Lkœnq}È?“Õ®ud�©Æ$ìµÔ £v¢;�nYõß)DH\ˆ²0¢UQƒ2È[mu²!èyÌ3™ ŽBô(³‹õÿ|Ëÿÿ{«¶´x3ûË( �øí,€Šý„�¦ÛŠÿE­Ø*ˆI8§ÍÕ­ 6”Cߺ^ézU¹ˆž ß…¿W–Ø!ƒå¨ ÿ í�)E9ã“Y„IäßÓª(¨Í~ÉÉŸÄ[ž!hF�gnGŸK)É…�ÕpI½`Q¤U÷5Š­�Y”�Öì†Ô|ì….<©L�D0arÜ[–0ñH;©ø–Lö"ËËÌ”åß`ï’ˆç*½gѺmá@Œÿ›ïÐŽ'H<€¢ F~+Cvöp�PfÞÕX<`õÄ‚ªd AþŒ£ 3Ʋ¥!‹é€ Jmù¥Ì'’µ8ºY§�ˆÖZ^X{¶�Ï3&V³âŽ}rÚ£(†6¨¸m7¡O3ÌõùE"K¤T‘„|ç PwøÖ Šç¢ *ªñŸäA.?‚hˆüŒ„eœÒçÇÉÁç¡åU-Á‘D&<‰W ?Olí]вP � ‘÷ó ˆÜ·Ø¹Nok�-Æ9LŠ’m¤~°`u�»%þ�%í�ň(È%Ìhðt�ŽX¯uèÿu]ª„/Ê.3À(³ê‹Ðܰe]ºyK ÑpðR� |„ÿ—õ7 i×¹Û\A#Q"›‰�Ùe�¨ŒVG¸,KùªÓ¼ØÜò¬ jåþ}ñš#]ùBb뜄%¶A€DèWP–ÈÂØfÊ.Ãö½dŒŸq=’¶UŸ\eûðkIKc䕯ÔÃÊÄÂö&øÄçc¦øˆ%íŽëÆr&+‰ê“Xãë�ÈJ9ˆš¾]^&>‘bR¨)’[�¨ˆ¢Î¯W¥SÙÖa2]GÈ9PwÈ’0(¦ò?ÙõˆtnG�¦H¦&kßé5þ¿Y7Eñ¿µX—½¹æ‘¹%«§”¦¶’¦d ,å0©Ï &ñq tPRäH Ô}ßDäóâa_aJäâíOçv¼и eã}õ´ô §�aTйVÈ*ž‰ñ‘0½#ÌŽ‡â–œáÔ”=‰Ap$ ê=ÞeæAÕ"ƒÛò­!Œ1z@ÒQËJÁO jQkÏÿÈ8¤Ì4˜/£ê8œß%NLT·¬Ò¾¢pðTbt¸ e´«éÚSv1•–Š@%†Î¬±| Ãò¾9ƒp£édF÷ÕAÑ"[ ~€‚ñUÙw@aÓ¶ãYÓ‚‹W”µÔ}£9˜ ÁÝ©…°V6±Y¥ým²›K0J†Á‹$¶�3‚n÷zÅ7”ÈËS%ÆÇ »šæøP…îc6ÁÏW׫ ’ôå¢zòUJIUÆ@βÊɳd$y¶i~;¬¯}«¯��µ!†T ºµ7 žãd¸)ÂgÍ#€àTURø“c/H†•¼æ;ý£¤Ñ¶¿mŒ$=2 ŠªÊFl�ó£Ä[‰=|'ª¬vÖ^´Â8ììÃcÅ—¶×reÕdK’ÌŒ%1AllÄÆ6€MoØ�;Ë&A^-yKv†îØnŒñYm�Ýa&~CÃ͉šJ˜#/¯5”P$<Ôp1^ƒ"÷©ýå>ä&’1ÔÒ� /øêNÝ�Ê`b†±mLÎíb !ÞÙЕ%jmÂbR€-Ýh™Dÿ:?ôœË× kh¢Ä”c½Ð*¢%‹¢êZ,5¹ª‚‹â¸nŸÉ´ª›ñ¢|o–†Úª�áQ”ªŽ�ì”'’°(Ih`CEEoø‡%©sâÅyÙj5Õýg”è�j½ß‹£ÜUƒ'ÙÑjÜDñŸµz©¾Š™_ò¯ÿQò¼#¡Ùè3‡¼r¦©­øtäMÒ�äs�„e®± ΈM7ÎõEé$@E3cª�Gu|ª(Þ 48ªL²Â ÂÂöžÎã†5»çkf?`ç%±‡”Ð�ï®Í{a‘Ê>1]ÚSè �ɧfíS¸æs6ˆ—B€Oµ§NhéŒ2� Œ„ò9¯À¥Z†Uݩҩ²óÿ‘K¤Úð¿¼OúÎØ¼Ž  9ªÏ«îKDmtnEœ¼úBN”fDWc¨ªU?‹2Ú~Ïp Aœ`•ƒ%d”¯Ì¶«Š(Q:T掑D¢ûÕ�0T†R+ƒÝ{Fx‚¤<µZˆ„üçû½ƒ#»Q¬èBTë완ɒAÞ¢‘ŸæªÏGŠ=ðþdzae /+õþ„ø˜!¤~økÔLˆ'âE1±ê 0¥ BŽ¡J†È™V—+ôþ’¤Úùd×"h ùpI¼<äà ˆR˜ŒÃ[¹(Ðrš’Ýž[Ù�ÖptÏ;ÊjIÙSüê@¢X€ªþˆª˜Àï6 0ÒŠeס�çnº«’;I΂ÅgYÐ�&c°ÐÔBÅJË´þÕtOWÉ=!¬66elô#ûL6Ê#�h ›æºù†2YèYׯ¬ß³ìÿÖöæa›UÕ�èo�ó¾ßXßWUTU€ˆ‚A&� Šgœç¡c¢�&ÝI{oÔŽ™:æ¹éN¢7·“'ÝÉíëU£¹7iÇ$Љó€ ( HQLUÔ<~Ãû¾{Ý?öšö>ç+à�{øê¼çìaí5üÖÚkïsNðEj´ˆÌÿIáš³!º±Wa…÷(9�N#ík6žìÛ85%Zå@Œ™iZ˜e÷ÂÒDà„”#¼�+)ÛÏÆåfÛŒUûœMqD@c;áò®OK{ŽZÈu¸÷ É1cN톂%Föö5Šà�t("Êeáo(£Á€£Ê€ ÇŸå$9"\‡}ÊÏÇuËQçjì¼ë’ºŽÓÝWQ¦‡_õ•3ö¡Ô] ê£1åx;Ï6ªÒL"½=4…¾4©˜È`LÒdœ&¹ý©f0ÛNµù{î[çºÉ¯ôç:͹«ŒÚ¡ ÑØÐ¾JVÕ,¬£kðªó›@åF¥À®²4õ4î–Ëk˜jW{ Ã¥z�[5D±}‚¶èVŒ3Ö1fC‰Gì><„ÅÀŒškZç(�(T Ü,{ÄKA¡Õj½�ck¥/«‡¡ ®ØFý2-*kÌ ˜`"@±ÝpÒ󀍯t’O ô帨╛‡IS‹9ØFRQå=5u9å+'&Ù_¨H-ªO$¾?0I|$´£q�åk5,€Fý5Ï:1XÍóòð(‚¼G™ ù¦ ì(•¥å\I‹ cKèѬ"9~qîT[ \ ùHa úC”ãZ`³)ÒÀ¦'\³I˨T9¥ÔÍ Äkè,ìJ�¬·$$BÏ“¤W•Ä+�®ôàÓ·þ­×ü`çÞõŽÎfõ5§¦Âe½!Wßò¢þÃ+®¹ê§§/­KÁ rIPðj ÂæÅ¥÷¿ãóæ—Ÿ|Ö®Íë�ݵ{Œs²ÒíéÌmÿ×W_µkÿ¾£s�\ö¸à¼åøš«üÜ|~¨££»‘=·úË*ÉTz�ˆë€ÂŒ¶� s㞃º}Ž1“"qdÇÜH§ˆ"##“©x€H®X „àí(ä!¶ª` Ùúgm1kCcú®®Ž1˜ÆÂFLãè^Ü~Ëhuœâ¨ÃB�|ƒ¦!P›'$”/6¤›Dt²!凌õ#4Ždk{g=Ó·Ó«×( ܤàȯPݼ?\¹‡¬Êº²!Ú�Û\Ú55?ßÌÏ5‰]t$[?T‰MC‰iÓ"¦†¼2¡»öÍÈà¦ÏÛgÞ‰Âs{‚ jVÚøˆV„²NìSÜ*@†lH~^19žP8Y+J,AÌ£íÚ( ©ŽÞëj.îÊBézpˆfÎõƒ}„[·ÀCDQBýÜê�Z÷áMZƒ)UcÞBÈ(”l(\,ÇA"Oµ>ä$N§•/š¬I±¨ÍLcÐð¶·YheÍ’Àd�7‘È×mMÛ(Ö†1±�P™œ ™èsO*H*‹é-w“:Рâ$€qjØ·îí¯ºú…OÙ~ÙçUã ÌðyåÓo}ÉÓnÿä7Ÿð×oÿâ}û6\~Õã_sÉ-7íØzý�Û »#-¹ö«~áÖWý­ ³+¿ré Õç ™ñÏß½àwþöå)§v,ÓMc~fü²§Þº´:<¶41E*ªÑ ¹‚ì™Û&=vÛ�»ÌM�Þó¦o}áªsß÷‰ç82§[Ó6·žtäµ—Üòíμ}ç&m¹ƒ®Egè¹ XgeC^…|Ðk#IOÚ׎òe˜¹§îò€�œFc+¢�KYÉ? ß$[´+·s¶MK|`ÅË™……QIù’Í!j,:tè,Ýè™<`c}B\ÃeCôܼˆ™4`°ÐØER¸ãùõydµ�*Þ5Õ•oƒq�Ó¦CijA“t÷ƒ`‰>¢!½�ŠP¾—¡ +™¶¹ÖÈ*#ASŠ‹(Xaœ5ùÄK-O\XÖ4†¾U488ÖÜ­)Kç„=B¦9‡®)˜DŒ-l$ÉÊËVÆb^æNÑn2`�ÿ×>˜µeÒ GXt-! \|â‡Ø¾ób <5 T£” –ókmƒ¯ôágÊã|¤èB^Ã"_N(Öj‚XÔ—°êr\KóÑ’dþK7’ëÂ�”>fæ0·4¼ï^¾kÇˆÝ XrL£Ñ†HÞâG#’Ìרý7÷ǃ„õ«Yx&çÍ3 “÷¢¡hÕÆRsÈ‘]ñ0ˆÌ,”Çêìr`eßpf@ ‹mJ¹oc‹cYTœ&¼a³Ó˜$ܳ?¿é0ì(QòY-�¨„¶AâÑpÐqöך+À‰J®dÅ´ó¢VPh6U/Ù«Dx ¥”¯%µÁƒPQ¹L%')T¾ðتFüt‹‘j` m?¢œ �–•�U±´€z…üv~¬‘Ž€Zœÿì‚d%3Þ0öØN`™9®º¼`Cщ³4ÒÙ¥-üU¨îi¦CK»5ª|€Â¼L¤°Ø™¥ä3�'“¦i¢–Ú–Ú1OVÓD­Ô^/f6m¯ŸÊq‹­[ú8Í/¡”‹ n0è]vøÖ gÞ·çGÏÊ�—ÿàñ£qëc "È}lÛxôEÝñ�?vy48ÿ1{¶?°ÉÃ-õ®�É�¶åðëŸý“¯_wÖ}.Þ¿oñÏ?ùœƒÇfò½™áä?¾î �?&˜ðôÇßû÷¿ÿ™…¹•ØÊöÿùWÙÇW†ÿî¯^÷�œ¥!ƒ MR37K+Ã÷}âyß¹á±üæo¾òé·ýϯ=ÙlóŸ}ã_þÆ¿´ú’£”èO?véG¾raO&*µ†"©v)¨´>Uä�þÑiA¥¨¦P¶zI½fXH%Ú_�L~0:ƒ³@»¬)¤.SY2R;ϕ↚âÐWÊ6ßélóUs³k2—lUŠÏŠe*:©ò¬ŽLòÀø˜°QÌׯÙÊx/~!!Vª 0 XÉ[‡$‡VÓÆv0^IÙ†ôÕ~òçú¢™ÇIÌ�¦bc†ÃW»ms”8p‹ü *ËêlÔõÙdÁ2Ù’F =«¬êŒ-II#¯«0ò  çÈBø¡ºÑš§ZS ¸^h¶”Í0CŠ�¡±²,Ë–f4áµâH$>7‹ƒ€Çj ]˜F˜K»ë‰8ló]MÒd³íHQ*D r-ìy’ ¶Ìù»¡J‹úÑ0àŸ¸©pÁºVEpäá€I¶¡‘åqÖšêP0af¦¼áڄ̘[Àô:p¢ûoK»öŒÐpe¾¢à$áM~Í¥G?”o²FÜ0åA¬_E›}´îvR¾qƒ©ôžÈJpôoR„ÑÐTübG»\ôQ‘ñá––±¸µáDaS�ñ™Yíj˜ŸÁÂ1°ó0-�ì�ñ õCR€)¶ªD%Á ÑÁÈ ¸$¸e¢¶X•`ÍÃÝNo±°“ªð^·Så„]Uw©÷jÌ °š~'z*šÝe°ÎbˆC�zl„�³8‡&”A|M| ±ì­>¡Œy»nßõÐ{�Õ'Nm¤A¢bd&p§Xü+ÍÖÃé!#þ-€“`(¥PGey. Äí °:Òd’mÓa@í mF)�x"É XUµQáªáÄKd¸h~¥ºÎ¿åE7þïoûFÛÖ/9÷Ñ{^wÉ-Ne¢÷~ü9üâÓ¬#¯|úm›�öŠóÎØzhÛÆ#›Ž_ú”;f§G�³3g©wXwÕ­�J“Öt¾iÓ›_ðãùéñG¿öäg=ñ®c+ƒ+oyôƒçs³s3£_}ñµq4~öÀI¿÷á— ÛIÛò›_pý¦…ãøâÅÇ—‡¥ýÐxB·ÞsrD±g>áž�¼û³ëf‹À9�Þó®×^™ÏßûÖ¯¶”þþ«fú®¾õôÿø�—?vÛ�_{ɵŸøæzÏÉ7îØF F¾ûk¦£:g)sÕ,/c*^©hÂ+“kV?¹uQeY½qI×2ª£WßM”�}ÑKvšw݃gxc·Ø·}u|x¼÷¦ÜR)´3g’ŽÄù©:`НçºMÁ_sÒ fSÅמŠ-Úo˜xÒ‹‹2áд¼n‡ÿ´Ü(€Ät`Â'àá¶ü’`ˆÿeVÀ˜å›… ÍTxb“«ùœÅ 5š9ôZ*þ•Ã)ùkåEÖoC”q@_„oIŠPJq« t�+'úÉq5©ÔÍu)ÃZËL26È7bKoçà…¡Ñ¨d 3sõN«›!&nr‚Øâ#>\_Ê®9ÐÍ™™ŸÄÎÜà:™PÅM“9¨æ Òkžt4r.  Õl+XŽ)½º;â ¾a÷1¢óEjGŠ)k5Ó7`9ψ�[&Ož.6š[ävšGKÍŽŸN/�ƒ�³� ±9u­/È!@vŒä»QO|·¯_ELÓªz@pØ‹lûSŸdZ®j:²ðÇ¢ÆašK¿·Õ0ñÔÙmZj'‡›Í'3OóúBÞÜîsNb8aªÅÆu ðžc8pÔ^M£ú/Ó7YÚ,_|Ô¥�ÜXCDËMÄ¡h±ª§îÚ*ßl0´Ðõ2ŽDR Tí뀠ÀѾV‹öOúçW”«Üšhžn}ý[#£Î<åÀ¯¾èÚ›ï>ùg;7ÿ‡W\³aÝò¿ù�ò­·½èº·½è:ß½ñ1×ÝñÚ¥qcŒyöùw½å…×ÝzïÉì_`~züŒóî9xTóÙS“�óK»ö¯ƒ`Øwhþò«Îá¼Ó÷œ¶éð?|í)ÿÆÏÇ�€�¶‘‡;c¨`uÔ|àëO»ý¾-ùçÔ`òk/¹öÈÒÔ'¾ñóO ëï8Å î~pÃÝn|òãv¾éù?¾ê–3®¼åÑþíÏ>ÿÉÛsõOÿñ'òÉÑ¥é_ÿ«×}ÿæG»Í �Á¤0_ö ^©Õžçޱ8eÐ�¨îÁå9u®Ìé)Ìe‘ øì (4öÚ›ÂbA=J•0,�Øz†Ëð°0„†šae�Öb1€uÙ:�D<þ5 <’ÔGÕsX%û¹~IÿÁµ„’fˆb�„À"p�_\M멟 ç[ÇnÒ8’/µ<½ü[G2ú�‹•h1ÅoÁ�ì�ˆ�UY÷Zeò%§/ï~ rÕVB¨¡#±p×¼ˆ³„”YP~õñ• ßšï¤(>3& [*"T×ôšÆ¸6“˜òDg,ªïe¸ð�ÈR<­Iyv©n™óØKåztG„å»C&؆ÁHˆÞO"ƒ$¹ms$cµÊ’Èd�ŒfïOeR3;LVÚ˾W7Wô\¯�¼€‘˜§f0·È4Ä‘iÇí£R™h62ôÓkù`“~‚¦Ð Ò--j—iý*†l/ñ…Ë&jPtiÉdWìxSÀw~®½Z!#3~•Vö´›OnsÆßæû�h æf=%Ú´žÛGWðÀA�‡ÄœD‚ÉÞ`‘ÁœÐ|Qðh0LNMEk¿›!˜M¬5°Þf§¬TðÂpMÕÝ=iÈd†éké»NèËIè] ÉÝ8DØ¿ì�+T¿9p\XU”ИÊL�lªÈv.Xö"M°¼kxÒæf8lRŠÏ·PÐ+Qbm^ÏSC¬LpÏ~Ê£L†&J=1'¦¼R% BhȾCãb ý¼è” Ú¹Õ×®w¢pÛõóâbp:|ÂvÖj>ö’10E/ú© «pÊ…C¶aCXá=ì¢À Ç‘ŠŸ°N£ïÑ�ãñŽýKUó}W”Äœ#ù�*'m®ëÌ�@F0…Ëv�b£k…âúŒGOáæ Í÷[¹VHPk¾�Ó@U¶Õ ƒmC ÑL;Ì›¶-ó …wKTÀ5Ô÷k•C2'RŒ|4¬w?sÅy¯¹ä§oxÎMÿççžžôÚgÞ²nvtÙ÷Î/ƒlôÖ_ÿ’§þìØòž~î}ëfWþù»L&öô²Æ �”a“~ûõWn\·tÍm�ÀLùÒEþò…ºèì�ûÛŸû�¾ô[7œY˜–’Ý4xÝ3oyÑEwüéÇžë=›ß÷ñ眴°’æ’ vüÛçßøÍëÏúö gºƒV>ÍN�?ñžÌ¿ví_÷Kï{ãû.>ç¾Ù©Ñ³Ÿp×Ë/¾ý³Wœïöì±�P�]yË L &G—¦/¿òœ»\ÿÌ'ÜóKϹquµ-µ€Å¦l‚&QQ¢hÜÓ£“f_\^,›‰�QOÁž#E�„î­²)Žw98ž”e?š¨-Ͷl'‚S•ÖŠÃq¸)†¦a�ØN”Hpy@Ü­Þ‹õá•\€jH׋:ék�XQ_c2°©¤À朹göUqž>2ⓚf¼<ζdËܹ‹\*å”!K4E7Dì|Olʙ݄’cÅ2y?‰€©R”y›áI‡ç»½#äD•ŽDãæz“½;YE3©�§²²¿ÅñýÑä üBÞì:C*ܼ’î$jv>gkEd.#<ïÁˆû^<ü!ß.†YÎYw«˜ ´!@²†¹äË 0"4à.Öjyj—Çàß7 È"pvÒ…QÖÉ®ÝQîåxAe(Î<µ"†”ÐyqÚ/ស¥‡ÇäraÓ^[f�H÷dç-S9·M:C”ä¶Ö"¤Å1f’±H‘7!2¸ô‚–Û7NêÓªnU¶Þµhc�ŽžŠBB£´¼'œhù�Áú ÍôTÃÉV«¼M– ˆ0™Ð†Ež™¦ ó=û±:fòm¢H†fD°¤Ȥs'jŒò–NÕˆâ¤ð:QçÖ`@÷8� ŠG˜ßž¨ÊCµV­c{óú·ÌË2¶>U¹éÂËésöÆ95�b3C V €{zïø2ûDéFʾѱ¥²¿K07vQ5ÌµŽ =+D z(¬Ð9b;Á¡úq7xø¢…^é÷’àÔ1öˆ$¨´í(MF<± ‡`ZÁ ‚î žµ<)��­y1pÛ½›?ûýsßò¢ë¿sÃc|ç¶ÇŸ¾çW.½ñ_ø¸›vl)Éc€n¹ûä¿ýò…§o9¼0»úù«ÎýÖ gî=<ç ªiÇhÒ~õG�»æÖÓ½õÀSw¿.»r—Jn˜/}òö÷¼ñÛ£q{ãöm£I{Ím§˜NÞþÊk^óŒŸþ¿_}Êûô%Ç—§`bÊ&Ñ`uÔü·/]rë=[.|üý¯|ú­ÌعgqóÓŽ�¶ùÈ«/¹å†;·Ý|×V@ÛQOòv^":uË¡CÇfŽ®L�hj0°"/=tˆR7ª[$ÃjNŒBH wû¢º.ì„+Q‘›>v×.Ï)®ªw*z':Æ ñ–;–:ÈBUE¿¡“¹EQ˜9FfÌ´|á í;n—7&°ST”ì PÍB9¢î°âÈ8Œ‘<^Q÷®¡^ÅáZbìKiË~ OÀ”(ïX€†ë…È»5ót6�$ªèOG±çJõ/ ¯Ì…,ëç=rd¥Ñ"«búã¿îÆXƒ²çctý(Y=‘íŽEFÈ[DÔ¾x�å“9Ç6^– ÙRKyŽVÕäk•‡–ô†>�@F°f*‹À;ØöÛ81Úµ�?�\ÏØ NȯI§.:€½Ô9ïÒÐe@hº92V8 ‰Ã"ǸÌkB̬pª¶‘XèAx•œü)K&ÏÌÓì:æGöðÝÛÓêd¢á&ëÄ/ÿ¤¬÷ÔØ2“x´<û"yû" ÷ól‹J «˜I®¥**çÛ>·4W]3w]Î êÝÏæ­H›µ™E03-?ÐÎÏ5³s�®j8¹•÷žLxÝf‰Á÷Ʊ%4­™D¤ p£JÉ¢îÌÜä"æñÔÔ8ÓX§þâ_;*Ï lÑ«ýAEçxˆb³•‡8b˜eAdéz�¢L(Qº³ªdlÜЗl 1¢—y™˜kâHUÞÃÆv‘HòؽÈlëÚšS&�”0MŽ=›²=!¦#ô}/ˆzäu ú}G�ïQÔ~lüº»&ºÐ"‰ÅºG,Ûש©¤R%L5 ;­J­¦ÎÅ”RZ"jšaÛ­rsÒ|–®,)[ä¢`egPUÐ ´G�ýÝW.|öîúÏ¿úÍßÿЋþèMß]Ym?pùÓÆ©ò$¶!ß¹ñ1߻錿ü�Á,Þðœ›Þ÷¶¯Ç')ßÿ®Ëßÿ®Ë¡OO~è‹gLýÂÎ!à=oüvCü¿ýÊ·ÿíó)üØþ“›þ�O=çý_¸8éõϼåÏÞúµ†°2òeX?·üêKnþÔ·ŸøçŸz®~y'nH –Ò8µWÜtÆÕ·>j8H/Úm£Q{Û}›§§Ç¿öÒ=ñ1»~ÿÃ/9¾2e>©{@-M~îÔý»ö/[žhf˜,�†A\¢ÎyÑÚ™¬œ-„ò 8y/™¿¡ðCÜ9éMçnáÑCõ~ UrYAè=R]*¶MQ"I?oÉŽÔÞ@Ž« ·ÜÊTÕ #åÐY�GÊZ·ä‰¢ õý/N+`U4ºÎah5w÷é1 à}srÏs¬Ž¬b5td2½8ÈQXŽ§Ã¾@5ÿd¡‘JË"° sIa«+.¼X‚ø~{«†¿DÎ)´¦ŽÊÕ<¤LíéÀc� ÷º3%P¡­× ]¶¹©†iÕ>a*m9³ø:“Ünî>eŽ5œ$“¡ \yóH¤žâ l/t 'ß§d±w$ZaK€—b3çy#_Œk‚곚yóQ–£Ø¦§·Õ ƒ9°%7"f¡Ã/$ç  ¨È:! Ϥ1L¿8gÌJóèÖ­Çpi‚ïà�»G%+ ]E~ÜQŽì;s> jì=ÇfÅ¢šMZ7âÙdŒ7€±+žÃ¶É •2êŒåX�møL …^]'ñR@8WqÓò®áìt³¸¾ÍSŸôÀHHyMЉizȃG°ï0‘>ªÊúüOÒîØgV¾µ  ”çcm4+…�©NB(³†;̦É=«óÊôOpôú1*¥v’rÕ2€ó½j0,H_aØ�×6ÈQlq ©ÐÝ,,ÁnV#ÔM‰Z\1Ävƒ”>L£s†©Ph½šÑhÆGP½Hú:l‰ðàQ +Ç$SÞùg»m­¿PGú¨7r8‹=jï‘‘zAFd­óÒ8Ûïi)P 3<ŠzPfÂJNU„Ù� 3¥IC MÓ`Èi5�'öÜŽ«ÇTQÌd�«›ävï_÷Þ�?÷ï¼üsúɦM¿ûÁ—ìØµAÇ“�šF/ kç꟞þî½4÷¶mãÑ·¿êêÏ]yÞõ?;ƒnؾÍ9šéHLÿü� ¾qÝY>ûô}ïxÍ•ó3£•ÕÁÿýÅ‹²}ƒo¿o“ „À_¿îq×Þ~ê»^wÕgìþä{þqÓúã6†³OÛ÷¿¼êj)Ñ__vÉ_}ú³Ëü¦‘ã+SMÇ«ãvuÜîx`ã±ãS¿ø¬›.»â¼oþø,�/€¦ÁE�¿÷YOܱ²:øø7žtöéþË5g¯¬ž›]�Lšã+öŸÈæ° F¨!é´‹��ÙrŠhؤ߅©"fñéo ïkÔˆWº¸ÑŽÌBK_ˆp!*œG�eÊãO p` ¥¿Üb¢™p(§P±�Øb>�6Õ F(+E~L“«9T*PËV¹KfÙ%ÍCÀÂPÃPeÛV ¸o†k»Zö¦tÊÁ†çDLœ’íý%"°¾ÊÍUMÕCÓ æT˜=ƲàXCö¼Õ7Ķægl�ÌÁUx˽ñJ˜ðx ¡~Í/¬äC‰)U€f†¡*çÛ+$†ÌÂH!*(žl±Á戕íØúò²ó¢ºt�_C‘U²)9aÅßV!L½°ù* ‡Å·2T{I�¤Õ¡!´hVàq”§rÃ|³ëlf‡ÅÐèÜÐ�£tò¢�¸eD×XZ×MÅ LMóìš)Z:È÷lŸ]Îil#çS¥T–âI!Rƒl½E–‹£¦1Y€(-¬Òœ|ž½çI(Ó¡˜ú-Þ:âà€ ‚™{ØR*¹) Š{å¿üŠºƒÕ½Ãé¦Y¿q`O/ªŽh4,òâAË›7\Âîƒ>&Ñ%†¿fLDIžxŒ‘ƒA-VÛú»såAŒ•“½qIåzÝȉ�^çmêJ��ÔaWÙc.hì$P9TAÏ B\}†=§ {×TOóU:!õÃÀ°Xä$?ÌP¡„ÂÚ ®ÔL^ÌÌæ4þ0¿%-ðÄ, ¨­Œê² i™Ê€Ã]^“wtÛžÖI¯wê¹­X–¹Œs†Ø³åÞºtª¹ø€ êM¨:zAGNDh›V7m§Õ4±ÄW™Åºì^˜5έ À-÷l¹åž-ϼàîwlûñöSlHù±±H–õµc׆Û$,ÆÙ§íýÕ_wõ-�úÜ•çvX®ÜvïæÃKS›�¿õÅ׎ƃñ$YšzÖw}ô«OÚ}`^£ð™ï�ÿ™+ÎÙSopÏž ïþàK§‡‹ó+ïþ7ß¿æ¶Ó¾üƒÇ`ÐÏ”ŒLÛÖ“Ž®ŒÚ¥•AÓð©›]š�ÛUn��™}àò‹ÁxÇk¯úæõgÝ|×Ö<˜3O=ðÂ'ÿìÒ§l?iáø;_sÕžÃóûú“ž~Þ½›—®¸é1y¾»a~ye4Xµ%7ª`C<ÌXßã"禱šŸpyÝ”…ƒjá]¸êâ¥Köa4Ý¥Á”ÑÔ.áC5¦éFmÃ…`o…õ~«–¹€°À+Ë€•�¯qÒ»”î:—4|,¦íîÄÑa¤ÿC€xüâÀåÛ(4ó…Æ@-�°Ü‡'3`–WhgR2þjî3É[ •ä˜Ë�ÈR`¶HŸBÞ%“¤Y1yõ›ì²³=òW‹Ñ\‚¸"…dT»‡$ ñZ~Q¥h¯¨hiiöu¡@FN0çxT$uÛ¬ëfÇc}Ò4«„ny¯Vç4Ô¤°Õ’}ÈõÁN*‹'±=Uå�E´* gKà)ïý�y"‰Õó©�õ©ÙåägË�FVA y €$J€™·®.ÉpHש2¿ž_À`–˜ñà]éþ�ã䛋3‰$#KL”ß'"éEÒˆ›ˆ`/¬¡üt.Y G˜M(°k•n­ñ©L\,OïÁÈV䮡®+u¿KÎÕp¬h#Úpr+«O!Y« â�Ô6­GÛàØ*îÙë6Á lï'¦Ðç™Ián;¢ò“©©Î'ÖQ�Ë+ƒ%<2‡s‚ã!Û1ï¹vÉB·;ÞˆÉtbò}'Y·I/j¤Ù±©$å9Ï}ÒŽOýÑ?þÙÇž÷µëβ,„rð!¤¶ö¡@ 0pòⱿøÍ=uó‘÷~ü¹¿û†ïýÍe¿ðæÜð—¿ù/ïþÀK÷š—¾t)0Ó|èØôU?==·pò†cÿþå×Ü~ï–/]óøî0Û–Ï?c÷ƒÖýæ+~øÆçÝà²+ÎMè~ù{O|ì®ã+à ó˃ÁäçÞ͉n¾ëä\íùO¾ãßôÝ;wmøÛ/=õë×>îº;NY˜[ý»ß½ì–»·üdÇ6Þ¼þØ‘¥éÕ¼‰EŒØ÷«DÄÎðYð®©\üfÃf*„ThI°Æ‡˜îŸXj�T¦½àæ�)×d€Šª·ÚBì+yÙ"½meû4±€½‚uF[<ïÔ�~˜cÓÛzC¦®äéó­PÛPÅw‘@N4 xÏhò¨Cíx>µSòÉM[èñÏ U;ë‡å C>C.}3{1¹Sîiu‰×êôv`Žn¤.›èÃí§g7ÈjRp—ÀPð1Zˆ}3Œ%u¬Uwš¤Øb¯Õ–ŠžV„ÞN2FÕ.§B€ó`[ÈdP$Þ‚íÍÈlÔ©‘ÍÔ5²"Ít' ßu-˜…ñ:ƒÏt‘äd™¤¼Ï$<ÑÁêÖY'Ç*¾:Ô°UïÌ- ïî�_DÌÄÌ3s4½Í€–ñ};&GŽ'QoÙU#í˼!ï¡V7Š�¥üeó‡'½2‹aaZ¿Ši7³DÅ]­e�/ÔX­7ü²—›Žz¡0í*+Õ0ÐA æÑÁá`©Ù´u “%ÿÈ@f¡¦ã$+vÒL ±2á»öf{fn4ÔÖÈÈütž•­ ¬Ÿ1«AÛÌŒÊ/õTX~‚£ ]ÆtýÈýJ¨ü¤DORu”­Hó\b`q¢• XÆZÅÐë¬MÓ7&"N A¢hž23¸…™£*^™ô±õ•ªÁ|ÕÀ,rÇâÉè‡÷U˜ËæâŸÌ¡€bѳV »ïöÕÙ;aY}sÈ‘¨èG¸¾›âмäE-5ëåF©á|cž2³ØYÔñÜ‘v3¨fäO¿5S4 ]MãÄÑãF-[®Ê†Ã9ŸM@Û¦gœÏo¼ìÚç<ñ®[ïÝüÖÿúºüôQŸ{ßû~íù�Ï]qóùÒ…ß½ñŒñ¤U„áJ iìM„§ŸsÏï½áû ó+¿õ?^ÙpïƒïC/ý¿Þù…¿ÿƒËþÓ‡_xÓŽ­� á¤×útÞdnrú¥ó½ç‡·Ÿö�/\üÕkÏ:¾<}Û}›ÿà—¿÷¦çÝð™+οèì�¯öÍwîÚ¸nn´ëà‚ñ÷³WœÿÕ>îÞ=s&hj8y×k¯<û´}ïø¯<º4 mø1[ì;4»´:¼¾j'"{îP„(3VR’dq… Ë÷)YC"¨>LŽ—$=²ƒÂðh�[½‡²CPN¡z§´^˜KÅËŒ|ñ_+8ž¨3öv¬d67£CS·Î ³G/S,#Yð Œ*Y”Œè°”�Vm¼(™¹àXl2.Zj¨˜98Jt˜±nïdþÔ&—±½"y ¬$ˆ²1YôH1˜ƒ,7Ø|BƬ.X Ý5á뤞´VA)†Ë[EjñŠ¿ÊehNFWq…3ò'ðŸòw=³•±‚™óƒ"²ÌÕ”2;Ù<‹XíÖ?GQdûà�Çü @(¨‚]·™IPyrÔóŠ 1÷TĽº,V˜+±È^Õ#»¼Ä)àvmIS¿IX¤b3(wMn¨œx0E3ë¨�æ4Æ®;ӮݓCµØÁâ[1PCQãá/5&‘Œ�.JÒ†¦’’¥õİ.$hˆÅjeÊ¥¿â/‡ õëa¦ÿÐG$£ƒC:F'm@¹çEƒQJ9ñæ ˜™Â8áž}´:iû‡i4cÉÐ�źf0ƒH°¤†˜h¥iŒçšc`Pù~\¯.v Ä¥{½ÿ°œ‡é–L� ›/E#4Œ"_Rf@Z0¿aQSѦl[ÒøØÖ£dÚ¬r0ŸÄ��V˶FvÒÛæzV¹C×…“ ÙkXu¬©§Å÷™Nf�Ÿ²‚BÊ# Nj-º;ÓréT]ÇØì�oŠm¢K*üC7Éa�çq‘.FÐQ*h=†p×Ђ™ “¶mÐL3œð$¿i›²Ø5é¡NIŸ‹jMyök.¹íßxÅé›íÜ·øg{ÎÇ¿ùóÇ—‡®þé£^ýŸßø–Koøw/»î£ÿéÓ»,üŧžùOßy‚&5òs9�,ÑÅZ›ÍÅqÍM�Þúâë—GƒwüÅ+n»wÓSV¿ëïÜö–ÿúú¿~û—ßðœ›n»wóh<è( ü蓞sú¾Åù•u3£IR;‰~òY÷?jËΌì;÷-îÜ·¸iñØûÞöµ—>íö¯\óøÿò—¾õÅ×½ýUW/Î/oZ\ºýÞMFܾCsû0—Ç´qaéßø�×\rËÿô3¿ËÏ|ÂÝsS£õë–/<{çeWœ¿:ø ÈRìÉÈR�Â@Ø/9É ¹Ž ž» R8Ñõ~4[«–t襺eål'è·jFfêàÜ4²œ«yxá¿ÙÿuøbrMT-À(ø²Ø·‚ƒBh#Æ%aP‘ÜZÐÒ�S§¢Y|Á‚B�ƒ‚³àãÉ|j—�NfZ’O}gb„${¶í�"Ògg8°UK›ñ‹ÛP­vϱiŽ·sØ¢ˆ½9‹)š>n«ÐhwŽ!åÄÞˆ5I€¾VÄÚŸTV‘¼œšü�!ÙÿHŸ 2ÄÓ,q’vŽrËÜ‚Sa&¤a•® !úÝ<¼Fßý‘ï°±WjRã¾G\ˆn�¡)tŠŒµQè#¡:�aá^C³ Î2߇ûîNÇV&T|òÛè%û›)‰™\åÿuü]ó xý ¦ p�ÉU>Xþ?˜¯f`DªªF\p�-Ä´W¦úîÓjd­� èh»å”6éZ@¶‰/·  xãfg�wíÅÑ%ŸD$}p2lî‚+‰' „íMÆh8Ô-ì¨*éq\ÞŒ'¡FÀ­b¨ýf­£”S}³$ÁÊǃʙ’ãb P•°N`@!×ë†'󊰘›}oG&*}µM¤íKEåƒH*‡_M›Ë¶�ÂÈP'!w¬íè1ÝKªþ’uˆÐtÌþå�ÑíÑ¿Q-ìò«ÙÀ ÄÉ+ft�ò€ødOw™8 þ��“PˆD0m!ê-ÆÛ×›�ØrT.0 Ä“ QÓ6MKílÛŒÒd5M”U1CfPoÖÉ t㎓xÛiùO—|ùš³—–j€ŽŸúÀåOý‡¯=éEnÚ9÷]qó£3Ûk¦w˜_ ’b4iØ·x|eh2 Ö,ǾÃs·Ý·ùO>ú¼ÃǦWÇ-€ÕQóà�uË«-˜·ßÒ/¿÷—' ²½¢ ‘¶žtìo~ë‹sÓã;wm¸â¦3|‘s˜6/¿iÇÉ?¸íô\w2$¦ù¢ÿþ™KŽ/O}ä+­_wüõϼåòœsÛ}›Q€±´táÏÝñ9÷ýÉ?\úÉï<�SûŒóîþ­WÿÀMwmýço_¼g…rlJ¡ŠŒRÕ55'�úžüòdMˆx¬Œ®¶Áxk<¬ñ©ÀÎîÝux°v Ñù™g¨,ÓŸYõ dz^û3 øòå`½á)Ô®É@:x×ÚaôPü0º Lëc[¦â¢mu(D®DÒ#1MbÞßð¦=H³Ü´ ÙÊö%æèÉ,sKÖ$‡jy%ë×C”!žƒ É«¤‘‘y¦˜#ò iÅ �dàe dŽÕdLÃ^6ì› Mù³é5 ä§=øh%ªU£˜��*y;¬fŒÅõ’0Á*˱‡aJ�öʵžnDCsIV²�3ûKè3RÔêŒ6ìÊŸïû»)¬O£Š5¤€ø É{gþ3Ù(À”$cÊ l¶C�¦fxf¨Åd»îæ½'‰9TÉ-™± «e‹È#ï`4¦Ô`�xýª¼%KX]°;Vôì·±(Xë6!~èOeSŽBÓ°€T’�¢Ñ‘Ž´›¶5áë~œÌ)6Â!Î,MiýÍÏ!1îÞ‡#Ç¡¯ÊÎËŽy Ö)%¦†½@e"€'SÓ#a{5(CÙ(œr aØá¼dÖ‰.Ëð‰«Øœ[‹�¸}[Æe6Ä(r°ð%âbS¨“ÂÎ"D9 êèu«Ðç¨H:Õ &œVð4NQÜ3hÜEZ$ù£÷C|oî…bû=kª®´^9× V±œHJkhÓ’ïÍZ(³!¬èƒâöß±[•r‘ܵXJÖÃ@ãBjÉ�Þ†‰1§ñ„õƒíƒAÓ®¦ñ˜“L÷sqë»bó�þó= {�ÆÂºKÔý«B7Š,�Ñ®´Ò‚ú>C Ö"]3 uŠÜW$²d’žÎL�–W‘Zƒ±�’e€ŠSƒÉhÜZOm›4žôj\K‘£†©bžá'£IDATØêz†{ l)�Žú˜ÈÕX¥L/0Fîp·º[7†÷ÿ?Ê‹‡îH\‰å<+½ÊGá!ò`¸xaëTó¯Ð!m¯Äd*®Çâ– ×ñè�¢ç%D9B—±I™mÃv8Ïë¶�œ@†fšÕxUÍPj�¬S­h¾‚ŸN ¤jq³¸nù6í¨â‡0GNª^Ò©B±ã%XEð›Á©á®uà;VU§šF7²ä®ƒ¦yªêa›Òïz:µ¸í|æ.¾9’ŒTmð=9úŠöYµ¦ÇœW‹ÇN�¿S'–EÖ9èx '̽€†Ó˜šãv i„»°k÷d”8´&'¶$æL Û½ØäIšî`Í4Wߣ[h05áõ#n‚Ç ©'¦À÷é�á0낈W{�Eyç¬Â ¨bÉit|xÀ‡hË)[²rcÏLv%1籸Ž@¼ó <€¦lþ&ÉoR¯¥cÈ<"Êû4Úš†Ûv©ôùè’qµ³~N väAaºþaµˆ_¬Ý)TGÉ_)az纮Ó17ã]¿hû >—�t£táN1)þD©]KÆ(›å¢Q¡Ã,JÏÁJ{t÷‚Ö#+eæn±kÖ¶ŽÀ­ yŽ#ÎQÊ^#åB}0ÄèÞŽBíb©Z©ê¾ZÖqœe² ‡»'eaÃ8_èèÝJ¤Ò7®Ö;Z´ÕA“ÍŒd ¼1µ5ך®2•ÆÿÑ„Òå„ô<òžQ•­ÛänB½/KJ§V´"‚’[Ë«öŠk'‹5™“Qv�ð0·f ÆM¢Áƺˆ7¼|r³/³Ý0²á²<T5Ìæt9{0 ƒ3W5­œ§‘K%·Å×Ý<â#¤¯úùiÍË=QGêœCÉÀ„0c •]DÙ`@Ç)H‹lE•‚¬ûh¯�H@òŒšýl•¨Cq�pŠÙhígï$5‡håØDFÀ€¾i.+‚&ZÍ ³0ÉV@!“3F24±Çšé”4c÷0­ïñ™wMT„õ:2÷>ʰñ¬H‡æV…dëH¦¹°&rd°¾5°0yýO»µ÷d0d‹°%*™ì…Õ:@2¦Å<Â&2i“³åP¢÷!òGÖòkwIóÿl®‚­¬h‰š61ô¥(ì™uÙà Ûe%ŒÈÈÔá/ƒ“JÎÓqÒ�Ó£¿Áh[̯Çìzn8ºwÞ<¹÷þñˆS‰SnšÂ&C6@ FÂn4¤)—Bi�ÔόӆUnBꊋ+ð\”�p— 'ò_ì÷½Ž‹�mzå ¨¹oKâˆF‡|¨Ù´m —tèªÏ�µ—Ü:Óü,ĻӃ¡›ªYLZÕ¥‡€F™Ýš|%Ú–Z Û×€[®Ç‰ý²f%�‹ŽNèaIü› ©Ð£@Þ/(8¤r>òث޸«Û0G)MR¸¥v¶NÑÀ<…ê•çD˜Ñž¼xéñé¥üÔ‰2™`Ù’‚Ÿv×çT0]1wÈEõ5—Ð'òïîùÚE$Ù“‰ˆ ϲ»é·bÚãÔÚ×­»ïÖê'“úF@å )åŒ7QüìüwCkë¡A'H±’…¬Õ%¤Ž"ó?@É¬ê Ÿ'tRŒ=L2,ñ�Åýc¯m‡îŠf×*'=„ ]Ô×”ƒ3·6k™q‹¤ðÚ¶õÛeè¥×õi!ò0íHh¸Åð8¢ð:�hUH ½ê;üˆ5{ÈVÙcT1°nž�oÐбh×6BØTVr“uØMA$šKª8¡ÚoéMv†V¼:颭©RTsSò(SÜHI–îŒ5ö K¢]“a½îÈ´+ŽIÕÜS¶Ÿ¾ùÝ>@B€>ªÊ,oÁC|W„è.1çéA$’42ƒ7gÜp•Ls8k8³q ´-fÖÑôšVãþ¼ëÁÉÊ„õ·eœ5Œ4ˆ&B“?ú¨u‡DT–€ÍæÜ˜Ç…n*WT”„iÖ¼–ƒ±ßtÁR …‚½‡*btf™}E`Œèh³åÔ–Ð8ÿ s4³38i=�xÏQìÜ jk€ “̾|úNh¯§F"Õ0˜2ÃZ˜|ïÀ5®´)°È¹§bEjß¡L/HR Pp æQô^ÿd%Ô”ÉìÖQ» n‹Ì� %20 Â/ë,3]&kz¢ê’dƒª2©QØ”ÓPÚ¾w&‚ðmÑ,¼MÃc“õ Áªš�kFŸ� <˼·)¤G�Æb�4È‚.·4'-‹ªŒDÂR˜ºòNq°®ãÅfYµSq@ÍæDáJ5º¿ØQB+…üZR5-Ñ iH•kÓvp÷è| mÚ´$ö*Vª·ØZšUW²`ÇDS Dº „£wC×±W²¥P¨ÇÍ;«…ófK�¤¨;Êýà\l«ÆvW]×…[õÊîyݽÅöyY¬?ÎÉ>1öÎ L&)š†ÓÔ ¨ñwÿùê:ŽÜ´ KLÔ{*­Ô\Œ: »\�QFá~ÞÇ*¢â´ÒßNg²°«;ºÌ$B�ÎeµÄÒ]ì^lMõÐ+–«?#õºîçDº*PÝ)Qq¦n5òÒ¯4YÏùºt‘mî Kü¡µ5FQ›×>2 ƒz8Go"„:'eg¥�7f†`ؽPdZg¸¡}�kJ²´aÖ� ­e1äîÜׄ5B_ ÅPü™c�͇À„=irÊ‘fea<5Ó4¤ÐD�,ßite›+ò߯Œ7„æ<Š�:�ýÝáøÅàò¹:T“9†žFI¦˜ Ù Y–óá 8Ðܰ[ûþÈŠµ$ï!k;û°ˆ7–„Ñ…8ù�5)y®ê”�aD‚‘(?&‰ ½d‹´™ó§a²Ï©H È*óQÒPž‰šüEV€ � A]¦Rj1ÉdGð½AñC¬�­_"bj‡˜šåvŠ©iFÇøÀnì=�&œ¿w£21ÏzoMˆJˆ¦¶<úª¹Ò¦´~ă|“ƒ%t²�åb‹L®lªÄn™á’k ”.öšuZÌUÇû‡Ír³yÛ€!Ó!å§8kl»óÔ6®Žó½{óëGJlS1 §èStE£m¹,ÇI5Æx®W¿4£ÈU¹‡˜’œÀ?t˜Ê�s]ßcú[îk ÎK „‡o®Õ9§8ǘdÖê¤á�wlÙ‡Ø&Üü«pß4ªhÁ)L¯`.0a�õng�|xàN”×b‰"/%£�TÏ Öw–|{<›º£Š`o1íÑ^cy¯²¿l?3«c¨³VšO=‚C}uºî;º}y KØCÎäGiÒRÓµ„Ùv¸š&cžp‚}¤¹‰tÐÙëPÜXSQ¤ÿô9“à�c¼Ói 'f"±Tž^.‘º¨2ëå!WÞêP3kÜW_/ÕÑ„’®ÖÙ™x«†ó®æšŒêvhäFê=wk¹ž`@R³àeWŠ¡F¹e¡ªýSË�Œ¼Í.hÖöý¬Ïù¡Ø]HÔàÀÆþ˜Û†S슋aBA kN1×'(®i¬¤Æ6ït´3¾R1`“{vÅðF@Řq°áÑý“4fÖÍ#B¢˜‘¹�[bË~ dçNå€I��yruÔŒ'»ÎÈ/ÝϪ´)ïrkC«“ Qµ�-×À�dJ‘{•q²t^f<ôE N°àO~õ8+· ¹j1Hõ„ZBR6ÝEåR§Ä&î~C0Ë¢Œ!3j{SŸÎF ÛXrâ 4l['ýn� P¨íÌ‹LIàéOÀ¶a kÐ0³Às1˜Ád¹Ù³�·ßšvïO$�ÍŸr0P¢Šª5D Aß1’s±dª`]j•|ÆSi²qÄe—ð¼45¡°ÔïÃW�ÔHQE¡6æ]L"\žW¬§˜ÁjùÕÝÃÁj³yëÀt�¢üPDÒתܙyfŠ6m@ÓÐáeÜý`†9dË䮈V‚8™"1ššvu0°ð":kØy&á„P‚€�¾r NWáðz ¬q˜\�ו4}.dòRák„¸�¥gQ-L@ªÝŒ êæ DŠ©Hž*kW¢Ež¿ó’Ò_�Å`-�ïйPðÅk®À›(Bõ5ª—�ËslÖóÞ˜ñÜ~ZõBŽÙv�P™KÍ7£ê¥ X¦ µGa}zGÃÏ5ñ‚ù\ËqµYå:ïµVbe'Ìã”RbSÍ`¦¶Dœ$ph·.¾àØôqßOãŽCÆNÎ[ª¡n™ò“+AfßmVêž5—5–ˆ×QZÝÖºÔR@¹kуæ¶Ë• ™x”T<œÃv½w˜ä-U­b¶P"T‰�cl–K–„&åolYk*ÈÊ2°ÞW!9Tä/Ìtã¤J'ä`Æ„"ɵvá0Ô5J‘n¬ ~;Ô,[í$¨"VâÀЙl�•� ×Â×tñ´è;œÐåȇhd’ #0°š0× &+ãá|«ÚoÏyP’Ôl×!‰Ž�€¯=–.ätkÌqÀÖû bk>€¡s„_ëQãH¢ÆÒÒ„ì\¸ ÖM¯¼wÁãr‡ŠÌ� ÕEÎ/Rje¸�—R¯„UZÖ!D.šæ'%Îb=�g”BMriد-“w+ZçëÐN[ðU‰ÌùÅÝI檺Ú73ØÑÉ¸Ò 03�é´ŒŽÑþ{ñÀ}éðRšD¯ ™� ¤â!¢Æ³×DdŸ{¤˜á–’*ñ†x~”Ç&‹ZU\�}¡ êžÝ´–ퟲp�cÆÞN›Âì`ë>-q^Ý=œ":ió 1¢¯#KcI 3ÓØ´Mƒ#K¸s·K:4©¬–l«6ª²9ð¯§'Yêy-m�€¹bYÀAqòÓ-èDÒÚw×:êx.’—WDñ"�Îåëèʶ,–Ö‰ºi•º^eiU?دiL… /Æ©JƒÈuÇ÷¹©¦ªNIòÍ€*øBÕ#ϰZ…RG_ë)|í�]L•È*ÓŠdÔqˆ¥ùlÀÂÆØ"÷ëD —�ÿ±;wÖFL‡‘'P²@[�÷FM%[Qˆ~º€z(5×nG^æ¸DÔ€MÛ€r&¢=yà �OÏ�¥ˆz;�ýí µÈŠ•¶ïa*™d­­®uÄ^�;<ÃÃhÖ-¡jHÆ.D,;Ƥ©>Ö˜HD3^³¥`®jTñwA`çV0xuðð:¶ŸoTèA¥Ø«h�tŒE Ø3þ²è/(~ÄG55“¶82°O5¨0H…¼ˆó¦³UDéttƒ Ðfy¯Ð‰È@é¬ofØ�RÈ®{¹ºÄNŒª(¦d±ª1ÚÓ¶ÑñXe½øl¢jÕCjÓŸ‚¼êŠ›Uo¯kÕ#›)¡Eÿ—uü*`¸*W!§Š?5å&Õ‹€>£ÊÑ64lZès�,Ïdhöç{ºÎÊp² ×NUÀ(ÕºkM'æa(jDÎtÚⲂ-4—a®¯ µ+ tš8áAáow0æ3»U¸ˆý! ôL(áVzI©Š¶Š–ãy°¥Mì:ØCGÛDI:QZ+¼ãxVL�ZÔuNŠÞ*k¡’sµ“ð¢²I‘ž:Ë7lw:M‚»Ò�™N›±.Ç�¥‡wÁ5Ž  ñ�›LÆ34˜iœËùÑÈ8ð‰¡•Ù¶~øF‰ž1á�nŽ,&¢”¸ÂOõ^q-‘huö 0ì’žõp_ÌÈ;Ÿ€¨ÑõtN 5)'kCû™ÑØlmHå‰b >þ_VèNwÓ*V_JþôQ‰¸fq²ÝÆ) W'Û®iÏw%‚ȲfuÇ€�P£2Ý4"Ê@a{S3Äô,Ú)a|ŒìNûð(·F*u‚m¡±ªJ§Æ»Ù)l)Ñ´Äë)Ë“¤2�ˆ§&“…šÈUߨa£M"÷¨î¡�{\ Gqœ‹ …áÆ1)¸*_uÏ·¼+ש#ñ˜VwÖ͵ ‹MJ°é�=„y•'‰ÓÓ´iÐð‘eܹËí; �ðžu¸f -O†ÃÅòò£†e|éöO°q¡s 0ƒäsÇOD}PsU¡t·¾Ž¼®[:Éc¿È3 Ÿþ:†ÉQÎņã'Ä�9·­ »šÖl¨Ì?z ±6Q¢ˆº6ŠúÕ̱�óŽÁ–ëí°ŽÝåyÙA�s•ÌrÙ–�¶·5·hJ]kc;‹=­q„ ±"ÏWߊÛuƒÑÍ×dhâÛªNe艹 vŒ0Ê0eR ;v‹QÊ“>‰‰¢¦¡©¦äu¥éˆVê_�àÊTq`¬9 Óà‚‰ñd�hŠ×¸åêÝ›X^CzªíF­;'îôUÛ˜æÞÂè|Å篡ž5a1̈ù£-X4P`fÁµ}8–S ŠË‹¤MÉ€í�]†U8>)\x€BçíqáÚØ0ÏÃTÔR]²:š½>ª8•âðŠ&9ªÊRÎ�ûú uf4Ê#5‰0Ë®ëŒUÜPÃaV£›–E;ô‘pj(šÏÆms ï\|-ô#ŒÎÁ|$Aë,DŸS~@Sõ$„M* 6¡‰vés}A)ev„üexQA}îOqÞ0˜“}EOh 1œåv`ŒŽáàn:px²š8ˆŠƒHkô°`dK^§Š°äNRÔ¡5ï6ã†'s#ž�¸ie[,ñL÷øi§™ Å\9÷Â\¬p„ »¦Ù&rá©|•©µiÌXmVv 7nhæÖµ)ÉêrÙ…M–Di‚™Þ¸�©ÁÑeÚ¾‹‘U«)Û`�J:€µ™Pef·ÄípÙ¦ä¬Õ”Cò+^…êvˆ{CJ Ü+˜$eHÇZÜ®SÉ÷’ÅÕyébø¨n»ŠOm›DgÃgþ—ÙÆk£ [>¼| ûtˆ•C5÷iy%ç‡^Pð…\¡ÈÈp>Çîj¶PÍ$²izŽŽ³f9нä6£¨øÛÝÖ“[€ ­Š(<Êáª5Óã,< ï®ºöO'|¼¥5Ûf¹zpš`µ”6+4 ó †=cû4�t ¥ ž$f¦¶iô½~±û°¸ ×Œ9TEä˜Ú™2Un›Õ oÞ\µÖ«0€=ÚB’¾& öÌ$?=ÊQâ•ç¨Z£2G»Å�šÝìÓ(ß uè¯`±x‘SU,äRi2¹á‹žI»Tmq“J’ÊqÖÃr½ïI}zïr'k8+¶ìg‹‹W*:ÖÒ?Ó«¨ƒæ‰o5¹i+ÕT°ÔØä¨Z_,YÚR?šRÕ»Fspgu¢[V?{pÂÓ“öؾñº“‡É˜DŠÑ>oTM6÷©Ù/ ’E1ó wHkB–S' �ܲ)ŠyçZ è hƒŠ`dj/#œúÌW‰Î5 AÂBJ–Õ³ °>Ž– 0¼mOSæ±ÒKºØ’)»ª.ÑþÄFÉ^¤ê¡¡DÉ 5ö¾Íc„÷ŽIX¬I¯ˆŒBÖ‚]¤ŠmAdþ¯šmD;ÄpÍÌX=‚ÃÒ�Ãi•'YAÍ7는×{.Sld�eÊÿŒ&@fÐÝÜ`CÄÃÉx݃h ¹�ÒÖ‹)°¡™»:3AÖ î‹,’6÷!Sd2ýóÁ™Àbß¡u5HÇÛñÞá¦Í4=Óä§ à“{;ˆ(@œxn6YÂö]œWt²O¾L©LIèMù>Ì”/ªŒ›–©]iÛBÎÊ&{ÂÏþ)°]×L+§Vâ¿[aáj"ÌÕy`u‹\,ꜛʡشPo!À<éL²�ä¨$­r¹‚羡»•C§\€M£¬g‘qe\¾ýZÁžÚ#‡ÄŒ«p1Œšml·X; á£E-Ý!Ë}ËrG Õ %5X+ ¥8Ä×ÔÛæ¬UVËs³¨wš5.)"”ÊìÑ0”gÎé3Éš»‚·‹Ãòå2²d’p*„^¬âÓ}™òå_‰™S ¬2S¦²±úÐGÀ€�›(†`‚1¸*g¸½L´óÚìÍßD„(“ ]’¹:/ãUÓKRÆôI?H•¬Pû®×Èú«ø­:tV¶U(T¥mŠfBž_Í8ÌÆÍ¦¢ÓâZ‘LŸ:šõY¿‹Q8øE×»U. —YL8rTÕ»«}õ$ÅËø2¸‹˜�±ÈÛâ íÍ¢”è\•8ä5Æž¡Hêqqƒ¢RF\¶ŸäD±+탄SÓòôxzý¬«[&SÈÂþl´º›EÒØöÊm]à¿À ÖºËÀö™Á³ŽÊGµ5(€°d,Pö?Ȧ¶FM¬«Å \|L�¯°· RÄ#ÔJðòôÆcÖ“Fí}*hxÄ`[Õ{ØÁ]ƒoò® V@E��Q¦¼ñw)dJ“nÍr'•N@Êi–…Ý! ñ h15…Á h@<æ¥8¼GŽ¥U[,˜“ªÉ¯RÜñÞ¨ÙÛ_2©SpÀ&:�šÒdv5Íy[h›÷X3&*C3X*¯ë�;“‚û¸hÚþWµ±p«.h�泤ÓájOÞÚ´ƒüÞ6ÕµB:fÄÌëæhq‘‰øÐqìØ�w:!A^)™g)¥‚Ñ•§cÛÍO`4-V‡ƒwëì³Î\zÀê~9´Zà}­Ý0Ù¨*æTôRhH#‹ó!,®cƒÜ/ÊF:©ͺ̠Îp;�Æú¸ÕûB•f•âÏžBž#è´î“Uö—Ñ…·µÖ4˜ÍD·”GgJ±ýž¡|› Œ.£[CåÛÃ5`{AíHåh‹–sr±°f+ÄÆ�u@9"vÍ`…�^›`üÌH6 yS�IEND®B`‚dtkcore-6.7.46/docs/src/dsettings.png000066400000000000000000003620461522615770400175260ustar00rootroot00000000000000‰PNG  IHDRŨFÒÛ" pHYsÄÄ•+ IDATxœ¬½yÐmWu'ö[ç~ß{Oo–š' h@ ƒÁ€ÀHÜwÇÆ6Ð]îtW»»*.Ç©rº’Ž3t§Ê]•Š»S±«í¸±»MAð€cwlCƒ�À 4! HhÞüÞ÷¾;œ•?ö^kýÖÞç>ÉI.â{÷ž³‡5þÖÚkïs¯ÜpéÿüÜþ€@Q_z§õzi ~[íZý(ÔÍÈôG�ªu^-·TEDÕ'ƒXsUˆ¤¿P­£¹Ê$–+{.ßùÚyù7ÿõÓÏéTG’·Nwl¬~âí_ÿÀm÷½ê’–«á�G/ü_~÷¿øàey¤Av®ôwàÉs寷ÁzÆ1u•'[ŒÕD`ˆ©^­ï©¥‹ �¦_ …Í-d‘®}IúW'îØ…J°m$X…®™L ÕbcÁ¦@TÕÞ[[cኋÿýGŸ¼üÀâ¿ûäò�ýk¨Kô»ø^yÞüß¼÷‰Ý;ôçþèâ¯=y‹ÉD2ÛqÙ?%ÕjËÕN°Å¡ªîF@Pèr¡Ë%Æz¡Hƒ`…Èåû—úñ'^qîâŸ}úüß½ÿDE!�*-£OT08 Á¨Š Asujçj°‘A!"¢Ì5€AD�I¹©Ã ¢2 ¤tÄ�TßvO1¥ †ÐqÒËP\¡‚Œªª2ª®Ðò£b1jµ�ʺB¡Åœ\Šj^e’ów/^ØÚ\* ø�‹NýËüÞöjøGqå#Çw&”«®£Ê‹Cšm"ú9z‰ª©j¹VÁrTˆŽ*àªÕÝÑqÔùr¾XÎ1,^Áü·n?rôŒüÄ'^öÌiqõ˜ÉàLqaw"Òø-û™„þJC†õÞ">>»À0ÝÊõÊõb<}™;WÃX†×åUD,Ì €B´©ª5 ‚�âH½¡+"µ]‹nÉ�ë¤N˜¢¸7…iœ.V*4Y|àBœ¿éë'o¹ÿƒßÏÿý�>µ›l€,0½7�ŽFGÖ&“VÜjUPä@ lfô1�yC=»Ý$š»¬�•À¹»Ïüö?þ‡÷\ÿÛ_ú¾.N¡ëØ¿¢Ú–Å|ÒðØæ 4‚‘ä!;u¡�&U…û+&Æ @jca¥¡$bMÃ1ê]þèÖáYã"h  ¿²®Y3Ô‹½Øÿßµ©øëÁŒú¼ˆ™xf™B¶÷bSÏ Òü %Âòñ(dïÃãàñÁq�0Š gc"ž´ Q>gÝãbá¢I£KoÒ�J+'ÍåÜ×í™]{ð4ÑàÔJ'`™/gþôÍþôk×{ZãêÒÍŽ®AßÅ„pI$5¬6~åmrÌ Ô’h<…žtEc�DØ$³ Ëb£OØm#½ª…tRUU)©ÉämÀÓ’Õ*£#²ÙBGÁðòsçÿüÝϾúüíÝ›ã�ì¹ã‘½Ú`Wâ1¦5ÈwŽlþé7÷ýÌë�üÝ×yèÙ�[‹ÁÌnÆ’î5bèV£‚z¼TZèT‘·DÕü‹‰�ÍMÙØÄjW‹a¹Ò*À�ßtìÞvøÈÖÆ…{ûwŽÏžšÝûô®�·E,ƒ J)ß²° o …Jùß(:T^¢…vYÔ=F´¤e ¨b„Tì-S(iÙˆ`êTÃ(gRTEspV*#Æ’7KUJ+^ ê*‚’Ì©JÉݵÈx,-ËèÅUpÎÆê_üÀ×ÜzîÌ€‹÷,6ý‹Ç÷?qj¼¥*™T:TØÑPªë%…or @+VUÖ0€Ì £ d˜aT�/æ‹Å¶ÊBd´p)ÕV�n³ Wåèkd”â/:ÊpÖÉGOv–ŒtEëÿ`Y¤™x€†R{ƒ¥òy†3{°±PŒâ™´’‹ª¹ˆu§(а¨„lî_a†ÆjD R&�œN®jÖÄDÖEn|�´ê©#Hüëò÷áB '_gGpëX]]ÛûYÖ Îã…÷™îÕ|^òʆäÀ7{ib3‚%§!nRQ«^GÑŒ™ã6˜ÀzoC7˜xŽnîßnÎÅ›ñs¡þ:"9ˆ+ Âð¸\GtЦj¢ÏåóT�¿+ŒO¤ f<‰g*Q~)WÖ4kT8© ¾ž­S¼.'a½!©UU‡Zd!1ªQçîÌé¯=ØßÖy¹Åù´×uR¤07r‚Ù~¤aÏ‚›cKÃnyëäªbR7PQãÅÃH³¶•ïÎ*ù{6ö\±ã²÷ž÷äYœ×�g&¤€Lø„×…ôº7ý°˜v?‹»õcDÎŽÔäKÝðñ—l"‘4É»‡X5“Ê­¢SŒ&Øï&˜”ÒD,‹ª3ì).�y¹È–ÛT ‚‹÷.Uå�Ü÷¯î<ÿ伿)Z÷@º~dKuT>r÷ÁÛ3UÝ»S·.©Q’KãI¡-ßš›©A¤õ©à§pÖŠ¤²1 ;±©X.±\é3'7Ol/?w¾ñ•'ÏùÕ¿:øà³;ë¸ö_…Þ’áÕ7ºUG)Ë�Rí·«u€BÃH]T“SQŒ*3—®£‚B0€S)p­Ù¬BQ6°Ë…ýQ*Y:Ä´^J¶ôK¡"ªà领¹�Ð�KƒNh³¼Q,Çá«Ïí¹`÷â¢Ý …|ïÄÎO>¶ÿ£Ú^ m` T)Ôé �Š�^U KÞ RUñª#fEËÕüôöJç�U�»uð¤ä�UáÖ”væŒ9b*‰Ý$ìX»ÛŠ�Õ•íC«ÿq?ð•®VTwα縪ÊÑóqì.ûëöî >mÏ5×ÎÀ]¤¿ WnòJÍoÄ}Ó|Ûêôø¨±Èg)ªéÛ—óðýó ‹—¾ý*©³qWªùŒ·šYš˜áœ]sÁ þ_üÖã‡÷ýý�¼÷Ù“{£æÔ½, æ1§º%ˆã@oÀÝ$¸³O£¦á²>ûxÓĘæphÏ©}ðã¯8ïè9;–xÏõ=ƒNÀš•䙓˜Ä½ÐEI Ô’u5ÓïØÛkN¸ á°¶ÒŽÂpxí¬Ú’6æ6R眻³ùǶ¶Ä1vœ.=½Ø«7Ô`#‰¨Á,_'Oâ“g R7RËÚ´´5¡„û, HB³JŸ ƒ6 3—º½)×_ò/ž;ð‚`ÖP3„xÖ@=¹Ø„ƒ©ÅÈ V Ǥ½cm£Aé�ÑV¦°ØuÑæëåÊfOüéñoÿÛgÇ­ÕñiX§°7¡Æ4ßjÎ{èTûÆIšI©%/LAËÖÓRÊÞM‹Œ©bÝÐnïÒ+;H2®%éwɯ4ÛÑŽâ°�Ž´=ñ¦¥‘::[òÛëzu3†7f—ø_3\ø~ 1iBìZñ~ÇÅ «•°xÁÃOwƒ"€�Q0ÔL‹â3ê6vp%ÍŸJBé4ˆªÈ0Ô�%A9"*¥p+2T•ãÆb;ù„Î"¤”Ö^7ówjÔ·£oÉ(Tj–] Ò5ë5CƒEÞ&À@ý|K¥ª®Ò…‰ÕQ¹QáGÅ)uÂB°›VÅ/bÁb±:3?³—�%CdΑ«è’Ùæ4S¼R�­9Ž:¸ÙJ”´Hî­¼ä/¶çࡹs5 ›8ŒYž½HŸ¿D¶wC»¶pÁã¹OÆNµµw¶"ä5C”6Lö¾Åùô”‡ÐˆüuP0õ /ç>tWá �jGfwp;â˜ÁLéÈJàüã9›Ë»·Eu±’çw�ëÎʽD®lø|…ü¶·KA &‡©äØGÀš1×ÎEkßAôü}§v £G¶vžÚÞÄ‘ªïø%EYZ î<b¿®×—£.W:j)(UBRò]©ý¼V]–ÁÃ3‡o)±’²íšà &¹r ±‹b~”@\›Ä›¼µB5\¶DÓ8©*ƒ‹UˆŸ¼1EÖZ6UÀêLù X™× ãÓ ²7 ˆ”ü{¨GHì4.ÀàÆ~ju%Á¨˜/‹åb±œCV! {'hÁÙjÌk^•²IÔ…w{z�J3ÝKq²³¾ú ròúY“QjÐêy²^9MˆeOÎ7'¢ääȽØâÊz;ìÞmÀ¯+ Tœ©—2Z­åˆ_�ïÐE…­ÕµïÚz¤V�}†üêñά3SfqRñPEN•ZL³A|þ|2X½`qS"ìÚ?¾ÒmèLrÔp7©öaã-Y¡“IëI©Y íhÖÞÛ9e¼«H⊾¬%›Jä2Dç#>&ÌØTÎæb5®µ¶b¡àZJ¬¸ýÐ0B&õZþøÃŽ}±X�æÙ!A5#Q:ÁÏ _f§X²;j«/—�ÅÃÈ2éÝàV†Õ¬…p*MPU(Üdc&ªX޲QžÏƒHu¯J¨=æ¥b@Rz€‚…�•´,­œ¿À‡.F(ƒBµ>nhÓY3h­»MÅ’F[D™ŒÐ¡uF)(Ãè†F!>Ä£u¹Píið“â®ÉB¥�1TU �*":ªÌJ;�yV¨G¹ÍÚÚ3¨¥.*jŬPJñ^ˆ²öYé2`�a\Žg¶ç‹å|¹šCƦ1Õ�‡ZŠM ùb Ž@8Ù‚·hŒ�øK•5)Q’ÂPþ �¢ »ù’voPìªlçœÅ‡j%<Å(Quo&“€«6Þ¾ƒ× L¯‘Þ'�j5v<Å] ]ïO¤­äË `ŒÇ?»Ä§Ñi³�AŸfT¿°1¥>\Òk7�ý»g=�ÝÞå�1UÊE•ÿDã^8mt- Ï)ð OŸRÄtÄá[„¾â£jx¥Pã¼N q¦«vR QmÇxüdT¨–¦Ô�ª�üöf¢\Ê _ª:O.‰d]Þë#ê—EÄ”¦Bá:Þ8°¤QêçÁyó¥>>OÏ)zðÂ¥›\#- �Q®îu=ElW$dNˆ ÷0nè,ÿ0J,±²à�›u�ú-v 3 1.+õÄÚxFÑÕ(2ë# …ЪÁ�žXð“éª*# õ¡áêÇ凎£?d.Šj9|91-C e¶ƒ™9©ª«I©+ b�‚¡|›‡ñ[7šE¼<<«RÌ c<1mÇÆê‰p˜Öu5Jy2ë¿ä@vŽXø‰ J¼$…t´ô°š�£k1BUÿšŽÕr\œYn/æ£.!£á¸¤ÁÃÂ[ Cò³î°ÇE‚&ƒêÈÝ“ªï%Î-3hÂt`°r¤'Ò&«¶>ŸÍ@—%%sê·-ñvÓö‹¬›Öc"{­XÝÅ¡+–J¦3ï\ü¨žWÏf§OYLEK"»cßDD圄ںé ÐrÂHâà\Ïjž›ÌÇ‚`±–Á?NYórQÒ{·+&’�:º°'Ú »ž…ÈÀ/l‰v7ÅØuí™DOXÓœ¬4ÀA1°Ö¥Ì~âDS‰ô#�ŠÑu1%Ë%7™Œ7kófn²&PõZ™¢'B*ë]&§ž˜ª7ˆI3š°[É0•ÆÍêŸGôü[aÈÛ4Ì$hj«îJN5¢ó�q¾é†¶Ø—‹*“ ¨îdz#ŽÊ~©Ë rˆHRñõƒò‰}K€Ò(Äd7—†«XŒ­ƒ&!FùIBi´fäuÖÙx8¨1÷’îÊÙ‡õë0¥'O¦È^×W;bÐ�ÀŒxC Äd|O1�C“Ç~YI€õ°ü<–ðÙ£iπí¥·�à0<†i=â Jî{( =Æ2ÞŽJäEZO!k‡ujæžÛÈ‹=Ë…1 ¼ÿœÉŒ/à`{w *nŠl FÑ•ê¨XUÿ«ÀòE(¶\�ÊjYpŒå[3�ĺ)¦PË™Ž¨¢ ã,ȳ %£öLµ ¨ŽRóxˆˆk¬°.¡¸ò«r&Û-1 ÷¤ÊE‘cI…†bµ_WVvF$JZ+âu�½Vþ$-`F­§[jnµ»~°vؘAU—Ëq~f¹=_.Ws`Å ÚØžY[¤¦¡ ™â˜E¬¾Íg…x÷+——lòvMlÔêŒ]®ªû•Òœ ·©~Ä$÷”J1-ƒH¤CóY3bc‰`/•MTÅÞ=F‚þM/šß»æøi,Eu& KÚ‚qåcsI*`ù¾�GAõüZ#èËóa�µ·oÁ eNɉ¼Šz†�ýÁúæMÇǤ0«efàå å–LTLŒJ¡Ê}- ÖÃDdžLVù3™/£'×€'Ù, &,Ô‡ÕD}"EÙòÚ6‰ÏA|ãmúU÷º&½:˜ ÿ¨TDœœCòßu)ΔF:'Çi¨¶¬ õ�؈)Ùð:JÔ¼¢€PK/÷´‹d!…P×™ãú—¤÷ªu³p±¡Û›¾°ZÌÇÅœ’#ņGô„d>�ŸÈ·+ƒ÷äBdî»DPÝè¬XÚ«-ÑP{Q\r•|�äDdmöÄëòR}@<°é²’Æ:ª4ÿmX�öÜÜ’éÛw\e™d2ú–ͫæ‰^èô1¸ ŒDÀl„Ðûé°•höS<R¦<„“m £8�õ_õ§®”F†=L õm’U²�Κ+œ(ñDk Óuà·†òÕq†AÎrµz«…!bI"3 X2išÚ-¹[ C –x©`FÕT­9ª8V)t(ßúçÎ`°ù„䣥5¨Ž"å[𸈳¼ŠÇ 9Ð’JYˆ%Y\0­I¹åµ5L‘Qyº¢#0(FhÙvŠü·œÚ€H¶k2AÍ�¥ZM!€êP¯ ´¬� År5.«3Ûóåj©X¶âá Ãr£¡Y! Rs A&§J£T0�“ aœ–aÅ„‡„?VàG¥N}©QmÂkáÉž�«š!ÔQÌžB™jÆ¡Qõ1òÀl$ $»ÊqÇrðt0šz–«ö0i¶ÊA£‘Α°ñƸAk¡%+zúÉ–&Q4#7IäQB²dBžh�åüR9ЖTˆ j ™ îÅjLM´¢z2‚¸ä©ûIè<‰6Cu/Çâ¸Ò&Ó.¿’§‘›¥�ï0ÌÃRGŽÁ‚ø æœ D3;<Ogô„òÅ:‹Vv†u�¤<ñןcœN œ|J¶ÊúÍápVštÀ+÷ëŒY¥QñÈd“ldNw�›äÒù7Ø›žû„$Ì;ÑОmðÁ…G(·ÊC‡cÝ”]Ìu¾­=¨T‹Þ¨VQ‚’dóHkŒ`¹[¤•Wþ6:7k·Á¶æH! F?ª&ßV!¯Ð6ë’ñûGµØS ”bFX�?ˆ©ö_ãAŒê< ª#»q@¢Íß7ƒOú²7æ7ì½{ö·$7k¦ÐÜ ÏÛ¯Kzª¸¤ÝðÞw•ˆöO�TÖ!ð¤¦8pÚ»(aÝŸ*hã„$š|oX�È“¯mOPšeJlW+7|Á¤º•ô¢ù^àn�\ÚžFÊC©ôµÕ&5P“t&²(t]AÕÒÈ*+Ëx€Š8å­jå23‰�3¬n>ª¾BªÄ–£ƒ• #§¥«v· ‚¼¾FËqÊö¸ qÓ2©b�›Vuð�ÖÕA!ÁŽƒsª]Ç݆Jd{ð7ô±µC_åGb95u(‚O$EF«²J˜@ Ú•‡—õ¡Ãåó3£ŽÖ—0ZµœŸN¹QVo*HØ®†„‚�P‰2EŸ4�ÃXh��YMœ% SÝIªèïÙĪ#ËÈuDhÒõõõ’Òõuª$,vÓ#>· )OÝíó›%7àaeŠxéÞô˘½ÌÓ#>ãlË7ø˜ËÎÿSŽHÕñ ŠþªÖðÆk2ô’<¥uO§ ¦GK°SD©7Ükl¤fx_ |õbIË+w5žiMhÜø×d±b�سÇ2@J©+ë–pXp«�o8)5>™H© Qa¥k«Ý6pc!P{cª±‡,Ëh’�6Sš㤪 R“¡Úh�'Û‚€<ç$àN±‰dyvÏzyìç&jQ™Fk§eé‹„š©í©‰/ƒc '¦Œã0¡,ÆÌ]±•\T®8ÌGãH#ŸmÝîY (ŠÈ•i²w4ª0Ð+ɱLl¶Ü>§ìÅâ#éEÙ5VV:˜oŽ‹Ye\a±­«eˆŸç,gçï}Çé][e„ 6–ÿþÊç¾tjç±Õ¬ïS>ê‰�áY ˜Ð»¼v®äï/;ŽG.²A�ÔTÌ£ ÕÄbÿé•ÏÉ?þ¤,6õñCUúƒâ§ïÄû?‡ÛîÃ;ï¾s)µ&&2`¼ýn¼óëxàr![zC+ ©Þ~Þy?¸\V(±g®G<˜uLÁBÅ*½â9üì'e¹�'åöþF»¾ÒµY÷>G–5^Ó 6üN‘׿²IyÇAÇŸúœþôgõ�÷êÝ'ùîEy|Æ�4ž4Í7ÕO€•ýê„´š wMêNº ›*a!Òn•ü€³Ÿ :’Ñ,�~‹xbyAÂdŽR&mA�wGè´¥eáVýÄë^â‹?SÄ„¬�7×�=Î~WØŠ„³° BÖØu›¶Ouñùö{°¼†vÁñz !Æ4LY·x­¹ïØD´š4ã#7Ìbœ»ºN-ßU‚YíÇš,ǺøBPx�ˆ ÄÿÚøiäL›n‚7I·b�™¢€Î7u{‡®Æó3º8S¾âª€_ ØXêû?‡/—»®i¥To]&w]cP–/ó }~Ní¤ñy–É裹 O×|äÑ&5Ø$ÍýM3Ï€úy{èç‚Q†�¾ {«œ³?økØ©ú-SIƒ0‰ª4t˜”šUo ¢œbvÖJ¿m•2n”#�‹GÛØ¶YŒ|)¶çë{É(ˆ8ðmøÍ8ó Ëø+ƒäÅñ– IDAT;þuÆEac€@1+.ÿf!‘¡œžöб˜h9 1®0l §¶SÈ…{ŒAüy†x€O¬¦]¿wÏ`¬¢•„¥U•»4 õå÷Ç8»”Ÿ6æ´Ô° ¿jt°“.Êá…ˆŽºuûÌr¹ZÍç«åj9ŽKòã·Æ õó$b’/G9S/²ÐµÉ€…®ØFt«³º)O$Q)æ¶g À<Ñ!þtß ¿3^ò똞·'×ÑãË‘Ýî‹S4%›rHBuºŒÍPX 5-ADŒ•B2SÇY†Á~»7¼.…§ê¡cRjB­àl;m|sÀæ-IÊÛ KÄCp�¨A€ÙN²€ê›±–’ôøûÚRÕ—ËŽŒ‰�}ó³¼Ìr»fUåÐyÜ�Ò€I1mÇ…Lv~\8b!ÛlÞ„ìÈ /í©gá‹È´¡Jd%9�©¢«HTtÇ;$»ÌεJ+Nnð«u5$˜W²àŒ s› ‰ßˆŠê&#Èò´Òl+OõZúé„q.+]³TóæýïÛoŒðyß<§«-Yy4M…`±1Î7D‡õóm,qܲI暀�âj?{ÞÑÿê‚ãO/gGWÃ#ó�+w,w &y1„ñ�¡™ÌïŒø¸ér…b¦xí£úÈ…8º‡D<À¶«$‚Bøià†I©6yú ~ó6—GÜ_‰¬fñБí|YàëU‘Õm@oþ.¹H�î©ÀºâQÖ)/ÚUÇ´v"w®°ïŒ‘�)ٹľ­ö¢ÿ}ú<ù··çŽnÌòÛf-pƒI$�Ù ÎÄ(ìiÏd'Y¯ �‰j©‚•`5P ¹™§³5QÔ3¼d¦Æ/Q,ßÄY o¯És kí¡oô�Ž›f½¶œ WhðÇŽµrçG¾Œ“ÊW�?¸Ò �XÕê‹5Uêq‡iæP^ о†PU±ŸC ¢ÀPŠ eŠ¡P¨"t¼Yõdg=¬,€– +Hh —–´«_4œ·§bÔë  ´ý±¬ öjP²_'—rNdµÒÕ «q5Ÿ/W㸘/G]©ŽžbK�Œ,§eF¢ædݳÙzÃß²æÐ¦q2†J¶ “ hBÏQ‚b©±©ÀçëÏ>¢d÷¤’Ø4.#¿n&‡<˜¯ Ì+ í ¥³ÀÅêIh�£¤R®?Èjì$E°N?dcç«Àœ¬+³,sWq¶ ®Ûsâò3B=† ÆùvÅ5OmûÇÑÃÓ2_·khaÌè1¼Ì`g*êàEÃb[—ó0 CŠÂ‚-í6 ²sÐ[öÌOŽøïŸ:ø3‡NþÂãç=±ÜÅö˜[1$i&¡‡Ì/<ŠK^�ß“êP™SÅž3øñÏãúÇe5Ó{_!Ÿ¾I·6åœ%~æÏå¡ËÆÏÜXÆÐwÝ-W>¯ÿîVloâ]÷È­b6BEþäõzç«»y5ÿ+ªÀî3úC÷ãæÇ°s®ß¾XNíròBN…Â?xsy6ÎÙè~¹ùQìœ�Ñ«ÔéVòÆGôMἓºØÀ÷áO^/ÏTU•×<†·<¤Õ­M¹ûU¸ãÙÞ‰ �èû>�ó�c¶Ä{_Ð÷~*øì ò_§Æûþjò€ñ¶¯Ë·àó×Uöv,õýwÈw/ÔCÇñʧ±k®ß¹Hþäõrx Ø9×·?€×;–øæ¥òäyzÕSòá[±MEýVh‚aÄ��ê[Â…Gõ̦|í*Üq½lïÀ®…þÔç°½)¿ÿƒ2Ÿas5þèdßùè[qz—žw·Ý‹«žÁî38q¾ú*ù˱=ÃÕOŽ?t¯œÚ…«žÆ=¯TYÉÍ�â¡Ëñ‡o}ÿxâÇ+žƒ*¾þrùôM8½“wKÝ^£Ø0Œzã£ú–‡ô‚#8³)w_=Üq#3åÇ9«;Ç¢“w° RXvfùe.÷X:—+ROËÙXˆœ  ”â„û�ÈŸ¸p7¡'+½l„HX„.:ÄGî@äˆ%š‡³„#NoÛ�ˆ«¢|ÿ2VbáD ³AÌ�`6«—AÛ‹"°³6嫎PSgÁ5ìJŠHTR|)²(€?*J�Ùõ¼=)X­FUY-¡ªã¨‹3ºÇÕ«QÇ•Ž›§�±<›ÝK\5þzV]©!Còž”˜�ý÷5*öygÜhÏUdˆðâÊÔjU³š:ø��Ú›�ÈrvD [êçõ«É´Ä7Q|­ògQ\2wc9²d£þ¥áÊ�xlggkÌÞBž’žm7$y©„]Çy{&Òm…‡¦ ¢IPpAˆ±ƒTÕf…+ª²ô/±ä�¬\9ׯL¿j�Ô˜ ó5¶uC³Kß­Êæ›¨a=gÅÑ—y€Äà5%ˆTïÊOFÖ¤ª­6]èc¤kÆRÍkFA;xÜžm-ûXZ¤È4umÏI¶Fš^²<‹-k>•4³ožG;�ÚMžÕ˜$nÅC:žÖRžL�Uz¥ê%‹JZh•o&ص-öÉs@#Û%"ªÀÒÀ"Áòœ8%µÕzÒ©û¿ØZq™›m©jzz€,8©ŒèE.+8yÊ,7Æù†Že»Ë….¶ËÀÛäj¹0ù8‹ÒnÀ\ñäbãí{ð³/;±{PKmVxYøŽ\¼4!'Vúѽxò\׫ˆàµßÁ7è¿z­ž?r—ÎFüÑëHÍ\ ÿñµúé›äe'ñ�Ïú5 g9 ”î³·ß'×=.ô<~H^óèøÎ{å©ó*4×°½á1=²Ož[E3qû½S½DUåÊÃúŽûä37â[—êÆ ‡ŽË‰=9¿ï¯õöûä37éC˹§ñ#_ÆæJÿôûðì>|èràŒþÔçäËWãÞWB�í (ðì|èr`[ê³òå«qï+ ¢Û³¢¢áS߇?-�ÐܘZ„2@ðAü‡[äã? »·å§?‡ÛîÓß{“`з?€›¾+“>qÞpÝãíwã¹®¦Þ‰êÇ×>¢·ß+Ÿy�>t©œ{ ?r6—ø³×áÌ&þä|à3xÃÃúùkå–oËåÏã#·âô.…b¾!}±þåõ8±[.=¬ë˺µC> ¸ð¨|òõzÿ•ø±/ÊW_%¿ýN}ïç墣xæ<pËÃòñ7᣷âÀ)ýÉ;ÇwÝ+|‹M}d¼ížÙ7ëC—âÜSãú¥qs9üÙ-X‰4°`ƒ˜èS‰ƒÖª5Q¢X€¶ÈªÖÉ0“ÀÎíãp�¿�UnÓ¼JØä� 5ðéL£QØ�ÔŽŠ¬>n•§V´ãï!»Š'-'*�¢PÅP»—GüF-ßÊʆ2ˆ ‘A ‘YùÉ@@0+‡K ´Ƀ‡¨¿eQ³mM^£*0®Šn±Z鸂– GG—2êè R†ê°±4Éô‹8j¡ß%î gº°4E¸òÏòs;°ÄL$騳Ò)™T/®6Z|;„[†mûò³ö‘ –N°r§TæcÃjOIz<ôÐèÔàÅró& „ZZ`ÙKÈ–ñš©hœÙ{Øp“÷hÊ„nN+.Iyºnj+/¼+»€Ç.“‘Q÷[¬9‡ø”+dA53ÛõÈ"]·ª$UÞÕ9c1±µñEÒÕ–'èA’�QdEªM9¹Bs�ú±¤»é‰[cù7Šˆ±Y_3u?,Á'0bíTÊydV´ àVe)‰A=I–ùúäK¥bìˆd®9öK´–r±%ð¡,�rðÏsÅßÔÙ ¥Y¼èkÒ7e{Jʃx±?¥WF†ðG§†×xe2O I!ˆæ4‹’¸šÔ™RæQšöJ]òŒaëSŽV‰§õ¹Ì&UWƒÎwȪžÇ(™ôèI¸zÀŒ¿¶~³ÁèÖ £âWž;pÙæòÖ=[ ùõ+žÿ×ÏîÿÄÉ=£¼´Ô áœÛ®û4±¹ç”\û¾p-¶7ym¬ß¹w¾ó Ý#Ÿ5n}H\_j�'矠î=*v-ô Ë]Wá®kD'vë�×á÷á/¯Ç±ÝòìýôkõÝ_Œú¦oɧnÂSçÕ�Nž£_} ~ë¼ú\z¸~oÅÖ.ýÎ'wÉC—ë {±ØÀîí’„á‘‹ô›—ˆG÷È—®ÖwÞ‹ý×ãèÞÞ-H¼w]�»®Nìî¼~|Ç}Ø{Žíq� xkÔ D:Ë͵?|áï!-!RóF|Pu¨}Y]ËBEøªc£B"}Z¥´Û“°hF™qˆñ̆ì ÌS¢(*R©@oÈZ_Œ¤Â�ræ–Ô͇ö 'ôM>ð¹*X&W6ô#ìå~9'¤ë!ro"ËMݘÿ†XQ9ciB]š^±r�S3"hâ¯S9OÒ“f$„GÒÄüU*à c>[=ÆêÐf.ë/¦FI/ÎøFFØeeßù¡"‰^œU$!˜#"b¦Õº,Üû]Îþ=ËM-ÌÔrä®¶ceÚÕ~7°J.ÕðØGDÒ€ið°~3obäøR!ŒôrßÏfÌRféÑÞˆ©›‘,¤šÄÃPSÛ ]É6—À²%v"lô/¯@7ê°C’qžÄˆ5¼3ZÝ Í@ë#ËÐUUiΉ�ƒí«¸q%êùs:ý2£b¦Ò.îtº/sèèbM|jpÞ°´TÆdv^¥Ùʽ¦]eÿ¼®…¸–o�Ü�­ªÈ q5½¥¾auqd„f�œçl» ¸åMz\8™ÆL�‚\5QØ¿ÄäÀ�²ò (ÆAç›å‹ðX-u±­ãÊæiè+$6£\åÖFqÜÇçòþGÏϾÓÿò’#7íZüÆ/üÒSãoÞG¢c‚ÜEÇáW…Õpõ³˜©~ûbµC µû3±Ø¨Gé^Ø'³öoáÙæ@‚²‰pÛÐQ×.ØXŸ=g°±ÂÓçVs\Îðì\v˜%.W=ƒ™Ê·/±Hí½ÖAV3<»—®�ä±óå‹×ê�}Q_¼ߺX0+'XôàI¼ýÜú��=b¾©»ærlψ‰—æ7‰zp!ÛÍ‘=X õúB0Œ€Êþ-ݱijë £È3ñ²“%’b6êû?‹ë¯#|ëùðÛ±˜aï=÷$n}@Þ–ˆÇ®mÛ ÷_¡—?�wß�/]«÷]YÑÞ3x냸î1Ý¿ ³%¼¢Ž°0ߔͅ.fºµ hyèYàøQ«FÛ�Ùˆý[8º·s'›hÏ=xBoýº¼íÁz£Šw[ …µ5>[iSP‰Ð!gf_%vEÙ$B#<Ó=_¨,ùlS°Í¥ÔªÀ½“Vê­FŸÐãH¶-È%.LO!§¤í€Èk+¸ ¥\.°»µö*S…GÂXŽ×#¡”OtÖh…+„ìªøG�×â郫 ÌV¶b°íHgÎt!® �TÚlA&ägTÔ°^†‹e�mï+ƒÍ?ëRˆÏØ+F‹'x‹BVâ?ab�ª½ûLénbk:IBטËÌ©²µ1®0M*aáz²ŽtR‰%¤/�Û‡P@¬â¾� š¬Ê‹È¢­ ­@;ñ—šîKkKÅjõ‰lßÁ¦êK»�JÆ_Ï+[cÈÊ–=ÞÆKÚw²™•ÓÁ«z/ »MÒ¥o�˹R|¿¡i»Ïgæs·pš”“U¼åiýHñê@› �(í,;;i#“Ê1釫:A5¥G3!—¹Ë\Œ'¦S1Ì$Š0ò„•#Qð%.Íh)¡åsSb˜Øò$;g±‰p?ºÔb0 ¢}/l¡©�¦¸¥Ô$Þ„ûyβÃSÐA纘 Ç•,¶ÇÕ²c®ÎEÇ”è˸\TúþiYª|ùôÎolo~òÄ9¿xÁÑwí;ýݳU*£âÎr‰Œ�Åa³c¥7?Šo]‚c»§ã!Ëyìo fËöŠõ‹¼az\3Ü’ÆùÇÂŽ+fÇRoú.¾u‰Û�¬MöûªâåaUÈJô37à+¯Ä-߯ßù2ïÃï½YŽíQ…è ö}úÐe._�èñ]}}¢nˆÐ“‹Sô«7&Þéúr˜è,ìê @tÝ­ùã7ê'_[›Ì7±œ•†2ò‰×á¡K9Pëñ]uÖŠý[P`ß)l(æP¨ £þðWqÞIùØÛô©s¡¢?üÙ¿U§ŒEƒŒƒF&˜­B›Ã8‘š¼ÖµÆaøÄëñ�Ë`‚=±‹™¶4û=rÈZ?#‡ð%YfÄ®W#ÔYä°&}¡+#D>0�ZÝö-Ð¤Š‘2 ‰Jl†ð .¡¡#ãMKyCmëAR )íý)2Š ñ,Y��P5JœÙþ¥I¥Ò½«ú5ûIÖ'²Ü¡³-KKsI¬0€®‹²8y=p|��x–è4š6Ñ �+Øq“\RRʧ»SåA]¼MX6žj/õ«õœLÐU v€¤¤í[‚xÏwJOú ãêwÀm�Ãö¬mÅîüJbiì¿Mõê¤%ˉò³«®²cç ô2i8–:•FRáqÜ+µ%�' ƒÎ>EaÙ:QÎrkö™üÌ�åõÐÂP½ÐX§ Èjá«ñ»Q (i¾B[üô¼¾Ò%îlfa˜-'pæ (fW<–ÑÏ^–Öóü·áà)\û¤ªÊéspl·¾ìŽïÆÑ½zdŽîÁ±½¢3ª+ˆÌâ'f$¹‘ÈÆÄ’"±Ûþí_‚»1Ÿá‚c¦zÕC'è¨pt·&}‘žÞ!›+ÝO�3×aÄÎ6F,L¼ÜW¡'v⛗뛾�ç÷âñCrÕSzówñÜþiÛó×™Mùò5úž¯âÌÜûr¬Ãþ-|åU¼êi}Ó7äÏ^‡/ƒ¨þí»äÉóðð¥:ßÀ©�¸öq‰4‘1ùV}‰€Çñ]Ï‹ŠY�™�Sá¦Gþæ)C½T³£tT7Ù«$K4ÂØå* @Y<ÓÂÇô5ß1bŠnEÊBŶǺ´ÆgIô¾oe~)›˜Œ<]«|„:¼Ÿ‹1r!uèÊÐVS¡�‘MÂ8óþ�Pò÷Ç„¾òÞy’H+ 4h›ûÆž‰�¸£‹ªèÇË™Nj6^­Ð¾Ÿäñ[ w×°17‰râì™é_›4Ÿ6iüw:ðôn@³oÚ¾$VÖ–Î N;iW#åv4¹éFé>Ó�$Íh§ÂVüá©ÒľRCÑîb>.ç¡FX ,}È˪øsÆuÑd�l;ÉbKï N¯ð O¼ì­{¶®Ûµø[NýÎá½;ºï©Å¬8�¯Å=ÎÒIh�@e„Œ@ÙÒ/_¢7àÜ“rÕ3ú7èbf’@uûò7ê…Çäþo½çò©›ëQàO߈ùªüƒ?וèƒWÈ7âÕOÀŽ%Þ÷ùáú'UVè»îÁí÷Ê‘½øí·ãðüÄñêDZ¹„—=?Üú >¿¾ÏÀ§nÂ(xßçeÇrüÆ%rç«qõÓUnOËÕÏàÏoÔÅàÜ@ÌJ/ý‰ÏcÇR¿y‰|þ:½ê)_��ú–oèùÇds¥‡÷Èç®Ç7/TDôk¯Äéú¶‡ðÖ!ªÏï“»®¶ŒB±½�?}Þ}7þÉ'0¨ÞûrùÃ7êjæ›ò§¯Ówß­ÿäÏü6Æñ}w×Ë·ß�ÛîÁ‘½òïÞQ¾É›ƒ¾C¡è€O¿FGà½_Ä9 }ôexð2¼ìD¶h +ô¾wâÄ[*ñÃW®Vˆ<5¾çkøúøúåÑo\‚+^®ï¹ÏíÇѽøäÍøÛ_ÃÏýœÞ©w]%_ºç�$+ï\ê Pï¿ÑŸ¿ã€û^.Ÿ¾ã ›KýÏþŠTùn}PŸß+~;ž;¨_{…œÚßö ÞòDñü¾á+×ø’ÞÀŸc@¸hïñ#Æb»�æÒyqB+­žϸ¾ÄÄB[Ž®+ojAοjªR;�JêIŽ1SS…F¶•WþYÒÁ&Æ÷á­,WBòT ¢VîŠÿGÍZ,ö½AF˜ÖÃb8ÔÓ49‰%…‰¨K}\Nù}<:¢ª‘=¯ Ï.ˆÕFy*ѧƒwÖ„ø7Í:óBìyõŠ+0œ' ·‘ÍP¢ä´9jÛ6‚5ç/&SFJø5BýÄ6XÌ·OcÑ–Ãùl>';~ó,¯v$ª� õÜ̬Ûôg~ZØ h²ê›�j4X„†‚iŽÎƒ{ïb™ÆŽ¶&ùdi*l_=ˆuú1ãÞ”lÄM(�pòjøßìË«‹ÓΧE=ÍŒ�»¸ãæ‹®i5‹eAI¥§Mv᳤ïNVÜ{‘!,µAC!¢}r69Ü-\m`RiÆp'AÞÛ`q 0!’�@cÿ–@:i£q΃€“5l6ú‰ô¹i¬©!ñH/™ºhäj’ït/k| \‰0˜{ºÚ@¾•"Ÿ‚–">ƒ{¨ø à€V.Ì7u±QŸTÕq1Çr®£WÁL]N¸ã�§Ô.ArM3ÓsܸîÂþüÁÃ�Ày³ÕÏŸìWŸßÿÌrÆÁ�ü,éŠHè>ËôM^£etíô&4ys¯sÛ�ÝÍ+ŸÆ{ct¹±*»9ƒ2ý‰É–~+b¿U‘ª IDAT*Õ­È øÿëKÑÈë­èµOâwn•øªfVcvàõƒ“Ü–·M ð¬¯�K|à³xò\|âuždå±Ï&™x[»¬‘^hwzèæR�&™eFÛ&)±Ù‹1 Œs¨Žz£ÖY-C§ì–BsÛpMµ0¡YF“Ç×¹Ž GuE.Æàè#)OÕ\�÷jƇÍ[ ðÒ,€ôݬ$·‰~|q1Ÿºm\žQÝÜg‹³ZÍô«)½¡±‰(æQ¤æÒõi¬$*ÇÂ䘹Ҷ;¬I2’fôtJ[Å-sf»RÒÌ„æÅ':�to�ZËWx`[sÅš€ßš¾¨ã´NÞ‚¶ C‘óY«¥Y¹‚@Dtn³€.Æ·SëRÒdéáè@µÕôæoüšÀ.m®¤…‘ÇÞÂApçîÄÌÚÅ‹ÐÓán^ü5ð™g§7æAŠbŠN›œÍ‰7ûIES5_�] ml>NÀ·ÌÚõ)z ˆ‚©tw‰BXA]'n+¼0A)^chDkw"ÄK×~²eÓ¬i0/›Œ B.:¦ò:«‡+[9‡î"îåÆÂ\tM¡Ë ,61JA´å|œo«ÙIS¯:f§ZDöuj?QóÙ ÏÑëÙ/=un“.pôµ`Üx··ûÖDó å.�)ÈGS C=@'¯hÙó÷ Â)Ĉ/ù€´DMDÊë½DoÔöV“^íhù >+x&/é(m/ aYyÈ �ãôÌgSÝIOkc”"Ó’ˆÅ¥h€;õHú ¤ ³“ác…�pG_öÐò ˆ°ïÖn|ƒw¦’ͤ_«¦9-A°ÿÁ¬zÍhcgr#[†ØÊª~}p=Ã�· sh¢3*9.%‘¦ª¡.PrœZ®+>å¢+¥L1|±×­$–ND<edÁ6ÓèNî7y10£×¤IƒÜ°œW^m`6·Y¶„‰Ãúź®ùš y%£ Yx'�œÚ r¦7�ÁØQ(h!Q{’’3Ž6êME#"‰ËÆÝ’\ÍFó_r˜t‚"3ÓzšZm–ÇÌ‚x ÎP7«ÃOý«¢œW¦“ƒ‹_VgÇiN9«Û¢*Èwõ�$·ÕúÝdB*qûé–¦vÇby]2–rBµÍ‚]YfÚ 18žpÀH¦-KKíÄ×…¾V¼Î¡ºI^mð ÒtþÇUÏuî�¹WI È;yµeìï‡ Úq¬‡ ÕÔܰµL!Çáì¢ÞÌá% ïõ“=ã±:G„BA”¥’VK?Üœ¡ˆ©1ˆ2™€š,.Ó™ƒqB¦ñ´µi³Ë4�¿”³äÎè ]kãvf§6÷–Ñ�{újxG {x4ƒYnè|c ÔËù¸˜Ç¾S–Ugs8œH�ƒÕ|%�Áà?´7S4ÊÙ±àT€´. &Íh¤½ñcà6)ó8R;æÄ Š»| Ü7 öùRÁhÒ8:S‹r‘Í ø©¦>âÙ ‘®€ŃQ)FmòmÉ™o(ú»Ãˆ·<ˆ×|Oë¾-yÃøö yèrŒ\BæÁI"ªL‡jÛ^�µ58Ÿñ;gsj»Ø˜ìçSùŠÖÿÒàjXSž>2 Y èH´¦¦%B<†ˆ�zr9Øwy•)Rí‘)XÄ¢¨BiLÍý÷´®ŸË´KeŽd‘š>�µ‡­+Š·-O¾²4²ïEj5Cãá>‚Zªbi´ÒÔËn¡k „—*jãÖ‘?,JIÌ!ˆ*!­éœëCÑ1VÈ(lÕ°Êuk®ŠzŽˆ’Ìi:EÛêÕeJâÍ¦Ò �hè C ef«ê @VLš­q7Ÿš’à�…k¹ù.$§¹¹Å…¸øÎð"ó¤ò°š¦….7ôô®q{Gyìj¹Ð­“ãüLÙR�s&[u.”Ö\œ1—ë"éb_–v‘mˆ v”ZEª$Äp[I‹ÇNXô,IPÓ³Aj{"m"£å[Gê é .±8ŒDʆ�ÓkM²hÜÝmiôaÚ$CHcÒqϪÞF.;ç*²htôù É¬â*‹láꊬ]2Ÿ�·Þ/燨Þ/ŸºIï¹i½‹t´«Ú½ŸÖê1@!Æ­`ÉDaRù|±1!J7C†0Ü÷7\äfÍ’®ªh'üÔ\‘95¯9hGpÕceÌãвj¢[ÍÎ50Z…§…ŒƒïHý¹¿,¨†¦X 8_¥T¿Œ °²P _HØþ§È"Õ`⶘‰¢G …ŸqU/_Õ`‹¦-½§Ä�[d;eåÑÎúŠÀ\]ÙöÐ)k¤ÉE°ÚY5Ò�îÏìwÝèÊù/\OU/HqAo9ÓoåXÆ"¼b£Ge'ÚjÀE GŒÌ‘ÛtÅfjOR±¸ [ÜžÈM®©_Q©ÎähÌÒpóÆÄË"¦3œÚÎT«<ˆ‰Óz½Õ¿ ~ÖÎÏÐGŠ"Â�všä@“Vܔ๞§#ÉÕ==„± „%Ù!«žtçŽ4J°(a"£ç,Í>½£AhÙ«QFâp—Òùà5TI2$s¿©•»X„6k“ó(12ÆKn«&çÀSµIg­âr‰Øœê‰„�±òM¶�Ä�ët†z6¨˜EQìV#É<)Ûø”<½·mElFÖZ¾¦Àbñ±)G4#“:5!(µ¯$’Ϙ]Sà w ðƒáä42…€³“‡c¬1!¯ÛµÁ„`R`¿ Íùl>ó@íR#KqÁö¨)drݲáÚãœï,¯Xr¶’â6^$ȵ”Ú¯xË0ìÄ–ÃÈ*yVZÞ[`æ)ÒÇxÛ‘ÌV’¶æ¨.¦)v$|"Zym@p×:xÍáy¹¨–ð‰T¨�Õ“pG×c±šVÂK¶ûß.ïéñ5½ò›w4Ù¹‡yú-~f%—UcƒÁ=šhf“7¶hdkœk$1»&e YcæA@¢§ÜÌw`UjÕŸ9Ì_�I 6 ÖüN¾Oät×=‰By ‘˜R@é¨_¿+±GÏ~(�ºWycF4 Bm [¥Fß$ºÄŽS ��…iמtŽ 2œ•~µŠŠš4Ü%ú¹_\ \_¡5”ð]ñ¼@¼ä!hÓ¦?^äc†=ÄIߌÒú†gÉ}M#.� ö'?žå" \Ô¶û�>=RiŸ¡Ê�Æ] Sãhþ˜>x@³=¾fÑ]Ãs'meœöŸ’#у»©¥Í·²&æ)´fQ/F‘Z<]骩16ÊbÆúY=liÜ"pJ�ñEÎsŠÊdèÄ[ÖIO×\G•C–Ö˜ fÙBÎXI¡ž�Œ›å3Ø®ঢšxRFêŽÒ©šR\w-ùR­ÕæÓÛ�37]†EhŽa.")ͤ¥?[U as�ö8%m18(vV vwÎfïÄÿõÅPnB`LgÕ¦]jÚHÜúz‡¼ˆš†ý³%ñïfsF@ÿìZaÍlÉd—%¡þs0 «Ø#ëlIí]íµÀ*aÀ�5 …UIY·µ6:)ûmMÆ·Œì Ó“’Ç0Åš[¡¿Ô0³£‰WÐÕÝ4bŒ0Ö(©¾‡°ð[�„Þµš}‘‚QÖ5i $\%gmðÖ%Æ«R"—,`_�ãšY*BA­YTš…taÁc¢ž›L€uœåÔ“-ÑÝ1l¢Éû«N,šTó(`\k“:gzf¶véjPȸ™Óãö–Ž+å„-k"sKü2ÙM²$–Ð×±ÚÁDì÷Æ›—d]Óõºøª¶ª©)Û„›²{š}Œ)¦çµ•�Â×v‰#KmÓ“ŸVv¡Ͼül}éç}˜ã �QN¦u“,°ÔzÉ62• ¾€¢ÇJ_<©æ�0¦ûIsBÃpPɽ»^OÝëÜT¯WܰüA+/3t¼pÔ K,‰Â÷xÅï C‡lT�èZ?ù¡zˆr€Í¥ 5ˆ£�¼¡ß¯ãìƒË¨\µ�2M]Óà óA”ÕùDÇJ¨Qu�Ø’žŠÈ�pÂã[J]Ù0!yƒ„q�ù ÐY¥Â��…G™ÀýÓDjn<F;1bœY8q5×ö‚ç"ý€›õî0ÎtFí„!D)¤…Þ‰éØg%ÿ.OÔLC“ê°SUAOôµ$?Ò”B’R­›€Œ:±‹µ4,~NKÚööK”¬BÙIãJWòËl-%”‘` Ã^ðl „„ÆäàÕJ<æÏž›`ÊS¤ó,jßò ¨ÊÀK” ³´Fiö¢­æÉw pAu kuî@šV¢a ÝR©šQ�ñ€‘ÊQÜ¥RH0S2#}SJ82ù;…ì"ÎìŠä1îÜ$“càèH†ðu?‚¢,hÕ¥4$ÊQ;ëFõšP»Ýªb4Þ›Sˆô`œ±F[,j3Ì›«Ú& 5]ôx['²”7™1ã �ff}25ˆ©5¯TÅÆh]Ç¢¥Q$v’š@ÑÄ<¾’Þ ÑxŠ ÌwøéŽq…ùö8®CÏ.™¢M–nNxx–v› Fs8®8bØiÓÜ å‹xûH);I¹\�$ЙrpùÊA²iSïç êû´v!L³v·ØÆß8b¶Dšq‚µš*ìÔžo#Óhº±Àù?J6´rKm‚’Dÿt÷$µð(·~œct‰õ¤R¢ƒBý�¡cùQhñŒSÍëj÷ð!©9¢jöpY¯SñÄE–Æ„ j>–¶ü€Z� ÑX´Ô[¡:¥�njR`gùŒs�²�j7Rž&ÌÒµPÏÛ:À€]i4å-•I pkf³ÏHYõR™õÆdu^¶‘n`S-P�ä4†˜�lCÔæïZI’?ëAoJ5êÁ¡“ˆ5•šU©hÛ^JÔ“»Í¹õÖ÷"ã¢�ƒ|¥§©Î€ÄÄ”ÄîMFN¹‹ÐPJuUªhU�ZÁ,\LM?.3ãîH¶@ÃÂR¼NP9)ð7U®šs³‘�·,Æ¥¶ÔnT3‰ –žD'5é¶E¾Ü„/p�»¹eýC�ìA°¹ m u©\S®Juì‡LðJC4öß@*Ø€ˆIÚ]QØš}Èñ{"TgIJ‡±Š¨kxU›{“³ø0ÈeAZ€õµ§VùFM“öލŠ!#aõÄú¿šÒÕÕÖz�%Å“Ä%“.U rQM쉘8®F$›7Æ46|•Ó7n˜҇H4«1-Q`öf^~öPJE$q©EÖH#("«Ñ|È ¥Él‚©¸üÙÇð±?E)£Y•›né[:Žƒnï·v•_,WØÞÒ3§)™žz ‚ˆœ÷kÌ‹6G«¶âï£xk:^@u£ì•J:»å‚²”:Vœ¾�[B�Ós¼©¢Ð:ûvšÔâÈQ(§…¬‘wI¨GãÀ6™°M–p!’’-%„B€Ï%4—Ðä뉧 it·ÔW8ZÇ# ƒQJ‹%_äòvµ ‡!K¤›Èª*ÐŒ—âo y�«,fh•Õ½ … lɾ‘*NÂ=Û1ýÕÜbÂD_ò¶Xù×΂IÓþö)m\§r|š�0UržCü¤%j’ÁV¯�=R!Þy45õÖš(󄏨ðgAŠ"Ne‚;·I`YP1B\«†ÐIÔaŠM­ÑIå+¶Ÿ3Œ£,ù ©°„(¯¹'øû½k¨ Y¸B+¦Ð¯Þ0�Éâ2õvrÊxz[êŒ/a¹ ¯0´ë-:œzj¼PªILü½:Éð罂Ÿ–o�®™“Ú)<—ªzµ‡}gë5ÈšD½¤˜¶âí¬‹�EÏ&mmdÛžŽ!ÚVÀhF·N£þ,ð¾[ÔH·û˜?»9�}Í‹LÃ6ÓlB¥ëUwé[AÅ\Èt �)µäÉ�Pç¨eßǃ%¹Æ8Òcs›BÄ,/z×óʤմ4ªg�|I ðq&ð»æ9$àѨUr2`°i5Þ 8¶r½$L™’Ë-Y²yò‚º!{ÊüäQȧëk™vÝÇôS =Ä„�˜%™­¤¿ì© `5`±«¡ çj…Å|\-[¶§_f+ˆ„:w�ûQ2Þ°Æ’ë õ­•æäà¶uâT™FÂ:¨ÚíŽUkÀÝ‘ÁÒÜ¡ÌY£�טÕ\D™ýcº.4p+ö.Â÷ð„¦º‘× V[N•¢§{Q™ÎÜE}–: «¶¡-[»w\“–ç8`¾‰Õ¬¸à8Êb[WËfž—ðÊ:¡t.¶"�öÌ×E#I ÒÈYD†kfTfP‡3D<ó61 †9]YƒU„•ÜǹëÞÐ'FZûl¥ãâJñµIC<–‚£Ü§—:SÖZîQìܱø/ì‹wýÚo<öÑ_¹ÿ7í'Þñ�7¿åÚ'îúµßøàí÷:%L·®`ÖHfc‹D¦AYÒ@œÐTc,Öà;8ü¢$»väEP1 Ë b,:u¬“2 ~ñ'ïüƒÿáw÷îÞ¶!wb¦Ã–D: á0j¶<Ä!°›�ÿý×<ñå_ýõÞ~�RoÍ­ÕH™‚ ·ì5†7 \µ�ò„•Fõˆ¡É•4ó›f_3:Ë ³Ùøo~þÿzâc¿üÄÇ~ù{ùå_ø±;�ˆ¬äP®É�%ïO�) ï]÷|öýÍóœTo«5™°ƒß¾õ€^J™µVIž£MI•¯„©Ó-éÛ% %‘fû·èÌF. ÓÍ´³ÐœRÅ0n„‚µ­³Æp½Y²L˜ ­©.&Mo3)ת£î„Ô•¥î¯L¢ºÑ¿Ü55¯![±Ê¬‚Ц‡Ïá/Iÿ˜„“yz¢‡E.µ�iGíU ‡3%¯å(«’gçïkW3O5[ñNüßüán»�0¯³ÅD†Ù{E‹ÂyS’¯˜ß[~?¦jç Ùœ¨â­7>ö~ø«¿öGßÿæŸûÏßûKïûÔW^áNwjkó»OŸ{øø®f“úÁ;®ÌEÿÛ|ö÷~éc<õ‘öûÿãßû̘Føî7|볿ò¡—_xÔ/îÚ¹ø�úñ÷ßv_ãB´pd$usbg©÷{Ïþì¯|èå1\Ò.rºˆA9®æ›!åžWdYÍ;wÌç¿þøûßyŸ„eÖX±kÇâwþé¼ÿ¶û:±)§Îl~÷郇�ŸS¨¢¥KBªD+±Ÿ/§äÅä2e‡-ß„|¬ð°ÍÜÜ31Ô²ï£Àr%ÿøû;Wüô/¾æþÜ×¾}‰Ï—“fª†SˆBÕ§Jy¥Šÿ‡·÷Ž“£8Ç«gÓåÓ)ÜI(PDB$DÎ"'ÛØó,°Ÿ±IÎ0Ø~Ø“L2XH€�„„PB„rÖå|··»Sß?¦«ººgö$û½ßo>ÒÞìLwu媮î™ÅªmKxtíCŽT´¹hÚÆ�x´oEke�¶Å¿ûëug­Xܳ´ãåŸýý‰[^--êºýê÷»éµxÌ'³ÏÃ?ÿ÷›¿¹v>y]Õ®œ¹~Õ=¢g«ÐK{¥à_^øÚÏŸ¯êÑöÒOþñ«¯½Ëk’™‚ãÄ‰í¯„‡³$bØàa•ÅzÔÉ {Î?Q¾-ÁƇ˜Kâ \É*äl ’pýyþÙÈËa-ú„A; òmvØV?G‡Uðx§5¸Ò~?ìk•”‚©ñJ¿k2T'ó²1‰¤QŒáv¥GAq!”>„�ðeñV1¸4@úN0ue.Úê¬ävrÑZ±³dn '(ÂR²Hõ6~š—Ýy™A¬º:šË.2 Z [:R­ÉÖöTSkJ¬/iMN&ü ¦}¾tý ÝµåÜ·(•­¬h“øó¹£¸¤"TÆ­(†³œ ¤¬±!݈H ˆÇÙŠ aq*WUÑÎ_ÁtU6]b`€°agŸËy¹Étäšlø@2Z´«•y¢1�›ÍãK­žL ÏŒñ’:(aÁc5pÉ D Ó‡ïƒ^6ëÉGEmL¥«z‰5óÓÚœÒHëkWW,—ô.�±á®çfò“®Î˜ÉxîGW,éQÒù݇ÎniOî«-?ø`*‘Íæ’eÉx®¼$½yooG»„"I1èOGw[ [: Z;’-íÉÆÖ‚ÐÔÀ*n¡8Å�|d5�ň,2¥ü8x]ùx„ÈÂÖûš@ïÜÕ�xr窗b³c”! IDATȵ‹El-¨÷P°¿ìÖ+Š›¨ý²r®KÓ1‰Ú(éÛ0H$fºÎsFV ©�2‚bàuõ¶G3l`´éBé&’ `É¢..1�\Ç Zi„Ì$8̱ON–bÅeŒÚp\GÚB�ïG² @®n†9öæî­p•„2ý¥ÑÈt¯b‘1…>)‹z§‹“@Ëô:èÀÓ*ý |þLnZàR¨ÜvÂ0ÁSÝ«7L,$•Öü|“j!ß‘' »¹u¤>œã°Ú³åF1% Á\Ñû=)šÛÛ‚ýìÿ¤d#ÙbåâáÆ,t߃Lr±`­Ã÷¡+í>q(UÏÁüPb'TÈaZ¿,·ÚÙ„8ÔÉé"H�P âœš3êÀ�-?nÌþ¢TfËÞŠ_??mþÊa%E]�Þ2÷ä‰;àá7�®k,ž3{uIAúο�ôØÛc1ÿü㿸~öêÑkšÚ ^üà¨?¾<µ¹=Cªn»â£ãwõ*ë8ØPô÷…ãþôÊÔötbÌàÚ?÷íáýRÉìïn˜ÿ»æû¾úã«SõÜt@EW�PÓÔVð�EGýáåc[ÚSö[&(øè툓GìÿÎE+޳§¸ ³uÅÿ+LeÞ_3lݶʙw~ýž Ú:’RiÂjÜÐ\ØÜžLg¼Æ¶‚º–¢P ‚Gö¯?ôÀ-��Ë)=¨öO7¾5¼_C*‘¹wÎ;÷ÎyÇ÷ÕŸ^;ö7ÏÏ8iüŽ›.[VÛT4cÂΗ��Årœ¸é�#~ð×ÓÕc·½öéÖÊ¡}�½W)|cÙ¨{_<¡©­H&àG¨?ôÀ­�•óƒ'´T�’Ž›.YvÁ´ÏK Ó‹Ö ©o.J â±Ü—NýìÚ³V©jjO'Ölé{ûS³¾Ø×b1ÿü㾘sÞÊQk›ZS/-ûÇW�mi/=P"À ÿ÷™£Öˆ[óî�3Ï÷Õ_;ö7ÏÏP· Îßñô¬GÞ<&(Ç¥2½õÕ�7Ü·qúØ]%E�Ë6 ¾ãÉ“vÕT€‚âÂôw.\~åÉë´P¶WÍœ°ãÚ{/lëHÙVh%^^,wÞq›¿yÞÊQkšÚR/-÷à«Ç5·”uþù{¯·v¤nþË9m�‰ÂTæžoΫìÑ:çþ [ ‡T5Ü|ù‡ÓÇíìYÚQÝXüÂÂñyý¸öÎÄIã·ßtÙÒÚ¦¢éãw¾¼xl<–›}âÆwVùÿž‰�ÝúÊÚ­UCû6;f�œûÑèßýczCKA1ëÔ‹ûçûù�áŸ^;¾¹-¥suR8žC›Ä†€”¦ï›3o@¯æë˜�ÍÅàõ�Fž=âË‹G#@[{"X³ºlƆۮ\úÀKÇÏ_=l`Ÿæ»¾ñ^A"{ûßNÊå<r”$Æ ª}øæ¹ëwT^÷»óëš‹F ªÝq°<ÏÿÎ…_vÒú;žšµrs¿cFøÅ×Þ//Mßó‰Êü¯sWýô‰Sn}èŒÞeíß<÷¶+—Þôà™5ÍEsî;/à NØ|ݹ«®»wvucq6çÕµú>üöïÓïýljÃú6>~ÛkŒ€ò<øÎEËgŸøù-�¹n[åé“·ýðª%›÷öÄ`å˜ü©QÞ�Ë‹ »|TvôÞq ‚d¯Å¥œsü»jz|º½2h¿uoÏ/ß}qUÏö‡¾÷ú3 &¾²x (ÕÚ‘d?r`í?Íœ»lÔï¾5ï…÷Ç}åW—ÜÿF¬Û¸«·üò)ënyè¬9÷Ïاé�ßyë‡W-ýÙã'gr1m>œ}\0VU0â1ÿ¶+—œ9eë�;uÍ–~³Oøü¦Ë–nØ¡1™|ä�ï]òÑ^>nÁêaE©Ìо�Jý½lú†Û®XúÀ?I”×¾[�ÈÞñÌI[öV|éîKªz¶= ¿d ‚jíHú>nÙÛóKw_RÕ³õáï½ñÌ‚‰¯,�àµv$‚`ôÛf0çÙH‚ÉSø_ç¬üÙ“§ÞúЙ½ËÚ¾éõÛ®XzÓŸÏÊ¡÷� —Ï>qÓ-�õÙöªÓ&oýá•‹µPBÁU(^:}ý­W|øûž¸`õ°�}šï¼vAA2ó˧OijOÝù·S»õŸ_9õ“Gß>æÊYë&�Ø7ç¾ Z  µ3¹ô³Á½~lucñø¡î¼æÝÆÖ‚ÇÞ>F¨yiѬ¹ËFß{ÃÛ/¼?þê__vßõo�X³qW%~ù”Oo}øìë¸`@ï¦?Þøæ÷¯\ü³ÇOÉú1JeíЀ .�¾þ¶Ë—<ðϬ1°Oã/¿¾  ™½ã铳9Ö.™@[ž ’ÙŸ}yш#ê®»ÿÂ}ue•=Úb1ü|WŸ�}Z.Ú4 ˆþ5ME©d¦ ™?ä`{:qôˆý+¿èW˜ìªi.¢,Ž\•äÀç»û|º½röñŸ¸a@Î÷”‚YwlÙ_ñùž>–;´9Àú�•ÛTÀá¡Ð›§™Ill‘ësÏ�çbz¸–°—ù±ÈWì§EÜ\O¤¨¡<Æ$²?ß½‚ú5+—º ùA‹T4Fñl §°Ô†×yä@ÑÃ[àdÒÖB�¤–Ý¡’O€à7PDŒ¥dZfe¨ßèëf}ÖwIljd4Aܨ=‚N�•H7ƒ"EÛœC©œ¢À¢8ñ3鿳óYq–ÌšBkh�åh\FÐ䘈ÖWû E³_Ú‚e´‚Fuûîjçù©e!ØRDŽ•RT+Í�Lˆihú*f �° ׃-„�ãðóÚnZÚHFræß>§ÞF#*»¤”�ž¤ïÆAñ«ôX‹Þ b¡ÜA]×áF ³àb¶¹2–å{�N`Î K·L:Ô¤1ß²sqŒQty‘1€P]rQèÎë¬ç”"˜Žjû=”‚ÙÓ65w$üèÉA>ôùήD:ïʪÿyþÄíû{Ë‹ÒWŸ±îÙãžY04”<üú”›/ÿè/¯OÙ[[ZÓTôì»cìÞ[3dѧƒ' ;èy˜Éyë‹!›óšZSûêŠÉË@YQ×WÎX÷Ü‚ñϼ;ö×?üÆ”›/ûè/oLÙW[jæ8–Û¥à¼6w¤?zì´ýuÅ àóÝ:‹­ªhŸ}âæ¿¾9åÍåGÀ›ËGôïÓôÕÓ?}fþøÆÖXõE¿7—�ÈåÔÁ†â…Ÿ 9sêÖâÂtckauc14¶&³¾w°±d]±ærª¡¥ “õX OYëÙS·<ù¯£¬Žè?¿pÜĆ÷k�F,5-Wôáú�K7 POÎ;Z(‡6Ä>=ÚN;zëÿ:º­#ÜÊ伃 %*—óšZSûëK¤R5µ~´q€çaMcá;+†ï8PÑÞ•¨(Õ›+>\?è½5C`WuÙÓó'Ü|ÙÒ¾=§î®) îö)o¥±’Aœ®ªh=yâŽ'æýÖò#ÔSó'N·³¸0 æyûëJ÷Ô–Âæ=ç±¼8ýåÓ>}vÁ¸gÞ›€Jyã˜ï]ºì¡¹Çì«+ t,›óšÚRûêJ(1Á¬³o• §�àç¼ÆÖÂLð«HdAl[ýÅo.™Í©ƒ�Å ?zÆÔ-Å…éTÂ?kêOýë談Âóï�Ÿ8âÀð~õ†õŽ(¡¬¸óK§­}nÁ„gù¹ÇÜtÉÒ‡ßhÝWWöùžž÷¼8ãG_ú@)ÿkg­½÷…iëwö ºÖ4?ÿþ¸êûk‡/Z·m°�«il+Z®…RôÎÊ;TttÅ+J;‚�?\?øÝ5CawMùÓó'Þ|é‡ýzµî®.¤3veEé/Ÿ¶öÙw'<ûÞDD8P_üðÜ©7]òáCoLÝ[W& ; Y3óâ~ï¢¥ÓÆîœóÀùÛ´9£þ¾pü­—.yჱ2ï€Á}®9sõ'ÛúþsɘÀ @A]s¢êUÖ>vpõÛ+FŒ8¢¡giG"î×·8Ó¡@WÖ{åÃ1?ºbÉ€Þ-;«ËË‹:§�ÙýÒ‡Gµv&‚öK6 Z¼aüuÞ¤¨È S·ÐÍC¸_ýr �W9•vðÁ/§zÊóPùÛdNpéFå�á|†;‹$J80ñæ ™¨åy”ÖJì‚V&Òu¥SÚÐ/�‹�c_’96Q |zñ«ã‘\Ð=8L9! D¢Éß);Uv+ JïRô¬ž3�0ü´QŽ¢Õ^�–ŽƒÝ€®”çËþ Qù£Éæå)%ÿ¯� ÑT㩌}=5™Yò]ó2ã ÐßPgÛH¯� §Ô‡N²CÙC¾[N"›¯àÝ]uVòDfÞ‘ÉbVÑ ½Šhù¿9ò2­^å�7f2moH�*Ç¢L¦%ü°µ¢¼¯mPÜàFѧYƒ xÑô‹•¼O:ÜÎå0Ó…rwÇa&Ó5ÝvAQ$‘º@„ƒvô…aÞ!â 1¦pø�[÷UÔ6F,¼‘³Ø²¯çÞÚRîÙ«GÇ€ÞMß¹hÅ ¬®Ä<¿=�,+Nï­-íUÞþí Vž}ìÖ>=Ú  ‘}ëã±Ú�jöBïò޽›ÿû¢�¯¿`•X^œÞW[ÆÄø$…€ÊóüáGÔoÝWQÛPàIJ>å­É §;°~{Ÿ‚d¦oEk�Oïª.ëÊèäé./æù1òÛ+p£]ÈË•­Å]›÷ô ”/—ó6ïé5¬_£D(�íq¹ˆ‡ÐjP8cÜ®xÜÿ`í ‡`x Y$Bb-íÉâÂLgW¢©=å£ò}~Ÿì­+Íú^€É�úÒdܯ¬hÓÛ²fŒÛ�û‹>BбWY{A2·qgŸÀ2Ò]‰ÍûzM~0@fÕæ#žœ7éÞëç]½µïó&}°vp°s —åŠëg[¢,+Nï«‹ZrTÀ мav× ´"'[¯€�5e]ÙX0Hgb1=*+ÚŠ 2›÷ö8šó½Í»{ë×tI%r�ÜüÚÇl `.\;ô÷\ÔÑïUÖ1 wó·/Z>göŠ€ÝFë@½ùÑÈ£�Üÿã//zrÞѯ}8ŠeЫ¼í†ó?>ë˜/�O%²o¯8’„âµ´§Š »:»âÍF(šØ}õe9?œ¨+IÆs}z´ù4Jy“KêUÖ> wÓ_¸üúóWØìíÜ[Wj3Ñá)vec_>uí7ÏYõãÇOýlg%貃¾½tÀú–Âs�Ý\ÛTdä àÊYëÖm¯š4ìÀÔ‘{}68ÜÔžêÊćV5VõhûÇâ±ÿ={ùо 9_Õz©ÐÖ¬HÁ‡›¶¥§LÚñÄ;Ç ¬)+î\¸n0k¶¥isžôéð|¯Éë@¬Í¿ç'0–Žè0Ò.΀UPÕ饰ÈÈíVžm§èÜÍCÊ3‘%rþÒm2mãî„‚ü‚ŸçÐTè¼Wgc&FŠ×4P®,#§EB¸Ê´Ô¡î¸ø$©vUD~ÊØeJÈŸ&_¾™Gñîb pDµ˜‘L“S1\¬9„Ss™Ö�便+<¸ü�Ã꾨”gÕª‘vÑö�W„ þ'ëÿŽÈª¶uå°³áˆ|ýÿ.“Žÿ€iÑi@¾¤<ÂpBi Í–¬)–6O–¯¾-ï[«±j{`;ÉÐzNÍ•�ÅKnäÅI ÓÀÁ�©LýX ¤¹l¾_f‰¤¿»)E˜n<§q l£!ìÒÙŽoÎsÄ�ØoÞ¿A£"½ !Ý•ÈæÌ¯ 9ß»ëé™óV cÙäPU7'â¹;¾¶hpߦ9÷Ÿ»~Goß÷î¸æƒªŠÖnðÌ;ç«»ž9é�•CƒK�ËAuC±á¡ŒüŒJˆXE÷#gÀ¬ŠY½ÏAø`ËÃý°6-I‰àêñb©M6ë�S¶"g,_5Ø¢Tæ‚i›Þ[3ô@C©ÉU7n!›óo�ËyD é‘Œç4 ˆ^Ìó~U˜Ê\0mÓûk†î¯/5X(åû }ÞI„Ù¬§Á)Ìd½?¼|ÜßßwÕ)ë~sÝ‚{|÷Á³÷Ö–¢�>zw?3ó�ÕÙ&߇ê†tb‰ØÝk›´7‚ ­Ÿ_1iƒÑ‡l6¦�…HøVQ !›5oLgb?~ü´_??#hÑÖ‘ì芑ÔGïWÏœ4Õ½'VAÖ‡š†â@’ ¿ª¢Å÷Ußž­ÉfÓ€‰Xî_yPUó·þ0{ýŽJ½Ÿõݪ­AŒËúž� r¾—ÉÅ�‰€D<ËzèÅôïNb„�µU"BÎ÷î~vÖ;«†³å|UÝPtÈ2¼_ýéS`Áša×�½zñúÁ{kËäÝÖŽäߎû¯³W½¼x,ò¶€×?ý‹¿ÍúÅWþäªE›þçâê¦bPÐÑoíHŒ\ÝÙÿlGŸ†–£‡LwŃÈxd¢§¯Ö5Í[1üüc7½´xôIvnÜÕgÇ�rÑ¥;üí;b�’ O�’×évë�”O¾¹Kæ@l”^W·Eâf&Üœk:Ȉ÷­ÛxEGjÍNΊÀ ùʨ2AÌÇÚ;èÛ ™Š”yFä7“Dà,…êÞÕpò•BPÙžJed²â,qK jÆà”p¤VqN»`DÆE�MR4ð#�4¶$Œ¿rn/³EnP0ìA²ÍÐ0B¬yæGôUe.Êßïr¤Áéu¾Réa‡UçΫ�Ý­ÿ×ǸÑå?è…Ù4” D§ÎQL'� ¶6Ï —�˜«;I±Ø\.Õ£•ȪHÝ£Œ ¯-$­d)Ô™'~¾™$R™ËA¦ sYžâä„sw�î>©Íï5çÙ A0’§æ0/j9ôFtßC…9T»«Ë†ömìQš6õ‰£Eª¾Uß\¸¿¾tp¿Æ½u%»kÊvW—í®)ÛW[šÍyeÅé±Cjž[0îÓ­•¹œ—Œû*›4ÊDƒ�*÷É*¬k.Ü__:¤oÃÞúÒÝ5廫ËvW—î«+Ëøžô0Ìí©|oçÁòÁ•M=J;x‚Žx°®¸#�;¤šS“£†ÔvecêKL´ƒ¸HbÂÚŽªÏ„PÝXÜÞ™Ù¿>x£ˆ§`h¿.@Ò{²¸—ÃdDˆzŸ ÀQƒkGô¯{sÙH&Š»!*D•Šù6žØËKCû5$3)꺲^Mcqõ¨Á5#ú×½¹l”BMcqgWlh¿Æ@Åãž?´_ƒ¢ZK€Oucñ/é—÷ïÝ|ʤíPßR´¯®dH߯}u%»kÊw×”í®)Û[[J[5‚¤V%c¹`$®¨€®d,G¯ çš�ó\(Ð?Þl¸r¢ 5M%í�ñ‘ýuI\y(„‚¸·¦lÓ®ÞwõÙ´«÷îšò@@õÍ…ûêJ÷mØ[_²»ºtwmÙ®š²}µ¥?¦”ò¯9sõØÁÕsî¿àÈþµ×žµJ)J‹Óc†Ô<ÿÞ¸O·Uå|•ˆeôi&¬mÖ2ýGï|Ö·>•È"€8´o}W6VÝXŒÒØ4ašõÍ…ûëJ÷­ßW_ØÝîšò}uÃî�ƶ‚ï>xö=½±­à'W-* ”Aè˵Ã2¹ø‰ãvf}8Dظ£OKGò�W�/He¿}áŠXÜ„ŽÎxS{jʈ}{ëJj›‹6쬜:jokg²#síß«¥#�ÈdÍlü­•#�èÕzÜè½'ŒÙóÖÊá]9=IËã·"�ƒ™LKk6zA¯iC qh7³ä¢”ÓœFÊ�ÐmyX�Úʺw4&ê@ÀØ Ï¡ð(!ŒbE%æ,áv¦3‚œÌË¿fÛ…¾bLÎ…©¬ÎôEbLÁ-& Eª¹*ÆÞ·½×…Ù ìoidz‹Šƒ�1;±a˜,ÐY,É”‰¤è$�Ûµ�,> R@?#`VÞ€x`’ñO¤M‘!+ûŸLçm/Ö�‘ G/ÂWÑu¥Dh³èCç$’ÊI"#Zä¹ÞM—ÿ“ãÿ0™¦| Dµ§a±sóhNÔ´Md4éBf¾|AQ ÙŸÝ#€ï¦ $¨!`™†º,AÛ•i»µèîÇ0]€��‹)?鿳ÝÏe}p˜/iþÏeí{ÈL�ôŸ±VŠ® ¸zx |xcé‘•m¿¼æƒ)GÙ¿áÔ£wN¹Ÿ�¿0™)Hf’‰lQA–�`S{êodƦ[.]>¢ýઆ³¦nýêŸ&â¹Ît¢¶©ð´)Û†õkRÕxËe˦�Ý+‡mK'ÔŸwâæÑƒê+Ë[U6)Mí©§ßñŒM7_²|xÿúÁ•�g³í«§šŒùöæöà$¨à!"¾½üÈ^ew\óÁ1£ö�è_ò¤�SGíP5Íů~8æºsVŸ{ì–>åmgMÝzݹkÞX6r}±­Ý1\Yz F•‚òâÎDÜ/.Ȧ’Ù@ «‹æ¯þõsÖœ1y[UyÛÅÓ7\8ýsêü¸(�)“DD”ŽL)œ}¦�;ûlÜÍ[V42  µ3q ¾äÜ6�XWYÞ6¨²)ô»-`ÅZ…0yÄ�«O_[Õ³uú¸Ýמ³æƒµC÷×— òpö ›6îê³awoã«6¿·fèµg¯:iÂöªŠ¶/Ÿúé‰cö€6uì¨ýMÛ4¸ª±ª¢uê¨}E©lms!4·¥žY0ñ¢éoºø£ýëW6ž5eëÕ§}šŒÙ?¶¥“êKÎ;ñ‹Ñê+{´¬l¢MKØ–N¨/>ïÄÍ£ÖVöè¢ñ”§1¿$•M%sš$öòFvú´º±hþšל½úôÉ[úh¡lì¡é¨-ø¦ö‚gLºhúÆ›.^6¼ý > gNÙrõik±L»ëëg­¾çÅéÿZ1â·/ÌøÚ™kfŽß :»uM…§NÞ:´_ãàªÆ›.]:í¨Ý܈¥¹|ôˆWŸþIUEËŒq»¾qöê…k‡Š-û*‘ÈÅc~"æ{žO¦žY0ñâi„aeÙS¾¸ú´O’±ÝS&m[õàÃgÑn>Z;uÍE ­w<3kê¨}ל¾”0ÄÆÖÔK‹Çœ2qG"æ£å"Õîšò{^œvɉN™¸dÑ;ØP .ø5?¥XÓDÙEçtYN¾IÅ�ö(1=Èá‰Ì TÓ–$Q åV0¡KÙÙ"œv—yG)¶Áí‹ÿ?ª;–G¸�{E„wÅUßái«p`*T™Œ:�È��@)Zž1~ÏØ•Um ºé”P<§ žÃGáï"o¨µèµr<3äbÐY�)ðc˜ËaG»ßÙîgõ¯…:Kv¬ï©4²»É¸4ù’çC¥Ô�]½¥ï œý½K>~éöÆ<wmÙož�ƒ+›^øùËCû6Ožm|â/»ªË¾t×E_ìí…€/~pTSkÁõ³WÝ0{•R¸}�gç�Ï¡jëLüê¹iw~}ÑÂûÿVßRðì»ãŸø×øÁ}›™}m‰ÛŸ:éç_]üÖ¯Ÿ‹yþË‹Gÿà‘ÓºrÞ‹‹Žjl-¼~öÊf¯ÔLÈéwT7Gú¡÷º­ÙRõ­ßŸsÓ%½ð³—bž¿»¶üÞND;q¹Ò IDAT߇?¿6¥µ#ñƒ/}8¨OÓ¾ºÒ§ß™ðØ[“|ßÈy4Çî…3v¤  SÙ?ÝøÖ™Çl‹y9¥àW.¹íòw×–í×nÚÝ뾟ËÁ½7Ì/+J¯üüˆ}<|ø� ÔÜè;oÒ§�w”&[ó¼þ½[fŒßõÀËÇuvÅlA+hëLÞñ·Y?½úƒ¹w?‹ù¯,óÿžæHר¯/9j`íÂû–ú9ï•¥£ï}aZ°ã¹¯æãw=ðòñé®x€j`·¹œº÷ÅiY?ö§ß**ȼ»fè#oN™1ag-Ë]wîªáýë‹’Ù]Õe½>õ½5Â[ÿXtTSkÁœóW^þJ¥pû�ŠçŒÏSÛ:’w<=ë§_Y4÷îgb1ÿ•%c~øèi]¹ jëHÞñôÉ?ýÊ¢¹w?‹á+‹Gÿð¯§ÇbþŸn|óÌ)šóß¿rñ­—/Ù][þµß\¼K?L©wyʵÎlÎÓB¹~^YQ×ÊÍýþµbÄð#Àd"‚ÝÄ3õ⢱�­sÎ_1çü„üDUÿ^Í?»zá�|kù‘0oåðÉGîÿéÕlýmÏÝ5å¿y~Æí_[øÞ=�×·>ûîø§Þ™4¨ª"^_6jÔÀÚ…÷=¦…òâ´Œ+Hf¸áíÓ§l-Je”‚£Gìûöo?Ðã÷^¸yo¯�ml+˜sÞŠëÏû8ÀðÙsæq¥T°ŸÇÏ3¼Z·½ê�—�ÿþeK>ÛÙçóݽÅ=œ·bø×Ïø¤¬(-;v7oÕ°“& ÿÑKÖí¨Ü__º·®,›õ6ìê€_ìëÕ–N6´eý˜ìSÞ~Ë%KöiiOÇç~<òWÏOÊç陜÷ʇcùîÿà¨�%Šlœ„gäC‘íO'èøw¾¤tVaí³­ÛQP `L©Ø#ɬGGG´WRu©h[¯²1Ç%ÉNT‘AR)÷N�½E^˜4uU &0 ∀EÀ¹  ¼à0?rRTz£œx †A'Êäø Ò%û '”òéôWç–¼ŠK(ÓXh��¤Xä^WÑR„!˜_�'Qæ¹K=Zž]ñ2=ß­QY¡ÍÑkÆÞ‡uËGY¹ÓGE4%-FÙ u)T¾£7`;½ML·ŒÈ‡§ ¬ä4þ?>¨ön_‹~ÔÒ`~(ô”ØîâÀo~ˆª[V â}rRRòA_Rr£²�FŠÔOJß,èXNÌ ÂC™¿ÙÇe9nc}ú Œ&øl'Ú úéD·üdô­Êe0Ó…~N¢{X  ºýúïÎiÒÎÁ&ÿ¦ ÃÐê‘•¿¨ïÑ(\�ÿW´}ÛÆOMÅIؼóÓ„¡seß“Ss'X…ß“‚Â1�v*Ȫ‹ÆQþ_n¨B/õ[³Wžrôökî¹ xÕ1�Èñ—<½ Ä1…À›Ñãë¨r¦H"…¤}Z±°(•}üû¯~¶½òîggù?¼1_Yî¢Û7š('o�È"Ʊ€Ò…‰ë²½Œ�á n5Ð npÃì�O9zû5¿½¨µ#éØDˆzHÓä0G ­CùLB^ÀŽR+(Lež¸í•ÏvTÞõì¬CkDçè¶r?¦ñZÄ =£\áq…iZ‡;d³¼#"œ_*S"´Å>¼_ãó?xéGOž¶à“!!JÂÎ$ì/,ê¸ÎËÔŠ̉òº„À×UÎ�wPS+P@3qç[¸)ÓД´n� D9'@ïyµ�Qv” ÐD)Å� ß3±ž¡PhwiôPúe –ŽH,oìÚ�8‰ &’”ˆ¨B~È#=7ODÊé@Ô!àœ�Ù›"袡–cbšCƒñPh¶ÜØö(DD"éâ¬íJÐ(‘ÊüD-’þÈ4š™ fz$_÷5)EëWÍCç²ÐoŸ«&‡ Çùå|wù:Ø’í¾Ááî±q÷Á›6q1”îØ.¸¥K«KÌõn\©®¥µ†XhþJUpmO6#Pnж™‹c6¡|lÊeƒL:Š‹Ý¨irÍþÇ!#ï¡!heöÌ+šøp§Ý¬2²òr”î#>»A™>1t'8‘Cɸ ̃’Ê<%I=• ”Y7V¼#i�OÏVIÙPÓt.°±`vCš¾éƒ‚xÌ?r`]CkA:ç-O4¿¨žâà) B¯ÁØû7'Ó�ÍåK>x\Eÿ ÷£ö]ªI¢Ü•ÝžÕã¹j_TËBAN!äÙ±'Ô­ ¶t(Ê) n†Ub1ä€ú†Ö‚tWœÝ•­—B án0—J,c#¢á ’¶™^¤fF·"X¦5Ä”L_Úk€¬©b°à/-¬£Ù1!Ü+²kä!„ çy=BqèÓ¬ÆhlÙj�¦8cìÎú–ÂU_T ΢u>q‹Ê"ÐA­bÎ).ZàÄÙm„ =…Û ç«RwPÞ°N» à¾BTtɬ$eôŽ?njv‹˜fÄ]‹ºLø(&AlSJKõï‹XºkÈ vг+PVâmô ɔ̾ŠÁµÁ+K¦Q^�\ºÖód`އ´á…ËKh¤…ue$EF ÞGeG?Ç/êdZI7bO$nʰvú“¹~ˆ'§¤8EZª¨È"‰rè Æ e¬•ÀË’2Aã‘‘VÅ™äGÚþ¡µÁ©ìŠB�à•IפDTU˜n‘X^á$˜ŸdÑVåÍ�ÈHKKÇ�|²ðQÒæµUÎêHɈÒr§<‚‰± ˜+¿åM¦ù.Ú'ÔT£9FXIŠ­–b*ác¼Š‡ ôdâØY™$ø ²]~G›ŸîˆN¦D·‡ë~ÿÍÅ:ßÁÇmœHô¡´ Æ!W_ؼ°¥XD£;"ì»*ôy¨ž,9%-ON‰¤«ÂCÐxeJkÖ: ‚gÛÄ|7ˆUÊe·]Ñ-qÿº³Wï©-_½¥o.ç�sì–Ó&o¿óo3õxl¦ÚÈ%Af)J»méâù6� {–:Þ„²¾$ár�Iq!Üæ(—ÆÝO>Íû¤¸,ZH¿a3¢üO”s1Ó/kýB%c¹oœ½jOM�5[úe}uÎÔ/N�¼íΧOÊä˜é�LÀ( IØ�ÃmW)ȱN* =3(ßNè(_`Vh7 FVZ‹•;²'‡C«4†Ñvd(ð _)Ì;%O˜ìHÅc¹Ò‚Ì‘ê¯;sÍS &/×3X”†|£¾l)ˆD¥Þ& Bw-&ø£Ðy©û%jUº †Ñ>ÄuY–¢hô%ÊRU¹�9›7ÄÐê†Âu¸¿ aµ A*¾æedF/9óQ’Ô�HòÎvMµÜAK݃!�‚²1S“àjVic2 NXØÈÐN!‹^Á.ñHšßé%,Á*¿)6�*»º�÷î9[,h 憲µÃ4Ž~—œí¢Â%dû (äEQ˜ŸH÷Mö¬K0VôÍÏ$!­vA¾+Y×ø«Q‰³~™�ˆ4ŽNº£vXÔÅ–TÈfl«qNu°‚±í é–Xx‡”3/V/ÈÆ!ü0ŸBÀl3]ˆ‘û -ìBº¹øŸÒ³h¹cÀjׇ¾úº{Ä}ÛÆEgÔНYjgô‰’e¡þ¿>ĸõv9NkKˆVx6ÊU€TÔ΂¢S[Ë• àÉ+(•CÕÑ•øÎ…ˇ÷oˆ{¸mÅ=/œøÊ’Qµ ¹H�€Œ\{äMm“2Û¶ï)q¢“ŽÐ¦›4(ùî|¦Ô�+ ŽiG+®K ”�1ÁÎò«Ü! è\r>8óÈÚ#R bUUG:ñ�‹>~D= eÚ«‹G;Ñ[ú�î�O¢ßé+¹b@Êe»T¾¨ÕKðDO¤¤>;êGít2eU¼L®ea…69¦�M/„Ô PP„z‚ͨXëÖö¸Œ¤ÄDÉŽèÙúÊÏ_ìYÚñüûãŸ]86Œ°ìœ²=�²s*kIº�tJT'ÈqØú‹¶€rqðºÂáÅx†päW”{Ånþƒö2Û�, KE€P¢ï:kã® “…{ƒ i<¾›Q\¶×µEn!~9ÂÁ† m&f§e9nFâ¶­4�HÈšK¼uÁƃ-ˆ†µwÂ[Ñ¥¼)RÜC‹.Q2Jʼ·Žƒh 7;[nœêʉ ‡‹ ÍŸœ)Ó>ÏAy»_‰?J�ÉÀX—93EÆdxV%KÅF0°6%�ñÏ"Dnk¶ºÛ�ML çë:÷UªvƒpAñ�¨ò(˜0¡ÔËœ/éD~½d®å CAðP,7)2 …lë‘ó%éîdí?ðŸAhelÑ·Y1ë4‚§iAe“˜Mp6–íò3]Î2ƒ+yzˆ‹ÝQA!ú°Ô,:›øÏudŸŸ×W4*ů¸’ˆ…R–nó6"ÏˇšcÅÓˆïÔTF;ëa4´ †4¨ù¬j4«':zirkgf©Ä;I̹ T/rñ4¥ÍÊ6ä÷ÍŒBÐ�Õš•†E` !ò¾ ÄXËÙ›8x€‹ž.|‹MÜ‹Vâby%qѸ>ªÓHµ [²CÅ!ØâÂáê¡’ I½�|�Q4Sk¤h±Öi%·Ø›IN¾‹"°ò��ì÷xÓ$FÈ\•S®¬�Ó{îÇa;ü@•%JÓÕC4*gYhH�\ÅcÛ†�ä¬v‚ðciô2V ò’¼ðNذo2gʽ@§g9n²dlTÛŠ¦ÅZjƒP'Ò<òƒVÙR l¡° WlÂOxOJw¬¯ù8Y5uœnôaXmCC'¯’J½Ö/Äd®™íàQx˜.¨”GTYixä(Î¥Pa=tÍ[¹-ü1ÊoP²ã­#ýf„¹ E³“%C��U;I6j}åàËO§ñdå0r*Ê o¥à†j�„µµÚNü�iã TØ”ÿÙÚÎT�˜x8ܳLÌŒej�ÖÇs2zòI[8"-ÖšxH%ïŠgáQÙõÈVK‹ û˜ã‘ªªai žÚÃl\eÚ!d2˜í2BìF͵íä¿ÿoÿ>(4|ÒœûÝnÖÏw»d#'2Ù(pPä-BôXÓ9zëænpë&“�ã"Éž�’E;¸¡A@®µ • |-‘Ÿ„©R‚»*¸fG<útã^Ò ¢PGVq‹ŽôÏä¾bAI¶QÈ ™d”Í8É^ª¨<•IaG�Ê$Á÷±+�ím˜I£ðþÝf¸xˆûÜè�·#œp7]Lùˆ+?Ž®é‹bßõè¾ qfþHYŽSl P'Ðb©E-“WÉO» 0${\  ±D<þ9´P‰k$ú ÑG³ÂS�M¢U2‘Ú/�b7I¦uÃqùtþš‘Í %ò ¥Tgdœ¦ôéµ$¡ÜÎÂP^ ï1�hžPÇñ »ŸMv¤tóÉ.¹¾©ú\Ìá±òq["ÉðÌòf(DËEw°²9þ�¡!á©›£45—.cq@;'E6ÚBB(ަ†atAW”�„Œôà˜˜aH ªšÈàÈ⨥á€Öôéz¦è(ä‰n ET³T7Fö@¸N¿£`/°ˆ!öažòcèåÀÎ+ßb/¦³Ó‚Dù”ëlú(fS6_C^^ PGy×냦ѮGûv¡å–‚Úy�"[FKÚŠ¬ù\ßµCj~‡†Ä1¶ËZý4 ‰ ¦î&Z°ö ÛDµÐU Ò×Hœ¢x‰ÈŸ:93æcø¥DÈ t0á‹ÍM5U¦Fk‡ÿˆ²eŸâFD¬±ãŽéjò-$í:ÔÚ,÷ËòªñŽ&tê+(x ˜aë¯tpZ)8%%bJú§éÉðH¯x™�÷mÓ~ ãJ�UÉö«<1�Š$@›Ý’üÒIÚ¶#H²ô_μ‚e{_�¦Y™Mõ¦À0è«¢Bvpj—tXü”$й‘a)Š"„åq1™æ‚í Ê÷1“Ál¹»kUÿþ! 8öénsÈo�6@a‘»ó­ÝàÎÈ!;è~,Ï8f»d:DDÔ*ªë öÚqO¯Ða9›|#Fö•jB{U‘òÈ*°•Ð׬ôñÜ1 ‡ïmO!Eáîî–y„}ß!(³Ãy‡ÿ\¢«¿ã/4„ãÐþ&C'²;óGÒ…ö§r¦Ê¹@¥$�ßîÚ+ ’¤à$é <(“F‘B ¶N:£4ItøgòLWéJщ@²ÜT+¡ˆÚ ¨À$ê  6fLêKö�J?|ãëñ¤Öð íò¡Î©Fªn>ÃGRZÍ7ˆöMfꀚ)†ÍŒ†ø„¡£­xú¦òù·Óiû>ú �»¹‚Oë�yöÜ»‡ } ©)ZX^‹ÈŽP)ç¹�nñiºoÀñz¶‘”P/C1°G¼™Áö™îÍj+<„‘©5Š…-A#•D^!7Ïõ& \âÉ \4UF£´37¥_¶}Íß QRöS�¢é9d¤ ê‚$Ÿ<¢¸ì˜¶M "•ÑôÞV^Ï® qX[Ò@�Z`®ù.²>�;Ù¦$PQ"ª¿Š©¬a× ¶KmNFEˆ0/L%‚§vL£"ƆŒfƒyÔR)}$«�à³48]3¶Æ¾•¿²jÐs‡`x)<2�ššy?½‰4 pbma!Q;ŽJŸh–Hд1†h H!úq•.„t!æb æ «Óïhó³](_Üöé‘FÖ�ååɇ\Ñþ‘o“b~¤Y»Í‰Ã‡GCêO6Ÿðè4J(G ùbÙiS¦ ×D��ÆÚ™‹Š?"±œ†Z„}™Ò ‘^wgÇj¹Yí:£|."ýŠ-eßj¾E‡�0uá¦Óá »!ûšðD òj»W{hî"ìκK` F‚1ˈ¬4L#Š+ÊWÙwÞì[@Ú'µ^¡3º A+á6ÈÈ&¨ ®6�ž!yé‘@�ÞÙál<`]’C³}"Lšà!åñæŸ�ˆÀ=gÉ!�ºžÀzd‚Åù‡BÊþŒ‘პchˆlÔî,V �…洯 aÿCóè’•VÚc„Ž|nÏê&0Cû–2wœQü˜~ï�öYf™ðP¸ Í §‹¾¢”¡�õ*´²OѽÈw#ÃM7Ñíd#ÍÖ¨ZbrtÎFÐô ÅSb�͘½-SUn ‘eT@Þ.i1I�Å+})¡åVSÒUÐÕˆìÄSÒ[„TÈí,qµöB‚ÐC墧™Ê"ÐÂÄÅ[»6%DMHU}&šé#æ¶ãÝ£"Ïä´I[ê2 &bDÖ‘ x�Ú9êõ;/Qˆˆ¾Y’:®œ¥|µa‡Òp¡“04Íì–D1H€öiM­¬¿ïÐR?'ü‡?% žEoŒÏã¯EcT˜‹©t!t¥Ð÷ÑÏAg‡ßÑîg3Š”;€a\™G&“!ÅÅC–c(2üØÜæßKâãäÓ‚e;­³JÚjc+•’ûhÉÏd§Œ/PV¨¢¾F™< »[„ƒ„…ºãö…ß1´ 6÷€Ár!7À—lPsÉ -6ɱ9ëå>¤’‰õpH·Â'Œg~!»F�ÈÌX±�¸Û%Ø‚äôÙ ÿv¢ÆôZ¨ s¨nG ¡[njh•ÃXÉGè04ŠÛÍW›‡¤‚@ÓI §lÜtÔjB ��W˜X´™ÞƨDóhˆ{Pèp”õ£8š2œS�Ž0g}fûxÿ-ß뢅<]7\ÕŸæ¹Gñö*¡QJ|EÏ~ä ¤ËÒf˨Éuü€W2 Œ /Ò‰„n€Ÿ€X‹•r7c `Ã0ê!R)± ÓŠ™aUàå|4ÏïÐpi{ �³óúj‘8u³Ø-K_’dcW†3 Ÿâ§ü…é·¸Öm!G8G`ìˆ=´‡À’€tÂ.! L¸lËA8ж@ûe­7äX´%Â�,çd}Ž'Š(ûm$wif$Í¡œöÊÅ%ÏéÒÆ� ½½/Äq\xñRÁ#"?�V$ˆiˆ@ËVuÖx'Tè|~hÇ"50oGAÃYÚ4DNjKh¿#Åd.z;ˆíˆ4 �ö�‘žQf{\‹žîÚÍнc"##'‹’ÊÓÔE ÉW¤‚ñ‰­X#V $x^Ð ®d³˜í‚\΢SŽm<£5 òg7Z.Åu±iÇÁüÐ<ý°@Ýy¯(lCOƒƒÞŽ,—±åhÝ¢ÂFc�cw›Cv8ö†›Gêý ;”=ÉÅý`Y³ß uf¿¦Ø7�0ÌQJkˆ&õyÐUQ¸ ž—Ï+i™åä£B\ WU¹�iY%h¾ÚOtñQ² õâ �‹[x¬p;ÇÞ�1�T¨cÅŽ½ ¬D`´ÐpÐvn…`;Õ”èy°HBÂÚ9ƒ Ús±Õ®ÀIòTã”pû$Ä&Ä0S¿Ö„ öü¤ÉÖR­ù´ OZS´u±+7ÿÂZj )³ô2Â@ƒñÜ—¬Š+jn5€  ¬¡ð�ôAâÌ–"cÒÂJ"…Ts‰À88‹Cê&ÈaáŠÄ Ñ "Ô%˜u;n—·±ÉkûBï¥Â[rGùKÀ 7@Èæ(!Íä#}3‹ZBÁòQ÷D%IÙ¨ƒ¥j,’zDŽãÒg\ ÆDb¢XÕÑR¨AŽgä$Jσº&ÊÌ¢{V†%¡’ƨ·1 •DZh«h‹w�…IrHuøLzHZhýCËýçsWÓœê Ìçu+,XÂP\¼¢ŽÖªã'Ý$­…Y5‚&‰”¤Þi£™N·ŒÏΘµù (¯»ç¡x¥¸ Cv—r3†…€€ÅEÎH8¢ÈfÌ!á4"Û•h©0›ÀÎȦ=*“ÁàgYr9G…iŽâƒC‘§_è6ïOËW)>œ r7Û6L÷È8=ù�õ*žÕQØ©” ‚ªk!t‡¨Š>?änpì¨ý¯ßýBº+¾vk%Ø¢p�g§ÈØ÷Ù•ÓÃ|È=UŒ€pUá+ú¬rÊ8ô¸ŠËóÖþwª;;jÿkwý=�‰¯ÝZ%!†ÐñéH˜½¶)E+D¤2…H³>‘8—GwŒ¯ŒD) 3rÐni±î+ɸÔb/Õ0Nz©�6¹ÀLÐôDÈF…„©!Ó�l�6›×vÜØ”1M©“Gj5Þå{î¢áË$) ©xÚçaÂØHAr> @"¢Býó8¹°Ú¸£Šçhó`CýTþQqÇrʦZ�ò•§#‰ña^¸ßƒõZÂVî“d¶×ãˆC([ñ‚µp÷u·a(Ç5-¼wÓVêh;cóDéÑ�rDᦠüÒïú/v¥‘G²Á  BjDã9�B–Ý�˜í—ßµL�,ïmöÿ `„�“»[\1ÝÑà2uã?…d ʽ`³M+íQMàFÃþtû+oܳªÂ"¤‚Ó P©ˆ4:tDz³¼¸ºeØüó„µ´�ÇOAwWû&eÛ‘-3K™…ï³ÚÒ*ô ›T™•‹�RàC6‹éNÌe¨Lôïþ‘Pò•{�ñƒÐúJþÃ�†Â6ó¼¥ÔÜΫÝ^PòLÆs×Ï^½âÁ'÷¼ð‡~â[ç¯.Hf`Îù«—üá©~=Ûô€U=Z=ðô�®ˆ gú}jh¾;gœ´u&vèQ×\Èx `(‚¥IwœF²UA2óì�_ùÊiëXI�Æ r�ãGïý྿M9r?Òì4™È]wÎ'KÿøÄî¿ÿ~ùŸÿÖ+SɬΠ<˜}âæ·~óüŽç~¿ýÙ?Ìÿí3W�²ž\™*HfŸùñ«_9íSJ! >º E“iF3Pú¶ÎÄŽý=ꛃ„S"“Ž´}–+Ê+áw�ëQÁO¾¼ø¥Ÿ¿XÙ£ýùŸ¾tçײU ò•Å/ýü…Êò6}K¿¿`üÐê÷î}jÆø]7Fó¬" lѾ"éŠ$ÖàË%ÀÈjâ ýg †"PLƒþ+B‹­¼$€� IDATˆôVÙÐ'‹X‚nÞÕ犥[oŽ*oÏ�Iƒ„ Saô²'¢`¼µHjô_²^¨©lçÞe̘`§£MˆðËJ¸xkß5!"dêV¤e3±#•ß9|7�ˆ:ˆe’^GBýÂà”ŸÔ›×i —Å”î/é¸+z|ÄР˜i:7ƒ(pÙá LœÕ9˜�3! ™EÑ*›ºlpS”²¨öÚcKz¿8_¢Ä L¾ÓI…&‚µ[Iwv�ÔÚ<´H‘¾Òž•s‹Ð5Ê�øù9ŠÑ®¨h—X ½n×o®{ï•GÝñäLTjÄ ;–s.V”ÊVV´iø:߬tÀEÚQ�@ïBÛ°³Ïew^ÊÚLD™%?.$ùQ>Pò]9®U)§ß‚ÆÖÂ–Ž‚¶ŽdK[ª±5Å9"46¶t´v¦ô-Ó?ÛQõöŠ#o¾tÙºmU�m)ËäQ()Çm]Rd2À:ä ýĽ¹BÙ€èDÍYCÙ‡,Ö*½tNä[ïÑ´ØÈ±Üò r%ÍP8ó[\ù´¥Æz"Égæ�ws<‰ç. 2Ž…=˜`¸ñ(Z .é?¦ä-¤é�cúòSÚ(,s�• W9Pù§Ô�˜,\µü‰PtP¦×õ™º¸iG(+ sÏÊØ¡r(ñÆ@å€^2nALÁá¼AØ&–Y¯8šJ¼Ä«/¨Êê'é’ëâ†Ä�@ä ¬"‚\óø’ë3™>&ÞZ®†ˆ<)‚Ê60PÊaN9„"1„†Ðn5"µ?K޲C`&r(b@à ™»!u(b™Ø4ï¾½” …¨`~Ê >_6ò%çg°B`$žW…›h@:d„£­Ã2…C>Mw•#(1³}ŸÚÉ]ß`J°” ý´¡Ù˜ˆâªoÏöËOÞðø[~c "¬ÙÒ¯´8}Ù¬MÏ¿?vû�òM»zŸôÆdÐq†T5Üf|ðÕ©í�‰âTöñ¼±|CÿÁ}gŒÛ]Zœ^º~à/ž˜¹³ºÇ˜A5þ÷kH%³÷Ý0ÿ¾æû¾úëSýìtf̱£ö ;¢ñ—OÏðé— úôh½|Ö†§Þ™ðÐÜɈ°fKß⮫N^ÿüûãöÕ–Ž\[ÛRøû[ÝXŒË7`ô Ú?÷í`¬ß]?ÿw×Ï÷}õÇW§þú¹éÅ…]�ÞüƬ‰;àá7'×5Í9uIAúοÍ|bÞ¤ï_ùá�­H¾ýo'=�Ì�‚”‘_¦¬ùÑM²nø�âi Vi¥ÈZ±sizÃÔ™j%8Ò5‚-(E”³‚Ó9b‹3[–C£(ªWn�p#W…”¢ç.¸¶"TR³Ö¼ç[:Ú/íp0xZ�&:P7ý|Ÿ“j"¾ˆ¯ÝŒ˜Ñ'ž\º !t]&ÄÚuidÍôÀËbd$28™.33w<±•¬†)„OMÅÒ“8E¬¥‚½Y4ŒgIñ5‡lBùúGýr9?“�\Vô•.JcÚ×(WÌŒKgë8܃çKJüŒ|¾=öZġۈ¯*|W4‹»‡�<Ä`X¿úÒ‚ô²�x»|ã€kÏZ;¬oÇëÎ_5ô«g|Ú»´½º©¸¢¤óøÑû__:¢­#®´u&>ülàƒ¯N©n(š0¼úîo|ÐØRðÈÜ£[ÛSWþòâ‚dæÞ9ï^>sÓÒ ýÏýÑåéx:CóÜ´{^8aX¿Æ'ø†¤C´u&?ülàŸ_ ÖÜuíÂÆ–‚Gß<<…ß)òŠ�G\wöšáG4ì«-Ý~ G�âô¤#¾³bÅܲ·ç•w]Ô·gû#7Ï}zþ„—�†`,€ÖŽÄUw_R�ÌÜóÍ—ÏܸlcÿórEG:‘Îxˆð?ÏO»÷ņõkzâû¯³s“§ð›ç®úéã³nyèŒÞeí�ÜüæmW|ô½ÏÈ¡wãE_0móÍ9}ÝöªÓ'oÿÑUK6ïé &b™“ñ¾(ž&ÓÛq°¼¨°ËGµaGŸí*Lz„°ã`YqaeκEº†;«Ë7íêuò¤o­îçV}ÑïÍ�Gt-üdð™S·•¦“ ÿìc·>ùö¤«†Àóï��4âÀ°~õ«Ð6Z7Ÿ¬·=é†K7 \º~(õļI êjéú�K7 TOük’À. +_·­jæ„�¥™¦¶”2HÑd„!zI=ëy8°†Ü°2ŒQ$Ð3‚æž.e¥¹ÁÀ‚®8Z(gÑ”V¥)ËC0™p0µ9·/Ge>P-]cB�¬“—ײ“¯²³!Ú`Ya€²‹ð)‡o?ºFëÍzê/%à:¿pH ’ÆðÑWúÈ/1M@ºçЉ5®ö›:îš·Çi:u†$Ƥ­”(ÉOéœIÉx{‰ .^.‰ñ´Ó±Ïk¹l7è#1ÁÎ!@šdK)w·‡:oWèi}Æär’¾aE˜©^A7ž!k>™ Bµ"òvø²Þ2£ Á¼ØPE’c¨bÉŽECpôR.ab?¹‘‚Y­¢&°VzÌI³ž\‘+ékdjÂÀAPô•ïõ eoäG ÙälŒ™qº�š å?‰Š@µù’rû过‘v°ÿµŠ!/b : ¢�[ ænV` eSψL3´OX¡x'¡ãÛ“Häb�v+©¡'hYÂhX6®¬N! d“*§Õ.Ìf0›ß§x®ÑaI÷¾ß9òH,\¦øaå¯NÑÚ)?kÔE´7èþpçÂî2H¤£“–gßèZˆ[÷Q¸«º|ÃÎÞ³ŽÞùþÚÁ3ÆïÙ~°Ç–½�2ö*kÿö…«Î9vkŸí�JdßZ>œžÕÐ:³e_Ï=µ¥ó¡Á½ÊÛ¾}Áª³�ÝÒ§GGðí�‡í—ÚYSÖ•‰ýÓ]^Ìó=æ\^F¨¢TWŸòö]ËÐ7M$:–í¢€®¬÷àkÇücá˜ËOÞø³«ÝrÙ²[:}Í–¾ÔZ�±Œ2¶ìë¹§¶D�E™�5 §\°«¦,�‰ÍÓ]1Ïó=OUV´¥º6ïé˜ËyŸïé5´_ƒd¡bhÚ¤Òç´³Ô2x7ì™"“p²£DØU]Þ«¬½0•ijO‘[l[¦¡L,åY6ú ;’œvÁ›‡”^ðÕ„ò0Û§\»DAqÔæZ¦ôDä~ù]¦Ä ôp@£±-Ú„×Q|IgrY ÈܬÂ^Mf�ˆp$ÅŸtI¤@/çA–Åz»&m�˜èf{ËpœcÕS<ªh =®rà(q.«`àDÐÛ�÷¦­ð@¡Ÿ%‡v¹–(â­ÑQ(S–=[?¤ ÊO"¤…å¢EµÍì&“—È3jJðM`#™A1œrQ�åîô¡ ÉB)|.ôF3癈9ãß¾óNá;ŒêknÉ��y{¸AIr�7# ò(2{\ [�ðÈJy‹ ÝGÓ(´k´ÈÁ ÖI{¶Î…%ÌÄРï+:7n/謶‘îÄP2éÝ•¥~0k&–±IÑÖ!ã3 ´™§(íÕ¬#ÄËQØn,ÝvmŽßˆVNpv `÷Ò]l% ±Î‚(}‘ŠÆQ46ÌTÔ·(ÀÞåŸïÖ.§gi;Ô5¨tÆ{gÅÐkÎút`Ÿ–ÆîygÕ°ŽÎ$&âþ�×,TÕüÍûÎùlGoô½;¾þAU�6Î)‚;»âÙœ5´Ëñd,wÇ× îÛ<çþs?ÛÞÛGïÎk>¨ªhemÊfc¡ØoïæÒ!ö ˆñ8¦’ÙötBº�€ä^eÜ/ ¹¾¥€Íµ¦©øO¯ó伉÷^?ÿ_ûàê__ÔÒžT6wQ8D>Ò™„&ÙÑoƒ#Q�™¬æ†„seâm6ëIZ¥?žBn¯½ÕT–v‚RÛ)JßDÀ”&¢èìŠÅã‹ù–̉ä�æ¿^ªˆ"ˆxbU¤yrÇH¯nžT ®#2öI85ö‚\) �c gj¶ä*®#%C˜FœßW`†2¬°#º�ØJh4°rïU¡û†û:—ìùÜåöfœp{°Înã4�Y�l€§y"n™•ä§�€;g;’:±Œ”ðB%(8ò…ÚX²kÁ*ƒW^F +wæáëlÌV¼FyËäŦ^ÅáÔè(u±+‹óÍ‚¾áaU ÑâX¾91Û o´ÍÝïŽAŠl»—ȸ£`“/I^î»~Éq§, ¥Õ´¢ Ø%E@µfÿ4 3½Ø«è.¼(ä Ïy2ŠK?‰(D#À„0ÕFgÒ}Zs³ÙÜ%_a×;A°œV®Äš�˜MÕ Ä蟘Œ+Š)Úv ŠÁŠÈ”Å%ù½ ¿ÊÏÇwi³Í#[NE-Ud$I&¬ì[/‚–‡e©^¸¯¨¨P¦eúIÆ.Ú ;>! ÄŒf}e �a çA6 ¾§g¿>dºü\–d6+©¬ ®¸çŽGÅPÓC”­š^¼¼ÓMiY¦ÚyvN[ù®<ç¾,Çpä·‡åßšâzA¾à�‚m*Z:SÇ�Þ«h]è¸1û[ ¶›4@-ÛØ¿ •=åèm½Ê;¯ð ¬8=vHísïŽýtk?ç%â¹�}šÉóyãîŽÒ’ôØ!µÏ-»vkeÎW‰Xn@esdKA<²ú©x”2…@ÈeUWÖ+LfLÄ{4µ?f3âØÑû›ÛS[öõ¡  ­#±qGïÅé‚D†¯û¨’±œ”�L ,Ô,]ìM«Ì8:ª›J:Ò‰‘ýë‚[ž‡Cû5xº–ʪ¬€ösP À°«2žÐàÀ‰© ÊÜu'Å…ÉlWÆËæ<’pÈÈ5TBO®õÒ�Íy.‡8•L.¥�‡·ü ’y‹µ%Us�=¿qhܸiÏò Â3ª Ú£N y�YæÊ]ƹåœmµûÔP­Ñ©4ÛR0º �bµOq"Š–â ÍfŽ!åüE©ÔL�ŸÎ>QVšÂðÐæ #¢-ŸËC˜sQçQ_» sÕpÄÔ —KÑ]Ç^müµO’$«šKÊå†}¸×䄨6Q%Z£k=&= šF …º° ¬8�…pDQçøZþ�]}Cë^ fÁ;õB–b•Á£QÐì%ãå3'àËNaïÍߣ†TV‰†=—˜Ú™ft…§g..¶«Ö7 ÓôÎ +ùÖ6E¥b„ýàv¶ë­¢fáœn)ªF�^♤±8 Œ�Õí%G–^K\ǰ4˜¿¶r95 ¥À#uqù@ÎÐb[˜ÂÑž8WtËÑ,ˆÄ)†°•˜g3Älß6#!‰k0¢Ù8¤ UW!øžRàgýÎNìh÷³YBI…ºÃ)g¤¬"Ý×aÖ¨’Ib¢ ÜÁ"TPÍ÷x"ʾæ 3!j‘ý4¡gŸ¸ãÊÑâ°¿¾ø Ç\wÎ'-©›úMyàëg­ýËkSª‹ƒŽ{ªK7ìì}ÍYëöÔ”m;PÈ´3¯m*|éÔõÓÆí}Í@Æ­0•)HfS‰\QA¦³+n92å%éDÜ/NeS‰l°Û¡3�¨m*÷ÞSï§«ºªºÏóŒÉïw>ð̽}º««ª«¾U½œsÿÁ"FZ½ÏmžvòËž¸mÅ­;úûû:k†§W�NôlÞ1´pîNI aÃÖi?»åÐ÷Ÿ²|Çhß]�îsÔ�ëß{Ò}ÿyíѶ5å›Nxt¼Ó\¹~æÎ±Þà ¿ýÕßùè>ÛF*Åïïݰyèä—=±lÅ­;ûûûºk†§WÁ ·3ÐÛékvûÚãñ¸vÅèŒi­f“†úÛý=Ýñ‰F*… m4¼mðÆå‹ß}ÒýO­ŸyÿSó—ñÌéÇ?öÄZy¤’àyûl¹èS¿¼éÞÅç\ü—ei©p+‹ *ë pŽÖVøŒÂFµƒ"{‚Ñêhá¼í›w ŽŽ7™Svuu )`Jµ£MŒþ!áªòÁ1«<Ò$¦œáZÅȇj% z¤©³ˆ�Lämâͱ†~^�7:Ÿã¢³I^5¦ÉÛqb&|0èǵ+î-v Æ*I=bF`¢ññ‡VOù�£¡^/äŠ�9üBÕF–c…ƒ¸ëÙÇX"â;%D=GD5yFô`aµ Éq«%+Ñ-©‘ÿ“ßU»ÓÀ‘ñæãkçvÀƾžöøDO¥"ú޵Ǵ;Å{OºÿsgÞZpÃÝ‹pýÑD@„ý}í÷žtß~ó·õužÛ:tÍÏûÖ/Ž�¨NeŒŒ5ϽxéçκíWU_·=ÿìï¿jÁœ‘Ë?ûsù‘^°fãô·�wÆkgô¶ÿã£×¿æE+EÎ~˲|Óík6Í8ëüÓÖlœ„¡P\­Ûů_ñ’n¿þ¡§´î~|Á w-Y¼÷Vm!ûÍÛ>gÆØÝ�ï]–Z#ÈtˆJùFÑ u‹mB0âdD½N«¯§{Ä¢ �¯™½k¼·jHÂyíå82’@€ñ'Tn¡lØ�² cF¸�û†³1?�*mQN×"ºØÄ¤2i“eé9H¬(…ï9YTŠ!æÌÒ¡ØPçfr:œ µF‘=yò*¡t»J•Mòg’i!D ˘‰{džÏ *`³ŸäRa)™R8X{£RÅV\6 £-΀izE}³-0y2 mô‹cn×¥2{hÜv©d Ôu6$T•5šËK­ë!Æ[‚�•ƪ;˜bªêÝ:u+FªòÂJ'ìÈ' ,{­±éªh:®TE'YMÈÆˆ.iFÅöO%èç4)àµ'õkwÞš³—CîJ[ïh5)“KÃUµºL•y‹S¡’1±DbRñ¾ªO›û „¡£SAɉЊ�†)û�K¤Ž"7îÒ“^膈¡þRþ•¿ j4žáœ‚%òðqãÄ¢V×-ù2àÅyO*  ÉJ4qšœ” Oæ7ˆOÛÇZ Ö Dß:™^¬O ZSa/A3¬”T0ìyÍV&c`r+v¬)°õ›”@êc¼ßÔ‚)7H j´‚a’úëj¦f«lÌq¼Ç ´¼;¤uNf�µ¯ø 3ÿªuc`ƒuÞÓˆÕkWLAîiÛÌ-‹Ê³tJ"K<ÀSi5@Ú‰Ô�eœžì×Ü—`z1RðP;MŽ(ÓBÕA¢¦ÉÈk Y8ukÚŽKÖ;¤J Åxp„‘�¼ûÖ\3¨ð@ˆß^QzŒÍ1Ú™[.7»<ÞXØØez„¸¿(æEa>d~EÀ4´_ÅÝ4£±Š[q‰,™á%ä’À?Mä\äœdJÎw¡~•Ï/•vúŠv?v•Ev:41Ní6P71§V½©¨ySÌþ|!äÆ\þÀtý«ëT?Ìô�Î]m~º› ¨Î{lClx"°ˆ Ðަv"Ì|ÔŽñ!*Þý0ì H1)·¾èÙ‹ßµjo´i¦n¥òtdhò'„Tg·!eBñ']úî2¼Oy!EùŽ|û«^²ÏÖfAO¯Ÿyá¯�ºô¦Ã:ea…0§ØòKÓ*§߯RÑÙGf—íI}E}Ð@÷Æ*sfBÙ›™aIa~&eTÔ£mù:5W´ !Ày¡ÚÏD» ÏeOÁf¾Rx0r–„-R?Ìnx�Tœü`3³â—‡2µDÊdaŒÕ¬ÑªuJýð¥×‰µwÄ•Y)ä 2µÑÇsl€Dˆ¾=‘û7ªóNªúñ„ lî"lG™T 5À”õ{Ó`>¢úcG5%ÏúŠg¤<÷®ó˜’äÜÁ‡¥°š&½åæ u’©NÍÚ�H|?¨5¥- Ÿí›ö~I® ®o]9ÙëGp 3ýšñ©{r?âNB­‘GÖ„½ÉüXƒ°¡À 3‚DqQ?úª~Ãqó¤æŸsEû´N0c=æÊ€�,Y´‰n§X\S¶Q•TÚ6cm£‘‹�$ÿÈ(ÆÃ�l+v„µ¯òƒ=zJöæõ±vŠ WZŒSEõ†ÄŠ1�2À²�^ F5¢%A§]vÚ“î„Ö…À©½™tüŸ<Ò$ma÷kG¦¦Æ˜ªZ4Ô)�VÑ3gýÜHÍ3FMáššg}~Úo&úCˆù± ª×51$)[Ó/ûE�2cnƒÇ$’Ú~'5—)Æä_�BöbA³Ë™ ®Î 1G&Ã)fÊ|‰N?\yäCJ´Ä5¯ŽAOʃ '„Nέ£Òmˆªn £ †ÿø¨¢í9Ú³êÐ&÷o†ßbgQy,„›/0µº�Öª%u 8%Ñ€$h™¡¿Ó�h•Hª¥NI\Ó“´Ew‹\Û8ŽêÜZì>áW3$zü3,'fÜ=ì�œ:DUÈd¸t}ø™:ÙÆŽ%¾„@¹óz½Û¼¢w*‡Õ<™X D0ŽaöøµfŸøŒ  Šè“×»¼[ÃŽ£¶4Ô–AÀ�±Ÿ±ga‘»“—ËP,ƒÊÕóÉ´”¨nk‘GSHƬÜWÕˆ´¾tý(VDý‘@WÙÐz±¦“6e/#jè6ך KJÜ=9˜òˆŠö S!£œ´[ë;a»<¿O•a9A,‚`¾¤n%¤”oËá†À8Dª*xP2$¥n ØÑxØÉ"p8•oÊIQÖ|“Ba­kO ¶ó\v ÍRIGMÂpåÝF�ô`¯çœyÓ¨ ’ØÄšTMŠ�Åd:X„4T¾‚LP„G~ÜH¡?ý` BdcE æÏ§»´*”E¾EÌ¡¶ŽjJ�ˆ¬·oR|$"fÔìê«R){€Tyo‹<M@´{°5€í>(»+[#e·£a|ˆ»Ò8PgiiTwQSÓ7A lÇ®d2„I˜SßÉ€©âljü|p=˜“vŠc�!Žl*Te*E³Fe”&µ[�úæJ¯¬PŒD8;Óø!dc€3â’¢ )¯ÐËõª»fê6)èÇ y “é†ÂzƒΛ۬{²êÊÁnäU‹á?+þ3>“þU·c†LÖB2#¢eShU{¥]’¶\„üºŠKÆÄ¢QÌ5Õ^Üâ *ãÖòÚ.8‡'í +Ã÷¼ÈN8I³²¸Že·ÞÔ$vfÌð\eŸüâ3–QÕÑv£UG`ßTeÛ‚)Ée¬I”mX'+ðùŘ€“aã°OÔ))RTòƒŒZ›Ùþå1e~ÔmFW»ª'Ï?…e D¬Þ ŒE·/#µ&« P”óv{»Æ¿Èü£Ë3^îzªyì+Âc0ðL:&s^tÓ†ÚtËsª —ÍQCŠçÊöNœ­jÁ1F�¬ºcâ~cC2v®¬Ì:‡ì¹ÇtM€‡‘”™ˆÍ¥HJÃÈ“&×®NWz& NüÝ¿ü+€v]ÍçŒþ“ûFÀ‹Iõc(çwuš­¤3>ÉZœšQ�¦AU)s�дÙ"‡@‹Ä=8Y1¶D]™YÒ©Æ®PV,¢š*8FdŒV2ªï^"«ª$ær¤‰�¬î="’Þ2àfΉ,�J¥RùÑøÄêDÇÎfU¼0wbCï}ă+£!ÌÅç9d9rÙìÆx# LºÍ-R«V §1<ÒJ:Ð'^DT”=ÖåH£€ý‰zñµ wÒ„K –²t3·ÐïC±)A”(² uàˆTã-k9¾2‹ŠdY”HJZÉÌœÕ#ð� !’>ÎhMÑ*JMYÍqÁ�èF�¥’bôr<"È´™ÁëÛÐÔÃÁê­b´K7”ù+PPÇ‘\ÞÿÚ’Œ‰G&T¿�ž$H5ŒÅffd­4-”;,ŸhÅžkç\™MÙ?±�;?Ä¿œXóânÔŒ®Æi;?‹'#2»Y¾,“ë+&O¦0 #™ýþ°êèØ®fw@†U’u)åóì&aÑ%N¬;ƒŸ[a·[8ÑÝ”%´[46Z¶'J*óY.‰|: ¨ÓŠn  Sä/~Ù'ú¹F{Ý2ûÕ“þ\¹Ì8yA‡Œ fàpÕujqÅœ)2)U[ÍךQYItNö¦ôXn5ûÚÒc1ù&½"ò,F‰¦#÷К<ІÑå"e_’ôje0Uc¢’ }ÕM! ±]n«š YVt6g“Ž#ŠâA6Áø} §’U“ ̵©{™0B<ÿãôã�ÞÆÊœ¤N ‘ET–@î‰I©Ø�K+­¬¬ V“aB–%*Jœ9X9Ýã+¤Ú„år:Q €9y§ºÌ)V6¯ðfÒdÈþ5axá*jB= P+Åi©ƒ–râV§þTÒH†ˆì8y}„/5ýÊW§U©½:mãT�õ÷,XA ©/c¥Qlq�•¶p¿(ÊÞ²h)!ć~(*@¹sÊ—âUFÈ<+c =Î,4(fH›±pDõÌ0ªÎÇU?¹E¤<Á¢Ús!qçüÞ8Ëb9Øæ, +°’I +·\‘ :oRÌð+#˜±hº ΰ•Bµ©Äâ‘"£¦Òž¤gŸ�3~ Æ‰Ö žý¬_ä!pÌŽJìöáf ×%±z28í/]GÒh›@Ç[Éb$k6цV‹þëÈÚ¦_¡ORS0ÊgGSÏ\Š™ŸF« ñb·ºM RÝ.uÚPvr^a¿"ä¥ò(˜B�²ËLÙaLXžT¢¬ìNX´ ìæÙ+÷8uh `fyì¦&gˆQ6ÿsª÷,cˆƒ¤`3yå&äìe}ŠÿÊ|·ŽgºKšU’�Žw̲và ˜™ÉG”{L«£ŽI“hCSÒÊpH¯©�¸]Èßôá*¶ƒ�ùþ}D7ýÙþ£wñ›ÁÕíky®u~@vôˆG¯ºúq.¯FNMÛÍVNÒeäËÅÐA@+>a߬ñx z�Ф|PÚ0Ãmñ Rÿ ¤¢¼îˆ¬`À©vxýSʬbÇmxDÃMÔa‰Ä_§%š²TÏv’.C1/¡`lKÛ±[¹!V—¡P �"ZXcÍ\„L䰨Υ ×BCG›¥>òabTtx�㺻„_§¾ðÅ-½Ø|%.üc"J㌳4bóXVsJÚ©V»3g«séÅͨ˜ÔcÁ0l© æ× šÞw¬I÷‚ÏÈi1Cž(ih)¤âTÍd{À>îÃ)ú¨�K1#ƒ¨^ò`™±ÇEr™�ðárH¾i³k\fÅrõ4Z7—<0´¦¸T†ê,Ü"F0|˜D éÊt]"¦‰¸òl8SŸãÒuJ0é4N¤‰ L+€²�ýÅÄtz*ÇìLÀøH91–&Ó`c„|ŒUÒ«ÿë:'Wˆ‰•ç®lóL T&ç®ÝéF‘KÆÓ“s(•Ø¢«iâî`@åA$ðñë@H 2ëž…;~­¯ô®è[Y€«‰÷rTYFþ Ìë–¤ “± Ävûà“ŽWÎòB{ŠÝåXt"èˆ*z­ÓAõ�—±Ó¤/|V\"·‘œ…WŒ8 çÝ”þæSBÛ8l Å©Ì. ¡C2–Ä¡%‰|ÒÖ[²¬Ä…cWJN’û4ÊKp ÂJL‘ÊÉr¬¿’úaê÷±Š nE‰ÕªÆçc”`ÄÚ Ï•˜E4™k�ìrÔ ¦V)Æì�I6/r®¨a4'Þ;CÕOPgn„̸¤8ãLOÒ%±bäÎåÈ€¬•äi¦R°3. ¥ðŸzîÍRPf å•šT õÄʬi£Jð�}Sø©+;¬”S”| = (Ð#™À/­ ncaˆzŸ�ÀÑ"¡©’D'—Eå|ƒ±„Èê\ÉN”©Íz-Ü�ÖŠ½”[;ì2¡È-+ÆÏzå? »yvƒQ1M`bV¦ÂÆ ôr~]‹9zO@ü޼ŽÃ¹G9šŒ:½~¡F[€‰˜r Y‚’9fcÊV´$ùêÏ”�¹µa—ûÊü$-têH9®·á´‰wj·¬¥ÆLD-ìöàÄ`ÑIJ TB»c»Êv«$gáÜÄ�ÍñS«Üà§·5Þè&¨FzŠ “>êD˜<¤þ—7»Ÿc_Ç’(JÂ^f†èsf�ÕßT�™ƒKÇZ¼)Åou >n^‘hC©4…“$âÀqÏ_íyÿÝj7ïjžj%1®V^îêÖû‰Â¼A@D\^³§#³[€Lcך?#Q8eQq‚Ü�ï+!cn"wðú«¿|E«Ýó@9­�Bà~ù»~ØÅ"ymÐ^•)¨ÈîÆ€* µ_#KÏ5”Íï/Úü Q!¡{ʱÊiÝù"Z£6du©F_L)Êí@* Ï$Y»^UЉæ(×<–ð‰O$ÝÔÖr'ö´ÄÕ¿¼SaÞå¬zLGO¹¤z•“ä‘Q º_²U­}NèC0Àøº·WëzÙË[žñ½Q Æ<™ÔNÿ¤Ê壴ÍL�Ð%þì}&0FÅDÒ©î W²IO2áÁÁ¯gÊ·ƒ±˜ðö«V©:£ÌØåh‰¸†Re- ›ÚÖr÷3¥˜áÓón¸rMóU‚,CÄèèk9tDé\�ùŽå™3 ksºÐ¥¼Ú�|·Æu0â˜è\r D°qMÇμ#Æ|D·–1jJœ±Š%ÑmõÜ'1ä/Y¿õ’å+¡±¶)EÊyKæ?ûÊw$«#¨ô „T,°Û‹½PöTjìth¢í *K°>œö9çÓ–h;U,i�ÐwÓœ€TvÐvŸ@çÿþÚ� áê×ü(Uúl ‘¼òCñ2!ÈŽ“4‰p˜ð'ŸÂû=úšå‡N½ïž ~ôìߺ÷‚}ø”å}=Døà)÷ÝñíKöž3"‹Þófíºíß~üÑÓï­¨&à “NaâÄed¬gÕs37o0²›(ˆ‚4qBŠ@_Þ(ñ¾¿¯sé?]uæ‰Ù˜Š2«zñ!ë~ÿÍK^xÐz)ííé¾ï¤îøöEk~úïw]páß�vO_o'Ì* 8õe�_ÿÕËŸùÉ·V]ö­ßþËeo}ÅŠð<AoûÒÏ\uæ‰ó"Ÿ(½-#ã=+Ÿ›¹eGNU’´™i ö^9©=%%Á*®óêY+"|öÌ[vîÏ›9rùç®üâ»n©ªžü’ÇŸ½â߆þ õß7Ÿ½â_Ï8þOF—(`%¾Z&'àMèïmÿøÓ¿|û«"¬²úðŒ3"|ö¬[vÎÏ­Øxç-€ñ•4G,¾åë/=|µˆI*sæÎ•¯ÇŒ×©-¯a_ÁT¥ä®Ð•´U ªÂžÏ~�Õâ(E[tí0Æ�Ç©�çøÞ¯Eåj*, ‚”@¨Œêl�#�±³Z² Û·I” Þ¡i†¥8LzÔò�Yp ZÜL’¾4´0ŠD”�Ç^œ§ ²’!ÎHµh2Ž=D.Mñêô@§ÅRâ €$;"×*·�,ûVqñÒº€ýª.™ïUódd²iMzEó…%ÑQ–UÈ å|&éÌ›žž(Æa"‚êÌqýPÅ}^êˆfS ¥iY>VKìÉ:k¢K2‡Zn߯y¥¶‘»Ì*:3ƒ ^*TÃy·lšF~-÷n42û ¹†¨´ öÜQ4pšM$J.¬¿Uw‘þ×᤬ä×Ôœ£*í6qb h B§¡¢vÆFˉq*»÷Þú•¦kù÷HVŸ(Ô6vÕPÝÕ@h,‹»­ÝÿÑ5‰[DÃødoÕ·Ew?ÝGvB_!ÓýU¦ {nVXýáS—¿ÿ”ûþýÊÝõ§Ç8üñ¿¹k ¯óõŸû‡÷ýÀÉ÷¹xøÙÍCUD:ì€M{ ´~ÿàB&þg]±þŠgö<ýœ30œÌŽJ꘠ý“×ê`°¿3oÖ(TyY "Ç­qÚàÄ'Þt÷o—pßSó‚RÞ÷×÷}ø´åß¾òEwþiÁQK6|ì w ôv¾þ³Ññ‡­ùç÷Ý|å²ç�û£áÀ½·­ž.˜3Øß™;kL&ÖøLa¨´bÕžsîŒkù%=°_ej…öFT›2û€÷úRê °uçÀα¾]ã½;G{·íê«bÂÍðŠOœYå¡ûoúüYøÊe'<ðô^DźMÓ’>Æ- Á€¢ˆ0Ø×™;kÄËF@[wìb6¶6ÂõÐʹ¿ºë xã>=oÛHŸ@Ç9“Ù(É3ìŠ_ª·aªNJȆÎb0#µÎdR {I+�ø¯4 fàìLe« �:è´­Rb '!ƒºU˜tˆÚ%5`ö2Öª9ÌYv Ò»I¾[ÙSÕ{øË]ÆœÒYc”ùÕ<&9¦*‚fÓ$¾yš…ñ«úXt{ËÆ¸ÒRõI©/ŒR˜‚È6Lä>a͘ o‘%œc¬¢7¬*äÅJK¼6ü³çTÙˆ‰Êy,áùÇ&„ &˜æ;�ßQRK„˜ÔNPd%WÅ…àkjåÈQ›v‰Z,Rñ_´­X8÷†1®”÷¬¦«'\MŒÐrœ3g!Š [²¿¤öì±õÓ"Õ1ûZZžË;vùµ'` A±QˆÔg0Û¦Õ)>^SÐîŸIõ`5½�|åÿÍ5!ƒ.:}Ÿ¤UN«ˆÝèö ¿´³¬~�¥C5ú Îq7>À¸:áêŒäÎó~޶’ãyʯŽh\…©ë,½WËZv�y’Ujžàä׳—œ6B¬öz3¿šçAÜBÌ<žŒ€&ÌŸ=úæW>úÃ_ñÝkŽÀåOÌŸ>Ôzã_þé²ßúôú™�®Þó•Ç<ó›{•ôò£žyêÙ™O¬›€ÌÛvö[ï\zøšÙÓLJ·^vó ¾uå G[=Ó&~ø�×½âÈÕðÝk�Þ´mðC§-ŸÖ?qîE'üà†#?õÖÛ?vÆ=ÍFY–øù‹–^põÑÀ€wÀümŸ|Ë�K_]üÉÍ/øÖ/^4:Þìïüèìkî\±Ï ¶�pØÚ=†Z·?¼ðóž°jÃÌCößxÁÇ~}à‚­}½�o~xÃ7?|SYâ¿ÿâEç_v¼„Ð?ÿÙ% ¶}ñ¢¿(ˠع3GÞô—�þèׇ_pí1D°ü‰C�·½rÅe7ºnÓôÃöß´igÿ¿ýì¸ Û†è��î]�Ù!ûo¾à£7,Y°µ¯·ó�møÆ‡B__¹ì/†&þë~õ—G>ß»îèÍÛ?pê}Óú[_¼xé}äÙoYö‘ÓƒÈç\¼ô{×S Ó`_çÂO^sç#{0û ‡­™6Ôº}ÅÂs/Ò˜ÇI@§@ŠÃÜ–jˆ1\›À­Î(FÅwÃë½e°&Ï í˜Æ”T\ ´Ò ‡�»8”“,qD†�8!u«'(r¥Þ2E4¶Ëe�!5XcilÐÚßejH”O/ì[,’aåy¿mFf&ºVt™6cx…—``Q €‡\«*äFÑ“>®aÔ®=£²Q™oX¥Rn€rV¬eŸ4ažìžfRâÉh›$Ët{ lÇ�N‡ºm(KŽr¬5�ë“B­õø.8TchÉ2ŸA¼l§IØt µ +k¹ÈWS$ÉÔöæ‘o()5«Ê!µ?W›] ¯Á“Ð?T+(D�œÍž,Y°e�þÖí�ì+þxÇ#û¼çµ,^°õ¶‡÷½ñÞÞùWÍÙctxûà¬=Æ_zÈú«–´k¬FÆ{n{háüò…¶ yàÆóßs˶}ß»îè�c½oüâé½�¯ð·o~ù£·?²ÏIŸ~óh«9Ñ.ˆà+—½ìk?}ÉâùÛ/þô5vAžFÆšËZø�_³aëàK6žÿÞ[¶îìûÞµG@�ð�Sîû§¼ücß9q¯écÿõõÉ·ÞùÑo½úɵ³ßüÅ×ÏŸ3ú_Ÿ¸îâÿùÀ�c=%O”éG­zòÙO¯ŸÅýÀ¢ùÛg�ݱb_éÿîG¼ï¤åKöÞ¶nÓô•fÎjuà†_ß³¸Òc@Ÿ\;ëÍ_zýü9£ÿù‰ë.ùÍá?¿õ`ë!Â]c}oùòéý½�yÿMoZúè�î{ògÞ46Ñ3Ñ.¨„¯^ö²ùéK/ØváÙ׸‘B¤œ|ß?ýðåŸøî‰{Nûϸî“o¹ó£ß~uŠ�œq×iñÄÇ/xõCOïõêcV~æm·?¶v¶X…²tŸûX2!tÕ†éCsKÀGVí¹ò¹Yõˆ!áM'<ò�o¹ã›?{ñ�Ëï7wÇ—ß{ó@OûÜ‹_ÞéÇôÜÇÞpç¿_yÜ�Ë öuÍߺaë4xrÝì·~ùŒy³G¾ÿ‰k/¹ñˆ+o}>îkRx×9¬znúPÿDI3ã4žÙ0ýÑÕ³_qÔª_ݵ¤Û-K!öF舫•�€(éj}Ø^ì1À>‡1CàW)U¡ªc!²UÁŠ»n§IœW^Šg¢‘Œ$ós[Ë%šQÍ0"„E¸ –<õ…œlé.ôËÝ$ 1aÛqÜ •Ü(´¶II…ê–`´ß$tI)º¢Š#÷n¿ÐW²�Hü"»¸(é„S½ ƒęв·,&l;ͪeŒð 𢓠s«dt=Q~èKºÛ‹P)zu¼*4ò楗\&ÙØšß ¨~@€ß 8ivRÙͱ(WÝQŒ“¯êkšÈ„�ŠÍ�°(ó‡–êw(’L85VP%ã²/¤ÛWUt¾¨G*² ™gwB#ë�áj EF5sš’ËAônTغöcèP¤œ^W`è³W /è)ñ¾ 2ÎY°øåuAaA¿ü~I îÒÉP:nhxT¥9´Í”€²ZR~Ä߬!t›Øíá·>•Øn—�ŽÒ°†ö)ƒ”ŽùŒQÕëÊSsÜå�/Чõ  —\Ë>ÿº;ê²\¯9nå´Á‰ÞžòuÇ=uáõGÞxÏ"¸ìæuІ% ¶Ö‰‰»!„XƶlÅÂe+Ðo8J‡Jaƺ"Íœ8ó¯ºô¦Ã~üÛ#ˆà¹-Cß»ú˜O¼ñ�\3²nÓ�‚àÙM{¬žŽ€�­™UQét‹0(ÝbûHß³[¦±B/ËÙoÙŠýà‡¿>J[nu·Õi>ôÔ¼—¹zZÿÄö‘~Åa9lÀOÄI"„íÈ•¨·�BeBa¥..wÆñ�Ÿñ L Š A&�6¯>”>d]6öiÇ,Aò®ŠËÅk“‡ž« €¦¤;BÍ8†E­R‡ ”еt¹…¬”NŒÑ�Ý™‹Í5Ä»¦²Rv¯ãú…ÊLøPAnu„ìg ž¨‹±ì�Okk1‡� ¨Ás¯¸äzãâ?·÷l²q"ß”xGªiìBt(—Ó­š ¨ ç¤¾ÄÉ“is©ý“ý‘»Ó¸½õd�+׋XoîqÙ3<½ÕnVµ[íF£ ELPa¢ Hƒ½í=gŒ®Þ0]Ï*XwˆKBhwÿqÕ ¯¸å�7¿âÑÏŸuëÿ}ã�ÿðÝW-b¾t¢ ð±½>ùl%²œÄIGÕìí>³qz«S½ÂZífË¢€¹³F†úÚ�¯™S�W·[<¶fÎâÛTçѬ\Äå“P¿z³d?fÔQtæÌÝwÏúÝ:myUÚ(ÊÑVñu›ö¸çñ?úõQßøð�ïxjÞ…7yËýû·» G\�p’E!Ïùì¦ ®Þ8sÎô? ôu¶�h}»œ†TyzQòA“ò%¤âU<@PŒ·V%%ò™¦â&ð‰C^e£¦Q“Aÿ\jåE‹½º—WéZsÜO‚:ètÈ�eÅÉ0Ί‚x&ÄYúaòËæ>–[±£f²��í‹VÁ'QEM9÷‰Ô@jv2"Ò@aã´.ö)ŽZ™N{й‡.ˆÙAÍã`ñ.‡(ôï€!ËIh–¨A�fÅšZ(ÈD6†äh‡� r°QÄÜzK±�XåTCS¥bPÊ“÷Ñ)•›©¦Yc¬¿ø¨ÒîXrŽ€ìUqä�YVµ&©µÚºF‚£­’!§ÿ:;!6òÜ…ÞöÅ™m”!Uœ-{cuÞÀó[»TÍ€ËÝÙbM›Ðü:85øWö$⚟BÓùÑáàËLÖ.6ƒy†�§~Ñ{ªEIJYt{°l0eèt Ó.ÓÝÊبî•àñ³cJ›xßwíÄYÝ=dRÔ¤¤šx–f;”£N þ7—�7ºEeǃ²œDÚŒu’�( ÿ˜}ÂÐSH˜LT,wÞ$€‘±ÁaÎŒQ\3«š_U+Ó›w@«ÝøÍÝ‹ÞýÚ‡îµã¥‡®ûͽ‹FÆ›ÔÛ,¿ô®[÷Ÿ¿ã}ß<éá•{_|×ïçÏ “p–¥Õnvº˜ZOˆ¯ÞfùÅwݺÿ¼ïûÆI¯Ü³¤âKïúý¼Y’OQ‡s5B½aVR�&õ÷tF[=a°‘€pËΚ3cL–…æì1[wö k·}û—/ºð×G|ãC7�ûÎ[ß~þi;Gû´¥“ ]å�„h·ÚÍNuJ!õ¢Ü—N§aÂ.ü£t;E\ õ¤µá;Å’­ì² â¤ÉÄÏX“°[_þñÒßÜ»XètËbxë Mtÿúóã~òÛ¼íUÿóû~·ò¹ùök×mšæó ±Ê-–H!5ÁøDÑlR³!?‹-²¥âk˜qNŸ^ÆvB¿7'ê!Ø�`̫ɂ>$kꔬyМÄúHŠz*>Ñ_æÂ™EÉ~B¢£‰U½a}UŽ“Ç"'/„õƒÑÚE4ôšhà¨)=$dÕѹœ¬5¾«åÀ˜�R=Gqtª &M¹éPF‚¢ìí6Ò|º®™cX–˜1=¶ ›õv�¬ÏJ.£„6A“6‘Ê€•AêsUO�`)&_JNk0óæ‹&²�*Ž#·ÜÉ„U ö²~­œ¥j2ÛY›™Ò‚ T§(¾‹ºöÏV«Ù!¶³Ï®^þ¥‘¬9…/UÇÖ•ª´2Σª²ú²r–=q4ŠÓæ©T�õ}‹o5–¤Œ�›çô­€AÞ(¢\Lžbf¨[{¼V#åJJ ¼´ãêj†G[ˆNò:ˆ^Hª™½ç Ì0¦”lCÍÀo=ÈKü].Liø9=ÚHê´Wzâ`Af�Xñ8‘qÃ:†´I«­ÙQŽIŒ(Â*ïrd³Gß ‘Aƒ°8³u!Ö *+qe¨•X‘D$Šoßž2¬žA²§0¥ð~0ýNÀx¢_ä*›E{'†Šn/A§M­1j�S·£lÈl&hSeF󣉠â;6S ¡í%‹çu‘ŠTáêÇ‘`ßR5öå‡rÝ{NÒ=¾YûfVÁy òOJÉ™®,FžÐ…,®…í”Å’ŠƒÐ„á­Ó®½ã°w½öž#=·¯˜÷Âç=÷î×>ø�«ŽÞ6TUZ»qÚ#«ö|×ëZ»qúÓëgT­Ç'š›¶õŸøÂ•w>ºOYÂÛO|äøÃÖÝ|ßÂÀ"ÑP§¿·ÓÛì öwÆZM.‡ŠÛéC­žf9­¯Ó×Ómµ0ÞjnÞÞâ WÞñè>Dð¶W=rüaÏV)6¶_Š‘Vïs›‡Nù‹'—=¼pëÎþþ¾Îêáé•nF'z6ïZ8wá‹iÃÖiÿ}ó¡8uùŽ±Þ»Ùç¨×ÿíI÷ÿÚ£7lj4èM'<2Þi®\?sçXï዆Ï|õŠ;Ùg[8È »Æ{ŸÛ<픿xrÙ# ·îèïïë®®“Po»¿§ÓÛÓì댷š< D@ÂŒ¡VO³êïô÷vÇ'5®á­ƒ¿¹wñ{þú�§Öϼÿ©ùK�xæôbí,]çyûn¹øÓWÝtï¢Ï_ôò²´÷3¸¢Œ'ëÛh¿†jÛGû/¹ñˆÏŸuëö‘þ_,;¸Ý.ÙóÜ™#—ßü‚‰NqìÁëîµcù“óÇZÍcŸ¿~°¯½‰_(N»Æ{žÛx¥9¸ �YÃ|®ÐÓGyÑ–=Øí‘÷vKê´¡ì(íëÓ+N@yöY&'9!•‘ª .xÍ Rš&Q€º+…Ïæ-"jϲ63ìg.¸Ü@'ÕLC»ÏJ*¬CR9šM›ÿ‹Å ¶Àã?úÞêáéoùÒi�­�=Ø×¹àã7¼öØUÍ¢‹Ÿ~Ûíg¿åŽÕg¼ý¼Sþ´fö—/}Ù—ÞÍo:ìÂßÞö•Dü€‘±æ9?ZúùwÞvÃW/o4ÊŸßzð?~ï•íNFÇ{_3û°Eûz:cM¶ï^wL»ÛøÛ×=ð¹3o+ ¸á®Åÿõ«£ˆ€Jèïkÿí_ß¿ßüíƒ}�ç¶ ]{çóþíʶ;añid¼çœ‹Nøü;n»þ+—7ŠòÊ[ŸÿÉï¿rÁ쑟~þÊEó·U"?záwWOûy¯|íœþÞÎw>vÃkŽ]Y‰ü©·.ûä›o_³iÆ™ç�¶fãt3,jœº]üú/î–ø�ß4} u÷ã ®¿kñ’½·�ºö›·}ÎŒ±»Û»,Ub,Í-48ê[R!hºâ÷‡lÛÙÿÁSïýЩ÷"ÒÊõ3/½éð.!ô6»ï;yù�ûlìí¬žþ�«^ôÛû‰á�Œõ|á⥟;ë¶_}å'�¢¼ò¶çŸýýWM”…ê=ësÔ×Ó=bñðckæð›kL=ihÉZ²ÝeN[z͈} òW‡uÞçs6q@W%r¢3ËhB_ÓV_ýÏPYÅÂt‰{7•Yˆ)`¦ç$å‹�MÑ�×—øqÞ-�Mbh"=ç÷) r�êbq£Ož®´ô!M¥ªØf-$„>,º6ŸVX[Uˆ“1Ôgul‚büÑ~2 ÄMô@Éš= ¯9«æ–ÿ"rˆ–7*¦i¥æ+°Ö7*Jù!×L’D¡[Ò¸#•øéþ¤‡¾2Ù€) îƒq}Ý�3ɯpqÔ¹N`ƒÉùºsœÊ#d‡Ì!§Œ¤�³X“¯ÓÙÏ•ÕÕùHÐ,˜<ÒÓ‹ë§n$�ÈË}(i޼“ßdâíâqLc¡FKs (æs¨ÌJ½‹!®\G9BÃXD¦_Ù‹oAêÁN–…Üë¶ËNK½NĘȤ¾«CñQ…M�-[(¹$K(žeÈd¥™ Õ_H™±)ýÅ"C�ˆ�Nö.j�µÔ�CöÓ¤UG=æK“X:sÖ–’×Ôó#ïúF#>Ž„gûíGq]��Ê4»§ýÅï?yùÛÎ;õq»š2•û<õ%ïÓQÚ.û˜ß�˜Œ±<µTzݱOù½·¼ã+§®xfÏÊîâú !¾û5þŸ×ßûöóN}líÝQÍℎ¦.²Æ“Wê©[€9þ‰=sñºbãïN»ç•Ǭzç?Ÿºk´·²š�žq÷é'<öæ/ž¾aÛ4TçÃZ¥V·~f\çwNÀl‰#v¤8/°Ölø‹àà}·\ò™«ÎýÑ ¿ºë \GPÖ �¯¼‹¿okÆÔ@�›^$¢TXU$âxU' '»$ÐP8úlúò"zŠ–C”GÌù[†Äî]µ ¨"‡¨¿bR/[žç€?¦v­"({[J4cÿÉ™O¯ÀÝ€ä,R t#T´­¨À�%`’ô ¬5ÜŸ}A¨×’èì#À+ª‚l�zVf¬Tcr„”uƒ¸œFT?ýåB¦YùžL ÜºÌ �)ã1†¸OÁ^™vamHŽó¸aa'o5Ö$Ãä5m:‰úT@‘‘›ã{Îèr'yã€I"ê•)50+UZ‘ VIo I=Ø 7ºÉ¤¹ Ä Ü¾¡/2O‚¤!‡ÿ­4 ^Tà‡—'þ¨îE…GšT`Ù”i :�²Û Ëß–æî‚îJä€Ý#Ä%-?¤ßåÊÌV¤HÕÙQŠó7Ã+GsýÃTgVl”¹ÉBu ÿî.ùî¦bÀÀ›ˆQ‘ìò`�x냇ïí{ç_=Ôh�©ë îò5Œõæ/u^+ìÈØ;”XÙî\²PíÝ Ÿ"�ä–­ØgõðŒÓ—>V-«xˆ_sÇ’-;ûÞùšE—1<ÚarþTî¢*´n 2#N!ˆâ]©�aû'‰R�FyÐÂ-[wõ�·U…žf÷ðůûã�ÃÛ§E"‘SRsRp$¯RÅ %%º}:"R‡Ù 3e§„2 ‹øú[·i�e/¬±�Ì/�OSñŽ® &BÊP% •1†ëÔa7 ÃØ*‡FdåÏeaשªnOq‹ùº�úÂ`óšENåyéÕ5ØýË ¸#dJhÍ¿*ç’ÃYÿÎ0gƒñn�-‰F)�0”‰rZRÎ˸p +â�œëD¶Ü]üV”}à¯Ø�ózYä`c  ¨ònuÐwH#Uu©Œ¬j©ðNš0mGUÕù~}tÔŠDQv{:"ˆ!àn2ª¼jDbSH"§>ª`G=7©>ÊAa[�°˜@8¼.?A/]ÅmÂ:à‰Ô ˆÂ9xƒh¿E&uPJÊ&™qv¥ò )§Ÿbú§þê�ˆ¼„Pˆ0Cmæ£X�náüCL ­ÚEJ&Pð‘o¨eèPb`:Ü‹8U)ßANüJ¥ª9ψÊFÑî/&‹N_õÖñN‡ZãåøXÙiW‹ ľ)ó•ÜÛ§¸¼ƒxÜ]$�žèR“Ì> :«Êâ§5SÝ9 @Yµ:ü¶ÍbÒE6²9ô!õ9ý«“ibF"/©Â80!Tk^ƒL0BšôEŒ0éÅ•´‡î}ÒFÜ)‹Øšè[õܬ’Ú�­™=Ñö¯?ËQ%;2ª³ìÀŸâjäM\�Û!n0EÕrWó€ê¿pM´›k†§àäûïbÁú-C¡Цp¬ÕóôúYÍ=¾vöD»©¶ =_î•Çæô$¥Àz¥žžf÷ƒ'/Ÿ?{t¤Õ3Ôß~ãÒGÏ|õŠüꨇWέê—eqõíÏ»ýá…òSðk#/²9eZaò!4Êy§ûZ”&áðˆ%>òú»Ï¿ôøÇ×Íöc;j ÂcØÑx(WkQñ)w=³×ÆÃ}à”!+ÚÎ UåDF~L²&l¨sffé‹óØ?ÏÓ 5U–hrc«ñåü€ï–6Sê䩳9Ûõæ)iºåVm±ú†ĸ˧l#~C@*Êb¾JCu¸DÃA&Ôea3²â�ÍnüQ‘¬"Ÿy5«ÓÙM8‡¢FíQü@5{‚òEvk2[‰Ue Q‰jцIÆj¸ÐøÁ¥´<[—/•"ºUÌd`€•«Õ^jpô>&úcé9¼…€ã: ÖöÅ"øõgéEÄÐ%%\ìîåÌVÛ�¥e¨«qÔ[5:™Ž£ 5ß}¢6²UÐì"Xö�þ¢Û T @YR§ íVÙíèÃɺ#q{´rÖ_” ™ å!:æÃ¯�%™ 5-÷ä“6R˜2Aÿb5-Žu9]¨{Ë´“lˆ™êJM#y,%à2ÚúìÕ¿JÊè ðŒcÿãXW Ããí­#ã‘ýÉtM>݃�§ñKŽb;ˆî\}¶Mû‚¿}Ò{ÊFfºf9¬:EÛ=Õ�ü Œ¢æªntõ£A{HÀ” Jl‹FùŽ<óÄKöÙÚ(èéõ3/¼á¨Ko:´“¼à9s¡ç32åØñšc5§þãë¦hm IDAT)�ƒ|¾]¯’$†fnMÒ:s%ÙOUªÎxPÌZÁ‰ÁÑZu�c)ÇQ”%¾¼)ÝÒeÊ1å}LÑ7­#ÄŒŸc¤ ƒÞî¨ uöü¿È¤'Õ»ýIÄc0^£QYv\÷ÏZÁdƒžÄ@† {øb®“¡@ö«iTyªš¤+ñdÂB†O*‹‰²9fEµn†B·––J^DdûôaT*ª ‘‹™Ì,m¬¦£ÑÒ<ËJ.(�óáT M¶Nd‚“èA1ÍQeŸ±Ø)ÜIîíO?�¤.y+¹20mA¶£ü‘˜Ê­ÂNæh˜= hn™ìD–8ÇT<˜™䆣¾Oç?SAtòtŠ;ü£—ðÕæ»ücæí8D,c»™X�4—­j`·ÊF£€Ýu:Tv+Ö=”¸ ™ÈIuõ c“ÜxL<±±TFn®ÏIÛ<úf ¹BB=¶)Ñ#ÜOM2u Çaª.çw»y¡5ó<uÊŒarª*ªwè;Màßû+`-bC:ª� €v�·wŽµê™¬“=ý–$Ã6f¹L"ªÜHŸºN-Ù1æô¦•©ÃAåB«"pšê'ÍI“�ú«>õQk¦áðŸMå iV’ò¦\ȃ¹“=ÅÒXkÖ± ¥ÙqIÎÖ¬¿(q1Œxä€�é#ŸêÈ� +ÞEÄÍÆÓxä5t–1oܵ{=•žXæXc£üí>žüÏ,¶6 àﲪŒš&ay2îÛE…nÙ–¨‡[‹à0JäP„ŒD t�)¨U;Í€eRËù%úû‰‚P¿éL¥Ô` �J@OÀ4P¤ÐÆ`KêÈ.qᓨJ§ÌsF+üCWš¬�Jç�¡pã©’Ù€àÉRzžs&á"˜5V�%”œÁ6¹u޼\ŸSµ ›J•¦èCó¹åÚçÏ%=™Ü”ø�¿‚¼Y&U©ö–éNgó Ž/¥Ìøùwº©´3®Ÿ]¢H·R`Ýfõé*”P �u:„$û$±¦ŸþÒ(áÎøÄš$gQlù “T�Èz%™j.žšÎdÁsÈ3U¥Ê¡Òä@ˆ`d"¡MWr!C׃è­56Q{‰g� $®yÆ4ôú{ ûØi (MTG%Nëïêëa™Iõ^•ð¶F–%ë€!–銼¶ŽáÝÔjㆅ‘•9¢x˾’S´*_u ªþÄ 4“DT•ƒmx�ŽTÕ.da%;”YÛ ””}`¢±R‚À€‹¾Ff‘%Y�Í¢Ñ(Ãä–iNj÷Ö%$qe(þõ¶–�,‘7[bUDÚʬ[w¨‹ñ†7´Iª¼nª†1&÷ 7; )Ñ•ýÂ75úªûzÓ*ÿ.Þê–°m§ëè«™µ•ì‚b¨C`ß•^Y Ó.fl @Ã…¿aÀ�Ÿ&Є�©»¿Y—8:x#´±£ª¯ð©;81Xt{+ ë´©5Nãce§zÇpX�4¯‚¸»Q•+6…tædq…ÂûéÓˆˆù(r`KO0%�Jg•–«Xš¢æ(Îy(ÄØF*ÔeMÑ{*­‚ЦZ{‰M`VGî"n+ì ;ª~ÝÈ÷rަ((÷iJ¦¨à€d‘mú`·¤ñvÇ&ul³¤¾¡­›§c£Â_»šê‚LŒÈkäV½Vü"H¨Q›šª¸9(בHJŒ8A(ýÈj ñÀÎ-ZÒîH•‘†1Õ³Ô1¯crË8AtåõyìSlcz„ü(“¯lGO‹ÿ¼K·Q+3QV{Wñ$̓óÊt|�{õ9Oµƒ3°Cæ³üu—»„µT•†ìŽR¼i›qÁØs?•å×1—�‰]¤½Ob.žTV×>\Ö±‰-´ziÂgb‡ú¹,ýA(ŠiHPLLÀ䚃ü*•£ÿ:ÍxÒŸ2@ùG‚ºD“(5RÊ,›H€ÔíR§ e§$0!šMïêJèäP˜ ó­B©‚TV ÅNÈv¯Ñ.wV•âÒÏ$›™©eø îܾãSk£w›ñ�Ÿ Œ¦sø¤SÝCTcÌEÔ(�°8•s1ͺ=”J™*²æ3U]ïUÿ©I‰±9/Þ¼¨¹²® ×ÁQƉøš"»”«eaㇰþ ñŒCHlΡ§nÀ—ic–XÅüêçÄ3YY �ÔÀ²7)7¦—Î,׌�:Ëq„Ð%:±ùÑò´ú] ÛÓ¼~o ÚVÕƒ€©WPNÉL“/1rØWŽŽQñ w :8s§j&*±Òp¥ « µù‘Ûìx¡É:˜-3¹A›CE9ÅñÔ¬JÅ3æLú)�™–e”'ó©Z›¼IÅ) ÅÕ)Y "ÈÔ1sE·Í³áRSõ5&2.Ðë†6ï’rB,›Eg¨hb·‰„%@»Ý+[ãÐm“qýAIWרñ’- f®Ú ó¶¥1I±ËÕãò8ÏÜ@ïDÅÇI²û¨é…hÅÐæ(cj¨ÿ´©©… Ó-Ê—H`rƒS êü…xñ×P2?ʶ{—›9Šžóû4ÒÊ~Ëlþ•F)J�q"UiaÖ´þFQ¨®búL$v—uP) Ù`$«PT[ §tŒ Zþ:ys]䢺ùJ(\×€!ë–,MrUa…P}Îô®K()qM„Q »%Ò1JÞœàKÞ¼]L¨F,ð�H¨d¨~)�ˆ�›yûQ>‘<ojR)+™*v[ûœV0$úŽ3æp"Ð ¶µfÑ*‹ê±N ‡äRšŒY¨wMq…£@:«”i7B- Ö©"z}¶:)ÅyI!£Ô@˜5m PïÏ•¸Øx�Z f@Ôâ°ל'$�V:!Ĩ&§ !«C_Åþ9Ï¡ yéFÒ-bÕ‹AE«Ëõž|3çØC+‹¸‰*õPo™¨¾¢%'Éb‰cLø=3¼F8´{FPÕ U?€–_‰µ¥³ ­yÁ(¢²ÚÏæ¤b)–{«Ü2áÀv¬N@J tFìSF,õXC®>ˆ YÍɴЙOD¬:›ÆI¿NuYW5“¥+0[‡ §m ‹0§.Dn€‚÷BT¡P¯½ô=�J&mbqÎÚMMѰ¼�˜ÿ±8TÕ©µ%©¿Ñ.Ë 7× Pîí£â#½0!‹ÓA�xæo\Æj '0¨é‰mQM"…ÒQ»T+‚£âW½ÙmÈ;ŠZÐÃh—Ê8£)ß·«“™œ¹œÎ*?‰:}­É0Å㩌+²‘hXðWm\[ãŒûà0…œ2äk}’ØïaŸ$ÙÖë)©qH²£µÄ%Aç‰"0¾»YLÖŽ…Ù°�"Yóë¯ûÖfî˜ïnEL@,{‹ö ¶±ÛƒTA§M­±²5^–ݸÓI2r¤¹"¤êÝäÚçBÇXSn(Ü-‘6üU*ÐþIÆïÃØgÂèÂY»´MmE‘õåVH•‰Øù„Ô×f%Ö€ªˆ­Z9”f´Ž.JvädªúWö$“ØEÓ½ì6$s cfÊãŒù ‚¢ä$ª…½ê"@ìi3§ p�‘YÝJÃ�Áº%ug8ziÀ:›_ ÉºÐ.4å•Å”¬£j¨E Ãê…ÆˆÊòµ�)âIÌ›ŒÏ Ò&Vl†üÛщmß 2qÍJ"Ç$פoÜQ´a)·¼øñ%_Y¦mà"�[|p²b/üB‹r �åĘݛ“¥4ÕΤA9*«(–²]ZÉâ®§Ò\îÍu3êÐÖqÊ18‰�»Ó>G0 Ÿz‘T›™Æ)”è,tÐĦ7s"5Õ«"mT±ÛŒîüÍÞc޶ô©/ƒé“ˆO:±ykº)¨(«€ 5E÷ú§hèdñÎæ"vúµæíšôÏ^2øQwáM•D îB5øñeù_b [÷°™ Ù€€ÌÊœâ4’Þ�•/æ Qÿî‡5 ‰ò}Ù_UÕ þMMô’ 5é?’FÖXÞ^| SÙÊ| `ƒ¬ HKVµ–}T *™–ëuLÊüEÌL)*ýÇÇÿ�: @(î‰Ä]rG˜ø4jœ»ei{†³hÆN]6±Ó_L �> º]hµÊ±±²Ó¦’øÀ jHR+Jº»Ú'w±ÆB&Áç_…ò«¢ÑXI‹�ìoJwzÏŒéU®™ÛZ JþŠ×xcQkªš Y·“ Èf Ùs­Ü€ûO_ ]ϵWúÇ*« ª1æâ‚‚S?9ûÁSEô|k�i²÷I›p'baÒ(,  Y�[íNUm°¿sùg¯^²÷Öeï¨V ˜+w…Ù�ÒM{è×hÿ¬«Žñü{ÛUµàÑðP6€Â( öµ/ûìUKöÞ¶lÿà_uÖ(³ô¡SLþ:踃×_}Þ­‰æOÍs™�U©¡ � œýÖÛÿï›ïºî�K&ÚÍÀºé. ¶{ÙE› wº4è@cRPh;æÊJ‹¶?b�y†&Õ•fœXt0"ö=Ô×ùÉg¯Z¼÷Öe+‚ IP UÖÈ}h yÆ•òZÊ|†¡þÎ埽æˆÅÃ7ß¿?$™Eëä[Ý•ø&æÃEƒ}�+>wÍ�{o»íá}µH¡]<É+þ ­(í0óÍ.Ì$&'ŒºÆ�(PY]­ëf¯´ uðTY0Ô×¹â3¿°f®Rµ—*³vôÏ>éÎxí=×=¸x¢ÓðÖ­-R5Ž´M/Ù«®ŒÃºM1986™cc|0s¨¯sñß^}ؾÿðøþÜgndDf$­»L„"ËMüàÜ0~ìë\üî«ï¹õާò룙’bY¢�úñ"ßó¤ PËž¢Û_”=HP‰�6µ[Tv¡´YòAðŒ5Ä*n(w‹•©/;¨¤íNá DåalÈ×qKÖ]û©KZ�žûW-˜ª¿IìjóNÛ±‰6å½ÿ—~ègŸvë?ž|"ÞþÄ~ª“nãŠ5¦Ýº®È–g¹Ï”ØÕo"&ó(Ê"Û&.¥�˜KØÀ¹T!d«$ûE¯ùÅ—þó°ÅÏ…!ÂÇßø»~òÒ9ÓG.ùÌϾöþÛ õ$®…^½(›Nšœ¡[ÊTñ+Œ²C‹Ú΀“2y×£Yžd’¨ubêRüŒ~Lú{;—}æê³N|X±IƒPœ�{-h`M/ŠÅa ·¼½�Œ÷¬znæ– ÷ìÄÀ�âÍÔÝY¶“£4öU]~Aš‡‰ D&�QÏÁ:ÝØ“OS*]Tëz±]mÚh5fm û{;—~æª3O|ØmškÌJŒ�%qÇ2PÂ9&TÇeó¿£bp 0µ!Å4Ð×¹üŸ®yÇ«Î4'S[>#Â9gÝ~Õ~1oæèÏιêüwßê''þÒ.äL  <ç·_õ…_Î�1ú³s®>ïÝ·Öµg[@Å èÍnQ¦K¹ºì¬‰µƒ¶ ¥/ƒŠ±N“Úf\ÖŸ´ÎÈ””#ô÷v~úé«ÞyâCZ:9dgVšP`ÙW5Ù3�²Ÿ @x3hõæDޤ»Æ{žÞ0}óÎ~Ý"I¦¥82&ù’Eiq4 ¿r‡Á³:£=8á#Ʋ[e‘v6Š]PvW8¶Î±ÐU$&±È/‘2‹#­ž•glÙÕ/ê—m;ˆZ?5— PÚ Ì³((¤j1ß>ã¡ÈÛ< F$ËW_Oç’¿½æí/Y²É,1Ç»ì"ÀgN^vůÜkÚÈeï¿ê §ÞšèS㔜Ââaežð™“–]ñ�ŸÏÝcä²÷ýò §0A>È«ÖÐÝiòÈš2ŒE¦ŽÆd«F®Ëž¢=P´Šnou¥Ó�Ö8µÆËn'À�J£h0—�6ÌGFc“|­¿¬œ €W+s8ÐÛþÉßÿô¬î·q-\#­žUó6ïˆ4k/2Hæ8Á¤®Œ„”$­ºeñ¾ïŸ>ïýŸ:èc¿çé½%@#0D zM6�1œ•Õ=¸@®Ë°:6AžòUg™wÁAÝŠ«Ÿ'2¿²J-ÙL…2ž ×iªÕUœÖßþà)·Þrÿ�¯šp€¶ïëmõííìïé�h1Œ¸—½ë÷à£ÕLV?�TC,ŠÞBnËøWå­kY…f®Ô‰ÐRu†ú:óf�Ä»Q�jW†K%¨)ŽÂ/Eª…"=Êq(Óy™äÑŠgözùgäLN؈F(Ò¬zCàõ3�§êc°Â"ð12;Ë#yxƒ”Í9I1jNÏî‚ÅòÙ@?¨¦(<º2@iœ!«ìoÏ›5 ¹ÅÛìx+GÑ*€Ê uyØD!­lҨɄã'3Xƒ}�¹³F=q�S$Á¶�ý;Çúv�õîéݶ«¯&¨Ë | '¢­;vŽõí¯öꊱÊx„DKÖO2ÌSå&ËíaZäºÖØbcµSd"–*çzè! õ·çÍálO¤b¥H �©ѳ‹²§ÓO`ŽØ› [¡ÎÃkf�úÕ×šÈ *n b¢¬`µö©4wE�H–ãÜ=bŒŽÜ$NQN”ò-ò˜�à”¸š:§l� �bžÑžG%*Þ·¦ëfÿÍ·_¯zOMF¾ë¯5*1ØDÌxˆQœL0õóKT@å†rÜkV& 7C}�¹Ó#n$£lܪ«hÛÈÀÎVßÈDïÎñÞm£½InJ±#JH s­ˆ`ÛèÀ®Vß®VßαÞm£}æq}´S)4Ë%Ÿ!µàb%&¨(– ,{‹²)cÖéRÙ�nW¼’’Ñ*fÒXm¸�¶R»Ý�jL Ôb¢ :ÈÍ]1Ʋœ¤ÁÞöÜ#å†P‡V¬�{ú×ßOÏ!>q$§ g¹Ê}Ε”%ÝnAU½§NWœJÔº«q<ŒÎ¾%ŸHB{|‘†9_M3 ÍØh*eS‡(¾S:¾¡2ØÃm3ìAÇÏÌÎN¨[:¯¦€øîÏc|ª�Ýéò«—~µ¸ßÁò?ÉOw,~sv(ùMo€‡gô~üøŽ¼§F~{éî·—îfôîú1ÿüv"ƒ!Ûê~fÑÑ)#¹!··ðýõcúT¬�7 ¼ÿðŽkÊè0µî`þÖŽwû´¼1fÅBd5E1=ºÃåÓ<»âjÌi�Ï,:œŸî¸ÿ­9OÜrôÑ›N( àVV|²±„ER¯ }õÌÆÊ³C2SÜSŠZM†À‘Úô¾šÒd³@¬qà‰[ŽÝ8ù¢QÜ*ÓîÑgذF¾çÚS·Ï¬MKð¶öš¿Ù1ò«í£B õá#Û]~ͳŸ_ €¸ÍžùÓ‘ütÇýoÎÁnŸyîžÙÕYVO_@UsÙú�¯+.·Å· ñDt³:Mø«e+Ï ÉL&0üzJS·)ÌÜñ—˜[Íòë‡ý…ïý<ÖP}ø×m.¿æÙϧ J€<³èp~†cÉ›³ÃaETW]�ÑûÉcÛsY~=Øýöƒ»½·~ÌkßNIJ­îeQø¥äùÕÿÁ#;®)o¤ÃÔ�òÿóÃx—_8±�0Q|¡×„W-ß|².1'Ù=¾°þõðÐ7¾/wút8;ÙýÌ¢c|_ßî-|}™@1<£÷ÓÇw䥸4êð;K÷¼³tàw×—½ºf ^£bžÿóÑÛ¦ŸÓkC;«2_X9©­×Ä>rxuž>u L¹üZ2yÝ`ȉŤ:¼Z·_ Q.¿ÆáÕ œ¥ÆGïœ=®)¦~<0ìßkË]~ dY]Ë«Õoî·9 kö¼·¾Ô? •‚¾cæùÅsNe[Ý}UÕeëß¾œt±=)(fÞĺ‡æžžÞëòk¾ß_ðÎÏe¿š\ —…zMhõ3[~;;$+Å5µ¨ÍdªMûÛW“XÁ¦(<BÝCskX€k÷{}™o@õé_wºüše+®"׫Ÿ[t$?Ýqß[³ƒaJ€òDžÑûù£ÛY5ï�]ï=°‹aÐ;¿Œyå»É€q¶ÕµüÖÊŠ¢–xó€Í¥_³oÄ»¿Œé ¨Ø)h¼©ÿ£¥Ûg�m‡?ÊãÇ Ž€£pÔ¨L¡ÀŸ=pÀÕ§~jå!TÏ/¨žæºçë—Í«yâ†3¬š?ÿ]ù‡ÛŠØ(V¯óèî#­ÙVïÔá&]ðÐ…Ôç¿-oê5àXC`Ù¼“7�k0iC{Ï !eC«ß7íÜ�S/¥ÇûZìÆUû ¾Ø[bÐ'÷ísõ©—}3‘'>F=7ÿxÁ罟LÇîœzé¾iµÙ‰ž¾€ªª1ñïßO¸Ø+1ʘU ÌFÖMøë¥Û+/¥d&¹+ò;LºÀáKCþþÃøf»³j^R¿t時»»O½¶2ÿ½í%¾ ê£»w»ú4Ë×NÏñGxùõÇòS�K¾˜¢)Q†yzRˆùðî=®>õ³?Tðz‰`ùõ•ÃRœ|uÍã×{tf g*™ôéÞѼD…¿ºoke]jf¢{ÊÐ6£6x¤nÈ‹ë'5ÙÍ«xbVÕü²ËFMðÀ¥t»O\ÔªB÷L®ýó„siqÞ6§é›##¾>\¢©nÛíêW?÷ÓT~†àéÙGó“�¬¼&ÄPÒ K7¤×„¿¼gó©–Äì÷¸œN„ðÆ“yÿÙVîêÓ@V¼û©k�MÎk�7öÛ<†ï�ÿhO™?¨žbÿà¶¹‰.�2üß…{þ»pƒÑ»Ëþµ•³j%ó̵G•ŸÓ«C{.d½²qR»ËÄÎÙ§õö«a…»_ãð“k›òÈZRd™:¢8ý:O¿:HSî­£OG6‰Ó÷¿sËöY#Ã4õsMþۻƻú5€!+Þóä¬ÊIy-ñ†›G¿¶ªð£}e}A(ýçñçþ2ñdVœ§/¤ªiµ¾´ar�-0¦øú‘——TÔä[{=ýšuU#>Ú=ÁÛg¾R�Ó˜c†H"kÕ¡{¦VÝ>åTZœ§ÕaY} ø«ý¥!¥AúzéO§“³“œã‡¶"„=1üß&;ýzDQô¼²‹Ϊ,Héq÷iÖõÞÖ ž~�^þúÁuG/gd%9¦ä7›t�#—2ÿ¾vZsol$Írâ¬Dç²¹‡!I¸ IDAT* ãLý6—á»ßF¿¿mB_€Ýi ¥Ù�^ûÛø¡-m¨¾;îõ_®ÚvjhAªí“Åò’Uèí;;ß¾s àw·MxmýU€ðòyû›ý+ØÿøqúÇ;˹ €N¾çªwL9•ïiuXVï/þr_Ù@HaЄ¿^ºî襌Ì$GEA³I8|1ók§5 ÈK¦–¢¬f':—Í=X1¼‰EþÛ#£ßß:¾/ "dG" óѽ]}Úåk®á3³€(¼|ÞþüÔÞÅŸÌçyfÞ¡Šá�2€£2º¾\ºþñ•sžÏd!N)húàžÍ÷||cUcêà�:|ïU'n¯8•ïiuXVí+þrÇåUÿt²19;É9aX+þõÄð7~e¹ 3¯ôâÒkޤÚÜ}šµ¿�zwËxO¿V¯ ­|è§£Ó3­ÎŠüf“>pøbæß¿›ÖÔ#„â\M̸!%O (˜2ª¾¾-¾Ù&—mÒj‹Ñk‚ F[›mq Ö í…à…Þû¹lÊ_'ä q½±dŸJÉ<ûù”£ð ¨�Iûà—Òn§~tnÏ?ïÝïôj>ÙTŒÊò»Ÿ¼åØÛëÆì¨ÊÒkÂ9Éîn‡‘íðÖ©ç—ÿ©òÍÆn¯ÊÎHò¼¾x¿VþÇדÃ4Ep—œphÞCÍs+*ûpz¢¹ï‹§·-ÿså#ïÍ1ðÇò'²2’¼ÿ\¼O«¿¸rJC—ed¶M¥¤3’~{nªó�Å{U üü!FÁú*&"FS �–‘Ù=*“‘êž=¶~ÛñÜÆÎ˜ìwSWL(¬ø×·ÿ³v|NŠëëå›dÈR–ÜPóüSŸøxF‚¹oÅS[–ýéè£ÌÄ€žùóo×”5<óÙÕ5uÉó&^~òÖ£gQøÑ'n©8÷â×Ç/¥ŒÍï|ñ®fcà¿?Œk芙eS+™ «ûZ Kv²»©3&D+Ê Ú[pôÝŸÇî¬ÊÖkÂÙÉ®n‡„y6O>ÌÏ’Ùl…`Éõ,†ÓÌ+žÚ¼lÑÑG?˜¦©…ç—-úííuãvVå¤'y^»w¯V~iՔƮ˜¢,›JÎHòÌ.¯ßv,·±+&;ÅÝÔi Ó B•%Ž ŽåW|ߊ'·¬Ú1ò§ƒùàëS³'bùú•‡Î¤øk™Í©•c{íÞýN¯ö³MÅl`póÔ ïÿ\VñØÄ¼!Î7ïS)™ç¿¨Ñ”`³Ä@B|Éß1ãìcθçÍÙ‰ž�Ûñüm•Ï®¨Ñ”¿ŸU‡›S?:·çµ{8½šO7�®k‹½åå¹Éq}_<¹uÕŽ¢u‡a@¾>•@¿ëÇ×»gø¬å·d&¹ßzpï3‹*ÿxZ˜¦ ©ËdÐ%0�mŠoèŒÜÔ`Ò2FüKS—Ù  ÒÕ6&4tÆp©6„à…ß]_:ù±ñy©î/Þ¯R2Ï®˜fþ~Õ¡Ú´~-aÕüõ{:½ÚO6�€²aÝOÝ|ü­ŸÊ¶WeÔ¡œw—ÓÀv½hê…gÿtì??ŽÙ^•�™äù×}tªðßVN¢9VòyIFQ¼¡fùýhZ¢¹ÿ«§·=û§c½?=ÌP‹¦^xnQåÖ�ÝQ••‘äý×½ûµêðßWMn芙mS+˜ «{ÎØ†­Çsê;-ÙÉžÆÎ˜ MI¥EÔÁºöدÎKŽëûê‰-+wŽ\w(Ÿá˜‚À? :T›þþ†R›Ó0:Çöú_ö9½šO¶”¼pÊùw3ùÉÛsS]ÿ¹w¯JÉ,ÿzÒ ËE5t›GfÚÕ &#Ñs}Yë–êŒúnSN²·¡Û¢©W*{}}I®Õ»æñÝ„:±;>ñÒkÎ>ó͸G¾œœhêÿúá½Ï-¨^úù@è¹U³‹[ŸZ=±º>qþ¸ÆgæWŸiŽDáǯ;½h⥿}?þX}RyžíÕ[�ZŒÁ7~)m°™Gfôª•8#Á}]IóÖ“Y Ýæì$OC·%L+Ê󺞼®úíÍÅÛÏdÔáœDw·[/$ 1I=B-(À÷O?ýìÚ‰�­žš`ìÿòþ]ËçV=²òªC-,¿´|î‰7·”í8“‘ïûç¢CZUøÅõm–¢ô^µ‚ÉHòÌݸõtv£Íœ�äiì1‡iŠO‰".·ˆ0f0ÕÐc™Ö£V0 žkG6n?“ÝÐcÉJô4õXB4õƦñÿÝ:.'ÑõÕâ­ ²�Kl-¹êäó?My⻫�ýŸýeû²9Ç]3 #ôÌœc³F4-ÿ±¢¦Ù:·¤îÉÙÇ϶%EáGfV/sá¥_§o´ŽÉîzqÞ!³>ðæ¶q�½–CzÔ :=Þ3»¨q[mvSoLv¢§©×Æ ÂVNÌ Dnî‰ï§ß¿jvZ¬çƒÛw.¿îØß~šfþ€êÈå!ï)éñêG¦õ¼<ÿ€«OûùþÑuݱþt®5¦ïÓ;¶~óÛÈõÕÃ0€? öBÌY¿öØðëß»%+ÞýÆÍ{Ÿ¼¦rÙ�Ó „š{Mzu"ƒá\GB“]´ÜBŽ&©Ò$§Ð€åG³ÝlÐ$Ñ4 �³û7•\øxߘoMÌIt½6¯JÁ¼°¡"D+üÕ‘ú´Oö•ØØqÍÝïêÓ®8T ¥™Ý�N;öþž±».déUáìx—Íkd¸¹äÜS³*ßÝ=n÷¹¡é1þ—oÜ©SÀ«¿ÎcD‡!Ƙ"²C˜Bø¯×]8þô ?Î8Þ0dlNûK·ì²ÿÞ0ÆwL9ùØÊëîûüÆô8÷G÷nxîÆƒÏ};3Ì(�¯]6÷À[›'ï8“—ïþçŸvèT¡ÖMgaÞ?½òùµ³_5'ÁØ·âþõËçúë×sBtdN°-àP¾˜ùÑöqÝnÃèÌ®×ítú´Ÿí Çô|¾dýÙÖä{>¹Éî3æ§Úšzb1@]Wü­ïÜj�ñ¯Xòóª%?UŽ„¼ýì’zýשÿÞ8%7ɹò¡Ÿˆ~€¢ð_çüvëøÓ/ü0ãXÃ�òœö—î²oü2³ÈÏ8öÜ÷3_9'ÁÔ÷Å럙wè¯_Í 1 9ÊÄú’@}øbÖ‡ÛÇu»�£3»þ¹h§Ë§ýt÷XA>¤+ÍÀ`ªÁ72£K¥ 3]sŠ/m=9¬Ñ›�äj²Å†E_@}èBæ‡ÛË»]ÆÑY<À]c/t$ži¶ÎsáÈ¥ šFÁÕ#šêºâ.v$ÈE’ða �säÖñgþñÃŒãõCÆæ¶¿|ë.‹1ðÆ¯“ÙYþSN>úõu÷~zczœû“%ž¿éà³kf„Å­ãj—Ï?ðæ¦É;NçeÄ»ÿyÛ­*ô�¦UÎ<öÜw³ÿzN‚©ï‹×/¿ñà#_^¢WØõ@a~*­Ó†¦õžk±C*‘4àøÅÌÕ;ÇbŒ¾Û=æHm6›”ˆ1j‚£çS?ÚPÒf7î;�öÙ¦ÑÓJšSúÀæÖ¯Þ]XÛ”ÐãÖïªÉÜ:£8צ 0°ÿvôšZºÍ[ã¶Ïv÷©À¢Ü9ëìê�…«vu9 Ç.¤|ükÉ´’f+·.P�!ól©º”¼ñhMS]Nޚ̼T—QŒÑïœuvõΫwu: •“?ùµdzIsR¬¿¾-&ÉÒoÔ…n™zþ™[�ÞrÕy£6”ë¿ÜG¬ùˆQ;Û[ˆVt9 ÝÍPNŸ¦Ýnì´¼ý\ÚÒæÒ³§ðLSb�G¿ûdæþSŹÝ¿ sôÜ��7–´÷˜œÎø|Sñ´’æ”x?H;öƒ v)µ¾=6ÑÒgÔn®8¿ìÖ£7O=oÔSb}uíqlR›¦)§W S‘Ñdõ¥äMG‡Ò4êvöVgæ¦:�º 5Æ7­¸ùËm£7Wí°›¾Ú>²ò7á³ÆöÍ�xéóÍ%›*ólN㦣y+¶”ÌŸx)9ÖWß“hé3êƒ *Î/[È¢J‰óÕµÇa,°ÒÜj3_l�Ûv<ÇϮÀ9„y—R})ySåPšVt;õ{k8 ÍúÀí³Î¬ÙU´z׈N‡áØ…äO6”L+iJŠñ×±hèB7 hhƒƒ•0­èrº†0�\~u‡ÝÐa7xúU,kmÚ=…µM 6·awMÖþS£s»OΣç†|´±¤½×¸ÿT:+Ø)ñ~B‰%W‚ ?t&mgu&ÆÐb3¯Ü^tÕèæ”x°¹õßì^Û”`cÕáTFq®�¢ ÄPÝNC—Cf(—_ÓAH ²®=æíŸÊZm¦ÃgÓ6É+Hwµ!®¯³iŸl*f´b먽§2øAKÉ18q"ËÁ³C>Ý<3ÔÛFí=™Î5Ç0üv>õ£ Åm½¦}§Ó>Ý4jzIKJ|fÕ|WÁ™Fn\ûN¥³ãBÍ[m¦ mq[Žg»û4˜UóU;‡³j~ôBòGЧ—¶$Çö¯Žc>é)lçÅpâRò†£¹ Cu»857éƒ}à®™µ«v®Ú5¢Óa¬d–4[cüuí1Iæ~£>°°â³ +N½`Ò…Râ¼—Ûcùía2baÀ¢y¦ÐÈé×´÷JÕÜmX½gDmS¢Í­ßu2{ß™Ìâ…¸;?äÃM¥mvóþ3Ÿn)ž^Üœ;€0ÅO—%f c¸ÜaN2÷uÁ['Õ?{SÍÂIuFM85¦ïrG ð2L9}šPX8GB˜xÉºÄ '²hu¹ô{N§å%{Lº`²¥oFQûŠÝÃ7žÈjw¾Ü[pô¢•m™Ó?¿¼á“�E«²ºÝú�'²>ÝUt㘆ä]§%É<`ÔN¸¼|^õ-.´¡”]W ƒ±‚hw[{�:b¶œÊtõ«Åä û/·¨Ào“EU�I›jrhšêvë÷Ô¦ç&»�Ú E¸sÊùÕ VÞå2k°~²sÔô­I&]—%ÉÔoÔn.¿¸ìº·”_2jÃÉ_}W,aóÙ~1ƒë»,‰¦~£.¸`ìÅesŽ/{Ѩ ¥XüuݱL3ÈÙ§eg¡œdñù˪¦äͧsiuy ûÎgä$¹ŒÚ Õ쿺 å«CE[Nçtº�+�«ç^ö²šûæ–Ô}~ xÓ©œn¯aóéÜGÏ]—löÕu³È‡”]|êÚc7�¹hГ;z[,ÆüV@R®!8t9m÷ù Œ¡Õa^}xÄÔaÍ)1}ÐãÕw¬ð\GB�W¿÷Bæ�Ë£Òla†²y 6·>ÌPî~u§ÛÐé6xÔÀ¿{ØÐóþž1mNÓ‘ú´�§†æ[FM�íîH}Ú‹1¦¾>ÞY>­¨Ájñ±­ª‡lªÉ§iªÛmÜ{6'7ÙaÔåD“–¯aÍ¡QµmI=^Ãî³¹ûÎe�ÎìDFn(»ÐT=óÝ5‡/e^èHøõÄð ñ8ÄP].c—Ë@3”«OÛá2u8ŒÞ prŒhšrúuB ÀrÐjñÏsþ³Ýå«ó»ÝÆ�ÕùŸí;¿ì\J¬—C¾!uSu‡|mN^²Ã¨ <% ?›×ðÍ¡Qµ­VùóÙ£3;)DʰèëÙe¢úθ$SŸI¼e|í3sÝ2¡Ö¨ ¥Äxêº0›×¸FXË좆?1)¿9-Ö]`Ò°æí'‡ùj)FbZX-¾ùc/|º»|cu~1äÔ/‹Ø¡‹Y»Îä` -vË×{K®*lH‰õYtwN­Y} xÕÁâN—¡²nÈ'Û˧5$[|l?U C6VçÓ Õå6î=““—ì4ê¢)PaàJÌ¢têp¼É×ÞKlŽ~«\¤x B*…âLC\PÁ‚­ëˆU+™¤X‹Íoxd~Õœò†¤Ø~Ш›+sY0Ç/X¿Ø:ê�‡wÝ]—¼bKÑÞ“™¬¥K°ô§'z½©ê¡ù'Ù>ˆñUÃ@{¯Aªäò›m¦@HÁþ )Šb( bL,Àͯ‘ ´÷š º`j¼·l˜mãѼâ\›5Îc ´ØÌ|º˜äËG'ŒyÆb –þ‡çUÍ)¯OŒá†¼åX®PýBkÜ@PÉþ¬ëŒU)ik¬¿¥Ç Âk:b‚ `C_é°îM•y£s»­±~‹1Ðb3ñË'@¼Â ÉÙ7ÛÌÁ0»ò€B … 1ýUø\S‹q ¤ºÜWœg@I1~­*|¶I˜¢ÚÆD­:”ççЈó•íÞT™7:Çf�õ[ �V›Ÿ¸˜òÕ¶Ño/ÝyW�õËm£ö�Ì 3 Þsð{†ˆ•B�nÍ=æ ϯ� BAaŠ‚8Sz‚ç‘�?8¯šãÅôD~ ‰÷J¨a`ù5h!6… ¢ƒ¸ ãËÀÃó#ùÅùmž_€ê;cÕJÆëo±™¢IÂÙæ0…nÓB‡Ý V2ÖØ¾V›9ÁÒÿðüê9å IB_•9¿ìb¸ÐïàÂk—W£T0JÃ&y9_z“|�A 9²!'óBžXºÐ×ÏQêXjÄù[{Lñ1}�Ì«¹®¼‘WóÐæÊ\V”�_´~±µè݇vß]g]±µhïÉŒ§æé‰ÞÇnª~xþ) ‚bü<—±d ï p™0›)À 6 )Å '˜é‰ÞÇnªzX°<À¶^#+½eCm*s‹slɱþC°¥Ç,¥”ŒJˆ—hˆŒ&€Kÿ_çVÍ['°róñ\Á‰Ÿo�`ó˜%m�ík²Çbå@Ô�ÁmƒQë“×»áxfIvorL_Œ!ØÒkˆP ÐÔk”QƒB(ÁܯQÓg[ãØA •;cJ²íƒÕܧS…k[ã0áLKœNN‰ñ·; MpH¬¿,§wCUVqfO²Åk¶ôÀñúÄ/ö¾{÷�»›¿Ø[¸·6-ÄPØb7ó‚,HoŸâZY|¥Y=›NåŒÎ豚ý] ÕÁíp }½ÀqJ‹Ã ³f„(Ö%û5*ú|GÛ*R^êŽ-Îè€$“_§ Ÿk�à�mKÔªÃÉ_‡ËdÐS,¾ÒLÛæS¹£ÒmV“?Fhq˜yÖa^²È}à:Ü&sS¦N·Q¥`’Ìþ6§)ÎØ¿ôªêk‹Íý U†·Ö怰­†Lø�[å\èŠ÷TÀ`p÷i” F¡œˆŒãwãqS!�œ�ð‡¦ãäk/ìO"™}±;v Ì¥çzcÔ :Éìoušâ�}N­¾vD}¢©4ÊðÖ³¹l‡UÍ)+õŸ[vÝÞšüõo#\Ì 3*Ä(5�´ïÒé•÷_}‚íGA1}A•Q3`’ $žó†¬f¯V:Ûš„xÒŸmµjÕ¡”Ÿ«OíN3Í��N“JA'Y|*“çúëìß–^sŒ}ÄöeѸüzh±[Ü¡X)YÁ–ya B€ãM}_stNñ¥DshT¡-5ù¢pžÕ^ßßãÖIhν-Å} ¢Ï¿é)Ô,¬f;dáÖÙV«VJ‰ñ±È7Û-þ˜š��‚ –¢0‹Úoî{„EÞ""ÏMhÆžœÉIb»ÓlÐRc=e9�«ó‹3;­oŒ>ÐÜk€“ÿာé?r)ÝPMÙðÕÞ’áClfC`ßù¬ÁÜëГÈ!@m‹U§%Çøœ~´9Ía‘ËFµ‚¶ÆøTJ&=Þýèœßº–ç2p:û8BÃJvl!EÑ,¡­±\`ÿEJn2‚A¡`ÔjºŸßûTâ B‚¾˜Ó=Ъ•ÜR>¯BƒJÁ¼z÷ÁÌdÏ}o][Û”À0Ô«9`�íc[‡hÅÛëÆ¬ÙUxû̳ÿ½c—ù¡÷f¶÷š0F4C½´jòöY‚Ò êv¢SR¢íxŒ�f¨—WMÞ~"[�£n‡>5ÁO3Ô˜a]±Æþ›G=}kei^'´ÛMç"#*[0¨•ôËwÈ´z¿5›ò+9`�ñËk¶†Á\PÄG\øÇÞê´›h†*Úgìÿbóè§o=Z:´ Ú{Mb†Øð e¨"†AÂË"ˆOza,*©ä<„€E£thgœqà‹-ÅO/œiõÞûö¬ÚÆS¯Þ}(9–“ù`XñæOc¾Ù]xûŒso.Ùߨeyðýéí½&Œ�a¨WOÚÆ©9Í@·ÓÀÏ-ÅY�ì5YvE•«0<Àl @—a«æC»ãŒýŸmµ|a%!½R0W g;@H­`^½ó@¦Õsï»sÎ4%`†zõ®ɱ>9(1!ƒ‚ц! ˜_RzÚ£±y=q†ÀgÛ‡/¿éä˜ÜÜf7à›E[_Æà †+²jÎΖ¢æBí#ƒ©²[œaàó]…ÏÌ«.˶@»Ã€B4õÖæâoåß1åâo;ÜØcZúÅUíN#?,äd)ÿP˜Ý4,±N�©—×�ß~:S �Áæ6¤ÆúiL�ɶÅVì+Zv݉ҬnhwD½“`\0Úé2Ñ UšÝ§ïÿr_ÑSsŽ—fu#íNÙ­t̘M±Á©ä<  F ÃŽ #@\n#$­Hñ4„N·‰fPYfw¬~à˃£ž¼æXIf7t�h3D1¬V„k£T` Æ ¤èo8˜‘à]ú͵µñ C½8ï ÕäçI  �, (.hˆýð‹˜üÚáàÙ×]°�¤ù£EØÌ1ÿ‹˜¦Æ VÐ/\(#Þ³ôÛÙg;L½pÃ�$~\A†zo÷Øï�þiì¹×oÜßÜóÄ·s;œzÀ�Ñk¿NÛ~2�ár@3Èæ6’ E)]ˆÀ„¯Æ¿K jEXÀO¡`ßøAläðÊÏÓ¶Ÿ*± F6·A¥d@oàˆ a¼Üµ‚yå–݉®ÅŸÏ?Û–Ä0Š—oÙÉf»¹Í�Ò–¤Œ‘7Ç"ùC$pË H~!ÙÑŠ¥ÏÄè@@­ _Y¸;3ѵøóùµ­I ¦^Y¸‹KÕ‹‹QìÿÜá €P‡ÓL3TYNG¬¡Åî²§ç*Íê€v‡Y¥ _¾ewf ÐÊ0ÔË w&ÇøØ¦v¯~{MÞõ%ç×ý6¢bDãù¶¤&›do:"L¨p´Ï –M ?Ée@0˜š¡^Z7mû©<á)ƒQ·Ë Vq\ƃs$ËXbPܱ"3 …(­:$û£ŽÈ?NV† ±[cT#”—ê †)›Ko6Gd÷~³³ðT}"MSj�žä)Œn§þÍÆÎûû�i‰Þ%-`÷h;ìÆìW»ÝØb3·ØL-6s{¯)D“¦a0Ù•Å@˜˜Åì1µô˜Zl¦¶cˆV¸ý·O3~x{¯[_}Éêðê&�lóö©�^�T!YX€Ì`¤QŠ‘˜ ÁYöowžjH¢iJ­¤Ó= d·òÓu˜e{nŠ3¦z\ îÂ{ßàò«Ý>ÍøÂŽ·¾æ²ÕîÕM*jå0¦7B|�ë’˜²Ç¥ „”9).vD*�“âb¥¢Ûnè*‹²{„Æ…Y=Á°¢Ëapûµ¿f|a{¯[wò²ÕîÕN*jõö«�>�`-º]ú·×•/xaAZ¢wzI3�BÄ7e¸·D†Jøe3µô˜[z8pû5,=n]�€Ç/IÁ¼ù㉄1F Fƒ of2 ³z¿ÝYxª>‰¦‘Šç—€O~šC£ævV°‚-òK~‰%7Õ¥S…Y¿•›â †)›So6Fdõ®ÙÅ«ƒ’áÔA´ôc¤–HÔ  “œçÛG‹’¥¡óOf—¦ðE©¤;µjÎ$奸‚aÊæ2˜�Á¢,ûš]ÃOÕ%Ò ¥VÐIän—þÍucæ¾0ŸTóv»!;ÙÕÞkh±™x57‡iŠ“Á4‹(!™Ì“Ñ.0ÅÕî0¶ô˜YMo·›Â´ÂíÓ¸ýê …í=n}õe«Ý«›RÔÆJoT5!î`†®?„ƒÙ0P”Ù»f÷ˆSõV†e¥Tl ÒìUˆÍ`ä¥8ƒa…ÍeÀˆVE=~ÂíW»ýê ùÝ=mUC‚ݧ™RØéé:КH IDATW;¸óU„ETõ(ºƒÅë·.¢r“½¬WQLn²› t»œú¾ ²(Ã!Ô.JwÂT§KçîS»üê úz¼ºêÆD»O;yx§§_íð«�=±�Í£{ssɼÿ^—ï›1²MŠæb%.h»’°Ù½Ú§!+ÑÝæ2´:LÍvc‹ÝÔî0…Êݯq÷©Çåuöxu5�IvŸvr~»w@íìÔ<ŠÙw÷«=ýšñ¹�½>]M‹Õî×MÚîéW;ýjˆZ�TâYòyÙ^�>Rä$¹RQtN"o*]ú¾�rÄ�^À€€Â€ ‡ôÃT—ÛàîÓ¸û5ãr:z}º“-I¿vR^›w@íìScb¡”>œÍNtéTaî:Þ¤©¯Þ¬ ±´ðT+ëF™4vɉHc@j##ˆŒBÒ³,É9DD"]‰uÑ{àu“øÎÅKrh”¬Å9‰Ž Mõx &] 0µ÷ûÊÂÓmI4C©ô�Ñn Œ€Qö:>Ø6íOÞ6$ÖsuACC—CÛî0eÄ:Zí¦V»¹ÅniµÇ´;Ía†"ݳl±ÿu¹ŒýAÕˆônÁ~¦Ù‚aE§‹{e+ÇêЪ¸ÉLN¢=D+lƒÝ§ïp™²íNcK¯¥¥7¦Õniw˜C´â™jˆ®Í¤ï/L·}{hôéædš¦TŠpz‚›{†©¦ž˜ÌDW¬A<H8 0 �ZA³'hIà‹ÁŽèMº]vȳé¶@XÑå2òI ¢È¼hŬŒH³}{pô©ædÖΧŻ%ÍùÞ¹ÿÆn¿ÆÝ§?´¥×£¯nLuøt“ š¼ý§_k1F¤ÛÖ}ª)™�lÙr² 5Þ7nhë„¡­[k†  ,$0ºËi쪊2º…Gü�Mlƒ\«C§â¼yn’=H+zõÙ×sÊ#"³(!¿Û¯Y¹£hAÅÅ'o96tˆ3+É={lãÝ×Ôª•´¿_iséÇtÕÔ[{<ú3 GtØÜ:_¿š R”Ð|ª.»á†IukŒ?ÓêAúƒJ»[;£¬17Å•�ìzjaå䢟q…‹çœJŽóOÕ¶äú“;«³ÚÙæ‘Ǽx`þ~U�K?6¿ëd½µÇ£¯mLœ0¢½Ç­÷õ«ÙZ�ÅT)£&¬Q‡%>WÀŸPŸn—aWuÖ}×Õ\=ºÉë»}Æ™I#ÚÙG=ný/ î›Ssý¸º¤ÿìò†ÅןÚpdh§ÃèPÚ\†±]5õÉ240@y~ç‚É—²¬îäXÿ˜‚½&ÔëщçùÌ(mªþäËÙå Š@Ì0y†¹û4«wŽ\0å“ Žå qf&¹®ÛpçÌ3j%ãPÚœ5zÝ: �ÞÇíj•³‰?þ€Ÿã×åáéŽ$‹/3Ƀ ”v·nFYcNª+KÂ/Dðëtrœ¯bTÛ’ëOíªÎì°²b™â/J‡Ú69Î7edÛâëOï=™Ùi7ô”½nÝŒ²ÆÜwv²ëé…•“‹ÚI™õ¨:톹ë ÒÖ˜¾Ì$¯¸‘‡T”å„’?ÄqâÃÕ¯ßs€¢0Ñ$ÒÝb�PlD\³e|aç’9gRâüSGµÝýé�ÕvC@ÑëÖÎ,kÊKõd[]Ëçi0.¿óæÉ—²­îäXy~—^îõèÀݧY¹£èæŠKOßrbèW–Õ=glãݳjUJq<£´ȩ́¬š7%ãóIü>4IwŸfå΢›§\zzÁqNÍÇ4Þ=³V¥ ýJ›K_^ÐUSoíõèN7&LbÕ¼OÍ3P>7 +6s'Ö‰bCAPÕëÖÍ,mÌMqe[ÝËn>:eD;â#<~xÇ’kO%Çú+F¶Ý?çäΚÌ»(î j¹Mñõ+»ÝúqÃzªlÝ鿏Iûl­¯_ÅMJX !•4a�*,e5ŸU%¤¥Ë­Ýq*ýþ™µÓ‹Ú¬ÿ�W]œœßÅvhóè~®Ì{`Fíܲ&«¹NIËý3Ïýr<»Ã©÷({Üúò¡¶š¦Ä�îLKü¤üÎ�Öׯ@ãòº”×g%x¬ÿØÜnƒ&Ü+�ÇÎ,j=õÆ·sŠ›ÅŒP”°‹çW¿fåÁÂåuOͮγ:³<³G5Ý5åœZÁø”=ýØÜî“-I½>Ý™¶„ C;{¼Z^ÍeóXnÝÂ? ´ytcsºkZ¬=^mm[üÄa=>�o€‹§‹>¨T0MH«¢ÅIÿˆù&]^ýîs™÷Vœº*¿%Éì¿m¹‰yœ`÷øô¿VçßWqêúÑõ‰Fßì¢Æû¦žÞx2¯Ómð”=^ý˜œ®S­Ö¯¾¶=aB‹†Š]�Ÿéó³$^üJ3l·O¨µZüS†µÝ;õ̾‹™�.Ã@He÷ê¦6æ$º³âÝO̪œ”×NÆþ ªËe¸¾¸.?Ù™dêˈó"rBJOJ”(€¡‰ŽCËW¾4÷û%f9ó0Ô�OÈ ŠížE»<§ãž‰§­fÿä¼¶{'ŸÚs!³Óm©z½ÚiÃs\Yq®'fTNÊëÄ()Z[žæZ0ª>+Îc5ûJ2ÛtêP§C 0NŸfõÁÒãÎ>yÝ‘Üd{V¼óÚÑ—îšR£"¦Ó‹ê«_ÿpÎèË‚–õx�¿/Z<íø %—¬fÿœÑ——L?±¡j¸O—fuÝYQ�ã�RÐtßôª½çr:�&O¿fõ�¶¯¡)ެÇìї直‘¤<""ŽA%` ¤¶{t3FÖåX�Y‰Î§®?8iX+_m©)H0ú_Y´{LNÇÐdû´Â†±¹íˆ—@Ýå4Þ0æBAªÝjñg$¸…•„À¬°1€VM³ÆÑæ5¬?6bÉôã7”^´ZüsŠ//æ†l’ÏHüC0tFQýÉ8§ø²€|Pe÷êfŒ¬Ëµ:³œOÝppr~ cP«¥‚Q)iŠbXP¾U�Û86¯£¦9µ×«?Ób�XÐjóê}ý਺«3;Ñùô܃“ó[I!«ëŒ?Ób½ûªj½:üÛåt™ÐEî¯qý±"nÈfÿœâËKfœØpbx‡ËÈâXšÝy×U5)1¾ŠáÍ‹gVí=›Óá4¹úµ+”.wö©ëM¶g%8g�¾|wE ¹È,cµ0^‘Ò¢Põh:â‡gt©•4»7HŒ+ùC3€l FŸm˜˜›fßõß/ÃaôÃþü_£0­zuÍ„Wï9tèÝ5¯nÕÎÂ/·e&»ÙV*EøþNMsêÔá–nÓëKwVe±²µv�˧]:¯ú¡¹5á†.ËêE≔�BÁ ÄsÙ¿ä” Öîîò’cVïAcÄ0TS—eVYcÕE+ƒáøÅÔû¯;ÕÔe‘æÂˆ’ØÉ? þÇ×S^¸ëðö××*ÌOóŸþôj¿êÕ5^ùËáo¯qxµ«w�øj[Qf2›¢Æ Fïü8vX†ãÐ{«išúqþÖŽ‹³.,é `3ŠÆî˜™<†'.¤.™s²©Û¦)�:üÑcÛ®Û¨¤h„`ùŸ�,[ô[k�åöÎ÷K- iôŸï'Ð õÑcÛõšà®š¬O6•TŒjaùøÁ¯¥¾õòÛg$z:즕ۋVl.¦iŠA¸©Ë2³´¡ú’•aàÄÅÔ%sN6s„B*%½øúê7Òœ:u¸Õfúè—1»«³É3¡ #ÙŒ1;&nÖîîòéœ[õà¼j„pcgÌ7;‹h¬l⨑Ì05šùÃX°Tâ%çcð ¨_X9åwÞú¯µ Jä×kk&¾|Ï!)¿Ü,0£·×�–î8üÞ7<¿Æ…ii^G"#\ùõpnA†ýð­ÇhšúùÐÐ}7.ÄP¡êµ5^ùË¡ƒï|ëðjWï*üj[Q¦Õ#ñ¨þñõäî:¼ã_?*̺ƒÃžúäêAæÀÝ0ño”·ò3“= 1•R†ß[)¶ >�&œ®)¦Ltƒ€¥Æ[?– Ëpüöþ·4�~ØŸÿÆÚò0�ÂêW¾ÿê=G½ó­Ã«[µk8¯æ*%ýÀ §†¦¹têPK·ùƒ_JvUe²�¾ßŸïòiš{òá¹'…:-«vŽ ѾS+!&Êg˰|Á¾Û_àôiš[óð¼„8€ †AM]1×”6�¸”Ä0èøÅÔçœj겄Ó�f‘§'€@õ·US^ºãðÎ××*(æÇCùO~6Í߯zå» ¯Þ}èð›«^íªÝ#¾Ü>2ÓêNÍ©·~*ÏOw}{MS?,xãÇ a†} N�F4î|¶?S�ݦkŠ[O\NÄ ¿d}pÖù¦nsˆQèÕáÏ—îŸ]ÚªD Bð·›«ž»©ºÅnºõÍÍü™‰HîMSÿZ_f¨ÏدׄwžNûhÇÈ©…í€a཭EÞåó Nd$ø:†¯öæ¶kMSAc�yÖè–u‰ †ãuÖfœmê1³6J­ ˜Y;4Å¥S‡[zLïoµóL†h¬X5§„pt7ƒ‰;àµG‡¹ýÚgžzhæi„pƒÍüÍ¡á4F F�½–™EÍ'’hU5$ßÕ™¦^Kˆ¡xÞ³¢.ľ‡±¢©×2sDsucÆTUCÊ’©gš{-aF¡S…>¼{×µ#›ˆA–_W¹lö±V§ùŽO¯kq˜d8 W4�þ³µœÆÔ‡wîÔ«C»Ïe~º¯xʰV`ôážb_@õÌu•éqž§qÕá_E3ƒpS¯eFaSu“•Á¨ª)uqÅéf»%Ì(‹ÁK">OhÃɼ‚û×ch´¾fè·•‡E8 x}ËøçÞûôGŸnÍÑ•‡‹2<<ãÁP½´qòßn8²é¯?(ÌúêaË×]M )z€‡ ³+ÍÔ# 8#Þo8Ñœ‚öÌSéA¾QÓ™bøŽ… €½·{ìÐdÇÞ§V34õSMþ[;LJ* ÞØ6á…¹‡w?±ÆÑ§ý¶²hÕáâÌxÖ1©á{®:ž“d׫C-½–�¶�ßu&�Eô‡£#]>탳*—άD7Úb¿9XL“`Ý hÇ |°cœ/ Z>_F¼»ÃiZ¹¿dÅÞ2š¦@ÅÀ¯'ò R{žzñ3šFëO¾±¡"ÌP`íÑ‘.¿Nè«Á»æ`1�)%Ðáx" †‹ ’$“@õÚ/S_^¸çÀ Ÿ;|ºo½¯$#ÉÅÖªiJ¾Åü'¯;´îñïÓê°ü{Ôãõi¬°ûêü8ã…›÷l[þµBÁütlÄÓß\«P0ß÷뵣딈Fž�¿ï™¹û[1·½wË…Ž„vŒóÔÏÞ¸?#ÞÝá0­Ü_üùî14y¢÷G<7ZÐe`Ÿâ¨^ýyê+‹öxñs‡O·ú`ñWûJ3]X« ¿ÿ—Í׌ªÓk‚Aivû#³�6ÚbïþpÁ¥®øÆžØ™£êªêS�¨O»ú‰æžØ0C…Ô«?_õÊ¢Ý_–d&ºÒiôKeá§K~Y{¤¨Ëe¼Böœ¥2ÍÀûÛʽªçnÚŸïnw˜Vî+þ|÷š¦@IÀ¯Ç †§ö<ýÊg4�~>^ø¯_*X“²ö·"—O»ôšÊ‡fc¹üÍ�b#’PQzGaã8yCóÊÞ¿@u°‹P3Ë.>½h÷Cï,¼Üž dGÈ¥*Θ :\¬Í:c§` ’ Tªcr1QUøÐ÷D:§ ?/"HôÛ"W¸ÏêñÍ DÚ~A+å ®Ð%–Ì@üNõÈ�´¿H²I7ýçßI‘ìåÁü¡áѾŠ¥ ñä©Aç ³nÂCüÿ”+pg°,=åoÌDý8!ï)ÄŒ !]‘#•ûžHÜH7..ë1´áUË7ŸiLxiÕ$)¼ÿ_…ßy%Ó ùðÉ¿Byü¦ *.ÝüâÜ.6#Vˆ@K‡‹x¥&#v²²p%—à#X#ˆ¥¨ìäëJèw$NÄPúówªÃ�Ù%�Î颃#úCHB.v» ?÷%­OÄQeŽ ©´?IÉÇääb$žÔ s8†d°d¶"*z dÁJû� 9t L‘#HH ËIš“wy[�å•0�)Âë(E§»Tšø@ m" )ÉÞ½lµèHÈV`+p‚^þêžÍµí‰¯n"í†øÕ®(DÆsR툇¤›EÒæpQ%9/O;1¿ôÒŸ?›gó¹OhÒö¿RË@ào+€BXI1j„)áp+: 4�š¤otGAº©F¤,’ÝÑkB+\w¦ÕúÊÏÓ,¶�Г+8Òàˆ›QV¢VC¬à_�´zÂÌɟ˱ éÝH.GõpÅ:Q7RŽEâI?_r¬ÎïÿºöÙïfí®Í¢é`Ôì¾AZõк3­Ö—~œQëp�0ß·`8¤f‰Œ³¢Òƒ­ Ä˜ŒQ¸ò|f—ݵ#‹Y… 8%ο핵™;Ë Ín˜õòœV.ÙI"�,ââob‚-ó–Ä Âý”Qƒ�í8G" ù¿ˆ4 ÜþX ¹mòHr#ÀâÞwIöÍëH,¯�۷鉟3¼QÚ�ÆÞº±Ía’$'Ð ×¼ÙCB8ÂþÄ �Ÿ¢d%‹�Aü\%Q™çw79Æ¿á‘uñÑ�w™}2—DL!å.J&ðÒQÈTJ*©úÒÚÇ^pUT fä�ž-gr{¼~³‡\Ùlš$§6X‘Ó¬aA«(F˜„›¡1M34-³»‡˜ÈA°„ŒÓ™© Í›ˆ&¯P@Ô'ƒ�ˆqEjJŒoÓ²•™Ò}Àliw˜¯ÿ÷­vKä£+q¿4ƤH±õ#�m.�‰ÈÀEú޹¤‰QÔà1uD^‰áSœ!’(0HÞ%÷³¢ ÉîÓW7rçT¦Äú6/”¼sþÅ‘—4'‘(F&Ö$?ßÅ¢ÍÚnï(H�õm~fefbt4®û×h^Ù{çQ…ØP4nxÓs·í|nÅ g›’#¢ ®ÀcaÉJð, €ÃÛ¦åPþˆÓ#ˆÁzL<ácGâBJ7$¨/’ÀŠÚ)é¯y €R�3­ ¿u�Ä)V6w™ÂŒ"(©„‘ q ¤pf²Wͽ®!ñÞ¡°²¥Û’lfÀü‹,€ÿ FüwR1çA…îEãÊ2‹4“˜’ü�‚ >­ïüß ¡šdLÆ™n†¥T0V�Z’#(HS-]ü»Ä2-©-£Äê*8ÃêÑ(ÑUƒaE�[ÿåÓ[#òÓƒŒM’É�晈˜‡w|²jBEÎ;†(Ä’ÄíQŸËÅOÀ”Œ!ÅÑÑ‘OÑÅÞ��6Ff!Ö,'x5Šß/âמ H+š{Y~ £ôÂIN„RËnÊMcÄRIžÆ@$˜@º–È!ŸçQGµ´ÂîÕv÷¶Úö„W7Mb°dv"§çï–?’GŽÔM¹XHWF8Ɇ+Ðrd£(V!¬BŒBè’f0C–îÓÔzÈËàñžÈ™l“M šðÊdóÓ²IA$7»µd A©À .þåK‰[ †-=1üž¥ÿ™«À퀈$ÑéÖç¹8áÿè�åÄE¢ëŒ&’´®,"@Qn’6(cÖ„†¦ö¾uÇÖUûK>ßSÆBR*˜Ì·ZB^n`AZÙl³°�™K>?]Ûj}qÝ4~ß3·‘‰Wn¡ d iþ�`@©Ä™ n�2„sÅ—`XÙÜcQÊšWžÏš÷·Å8B‘è1x“ÇD´ˆBgÔÛ½~š!_:†è´—±C¢¾¥49 DT-6&¬Ý•‹Ô t 3¨¾3Ê®edf ¾Ã"«#%&¬qÆ‘°A…s”X°‚·ç�? ’Ê%«¸u#‘–ËÁÛ‘î’È bD²1 |d!AQÑ`gϸ1Šî�„_ˆz.Úà`ÿþ&#�2(¢w‰0 1XœFJ*´‘sÈA ©·2/…¥êͧu0±äGƯ<þˆ��ÆüùŸ‚@‰™M$¶"¨(†Çc£PŸë–à�0Ïáîó "Wθq¢ˆut‰1ä¹Äà ¦PêE@z-°áŒh(LÕw_”díë6=D!‚¤ Aw’É0д¢¾ÃÂS‡U q˜ì AË¥¦=Ò.D¡*ÇÂ``%c°ó]¿"ïó¦XG±vDHqŠ–X.5˜ •|5…÷j+/R–ÛÀs$L£†nâ¤y$ù„Q‹”3ÞñI7^s"$ñ)xa'8)¤ÄŽgÞªrêHŽaɼ LS ½1ÜWTE4¹JzuX@@†<Žª8$ˆ‹Õ3ñ¼ÉÁü àZe+HÂ#³y$ÐA̦‘»€ØÝÖb+E¬¤° a%``�d0Ó˜fdR!é@pDÁÑ* ©G�\„kÀ¢ÓÃì™-GdrSÁ!€Ã4j莓°$z!ãˆ?â.Éj¢œDÍZ âmTÕ’ ûÓDé¹"d¨À]ðäaâ&�]”`¤@H‹� £€†Äz~òÛ8cÿw‡F}{d”;LSõݱÄèE¨ �'¥Tdá# "°â£#1çÁhDfmåÜÒw/R�ýîä)ÒÇDðŠ/á0m÷õ v2ÈÿP¤:@v#õ¤2žƒ´ÊàÞ1²�`~Åi©J�d�Ø?Òe5Áæc!�Å� „¹â]e„1ã!“{…þÈÎW¸R9®E$äh@DÉ¿3GäYù1Iˆ �«¸˜T¦‰‘j8興0çOù¯L/—‰èd~Kôwƒ"!1<b�-}=q„Å$ÙІ1IGÎdóAIr©–¸kI*TœS#î ú*çx´‚#êIÈ y(ò]¦×€"cObbóéB0¦•}˜ I‰Kd8%Eê/Ë.[àëPd_"·‰aDô"8•h’DήhÆ©3Ø\hÌ»¤�"Ÿ# «$¼BˆÈÄóÖ‚û…£á)éxö2@¹Ï��ä€�3Dø ¢e„¥�¯x‡@Q¾·Ÿ“,á„c©E�K¦€Ür�ùY±ë#š@€)„UV"Ì0„Ùl4ðß1lþþŠæV6.™Sp– 9 ÿ¤=‘âE9(ˆENQð¼2ê‘O‰;ƒ¸A±^„]ä½vD¸0 ¿GØ(KaJå) æ2k/N„ØÄ›WÄçºm$å&Ïì?À`>¯BH8@rGícDIα—Gæˆ3IQüå CÇ+TŒA÷‡b0y‘Z}Œø³ç%<ÂH¼�" É"YØó€"‰¥>–?ßËjñZÅH²5™¸ã̧”^ˆ [b]™¦F0M6–ÚÒ2[Å¢ÃSQÈZ`བþÇ:$™#—©K\xt¯P¢ Ì ""ÁJ4‹Àå`0Æ€0ÏAa×"“!`þ?&ÆRøƒ#&‰C>þ]cô{ò©V|BšÍ2c ö÷M`öåÙ �6âuA1$Ñ‚HJ`ñgÔ¹ â…˜ÛT+jžœ8¬8-•jæ6� Çl„0÷E0,$xÌÃÀ}un°ã=É›ˆ§âQÁd%1`â `«evA4–P›p<£!šs¬‰Ö a?"FÃ%‰Pd}aX\n‰SjV£&Ê01�01–ÜåQá#I»²#9#mia ‘ÉCDДäâ8‹8Áâs keàH–GCI¾(xJ$†X Bã.á8Ù¤ ùV2™‘ôIÞG²J"5"üOn'²+Axë¡ ¬ 8½Ë+ÜBƒ¬�ÉêÊœ*iÞS&Q“},3@BÐñ.ˆLRd=cið¿Ðú F¼!é�¢õÅ.×PÀ»+2ž'ÚHˆÐPæ %Mt*•Q+ÿ|]&rã3hEánTâ±AgÔ+ŒAôÞXÚž·Xø8'Šïðx/"v-Ö"ýƒø¥ÖÈøBDTüWhU÷Pßqä("á“m$»ßXÁ's1`á³³\&f<‘H@Ò_IÁå &½ˆ¤˳9hnesbŸ3œccÓðw¢ÿ¿2Áýržâ�‚µíÊJ 3ÿ›ÿl‘™&�N€øBôø2Ê“nDbíÅäiDDd±8?å§[¤øs!rD ‰ˆ_¤ËãWBxëÃǰ8¢mä…è�…%qn�E¤n³8`!Âî#§(Ü'K<å±G7#"p#ZÍAŽbí‘NiYžr›œ¸FX @¸Ž°ç$e¢ùÁkK¹)…à 'gWÑ –!Ú �Q äWôA‚à�’E0òBÀˆ%Ï$X�ðÁ$ò¦ˆŒèÒ"’ÿÒar:>–”öÅ7ÁD ĵ2'"‘WL�Ÿ£ÕïÑ4âóûLñ�e ¢îI‹èïx|¤6\Ë Ô Z¯ Í££°b A ‡‚˜{×�lý»†Yâ^¢Éi´2¨§”þD„É!7ôDuÀ2“*3d¢ùŠ®QíÐï".ë_¨ÅgÀ¤-/²|œ‚‘˜˜‘ÔC¤œ mà8D¸|9‚‘Nd–aðɤ� �ˆK"ÑaÈ5Dö@ÖJÆ/ñ_iêC´‰B–'1?áG‰ä%/ü�„OŠðÆ‹Þ�¯É«$ÏLÂfI{AQ82jÕz�Z¦"ÑÅ_ZéùXü[…Dù‡rÍ8QA† éå¤×‚J¡’*‘\—z¿èŠ<22Í”ùO¹Àò›B2 Ü÷öñNÿ¡ 6„åÝ…ø8z‡’ñE‘¨r(DÁXZ��X9ÇÈ%[W2Ò—[‰¾DA1�è·åŒÀòK,íG6 ‡e5¤¦A˜É±+ÔüpdÛ¶„ÝeQÐ'W_pd§@Ø,A:/DþE ®�–ñF"¢{-!j$÷ËD2sQÑ k <,Œe¯ žbÐׯ®\ÄÔ8'OÜÈø\ÄÈ›ÄôCŒY&D‘lË¡La5Š�V–Ƽé”oÙ’4æ˜Î™ÁïFà �ÂñH++ÿ�µïŽ·«ª^ëÜòîë/õ%!•PB-@CQ¤„ž‡¢HafDEÇˆŠ GT¥”ÞŠ˜€! ��Dj !í½¼Þ˽g}œ]ÖÚ{Ÿû3ßþÁ˹ûì½öêkírαæ+ª-ÐÿO›Ô!’~Ú—ÜN"µEwõ”Þ÷#>½NE FTG¾BíM¶ ŽíKu›�{N„<{‡¥ ü¸ræ¡…¯- Áò�}´BÅ7X ]µ¹bðÖm*T0�ˆut^êÄ0)§¤X�F�(›‰«³qm¦T‰¤¾þ6mÿá`ãâ™ Ï6PÌz„´:Îåèªm,Ê†Ó  ¦"VG‰÷pÁ8«ù"é¥;‡>¯ƒ•K ø UË.?w ›ˆ¶¸dªDnÃ0íÎ(d »¿EÀ8Ž*÷Q7�²Q\™¡ºL\Q–b¢b‘ip€ŠE¶—–;'wýVèâY|J_›«°“H …žÛò›:&‚H% „ Rçee/‹Ì;Ô,Ú<—€–¡öiuwŤ«”#cÀ©NPv»E—I ™ˆØ>êï/ ˆ<ç/7Ó”hã\b c=–«w©B]Ôk= «ÍÒ“Êß L;¶&�ÄB¶|R[p®¾º*—ɤ�ì�\¤]WÇú¡¿ì®ã)Ÿ�D<­îå˜ä†jó×z_#ôÕÁ'5daxë”Âü†aÍÅc´V a›‡•’åh3ar ‘�ô‹Ê¸®ÙíŠ�l­6yÖàq¶¨ƒ<¡�Uw›ÐÛ©%yë.£vlÝã)Ì:CC2ðï�c&¨RâöÌ›�6Q"Óô_›d³Ýޤˆ‰Ü?0*MÌöÎ4‚žj ‹bsP± ‚¾Ï+bƤA‰U@JÖ?1¤Ù†‹œ’ÎÃwDÃë'Œ¦&†,F30·¸B³kCÙL\È–j3qR.Ñ‘Fówv ì[¾ø­îÓ+þ"÷æd·¤ÔOü@*#ymPz}£3Ö¶­Ó:‚1¦O!† Ê2sJFÊ®fôÞNf$óle–ßÌèúýÓ:š[5NÍ"§»eá_£çÕž+I`3eû¾¿B4ÉŽ;¶*dÑg 瘺Ã0;¨¾R6ï¿ÀòÁÉÑiääv¸-iJ³/k¼9’½¥ï#B6¢Š TªJ€i¸ÅaŠcÇåX)Ȇ /SFÙL·d&ézé1ÜDp ];49V¢�€¹krÞÑ0r!.g�·ˆÃ©þ5dB˜Î`Lô+Ëäk>‰¾[›v�Ž9H¯›7²›ë3¥Ùñs–hßÑ…}HêøjtÖ.J¢‰�Õ\Ø:�XTBõ‚*Ò­”‹u&¥6¤Gˆcª+£È|ÖzEϧ®¿øåG¿ÿpcCïC×?zãeËÐa¡;É>½týE/?ú½‡'6ô=ô�GoüÌ2g'jT…/`pløZ{/Œí�ÜP)51ZK˜Büá ¶ú¯šÝ�ɈF¤É¤}æœ_0ímÁìÉj‘[y _®“*ä‹÷}ãÑ O\Çz~Ú;�ݲ«¾µ«X*#ŸÕ÷7�ÉœVÁ@†¸Ù~5ëÛ¤öñŒÖ»€?é{/j'Ã{à¶;}Í­Ï?üsŸ>㺳ŸY5ÄüÞ�Üæ�õ­�ýZ(•ð²Ÿ,špΕ{]üÙÕï4*ðzy[a]Æd¸§!v‡#Ÿ ÀÕ™BÅð¾ùäÅ'þ3ABÉJ·ìÑÈÐp~v¾¤Tf‰\ÑË�~ }úÎã?¼tyd5Ú³ù¥ŸÞÿÑ?/d"™cCLdÎ CË“¨\®M6—´^jËrý2(v€›LkwÉt��k€(®ð@ ¯ë®ÏšzâõÖ½ŠW‰nK…[ðü¶HµÐ,š€Û–\þ2Õ3>JH‚Ï1ì0¤ºpŽ›µUƒ�ýŸß@�¤}zÒjñ€ª£>XçÄxd9Mêʸh‚�qÆÙØd‚µÌGp2\iÆ`éñT&à™´çò!°s/žÏ¨4:®ÉÄÕÊ'Ÿ0(•`h�ûãáa¢’°Ýßx•ôwŠQÊuÐ �'�` ä¨e'÷>¥’Z'QÜ´ ˜Î:uã9VÂFyËmcmÖl±øI‹žT%‰”Õ,à›–†/”gƒL£Emf`<Ë�~DøÎ”qŒsp„ÂÕ¤Ÿ9‡X6:Àù¶€ŠuÎ‡ŽøÐ– ÈÆIàHU\DÇ/O#±xn]T 2Q4¦º²­§_¾h Ù_3¢?A{W¡»¿¢g ßÝ—ï计ÇÁß±!NŠÝYÄöîBwEO¾»7ßÑS+€‰ß�B,p˜áÔñå¸B�ÄK;¹ð4™Àá8NÔO£ÚŽ\ u~lrÀëŠ-[ȆëØåØl©)9aH¦Ò#€ªB±qL¯/rP¢ [ÆŸsýÙʼŒ¦‹™*–qÆÆd²8Yþób#z�Hô4ÖñŠSgÕS Ño ‡Q œú °ãkû»ú*žZ¹ç޶ÅêÄõ¬ß2nñõÿ‚ª "Æ1Å•Š{,eõÑâ� ø�JAåÉgü¤)#áG•¨ª¢Ø8¦/-´mØ2î¬ëÏòœW¶pW²/rÑ‚�¡½»ÐÝŸïÈwõæ;z*ˆ,Ëߨ<ñ‰Wöüú¹«ÖlœØÑ[!]ñ¥7“ò“&´1øÁÃJ¿ùuZ­~ëOcŠ�ì˜ù˜Ö4²ïÒµJHFBq)Ch>«‰Ì-8C”—8C;�(ÝÂÚQ°9.4ÍB'u‡!ëJ™O.@šG\³CŸ�ૺª…²põ&ÃO ƒŠŒ�Q �[Ïyd� ë¢7%B‰{¬™–’÷‹r¿V¶–ê= «¶¢§ÌÒØz ¿Ñ‚¨¬Ã¾=‚ R.‚\ò–DK‹%,•(– 4GÙ¬ K¶öVè38¿´fiõˆèu`à]™?=~éU/Ò¸ƒ¼´çâ<èjí(J:_̶¯yÀƒÐ/Œµ$æoÎ{�¶â+oedŠ®NeÀ9OM�[Oε�ÙÁÂÆ¶Áš»kœÀÚ8«šÎB"ïl¼8ÈO�õÁÛlâ§ ùá Oxõœc×N×µ½¥þÁ¿òÀ_ÎUV ßúÅ?½úÖ´©�íGí÷~uÕષfÜüûã?Ø=Æ ä/‡TU ÿì‹zõíiÓ&v¹ßÓkÛî1 Õ…®�Þ³Ž|÷s‹×ì7­µ³·â�¿ÍùéŸíÈÝö¥ç:zòWßþQÒ6Ž×~rÅœém—ýøäáb¦­»ÐÕ›ÎtôZ» Â�{o‰µ’±–&²X lë*tõæ‹QGo¡µK¯®!Àغþ_|á¹EGl.£‡þ¾Ï�8¢½·öœÔyõù+�=ðƒ±uýÍíÕ¿ÿë~·>|hï@r™øÂÿyùikg6võ æ^{wâ7ï<ú�mã)ÑYG½÷¹³ÖÌ™ÖÒÙ[ñ‡¿í÷Ó?ÚÕ«¨Pü£éÁB¾xÙ¢µŸ>ñŸS'tÐR·äÙyw>{ÀàP¦ªP\rÍ“kÞ›°ç¤Î#çî¤G_ÚûæŽèè)P&CgõÞçÎ|]�õâÜÿùó¡]½ùªÂðÝW?¹bÃ3'w3o[mõàËë§~뮣ßO¾ŸÉòIÒYXRfNêüúù¯sÀÖ±uÍíU÷¿0÷çÖ;�M˜~èÞ»¾xöê#çî¨. oÜÙpÓ}G=½z֜魷}ié^“Û+òÅ[>÷—[>÷—8ÆŸ=|è ÷-D¤kÎùª³_Ífâ8Æoßs̯?Äl7òC—-zãÂ7LßýAKݽKçÝùÌC™ªÂð=ù—ÖOýö]Goiªgjˆ©…Šâe'¿qቦMHîÇ3 eª Å%×<µæÝ {Næ<\ÐÞS€LŸuÔF)¯ù]½Õ…âÝ×(4Ž�·­¶zè¥õS¿uçÂ-MìõÂc 4Žé»ó«Oï;­­®z(Åëï¸ ¶·Ôžú�³?Ø]wݧV|éì×n|ëî£o{ü`sÎÕ<°ÈŠš«f2tÖQï~ûMkIŒèþ<¿3Ñ(ë<Œ·UeVcçÕ¬<ö€mãêú›Û«ï{a¿Ÿýù�¾�\‚ôü½š¾|ÎkGiQÞð»#Ÿ^5sîŒÖÛ¿üü^“;*òÅŸ}®ùgŸ{!Žñ§žÿýûŽ€o\°âË缞 ÿÍ»þò±ƒçKŸ]´î¢ßœ6¡{ëîÚ%K÷¿ã™yC™ªBñÞkžþdž)3'uwÀ¶Úê¡åë÷øæ�ÙÒTŸ n̼³·¢µK½ÃÞ<úð²½Ï?î�ãÜöè?fÛÜÐü«Õ@8vó¥çô#ýÑ«êc›;²¤W,a�ÉÑŒØlölbÙ/”b\A™>�·$ÅE5»ø Ε‰²£üv`ˆ îGƽ$ÄÒσ â²DÉííÂu²qî_Ãb‡’˜�dÓaÙø.-Y.R˜^‰jëÒS8–Å`¶£Ãbi9KòŽ¿ë ãØ8?kÇš³‹7;*¬òA7™Vã •2éb&¢\9 È*•¨T‚8 Øáš'F%)oÝ2€ Èð"ÙQ¦ø©†£8$îøIWÊä[¹ìã›B‹ƒèQë,Ú[ˆ$ï2�0¢3G_”# @gy&:‘'†YFî"-„.¦ÿ$GúAÙ1eÕ}Ó×vÅŽ|O§2<6³u4Qü ÎÆQýužÎñ¼¨W³#Q6B„?ó¥ÓŽ|ó¦ßÿÆÆ)ó÷ÙþõóÿR[9ø‹Ç]tòÊï;ñÛw�:¶¦ï–Ï?ü…³—}ã·§K€@2­Ñ¥‹NZyã}'}ë®SÇÕöþ÷•áìåßøÍ©ùlöÒ6]õ‰—ÿë�‡=»zÖô‰]7]ñ÷B®xý=GoÚYà¬ÝùliZcçi 6?½rÏM;ëgMîÚ¼³!kË®ºšÊ¡˜pÖq›v6x¼uxeêØÂqVÁ–¦ºšÊá˜pÃæq›v6hOLpî±oÿìáùÇ\uÁ^{tÜ|ù‹¹,]ûÛ£‡K™žþÜòõSþÈ!MíUÍÞ}ãeoï.üú‰ƒ`þ>M_ù×U·hvó —½ØÞ]¸ý‰ƒ`Îô–Û¿òô†-.ûñ)-�Õsf´lnjÀ÷¶�9ï{gM×÷›ÿ|òÞçøÓß÷%Àžþ\Z~xÿG~ô‡£öœÜqÏ5Op¹EHW�ýê¹Ç½yýÝÇ®z{Òáûîúî%¯«üÑG€D~|]ß_}æê ^I�« @ÁUg¯>ï¸7¿}÷±«Þn<|ߦï]²¬®fðæû�HãÓ'n¸êçÿÌOMßý«//½îS¯\û›c†ãè¼ãÞVòzuæô ]?¼üï…üð·ï>"„?ãõk{ì—~qüøº¾;¿öì5¼ò…[?>\ʰ‘E>±»³ò3?^”Íп,|÷ŠÓ×^|ó)ÍÕŶtWÑ ÷yÓGÌžÜyïµO%áL§ÑΓ^Â'œÜ[×\°ò¿»~Ë„K~´¨¥«j¿é­››êðÝmc>ñÝ3&�ë»ó+Ïܳtÿÿ¾ öôåÜnøý‘7ýáˆÙ“;ï½æ)ÉyúòÙ¯�ÿÑ·¾u×Ñ+ßn\°oÓ÷/]^_3xÓ‡Pôg¬¹æ·Ç|ñ—›P×w××–^{Áª+o=¾XŠ01óÂpL¸~ó¸M»ê‰ÌÖ –æºnûñC¶>±rVIŠž€tB¡ß¡Â£ZANóÒ^ÐO|…rÇÎ3gÂí© P§¼S?¨ba h-QzæÍ(Ü ×½ÃŸY³•!k8Ɖ®¸É3‡bÒÛ@|³{PLвƒ¾0»ý:�V«Ñ”Š1" b‰âJ%Ò˜…Óa†Ü(Š’F©Ç™|HfŠbŒÃ\Y“׬Åkºó’~j^�1E¢Pzê³REÖ ¹édÿòÚdq‚G*L"(¬ÀÅŸÀìM†2Z\XšFÃ7 Ô.ú§åkà ÎI‡]4¥»ðÐâÏqsÑðÜ/+9Ô[1•�“¹)c'QMM1‹€� Ý'ööÝOþükûà3«æì1®ã]ûà‹võUÀÚ�{,]½o©íî¬yiÝž;äÝêÂ`Go•¯j–̤׫sJ%lî¨yiÝì�ònMåPGŸ<á�?üõÀ%ÏíO»Úªn{ä௞·ê�önÜÖðñCÞ¯©:÷¸·¿pÖššª¡_<2ÊØž×LKx¶|ýË×O ß>u€7¦ŸL osFË×ï±|ýøÛ§d]€V¼9å—�Ü7˜ÛÞR{û^¹xÍ”q‡¼ß\·»³êwÏï—´ûËë3^|cúÁ³›£ˆâ3ÀŽ–ššëðíÔ~}ÕàE'm¸÷¹¹KžŸGD»Ú«õèÁ_9wÕ/=d{k­q¨ŽšMÛ·xỿ~âàÇWÌ€'VÌž:¡ë’“Öß»tn{w%,_7í¹×fÑÖæº{žÝÿkç½2e\ogOŧOÚð»çö¿÷ùý‰pW[õ¯;ä«ç®üåcó“•×Wß™ôÄŠ½âRÔÔ^ýÂë3-ØT]9ØÞS©YfÂ@løÕÜQyß_æj’gž´vóA³›¢ˆˆàŒ�¼×?”½ú7ÛÙZ o%$# Ç™¦Ž*@(ÅQGOÅŽÖAB©„=…áb¤)G jÛwÖÂwoòà'É{î1±ëÒ“ÖÝ»t�|ãã+f—JØÔ^ýÂëÓ-Ø\]9ØÑü '@㘾Š߻ýÉC_±gpêÄ®KN\ïÒ¹ ÉË×M}þµÃÖæÚ»ŸÝÿëç­œvȶÝ5²=Ó-„榽¯ÍøÛa[žÝœ„•3�ÚØ7˜ýÚíÇíh­€7·&ÚKÅRfW{KQ{oÅŽÖjÁfÄR ÚiY&è IDAT»+œYͤ1}‹�~ïWOôØŠ=à±{N�Ø}éIîY:7åêw&=¾bv\¦ö꿾>ý”›k«†Úº °lýËÖï¿yúÐïƒRQlp(ûÆÆ =胚Šáξ 'ŒjÙ«ð’£.˲Á|>ÁÞÑç…eÜvЩhŒUj«ß—bQ2!ÆyÊ " @"Èh•¤ >5AºÃíM—TçmÇ/“†º|åÇ?b©£ ‡�õÏå};�N÷eÊG`fNŠþϰrltm²^Ò �<[w˜�.sí2ˆEn•.rœ.–I Uv˜¹Ï“á‹¢ˆòH9´±T‚¸Çæu6ë,“WŒ.™°tshÁœØ\ÆæùÊŸN½;Éq•Þ“«M¥’ŸÄ~&“#bé"™MäÌc4ZZ†`(ËÝŒ8%f7ßÔ$q„Ê͆8GÒsn;¡à>æÞO“n9Ã�¤²,Å#z!C¥³8૘¯,~êŒì€¤íe7sØüœ#yD„Y˜ÐÐ�ËßÞ6Ñàöæ“ ùÕz“|z[Ký`1—à18”ÉDEvU"@.QÒkhX-Ú E™(Ž"h¨í›2®ó?¯¼âŒÕ bŒ{‡rõ5ƒÛZjª ÃSÆõºOóc+f<»¹qLoCõàÖæ:‡ƒú¯Ã+¿ órV×PpK!�onÛ?”�Lïí“ÏÆÇômm®Wßÿ…ů�º`ÓÄ1ýP‘~ò•Ù ÐÕoOºãé~úù¿\ò^ãoŸ>à…×§KŒ¯ïŸ6¡ëª³_½rñ�$oo©±XHNlè-䊶Œ3]¿yBeEqÒØÞ$ŸÞÞVSŠ•OÜÑZ“ÏÆÇôf³ñ´ ]_<{õ翮ƊâÞÁ\}õ`’Ǽß\78œM4o`8Š¢8’Ë»úà¬z· Ž«ïÿüâWO]°qBCBrñ©Wf@Ñ^SÚ7nÓÒQð Î#I‹"ZµëÑ$OС7l_È'�í1È g“ÖÙ(Š3‘3€�z ¹áõ›Ç™ë7�ç<ÜÖZ[¤(é·³µ&Ÿ�Çôæ²ñ´ ÝAy%¹{ÂC @Ä­ØZ­ ÕÉ”Ë9[4ýAñð»÷.|vÕLs·DØÔV•Ï ÙeuÁGF#9Ø9¡ß èýf ¬¼—""&Òe0¤bŒÍíÕ'‡ý¹Léû—,ŸÑØýÙ[N^·yÅÑ÷/]>iL¯T`l·LÁ…‘ü®Ð=Ä€ŽcQ<ô;z5èU f³YÊfLîbYoNv Ð"OLÑ”ú9þš HǬ¤¯Ž£d�Ò%ÑW9TÔñÉê� ÜJ“q"ùà R„q–¢¢ËV¾ri Ç�,¬† J£ç1ÕR·M>5¨=�ÐQ~¦"Ž Û¤Ø éI…pþì/;+­; d(�5¯PM¶Ð>&è»o; 2î”›£åŸuHf3Â.ò9À„ÀÔÜ:®fî]M¢.­9‚êà�›hè&n€Ã2¹d5Zq˜ Ž“³ÑZ‰�rœ¨ ˆ#Z|¹Ål“êx Ê€ 8ó,��êù"ò.@¿nÁôãæ‚ÖKX‹ð^b+Q&S©uÁE֘Ǝ’Z§”m©³‹²'éÝ=9®tS ?9Á\¼q½Øå!Ž^ß W0xÙ*@�ÀÂ:`¢eЉQ]ž…‘£1 xASgÍ`17gÚnskß=š‡rÍ5|÷/�>¾ÇÏ)¥)¶wU5µÕN›Ø¶³½¶³gÂζ1[›k··ÔKÙÎÞŠŽÞŠ#çnßÝQùÚ;[» G°­«?ßÞ]’hi°�ªÉ—×2Àqö‡Bæ¼¥ºµïÔ¶BN%[{Mi*FÍíUuÕƒûÏj¹ï¹¹kÞ_*EùLiÚÄn=€¥©£ê¿{JGe¾˜ ;{rûP1ÚÝQÕÖYØÑZ3sRÇöÖê÷›ë’á¶·ÔÈíxát½p"J]õàÜ™-¿~îÚ�K%Ìg‹Ó&t%íã·4ÕÍhìj¨,%órŒ óÙX3ô§)™ ôú6µV÷eçíÙ*¦ C²P.áÁ”%ÙÕVÕ?”�7«ÅÔì?³Õåa®˜€Üs’’rkWaGkõ¬IÛ[k¶6×mÝ]·µ¹nûîÚb)ãçÄ®¶é#›ü 9¶ì�NsÇ^T•!ˆÜ(@[We¢QÛZ«ßo®}¿¹öýæºí-µJʶ”l}õм™­÷=¿ßÚ÷&Ä¥(—-MŸØ¥ZÄÑ–]u3»ÆÔ r®7B1@>§é‰C`SkUßPöÅy€y3Û‡£�mU)“·aØphobScæUÃCÃQ±ˆIªÊøí5iþ#Ù\XfϾÇeÓ¾ ý“F—мo‚//š´D÷Œ- 2Æž]§Bq€›�rdÆ�0î2NxcG³Ð@½\0iF*/uy É°‡M‚¯>– WWípL™e®ÏÕSý/C6OÑ´�«Oý(~b"Lâƒ'šâ}qÃü!¼"˜õ u…ı#¦SܾXü1*'Oà0êØ&wXn fðeúŠf÷,º þ™ Te©6¢šˆ*"ˆK04Dƒƒñðp’LËámî``¢Z5P˰.Eì-~ú¹|IK¿Ì’“ _##7Û‡�aN0 Íg«†e$fL'JD©¨}ˆìnä’DI½îÆ|1ÿÖÞegŒôTÊŒ*®�ίꥵÄ/¤ V2úâ ‘{ 1DŠöÆáI3P½É?l £òO6·W?õÊœ‹­ÍÜ�vfý&!Ãå(ðœBWuõWüño‡œvÔ†ÿ8ã¥ÙSÚœ1xú‘[/9yC.SêéÏîî¨Z0§éõ��»;+×m¿pÞŽÝ•Ýý9’΃AµŠ½ÏÔöÕ·ÝûÃÏ.‹"N¨ô³’¥VÌà¶:rÿ�—ŸöÆä±}ǰýŠÓßxîµé;Zks-•'¶yö”ÎY�_;oåÑó¶kp¸`ÎÎsŽygÏI��czŸ³«ºPlé,@g_Å=Kç�sì;_ý×Õ{MmŸÙØyÊá›.9y�N4N8ôýµ·ß}êá›´b`sGåÃËö½â´µg±±±¾÷Ô›®8}íc/ï½£µ*ÁrþÞÍŸ´nÒØÞcØvùéo¼°fÆŽÖꎾŠ%Kç�sìÛ_ùν÷hŸÑØqÊá›/>i}.K"Iˆ!¤uD@ýCÙÖΠ‡nÞsJçÌI�_=wåÂy;z‰à©{�¯ëûþeËÛw×Þ{´ðû‡ÏÙidß3�ÛÕZ}æÂwçLoŸØÐ;£± Àn¡ÕÕ æ²quE±�/&ÊÛÜYõð²9—Ÿºæô#766ôžº`Óå§­}ì{ïl«v¾g$h¬�Nœÿþš_ß}ê‚Mz‚»;«^¶ï§­9ýÈM� }§,جyX�hÍü½›/>yýäq½Ç¸íŠ3Ö½°fúÎÖêÎ^)¯‰�§,Ø|ñÉëóÙ’Žè ½˜�fæ£jˆ ÞjÇVGÛ™úiíE¤úšÁl†j 7¡¹l)“‰sÙ8©•–�á×þuõÞS;f6vžzø–KNÞ�·Ræ1D]÷e[: 'ºeö”ÎY“:¿~Þª£çíHZÇDO®˜=®®ÿ†Ë^:|ß]{Omÿø![ÌÙeðèÌïj©>káÆý¦·76ôÏhì6^ˆP_3”ËÆÕ ù¦Îª?/Û÷ßN[{Æ‘›úN]°ùßNã‘—÷ÚÙf�_K-´)# SGî+¦7vµtUö f[Ù:å2’útgò3ȔͶQNÉn,‹ w³G«””0ΩÂ0BdÛ»qšü†Œq6s“‹g 1,Õ4çf)˜I7©ˆf3 m„vÍÌF 5;ôTe+J ‰Wj°,ÇI_Év6ÓÓ5Ã_`V”,™7ªn[€§§zp“v1­“\›òa áFG­\ÔÄN�«¹��ÍPe–j3Tƒê ,P*ÑÐP<8�¤ÑWò½ãÆšTÝëÕÀ¾››{AŠF„¹oM·fý/s4b¢jÎ9AÀèGï¯j¯Œ"åвÈym�è]„ k§�C2æ0ÌUGÔágðüÉQj7-f=�p‡ü‚Ý¥²äz5$äbZ r›é¿¼1HIøJ„ÉÉùÄÉw(µG!bTXðY@ ÂÛŸ8ª§¯ðŸç¾8e\ç®Öºûž?ôwÏ“÷º.±'}‚pw./môèËtõT^rÊ+—.Z‰Hï75ÜóìÜÅÑæ]õ'ºeõ[‰pÕ[Sþýô7¶45K»bà«3'uŽoxåÍÉqì7–¡†ÒžáTU1Á?xؾÓÚ^¾õ¾R |qß›8¢Xžþìî;òŸyiùÿü¾­»rÉssï|zÞŒI]IÏ|¶ôog¬Ý{j{e~xkSÝÏžÿÜk3€øÛœŽîÂçÎzýÊ3_G¤M»êï]ºɆ4D¤L†µÄ„·>rHw>¡k{KÍ=Ïîÿ›'*ÅQ²HùèK³çLo}é¼ß•JÑŸ—ï}ÓýG —"øÃ‹s:z ÿqÖkWžù:F´igýïž›“â`p!Ê�–Œ·½ýùîûÈ÷.]þ÷[~×Ö]øÝóûßõŒ"^oâ¿Ý²è+ÿºò¡ëÎDñ-u?zàˆU09¹ÛÛŸýöÝÇ\ñKÏÜô‡LÿiÙ¾_ûõDz™ø¶/={òá[²Q ®ýäËWŸÿ�­»ë.¼ñŒ7?û‹GéÈ^û©—§OèÚÑZsϳó~óÔA¥RDYþš^�†®÷Ž‘21/Å xø©¸<¤}i¯9Ó[_:oe©„^¾ÏM÷/Ž£2òÊÉÔ�¯¹¨£xI*�îâyÈ-TU ÿêËK¾%ňð�O®¸æüW¶î®ûä §oiª½õóYtØ–ªÂ0"ºwÓþåµM».¹iÑ[Œ}Àb¸†a�( &/½êíÏýà¾#ð™——ÿô÷mÝ•KžßÏh/¼öÞÄ+n9髟Xõðõ�e2ñÖ–Ú›ï_°J»ªÞþÜ·î^ø�KþñÜMe2ñCËöþʯ>šÍÄ¿úòs§hä¯ûäŠkÏeëîºóo8í­­cn}äàžþÜu®˜1¡{{KÍ]ÏνýÉK%„CMd(ð!‚{ù|é =w¿õÁ˜îþ¼&ü³,e@^¡·r“mð_¬“:¸A‘À¬t› zµyÄõK©õ ¨”�³A<ÄðhÜCøÝÑ~w•uØ]`{hZ«©Œð>;äcXá±Ôî1?E�6E$ÉÍ@”É]&L¯,%<ò¤ ¨Ôy·Í‡m{Roga=Ü=qC»~Ý5€|6KÊ p–õ-­�ÄWëÕ#Rr0²­ÁB2Ѩ” Qn{LÕb9}¨Ã�¬Þv§×¡ #§ù «’#ä<ÉÐM-)·Ñƒ(eµÌïjå#eE~t8Ê[‘xü@Y ^c°j%Òn‰FÀHòÀCy³å�ìKÓÙ\ÉQÙ£ù}QóZG»5…ì¡Ðùæ‚eô£s“•I¥u4 Á8²'¸ÒË^FÍ5å‚}àˆÅyêTÃ9õàŸ¾“ÙaÆs}ª[š—¯�@”� n•bjë©^j1ïÝW#|ùœWÏ9ö�s¾{fSyBPJNñ%l’ÈS>¹È×dìÊÐH§ ½á<•pâûY]Q\rí“ë6�ÿî’…duÍÚ¦@Aª“Ocúw(¡ÙR•jeq"Vï�‰T+Nf�Áz?óD¾~Ià¡$�¤¡èÀha$«X—¾ß¦JuÅð’kŸZ·iüwï]hN,I%-VßMVEòøœ•�I«õ#D–-!ŒFS ÅÀ .½‹yéžfX?xÎÅ1X~Ô•l%Œˆð‡,\—)òã2ûNkàº'¿y×G’')5Eâ +ÃØÒ…vê{¨„w#›}2™zx26¦¸ œ3MKA —r]Ž!šãÖœ$ˆ1dÕÜXøÚóçÒ¤œSû†Dfuèª ‚„É›ÑPr'erŒÚù@‚jšø*_Øö ’“kwáìül€€ñ‡© O}‘ù7h˜DÆÂwœ·.Ü­»tøNÛv×®%¹a)aŽÇãR‘â˜â8Ï7Vì=’aŽg ~´w »'ß(#FæÀn¥Å6Õñ;±Ôq÷F®~Æ€,š|' Häž0md\CêÈü t!:R 9Y¸Œj`©?®:Éf ±ãwx”-ƒ�,)^šÁHü—|`" O¡€0«{©PÔ— l “´W¢Æ1=¿¿nÉÔ �þˆ;Ûê>uç··Ô[œì fÜ2>ƒÐPSÝÞÝKÜtƒ”X\QGÀ\¦tàìÝ�¯˜ÝÜ^m(JãIB»å´ uQb´ÞÜ=`· ¸;æöÆÄN3A8$æì‚0TÒÙ‹ `B¸%Þjæäq½OÞðÇä0†S¶·ÔžvÝ'>h®M䇖4Ã[N“Q4E±Íz�B™ÍJkö!1.‘4£Í$X›¢¢íâQP�Lð#?oöM…ݱú»“Çõ>uãC3»ýa’ï¶lm®e.K½RÍ$XÇ9¹EÌ7­-j¨@SÊ¢qÊ7Îþ ¹V�€I?A£VZ2¨šì™¬ˆË”0»Óî2L,H«$ùÑ9Ǽ»­¥vÙº©6Šy/NH`h5¥9˜ø"­Ç®ƒFðdah–±>fS^íQÞDaìÒ¥Z×E„ã„b�,*˜dp×Ëî⯽dLQÒ4{n|NËtx´õ‹ÅǹèÙ²™¢k/ÈõßÌæˆi°ÇåGVÑìp2 éDÅž‚2þ•s,-!Á�‘¶^¢ÀYØ@‰%Ó@âu>ýâ8MßSZßÈ&µN{KI&†ð=2¿åC ŽÉ‘´Ê˜4ä�–)d§›²@DdÝ“^Ks>ó"OåŸZ:«.ûñ'óÙaWÜÃÅlS›û’ZN™^MDÌe ¡º²½·Ÿ[!'޸Р¯†‹Ñ¥?Z”¦p>‹Ä�¼ ÓÜ»š ƒ;7C&WK3°9ýV~ÐÆÀŽ”�§¸u~<šž£×ÝvwT~â{‹+²%Á¡b6y±´^ÕáÖ¶3?‘õ5•ÉÐÖ|ޥث[W÷�#3g°ÕQe`þÉG)Ë>i5f®c5Â,Ž•1a�ØîŽÊO|wq>[½ëmî 3;õqmIHÄxÁÑsuú°Îolî¨<绋+rE£7†“CÅÌÎÖ*˜øò±¼Žþñ½„ 1NºÌt Í–†š†í¹û´#6]{Ç1]} fBJ�ô‹ÖÜâ{Xóø¡¥ß8VfN ÆÒ‚,H骜¦gý¦^³ÀžõµFIQ\QJòiy'±DÑÜe%qrjl|·©•¯ífƒB®Z^¢äa2÷ÌF(®}@îATÛÄ�+0™ßÞÂ=XKØ<;j›ò—$Ø� dÓý€«ažòŠv–jǺªê£rˆùì+³b‚¸D¥’öšÉ þˆ*p¦ƒy>Sôóƒ‘Q5q õ/ë苽lW‹-�©#¶´²‘¬éÍFÛ€Ô ¦…½åÇÁ2\à¼JÅitô;Ž…! "®ª µoê@4 ‡RpqÔe½;°mæj¤ï—Ä„Åm&R¬4 $ïe úc&z¡NÏÎd+�6më€-ýYBˆ¬i'z¥?$à ´ÝKqfKÓ˜tꂎDð’'ìI\Ëg³õU•�}}�ȇ׌°FªÏí †uì'sääß–)Rå5�züÎþ¨e‡ðÅ!vK+Ÿ| tÂAüši9K°qG=CÚ�c¾[õjÓý©¼¡ù%Tt*à›C ˜Ã#üfH¹Ò?y·˜n˜x |UÂJŒôè¶–‹¥hãŽzE_;Ô[gîŸBº1bŒò»24Ò‹ Ô5 DHÖ³e(ÃŽ#I À«w«@Tr5k_Ï5'|äªó%(Og䊢~©„YUïÏQ;(ŒLbxzŸ¦™¤_š—wlZ0ÇMm®ÄR–°Ëd,îË!ÄL�žkòŽøQþ%ÇŸã°H\ ªÆþ»«½�Të”\;('‹ò¬•8” Ý†´NÅ8û¯L·A¯DŒ˜ °êðOrB9;(eŒ€Í¸Ü#Ì e#¬H^�´Žãä¥Ñ,AâF‰^T²”Jòy2`lŽ�Ï}XÐ\]2}^Œ®”ïä˜Éÿj ÄQIVmxÜHÃÓÉÇ $ܻƛ{ðÒîjØI»è§7v“ý"ò¥!˜÷óð5%Õ " –m6"ôXÆP1êéŒéCå0bµ-Íæ‹¥YG“IÀ…¶îO=ø–äü´ïhMp!ynÔ`ÈQåL2E.sˆ=E½¸„Ð70Ô=à>šcA¨ù–qÖk»Î)ÕÿýŸ ²x�FgÂçØ×(@–kRs”ƒ¨J£ŒÎŠ‹]Ì3Øóà�q�AËXœ—g„ZñØëŽê¶ ³Á9œVþ@ÎÀc [Ä"GF‚ ÞbW0Ê�æ¶Ïóo�‘×%¸$ŸbÝ<$r¨ÿ ŸíFg찹Ň€§0qP—7rFá�aá„´Á*3!†2ë1É«Q4[›ÓL1œö¡nIãYŒùQf(ÎôYj\Ý áf�“sž¿§”uÌtI0§©ˆáË sŠÅ@R>Ìÿ™Óá\:’Y@zÚaÈ.•(Žã¸Ä_<2ŠÀÅ']dxb‰2IT‚;e߈­%V+ ?ùPEn½¢7n˜@ï£é IDATÛ[ j¡zUžks‚œm¤" ;ÎVq­ý�1[f®lG‚cRÆ…º”Œ2Q1нãbÌÐiÃ7ô¿”£‡‹AÜAß+Šæ ÿbœ›6Š ÀK ¤_å*M6?0„ª«5úeI‰�0‹.žÆˆÌS©!˜òÜ‘ä¼Ìœ½6ÈÙ´DΆõãô&3®)TÄ1 ‘fªEÎ|wÍX¸^®ÖݼãÏ®¥8]NGËh09ÿ²ÞQ$±b� Ó�œ�øLtù⮑sÃÊèD{YǯGkØÎ (W"5³øK§ì-ÝkI‚–¨ë²$â©ÑŽ�p=+<öòäʬ¼™fÌ*­±øðØ�‹„Ü…çýŒš›AX³CˆS”“SfÙn¤ãO*•i™ÝyO‘È“£ÌqkÖ‡±'6Àkì»a–M æ‘nOšĺ�”±dŒ Åtß:dw,Ó8�:ùJyÊ &ç¸Ç·ó4vHÂÐË�•£�­#û¦ó”3€Í’k$ï¼FÃêŠošÂá £6H>)Ö-dXç®#@€c‰1A ©c¹z¡:d5IÍnFrcÔü!Kß5YP†hQç x®�€ùó~š>ù„!Ùo‚¥`T>˜tK pÏ�HòeoÕÞü¶šÎb½2ê4Ì?‘âôwŽ“ƒP½SéH–ß׎•»•BH†ÿë;Ž2¾•a\¯6�bD®�FÞ‰hÛt{ä©ìš=˜cÖÀ~–G‡¤ì‚ \ qg¯-ÀîÜõÙ ôe.áû�Þþ®E»Z½èÊ+q¶ üÕ_'!ã ¨¤M3yªžøM'€šuG.$Ô^�æô""@}U!ŸËòpHöi@û]h°É´D_À¨y…ܦ£óX¶-2zQöo&9½ÑÒ©„¦ùl/F� {RĈ¥lg½'VH“ Ê"œW/\¸ƒñ3Ü^½QÓ×h<°ùéx�&”†È-›Dd€0‡IW’ì¨þ£%Ö–¥ãfj«ø¯y®HæN›+ÃHa:jŽ‹B�ÒaK¯!¯Fz¸`pñù\ÍC¸š´8'UàÌo~ËMŠñâ`fôh ¢ ¿ Õ’aü2 ò(?£¸B¼ÀÃ] [ƒâø¤«¤…C,é´�µæñAÊfH¾A׎Îí2qµü�œnq¶P4DqJǘoÈ^.b$JΔÖÅEÆ>“©èT8”“ˆ(k’Œ=™¹%ùU69¨Ía}«"È" ‹44ÆÅaµm¬)‹½GW”/‘ñ×ÐG,Уö¯õÊ1ë WëüdÄr ›â¯ì$6Æ™èû� ¿KÓ”]¿@{�fÆMå�EÇÀà€ÃžNk㯃̇ #©¸Ä›5I°’JÃÄê£æó((Ïq•¨$·™#,TN+š(ég"¾†¶\0Ÿ‘ÔŸr!0É‘“&QD&|Û 4ÈBžÈÁ‰TPKצwf·PÏS�Œ˜÷ª*ó™ ÃÁ· Ïà•´4Œ3_/´x8ïˆu ©§9»¢<”~þ‰ç¸žÓbÔ”=Rq©Cý‚ Mì-;AIúüH½� CÝ@fT¦Þ¾ë·<ŠÜ¯håE`ÇQ�Å0îÅÊ®¸ç9<9¢÷Ÿ Mê˜íÈEƒ¼@ÓHŘJºdÓ+<„öxAËydæ´‚[Îð€Gc4™ûÏâ'&{BÉ{^ÒC1ß(³’$�Ñߌ`3 Ÿ‘TüØ[Ý0Î�>Nžk‘ õ>¶‘‡b˜êƘò’A5š²J.^3®n–f+NF+ˆ%ûÓϳl€p­5°áf–ýÈÌ‚À>aª T#’ ÞVqñ j‘i#èå£$XxŒãŽ@©C@ã‡�Í`UërX›�JÄ Ä%.Òà Æ¥"űñ!Ö;›I¸Ÿy¦ƒ¹>Y–`âR*ù]”Ì0¢4¢­žuD¬ÐmjTü@®3"ìQ4"*A…ŸÀaF.Oî¤|Íö¥hC`gD(`Y{tÿ~˜Bο f’}È#XNDÛfì8%×Þ_ eMša9킬wŒÄ®³ÎB"Y˜¹¥tg*sÑÇ–¤“P,H¦Áæ 8ÔG ˜öG€‘ÊÀa»ÐfÛ/ÉyˆˆÍ•ÙÆœBγ)íÇ„®±Jâa#bu¬¡º*›‰ÔÜž‰–¹l¦·Ê,ígŸ8;™g Ó‰΃Y.)�"§"¨ð_±8/€bT“ÀÛh!f¢Ü,ý¡FFxoÓ1“!³d…Œp÷šÀ1²c9ï¬X³aȲ§·2uG�“¨doû3åʸakI:߇r²ù-·}1C…q¿¡Ò®ìt¾4D^Cºd½î‹’\áC}õá³8s:ÐðMDÒ”‚’¾<ÐCÒÓõ�¯H‰Ù:��*!%ù¥Š�2™öˆ¡ç û�™R$€#û¯ðy…q^Ö°£Í! ƪÁ¾.ÅIX®hÏ`Ѱµ¹˜…lãK@¿Z¼ØÃ»ƒ¶0§ùth÷„¬?wõ¨"OÉú‚@¾Ì ò>Q“lròoJЊᖷ©>— Ì÷– 4Äó¬ÊA]j#¨ˆ0"‚RLÃC48@CCT*’új¦Ðl ŸÄ`‚ŽÐOæF,w}oÁ‰G°NÈWð´0gÚ¤©º+´ fz•D�))c• ŒŽõ y7•ëö±ÁÈ ¼%:^QpR_0ãuþŽXP\:Ù€I|PxP§/'U’©”Ç¥¼ktFº|ò*yœ¤°˜$ì  ‰‘Y­a4j_ÆÐ"ëlžâ¬ª%4j¤>ÅA€ÀØkŽHº"ôˆ!“ Z'c•Ý83›²éé81•‘¯ŽæZÄõ™¯(�>¦º:EfL¹¼®�!Çä社ۀN†m›•Ñ�´¥ÖrÊŽ{ ]v©×Hb îp®AzœuaÃñžÎN…ÁHýkתeT4²–aod4Œ¸>¥FƒmgÂ�ÄÍ´ 0Âñú¢§C‹ü Å/Ìæ`°‹Yà‹lþ ¾×4z�ü—•·Tþ:\Q¶˜,Í`ä¸-'–Æ );"Äñ6Ò‹›—§:‹¸Iب]�É­ƒÅ(”Q)²È‹59¨ËBurÅ%Œââ”JdA ,P1Œ /JêÎäÓt’É�àŽ!^¼gìÉwsjYMƒ0XÛ){øÓ]ý0å�  Ž*G„|A‡á ›kçì ž˜DL%²ÿŒÔœà%qú¿‰¯Ò|ÚUUÛr¤A51!¯ �J€�)¨‘7¸ÓWøu9‰r.Dq7娳ÎŒ”[ É™˜>z6b|”^ÖÐÎÍ…(3»ñ䶨'Bç µ¢»²¢xûWœ9©uå[3µ^i%±È™ÇŠÄS,æ¡ ÝÖ±~ÿ#Á>Åùlvp¸è®%[ÀÀSO.®e6õNj¸Þˆ,×âf9EòïP3#A„˜”ðˆ9;ŸºñOƒCÙ5'ú‰@pÐÿ/F)Á¹’Õ릶‰NQÇKÇOØÇ¥4ÝÖ¾}ÈýÎȽë°|PÜ0Éó1ä~ÔÆ6©°ZsäÈÜ{z¾Õê ZÁÈo”}BYGÇ�ûÍÐ…ŸæÅÀUwŒ ìl{#:†Q ¢ÊYj±úëxL_ÞF¬êˆ‹˜ÔL žZB-QeJXæ¶íë….Ä0ó…Ctí)±Í�‹ûaåÏи|¹9ào™sbD£×(ðÍp{¶¥®¯£ [Æ$lÁDõ¶ÓNû“^X±Âä+È9  Ýì%?B&ƒ¬ÊFUÙ2ˆQLT*A±HÅaŠã°§ãÚÖ M›4µÒ]ÓS(ôbÈvѯaÎÀÙqµÛ;ÆÅŽÞèB(þ_z30Âq§·I+Éz£F(ïê$Ð>1`Ö/=PAzÐÞ±Ü åibÇ$%eã#KÕ}ty‚œ §ÚyÁNêø~(%�³~_0oOðý(Ûe$¥qö‰æ a´}B,f$xvä¬È‡ˆôMÓb �i"]}Á_ïúúýãë{îúúýWò…зƜ8çN,ƒ§äðª^¿ÆNV´�ŠG¬Ác¶ºÈf¢†ª*a³Šl}�妞ˆ†edúØ'^-%ÎEöž�ò%Å;z /䇸æ�¸ÁÝM ÞþÜæ� ­]™Ó¤À×-,!„o_ôò#ß{¸±¡ïÁï£ˆÉ ¡’Ÿ¤„Æù6§èÙ’ºEŸkTJ�cÌÇŒoWeýûã_¿ØôR|&Ðëðž!§V!‚ŽîBwE÷@®»7ßÑS!#9ÿ‚FGÆ “qŠg89´Y�¶8kæ$ÿò¤\^‡Ü51LÒ ÇÓÃ9_ìOsËF.”lï§�9Ù¿iˆ"¿b8ËÅ\…ܾ€S‹ƒu0¤2÷àÀL¼FUd+]2b6�ÛÒ£Rû6ÖH¼ò�éÊÊ0ÈàiߊæÙ4ÖO¿€ÙûÂèh“2DàŽC ð!Â?L0‰ß³ð 0® Ì€¾™8$ÒŸ ˜Vþ,¿]ƒföáº'© fÑMû#DzgÊMg¦:)§g½UÊÇF�¶}וF´Gá|Çgv”[TûŒ²P…Š«=RI eža Âš´–d"ÈE˜EÈ™žDÇ—â8vÐu:Zxžq1žØ ÅÙ¬YBhï®ìê- 3]½…öîJ�(à˜Ú¾›>ûÄñóß-•2�ýcîÏ>¦«¯Ó'´áìåGí·eL]ÿîŽê?/?ð·OÙ7”#‚l¦tîGßøÔ «§OìèÌ­Ý4ùæû>þÞÎqeJ‹{çÒSVîµÇîîÞŠG^>àöÇ�ìî/ ‹·`v]U|ù©ëþõ£oL›Ð½uwí’g÷¿ãéyC™êBñÞo<½æÝ ³&wµÿNDzdù^7Ýx{w% d¢ø¬�l¼rñšý¦µvôVüá…9·üi~Wo¾ºP\ríÓÿØ0eæäÎãØV[5ôÒú=®»cáûÍõJ�ØÆ1gô¬I�W_°òØ·�«ëon¯¾ï¯s~ö§ù}ƒjZ2Ÿ]_>çµ£æî¨. oÜÑpÃ}G>½rÖ~3ZnÿÏç÷šÜQ‘/þÏ•Íÿså qŒ?ýóüüî(@¸ö‚_>çµl&ŽcüæÝGßöØA&T†/[´îÓ'þsÚ„îZêîyvî�Ï00”­.ï¹æÉ¦ÌœÔyìÛj«‡^Z¿Ç·î\¸¥©!A²­»²«7?4œéè-´v6¡®ÿί?{í§V~þgÇk4ô¼¹”zrË×Mýù#7µU´WË/[ÖÞ]øÕã"À~Ó[îüê³ë·L¸äæE-]UûÍhݼ«ÞÝ6æß9cÒ¸¾;¿úÌ=Kç=ôâ>€ÐÝ—Kàßøû#oþÂٓ;—\ó—LÑUg¿vþGßüÖ]Ǭz{Òáûîúþ¥Ëêk†n~`Eÿ~Æšk{ìU¿<~B]ÿ�_{æš V}þÖã‹¥ lÙU[]˜nØï²»£êÞç÷KªŸµúäö<»9ŠÎ\¸±o0ûµ_·£µ ßÚ:6Á¾XÊ4uTB±uôäw´V;ä•JQ{w¡Xâ�„Ò¤1}‹¾÷ë'~|ÅžøøŠ=§Nìºô¤ ÷.�› ÿê;“_±W\ŠvµWÿõõ‹Xä—¯Ÿº|ýT¸ãéƒê£UeT•┆Ñî4Ó¼ú?CV+á8Öžê+�Ÿdâœpê¤396‚ãFUB�ÞÍaF�¼kß¹–§9Š—”ö”úÃïåQ‚Æ©� :H²ŸW$¿ !âºLÒ*6É�ŠÞ¸b”$ºšýy•ØVFƒƒÒt¤(…ëÈÇ-.?ýô“ _†Á¨ðÄäv”&[;žŒfwG!°’C®,•Ydr%˜ØÐS™^¿e¼i·~ó„ʊ⤱½ ò[šk‡3IÇ�¡(ÅQ yL¤iwõ˜zöõåN3ñì‰k?ùX¦‹³BØ63Œ¤µ‹§ÝE¨¸ÍCZˆø2Nßw ax£Ë:ׯÿ%¼»o~hôA=¢Ic0VNƱk%QÁŠÐ!ÍÌ‘äyá ôÐŽ ;&äîÍ[“5ÈÕaÁi²‘[PBžÿTˆS-Št^ …¦©°HˆÄÑ|aq(,Y†Q(ìØ\Õ-ÿ¼Ø¢ð¤»JB §%ú9™?A?¨å6¢p¹Ê-Z0uÚ©¤Ñæh‡‘‘=ûªÿ·»¶†n•ÓÛTÍâÌüŽ6ósÉfÕ:y.+Ž¡T’¦g´~.Aì#^)-§Õ=£hdp Eêñ6 Èc†ƒ�´âSf9“5�¦Yç$±VGXQ{�ÅH[ƒWÒÎ:»�½×¼Š›i>PkVúý`1ÚÀ‚TÐþÌø  äp­Ö2$i®–ñði…«�Vmf‰f¤j`Øû�È^”AI{'>·/V(û%î£ ;ưM3:È)*ñÑí£5I…êlœ¦kZò Œ÷ˆŸ8(hκ�ݱ–$ Ј_q"—‰¯=ÿ¯Ó;ÿó¶³ÞÜ:!¦èÚ þ2¡¡'Án¸ýêñ£úû�Ÿ8níw.~vksÃ5¿9}gk”(úÉ>öš½@­_`)Æ–Žjëôå6"Ä$ §®ª�|:ÑàžÏ– Þ™ŒÚ¿ ‚8ÆïÜó‘gVÏ4DÅ„MmUù\ ÃÅÈÿü9›'ä³ñ.]>cR÷gròºÍãˆðû—¾4il/ª¸é%=X€Ñ € ü‚Cr±˜ 3ÁÉïí(hFºE 5\ÈýË P�äzë´t®§LAû’è¾<Ò�f(_q7¼‹p{=øu§€õ½Dfr°VáoŽØº-5áÖ±{¸pßi¤Fl6�쯪³ß•à A:±äU’ÛÝ~ Æ=¶—Í[ dÚŠZæþҔǺHæÌQß œ¥Çu¦#9›@çG À,– £ùÓ1šŒ8O™�Ù×Ð91›'CÄr”Ò ¨5L’D¡AÏ‚Œ�…h18k'¦C»x0QÕ�RZJÍŸZ'®²l^‹Ùx@UE\Ìf·cùˆ™(ÊE�‹¢,OHJŘbŒc Ä8" 𓎴ÃÉU¡¦Z>ná^H´Ô=´¬µ³ñòÅ÷IîàRç]ÿ/Vÿ䈆V?{.-ÝáF_�a5ÊîÌ }§†¤ßž«å(|®œÀ Ys qofËàp´³Í=.âq @lr‡Ëˆ>6:·>inKìXŽÜyõ  é€/˜™xIRƒÓßõMVÒ�æHˆÖ93Méü!‰M¹ð5ŠÂýƒªŒ,|R p_éÈZ9:dê4!!�.éž sGŠÝ¤ÿK¤«m¶’³zäpYF@Ý/€z9ÜLË R¡FäÞ{(ÄO3¨¿¿(Jq!äPÜql²í¬m –rÜËsè Ij¦˜k ø¸úÀÐpVŽ“Ëd=E§ åòŸt["�€#0[]�\‚ønÝ×ÄÏ9>œ-üz‹Lo1Ÿ�jò™ú|¦.‹•Q”Â8†b‘ih .¡¤“i²}ÂBïõmÔÒwtÅ1D?§4‡ü…P&æíÕ–9ú{fK~!œ%›g¸·B¨Ø*­½Bw4¡ÖÛ�Êa2vÉ ~ô%”?„KÐuqŸeäÅ^Qî‡D!Li¦9á=› ²çÿ± Z´FkÑŠKµ0 Ü+!ëo׌¢°âDmЋ°Ä´ˆ5æ,OBŒêÅ"J"ÈY×µhªdŽX0H@⤑ÎgUêKªˆ þ¢½í#ÁŸ#' ™OëØg#ºï¶OŸðêĆž�ÌÝúé“^ýÛÚY»Újs­]UÇôÞÌÆöÿWÛµÇÜvõ™}Îù„RÞ­ÒR E j¤€€"ŠPÔà`L !@b E£b‚$¢¦�@�Ál‚ª7Åà«–T°Ð–^.·½ÏÞïìñ�½æ=kŸsï-+íw÷Ù{=ffÍüfözí‹zèõ/ýµ�ÿ¦ÔôÔËîxѵÿqÉEß{èG®ºüŽý{N¼wÜ{|çß½êE?öï¯û™›èß}Ì…‡žsÕ­?ÿ“_Y-G`Œ}Ö“oûÜŸüÙsžz«ppÏáÝxË•¯zî�ë®þ¯ Ï?òSWßúêë¾ü÷žð�ÃçN®¾üî×<ÿk�xð‘g=éŽ×¾øß>ó•‹¿upÿá£;ïûô•?ûìÿ~ãÏ}ùq�>ôƒ?üÓ×ÜþËÏûš j³^« N›1mßž8¹¼çðÞç>íöKyïc~ï_qàÇä[,(ø»[.}ÈùÇ÷×n~Úßyùc¾÷œ«¾ñô+¾-õ=±ºóàþ—<ó¶+.þîE?pì’‡Ýg±ï¼�\.蜽»{vv§›wÞÿÑ/\þë/ü×_{ÛÃ.8öÂkn틾úñ/^Æñt¼‚ 0ä ß Þrª¢ýí¹4½[¯è•soØl1£Ù*íÛjppz?+Ö#{ @Ã�ÅÉž ævkPa‚ìÆit=Åç’¡\‘ZEYáÅŠLeÈ�…ç“õ|ÆHœê¿ ûX!R‡" Ñ!R‰/H¹çâÍQ£2»Ž.�6á†çšýŽ.­Öoº"¸@±‰§AˆãNrøNÄÜ¥:@ÃgêÐ/·Î&%Eð¾01'I7:\㜸v3û#O{àÐôxäR÷8gˆÅeE. °XàÞÕâ¼�å«ÅþŰƒ8Àz=}|}ÿýãînsÔ–:¹¶Áxù Î ó¥ÚÞör%25“G3ô”‰�Ñ#pofñøN¶¤ƒ Ë�kC=¤Ë@®Z>·…ôQaI.-Bq_‘u 4Î0Ü1^ì>Ä a?̈sÈæì¿ÉD^}æµUžÌMA¾^ép³X´Ç…H%-·×,dϤÿëØŠ2�Ø©;­ ™[�=ëTÔ�‡9¤˜Qg‚|·fìLƒ6íàÄ)™äcKÛK^ƒ¦`;ý‘Zˆð=ŸxÆ¥�:xã;þr‡�ß|å»?ö»ã°{rñΞõæW~ö“¿wý¡#ûþæsOþà?\õ苾7aÂj¹~õó<ö÷íÙý¿»Ï¿þÆýüW/›dññ›Ÿxïѽ¯yÁ?ÿÊ  ÒÿÞuÁG>÷”5qÏ#Ò° H8Žpý�×9±úÍ—þQ¾ëà¹þÌSþú¦«ÏÛ»<±{>ö…K¯¸øà—Þ}`=âßþããÞñÁk¦“.>ôÙ+Ý·÷u/ýÊë_ò/ˆôõoŸÿþ›ž°&\É©à§#'–¿ó�kßþ«_¼ù]üî}ûÞÓãÿêSO¼äá‡'™}ùÖ‡¾ö�×½áå>ú¶O,ã7¾sÞïèé�_ýö{Ÿù¶_úÒMpÃb1ÞðùËßðžg/ãŸÿÖMÏúíËaD„·¼ò–7½âŸ¾ñ�ó~áí/üÏo>øO?vÕ‘ã«·üâ-—\tï÷œóÞO_ùŸ|Òz�°ª©öú¡Ê€¦k½¦6ôШxd�ÇZK)HgiºŠÖÑML+m[Ùu¿²ÊgÑ”?ÅM SB:ëÙ!QõŽ ÐßïÉiÃ}Ú”™ô°ž–}2xc€�ojcp/ÞÛ3ÊšÑY‡mrB…£•§*Ou1îìòi–�/L´GTFi1 úb Š…xCƼÆ6Û“ÏY[_å54•ª7‰@<¹¼ÍDuXÇN_ÃFÌ'ÁeÆíùÚÆ.˜4=]Ï�²ã/õµ#—1k—)Xˆ‚=&§-ë?*×¼*Zß©‘Úq~®®›¸¬š›�¾W‹a5 +þ &�´i\S¡|M�lÖ‚–‘WûYÆèï §˜L¿r‹Vo+9pÜšã¸MÎ�¸&”PÁ·šŠ�aDNÂ/ßàûÙ¶â«ðB,ºÖ­ovF½)ÙRZœjU°ÐmP£ÂÙ•‹¯Íc†D0.l^=]ñÙúÐ,Wm[ò îÙö€:\å e¹}~d†°Ü{bPv |]UfPùœÇ^üÁòUßÃb âM›q~l[W¾„å!Q„×=é�ÿgqç€ S4·. '#+E{~Tîëm¶N$BA£e2ÏÝORÈ·W´9ØYÝÿ®ßøÈW¿þ�·¾ï-Î&•k�-wÆdÌT)Éz51–gùþ<绥Ţï¡Ïc.Yø8H·êL[¦€’§U°àƺ±{Mö‡¥€Ô�h�Öql¢1ࡽ I¶g%3©‘]¬3=»ý¾$£ŠVŒÚ¾¡³£ZüZà¤â¦ ´𙶤,âĸ³Æ)'KÞ SœÃ¶”'âà“o»“$ÊŸšÐ­– Ñ"a;ﵸQ0e§õxãò »ŽqA@þJ@¶h[1y‡_Öß[áKkº€¹³K$¯‰À%¾(|¦œT0¾ šû(¶bIös4Í-Ëh;€ÆÐ¸´Ê7®Ç‘`\»˜�ˆp?4š3xÞ\Î�Ù`§=G¯¨öŒQV›ŸÑæ ˆ™4ƒG=œ-Tó ’Á†ï—b>òý—5ߨoÄ‘ÐõîNžt(…öy€<�¥d�y¥éŽƒä†…a•³ÏúÂiº‘ %ƒïôV>±Óq ¹HÍ—ï“ÆLÉw¸·¤‘`Ñ`S6šU&ýÓn¸ï±T 1s[Õλ–eL m3r€-sšgjw1àj1LSâ£4Ò£ySzä…Ç>õŽ.yØ}ùÑ÷œóü7¿ì›wŸË鹄Ӹ"Æ8€{¹§!ºS¨Î^orIy¤n§ÚĆñjËðd>maõ¦Eja‹©ÈÛ¬�§‘Þ7 Š®ÙC@$œ°ejeŽÑ_§&ä÷„4£w1žIdè}j«ÅLþrPЧ´°cËD܂Պ¡§îMhXÊÆÅ“$_åj¥‰×3V>ùƒ2¦²É‘’¼ÝË4´Ä.:–KLrزV%2—¡K�cžÕ\&§êý˜ƒõÈȰ2ȸ‡p×¶ Ê(§ÓÕ/çE·°TlM²èˆ÷¿r•SÆ^§Š®ÿctë»kÓŽ�²Œ~ RÞUgäFÜ&\à°Z ;N[í'!ÒzMãHãè¦E„{�Öž±¸¤)?uçS‘YïØš§Æy»�b&�F¨Uø¹cÎ=± Ä ²È©Ç0žÏ<5l8;÷¾Ñ¦Ù&7 >$ >éO––£ž/0ÃuOKêg¡…9-pQÓ˜B› edF³![Þìhæ+CeÈâƒ"' j|¬h `G6«Ôqef•T<ÊÌ{[2ÀÒ艠H–†(ÖÂà,à;:Ѝèn”±zÙm <ÄK,ú q'ŸÆ1wõ⨧Å+ˆ¸gµ´½wÆé®C{_öÖ—ì¬vó£SëÅ�yí²J²™x#œï0¡¬AÓ9âÉ"šG ÜÈ\ë‹ì�"ˆÍä4h’"j^ê—ÁHƒŽj÷�[‘<Ö¼L{`;­=R¬Ú·!‡ÁM”+àAY�¯a#d–°Lã·¹ú»¤ícš´n:'¯ÓÒ«`VªNýY¨�¢ˆ C ¦ƒÐ,Dˆ"IÔÆŠÔFÀVŠÏPbœ1;GBûdj¹x3’̨J›q@´/dJ4]ž6/ŽKX ~ׇ ¸óðº:,ÙFJaœPŽ1ÖÙSù�Á4âµÍ V©4¼¯Pèfþ–jLŒ˜2Æ"uâ0ì,†Õ0ì ŸxŠã8ÅÐD£Ô-¦d½R õMÉP.:o^¼”jh�ˆ]mîÛÀ×€æ/øJJ�PŸ…lÛë#º’�¸@=ôÙ 91°:ëÌ0‰£È3ŠÖY$ÒfmÖ|$ƒôÍøXJH…Šfó™>ïh[GYƒª‡g�ˆÿÙü‚lnèw‘@ayª^ͤb‘ä�9V!ÅhÐÅ™H4Ê׬§ÖåïúÍ\¬ËŸ œ‚©úK»*CMjé»­§ØšáÉhïL¹ëjXÐf¤ˆ�ЮÔ$ÉêI(ð§E¨°@¼àAûÝwTåºA–uZ¯‡Û¾u>sÜ/áœA`YNŸ|7q×ðq1ÿ" x÷-zE^ÓbÊ&À ! §59 ¶¢1`|ujÐôeH~ïڴ„J+1˜fbô5ÃL‹£è,qc0½àeZ¤N#K^¯÷­Êhµg#‡T üÓàÁÐãÝ ùAæ.qqý"…&ªf¸K¤èÓ¦'ÓS`ZÆnáÜÉö$_•©9eG§y©lk§��ÜÙ̬ÃB=ÿÓ" 9ò pkÎ à'mÓÌLðR2×@ú%:)£â¶§di„%`FG!ºoQ±ÖN#­œgë³aPÃg¡¦Ñ–ëW� ˆµš—±×íÉÍ‹d¢2ÊBž gq:€ÙÃɱ¹qñÚð†�Ű3 KYí ÄaôZ°’±2$Óºãˆô:.´Vé«�R¨òDgZtÅ ;s@Ï‘èTr‡aÎD]LMo¥ÐÉR]Ško[FtwDÌܵ™3N†7«}I‚,½ldÔ‹\�¯Ó�É�y÷if|\a±ìÊšÙi$tÿøšlÆ�QŽu{b-þ½A^_í¶Šž*òñ�2´§çå“7[Ò?I: èãä�3Àp‡“ÙiÒ†~‘ñ¹Oü£ÛVw!.’&tm«»†I±4QÖ5nÊyñÐ{n\³òÏÓ?'Oí>vÜ[§²–š�\ #ßäw¯GSüÁ¶'vLâ3ƒ¦Tl“J;r5rAvÄ"¬vÂÈ·ƒ?3Ôíù6ÉŽFÇWC׺}M’IFq ” �hù÷l«”éH~ N%Þ”5¯¿Tojq?ÐÆ¤.= #oõRª�ÿ…¢‹ä¥¢íGe¡šææfq¦ÈUGªú¼÷o†G¹5J×VãÓªCæ�¤Š ã›ÒËCÉN7·sGLÜ&È-Z‡©(;Á‹„ÌEU=“Q²àÍL_ã#¢Jf¬ÝŽ‹(¸+;¢ç5�žk™R}ëº$29¼›3p"®«?ËDA`É?“"p_û!§vßGÒ],©§”lêñdõ•rÔÇv½Y¾v1M†Ò:Êû.EøÖK”?¡%´�²PVY1ùe=5)迳åQò30wšéL+CF§xPÔN.<¨­+ÛLw(ä¿= cm3}�²¾ ±V’+v+ !Cofy$ÙäfÍ=om2l›Í¢Ç u¿LCK§“òpdoº ö˃Ê.#S1%wP;6mhšãFž·'á�®ÖjÉäŸra»MªÊd8¨Ù¿wg8vâ$ðÛŒÅPKv^Þ¹#!¬Ô¿y¥—H@puêbÚÄ‚¡D' Ìx°g9 ¯SQCªuºWZ­!Mh«em¼;­lLçøÌî:ðí:ò–(e+¸Üí š*Z¬úåœ`ä˜ÿB’2¥J*¼gA†Ü•õ¾Sc/ÐN!‚Ê4z)Á]´öU*“É0ݪ¸àƒYy‚·i–LÓŽ<ò¬9-UUHÖÕ0†Ü|×OÔ¨IÓ¾ ‚äáä� ά5“‹ƒm«L䉮`#û†Àí¨Tæ–´Ҁゆu|­YàNŸRÚÞÁ„W�›»•Nyr�»œ„Ôfá\IºÓ3’7riaÀåb±3ýg‹Œã8Žã„8ÿ ‰Yì2L9ìܺ€$1Ëäf›·ãÙ¦rÙ–‹¡’€9¬„”9ßõ(ð< ´+‹U*Ä!•˜ÚÈ28`7"—É?Mú´mÁ-Ò< JJ}ÎR¶ï€,•¼‹°–�@ÞéE»"~¤©› ¤ÍqàäSjñ6© ‰Í‚i©Ì °7œ‚_V!´Ê嘖Œê0tM{ _C¥ dëj“ vЛܝRË=ë¹ëu~±ÙÚrX;zD!ˆ5ÉË+Iª-¥1è<àÏ@DRµ1œ³gg$:~ò~ C&÷¤ÑAöS]ûÉ�”QíÉpôˆ=Ð…O–ŒÔ˜x)vá/šr¥‰$Bk^´VŸ‘Tgå£!µ;:Cɳ6CѨœÌÃg�‚¡šóÈgÄä„S†ßÊ’]©^ã3¥ë¤þf·0:ù'T€4PÍõnã^J0]‡z²½Ûgd¦å5w;éëcìç}}ƒb2:¡JFñ-Ìåã<çå`u• í¯³ý…lŽ@`cvdÐ3LØÎJå·'Æ%ÃzÉŠ¢œ[/��{h8î� ìoAÔË:5ËZ©bã`ä«”3&\*& BÌû .–-†^!Š+¡q$jgtd Qªj�0ü¸áñRãóMk�Ö¹R/¶ýÓVºÛŽ ÊÔâxM^~ÚË?Ÿxp$ÐQ-¨ÌÌÖQéÏXï%Š¿NÇÅžv©-æ«1–à7`�¹Æ¦‚“hÔäˆÆ_[}�ÆH,¨Ë&£„G£Z1Ïnƒ�Ø{[[²ulUä}§MÙÁÍÀv9’‡üÍ$+‚籚)FÙ3Mù±Wˆû @°ŒpUR—’Õ‘„¼�ÄE3 ½Áîó™û�Ÿ†9O!LnÝ:)óx^§ÚnË~妷ÇÀ­×|JÖ83Ô®ñ1A:oÈ�ägã´J?jŸ™ËÞ|+Zí<õÖÏ[È bl€�SKËÕÕ[ßÑc ¹2½Ôý…æ®qú=SÉ© Y�²Ibší­h“EÖŠÁ.ÍÍ6ÉÄÀÎ*ÍÀˆ¿ÂTpÞÙc8aðS%6�¼ÝH.€óöï¥ctòÔn’\Ä4‹8[ŒUw¹ôf€z½˜$@­·ì+ª½0…è( Íë�º s ‘¿`ød}4´F�—œÖ´};åRò�qó™4÷Å^#88�o щE≠�Rp äo¦â ÒsÖf/²Ÿµ É­�oÎ:6ež¯§¤Yš�éMÑ·zÅ1³"5ÓòzL-ʺŸ¬þ˼×g!RQµK¶Þ°u�f·œ @· ØdñÎ6`úΘiP%ÛsšKŒÅïæfý÷¸gNX]i ô¦E¥\Ë^âÒYŽ( Õ´®Ð‰5„¾¬sB†aµXî™bhy…&¢‘€¦�…ŽèˆùÌ¥f³d檰+ M†d·š—ëqr%àïX&) ËElA6ÑZu!UhéÏ‘'¹šÄ%'Ÿ…)+°Ëµâ ¤˜wÕ­RÖ`S}5>”aÛ† cémÃ�Ÿ™\ýÈex˜Í�µ]9ôÕÀœ·¦¹‡-ù^èy²N�64‹Oô4£”~‚°½nS¦#6K64 fAæ ,Í ¼Qje"ãB"ºÄßóuXƒöt™l ¥'Éç#ÇãT×r^á}ƒs:¹šçsã%AºªJîJköm4ׯ:½‰ÜMÙÖ6œ¿ï¡£ÇOí®¥” µ¢¯&ü4š…Yî›zn­çŒ),+Xs“vÅhµ11Rë[âv�¡êG¾Ùúnd—éU‹“¢IÇ&(VÒ®S»1¢7ÔßÎ6¹7÷‚)Ä=1No³> ;£ú*xá‚¡†œ¹gQÁ9bºb©¦­²6g ›Rˆ2IÁabÝ G Ç/x­¶ãÂZµŒå"u„¶ª#@^Œ¸~;6¶FÙCgsLêi´£W‚C-ì ¦æŽ;24…¢f,úËPÀ;€„EPl× ë�q8¡TC/dQRIòŠÄ Ç*~¡³äCŒ³ýrÇls#1²G‡^¬lÏŒDã#•ó·YK3ð[•vÌJ†��| }|ŒDÚ¢nxcޤæÌvu~Âu‡Tð»TÕ@ÄM(šEH—y‡ªÃ 6{ʬª\ ™:÷m}æ"[NÕâY¤ÞÂ×´ª[{Ç™0Ý×fõ—ZßÅuë�oų9Á Ç*C¿Ñ ´�t‰¿¬¶¤ÁóBß—�Žõ'puÛ5±Ñ·u¼¼9,ÏîެëU |á§Ý˜u0N‰Àˆ~ªX²µ‹©ô¦ýˆ­ì´œ…�+¦àÚ*pè¨g aˆ"3WíŒOCs Pô!*„€ìßwèè±ÝõÈÜ`YHÞ ìöÉp�Aºçy¥v9Ó�Oƒæ–ÜÞÄ™�s»,Ì­©Ó¼®WÝt[fKr7¦²©!@ã¯qõh!"POš$IDATÓ‘åòEÜ‘ +Ðöª |ÄMåhtbÜsV6 “¿OÆi¤ìžrs ä&54ºQ{ ©%è$ru$,ÏÚÛøÔ<™Äªƒè t»‰ï¹¸Þ7¥*H<üÊ �šbn±×Û½è‚Y0*Ä­LÌÛçÕw˜¦‹p €�V»,døt»™Ü ^gM\Ô5Z_Ÿc§}âvª×O§I‹�åbgXì ‹•²Cãz ˆÆä5‚ää�¸¶`Cþ�†]¸áͶTºžÜXÖ¶ ”Éd ™31e=`ø„t§¢�=©Ú. )ò™ ¨]‹£¦nK:Yr=Ñ$Á…3vDn*ò€¤ vÁ� ŽÄ�û—昨ҼÇH™§Ó-Z4@ ~ õ_f¤é_=Å‚ƒ_Ø)Grú,StÛÓ^óé‹t‚ »È-.64¡AÐ hjkÍÓå‘|YGu ¯Õ�¢�ØÁ=Y»uÏ:|°)­+Ëm»^ö£òÝÂvsÍ$qÜ3.N±«+b™^èâlË^6 €_ŒíËQ3"tK ½\ìØHœ—D+­³NÅá¹Kò¬ùÍÀP¯•:ù.éÖò«ž’Ä,š'àPèÑ ‰]Ž©Ï2‘A¼Ä•AìêÍxè³ ô4�^ªæ¦e!sýW×yVpYLö‚ˆ©¼·ÄÊØ“ù\¨êÕé¢{é4ÂSmù¦Ìt�F&Õ|€S>ŽÈeœA¢”Å|•‡¨Èžþ!^ç*±k‰ÿ±8鈢¨¬¨òôOtìQs•YûXbbI@k1úÕDþ?"]Ù4�NIEND®B`‚dtkcore-6.7.46/docs/src/layout.png000066400000000000000000000433711522615770400170340ustar00rootroot00000000000000‰PNG  IHDRmH‚ɦ IDATxí�/¬×ù¿‡Ø– P™E!‘¢*$ HIP B"…E•BRbbh`)$R "™T2‰d©  )(ù˨ªö§g»Ÿû{s|fvöÞ�½»wŸ‘Æ3sæü›ÏyÏ9ϼgözÜT@T`~7 ÆaøÓ0 nŽ\ß[¦8sݳO†aXmö‡{ÎÛìT@T@T@®Y�ßÃÀÿ�2ágâÏñ×až Ãð`ÀÎí8ÚŽ³]¬• ¨€ ¨€ \Iàëñ0 YàlΑø¤»Iðöb†ì¼’ª×›Xh»^ý-]T@T@ö®KžÿjaíÖ­[ÿ†áïÃ0ümf€¦:âÝ”­>›ÐvSZÕçPPP�W`k!Œ¥Q¾aûvíÖ0 À ÀÚŽÏô´_›X#PP¸”@YûíK�@ÙÜ è#¡m®b‡‹'´NkKRPP�EÐâ)ãÈõe6àﯗIx¤iª&.�i#Y-PP8~·ùf-€Â7mcË¡ûÒ$˪ü:•¥U¼sìœÿeÇ3äÏ�°Œ[Á9¿jMþx›€QâOmüj–¼Ø£ GòJx=öò›['žùÏ•Á{YŸ!ÆÔsm®RÆSPP�#V(¨p4-¹á±j—bkùœç—¨sà±~‡,„ÀàÔ¯_ù3%ðêóQm}F¯ïܹó¼&Þœ×:x©S/ŸžWXÐzñk@:öµZB[UÃsPP8Q.à`ãq›J—}T€¨S½0à¸Û%�€6@¦‚ÍØ9y÷žu h«ÐÔÖ§…¶?5žÏÄÓÏè6¯[-ß?®{Yë5� ¨€ ¨€ \£@K…n© [„#°Å2_ ,K¦0ˆ‡WŒ{c[…¶(axñXñŒì”Ÿû©G`¨éØ�#0—ðöØÖ­Ö‰ú“�4êd±g5éßi¨c  (»ÓmKÚUÓÞ3§|�* * * Gª@ &KMèÀFýûo@ e�mÀM¦©7T@"Í”ç‰z\€Ûfis k€­¹[['®ç¤à­6ð6•¦.kÇê'´�)c¸ ¨€ ¨€ œˆxz*˜LÁÑU©ý¨Ÿë© �º˜ ˆ�ÁU HS C™-¨NůÚLÅkŸ¥­^ºmù×ò€²mÛŒmYÚ¾ˆ·ñÜmË×û* * * G¦@ûýÖ¸¸Ì#Thà[²9[ zcÐTiîònõúMýð¢BÔXù½g©u¢¬1à¬i«w‘ôsÒ´:Ö~Uÿ¥¼©õY<3õÎÞ+³Ö‰xs74­Z’åÕ%g´4/âm€x ‚…¶¹-`<PP8!~ãqk¼9¹îqóßNMý�Þ‹¿)–|7iþÕxâ’ÿœeÚ H=€êI_átÊÓ,Q‡Ôç¥ã¦ÞmµN»@ù°,zd›²¹¦½ºPÖ¶o…¶¶…¼VPP�¢P'ú—`¥‚̼ð�M-çE ¦m”?å=J~�ö m”‘¥ß¤Öõ]Ú(“ç¨K¥­6¹Æ«9GóÚ–S�M=ª€ ¨€ ¨€ œ˜@žÙç@i�¢¤™[uæøàèêv]o$K–ûã�?®õFsleɲÌÛ·zm@дl@h�¶·Þz+®{d²þøã�W@Ü1t¦O>ùd]Ïwß}÷(ês š,YÀ=¿fþþûïÕ|¤-Ùæí$¦ hçfBÛÈdh»{÷î…GP{õÕW/&k&mÂŽÜ„¶Ã^BÛaõ>·�ÙçÕ¾´m gBÛh{ÿý÷_ò¢0a³OË1,I m‡íàBÛaõî ^†ÙÚ€6pn6 ´]Úb$ï½÷ÞÜð¶%lêÈwPS÷¯ro_ж¯:nËgÛý«h±-íeÊnÓmNÛìÌûÚˆ6  ìÛ„¶+@Û§Ÿ~º†6–LÛ†aRøðá OPwûöíu\–[ß~ûíÕ£G�^JÓæñÍ7߬ÓgI–<8ÛôÛ í«¯¾Z—˲ï_|ñ›²’Ï?ÿ|õÚk¯­ëH9œ?xð`O"é?~ü›täIx¼‘<ïo¼qñ¬µô@/ò�¯¼òÊúYxÎöÙ¹æÉÿ£�>êÞ'õ&žÏ6ÂÙù挕 eâ!åÈsM-m£ u¦ýHC½ß|óÍÕ—_~¹þ1J<­~ÓæÀÜÚž×Ú„6  ,aBÛ -ž6&ò¶qœLêLöLüÞ¸hµér LÀNMÿúë¯ÿ&í´S¥^™@WÊ É;p0æÈ'õãÈ5é¨WÊçš´”èŒÈ³–Qá�¸ðRéI&¬=òcâô–¨SùË\S×<[®Ê6_¾äA:ž!ù‹¹'´98·öãµ6¡ hKØ€Ðv h‹×(“v 34Þ#€�kѶN{Ÿ¸Lò&�ê Âûƒ§X©ù&Ïö×£�‹ Q5]Àˆò8Ï2`¼o„øÚç ´å>uH]yΜS'ò–¨{Êç~À—mÜkŸ#鱤¯ð“ûÔ!ž<.á÷mxÈ(§æÍyôi¡˜ ”Q‡6yUÏ¡Ðvƒ4íÒûÛŠ„Ûm;òš†¶ÿ¤|úf^Xˆ£=‡=¥}<ÚÇdBÛh pôŽÀž¬Ë4(ƒ3y2ù×ô à)«z†jœÞy…6&¨x°ÀLmºo¿ývkYLx©O;éä¸O¼6®S/´êÝ',p(U¸Jx U5Ÿ€WpSï±6"‰ƒ°æ™ç"¼Ö§ÆIÝHï${ƒ:vžïó’•ë±>PÛtÉs>—à[Ö^¼ðäå€þrÝuíÕѰã°qÛÁvÚ¶@ðƒç¥î ª,©åÛ¨1/>ƒ1yg™H8Æ›Æyíˆù–m rjüœŽ˜¤øÆ˜ �) È2,ÞÄäÓ;Æë4mÜï¥#,K£­­ÆGÏ ™{£«B[ûŠä_ËMÇ€àT¹5í”Æ5_Ï7àÒ†ìÑœþ ¤Wûâ冗 îñ²4ö’´-¶ÐæM¹ôl�A¶…¶Ô‡2+´U¯ u¥ì¤Ï³p$<:òÒg[µ/>Œ䉭×ï#É—�>M¹éÓØKêÃ}ú_ ÔÆðPaÏ´0Fÿ%Œv¦OÒwÚ6oã‘Wk“äAžéKm`.І}Õ?QCýÆ -}.õ¦n„UÛä9…¶ã³ÁÖŽ¼¶�öaBÛ¡�7f ¡šÕ 3 ’ òiÌüO ä›°9Ç@ƒ9<ÐG½È¬L,ÄaÏÄÕ–UŸ%HâpMÚ©ºâ­"N�d’>G@-õ¨�˜Ô·=&ÿ}B[–¨§Ê«s[?¯¯g dmÌhÀ ÛÆjcë]Ûfm¼ PäC¶˜ï2ñb×–OmI—r°Ý1h«/]Ô�—?ì“þžôñöåÚãõØœº«û!l@h»´1x6ê]—ÝZ[5°ÑBDòä<ñ·+´—º19�ƒ}//âŒ}¯–òòÝù\Ú¡™p’o=’Ú sì‡5m yŸÐ/(Ú0‘×òrž:£KÍÜ÷x½xõ´ÑÇj±I¥OÔ©÷©ñj?%^Ò€ñg<àH_¡�ÇèG�6Âk_â…fh#nµwl±¾4¦L�×kƒê¯þKØ€ÐvIhc`fà `i ºt–=÷8VW� ‡¥òåH9 ¯Ç[h#.q˜È ¢±kœç˜„Z@ÉrOž±N4¤åš{™ÀÚ¼¹&�€!“K‡ûÔ�|âIœªcÕ7÷ã‰#m�Är?õó4V¸NŽèF»�¾Âxâ Sî§Aâx¼Þ»zÚ8§[¼DÄ»Œá…#Œ{ÄéÙhâq�x@W<]IC86ˆ­ÓgÙ±ì–ôôå@aÔû£aÿ»@öGŸÃ› šBÛõÚ›ý]ýeBÛhc@ÌÀ‘IœA»NÚ Ümƒ1(3¡3¸2H3Ð2¹3A0QÎ}òiÓ2˜t(Ÿ��´@ ÀG=2$mÚ¸€0 Så¶Y„Ƀ¼™ 8rMù©ëe �:¤nÔ�|y>ž…ü’7:P—ÇýæcûØ>Ú€6  h‡°¡MhóíJдm@ÐNÀ„¶h¤Cлeø–¨ hÚ€6  · mB›oWÚ€6  hÚ€6p6 ´�@#ùæsÜo>¶�í£ hÚ€6pÚ„6ß®´m@дmàl@h;�F:½[†o‰Ú€6  hÚÀqÛ€ÐvBÐöÓO?­~ùåw5дm@ÐfÚÀÏ?ÿ¼bþ¼ @*´�´=þ|å¦* * *°›€›Ð6\Ëö×aØwÙ>|ç�w^œzƒ m»uRc«€ ¨€ ¨ m» Ó~ã möAPPP�Ù mû±]rÚf›©U@T@T@„¶]0k¿q…6ûŸ ¨€ ¨€ ¨Àl„¶ý‚Ø.¹ m³ÍÔˆ* * * BÛ.˜µß¸B›ýOT@T@T`¶BÛ~Al—Ü„¶ÙfjDPPP¡mÌÚo\¡Íþ§* * *0[¡m¿ ¶KnBÛl35¢ ¨€ ¨€ ¨€Ð¶ fí7®ÐfÿSPP˜­€Ð¶_Û%7¡m¶™QT@T@T@hÛ³öWhé?üðÃȃU@T@Tà|Úö b»ä&´uúÝÓ§OW·oß^ÿÿj�Û©€ ¨€ ¨ÀÙ* ´í‚Yû�+´5Ýî×_]½þúë«aVï¾ûns×KPP8o„¶ý‚Ø.¹ mMß{üøñêîÝ»khãøäÉ“&†—* * *p¾ m»`Ö~ã m¥ß½xñbõÊ+¯¬� Oûýû÷WxßÜT@T@T@VëO‡ž={¶:õý믿^Ý»wïŸûŪesÚJüôÓO/¼l�6¼m�=*±¬Õ#àöÿ÷çÛC}rPPØ( ´MaÕ²÷„¶�ò£ƒ1h#üã�?¶Ãª€ ¨€ ¨ÀÙ+ ´- fS¹ m«ÕúÇxÖð¨e¯×�¹Ÿ~úéì;«¨€ ¨€ œ·BÛV-{Oh[­ÖKŸ¿üòË*;Wj¹ÎñùóççÝS}zPP�³W@h[̦rÚ:Ý�ï×€67PPP�ß* ´MaÕ²÷„¶ßÚâúJhëˆb� ¨€ ¨€ ¬ü“ËbÙtîB[§ mQ RPP¡mšª¾+´uº ÐÖÅ PPÚƲéì…¶NÚ:¢¤* * BÛ4U-|WhëtA¡­#ŠA* * * ´-ŒeÓÙ m�.(´uD1HT@T@„¶iªZø®ÐÖé‚B[GƒT@T@T@h[˦³Ú:]Phëˆb� ¨€ ¨€ mÓTµð]¡­Ó…¶Ž(©€ ¨€ ¨€Ð¶0–Mg/´uº ÐÖÅ PPÚ¦©já»B[§ mQ RPP¡ma,›Î^hëtA¡­#ŠA* * * ´MSÕÂw…¶NÚ:¢¤* * BÛÂX6�½ÐÖé‚B[GƒT@T@T@h›¦ª…ï m�.(´uD1HT@T@„¶…±l:{¡­Ó…¶Ž(©€ ¨€ ¨€Ð6MU ßÚ:]Phëˆb� ¨€ ¨€ m cÙtöB[§ mQ RPP¡mšª¾+´uº ÐÖÅ PPÚƲéì…¶NÚ:¢¤* * BÛ4U-|WhëtA¡­#ŠA* * * ´-ŒeÓÙ m�.(´uD1HT@T@„¶iªZø®ÐÖé‚B[GƒT@T@T@h[˦³Ú:]Phëˆb� ¨€ ¨€ mÓTµð]¡­Ó…¶Ž(©€ ¨€ ¨€Ð¶0–Mg/´uº ÐÖÅ PPÚ¦©já»B[§ mQ RPP¡ma,›Î^hëtA¡­#ŠA* * * ´MSÕÂw…¶NÚ:¢¤* * BÛÂX6�½ÐÖé‚B[GƒT@T@T@h›¦ª…ï m�.(´uD1HT@T@„¶…±l:{¡­Ó…¶Ž(©€ ¨€ ¨€Ð6MU ßÚ:]Phëˆb� ¨€ ¨€ m cÙtöB[§ mQ RPP¡mšª¾+´uº ÐÖÅ PPÚƲéì…¶NÚ:¢¤* * BÛ4U-|WhëtA¡­#ŠA* * * ´-ŒeÓÙ m�.(´uD1HT@T@„¶iªZø®ÐÖé‚B[GƒT@T@T@h[˦³Ú:]Phëˆb� ¨€ ¨€ mÓTµð]¡­Ó…¶Ž(©€ ¨€ ¨€Ð¶0–Mg/´uº ÐÖÅ PPÚ¦©já»B[§ mQ RPP¡ma,›Î^hëtA¡­#ŠA* * * ´MSÕÂw…¶NÚ:¢¤* * BÛÂX6�½ÐÖé‚B[GƒT@T@T@h›¦ª…ï m�.(´uD1HT@T@„¶…±l:{¡­Ó…¶Ž(©€ ¨€ ¨€Ð6MU ßÚ:]pWhû÷¿ÿ½úüóÏW¯²½ûî»+Êf{ã�7¶fõÙgŸ­žýôÓÕ{ï½·úè£�Öa‰‡·Ž´lÚ€AâðÁ¿�4 íË/¿\qäuÈV¡ à'Ÿ|²ÎÀ &®GPP˜«€Ð¶gí5²ÐÖ±Ò] íéÓ§«·ß~{� Ë›'–'üñÇuøóçÏW�(Š4”AÜ×_ýbè#œ­BÛwß}·§£¼ùæ› ¬±Œš„·/K´)@£Œï¿ÿ~�0 º©€ ¨€ ¨ÀeÈœ³�%RæCæÊ©¼¸O¼©8—¹çòè ­qRcÛ.Ð8=~üx�ÕW_}µöžq� ïV{Î5°öðáÃ5<Wt¶1hã>ž:` @$o6Ê&<¼Ü ´k¤¡L.¤U» IDATv–S�87PP¸Œ»BsŽ Ž¬0ñ)P ‹0æÐ\÷Ž8.˜·z÷˜wÙ{÷¶… mgm,eÞ½{wmˆ,_b|\„ìx¾ðt¯ÆE\`а"§mtâ|óÍ7ë7 @ àcã£ËÆ2*ËŸl�6îã�#Mö zIëñ0 ðB@»Óþ@4Kæþ`ä0Ú×RèôüäÔ{ž«€ L+°+´Ý¾}{=W_@sR€ €ÛæE›‚6œ8H’ß.Ç}AÛ†aøÝ–EÐ{Ã0üqKœ9·Ofy”‰/Q%ô]§�»OÆ·d¿üòËÅÎu5FÔúx®ç¦Àe �—Tæ:úÎ�ÌÉÌ“Ìs\3§2_uÌm�»@ógî“<€s„Oscò�sl¡�AáV!'`ìåzìôñ ûýD^†áÏc™7á×m º€ÄQ‰�PB£Ðp„ÍMß‹75 Ï]eƘê†ÎÆ9o�,ˆϳc�Xtàç”Í–oÚøF ƒ$>ÏOÞɸæøþûï¯ïÇkh#/À1�€R!p]˜ÿ,¦ÞXÚ-°†=Ðf´€O»Ô{ D×½C©Óu×¥W~ôL?èÅÙ6m´Ïϸá¦*ð²—�6¼Ú@ãs_æeÆCÌéÌuÄá/Tqj0oÒ/³ ÊœG&scΓçÜãe  �0WᎰöHc«G�xÕ3Çõƒa?ââ‘›Ú® Ú*i·3qUw)KI�â$õ~›~Îõ>  [ )fÍ5ál9o½\ÜÇ@ ÊrŸóä—<ȇºò¼ç©;×@qyæ¤%MMÏ5qÉã*Þ òq›¯íÁàbù:¿®¹Ðî P J¼q^÷vÐ6¥±Ð6¥Ž÷T`uñã·9s-qèSŒ…xÃ1 ,imqh$¨ÐV Ÿ7÷�ÐXý}XÏÊ’èߊ§ �pF\Â_l û×&Œ{œo@y’áÛ–P� Úh4~ “pC�GƒãQÂ8¯´ž†ž{ øô: €Cn*pðpØæÀ¶X_÷&´éi»n´üãVà2ž6 Œù™TæïÌÕ�¶Ö9ÓBË¢I³$´SuÏò(K˜OŠ ìà dh»uçÎ�çæþxëÖ­ÿÚ6çùö ¸ÒØ1¼ms¶£‚6 ŒÆ a˜¼p•r Ì¥ÁŽÅÓvÜÝÊÚ]§xÔxKÚX ½Ê†'–¥@7úöÏ9a=Ïe±4Ï’ý‰�‘eEÒ³sΠØnäÉòE`“<êÞKÃÎÛ./WÔ�üy¹û&dòÄËO#ƒ2éɧç•&IGþÔ ’Ç]þ” Ë"¤©u䜰<;:ÔüYši7^ð¨+“Pž�z±z›˜'_ �ö#}´ãHÔ´hŽžx(ƒsÒº©Àu)phcÇ–3×Ó_êòh~IʘR=mcÐF¿§¯†v9î²< Ts€;ž1ÚÖg þ@]»f¤A;&"Îk:®™„ؘØjþ9'þ1xeÛgóú<ØÚèãô—ã°Æ5/�ùV�ùžþÁ·¾ôGÒ‡q‚þ”ôôÆ6®yA%>c!/D‰3ç¸ ´V7�Õm÷6ž¶ÜÿÝLhûËDÞÉ+Ç£ò´1èÖ†�èBÛy 7é)yKd‚bZh™ûœK~¨À€DßÈÆ„˜câ¯pCœ@[ ŠÉ?Ÿ0àθ_Óâù!ïÀA¾¡Ì±Æ¥_&Þ"œ=ÏZ~EÊ8ÂËL/Îe–ð´-�pB[§‡ìm ÀÙ0¨@W¼fÀZv&X¶@oìõChî'=÷ªw"˯¤Ú¢øñ@âi ¬ïZÛ,�2ñ�mñúÔ—â’†ò—ò´a›äß~K7VÏ~êÐV—/+(×gœ:Ú¦ÔñÞ)(°´1V1nõà‹OçsÆÓ^œË„ mÏž]IL R+>0“†BdÍ6ή×SÞ�}@´±É:ÐäÕožøNh´aÜÕsq �üëHÛ6¼Î]Æ®v‰-�>6ÑÓ0˰íÜU  Ï0å²�ýÈ Ë²x³ìß«_/ìªÐ]øô²[–wëKSò¢òìL½­þá2ýPhë©jØ))ÐBsý‘¹)Þ÷ÌɼàáÄ œ£|Ê‘~H8ãcX �ñ…kÒ‘w  > ÿ“7\@zú0y~àÈjáÄ¡Ü7mW„6&7+��# ™†ÂÒ°¹™c�ÛβhèùXƒÃå‹aHl�6Îy.Œ“û¹f›ò´Ñ90f´ûuÙ:ÿ¹V”²ÄIÛN�6ÇÀU¿sŠG‡<°ñv#,ù3øÔí*ШڰãÞxÑ_‰G½§¶ü® m À”Ë`|Ù�´äу¶9ùÓOIϤÐ>_­ÏÚÞÚªBžŸ¢-´1°2H±sÎXÆ…ó‚¹��q�9‘pæ/^l 'cYæöÌoÜ˧¤á%)K¥äŸ4É›þL<ú7I8ó/ñâøá~ö³†6ÄLƒå#ùƒp@HÎ}Ò$¼BiµBPGY¤åƒ]òæÛ1â†à¹Gòeâ«iR§}@ƒ1efcâ­V3ISGêG<p6ê–�0ê„wƒgÈ$ŒÕ “ó h”C>S �2<^Ÿ´=“;;ƒ À�ÍÒÞ´)mH›Ç»S¡ Ûˆ·Ž´Ø26ÇŽ]F¾ p±­<éU �<.,Ò©';õÎÆu ‘Á˜ë ý‹çdðäÙNZêMjI¾§~ˆMyûæ9C(›òænSÐÆDý�è3~Ôº¢CôÂh�Œ)<+}šÉ‰É«ŽÔOh›ÛJÆ;VzÐFŸÊüÊy®é?ŒqÀãI0Œm¤¸¦?Ó�3’×ôG®éçô;Î+é£‰ÇØš¼¿ªg�>WËJš³†6 ¡[+Ô�84V‘8¹æÍ™AŸÆ �IC’i<�A>zâ�8l §aÉ—pÒÑ€IÃ}ö °½N1×ÓÖK»kFÊ$ýêİk^Æ?N°iì1 2vÄ~+˜ó4\eciðô´iHwUh£Î@Q[.ùÖ ` ¼´qs ØU¨¼*´EùS")ƒ#cÎÜ�q„4yIªé˜�È«æÍ9ãIÝè«sÚ•ñ¦nB[UÃóST mô¥Ì¯�4€‹¾PH™ë‰G? ,i`ÆÆÒ$œ—Æ®[hcüK<Ò \Ó/›r�1Th+.F„ tD¤4Z®i<ÞFi4?Â-¼KœÓ4 Ä rÒ¾¸n¡ c œüCàmÙ ðÇ mÔ 0¨êÅ8ÅŽl�ÇTxYÁ~±{^$pd°á©¶'-ƒ/ ty‰¡Ÿp¯·ÑŸ°yâŒmÔ‡8ô¹ÞÆË qèÛÄc§ŸµÞ^â¤~<0ÏJúÖL�“eô6@4qz÷ɃºÐoðhçnŒE¤a`ïm€!÷ê³W/hÒ¤mnÆ,ž�ñ†1‹ºõ€:yÒ÷{0HÝZ@®q·åQãz®ûV mØ=6ÍÎ9ý‘þOŸH8ccלô2có@sy ‹~ÄKiæBãjòÎ (ù¤9ž½§-�� €H1�DGâ@Ó4B„Ž˜A8^3îÑøIÓB“RÒÇ¥JÚ¬›s�”A0ñ8‹§mß�ÉüT@T@T`IzÐÆK(/¤ì¼À_ì¼d2ï³s/œÀ\ÏœÏu^x€6ægŽððEºüa.´‘w^pIÏye…°ÀÙCÂDŒ€"WW'ô£‘ã¥q�.Ä®ÀG~xç’¦…¶¤'^ í”À¨qÄ5LÝ„¶«v[Ó«€ ¨€ œ£-´e^=µãYCTËRæ±4À†Ç/ëìm½„¶sj|fPP�«* ´-ý?ŒŽçïÿ=Ú±ÞCþ�¶Nñ©€ ¨€ ¨ÀÑ* ´�CÕÒw„¶N·Ú:¢¤* * «ÕúsiW¯Nñú¬—GO­Á\uìQPP�ÝÐÓ¶´?m<=m{ÕÓÖÅ PPÐÓ6NT¸#´uº ÐÖÅ PPÚ€fãEm�.(´uD1HT@T@„¶q¢:À¡­Ó…¶Ž(©€ ¨€ ¨€Ðv4/BhëtA¡­#ŠA* * * ´�Õîm�.(´uD1HT@T@„¶ ÙxB[§ mQ RPP¡mœ¨pGhëtA¡­#ŠA* * * ´ÍÆ‹Ú:]Phëˆb� ¨€ ¨€ mãDu€;B[§ mQ RPP¡íh6^„ÐÖé‚B[GƒT@T@T@h'ªÜÚ:]Phëˆb� ¨€ ¨€ m@³ñ"„¶NÚ:¢¤* * BÛ8QàŽÐÖé‚B[GƒT@T@T@h;š�!´uº ÐÖÅ PPÚÆ‰êw„¶NÚ:¢¤* * BÛÐl¼¡­Ó…¶Ž(©€ ¨€ ¨€Ð6NT¸#´uº ÐÖÅ PPÚ€fãEm�.(´uD1HT@T@„¶q¢:À¡­Ó…¶Ž(©€ ¨€ ¨€Ðv4/BhëtA¡­#ŠA* * * ´�Õîm�.(´uD1HT@T@„¶ ÙxB[§ mQ RPP¡mœ¨pGhëtA¡­#ŠA* * * ´ÍÆ‹Ú:]Phëˆb� ¨€ ¨€ mãDu€;B[§ mQ RPP¡íh6^„ÐÖé‚B[GƒT@T@T@h'ªÜÚ:]Phëˆb� ¨€ ¨€ m@³ñ"„¶NÚ:¢¤* * BÛ8QàŽÐÖé‚B[GƒT@T@T@h;š�!´uº ÐÖÅ PPÚÆ‰êw„¶NÚ:¢¤* * BÛÐl¼¡­Ó…¶Ž(©€ ¨€ ¨€Ð6NT¸#´uº ÐÖÅ PPÚ€fãEm�.(´uD1HT@T@„¶q¢:À¡­Ó…¶Ž(©€ ¨€ ¨€Ðv4/BhëtA¡­#ŠA* * * ´�Õîm�.(´uD1HT@T@„¶ ÙxB[§ mQ RPP¡mœ¨pGhëtA¡­#ŠA* * * ´ÍÆ‹Ú:]Phëˆb� ¨€ ¨€ mãDu€;B[§ mQ RPP¡íh6^„ÐÖé‚B[GƒT@T@T@h'ªÜÚ:]Phëˆb� ¨€ ¨€ m@³ñ"„¶ÕjõâÅ‹ÕóçÏ/öŸþyuûöí‹ëÜûÏþc‡UPP�³V€9òÙ³g'¿ýõ׫{÷îýs‘ŽïŽÐ¶Z­¾ùæ›Õ0 [÷§OŸžuGõáU@T@T@h»>˜Ú6ýï­·Þ…6¼n|ð�=UT@T@Î^¡Mh;¸›•%ϺáêÎz7Âùå—ÝsPP8K„6¡íÚ¡�ž÷ÑG½nwïÞ]=xðà,;¦­* * ­B›ÐvÐÆ¯F�´êm{õÕW×?Th�ÖkPP8G„6¡í( �Î÷ðáà pàø‘‚› ¨€ ¨€ ¨ÀÿÚ„¶£�6þ¬Çýû÷×Þ¶7ß|Ó>ª* * *PÚ„¶£�6ìòûï¿_C?NpSPPøÿ mBÛQA¦ÉÝsSPPø­B›ÐvtÐö[õJT@T@T„6¡Mhs,PPP�P@hÚ„¶è¨VQT@T@„6¡MhsPPP�P@hÚ„¶è¨VQT@T@„6¡MhsPPP�P@hÚ„¶è¨VQT@T@„6¡íàÐöïÿ{õüùsw5дm@ÐfÚÀ‹/V?ýôÓÁçlþØý¾wþë½{÷þy}¶{Ɇ�}—íÃwÞyçžÅ3¿ý¤šª©6  hÚ€6з¡mÖØúƦ.ê¢ hÚ€6  \Þ„6¡mïî[;äå;¤Ú©�6  hÚÀ˜ m7 Úø�ã?þøcA솵ëX6ÜÁ]д�g«Ï>ûlõÕW_Ýø¹Oh»!“ûÓ§OW}ôÑêöíÛ«W_}õÆ®ƒ”•6  hÚ@làÝwß] ðâøäÉ“; m7Ú>|¸zå•WÖÀ†Ñ mdÈäƒ>¸@'”ðË/¿\ÿ½þ¼ñ‰‹ãiÃ[Çy…6 ‡´Ä «‹k~ÝC>œ“7é[P" éÙùcÂ=ðâÃSÒ‘žºúé§ës Œeþþûï_€%ÏK™”MâiãøûvÔ™ðÔ…<òÌ)‡<ÝÕ@дmàÐ6 ´�é ˜°cp€ À±Ô8Éò)q 4D,9>¶‹é³×QG˼¾¾ öç§½Ðv†Ð€àEJØ*v@ �ª˜(âc`Xð\ÎÎÿçFø´l¤a–øÀT–AÉ?Ë«äœq¯…6 Œðì5M+òæJ&q&/ʦî‰hk½i@fÀ¬½WëB>@¡Ðv$ |-œ³¬]_Òîí1/ §í±Ÿ\㑾’oFkýè§ñ*cÇõóƒÏóã°YÛÁvØ— mgmx¬›jDL‚x-rð^1!&D  8ú¸7mÕc1aVh²HϤ `q¬ D]¨ù§c,uË |‘_õÊÚRWÊ!O/ÐXMYµ.„ mÇ3èb—Õ³Äu쉶bPã:/„a³¼hê±E`�x„ñÂB<àÛ­„m`�ìÜÃÆ°%ò'}ì‰ôu'Ò�2ªýRò"=qÚt„SN…6Ò“;õ´uäGôQØmòæùÑy�1 Ï�8Û†ê¡ÇfB[3Ð[í»>—:�Pƒ9ž­œ·Þ & �ñâÉ"?&Ò1ydù‘‰(ññ¤e ”xÄa¢%/âd‚dò°ˆÃÎäDÞÄç˜x¹Ÿ#“_Êe¢nõ±”ƒ7‚øõ9¨C&>Òz\“_[&Ð ‚)ÛãáuÚ��Á @Á68Ò±) &öƒ�Ò~@á Ђ�c'„ÑþäIs¯*×±l øÂ~HG<ΠØ^k „³“_êH"á±Ç€ñây¦Ÿñ²O¶É}ÒÑOb»5À À`&À °’¶á~®§–G±1îÇÖx©á[¬È'yRFõTq½~°‘6鸎ç‹r8§nä�— +—:m@g}¡!Ý´Õ— ´"oêWŸ�¼ñ–çySG�×cÓê®îsm@hÚ.&•¹Fc<˜ë´@�SꔪµÜ#nk Ú%€)é8 ¯x¡ çÓ�€`âõàH¶’'éÈ‹²€N<ºxĨ;Gâå[ѤÁk–åÏ cx Ç �gNú”Aý€Ë„säºWïÇsûº6p\6 ´ m¿Èí ÇÕAm�—Û£…¶êulâµB;–ÆYNä<ž³h Å«OT>h=m—…¶Z ˆk!Ï] �:ÅÕeO¨IDATkPq@�è¥îä± ´‘.Ê9yêi{Ù¶¢¯Gµ9VÚ„¶‹‰àX�Ôz9€VÚðbáE¦€ †8 h€Þ5âáyËÒ%çÄ�ç À˜ðÚ‡ïÌ€<@‹üãÍk!kOù¤.œSGŒ:Su¤¾�6¨'Gê‡7 À"¹ÔŸzÎ�6ž©æÏ­§Í~Uû•ç§aB›Ð&´i'e@Þ5v¼hñ–eÒÁS(q¿.ÿqÎGøñ¼j\/`Çwf@N¾=#Oòg Lþœ×2É/é‡#�ÏàWëB)‡íÄ»F:ʦþ„Q¿¤ãH>ì”Ï=âãÌ2l¼r©G›7y’?iÚåÒ¤ñx“·ítží$´9a_LFç9ØîË´;Ð`‹¾�A ¯žÊc©›õXÆÕõæé*´ mÜÚ€6°€ à-«¹ëž@© uÊŸ ¹îúXþÍ Ûtù6Ú¬5Üå W�ÕXдmàÜl@hÚô²hÚ€6  hÚÀ Ø€Ðv�tno>¯oÏÚ€6  hÚÀË6p Ðvo†?”ýá0 ì5Œ8SÛ‡ï¼óÎ àeP5Ñ´m@ÐNÃNÚ^ ÃðâÎ�;Ïoݺõ_vÎ ÛìB›C]ûÚ€6  hÚÀ�¶�S€6wÚì¨'ÝQ}K¾oɶ£í¨ hW±�Sƒ6 -òc.°ïC¼sùå©ÇÿýWÔAдm@8-¸wïÞ?w ëŽËŸ÷Øö'>Ú:òc…¤ó¨Ú€6  hÚ€6pÊ6ÐrŽ×* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *°Oøû,ü¡Þ¿ì3SóRPPP�=(£<†�¿5{ÖÛŸïܹó|ó˜þõ¬•ðáU@T@T@ŽQ�ÇNù×0 :Æ .]§? Ãð�Íÿ_º†�]h[ZuóWPPØU�¿m8Vy1 óavù×w-ïhâÿnž‡¬åˆûÜÕ@дm@ÐŽÅ*´…Yà㪼’ó_7ßäßHhËCý±³4Š.�F!�* * * Ç¢§€Ç,‘ò©×Ùlë!ܺuë¿~Óv6m€ ¨€ ¨À©)°†6xeãuûó©=À¾êËZp–Lõ´íKUóQPPØ—Û8˜ü³EùØ�eS7PPP8&ø3ü�ÒMT@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@Tà†(ÀîûH˜_¨_æÞ ‘ÆÇPPPP�åàÏÕ_•ó_ݱgãq3þG•Þöá&÷ˆ_óão-‘ÞMT@T@T@Tà ´�ö�Íÿ¦’,ëý±ÿÿ¯Bc‰=›Ð%<ª€ ¨€ ¨€ ¨ÀÀ+ÆÿGÌÆßrä?mfçœ�{ÄغlÀ×ÜÇ“ÆNš@ß“aø»K@ùqÍ=Ž,µº©€ ¨€ ¨€ ¨€ ì À½Í_!Êþ²ùÿ‰ùŸS8¯÷êò(÷l_XÀ�b{ž6`-^ºÀÜU4ª ¨€ ¨€ ¨€ ¨ Ä›†GŒÿœ™�óê…«ÐÖ‚€—ïÖ¸Wÿ»¼vy”ûÄwSPPPØQ�|·†G Ï;ç '»]  0ËÖƒ¶ u‰çQT@T@T@T`‹xÔøe(K—Ù8'Œ{lÚðıK«œÇ»Æßkci•¸üª”=÷H‹— �sSP�Ù ü?¦zc+üÈøIEND®B`‚dtkcore-6.7.46/docs/util/000077500000000000000000000000001522615770400151675ustar00rootroot00000000000000dtkcore-6.7.46/docs/util/dabstractunitformatter.zh_CN.dox000066400000000000000000000063261522615770400235050ustar00rootroot00000000000000/*! @~chinese @file include/util/dabstractunitformatter.h dabstractunitformatter.h文件æ��供了DAbstractUnitFormatterç±», DAbstractUnitFormatter是抽象的å�•ä½�æ ¼å¼�化工具, æ��供统一的å�•ä½�æ ¼å¼�化接å�£ @class Dtk::Core::DAbstractUnitFormatter include/util/dabstractunitformatter.h @brief 抽象格å¼�化工具基类 @details DAbstractUnitFormatteræ��供统一的å�•ä½�æ ¼å¼�化接å�£. 在DAbstractUnitFormatter的设计ç�†å¿µä¸­, ä¸�å�Œå¤§å°�çš„å�•ä½�被编å�·æˆ�ä¸�å�Œçº§åˆ«çš„å�•ä½�id.
id从�到大, ��从低级到高级. �相邻��之间的进率�以是��匀的, 实现者�需实现unitConvertRate, 返回当���到下一高级��(从id为x的��到id为x+1的��)的进率是正确的.
事实上, 实现者如果��unitConvertRate对于任一id为x的��, 其到id为x+1的��的�算比率(�许�于1)是正确的, �需满足id递增, ��级别递增的约�(�unitConvertRate总是大于1的约�)
注�, 实现者此时需�写其他接�以�时��正确性. @fn DAbstractUnitFormatter::DAbstractUnitFormatter() @brief 空�构造函数 @note 注�, 该类为抽象类, ��直接实例化, 该构造函数仅供实现�类使用. @fn @pure virtual int DAbstractUnitFormatter::unitMax() const = 0 @brief 获�最大的��id @return 最大的��id @fn @pure virtual int DAbstractUnitFormatter::unitMin() const = 0 @brief 获�最�的��id @return 最�的��id @fn @pure virtual uint DAbstractUnitFormatter::unitConvertRate(int unitId) const = 0 @brief 获�当���到下一高级��的进率 @param[in] unitId 当���id @return 进率, 正常情况下, 大于1 @note 下一高级��指id为unitId + 1的��. @fn virtual qreal DAbstractUnitFormatter::unitValueMax(int unitId) const @brief 获�当���的最大值 @param[in] unitId 当���id @return ��最大值 @fn virtual qreal DAbstractUnitFormatter::unitValueMin(int unitId) const @brief 获�当���的最�值 @param[in] unitId 当���id @return ��最�值 @fn virtual QString DAbstractUnitFormatter::unitStr(int unitId) const = 0 @brief 获�当���的字符串表示 @param[in] unitId 当���id @return ��字符串表示 @fn qreal DAbstractUnitFormatter::formatAs(qreal value, int currentUnit, const int targetUnit) const @brief 格�化数值到指定�� @param[in] value 当���下表示的数值 @param[in] currentUnit 当���id @param[in] targetUnit 目标��id @return 格�化�以目标��表示的数值 @fn QPair DAbstractUnitFormatter::format(const qreal value, const int unit) const @brief 格�化数值到�适的�� @param[in] value 当���下表示的数值 @param[in] unit 当��� @return 格�化�的�适的数值和�� �适是指: 如果��大于unitMin()或者�于unitMax(), 会尽���值被转�到接近最�值的�适��上. @fn QList > DAbstractUnitFormatter::formatAsUnitList(const qreal value, int unit) const @brief 包括完整转�数�版本的format() @param[in] value 当���下表示的数值 @param[in] unit 当��� @return 格�化产生的所有的数值和�� */ dtkcore-6.7.46/docs/util/ddbusextentedabstractinterface.zh_CN.dox000066400000000000000000000143541522615770400251610ustar00rootroot00000000000000/*! @~chinese @ingroup dutil @file include/util/ddbusextendedabstractinterface.h 该文件�供了一个扩展DBus接�工具类 @class Dtk::Core::DDBusExtendedAbstractInterface @brief 扩展DBus接�, 继承自QDBusAbstractInterface @details 和QDBusAbstractInterface相比, 该类连接了org.freedesktop.DBus.Properties接�, �供了异步访问属性的接�, �以方便地通过此类进行异步DBus通信.
�时此类�供了属性改�信�的分�和中继. @fn DDBusExtendedAbstractInterface::DDBusExtendedAbstractInterface(const QString &service, const QString &path, const char *interface, const QDBusConnection &connection, QObject *parent) @brief 构造函数 @param[in] service 该interface属于的�务 @param[in] path 该interface属于的对象路径 @param[in] interface 该interface实际连接的接� @param[in] connection 用于连接该interface的DBus连接 @param[in] parent 父对象 @note 该构造函数�到�护, �有�对象�能访问. @property Dtk::Core::DDBusExtendedAbstractInterface::sync @brief 是��步获�属性 @details 当sync为false的时候, 在调用属性的get函数的时候会一直返回空值, 解决方法是监�属性的changed信�并自行�存一份缓存, 让changed信�修改这个缓存. @property Dtk::Core::DDBusExtendedAbstractInterface::useCache @brief 是�使用缓存 @details 如果使用缓存, 在内部获�属性的时候将��进行DBus调用更新属性. @fn inline bool DDBusExtendedAbstractInterface::sync() const @brief 获�是��步 @sa [sync](@ref Dtk::Core::DDBusExtendedAbstractInterface::sync) @fn void DDBusExtendedAbstractInterface::setSync(bool sync, bool autoStart) @brief 设置是��步和自�动 @param[in] sync 是��步 @param[in] autoStart 是�自�动 @sa [sync](@ref Dtk::Core::DDBusExtendedAbstractInterface::sync) @fn void DDBusExtendedAbstractInterface::setSync(bool sync) @brief 设置是��步 @param[in] sync 是�是�步模� @sa [sync](@ref Dtk::Core::DDBusExtendedAbstractInterface::sync) @details 该函数内部实现调用[setSync](@ref DDBusExtendedAbstractInterface::setSync(bool sync, bool autoStart)), autoStart�数值为true, �默认自�动. @fn inline bool DDBusExtendedAbstractInterface::useCache() const @brief 获�是�使用缓存 @sa [useCache](@ref Dtk::Core::DDBusExtendedAbstractInterface::useCache) @fn inline void DDBusExtendedAbstractInterface::setUseCache() @brief 设置是�使用缓存 @sa [useCache](@ref Dtk::Core::DDBusExtendedAbstractInterface::useCache) @fn void DDBusExtendedAbstractInterface::getAllProperties() @brief 获�所有属性 @sa [sync](@ref Dtk::Core::DDBusExtendedAbstractInterface::sync) @details 该方法会调用org.freedesktop.DBus.Properties接�的GetAll方法, 获�所有属性并且��属性改�信�, 如果是�步模�(sync为true), 该方法会使用�步调用call.
sync为false的时候会使用异步调用asyncCall. @fn inline QDBusError DDBusExtendedAbstractInterface::lastExtendedError() const @brief 获å�–上一次的错误 @return QDBusError 上一次由DBus调用引起的错误 @fn void DDBusExtendedAbstractInterface::startServiceProcess() @brief å�¯åЍæœ�务进程 @details 该函数会调用org.freedesktop.DBusçš„æœ�务的/路径的StartServiceByName方法å�¯åЍDDBusExtendedAbstractInterface对应的Service. @fn void DDBusExtendedAbstractInterface::serviceValidChanged(const bool valid) const @brief æœ�务是å�¦æœ‰æ•ˆçжæ€�改å�˜ä¿¡å�· @param[in] valid æœ�务是å�¦æœ‰æ•ˆ @fn void DDBusExtendedAbstractInterface::serviceStartFinished(const quint32 ret) const @brief æœ�务å�¯åŠ¨å®Œæˆ�通知信å�· @param[in] ret å�¯åЍæœ�务的返回值 @details å�¯åЍæœ�务是调用org.freedesktop.DBusæœ�务的/路径的StartServiceByName方法, ret为StartServiceByName的返回值. @fn void DDBusExtendedAbstractInterface::propertyChanged(const QString &propertyName, const QVariant &value) @brief 属性改å�˜ä¿¡å�· @param[in] propertyName 改å�˜çš„属性å�� @param[in] value 改å�˜å�Žçš„属性值 @fn void DDBusExtendedAbstractInterface::propertyInvalidated(const QString &propertyName) @brief 属性失效通知信å�· @param[in] propertyName 失效的属性å�� @details 该信å�·ä¼šåœ¨DBus属性改å�˜ä½†æ˜¯æœ¬åœ°å��åº�列化失败的情况下å�‘出. @fn void DDBusExtendedAbstractInterface::asyncPropertyFinished(const QString &propertyName) @brief 异步获å�–属性完æˆ�通知信å�· @param[in] propertyName 获å�–æˆ�功的属性å�� @fn void DDBusExtendedAbstractInterface::asyncSetPropertyFinished(const QString &propertyName) @brief 异步设置属性完æˆ�通知信å�· @param[in] propertyName 设置æˆ�功的属性å�� @fn void DDBusExtendedAbstractInterface::asyncGetAllPropertiesFinished() @brief 异步获å�–所有属性完æˆ�的通知信å�· @sa [getAllProperties](@ref Dtk::Core::DDBusExtendedAbstractInterface::getAllProperties()) @details getAllProperties方法并没有返回值, 须监å�¬æ­¤ä¿¡å�·ä»¥å®žçŽ°å®Œæ•´åŠŸèƒ½. @fn void DDBusExtendedAbstractInterface::connectNotify(const QMetaMethod &signal) @brief ä¿¡å�·è¿žæŽ¥é€šçŸ¥å‡½æ•° @param[in] signal 连接到该对象的信å�· @details 该函数é‡�写了QObjectçš„connectNotify函数, 当有æŸ�一个信å�·è¿žæŽ¥åˆ°è¯¥å¯¹è±¡çš„æ—¶å€™, 该函数就会被调用. @fn void DDBusExtendedAbstractInterface::disconnectNotify(const QMetaMethod &signal) @brief ä¿¡å�·æ–­å¼€è¿žæŽ¥é€šçŸ¥å‡½æ•° @param[in] signal 断连的信å�· @details 该函数é‡�写了QObjectçš„disconnectNotify函数, 当有æŸ�一个连接到该对象的信å�·æ–­è¿žæ—¶, 该函数就会被调用. @fn QVariant DDBusExtendedAbstractInterface::internalPropGet(const char *propname, void *propertyPtr) @brief 内部属性获å�–函数 @param[in] propname 属性å�� @param[in] propertyPtr 属性缓存指针 @sa [useCache](@ref Dtk::Core::DDBusExtendedAbstractInterface::useCache) @sa [sync](@ref Dtk::Core::DDBusExtendedAbstractInterface::sync) @details 当useCache为true的时候, 该函数仅仅返回propertyPtr指å�‘的内存拷è´�. @fn void DDBusExtendedAbstractInterface::internalPropSet(const char *propname, const QVariant &value, void *propertyPtr) @brief 内部属性设置函数 @param[in] propname 属性å�� @param[in] value è¦�设置的值 @param[in] propertyPtr 属性缓存指针 @sa [sync](@ref Dtk::Core::DDBusExtendedAbstractInterface::sync) */ dtkcore-6.7.46/docs/util/ddbussender.zh_CN.dox000066400000000000000000000062711522615770400212130ustar00rootroot00000000000000/*! @~chinese @ingroup dutil @file include/util/ddbussender.h 本文件包å�«äº†DDBusSender类和相对应的工具类 @class DDBusData @brief DBusæ•°æ�®å­˜å‚¨ç±» @details 该类用æ�¥å­˜å‚¨DBus连接的相关信æ�¯ @var DDBusData::service @brief 请求调用æœ�务å�� @var DDBusData::path @brief 请求调用对象路径 @var DDBusData::interface @brief 请求调用接å�£å�� @var DDBusData::queryName @brief 请求调用函数å�� @var DDBusData::connection @brief 进行调用的维护的DBus连接 @class DDBusCaller @brief DBus接å�£è°ƒç”¨å·¥å…·ç±» @details 该类用于完æˆ�实际的DBus接å�£è°ƒç”¨ @fn template DDBusCaller DDBusCaller::arg(const T &argument) @brief 添加调用å�‚æ•° @details 改接å�£ç¬¦å�ˆé“¾å¼�编程规则 @param[in] argument 调用å�‚æ•° @return DDBusCaller 添加å�‚数之å�Žçš„caller @fn QDBusPendingCall DDBusCaller::call() @brief å�‘起实际调用 @return QDBusPendingCall 异步调用对象 @class DDBusProperty @brief DBus属性æ“�作对象 @details 该类的作用和DDBusCaller类似, 用于完æˆ�实际的调用, å…¶å°�装了org.freedesktop.DBus.Properties的接å�£, æ��供方便快æ�·åœ°å±žæ€§è®¿é—®æ–¹æ³•setå’Œget @fn QDBusPendingCall DDBusProperty::get() @brief 获å�–属性值 @return QDBusPendingCall 异步调用对象, 在完æˆ�之å�Žå�¯ç”¨äºŽèŽ·å�–属性值 @fn template QDBusPendingCall DDBusProperty::set(const T &value) @brief 设置属性值 @param[in] value 需è¦�设置的值 @return QDBusPendingCall 异步调用对象, 在完æˆ�之å�Žå�¯ç”¨äºŽåˆ¤æ–­è®¾ç½®æ“�作是å�¦æˆ�功 @class DDBusSender @brief DBus请求工具类 @details 通过该类的方法å�¯ä»¥æ–¹ä¾¿åœ°è°ƒç”¨æŸ�个æœ�务的æŸ�个方法. 该类的设计采用链å¼�编程, 多个api都会返回æ“�作之å�Žçš„对象, 这使得原本需è¦�使用QDBusMessage多行代ç �完æˆ�的调用å�ªéœ€è¦�一行代ç �å�³å�¯å®Œæˆ�. @fn DDBusSender DDBusSender::service(const QString &service) @brief 设置请求æœ�务å�� @param[in] service 请求æœ�务å�� @return DDBusSender 设置之å�Žçš„sender @fn DDBusSender DDBusSender::interface(const QString &interface) @brief 设置请求接å�£å�� @param[in] interface 请求接å�£å�� @return DDBusSender 设置之å�Žçš„sender @fn DDBusSender DDBusSender::path(const QString &path) @brief 设置请求对象路径 @param[in] path 请求对象路径 @return DDBusSender 设置之å�Žçš„sender @fn DDBusCaller DDBusSender::method(const QString &method) @brief 设置请求方法å��并获å�–请求调用对象 @details ç¡®ä¿�在调用该方法之å‰�, service, pathå’Œinterface都已ç»�被正确设置 @param[in] method 请求方法å�� @return DDBusCaller 方法调用工具对象, 调用该对象的call函数å�³å�¯å®Œæˆ�最终调用 @fn DDBusProperty DDBusSender::property(const QString &property) @brief 设置访问的属性å��并获得属性æ“�作对象 @details ç¡®ä¿�在调用该方法之å‰�, service, pathå’Œinterface都已ç»�被正确设置 @param[in] property 访问属性å�� @return DDBusProperty 属性æ“�作对象 @fn static DDBusSender DDBusSender::system() @brief 获å�– systembus 访问的能力 @details DDBusSender 默认使用 sessionbus ,此接å�£æ��ä¾› systembus 的访问能力 @return DDBusSender å�¯ä»¥è®¿é—® systembus çš„ sender 对象 */ dtkcore-6.7.46/docs/util/ddisksizeformatter.zh_CN.dox000066400000000000000000000033061522615770400226220ustar00rootroot00000000000000/*! @~chinese @ingroup dutil @file include/util/ddisksizeformatter.h 本文件定义了用于转æ�¢ç£�盘大å°�å�•ä½�的类DDiskSizeFormatter @class Dtk::Core::DDiskSizeFormatter @brief ç£�盘大å°�å�•ä½�转æ�¢ç±» @details 继承自DAbstractUnitFormatter, 支æŒ�最å°�çš„å�•ä½�为字节, 最大的å�•ä½�为T字节, 支æŒ�修改相邻å�•ä½�之间的进率, 是采用1000还是1024. 默认使用1000作为进率 @enum Dtk::Core::DDiskSizeFormatter::DiskUnits @brief ç£�盘大å°�å�•ä½�枚举 @var Dtk::Core::DDiskSizeFormatter::DiskUnits Dtk::Core::DDiskSizeFormatter::B @brief 字节 @var Dtk::Core::DDiskSizeFormatter::DiskUnits Dtk::Core::DDiskSizeFormatter::K @brief å�ƒå­—节 @var Dtk::Core::DDiskSizeFormatter::DiskUnits Dtk::Core::DDiskSizeFormatter::M @brief 兆字节 @var Dtk::Core::DDiskSizeFormatter::DiskUnits Dtk::Core::DDiskSizeFormatter::G @brief å�‰å­—节 @var Dtk::Core::DDiskSizeFormatter::DiskUnits Dtk::Core::DDiskSizeFormatter::T @brief 太字节| @fn QString DDiskSizeFormatter::unitStr(int unitId) const override @brief 获å�–unitId对应å�•ä½�的字符串表示 @param[in] unitId å�•ä½�id @return QString 字符串表示 @fn DDiskSizeFormatter DDiskSizeFormatter::rate(int rate) @brief 设置当å‰�çš„å�•ä½�进率 @param[in] rate 需è¦�设置的进率 @return DDiskSizeFormatter 设置之å�Žçš„formatter @fn int DDiskSizeFormatter::unitMin() const override @brief 获å�–最å°�çš„å�•ä½�枚举 @return int 最å°�çš„å�•ä½� @fn int DDiskSizeFormatter::unitMax() const override @brief 获å�–最大的å�•ä½�枚举 @return int 最大的å�•ä½� @fn uint DDiskSizeFormatter::unitConvertRate(int unitId) const override @brief 获å�–unitId对应å�•ä½�到下一个å�•ä½�的进率 @param[in] unitId 当å‰�å�•ä½�id */ dtkcore-6.7.46/docs/util/dtextencoding.zh_CN.dox000066400000000000000000000117731522615770400215530ustar00rootroot00000000000000/*! @~chinese @ingroup dutil @file include/util/dtextencoding.h @details 本文件包å�«æ–‡æœ¬ç¼–ç �识别和文本编ç �转æ�¢çš„公共接å�£ã€‚ @class Dtk::Core::DTextEncoding @brief 文本编ç �ä¿¡æ�¯ç±»ï¼Œæ��供文本编ç �识别和文本编ç �转æ�¢çš„公共接å�£ã€‚ @details æ��供文本编ç �识别和文本编ç �转æ�¢çš„公共接å�£ï¼Œé»˜è®¤ä½¿ç”¨ QTextCodec 进行检测, 若系统环境中存在 libuchardet.so å�Š libicuuc.so 库,å�¯æ‹“展支æŒ�的编ç �æ ¼å¼�。 @fn QByteArray Dtk::Core::DTextEncoding::detectTextEncoding(const QByteArray &content) @brief 检测给定文本的编ç �æ ¼å¼�。 @details 默认使用 QTextCodec 检测,若系统环境中存在 libuchardet.so å�Š libicuuc.so 库,å�¯æ‹“展支æŒ�的编ç �æ ¼å¼�。 检测会判断最接近的编ç �æ ¼å¼�,未æˆ�功识别或为 ASCII ç¼–ç �æ ¼å¼�,将返回 UTF-8 ç¼–ç �æ ¼å¼�。 @param[in] content 待检测的文本内容 @return 文本编ç �æ ¼å¼� @fn QByteArray Dtk::Core::DTextEncoding::detectFileEncoding(const QString &fileName, bool *isOk) @brief 检测给定文件的文本编ç �æ ¼å¼�,将读å�–文件头部最多 64KB 的文本用于检测。若文件访问失败,返回空编ç �æ ¼å¼�。 @param[in] fileName 文件路径 @param[out] isOk 检测是å�¦æˆ�功,主è¦�判断文件内容能å�¦æ­£ç¡®è¯»å�– @return 文本编ç �æ ¼å¼� @sa DTextEncoding::detectTextEncoding @fn bool Dtk::Core::DTextEncoding::convertTextEncoding(QByteArray &content, QByteArray &outContent, const QByteArray &toEncoding, const QByteArray &fromEncoding, QString *errString) @brief 将输入的文本 `content` 从 `fromEncoding` ç¼–ç �æ ¼å¼�转æ�¢åˆ° `toEncoding` ç¼–ç �æ ¼å¼�,转æ�¢å�Žçš„æ–‡æœ¬ä¿�存到 `outContent` 。 若转æ�¢è¿‡ç¨‹ä¸­å‡ºçŽ°é”™è¯¯ï¼Œå°†è¿”å›ž false , 并设置 `errString` 错误信æ�¯ï¼Œå·²è½¬æ�¢çš„æ–‡æœ¬ä»�会写入 `outContent` 。 @note 当处ç�†å¤§é‡�文本数æ�®æ—¶ï¼Œéœ€è€ƒè™‘并行处ç�†ï¼Œé˜²æ­¢é˜»å¡žçº¿ç¨‹ã€‚ @param[in] content 传入的文本 @param[out] outContent ç¼–ç �转æ�¢å�Žçš„æ–‡æœ¬ @param[in] toEncoding 转æ�¢çš„ç¼–ç �æ ¼å¼� @param[in] fromEncoding 原始的编ç �æ ¼å¼�,默认为空,会通过 `DTextEncoding::detectTextEncoding` 检测编ç �æ ¼å¼� @param[out] errString 错误信æ�¯ @return 是å�¦è½¬æ�¢æˆ�功 @sa DTextEncoding::convertTextEncodingEx @fn bool Dtk::Core::DTextEncoding::convertTextEncodingEx(QByteArray &content, QByteArray &outContent, const QByteArray &toEncoding, const QByteArray &fromEncoding, QString *errString, int *convertedBytes) @brief 将输入的文本 `content` 从 `fromEncoding` ç¼–ç �æ ¼å¼�转æ�¢åˆ° `toEncoding` ç¼–ç �æ ¼å¼�,转æ�¢å�Žçš„æ–‡æœ¬ä¿�存到 `outContent` 。 若转æ�¢è¿‡ç¨‹ä¸­å‡ºçŽ°é”™è¯¯ï¼Œå°†è¿”å›ž false , 并设置 `errString` 错误信æ�¯ï¼Œå·²è½¬æ�¢çš„æ–‡æœ¬ä»�会写入 `outContent` 。 @note 当处ç�†å¤§é‡�文本数æ�®æ—¶ï¼Œéœ€è€ƒè™‘并行处ç�†ï¼Œé˜²æ­¢é˜»å¡žçº¿ç¨‹ã€‚ @note 返回 false 时,已转æ�¢çš„æ–‡æœ¬ä»�会写入 `outContent` ,å�Œæ—¶ `convertedBytes` 会记录已转æ�¢æ•°æ�®é•¿åº¦ï¼Œä½ å�¯ä»¥å†³å®šä¿�留或移除转æ�¢æ–‡æœ¬ã€‚ @param[in] content 传入的文本 @param[out] outContent ç¼–ç �转æ�¢å�Žçš„æ–‡æœ¬ @param[in] toEncoding 转æ�¢çš„ç¼–ç �æ ¼å¼� @param[in] fromEncoding 原始的编ç �æ ¼å¼�,默认为空,会通过 `DTextEncoding::detectTextEncoding` 检测编ç �æ ¼å¼� @param[out] errString 错误信æ�¯ @param[out] convertedBytes 已转æ�¢çš„ `content` æ•°æ�®é•¿åº¦ï¼Œè‹¥è½¬æ�¢è¿‡ç¨‹å‡ºçŽ°é”™è¯¯ï¼Œè¿™ä¸ªå€¼ä¼šæŒ‡å�‘异常字符出现的ä½�ç½® @return 是å�¦è½¬æ�¢æˆ�功 @fn bool DTextEncoding::convertFileEncoding(const QString &fileName, const QByteArray &toEncoding, const QByteArray &fromEncoding, QString *errString) @brief 读å�–输入的 `fileName` 文件内容,将文件内容从 `fromEncoding` ç¼–ç �æ ¼å¼�转æ�¢åˆ° `toEncoding` ç¼–ç �æ ¼å¼�,转æ�¢å�Žçš„æ–‡æœ¬ä¿�存到 `fileName` 。 若转æ�¢è¿‡ç¨‹ä¸­å‡ºçŽ°é”™è¯¯ï¼Œå°†è¿”å›ž false , 并设置 `errString` 错误信æ�¯ï¼Œå·²è½¬æ�¢çš„æ–‡æœ¬ä¼šè¢«æŠ›å¼ƒã€‚ @param[in] fileName ä¼ å…¥å�Šä¿�存的文件路径 @param[in] toEncoding 转æ�¢çš„ç¼–ç �æ ¼å¼� @param[in] fromEncoding 原始的编ç �æ ¼å¼�,为空时会通过 `DTextEncoding::detectTextEncoding` 检测编ç �æ ¼å¼� @param[out] errString 错误信æ�¯ @return 是å�¦è½¬æ�¢æˆ�功 @sa DTextEncoding::convertTextEncoding @fn bool DTextEncoding::convertFileEncodingTo(const QString &fromFile, const QString &toFile, const QByteArray &toEncoding, const QByteArray &fromEncoding, QString *errString) @brief 读å�–输入的 `fromFile` 文件内容,将文件内容从 `fromEncoding` ç¼–ç �æ ¼å¼�转æ�¢åˆ° `toEncoding` ç¼–ç �æ ¼å¼�,转æ�¢å�Žçš„æ–‡æœ¬ä¿�存到 `toFile` 。 若转æ�¢è¿‡ç¨‹ä¸­å‡ºçŽ°é”™è¯¯ï¼Œå°†è¿”å›ž false , 并设置 `errString` 错误信æ�¯ï¼Œå·²è½¬æ�¢çš„æ–‡æœ¬ä¼šè¢«æŠ›å¼ƒã€‚ @param[in] fromFile 传入的文件路径 @param[in] toFile ä¿�存的文件路径 @param[in] toEncoding 转æ�¢çš„ç¼–ç �æ ¼å¼� @param[in] fromEncoding 原始的编ç �æ ¼å¼�,为空时会通过 `DTextEncoding::detectTextEncoding` 检测编ç �æ ¼å¼� @param[out] errString 错误信æ�¯ @return 是å�¦è½¬æ�¢æˆ�功 @sa DTextEncoding::convertTextEncoding */ dtkcore-6.7.46/docs/util/dthreadutils.zh_CN.dox000066400000000000000000000047501522615770400214050ustar00rootroot00000000000000/*! @~chinese @ingroup dutil @file include/util/dthreadutils.h 本文件定义了线程相关的帮助类 @class DThreadUtils @brief 线程帮助类 @details 本类主è¦�用æ�¥è¿›è¡Œå¼‚步线程调用, 此外本类所有的public接å�£éƒ½æ˜¯çº¿ç¨‹å®‰å…¨çš„ @fn static DThreadUtils& DThreadUtils::gui() @brief 获å�–以GUI线程åˆ�始化的é�™æ€�对象 @return DThreadUtils& é�™æ€�对象的引用 @fn QThread* DThreadUtils::thread() const noexcept @brief 获å�–DThreadUtils对应的线程 @return QThread* 对应线程的QThread对象的指针 @fn template inline auto run(QObject *context,typename QtPrivate::FunctionPointer::Object *obj, Func fun, Args &&...args) @brief 在对应的线程执行传入的æˆ�员函数, é�žé˜»å¡ž @param[in] context 对象上下文, 用æ�¥åœ¨æ‰§è¡Œè°ƒç”¨æ—¶åˆ¤æ–­å¯¹è±¡æ˜¯å�¦å­˜åœ¨ @param[in] obj 对象指针 @param[in] fun æˆ�员函数指针 @param[in] args 对应函数的å�‚æ•° @return 以æˆ�员函数返回值类型实例化的QFuture对象 @fn template inline auto run(typename QtPrivate::FunctionPointer::Object *obj, Func fun, Args &&...args) @brief 在对应的线程执行传入的æˆ�员函数, é�žé˜»å¡ž @param[in] obj 对象指针 @param[in] fun æˆ�员函数指针 @param[in] args 对应函数的å�‚æ•° @return 以æˆ�员函数返回值类型实例化的QFuture对象 @fn template inline QFuture, Args...>> run(QObject *context, Func fun, Args &&...args) @brief 在对应的线程执行传入的æˆ�员函数, é�žé˜»å¡ž @param[in] context 对象上下文, 用æ�¥åœ¨æ‰§è¡Œè°ƒç”¨æ—¶åˆ¤æ–­å¯¹è±¡æ˜¯å�¦å­˜åœ¨ @param[in] fun æˆ�员函数指针 @param[in] args 对应函数的å�‚æ•° @return 以æˆ�员函数返回值类型实例化的QFuture对象 @fn template inline QFuture, Args...>> run(Func fun, Args &&...args) @brief 在对应的线程执行传入的æˆ�员函数, é�žé˜»å¡ž @param[in] fun å�¯è°ƒç”¨å¯¹è±¡ @param[in] args 调用对应的å�‚æ•° @return 以函数返回值类型实例化的QFuture对象 @fn template inline decltype(auto) exec(T &&...args) @brief 在对应的线程执行传入的æˆ�员函数, 阻塞 @details 本函数是run函数的包装 @note 调用此函数的一方需è¦�ç¡®ä¿�对应线程有事件循环, å�¦åˆ™ä¼šæ— é™�等待 @param[in] args å�‚数包, 具体å�«ä¹‰å�‚考run函数 @return 传入函数的返回值 */ dtkcore-6.7.46/docs/util/dtimeunitformatter.zh_CN.dox000066400000000000000000000025001522615770400226260ustar00rootroot00000000000000/*! @~chinese @ingroup dutil @file include/util/dtimeunitformatter.h 该文件定义了用于转æ�¢æ—¶é—´å�•ä½�的工具类DTimeUnitFormatter. @class Dtk::Core::DTimeUnitFormatter @brief 转æ�¢æ—¶é—´å�•ä½�的工具类 @details 继承自DAbstractUnitFormatter, 支æŒ�最å°�å�•ä½�为秒, 最大å�•ä½�为天. @enum Dtk::Core::DTimeUnitFormatter::TimeUnits @brief æ—¶é—´å�•ä½�枚举 @var Dtk::Core::DTimeUnitFormatter::TimeUnits Dtk::Core::DTimeUnitFormatter::Seconds @brief ç§’ @var Dtk::Core::DTimeUnitFormatter::TimeUnits Dtk::Core::DTimeUnitFormatter::Minute @brief 分钟 @var Dtk::Core::DTimeUnitFormatter::TimeUnits Dtk::Core::DTimeUnitFormatter::Hour @brief å°�æ—¶ @var Dtk::Core::DTimeUnitFormatter::TimeUnits Dtk::Core::DTimeUnitFormatter::Day @brief 天 @fn QString DTimeUnitFormatter::unitStr(int unitId) const override @brief 获å�–unitId对应å�•ä½�的字符串表示 @param[in] unitId å�•ä½�id @return QString 字符串表示 @fn int DTimeUnitFormatter::unitMin() const override @brief 获å�–最å°�çš„å�•ä½�枚举 @return int 最å°�çš„å�•ä½� @fn int DTimeUnitFormatter::unitMax() const override @brief 获å�–最大的å�•ä½�枚举 @return int 最大的å�•ä½� @fn uint DTimeUnitFormatter::unitConvertRate(int unitId) const override @brief 获å�–unitId对应å�•ä½�到下一个å�•ä½�的进率 @param[in] unitId 当å‰�å�•ä½�id */ dtkcore-6.7.46/docs/util/dutil.zh_CN.dox000066400000000000000000000021021522615770400200170ustar00rootroot00000000000000/*! @chinese @ingroup dutil @file include/util/dutil.h 该文件定义和实现了一些å°�的工具函数. @fn QString DUtil::escapeToObjectPath(const QString &str) @brief 将字符串转义æˆ�符å�ˆDBus ObjectPath规则字符串 @param[in] str 需è¦�转义的字符串 @return 转义å�Žå­—符串 @attention ä¸�è¦�传入完整的dbus路径, å�¦åˆ™'/'也会被转义 @fn QString DUtil::unescapeFromObjectPath(const QString &str) @brief å°†DBus ObjectPath的部分路径转义æˆ�原æ�¥çš„字符串 @param[in] str 需è¦�转义的字符串 @return 转义å�Žå­—符串 @fn QString DUtil::getAppIdFromAbsolutePath(const QString &path) @brief 从desktop文件的ç»�对路径中æ��å�–出AppId @param[in] path 文件路径 @return 代表AppId的字符串 @attention AppIdå�¯èƒ½ä¸ºç©º, 代表无法获å�–AppId @fn QStringList DUtil::getAbsolutePathFromAppId(const QString &appId) @brief 从appId中获å�–符å�ˆæ�¡ä»¶çš„Desktop文件路径 @param[in] appId appçš„Id @return desktop文件的路径 @attention å�¯èƒ½æœ‰å¤šä¸ªdesktop文件的appId相å�Œ, 所以返回所有符å�ˆæ�¡ä»¶çš„列表 */ dtkcore-6.7.46/docs/util/index.zh_CN.md000066400000000000000000000003351522615770400176210ustar00rootroot00000000000000@page util util--DTK工具组件 # DTK util ## 模å�—介ç»� 该模å�—æ��供一些实用工具用于开å�‘,包括: + å�Œç§�æ•°æ�®ç±»çš„å�•ä½�转æ�¢æŽ¥å�£ + DBus接å�£å·¥å…·ç±» @defgroup dutil @brief dtk实用工具 dtkcore-6.7.46/dtkcore.cmake000066400000000000000000000142331522615770400157220ustar00rootroot00000000000000set(LIB_NAME dtk${DTK_NAME_SUFFIX}core) set(DtkCore Dtk${DTK_NAME_SUFFIX}Core) macro(add_sub_dir dir) add_subdirectory(${dir} ${OUTPUT_DIR}/${dir}) endmacro() message(STATUS "Compiling with DTK major version: ${DTK_VERSION_MAJOR}, Qt major version: ${QT_VERSION_MAJOR}") set(OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}) set (LIBRARY_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}") set (INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_INCLUDEDIR}/dtk${DTK_VERSION_MAJOR}/DCore") set (TOOL_INSTALL_DIR "${CMAKE_INSTALL_LIBEXECDIR}/dtk${DTK_VERSION_MAJOR}/DCore/bin") set (MKSPECS_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/qt${QT_VERSION_MAJOR}/mkspecs/modules" CACHE STRING "Install dir for qt pri files") set (FEATURES_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/qt${QT_VERSION_MAJOR}/mkspecs/features" CACHE STRING "Install dir for qt prf files") set (CONFIG_CMAKE_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/${DtkCore}" CACHE STRING "Install dir for cmake config files") set (DSG_PREFIX_PATH "${CMAKE_INSTALL_PREFIX}" CACHE STRING "PREFIX of DSG_DATA_DIRS") set (DSYSINFO_PREFIX "" CACHE STRING "PREFIX of DSysInfo") set (BUILD_EXAMPLES ON CACHE BOOL "Build examples") set (BUILD_VERSION "0" CACHE STRING "buildversion") option(BUIILD_TESTING "Build tests" OFF) if(UNIX AND NOT APPLE) set(LINUX TRUE) endif() set (BUILD_WITH_SYSTEMD OFF CACHE BOOL "Build with systemd") if (BUILD_WITH_SYSTEMD) add_definitions(-DBUILD_WITH_SYSTEMD) endif() set(CMAKE_CXX_STANDARD 17) # CXX FILAGS if("${QT_VERSION_MAJOR}" STREQUAL "5") set (BUILD_DOCS ON CACHE BOOL "Generate doxygen-based documentation") else() # dtk6 not build doc set (BUILD_DOCS OFF CACHE BOOL "Generate doxygen-based documentation") endif() if(NOT MSVC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -Wall -Wextra") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--as-needed") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--as-needed -pie") if (CMAKE_BUILD_TYPE STREQUAL "Debug") set(BUILD_TESTING ON) endif () string(REPLACE "-O3" "-Ofast" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") endif() if (BUILD_DOCS) add_sub_dir(docs) endif () add_sub_dir(src) if(BUILD_TESTING) message("==================================") message(" Now Testing is enabled ") message("==================================") enable_testing() add_sub_dir(tests) endif() if(BUILD_EXAMPLES) message("===================================") message("You can build and run examples now ") message("===================================") add_sub_dir(examples) endif() add_sub_dir(tools) configure_package_config_file(cmake/DtkCMake/DtkCMakeConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/cmake/DtkCMake/Dtk${DTK_NAME_SUFFIX}CMakeConfig.cmake INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/Dtk${DTK_NAME_SUFFIX}CMake" PATH_VARS TOOL_INSTALL_DIR) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/cmake/DtkCMake/Dtk${DTK_NAME_SUFFIX}CMakeConfig.cmake DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/Dtk${DTK_NAME_SUFFIX}CMake") configure_package_config_file(cmake/DtkTools/DtkToolsConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/cmake/DtkTools/Dtk${DTK_NAME_SUFFIX}ToolsConfig.cmake INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/Dtk${DTK_NAME_SUFFIX}Tools PATH_VARS TOOL_INSTALL_DIR) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/cmake/DtkTools/Dtk${DTK_NAME_SUFFIX}ToolsConfig.cmake DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/Dtk${DTK_NAME_SUFFIX}Tools") install(FILES cmake/DtkTools/DtkSettingsToolsMacros.cmake DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/Dtk${DTK_NAME_SUFFIX}Tools" RENAME Dtk${DTK_NAME_SUFFIX}SettingsToolsMacros.cmake) install(FILES cmake/DtkTools/DtkDBusMacros.cmake DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/Dtk${DTK_NAME_SUFFIX}Tools") install(FILES ${CMAKE_SOURCE_DIR}/cmake/DtkTools/DtkDConfigMacros.cmake DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/Dtk${DTK_NAME_SUFFIX}Tools") if (DTK5) set(DCONFIG_DEPRECATED_FUNCS [=[ # deprecated since dtk6 function(dconfig_meta_files) dtk_add_config_meta_files(${ARGV}) endfunction() function(dconfig_override_files) dtk_add_config_override_files(${ARGV}) endfunction()]=]) endif() configure_package_config_file(cmake/DtkDConfig/DtkDConfigConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/cmake/DtkDConfig/Dtk${DTK_NAME_SUFFIX}DConfigConfig.cmake INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/Dtk${DTK_NAME_SUFFIX}DConfig" PATH_VARS TOOL_INSTALL_DIR) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/cmake/DtkDConfig/Dtk${DTK_NAME_SUFFIX}DConfigConfig.cmake DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/Dtk${DTK_NAME_SUFFIX}DConfig") configure_package_config_file(misc/DtkCoreConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/${DtkCore}Config.cmake INSTALL_DESTINATION ${CONFIG_CMAKE_INSTALL_DIR} PATH_VARS TOOL_INSTALL_DIR) write_basic_package_version_file( "${CMAKE_CURRENT_BINARY_DIR}/${DtkCore}ConfigVersion.cmake" VERSION ${DTK_VERSION} COMPATIBILITY SameMajorVersion ) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${DtkCore}Config.cmake DESTINATION ${CONFIG_CMAKE_INSTALL_DIR}) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${DtkCore}ConfigVersion.cmake DESTINATION ${CONFIG_CMAKE_INSTALL_DIR}) configure_file(misc/dtkcore.pc.in ${LIB_NAME}.pc @ONLY) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${LIB_NAME}.pc DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") configure_file(misc/qt_lib_dtkcore.pri.in qt_lib_dtkcore.pri @ONLY) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/qt_lib_dtkcore.pri DESTINATION "${MKSPECS_INSTALL_DIR}") install(FILES misc/dtk_install_dconfig.prf DESTINATION ${FEATURES_INSTALL_DIR}) set(CONFIGNAME ${PROJECT_BINARY_DIR}/dtkcore_config.h) file(WRITE ${CONFIGNAME} "// it is auto make config\n" "#define DTK_VERSION_MAJOR ${DTK_VERSION_MAJOR}\n" "#define DTK_VERSION_MINOR ${DTK_VERSION_MINOR}\n" "#define DTK_VERSION_PATCH ${DTK_VERSION_PATCH}\n" "#define DTK_VERSION_BUILD ${BUILD_VERSION}\n" "#define DTK_VERSION_STR \"${DTK_VERSION}\"\n" "\n" ) file(GLOB CONFIGSOURCE include/DtkCore/*) foreach(FILENAME ${CONFIGSOURCE}) get_filename_component(thefile ${FILENAME} NAME) file(APPEND ${CONFIGNAME} "#define DTKCORE_CLASS_${thefile}\n") endforeach() install(FILES ${CONFIGNAME} DESTINATION "${INCLUDE_INSTALL_DIR}") dtkcore-6.7.46/examples/000077500000000000000000000000001522615770400151005ustar00rootroot00000000000000dtkcore-6.7.46/examples/CMakeLists.txt000066400000000000000000000002131522615770400176340ustar00rootroot00000000000000add_subdirectory(expintf-example) add_subdirectory(textcodec-example) add_subdirectory(filewatcher-example) add_subdirectory(dlog-example) dtkcore-6.7.46/examples/dlog-example/000077500000000000000000000000001522615770400174565ustar00rootroot00000000000000dtkcore-6.7.46/examples/dlog-example/CMakeLists.txt000066400000000000000000000005161522615770400222200ustar00rootroot00000000000000set(BIN_NAME dlog${DTK_NAME_SUFFIX}) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core) add_executable(${BIN_NAME} main.cpp ) target_link_libraries( ${BIN_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::Core ${LIB_NAME} ) target_include_directories(${BIN_NAME} PUBLIC ../../include/ ) dtkcore-6.7.46/examples/dlog-example/main.cpp000066400000000000000000000016431522615770400211120ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include #include DCORE_USE_NAMESPACE int main(int argc, char **argv) { QCoreApplication app(argc, argv); #ifdef Q_OS_LINUX DLogManager::registerJournalAppender(); #endif DLogManager::registerConsoleAppender(); dDebug() << "Anything that can possibly go wrong, will go wrong. "; qWarning() << "FBI Warning: Code smells."; qInfo() << "Why dark mode? Because light attracts bugs"; qCritical() << "You Should Never Run `sudo rm -rf /`"; { dDebugTime("Test the running time of a code block"); QTimer timer; timer.setInterval(500); QEventLoop loop; QObject::connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit); timer.start(); loop.exec(); } return app.exec(); } dtkcore-6.7.46/examples/expintf-example/000077500000000000000000000000001522615770400202065ustar00rootroot00000000000000dtkcore-6.7.46/examples/expintf-example/CMakeLists.txt000066400000000000000000000006421522615770400227500ustar00rootroot00000000000000set(BIN_NAME exprintf${DTK_NAME_SUFFIX}) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS DBus) add_executable(${BIN_NAME} main.cpp ) target_link_libraries( ${BIN_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::DBus ${LIB_NAME} ) target_include_directories(${BIN_NAME} PUBLIC ../../include/base ../../include/base/private/ ../../include/filesystem/ ../../include/ ) dtkcore-6.7.46/examples/expintf-example/main.cpp000066400000000000000000000031341522615770400216370ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "util/dexportedinterface.h" #include #include #include #include #include //#define ALTERNATE_USAGE DCORE_USE_NAMESPACE class CustomInterface : public DUtil::DExportedInterface { QVariant invoke(const QString &action, const QString ¶meters) const { QJsonDocument d = QJsonDocument::fromJson(parameters.toUtf8()); if (action == "pow") { return QVariant(pow(d["a"].toDouble(), d["b"].toDouble())); } return QVariant(); } }; int main(int argc, char **argv) { QCoreApplication app(argc, argv); QDBusConnection::sessionBus().registerService("com.deepin.ExpIntfTest"); #ifndef ALTERNATE_USAGE DUtil::DExportedInterface *ei = new DUtil::DExportedInterface(); ei->registerAction("quit", "quit the application", [&app](QString)->QVariant { app.quit(); return QVariant(); }); ei->registerAction("answer", "answer to the ultimate question of life, the universe, and everything", [](QString)->QVariant {return QVariant(42);}); ei->registerAction("sum", "returns the sum of two integers", [](QString p)->QVariant { QJsonDocument d = QJsonDocument::fromJson(p.toUtf8()); return QVariant(d["a"].toInt() + d["b"].toInt()); }); #else CustomInterface *cei = new CustomInterface(); cei->registerAction("pow", "raise a number to a power"); #endif return app.exec(); } dtkcore-6.7.46/examples/filewatcher-example/000077500000000000000000000000001522615770400210265ustar00rootroot00000000000000dtkcore-6.7.46/examples/filewatcher-example/CMakeLists.txt000066400000000000000000000005311522615770400235650ustar00rootroot00000000000000set(BIN_NAME filewatcher${DTK_NAME_SUFFIX}) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core) add_executable(${BIN_NAME} main.cpp ) target_link_libraries( ${BIN_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::Core ${LIB_NAME} ) target_include_directories(${BIN_NAME} PUBLIC ../../include/filesystem/ ../../include/ ) dtkcore-6.7.46/examples/filewatcher-example/main.cpp000066400000000000000000000025451522615770400224640ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "filesystem/dfilewatchermanager.h" #include #include #include DCORE_USE_NAMESPACE int main(int argc, char **argv) { QCoreApplication app(argc, argv); DFileWatcherManager manager; QTemporaryFile tmpfile1; tmpfile1.open(); QFile file1(tmpfile1.fileName()); QTemporaryFile tmpfile2; tmpfile2.open(); QFile file2(tmpfile2.fileName()); manager.add(tmpfile1.fileName()); manager.add(tmpfile2.fileName()); QObject::connect(&manager, &Dtk::Core::DFileWatcherManager::fileModified, &app, [=](const QString value) { qDebug() << "文件å�‘生å�˜åЍ:" << value; }); QObject::connect(&manager, &Dtk::Core::DFileWatcherManager::fileDeleted, &app, [=](const QString value) { qDebug() << "文件被删除:" << value; }); file1.open(QIODevice::WriteOnly | QIODevice::Text); file1.write("test"); file1.flush(); file1.close(); file2.open(QIODevice::WriteOnly | QIODevice::Text); file2.write("test"); file2.close(); qDebug() << manager.watchedFiles(); qDebug() << "---------------------------"; app.processEvents(); manager.removeAll(); qDebug() << manager.watchedFiles(); return app.exec(); } dtkcore-6.7.46/examples/textcodec-example/000077500000000000000000000000001522615770400205135ustar00rootroot00000000000000dtkcore-6.7.46/examples/textcodec-example/CMakeLists.txt000066400000000000000000000005211522615770400232510ustar00rootroot00000000000000set(BIN_NAME textcodec${DTK_NAME_SUFFIX}) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core) add_executable(${BIN_NAME} main.cpp ) target_link_libraries( ${BIN_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::Core ${LIB_NAME} ) target_include_directories(${BIN_NAME} PUBLIC ../../include/util/ ../../include/ ) dtkcore-6.7.46/examples/textcodec-example/main.cpp000066400000000000000000000075651522615770400221600ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include #include #include #include DCORE_USE_NAMESPACE void convertFileEncoding(const QString &fromFile, const QString &toFile, const QByteArray &toEncoding, const QByteArray &fromEncoding = QByteArray()) { QByteArray contentEncoding = fromEncoding; if (contentEncoding.isEmpty()) { bool isOk = false; contentEncoding = DTextEncoding::detectFileEncoding(fromFile, &isOk); if (!isOk) { qInfo().noquote() << QString("Detect file %1 encoding failed").arg(fromFile); return; } } QString errString; if (!DTextEncoding::convertFileEncodingTo(fromFile, toFile, toEncoding, contentEncoding, &errString)) { qInfo().noquote() << QString("Convert file %1 encoding from %2 to %3 failed. error: %4") .arg(fromFile) .arg(QString::fromUtf8(contentEncoding)) .arg(QString::fromUtf8(toEncoding)) .arg(errString); } else { qInfo().noquote() << QString("Convert file %1 encoding from %2 to %3 successed.") .arg(fromFile) .arg(QString::fromUtf8(contentEncoding)) .arg(QString::fromUtf8(toEncoding)); } } int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); QCoreApplication::setApplicationName("Text codec"); QCommandLineOption toEncodingOption({"t", "toEncoding"}, "Convert file encoding to specified encoding.", "encoding"); QCommandLineOption fromEncodingOption({"f", "fromEncoding"}, "Convert file encoding from specified encoding.", "encoding"); QCommandLineOption outputOption( {"o", "output"}, "Save converted text with file path, only supported when opening a single file.", "path"); QCommandLineParser parser; parser.setApplicationDescription("Text codec, provide encoding detection and encoding conversion."); parser.addHelpOption(); parser.addOption(toEncodingOption); parser.addOption(fromEncodingOption); parser.addOption(outputOption); parser.addPositionalArgument("file", "Open file.", "[file...]"); parser.process(app); const QStringList args = parser.positionalArguments(); if (args.isEmpty()) { parser.showHelp(); } const QStringList fileArgs = parser.positionalArguments(); if (fileArgs.isEmpty()) { qInfo().noquote() << "Not set open file."; return 0; } if (parser.isSet(outputOption)) { if (fileArgs.size() > 1) { qInfo().noquote() << "Output file path only supported when opening a single file."; return 0; } else if (!parser.isSet(toEncodingOption)) { qInfo().noquote() << "Convert file with not set convert encoding."; } else { QString fromFile = fileArgs.first(); QString toFile = parser.value(outputOption); QByteArray toEncoding = parser.value(toEncodingOption).toUtf8(); convertFileEncoding(fromFile, toFile, toEncoding, parser.value(fromEncodingOption).toUtf8()); return 0; } } QByteArray toEncoding = parser.value(toEncodingOption).toUtf8(); for (QString fileName : fileArgs) { if (toEncoding.isEmpty()) { // Only display file encoding. qInfo().noquote() << fileName << DTextEncoding::detectFileEncoding(fileName); } else { // Convert file encoding. convertFileEncoding(fileName, fileName, toEncoding, parser.value(fromEncodingOption).toUtf8()); } } return 0; } dtkcore-6.7.46/include/000077500000000000000000000000001522615770400147055ustar00rootroot00000000000000dtkcore-6.7.46/include/DtkCore/000077500000000000000000000000001522615770400162405ustar00rootroot00000000000000dtkcore-6.7.46/include/DtkCore/DAbstractUnitFormatter000066400000000000000000000000441522615770400225540ustar00rootroot00000000000000#include "dabstractunitformatter.h" dtkcore-6.7.46/include/DtkCore/DBaseFileWatcher000066400000000000000000000000361522615770400212560ustar00rootroot00000000000000#include "dbasefilewatcher.h" dtkcore-6.7.46/include/DtkCore/DCapDir000066400000000000000000000000261522615770400174270ustar00rootroot00000000000000#include "dcapfile.h" dtkcore-6.7.46/include/DtkCore/DCapFile000066400000000000000000000000261522615770400175700ustar00rootroot00000000000000#include "dcapfile.h" dtkcore-6.7.46/include/DtkCore/DCapManager000066400000000000000000000000311522615770400202570ustar00rootroot00000000000000#include "dcapmanager.h" dtkcore-6.7.46/include/DtkCore/DConfig000066400000000000000000000000251522615770400174710ustar00rootroot00000000000000#include "dconfig.h" dtkcore-6.7.46/include/DtkCore/DConfigFile000066400000000000000000000000311522615770400202660ustar00rootroot00000000000000#include "dconfigfile.h" dtkcore-6.7.46/include/DtkCore/DDBusExtendedAbstractInterface000066400000000000000000000000541522615770400241110ustar00rootroot00000000000000#include "ddbusextendedabstractinterface.h" dtkcore-6.7.46/include/DtkCore/DDBusInterface000066400000000000000000000000341522615770400207420ustar00rootroot00000000000000#include "ddbusinterface.h" dtkcore-6.7.46/include/DtkCore/DDBusSender000066400000000000000000000000311522615770400202570ustar00rootroot00000000000000#include "ddbussender.h" dtkcore-6.7.46/include/DtkCore/DDciFile000066400000000000000000000000261522615770400175640ustar00rootroot00000000000000#include "ddcifile.h" dtkcore-6.7.46/include/DtkCore/DDesktopEntry000066400000000000000000000000331522615770400207160ustar00rootroot00000000000000#include "ddesktopentry.h" dtkcore-6.7.46/include/DtkCore/DDiskSizeFormatter000066400000000000000000000000401522615770400216720ustar00rootroot00000000000000#include "ddisksizeformatter.h" dtkcore-6.7.46/include/DtkCore/DError000066400000000000000000000000241522615770400173540ustar00rootroot00000000000000#include "derror.h" dtkcore-6.7.46/include/DtkCore/DExpected000066400000000000000000000000271522615770400200270ustar00rootroot00000000000000#include "dexpected.h" dtkcore-6.7.46/include/DtkCore/DExportedInterface000066400000000000000000000000401522615770400216740ustar00rootroot00000000000000#include "dexportedinterface.h" dtkcore-6.7.46/include/DtkCore/DFileServices000066400000000000000000000000331522615770400206460ustar00rootroot00000000000000#include "dfileservices.h" dtkcore-6.7.46/include/DtkCore/DFileSystemWatcher000066400000000000000000000000401522615770400216630ustar00rootroot00000000000000#include "dfilesystemwatcher.h" dtkcore-6.7.46/include/DtkCore/DFileWatcher000066400000000000000000000000321522615770400204570ustar00rootroot00000000000000#include "dfilewatcher.h" dtkcore-6.7.46/include/DtkCore/DFileWatcherManager000066400000000000000000000000411522615770400217520ustar00rootroot00000000000000#include "dfilewatchermanager.h" dtkcore-6.7.46/include/DtkCore/DLicenseInfo000066400000000000000000000000321522615770400204600ustar00rootroot00000000000000#include "dlicenseinfo.h" dtkcore-6.7.46/include/DtkCore/DLog000066400000000000000000000003731522615770400170130ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include dtkcore-6.7.46/include/DtkCore/DNotifySender000066400000000000000000000000331522615770400206740ustar00rootroot00000000000000#include "dnotifysender.h" dtkcore-6.7.46/include/DtkCore/DObject000066400000000000000000000000251522615770400174720ustar00rootroot00000000000000#include "dobject.h" dtkcore-6.7.46/include/DtkCore/DObjectPrivate000066400000000000000000000000271522615770400210270ustar00rootroot00000000000000#include "dobject_p.h" dtkcore-6.7.46/include/DtkCore/DPathBuf000066400000000000000000000000261522615770400176160ustar00rootroot00000000000000#include "dpathbuf.h" dtkcore-6.7.46/include/DtkCore/DPinyin000066400000000000000000000000251522615770400175320ustar00rootroot00000000000000#include "dpinyin.h" dtkcore-6.7.46/include/DtkCore/DRecentManager000066400000000000000000000000341522615770400207770ustar00rootroot00000000000000#include "drecentmanager.h" dtkcore-6.7.46/include/DtkCore/DSGApplication000066400000000000000000000000341522615770400207610ustar00rootroot00000000000000#include "dsgapplication.h" dtkcore-6.7.46/include/DtkCore/DSecureString000066400000000000000000000000331522615770400207000ustar00rootroot00000000000000#include "dsecurestring.h" dtkcore-6.7.46/include/DtkCore/DSettings000066400000000000000000000000271522615770400200660ustar00rootroot00000000000000#include "dsettings.h" dtkcore-6.7.46/include/DtkCore/DSettingsGroup000066400000000000000000000000341522615770400211010ustar00rootroot00000000000000#include "dsettingsgroup.h" dtkcore-6.7.46/include/DtkCore/DSettingsOption000066400000000000000000000000351522615770400212560ustar00rootroot00000000000000#include "dsettingsoption.h" dtkcore-6.7.46/include/DtkCore/DSingleton000066400000000000000000000000301522615770400202220ustar00rootroot00000000000000#include "dsingleton.h" dtkcore-6.7.46/include/DtkCore/DStandardPaths000066400000000000000000000000341522615770400210240ustar00rootroot00000000000000#include "dstandardpaths.h" dtkcore-6.7.46/include/DtkCore/DSysInfo000066400000000000000000000000261522615770400176570ustar00rootroot00000000000000#include "dsysinfo.h" dtkcore-6.7.46/include/DtkCore/DTextEncoding000066400000000000000000000000331522615770400206560ustar00rootroot00000000000000#include "dtextencoding.h" dtkcore-6.7.46/include/DtkCore/DThreadUtils000066400000000000000000000000321522615770400205120ustar00rootroot00000000000000#include "dthreadutils.h" dtkcore-6.7.46/include/DtkCore/DTimeUnitFormatter000066400000000000000000000000401522615770400217030ustar00rootroot00000000000000#include "dtimeunitformatter.h" dtkcore-6.7.46/include/DtkCore/DTrashManager000066400000000000000000000000331522615770400206370ustar00rootroot00000000000000#include "dtrashmanager.h" dtkcore-6.7.46/include/DtkCore/DUtil000066400000000000000000000000231522615770400171770ustar00rootroot00000000000000#include "dutil.h" dtkcore-6.7.46/include/DtkCore/DVtableHook000066400000000000000000000000311522615770400203170ustar00rootroot00000000000000#include "dvtablehook.h" dtkcore-6.7.46/include/DtkCore/DtkCores000066400000000000000000000022031522615770400176760ustar00rootroot00000000000000#ifndef DTK_CORE_MODULE_H #define DTK_CORE_MODULE_H #include "dtkcore_global.h" #include "dconfigfile.h" #include "dobject.h" #include "dsingleton.h" #include "dutil.h" #include "dpinyin.h" #include "dtimeunitformatter.h" #include "dabstractunitformatter.h" #include "ddisksizeformatter.h" #include "ddbussender.h" #include "drecentmanager.h" #include "dnotifysender.h" #include "dexportedinterface.h" #include "dvtablehook.h" #include "dfileservices.h" #include "dthreadutils.h" #include "dasync.h" #include "dtimedloop.h" #include "RollingFileAppender.h" #include "Logger.h" #include "FileAppender.h" #include "ConsoleAppender.h" #include "AbstractStringAppender.h" #include "AbstractAppender.h" #include "LogManager.h" #include "dbasefilewatcher.h" #include "dfilesystemwatcher.h" #include "dfilewatcher.h" #include "dfilewatchermanager.h" #include "dpathbuf.h" #include "dstandardpaths.h" #include "dtrashmanager.h" #include "gsettingsbackend.h" #include "qsettingbackend.h" #include "dsettings.h" #include "dsettingsoption.h" #include "dsettingsgroup.h" #include "dsettingsbackend.h" #include "dsettingsdconfigbackend.h" #include "ddcifile.h" #endif dtkcore-6.7.46/include/base/000077500000000000000000000000001522615770400156175ustar00rootroot00000000000000dtkcore-6.7.46/include/base/derror.h000066400000000000000000000063401522615770400172700ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DERROR_H #define DERROR_H #include "dtkcore_global.h" #include #include DCORE_BEGIN_NAMESPACE /** * @brief 对于错误的包装类 */ class DError { public: /*! * @brief 默认构造函数 * @attention 错误代ç �默认为-1,错误信æ�¯é»˜è®¤ä¸ºç©º */ DError() noexcept : m_code(-1) , m_msg() { } /*! * @brief æ‹·è´�构造函数 */ DError(const DError &e) noexcept : m_code(e.m_code) , m_msg(e.m_msg) { } /*! * @brief 移动构造函数 * @attention 移动å�ŽåŽŸå¯¹è±¡ä¸�å�¯ç”¨ */ DError(DError &&e) noexcept : m_code(e.m_code) , m_msg(std::move(e).m_msg) { } /*! * @brief 构造函数 * @param[in] code 错误代ç � * @param[in] msg 错误信æ�¯ */ DError(qint64 code, const QString &msg) noexcept : m_code(code) , m_msg(msg) { } /*! * @brief 构造函数 * @param[in] code 错误代ç � * @param[in] msg 错误信æ�¯ * @attention 使用此构造函数å�ŽåŽŸé”™è¯¯ä¿¡æ�¯ä¸�å�¯ç”¨ */ DError(qint64 code, QString &&msg) noexcept : m_code(code) , m_msg(std::move(msg)) { } /*! * @brief é‡�载拷è´�赋值è¿�算符 */ DError &operator=(const DError &e) { m_code = e.m_code; m_msg = e.m_msg; return *this; } /*! * @brief é‡�载移动赋值è¿�算符 * @attention 赋值å�ŽåŽŸå¯¹è±¡ä¸�å�¯ç”¨ */ DError &operator=(DError &&e) { m_code = e.m_code; m_msg = std::move(e).m_msg; return *this; } /*! * @brief 默认æž�构函数 */ ~DError() = default; /*! * @brief 获å�–错误代ç � * @return 错误代ç � */ qint64 getErrorCode() const noexcept { return m_code; } /*! * @brief 设置错误代ç � * @param[in] code 错误代ç � */ void setErrorCode(qint64 code) &noexcept { m_code = code; } /*! * @brief 获å�–错误信æ�¯ * @return 错误信æ�¯çš„const引用 */ const QString &getErrorMessage() const & { return m_msg; } /*! * @brief 获å�–错误信æ�¯ * @attention 函数返回错误信æ�¯å�Žï¼ŒåŽŸä¿¡æ�¯ä¸�å�¯ç”¨ * @return 错误信æ�¯ */ QString getErrorMessage() const && { return std::move(m_msg); } /*! * @brief 设置错误信æ�¯ * @param[in] msg 错误信æ�¯ */ void setErrorMessage(const QString &msg) & { m_msg = msg; } /*! * @brief é‡�载相等è¿�算符 */ friend bool operator==(const DError &x, const DError &y) noexcept { return x.m_code == y.m_code and x.m_msg == y.m_msg; } /*! * @brief é‡�è½½ä¸�ç­‰è¿�算符 */ friend bool operator!=(const DError &x, const DError &y) noexcept { return !(x == y); } /*! * @brief é‡�载输出è¿�算符 */ friend QDebug operator<<(QDebug debug, const DError &e) { debug << "Error Code:" << e.m_code << "Message:" << e.m_msg; return debug; } private: qint64 m_code; QString m_msg; }; DCORE_END_NAMESPACE #endif dtkcore-6.7.46/include/base/dexpected.h000066400000000000000000001534201522615770400177420ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DEXPECTED_H #define DEXPECTED_H #include #include #include #include #include #include #include "derror.h" DCORE_BEGIN_NAMESPACE #define likely(x) __builtin_expect(static_cast((x)), 1) #define unlikely(x) __builtin_expect(reinterpret_cast((x)), 0) #if __cpp_exceptions #define _DEXPECTED_THROW_OR_ABORT(_EXC) (throw(_EXC)) #else #define _DEXPECTED_THROW_OR_ABORT(_EXC) (std::abort()) #endif template class DExpected; template class DUnexpected; template using _bool_constant = std::integral_constant; /*! * @brief 原ä½�构造标签 */ enum class emplace_tag { USE_EMPLACE /**< 使用原ä½�构造 */ }; /*! * @brief 从DUnexpected构造标签 */ enum class dunexpected_tag { DUNEXPECTED /**< 从DUnexpected构造 */ }; template struct remove_cvref { using type = typename std::remove_cv::type>::type; }; template class bad_result_access; template <> class bad_result_access : public std::exception { protected: bad_result_access() noexcept {} bad_result_access(const bad_result_access &) = default; bad_result_access(bad_result_access &&) = default; bad_result_access &operator=(const bad_result_access &) = default; bad_result_access &operator=(bad_result_access &&) = default; ~bad_result_access() = default; public: const char *what() const noexcept override { return "bad access to DExpected without value"; } }; template class bad_result_access : public bad_result_access { public: explicit bad_result_access(E _e) : m_error(std::move(_e)) { } E &error() &noexcept { return m_error; } const E &error() const &noexcept { return m_error; } E error() &&noexcept { return std::move(m_error); } const E error() const &&noexcept { return std::move(m_error); } private: E m_error; }; template auto construct_at(Type *p, Args &&...args) noexcept(noexcept(::new((void *)0) Type(std::declval()...))) -> decltype(::new((void *)0) Type(std::declval()...)) { return ::new ((void *)p) Type(std::forward(args)...); } namespace __dexpected { template void destroy_at_obj(ObjType *p) { p->~ObjType(); } template void destroy_at_arr(ArrType *p) { for (auto &elem : *p) destroy_at_obj(std::addressof(elem)); } } // namespace __dexpected template ::value, bool>::type = true> void destroy_at(Type *p) { __dexpected::destroy_at_arr(p); } template ::value, bool>::type = true> void destroy_at(Type *p) { __dexpected::destroy_at_obj(p); } namespace __dexpected { template struct Guard { static_assert(std::is_nothrow_move_constructible::value, "type T must bu nothrow_move_constructible"); explicit Guard(T &_x) : m_guarded(std::addressof(_x)) , m_tmp(std::move(_x)) { destroy_at(m_guarded); } ~Guard() { if (unlikely(m_guarded)) { construct_at(m_guarded, std::move(m_tmp)); } } Guard(const Guard &) = delete; Guard &operator=(const Guard &) = delete; T &&release() noexcept { return std::move(m_tmp); } private: T *m_guarded; T m_tmp; }; } // namespace __dexpected namespace __dexpected { template struct _is_dexpected : public std::false_type { }; template struct _is_dexpected> : public std::true_type { }; template struct _is_dunexpected : public std::false_type { }; template struct _is_dunexpected> : public std::true_type { }; template constexpr bool _can_be_dunexpected() { return std::is_object::value and !std::is_array::value and !_is_dunexpected() and !std::is_const::value and !std::is_volatile::value; } template ::value and std::is_nothrow_move_constructible::value, bool>::type = true> void reinit(Tp *_newVal, Up *_oldVal, Vp &&_arg) noexcept(std::is_nothrow_constructible::value) { destroy_at(_oldVal); construct_at(_newVal, std::forward(_arg)); } template ::value and !std::is_nothrow_move_constructible::value, bool>::type = true> void reinit(Tp *_newVal, Up *_oldVal, Vp &&_arg) noexcept(std::is_nothrow_constructible::value) { destroy_at(_oldVal); construct_at(_newVal, std::forward(_arg)); } template ::value and std::is_nothrow_move_constructible::value, bool>::type = true> void reinit(Tp *_newVal, Up *_oldVal, Vp &&_arg) noexcept(std::is_nothrow_constructible::value) { Tp _tmp(std::forward(_arg)); destroy_at(_oldVal); construct_at(_newVal, std::move(_tmp)); } template < typename Tp, typename Up, typename Vp, typename std::enable_if::value and !std::is_nothrow_move_constructible::value, bool>::type = true> void reinit(Tp *_newVal, Up *_oldVal, Vp &&_arg) noexcept(std::is_nothrow_constructible::value) { __dexpected::Guard _guard(*_oldVal); construct_at(_newVal, std::forward(_arg)); _guard.release(); } } // namespace __dexpected /*! * @brief * 类模æ�¿Dtk::Core::DUnexpected代表一个Dtk::Core::DExpected中存储的ä¸�期待的值 * @tparam E * ä¸�期待的值的类型,该类型ä¸�能是é�žå¯¹è±¡ç±»åž‹ï¼Œæ•°ç»„类型,Dtk::Core::DUnexpected的特化类型或有cvé™�定符的类型 */ template class DUnexpected { static_assert(__dexpected::_can_be_dunexpected(), "can't be dunexpected"); public: /*! * @brief Dtk::Core::DUnexpected的默认拷è´�构造函数 */ constexpr DUnexpected(const DUnexpected &) = default; /*! * @brief Dtk::Core::DUnexpected的默认移动构造函数 */ constexpr DUnexpected(DUnexpected &&) = default; /*! * @brief 使用类型E直接åˆ�始化一个Dtk::Core::DUnexpected对象 * @tparam Er 错误类型,默认为E * @param[in] _e 一个类型为Er的值 */ template ::type, DUnexpected>::value and !std::is_same::type, emplace_tag>::value and std::is_constructible::value, bool>::type = true> constexpr explicit DUnexpected(Er &&_e) noexcept(std::is_nothrow_constructible::value) : m_error(std::forward(_e)) { } /*! * @brief * 直接从å�‚数构造出一个包å�«é”™è¯¯ç±»åž‹ä¸ºE的对象的Dtk::Core::DUnexpected对象 * @tparam Args å�¯å�˜å�‚数模æ�¿ç±»åž‹ï¼Œè¿™é‡Œæ˜¯æž„造类型为E的对象所需è¦�çš„å�‚数的类型 * @param[in] args 构造类型为E的对象用到的å�‚æ•° * @attention * 为了区分是构造E还是Dtk::Core::DUnexpected,需è¦�在第一个å�‚数使用emplace_tag进行标识 */ template constexpr explicit DUnexpected(emplace_tag, Args &&...args) noexcept(std::is_nothrow_constructible::value) : m_error(std::forward(args)...) { static_assert(std::is_constructible::value, "can't construct E from args."); } /*! * @brief * 从å�‚æ•°å’Œåˆ�始化列表构造出一个包å�«é”™è¯¯ç±»åž‹ä¸ºE的对象的Dtk::Core::DUnexpected对象 * @tparam U åˆ�始化列表的模æ�¿ç±»åž‹ * @tparam Args å�¯å�˜å�‚数模æ�¿ç±»åž‹ï¼Œè¿™é‡Œæ˜¯æž„造类型为E的对象所需è¦�çš„å�‚数的类型 * @param _li 模æ�¿ç±»åž‹ä¸ºUçš„åˆ�始化列表 * @param[in] args 构造类型为E的对象用到的å�‚æ•° * @attention * 为了区分是构造E还是Dtk::Core::DUnexpected,需è¦�在第一个å�‚数使用emplace_tag进行标识 */ template constexpr explicit DUnexpected(emplace_tag, std::initializer_list _li, Args &&...args) noexcept( std::is_nothrow_constructible &, Args...>::value) : m_error(_li, std::forward(args)...) { } /*! * @brief Dtk::Core::DUnexpected的默认拷è´�赋值è¿�算符 */ DUnexpected &operator=(const DUnexpected &) = default; /*! * @brief Dtk::Core::DUnexpected的默认移动赋值è¿�算符 */ DUnexpected &operator=(DUnexpected &&) = default; /*! * @brief 获å�–Dtk::Core::DUnexpectedæŒ�有的ä¸�期待值 * @return ä¸�期待值的const左值引用 */ constexpr const E &error() const &noexcept { return m_error; } /*! * @brief 获å�–Dtk::Core::DUnexpectedæŒ�有的ä¸�期待值 * @return ä¸�期待值的左值引用 */ E &error() &noexcept { return m_error; } /*! * @brief 获å�–Dtk::Core::DUnexpectedæŒ�有的ä¸�期待值 * @attention 获å�–å�ŽåŽŸDtk::Core::DUnexpectedä¸�å�¯ç”¨ * @return ä¸�期待值的constå�³å€¼å¼•用 */ constexpr const E &&error() const &&noexcept { return std::move(m_error); } /*! * @brief 获å�–Dtk::Core::DUnexpectedæŒ�有的ä¸�期待值 * @attention 获å�–å�ŽåŽŸDtk::Core::DUnexpectedä¸�å�¯ç”¨ * @return ä¸�期待值的å�³å€¼å¼•用 */ E &&error() &&noexcept { return std::move(m_error); } /*! * @brief 交æ�¢ä¸¤ä¸ªDtk::Core::DUnexpected的值 * @param[in] _other å�¦ä¸€ä¸ªæ¨¡æ�¿å�‚数为Eçš„Dtk::Core::DUnexpected对象 */ void swap(DUnexpected &_other) { using std::swap; swap(m_error, _other.m_error); } /*! * @brief é‡�载相等è¿�算符 * @tparam Er å�¦ä¸€ä¸ªDtk::Core::DUnexpected的模æ�¿ç±»åž‹ * @param[in] _x 模æ�¿å�‚数为Eçš„Dtk::Core::DUnexpected对象 * @param[in] _y 模æ�¿å�‚数为Erçš„Dtk::Core::DUnexpected对象 */ template friend constexpr bool operator==(const DUnexpected &_x, const DUnexpected _y) { return _x.m_error == _y.error(); } /*! * @brief 交æ�¢ä¸¤ä¸ªDtk::Core::DUnexpected的值 */ friend void swap(DUnexpected &_x, DUnexpected &_y) { _x.swap(_y); } private: E m_error; }; /*! * @brief * 模æ�¿ç±»Dtk::Core::DExpectedæ��供存储两个值之一的方å¼�。Dtk::Core::DExpected的对象è¦�么ä¿�有一个期待的T类型值,è¦�么ä¿�有一个ä¸�期待的E类型值,ä¸�会没有值。 * @tparam T 期待的类型 * @tparam E ä¸�期待的类型 * @note 该类自DtkCore 5.6.3引入 */ template class DExpected { template friend class DExpected; static_assert(!std::is_reference::value, "type T can't be reference type"); static_assert(!std::is_function::value, "type T can't be function type"); static_assert(!std::is_same::type, dunexpected_tag>::value, "type T can't be dunexpected_tag"); static_assert(!std::is_same::type, emplace_tag>::value, "type T can't be emplace_tag"); static_assert(!__dexpected::_is_dunexpected::type>::value, "type T can't be DUnexpected"); static_assert(__dexpected::_can_be_dunexpected(), "type E can't be dunexpected"); template > static constexpr bool __cons_from_DExpected() { return std::is_constructible &>::value or std::is_constructible>::value or std::is_constructible>::value or std::is_constructible &>::value or std::is_convertible &, T>::value or std::is_convertible, T>::value or std::is_convertible &, T>::value or std::is_convertible, T>::value or std::is_constructible &>::value or std::is_constructible>::value or std::is_constructible &>::value or std::is_constructible>::value; } template static constexpr bool __explicit_conv() { return !std::is_convertible::value or !std::is_convertible::value; } static constexpr bool des_value() { return !std::is_trivially_destructible::value or !std::is_trivially_destructible::value; } template void assign_val(V &&_v) { if (m_has_value) { m_value = std::forward(_v); } else { __dexpected::reinit(std::addressof(m_value), std::addressof(m_error), std::forward(_v)); m_has_value = true; } } template void assign_err(V &&_v) { if (m_has_value) { __dexpected::reinit(std::addressof(m_error), std::addressof(m_value), std::forward(_v)); m_has_value = false; } else { m_error = std::forward(_v); } } template ::value, bool>::type = true> void swap_val_err(DExpected &_other) noexcept( std::is_nothrow_move_constructible::value and std::is_nothrow_move_constructible::value) { __dexpected::Guard _guard(_other.m_error); construct_at(std::addressof(_other.m_value), std::move(m_value)); _other.m_has_value = true; destroy_at(std::addressof(m_value)); construct_at(std::addressof(m_error), _guard.release()); m_has_value = false; } template ::value, bool>::type = true> void swap_val_err(DExpected &_other) noexcept( std::is_nothrow_move_constructible::value and std::is_nothrow_move_constructible::value) { __dexpected::Guard _guard(_other.m_value); construct_at(std::addressof(m_error), std::move(_other.m_error)); m_has_value = false; destroy_at(std::addressof(_other.m_error)); construct_at(std::addressof(_other.m_value), _guard.release()); _other.m_has_value = true; } public: using value_type = T; using error_type = E; using dunexpected_type = DUnexpected; template using rebind = DExpected; /*! * @brief Dtk::Core::DExpected的默认构造函数 */ template ::value, bool>::type = true> constexpr DExpected() noexcept(std::is_nothrow_default_constructible::value) : m_has_value(true) , m_value() { } /*! * @brief Dtk::Core::DExpected的拷è´�构造函数 */ template < typename std::enable_if::value and std::is_copy_constructible::value, bool>::type = true> DExpected(const DExpected &_x) noexcept( std::is_nothrow_copy_constructible::value and std::is_nothrow_copy_constructible::value) : m_has_value(_x.m_has_value) { if (m_has_value) construct_at(std::addressof(m_value), _x.m_value); else construct_at(std::addressof(m_error), _x.m_error); } /*! * @brief Dtk::Core::DExpected的移动构造函数 */ template < typename std::enable_if::value and std::is_move_constructible::value, bool>::type = true> DExpected(DExpected &&_x) noexcept( std::is_nothrow_move_constructible::value and std::is_nothrow_move_constructible::value) : m_has_value(_x.m_has_value) { if (m_has_value) construct_at(std::addressof(m_value), std::move(_x).m_value); else construct_at(std::addressof(m_error), std::move(_x).m_error); } /*! * @brief Dtk::Core::DExpected的拷è´�构造函数 * @tparam U å�¦ä¸€ä¸ªDtk::Core::DExpected的期待类型 * @tparam G å�¦ä¸€ä¸ªDtk::Core::DExpectedçš„ä¸�期待类型 * @param[in] _x 模æ�¿ç±»åž‹åˆ†åˆ«ä¸ºUå’ŒGçš„Dtk::Core::DExpected对象 */ template < typename U, typename G, typename std::enable_if::value and std::is_constructible::value and !__cons_from_DExpected() and !__explicit_conv(), bool>::type = true> DExpected(const DExpected &_x) noexcept( std::is_nothrow_constructible::value and std::is_nothrow_constructible::value) : m_has_value(_x.m_has_value) { if (m_has_value) construct_at(std::addressof(m_value), _x.m_value); else construct_at(std::addressof(m_error), _x.m_error); } /*! * @brief Dtk::Core::DExpected的拷è´�构造函数 * @tparam U å�¦ä¸€ä¸ªDtk::Core::DExpected的期待类型 * @tparam G å�¦ä¸€ä¸ªDtk::Core::DExpectedçš„ä¸�期待类型 * @param[in] _x 模æ�¿ç±»åž‹åˆ†åˆ«ä¸ºUå’ŒGçš„Dtk::Core::DExpected对象 * @attention 该拷è´�构造函数有explicit标识 */ template < typename U, typename G, typename std::enable_if::value and std::is_constructible::value and !__cons_from_DExpected() and __explicit_conv(), bool>::type = true> explicit DExpected(const DExpected &_x) noexcept( std::is_nothrow_constructible::value and std::is_nothrow_constructible::value) : m_has_value(_x.m_has_value) { if (m_has_value) construct_at(std::addressof(m_value), _x.m_value); else construct_at(std::addressof(m_error), _x.m_error); } /*! * @brief Dtk::Core::DExpected的移动构造函数 * @tparam U å�¦ä¸€ä¸ªDtk::Core::DExpected的期待类型 * @tparam G å�¦ä¸€ä¸ªDtk::Core::DExpectedçš„ä¸�期待类型 * @param[in] _x 模æ�¿ç±»åž‹åˆ†åˆ«ä¸ºUå’ŒGçš„Dtk::Core::DExpected对象 * @attention 构造å�Žå�¦ä¸€ä¸ªDtk::Core::DExpectedä¸�å�¯ç”¨ */ template ::value and std::is_constructible::value and !__cons_from_DExpected() and !__explicit_conv(), bool>::type = true> DExpected(DExpected &&_x) noexcept( std::is_nothrow_constructible::value and std::is_nothrow_constructible::value) : m_has_value(_x.m_has_value) { if (m_has_value) construct_at(std::addressof(m_value), std::move(_x).m_value); else construct_at(std::addressof(m_error), std::move(_x).m_error); } /*! * @brief Dtk::Core::DExpected的移动构造函数 * @tparam U å�¦ä¸€ä¸ªDtk::Core::DExpected的期待类型 * @tparam G å�¦ä¸€ä¸ªDtk::Core::DExpectedçš„ä¸�期待类型 * @param[in] _x 模æ�¿ç±»åž‹åˆ†åˆ«ä¸ºUå’ŒGçš„Dtk::Core::DExpected对象 * @attention 构造å�Žå�¦ä¸€ä¸ªDtk::Core::DExpectedä¸�å�¯ç”¨ï¼Œè¯¥å‡½æ•°æœ‰explicit标识 */ template ::value and std::is_constructible::value and !__cons_from_DExpected() and __explicit_conv(), bool>::type = true> explicit DExpected(DExpected &&_x) noexcept( std::is_nothrow_constructible::value and std::is_nothrow_constructible::value) : m_has_value(_x.m_has_value) { if (m_has_value) construct_at(std::addressof(m_value), std::move(_x).m_value); else construct_at(std::addressof(m_error), std::move(_x).m_error); } /*! * @brief * Dtk::Core::DExpected的移动构造函数,直接从期待类型构造出Dtk::Core::DExpected对象 * @tparam U Dtk::Core::DExpected的期待类型,默认为类型T * @param[in] _v 期待类型为U的对象 * @attention 构造å�ŽåŽŸå¯¹è±¡ä¸�å�¯ç”¨ï¼Œè¯¥å‡½æ•°æœ‰explicit标识 */ template ::type, DExpected>::value and !std::is_same::type, emplace_tag>::value and !__dexpected::_is_dunexpected::type>::value and std::is_constructible::value and !std::is_convertible::value, bool>::type = true> constexpr explicit DExpected(U &&_v) noexcept(std::is_nothrow_constructible::value) : m_has_value(true) , m_value(std::forward(_v)) { } /*! * @brief * Dtk::Core::DExpected的移动构造函数,直接从期待类型构造出Dtk::Core::DExpected对象 * @tparam U Dtk::Core::DExpected的期待类型,默认为类型T * @param[in] _v 期待类型为U的对象 * @attention 构造å�ŽåŽŸå¯¹è±¡ä¸�å�¯ç”¨ */ template ::type, DExpected>::value and !std::is_same::type, emplace_tag>::value and !__dexpected::_is_dunexpected::type>::value and std::is_constructible::value and std::is_convertible::value, bool>::type = true> constexpr DExpected(U &&_v) noexcept(std::is_nothrow_constructible::value) : m_has_value(true) , m_value(std::forward(_v)) { } /*! * @brief * Dtk::Core::DExpected的拷è´�构造函数,从Dtk::Core::DUnexpected构造出Dtk::Core::DExpected对象 * @tparam G Dtk::Core::DExpected的期待类型,默认为类型E * @param[in] _u 期待类型为Gçš„Dtk::Core::DUnexpected对象 * @attention 该函数有explicit标识 */ template ::value and !std::is_convertible::value, bool>::type = true> constexpr explicit DExpected(const DUnexpected &_u) noexcept(std::is_nothrow_constructible::value) : m_has_value(false) , m_error(_u.error()) { } /*! * @brief * Dtk::Core::DExpected的拷è´�构造函数,从Dtk::Core::DUnexpected构造出Dtk::Core::DExpected对象 * @tparam G Dtk::Core::DExpected的期待类型,默认为类型E * @param[in] _u 期待类型为Gçš„Dtk::Core::DUnexpected对象 */ template ::value and std::is_convertible::value, bool>::type = true> constexpr DExpected(const DUnexpected &_u) noexcept(std::is_nothrow_constructible::value) : m_has_value(false) , m_error(_u.error()) { } /*! * @brief * Dtk::Core::DExpected的移动构造函数,从Dtk::Core::DUnexpected构造出Dtk::Core::DExpected对象 * @tparam G Dtk::Core::DExpected的期待类型,默认为类型E * @param[in] _u 期待类型为Gçš„Dtk::Core::DUnexpected对象 * @attention 构造å�ŽåŽŸå¯¹è±¡ä¸�å�¯ç”¨ï¼Œè¯¥å‡½æ•°æœ‰explicit标识 */ template < typename G = E, typename std::enable_if::value and !std::is_convertible::value, bool>::type = true> constexpr explicit DExpected(DUnexpected &&_u) noexcept(std::is_nothrow_constructible::value) : m_has_value(false) , m_error(std::move(_u).error()) { } /*! * @brief * Dtk::Core::DExpected的移动构造函数,从Dtk::Core::DUnexpected构造出Dtk::Core::DExpected对象 * @tparam G Dtk::Core::DExpected的期待类型,默认为类型E * @param[in] _u 期待类型为Gçš„Dtk::Core::DUnexpected对象 * @attention 构造å�ŽåŽŸå¯¹è±¡ä¸�å�¯ç”¨ */ template ::value and std::is_convertible::value, bool>::type = true> constexpr DExpected(DUnexpected &&_u) noexcept(std::is_nothrow_constructible::value) : m_has_value(false) , m_error(std::move(_u).error()) { } /*! * @brief Dtk::Core::DExpected的转å�‘构造函数,从å�‚数直接构造出期待值 * @tparam Args 构造期待类型T所用到的å�‚数的类型 * @param[in] args 构造期待类型T所用到的å�‚æ•° * @attention * 为了区分是构造T还是Dtk::Core::DExpected,需è¦�在第一个å�‚数使用emplace_tag进行标识 */ template constexpr explicit DExpected(emplace_tag, Args &&...args) noexcept(std::is_nothrow_constructible::value) : m_has_value(true) , m_value(std::forward(args)...) { static_assert(std::is_constructible::value, "can't construct T from args."); } /*! * @brief Dtk::Core::DExpected的转å�‘构造函数,从å�‚数直接构造出期待值 * @tparam U åˆ�始化列表的模æ�¿å�‚æ•° * @tparam Args 构造期待类型T所用到的å�‚数的类型 * @param[in] _li 构造期待类型T所用到的åˆ�始化列表 * @param[in] args 构造期待类型T所用到的å�‚æ•° * @attention * 为了区分是构造T还是Dtk::Core::DExpected,需è¦�在第一个å�‚数使用emplace_tag进行标识 */ template constexpr explicit DExpected(emplace_tag, std::initializer_list _li, Args &&...args) noexcept( std::is_nothrow_constructible &, Args...>::value) : m_has_value(true) , m_value(_li, std::forward(args)...) { static_assert(std::is_constructible &, Args...>::value, "can't construct T from args."); } /*! * @brief Dtk::Core::DExpected的转å�‘构造函数,从å�‚数直接构造出ä¸�期待值 * @tparam Args 构造ä¸�期待类型E所用到的å�‚数的类型 * @param[in] args 构造ä¸�期待类型E所用到的å�‚æ•° * @attention * 为了区分是构造E还是Dtk::Core::DExpected,需è¦�在第一个å�‚数使用dunexpected_tag进行标识 */ template constexpr explicit DExpected(dunexpected_tag, Args &&...args) noexcept(std::is_nothrow_constructible::value) : m_has_value(false) , m_error(std::forward(args)...) { static_assert(std::is_constructible::value, "can't construct E from args."); } /*! * @brief Dtk::Core::DExpected的转å�‘构造函数,从å�‚数直接构造出ä¸�期待值 * @tparam U åˆ�始化列表的模æ�¿å�‚æ•° * @tparam Args 构造ä¸�期待类型E所用到的å�‚数的类型 * @param[in] _li 构造ä¸�期待类型E所用到的åˆ�始化列表 * @param[in] args 构造ä¸�期待类型E所用到的å�‚æ•° * @attention * 为了区分是构造E还是Dtk::Core::DExpected,需è¦�在第一个å�‚数使用dunexpected_tag进行标识 */ template constexpr explicit DExpected(dunexpected_tag, std::initializer_list _li, Args &&...args) noexcept( std::is_nothrow_constructible &, Args...>::value) : m_has_value(false) , m_error(_li, std::forward(args)...) { static_assert(std::is_constructible &, Args...>::value, "can't construct E from args."); } /*! * @brief Dtk::Core::DExpectedçš„æž�构函数 */ ~DExpected() { if (des_value()) { if (m_has_value) { destroy_at(std::addressof(m_value)); } else { destroy_at(std::addressof(m_error)); } } } /*! * @brief Dtk::Core::DExpected的默认拷è´�赋值è¿�算符 */ DExpected &operator=(const DExpected &) = delete; /*! * @brief Dtk::Core::DExpected的拷è´�赋值è¿�算符 * @param[in] _x å�Œç±»åž‹çš„Dtk::Core::DExpected对象 */ template ::value and std::is_copy_constructible::value and std::is_copy_assignable::value and std::is_copy_constructible::value and (std::is_nothrow_move_constructible::value or std::is_nothrow_move_constructible::value), bool>::type = true> DExpected &operator=(const DExpected &_x) noexcept( std::is_nothrow_copy_constructible::value and std::is_nothrow_copy_constructible::value and std::is_nothrow_copy_assignable::value and std::is_nothrow_copy_assignable::value) { if (_x.m_has_value) this->assign_val(_x.m_value); else this->assign_err(_x.m_error); return *this; } /*! * @brief Dtk::Core::DExpected的移动赋值è¿�算符 * @param[in] _x å�Œç±»åž‹çš„Dtk::Core::DExpected对象 * @attention 赋值å�ŽåŽŸå¯¹è±¡ä¸�å�¯ç”¨ */ template ::value and std::is_move_constructible::value and std::is_move_assignable::value and std::is_move_constructible::value and (std::is_nothrow_move_constructible::value or std::is_nothrow_move_constructible::value), bool>::type = true> DExpected &operator=(DExpected &&_x) noexcept( std::is_nothrow_move_constructible::value and std::is_nothrow_move_constructible::value and std::is_nothrow_move_assignable::value and std::is_nothrow_move_assignable::value) { if (_x.m_has_value) assign_val(std::move(_x.m_value)); else assign_err(std::move(_x.m_error)); return *this; } /*! * @brief Dtk::Core::DExpected的转å�‘赋值è¿�算符 * @tparam U 期待类型,默认为T * @param[in] _v 期待类型U的对象 */ template < typename U = T, typename std::enable_if::type>::value and !__dexpected::_is_dunexpected::type>::value and std::is_constructible::value and std::is_assignable::value and (std::is_nothrow_constructible::value or std::is_nothrow_move_constructible::value or std::is_nothrow_move_constructible::value), bool>::type = true> DExpected &operator=(U &&_v) { assign_val(std::forward(_v)); return *this; } /*! * @brief Dtk::Core::DExpected的拷è´�赋值è¿�算符 * @tparam G ä¸�期待类型 * @param[in] _e 模æ�¿ç±»åž‹ä¸ºGçš„Dtk::Core::DUnexpected对象 */ template ::value and std::is_assignable::value and (std::is_nothrow_constructible::value or std::is_nothrow_move_constructible::value or std::is_move_constructible::value), bool>::type = true> DExpected &operator=(const DUnexpected &_e) { assign_err(_e.error()); return *this; } /*! * @brief Dtk::Core::DExpected的移动赋值è¿�算符 * @tparam G ä¸�期待类型 * @param[in] _e 模æ�¿ç±»åž‹ä¸ºGçš„Dtk::Core::DUnexpected对象 * @attention 赋值å�ŽåŽŸå¯¹è±¡ä¸�å�¯ç”¨ */ template ::value and std::is_assignable::value and (std::is_nothrow_constructible::value or std::is_nothrow_move_constructible::value or std::is_move_constructible::value), bool>::type = true> DExpected &operator=(DUnexpected &&_e) { assign_err(std::move(_e).error()); return *this; } /*! * @brief 从å�‚数直接转å�‘构造期待值 * @tparam Args 构造期待值所用到的å�‚数的类型 * @param[in] args 构造期待值所用到的å�‚æ•° * @return 返回构造好的期待值的引用 */ template T &emplace(Args &&...args) noexcept { static_assert(std::is_nothrow_constructible::value, "type T should have nothrow_constructible"); if (m_has_value) destroy_at(std::addressof(m_value)); else { destroy_at(std::addressof(m_error)); m_has_value = true; } construct_at(std::addressof(m_value), std::forward(args)...); return m_value; } /*! * @brief 从å�‚数直接转å�‘构造期待值 * @tparam U åˆ�始化列表的模æ�¿å�‚æ•° * @tparam Args 构造期待值所用到的å�‚数的类型 * @param[in] args 构造期待值所用到的å�‚æ•° * @param[in] li 构造期待值所用到的å�‚数化列表 * @return 返回构造好的期待值的引用 */ template T &emplace(std::initializer_list li, Args &&...args) noexcept { static_assert(std::is_nothrow_constructible &, Args...>::value, "type T should have a noexcept constructor"); if (m_has_value) destroy_at(std::addressof(m_value)); else { destroy_at(std::addressof(m_error)); } construct_at(std::addressof(m_value), li, std::forward(args)...); return m_value; } // TODO:需è¦�swapå�—? /*! * @brief 交æ�¢ä¸¤ä¸ªDtk::Core::DExpected的值 * @param[in] _x å�¦ä¸€ä¸ªDtk::Core::DExpected对象 */ template ::value and std::is_move_constructible::value and (std::is_nothrow_move_constructible::value or std::is_nothrow_move_constructible::value), bool>::type = true> void swap(DExpected &_x) noexcept(std::is_nothrow_move_constructible::value and std::is_nothrow_move_constructible::value) { if (m_has_value) { if (_x.m_has_value) { using std::swap; swap(m_value, _x.m_value); } else { this->swap_val_err(_x); } } else { if (_x.m_has_value) _x.swap_val_err(*this); else { using std::swap; swap(m_error, _x.m_error); } } } /*! * @brief é‡�载箭头è¿�算符 * @return 一个指å�‘期待值的const指针 */ const T *operator->() const noexcept { assert(m_has_value); return std::addressof(m_value); } /*! * @brief é‡�载箭头è¿�算符 * @return 一个指å�‘期待值的指针 */ T *operator->() noexcept { assert(m_has_value); return std::addressof(m_value); } /*! * @brief é‡�载解引用è¿�算符 * @return 一个期待值的const左值引用 */ const T &operator*() const &noexcept { assert(m_has_value); return m_value; } /*! * @brief é‡�载解引用è¿�算符 * @return 一个期待值的左值引用 */ T &operator*() &noexcept { assert(m_has_value); return m_value; } /*! * @brief é‡�载解引用è¿�算符 * @return 一个期待值的constå�³å€¼å¼•用 */ const T &&operator*() const &&noexcept { assert(m_has_value); return std::move(m_value); } /*! * @brief é‡�载解引用è¿�算符 * @return 一个期待值的å�³å€¼å¼•用 */ T &&operator*() &&noexcept { assert(m_has_value); return std::move(m_value); } /*! * @brief bool转æ�¢å‡½æ•° * @return 表示Dtk::Core::DExpected是å�¦æœ‰å€¼çš„bool值 */ constexpr explicit operator bool() const noexcept { return m_has_value; } /*! * @brief 判断Dtk::Core::DExpected是å�¦æœ‰å€¼ * @return 表示是å�¦æœ‰å€¼çš„bool值 */ constexpr bool hasValue() const noexcept { return m_has_value; } /*! * @brief 获å�–Dtk::Core::DExpected的期待值 * @return 期待值的const左值引用 */ const T &value() const & { if (likely(m_has_value)) { return m_value; } _DEXPECTED_THROW_OR_ABORT(bad_result_access(m_error)); } /*! * @brief 获å�–Dtk::Core::DExpected的期待值 * @return 期待值的左值引用 */ T &value() & { if (likely(m_has_value)) { return m_value; } _DEXPECTED_THROW_OR_ABORT(bad_result_access(m_error)); } /*! * @brief 获å�–Dtk::Core::DExpected的期待值 * @return 期待值的constå�³å€¼å¼•用 * @attention 调用å�ŽæœŸå¾…值ä¸�å�¯ç”¨ */ const T &&value() const && { if (likely(m_has_value)) { return std::move(m_value); } _DEXPECTED_THROW_OR_ABORT(bad_result_access(m_error)); } /*! * @brief 获å�–Dtk::Core::DExpected的期待值 * @return 期待值的å�³å€¼å¼•用 * @attention 调用å�ŽæœŸå¾…值ä¸�å�¯ç”¨ */ T &&value() && { if (likely(m_has_value)) { return std::move(m_value); } _DEXPECTED_THROW_OR_ABORT(bad_result_access(m_error)); } /*! * @brief 获å�–Dtk::Core::DExpectedçš„ä¸�期待值 * @return ä¸�期待值的const左值引用 */ const E &error() const &noexcept { assert(!m_has_value); return m_error; } /*! * @brief 获å�–Dtk::Core::DExpectedçš„ä¸�期待值 * @return ä¸�期待值的左值引用 */ E &error() &noexcept { assert(!m_has_value); return m_error; } /*! * @brief 获å�–Dtk::Core::DExpectedçš„ä¸�期待值 * @return ä¸�期待值的constå�³å€¼å¼•用 * @attention 调用å�Žä¸�期待值ä¸�å�¯ç”¨ */ const E &&error() const &&noexcept { assert(!m_has_value); return std::move(m_error); } /*! * @brief 获å�–Dtk::Core::DExpectedçš„ä¸�期待值 * @return ä¸�期待值的å�³å€¼å¼•用 * @attention 调用å�Žä¸�期待值ä¸�å�¯ç”¨ */ E &&error() &&noexcept { assert(!m_has_value); return std::move(m_error); } // TODO:因为无法确定U转T时是å�¦ä¼šæŠ›å‡ºå¼‚常,所以都按抛出异常æ�¥ /*! * @brief 如果有期待值返回期待值,å�¦åˆ™è¿”回传入的默认值 * @tparam U 期待值的类型 * @param[in] _v 默认的期待值 * @return 期待值 */ template T value_or(U &&_v) const & { static_assert(std::is_copy_constructible::value, "type T should have an copy constructor."); static_assert(std::is_convertible::value, "type U must can be converted to T."); if (m_has_value) return m_value; return static_cast(std::forward(_v)); } /*! * @brief 如果有期待值返回期待值,å�¦åˆ™è¿”回传入的默认值 * @tparam U 期待值的类型 * @param[in] _v 默认的期待值 * @return 期待值 * @attention 如果由期待值,调用å�ŽåŽŸæœŸå¾…å€¼ä¸�å�¯ç”¨ï¼Œå�Œæ—¶ç±»åž‹Uè¦�å�¯ä»¥è½¬æ�¢æˆ�类型T */ template T value_or(U &&_v) && { static_assert(std::is_move_constructible::value, "type T must bu copy_constructible."); static_assert(std::is_convertible::value, "type U must can be converted to T."); if (m_has_value) return std::move(m_value); return static_cast(std::forward(_v)); } /*! *@brief é‡�载相等è¿�算符 */ template ::value, bool>::type = true> friend bool operator==(const DExpected &_x, const DExpected &_y) noexcept(noexcept(bool(*_x == *_y)) and noexcept(bool(_x.error() == _y.error()))) { if (_x.hasValue()) return _y.hasValue() and bool(*_x == *_y); else return !_y.hasValue() and bool(_x.error() == _x.error()); } /*! *@brief é‡�载相等è¿�算符 */ template friend constexpr bool operator==(const DExpected &_x, const U &_v) noexcept(noexcept(bool(*_x == _v))) { return _x.hasValue() && bool(*_x == _v); } /*! *@brief é‡�载相等è¿�算符 */ template friend constexpr bool operator==(const DExpected &_x, const DUnexpected &_e) noexcept(noexcept(bool(_x.error() == _e.error()))) { return !_x.hasValue() && bool(_x.error() == _e.error()); } /*! *@brief 交æ�¢ä¸¤ä¸ªDtk::Core::DExpected中的值 */ friend void swap(DExpected &_x, DExpected &_y) noexcept(noexcept(_x.swap(_y))) { _x.swap(_y); } private: bool m_has_value; union { T m_value; E m_error; }; }; /*! * @brief 对于Dtk::Core::DExpectedçš„voidå��特化,其他函数å�‚考原模æ�¿ç±» * @tparam E ä¸�期待值的类型 */ template class DExpected { static_assert(__dexpected::_can_be_dunexpected(), "type E can't be DUnexpected."); static constexpr bool des_value() { return !std::is_trivially_destructible::value; } template friend class DExpected; template > static constexpr bool __cons_from_DExpected() { return std::is_constructible &>::value and std::is_constructible>::value and std::is_constructible &>::value and std::is_constructible>::value; } template void assign_err(V &&_v) { if (m_has_value) { construct_at(std::addressof(m_error), std::forward(_v)); m_has_value = false; } else { m_error = std::forward(_v); } } public: using value_type = void; using error_type = E; using dunexpected_type = DUnexpected; template using rebind = DExpected; constexpr DExpected() noexcept : m_has_value(true) , m_void() { } template ::value, bool>::type = true> DExpected(const DExpected &_x) noexcept(std::is_nothrow_copy_constructible::value) : m_has_value(_x.m_has_value) , m_void() { if (!m_has_value) construct_at(std::addressof(m_error), _x.m_error); } template ::value, bool>::type = true> DExpected(DExpected &&_x) noexcept(std::is_nothrow_move_constructible::value) : m_has_value(_x.m_has_value) , m_void() { if (!m_has_value) construct_at(std::addressof(m_error), std::move(_x).m_error); } template ::value and std::is_constructible::value and !__cons_from_DExpected() and !std::is_convertible::value, bool>::type = true> explicit DExpected(const DExpected &_x) noexcept(std::is_nothrow_constructible::value) : m_has_value(_x.m_has_value) , m_void() { if (!m_has_value) construct_at(std::addressof(m_error), _x.m_error); } template ::value and std::is_constructible::value and !__cons_from_DExpected() and std::is_convertible::value, bool>::type = true> DExpected(const DExpected &_x) noexcept(std::is_nothrow_constructible::value) : m_has_value(_x.m_has_value) , m_void() { if (!m_has_value) construct_at(std::addressof(m_error), _x.m_error); } template ::value and std::is_constructible::value and __cons_from_DExpected() and !std::is_convertible::value, bool>::type = true> explicit DExpected(DExpected &&_x) noexcept(std::is_nothrow_constructible::value) : m_has_value(_x.m_has_value) , m_void() { if (!m_has_value) construct_at(std::addressof(m_error), std::move(_x).m_error); } template ::value and std::is_constructible::value and __cons_from_DExpected() and std::is_convertible::value, bool>::type = true> DExpected(DExpected &&_x) noexcept(std::is_nothrow_constructible::value) : m_has_value(_x.m_has_value) , m_void() { if (!m_has_value) construct_at(std::addressof(m_error), std::move(_x).m_error); } template ::value and !std::is_convertible::value, bool>::type = true> constexpr explicit DExpected(const DUnexpected &_u) noexcept(std::is_nothrow_constructible::value) : m_has_value(false) , m_error(_u.error()) { } template ::value and std::is_convertible::value, bool>::type = true> constexpr DExpected(const DUnexpected &_u) noexcept(std::is_nothrow_constructible::value) : m_has_value(false) , m_error(_u.error()) { } template < typename G = E, typename std::enable_if::value and !std::is_convertible::value, bool>::type = true> constexpr explicit DExpected(DUnexpected &&_u) noexcept(std::is_nothrow_constructible::value) : m_has_value(false) , m_error(std::move(_u).error()) { } template ::value and std::is_convertible::value, bool>::type = true> constexpr DExpected(DUnexpected &&_u) noexcept(std::is_nothrow_constructible::value) : m_has_value(false) , m_error(std::move(_u).error()) { } template constexpr explicit DExpected(emplace_tag) noexcept : DExpected() { } template constexpr explicit DExpected(dunexpected_tag, Args &&...args) noexcept(std::is_nothrow_constructible::value) : m_has_value(false) , m_error(std::forward(args)...) { static_assert(std::is_constructible::value, "type E can't construct from args"); } template constexpr explicit DExpected(dunexpected_tag, std::initializer_list _li, Args &&...args) noexcept(std::is_nothrow_constructible::value) : m_has_value(false) , m_error(_li, std::forward(args)...) { static_assert(std::is_constructible &, Args...>::value, "type E can't construct from args"); } ~DExpected() { if (des_value() and !m_has_value) { destroy_at(std::addressof(m_error)); } } DExpected &operator=(const DExpected &) = delete; template < typename std::enable_if::value and std::is_copy_assignable::value, bool>::type = true> DExpected &operator=(const DExpected &_x) noexcept( std::is_nothrow_copy_constructible::value and std::is_nothrow_copy_assignable::value) { if (_x.m_has_value) emplace(); else assign_err(_x.m_error); return *this; } template < typename std::enable_if::value and std::is_move_assignable::value, bool>::type = true> DExpected & operator=(DExpected &&_x) noexcept(std::is_nothrow_move_constructible::value and std::is_nothrow_move_assignable::value) { if (_x.m_has_value) emplace(); else assign_err(std::move(_x.m_error)); return *this; } template ::value and std::is_assignable::value, bool>::type = true> DExpected &operator=(const DUnexpected &_e) { assign_err(_e.error()); return *this; } template < typename G, typename std::enable_if::value and std::is_assignable::value, bool>::type = true> DExpected &operator=(DUnexpected &&_e) { assign_err(std::move(_e.error())); return *this; } void emplace() noexcept { if (!m_has_value) { destroy_at(std::addressof(m_error)); m_has_value = true; } } template ::value, bool>::type = true> void swap(DExpected &_x) noexcept(std::is_nothrow_move_constructible::value) { if (m_has_value) { if (!_x.m_has_value) { construct_at(std::addressof(m_error), std::move(_x.m_error)); destroy_at(std::addressof(_x.m_error)); m_has_value = false; _x.m_has_value = true; } } else { if (_x.m_has_value) { construct_at(std::addressof(_x.m_error), std::move(m_error)); destroy_at(std::addressof(m_error)); m_has_value = true; _x.m_has_value = false; } else { using std::swap; swap(m_error, _x.m_error); } } } constexpr explicit operator bool() const noexcept { return m_has_value; } constexpr bool hasValue() const noexcept { return m_has_value; } void operator*() const noexcept { assert(m_has_value); } void value() const & { if (likely(m_has_value)) return; _DEXPECTED_THROW_OR_ABORT(bad_result_access(m_error)); } void value() && { if (likely(m_has_value)) return; _DEXPECTED_THROW_OR_ABORT(bad_result_access(std::move(m_error))); } const E &error() const &noexcept { assert(!m_has_value); return m_error; } E &error() &noexcept { assert(!m_has_value); return m_error; } const E &&error() const &&noexcept { assert(!m_has_value); return std::move(m_error); } E &&error() &&noexcept { assert(!m_has_value); return std::move(m_error); } template ::value, bool>::type = true> friend bool operator==(const DExpected &_x, const DExpected &_y) noexcept(noexcept(bool(_x.error() == _y.error()))) { if (_x.hasValue()) return _y.hasValue(); else return !_y.hasValue() and bool(_x.error() == _y.error()); } template friend bool operator==(const DExpected &_x, const DUnexpected &_e) noexcept(noexcept(bool(_x.error() == _e.error()))) { return !_x.hasValue() && bool(_x.error() == _e.error()); } // TODO:å�¯èƒ½æ²¡æœ‰swap friend void swap(DExpected &_x, DExpected &_y) noexcept(noexcept(_x.swap(_y))) { _x.swap(_y); } private: bool m_has_value; union { struct { } m_void; E m_error; }; }; DCORE_END_NAMESPACE #endif dtkcore-6.7.46/include/base/dobject.h000066400000000000000000000016411522615770400174040ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2015 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DOBJECT_H #define DOBJECT_H #include #include "dtkcore_global.h" DCORE_BEGIN_NAMESPACE #define D_DECLARE_PRIVATE(Class) Q_DECLARE_PRIVATE_D(qGetPtrHelper(d_d_ptr),Class) #define D_DECLARE_PUBLIC(Class) Q_DECLARE_PUBLIC(Class) #define D_D(Class) Q_D(Class) #define D_Q(Class) Q_Q(Class) #define D_DC(Class) Q_D(const Class) #define D_QC(Class) Q_Q(const Class) #define D_PRIVATE_SLOT(Func) Q_PRIVATE_SLOT(d_func(), Func) class DObjectPrivate; class LIBDTKCORESHARED_EXPORT DObject { protected: DObject(DObject *parent = nullptr); DObject(DObjectPrivate &dd, DObject *parent = nullptr); virtual ~DObject(); QScopedPointer d_d_ptr; Q_DISABLE_COPY(DObject) D_DECLARE_PRIVATE(DObject) }; DCORE_END_NAMESPACE #endif // DOBJECT_H dtkcore-6.7.46/include/base/dsingleton.h000066400000000000000000000027161522615770400201440ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2016 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DSINGLETON_H #define DSINGLETON_H #include "dtkcore_global.h" DCORE_BEGIN_NAMESPACE /*! a simple singleton template for std c++ 11 or later. example: \code class ExampleSingleton : public QObject, public Dtk::DSingleton { Q_OBJECT friend class DSingleton; }; \endcode \note: for Qt, "public DSingleton" must be after QObject. */ /*! 通过c++11的特性实现的å�•例模æ�¿ 使用示例: ``` class ExampleSingleton : public QObject, public Dtk::DSingleton { Q_OBJECT friend class DSingleton; }; ``` \note 对于Qt程åº� public DSingleton" 必须在å�¸è½½QObjectå�Žé�¢å‡ºçŽ°ã€‚ */ template class LIBDTKCORESHARED_EXPORT DSingleton { public: #if DTK_VERSION < DTK_VERSION_CHECK(6, 0, 0, 0) QT_DEPRECATED_X("Use ref") static inline T *instance() { static T *_instance = new T; return _instance; } #endif static T& ref() { static T instance; return instance; } DSingleton(T&&) = delete; DSingleton(const T&) = delete; void operator= (const T&) = delete; protected: DSingleton() = default; virtual ~DSingleton() = default; }; DCORE_END_NAMESPACE #endif // DSINGLETON_H dtkcore-6.7.46/include/base/private/000077500000000000000000000000001522615770400172715ustar00rootroot00000000000000dtkcore-6.7.46/include/base/private/dobject_p.h000066400000000000000000000007241522615770400213760ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2015 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DOBJECT_P_H #define DOBJECT_P_H #include "dtkcore_global.h" DCORE_BEGIN_NAMESPACE class DObject; class LIBDTKCORESHARED_EXPORT DObjectPrivate { public: virtual ~DObjectPrivate(); protected: DObjectPrivate(DObject *qq); DObject *q_ptr; Q_DECLARE_PUBLIC(DObject) }; DCORE_END_NAMESPACE #endif // DOBJECT_P_H dtkcore-6.7.46/include/dci/000077500000000000000000000000001522615770400154445ustar00rootroot00000000000000dtkcore-6.7.46/include/dci/ddcifile.h000066400000000000000000000036751522615770400173730ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #pragma once #ifndef DTK_NO_PROJECT #include #include #else #define DCORE_BEGIN_NAMESPACE #define DCORE_END_NAMESPACE #define LIBDTKCORESHARED_EXPORT #define D_DECLARE_PRIVATE(Class) Class##Private *d; #endif #include QT_BEGIN_NAMESPACE class QIODevice; QT_END_NAMESPACE DCORE_BEGIN_NAMESPACE class DDciFilePrivate; class LIBDTKCORESHARED_EXPORT DDciFile #ifndef DTK_NO_PROJECT : public DObject #endif { D_DECLARE_PRIVATE(DDciFile) public: enum FileType { UnknowFile, File = 1, Directory = 2, Symlink = 3 }; static void registerFileEngine(); DDciFile(); explicit DDciFile(const QString &fileName); explicit DDciFile(const QByteArray &data); bool isValid() const; QString lastErrorString() const; bool writeToFile(const QString &fileName) const; bool writeToDevice(QIODevice *device) const; QByteArray toData() const; static constexpr int metadataSizeV1(); // for reader QStringList list(const QString &dir, bool onlyFileName = false) const; int childrenCount(const QString &dir) const; bool exists(const QString &filePath) const; FileType type(const QString &filePath) const; QByteArray dataRef(const QString &filePath) const; QString name(const QString &filePath) const; QString symlinkTarget(const QString &filePath, bool originData = false) const; // for writer bool mkdir(const QString &filePath); bool writeFile(const QString &filePath, const QByteArray &data, bool override = false); bool remove(const QString &filePath); bool rename(const QString &filePath, const QString &newFilePath, bool override = false); bool copy(const QString &from, const QString &to); bool link(const QString &source, const QString &to); }; DCORE_END_NAMESPACE dtkcore-6.7.46/include/filesystem/000077500000000000000000000000001522615770400170715ustar00rootroot00000000000000dtkcore-6.7.46/include/filesystem/dbasefilewatcher.h000066400000000000000000000027371522615770400225470ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DBASEFILEWATCHER_H #define DBASEFILEWATCHER_H #include "dtkcore_global.h" #include "dobject.h" #include DCORE_BEGIN_NAMESPACE class DBaseFileWatcherPrivate; class LIBDTKCORESHARED_EXPORT DBaseFileWatcher : public QObject, public DObject { Q_OBJECT public: ~DBaseFileWatcher(); QUrl fileUrl() const; bool startWatcher(); bool stopWatcher(); bool restartWatcher(); virtual void setEnabledSubfileWatcher(const QUrl &subfileUrl, bool enabled = true); using SignalType1 = void(DBaseFileWatcher::*)(const QUrl &); using SignalType2 = void(DBaseFileWatcher::*)(const QUrl &, const QUrl &); static bool ghostSignal(const QUrl &targetUrl, SignalType1 signal, const QUrl &arg1); static bool ghostSignal(const QUrl &targetUrl, SignalType2 signal, const QUrl &arg1, const QUrl &arg2); Q_SIGNALS: void fileDeleted(const QUrl &url); void fileAttributeChanged(const QUrl &url); void fileMoved(const QUrl &fromUrl, const QUrl &toUrl); void subfileCreated(const QUrl &url); void fileModified(const QUrl &url); void fileClosed(const QUrl &url); protected: explicit DBaseFileWatcher(DBaseFileWatcherPrivate &dd, const QUrl &url, QObject *parent = 0); private: Q_DISABLE_COPY(DBaseFileWatcher) D_DECLARE_PRIVATE(DBaseFileWatcher) }; DCORE_END_NAMESPACE #endif // DBASEFILEWATCHER_H dtkcore-6.7.46/include/filesystem/dcapfile.h000066400000000000000000000061441522615770400210160ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DCAPFILE_H #define DCAPFILE_H #include #include #include #include DCORE_BEGIN_NAMESPACE class DCapFilePrivate; class DCapFile : public QFile, public DObject { Q_OBJECT D_DECLARE_PRIVATE(DCapFile) Q_DISABLE_COPY(DCapFile) public: explicit DCapFile(QObject *parent = nullptr); DCapFile(const QString &name, QObject *parent = nullptr); ~DCapFile() override; void setFileName(const QString &name); bool exists() const; static bool exists(const QString &fileName); #if DTK_VERSION < DTK_VERSION_CHECK(6, 0, 0, 0) D_DECL_DEPRECATED_X("Use QFile::symLinkTarget() instead") QString readLink() const; #endif #if QT_VERSION >= QT_VERSION_CHECK(5, 13, 0) QString symLinkTarget() const; #endif bool remove(); static bool remove(const QString &fileName); #if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) bool moveToTrash(); static bool moveToTrash(const QString &fileName, QString *pathInTrash = nullptr); #endif bool rename(const QString &newName); static bool rename(const QString &oldName, const QString &newName); bool link(const QString &newName); static bool link(const QString &oldname, const QString &newName); bool copy(const QString &newName); static bool copy(const QString &fileName, const QString &newName); bool open(OpenMode flags) override; bool resize(qint64 sz) override; static bool resize(const QString &filename, qint64 sz); private: bool open(FILE *f, OpenMode ioFlags, FileHandleFlags handleFlags=DontCloseHandle); bool open(int fd, OpenMode ioFlags, FileHandleFlags handleFlags=DontCloseHandle); }; class DCapDirPrivate; class DCapDir : public QDir { public: DCapDir(const DCapDir &); DCapDir(const QString &path = QString()); DCapDir(const QString &path, const QString &nameFilter, SortFlags sort = SortFlags(Name | IgnoreCase), Filters filter = AllEntries); ~DCapDir(); void setPath(const QString &path); bool cd(const QString &dirName); QStringList entryList(Filters filters = NoFilter, SortFlags sort = NoSort) const; QStringList entryList(const QStringList &nameFilters, Filters filters = NoFilter, SortFlags sort = NoSort) const; QFileInfoList entryInfoList(Filters filters = NoFilter, SortFlags sort = NoSort) const; QFileInfoList entryInfoList(const QStringList &nameFilters, Filters filters = NoFilter, SortFlags sort = NoSort) const; bool mkdir(const QString &dirName) const; bool rmdir(const QString &dirName) const; bool mkpath(const QString &dirPath) const; bool rmpath(const QString &dirPath) const; bool exists() const; bool remove(const QString &fileName); bool rename(const QString &oldName, const QString &newName); bool exists(const QString &name) const; private: QSharedDataPointer dd_ptr; }; DCORE_END_NAMESPACE Q_DECLARE_SHARED(DTK_CORE_NAMESPACE::DCapDir) #endif // DCAPFILE_H dtkcore-6.7.46/include/filesystem/dcapmanager.h000066400000000000000000000020331522615770400215020ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DCAPMANAGER_H #define DCAPMANAGER_H #include #include DCORE_BEGIN_NAMESPACE class DCapManagerPrivate; class DCapManager : public QObject, public DObject { Q_OBJECT Q_DISABLE_COPY(DCapManager) D_DECLARE_PRIVATE(DCapManager) public: static DCapManager *instance(); #if DTK_VERSION < DTK_VERSION_CHECK(6, 0, 0, 0) QT_DEPRECATED_X("This api will no longer take effect, please use DCapDir or DCapFile") static void registerFileEngine(); QT_DEPRECATED_X("This api will no longer take effect, please use DCapDir or DCapFile") static void unregisterFileEngine(); #endif void appendPath(const QString &path); void appendPaths(const QStringList &pathList); void removePath(const QString &path); void removePaths(const QStringList &paths); QStringList paths() const; protected: explicit DCapManager(); }; DCORE_END_NAMESPACE #endif // DCAPMANAGER_H dtkcore-6.7.46/include/filesystem/dfilesystemwatcher.h000066400000000000000000000030451522615770400231520ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DFILESYSTEMWATCHER_H #define DFILESYSTEMWATCHER_H #include "dtkcore_global.h" #include "dobject.h" #include DCORE_BEGIN_NAMESPACE class DFileSystemWatcherPrivate; class LIBDTKCORESHARED_EXPORT DFileSystemWatcher : public QObject, public DObject { Q_OBJECT D_DECLARE_PRIVATE(DFileSystemWatcher) public: DFileSystemWatcher(QObject *parent = Q_NULLPTR); DFileSystemWatcher(const QStringList &paths, QObject *parent = Q_NULLPTR); ~DFileSystemWatcher(); bool addPath(const QString &file); QStringList addPaths(const QStringList &files); bool removePath(const QString &file); QStringList removePaths(const QStringList &files); QStringList files() const; QStringList directories() const; Q_SIGNALS: void fileDeleted(const QString &path, const QString &name, QPrivateSignal); void fileAttributeChanged(const QString &path, const QString &name, QPrivateSignal); void fileClosed(const QString &path, const QString &name, QPrivateSignal); void fileMoved(const QString &fromPath, const QString &fromName, const QString &toPath, const QString &toName, QPrivateSignal); void fileCreated(const QString &path, const QString &name, QPrivateSignal); void fileModified(const QString &path, const QString &name, QPrivateSignal); private: Q_PRIVATE_SLOT(d_func(), void _q_readFromInotify()) }; DCORE_END_NAMESPACE #endif // DFILESYSTEMWATCHER_H dtkcore-6.7.46/include/filesystem/dfilewatcher.h000066400000000000000000000017671522615770400217160ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DFILEWATCHER_H #define DFILEWATCHER_H #include "dbasefilewatcher.h" DCORE_BEGIN_NAMESPACE class DFileWatcherPrivate; class LIBDTKCORESHARED_EXPORT DFileWatcher : public DBaseFileWatcher { Q_OBJECT public: explicit DFileWatcher(const QString &filePath, QObject *parent = 0); private Q_SLOTS: void onFileDeleted(const QString &path, const QString &name); void onFileAttributeChanged(const QString &path, const QString &name); void onFileMoved(const QString &fromPath, const QString &fromName, const QString &toPath, const QString &toName); void onFileCreated(const QString &path, const QString &name); void onFileModified(const QString &path, const QString &name); void onFileClosed(const QString &path, const QString &name); private: D_DECLARE_PRIVATE(DFileWatcher) }; DCORE_END_NAMESPACE #endif // DFILEWATCHER_H dtkcore-6.7.46/include/filesystem/dfilewatchermanager.h000066400000000000000000000023251522615770400232400ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DFILEWATCHERMANAGER_H #define DFILEWATCHERMANAGER_H #include "dtkcore_global.h" #include "dobject.h" #include #include DCORE_BEGIN_NAMESPACE class DFileWatcher; class DFileWatcherManagerPrivate; class LIBDTKCORESHARED_EXPORT DFileWatcherManager : public QObject, public DObject { Q_OBJECT public: explicit DFileWatcherManager(QObject *parent = 0); ~DFileWatcherManager(); DFileWatcher *add(const QString &filePath); void remove(const QString &filePath); void removeAll(); QStringList watchedFiles() const; Q_SIGNALS: void fileDeleted(const QString &filePath); void fileAttributeChanged(const QString &filePath); void fileMoved(const QString &fromFilePath, const QString &toFilePath); void subfileCreated(const QString &filePath); void fileModified(const QString &filePath); void fileClosed(const QString &filePath); private: QScopedPointer d_ptr; D_DECLARE_PRIVATE(DFileWatcherManager) Q_DISABLE_COPY(DFileWatcherManager) }; DCORE_END_NAMESPACE #endif // DFILEWATCHERMANAGER_H dtkcore-6.7.46/include/filesystem/dpathbuf.h000066400000000000000000000017161522615770400210440ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #pragma once #include #include "dtkcore_global.h" DCORE_BEGIN_NAMESPACE class LIBDTKCORESHARED_EXPORT DPathBuf { public: DPathBuf(); DPathBuf(const QString &path); DPathBuf operator/(const QString &p) const { return DPathBuf(m_path + "/" + p); } DPathBuf &operator/=(const QString &p) { return join(p); } DPathBuf operator/(const char *p) const { return operator /(QString(p)); } DPathBuf &operator/=(const char *p) { return operator /=(QString(p)); } DPathBuf &join(const QString &p) { m_path += "/" + p; m_path = QDir(m_path).absolutePath(); return *this; } QString toString() const { return QDir::toNativeSeparators(m_path); } private: QString m_path; }; DCORE_END_NAMESPACE dtkcore-6.7.46/include/filesystem/dstandardpaths.h000066400000000000000000000055121522615770400222510ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DTK_CORE_FILESYSTEM_DSTANDARDPATHS_H #define DTK_CORE_FILESYSTEM_DSTANDARDPATHS_H #include #include "dtkcore_global.h" DCORE_BEGIN_NAMESPACE class DStandardPathsPrivate; class LIBDTKCORESHARED_EXPORT DStandardPaths { public: enum Mode { Auto, Snap, Test, }; static QString writableLocation(QStandardPaths::StandardLocation type); static QStringList standardLocations(QStandardPaths::StandardLocation type); static QString locate(QStandardPaths::StandardLocation type, const QString &fileName, QStandardPaths::LocateOptions options = QStandardPaths::LocateFile); static QStringList locateAll(QStandardPaths::StandardLocation type, const QString &fileName, QStandardPaths::LocateOptions options = QStandardPaths::LocateFile); static QString findExecutable(const QString &executableName, const QStringList &paths = QStringList()); static void setMode(Mode mode); /** * @brief About XDG dir, view it in https://gitlab.freedesktop.org/xdg/xdg-specs/ */ enum class XDG { /* * @brief DataHome, usually is ~/.local/share, also can be defined by ${XDG_DATA_HOME}, where stores the data of applications */ DataHome, /* * @brief ConfigHome, usually is ~/.config, can be defined by ${XDG_CONFIG_HOME}, where stores the config of applications */ ConfigHome, /* * @brief CacheHome, usually is ~/.cache, can be defined by ${XDG_CACHE_HOME}, where stores caches, can be always cleared */ CacheHome, /* * @brief Where temp files or sock files always be put in, like sddm.sock. It is unique per session. It is /run/user/${uid} or ${XDG_RUNTIME_DIR}, */ RuntimeDir, #if DTK_VERSION < DTK_VERSION_CHECK(6, 0, 0, 0) RuntimeTime [[deprecated("Use RuntimeDir Instead")]] = RuntimeDir, #endif /* * @brief where history file and state file should be. It is induced because users do not want to mix their config files and state files. It is always ~/.local/state, or defined by ${XDG_STATE_HOME} */ StateHome }; enum class DSG { AppData, DataDir }; static QString homePath(); static QString homePath(const uint uid); /* * @brief Get the XDG dir path by XDG type */ static QString path(XDG type); static QString path(DSG type); static QStringList paths(DSG type); static QString filePath(XDG type, QString fileName); static QString filePath(DSG type, QString fileName); private: DStandardPaths(); ~DStandardPaths(); Q_DISABLE_COPY(DStandardPaths) }; DCORE_END_NAMESPACE #endif // DTK_CORE_FILESYSTEM_DSTANDARDPATHS_H dtkcore-6.7.46/include/filesystem/dtrashmanager.h000066400000000000000000000012531522615770400220630ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DTRASHMANAGER_H #define DTRASHMANAGER_H #include #include #include DCORE_BEGIN_NAMESPACE class DTrashManagerPrivate; class LIBDTKCORESHARED_EXPORT DTrashManager : public QObject, public DObject { public: static DTrashManager *instance(); bool trashIsEmpty() const; bool cleanTrash(); bool moveToTrash(const QString &filePath, bool followSymlink = false); protected: DTrashManager(); private: D_DECLARE_PRIVATE(DTrashManager) }; DCORE_END_NAMESPACE #endif // DTRASHMANAGER_H dtkcore-6.7.46/include/global/000077500000000000000000000000001522615770400161455ustar00rootroot00000000000000dtkcore-6.7.46/include/global/dconfig.h000066400000000000000000000055271522615770400177400ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DCONFIG_H #define DCONFIG_H #include #include #include #include DCORE_BEGIN_NAMESPACE class DConfigBackend { public: virtual ~DConfigBackend(); virtual bool isValid() const = 0; virtual bool load(const QString &/*appId*/) = 0; virtual QStringList keyList() const = 0; virtual QVariant value(const QString &/*key*/, const QVariant &/*fallback*/) const = 0; virtual void setValue(const QString &/*key*/, const QVariant &/*value*/) = 0; virtual void reset(const QString &key) { setValue(key, QVariant());} virtual QString name() const {return QString("");} virtual bool isDefaultValue(const QString &/*key*/) const { return true; } virtual bool isReadOnly(const QString &/*key*/) const { return false; } }; class DConfigPrivate; class LIBDTKCORESHARED_EXPORT DConfig : public QObject, public DObject { Q_OBJECT D_DECLARE_PRIVATE(DConfig) Q_PROPERTY(QStringList keyList READ keyList CONSTANT FINAL) public: explicit DConfig(const QString &name, const QString &subpath = QString(), QObject *parent = nullptr); explicit DConfig(DConfigBackend *backend, const QString &name, const QString &subpath = QString(), QObject *parent = nullptr); static DConfig *create(const QString &appId, const QString &name, const QString &subpath = QString(), QObject *parent = nullptr); static DConfig *create(DConfigBackend *backend, const QString &appId, const QString &name, const QString &subpath = QString(), QObject *parent = nullptr); static DConfig *createGeneric(const QString &name, const QString &subpath = QString(), QObject *parent = nullptr); static DConfig *createGeneric(DConfigBackend *backend, const QString &name, const QString &subpath = QString(), QObject *parent = nullptr); static void setAppId(const QString &appId); static QThread *globalThread(); QString backendName() const; QStringList keyList() const; bool isValid() const; bool isDefaultValue(const QString &key) const; QVariant value(const QString &key, const QVariant &fallback = QVariant()) const; void setValue(const QString &key, const QVariant &value); void reset(const QString &key); bool isReadOnly(const QString &key) const; QString name() const; QString subpath() const; Q_SIGNALS: void valueChanged(const QString &key); private: explicit DConfig(DConfigBackend *backend, const QString &appId, const QString &name, const QString &subpath, QObject *parent = nullptr); }; DCORE_END_NAMESPACE #endif // DCONFIG_H dtkcore-6.7.46/include/global/dconfigfile.h000066400000000000000000000102551522615770400205720ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DCONFIGFILE_H #define DCONFIGFILE_H #include #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE class QIODevice; QT_END_NAMESPACE DCORE_BEGIN_NAMESPACE class DConfigMeta; class DConfigCache; class DConfigFilePrivate; class LIBDTKCORESHARED_EXPORT DConfigFile : public DObject{ D_DECLARE_PRIVATE(DConfigFile) public: enum Flag { NoOverride = 1 << 0, Global = 1 << 1, UserPublic = 1 << 2 }; Q_DECLARE_FLAGS(Flags, Flag) enum Permissions { ReadOnly, ReadWrite }; enum Visibility { Private, Public }; struct Version { quint16 major; quint16 minor; }; static constexpr Version supportedVersion(); explicit DConfigFile(const QString &appId, const QString &name, const QString &subpath = QString()); explicit DConfigFile(const DConfigFile &other); bool load(const QString &localPrefix = QString()); bool load(QIODevice *meta, const QList &overrides); bool save(const QString &localPrefix = QString(), QJsonDocument::JsonFormat format = QJsonDocument::Indented, bool sync = false) const; bool isValid() const; QVariant value(const QString &key, DConfigCache *userCache = nullptr) const; QVariant cacheValue(DConfigCache *userCache, const QString &key) const; bool setValue(const QString &key, const QVariant &value, const QString &callerAppid, DConfigCache *userCache = nullptr); DConfigCache *createUserCache(const uint uid); DConfigCache *globalCache() const; DConfigMeta *meta(); protected: friend QDebug operator<<(QDebug, const DConfigFile &); }; class LIBDTKCORESHARED_EXPORT DConfigMeta { public: virtual ~DConfigMeta(); virtual DConfigFile::Version version() const = 0; virtual void setVersion(quint16 major, quint16 minor) = 0; virtual bool load(const QString &localPrefix = QString()) = 0; virtual bool load(QIODevice *meta, const QList &overrides) = 0; virtual QStringList keyList() const = 0; virtual DConfigFile::Flags flags(const QString &key) const = 0; virtual DConfigFile::Permissions permissions(const QString &key) const = 0; virtual DConfigFile::Visibility visibility(const QString &key) const = 0; virtual int serial(const QString &key) const = 0; virtual QString displayName(const QString &key, const QLocale &locale) = 0; virtual QString description(const QString &key, const QLocale &locale) = 0; virtual QString metaPath(const QString &localPrefix = QString(), bool *useAppId = nullptr) const = 0; virtual QStringList allOverrideDirs(const bool useAppId, const QString &prefix = QString()) const = 0; virtual QVariant value(const QString &key) const = 0; static QStringList genericMetaDirs(const QString &localPrefix = QString()); static QStringList applicationMetaDirs(const QString &localPrefix, const QString &appId); }; class LIBDTKCORESHARED_EXPORT DConfigCache { public: virtual ~DConfigCache(); virtual bool load(const QString &localPrefix = QString()) = 0; virtual bool save(const QString &localPrefix = QString(), QJsonDocument::JsonFormat format = QJsonDocument::Indented, bool sync = false) = 0; virtual bool isGlobal() const = 0; virtual void remove(const QString &key) = 0; virtual QStringList keyList() const = 0; virtual bool setValue(const QString &key, const QVariant &value, const int serial, const uint uid, const QString &callerAppid) = 0; virtual QVariant value(const QString &key) const = 0; virtual int serial(const QString &key) const = 0; virtual uint uid() const = 0; virtual void setCachePathPrefix(const QString &prefix) = 0; }; #ifndef QT_NO_DEBUG_STREAM Q_CORE_EXPORT QDebug operator<<(QDebug, const DConfigFile &); #endif Q_DECLARE_OPERATORS_FOR_FLAGS(DConfigFile::Flags) DCORE_END_NAMESPACE #endif // DCONFIGFILE_H dtkcore-6.7.46/include/global/ddesktopentry.h000066400000000000000000000070341522615770400212210ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2019 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #pragma once #include "dtkcore_global.h" #include #include #include DCORE_BEGIN_NAMESPACE class DDesktopEntryPrivate; class LIBDTKCORESHARED_EXPORT DDesktopEntry { Q_GADGET public: enum EntryType { Unknown = 0, //!<@~english Unknown desktop file type. Maybe is invalid. Application, //!<@~english The file describes application. Link, //!<@~english The file describes URL. Directory, //!<@~english The file describes directory settings. ServiceType, //!<@~english KDE specific type. mentioned in the spec, so listed here too. Service, //!<@~english KDE specific type. mentioned in the spec, so listed here too. FSDevice //!<@~english KDE specific type. mentioned in the spec, so listed here too. }; Q_ENUM(EntryType) enum ValueType { Unparsed = 0, // Maybe useless, consider remove it? String, Strings, Boolean, Numeric, NotExisted = 99 }; Q_ENUM(ValueType) enum Status { NoError = 0, //!<@~english No error occurred. AccessError, //!<@~english An access error occurred (e.g. trying to write to a read-only file). FormatError //!<@~english A format error occurred (e.g. loading a malformed desktop entry file). }; Q_ENUM(Status) explicit DDesktopEntry(const QString &filePath) noexcept; ~DDesktopEntry(); bool save() const; Status status() const; QStringList keys(const QString §ion = "Desktop Entry") const; QStringList allGroups(bool sorted = false) const; bool contains(const QString &key, const QString §ion = "Desktop Entry") const; QString name() const; QString genericName() const; QString ddeDisplayName() const; QString comment() const; QString rawValue(const QString &key, const QString §ion = "Desktop Entry", const QString &defaultValue = QString()) const; QString stringValue(const QString &key, const QString §ion = "Desktop Entry", const QString &defaultValue = QString()) const; QString localizedValue(const QString &key, const QString &localeKey = "default", const QString §ion = "Desktop Entry", const QString& defaultValue = QString()) const; QString localizedValue(const QString &key, const QLocale &locale, const QString §ion = "Desktop Entry", const QString& defaultValue = QString()) const; QStringList stringListValue(const QString &key, const QString §ion = "Desktop Entry") const; bool setRawValue(const QString &value, const QString &key, const QString& section = "Desktop Entry"); bool setStringValue(const QString &value, const QString &key, const QString& section = "Desktop Entry"); bool setLocalizedValue(const QString &value, const QString& localeKey, const QString &key, const QString& section = "Desktop Entry"); bool removeEntry(const QString &key, const QString §ion = "Desktop Entry"); static QString &escape(QString &str); static QString &escapeExec(QString &str); static QString &unescape(QString &str, bool unescapeSemicolons = false); static QString &unescapeExec(QString &str); protected: bool setStatus(const Status &status); private: QScopedPointer d_ptr; Q_DECLARE_PRIVATE(DDesktopEntry) }; DCORE_END_NAMESPACE dtkcore-6.7.46/include/global/dlicenseinfo.h000066400000000000000000000023571522615770400207670ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DLICENSEINFO_H #define DLICENSEINFO_H #include #include #include DCORE_BEGIN_NAMESPACE class DLicenseInfoPrivate; class LIBDTKCORESHARED_EXPORT DLicenseInfo : public DObject { public: explicit DLicenseInfo(DObject *parent = nullptr); bool loadContent(const QByteArray &content); bool loadFile(const QString &file); void setLicenseSearchPath(const QString &path); QByteArray licenseContent(const QString &licenseName); class DComponentInfoPrivate; class LIBDTKCORESHARED_EXPORT DComponentInfo : public DObject { public: explicit DComponentInfo(DObject *parent = nullptr); ~DComponentInfo() override; QString name() const; QString version() const; QString copyRight() const; QString licenseName() const; private: D_DECLARE_PRIVATE(DComponentInfo) friend class DLicenseInfoPrivate; }; using DComponentInfos = QVector; DComponentInfos componentInfos() const; private: D_DECLARE_PRIVATE(DLicenseInfo) }; DCORE_END_NAMESPACE #endif // DLICENSEINFO_H dtkcore-6.7.46/include/global/dsecurestring.h000066400000000000000000000006311522615770400211770ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2019 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #pragma once #include "dtkcore_global.h" #include DCORE_BEGIN_NAMESPACE class LIBDTKCORESHARED_EXPORT DSecureString : public QString { public: using QString::QString; DSecureString(const QString &other) noexcept; ~DSecureString(); }; DCORE_END_NAMESPACE dtkcore-6.7.46/include/global/dsgapplication.h000066400000000000000000000006211522615770400213160ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DSGAPPLICATION_H #define DSGAPPLICATION_H #include "dtkcore_global.h" DCORE_BEGIN_NAMESPACE class LIBDTKCORESHARED_EXPORT DSGApplication { public: static QByteArray id(); static QByteArray getId(qint64 pid); }; DCORE_END_NAMESPACE #endif // DSGAPPLICATION_H dtkcore-6.7.46/include/global/dsysinfo.h000066400000000000000000000135711522615770400201630ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DSYSINFO_H #define DSYSINFO_H #include #include DCORE_BEGIN_NAMESPACE class DSysInfoPrivate; class LIBDTKCORESHARED_EXPORT DSysInfo { Q_GADGET public: enum ProductType { UnknownType = 0, Deepin, ArchLinux, CentOS, Debian, Fedora, LinuxMint, Manjaro, openSUSE, SailfishOS, Ubuntu, Uos, Gentoo, NixOS }; Q_ENUM(ProductType) enum DeepinType { UnknownDeepin = 0, DeepinDesktop, DeepinProfessional, DeepinServer, DeepinPersonal, DeepinMilitary }; enum LogoType { Normal = 0, Light, Symbolic, Transparent }; enum OrgType { Distribution, //!<@~english distribution itself Distributor, //!<@~english distributer of the current distribution Manufacturer //!<@~english manufacturer of the current distribution or device }; enum UosType { UosTypeUnknown, UosDesktop, UosServer, UosDevice, UosSmart, UosTypeCount // must at last }; enum UosEdition { UosEditionUnknown, UosProfessional, UosHome, UosCommunity, UosMilitary, UosEnterprise, UosEnterpriseC, UosEuler, UosMilitaryS, // for Server UosDeviceEdition, UosEducation, UosDefense, UosEditionCount // must at last }; enum UosArch { UosArchUnknown, UosAMD64 = 1 << 0, UosARM64 = 1 << 1, UosMIPS64 = 1 << 2, UosSW64 = 1 << 3 }; //! @~english enum.Arch enum Arch { ARM64, /*!< @~english arm64 */ ARM64_BE, /*!< @~english arm64-be */ ARM, /*!< @~english arm */ ARM_BE, /*!< @~english arm-be */ ALPHA, /*!< @~english alpha */ SW_64, /*!< @~english sw_64 */ ARC, /*!< @~english arc */ ARC_BE, /*!< @~english arc-be */ CRIS, /*!< @~english cris */ X86_64, /*!< @~english x86-64 */ X86, /*!< @~english x86 */ IA64, /*!< @~english ia64 */ LOONGARCH64,/*!< @~english loongarch64 */ M68K, /*!< @~english m68k */ MIPS64_LE, /*!< @~english mips64-le */ MIPS64, /*!< @~english mips64 */ MIPS_LE, /*!< @~english mips-le */ MIPS, /*!< @~english mips */ NIOS2, /*!< @~english nios2 */ PARISC64, /*!< @~english parisc64 */ PARISC, /*!< @~english parisc */ PPC64_LE, /*!< @~english ppc64-le */ PPC64, /*!< @~english ppc64 */ PPC, /*!< @~english ppc */ PPC_LE, /*!< @~english ppc-le */ RISCV32, /*!< @~english riscv32 */ RISCV64, /*!< @~english riscv64 */ S390X, /*!< @~english s390x */ S390, /*!< @~english s390 */ SH64, /*!< @~english sh64 */ SH, /*!< @~english sh */ SPARC64, /*!< @~english sparc64 */ SPARC, /*!< @~english sparc */ TILEGX, /*!< @~english tilegx */ NUM_ARCHES, /*!< @~english number of defined Arch types */ }; Q_ENUM(Arch) // Q_GADGET #ifdef Q_OS_LINUX static bool isDeepin(); static bool isDDE(); static DeepinType deepinType(); static QString deepinTypeDisplayName(const QLocale &locale = QLocale::system()); static QString deepinVersion(); static QString deepinEdition(); static QString deepinCopyright(); // uos version interface static UosType uosType(); static UosEdition uosEditionType(); #if DTK_VERSION < DTK_VERSION_CHECK(6, 0, 0, 0) Q_DECL_DEPRECATED_X("Use arch() instead") static UosArch uosArch(); #endif static QString uosProductTypeName(const QLocale &locale = QLocale::system()); static QString uosSystemName(const QLocale &locale = QLocale::system()); static QString uosEditionName(const QLocale &locale = QLocale::system()); static QString spVersion(); // SP1...SP99 static QString udpateVersion(); // update1...update9 static QString majorVersion(); static QString minorVersion(); static QString buildVersion(); // xyzs #endif #if DTK_VERSION < DTK_VERSION_CHECK(6, 0, 0, 0) Q_DECL_DEPRECATED_X("Use distributionInfoPath() instead") static QString deepinDistributionInfoPath(); Q_DECL_DEPRECATED_X("Use distributionOrgName() instead") static QString deepinDistributorName(); Q_DECL_DEPRECATED_X("Use distributionOrgWebsite() instead") static QPair deepinDistributorWebsite(); Q_DECL_DEPRECATED_X("Use distributionOrgLogo() instead") static QString deepinDistributorLogo(LogoType type = Normal, const QString & fallback = QString()); #endif static QString distributionInfoPath(); static QString distributionInfoSectionName(OrgType type); static QString distributionOrgName(OrgType type = Distribution, const QLocale &locale = QLocale::system()); static QPair distributionOrgWebsite(OrgType type = Distribution); static QString distributionOrgLogo(OrgType orgType = Distribution, LogoType type = Normal, const QString & fallback = QString()); static QString operatingSystemName(); static ProductType productType(); static QString productTypeString(); static QString productVersion(); static bool isCommunityEdition(); static QString computerName(); static QString cpuModelName(); static qint64 memoryInstalledSize(); static qint64 memoryTotalSize(); static qint64 systemDiskSize(); static QDateTime bootTime(); static QDateTime shutdownTime(); static qint64 uptime(); static Arch arch(); }; DCORE_END_NAMESPACE #endif // DSYSINFO_H dtkcore-6.7.46/include/global/dtkcore_global.h000066400000000000000000000042211522615770400212700ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #pragma once #include #include #define DTK_NAMESPACE Dtk #if !defined(DTK_NAMESPACE) # define DTK_BEGIN_NAMESPACE # define DTK_END_NAMESPACE # define DTK_USE_NAMESPACE #else # define DTK_BEGIN_NAMESPACE namespace DTK_NAMESPACE { # define DTK_END_NAMESPACE } # define DTK_USE_NAMESPACE using namespace DTK_NAMESPACE; #endif #define DCORE_NAMESPACE Core #define DTK_CORE_NAMESPACE DTK_NAMESPACE::DCORE_NAMESPACE #if !defined(DCORE_NAMESPACE) # define DCORE_BEGIN_NAMESPACE # define DCORE_END_NAMESPACE # define DCORE_USE_NAMESPACE #else # define DCORE_BEGIN_NAMESPACE namespace DTK_NAMESPACE { namespace DCORE_NAMESPACE { # define DCORE_END_NAMESPACE }} # define DCORE_USE_NAMESPACE using namespace DTK_CORE_NAMESPACE; #endif #if defined(DTK_STATIC_LIB) # define LIBDTKCORESHARED_EXPORT # define D_IGNORE_DEPRECATIONS #else #if defined(LIBDTKCORE_LIBRARY) # define LIBDTKCORESHARED_EXPORT Q_DECL_EXPORT # define D_IGNORE_DEPRECATIONS #else # define LIBDTKCORESHARED_EXPORT Q_DECL_IMPORT #endif #endif #ifdef D_DEPRECATED_CHECK #define D_DECL_DEPRECATED_X(text) Q_DECL_HIDDEN #define D_DECL_DEPRECATED Q_DECL_HIDDEN #else #if defined(D_IGNORE_DEPRECATIONS) #define D_DECL_DEPRECATED #define D_DECL_DEPRECATED_X(text) #else #ifdef __GNUC__ #if __GNUC__ < 13 #define D_DECL_DEPRECATED __attribute__((__deprecated__)) #define D_DECL_DEPRECATED_X(text) __attribute__((__deprecated__(text))) #else #define D_DECL_DEPRECATED Q_DECL_DEPRECATED #define D_DECL_DEPRECATED_X Q_DECL_DEPRECATED_X #endif #else #define D_DECL_DEPRECATED Q_DECL_DEPRECATED #define D_DECL_DEPRECATED_X Q_DECL_DEPRECATED_X #endif #endif #endif #define DTK_VERSION_CHECK(major, minor, patch, build) ((major<<24)|(minor<<16)|(patch<<8)|build) #define DTK_VERSION DTK_VERSION_CHECK(DTK_VERSION_MAJOR, DTK_VERSION_MINOR, DTK_VERSION_PATCH, DTK_VERSION_BUILD) #if DTK_VERSION < DTK_VERSION_CHECK(6, 0, 0, 0) extern "C" { int LIBDTKCORESHARED_EXPORT dtkVersion(); const LIBDTKCORESHARED_EXPORT char *dtkVersionString(); } #endif dtkcore-6.7.46/include/log/000077500000000000000000000000001522615770400154665ustar00rootroot00000000000000dtkcore-6.7.46/include/log/LogManager.h000066400000000000000000000024421522615770400176550ustar00rootroot00000000000000// Copyright (C) 2017 ~ 2017 Deepin Technology Co., Ltd. // SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef LOGMANAGER_H #define LOGMANAGER_H #include #include "dtkcore_global.h" DCORE_BEGIN_NAMESPACE class DLogManagerPrivate; class LIBDTKCORESHARED_EXPORT DLogManager { Q_DISABLE_COPY(DLogManager) public: static void registerConsoleAppender(); static void registerFileAppender(); static void registerJournalAppender(); static QString getlogFilePath(); /*! * \brief setlogFilePath will change log file path of registerFileAppender * \a logFilePath is the full path of file appender log */ static void setlogFilePath(const QString &logFilePath); static void setLogFormat(const QString &format); private: void initConsoleAppender(); void initRollingFileAppender(); void initJournalAppender(); QString joinPath(const QString &path, const QString &fileName); inline static DLogManager* instance(){ static DLogManager instance; return &instance; } explicit DLogManager(); ~DLogManager(); QScopedPointer d_ptr; Q_DECLARE_PRIVATE(DLogManager) }; DCORE_END_NAMESPACE #endif // LOGMANAGER_H dtkcore-6.7.46/include/settings/000077500000000000000000000000001522615770400165455ustar00rootroot00000000000000dtkcore-6.7.46/include/settings/backend/000077500000000000000000000000001522615770400201345ustar00rootroot00000000000000dtkcore-6.7.46/include/settings/backend/dsettingsdconfigbackend.h000066400000000000000000000017611522615770400251600ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #pragma once #include #include #include "dsettingsbackend.h" DCORE_BEGIN_NAMESPACE class DSettingsDConfigBackendPrivate; class LIBDTKCORESHARED_EXPORT DSettingsDConfigBackend : public Dtk::Core::DSettingsBackend { Q_OBJECT public: explicit DSettingsDConfigBackend(const QString &name, const QString &subpath = QString(), QObject *parent = nullptr); ~DSettingsDConfigBackend() Q_DECL_OVERRIDE; virtual QStringList keys() const Q_DECL_OVERRIDE; virtual QVariant getOption(const QString &key) const Q_DECL_OVERRIDE; protected Q_SLOTS: virtual void doSetOption(const QString &key, const QVariant &value) Q_DECL_OVERRIDE; virtual void doSync() Q_DECL_OVERRIDE; private: QScopedPointer d_ptr; Q_DECLARE_PRIVATE_D(qGetPtrHelper(d_ptr), DSettingsDConfigBackend) }; DCORE_END_NAMESPACE dtkcore-6.7.46/include/settings/backend/gsettingsbackend.h000066400000000000000000000016001522615770400236210ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #pragma once #include #include #include "dsettingsbackend.h" DCORE_BEGIN_NAMESPACE class GSettingsBackendPrivate; class LIBDTKCORESHARED_EXPORT GSettingsBackend: public DSettingsBackend { Q_OBJECT public: explicit GSettingsBackend(DSettings *settings, QObject *parent = nullptr); ~GSettingsBackend(); virtual QStringList keys() const Q_DECL_OVERRIDE; virtual QVariant getOption(const QString &key) const Q_DECL_OVERRIDE; protected Q_SLOTS: virtual void doSetOption(const QString &key, const QVariant &value) Q_DECL_OVERRIDE; virtual void doSync() Q_DECL_OVERRIDE; private: QScopedPointer d_ptr; Q_DECLARE_PRIVATE_D(qGetPtrHelper(d_ptr), GSettingsBackend) }; DCORE_END_NAMESPACE dtkcore-6.7.46/include/settings/backend/qsettingbackend.h000066400000000000000000000016131522615770400234540ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2016 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #pragma once #include #include #include "dsettingsbackend.h" DCORE_BEGIN_NAMESPACE class QSettingBackendPrivate; class LIBDTKCORESHARED_EXPORT QSettingBackend : public Dtk::Core::DSettingsBackend { Q_OBJECT public: explicit QSettingBackend(const QString &filepath, QObject *parent = 0); ~QSettingBackend(); virtual QStringList keys() const Q_DECL_OVERRIDE; virtual QVariant getOption(const QString &key) const Q_DECL_OVERRIDE; protected Q_SLOTS: virtual void doSetOption(const QString &key, const QVariant &value) Q_DECL_OVERRIDE; virtual void doSync() Q_DECL_OVERRIDE; private: QScopedPointer d_ptr; Q_DECLARE_PRIVATE_D(qGetPtrHelper(d_ptr), QSettingBackend) }; DCORE_END_NAMESPACE dtkcore-6.7.46/include/settings/dsettings.h000066400000000000000000000030631522615770400207240ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2016 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #pragma once #include #include #include #include "dtkcore_global.h" DCORE_BEGIN_NAMESPACE class DSettingsBackend; class DSettingsOption; class DSettingsGroup; class DSettingsPrivate; class LIBDTKCORESHARED_EXPORT DSettings : public QObject { Q_OBJECT public: explicit DSettings(QObject *parent = Q_NULLPTR); ~DSettings(); void setBackend(DSettingsBackend *backend = nullptr); static QPointer fromJson(const QByteArray &json); static QPointer fromJsonFile(const QString &filepath); QJsonObject meta() const; QStringList keys() const; QList> options() const; QPointer option(const QString &key) const; QVariant value(const QString &key) const; QStringList groupKeys() const; QList> groups() const; QPointer group(const QString &key) const; QVariant getOption(const QString &key) const; Q_SIGNALS: void valueChanged(const QString &key, const QVariant &value); public Q_SLOTS: //! //! \brief sync //! WARNING: sync will block void sync() ; void setOption(const QString &key, const QVariant &value); void reset() ; private: void parseJson(const QByteArray &json); void loadValue(); QScopedPointer dd_ptr; Q_DECLARE_PRIVATE_D(qGetPtrHelper(dd_ptr), DSettings) }; DCORE_END_NAMESPACE dtkcore-6.7.46/include/settings/dsettingsbackend.h000066400000000000000000000021511522615770400222310ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2016 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #pragma once #include #include #include "dtkcore_global.h" DCORE_BEGIN_NAMESPACE class DSettings; class LIBDTKCORESHARED_EXPORT DSettingsBackend : public QObject { Q_OBJECT public: explicit DSettingsBackend(QObject *parent = Q_NULLPTR): QObject(parent) { connect(this, &DSettingsBackend::sync, this, &DSettingsBackend::doSync, Qt::QueuedConnection); connect(this, &DSettingsBackend::setOption, this, &DSettingsBackend::doSetOption, Qt::QueuedConnection); } virtual ~DSettingsBackend() {} virtual QStringList keys() const = 0; virtual QVariant getOption(const QString &key) const = 0; virtual void doSync() = 0; protected: virtual void doSetOption(const QString &key, const QVariant &value) = 0; Q_SIGNALS: void optionChanged(const QString &key, const QVariant &value); // private signals; Q_SIGNALS: void sync(); void setOption(const QString &key, const QVariant &value); }; DCORE_END_NAMESPACE dtkcore-6.7.46/include/settings/dsettingsgroup.h000066400000000000000000000024571522615770400220070ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2016 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #pragma once #include #include #include "dsettingsoption.h" #include "dtkcore_global.h" DCORE_BEGIN_NAMESPACE class DSettingsGroupPrivate; class LIBDTKCORESHARED_EXPORT DSettingsGroup : public QObject { Q_OBJECT public: explicit DSettingsGroup(QObject *parent = Q_NULLPTR); ~DSettingsGroup(); QPointer parentGroup() const; void setParentGroup(QPointer parentGroup); QString key() const; QString name() const; bool isHidden() const; QPointer childGroup(const QString &groupKey) const; QPointer option(const QString &key) const; QList > childGroups() const; QList > childOptions() const; QList > options() const; static QPointer fromJson(const QString &prefixKey, const QJsonObject &group); private: void parseJson(const QString &prefixKey, const QJsonObject &group); QScopedPointer dd_ptr; Q_DECLARE_PRIVATE_D(qGetPtrHelper(dd_ptr), DSettingsGroup) }; typedef QPointer GroupPtr; DCORE_END_NAMESPACE dtkcore-6.7.46/include/settings/dsettingsoption.h000066400000000000000000000027461522615770400221640ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2016 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #pragma once #include #include #include #include "dtkcore_global.h" DCORE_BEGIN_NAMESPACE class DSettingsGroup; class DSettingsOptionPrivate; class LIBDTKCORESHARED_EXPORT DSettingsOption : public QObject { Q_OBJECT Q_PROPERTY(QVariant value READ value WRITE setValue NOTIFY valueChanged) public: explicit DSettingsOption(QObject *parent = Q_NULLPTR); ~DSettingsOption(); QPointer parentGroup() const; void setParentGroup(QPointer parentGroup); QString key() const; QString name() const; bool canReset() const; QVariant defaultValue() const; QVariant value() const; QVariant data(const QString &dataType) const; QString viewType() const; bool isHidden() const; static QPointer fromJson(const QString &prefixKey, const QJsonObject &json); Q_SIGNALS: void valueChanged(QVariant value); void dataChanged(const QString &dataType, QVariant value); public Q_SLOTS: void setValue(QVariant value); void setData(const QString &dataType, QVariant value); private: void parseJson(const QString &prefixKey, const QJsonObject &option); QScopedPointer dd_ptr; Q_DECLARE_PRIVATE_D(qGetPtrHelper(dd_ptr), DSettingsOption) }; typedef QPointer OptionPtr; DCORE_END_NAMESPACE dtkcore-6.7.46/include/util/000077500000000000000000000000001522615770400156625ustar00rootroot00000000000000dtkcore-6.7.46/include/util/dabstractunitformatter.h000066400000000000000000000020561522615770400226310ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DABSTRACTUNITFORMATTER_H #define DABSTRACTUNITFORMATTER_H #include "dtkcore_global.h" #include #include DCORE_BEGIN_NAMESPACE class LIBDTKCORESHARED_EXPORT DAbstractUnitFormatter { public: DAbstractUnitFormatter(); ~DAbstractUnitFormatter(); protected: virtual int unitMax() const = 0; virtual int unitMin() const = 0; virtual uint unitConvertRate(int unitId) const = 0; virtual qreal unitValueMax(int unitId) const { return unitConvertRate(unitId) - 1; } virtual qreal unitValueMin(int unitId) const { Q_UNUSED(unitId); return 1; } virtual QString unitStr(int unitId) const = 0; public: qreal formatAs(qreal value, int currentUnit, const int targetUnit) const; QPair format(const qreal value, const int unit) const; QList> formatAsUnitList(const qreal value, int unit) const; }; DCORE_END_NAMESPACE #endif // DABSTRACTUNITFORMATTER_H dtkcore-6.7.46/include/util/dasync.h000066400000000000000000000412551522615770400173230ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DASYNC_H #define DASYNC_H #include #include #include #include #include #include #include #include DCORE_BEGIN_NAMESPACE #define GUARDED_BY(...) #define D_THREAD_IN_MAIN() (qApp->instance() && qApp->instance()->thread() == QThread::currentThread()) // TODO: 添加 DtkCorePrivate 到 dtkcore_global.h namespace DtkCorePrivate { // 本类是继承实现的,å�ªæœ‰å­�类方法是安全的,暂ä¸�对外æ��供接å�£ template class DSafeQueue : public QQueue { public: inline void enqueue(const T &t) { QMutexLocker lkc(&m_mtx); QQueue::enqueue(t); } inline T dequeue() { QMutexLocker lkc(&m_mtx); return QQueue::dequeue(); } inline int size() { QMutexLocker lkc(&m_mtx); return QQueue::size(); } inline T &head() { QMutexLocker lkc(&m_mtx); return QQueue::head(); } inline const T &head() const { QMutexLocker lkc(&m_mtx); return QQueue::head(); } private: mutable QMutex m_mtx; }; // 内部使用,ä¸�对外æ��供接å�£ class MainWorker : public QObject { Q_OBJECT std::function m_handle; std::function m_handleProxy; std::function m_handleV; std::function m_handleVProxy; bool m_dasyncDestroyed = false; char __padding[7]; public: void setDAsyncDestroyed() { m_dasyncDestroyed = true; } bool dasyncDestroyed() { return m_dasyncDestroyed; } public: MainWorker(QObject *parent = nullptr) : QObject(parent) { // Ensure that QApplication is initialized Q_ASSERT(qApp->instance() && qApp->instance()->thread()); moveToThread(qApp->instance()->thread()); bool isStartInMain = D_THREAD_IN_MAIN(); QObject::connect(this, &MainWorker::sigRunInMain, this, &MainWorker::slotRunInMain, isStartInMain ? Qt::AutoConnection : Qt::BlockingQueuedConnection); QObject::connect(this, &MainWorker::sigRunInMainVoid, this, &MainWorker::slotRunInMainVoid, isStartInMain ? Qt::AutoConnection : Qt::BlockingQueuedConnection); } // 1. handle arg is non void template typename std::enable_if::value>::type setHandle(FUNC &&func) { m_handle = [&](void *arg) { DSafeQueue *q = static_cast *>(arg); while (q && q->size()) { // 这里是 then 回调真正执行到的地方 func(q->dequeue()); } }; m_handleProxy = [this](void *arg) { if (m_handle) { m_handle(arg); } }; } // 2. handle arg is void template typename std::enable_if::value>::type setHandle(FUNC &&func) { m_handleV = [&](void) { // 这里是 then 回调真正执行到的地方 func(); }; m_handleVProxy = [this](void) { if (m_handleV) { m_handleV(); } }; } Q_SIGNALS: void sigRunInMain(void *arg); void sigRunInMainVoid(); public Q_SLOTS: void slotRunInMain(void *arg) { Q_ASSERT(D_THREAD_IN_MAIN()); if (m_handleProxy && !m_dasyncDestroyed) { m_handleProxy(arg); } } void slotRunInMainVoid(void) { Q_ASSERT(D_THREAD_IN_MAIN()); if (m_handleVProxy && !m_dasyncDestroyed) { m_handleVProxy(); } } }; } // namespace DtkCorePrivate class DAsyncState : public QObject { Q_OBJECT public: explicit DAsyncState(QObject *parent = nullptr) noexcept : QObject(parent) { } enum AsyncTaskState { NotReady = 0x00, // initial state Ready = 0x02, // deffered = false Running = 0x04, // thread started Pending = Ready | Running, // condition wait Cancel = 0x08, // set thread canceled WaitFinished = 0x10, // wiaitForFinished Finished = 0x20, // thread exit Forever = 0x30, // TODO: DAsync::post execute forever }; Q_DECLARE_FLAGS(AsyncTaskStatus, AsyncTaskState) }; // Template classes not supported by Q_OBJECT, so class MainWorker is independent template class D_DECL_DEPRECATED DAsync : public QObject { class Helper; std::mutex m_mtxIn; std::condition_variable m_cvIn; std::mutex m_mtxForWaitTask; std::condition_variable m_cvForWaitTask; class Guard { DAsync *m_as; // 如果 DAsync å·²ç»�æž�构了,工作线程还没结æ�Ÿ // DAsync 中的有些数æ�®å°±ä¸�能在 guard çš„æž�构里é�¢è®¿é—®äº† bool m_dasDestructed = false; public: bool destructed() { return m_dasDestructed; } void setDestructed() { m_dasDestructed = true; } public: explicit Guard(DAsync *as) noexcept : m_as(as) { m_as->m_status.setFlag(DAsyncState::Ready); m_as->m_status.setFlag(DAsyncState::Finished, false); // 防止é‡�å…¥ } ~Guard() { if (destructed()) { return; } m_as->m_threadGuard = nullptr; m_as->m_status.setFlag(DAsyncState::Finished); m_as->m_status.setFlag(DAsyncState::Ready, false); // 防止é‡�å…¥ if (m_as->m_status.testFlag(DAsyncState::WaitFinished)) { m_as->m_cvForWaitTask.notify_one(); } setPending(false); } void setPending(bool isPending) { if (!destructed()) { m_as->m_status.setFlag(DAsyncState::Pending, isPending); } } }; Guard *m_threadGuard = nullptr; /* * m_QueueIn 的作用是存储 PostData ä¼ è¿›æ�¥çš„æ•°æ�® * m_QueueOut 的作用是将 post 处ç�†å®Œçš„结果暂存起æ�¥ç„¶å�Žä¼ å…¥åˆ° then 中 * 在 emitHelper 中调用 post è¿›æ�¥çš„任务,然å�Žå°†ç»“果传到主线程中处ç�† * æ•°æ�®ä¼ é€’使用 void * å�šè½¬æ�¢ï¼Œå¯¹äºŽå¤�å�ˆç±»åž‹é�¿å…�了使用 qRegisterMetaType */ template struct DataQueueType { DtkCorePrivate::DSafeQueue m_queue; }; template struct DataQueueType::value>::type> { }; using DataInQueue = DataQueueType; using DataOutQueue = DataQueueType; // Queue 中处ç�†å®Œçš„结果ç»�ç”± m_QueueIn å�˜é‡�暂存,然å�Žç»�ç”± signalã€�slot ä¼ ç»™ then 中的回调函数å�šå�‚æ•° DataInQueue m_QueueIn; DataOutQueue m_QueueOut; // 存储ä¸�å�Œç±»åž‹çš„输入函数 template struct FuncType { }; template struct FuncType::value>::type, typename std::enable_if::value>::type> { std::function cbp; }; template struct FuncType::value>::type, typename std::enable_if::value>::type> { std::function cbp; }; template struct FuncType::value>::type, typename std::enable_if::value>::type> { std::function cbp; }; template struct FuncType::value>::type, typename std::enable_if::value>::type> { std::function cbp; }; std::mutex m_mtxFunc; FuncType m_func GUARDED_BY(m_mtxFunc); DAsyncState::AsyncTaskStatus m_status; public: explicit DAsync(QObject *parent = nullptr) noexcept : QObject(parent) , m_func({nullptr}) , m_status(DAsyncState::NotReady) { m_mainWorker = new DtkCorePrivate::MainWorker(); m_helper = new Helper(this, this); } ~DAsync() { if (m_threadGuard) { m_threadGuard->setDestructed(); } m_status.setFlag(DAsyncState::Cancel); if (m_status.testFlag(DAsyncState::Pending)) { m_cvIn.notify_one(); } if (m_mainWorker) { m_mainWorker->setDAsyncDestroyed(); m_mainWorker->deleteLater(); m_mainWorker = nullptr; } } private: // 1. input void & emit void template typename std::enable_if::value && std::is_void::value>::type emitHelper() { m_func.cbp(); Q_EMIT m_mainWorker->sigRunInMainVoid(); } // 2. input non void & emit non void template typename std::enable_if::value && !std::is_void::value>::type emitHelper() { m_QueueOut.m_queue.enqueue(m_func.cbp(m_QueueIn.m_queue.dequeue())); Q_EMIT m_mainWorker->sigRunInMain(static_cast(&(m_QueueOut.m_queue))); } // 3. input non void & emit void template typename std::enable_if::value && std::is_void::value>::type emitHelper() { m_func.cbp(m_QueueIn.m_queue.dequeue()); Q_EMIT m_mainWorker->sigRunInMainVoid(); } // 4. input void & emit non void template typename std::enable_if::value && !std::is_void::value>::type emitHelper() { m_QueueOut.m_queue.enqueue(m_func.cbp()); Q_EMIT m_mainWorker->sigRunInMain(static_cast(&(m_QueueOut.m_queue))); } public: void startUp() { if (m_status.testFlag(DAsyncState::Cancel)) { return; } m_helper->start(); } void cancelAll() { m_status.setFlag(DAsyncState::Cancel); if (m_status.testFlag(DAsyncState::Pending)) { m_cvIn.notify_one(); } } bool isFinished() { return m_status.testFlag(DAsyncState::Finished); } /* * ä¸�能在 QTimer 中使用 waitForFinished,防止阻塞主线程 * 也ä¸�能在主线程执行å‰�使用 waitForFinished() * 它的默认å�‚数为 true,等å�ŒäºŽ waitForFinished(false) + * cancelAll, 如果调用了å�Žè€…, 会一直阻塞等待任务,直到 * cancelAll 被调用之å�Ž waitForFinished æ‰�会在任务完æˆ�完 * æˆ�å�Žé€€å‡ºï¼Œæ­¤æ—¶å°±å�¯ä»¥åˆ é™¤DAsync了。最好的管ç�†æ–¹å¼�还是采用 * QObject 的内存托管。主线程中使用,å�¯ä»¥é‡‡ç”¨æ‰˜ç®¡çš„æ–¹å¼�, * 任务结æ�Ÿå�ªè¦�调用 cancelAll + isFinished 轮询判断就行了, * DAsync 的工作线程就会在完æˆ�å�Žè‡ªåŠ¨é€€å‡ºã€‚ */ void waitForFinished(bool cancelAllWorks = true) { Q_ASSERT(!D_THREAD_IN_MAIN()); if (cancelAllWorks) { cancelAll(); } if (!m_status.testFlag(DAsyncState::Finished)) { if (m_status.testFlag(DAsyncState::Pending)) { m_cvIn.notify_one(); } m_status.setFlag(DAsyncState::WaitFinished); std::unique_lock lck(m_mtxForWaitTask); m_cvForWaitTask.wait(lck); } } // 输入数æ�®ä¸�是 void 类型则ä¾�赖于 m_QueueIn template typename std::enable_if::value, Helper *>::type post(FUNC &&func) { m_func.cbp = std::forward(func); if (m_postProxy) { return m_helper; } m_postProxy = [this]() { std::thread thread([this] { if (m_status.testFlag(DAsyncState::Cancel)) { return; } Guard guard(this); m_threadGuard = &guard; std::unique_lock lck(m_mtxIn); while (true) { while (!m_status.testFlag(DAsyncState::Ready) || !m_QueueIn.m_queue.size()) { guard.setPending(true); // 定时查询 flag,防止ç�¡æ­»çš„æƒ…况å�‘生 m_cvIn.wait_for(lck, std::chrono::milliseconds(200)); if (guard.destructed() || m_status.testFlag(DAsyncState::Cancel)) { return; } } guard.setPending(false); while (m_func.cbp && m_QueueIn.m_queue.size()) { emitHelper(); } } }); thread.detach(); }; return m_helper; } template typename std::enable_if::value, Helper *>::type post(FUNC &&func) { { std::lock_guard lckFunc(m_mtxFunc); m_func.cbp = std::forward(func); } if (m_postProxy) { return m_helper; } m_postProxy = [this]() { std::thread thread([this] { if (m_status.testFlag(DAsyncState::Cancel)) { return; } Guard guard(this); m_threadGuard = &guard; std::unique_lock lck(m_mtxIn); while (true) { if (!m_status.testFlag(DAsyncState::Ready)) { guard.setPending(true); // 定时查询 flag,防止ç�¡æ­»çš„æƒ…况å�‘生 m_cvIn.wait_for(lck, std::chrono::milliseconds(200)); if (guard.destructed() || m_status.testFlag(DAsyncState::Cancel)) { return; } } guard.setPending(false); if (m_func.cbp) { std::lock_guard lckFunc(m_mtxFunc); emitHelper(); m_func.cbp = nullptr; // reset } } }); thread.detach(); }; return m_helper; } // only support DAsync template typename std::enable_if::value>::type postData(const InputType &data) { if (Q_UNLIKELY(!m_status.testFlag(DAsyncState::Cancel))) { m_QueueIn.m_queue.enqueue(data); if (m_status.testFlag(DAsyncState::Pending)) { m_cvIn.notify_one(); } } } private: std::function m_postProxy; class Helper : public QObject { DAsync *m_async; public: explicit Helper(DAsync *async, QObject *parent = nullptr) noexcept : QObject(parent) , m_async(async) { } template Helper *then(FUNC &&func) { m_async->m_mainWorker->template setHandle(std::forward(func)); return this; } // ä»…å�¯åŠ¨ï¼Œé�žé˜»å¡ž void start(bool immediately = true) { if (m_async->m_postProxy) { m_async->m_postProxy(); } if (!immediately) { m_async->m_status.setFlag(DAsyncState::Ready, false); } else { m_async->m_status.setFlag(DAsyncState::Ready); if (m_async->m_status.testFlag(DAsyncState::Pending)) { m_async->m_cvIn.notify_one(); } } } }; Helper *m_helper = nullptr; DtkCorePrivate::MainWorker *m_mainWorker = nullptr; }; DCORE_END_NAMESPACE #endif // DASYNC_H dtkcore-6.7.46/include/util/ddbusextendedabstractinterface.h000066400000000000000000000057501522615770400242710ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2015 Jolla Ltd. // // SPDX-License-Identifier: LGPL-2.1-or-later #ifndef DBUSEXTENDEDABSTRACTINTERFACE_H #define DBUSEXTENDEDABSTRACTINTERFACE_H #include "dtkcore_global.h" #include #include class QDBusPendingCallWatcher; DCORE_BEGIN_NAMESPACE class DDBusExtendedPendingCallWatcher; class LIBDTKCORESHARED_EXPORT DDBusExtendedAbstractInterface : public QDBusAbstractInterface { Q_OBJECT public: virtual ~DDBusExtendedAbstractInterface(); Q_PROPERTY(bool sync READ sync WRITE setSync) inline bool sync() const { return m_sync; } void setSync(bool sync); void setSync(bool sync, bool autoStart); Q_PROPERTY(bool useCache READ useCache WRITE setUseCache) inline bool useCache() const { return m_useCache; } inline void setUseCache(bool useCache) { m_useCache = useCache; } void getAllProperties(); inline QDBusError lastExtendedError() const { return m_lastExtendedError; } public Q_SLOTS: void startServiceProcess(); protected: DDBusExtendedAbstractInterface( const QString &service, const QString &path, const char *interface, const QDBusConnection &connection, QObject *parent); void connectNotify(const QMetaMethod &signal); void disconnectNotify(const QMetaMethod &signal); QVariant internalPropGet(const char *propname, void *propertyPtr); void internalPropSet(const char *propname, const QVariant &value, void *propertyPtr); Q_SIGNALS: void serviceValidChanged(const bool valid) const; void serviceStartFinished(const quint32 ret) const; void propertyChanged(const QString &propertyName, const QVariant &value); void propertyInvalidated(const QString &propertyName); void asyncPropertyFinished(const QString &propertyName); void asyncSetPropertyFinished(const QString &propertyName); void asyncGetAllPropertiesFinished(); private Q_SLOTS: void onPropertiesChanged(const QString &interfaceName, const QVariantMap &changedProperties, const QStringList &invalidatedProperties); void onDBusNameOwnerChanged(const QString &name, const QString &oldOwner, const QString &newOwner); void onAsyncPropertyFinished(QDBusPendingCallWatcher *w); void onAsyncSetPropertyFinished(QDBusPendingCallWatcher *w); void onAsyncGetAllPropertiesFinished(QDBusPendingCallWatcher *watcher); void onStartServiceProcessFinished(QDBusPendingCallWatcher *w); private: QVariant asyncProperty(const QString &propertyName); void asyncSetProperty(const QString &propertyName, const QVariant &value); static QVariant demarshall(const QString &interface, const QMetaProperty &metaProperty, const QVariant &value, QDBusError *error); bool m_sync; bool m_useCache; QDBusPendingCallWatcher *m_getAllPendingCallWatcher; QDBusError m_lastExtendedError; QString m_dbusOwner; bool m_propertiesChangedConnected; }; DCORE_END_NAMESPACE #endif /* DBUSEXTENDEDABSTRACTINTERFACE_H */ dtkcore-6.7.46/include/util/ddbusinterface.h000066400000000000000000000021571522615770400210220ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #pragma once #include "dtkcore_global.h" #include DCORE_BEGIN_NAMESPACE class DDBusInterfacePrivate; // Imported since 5.6.3 class DDBusInterface : public QDBusAbstractInterface { Q_OBJECT public: explicit DDBusInterface(const QString &service, const QString &path, const QString &interface, const QDBusConnection &connection = QDBusConnection::sessionBus(), QObject *parent = nullptr); virtual ~DDBusInterface() override; bool serviceValid() const; QString suffix() const; void setSuffix(const QString &suffix); QVariant property(const char *propName); void setProperty(const char *propName, const QVariant &value); Q_SIGNALS: void serviceValidChanged(const bool valid) const; private: QScopedPointer d_ptr; Q_DECLARE_PRIVATE(DDBusInterface) Q_DISABLE_COPY(DDBusInterface) }; DCORE_END_NAMESPACE dtkcore-6.7.46/include/util/ddbussender.h000066400000000000000000000045301522615770400203370ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DDBUSSENDER_H #define DDBUSSENDER_H #include "dtkcore_global.h" #include #include #include #include #include class LIBDTKCORESHARED_EXPORT DDBusData { public: DDBusData(); QDBusPendingCall asyncCallWithArguments(const QString &method, const QVariantList &arguments, const QString &iface = QString()); QString service; QString path; QString interface; QString queryName; QDBusConnection connection; }; class LIBDTKCORESHARED_EXPORT DDBusCaller { friend class DDBusSender; public: QDBusPendingCall call(); template DDBusCaller arg(const T &argument); private: explicit DDBusCaller(const QString &method, std::shared_ptr data); private: std::shared_ptr m_dbusData; QString m_methodName; QVariantList m_arguments; }; template DDBusCaller DDBusCaller::arg(const T &argument) { m_arguments << QVariant::fromValue(argument); return *this; } class LIBDTKCORESHARED_EXPORT DDBusProperty { friend class DDBusSender; public: QDBusPendingCall get(); template QDBusPendingCall set(const T &value); private: explicit DDBusProperty(const QString &property, std::shared_ptr data); private: std::shared_ptr m_dbusData; QString m_propertyName; }; template QDBusPendingCall DDBusProperty::set(const T &value) { QVariantList args{QVariant::fromValue(m_dbusData->interface), QVariant::fromValue(m_propertyName), QVariant::fromValue(QDBusVariant(value))}; return m_dbusData->asyncCallWithArguments(QStringLiteral("Set"), args, QStringLiteral("org.freedesktop.DBus.Properties")); } class LIBDTKCORESHARED_EXPORT DDBusSender { public: explicit DDBusSender(); DDBusSender service(const QString &service); DDBusSender interface(const QString &interface); DDBusSender path(const QString &path); DDBusCaller method(const QString &method); DDBusProperty property(const QString &property); static DDBusSender system(); private: DDBusSender type(const QDBusConnection::BusType busType); private: std::shared_ptr m_dbusData; }; #endif // DDBUSSENDER_H dtkcore-6.7.46/include/util/ddisksizeformatter.h000066400000000000000000000014671522615770400217600ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DISKSIZEFORMATTER_H #define DISKSIZEFORMATTER_H #include "dabstractunitformatter.h" DCORE_BEGIN_NAMESPACE class LIBDTKCORESHARED_EXPORT DDiskSizeFormatter : public DAbstractUnitFormatter { public: DDiskSizeFormatter(); enum DiskUnits { B, K, M, G, T, }; QString unitStr(int unitId) const override; DDiskSizeFormatter rate(int rate); protected: int unitMin() const override { return B; } int unitMax() const override { return T; } uint unitConvertRate(int unitId) const override { Q_UNUSED(unitId); return m_rate; } private: int m_rate = 1000; }; DCORE_END_NAMESPACE #endif // DISKSIZEFORMATTER_H dtkcore-6.7.46/include/util/dexportedinterface.h000066400000000000000000000015241522615770400217140ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DEXPORTEDINTERFACE_H #define DEXPORTEDINTERFACE_H #include #include #include #include DCORE_BEGIN_NAMESPACE namespace DUtil { class DExportedInterfacePrivate; class LIBDTKCORESHARED_EXPORT DExportedInterface : public QObject, public DObject { Q_OBJECT public: explicit DExportedInterface(QObject *parent = nullptr); ~DExportedInterface(); void registerAction(const QString &action, const QString &description, const std::function handler = nullptr); virtual QVariant invoke(const QString &action, const QString ¶meters) const; private: D_DECLARE_PRIVATE(DExportedInterface) }; } DCORE_END_NAMESPACE #endif dtkcore-6.7.46/include/util/dfileservices.h000066400000000000000000000032661522615770400206710ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DFILESERVICES_H #define DFILESERVICES_H #include #include DCORE_BEGIN_NAMESPACE class LIBDTKCORESHARED_EXPORT DFileServices { public: static bool showFolder(QString localFilePath, const QString &startupId = QString()); static bool showFolders(const QList localFilePaths, const QString &startupId = QString()); static bool showFolder(QUrl url, const QString &startupId = QString()); static bool showFolders(const QList urls, const QString &startupId = QString()); static bool showFileItemPropertie(QString localFilePath, const QString &startupId = QString()); static bool showFileItemProperties(const QList localFilePaths, const QString &startupId = QString()); static bool showFileItemPropertie(QUrl url, const QString &startupId = QString()); static bool showFileItemProperties(const QList urls, const QString &startupId = QString()); static bool showFileItem(QString localFilePath, const QString &startupId = QString()); static bool showFileItems(const QList localFilePaths, const QString &startupId = QString()); static bool showFileItem(QUrl url, const QString &startupId = QString()); static bool showFileItems(const QList urls, const QString &startupId = QString()); static bool trash(QString localFilePath); static bool trash(const QList localFilePaths); static bool trash(QUrl urlstartupId); static bool trash(const QList urls); static QString errorMessage(); }; DCORE_END_NAMESPACE #endif // DFILESERVICES_H dtkcore-6.7.46/include/util/dnotifysender.h000066400000000000000000000017711522615770400207160ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DNOTIFYSENDER_H #define DNOTIFYSENDER_H #include "dtkcore_global.h" #include #include DCORE_BEGIN_NAMESPACE namespace DUtil { struct DNotifyData; class LIBDTKCORESHARED_EXPORT DNotifySender { public: DNotifySender(const QString &summary); DNotifySender appName(const QString &appName = QString()); DNotifySender appIcon(const QString &appIcon = QString()); DNotifySender appBody(const QString &appBody = QString()); DNotifySender replaceId(const uint replaceId = 0); DNotifySender timeOut(const int timeOut = -1); DNotifySender actions(const QStringList &actions = QStringList()); DNotifySender hints(const QVariantMap &hints = QVariantMap()); QDBusPendingCall call(); private: std::shared_ptr m_dbusData; }; } // namespace DUtil DCORE_END_NAMESPACE #endif // DNOTIFYSENDER_H dtkcore-6.7.46/include/util/dpinyin.h000066400000000000000000000016701522615770400175110ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DPINYIN_H #define DPINYIN_H #include #include DCORE_BEGIN_NAMESPACE // without polyphonic support QString LIBDTKCORESHARED_EXPORT Chinese2Pinyin(const QString& words); //!< @~english enum ToneStyle - pinyin tone style enum ToneStyle { TS_NoneTone, /*!< @~english pinyin without tone */ TS_Tone, /*!< @~english pinyin tone, default style in dictory file*/ TS_ToneNum, /*!< @~english pinyin tone number */ }; // support polyphonic QStringList LIBDTKCORESHARED_EXPORT pinyin(const QString& words, ToneStyle ts = TS_Tone, bool *ok = nullptr); // support polyphonic QStringList LIBDTKCORESHARED_EXPORT firstLetters(const QString& words); QStringList LIBDTKCORESHARED_EXPORT firstLetters(const QString& words, ToneStyle ts); DCORE_END_NAMESPACE #endif // DPINYIN_H dtkcore-6.7.46/include/util/drecentmanager.h000066400000000000000000000012001522615770400210030ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DRECENTMANAGER_H #define DRECENTMANAGER_H #include "dtkcore_global.h" #include DCORE_BEGIN_NAMESPACE struct LIBDTKCORESHARED_EXPORT DRecentData { QString appName; QString appExec; QString mimeType; }; class LIBDTKCORESHARED_EXPORT DRecentManager { public: static bool addItem(const QString &uri, DRecentData &data); static void removeItem(const QString &target); static void removeItems(const QStringList &list); }; DCORE_END_NAMESPACE #endif // DRECENTMANAGER_H dtkcore-6.7.46/include/util/dtextencoding.h000066400000000000000000000035571522615770400207040ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022-2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DTEXTENCODING_H #define DTEXTENCODING_H #include #include #include DCORE_BEGIN_NAMESPACE class LIBDTKCORESHARED_EXPORT DTextEncoding { public: static QByteArray detectTextEncoding(const QByteArray &content); static QByteArray detectFileEncoding(const QString &fileName, bool *isOk = nullptr); static bool convertTextEncoding(QByteArray &content, QByteArray &outContent, const QByteArray &toEncoding, const QByteArray &fromEncoding = QByteArray(), QString *errString = nullptr); static bool convertTextEncodingEx(QByteArray &content, QByteArray &outContent, const QByteArray &toEncoding, const QByteArray &fromEncoding = QByteArray(), QString *errString = nullptr, int *convertedBytes = nullptr); static bool convertFileEncoding(const QString &fileName, const QByteArray &toEncoding, const QByteArray &fromEncoding = QByteArray(), QString *errString = nullptr); static bool convertFileEncodingTo(const QString &fromFile, const QString &toFile, const QByteArray &toEncoding, const QByteArray &fromEncoding = QByteArray(), QString *errString = nullptr); }; DCORE_END_NAMESPACE #endif // DTEXTENCODING_H dtkcore-6.7.46/include/util/dthreadutils.h000066400000000000000000000272431522615770400205370ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DTHREADUTILS_H #define DTHREADUTILS_H #include #include #include #include #include #include #include #if DTK_VERSION >= DTK_VERSION_CHECK(6, 0, 0, 0) #include #include #include #endif DCORE_BEGIN_NAMESPACE #if DTK_VERSION < DTK_VERSION_CHECK(6, 0, 0, 0) namespace DThreadUtil { typedef std::function FunctionType; class LIBDTKCORESHARED_EXPORT FunctionCallProxy : public QObject { Q_OBJECT public: explicit FunctionCallProxy(QThread *thread); static void proxyCall(QSemaphore *s, QThread *thread, QObject *target, FunctionType fun); Q_SIGNALS: void callInLiveThread(QSemaphore *s, QPointer target, FunctionType *func); }; template class LIBDTKCORESHARED_EXPORT _TMP { public: inline static ReturnType runInThread(QSemaphore *s, QThread *thread, QObject *target, std::function fun) { ReturnType result; FunctionType proxyFun = [&result, &fun] () { result = fun(); }; FunctionCallProxy::proxyCall(s, thread, target, proxyFun); return result; } template inline static typename std::enable_if::value, ReturnType>::type runInThread(QSemaphore *s, QThread *thread, T *, std::function fun) { return runInThread(s, thread, static_cast(nullptr), fun); } }; template <> class LIBDTKCORESHARED_EXPORT _TMP { public: inline static void runInThread(QSemaphore *s, QThread *thread, QObject *target, std::function fun) { FunctionCallProxy::proxyCall(s, thread, target, fun); } template inline static typename std::enable_if::value, void>::type runInThread(QSemaphore *s, QThread *thread, T *, std::function fun) { return runInThread(s, thread, static_cast(nullptr), fun); } }; template inline auto runInThread(QSemaphore *s, QThread *thread, QObject *target, Fun fun, Args&&... args) -> decltype(fun(args...)) { return _TMP::runInThread(s, thread, target, std::bind(fun, std::forward(args)...)); } template inline auto runInThread(QSemaphore *s, QThread *thread, Fun fun, Args&&... args) -> decltype(fun(args...)) { return runInThread(s, thread, nullptr, fun, std::forward(args)...); } template inline typename QtPrivate::FunctionPointer::ReturnType runInThread(QSemaphore *s, QThread *thread, QObject *target, typename QtPrivate::FunctionPointer::Object *obj, Fun fun, Args&&... args) { return _TMP::ReturnType>::runInThread(s, thread, target, std::bind(fun, obj, std::forward(args)...)); } template inline typename QtPrivate::FunctionPointer::ReturnType runInThread(QSemaphore *s, QThread *thread, typename QtPrivate::FunctionPointer::Object *obj, Fun fun, Args&&... args) { return _TMP::ReturnType>::runInThread(s, thread, obj, std::bind(fun, obj, std::forward(args)...)); } template inline auto runInThread(QThread *thread, QObject *target, Fun fun, Args&&... args) -> decltype(fun(args...)) { QSemaphore s; return runInThread(&s, thread, target, fun, std::forward(args)...); } template inline auto runInThread(QThread *thread, Fun fun, Args&&... args) -> decltype(fun(args...)) { return runInThread(thread, nullptr, fun, std::forward(args)...); } template inline typename QtPrivate::FunctionPointer::ReturnType runInThread(QThread *thread, T *target, typename QtPrivate::FunctionPointer::Object *obj, Fun fun, Args&&... args) { QSemaphore s; return runInThread(&s, thread, target, obj, fun, std::forward(args)...); } template inline typename QtPrivate::FunctionPointer::ReturnType runInThread(QThread *thread, typename QtPrivate::FunctionPointer::Object *obj, Fun fun, Args&&... args) { return runInThread(thread, obj, obj, fun, std::forward(args)...); } template inline auto runInMainThread(QObject *target, Fun fun, Args&&... args) -> decltype(fun(args...)) { if (!QCoreApplication::instance()) { return fun(std::forward(args)...); } return runInThread(QCoreApplication::instance()->thread(), target, fun, std::forward(args)...); } template inline auto runInMainThread(Fun fun, Args&&... args) -> decltype(fun(args...)) { return runInMainThread(nullptr, fun, std::forward(args)...); } template inline typename QtPrivate::FunctionPointer::ReturnType runInMainThread(T *target, typename QtPrivate::FunctionPointer::Object *obj, Fun fun, Args&&... args) { if (!QCoreApplication::instance()) { return (obj->*fun)(std::forward(args)...); } return runInThread(QCoreApplication::instance()->thread(), target, obj, fun, std::forward(args)...); } template inline typename QtPrivate::FunctionPointer::ReturnType runInMainThread(typename QtPrivate::FunctionPointer::Object *obj, Fun fun, Args&&... args) { return runInMainThread(obj, obj, fun, std::forward(args)...); } } #else class LIBDTKCORESHARED_EXPORT DThreadUtils final { friend class Caller; public: explicit DThreadUtils(QThread *thread); ~DThreadUtils(); static DThreadUtils &gui(); QThread *thread() const noexcept; template inline auto run(QObject *context,typename QtPrivate::FunctionPointer::Object *obj, Func fun, Args &&...args) { return call(context, fun, *obj, std::forward(args)...); } template inline auto run(typename QtPrivate::FunctionPointer::Object *obj, Func fun, Args &&...args) { if constexpr (std::is_base_of::Object>::value) { return call(obj, fun, *obj, std::forward(args)...); } else { return call(static_cast(nullptr), fun, *obj, std::forward(args)...); } } template inline QFuture, Args...>> run(QObject *context, Func fun, Args &&...args) { return call(context, fun, std::forward(args)...); } template inline QFuture, Args...>> run(Func fun, Args &&...args) { return call(static_cast(nullptr), fun, std::forward(args)...); } template inline decltype(auto) exec(T &&...args) { auto future = run(std::forward(args)...); if (!thread()->isRunning()) { qWarning() << "The target thread is not running, maybe lead to deadlock."; } future.waitForFinished(); if constexpr (std::is_same_v>) { return; } else { return future.result(); } } private: class AbstractCallEvent : public QEvent { public: AbstractCallEvent(QEvent::Type type) : QEvent(type) { } virtual void call() = 0; }; template class Q_DECL_HIDDEN CallEvent : public AbstractCallEvent { using FunInfo = QtPrivate::FunctionPointer>; using ReturnType = std::invoke_result_t, Args...>; public: CallEvent(QEvent::Type type, Func &&fun, Args &&...args) : AbstractCallEvent(type) , function(std::forward(fun)) , arguments(std::forward(args)...) { } QEvent *clone() const override { return nullptr; } void call() override { if (promise.isCanceled()) { return; } if (contextChecker == context) { promise.start(); #ifndef QT_NO_EXCEPTIONS try { #endif if constexpr (std::is_void_v) { std::apply(function, arguments); } else { promise.addResult(std::apply(function, arguments)); } #ifndef QT_NO_EXCEPTIONS } catch (...) { promise.setException(std::current_exception()); } #endif promise.finish(); } else { promise.start(); promise.setException(std::make_exception_ptr(std::runtime_error("The context object is destroyed."))); promise.finish(); } } Func function; const std::tuple arguments; QPromise promise; QObject *context{nullptr}; QPointer contextChecker; }; template inline auto call(QObject *context, Func fun, Args &&...args) { using FuncInfo = QtPrivate::FunctionPointer>; using ReturnType = std::invoke_result_t, Args...> ; if constexpr (FuncInfo::IsPointerToMemberFunction) { static_assert(std::is_same_v::Car>, typename FuncInfo::Object>, "The obj and function are not compatible."); static_assert( QtPrivate::CheckCompatibleArguments::Cdr, typename FuncInfo::Arguments>::value, "The args and function are not compatible."); } else if constexpr (FuncInfo::ArgumentCount != -1) { static_assert(QtPrivate::CheckCompatibleArguments, typename FuncInfo::Arguments>::value, "The args and function are not compatible."); } else { // for lambda and impl operator() static_assert(std::is_invocable_r_v, "The callable object can't invoke with supplied args"); } QPromise promise; auto future = promise.future(); if (Q_UNLIKELY(QThread::currentThread() == m_thread)) { promise.start(); if constexpr (std::is_void_v) { std::invoke(fun, std::forward(args)...); } else { promise.addResult(std::invoke(fun, std::forward(args)...)); } promise.finish(); } else { auto event = new CallEvent(eventType, std::move(fun), std::forward(args)...); event->promise = std::move(promise); event->context = context; event->contextChecker = context; QCoreApplication::postEvent(ensureThreadContextObject(), event); } return future; } QObject *ensureThreadContextObject(); static inline QEvent::Type eventType; QThread *m_thread; QAtomicPointer threadContext; }; #endif // version macro end DCORE_END_NAMESPACE #endif // protect macro end dtkcore-6.7.46/include/util/dtimedloop.h000066400000000000000000000031041522615770400201710ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DTIMEDLOOP_H #define DTIMEDLOOP_H #include #include #include DCORE_BEGIN_NAMESPACE class DObject; class DTimedLoopPrivate; class DTimedLoop : public QEventLoop, public DObject { Q_OBJECT public: explicit DTimedLoop() noexcept; explicit DTimedLoop(QObject *parent) noexcept; ~DTimedLoop(); // 如果是 isRunning 则返回从开始到现在的 exec 执行时间,å�¦åˆ™è¿”回上次è¿�行的时间 int runningTime(); void setTimeDump(bool flag = true); void exit(int returnCode = 0); // æ–¹å¼�1:ä¸�传定时时间,如果ä¸�退出就一直执行,é…�å�ˆ exit 使用 // æ–¹å¼�2:传入durationMs å�‚数的是定时执行的,也能调用 exit æ��å‰�退出 // 如果传入了 executionName 就会为本次执行设置一个å��字,会输出到 log // 在执行结æ�Ÿå°†ä¼šæ‰“å�° exec 的执行时间,å�¯ä»¥ç”¨ setTimeDump 控制其是å�¦æ‰“å�° int exec(QEventLoop::ProcessEventsFlags flags = QEventLoop::AllEvents); int exec(int durationMs, QEventLoop::ProcessEventsFlags flags = QEventLoop::AllEvents); int exec(const QString &executionName, QEventLoop::ProcessEventsFlags flags = QEventLoop::AllEvents); int exec(int durationMs, const QString &executionName, QEventLoop::ProcessEventsFlags flags = QEventLoop::AllEvents); private: Q_DISABLE_COPY(DTimedLoop) D_DECLARE_PRIVATE(DTimedLoop) }; DCORE_END_NAMESPACE #endif // DTIMEDLOOP_H dtkcore-6.7.46/include/util/dtimeunitformatter.h000066400000000000000000000013661522615770400217670ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DTIMEUNITFORMATTER_H #define DTIMEUNITFORMATTER_H #include "dtkcore_global.h" #include "dabstractunitformatter.h" DCORE_BEGIN_NAMESPACE class LIBDTKCORESHARED_EXPORT DTimeUnitFormatter : public DAbstractUnitFormatter { public: DTimeUnitFormatter(); enum TimeUnits { Seconds, Minute, Hour, Day, }; QString unitStr(int unitId) const override; protected: int unitMax() const override { return Day; } int unitMin() const override { return Seconds; } uint unitConvertRate(int unitId) const override; }; DCORE_END_NAMESPACE #endif // DTIMEUNITFORMATTER_H dtkcore-6.7.46/include/util/dutil.h000066400000000000000000000034711522615770400171610ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2016 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #pragma once #include #include #include #include #include #include #include #include #include namespace DUtil { template inline void TimerSingleShot(int msec, Func1 slot) { #if QT_VERSION >= 0x050500 QTimer::singleShot(msec, slot); #else QTimer *timer = new QTimer; timer->setSingleShot(true); timer->setInterval(msec); timer->moveToThread(qApp->thread()); QObject::connect(timer, &QTimer::timeout, slot); QObject::connect(timer, &QTimer::timeout, timer, &QTimer::deleteLater); if (QThread::currentThread() == qApp->thread()) { timer->start(); } else { QMetaObject::invokeMethod(timer, "start", Qt::QueuedConnection); } #endif } template void SecureErase(T *p, size_t size) { static_assert(std::is_standard_layout::value && std::is_trivially_destructible::value, "try to erase content of raw pointer, but type T isn't suitable"); std::memset(p, 0, size); } template void SecureErase(T &obj) { static_assert(std::is_default_constructible::value, "container's value type must have a default constructor."); for (typename T::iterator i = obj.begin(); i != obj.end(); ++i) { *i = typename T::value_type{}; } } QString escapeToObjectPath(const QByteArray &str) noexcept; QString escapeToObjectPath(const QString &str) noexcept; QString unescapeFromObjectPath(const QString &str) noexcept; QString getAppIdFromAbsolutePath(const QString &path) noexcept; QStringList getAbsolutePathFromAppId(const QString &appId) noexcept; } dtkcore-6.7.46/include/util/dvtablehook.h000066400000000000000000000344311522615770400203420ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2019 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DVTABLEHOOK_H #define DVTABLEHOOK_H #include #include #include #include #include #include #include DCORE_BEGIN_NAMESPACE #ifndef QT_DEBUG inline Q_LOGGING_CATEGORY(vtableHook, "dtk.vtableHook", QtInfoMsg); #else inline Q_LOGGING_CATEGORY(vtableHook, "dtk.vtableHook"); #endif class LIBDTKCORESHARED_EXPORT DVtableHook { public: static inline quintptr toQuintptr(const void *ptr) { return *(quintptr*)ptr; } static inline int getVtableSize(quintptr **obj) { quintptr *begin = *obj; while (true) { if ((int64_t)*begin == 0 or (int64_t)*begin < QSysInfo::WordSize) // offset will grater than 8 bytes(64 bit) break; ++begin; } return begin - *obj + 2; // for offset and rtti info } static inline quintptr *getVtableOfObject(const void *obj) { return *(quintptr**)obj; } template static quintptr *getVtableOfClass() { QByteArray vtable_symbol(typeid(T).name()); vtable_symbol.prepend("_ZTV"); quintptr *vfptr_t1 = reinterpret_cast(resolve(vtable_symbol.constData())); return vfptr_t1 ? adjustToEntry(vfptr_t1) : nullptr; } static int getDestructFunIndex(quintptr **obj, std::function destoryObjFun); static constexpr const QObject *getQObject(...) { return nullptr;} static constexpr const QObject *getQObject(const QObject *obj) { return obj;} static void autoCleanVtable(const void *obj); static bool ensureVtable(const void *obj, std::function destoryObjFun); static bool hasVtable(const void *obj); static void resetVtable(const void *obj); static quintptr resetVfptrFun(const void *obj, quintptr functionOffset); static quintptr originalFun(const void *obj, quintptr functionOffset); static bool forceWriteMemory(void *adr, const void *data, size_t length); static QFunctionPointer resolve(const char *symbol); template class OverrideDestruct : public T { ~OverrideDestruct() override;}; template struct CheckCompatibleArguments { enum { value = false }; }; template struct CheckCompatibleArguments { enum { value = true }; }; template static bool overrideVfptrFun(quintptr *vfptr_t1, Fun1 fun1, quintptr *vfptr_t2, Fun2 fun2, bool forceWrite) { typedef QtPrivate::FunctionPointer FunInfo1; typedef QtPrivate::FunctionPointer FunInfo2; //compilation error if the arguments does not match. Q_STATIC_ASSERT_X((CheckCompatibleArguments::value), "Function1 and Function2 arguments are not compatible."); Q_STATIC_ASSERT_X((CheckCompatibleArguments, QtPrivate::List>::value), "Function1 and Function2 return type are not compatible.."); //! ({code}) in the form of a code is to eliminate - Wstrict - aliasing build warnings quintptr fun1_offset = toQuintptr(&fun1); quintptr fun2_offset = toQuintptr(&fun2); if (fun1_offset < 0 || fun1_offset > UINT_LEAST16_MAX) return false; quintptr *vfun = vfptr_t1 + fun1_offset / sizeof(quintptr); // if the fun2 is not virtual function if (fun2_offset <= UINT_LEAST16_MAX) { fun2_offset = *(vfptr_t2 + fun2_offset / sizeof(quintptr)); } if (forceWrite) return forceWriteMemory(vfun, &fun2_offset, sizeof(fun2_offset)); *vfun = fun2_offset; return true; } template static bool overrideVfptrFun(const typename QtPrivate::FunctionPointer::Object *t1, Fun1 fun1, const typename QtPrivate::FunctionPointer::Object *t2, Fun2 fun2) { typedef QtPrivate::FunctionPointer FunInfo1; // 检查æž�构函数是å�¦ä¸ºè™š class OverrideDestruct : public FunInfo1::Object { ~OverrideDestruct() override;}; //TODO: we can use std::has_virtual_destructor if (!ensureVtable((void*)t1, std::bind(&_destory_helper, t1))) { return false; } quintptr *vfptr_t1 = getVtableOfObject(t1); quintptr *vfptr_t2 = getVtableOfObject(t2); bool ok = overrideVfptrFun(vfptr_t1, fun1, vfptr_t2, fun2, false); if (!ok) { // æ�¢å¤�旧环境 resetVtable(t1); } return ok; } template static bool overrideVfptrFun(Fun1 fun1, const typename QtPrivate::FunctionPointer::Object *t2, Fun2 fun2) { quintptr *vfptr_t1 = getVtableOfClass(); if (!vfptr_t1) { abort(); } quintptr *vfptr_t2 = getVtableOfObject(t2); return overrideVfptrFun(vfptr_t1, fun1, vfptr_t2, fun2, true); } template static bool overrideVfptrFun(Fun1 fun1, const typename QtPrivate::FunctionPointer::Object *t2, Fun2 fun2) { typedef QtPrivate::FunctionPointer FunInfo1; return overrideVfptrFun(fun1, t2, fun2); } template struct FunctionPointer { }; template struct FunctionPointer { typedef QtPrivate::List Arguments; }; template struct FunctionPointer { typedef QtPrivate::List Arguments; }; template static typename std::enable_if::ArgumentCount >= 0, bool>::type overrideVfptrFun(quintptr *vfptr_t1, Fun1 fun1, Fun2 fun2, bool forceWrite) { typedef QtPrivate::FunctionPointer FunInfo1; typedef QtPrivate::FunctionPointer FunInfo2; Q_STATIC_ASSERT(!FunInfo2::IsPointerToMemberFunction); //compilation error if the arguments does not match. Q_STATIC_ASSERT_X((CheckCompatibleArguments::Arguments, typename FunInfo2::Arguments>::value), "Function1 and Function2 arguments are not compatible."); Q_STATIC_ASSERT_X((CheckCompatibleArguments, QtPrivate::List>::value), "Function1 and Function2 return type are not compatible.."); //! ({code}) in the form of a code is to eliminate - Wstrict - aliasing build warnings quintptr fun1_offset = toQuintptr(&fun1); quintptr fun2_offset = toQuintptr(&fun2); if (fun1_offset > UINT_LEAST16_MAX) return false; quintptr *vfun = vfptr_t1 + fun1_offset / sizeof(quintptr); if (forceWrite) return forceWriteMemory(vfun, &fun2_offset, sizeof(fun2_offset)); *vfun = fun2_offset; return true; } template struct StdFunWrap {}; template struct StdFunWrap { typedef std::function StdFunType; static inline StdFunType fun(StdFunType f, bool check = true) { static StdFunType fun = f; static bool initialized = false; if (initialized && check) qCWarning(vtableHook, "The StdFunWrap is dirty! Don't use std::bind(use lambda functions)."); initialized = true; return fun; } static Ret call(Obj *o, Args... args) { return fun(call, false)(o, std::forward(args)...); } }; template struct StdFunWrap : StdFunWrap{}; template static inline typename std::enable_if::ArgumentCount == -1, bool>::type overrideVfptrFun(quintptr *vfptr_t1, Fun1 fun1, Fun2 fun2, bool forceWrite) { typedef QtPrivate::FunctionPointer FunInfo1; const int FunctorArgumentCount = QtPrivate::ComputeFunctorArgumentCount::Arguments>::Value; Q_STATIC_ASSERT_X((FunctorArgumentCount >= 0), "Function1 and Function2 arguments are not compatible."); const int Fun2ArgumentCount = (FunctorArgumentCount >= 0) ? FunctorArgumentCount : 0; #if QT_VERSION >= QT_VERSION_CHECK(6, 9, 0) typedef typename QtPrivate::FunctorReturnType::Arguments, Fun2ArgumentCount>::Value>::type Fun2ReturnType; #else typedef typename QtPrivate::FunctorReturnType::Arguments, Fun2ArgumentCount>::Value>::Value Fun2ReturnType; #endif Q_STATIC_ASSERT_X((QtPrivate::AreArgumentsCompatible::value), "Function1 and Function2 return type are not compatible."); StdFunWrap::fun(fun2); return overrideVfptrFun(vfptr_t1, fun1, StdFunWrap::call, forceWrite); } /*! * \fn template static bool overrideVfptrFun(const typename QtPrivate::FunctionPointer::Object *t1, Fun1 fun1, Fun2 fun2) * * \note é‡�载多继承类中的多个虚函数时,fun1务必标记æˆ�一个类å��的函数。å�¦åˆ™å�¯èƒ½å‡ºçŽ°å†…å­˜æ³„éœ²çš„æƒ…å†µ * \note 例如 class A 继承于 B,C,D,当需è¦�é‡�è½½B中的foo1,C中的foo2时,以下函数的fun1需è¦�统一标记为&A::foo1å’Œ&A::foo2 * \note 因为如果分开写为&B::foo1å’Œ&C::foo2çš„è¯�,指针转æ�¢å†…部会记录多张虚表,é‡�载多份æž�构函数,å�¯èƒ½å¯¼è‡´æœ€å¼€å§‹çš„部分无法正常æž�æž„ï¼� */ template static bool overrideVfptrFun(const typename QtPrivate::FunctionPointer::Object *t1, Fun1 fun1, Fun2 fun2) { typedef QtPrivate::FunctionPointer FunInfo1; // 检查æž�构函数是å�¦ä¸ºè™š class OverrideDestruct : public FunInfo1::Object { ~OverrideDestruct() override;}; if (!ensureVtable((void*)t1, std::bind(&_destory_helper, t1))) { return false; } bool ok = overrideVfptrFun(getVtableOfObject(t1), fun1, fun2, false); if (!ok) { // æ�¢å¤�旧环境 resetVtable(t1); } return true; } template static bool overrideVfptrFun(Fun1 fun1, Fun2 fun2) { quintptr *vfptr_t1 = getVtableOfClass(); if (!vfptr_t1) { abort(); } return overrideVfptrFun(vfptr_t1, fun1, fun2, true); } template static bool overrideVfptrFun(Fun1 fun1, Fun2 fun2) { typedef QtPrivate::FunctionPointer FunInfo1; return overrideVfptrFun(fun1, fun2); } template static bool resetVfptrFun(const typename QtPrivate::FunctionPointer::Object *obj, Fun1 fun) { return resetVfptrFun((void*)obj, toQuintptr(&fun)) > 0; } template static Fun originalFun(const typename QtPrivate::FunctionPointer::Object *obj, Fun fun) { quintptr o_fun = originalFun((void*)obj, toQuintptr(&fun)); return *reinterpret_cast(o_fun); } template static typename QtPrivate::FunctionPointer::ReturnType callOriginalFun(typename QtPrivate::FunctionPointer::Object *obj, Fun fun, Args&&... args) { quintptr fun_offset = toQuintptr(&fun); class _ResetVFun { public: ~_ResetVFun() { *(vfptr + offset / sizeof(quintptr)) = oldFun; } quintptr *vfptr = nullptr; quint16 offset = 0; quintptr oldFun = 0; }; _ResetVFun rvf; rvf.vfptr = *(quintptr**)(obj); rvf.offset = fun_offset; rvf.oldFun = DVtableHook::resetVfptrFun((void*)obj, fun_offset); if (!rvf.oldFun) { qCWarning(vtableHook) << "Reset the function failed, object: " << obj; abort(); } // call return (obj->*fun)(std::forward(args)...); } private: static bool copyVtable(quintptr **obj); static bool clearGhostVtable(const void *obj); #if DTK_VERSION < DTK_VERSION_CHECK(6, 0, 0, 0) Q_DECL_DEPRECATED static bool isFinalClass(quintptr *obj); Q_DECL_DEPRECATED static quintptr **adjustThis(quintptr *obj); #endif template static T adjustToTop(T obj) // vtableTop: vtable start address, Usually refers to offset_to_top { // this function should'n be called when entry is parent entry using fundamentalType = typename std::remove_cv::type>::type; return obj - static_cast(2); // vtable start address = vtable entry - 2 } template static T adjustToEntry(T obj) // vtableEntry: is located after rtti in the virtual table { // this function should'n be called when entry is parent entry using fundamentalType = typename std::remove_cv::type>::type; return obj + static_cast(2); // vtable entry = vtable start address + 2 } template static void _destory_helper(const T *obj) { delete obj; } static QMap objToOriginalVfptr; static QMap objToGhostVfptr; static QMap objDestructFun; }; DCORE_END_NAMESPACE #endif // DVTABLEHOOK_H dtkcore-6.7.46/linglong.yaml000066400000000000000000000007541522615770400157650ustar00rootroot00000000000000package: id: dtkcore name: dtkcore kind: lib version: 5.6.3 description: | Deepin Tool Kit Core Devel library \ DtkCore is base devel library of Deepin Qt/C++ applications. base: id: org.deepin.base/23.0.0 depends: - id: qtbase/5.15.7 - id: dtkcommon/5.6.0.1 - id: gsettings-qt/0.3.1.1 source: kind: local variables: extra_args: | -DBUILD_EXAMPLES=OFF \ -DBUILD_DOCS=OFF \ -DBUILD_TESTING=OFF \ -DDTK_VERSION=${VERSION} build: kind: cmake dtkcore-6.7.46/misc/000077500000000000000000000000001522615770400142155ustar00rootroot00000000000000dtkcore-6.7.46/misc/DtkCoreConfig.cmake.in000066400000000000000000000016331522615770400203100ustar00rootroot00000000000000@PACKAGE_INIT@ if(UNIX AND NOT APPLE) set(LINUX TRUE) endif() include(CMakeFindDependencyMacro) find_dependency(Qt@QT_VERSION_MAJOR@Core) find_dependency(Qt@QT_VERSION_MAJOR@Xml) find_dependency(Dtk@DTK_NAME_SUFFIX@Log) if (LINUX) find_dependency(Qt@QT_VERSION_MAJOR@DBus) endif() find_dependency(Dtk@DTK_NAME_SUFFIX@DConfig) include(${CMAKE_CURRENT_LIST_DIR}/Dtk@DTK_NAME_SUFFIX@CoreTargets.cmake) set(DtkCore_LIBRARIES Dtk@DTK_NAME_SUFFIX@::Core) get_target_property(DtkCore_INCLUDE_DIRS Dtk@DTK_NAME_SUFFIX@::Core INTERFACE_INCLUDE_DIRECTORIES) get_target_property(DtkCore_LIBRARY_DIRS Dtk@DTK_NAME_SUFFIX@::Core INTERFACE_LINK_DIRECTORIES) set(DtkCore_TOOL_DIRS "@PACKAGE_TOOL_INSTALL_DIR@") check_required_components(DtkCore) # Keep deprecated variables for compatibility set(DTKCORE_INCLUDE_DIRS ${DtkCore_INCLUDE_DIRS}) set(DTKCORE_TOOL_DIRS ${DtkCore_TOOL_DIRS}) add_definitions(-DQT_MESSAGELOGCONTEXT) dtkcore-6.7.46/misc/dtk_install_dconfig.prf000066400000000000000000000062611522615770400207340ustar00rootroot00000000000000# This prf file is used to deploy files that dconfig's meta and override configure. # # get variable `$$DSG_DATA_DIR` 's value, it’s consistent with class DConfigFile code. isEmpty(DSG_DATA_DIR) { isEmpty(PREFIX) { DSG_DATA_DIR=/usr/share/dsg } else { DSG_DATA_DIR=$$PREFIX/share/dsg } } # deploy some `meta` 's configure. # # files - deployed files. # base - used to get subpath, if it's empty, only copy files, and ignore it's subpath structure. # appid - working for the app, if it's empty, depending on `TEMPLATE`. # commonid - working for common, if it's empyt, depending on `TEMPLATE`. # # e.g: # dconfig_example.files += \ # $$PWD/configs/dconf-example.json \ # $$PWD/configs/a/dconf-example.json # dconfig_example.base = $$PWD/configs # dconfig_example.appid = $$TARGET # # dconfig_example2.files += $$PWD/configs/a/dconf-example.json # # DCONFIG_META_FILES += dconfig_example dconfig_example2 # for(metaitem, DCONFIG_META_FILES) { eval(dconfig_meta_$${metaitem}.files = $$eval($${metaitem}.files)) eval(dconfig_meta_$${metaitem}.base = $$eval($${metaitem}.base)) isEmpty($${metaitem}.appid) { is_common_configuration=true isEmpty($${metaitem}.commonid) { equals(TEMPLATE, app) { eval(dconfig_meta_$${metaitem}.path = $$DSG_DATA_DIR/configs/$$TARGET/) is_common_configuration=false } } if ($$is_common_configuration) { eval(dconfig_meta_$${metaitem}.path = $$DSG_DATA_DIR/configs) } } else { eval(dconfig_meta_$${metaitem}.path = $$DSG_DATA_DIR/configs/$$eval($${metaitem}.appid)) } INSTALLS += dconfig_meta_$${metaitem} } # deploy some `meta` 's override configure. # # configuration for the `meta_name` 's override configure. # # files - deployed files. # base - used to get subpath, if it's empty, only copy files, and ignore it's subpath structure. # appid - working for the app, if it's empty, working for all app. # meta_name - override for the meta configure. # # e.g : # dconfig_example.files += \ # $$PWD/configs/dconf-example.override.json \ # $$PWD/configs/a/dconf-example.override.a.json # dconfig_example.base = $$PWD/configs # dconfig_example.meta_name = example # dconfig_example.appid = $$TARGET # # dconfig_example2.files += $$PWD/configs/a/dconf-example.override.a.json # dconfig_example2.meta_name = example2 # # DCONFIG_OVERRIDE_FILES += dconfig_example dconfig_example2 # for(overrideitem, DCONFIG_OVERRIDE_FILES) { eval(dconfig_override_$${overrideitem}.files = $$eval($${overrideitem}.files)) eval(dconfig_override_$${overrideitem}.base = $$eval($${overrideitem}.base)) isEmpty($${overrideitem}.meta_name) : error("Please set meta_name for the override configuration." $${overrideitem}) isEmpty($${overrideitem}.appid) { eval(dconfig_override_$${overrideitem}.path = $$DSG_DATA_DIR/configs/overrides/$$eval($${overrideitem}.meta_name)) } else { eval(dconfig_override_$${overrideitem}.path = $$DSG_DATA_DIR/configs/overrides/$$eval($${overrideitem}.appid)/$$eval($${overrideitem}.meta_name)) } INSTALLS += dconfig_override_$${overrideitem} } dtkcore-6.7.46/misc/dtkcore.pc.in000066400000000000000000000005571522615770400166100ustar00rootroot00000000000000prefix=@CMAKE_INSTALL_PREFIX@ exec_prefix=${prefix} libdir=${prefix}/@LIBRARY_INSTALL_DIR@ includedir=${prefix}/@INCLUDE_INSTALL_DIR@ Name: dtk@DTK_NAME_SUFFIX@core Description: Development ToolKit Core Devel Library Version: @DTK_VERSION@ Libs: -L${libdir} -ldtk@DTK_NAME_SUFFIX@core Cflags: -I${includedir} -DQT_MESSAGELOGCONTEXT Requires: dtk@DTK_NAME_SUFFIX@log dtkcore-6.7.46/misc/qt_lib_dtkcore.pri.in000066400000000000000000000011241522615770400203210ustar00rootroot00000000000000QT.dtkcore.VERSION = @DTK_VERSION@ QT.dtkcore.MAJOR_VERSION = @DTK_VERSION_MAJOR@ QT.dtkcore.MINOR_VERSION = @DTK_VERSION_MINOR@ QT.dtkcore.PATCH_VERSION = @DTK_VERSION_PATCH@ QT.dtkcore.name = dtkcore QT.dtkcore.module = dtk@DTK_NAME_SUFFIX@core QT.dtkcore.tools = @CMAKE_INSTALL_PREFIX@/@TOOL_INSTALL_DIR@ QT.dtkcore.libs = @CMAKE_INSTALL_PREFIX@/@LIBRARY_INSTALL_DIR@ QT.dtkcore.includes = @CMAKE_INSTALL_PREFIX@/@INCLUDE_INSTALL_DIR@ QT.dtkcore.frameworks = QT.dtkcore.depends = core dbus xml dtklog QT.dtkcore.module_config = v2 ltcg QT.dtkcore.DEFINES += QT_MESSAGELOGCONTEXT QT_MODULES += dtkcore-6.7.46/rpm/000077500000000000000000000000001522615770400140605ustar00rootroot00000000000000dtkcore-6.7.46/rpm/dtkcore.spec000066400000000000000000000040051522615770400163660ustar00rootroot00000000000000Name: dtkcore Version: 6.7.46 Release: 1%{?dist} Summary: Deepin tool kit core modules License: LGPLv3+ URL: https://github.com/linuxdeepin/dtkcore %if 0%{?fedora} Source0: %{url}/archive/%{version}/%{name}-%{version}.tar.gz %else Source0: %{name}-%{version}.orig.tar.xz %endif BuildRequires: dtkcommon-devel BuildRequires: gcc-c++ BuildRequires: annobin BuildRequires: pkgconfig(Qt5Core) BuildRequires: pkgconfig(gsettings-qt) BuildRequires: gtest-devel BuildRequires: uchardet-devel BuildRequires: libicu-devel # since f30 Obsoletes: deepin-tool-kit <= 0.3.3 Obsoletes: deepin-tool-kit-devel <= 0.3.3 Obsoletes: dtksettings <= 0.1.7 Obsoletes: dtksettings-devel <= 0.1.7 %description Deepin tool kit core modules. %package devel Summary: Development package for %{name} Requires: %{name}%{?_isa} = %{version}-%{release} Requires: dtkcommon-devel Requires: qt5-qtbase-devel%{?_isa} %description devel Header files and libraries for %{name}. %prep %autosetup -p1 %build # help find (and prefer) qt5 utilities, e.g. qmake, lrelease export PATH=%{_qt5_bindir}:$PATH %qmake_qt5 PREFIX=%{_prefix} \ DTK_VERSION=%{version} \ LIB_INSTALL_DIR=%{_libdir} \ BIN_INSTALL_DIR=%{_libexecdir}/dtk5 \ TOOL_INSTALL_DIR=%{_libexecdir}/dtk5 %make_build %install %make_install INSTALL_ROOT=%{buildroot} %files %doc README.md %license LICENSE %{_libdir}/lib%{name}.so.5* %dir %{_libexecdir}/dtk5/ %{_libexecdir}/dtk5/dtk-settings %{_libexecdir}/dtk5/dtk-license.py %{_libexecdir}/dtk5/dtk-translate.py %{_libexecdir}/dtk5/deepin-os-release %{_prefix}/bin/qdbusxml2cpp-fix %files devel %doc doc/Specification.md %{_includedir}/libdtk-*/ %{_qt5_archdatadir}/mkspecs/modules/*.pri %{_libdir}/cmake/DtkCore/ %{_libdir}/cmake/DtkCMake/ %{_libdir}/cmake/DtkTools/ %{_libdir}/pkgconfig/dtkcore.pc %{_libdir}/lib%{name}.so %changelog * Thu Jun 11 2020 uoser - 5.2.2.3 - Update to 5.2.2.3 dtkcore-6.7.46/src/000077500000000000000000000000001522615770400140515ustar00rootroot00000000000000dtkcore-6.7.46/src/CMakeLists.txt000066400000000000000000000125561522615770400166220ustar00rootroot00000000000000#cmake_minimum_required(VERSION 3.5) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core) find_package(Dtk${DTK_NAME_SUFFIX}Log REQUIRED) find_package(DBus1 REQUIRED) if(LINUX) find_package(PkgConfig REQUIRED) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS DBus) if(${QT_VERSION_MAJOR} EQUAL 5) pkg_check_modules(QGSettings REQUIRED IMPORTED_TARGET gsettings-qt) #Dtk6 removed. elseif(${QT_VERSION_MAJOR} EQUAL 6) if(${Qt6Core_VERSION} VERSION_GREATER_EQUAL 6.10.0) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS CorePrivate) endif() else() message(FATAL_ERROR "Unsupported Qt version: ${QT_VERSION_MAJOR}") endif() endif() find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Xml) find_package(DtkBuildHelper REQUIRED) # start text encoding find_package(ICU REQUIRED COMPONENTS uc) pkg_check_modules(uchardet REQUIRED uchardet) # end text encoding # 为ä¸�包å�«å®žé™…QObject类的头文件跳过AutoMOC处ç�† set_property(SOURCE ../include/base/dsingleton.h PROPERTY SKIP_AUTOMOC ON) if("${DTK_VERSION_MAJOR}" STREQUAL "6") set_property(SOURCE ../include/util/dthreadutils.h PROPERTY SKIP_AUTOMOC ON) endif() # start base include(base/base.cmake) # end base # start dci include(dci/dci.cmake) #end dci #start filesystem include(filesystem/filesystem.cmake) #end filesystem # start log include(log/log.cmake) #end log # start settings include(settings/settings.cmake) #end settings #start utils include(util/util.cmake) #end utils #GLOB include(glob.cmake) #endGLOG if(LINUX) add_library(${LIB_NAME} SHARED ${base_SRCS} ${dci_SRCS} ${filesystem_SRCS} ${log_SRCS} ${settings_SRC} ${utils_SRC} ${glob_SRC} ) target_link_libraries( ${LIB_NAME} PUBLIC Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::DBus Qt${QT_VERSION_MAJOR}::Xml Dtk${DTK_NAME_SUFFIX}::Log ) target_link_libraries(${LIB_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::CorePrivate ) if("${QT_VERSION_MAJOR}" STREQUAL "5") target_link_libraries(${LIB_NAME} PRIVATE PkgConfig::QGSettings ) endif() else() add_library(${LIB_NAME} SHARED ${base_SRCS} ${dci_SRCS} ${filesystem_SRCS} ${log_SRCS} ${settings_SRC} ${utils_SRC} ${glob_SRC} ) target_link_libraries( ${LIB_NAME} PUBLIC Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Xml ) target_link_libraries(${LIB_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::CorePrivate ) if("${QT_VERSION_MAJOR}" STREQUAL "5") target_link_libraries(${LIB_NAME} PRIVATE PkgConfig::QGSettings ) endif() endif() set_target_properties(${LIB_NAME} PROPERTIES VERSION ${DTK_VERSION} SOVERSION ${DTK_VERSION_MAJOR} EXPORT_NAME Core ) target_compile_definitions(${LIB_NAME} PUBLIC PREFIX="${DSG_PREFIX_PATH}" DSYSINFO_PREFIX="${DSYSINFO_PREFIX}" ) target_compile_definitions(${LIB_NAME} PRIVATE LIBDTKCORE_LIBRARY ) target_link_libraries(${LIB_NAME} PRIVATE dbus-1 ) target_include_directories(${LIB_NAME} PRIVATE ${uchardet_INCLUDE_DIRS} ) target_include_directories(${LIB_NAME} PUBLIC $ $ $ $ $ $ $ $ $ $ $ ) target_include_directories(${LIB_NAME} INTERFACE $ ) target_link_directories(${LIB_NAME} INTERFACE $ $ ) set(EnableCov CACHE BOOL OFF) if (EnableCov) dtk_setup_code_coverage(${LIB_NAME}) endif() dtk_check_and_add_definitions(${LIB_NAME} DEFS OS_VERSION_TEST_FILE LSB_RELEASE_TEST_FILE OS_RELEASE_TEST_FILE DEEPIN_VERSION_TEST_FILE ) set(TOINSTALLBASE ../include/base/dobject.h ../include/base/dsingleton.h ../include/base/private/dobject_p.h ../include/base/derror.h ../include/base/dexpected.h ) install(FILES ${TOINSTALLBASE} DESTINATION "${INCLUDE_INSTALL_DIR}") install(FILES ${LOG_HEADER} DESTINATION "${INCLUDE_INSTALL_DIR}") install(FILES ${SETTINGS_HEADERS} DESTINATION "${INCLUDE_INSTALL_DIR}") install(FILES ${UTILS_HEADERS} DESTINATION "${INCLUDE_INSTALL_DIR}") install(DIRECTORY ../include/dci/ DESTINATION "${INCLUDE_INSTALL_DIR}" FILES_MATCHING PATTERN "*.h") install(DIRECTORY ../include/DtkCore/ DESTINATION "${INCLUDE_INSTALL_DIR}" FILES_MATCHING PATTERN "*") install(DIRECTORY ../include/filesystem/ DESTINATION "${INCLUDE_INSTALL_DIR}" FILES_MATCHING PATTERN "*.h") install(DIRECTORY ../include/global/ DESTINATION "${INCLUDE_INSTALL_DIR}" FILES_MATCHING PATTERN "*.h") install(TARGETS ${LIB_NAME} EXPORT ${DtkCore}Targets DESTINATION ${LIBRARY_INSTALL_DIR}) install(EXPORT ${DtkCore}Targets FILE ${DtkCore}Targets.cmake NAMESPACE Dtk${DTK_NAME_SUFFIX}:: DESTINATION ${CONFIG_CMAKE_INSTALL_DIR} ) dtkcore-6.7.46/src/base/000077500000000000000000000000001522615770400147635ustar00rootroot00000000000000dtkcore-6.7.46/src/base/base.cmake000066400000000000000000000005431522615770400167010ustar00rootroot00000000000000set(base_SRCS ${CMAKE_CURRENT_LIST_DIR}/../../include/base/dobject.h ${CMAKE_CURRENT_LIST_DIR}/../../include/base/private/dobject_p.h ${CMAKE_CURRENT_LIST_DIR}/../../include/base/dsingleton.h ${CMAKE_CURRENT_LIST_DIR}/../../include/base/dexpected.h ${CMAKE_CURRENT_LIST_DIR}/../../include/base/derror.h ${CMAKE_CURRENT_LIST_DIR}/dobject.cpp ) dtkcore-6.7.46/src/base/dobject.cpp000066400000000000000000000126721522615770400171110ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2015 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dobject.h" #include "base/private/dobject_p.h" DCORE_BEGIN_NAMESPACE DObjectPrivate::DObjectPrivate(DObject *qq) : q_ptr(qq) { } DObjectPrivate::~DObjectPrivate() { } /*! \headerfile \inmodule dtkcore \brief 一些å®�的定义. */ /*! \class Dtk::Core::DObject \inmodule dtkcore \brief deepin-tool-kit 中所有公开类的祖先类. 通过和 D_DECLARE_PRIVATE ã€�D_DECLARE_PUBLIC ç­‰å®�çš„é…�å�ˆæ–¹ä¾¿æ´¾ç”Ÿç±»ä¸­å®žçް D-Point 结构。虽然 QObject 中已ç»�有了这样的实现结构,但是没有 办法在ä¸�使用 Qt ç§�有模å�—的情况下,在 DTK 库中达到å�Œæ ·çš„目的。D-Point 结构由“公共接å�£ç±»â€� 和“ç§�有数æ�®ç±»â€�两部分组æˆ�,在 DTK 中,DObjectPrivate 是所有数æ�®ç±»çš„祖先类。在这ç§�结构下, å�ªæœ‰ DObject 这个基类中定了一个指å�‘于ç§�有数æ�®ç±»çš„对象指针,派生类中ä¸�会也ä¸�应该å†�定义任何 æˆ�员å�˜é‡�,派生类中需è¦�添加数æ�®æˆ�员时,å�¯ä»¥ç»§æ‰¿ DObjectPrivate,将新的æˆ�员å�˜é‡�放到ç§�有类中 例å­�: a.h \code class APrivate; class A : public DObject { D_DECLARE_PRIVATE(A) public: A(); int test() const; protected: A(APrivate &dd, DObject *parent = nullptr); }; \endcode a.cpp \code class APrivate : public DObjectPrivate { public: APrivate(A *qq) : DObjectPrivate(qq) { } D_DECLARE_PUBLIC(A) // 此处添加数æ�®æˆ�员 int data; }; A::A() : DObject(*new APrivate(this)) { } int test() const { D_D(A); return d->data; } A::A(APrivate &dd, DObject *parent) : DObject(dd, parent) { } \endcode 一般æ�¥è®²ï¼ŒDObject å�ªä¼šç”¨åœ¨ DTK 库中定义的类,对于使用 DTK 库的应用程åº�æ�¥è¯´ä¸�用关心它的存在 \sa {https://wiki.qt.io/D-Pointer/zh}{类的 D-Point 结构} */ /*! \brief å�ªæœ‰åœ¨ä¸�需è¦�æ•°æ�®æˆ�员的派生类中æ‰�会使用 \a parent 父类指针 */ DObject::DObject(DObject * /*parent = nullptr*/) { } /*! \brief 在派生类中比较常用的构造函数 \a dd ç§�有类对象 */ DObject::DObject(DObjectPrivate &dd, DObject * /*parent = nullptr*/): d_d_ptr(&dd) { } DObject::~DObject() { } /*! \macro D_DECLARE_PRIVATE(Class) \relates Dtk::Core::DObject \brief 这个å®�一定è¦�放到类的ç§�有区域,它定义了 d_func() 这个函数用于返回ç§�有类的对象, 这个对象å�ªåº”该在类的内部使用,å�¦å¤–å°†ç§�有类声明为公开类的å�‹å…ƒç±»ã€‚ \a Class 公开类的类å�� \sa D_DECLARE_PUBLIC D_D D_DC */ /*! \macro D_DECLARE_PUBLIC(Class) \relates Dtk::Core::DObject \brief 这个å®�用于ç§�有类中,它定义了 q_func() 这个函数用于返回公开类的对象,å�¦å¤–将公开类 声明为ç§�有类的å�‹å…ƒç±»ã€‚ \a Class 公开类的类å�� \sa D_DECLARE_PRIVATE D_Q D_QC */ /*! \macro D_D(Class) \relates Dtk::Core::DObject \brief 这个å®�用于公开类中,它定义了一个å��字为 d çš„å�˜é‡�存储 d_func() 的返回值。用于在公开 类中需è¦�访问ç§�有类的数æ�®æˆ�员的函数中。 \a Class 公开类的类å�� \sa D_DECLARE_PRIVATE D_DC */ /*! \macro D_DC(Class) \relates Dtk::Core::DObject \brief å�Œ D_D,用在公开类加了 const 修饰符的æˆ�员函数中。 \a Class 公开类的类å�� \sa D_DECLARE_PRIVATE D_D */ /*! \macro D_Q(Class) \relates Dtk::Core::DObject \brief 这个å®�用于ç§�有类中,它定义了一个å��字为 q çš„å�˜é‡�存储 q_func() 的返回值。用于在ç§�有 类中需è¦�调用公开类的æˆ�员函数时。 \a Class 公开类的类å�� \sa D_DECLARE_PUBLIC D_QC */ /*! \macro D_QC(Class) \relates Dtk::Core::DObject \brief å�Œ D_Q,用在ç§�有类加了 const 修饰符的æˆ�员函数中。 \a Class 公开类的类å�� \sa D_DECLARE_PUBLIC D_Q */ /*! \macro D_PRIVATE_SLOT(Func) \relates Dtk::Core::DObject \brief å�Œ Q_PRIVATE_SLOT,用在继承了 QObject 的公开类中,在公开类中定一个槽函数,且函数 必须在ç§�有类中有实现。用这个方å¼�定义的槽函数无法被直接调用,å�ªèƒ½ç”¨äºŽ QObject::connect 使用 SIGNAL å’Œ SLOT 的方å¼�连接信å�·ï¼Œæˆ–者使用 QMetaObject::invokeMethod 调用。 一般æ�¥è®²ï¼Œè¿™ä¸ªæ§½å‡½æ•°åº”该å�ªåœ¨ç±»å†…部使用,外界ä¸�应该通过任何方å¼�æ�¥è°ƒç”¨å®ƒã€‚ 例å­�: a.h \code class APrivate; class A : public DObject { D_DECLARE_PRIVATE(A) public: A(); protected: A(APrivate &dd, DObject *parent = nullptr); private: D_PRIVATE_SLOT(void _q_testSlot() const) }; \endcode a.cpp \code class APrivate : public DObjectPrivate { public: D_DECLARE_PUBLIC(A) APrivate(A *qq) : DObjectPrivate(qq) { QTimer *timer = new QTimer(); QObject::connect(timer, SIGNAL(timeout()), qq, SLOT(_q_testSlot())); timer->start(1000); } void _q_testSlot() const { qDebug() << "slot"; } }; A::A() : DObject(*new APrivate(this)) { } A::A(APrivate &dd, DObject *parent) : DObject(dd, parent) { } \#include "moc_a.cpp" \endcode \a Func 槽函数的完整签å�� \note 添加或更新ç§�有槽之å�Žéœ€è¦�é‡�新手动调用 qmake \sa D_DECLARE_PUBLIC D_Q */ DCORE_END_NAMESPACE dtkcore-6.7.46/src/dbus/000077500000000000000000000000001522615770400150065ustar00rootroot00000000000000dtkcore-6.7.46/src/dbus/dbus.cmake000066400000000000000000000016761522615770400167570ustar00rootroot00000000000000set(dbus_SRCS) set_source_files_properties( ${CMAKE_CURRENT_LIST_DIR}/org.desktopspec.ConfigManager.xml PROPERTIES NO_NAMESPACE ON CLASSNAME DSGConfig ) if("${QT_VERSION_MAJOR}" STREQUAL "6") qt_add_dbus_interface(dbus_SRCS ${CMAKE_CURRENT_LIST_DIR}/org.desktopspec.ConfigManager.xml configmanager_interface ) else() qt5_add_dbus_interface(dbus_SRCS ${CMAKE_CURRENT_LIST_DIR}/org.desktopspec.ConfigManager.xml configmanager_interface ) endif() set_source_files_properties( ${CMAKE_CURRENT_LIST_DIR}/org.desktopspec.ConfigManager.Manager.xml PROPERTIES NO_NAMESPACE ON CLASSNAME DSGConfigManager ) if("${QT_VERSION_MAJOR}" STREQUAL "6") qt_add_dbus_interface(dbus_SRCS ${CMAKE_CURRENT_LIST_DIR}/org.desktopspec.ConfigManager.Manager.xml manager_interface ) else() qt5_add_dbus_interface(dbus_SRCS ${CMAKE_CURRENT_LIST_DIR}/org.desktopspec.ConfigManager.Manager.xml manager_interface ) endif() dtkcore-6.7.46/src/dbus/org.desktopspec.ConfigManager.Manager.xml000066400000000000000000000033571522615770400247220ustar00rootroot00000000000000 ' dtkcore-6.7.46/src/dbus/org.desktopspec.ConfigManager.xml000066400000000000000000000012151522615770400233400ustar00rootroot00000000000000 dtkcore-6.7.46/src/dci/000077500000000000000000000000001522615770400146105ustar00rootroot00000000000000dtkcore-6.7.46/src/dci/dci.cmake000066400000000000000000000003371522615770400163540ustar00rootroot00000000000000set(dci_SRCS ${CMAKE_CURRENT_LIST_DIR}/../../include/dci/ddcifile.h ${CMAKE_CURRENT_LIST_DIR}/ddcifile.cpp ${CMAKE_CURRENT_LIST_DIR}/private/ddcifileengine_p.h ${CMAKE_CURRENT_LIST_DIR}/private/ddcifileengine.cpp ) dtkcore-6.7.46/src/dci/ddcifile.cpp000066400000000000000000000544101522615770400170630ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "ddcifile.h" #include "private/ddcifileengine_p.h" #ifndef DTK_NO_PROJECT #include #else #define D_D(class) #define D_DC(class) #endif #include #include #include #include #include #include #include #include DCORE_BEGIN_NAMESPACE #define MAGIC "DCI" #define MAGIC_SIZE 4 #define VERSION_SIZE 1 #define FILE_COUNT_SIZE 3 #define FILE_META_SIZE 72 #define FILE_TYPE_SIZE 1 #define FILE_NAME_SIZE 63 #define FILE_DATA_SIZE 8 #define FILE_TYPE_FILE DDciFile::FileType::File #define FILE_TYPE_DIR DDciFile::FileType::Directory #define FILE_TYPE_SYMLINK DDciFile::FileType::Symlink #ifdef QT_DEBUG Q_LOGGING_CATEGORY(logDF, "dtk.dci.file") #else Q_LOGGING_CATEGORY(logDF, "dtk.dci.file", QtInfoMsg) #endif class DDciFilePrivate #ifndef DTK_NO_PROJECT : public DObjectPrivate #endif { public: DDciFilePrivate(DDciFile *qq) #ifndef DTK_NO_PROJECT : DObjectPrivate(qq) { #else { Q_UNUSED(qq) #endif } ~DDciFilePrivate(); void setErrorString(const QString &message); void load(const QString &fileName); void load(const QByteArray &data); QString errorMessage; struct Node { qint8 type = DDciFile::UnknowFile; QString name; Node *parent = nullptr; QVector children; // for directory QByteArray data; // for file ~Node() { qDeleteAll(children); } QString path() const { QString p = name; Node *current = parent; while (current) { p.prepend(current->name + "/"); current = current->parent; } return p; } QString linkPath() const { const QString &path = QString::fromUtf8(data); QStringView pathView{path}; if (pathView.startsWith('/')) return path; // 转为ç»�对路径 auto pNode = parent; int pathStart = 0; while (pathStart < pathView.size()) { if (pathView.mid(pathStart, 3) == QLatin1String("../")) { pathStart += 3; pNode = pNode->parent; if (!pNode) return QString(); } else if (pathView.mid(pathStart, 2) == QLatin1String("./")) { pathStart += 2; } else { break; } } Q_ASSERT(pNode); return pNode->path() + QLatin1Char('/') + path.mid(pathStart); } }; qint64 writeMetaDataForNode(QIODevice *device, Node *node, qint64 dataSize) const; qint64 writeDataForNode(QIODevice *device, Node *node) const; qint64 writeNode(QIODevice *device, Node *node) const; Node *mkNode(const QString &filePath); void removeNode(Node *node); void copyNode(const Node *from, Node *to); bool loadDirectory(Node *directory, const QByteArray &data, qint64 &begin, qint64 end, QHash &pathToNode); // 按标准中规定的文件排åº�计算此 name 在这个列表中的ä½�ç½® static int getOrderedIndexOfNodeName(const decltype(Node::children) &list, const QString &name); qint8 version = 0; QScopedPointer root; QHash pathToNode; QByteArray rawData; }; DDciFilePrivate::~DDciFilePrivate() { } void DDciFilePrivate::setErrorString(const QString &message) { qCDebug(logDF, "%s", qPrintable(message)); errorMessage = message; } void DDciFilePrivate::load(const QString &fileName) { QFile file(fileName); if (!file.open(QIODevice::ReadOnly)) { setErrorString(file.errorString()); return; } return load(file.readAll()); } void DDciFilePrivate::load(const QByteArray &data) { // check magic if (!data.startsWith("DCI")) { setErrorString(QString("Expect value is \"DCI\", " "but actually value is \"%1\"") .arg(QString::fromLatin1(data.left(3)))); return; } qint8 version = data.at(MAGIC_SIZE); if (version != 1) { setErrorString(QString("Not supported version: %1").arg(version)); return; } char fileCountData[4]; int fileCountOffset = MAGIC_SIZE + VERSION_SIZE; memcpy(fileCountData, data.constData() + fileCountOffset, FILE_COUNT_SIZE); fileCountData[3] = 0; int fileCount = qFromLittleEndian(fileCountData); if (fileCount < 0) { setErrorString(QString("Invalid file count: %1").arg(fileCount)); return; } qint64 offset = MAGIC_SIZE + VERSION_SIZE + FILE_COUNT_SIZE; Node *root = new Node; root->type = FILE_TYPE_DIR; root->parent = nullptr; QHash pathToNode; if (!loadDirectory(root, data, offset, data.size() - 1, pathToNode) || fileCount != root->children.count()) { delete root; return; } this->version = version; this->root.reset(root); this->pathToNode = pathToNode; this->pathToNode["/"] = root; // Node 中ä¿�存的文件数æ�®ä»…是此数æ�®çš„引用,因此è¦�ç¡®ä¿�此数æ�®ä¸€ç›´å­˜åœ¨ this->rawData = data; } qint64 DDciFilePrivate::writeMetaDataForNode(QIODevice *device, DDciFilePrivate::Node *node, qint64 dataSize) const { qint64 size = 0; device->putChar(static_cast(node->type)); size += FILE_TYPE_SIZE; const QByteArray rawName = node->name.toUtf8().left(FILE_NAME_SIZE - 1); size += device->write(rawName); // 填充未使用的部分 size += device->write(QByteArray(FILE_NAME_SIZE - rawName.size(), '\0')); char int64[FILE_DATA_SIZE]; qToLittleEndian(dataSize, int64); size += device->write(int64, FILE_DATA_SIZE); Q_ASSERT(size == FILE_META_SIZE); return size; } qint64 DDciFilePrivate::writeDataForNode(QIODevice *device, DDciFilePrivate::Node *node) const { if (node->type == FILE_TYPE_FILE || node->type == FILE_TYPE_SYMLINK) { return device->write(node->data); } else if (node->type == FILE_TYPE_DIR) { qint64 dataSize = 0; for (Node *child : node->children) { dataSize += writeNode(device, child); } return dataSize; } return 0; } qint64 DDciFilePrivate::writeNode(QIODevice *device, DDciFilePrivate::Node *node) const { const qint64 metaDataPos = device->pos(); device->seek(metaDataPos + FILE_META_SIZE); const qint64 dataSize = writeDataForNode(device, node); device->seek(metaDataPos); const qint64 metaDataSize = writeMetaDataForNode(device, node, dataSize); device->seek(device->pos() + dataSize); return metaDataSize + dataSize; } DDciFilePrivate::Node *DDciFilePrivate::mkNode(const QString &filePath) { qCDebug(logDF, "Request create a node"); if (pathToNode.contains(filePath)) { setErrorString(QString("The \"%1\" is existed").arg(filePath)); return nullptr; } const QFileInfo info(filePath); qCDebug(logDF, "The parent directory is \"%s\"", qPrintable(info.path())); if (Node *parentNode = pathToNode.value(info.path())) { if (parentNode->type != FILE_TYPE_DIR) { setErrorString(QString("The \"%1\" is not a directory").arg(info.path())); return nullptr; } // 检查文件å��长度,é�¿å…�溢出 if (info.fileName().toUtf8().size() > FILE_NAME_SIZE - 1) { setErrorString(QString("The file name size must less then %1 bytes").arg(FILE_NAME_SIZE)); return nullptr; } Node *newNode = new Node; newNode->name = info.fileName(); newNode->parent = parentNode; const int index = getOrderedIndexOfNodeName(parentNode->children, newNode->name); parentNode->children.insert(index, newNode); pathToNode[newNode->path()] = newNode; return newNode; } else { setErrorString("The parent directory is not exists"); return nullptr; } } void DDciFilePrivate::removeNode(DDciFilePrivate::Node *node) { Q_ASSERT(node != root.data()); node->parent->children.removeOne(node); auto removedNode = pathToNode.take(node->path()); Q_ASSERT(removedNode == node); for (Node *child : node->children) { Q_ASSERT(child->parent == node); auto removedNode = pathToNode.take(child->path()); Q_ASSERT(removedNode == child); } delete node; } void DDciFilePrivate::copyNode(const DDciFilePrivate::Node *from, DDciFilePrivate::Node *to) { QList> copyPendingList; copyPendingList << qMakePair(from, to); for (int i = 0; i < copyPendingList.size(); ++i) { auto f = copyPendingList.at(i).first; auto t = copyPendingList.at(i).second; t->type = f->type; t->data = f->data; for (const auto child : f->children) { if (child == to) continue; Node *newChild = new Node; newChild->parent = t; newChild->name = child->name; pathToNode[newChild->path()] = newChild; const int index = getOrderedIndexOfNodeName(t->children, newChild->name); t->children.insert(index, newChild); copyPendingList << qMakePair(child, newChild); } } } bool DDciFilePrivate::loadDirectory(DDciFilePrivate::Node *directory, const QByteArray &data, qint64 &offset, qint64 end, QHash &pathToNode) { // load files while (offset < end) { Node *node = new Node; node->parent = directory; node->type = data.at(offset); offset += FILE_TYPE_SIZE; // 计算文件å��的长度 const int nameLength = data.indexOf('\0', offset) - offset; if (nameLength <= 0 || nameLength >= FILE_NAME_SIZE) { setErrorString(QString("Invalid file name, the data offset: %1").arg(offset)); delete node; return false; } node->name = QString::fromUtf8(data.constData() + offset, nameLength); offset += FILE_NAME_SIZE; const qint64 dataSize = qFromLittleEndian(data.constData() + offset); offset += FILE_DATA_SIZE; // 无失败时调用 break do { if (node->type == FILE_TYPE_DIR) { if (loadDirectory(node, data, offset, offset + dataSize - 1, pathToNode)) { break; } } else if (node->type == FILE_TYPE_FILE || node->type == FILE_TYPE_SYMLINK) { // 跳过文件内容 node->data = QByteArray::fromRawData(data.constData() + offset, dataSize); if (node->data.size() == dataSize) { offset += dataSize; break; } else { setErrorString(QString("Invalid data size of \"%1\" file").arg(node->path())); } } else { setErrorString(QString("Invalid file type: %1").arg(node->type)); } delete node; return false; } while (false); directory->children << node; pathToNode[node->path()] = node; } return true; } int DDciFilePrivate::getOrderedIndexOfNodeName(const decltype(Node::children) &list, const QString &name) { QCollator collator(QLocale::English); collator.setNumericMode(true); for (int i = 0; i < list.count(); ++i) { const Node *node = list.at(i); if (collator.compare(name, node->name) < 0) return i; } return list.count(); } void DDciFile::registerFileEngine() { // 在 QAbstractFileEngineHandler 的构造函数中会注册自己,å�Žç»­ // 在使用 QFile 时会调用 DDciFileEngineHandler::create static DDciFileEngineHandler globalHandler; Q_UNUSED(globalHandler); } #ifndef DTK_NO_PROJECT DDciFile::DDciFile() : DObject(*new DDciFilePrivate(this)) { d_func()->load(QByteArrayLiteral("DCI\0\1\0\0\0")); } DDciFile::DDciFile(const QString &fileName) : DObject(*new DDciFilePrivate(this)) { d_func()->load(fileName); } DDciFile::DDciFile(const QByteArray &data) : DObject(*new DDciFilePrivate(this)) { d_func()->load(data); } #else DDciFile::DDciFile() : d(new DDciFilePrivate(this)) { d->load(QByteArrayLiteral("DCI\0\1\0\0\0")); } DDciFile::DDciFile(const QString &fileName) : d(new DDciFilePrivate(this)) { d->load(fileName); } DDciFile::DDciFile(const QByteArray &data) : d(new DDciFilePrivate(this)) { d->load(data); } #endif bool DDciFile::isValid() const { D_DC(DDciFile); return !!(d->root); } QString DDciFile::lastErrorString() const { D_DC(DDciFile); return d->errorMessage; } bool DDciFile::writeToFile(const QString &fileName) const { QSaveFile sf(fileName); do { if (!sf.open(QIODevice::WriteOnly)) { break; } if (!writeToDevice(&sf)) return false; if (!sf.commit()) break; return true; } while (false); qCDebug(logDF, "Failed on write to file \"%s\", error message is: \"%s\"", qPrintable(fileName), qPrintable(sf.errorString())); return false; } bool DDciFile::writeToDevice(QIODevice *device) const { Q_ASSERT(isValid()); D_DC(DDciFile); // magic device->write(QByteArrayLiteral("DCI\0")); // version device->putChar(static_cast(d->version)); char fileCountData[sizeof(int)]; qToLittleEndian(d->root->children.count(), fileCountData); // file count device->write(fileCountData, FILE_COUNT_SIZE); d->writeDataForNode(device, d->root.data()); return device->size() >= metadataSizeV1() + (d->pathToNode.count() - 1) * FILE_META_SIZE; } QByteArray DDciFile::toData() const { if (!isValid()) return QByteArray(); D_DC(DDciFile); qint64 allFilesContentSize = 0; for (auto node : d->pathToNode) { if (node->type == FILE_TYPE_FILE || node->type == FILE_TYPE_SYMLINK) allFilesContentSize += node->data.size(); } QByteArray data; // -1 是排除根目录 data.resize(metadataSizeV1() + (d->pathToNode.count() - 1) * FILE_META_SIZE + allFilesContentSize); QBuffer buffer(&data); if (!buffer.open(QIODevice::WriteOnly) || !writeToDevice(&buffer)) return QByteArray(); return data; } constexpr int DDciFile::metadataSizeV1() { return MAGIC_SIZE + VERSION_SIZE + FILE_COUNT_SIZE; } QStringList DDciFile::list(const QString &dir, bool onlyFileName) const { if (!isValid()) return {}; D_DC(DDciFile); auto dirNode = d->pathToNode.value(dir); if (!dirNode) { qCDebug(logDF, "The \"%s\" is not exists", qPrintable(dir)); return {}; } if (dirNode->type != FILE_TYPE_DIR) { qCWarning(logDF, "The \"%s\" is not a directory", qPrintable(dir)); return {}; } QStringList children; for (auto child : dirNode->children) { children << (onlyFileName ? child->name : QDir(dir).filePath(child->name)); } return children; } int DDciFile::childrenCount(const QString &dir) const { if (!isValid()) return 0; D_DC(DDciFile); auto dirNode = d->pathToNode.value(dir); if (!dirNode) { return 0; } return dirNode->children.count(); } bool DDciFile::exists(const QString &filePath) const { if (!isValid()) return false; D_DC(DDciFile); return d->pathToNode.contains(filePath); } DDciFile::FileType DDciFile::type(const QString &filePath) const { if (!isValid()) return UnknowFile; D_DC(DDciFile); auto node = d->pathToNode.value(filePath); if (!node) { qCDebug(logDF, "The \"%s\" is not exists", qPrintable(filePath)); return DDciFile::UnknowFile; } return static_cast(node->type); } QByteArray DDciFile::dataRef(const QString &filePath) const { if (!isValid()) return QByteArray(); D_DC(DDciFile); auto node = d->pathToNode.value(filePath); if (!node) { qCDebug(logDF, "The \"%s\" is not exists", qPrintable(filePath)); return QByteArray(); } if (node->type == FILE_TYPE_SYMLINK) { return dataRef(node->linkPath()); } return node->data; } QString DDciFile::name(const QString &filePath) const { if (!isValid()) return QString(); D_DC(DDciFile); if (auto node = d->pathToNode.value(filePath)) { return node->name; } return QString(); } QString DDciFile::symlinkTarget(const QString &filePath, bool originData) const { if (!isValid()) return QString(); D_DC(DDciFile); if (auto node = d->pathToNode.value(filePath)) { if (node->type != FILE_TYPE_SYMLINK) return QString(); if (originData) { return QString::fromUtf8(node->data); } const QString &linkPath = node->linkPath(); const auto targetNode = d->pathToNode.value(linkPath); // 链接的目标å�ªèƒ½æ˜¯â€œä¸�存在的路径â€�ã€�“文件â€�ã€�“链接â€�,ä¸�å�¯æ˜¯ç›®å½• if (!targetNode || targetNode->type == FILE_TYPE_FILE || targetNode->type == FILE_TYPE_SYMLINK) return linkPath; } return QString(); } bool DDciFile::mkdir(const QString &filePath) { Q_ASSERT(isValid()); D_D(DDciFile); qCDebug(logDF, "Request create the \"%s\" directory", qPrintable(filePath)); auto node = d->mkNode(filePath); if (!node) return false; node->type = FILE_TYPE_DIR; return true; } bool DDciFile::writeFile(const QString &filePath, const QByteArray &data, bool override) { Q_ASSERT(isValid()); D_D(DDciFile); qCDebug(logDF, "Request create the \"%s\" file", qPrintable(filePath)); // 先删除旧的数æ�® if (auto node = d->pathToNode.value(filePath)) { if (override) { if (node->type == FILE_TYPE_SYMLINK) { const QString &linkPath = node->linkPath(); qCDebug(logDF(), "Follow the symlink to \"%s\"", qPrintable(linkPath)); if (!d->pathToNode.contains(linkPath)) { qCDebug(logDF(), "Can't write to a symlink target file if it is not existed"); return false; } return writeFile(linkPath, data, override); } qCDebug(logDF, "Try override the file"); if (node->type != FILE_TYPE_FILE) { qCWarning(logDF, "The \"%s\" is existed and it is not a file", qPrintable(filePath)); return false; } node->data = data; return true; } else { d->setErrorString("No the \"override\" flag and the file is existed, can't write"); return false; } } auto node = d->mkNode(filePath); if (!node) return false; node->type = FILE_TYPE_FILE; node->data = data; return true; } bool DDciFile::remove(const QString &filePath) { Q_ASSERT(isValid()); D_D(DDciFile); if (auto node = d->pathToNode.value(filePath)) { if (node == d->root.data()) { for (auto child : d->root->children) d->removeNode(child); d->root->children.clear(); } else { d->removeNode(node); } return true; } else { d->setErrorString("The file is not exists"); return false; } } bool DDciFile::rename(const QString &filePath, const QString &newFilePath, bool override) { Q_ASSERT(isValid()); D_D(DDciFile); qCDebug(logDF, "Rename from \"%s\" to \"%s\"", qPrintable(filePath), qPrintable(newFilePath)); if (filePath == newFilePath) return false; if (newFilePath.toUtf8().size() >= FILE_META_SIZE) { d->setErrorString(QString("The new name size must less then %1 bytes").arg(FILE_NAME_SIZE)); return false; } if (!override && d->pathToNode.contains(newFilePath)) { d->setErrorString("The target file is existed"); return false; } auto overrideNode = override ? d->pathToNode.take(newFilePath) : nullptr; if (auto node = d->pathToNode.take(filePath)) { QFileInfo info(newFilePath); if (auto parent = d->pathToNode.value(info.absolutePath())) { node->name = info.fileName(); // 从旧节点删除添加到新的节点 if (node->parent != parent) { bool ok = node->parent->children.removeOne(node); Q_ASSERT(ok); const int index = d->getOrderedIndexOfNodeName(parent->children, node->name); parent->children.insert(index, node); node->parent = parent; } d->pathToNode[info.absoluteFilePath()] = node; Q_ASSERT(node->path() == info.absoluteFilePath()); // 删除被覆盖的节点 if (overrideNode) { Q_ASSERT(overrideNode->parent == parent); overrideNode->parent->children.removeOne(overrideNode); delete overrideNode; } return true; } else { d->setErrorString(QString("The \"%1\" directory is not exists").arg(info.absolutePath())); return false; } } else { d->setErrorString("The file is not exists"); return false; } } bool DDciFile::copy(const QString &from, const QString &to) { Q_ASSERT(isValid()); D_D(DDciFile); const auto fromNode = d->pathToNode.value(from); if (!fromNode) { d->setErrorString(QString("The \"%1\" is not exists").arg(from)); return false; } auto toNode = d->mkNode(to); if (!toNode) { return false; } d->copyNode(fromNode, toNode); return true; } bool DDciFile::link(const QString &source, const QString &to) { Q_ASSERT(isValid()); D_D(DDciFile); if (source == to || source.isEmpty()) return false; auto toNode = d->mkNode(to); if (!toNode) return false; toNode->type = FILE_TYPE_SYMLINK; toNode->data = source.toUtf8(); return true; } DCORE_END_NAMESPACE dtkcore-6.7.46/src/dci/private/000077500000000000000000000000001522615770400162625ustar00rootroot00000000000000dtkcore-6.7.46/src/dci/private/ddcifileengine.cpp000066400000000000000000000477611522615770400217360ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) #include //Avoid changing the access control of the standard library #endif #include #include "util/dprivateaccessor_p.h" #include "ddcifileengine_p.h" #include "dci/ddcifile.h" #include #include D_DECLARE_PRIVATE_METHOD(QFile_d_func_tag, QFile, d_func, QFilePrivate *); D_DECLARE_PRIVATE_CONST_METHOD(QFilePrivate_engine_tag, QFilePrivate, engine, QAbstractFileEngine *); DCORE_BEGIN_NAMESPACE #ifdef QT_DEBUG Q_LOGGING_CATEGORY(logFE, "dtk.dci.fileengine") #else Q_LOGGING_CATEGORY(logFE, "dtk.dci.fileengine", QtInfoMsg) #endif #define DCI_FILE_SCHEME "dci:" #define DCI_FILE_SUFFIX ".dci" #if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) std::unique_ptr DDciFileEngineHandler::create(const QString &fileName) const #else QAbstractFileEngine *DDciFileEngineHandler::create(const QString &fileName) const #endif { if (!fileName.startsWith(QStringLiteral(DCI_FILE_SCHEME))) return nullptr; #if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) std::unique_ptr engine(new DDciFileEngine(fileName)); #else DDciFileEngine *engine = new DDciFileEngine(fileName); #endif if (!engine->isValid()) { #if QT_VERSION < QT_VERSION_CHECK(6, 8, 0) delete engine; #endif return nullptr; } return engine; } // 共享å�Œä¸ªçº¿ç¨‹å†…çš„å�Œä¸ª DDciFile static thread_local QHash> sharedDciFile; static void doDeleteSharedDciFile(const QString &path, DDciFile *file) { int count = sharedDciFile.remove(path); Q_ASSERT(count > 0); delete file; } static DDciFileShared getDciFile(const QString &dciFilePath, bool usePath = true) { if (auto shared = sharedDciFile.value(dciFilePath)) { return shared.toStrongRef(); } DDciFileShared shared(usePath ? new DDciFile(dciFilePath) : new DDciFile(), std::bind(doDeleteSharedDciFile, dciFilePath, std::placeholders::_1)); sharedDciFile[dciFilePath] = shared.toWeakRef(); return shared; } #if QT_VERSION < QT_VERSION_CHECK(6, 8, 0) DDciFileEngineIterator::DDciFileEngineIterator(QDir::Filters filters, const QStringList &nameFilters) : QAbstractFileEngineIterator(filters, nameFilters) { } #else DDciFileEngineIterator::DDciFileEngineIterator(const QString &path, QDir::Filters filters, const QStringList &nameFilters) : QAbstractFileEngineIterator(path, filters, nameFilters) { } DDciFileEngineIterator::DDciFileEngineIterator(const QString &path, QDirListing::IteratorFlags filters, const QStringList &nameFilters) : QAbstractFileEngineIterator(path, filters, nameFilters) { } #endif #if QT_VERSION < QT_VERSION_CHECK(6, 8, 0) QString DDciFileEngineIterator::next() { current = nextValid; return DDciFileEngineIterator::currentFileName(); } bool DDciFileEngineIterator::hasNext() const #else bool DDciFileEngineIterator::advance() #endif { if (!file) { const auto paths = DDciFileEngine::resolvePath(path()); if (paths.first.isEmpty() || paths.second.isEmpty()) return false; file = getDciFile(paths.first); list = file->list(paths.second); } bool excludeDirs = false, excludeFiles = false, excludeSymlinks = false; #if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) if (this->m_listingFilters) { const auto filters = this->m_listingFilters.value(); excludeDirs = filters.testFlag(QDirListing::IteratorFlag::ExcludeDirs); excludeFiles = filters.testFlag(QDirListing::IteratorFlag::ExcludeFiles); excludeSymlinks = filters.testFlag(QDirListing::IteratorFlag::ExcludeSpecial) && !filters.testFlag(QDirListing::IteratorFlag::ResolveSymlinks); } else #endif { const auto filters = this->filters(); excludeDirs = !filters.testFlag(QDir::Dirs); excludeFiles = !filters.testFlag(QDir::Files); excludeSymlinks = filters.testFlag(QDir::NoSymLinks); } for (int i = current + 1; i < list.count(); ++i) { // 先检查文件类型 const auto fileType = file->type(list.at(i)); if (fileType == DDciFile::Directory) { if (excludeDirs) continue; } else if (fileType == DDciFile::File) { if (excludeFiles) continue; } else if (fileType == DDciFile::Symlink) { if (excludeSymlinks) continue; } else { // DDciFile::UnknowFile continue; } // 按å��称进行过滤 if (!nameFilters().isEmpty() && !QDir::match(nameFilters(), list.at(i))) continue; nextValid = i; #if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) current = nextValid; #endif return true; } return false; } QString DDciFileEngineIterator::currentFileName() const { return file->name(list.at(current)); } DDciFileEngine::DDciFileEngine(const QString &fullPath) { setFileName(fullPath); } DDciFileEngine::~DDciFileEngine() { close(); } bool DDciFileEngine::isValid() const { return file && file->isValid(); } #if QT_VERSION >= QT_VERSION_CHECK(6, 4, 0) bool DDciFileEngine::open(QIODevice::OpenMode openMode, std::optional permissions) #else bool DDciFileEngine::open(QIODevice::OpenMode openMode) #endif { if (fileBuffer) { setError(QFile::OpenError, "The file is opened"); return false; } if (!file->isValid()) { setError(QFile::OpenError, "The DCI file is invalid"); return false; } if (file->type(subfilePath) == DDciFile::Directory) { setError(QFile::OpenError, "Can't open a directory"); return false; } if (file->type(subfilePath) == DDciFile::Symlink) { if (!file->exists(file->symlinkTarget(subfilePath))) { setError(QFile::OpenError, "The symlink target is not existed"); return false; } } if (openMode & QIODevice::Text) { setError(QFile::OpenError, "Not supported open mode"); return false; } if (openMode & QIODevice::NewOnly) { if (file->exists(subfilePath)) { setError(QFile::OpenError, "The file is existed"); return false; } } if ((openMode & QIODevice::ExistingOnly) || !(openMode & QIODevice::WriteOnly)) { if (!file->exists(subfilePath)) { setError(QFile::OpenError, "The file is not exists"); return false; } } // 此时当文件ä¸�存在时应当创建它 if (openMode & QIODevice::WriteOnly) { realDciFile.setFileName(dciFilePath); #if QT_VERSION >= QT_VERSION_CHECK(6, 4, 0) auto success = permissions ? realDciFile.open(openMode, permissions.value()) : realDciFile.open(openMode); if (!success) return false; #else if (!realDciFile.open(openMode)) { return false; } #endif // ä¸�存在时å°�试新建 if (!file->exists(subfilePath) && !file->writeFile(subfilePath, QByteArray())) { return false; } } // 加载数æ�® fileData = file->dataRef(subfilePath); fileBuffer = new QBuffer(&fileData); bool ok = fileBuffer->open(openMode); Q_ASSERT(ok); if (Q_UNLIKELY(!ok)) { delete fileBuffer; fileBuffer = nullptr; return false; } return true; } bool DDciFileEngine::close() { if (!fileBuffer) { return false; } fileBuffer->close(); delete fileBuffer; fileBuffer = nullptr; bool ok = flush(); realDciFile.close(); return ok; } bool DDciFileEngine::flushToFile(QFile *target, bool writeFile) const { if (target->isWritable()) { if (writeFile && !file->writeFile(subfilePath, fileData, true)) return false; if (!target->resize(0)) return false; const QByteArray &data = file->toData(); if (target->write(data) != data.size()) return false; return true; } return false; } bool DDciFileEngine::flush() { if (!flushToFile(&realDciFile, true)) return false; return realDciFile.flush(); } bool DDciFileEngine::syncToDisk() { if (!flush()) return false; return D_PRIVATE_CALL(*D_PRIVATE_CALL(realDciFile, QFile_d_func_tag{}), QFilePrivate_engine_tag{})->syncToDisk(); } qint64 DDciFileEngine::size() const { if (fileBuffer) { return fileData.size(); } return file->dataRef(subfilePath).size(); } qint64 DDciFileEngine::pos() const { return fileBuffer->size(); } bool DDciFileEngine::seek(qint64 pos) { return fileBuffer->seek(pos); } bool DDciFileEngine::isSequential() const { return false; } bool DDciFileEngine::remove() { return file->isValid() && file->remove(subfilePath) && forceSave(); } bool DDciFileEngine::copy(const QString &newName) { if (!file->isValid()) return false; // è§£æž�出新的 dci 内部文件路径 const auto paths = resolvePath(newName, dciFilePath); if (paths.second.isEmpty()) return false; return file->copy(subfilePath, paths.second) && forceSave(); } bool DDciFileEngine::rename(const QString &newName) { if (!file->isValid()) return false; // è§£æž�出新的 dci 内部文件路径 const auto paths = resolvePath(newName, dciFilePath); if (paths.second.isEmpty()) return false; return file->rename(subfilePath, paths.second, false) && forceSave(); } bool DDciFileEngine::renameOverwrite(const QString &newName) { if (!file->isValid()) return false; // è§£æž�出新的 dci 内部文件路径 const auto paths = resolvePath(newName, dciFilePath); if (paths.second.isEmpty()) return false; return file->rename(subfilePath, paths.second, true) && forceSave(); } bool DDciFileEngine::link(const QString &newName) { if (!file->isValid()) return false; // è§£æž�出新的 dci 内部文件路径 const auto paths = resolvePath(newName, dciFilePath); const QString &linkPath = paths.second.isEmpty() ? newName : paths.second; return file->link(subfilePath, linkPath) && forceSave(); } #if QT_VERSION >= QT_VERSION_CHECK(6, 4, 0) bool DDciFileEngine::mkdir(const QString &dirName, bool createParentDirectories, std::optional permissions) const { Q_UNUSED(permissions) #else bool DDciFileEngine::mkdir(const QString &dirName, bool createParentDirectories) const { #endif if (!file->isValid()) return false; // è§£æž�出新的 dci 内部文件路径 const auto paths = resolvePath(dirName, dciFilePath); if (paths.second.isEmpty()) return false; if (!createParentDirectories) return file->mkdir(paths.second) && forceSave(); const QStringList dirItems = paths.second.split('/'); QString currentPath; for (const QString &newDir : dirItems) { if (newDir.isEmpty()) continue; currentPath += ("/" + newDir); if (file->exists(currentPath)) { continue; } // 创建此路径 if (!file->mkdir(currentPath)) return false; } return forceSave(); } bool DDciFileEngine::rmdir(const QString &dirName, bool recurseParentDirectories) const { if (!file->isValid()) return false; // è§£æž�出新的 dci 内部文件路径 const auto paths = resolvePath(dirName, dciFilePath); if (paths.second.isEmpty()) return false; if (!file->remove(paths.second)) return false; if (!recurseParentDirectories) return forceSave(); // 查找空的父目录 QDir dir(paths.second); while (dir.cdUp()) { // ä¸�删除根 if (dir.isRoot()) break; if (file->childrenCount(dir.absolutePath()) > 0) continue; if (!file->remove(dir.absolutePath())) return false; } return forceSave(); } bool DDciFileEngine::setSize(qint64 size) { if (!fileBuffer) { fileData = file->dataRef(subfilePath); } // ç¡®ä¿�æ–°æ•°æ�®å¡«å……为 0 if (size > fileData.size()) { fileData.append(size - fileData.size(), '\0'); } else { fileData.resize(size); } return fileBuffer ? true : forceSave(true); } bool DDciFileEngine::caseSensitive() const { return true; } bool DDciFileEngine::isRelativePath() const { return !subfilePath.startsWith('/'); } QByteArray DDciFileEngine::id() const { return fileName().toUtf8(); } uint DDciFileEngine::ownerId(QAbstractFileEngine::FileOwner owner) const { QFileInfo info(dciFilePath); return owner == OwnerUser ? info.ownerId() : info.groupId(); } QString DDciFileEngine::owner(QAbstractFileEngine::FileOwner owner) const { QFileInfo info(dciFilePath); return owner == OwnerUser ? info.owner() : info.group(); } QAbstractFileEngine::FileFlags DDciFileEngine::fileFlags(QAbstractFileEngine::FileFlags type) const { auto flags = QAbstractFileEngine::FileFlags(); if (!file->isValid()) return flags; if (type & TypesMask) { const auto fileType = file->type(subfilePath); if (fileType == DDciFile::Directory) { flags |= DirectoryType; } else if (fileType == DDciFile::File) { flags |= FileType; } else if (fileType == DDciFile::Symlink) { flags |= LinkType; } } if ((type & FlagsMask)) { if (file->exists(subfilePath)) flags |= ExistsFlag; if (subfilePath == QLatin1Char('/')) flags |= RootFlag; } if ((type & PermsMask) && file->exists(subfilePath)) { flags |= static_cast(static_cast(QFileInfo(dciFilePath).permissions())); } return flags; } QString DDciFileEngine::fileName(QAbstractFileEngine::FileName file) const { switch (file) { case AbsoluteName: case CanonicalName: case DefaultName: return QDir::cleanPath(DCI_FILE_SCHEME + dciFilePath + subfilePath); case AbsolutePathName: return QDir::cleanPath(DCI_FILE_SCHEME + dciFilePath); case BaseName: return QFileInfo(subfilePath).fileName(); #if QT_VERSION >= QT_VERSION_CHECK(6, 4, 0) case AbsoluteLinkTarget: #else case LinkName: #endif return this->file->type(subfilePath) == DDciFile::Symlink ? this->file->symlinkTarget(subfilePath) : QString(); default: break; } return QString(); } void DDciFileEngine::setFileName(const QString &fullPath) { // 销æ¯�旧的内容 close(); file.reset(nullptr); dciFilePath.clear(); subfilePath.clear(); const auto paths = resolvePath(fullPath, QString(), false); if (paths.first.isEmpty() || paths.second.isEmpty()) return; dciFilePath = paths.first; subfilePath = paths.second; file = getDciFile(dciFilePath, QFile::exists(dciFilePath)); } #if QT_VERSION >= QT_VERSION_CHECK(6, 7, 1) QDateTime DDciFileEngine::fileTime(QFile::FileTime time) const { return QFileInfo(dciFilePath).fileTime(time); } #else QDateTime DDciFileEngine::fileTime(QAbstractFileEngine::FileTime time) const { return QFileInfo(dciFilePath).fileTime(static_cast(time)); } #endif #if QT_VERSION < QT_VERSION_CHECK(6, 9, 0) #if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) QAbstractFileEngine::IteratorUniquePtr DDciFileEngine::beginEntryList(const QString &path, QDir::Filters filters, const QStringList &filterNames) #else DDciFileEngine::Iterator *DDciFileEngine::beginEntryList(QDir::Filters filters, const QStringList &filterNames) #endif { #if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) return QAbstractFileEngine::IteratorUniquePtr(new DDciFileEngineIterator(path, filters, filterNames)); #else return new DDciFileEngineIterator(filters, filterNames); #endif } #endif #if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) QAbstractFileEngine::IteratorUniquePtr DDciFileEngine::beginEntryList(const QString &path, QDirListing::IteratorFlags filters, const QStringList &filterNames) { auto iterator = new DDciFileEngineIterator(path, filters, filterNames); iterator->m_listingFilters = filters; return QAbstractFileEngine::IteratorUniquePtr(iterator); } #endif #if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) QAbstractFileEngine::IteratorUniquePtr DDciFileEngine::endEntryList() #else DDciFileEngine::Iterator *DDciFileEngine::endEntryList() #endif { return nullptr; } qint64 DDciFileEngine::read(char *data, qint64 maxlen) { return fileBuffer->read(data, maxlen); } qint64 DDciFileEngine::write(const char *data, qint64 len) { return fileBuffer->write(data, len); } bool DDciFileEngine::extension(QAbstractFileEngine::Extension extension, const QAbstractFileEngine::ExtensionOption *option, QAbstractFileEngine::ExtensionReturn *output) { Q_UNUSED(option) Q_UNUSED(output) return extension == AtEndExtension && fileBuffer->atEnd(); } bool DDciFileEngine::supportsExtension(QAbstractFileEngine::Extension extension) const { return extension == AtEndExtension; } #if QT_VERSION >= QT_VERSION_CHECK(6, 10, 0) DDciFileEngine::TriStateResult DDciFileEngine::cloneTo(QAbstractFileEngine *target) #else bool DDciFileEngine::cloneTo(QAbstractFileEngine *target) #endif { const QByteArray &data = file->dataRef(subfilePath); auto ret = target->write(data.constData(), data.size()) == data.size(); #if QT_VERSION >= QT_VERSION_CHECK(6, 10, 0) return ret ? DDciFileEngine::TriStateResult::Success : DDciFileEngine::TriStateResult::Failed; #else return ret; #endif } bool DDciFileEngine::forceSave(bool writeFile) const { QFile file(dciFilePath); if (!file.open(QIODevice::WriteOnly)) { return false; } return flushToFile(&file, writeFile); } QPair DDciFileEngine::resolvePath(const QString &fullPath, const QString &realFilePath, bool needRealFileExists) { if (!fullPath.startsWith(QStringLiteral(DCI_FILE_SCHEME) + realFilePath)) return {}; qCDebug(logFE(), "Resolve the path: \"%s\"", qPrintable(fullPath)); // 此路径æ�¥æº�于调用方,将其格å¼�化为标准格å¼�,尾部添加 "/" 以确ä¿�下文中得到的 // subfilePath ç»�对ä¸�为空 QString formatFullPath = QDir::cleanPath(fullPath) + "/"; QString dciFilePath = realFilePath, subfilePath; const int schemeLength = qstrlen(DCI_FILE_SCHEME); const int suffixLength = qstrlen(DCI_FILE_SUFFIX); if (dciFilePath.isEmpty()) { // 尾部加 "/" 是确ä¿� ".dci" 为一个文件的结尾 int dciSuffixIndex = formatFullPath.indexOf(DCI_FILE_SUFFIX "/", schemeLength); while (dciSuffixIndex > 0) { dciSuffixIndex += suffixLength; dciFilePath = formatFullPath.mid(schemeLength, dciSuffixIndex - schemeLength); // 查找一个有效的å�Žç¼€å��是 ".dci" 的文件 if (needRealFileExists) { if (QFileInfo(dciFilePath).isFile()) break; } else { QFileInfo info(dciFilePath); // ä¸�存在的文件å…�许被新建 if (!info.exists() && !info.isSymLink()) break; } dciSuffixIndex = dciFilePath.indexOf(DCI_FILE_SUFFIX, dciSuffixIndex + 1); } } else { qCDebug(logFE(), "The base file path of user is: \"%s\"", qPrintable(realFilePath)); } // 未找到有效的 dci 文件 if (dciFilePath.isEmpty()) return {}; subfilePath = QDir::cleanPath(formatFullPath.mid(schemeLength + dciFilePath.length())); qCDebug(logFE(), "The DCI file path is: \"%s\", the subfile path is: \"%s\"", qPrintable(dciFilePath), qPrintable(subfilePath)); Q_ASSERT(!subfilePath.isEmpty()); return qMakePair(dciFilePath, subfilePath); } DCORE_END_NAMESPACE dtkcore-6.7.46/src/dci/private/ddcifileengine_p.h000066400000000000000000000132341522615770400217060ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #pragma once #ifndef DTK_NO_PROJECT #include #else #define DCORE_BEGIN_NAMESPACE #define DCORE_END_NAMESPACE #endif #include #include #include QT_BEGIN_NAMESPACE class QBuffer; QT_END_NAMESPACE DCORE_BEGIN_NAMESPACE class DDciFileEngineHandler : public QAbstractFileEngineHandler { public: #if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) std::unique_ptr create(const QString &fileName) const override; #else QAbstractFileEngine *create(const QString &fileName) const override; #endif }; class DDciFile; using DDciFileShared = QSharedPointer; class DDciFileEngineIterator : public QAbstractFileEngineIterator { friend class DDciFileEngine; public: #if QT_VERSION < QT_VERSION_CHECK(6, 8, 0) DDciFileEngineIterator(QDir::Filters filters, const QStringList &nameFilters); #else DDciFileEngineIterator(const QString &path, QDir::Filters filters, const QStringList &nameFilters); DDciFileEngineIterator(const QString &path, QDirListing::IteratorFlags filters, const QStringList &nameFilters); #endif #if QT_VERSION < QT_VERSION_CHECK(6, 8, 0) QString next() override; bool hasNext() const override; #else bool advance() override; #endif QString currentFileName() const override; private: mutable DDciFileShared file; mutable QStringList list; mutable int nextValid = -1; int current = -1; #if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) std::optional m_listingFilters {std::nullopt}; #endif }; class DDciFileEngine : public QAbstractFileEngine { friend class DDciFileEngineIterator; public: explicit DDciFileEngine(const QString &fullPath); ~DDciFileEngine(); bool isValid() const; #if QT_VERSION >= QT_VERSION_CHECK(6, 4, 0) bool open(QIODevice::OpenMode openMode, std::optional permissions = std::nullopt) override; #else bool open(QIODevice::OpenMode openMode) override; #endif bool close() override; bool flushToFile(QFile *target, bool writeFile) const; bool flush() override; bool syncToDisk() override; qint64 size() const override; qint64 pos() const override; bool seek(qint64 pos) override; bool isSequential() const override; bool remove() override; bool copy(const QString &newName) override; bool rename(const QString &newName) override; bool renameOverwrite(const QString &newName) override; bool link(const QString &newName) override; #if QT_VERSION >= QT_VERSION_CHECK(6, 4, 0) bool mkdir(const QString &dirName, bool createParentDirectories, std::optional permissions = std::nullopt) const override; #else bool mkdir(const QString &dirName, bool createParentDirectories) const override; #endif bool rmdir(const QString &dirName, bool recurseParentDirectories) const override; bool setSize(qint64 size) override; bool caseSensitive() const override; bool isRelativePath() const override; QByteArray id() const override; uint ownerId(FileOwner owner) const override; QString owner(FileOwner owner) const override; FileFlags fileFlags(FileFlags type = FileInfoAll) const override; QString fileName(FileName file = DefaultName) const override; void setFileName(const QString &fullPath) override; #if QT_VERSION >= QT_VERSION_CHECK(6, 7, 1) QDateTime fileTime(QFile::FileTime time) const override; #else QDateTime fileTime(FileTime time) const override; #endif typedef DDciFileEngineIterator Iterator; #if QT_VERSION >= QT_VERSION_CHECK(6, 9, 0) IteratorUniquePtr beginEntryList(const QString &path, QDirListing::IteratorFlags filters, const QStringList &filterNames) override; IteratorUniquePtr endEntryList() override; #elif QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) IteratorUniquePtr beginEntryList(const QString &path, QDirListing::IteratorFlags filters, const QStringList &filterNames) override; IteratorUniquePtr beginEntryList(const QString &path, QDir::Filters filters, const QStringList &filterNames) override; IteratorUniquePtr endEntryList() override; #else Iterator *beginEntryList(QDir::Filters filters, const QStringList &filterNames) override; Iterator *endEntryList() override; #endif qint64 read(char *data, qint64 maxlen) override; qint64 write(const char *data, qint64 len) override; bool extension(Extension extension, const ExtensionOption *option = 0, ExtensionReturn *output = 0) override; bool supportsExtension(Extension extension) const override; #if QT_VERSION >= QT_VERSION_CHECK(6, 10, 0) TriStateResult cloneTo(QAbstractFileEngine *target) override; #else bool cloneTo(QAbstractFileEngine *target) override; #endif private: bool forceSave(bool writeFile = false) const; /* * fullPath æ ¼å¼�:"dci:" + "真实文件路径" + "DCI 内部文件的路径" * 例如:"dci:/home/user/test.dci/subfile.png" * 其中 "/home/user/test.dci" 为真实文件路径,"/subfile.png" * 是 DCI 文件的内部路径。 * 函数返回的第一个数æ�®æ˜¯"真实文件路径"。 */ static QPair resolvePath(const QString &fullPath, const QString &realFilePath = QString(), bool needRealFileExists = true); DDciFileShared file; QString dciFilePath; QFile realDciFile; QString subfilePath; QByteArray fileData; QBuffer *fileBuffer = nullptr; }; DCORE_END_NAMESPACE dtkcore-6.7.46/src/dconfig.cpp000066400000000000000000000601131522615770400161670ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dconfig.h" #ifndef D_DISABLE_DCONFIG #include "dconfigfile.h" #ifndef D_DISABLE_DBUS_CONFIG #include "configmanager_interface.h" #include "manager_interface.h" #endif #else #include #endif #include "dobject_p.h" #include #include #include #include // https://gitlabwh.uniontech.com/wuhan/se/deepin-specifications/-/issues/3 DCORE_BEGIN_NAMESPACE Q_DECLARE_LOGGING_CATEGORY(cfLog) static QString NoAppId; /*! @~english @class Dtk::Core::DConfigBackend \inmodule dtkcore @brief Configure the abstract interface of the backend. All configuration backends used by DConfig inherit this class, and users can inherit this class to implement their own configuration backends. */ /*! @~english @fn bool DConfigBackend::load(const QString &) = 0 @brief Initialize the backend \a appId Managed configuration information key value, the default is the application name. */ /*! @~english @fn bool DConfigBackend::isValid() const = 0 @sa DConfig::isValid(). */ /*! @~english @fn QStringList DConfigBackend::keyList() const = 0 @sa DConfig::keyList() */ /*! @~english @fn QVariant DConfigBackend::value(const QString &key, const QVariant &fallback = QVariant()) const = 0 @sa DConfig::value() */ /*! @~english @fn void DConfigBackend::setValue(const QString &key, const QVariant &value) = 0 @sa DConfig::setValue() */ /*! @~english @fn void DConfigBackend::reset(const QString &key) @sa DConfig::reset() */ /*! @~english @fn bool DConfigBackend::isReadOnly(const QString &key) const = 0 @sa DConfig::isReadOnly() */ /*! @~english @fn QString DConfigBackend::name() const = 0 @brief The unique identity of the backend configuration */ /*! @~english @fn bool DConfigBackend::isDefaultValue(const QString &key) const = 0 @sa DConfig::isDefaultValue() */ DConfigBackend::~DConfigBackend() { } static QString _globalAppId; class Q_DECL_HIDDEN DConfigPrivate : public DObjectPrivate { public: explicit DConfigPrivate(DConfig *qq, const QString &appId, const QString &name, const QString &subpath) : DObjectPrivate(qq) , appId(appId) , name(name) , subpath(subpath) { } virtual ~DConfigPrivate() override; inline bool invalid() const { const bool valid = backend && backend->isValid(); if (!valid) qCWarning(cfLog, "DConfig is invalid of appid=%s name=%s, subpath=%s", qPrintable(appId), qPrintable(name), qPrintable(subpath)); return !valid; } DConfigBackend *getOrCreateBackend(); DConfigBackend *createBackendByEnv(); QString appId; QString name; QString subpath; QScopedPointer backend; D_DECLARE_PUBLIC(DConfig) }; namespace { #ifndef D_DISABLE_DCONFIG class Q_DECL_HIDDEN FileBackend : public DConfigBackend { public: explicit FileBackend(DConfigPrivate *o) : owner(o) { } virtual ~FileBackend() override; virtual bool isValid() const override { return configFile && configFile->isValid(); } virtual bool load(const QString &/*appId*/) override { if (configFile) return true; configFile.reset(new DConfigFile(owner->appId,owner->name, owner->subpath)); configCache.reset(configFile->createUserCache(getuid())); const QString &prefix = localPrefix(); if (!configFile->load(prefix) || !configCache->load(prefix)) return false; // generic config doesn't need to fallback to generic configration. if (owner->appId == NoAppId) return true; std::unique_ptr file(new DConfigFile(NoAppId, owner->name, owner->subpath)); const bool canFallbackToGeneric = !file->meta()->metaPath(prefix).isEmpty(); if (canFallbackToGeneric) { std::unique_ptr cache(file->createUserCache(getuid())); if (file->load(prefix) && cache->load(prefix)) { genericConfigFile.reset(file.release()); genericConfigCache.reset(cache.release()); } } return true; } virtual QStringList keyList() const override { return configFile->meta()->keyList(); } virtual QVariant value(const QString &key, const QVariant &fallback) const override { const QVariant &vc = configFile->cacheValue(configCache.get(), key); if (vc.isValid()) return vc; // fallback to generic configuration, and use itself's configuration if generic isn't set. if (genericConfigFile) { const auto &tmp = genericConfigFile->cacheValue(genericConfigCache.get(), key); if (tmp.isValid()) return tmp; } const QVariant &v = configFile->value(key); if (v.isValid()) return v; // fallback to default value of generic configuration. const QVariant &vg = genericConfigFile->value(key); return vg.isValid() ? vg : fallback; } virtual bool isDefaultValue(const QString &key) const override { // Don't fallback to generic configuration const QVariant &vc = configFile->cacheValue(configCache.get(), key); return !vc.isValid(); } virtual void setValue(const QString &key, const QVariant &value) override { // setValue's callerAppid is itself instead of config's appId. if (configFile->setValue(key, value, DSGApplication::id(), configCache.get())) { Q_EMIT owner->q_func()->valueChanged(key); } } virtual void reset(const QString &key) override { setValue(key, QVariant()); } virtual bool isReadOnly(const QString &key) const override { const auto vc = configFile->meta()->permissions(key); return vc == DConfigFile::ReadOnly; } virtual QString name() const override { return QString("FileBackend"); } private: QString localPrefix() const { if (!envLocalPrefix.isEmpty()) { return QString::fromLocal8Bit(envLocalPrefix); } return QString(); } private: QScopedPointer configFile; QScopedPointer configCache; QScopedPointer genericConfigFile; QScopedPointer genericConfigCache; DConfigPrivate* owner; const QByteArray envLocalPrefix = qgetenv("DSG_DCONFIG_FILE_BACKEND_LOCAL_PREFIX"); }; FileBackend::~FileBackend() { const QString &prefix = localPrefix(); if (configCache) { configCache->save(prefix); configCache.reset(); } if (configFile) { configFile->save(prefix); configFile.reset(); } if (genericConfigCache) { genericConfigCache->save(prefix); genericConfigCache.reset(); } if (genericConfigFile) { genericConfigFile->save(prefix); genericConfigFile.reset(); } } #ifndef D_DISABLE_DBUS_CONFIG #define DSG_CONFIG "org.desktopspec.ConfigManager" #define DSG_CONFIG_MANAGER "org.desktopspec.ConfigManager" class Q_DECL_HIDDEN DBusBackend : public DConfigBackend { public: explicit DBusBackend(DConfigPrivate* o): owner(o), config(nullptr) { } virtual ~DBusBackend() override; static bool isServiceRegistered() { return QDBusConnection::systemBus().interface()->isServiceRegistered(DSG_CONFIG); } static bool isServiceActivatable() { const QDBusReply activatableNames = QDBusConnection::systemBus().interface()-> callWithArgumentList(QDBus::AutoDetect, QLatin1String("ListActivatableNames"), QList()); // qInfo() << activatableNames.value() << activatableNames.value().contains(DSG_CONFIG); return activatableNames.value().contains(DSG_CONFIG); } virtual bool isValid() const override { return config && config->isValid(); } /*! @~english \internal Initialize the DBus connection, the call acquireManager dynamically obtains a configuration connection, The configuration file is then accessed through this configuration connection. */ virtual bool load(const QString &/*appId*/) override { if (config) return true; qCDebug(cfLog, "Try acquire config manager object form DBus"); DSGConfig dsg_config(DSG_CONFIG, "/", QDBusConnection::systemBus()); QDBusPendingReply dbus_reply = dsg_config.acquireManager(owner->appId, owner->name, owner->subpath); const QDBusObjectPath dbus_path = dbus_reply.value(); const auto path = dbus_path.path(); // 显å¼�æ‹·è´�,é�¿å…�其它线程共用systemBus连接而修改dbusæ•°æ�® if (dbus_reply.isError() || path.isEmpty()) { qCWarning(cfLog, "Can't acquire config manager. error:\"%s\"", qPrintable(dbus_reply.error().message())); return false; } else { qCDebug(cfLog, "dbus path=\"%s\"", qPrintable(path)); config = new DSGConfigManager(DSG_CONFIG_MANAGER, path, QDBusConnection::systemBus(), owner->q_func()); if (!config->isValid()) { qCWarning(cfLog, "Can't acquire config path=\"%s\"", qPrintable(path)); config->deleteLater(); config = nullptr; return false; } else { QObject::connect(config, &DSGConfigManager::valueChanged, owner->q_func(), &DConfig::valueChanged); } } return true; } virtual QStringList keyList() const override { return config->keyList(); } static QVariant decodeQDBusArgument(const QVariant &v) { if (v.canConvert()) { // we use QJsonValue to resolve all data type in DConfigInfo class, so it's type is equal QJsonValue::Type, // now we parse Map and Array type to QVariant explicitly. const QDBusArgument &complexType = v.value(); switch (complexType.currentType()) { case QDBusArgument::MapType: { QVariantMap list; complexType >> list; QVariantMap res; for (auto iter = list.begin(); iter != list.end(); iter++) { res[iter.key()] = decodeQDBusArgument(iter.value()); } return res; } case QDBusArgument::ArrayType: { QVariantList list; complexType >> list; QVariantList res; res.reserve(list.size()); for (const auto &item : std::as_const(list)) { res << decodeQDBusArgument(item); } return res; } default: qWarning("Can't parse the type, it maybe need user to do it, " "QDBusArgument::ElementType: %d.", complexType.currentType()); } } return v; } virtual QVariant value(const QString &key, const QVariant &fallback) const override { auto reply = config->value(key); reply.waitForFinished(); if (reply.isError()) { qWarning() << "value error key:" << key << ", error message:" << reply.error().message(); return fallback; } return decodeQDBusArgument(reply.value().variant()); } virtual bool isDefaultValue(const QString &key) const override { auto reply = config->isDefaultValue(key); reply.waitForFinished(); if (reply.isError()) { qWarning() << "Failed to call `isDefaultValue`, key:" << key << ", error message:" << reply.error().message(); return false; } return reply.value(); } virtual void setValue(const QString &key, const QVariant &value) override { auto reply = config->setValue(key, QDBusVariant(value)); reply.waitForFinished(); if (reply.isError()) qCWarning(cfLog) << "Failed to setValue for the key:" << key << ", error message:" << reply.error(); } virtual void reset(const QString &key) override { auto reply = config->reset(key); reply.waitForFinished(); if (reply.isError()) qCWarning(cfLog) << "Failed to reset for the key:" << key << ", error message:" << reply.error(); } virtual bool isReadOnly(const QString &key) const override { auto reply = config->permissions(key); reply.waitForFinished(); if (reply.isError()) { qWarning() << "Failed to call `permissions`, key:" << key << ", error message:" << reply.error().message(); return false; } return reply.value() == QLatin1String("readonly"); } virtual QString name() const override { return QString("DBusBackend"); } private: DSGConfigManager *config; DConfigPrivate* owner; }; DBusBackend::~DBusBackend() { if (config) { config->release(); } } #endif //D_DISABLE_DBUS_CONFIG #else class Q_DECL_HIDDEN QSettingBackend : public DConfigBackend { public: explicit QSettingBackend(DConfigPrivate* o): owner(o) { } virtual ~QSettingBackend() override; virtual bool isValid() const override { return settings; } virtual bool load(const QString &appid) override { Q_UNUSED(appid); if (settings) return true; settings = new QSettings(owner->name, QSettings::IniFormat, owner->q_func()); settings->beginGroup(owner->subpath); return true; } virtual QStringList keyList() const override { return settings->childKeys(); } virtual QVariant value(const QString &key, const QVariant &fallback) const override { return settings->value(key, fallback); } virtual void setValue(const QString &key, const QVariant &value) override { settings->setValue(key, value); } virtual QString name() const override { return QString("QSettingBackend"); } private: QSettings *settings = nullptr; DConfigPrivate* owner; }; QSettingBackend::~QSettingBackend() { } #endif //D_DISABLE_DCONFIG } DConfigPrivate::~DConfigPrivate() { backend.reset(); } /*! @~english \internal @brief Create a configuration backend The default configuration backend preferentially selects the D-Bus interface in the configuration center or the file configuration backend interface based on environment variables. If this environment variable is not configured, the configuration center service or file configuration backend interface will be selected according to whether the configuration center provides D-Bus services */ DConfigBackend *DConfigPrivate::getOrCreateBackend() { if (backend) { return backend.data(); } if (auto backendEnv = createBackendByEnv()) { backend.reset(backendEnv); return backend.data(); } #ifndef D_DISABLE_DCONFIG #ifndef D_DISABLE_DBUS_CONFIG if (DBusBackend::isServiceRegistered() || DBusBackend::isServiceActivatable()) { qCDebug(cfLog, "Fallback to DBus mode"); backend.reset(new DBusBackend(this)); } #else backend.reset(new FileBackend(this)); #endif //D_DISABLE_DBUS_CONFIG #else qCDebug(cfLog, "Fallback to QSettings mode"); backend.reset(new QSettingBackend(this)); #endif //D_DISABLE_DCONFIG return backend.data(); } /*! @~english \internal @brief Create a configuration backend Try to choose between configuring the D-Bus interface in the center or the file configuration backend interface based on the environment variables. */ DConfigBackend *DConfigPrivate::createBackendByEnv() { const QByteArray &envBackend = qgetenv("DSG_DCONFIG_BACKEND_TYPE"); if (!envBackend.isEmpty()) { if (envBackend == "DBusBackend") { #ifndef D_DISABLE_DCONFIG #ifndef D_DISABLE_DBUS_CONFIG if (DBusBackend::isServiceRegistered() || DBusBackend::isServiceActivatable()) { qCDebug(cfLog, "Fallback to DBus mode"); return new DBusBackend(this); } #endif //D_DISABLE_DBUS_CONFIG #endif //D_DISABLE_DCONFIG } else if (envBackend == "FileBackend") { #ifndef D_DISABLE_DCONFIG qCDebug(cfLog, "Fallback to DConfigFile mode"); return new FileBackend(this); #endif //D_DISABLE_DCONFIG } else { #ifndef D_DISABLE_DCONFIG #else qCDebug(cfLog, "Fallback to QSettings mode"); return new QSettingBackend(this); #endif //D_DISABLE_DCONFIG } } return nullptr; } /*! @~english @class Dtk::Core::DConfig \inmodule dtkcore @brief Configure the interface class provided by the policy This interface specification defines the relevant interfaces provided by the development library for reading and writing configuration files, If the application uses a development library that implements this specification, the application should use the interfaces provided by the development library first. */ /*! @~english * @brief Constructs the objects provided by the configuration policy * \a name Configuration File Name * \a subpath Subdirectory corresponding to the configuration file * \a parent Parent object */ DConfig::DConfig(const QString &name, const QString &subpath, QObject *parent) : DConfig(nullptr, name, subpath, parent) { } DConfig::DConfig(DConfigBackend *backend, const QString &name, const QString &subpath, QObject *parent) : DConfig(backend, _globalAppId.isEmpty() ? DSGApplication::id() : _globalAppId, name, subpath, parent) { } /*! @~english * @brief Constructs the object provided by the configuration policy, specifying the application Id to which the configuration belongs. * \a appId * \a name * \a subpath * \a parent * @return The constructed configuration policy object, which is released by the caller * @note \a appId is not empty. */ DConfig *DConfig::create(const QString &appId, const QString &name, const QString &subpath, QObject *parent) { Q_ASSERT(appId != NoAppId); return new DConfig(nullptr, appId, name, subpath, parent); } DConfig *DConfig::create(DConfigBackend *backend, const QString &appId, const QString &name, const QString &subpath, QObject *parent) { Q_ASSERT(appId != NoAppId); return new DConfig(backend, appId, name, subpath, parent); } /*! * \brief Constructs the object, and which is application. * \param name * \param subpath * \param parent * \return Dconfig object, which is released by the caller * @note It's usually used for application independent, we should use DConfig::create if the configuration is a specific application. */ DConfig *DConfig::createGeneric(const QString &name, const QString &subpath, QObject *parent) { return new DConfig(nullptr, NoAppId, name, subpath, parent); } DConfig *DConfig::createGeneric(DConfigBackend *backend, const QString &name, const QString &subpath, QObject *parent) { return new DConfig(backend, NoAppId, name, subpath, parent); } /*! * \brief Explicitly specify application Id for config. * \param appId * @note It's should be called before QCoreApplication constructed. */ void DConfig::setAppId(const QString &appId) { if (!_globalAppId.isEmpty()) { qCWarning(cfLog, "`setAppId`should only be called once."); } _globalAppId = appId; qCDebug(cfLog, "Explicitly specify application Id as appId=%s for config.", qPrintable(appId)); } class DConfigThread : public QThread { public: DConfigThread() { setObjectName("DConfigGlobalThread"); start(); } ~DConfigThread() override { if (isRunning()) { quit(); wait(); } } }; Q_GLOBAL_STATIC(DConfigThread, _globalThread) QThread *DConfig::globalThread() { return _globalThread; } /*! @~english * @brief Use custom configuration policy backend to construct objects * \a backend The caller inherits the configuration policy backend of DConfigBackend * \a appId The application Id of the configuration file. If it is blank, it will be the application Id by default * \a name Configuration File Name * \a subpath Subdirectory corresponding to the configuration file * \a parent Parent object * @note The caller only constructs backend, which is released by DConfig. */ DConfig::DConfig(DConfigBackend *backend, const QString &appId, const QString &name, const QString &subpath, QObject *parent) : QObject(parent) , DObject(*new DConfigPrivate(this, appId, name, subpath)) { D_D(DConfig); qCDebug(cfLog, "Load config of appid=%s name=%s, subpath=%s", qPrintable(d->appId), qPrintable(d->name), qPrintable(d->subpath)); if (backend) { d->backend.reset(backend); } if (auto backend = d->getOrCreateBackend()) { backend->load(d->appId); } } /*! @~english * @brief DConfig::backendName * @return Configure policy backend name * @note The caller can only access the DConfigBackend object with DConfig, so the DConfigBackend object is not returned. */ QString DConfig::backendName() const { D_DC(DConfig); if (d->invalid()) return QString(); return d->backend->name(); } /*! @~english * @brief Get all available configuration item names * @return Configuration item name collection */ QStringList DConfig::keyList() const { D_DC(DConfig); if (d->invalid()) return QStringList(); return d->backend->keyList(); } /*! @~english * @brief Check whether the backend is available * @return */ bool DConfig::isValid() const { D_DC(DConfig); return !d->invalid(); } /*! @~english * @brief Check whether the value is default according to the configuration item name * @param key Configuration Item Name * @return Return `true` if the value isn't been set, otherwise return `false` */ bool DConfig::isDefaultValue(const QString &key) const { D_DC(DConfig); if (d->invalid()) return false; return d->backend->isDefaultValue(key); } /*! @~english * @brief Get the corresponding value according to the configuration item name * @param key Configuration Item Name * @param fallback The default value provided after the configuration item value is not obtained * @return */ QVariant DConfig::value(const QString &key, const QVariant &fallback) const { D_DC(DConfig); if (d->invalid()) return fallback; return d->backend->value(key, fallback); } /*! @~english * @brief Set the value according to the configuration item name * @param key Configuration Item Name * @param value Values that need to be updated */ void DConfig::setValue(const QString &key, const QVariant &value) { D_D(DConfig); if (d->invalid()) return; d->backend->setValue(key, value); } /*! @~english * @brief Set the default value corresponding to its configuration item. This value is overridden by the override mechanism. It is not necessarily the value defined in the meta in this configuration file * @param key Configuration Item Name */ void DConfig::reset(const QString &key) { D_D(DConfig); if (d->invalid()) return; d->backend->reset(key); } /*! * @~english * @brief Check whether the configuration item is read-only * @param key Configuration Item Name * @return Return `true` if the configuration item is read-only, otherwise return `false` */ bool DConfig::isReadOnly(const QString &key) const { D_DC(DConfig); if (d->invalid()) return false; return d->backend->isReadOnly(key); } /*! @~english * @brief Return configuration file name * @return */ QString DConfig::name() const { D_DC(DConfig); return d->name; } /*! @~english * @brief Return the subdirectory corresponding to the configuration file * @return */ QString DConfig::subpath() const { D_DC(DConfig); return d->subpath; } DCORE_END_NAMESPACE dtkcore-6.7.46/src/dconfigfile.cpp000066400000000000000000001436521522615770400170410ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dconfigfile.h" #include "dobject_p.h" #include "filesystem/dstandardpaths.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // https://gitlabwh.uniontech.com/wuhan/se/deepin-specifications/-/issues/3 DCORE_BEGIN_NAMESPACE #ifndef QT_DEBUG Q_LOGGING_CATEGORY(cfLog, "dtk.dsg.config" , QtInfoMsg); #else Q_LOGGING_CATEGORY(cfLog, "dtk.dsg.config"); #endif #define FILE_SUFFIX QLatin1String(".json") // QJson treats all numbers as double, and QJsonValue::toVariant() degrades a // float literal with no fractional part (e.g. 1.0) to an integer type // (qlonglong). To keep the original float intent, we match the raw JSON text // to detect whether the "value" literal contained '.' or 'e'/'E'. // This mirrors the approach used by tools/dconfig2cpp/main.cpp:isOriginalValueFloat. struct JsonParseResult { QJsonDocument doc; QByteArray raw; // raw bytes, kept for float-literal detection bool isValid() const { return !doc.isNull(); } }; // Check whether the number literal under "propertyName" -> {"value": ...} // in the raw JSON is a floating-point literal (contains '.' or 'e'/'E'). static bool isOriginalValueFloat(const QByteArray &raw, const QString &propertyName, const QJsonValue &value) { if (!value.isDouble()) { return false; } const QString searchPattern = QString("\"%1\"\\s*:\\s*\\{[^}]*\"value\"\\s*:\\s*([0-9.eE+-]+)").arg(propertyName); const QRegularExpression regex(searchPattern); const QRegularExpressionMatch match = regex.match(QString::fromUtf8(raw)); if (match.hasMatch()) { const QString numberStr = match.captured(1); return numberStr.contains(QLatin1Char('.')) || numberStr.contains(QLatin1Char('e'), Qt::CaseInsensitive); } return false; } // Convert a QJsonValue to QVariant, forcing double when the raw literal was float. inline static QVariant jsonValueToVariant(const QJsonValue &value, bool isFloat) { QVariant var = value.toVariant(); if (isFloat) { QVariant copy = var; #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) if (copy.convert(QMetaType(QMetaType::Double))) #else if (copy.convert(QVariant::Double)) #endif var = copy; } return var; } // subpath must be a subdirectory of the dir. inline static bool subpathIsValid(const QString &subpath, const QDir &dir) { if (subpath.isEmpty()) return true; if (!subpath.startsWith(QLatin1Char('/'))) return false; const QDir subDir(dir.filePath(subpath.mid(1))); return subDir.absolutePath().startsWith(dir.absolutePath()); } // name must be a valid filename. inline static bool isValidFilename(const QString& filename) { static const QRegularExpression regex("^[\\w\\-\\.\\ ]+$"); QRegularExpressionMatch match = regex.match(filename); return match.hasMatch(); } // AppId don't contain ' ', but it can be empty. inline static bool isValidAppId(const QString& appId) { static const QRegularExpression regex("^[\\w\\-\\.]*$"); QRegularExpressionMatch match = regex.match(appId); return match.hasMatch(); } /*! @~english \internal @brief 按å­�目录查找机制查找é…�置文件 在 \a baseDir目录下,查找å��称为 \a name的文件, 若存在 \a subpath,则从 \a subpathå�¶å­�目录é€�级å�‘上查找å��称为 \a name的文件, è‹¥ä¸�存在此文件,则返回无效路径. */ inline QString getFile(const QString &baseDir, const QString &subpath, const QString &name, bool canFallbackUp = true) { qCDebug(cfLog, "load json file from base dir:\"%s\", subpath = \"%s\", file name =\"%s\".", qPrintable(baseDir), qPrintable(subpath), qPrintable(name)); const QDir base_dir(baseDir); if (!subpathIsValid(subpath, base_dir)) { qCDebug(cfLog, "subpath is invalid in the base dir:\"%s\", subpath:\"%s\".", qPrintable(baseDir), qPrintable(subpath)); return QString(); } QDir target_dir = base_dir; if (!subpath.isEmpty()) target_dir.cd(subpath.mid(1)); do { qCDebug(cfLog, "load json file from: \"%s\"", qPrintable(target_dir.path())); if (QFile::exists(target_dir.filePath(name))) { return target_dir.filePath(name); } if (base_dir == target_dir) break; } while (canFallbackUp && target_dir.cdUp()); return QString(); } inline QFile *loadFile(const QString &baseDir, const QString &subpath, const QString &name, bool canFallbackUp = true) { QString path = getFile(baseDir, subpath, name, canFallbackUp); if (!path.isEmpty()) { return new QFile(path); } return nullptr; } static JsonParseResult loadJsonFile(QIODevice *data) { if (!data->open(QIODevice::ReadOnly)) { if (auto file = qobject_cast(data)) { qCDebug(cfLog, "Falied on open file: \"%s\", error message: \"%s\"", qPrintable(file->fileName()), qPrintable(file->errorString())); } return JsonParseResult(); } JsonParseResult result; result.raw = data->readAll(); data->close(); QJsonParseError error; result.doc = QJsonDocument::fromJson(result.raw, &error); if (error.error != QJsonParseError::NoError) { qCWarning(cfLog, "%s", qPrintable(error.errorString())); return JsonParseResult(); } return result; } static DConfigFile::Version parseVersion(const QJsonObject &obj) { DConfigFile::Version version {0, 0}; const QString &verStr = obj[QLatin1String("version")].toString(); if (verStr.isEmpty()) { return version; } const QStringList &items = verStr.split(QLatin1Char('.')); if (items.size() != 2) return version; bool ok = false; quint16 major = items.first().toUShort(&ok); if (!ok) return version; quint16 minor = items.last().toUShort(&ok); if (!ok) return version; version.major = major; version.minor = minor; return version; } #define MAGIC_META QLatin1String("dsg.config.meta") #define MAGIC_OVERRIDE QLatin1String("dsg.config.override") #define MAGIC_CACHE QLatin1String("dsg.config.cache") static const uint InvalidUID = 0xFFFF; inline static bool checkMagic(const QJsonObject &obj, QLatin1String request) { return obj[QLatin1String("magic")].toString() == request; } inline static bool versionIsValid(const DConfigFile::Version &v) { return v.major > 0 || v.minor > 0; } inline static bool checkVersion(const QJsonObject &obj, const DConfigFile::Version &request) { const DConfigFile::Version &v = parseVersion(obj); return versionIsValid(v) && v.major == request.major; } inline void overrideValue(QLatin1String subkey, const QJsonValue &from, QVariantHash &target) { const QJsonValue &v = from[subkey]; if (!v.isUndefined()) target[subkey] = v.toVariant(); } inline static QString getUserName(const uint uid) { passwd *pw = getpwuid(uid); return pw ? QString::fromLocal8Bit(pw->pw_name) : QString(); } /*! @~english @class Dtk::Core::DConfigFile \inmodule dtkcore @brief Specification configuration file implementation of the interface that the configuration file reads and writes. */ /*! @~english @enum DConfigFile::Flag \value NoOverride When this flag exists , it indicates that this configuration item can't be overwritten (see the override mechanism below for details). Otherwise, the absence of this flag indicates that this configuration item is allowed to be overwritten, If it has a screen setting entry, hide or disable the screen setting entry when this entry is not writable. \value Global When reading or writing such a configuration, the user identity is ignored and the same data is obtained regardless of which user identity the program executes. The write operation will take effect for all users. However, if the corresponding configuration storage directory does not exist or has no write permission, this flag is ignored. */ /*! @~english @enum DConfigFile::Permissions \value ReadOnly Overwrite the configuration item as readonly. \value ReadWrite Overwrite the configuration item as readable and writable. */ /*! @~english @enum DConfigFile::Visibility \value Private For internal program use only, Not visible to the outside world. Such configuration items are completely read and written by the program itself, and can be added, deleted and rewritten at will without compatibility consideration, \value Public External programs are available. Once this type of configuration item is released, ensure that the configuration item is backward compatible during the upgrade of the compatible version. In short, this type of configuration item is only allowed to be deleted or modified when a major version of the program/library is upgraded. The configuration item is changed if any of its permissions, visibility, or flags properties are changed. In addition, you do not need to consider compatibility when modifying the value, name, and description attributes. */ /*! @~english @struct Dtk::Core::DConfigFile::Version \inmodule dtkcore @brief Version Information The content format version of this file. The version number is described by two digits, Profiles with different first digits are incompatible with each other, and profiles with different second digits need to be compatible with each other. A program that reads this profile needs to perform content analysis by version, and when it encounters an incompatible version, it needs to terminate parsing immediately and ignore the file. And write a warning message to the program log, such as "1.0" and "2.0" versions are not compatible, If the parser only supports version 1.0, it should stop parsing when it encounters a 2.0 profile. But if version 1.1 is encountered, execution can continue. When writing to this profile, if an incompatible version is encountered, the current contents need to be cleared before writing, and this field needs to be updated with each write */ DConfigMeta::~DConfigMeta() {} QStringList DConfigMeta::genericMetaDirs(const QString &localPrefix) { QStringList paths; // lower priority is higher. for (auto item: DStandardPaths::paths(DStandardPaths::DSG::DataDir)) { paths.prepend(QDir::cleanPath(QString("%1/%2/configs").arg(localPrefix, item))); } return paths; } QStringList DConfigMeta::applicationMetaDirs(const QString &localPrefix, const QString &appId) { QStringList paths; const auto &dataPaths = genericMetaDirs(localPrefix); paths.reserve(dataPaths.size()); for (auto item : dataPaths) { paths << QString("%1/%2").arg(item, appId); } return paths; } Dtk::Core::DConfigCache::~DConfigCache() {} struct DConfigKey { DConfigKey(const QString &aappId, const QString &afileName, const QString &asubpath) : appId(aappId), fileName(afileName), subpath(asubpath) { } explicit DConfigKey(const DConfigKey &src) : DConfigKey(src.appId, src.fileName, src.subpath) { } DConfigKey &operator = (const DConfigKey &src) { this->appId = src.appId; this->fileName = src.fileName; this->subpath = src.subpath; return *this; } QString appId; QString fileName; QString subpath; }; class Q_DECL_HIDDEN DConfigInfo { public: DConfigInfo() { } DConfigInfo(const DConfigInfo &other) { this->values = other.values; } DConfigInfo operator = (const DConfigInfo &other) { this->values = other.values; return *this; } inline static bool checkSerial(const int metaSerial, const int cacheSerial) { if (cacheSerial < 0) return true; if (metaSerial >= 0 && metaSerial == cacheSerial) return true; return false; } DConfigFile::Visibility visibility(const QString &key) const { DConfigFile::Visibility p = DConfigFile::Private; const auto &tmp = values[key][QLatin1String("visibility")].toString(); if (tmp == QLatin1String("public")) p = DConfigFile::Public; return p; } DConfigFile::Permissions permissions(const QString &key) const { DConfigFile::Permissions p = DConfigFile::ReadOnly; const auto &tmp = values[key][QLatin1String("permissions")].toString(); if (tmp == QLatin1String("readwrite")) p = DConfigFile::ReadWrite; return p; } DConfigFile::Flags flags(const QString &key) const { DConfigFile::Flags flags = {}; const auto &tmp = values[key][QLatin1String("flags")]; Q_FOREACH(const QString &flag, tmp.toStringList()) { if (flag == QLatin1String("nooverride")) { flags |= DConfigFile::NoOverride; } else if (flag == QLatin1String("global")) { flags |= DConfigFile::Global; } else if (flag == QLatin1String("user-public")) { flags |= DConfigFile::UserPublic; } } return flags; } QString displayName(const QString &key, const QLocale &locale) const { if (locale == QLocale::AnyLanguage) return values[key][QLatin1String("name")].toString(); return values[key].value(QString("name[%1]") .arg(locale.name())).toString(); } QString description(const QString &key, const QLocale &locale) const { if (locale == QLocale::AnyLanguage) return values[key][QLatin1String("description")].toString(); return values[key].value(QString("description[%1]") .arg(locale.name())).toString(); } inline QVariant value(const QString &key) const { return values[key][QLatin1String("value")]; } inline int serial(const QString &key) const { bool status = false; const int tmp = values[key][QLatin1String("serial")].toInt(&status); if (status) { return tmp; } return -1; } inline void setValue(const QString &key, const QVariant &value) { values[key]["value"] = value; } inline void setSerial(const QString &key, const int &value) { values[key]["serial"] = value; } inline void setTime(const QString &key, const QString &value) { values[key]["time"] = value; } inline void setUser(const QString &key, const uint &value) { values[key]["user"] = getUserName(value); } inline void setAppId(const QString &key, const QString &value) { values[key]["appid"] = value; } inline QStringList keyList() const { return values.keys(); } inline bool contains(const QString &key) const { return values.contains(key); } inline void remove(const QString &key) { values.remove(key); } inline bool update(const QString &key, const QVariantHash &value) { if (!value.contains("value")) { return false; } values[key] = value; return true; } inline bool updateValue(const QString &key, const QJsonValue &value, const QByteArray &raw) { return overrideValue(key, "value", value, raw); } inline void updateSerial(const QString &key, const QJsonValue &value) { overrideValue(key, "serial", value); } inline void updatePermissions(const QString &key, const QJsonValue &value) { overrideValue(key, "permissions", value); } QJsonObject content() const { QJsonObject contents; for (auto i = values.constBegin(); i != values.constEnd(); ++i) { contents[i.key()] = QJsonObject::fromVariantHash(i.value()); } return contents; } private: bool overrideValue(const QString &key, const QString &subkey, const QJsonValue &from, const QByteArray &raw = QByteArray()) { const QJsonValue &v = from[subkey]; if (v.isUndefined()) { return false; } if (subkey == QLatin1String("value")) { // QJsonValue::toVariant() degrades 1.0 to qlonglong; restore double // when the raw literal was a float. values[key][subkey] = jsonValueToVariant(v, isOriginalValueFloat(raw, key, v)); } else { values[key][subkey] = v.toVariant(); } return true; } QHash values; }; /*! @~english @class Dtk::Core::DConfigMeta \inmodule dtkcore @brief Provides a prototype of the configuration file and an access interface to the override mechanism. */ /*! @~english @fn DConfigFile::Version DConfigMeta::version() const = 0; @brief Returns configuration version information. @return */ /*! @~english @fn void DConfigMeta::setVersion(quint16 major, quint16 minor) = 0; @brief Sets configuration version information \a major Major version number \a minor Minor version number */ /*! @~english @fn bool DConfigMeta::load(const QString &localPrefix = QString()) = 0; @brief Parsing configuration files \a localPrefix Directory prefix @return */ /*! @~english @fn bool DConfigMeta::load(QIODevice *meta, const QList &overrides) = 0; @brief Parse the configuration file stream \a meta Prototype stream \a overrides The file stream to find for the override mechanism @return */ /*! @~english @fn QStringList DConfigMeta::keyList() const = 0; @brief Returns all configuration items for the configuration content @return */ /*! @~english @fn DConfigFile::Flags DConfigMeta::flags(const QString &key) const = 0; @brief Returns the attribute of the specified configuration item \a key Configure the name of the option, NoOverride This option can't be overridden, and Global ignores the user identity @return */ /*! @~english @fn DConfigFile::Permissions DConfigMeta::permissions(const QString &key) const = 0; @brief Returns the permission for the specified configuration item \a key Configuration name @return */ /*! @~english @fn DConfigFile::Visibility DConfigMeta::visibility(const QString &key) const = 0; @brief Returns the visibility of the specified configuration item \a key Configuration name @return */ /*! @~english @fn int DConfigMeta::serial(const QString &key) const = 0; @brief Returns a monotonically increasing value of a configuration item \a key Configuration name @return An invalid value of -1 indicates that the entry is not configured */ /*! @~english @fn QString DConfigMeta::displayName(const QString &key, const QLocale &locale) = 0; @brief Returns the display name of the specified configuration \a key Configuration name \a locale Language version @return */ /*! @~english @fn QString DConfigMeta::description(const QString &key, const QLocale &locale) = 0; @brief Returns a description of the specified configuration item \a key Configuration name \a locale Language version @return */ /*! @~english @fn QString DConfigMeta::metaPath(const QString &localPrefix = QString(), bool *useAppId = nullptr) const = 0; @brief Returns the path to the profile \a localPrefix Directory of all override mechanisms that need to be searched @return */ /*! @~english @fn QStringList DConfigMeta::allOverrideDirs(const bool useAppId, const QString &prefix = QString()) const = 0; @brief Gets all the override mechanism directories to look for for the \a prefix directory \a useAppId Whether not to use the generic directory @return */ /*! @~english @fn QVariant DConfigMeta::value(const QString &key) const = 0; @brief Original value of meta overwritten by the overwriting mechanism \a key Configuration name @return */ class Q_DECL_HIDDEN DConfigMetaImpl : public DConfigMeta { // DConfigMeta interface public: explicit DConfigMetaImpl(const DConfigKey &configKey); virtual ~DConfigMetaImpl() override; inline virtual QStringList keyList() const override { return values.keyList(); } inline virtual DConfigFile::Flags flags(const QString &key) const override { return values.flags(key); } inline virtual DConfigFile::Permissions permissions(const QString &key) const override { return values.permissions(key); } inline virtual DConfigFile::Visibility visibility(const QString &key) const override { return values.visibility(key); } inline virtual int serial(const QString &key) const override { return values.serial(key); } inline virtual QString description(const QString &key, const QLocale &locale) override { return values.description(key, locale); } virtual DConfigFile::Version version() const override { return m_version; } inline virtual void setVersion(quint16 major, quint16 minor) override { m_version.major = major; m_version.minor = minor; } inline virtual QString displayName(const QString &key, const QLocale &locale) override { return values.displayName(key, locale); } inline virtual QVariant value(const QString &key) const override { return values.value(key); } QString metaPath(const QString &localPrefix, bool *useAppId) const override { bool useAppIdForOverride = true; QString path; const QStringList &applicationMetas = applicationMetaDirs(localPrefix, configKey.appId); for (auto iter = applicationMetas.rbegin(); iter != applicationMetas.rend(); iter++) { path = getFile(*iter, configKey.subpath, configKey.fileName + FILE_SUFFIX); if (!path.isEmpty()) break; } if (path.isEmpty()) { useAppIdForOverride = false; const QStringList &genericnMetas = genericMetaDirs(localPrefix); for (auto iter = genericnMetas.rbegin(); iter != genericnMetas.rend(); iter++) { path = getFile(*iter, configKey.subpath, configKey.fileName + FILE_SUFFIX); if (!path.isEmpty()) break; } } if (useAppId) { *useAppId = useAppIdForOverride; } return path; } bool load(const QString &localPrefix) override { if (!isValidAppId(configKey.appId)) { qCWarning(cfLog, "AppId is invalid, appId=%s", qPrintable(configKey.appId)); return false; } if (!isValidFilename(configKey.fileName)) { qCWarning(cfLog, "Name is invalid, filename=%s", qPrintable(configKey.fileName)); return false; } bool useAppIdForOverride = true; QString path = metaPath(localPrefix, &useAppIdForOverride); if (path.isEmpty()) { qCWarning(cfLog, "Can't load meta file from local prefix: \"%s\"", qPrintable(localPrefix)); return false; } qCDebug(cfLog, "Load meta file: \"%s\"", qPrintable(path)); QScopedPointer meta(new QFile(path)); struct _ScopedPointer { explicit _ScopedPointer(const QList &list) : m_list(list) {} ~_ScopedPointer() {qDeleteAll(m_list);} QList m_list; }; _ScopedPointer overrides(loadOverrides(localPrefix, useAppIdForOverride)); return load(meta.data(), overrides.m_list); } bool load(QIODevice *meta, const QList &overrides) override { { const JsonParseResult pr = loadJsonFile(meta); const QJsonDocument &doc = pr.doc; if (!doc.isObject()) return false; // 检查标识 const QJsonObject &root = doc.object(); if (!checkMagic(root, MAGIC_META)) { qCWarning(cfLog, "The meta magic does not match"); return false; } // 检查版本兼容性 const auto &v = parseVersion(root); if (!versionIsValid(v) || v.major > DConfigFile::supportedVersion().major) { qCWarning(cfLog, "The meta version number does not match, " "the file major version=%i, supported major version<=%i", v.major, DConfigFile::supportedVersion().major); return false; } m_version = v; const auto &contents = root[QLatin1String("contents")].toObject(); auto i = contents.constBegin(); // åˆ�始化原始值 for (; i != contents.constEnd(); ++i) { const QJsonObject itemObj = i.value().toObject(); QVariantHash vh = itemObj.toVariantHash(); // QJsonValue::toVariant() degrades 1.0 to qlonglong; restore double // when the raw literal was a float. const QJsonValue valueField = itemObj.value(QLatin1String("value")); if (valueField.isDouble()) { vh.insert(QLatin1String("value"), jsonValueToVariant(valueField, isOriginalValueFloat(pr.raw, i.key(), valueField))); } if (!values.update(i.key(), vh)) { qWarning() << "key:" << i.key() << "has no value"; return false; } } } // for override Q_FOREACH(auto override, overrides) { const JsonParseResult ovr = loadJsonFile(override); const QJsonDocument &doc = ovr.doc; if (doc.isObject()) { const QJsonObject &root = doc.object(); if (!checkMagic(root, MAGIC_OVERRIDE)) { if (auto file = static_cast(override)) { qCWarning(cfLog, "The override magic does not match, file: \"%s\", error message: \"%s\"", qPrintable(file->fileName()), qPrintable(file->errorString())); } else { qCWarning(cfLog, "The override magic does not match"); } break; //TODO don't continue parse? } if (!checkVersion(root, m_version)) { qCWarning(cfLog, "The override version number does not match"); break; } if (auto file = static_cast(override)) { qCDebug(cfLog, "The override will be applied, file: \"%s\"", qPrintable(file->fileName())); } const auto &contents = root[QLatin1String("contents")].toObject(); auto i = contents.constBegin(); for (; i != contents.constEnd(); ++i) { if (!values.contains(i.key())) { qCWarning(cfLog, "The meta doesn't contain the override key: \"%s\".", qPrintable(i.key())); continue; } // 检查是å�¦å…�许 override if (values.flags(i.key()) & DConfigFile::NoOverride) continue; if (!values.updateValue(i.key(), i.value(), ovr.raw)) { qWarning() << "key (override):" << i.key() << "has no value"; return false; } values.updateSerial(i.key(), i.value()); values.updatePermissions(i.key(), i.value()); } } } return true; } /*! @~english \internal @brief 获得å‰�缀为 \a prefix 目录的应用或公共库的所有覆盖机制目录,è¶Šå�Žä¼˜å…ˆçº§è¶Šé«˜ */ inline QStringList overrideDirs(const QString & prefix, bool useAppId) const { const QString &path2 = QString("%1/etc/dsg/configs/overrides/%2/%3") .arg(prefix, useAppId ? configKey.appId : QString(), configKey.fileName); QStringList paths; const QStringList &dataPaths = DStandardPaths::paths(DStandardPaths::DSG::DataDir); paths.reserve(dataPaths.size() + 1); for (auto path: dataPaths) { // reverse `DataDir`'s paths, previous `DataDir`'s value has high priority paths.prepend(QString("%1%2/configs/overrides/%3/%4") .arg(prefix, path, useAppId ? configKey.appId : QString(), configKey.fileName)); } // 在å�Žé�¢çš„优先级更高 paths.append(path2); return paths; } inline QStringList allOverrideDirs(const bool useAppId, const QString &prefix) const override { QStringList dirs; // å�ªæœ‰å½“å…�许ä¸�使用 appid æ—¶æ‰�能回退到通用目录 if (!useAppId) { dirs << overrideDirs(prefix, false); } // 无论如何都先从带 appid 的目录下加载override文件 // 在列表å�Žé�¢çš„æ›´ä¼˜å…ˆ dirs << overrideDirs(prefix, true); return dirs; } /*! @~english \internal @brief 获得所有é�µå®ˆè¦†ç›–机制的文件æµ� 在override文件放置路径下按优先级查找覆盖文件,支æŒ�å­�目录查找机制, 使用自然排åº�(如“a2â€�在“a11â€�之å‰�)规则按文件å��进行排åº� */ QList loadOverrides(const QString &prefix, bool useAppId) const { auto filters = QDir::Files | QDir::NoDotAndDotDot | QDir::Readable; const QStringList nameFilters {"*" + FILE_SUFFIX}; QStringList dirs = allOverrideDirs(useAppId, prefix); QList list; list.reserve(50); QCollator collator(QLocale::English); collator.setNumericMode(true); collator.setIgnorePunctuation(true); Q_FOREACH(const auto &dir, dirs) { const QDir base_dir(QDir::cleanPath(dir)); if (!base_dir.exists()) continue; if (!subpathIsValid(configKey.subpath, base_dir)) continue; QDir target_dir = base_dir; target_dir.setFilter(filters); target_dir.setNameFilters(nameFilters); if (!configKey.subpath.isEmpty()) target_dir.cd(configKey.subpath.mid(1)); do { qCDebug(cfLog, "load override file from: \"%s\"", qPrintable(target_dir.path())); QDirIterator iterator(target_dir); QList sublist; sublist.reserve(50); while(iterator.hasNext()) { sublist.append(new QFile(iterator.next())); } // 从å°�到大排åº� std::sort(sublist.begin(), sublist.end(), [&collator](QIODevice *f1, QIODevice *f2){ if (collator.compare(static_cast(f1)->fileName(), static_cast(f2)->fileName()) < 0) return true; return false; }); list = sublist + list; if (base_dir.path() == target_dir.path()) break; } while (target_dir.cdUp()); } return list; } DConfigKey configKey; DConfigInfo values; DConfigFile::Version m_version = {0, 0}; char padding [4] = {}; }; DConfigMetaImpl::DConfigMetaImpl(const DConfigKey &configKey) : DConfigMeta (), configKey(configKey) { } DConfigMetaImpl::~DConfigMetaImpl() { } /*! @~english @class Dtk::Core::DConfigCache \inmodule dtkcore @brief Provides user and global runtime cache access interfaces for Configuration file. */ /*! @~english @fn bool DConfigCache::load(const QString &localPrefix = QString()) = 0; @brief Parse the cache configuration file @return */ /*! @~english @fn bool DConfigCache::save(const QString &localPrefix = QString(), QJsonDocument::JsonFormat format = QJsonDocument::Indented, bool sync = false) = 0; @brief Save the cached value to disk \a localPrefix Directory prefix \a format Save format \a sync Whether to refresh immediately @return */ /*! @~english @fn bool DConfigCache::isGlobal() const = 0; @brief Whether to cache globally @return */ /*! @~english @fn void DConfigCache::remove(const QString &key) = 0; @brief Delete a configuration entry from the cache \a key Configuration name @return */ /*! @~english @fn QStringList DConfigCache::keyList() const = 0; @brief Returns all configuration items for the configuration content @return */ /*! @~english @fn bool DConfigCache::setValue(const QString &key, const QVariant &value, const int serial, const uint uid, const QString &callerAppid) = 0; @brief Sets the value in the cache \a key Configuration name \a value Configuration name \a uid User Id at setup time \a callerAppid Application id at setup time @return true if the cache was updated (value or serial changed), false if no update was needed */ /*! @~english @fn QVariant DConfigCache::value(const QString &key) const = 0; @brief Get the value in the cache \a key Configuration name @return */ /*! @~english @fn int DConfigCache::serial(const QString &key) const = 0; @brief Returns a monotonically increasing value of a configuration item \a key Configuration name @return An invalid value of -1 indicates that the entry is not configured */ /*! @~english @fn uint DConfigCache::uid() const = 0; @brief User identification, when used in the global cache, uid is a specific value for non-user identification @return */ /*! @~english @fn void setCachePathPrefix(const QString &prefix) = 0; @brief Set cache's prefix path, it's access permissions is considered by caller, and it needs to distinguish the paths of different caches by caller. @param prefix cache's prefix path. */ class Q_DECL_HIDDEN DConfigCacheImpl : public DConfigCache { public: DConfigCacheImpl(const DConfigKey &configKey, const uint uid, bool global); virtual ~DConfigCacheImpl() override; // DConfigCache interface public: inline virtual int serial(const QString &key) const override { return values.serial(key); } inline virtual uint uid() const override { return userid; } inline virtual QStringList keyList() const override { return values.keyList(); } inline QString applicationCacheDir(const QString &localPrefix, const QString &suffix) const { QString prefix(cachePrefix); if (prefix.isEmpty()) { // If target user is current user or system user, then get the home path by environment variable first. QString homePath; if (userid == InvalidUID || (getuid() == userid)) { homePath = DStandardPaths::homePath(); } else { homePath = DStandardPaths::homePath(getuid()); } if (homePath.isEmpty()) return QString(); // fallback to default application cache directory. prefix = homePath + QStringLiteral("/.config/dsg/configs"); } return QDir::cleanPath(QString("%1/%2/%3").arg(localPrefix, prefix + suffix, configKey.appId)); } inline QString applicationCacheDir(const QString &localPrefix) const { return applicationCacheDir(localPrefix, QString()); } inline QString cacheDir(const QString &basePath) { QDir dir(basePath + configKey.subpath); return dir.filePath(configKey.fileName + FILE_SUFFIX); } inline QString globalCacheDir(const QString &localPrefix) const { QString prefix(cachePrefix); if (prefix.isEmpty()) { // TODO `DSG_APP_DATA` is not set and `appid` is not captured in `DStandardPaths::path`. QString appDataDir = DStandardPaths::path(DStandardPaths::DSG::AppData); if (appDataDir.isEmpty()) { #ifdef D_DSG_APP_DATA_FALLBACK appDataDir = QStringLiteral(D_DSG_APP_DATA_FALLBACK); QFileInfo tmp(appDataDir); if (!tmp.exists() && !tmp.isSymLink() && !QDir::current().mkpath(appDataDir)) { qCDebug(cfLog, "Not found a valid DSG_APP_DATA directory"); return QString(); } #else return QString(); #endif } // fallback to default global cache directory. prefix = QString("%1/configs").arg(appDataDir); } return QDir::cleanPath(QString("%1/%2/%3").arg(localPrefix, prefix, configKey.appId)); } QString getCacheDir(const QString &localPrefix = QString()) { if (isGlobal()) { const QString &dir = globalCacheDir(localPrefix); if (!dir.isEmpty()) return dir; // Not supported the global config, fallback the config cache data to user directory. return applicationCacheDir(localPrefix, "-fake-global"); } else { return applicationCacheDir(localPrefix); } } bool load(const QString &localPrefix = QString()) override; bool isGlobal() const override { return global; } inline void remove(const QString &key) override { values.remove(key); cacheChanged = true; } bool setValue(const QString &key, const QVariant &value, const int serial, const uint uid, const QString &appid) override { if (values.value(key) == value && DConfigInfo::checkSerial(values.serial(key), serial)) { return false; } values.setValue(key, value); values.setSerial(key, serial); values.setTime(key, QDateTime::currentDateTime().toString(Qt::ISODate)); values.setUser(key, uid); values.setAppId(key, appid.isEmpty() ? configKey.appId : appid); cacheChanged = true; return true; } inline QVariant value(const QString &key) const override { return values.value(key); } bool save(const QString &localPrefix, QJsonDocument::JsonFormat format, bool sync) override; virtual void setCachePathPrefix(const QString &prefix) override { cachePrefix = prefix; } DConfigKey configKey; DConfigInfo values; QString cachePrefix; uint userid; bool global; bool cacheChanged = false; }; DConfigCacheImpl::DConfigCacheImpl(const DConfigKey &configKey, const uint uid, bool global) : DConfigCache(), configKey(configKey), userid(uid), global(global) { } DConfigCacheImpl::~DConfigCacheImpl() { } bool DConfigCacheImpl::load(const QString &localPrefix) { // cache 文件è¦�严格匹é…� subpath const QString &dir = getCacheDir(localPrefix); if (dir.isEmpty()) { return true; } QScopedPointer cache(loadFile(dir, configKey.subpath, configKey.fileName + FILE_SUFFIX, false)); if (!cache) { return true; } const JsonParseResult pr = loadJsonFile(cache.data()); const QJsonDocument &doc = pr.doc; if (doc.isObject()) { const QJsonObject &root = doc.object(); if (!checkMagic(root, MAGIC_CACHE)) return false; if (!checkVersion(root, DConfigFile::supportedVersion())) return false; auto &&contents = root[QLatin1String("contents")].toObject(); auto i = contents.constBegin(); // 原样ä¿�存原始数æ�® for (; i != contents.constEnd(); ++i) { const QJsonObject itemObj = i.value().toObject(); QVariantHash vh = itemObj.toVariantHash(); // QJsonValue::toVariant() degrades 1.0 to qlonglong; restore double // when the raw literal was a float. const QJsonValue valueField = itemObj.value(QLatin1String("value")); if (valueField.isDouble()) { vh.insert(QLatin1String("value"), jsonValueToVariant(valueField, isOriginalValueFloat(pr.raw, i.key(), valueField))); } values.update(i.key(), vh); } } return true; } bool DConfigCacheImpl::save(const QString &localPrefix, QJsonDocument::JsonFormat format, bool sync) { if (!cacheChanged) return true; cacheChanged = false; const QString &dir = getCacheDir(localPrefix); if (dir.isEmpty()) { qCWarning(cfLog, "Falied on saveing, the config cache directory is empty for the user[%d], " "the current user[%d].", userid, getuid()); return false; } QString path = cacheDir(dir); QFile cache(path); if (!QFile::exists(QFileInfo(cache.fileName()).path())) { QDir().mkpath(QFileInfo(cache.fileName()).path()); } if (!cache.open(QIODevice::WriteOnly)) { qCWarning(cfLog, "Falied on saveing data when open file: \"%s\", error message: \"%s\"", qPrintable(cache.fileName()), qPrintable(cache.errorString())); return false; } qCDebug(cfLog, "Save cache file \"%s\".", qPrintable(cache.fileName())); QJsonObject root; root[QLatin1String("magic")] = MAGIC_CACHE; const DConfigFile::Version version = DConfigFile::supportedVersion(); root[QLatin1String("version")] = QString("%1.%2").arg(version.major) .arg(version.minor); root[QLatin1String("contents")] = values.content(); QJsonDocument doc; doc.setObject(root); const QByteArray &json = doc.toJson(format); bool status = cache.write(json) == json.size(); if (status && sync) { cache.flush(); } return status; } class Q_DECL_HIDDEN DConfigFilePrivate : public DObjectPrivate { public: DConfigFilePrivate(DConfigFile *qq, const QString &appId, const QString &name, const QString &subpath) : DObjectPrivate(qq), configKey(appId, name ,subpath), configMeta(new DConfigMetaImpl(configKey)) { } DConfigFilePrivate(DConfigFile *qq, const DConfigKey &configKey) : DObjectPrivate(qq), configKey(configKey), configMeta(new DConfigMetaImpl(configKey)) { } ~DConfigFilePrivate() override; bool load(const QString &localPrefix) { bool status = configMeta->load(localPrefix); if (status) { // for cache status &= globalCache->load(localPrefix); } return status; } bool setValue(const QString &key, const QVariant &value, DConfigCache *userCache, const QString &appid) { // 此处ä¸�è¦�检查æ�ƒé™�,在获å�– value 时会检查 if (auto cache = getCache(key, userCache)) { if (!value.isValid()) { cache->remove(key); return true; } else { const auto &metaValue = configMeta->value(key); // sample judgement to reduce a copy of convert. #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) if (metaValue.typeId() == value.typeId()) return cache->setValue(key, value, configMeta->serial(key), cache->uid(), appid); // convert copy to meta's type, it promises `setValue` don't change meta's type. // canConvert isn't explicit, e.g: QString is also can convert to double. auto copy = value; if (!copy.convert(metaValue.metaType())) { qCWarning(cfLog) << "check type error, meta type is " << metaValue.metaType().name() << ", and now type is " << value.metaType().name(); return false; } // TODO it's a bug of qt, MetaType of 1.0 is qlonglong instead of double in json file. static const QVector filterConvertType { QMetaType{QMetaType::Double} }; // reset to origin value. if (filterConvertType.contains(value.metaType())) { copy = value; } #else if (metaValue.type() == value.type()) return cache->setValue(key, value, configMeta->serial(key), cache->uid(), appid); auto copy = value; if (!copy.convert(metaValue.userType())) { qCWarning(cfLog) << "check type error, meta type is " << metaValue.type() << ", and now type is " << value.type(); return false; } static const QVector filterConvertType { QVariant::Double }; if (filterConvertType.contains(value.type())) { copy = value; } #endif return cache->setValue(key, copy, configMeta->serial(key), cache->uid(), appid); } } return false; } DConfigCache* getCache(const QString &key, DConfigCache *userCache) const { if(configMeta->flags(key).testFlag(DConfigFile::Global)) { return globalCache; } return userCache; } QVariant cacheValue(DConfigCache *userCache, const QString &key) const { // 检查æ�ƒé™� if (configMeta->permissions(key) != DConfigFile::ReadOnly) { if (auto cache = getCache(key, userCache)) { if (DConfigInfo::checkSerial(configMeta->serial(key), cache->serial(key))) { const QVariant &tmp = cache->value(key); if (tmp.isValid()) return tmp; } } } return QVariant(); } QVariant value(const QString &key, DConfigCache *userCache) const { const QVariant &v = cacheValue(userCache, key); if (v.isValid()) return v; return configMeta->value(key); } D_DECLARE_PUBLIC(DConfigFile) private: DConfigCacheImpl* globalCache; DConfigKey configKey; DConfigMeta *configMeta; }; DConfigFilePrivate::~DConfigFilePrivate() { if (globalCache) { delete globalCache; globalCache = nullptr; } if (configMeta) { delete configMeta; configMeta = nullptr; } } /*! @~english @brief Supported versions @return */ constexpr DConfigFile::Version DConfigFile::supportedVersion() { return DConfigFile::Version{1, 0}; } /*! @~english @brief 构造é…�置文件管ç�†å¯¹è±¡ \a appId Application unique identification \a name Config filename \a subpath Subdirectories */ DConfigFile::DConfigFile(const QString &appId, const QString &name, const QString &subpath) : DObject(*new DConfigFilePrivate(this, appId, name, subpath)) { D_D(DConfigFile); d->globalCache = new DConfigCacheImpl(d->configKey, InvalidUID, true); } DConfigFile::DConfigFile(const DConfigFile &other) : DObject(*new DConfigFilePrivate(this, other.d_func()->configKey)) { D_D(DConfigFile); auto cache = new DConfigCacheImpl(d->configKey, InvalidUID, true); cache->values = other.d_func()->globalCache->values; cache->cachePrefix = other.d_func()->globalCache->cachePrefix; d->globalCache = cache; } /*! @~english @brief Parse configuration files \a localPrefix Directory prefix @return */ bool DConfigFile::load(const QString &localPrefix) { D_D(DConfigFile); return d->load(localPrefix); } /*! @~english @brief Parse the profile stream \a meta Prototype stream \a overrides File stream to find for the override mechanism @return */ bool DConfigFile::load(QIODevice *meta, const QList &overrides) { return this->meta()->load(meta, overrides); } /*! @~english @brief Save the cached value to disk \a format Save format \a sync Whether to refresh immediately @return */ bool DConfigFile::save(const QString &localPrefix, QJsonDocument::JsonFormat format, bool sync) const { D_DC(DConfigFile); bool ok = d->globalCache->save(localPrefix, format, sync); return ok; } /*! @~english * @brief DConfigFile::value * @param key Configuration name * @param userCache Specific user cache, \a userCache is unused when the key is global * @return */ QVariant DConfigFile::value(const QString &key, DConfigCache *userCache) const { D_DC(DConfigFile); return d->value(key, userCache); } /*! * \brief DConfigFile::cacheValue Get a specific user cache's value * \param userCache Specific user cache, it is unused if the \a key is global configuration item * \param key Configuration name * \return */ QVariant DConfigFile::cacheValue(DConfigCache *userCache, const QString &key) const { D_DC(DConfigFile); return d->cacheValue(userCache, key); } /*! @~english @brief Sets the value in the cache \a key Configuration name \a value The value to set \a userCache Specific user cache at setup time \a appid Application id at setup time @return true if the cache was updated (value or serial changed), false if no update was needed */ bool DConfigFile::setValue(const QString &key, const QVariant &value, const QString &callerAppid, DConfigCache *userCache) { D_D(DConfigFile); return d->setValue(key, value, userCache, callerAppid); } DConfigCache *DConfigFile::createUserCache(const uint uid) { D_D(DConfigFile); return new DConfigCacheImpl(d->configKey, uid, false); } /*! @~english @brief Return to the global cache @return */ DConfigCache *DConfigFile::globalCache() const { D_DC(DConfigFile); return d->globalCache; } /*! @~english @brief Return the prototype object @return */ DConfigMeta *DConfigFile::meta() { D_D(DConfigFile); return d->configMeta; } /*! @~english @brief Checks whether the configuration file is valid @return */ bool DConfigFile::isValid() const { D_DC(DConfigFile); return versionIsValid(d->configMeta->version()); } DCORE_END_NAMESPACE dtkcore-6.7.46/src/ddesktopentry.cpp000066400000000000000000001014231522615770400174550ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2019 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "ddesktopentry.h" #include #include #include #include #include #include DCORE_BEGIN_NAMESPACE enum { Space = 0x1, Special = 0x2 }; static const char charTraits[256] = { // Space: '\t', '\n', '\r', ' ' // Special: '\n', '\r', ';', '=', '\\', '#' // Please note that '"' is NOT a special character 0, 0, 0, 0, 0, 0, 0, 0, 0, Space, Space | Special, 0, 0, Space | Special, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, Space, 0, 0, Special, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, Special, 0, Special, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, Special, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; bool readLineFromData(const QByteArray &data, int &dataPos, int &lineStart, int &lineLen, int &equalsPos) { int dataLen = data.length(); equalsPos = -1; lineStart = dataPos; while (lineStart < dataLen && (charTraits[uint(uchar(data.at(lineStart)))] & Space)) ++lineStart; int i = lineStart; while (i < dataLen) { while (!(charTraits[uint(uchar(data.at(i)))] & Special)) { if (++i == dataLen) goto break_out_of_outer_loop; } char ch = data.at(i++); if (ch == '=') { if (equalsPos == -1) equalsPos = i - 1; } else if (ch == '\n' || ch == '\r') { if (i == lineStart + 1) { ++lineStart; } else { --i; goto break_out_of_outer_loop; } } else if (ch == '\\') { if (i < dataLen) { char ch = data.at(i++); if (i < dataLen) { char ch2 = data.at(i); // \n, \r, \r\n, and \n\r are legitimate line terminators in INI files if ((ch == '\n' && ch2 == '\r') || (ch == '\r' && ch2 == '\n')) ++i; } } } else if (ch == ';') { // The multiple values should be separated by a semicolon and the value of the key // may be optionally terminated by a semicolon. Trailing empty strings must always // be terminated with a semicolon. Semicolons in these values need to be escaped // using \; . // Don't need to do anything here. } else { Q_ASSERT(ch == '#'); if (i == lineStart + 1) { char ch; while (i < dataLen && (((ch = data.at(i)) != '\n') && ch != '\r')) ++i; lineStart = i; } } } break_out_of_outer_loop: dataPos = i; lineLen = i - lineStart; return lineLen > 0; } QString &doEscape(QString& str, const QHash &repl) { // First we replace slash. str.replace(QLatin1Char('\\'), QLatin1String("\\\\")); QHashIterator i(repl); while (i.hasNext()) { i.next(); if (i.key() != QLatin1Char('\\')) str.replace(i.key(), QString::fromLatin1("\\\\%1").arg(i.value())); } return str; } QString &doUnescape(QString& str, const QHash &repl) { int n = 0; while (1) { n=str.indexOf(QLatin1String("\\"), n); if (n < 0 || n > str.length() - 2) break; if (repl.contains(str.at(n+1))) { str.replace(n, 2, repl.value(str.at(n+1))); } n++; } return str; } /*! \internal */ class DDesktopEntrySection { public: DDesktopEntrySection() {} QString name; QMap valuesMap; QByteArray unparsedDatas; int sectionPos = 99; inline operator QString() const { return QLatin1String("DDesktopEntrySection(") + name + QLatin1String(")"); } QByteArray sectionData() const { if (unparsedDatas.isEmpty()) { // construct data and return QByteArray data; data.append(QString("[%1]\n").arg(name).toLocal8Bit()); QMap::const_iterator i; for (i = valuesMap.begin(); i != valuesMap.end(); i++) { data.append(QString("%1=%2\n").arg(i.key(), i.value()).toLocal8Bit()); } return data; } else { return unparsedDatas; } } bool ensureSectionDataParsed() { if (unparsedDatas.isEmpty()) return true; valuesMap.clear(); // for readLineFromFileData() int dataPos = 0; int lineStart; int lineLen; int equalsPos; while(readLineFromData(unparsedDatas, dataPos, lineStart, lineLen, equalsPos)) { if (unparsedDatas.at(lineStart) == '[') continue; // section name already parsed if (equalsPos != -1) { QString key = unparsedDatas.mid(lineStart, equalsPos - lineStart).trimmed(); QString rawValue = unparsedDatas.mid(equalsPos + 1, lineStart + lineLen - equalsPos - 1).trimmed(); valuesMap[key] = rawValue; } } unparsedDatas.clear(); return true; } bool contains(const QString &key) const { const_cast(this)->ensureSectionDataParsed(); return valuesMap.contains(key); } QStringList allKeys() const { const_cast(this)->ensureSectionDataParsed(); return valuesMap.keys(); } QString get(const QString &key, QString &defaultValue) { if (this->contains(key)) { return valuesMap[key]; } else { return defaultValue; } } bool set(const QString &key, const QString &value) { if (this->contains(key)) { valuesMap.remove(key); } valuesMap[key] = value; return true; } bool remove(const QString &key) { if (this->contains(key)) { valuesMap.remove(key); return true; } return false; } }; typedef QMap SectionMap; class DDesktopEntryPrivate { public: DDesktopEntryPrivate(const QString &filePath, DDesktopEntry *qq); ~DDesktopEntryPrivate(); bool isWritable() const; bool fuzzyLoad(); bool initSectionsFromData(const QByteArray &data); void setStatus(const DDesktopEntry::Status &newStatus) const; bool write(QIODevice &device) const; int sectionPos(const QString §ionName) const; bool contains(const QString §ionName, const QString &key) const; QStringList keys(const QString §ionName) const; bool get(const QString §ionName, const QString &key, QString *value); bool set(const QString §ionName, const QString &key, const QString &value); bool remove(const QString §ionName, const QString &key); protected: QString filePath; QMutex fileMutex; SectionMap sectionsMap; mutable DDesktopEntry::Status status; private: bool __padding[4]; DDesktopEntry *q_ptr = nullptr; Q_DECLARE_PUBLIC(DDesktopEntry) }; DDesktopEntryPrivate::DDesktopEntryPrivate(const QString &filePath, DDesktopEntry *qq) : filePath(filePath), q_ptr(qq) { fuzzyLoad(); } DDesktopEntryPrivate::~DDesktopEntryPrivate() { } bool DDesktopEntryPrivate::isWritable() const { QFileInfo fileInfo(filePath); #ifndef QT_NO_TEMPORARYFILE if (fileInfo.exists()) { #endif QFile file(filePath); return file.open(QFile::ReadWrite); #ifndef QT_NO_TEMPORARYFILE } else { // Create the directories to the file. QDir dir(fileInfo.absolutePath()); if (!dir.exists()) { if (!dir.mkpath(dir.absolutePath())) return false; } // we use a temporary file to avoid race conditions QTemporaryFile file(filePath); return file.open(); } #endif } bool DDesktopEntryPrivate::fuzzyLoad() { QFile file(filePath); QFileInfo fileInfo(filePath); if (fileInfo.exists() && !file.open(QFile::ReadOnly)) { setStatus(DDesktopEntry::AccessError); return false; } if (file.isReadable() && file.size() != 0) { bool ok = false; QByteArray data = file.readAll(); ok = initSectionsFromData(data); if (!ok) { setStatus(DDesktopEntry::FormatError); return false; } } setStatus(DDesktopEntry::NoError); return true; } bool DDesktopEntryPrivate::initSectionsFromData(const QByteArray &data) { sectionsMap.clear(); QString lastSectionName; int lastSectionStart = 0; bool formatOk = true; int sectionIdx = 0; // for readLineFromFileData() int dataPos = 0; int lineStart; int lineLen; int equalsPos; auto commitSection = [=](const QString &name, int sectionStartPos, int sectionLength, int sectionIndex) { DDesktopEntrySection lastSection; lastSection.name = name; lastSection.unparsedDatas = data.mid(sectionStartPos, sectionLength); lastSection.sectionPos = sectionIndex; sectionsMap[name] = lastSection; }; // TODO: here we only need to find the section start, so things like equalsPos are useless here. // maybe we can do some optimization here via adding extra argument to readLineFromData(). while(readLineFromData(data, dataPos, lineStart, lineLen, equalsPos)) { // qDebug() << "CurrentLine:" << data.mid(lineStart, lineLen); if (data.at(lineStart) == '[') { // commit the last section we've ever read before we read the new one. if (!lastSectionName.isEmpty()) { commitSection(lastSectionName, lastSectionStart, lineStart - lastSectionStart, sectionIdx); sectionIdx++; } // process section name line QByteArray sectionName; int idx = data.indexOf(']', lineStart); if (idx == -1 || idx >= lineStart + lineLen) { qWarning() << "Bad desktop file format while reading line:" << data.mid(lineStart, lineLen); formatOk = false; sectionName = data.mid(lineStart + 1, lineLen - 1).trimmed(); } else { sectionName = data.mid(lineStart + 1, idx - lineStart - 1).trimmed(); } lastSectionName = sectionName; lastSectionStart = lineStart; } } Q_ASSERT(lineStart == data.length()); if (!lastSectionName.isEmpty()) { commitSection(lastSectionName, lastSectionStart, lineStart - lastSectionStart, sectionIdx); } return formatOk; } // Always keep the first meet error status. and allowed clear the status. void DDesktopEntryPrivate::setStatus(const DDesktopEntry::Status &newStatus) const { if (newStatus == DDesktopEntry::NoError || this->status == DDesktopEntry::NoError) { this->status = newStatus; } } bool DDesktopEntryPrivate::write(QIODevice &device) const { Q_Q(const DDesktopEntry); QStringList sortedKeys = q->allGroups(true); for (const QString &key : sortedKeys) { qint64 ret = device.write(sectionsMap[key].sectionData()); if (ret == -1) return false; } return true; } int DDesktopEntryPrivate::sectionPos(const QString §ionName) const { if (sectionsMap.contains(sectionName)) { return sectionsMap[sectionName].sectionPos; } return -1; } bool DDesktopEntryPrivate::contains(const QString §ionName, const QString &key) const { if (sectionName.isNull() || key.isNull()) { return false; } if (sectionsMap.contains(sectionName)) { return sectionsMap[sectionName].contains(key); } return false; } QStringList DDesktopEntryPrivate::keys(const QString §ionName) const { if (sectionName.isNull()) { return {}; } if (sectionsMap.contains(sectionName)) { return sectionsMap[sectionName].allKeys(); } return {}; } // return true if we found the value, and set the value to *value bool DDesktopEntryPrivate::get(const QString §ionName, const QString &key, QString *value) { if (!this->contains(sectionName, key)) { return false; } if (sectionsMap.contains(sectionName)) { QString &&result = sectionsMap[sectionName].get(key, *value); *value = result; return true; } return false; } bool DDesktopEntryPrivate::set(const QString §ionName, const QString &key, const QString &value) { if (sectionsMap.contains(sectionName)) { bool result = sectionsMap[sectionName].set(key, value); return result; } else { // create new section. DDesktopEntrySection newSection; newSection.name = sectionName; newSection.set(key, value); sectionsMap[sectionName] = newSection; return true; } return false; } bool DDesktopEntryPrivate::remove(const QString §ionName, const QString &key) { if (this->contains(sectionName, key)) { return sectionsMap[sectionName].remove(key); } return false; } /*! @~english @class Dtk::Core::DDesktopEntry \inmodule dtkcore @brief Handling desktop entry files. DDesktopEntry provide method for handling XDG desktop entry read and write. The interface of this class is similar to QSettings. For more details about the spec itself, please refer to: https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html */ DDesktopEntry::DDesktopEntry(const QString &filePath) noexcept : d_ptr(new DDesktopEntryPrivate(filePath, this)) { } DDesktopEntry::~DDesktopEntry() { } /*! @~english @brief Write back data to the desktop entry file. @return true if write success; otherwise returns false. */ bool DDesktopEntry::save() const { Q_D(const DDesktopEntry); // write to file. if (d->isWritable()) { bool ok = false; bool createFile = false; QFileInfo fileInfo(d->filePath); #if !defined(QT_BOOTSTRAPPED) && QT_CONFIG(temporaryfile) QSaveFile sf(d->filePath); sf.setDirectWriteFallback(true); #else QFile sf(d->filePath); #endif if (!sf.open(QIODevice::WriteOnly)) { d->setStatus(DDesktopEntry::AccessError); return false; } ok = d->write(sf); #if !defined(QT_BOOTSTRAPPED) && QT_CONFIG(temporaryfile) if (ok) { ok = sf.commit(); } #endif if (ok) { // If we have created the file, apply the file perms if (createFile) { QFile::Permissions perms = fileInfo.permissions() | QFile::ReadOwner | QFile::WriteOwner | QFile::ReadGroup | QFile::ReadOther; QFile(d->filePath).setPermissions(perms); } return true; } else { d->setStatus(DDesktopEntry::AccessError); return false; } } return false; } /*! @~english @brief Get data parse status @return Returns a status code indicating the first error that was met by DDesktopEntry, or QSettings::NoError if no error occurred. Be aware that DDesktopEntry delays performing some operations. */ DDesktopEntry::Status DDesktopEntry::status() const { Q_D(const DDesktopEntry); return d->status; } /*! @~english @brief Get a list of all section keys inside the given \a section. @return all available section keys. */ QStringList DDesktopEntry::keys(const QString §ion) const { Q_D(const DDesktopEntry); if (section.isEmpty()) { qWarning("DDesktopEntry::keys: Empty section name passed"); return {}; } return d->keys(section); } /*! @~english @brief Get a list of all section groups inside the desktop entry. If \a sorted is set to true, the returned result will keep the order as-is when reading the entry file. @return all available section groups. */ QStringList DDesktopEntry::allGroups(bool sorted) const { Q_D(const DDesktopEntry); if (!sorted) { return d->sectionsMap.keys(); } else { using StrIntPair = QPair; QStringList keys = d->sectionsMap.keys(); QList result; for (const QString & key : keys) { result << StrIntPair(key, d->sectionPos(key)); } std::sort(result.begin(), result.end(), [](const StrIntPair& a, const StrIntPair& b) -> bool { return a.second < b.second; }); keys.clear(); for (const StrIntPair& pair : result) { keys << pair.first; } return keys; } } /*! @~english @brief Check if the desktop entry file have the given \a section contains the given \a key @return true if the desktop entry contains the \a key in \a section; otherwise returns false. */ bool DDesktopEntry::contains(const QString &key, const QString §ion) const { Q_D(const DDesktopEntry); if (key.isEmpty() || section.isEmpty()) { qWarning("DDesktopEntry::contains: Empty key or section passed"); return false; } return d->contains(section, key); } /*! @~english @brief Returns the localized string value of the "Name" key under "Desktop Entry" section. It's equivalent to calling localizedValue("Name"). @return Returns the localized string value of the "Name" key under "Desktop Entry" section. @sa localizedValue(), genericName(), ddeDisplayName() */ QString DDesktopEntry::name() const { return localizedValue(QStringLiteral("Name")); } /*! @~english @brief Returns the localized string value of the "GenericName" key under "Desktop Entry" section. It's equivalent to calling localizedValue("GenericName"). It will NOT fallback to "Name" if "GenericName" is not existed. @return Returns the localized string value of the "GenericName" key under "Desktop Entry" section. @sa localizedValue(), name(), ddeDisplayName() */ QString DDesktopEntry::genericName() const { return localizedValue(QStringLiteral("GenericName")); } /*! @~english @brief Display name specially for DDE applications. This will check "X-Deepin-Vendor" and will return the localized string value of "GenericName" if "X-Deepin-Vendor" is "deepin", or it will return the localized string value of "Name". @return Returns the display name specially for DDE applications. @sa localizedValue(), name(), genericName() */ QString DDesktopEntry::ddeDisplayName() const { QString deepinVendor = stringValue("X-Deepin-Vendor"); QString genericNameStr = genericName(); if (deepinVendor == QStringLiteral("deepin") && !genericNameStr.isEmpty()) { return genericNameStr; } return name(); } /*! @~english @brief Returns the localized string value of the "Comment" key under "Desktop Entry" section. It's equivalent to calling localizedValue("Comment"). @return Returns the localized string value of the "Comment" key under "Desktop Entry" section. @sa localizedValue() */ QString DDesktopEntry::comment() const { return localizedValue(QStringLiteral("Comment")); } /*! @~english @brief Returns the raw string value associated with the given \a key in \a section. If the entry contains no item with the key, the function returns a constructed \a defaultValue. @return Returns the raw string value associated with the given \a key in \a section. @sa stringValue() localizedValue() stringListValue() */ QString DDesktopEntry::rawValue(const QString &key, const QString §ion, const QString &defaultValue) const { Q_D(const DDesktopEntry); QString result = defaultValue; if (key.isEmpty() || section.isEmpty()) { qWarning("DDesktopEntry::value: Empty key or section passed"); return result; } const_cast(d)->get(section, key, &result); // FIXME: better way than const_cast? return result; } /*! @~english @brief Returns the unescaped string value associated with the given \a key in \a section. If the entry contains no item with the key, the function returns a constructed \a defaultValue. @return Returns the unescaped string value associated with the given \a key in \a section. @sa rawValue() localizedValue() stringListValue() */ QString DDesktopEntry::stringValue(const QString &key, const QString §ion, const QString &defaultValue) const { QString rawResult = rawValue(key, section, defaultValue); rawResult = DDesktopEntry::unescape(rawResult); return rawResult; } /*! @~english @brief Returns the localized string value associated with the given \a key and \a localeKey in \a section. If the given \a localeKey can't be found, it will fallback to "C", if still cannot found, will fallback to the key without localeKey. If the entry contains no item with the key, the function returns a constructed \a defaultValue. @return Returns the localized string value associated with the given \a key and \a localeKey in \a section. @sa rawValue() stringValue() stringListValue() */ QString DDesktopEntry::localizedValue(const QString &key, const QString &localeKey, const QString §ion, const QString &defaultValue) const { Q_D(const DDesktopEntry); QString result = defaultValue; QString actualLocaleKey = QLatin1String("C"); if (key.isEmpty() || section.isEmpty()) { qWarning("DDesktopEntry::localizedValue: Empty key or section passed"); return result; } QStringList possibleKeys; // 此处添加 bcp47Name() 是为了兼容 desktop 文件中的语言长短å��è§£æž�。 // 比如芬兰语,有 [fi] å’Œ [fi_FI] 两ç§�情况,QLocale::name() 对应 fi_FI,QLocale::bcp47Name() 对应 fi。 if (!localeKey.isEmpty()) { if (localeKey == "empty") { possibleKeys << key; } else if (localeKey == "default") { possibleKeys << QString("%1[%2]").arg(key, QLocale().name()); possibleKeys << QString("%1[%2]").arg(key, QLocale().bcp47Name()); } else if (localeKey == "system") { possibleKeys << QString("%1[%2]").arg(key, QLocale::system().name()); possibleKeys << QString("%1[%2]").arg(key, QLocale::system().bcp47Name()); } else { possibleKeys << QString("%1[%2]").arg(key, localeKey); } } if (!actualLocaleKey.isEmpty()) { possibleKeys << QString("%1[%2]").arg(key, actualLocaleKey); } possibleKeys << QString("%1[%2]").arg(key, "C"); possibleKeys << key; for (const QString &oneKey : possibleKeys) { if (d->contains(section, oneKey)) { const_cast(d)->get(section, oneKey, &result); break; } } return result; } /*! @~english @brief Returns the localized string value associated with the given \a key and \a locale in \a section. If the given \a locale can't be found, it will fallback to "C", if still cannot found, will fallback to the key without a locale key. If the entry contains no item with the key, the function returns a default-constructed value. @return Returns the localized string value associated with the given \a key and \a locale in \a section. @sa rawValue() stringValue() stringListValue() */ QString DDesktopEntry::localizedValue(const QString &key, const QLocale &locale, const QString §ion, const QString &defaultValue) const { return localizedValue(key, locale.name(), section, defaultValue); } /*! @~english @brief Returns a list of strings associated with the given \a key in the given \a section. If the entry contains no item with the key, the function returns a empty string list. @return Returns a list of strings associated with the given \a key in the given \a section. @sa rawValue() stringValue() localizedValue() */ QStringList DDesktopEntry::stringListValue(const QString &key, const QString §ion) const { Q_D(const DDesktopEntry); QString value; const_cast(d)->get(section, key, &value); if (value.endsWith(';')) { value = value.left(value.length() - 1); } QStringList&& strings = value.split(';'); QString combine; QStringList result; for (QString oneStr : strings) { if (oneStr.endsWith('\\')) { combine = combine + oneStr + ';'; continue; } if (!combine.isEmpty()) { oneStr = combine + oneStr; combine.clear(); } result << DDesktopEntry::unescape(oneStr, true); } return result; } bool DDesktopEntry::setRawValue(const QString &value, const QString &key, const QString §ion) { Q_D(DDesktopEntry); if (key.isEmpty() || section.isEmpty()) { qWarning("DDesktopEntry::setRawValue: Empty key or section passed"); return false; } bool result = d->set(section, key, value); return result; } bool DDesktopEntry::setStringValue(const QString &value, const QString &key, const QString §ion) { QString escapedValue = value; DDesktopEntry::escape(escapedValue); bool result = setRawValue(escapedValue, key, section); return result; } bool DDesktopEntry::setLocalizedValue(const QString &value, const QString &localeKey, const QString &key, const QString §ion) { Q_D(DDesktopEntry); if (key.isEmpty() || section.isEmpty()) { qWarning("DDesktopEntry::setLocalizedValue: Empty key or section passed"); return false; } QString actualKey = localeKey.isEmpty() ? key : QString("%1[%2]").arg(key, localeKey); bool result = d->set(section, actualKey, value); return result; } bool DDesktopEntry::removeEntry(const QString &key, const QString §ion) { Q_D(DDesktopEntry); if (key.isEmpty() || section.isEmpty()) { qWarning("DDesktopEntry::setLocalizedValue: Empty key or section passed"); return false; } bool result = d->remove(section, key); return result; } /************************************************ The escape sequences \s, \n, \t, \r, and \\ are supported for values of type string and localestring, meaning ASCII space, newline, tab, carriage return, and backslash, respectively. ************************************************/ QString &DDesktopEntry::escape(QString &str) { QHash repl; repl.insert(QLatin1Char('\n'), QLatin1Char('n')); repl.insert(QLatin1Char('\t'), QLatin1Char('t')); repl.insert(QLatin1Char('\r'), QLatin1Char('r')); return doEscape(str, repl); } /************************************************ Quoting must be done by enclosing the argument between double quotes and escaping the double quote character, backtick character ("`"), dollar sign ("$") and backslash character ("\") by preceding it with an additional backslash character. Implementations must undo quoting before expanding field codes and before passing the argument to the executable program. Note that the general escape rule for values of type string states that the backslash character can be escaped as ("\\") as well and that this escape rule is applied before the quoting rule. As such, to unambiguously represent a literal backslash character in a quoted argument in a desktop entry file requires the use of four successive backslash characters ("\\\\"). Likewise, a literal dollar sign in a quoted argument in a desktop entry file is unambiguously represented with ("\\$"). ************************************************/ QString &DDesktopEntry::escapeExec(QString &str) { QHash repl; // The parseCombinedArgString() splits the string by the space symbols, // we temporarily replace them on the special characters. // Replacement will reverse after the splitting. repl.insert(QLatin1Char('"'), QLatin1Char('"')); // double quote, repl.insert(QLatin1Char('\''), QLatin1Char('\'')); // single quote ("'"), repl.insert(QLatin1Char('\\'), QLatin1Char('\\')); // backslash character ("\"), repl.insert(QLatin1Char('$'), QLatin1Char('$')); // dollar sign ("$"), return doEscape(str, repl); } /* The escape sequences \s, \n, \t, \r, and \\ are supported for values of type string and localestring, meaning ASCII space, newline, tab, carriage return, and backslash, respectively. Some keys can have multiple values. In such a case, the value of the key is specified as a plural: for example, string(s). The multiple values should be separated by a semicolon and the value of the key may be optionally terminated by a semicolon. Trailing empty strings must always be terminated with a semicolon. Semicolons in these values need to be escaped using \;. https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#value-types */ QString &DDesktopEntry::unescape(QString &str, bool unescapeSemicolons) { QHash repl; repl.insert(QLatin1Char('\\'), QLatin1Char('\\')); repl.insert(QLatin1Char('s'), QLatin1Char(' ')); repl.insert(QLatin1Char('n'), QLatin1Char('\n')); repl.insert(QLatin1Char('t'), QLatin1Char('\t')); repl.insert(QLatin1Char('r'), QLatin1Char('\r')); if (unescapeSemicolons) { repl.insert(QLatin1Char(';'), QLatin1Char(';')); } return doUnescape(str, repl); } /************************************************ Quoting must be done by enclosing the argument between double quotes and escaping the double quote character, backtick character ("`"), dollar sign ("$") and backslash character ("\") by preceding it with an additional backslash character. Implementations must undo quoting before expanding field codes and before passing the argument to the executable program. Reserved characters are space (" "), tab, newline, double quote, single quote ("'"), backslash character ("\"), greater-than sign (">"), less-than sign ("<"), tilde ("~"), vertical bar ("|"), ampersand ("&"), semicolon (";"), dollar sign ("$"), asterisk ("*"), question mark ("?"), hash mark ("#"), parenthesis ("(") and (")") backtick character ("`"). Note that the general escape rule for values of type string states that the backslash character can be escaped as ("\\") as well and that this escape rule is applied before the quoting rule. As such, to unambiguously represent a literal backslash character in a quoted argument in a desktop entry file requires the use of four successive backslash characters ("\\\\"). Likewise, a literal dollar sign in a quoted argument in a desktop entry file is unambiguously represented with ("\\$"). ************************************************/ QString &DDesktopEntry::unescapeExec(QString &str) { unescape(str); QHash repl; // The parseCombinedArgString() splits the string by the space symbols, // we temporarily replace them on the special characters. // Replacement will reverse after the splitting. repl.insert(QLatin1Char(' '), QChar::fromLatin1(01)); // space repl.insert(QLatin1Char('\t'), QChar::fromLatin1(02)); // tab repl.insert(QLatin1Char('\n'), QChar::fromLatin1(03)); // newline, repl.insert(QLatin1Char('"'), QLatin1Char('"')); // double quote, repl.insert(QLatin1Char('\''), QLatin1Char('\'')); // single quote ("'"), repl.insert(QLatin1Char('\\'), QLatin1Char('\\')); // backslash character ("\"), repl.insert(QLatin1Char('>'), QLatin1Char('>')); // greater-than sign (">"), repl.insert(QLatin1Char('<'), QLatin1Char('<')); // less-than sign ("<"), repl.insert(QLatin1Char('~'), QLatin1Char('~')); // tilde ("~"), repl.insert(QLatin1Char('|'), QLatin1Char('|')); // vertical bar ("|"), repl.insert(QLatin1Char('&'), QLatin1Char('&')); // ampersand ("&"), repl.insert(QLatin1Char(';'), QLatin1Char(';')); // semicolon (";"), repl.insert(QLatin1Char('$'), QLatin1Char('$')); // dollar sign ("$"), repl.insert(QLatin1Char('*'), QLatin1Char('*')); // asterisk ("*"), repl.insert(QLatin1Char('?'), QLatin1Char('?')); // question mark ("?"), repl.insert(QLatin1Char('#'), QLatin1Char('#')); // hash mark ("#"), repl.insert(QLatin1Char('('), QLatin1Char('(')); // parenthesis ("(") repl.insert(QLatin1Char(')'), QLatin1Char(')')); // parenthesis (")") repl.insert(QLatin1Char('`'), QLatin1Char('`')); // backtick character ("`"). return doUnescape(str, repl); } bool DDesktopEntry::setStatus(const DDesktopEntry::Status &status) { Q_D(DDesktopEntry); d->setStatus(status); return true; } DCORE_END_NAMESPACE dtkcore-6.7.46/src/dlicenseinfo.cpp000066400000000000000000000136031522615770400172220ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dlicenseinfo.h" #include #include #include #include #include #include #include #include DCORE_BEGIN_NAMESPACE // /usr/share/spdx-licenses constexpr auto SystemLicenseDir = "spdx-licenses"; constexpr auto CustomLicenseDir = "custom-licenses"; constexpr auto SystemConfigDir = "deepin/credits"; class DLicenseInfo::DComponentInfoPrivate : public DObjectPrivate { public: QString name; QString version; QString copyRight; QString licenseName; protected: explicit DComponentInfoPrivate(DLicenseInfo::DComponentInfo *qq) : DObjectPrivate(qq) { } private: Q_DECLARE_PUBLIC(DLicenseInfo::DComponentInfo) friend class DLicenseInfoPrivate; }; DLicenseInfo::DComponentInfo::DComponentInfo(DObject * parent) : DObject(*new DLicenseInfo::DComponentInfoPrivate(this), parent) { } DLicenseInfo::DComponentInfo::~DComponentInfo() { } QString DLicenseInfo::DComponentInfo::name() const { return d_func()->name; } QString DLicenseInfo::DComponentInfo::version() const { return d_func()->version; } QString DLicenseInfo::DComponentInfo::copyRight() const { return d_func()->copyRight; } QString DLicenseInfo::DComponentInfo::licenseName() const { return d_func()->licenseName; } class Q_DECL_HIDDEN DLicenseInfoPrivate : public DObjectPrivate { public: explicit DLicenseInfoPrivate(DLicenseInfo *qq); ~DLicenseInfoPrivate() override; bool loadFile(const QString &file); bool loadContent(const QByteArray &content); QByteArray licenseContent(const QString &licenseName); void clear(); QString licenseSearchPath; DLicenseInfo::DComponentInfos componentInfos; }; DLicenseInfoPrivate::DLicenseInfoPrivate(DLicenseInfo *qq) : DObjectPrivate(qq) { } DLicenseInfoPrivate::~DLicenseInfoPrivate() { clear(); } bool DLicenseInfoPrivate::loadFile(const QString &file) { clear(); if (file.isEmpty()) { const QString relPath = QString("%1/%2.json").arg(SystemConfigDir, qApp->applicationName()); for (const QString &dataDir : QStandardPaths::standardLocations(QStandardPaths::GenericDataLocation)) { const QString file = dataDir + '/' + relPath; if (QFile::exists(file)) return loadFile(file); } return false; } QFile jsonFile(file); if (!jsonFile.open(QIODevice::ReadOnly)) { qWarning() << QString("Failed on open file: \"%1\", error message: \"%2\"").arg( qPrintable(jsonFile.fileName()), qPrintable(jsonFile.errorString())); return false; } return loadContent(jsonFile.readAll()); } bool DLicenseInfoPrivate::loadContent(const QByteArray &content) { QJsonParseError error; QJsonDocument jsonDoc = QJsonDocument::fromJson(content, &error); if (error.error != QJsonParseError::NoError) { qWarning() << "When loading the license, parseJson failed:" << qPrintable(error.errorString()); return false; } if (!jsonDoc.isArray()) { qWarning() << "When loading the license, parseJson failed: it is not a JSON array"; return false; } clear(); QJsonArray array = jsonDoc.array(); for (const QJsonValue &value : array) { if (!value.isObject()) { qWarning() << "When loading the license, parseJson failed: it is not a JSON object!"; return false; } DLicenseInfo::DComponentInfo *componentInfo = new DLicenseInfo::DComponentInfo; QJsonObject obj = value.toObject(); QJsonValue name = obj.value("name"); QJsonValue version = obj.value("version"); QJsonValue copyright = obj.value("copyright"); QJsonValue license = obj.value("license"); if (!name.isString() || !version.isString() || !copyright.isString() || !license.isString()) { qWarning() << "When loading the license, parseJson failed: it is not a string!"; return false; } componentInfo->d_func()->name = name.toString(); componentInfo->d_func()->version = version.toString(); componentInfo->d_func()->copyRight = copyright.toString(); componentInfo->d_func()->licenseName = license.toString(); componentInfos.append(componentInfo); } return true; } QByteArray DLicenseInfoPrivate::licenseContent(const QString &licenseName) { const QStringList dataDirs = QStandardPaths::standardLocations(QStandardPaths::GenericDataLocation); QStringList searchDirs; if (!licenseSearchPath.isEmpty()) searchDirs << licenseSearchPath; for (const QString &dataDir : dataDirs) for (const auto *dir : {CustomLicenseDir, SystemLicenseDir}) searchDirs << (dataDir + '/' + dir); for (const QString &dir : searchDirs) { QFile file(dir + '/' + licenseName + ".txt"); if (file.open(QIODevice::ReadOnly)) return file.readAll(); } return {}; } void DLicenseInfoPrivate::clear() { qDeleteAll(componentInfos); componentInfos.clear(); } DLicenseInfo::DLicenseInfo(DObject *parent) : DObject(*new DLicenseInfoPrivate(this), parent) { } bool DLicenseInfo::loadContent(const QByteArray &content) { D_D(DLicenseInfo); return d->loadContent(content); } bool DLicenseInfo::loadFile(const QString &file) { D_D(DLicenseInfo); return d->loadFile(file); } void DLicenseInfo::setLicenseSearchPath(const QString &path) { D_D(DLicenseInfo); d->licenseSearchPath = path; } QByteArray DLicenseInfo::licenseContent(const QString &licenseName) { D_D(DLicenseInfo); return d->licenseContent(licenseName); } DLicenseInfo::DComponentInfos DLicenseInfo::componentInfos() const { D_DC(DLicenseInfo); return d->componentInfos; } DCORE_END_NAMESPACE dtkcore-6.7.46/src/dsecurestring.cpp000066400000000000000000000006101522615770400174330ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2019 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dsecurestring.h" #include "dutil.h" #include DCORE_BEGIN_NAMESPACE DSecureString::DSecureString(const QString &other) noexcept : QString(other) { } DSecureString::~DSecureString() { DUtil::SecureErase(*this); } DCORE_END_NAMESPACE dtkcore-6.7.46/src/dsgapplication.cpp000066400000000000000000000241211522615770400175560ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022-2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dsgapplication.h" #include #include #include #include #include #include #include #include #include #include #ifdef QT_DEBUG Q_LOGGING_CATEGORY(dsgApp, "dtk.core.dsg") #else Q_LOGGING_CATEGORY(dsgApp, "dtk.core.dsg", QtInfoMsg) #endif DCORE_BEGIN_NAMESPACE // D-Bus resource deleters for RAII management static void dbusErrorDeleter(DBusError *error) { if (error) { dbus_error_free(error); delete error; } } static void dbusConnectionDeleter(DBusConnection *conn) { if (conn) dbus_connection_unref(conn); } static void dbusMessageDeleter(DBusMessage *msg) { if (msg) dbus_message_unref(msg); } // D-Bus utility functions using libdbus-1 static bool checkDBusServiceActivatable(const QByteArray &service) { auto error = std::unique_ptr(new DBusError, dbusErrorDeleter); dbus_error_init(error.get()); DBusConnection *connection = dbus_bus_get(DBUS_BUS_SESSION, error.get()); if (dbus_error_is_set(error.get())) { qCWarning(dsgApp) << "Failed to connect to session bus:" << error->message; return false; } if (!connection) { qCWarning(dsgApp) << "Failed to get session bus connection"; return false; } auto connGuard = std::unique_ptr(connection, dbusConnectionDeleter); // Create method call to check if service is registered DBusMessage *msg = dbus_message_new_method_call( "org.freedesktop.DBus", "/org/freedesktop/DBus", "org.freedesktop.DBus", "NameHasOwner" ); if (!msg) { qCWarning(dsgApp) << "Failed to create D-Bus message"; return false; } auto msgGuard = std::unique_ptr(msg, dbusMessageDeleter); { const char *serviceName = service.constData(); if (!dbus_message_append_args(msg, DBUS_TYPE_STRING, &serviceName, DBUS_TYPE_INVALID)) { qCWarning(dsgApp) << "Failed to append arguments to D-Bus message"; return false; } } // Send message and get reply DBusMessage *reply = dbus_connection_send_with_reply_and_block(connection, msg, 1000, error.get()); msgGuard.reset(); // msg is consumed by the call if (dbus_error_is_set(error.get())) { qCWarning(dsgApp) << "D-Bus call failed:" << error->message; return false; } if (!reply) { qCWarning(dsgApp) << "No reply received from D-Bus"; return false; } auto replyGuard = std::unique_ptr(reply, dbusMessageDeleter); dbus_bool_t hasOwner = FALSE; if (!dbus_message_get_args(reply, error.get(), DBUS_TYPE_BOOLEAN, &hasOwner, DBUS_TYPE_INVALID)) { qCWarning(dsgApp) << "Failed to parse D-Bus reply:" << error->message; return false; } if (!hasOwner) { return false; } // Check if service is activatable DBusMessage *msg2 = dbus_message_new_method_call( "org.freedesktop.DBus", "/org/freedesktop/DBus", "org.freedesktop.DBus", "ListActivatableNames" ); if (!msg2) { qCWarning(dsgApp) << "Failed to create ListActivatableNames message"; return false; } auto msg2Guard = std::unique_ptr(msg2, dbusMessageDeleter); DBusMessage *reply2 = dbus_connection_send_with_reply_and_block(connection, msg2, 1000, error.get()); if (dbus_error_is_set(error.get())) { qCWarning(dsgApp) << "ListActivatableNames call failed:" << error->message; return false; } if (!reply2) { return false; } auto reply2Guard = std::unique_ptr(reply2, dbusMessageDeleter); DBusMessageIter iter, array_iter; dbus_message_iter_init(reply2, &iter); if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY) { return false; } dbus_message_iter_recurse(&iter, &array_iter); bool found = false; while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_STRING) { const char *name; dbus_message_iter_get_basic(&array_iter, &name); if (service == name) { found = true; break; } dbus_message_iter_next(&array_iter); } return found; } static QByteArray callDBusIdentifyMethod(const QByteArray &serviceName, const QByteArray &path, const QByteArray &interface, int pidfd) { auto error = std::unique_ptr(new DBusError, dbusErrorDeleter); dbus_error_init(error.get()); DBusConnection *connection = dbus_bus_get(DBUS_BUS_SESSION, error.get()); if (dbus_error_is_set(error.get())) { qCWarning(dsgApp) << "Failed to connect to session bus:" << error->message; return QByteArray(); } if (!connection) { qCWarning(dsgApp) << "Failed to get session bus connection"; return QByteArray(); } auto connGuard = std::unique_ptr(connection, dbusConnectionDeleter); // Create method call - string data is now managed by caller DBusMessage *msg = dbus_message_new_method_call( serviceName.constData(), path.constData(), interface.constData(), "Identify" ); if (!msg) { qCWarning(dsgApp) << "Failed to create D-Bus message"; return QByteArray(); } auto msgGuard = std::unique_ptr(msg, dbusMessageDeleter); // Append Unix file descriptor if (!dbus_message_append_args(msg, DBUS_TYPE_UNIX_FD, &pidfd, DBUS_TYPE_INVALID)) { qCWarning(dsgApp) << "Failed to append Unix FD to D-Bus message"; return QByteArray(); } // Send message and get reply DBusMessage *reply = dbus_connection_send_with_reply_and_block(connection, msg, 5000, error.get()); msgGuard.reset(); // msg is consumed by the call if (dbus_error_is_set(error.get())) { qCWarning(dsgApp) << "Identify from AM failed:" << error->message; return QByteArray(); } if (!reply) { qCWarning(dsgApp) << "No reply received from Identify method"; return QByteArray(); } auto replyGuard = std::unique_ptr(reply, dbusMessageDeleter); const char *result; if (!dbus_message_get_args(reply, error.get(), DBUS_TYPE_STRING, &result, DBUS_TYPE_INVALID)) { qCWarning(dsgApp) << "Failed to parse Identify reply:" << error->message; return QByteArray(); } QByteArray appId = QByteArray(result); qCInfo(dsgApp) << "AppId is fetched from AM, and value is " << appId; return appId; } static inline QByteArray getSelfAppId() { // The env is set by the application starter(eg, org.desktopspec.ApplicationManager service) QByteArray selfId = qgetenv("DSG_APP_ID"); if (!selfId.isEmpty()) return selfId; return DSGApplication::getId(QCoreApplication::applicationPid()); } static bool isServiceActivatable(const QByteArray &service) { return checkDBusServiceActivatable(service); } // Format appId to valid. static QByteArray formatAppId(const QByteArray &appId) { static const QRegularExpression regex("[^\\w\\-\\.]"); QString format(appId); format.replace(QDir::separator(), "."); format = format.replace(regex, QStringLiteral("-")); const QString InvalidPrefix{"."}; if (format.startsWith(InvalidPrefix)) format = format.mid(InvalidPrefix.size()); return format.toLocal8Bit(); } QByteArray DSGApplication::id() { static QByteArray selfId = getSelfAppId(); if (!selfId.isEmpty()) return selfId; QByteArray result = selfId; if (!qEnvironmentVariableIsSet("DTK_DISABLED_FALLBACK_APPID")) { result = QCoreApplication::applicationName().toLocal8Bit(); if (result.isEmpty()) { QFile file("/proc/self/cmdline"); if (file.open(QIODevice::ReadOnly)) result = file.readLine(); } if (result.isEmpty()) { const QFileInfo file(QFile::symLinkTarget("/proc/self/exe")); if (file.exists()) result = file.absoluteFilePath().toLocal8Bit(); } if (!result.isEmpty()) { result = formatAppId(result); qCDebug(dsgApp) << "The applicatiion ID is fallback to " << result; } } if (result.isEmpty()) qCWarning(dsgApp) << "The application ID is empty."; return result; } /** * Get application ID for a given process ID * * This function has been updated to use libdbus-1 instead of Qt D-Bus to fix * the bug(pms:BUG-278055) where calling this function before QCoreApplication * initialization would fail. This is particularly important when the service * is being started by D-Bus activation and DSGApplication::id() is called * during early startup. * * @param pid Process ID to get the application ID for * @return Application ID as QByteArray, or empty array on failure */ QByteArray DSGApplication::getId(qint64 pid) { if (!isServiceActivatable("org.desktopspec.ApplicationManager1")) { qCInfo(dsgApp) << "Can't getId from AM for the " << pid << ", because AM is unavailable."; return QByteArray(); } int pidfd = syscall(SYS_pidfd_open, pid, 0); if (pidfd < 0) { qCWarning(dsgApp) << "pidfd open failed:" << strerror(errno) << ", the pid:" << pid; return QByteArray(); } QByteArray appId = callDBusIdentifyMethod("org.desktopspec.ApplicationManager1", "/org/desktopspec/ApplicationManager1", "org.desktopspec.ApplicationManager1", pidfd); // see QDBusUnixFileDescriptor: The original file descriptor is not touched and must be closed by the user. close(pidfd); return appId; } DCORE_END_NAMESPACE dtkcore-6.7.46/src/dsysinfo.cpp000066400000000000000000001204151522615770400164160ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dsysinfo.h" #include "ddesktopentry.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef Q_OS_LINUX #include #include #include #endif #define OS_VERSION_FILE DSYSINFO_PREFIX"/etc/os-version" #define LSB_RELEASE_FILE DSYSINFO_PREFIX"/etc/lsb-release" #define OS_RELEASE_FILE DSYSINFO_PREFIX"/etc/os-release" #define DEEPIN_VERSION_FILE DSYSINFO_PREFIX"/etc/deepin-version" static inline bool inTest() { return !QLatin1String(DSYSINFO_PREFIX).isEmpty(); } DCORE_BEGIN_NAMESPACE #ifdef QT_DEBUG Q_LOGGING_CATEGORY(logSysInfo, "dtk.dsysinfo") #else Q_LOGGING_CATEGORY(logSysInfo, "dtk.dsysinfo", QtInfoMsg) #endif class Q_DECL_HIDDEN DSysInfoPrivate { public: DSysInfoPrivate(); mutable QMutex mutex; #ifdef Q_OS_LINUX void ensureDeepinInfo(); bool ensureOsVersion(); void ensureDistributionInfo(); bool splitA_BC_DMode(); #endif void ensureReleaseInfo(); void ensureComputerInfo(); QMap parseInfoFile(QFile &file); QMap parseInfoContent(const QString &content); #ifdef Q_OS_LINUX DSysInfo::DeepinType deepinType = DSysInfo::DeepinType(-1); QMap deepinTypeMap; //Type Name with Language QString deepinVersion; QString deepinEdition; QString deepinCopyright; QString majorVersion; QString minorVersion; struct MinVersion { enum Type { A_BC_D, /*!< Professional Edition*/ X_Y_Z, /*!< Home Edition*/ A_B_C /*!< Community Edition*/ }; MinVersion() : A(0) , B(0) , BC(0) , C(0) , D(0) , X(0) , Y(0) , Z(0) { } uint A, B, BC, C, D; // A-BC-D uint X, Y, Z; Type type; }; struct OSBuild { OSBuild():A(0), B(0), C(0), D(0), xyz(100){ } /* ABCDE.xyz模å¼� 系统构建å�· A B C D E x yz 值å�«ä¹‰ æ“�作系统产å“�的大版本代å�· 产å“�线类型 功能å°�版本 产å“�线版本 处ç�†å™¨æž¶æž„ 固定值 è¡¥ä¸�å°�版本 值ä½�æ•° 1 1 1 1 1 1 2 值范围 ------------------------- 0~9ã€�A~Z --------------------------- 1 00~99,AA~ZZ */ uint A, B, C, D, E, xyz; }; MinVersion minVersion; OSBuild osBuild; #endif QScopedPointer distributionInfo; DSysInfo::ProductType productType = DSysInfo::ProductType(-1); QString prettyName; QString productTypeString; QString productVersion; QString computerName; QString cpuModelName; qint64 memoryAvailableSize = -1; qint64 memoryInstalledSize = -1; qint64 diskSize = 0; }; DSysInfoPrivate::DSysInfoPrivate() { } #ifdef Q_OS_LINUX void DSysInfoPrivate::ensureDistributionInfo() { if (distributionInfo) return; const QString distributionInfoFile(DSysInfo::distributionInfoPath()); // Generic DDE distribution info distributionInfo.reset(new DDesktopEntry(distributionInfoFile)); } bool DSysInfoPrivate::splitA_BC_DMode() { // A-BC-D bool ok = false; uint minv = minorVersion.toUInt(&ok); if (ok) { minVersion.D = minv % 10; } else if (minorVersion.length() > 0) { const QString D = minorVersion.right(1); const QChar ch = D.at(0); if (ch.isDigit()) { minVersion.D = static_cast(ch.unicode() - '0'); } else if (ch >= 'A' && ch <= 'Z') { // 0-9...A-Z -> 10..35 minVersion.D = 10 + static_cast(ch.unicode() - 'A'); } else { qWarning() << "invalid minorVersion"; minVersion.D = 0; } } uint minVer = minorVersion.left(3).toUInt(); minVersion.BC = minVer % 100; minVer /= 100; minVersion.A = minVer % 10; minVersion.type = MinVersion::A_BC_D; return ok; } void DSysInfoPrivate::ensureDeepinInfo() { QMutexLocker locker(&mutex); if (static_cast(deepinType) > 0 && !inTest()) return; if (inTest()) deepinTypeMap.clear(); // clear cache for test QFile file(DEEPIN_VERSION_FILE); if (!file.open(QFile::ReadOnly)) { deepinType = DSysInfo::UnknownDeepin; return; } char buf[1024]; int buf_length = 0; Q_FOREVER { buf_length = file.readLine(buf, sizeof(buf)); if (buf_length < 0) break; const QByteArray line(buf, buf_length); const QByteArrayList &list = line.split('='); if (list.count() != 2) { continue; } const auto key_value = qMakePair(list.first().trimmed(), list.last().trimmed()); if (key_value.first == "Version") { deepinVersion = key_value.second; } else if (line.startsWith("Type")) { if (key_value.first == "Type") { deepinTypeMap[QString()] = QString::fromLatin1(key_value.second); } else if (key_value.first.at(4) == '[' && key_value.first.at(key_value.first.size() - 1) == ']') { const QByteArray &language = key_value.first.mid(5, key_value.first.size() - 6); if (!language.isEmpty()) { deepinTypeMap[QString::fromLatin1(language)] = QString::fromUtf8(key_value.second); } } } else if (key_value.first == "Edition") { deepinEdition = QString::fromUtf8(key_value.second); } else if (key_value.first == "Copyright") { deepinCopyright = QString::fromUtf8(key_value.second); } // deepinTypeMap may not parse finished(multi language) but !deepinTypeMap.isEmpty() // if (!deepinTypeMap.isEmpty() && !deepinEdition.isEmpty() && !deepinCopyright.isEmpty()) { // break; // } } file.close(); const QString &deepin_type = deepinTypeMap[QString()]; if (deepin_type.isEmpty()) { deepinType = DSysInfo::UnknownDeepin; } else if (deepin_type == "Desktop") { deepinType = DSysInfo::DeepinDesktop; } else if (deepin_type == "Professional") { deepinType = DSysInfo::DeepinProfessional; } else if (deepin_type == "Server") { deepinType = DSysInfo::DeepinServer; } else if (deepin_type == "Personal") { deepinType = DSysInfo::DeepinPersonal; } else if (deepin_type == "Military") { deepinType = DSysInfo::DeepinMilitary; } else { deepinType = DSysInfo::UnknownDeepin; } } bool DSysInfoPrivate::ensureOsVersion() { QMutexLocker locker(&mutex); #ifndef OS_VERSION_TEST_FILE // Always re-read the file when testing if (osBuild.A > 0 && !inTest()) return true; #endif DDesktopEntry entry(OS_VERSION_FILE); bool ok = false; #define D_ASSET_EXIT(con, msg) do { \ if (!(con)) { \ qWarning() << __func__ << msg; \ return false; \ } \ } while (false) D_ASSET_EXIT(entry.status() == DDesktopEntry::NoError, entry.status()); // 先获å�–版本信æ�¯ // ABCDE.xyz.abc QString osb = entry.stringValue("OsBuild", "Version"); QStringList osbs = osb.split("."); ok = (osbs.size() >= 2 && osbs.value(0).size() == 5); D_ASSET_EXIT(ok, "OsBuild version invalid!"); #if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) const QStringList &left = osbs.value(0).split(QString(), Qt::SkipEmptyParts); #else const QStringList &left = osbs.value(0).split(QString(), QString::SkipEmptyParts); #endif D_ASSET_EXIT(left.size() == 5, "OsBuild version(ls) invalid!"); int idx = 0; auto parseDigitOrAZ = [&](const QString &s, bool *outOk) -> uint { if (s.isEmpty()) { if (outOk) *outOk = false; return 0u; } const QChar ch = s.at(0); if (ch.isDigit()) { if (outOk) *outOk = true; return static_cast(ch.unicode() - '0'); } if (ch >= 'A' && ch <= 'Z') { if (outOk) *outOk = true; return static_cast(ch.toLatin1()); } if (outOk) *outOk = false; return 0u; }; osBuild.A = parseDigitOrAZ(left.value(idx++, "0"), &ok); D_ASSET_EXIT(ok, "OsBuild version(A) invalid!"); osBuild.B = parseDigitOrAZ(left.value(idx++, "0"), &ok); D_ASSET_EXIT(ok, "OsBuild version(B) invalid!"); osBuild.C = parseDigitOrAZ(left.value(idx++, "0"), &ok); D_ASSET_EXIT(ok, "OsBuild version(C) invalid!"); osBuild.D = parseDigitOrAZ(left.value(idx++, "0"), &ok); D_ASSET_EXIT(ok, "OsBuild version(D) invalid!"); osBuild.E = parseDigitOrAZ(left.value(idx++, "0"), &ok); D_ASSET_EXIT(ok, "OsBuild version(E) invalid!"); // xyz osBuild.xyz = osbs.value(1).trimmed().toUInt(&ok); majorVersion = entry.stringValue("MajorVersion", "Version"); minorVersion = entry.stringValue("MinorVersion", "Version"); switch (osBuild.D) { case 7: { // Home Edition uses the form of "full version number coding -x.y.z" const QStringList &versionList = minorVersion.split('.'); if (versionList.isEmpty()) { // If the reading fails, return it directly to empty qWarning() << "no minorVersion"; return false; } else if (versionList.length() == 2) { // Z is 0 minVersion.X = versionList.first().toUInt(); minVersion.Y = versionList.last().toUInt(); minVersion.Z = 0; } else if (versionList.length() == 3) { // X.Y.Z exists minVersion.X = versionList.at(0).toUInt(); minVersion.Y = versionList.at(1).toUInt(); minVersion.Z = versionList.at(2).toUInt(); } minVersion.type = MinVersion::X_Y_Z; } break; case 3: { // The community version uses the form of "full version number coding A.B.C" bool a_bc_dMode = false; const QStringList &versionList = minorVersion.split('.'); if (versionList.isEmpty()) { // If the reading fails, return it directly to empty qWarning() << "no minorVersion"; return false; } else if (versionList.length() == 1) { QString modeVersion = versionList.first(); if (modeVersion.length() == 2) { //A.B.C mode and B c are 0 minVersion.A = modeVersion.toUInt(); minVersion.B = 0; minVersion.C = 0; } else { // A_BC_D mode splitA_BC_DMode(); a_bc_dMode = true; } } else if (versionList.length() == 2) { // C=0 minVersion.A = versionList.first().toUInt(); minVersion.B = versionList.last().toUInt(); minVersion.C = 0; } else if (versionList.length() == 3) { // A.B.C exists minVersion.A = versionList.at(0).toUInt(); minVersion.B = versionList.at(1).toUInt(); minVersion.C = versionList.at(2).toUInt(); } if (!a_bc_dMode) minVersion.type = MinVersion::A_B_C; } break; default: { // A-BC-D ok = splitA_BC_DMode(); } break; } return ok; } static QString unquote(const QByteArray &value) { if (value.at(0) == '"' || value.at(0) == '\'') { return QString::fromLatin1(value.mid(1, value.size() - 2)); } return QString::fromLatin1(value); } static bool readEtcFile(DSysInfoPrivate *info, const char *filename, const QByteArray &idKey, const QByteArray &versionKey, const QByteArray &prettyNameKey) { QFile file(QString::fromLatin1(filename)); if (!file.open(QIODevice::ReadOnly)) { return false; } quint8 valid_data_count = 0; char buf[1024]; if (inTest()) { // for test clear cache info->productTypeString.clear(); info->productType = DSysInfo::UnknownType; } while (valid_data_count < 3) { int buf_length = file.readLine(buf, sizeof(buf)); if (buf_length < 0) break; const QByteArray line(buf, buf_length - 1); if (info->productTypeString.isEmpty() && line.startsWith(idKey)) { const QByteArray value(line.constData() + idKey.size()); info->productTypeString = unquote(value); ++valid_data_count; continue; } if (info->prettyName.isEmpty() && line.startsWith(prettyNameKey)) { const QByteArray value(line.constData() + prettyNameKey.size()); info->prettyName = unquote(value); ++valid_data_count; continue; } if (info->productVersion.isEmpty() && line.startsWith(versionKey)) { const QByteArray value(line.constData() + versionKey.size()); info->productVersion = unquote(value); ++valid_data_count; continue; } } file.close(); return valid_data_count != 0; } static bool readOsRelease(DSysInfoPrivate *info) { if (!readEtcFile(info, OS_RELEASE_FILE, "ID=", "VERSION_ID=", "PRETTY_NAME=")) return readEtcFile(info, DSYSINFO_PREFIX"/usr/lib/os-release", "ID=", "VERSION_ID=", "PRETTY_NAME="); return true; } static bool readLsbRelease(DSysInfoPrivate *info) { return readEtcFile(info, LSB_RELEASE_FILE, "DISTRIB_ID=", "DISTRIB_RELEASE=", "DISTRIB_DESCRIPTION="); } #endif void DSysInfoPrivate::ensureReleaseInfo() { QMutexLocker locker(&mutex); if (productType > 0 && !inTest()) { return; } #ifdef Q_OS_LINUX readOsRelease(this); readLsbRelease(this); if (productTypeString.isEmpty()) { productType = DSysInfo::UnknownType; } else { switch (productTypeString.at(0).unicode()) { case 'd': case 'D': if (productTypeString.compare("deepin", Qt::CaseInsensitive) == 0) { productType = DSysInfo::Deepin; } else if (productTypeString.compare("debian", Qt::CaseInsensitive) == 0) { productType = DSysInfo::Debian; } break; case 'a': case 'A': if (productTypeString.compare("arch", Qt::CaseInsensitive) == 0) productType = DSysInfo::ArchLinux; break; case 'c': case 'C': if (productTypeString.compare("centos", Qt::CaseInsensitive) == 0) productType = DSysInfo::CentOS; break; case 'f': case 'F': if (productTypeString.compare("fedora", Qt::CaseInsensitive) == 0) productType = DSysInfo::Fedora; break; case 'g': case 'G': if (productTypeString.compare("gentoo", Qt::CaseInsensitive) == 0) productType = DSysInfo::Gentoo; break; case 'l': case 'L': if (productTypeString.compare("linuxmint", Qt::CaseInsensitive) == 0) productType = DSysInfo::LinuxMint; break; case 'm': case 'M': if (productTypeString.compare("manjaro", Qt::CaseInsensitive) == 0) productType = DSysInfo::Manjaro; break; case 'n': case 'N': if (productTypeString.compare("nixos", Qt::CaseInsensitive) == 0) productType = DSysInfo::NixOS; break; case 'o': case 'O': if (productTypeString.compare("opensuse", Qt::CaseInsensitive) == 0) productType = DSysInfo::openSUSE; break; case 's': case 'S': if (productTypeString.compare("sailfishos", Qt::CaseInsensitive) == 0) productType = DSysInfo::SailfishOS; break; case 'u': case 'U': if (productTypeString.compare("ubuntu", Qt::CaseInsensitive) == 0) { productType = DSysInfo::Ubuntu; } else if (productTypeString.compare("uos", Qt::CaseInsensitive) == 0 || productTypeString.compare("UnionTech OS", Qt::CaseInsensitive) == 0) { productType = DSysInfo::Uos; } break; default: productType = DSysInfo::UnknownType; break; } } #endif } void DSysInfoPrivate::ensureComputerInfo() { #ifdef Q_OS_LINUX #endif } QMap DSysInfoPrivate::parseInfoFile(QFile &file) { QMap map; qint64 fileSize = file.size(); // 因为此类文件一般ä¸�会超过1M大å°�,超过1M大å°�大概率出现异常情况 // é�¿å…�文件内容异常导致出现问题,对文件大å°�å�šäº†é™�制 if (fileSize < 1024000) { QByteArray buff = file.readAll(); map = parseInfoContent(QString::fromLocal8Bit(buff)); } else { qCWarning(logSysInfo) << "Size is too big, is it broken? File :" << file.fileName() << ", size :" << fileSize; } return map; } QMap DSysInfoPrivate::parseInfoContent(const QString &content) { QMap map; QStringList lineContents = content.split("\n"); for (auto lineContent : lineContents) { const int index = lineContent.indexOf(':'); if (index != -1) { const QString key = lineContent.left(index); const QString value = lineContent.mid(index + 1); map.insert(key.trimmed(), value.trimmed()); } } return map; } Q_GLOBAL_STATIC(DSysInfoPrivate, siGlobal) QString DSysInfo::operatingSystemName() { siGlobal->ensureReleaseInfo(); return siGlobal->prettyName; } #ifdef Q_OS_LINUX /*! \brief Check current distro is Deepin or not. \note Uos will also return true. */ bool DSysInfo::isDeepin() { siGlobal->ensureReleaseInfo(); return productType() == Deepin || productType() == Uos; } bool DSysInfo::isDDE() { if (!DSysInfo::isDeepin()) { const QByteArray &xsd = qgetenv("XDG_SESSION_DESKTOP"); return !xsd.compare("deepin", Qt::CaseInsensitive) || !xsd.compare("DDE", Qt::CaseInsensitive); } siGlobal->ensureDeepinInfo(); return siGlobal->deepinType != UnknownDeepin; } DSysInfo::DeepinType DSysInfo::deepinType() { siGlobal->ensureDeepinInfo(); return siGlobal->deepinType; } QString DSysInfo::deepinTypeDisplayName(const QLocale &locale) { siGlobal->ensureDeepinInfo(); return siGlobal->deepinTypeMap.value(locale.name(), siGlobal->deepinTypeMap.value(QString())); } QString DSysInfo::deepinVersion() { siGlobal->ensureDeepinInfo(); return siGlobal->deepinVersion; } QString DSysInfo::deepinEdition() { siGlobal->ensureDeepinInfo(); return siGlobal->deepinEdition; } QString DSysInfo::deepinCopyright() { siGlobal->ensureDeepinInfo(); return siGlobal->deepinCopyright; } /*! @~english \brief Display system type [1: desktop] [2: server] [3: special devices] \note æ ¹æ�® osBuild.B 判断 */ DSysInfo::UosType DSysInfo::uosType() { if (!DSysInfo::isDeepin() && !inTest()) return UosTypeUnknown; siGlobal->ensureOsVersion(); UosType ost = UosTypeUnknown; if ((siGlobal->osBuild.B > UosTypeUnknown && siGlobal->osBuild.B < UosTypeCount)) { ost = static_cast(siGlobal->osBuild.B); } return ost; } /*! @~english \brief Editions: professional version/personal version/community version ... \note According to osbuild.b && osbuild.d */ DSysInfo::UosEdition DSysInfo::uosEditionType() { siGlobal->ensureOsVersion(); UosEdition ospt = UosEditionUnknown; if (siGlobal->osBuild.B == UosDesktop) { switch (siGlobal->osBuild.D) { case 1: return UosProfessional; case 2: case 7: //The new version of the family version (7) and the old version of the personal version (2) The same as the home does not modify the old logic (7) to ensure the adaptation of the old version return UosHome; case 3: return UosCommunity; case 4: case 9: return UosMilitary; case 5: return UosDeviceEdition; case 6: return UosEducation; default: break; } } else if (siGlobal->osBuild.B == UosServer) { switch (siGlobal->osBuild.D) { case 1: return UosEnterprise; case 2: return UosEnterpriseC; case 3: return UosEuler; case 4: return UosMilitaryS; case 5: return UosDeviceEdition; case 9: return UosEducation; // æœ�务器 教育版(UT-3-PP-PR-001_æ“�作系统标识与产å“�版本å�·è§„范_20250905) case 'A': return UosDefense; // æœ�务器 国防版 default: break; } } else if (siGlobal->osBuild.B == UosDevice){ ospt = UosEnterprise; // os-version 1.4 if B==Device then et=Enterprise } return ospt; } #if DTK_VERSION < DTK_VERSION_CHECK(6, 0, 0, 0) /*! @~english \brief Architecture information (using bit flags of a byte) ã€�0x8 sw64】ã€�0x4 mips64】ã€�0x2 arm64】ã€�0x1 amd64】 */ DSysInfo::UosArch DSysInfo::uosArch() { siGlobal->ensureOsVersion(); return static_cast(siGlobal->osBuild.E); } #endif static QString getUosVersionValue(const QString &key, const QLocale &locale) { DDesktopEntry entry(OS_VERSION_FILE); QString localKey = QString("%1[%2]").arg(key, locale.name()); return entry.stringValue(localKey, "Version", entry.stringValue(key, "Version")); } /*! @~english \brief Version name ProductType[xx] The corresponding value of the item, if you can't find the value of the corresponding language, use the value of the productType (desktop/server/device) \a locale Current system language */ QString DSysInfo::uosProductTypeName(const QLocale &locale) { return getUosVersionValue("ProductType", locale); } /*! @~english \brief DSysInfo::osSystemName Version name The corresponding value corresponding to SystemName [xx] item, if you can't find the default language of the corresponding language, use the value of SystemName uniontech os \a locale Current system language */ QString DSysInfo::uosSystemName(const QLocale &locale) { return getUosVersionValue("SystemName", locale); } /*! @~english \brief DSysInfo::osEditionName Version name EditionName[xx] The corresponding value of the item, if you can't find the value of the corresponding language, use the value of EditionName (Professional/Home/Community ...) \a locale Current system language */ QString DSysInfo::uosEditionName(const QLocale &locale) { return getUosVersionValue("EditionName", locale); } /*! @~english \brief DSysInfo::spVersion Period version name BC, A.B.C in the small version number a-bc-d Return to SP1-SPXX, if the official version returns empty In the x.y.z mode, it will not support returning this version number for the time being \ note minversion.bc == 00: The official version minversion.bc | minversion.b == 01-99: SP1 ... .sp99 */ QString DSysInfo::spVersion() { siGlobal->ensureOsVersion(); switch (siGlobal->minVersion.type) { case DSysInfoPrivate::MinVersion::A_BC_D: { if (siGlobal->minVersion.BC > 0) { return QString("SP%1").arg(siGlobal->minVersion.BC); } else { return QString(); // 00 æ­£å¼�版 } } case DSysInfoPrivate::MinVersion::A_B_C: { if (siGlobal->minVersion.B > 0) { return QStringLiteral("SP%1").arg(siGlobal->minVersion.B); } else { return {}; } } case DSysInfoPrivate::MinVersion::X_Y_Z: qWarning() << "Getting the SP version in this mode is not supported."; return {}; } return QString(); } /*! @~english \brief DSysInfo::udpateVersion Update version name minor version number D in A-BC-D modeã€�C in A.B.C mode Return to Update1 ... Update9, if the official version returns to empty In the x.y.z mode, it will not support returning this version number for the time being \note minVersion.D == 0:official version minVersion.D | minVersion.C == 1-9:update1… update9,updateA...updateZ */ QString DSysInfo::udpateVersion() { siGlobal->ensureOsVersion(); switch (siGlobal->minVersion.type) { case DSysInfoPrivate::MinVersion::A_BC_D: { if (siGlobal->minVersion.D > 0) { uint uv = siGlobal->minVersion.D; if (uv < 10) { return QString("update%1").arg(uv); } else if (uv < 36) { return QString("update").append(QChar(uv - 10 + 'A')); } else { qWarning() << "invalid update versoin"; break; } } else { break; // 0 æ­£å¼�版 } } case DSysInfoPrivate::MinVersion::A_B_C: { if (siGlobal->minVersion.C > 0) { return QStringLiteral("update%1").arg(siGlobal->minVersion.C); } else { break; } } case DSysInfoPrivate::MinVersion::X_Y_Z: qWarning() << "Getting the update version in this mode is not supported."; break; } return {}; } /*! @~english \brief Main edition number Main edition number ã€�20】ã€�23】ã€�25】ã€�26】ã€�29】ã€�30】 \note Return to Majorversion value */ QString DSysInfo::majorVersion() { siGlobal->ensureOsVersion(); return siGlobal->majorVersion; } /*! @~english \brief DSysInfo::minorVersion minor version *ã€�ABCD】 ·[0-9]{4} *ã€�A.B.C】 orã€�X.Y.Z】 @return the value of minorversion */ QString DSysInfo::minorVersion() { siGlobal->ensureOsVersion(); return siGlobal->minorVersion; } /*! @~english \brief DSysInfo::buildVersion Small version number System mirror batch number, in order of time (non-retreat) increase from 100-999 \note Return osbuild.xyz value */ QString DSysInfo::buildVersion() { DDesktopEntry entry(OS_VERSION_FILE); QString osb = entry.stringValue("OsBuild", "Version"); return osb.mid(6).trimmed(); } #endif #if DTK_VERSION < DTK_VERSION_CHECK(6, 0, 0, 0) QString DSysInfo::deepinDistributionInfoPath() { return distributionInfoPath(); } #endif QString DSysInfo::distributionInfoPath() { #ifdef Q_OS_LINUX // return "/usr/share/deepin/distribution.info"; return QStandardPaths::locate(QStandardPaths::GenericDataLocation, "deepin/distribution.info"); #else return QDir(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation)).filePath("deepin-distribution.info"); #endif // Q_OS_LINUX } QString DSysInfo::distributionInfoSectionName(DSysInfo::OrgType type) { switch (type) { case Distribution: return "Distribution"; case Distributor: return "Distributor"; case Manufacturer: return "Manufacturer"; } return QString(); } /*! @~english \return the organization name. use \a type as Distribution to get the name of current deepin distribution itself. \sa deepinDistributionInfoPath() */ QString DSysInfo::distributionOrgName(DSysInfo::OrgType type, const QLocale &locale) { #ifdef Q_OS_LINUX siGlobal->ensureDistributionInfo(); #endif QString fallback = type == Distribution ? QStringLiteral("Deepin") : QString(); return siGlobal->distributionInfo->localizedValue("Name", locale, distributionInfoSectionName(type), fallback); } #if DTK_VERSION < DTK_VERSION_CHECK(6, 0, 0, 0) QString DSysInfo::deepinDistributorName() { return distributionOrgName(Distributor); } #endif /*! @~english \return the organization website name and url. use \a type as Distribution to get the name of current deepin distribution itself. \sa deepinDistributionInfoPath() */ QPair DSysInfo::distributionOrgWebsite(DSysInfo::OrgType type) { #ifdef Q_OS_LINUX siGlobal->ensureDistributionInfo(); #endif QString fallbackSiteName = type == Distribution ? QStringLiteral("www.deepin.org") : QString(); QString fallbackSiteUrl = type == Distribution ? QStringLiteral("https://www.deepin.org") : QString(); return { siGlobal->distributionInfo->stringValue("WebsiteName", distributionInfoSectionName(type), fallbackSiteName), siGlobal->distributionInfo->stringValue("Website", distributionInfoSectionName(type), fallbackSiteUrl), }; } #if DTK_VERSION < DTK_VERSION_CHECK(6, 0, 0, 0) QPair DSysInfo::deepinDistributorWebsite() { return distributionOrgWebsite(Distributor); } #endif /*! @~english \return the obtained organization logo path, or the given \a fallback one if there are no such logo. use \a type as Distribution to get the logo of current deepin distribution itself. \sa deepinDistributionInfoPath() */ QString DSysInfo::distributionOrgLogo(DSysInfo::OrgType orgType, DSysInfo::LogoType type, const QString &fallback) { DDesktopEntry distributionInfo(distributionInfoPath()); QString orgSectionName = distributionInfoSectionName(orgType); switch (type) { case Normal: return distributionInfo.stringValue("Logo", orgSectionName, fallback); case Light: return distributionInfo.stringValue("LogoLight", orgSectionName, fallback); case Symbolic: return distributionInfo.stringValue("LogoSymbolic", orgSectionName, fallback); case Transparent: return distributionInfo.stringValue("LogoTransparent", orgSectionName, fallback); } return QString(); } #if DTK_VERSION < DTK_VERSION_CHECK(6, 0, 0, 0) QString DSysInfo::deepinDistributorLogo(DSysInfo::LogoType type, const QString &fallback) { return distributionOrgLogo(Distributor, type, fallback); } #endif DSysInfo::ProductType DSysInfo::productType() { siGlobal->ensureReleaseInfo(); return siGlobal->productType; } QString DSysInfo::productTypeString() { siGlobal->ensureReleaseInfo(); return siGlobal->productTypeString; } QString DSysInfo::productVersion() { siGlobal->ensureReleaseInfo(); return siGlobal->productVersion; } /*! @~english \brief Check if current edition is a community edition Developer can use this way to check if we need enable or disable features for community or enterprise edition. Current rule: - Professional, Server, Personal edition (DeepinType) will be treat as Enterprise edition. - Uos (ProductType) will be treat as Enterprise edition. \return true if it's on a community edition distro/installation */ bool DSysInfo::isCommunityEdition() { #ifdef Q_OS_LINUX DeepinType type = deepinType(); QList enterpriseTypes { DeepinProfessional, DeepinServer, DeepinPersonal }; if (enterpriseTypes.contains(type)) { return false; } if (productType() == Uos) { return false; } #endif // Q_OS_LINUX return true; } QString DSysInfo::computerName() { #ifdef Q_OS_LINUX struct utsname u; if (uname(&u) == 0) siGlobal->computerName = QString::fromLatin1(u.nodename); return siGlobal->computerName; #endif return QString(); } QString DSysInfo::cpuModelName() { if (!siGlobal->cpuModelName.isEmpty()) return siGlobal->cpuModelName; #ifdef Q_OS_LINUX static QFile file("/proc/cpuinfo"); if (file.open(QFile::ReadOnly)) { QMap map = siGlobal->parseInfoFile(file); if (map.contains("Processor")) { // arm-cpuinfo hw_kirin-cpuinfo siGlobal->cpuModelName = map.value("Processor"); } else if (map.contains("model name")) { // cpuinfo siGlobal->cpuModelName = map.value("model name"); } else if (map.contains("cpu model")) { // loonson3-cpuinfo sw-cpuinfo siGlobal->cpuModelName = map.value("cpu model"); } else if (map.contains("Hardware")) { // "HardWare" field contains cpu info on huawei kirin machine (e.g. klv or klu) siGlobal->cpuModelName = map.value("Hardware"); } file.close(); } // Get the cpu info by executing lscpu command if (siGlobal->cpuModelName.isEmpty()) { const auto &lscpu_command = QStandardPaths::findExecutable("lscpu"); if (lscpu_command.isEmpty()) { qWarning() << "lscpu not found"; return QString(); } QProcess lscpu; QStringList env = QProcess::systemEnvironment(); env << "LC_ALL=C"; // Add an environment variable lscpu.setEnvironment(env); lscpu.setProgram(lscpu_command); lscpu.start(); if (lscpu.waitForFinished(3000)) { const QMap map = siGlobal->parseInfoContent(lscpu.readAll()); if (map.contains("Model name")) { siGlobal->cpuModelName = map.value("Model name"); } } else { qWarning() << "lscpu:" << lscpu.errorString(); } } return siGlobal->cpuModelName; #endif return QString(); } /*! @~english \return the installed memory size */ qint64 DSysInfo::memoryInstalledSize() { #ifdef Q_OS_LINUX // Getting Memory Installed Size // TODO: way to not dept on lshw? if (siGlobal->memoryInstalledSize >= 0) { return siGlobal->memoryInstalledSize; } if (!QStandardPaths::findExecutable("lshw").isEmpty()) { QProcess lshw; lshw.start("lshw", {"-c", "memory", "-json", "-sanitize"}, QIODevice::ReadOnly); if (!lshw.waitForFinished()) { return -1; } const QByteArray &lshwInfoJson = lshw.readAllStandardOutput(); QJsonParseError error; auto doc = QJsonDocument::fromJson(lshwInfoJson, &error); if (error.error != QJsonParseError::NoError) { qCWarning(logSysInfo(), "parse failed, expect json doc from lshw command"); return -1; } if (!doc.isArray()) { qCWarning(logSysInfo(), "parse failed, expect array"); return -1; } QJsonArray lshwResultArray = doc.array(); for (const QJsonValue value : lshwResultArray) { QJsonObject obj = value.toObject(); if (obj.contains("id") && obj.value("id").toString() == "memory") { siGlobal->memoryInstalledSize = obj.value("size").toDouble(); // TODO: check "units" is "bytes" ? break; } } } Q_ASSERT(siGlobal->memoryInstalledSize > 0); return siGlobal->memoryInstalledSize; #else return -1; #endif } /*! @~english \return the total available to use memory size */ qint64 DSysInfo::memoryTotalSize() { #ifdef Q_OS_LINUX siGlobal->memoryAvailableSize = get_phys_pages() * sysconf(_SC_PAGESIZE); return siGlobal->memoryAvailableSize; #endif return -1; } qint64 DSysInfo::systemDiskSize() { #ifdef Q_OS_LINUX // Getting Disk Size QString deviceName; QProcess lsblk; lsblk.start("lsblk", {"-Jlpb", "-oNAME,KNAME,PKNAME,SIZE,MOUNTPOINT"}, QIODevice::ReadOnly); if (!lsblk.waitForFinished()) { return -1; } const QByteArray &diskStatusJson = lsblk.readAllStandardOutput(); QJsonDocument diskStatus = QJsonDocument::fromJson(diskStatusJson); QJsonValue diskStatusJsonValue = diskStatus.object().value("blockdevices"); QMap> deviceParentAndSizeMap; if (!diskStatusJsonValue.isUndefined()) { QJsonArray diskStatusArray = diskStatusJsonValue.toArray(); QString keyName; for (const QJsonValue oneValue : diskStatusArray) { QString name = oneValue.toObject().value("name").toString(); QString kname = oneValue.toObject().value("kname").toString(); QString pkname = oneValue.toObject().value("pkname").toString(); qulonglong size = oneValue.toObject().value("size").toVariant().toULongLong(); QString deviceNameMP = oneValue.toObject().value("mountpoint").toString(); if ("/" == deviceNameMP){ deviceName = name; } if (keyName.isNull() && deviceName == name) { keyName = kname; } deviceParentAndSizeMap[kname] = QPair(pkname, size); } while (!deviceParentAndSizeMap[keyName].first.isNull()) { keyName = deviceParentAndSizeMap[keyName].first; } siGlobal->diskSize = deviceParentAndSizeMap[keyName].second; } return siGlobal->diskSize; #endif return -1; } /*! @~english DSysInfo::bootTime * @~english \sa DSysInfo::uptime * @~english \return the boot time(currentDateTime - uptime) */ QDateTime DSysInfo::bootTime() { qint64 ut = uptime(); return ut > 0 ? QDateTime::currentDateTime().addSecs(-ut) : QDateTime(); } /*! @~english DSysInfo::shutdownTime * @~english \return the last shutdown time */ QDateTime DSysInfo::shutdownTime() { QDateTime dt; #if defined Q_OS_LINUX QProcess lastx; lastx.start("last", {"-x", "-F" }, QIODevice::ReadOnly); if (!lastx.waitForFinished()) { qWarning() << lastx.errorString(); return QDateTime(); } while (lastx.canReadLine()) { const QByteArray data = lastx.readLine(1024); //shutdown system down 4.19.0-amd64-des Fri Sep 30 17:53:17 2022 - Sat Oct 8 08:32:47 2022 (7+14:39) if (data.startsWith("shutdown")) { #if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) QString timeFmt = QString(data).split(' ', Qt::SkipEmptyParts).mid(4, 5).join(' '); #else QString timeFmt = QString(data).split(' ', QString::SkipEmptyParts).mid(4, 5).join(' '); #endif dt = QDateTime::fromString(timeFmt); break; } } #else #endif return dt; } /*! @~english DSysInfo::uptime * @~english \return the up time (/proc/uptime) */ qint64 DSysInfo::uptime() { #if defined Q_OS_LINUX QFile file("/proc/uptime"); if (!file.open(QFile::ReadOnly)) { qWarning() << file.errorString(); return -1; } QByteArray upTime = file.readAll(); bool ok = false; qint64 sec = qCeil(upTime.split(' ').value(0).toDouble(&ok)); // [0]: uptime [1]: idletime return ok ? sec : -1; #elif defined Q_OS_WIN64 return GetTickCount64(); #elif defined Q_OS_WIN32 return GetTickCount(); #else return -1; #endif } /*! @~english DSysInfo::arch * @~english \return the architecture of processor */ DSysInfo::Arch DSysInfo::arch() { #if defined(__x86_64__) return X86_64; #elif defined(__i386__) return X86; #elif defined(__powerpc64__) # if __BYTE_ORDER == __BIG_ENDIAN return PPC64; # else return PPC64_LE; # endif #elif defined(__powerpc__) # if __BYTE_ORDER == __BIG_ENDIAN return PPC; # else return PPC_LE; # endif #elif defined(__ia64__) return IA64; #elif defined(__hppa64__) return PARISC64; #elif defined(__hppa__) return PARISC; #elif defined(__s390x__) return S390X; #elif defined(__s390__) return S390; #elif defined(__sparc__) && defined (__arch64__) return SPARC64; #elif defined(__sparc__) return SPARC; #elif defined(__mips64) && defined(__LP64__) # if __BYTE_ORDER == __BIG_ENDIAN return MIPS64; # else return MIPS64_LE; # endif #elif defined(__mips64) # if __BYTE_ORDER == __BIG_ENDIAN return MIPS64; # else return MIPS64_LE; # endif #elif defined(__mips__) # if __BYTE_ORDER == __BIG_ENDIAN return MIPS; # else return MIPS_LE; # endif #elif defined(__alpha__) return ALPHA; #elif defined(__aarch64__) # if __BYTE_ORDER == __BIG_ENDIAN return ARM64_BE; # else return ARM64; # endif #elif defined(__arm__) # if __BYTE_ORDER == __BIG_ENDIAN return ARM_BE; # else return ARM; # endif #elif defined(__sh64__) return SH64; #elif defined(__sh__) return SH; #elif defined(__loongarch64) return LOONGARCH64; #elif defined(__m68k__) return M68K; #elif defined(__tilegx__) return TILEGX; #elif defined(__cris__) return CRIS; #elif defined(__nios2__) return NIOS2; #elif defined(__riscv) # if __SIZEOF_POINTER__ == 4 return RISCV32; # elif __SIZEOF_POINTER__ == 8 return RISCV64; # else # error "Unrecognized riscv architecture variant" # endif #elif defined(__arc__) # if __BYTE_ORDER == __BIG_ENDIAN return ARC_BE; # else return ARC; # endif #elif defined(__sw_64__) return SW_64; #else # error "Please register your architecture here!" #endif } DCORE_END_NAMESPACE dtkcore-6.7.46/src/dtkcore_global.cpp000066400000000000000000000007621522615770400175350ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dtkcore_global.h" #include #include #if (!defined DTK_VERSION) || (!defined DTK_VERSION_STR) #error "DTK_VERSION or DTK_VERSION_STR not defined!" #endif int dtkVersion() { return DTK_VERSION; } const char *dtkVersionString() { #ifdef QT_DEBUG qWarning() << "Use DTK_VERSION_STR instead."; #endif return ""; // DTK_VERSION_STR; } dtkcore-6.7.46/src/filesystem/000077500000000000000000000000001522615770400162355ustar00rootroot00000000000000dtkcore-6.7.46/src/filesystem/dbasefilewatcher.cpp000066400000000000000000000072701522615770400222430ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dbasefilewatcher.h" #include "private/dbasefilewatcher_p.h" #include #include DCORE_BEGIN_NAMESPACE QList DBaseFileWatcherPrivate::watcherList; DBaseFileWatcherPrivate::DBaseFileWatcherPrivate(DBaseFileWatcher *qq) : DObjectPrivate(qq) { } /*! @~english @class Dtk::Core::DBaseFileWatcher @ingroup dtkcore @brief The DBaseFileWatcher class provides an interface for monitoring files and directories for modifications. */ DBaseFileWatcher::~DBaseFileWatcher() { stopWatcher(); DBaseFileWatcherPrivate::watcherList.removeOne(this); } QUrl DBaseFileWatcher::fileUrl() const { Q_D(const DBaseFileWatcher); return d->url; } /*! @~english @brief Let file watcher start watching file changes. @sa stopWatcher(), restartWatcher() */ bool DBaseFileWatcher::startWatcher() { Q_D(DBaseFileWatcher); if (d->started) return true; if (d->start()) { d->started = true; return true; } return false; } /*! @~english @brief Stop watching file changes. @sa startWatcher(), restartWatcher() */ bool DBaseFileWatcher::stopWatcher() { Q_D(DBaseFileWatcher); if (!d->started) return false; if (d->stop()) { d->started = false; return true; } return false; } /*! @~english @brief Stop file watcher and then restart it to watching file changes. @sa startWatcher(), stopWatcher() */ bool DBaseFileWatcher::restartWatcher() { bool ok = stopWatcher(); return ok && startWatcher(); } /*! @~english @brief Set enable file watcher for \a subfileUrl or not @param[in] subfileUrl The given url @param[in] enabled Enable file change watching or not. */ void DBaseFileWatcher::setEnabledSubfileWatcher(const QUrl &subfileUrl, bool enabled) { Q_UNUSED(subfileUrl) Q_UNUSED(enabled) } /*! @~english @brief Emit a signal about \a targetUrl got a \a signal with \a arg1 Example usage: @code DBaseFileWatcher::ghostSignal(QUrl("bookmark:///"), &DBaseFileWatcher::fileDeleted, QUrl("bookmark:///bookmarkFile1")); @endcode @return æˆ�功å�‘é€�返回 true,å�¦åˆ™è¿”回 false. */ bool DBaseFileWatcher::ghostSignal(const QUrl &targetUrl, DBaseFileWatcher::SignalType1 signal, const QUrl &arg1) { if (!signal) return false; bool ok = false; for (DBaseFileWatcher *watcher : DBaseFileWatcherPrivate::watcherList) { if (watcher->fileUrl() == targetUrl) { ok = true; (watcher->*signal)(arg1); } } return ok; } /*! @~english @brief Emit a signal about \a targetUrl got a \a signal with \a arg1 and \a arg2 Example usage: @code DBaseFileWatcher::ghostSignal(QUrl("bookmark:///"), &DBaseFileWatcher::fileMoved, QUrl("bookmark:///bookmarkFile1"), QUrl("bookmark:///NewNameFile1")); @endcode */ bool DBaseFileWatcher::ghostSignal(const QUrl &targetUrl, DBaseFileWatcher::SignalType2 signal, const QUrl &arg1, const QUrl &arg2) { if (!signal) return false; bool ok = false; for (DBaseFileWatcher *watcher : DBaseFileWatcherPrivate::watcherList) { if (watcher->fileUrl() == targetUrl) { ok = true; (watcher->*signal)(arg1, arg2); } } return ok; } DBaseFileWatcher::DBaseFileWatcher(DBaseFileWatcherPrivate &dd, const QUrl &url, QObject *parent) : QObject(parent) , DObject(dd) { Q_ASSERT(url.isValid()); d_func()->url = url; DBaseFileWatcherPrivate::watcherList << this; } DCORE_END_NAMESPACE //#include "moc_dbasefilewatcher.cpp" dtkcore-6.7.46/src/filesystem/dcapfile.cpp000066400000000000000000000200661522615770400205140ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dcapfile.h" #include "dobject_p.h" #include "private/dcapfsfileengine_p.h" #include DCORE_BEGIN_NAMESPACE extern QString _d_cleanPath(const QString &path); extern bool _d_isSubFileOf(const QString &filePath, const QString &directoryPath); class DCapFilePrivate : public DObjectPrivate { D_DECLARE_PUBLIC(DCapFile) public: DCapFilePrivate(DCapFile *qq, const QString &fileName = QString()); static bool canReadWrite(const QString &path); QString fileName; }; DCapFilePrivate::DCapFilePrivate(DCapFile *qq, const QString &fileName) : DObjectPrivate(qq) , fileName(fileName) { } bool DCapFilePrivate::canReadWrite(const QString &path) { DCapFSFileEngine engine(path); return engine.canReadWrite(path); } DCapFile::DCapFile(QObject *parent) : QFile(parent) , DObject(*new DCapFilePrivate(this)) { } DCapFile::DCapFile(const QString &name, QObject *parent) : QFile(name, parent) , DObject(*new DCapFilePrivate(this, name)) { } DCapFile::~DCapFile() { } void DCapFile::setFileName(const QString &name) { D_D(DCapFile); d->fileName = name; return QFile::setFileName(name); } bool DCapFile::exists() const { D_DC(DCapFile); if (!d->canReadWrite(d->fileName)) return false; return QFile::exists(); } bool DCapFile::exists(const QString &fileName) { return DCapFile(fileName).exists(); } #if DTK_VERSION < DTK_VERSION_CHECK(6, 0, 0, 0) QString DCapFile::readLink() const { D_DC(DCapFile); if (!d->canReadWrite(d->fileName)) return {}; return QFile::symLinkTarget(); } #endif #if QT_VERSION >= QT_VERSION_CHECK(5, 13, 0) QString DCapFile::symLinkTarget() const { return QFile::symLinkTarget(); } #endif bool DCapFile::remove() { D_D(DCapFile); if (!d->canReadWrite(d->fileName)) return false; return QFile::remove(); } bool DCapFile::remove(const QString &fileName) { return DCapFile(fileName).remove(); } #if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) bool DCapFile::moveToTrash() { D_D(DCapFile); if (!d->canReadWrite(d->fileName)) return false; return QFile::moveToTrash(); } bool DCapFile::moveToTrash(const QString &fileName, QString *pathInTrash) { DCapFile file(fileName); if (file.moveToTrash()) { if (pathInTrash) *pathInTrash = file.fileName(); return true; } return false; } #endif bool DCapFile::rename(const QString &newName) { D_D(DCapFile); if (!d->canReadWrite(newName)) return false; return QFile::rename(newName); } bool DCapFile::rename(const QString &oldName, const QString &newName) { if (!DCapFilePrivate::canReadWrite(oldName)) return false; return DCapFile(oldName).rename(newName); } bool DCapFile::link(const QString &newName) { D_D(DCapFile); if (!d->canReadWrite(newName)) return false; return QFile::link(newName); } bool DCapFile::link(const QString &oldName, const QString &newName) { if (!DCapFilePrivate::canReadWrite(oldName)) return false; return DCapFile(oldName).link(newName); } bool DCapFile::copy(const QString &newName) { D_D(DCapFile); if (!d->canReadWrite(newName)) return false; return QFile::copy(newName); } bool DCapFile::copy(const QString &fileName, const QString &newName) { if (!DCapFilePrivate::canReadWrite(fileName)) return false; return DCapFile(fileName).copy(newName); } bool DCapFile::open(QIODevice::OpenMode flags) { D_D(DCapFile); if (!d->canReadWrite(d->fileName)) return false; return QFile::open(flags); } bool DCapFile::resize(qint64 sz) { D_D(DCapFile); if (!d->canReadWrite(d->fileName)) return false; return QFile::resize(sz); } bool DCapFile::resize(const QString &fileName, qint64 sz) { return DCapFile(fileName).resize(sz); } bool DCapFile::open(FILE *, QIODevice::OpenMode, QFileDevice::FileHandleFlags) { return false; } bool DCapFile::open(int, QIODevice::OpenMode, QFileDevice::FileHandleFlags) { return false; } class DCapDirPrivate : public QSharedData { public: DCapDirPrivate(QString filePath); explicit DCapDirPrivate(const DCapDirPrivate ©); QString filePath; }; DCapDirPrivate::DCapDirPrivate(QString filePath) : filePath(filePath) { } DCapDirPrivate::DCapDirPrivate(const DCapDirPrivate ©) : QSharedData(copy) , filePath(copy.filePath) { } DCapDir::DCapDir(const DCapDir &dir) : QDir(dir) , dd_ptr(dir.dd_ptr) { } DCapDir::DCapDir(const QString &path) : QDir(path) , dd_ptr(new DCapDirPrivate(path)) { } DCapDir::DCapDir(const QString &path, const QString &nameFilter, QDir::SortFlags sort, QDir::Filters filter) : QDir(path, nameFilter, sort, filter) , dd_ptr(new DCapDirPrivate(path)) { } DCapDir::~DCapDir() { } void DCapDir::setPath(const QString &path) { dd_ptr = new DCapDirPrivate(path); return QDir::setPath(path); } bool DCapDir::cd(const QString &dirName) { auto old_d = d_ptr; bool ret = QDir::cd(dirName); if (!ret) return ret; // take the new path. auto path = QDir::filePath(""); QScopedPointer fsEngine(new DCapFSFileEngine(path)); if (fsEngine->fileFlags(QAbstractFileEngine::FlagsMask) & QAbstractFileEngine::ExistsFlag) { dd_ptr = new DCapDirPrivate(path); return true; } d_ptr = old_d; return false; } QStringList DCapDir::entryList(DCapDir::Filters filters, DCapDir::SortFlags sort) const { const QDirPrivate* d = d_ptr.constData(); return entryList(d->nameFilters, filters, sort); } QStringList DCapDir::entryList(const QStringList &nameFilters, DCapDir::Filters filters, DCapDir::SortFlags sort) const { if (!DCapFilePrivate::canReadWrite(dd_ptr->filePath)) return {}; return QDir::entryList(nameFilters, filters, sort); } QFileInfoList DCapDir::entryInfoList(QDir::Filters filters, QDir::SortFlags sort) const { const QDirPrivate* d = d_ptr.constData(); return entryInfoList(d->nameFilters, filters, sort); } QFileInfoList DCapDir::entryInfoList(const QStringList &nameFilters, DCapDir::Filters filters, DCapDir::SortFlags sort) const { if (!DCapFilePrivate::canReadWrite(dd_ptr->filePath)) return {}; return QDir::entryInfoList(nameFilters, filters, sort); } bool DCapDir::mkdir(const QString &dirName) const { QString fn = filePath(dirName); if (!DCapFilePrivate::canReadWrite(fn)) return false; return QDir::mkdir(dirName); } bool DCapDir::rmdir(const QString &dirName) const { QString fn = filePath(dirName); if (!DCapFilePrivate::canReadWrite(fn)) return false; return QDir::rmdir(dirName); } bool DCapDir::mkpath(const QString &dirPath) const { QString fn = filePath(dirPath); if (!DCapFilePrivate::canReadWrite(fn)) return false; return QDir::mkpath(dirPath); } bool DCapDir::rmpath(const QString &dirPath) const { QString fn = filePath(dirPath); if (!DCapFilePrivate::canReadWrite(fn)) return false; return QDir::rmpath(dirPath); } bool DCapDir::exists() const { if (!DCapFilePrivate::canReadWrite(dd_ptr->filePath)) return false; return QDir::exists(); } bool DCapDir::exists(const QString &name) const { if (name.isEmpty()) { qWarning("DCapFile::exists: Empty or null file name"); return false; } return DCapFile::exists(filePath(name)); } bool DCapDir::remove(const QString &fileName) { if (fileName.isEmpty()) { qWarning("DCapDir::remove: Empty or null file name"); return false; } return DCapFile::remove(filePath(fileName)); } bool DCapDir::rename(const QString &oldName, const QString &newName) { if (oldName.isEmpty() || newName.isEmpty()) { qWarning("DCapDir::rename: Empty or null file name(s)"); return false; } DCapFile file(filePath(oldName)); if (!file.exists()) return false; return file.rename(filePath(newName)); } DCORE_END_NAMESPACE dtkcore-6.7.46/src/filesystem/dcapfsfileengine.cpp000066400000000000000000000165771522615770400222470ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "private/dcapfsfileengine_p.h" #include "private/dobject_p.h" #include "dvtablehook.h" #include "dcapmanager.h" #include DCORE_BEGIN_NAMESPACE extern QString _d_cleanPath(const QString &path); extern bool _d_isSubFileOf(const QString &filePath, const QString &directoryPath); #if QT_VERSION < QT_VERSION_CHECK(6, 8, 0) static bool capDirIteraterHasNext(QAbstractFileEngineIterator *it) { const QStringList &paths = DCapManager::instance()->paths(); QString path = it->path(); QFileInfo info(path); if (info.isSymLink()) info = QFileInfo{info.symLinkTarget()}; bool ret = std::any_of(paths.cbegin(), paths.cend(), std::bind(_d_isSubFileOf, path, std::placeholders::_1)); if (!ret) return ret; return DVtableHook::callOriginalFun(it, &QAbstractFileEngineIterator::hasNext); } #endif #if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) std::unique_ptr DCapFSFileEngineHandler::create(const QString &fileName) const #else QAbstractFileEngine *DCapFSFileEngineHandler::create(const QString &fileName) const #endif { #if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) return std::unique_ptr(new DCapFSFileEngine(fileName)); #else return new DCapFSFileEngine(fileName); #endif } class DCapFSFileEnginePrivate : public DObjectPrivate { D_DECLARE_PUBLIC(DCapFSFileEngine) public: DCapFSFileEnginePrivate(const QString &file, DCapFSFileEngine *qq); bool canReadWrite(const QString &path) const; QString file; }; DCapFSFileEnginePrivate::DCapFSFileEnginePrivate(const QString &file, DCapFSFileEngine *qq) : DObjectPrivate(qq) , file(file) { } bool DCapFSFileEnginePrivate::canReadWrite(const QString &path) const { if (path.isEmpty()) return false; QString target = path; if (path == this->file) { D_QC(DCapFSFileEngine); target = q->fileName(DCapFSFileEngine::AbsoluteName); } else { QFSFileEngine engine(path); target = engine.fileName(DCapFSFileEngine::AbsoluteName); } auto paths = DCapManager::instance()->paths(); return std::any_of(paths.cbegin(), paths.cend(), std::bind(_d_isSubFileOf, target, std::placeholders::_1)); } DCapFSFileEngine::DCapFSFileEngine(const QString &file) : QFSFileEngine(file) , DObject(*new DCapFSFileEnginePrivate(file, this)) { } DCapFSFileEngine::~DCapFSFileEngine() { } #if QT_VERSION >= QT_VERSION_CHECK(6, 4, 0) bool DCapFSFileEngine::open(QIODevice::OpenMode openMode, std::optional permissions) #else bool DCapFSFileEngine::open(QIODevice::OpenMode openMode) #endif { D_D(DCapFSFileEngine); if (!d->canReadWrite(d->file)) return false; #if QT_VERSION >= QT_VERSION_CHECK(6, 4, 0) return QFSFileEngine::open(openMode, permissions); #else return QFSFileEngine::open(openMode); #endif } bool DCapFSFileEngine::remove() { D_D(DCapFSFileEngine); if (!d->canReadWrite(d->file)) return false; return QFSFileEngine::remove(); } bool DCapFSFileEngine::copy(const QString &newName) { D_D(DCapFSFileEngine); if (!d->canReadWrite(newName)) { // ###(Chen Bin): If false is returned here, QFile // will use the interface of qtemporaryfile for // file operation, and the restrictions in // DCapFSFileEngine cannot be used. And it will be // copied successfully. qWarning() << "DCapFSFileEngine: " << QStringLiteral("The file [%1] has no permission to copy!").arg(newName); return true; } return QFSFileEngine::copy(newName); } bool DCapFSFileEngine::rename(const QString &newName) { D_D(DCapFSFileEngine); if (!d->canReadWrite(newName)) return false; return QFSFileEngine::rename(newName); } bool DCapFSFileEngine::renameOverwrite(const QString &newName) { D_D(DCapFSFileEngine); if (!d->canReadWrite(newName)) return false; return QFSFileEngine::renameOverwrite(newName); } bool DCapFSFileEngine::link(const QString &newName) { D_D(DCapFSFileEngine); if (!d->canReadWrite(newName)) return false; return QFSFileEngine::link(newName); } #if QT_VERSION >= QT_VERSION_CHECK(6, 4, 0) bool DCapFSFileEngine::mkdir(const QString &dirName, bool createParentDirectories, std::optional permissions) const #else bool DCapFSFileEngine::mkdir(const QString &dirName, bool createParentDirectories) const #endif { D_DC(DCapFSFileEngine); if (!d->canReadWrite(dirName)) return false; #if QT_VERSION >= QT_VERSION_CHECK(6, 4, 0) return QFSFileEngine::mkdir(dirName, createParentDirectories, permissions); #else return QFSFileEngine::mkdir(dirName, createParentDirectories); #endif } bool DCapFSFileEngine::rmdir(const QString &dirName, bool recurseParentDirectories) const { D_DC(DCapFSFileEngine); if (!d->canReadWrite(dirName)) return false; return QFSFileEngine::rmdir(dirName, recurseParentDirectories); } QAbstractFileEngine::FileFlags DCapFSFileEngine::fileFlags(QAbstractFileEngine::FileFlags type) const { D_DC(DCapFSFileEngine); FileFlags ret = QFSFileEngine::fileFlags(type); if (ret | ExistsFlag) { if (!d->canReadWrite(d->file)) { ret &= ~ExistsFlag; } } return ret; } #if QT_VERSION >= QT_VERSION_CHECK(6, 10, 0) DCapFSFileEngine::TriStateResult DCapFSFileEngine::cloneTo(QAbstractFileEngine *target) #else bool DCapFSFileEngine::cloneTo(QAbstractFileEngine *target) #endif { D_DC(DCapFSFileEngine); const QString targetPath = target->fileName(DCapFSFileEngine::AbsolutePathName); if (!d->canReadWrite(targetPath)) { #if QT_VERSION >= QT_VERSION_CHECK(6, 10, 0) return DCapFSFileEngine::TriStateResult::Failed; #else return false; #endif } return QFSFileEngine::cloneTo(target); } bool DCapFSFileEngine::setSize(qint64 size) { D_D(DCapFSFileEngine); if (!d->canReadWrite(d->file)) return false; return QFSFileEngine::setSize(size); } #if QT_VERSION < QT_VERSION_CHECK(6, 11, 0) QStringList DCapFSFileEngine::entryList(QDir::Filters filters, const QStringList &filterNames) const { D_DC(DCapFSFileEngine); if (!d->canReadWrite(d->file)) return {}; return QFSFileEngine::entryList(filters, filterNames); } #endif #if QT_VERSION >= QT_VERSION_CHECK(6, 8, 1) QAbstractFileEngine::IteratorUniquePtr DCapFSFileEngine::beginEntryList(const QString &path, QDirListing::IteratorFlags filters, const QStringList &filterNames) #elif QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) QAbstractFileEngine::IteratorUniquePtr DCapFSFileEngine::beginEntryList(const QString &path, QDir::Filters filters, const QStringList &filterNames) #else QAbstractFileEngine::Iterator *DCapFSFileEngine::beginEntryList(QDir::Filters filters, const QStringList &filterNames) #endif { #if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) auto ret = QFSFileEngine::beginEntryList(path, filters, filterNames); #else auto ret = QFSFileEngine::beginEntryList(filters, filterNames); DVtableHook::overrideVfptrFun(ret, &QAbstractFileEngineIterator::hasNext, &capDirIteraterHasNext); #endif return ret; } bool DCapFSFileEngine::canReadWrite(const QString &path) const { D_DC(DCapFSFileEngine); return d->canReadWrite(path); } DCORE_END_NAMESPACE dtkcore-6.7.46/src/filesystem/dcapmanager.cpp000066400000000000000000000074351522615770400212140ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dcapmanager.h" #include "dobject_p.h" #include "dstandardpaths.h" #include "private/dcapfsfileengine_p.h" #include #include DCORE_BEGIN_NAMESPACE QString _d_cleanPath(const QString &path) { return path.size() < 2 || !path.endsWith(QDir::separator()) ? path : path.chopped(1); } bool _d_isSubFileOf(const QString &filePath, const QString &directoryPath) { QString path = _d_cleanPath(filePath); bool ret = path.startsWith(directoryPath); return ret; } static QStringList defaultWriteablePaths() { QStringList paths; int list[] = {QStandardPaths::AppConfigLocation, QStandardPaths::AppDataLocation, QStandardPaths::CacheLocation, QStandardPaths::TempLocation, #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QStandardPaths::DataLocation, #endif QStandardPaths::GenericConfigLocation, QStandardPaths::HomeLocation, QStandardPaths::MusicLocation, QStandardPaths::DocumentsLocation, QStandardPaths::MoviesLocation, QStandardPaths::PicturesLocation, QStandardPaths::DownloadLocation}; for (uint i = 0; i < sizeof (list) / sizeof (int); ++i) { const QString &path = QStandardPaths::writableLocation(QStandardPaths::StandardLocation(list[i])); if (path.isEmpty()) continue; paths.append(path); } for (int i = 0; i <= static_cast(DStandardPaths::XDG::RuntimeDir); ++i) { const QString &path = DStandardPaths::path(DStandardPaths::XDG(i)); if (path.isEmpty()) continue; paths.append(path); } for (int i = 0; i <= static_cast(DStandardPaths::DSG::DataDir); ++i) { const QStringList &pathList = DStandardPaths::paths(DStandardPaths::DSG(i)); if (pathList.isEmpty()) continue; for (auto path : pathList) { if (path.isEmpty() || paths.contains(path)) continue; paths.append(path); } } return paths; } class DCapManagerPrivate : public DObjectPrivate { D_DECLARE_PUBLIC(DCapManager) public: DCapManagerPrivate(DCapManager *qq); QStringList pathList; }; class DCapManager_ : public DCapManager {}; Q_GLOBAL_STATIC(DCapManager_, capManager) DCapManagerPrivate::DCapManagerPrivate(DCapManager *qq) : DObjectPrivate(qq) { pathList = defaultWriteablePaths(); } DCapManager::DCapManager() : DObject(*new DCapManagerPrivate(this)) { } DCapManager *DCapManager::instance() { return capManager; } #if DTK_VERSION < DTK_VERSION_CHECK(6, 0, 0, 0) void DCapManager::registerFileEngine() { } void DCapManager::unregisterFileEngine() { } #endif void DCapManager::appendPath(const QString &path) { D_D(DCapManager); const QString &targetPath = _d_cleanPath(path); bool exist = std::any_of(d->pathList.cbegin(), d->pathList.cend(), std::bind(_d_isSubFileOf, targetPath, std::placeholders::_1)); if (exist) return; d->pathList.append(targetPath); } void DCapManager::appendPaths(const QStringList &pathList) { for (auto path : pathList) appendPath(path); } void DCapManager::removePath(const QString &path) { D_D(DCapManager); const QString &targetPath = _d_cleanPath(path); if (!d->pathList.contains(targetPath)) return; d->pathList.removeOne(targetPath); } void DCapManager::removePaths(const QStringList &paths) { for (auto path : paths) removePath(path); } QStringList DCapManager::paths() const { D_DC(DCapManager); return d->pathList; } DCORE_END_NAMESPACE dtkcore-6.7.46/src/filesystem/dfilesystemwatcher_dummy.cpp000066400000000000000000000163411522615770400240670ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dfilesystemwatcher.h" #include "private/dfilesystemwatcher_dummy_p.h" DCORE_BEGIN_NAMESPACE DFileSystemWatcherPrivate::DFileSystemWatcherPrivate(int fd, DFileSystemWatcher *qq) : DObjectPrivate(qq) { } DFileSystemWatcherPrivate::~DFileSystemWatcherPrivate() { } /*! @~english @class Dtk::Core::DFileSystemWatcher \inmodule dtkcore \brief The DFileSystemWatcher class provides an interface for monitoring files and directories for modifications. DFileSystemWatcher monitors the file system for changes to files and directories by watching a list of specified paths. Call addPath() to watch a particular file or directory. Multiple paths can be added using the addPaths() function. Existing paths can be removed by using the removePath() and removePaths() functions. DFileSystemWatcher examines each path added to it. Files that have been added to the DFileSystemWatcher can be accessed using the files() function, and directories using the directories() function. The fileChanged() signal is emitted when a file has been modified, renamed or removed from disk. Similarly, the directoryChanged() signal is emitted when a directory or its contents is modified or removed. Note that DFileSystemWatcher stops monitoring files once they have been renamed or removed from disk, and directories once they have been removed from disk. @note On systems running a Linux kernel without inotify support, file systems that contain watched paths cannot be unmounted. @note Windows CE does not support directory monitoring by default as this depends on the file system driver installed. @note The act of monitoring files and directories for modifications consumes system resources. This implies there is a limit to the number of files and directories your process can monitor simultaneously. On all BSD variants, for example, an open file descriptor is required for each monitored file. Some system limits the number of open file descriptors to 256 by default. This means that addPath() and addPaths() will fail if your process tries to add more than 256 files or directories to the file system monitor. Also note that your process may have other file descriptors open in addition to the ones for files being monitored, and these other open descriptors also count in the total. OS X uses a different backend and does not suffer from this issue. */ /*! @~english Constructs a new file system watcher object with the given \a parent. */ DFileSystemWatcher::DFileSystemWatcher(QObject *parent) : QObject(parent) , DObject() { } /*! @~english Constructs a new file system watcher object with the given \a parent which monitors the specified \a paths list. */ DFileSystemWatcher::DFileSystemWatcher(const QStringList &paths, QObject *parent) : DFileSystemWatcher(parent) { addPaths(paths); } /*! @~english Destroys the file system watcher. */ DFileSystemWatcher::~DFileSystemWatcher() { } /*! @~english Adds \a path to the file system watcher if \a path exists. The path is not added if it does not exist, or if it is already being monitored by the file system watcher. If \a path specifies a directory, the directoryChanged() signal will be emitted when \a path is modified or removed from disk; otherwise the fileChanged() signal is emitted when \a path is modified, renamed or removed. If the watch was successful, true is returned. Reasons for a watch failure are generally system-dependent, but may include the resource not existing, access failures, or the total watch count limit, if the platform has one. @note There may be a system dependent limit to the number of files and directories that can be monitored simultaneously. If this limit is been reached, \a path will not be monitored, and false is returned. @sa addPaths(), removePath() */ bool DFileSystemWatcher::addPath(const QString &path) { return false; } /*! @~english Adds each path in \a paths to the file system watcher. Paths are not added if they not exist, or if they are already being monitored by the file system watcher. If a path specifies a directory, the directoryChanged() signal will be emitted when the path is modified or removed from disk; otherwise the fileChanged() signal is emitted when the path is modified, renamed, or removed. The return value is a list of paths that could not be watched. Reasons for a watch failure are generally system-dependent, but may include the resource not existing, access failures, or the total watch count limit, if the platform has one. @note There may be a system dependent limit to the number of files and directories that can be monitored simultaneously. If this limit has been reached, the excess \a paths will not be monitored, and they will be added to the returned QStringList. @sa addPath(), removePaths() */ QStringList DFileSystemWatcher::addPaths(const QStringList &paths) { return QStringList(); } /*! @~english Removes the specified \a path from the file system watcher. If the watch is successfully removed, true is returned. Reasons for watch removal failing are generally system-dependent, but may be due to the path having already been deleted, for example. @sa removePaths(), addPath() */ bool DFileSystemWatcher::removePath(const QString &path) { return false; } /*! @~english Removes the specified \a paths from the file system watcher. The return value is a list of paths which were not able to be unwatched successfully. Reasons for watch removal failing are generally system-dependent, but may be due to the path having already been deleted, for example. @sa removePath(), addPaths() */ QStringList DFileSystemWatcher::removePaths(const QStringList &paths) { return QStringList(); } /*! @~english @fn void DFileSystemWatcher::fileChanged(const QString &path) This signal is emitted when the file at the specified \a path is modified, renamed or removed from disk. @sa directoryChanged() */ /*! @~english @fn void DFileSystemWatcher::directoryChanged(const QString &path) This signal is emitted when the directory at a specified \a path is modified (e.g., when a file is added or deleted) or removed from disk. Note that if there are several changes during a short period of time, some of the changes might not Q_EMIT this signal. However, the last change in the sequence of changes will always generate this signal. @sa fileChanged() */ /*! @~english @fn QStringList DFileSystemWatcher::directories() const Returns a list of paths to directories that are being watched. @sa files() */ /*! @~english @fn QStringList DFileSystemWatcher::files() const Returns a list of paths to files that are being watched. @sa directories() */ QStringList DFileSystemWatcher::directories() const { return QStringList(); } QStringList DFileSystemWatcher::files() const { return QStringList(); } DCORE_END_NAMESPACE #include "moc_dfilesystemwatcher.cpp" dtkcore-6.7.46/src/filesystem/dfilesystemwatcher_linux.cpp000066400000000000000000000475021522615770400240760ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dfilesystemwatcher.h" #include "private/dfilesystemwatcher_linux_p.h" #include #include #include #include #include #include #include #include #include DCORE_BEGIN_NAMESPACE DFileSystemWatcherPrivate::DFileSystemWatcherPrivate(int fd, DFileSystemWatcher *qq) : DObjectPrivate(qq) , inotifyFd(fd) , notifier(fd, QSocketNotifier::Read, qq) { fcntl(inotifyFd, F_SETFD, FD_CLOEXEC); qq->connect(¬ifier, SIGNAL(activated(int)), qq, SLOT(_q_readFromInotify())); } DFileSystemWatcherPrivate::~DFileSystemWatcherPrivate() { notifier.setEnabled(false); Q_FOREACH (int id, pathToID) inotify_rm_watch(inotifyFd, id < 0 ? -id : id); ::close(inotifyFd); } QStringList DFileSystemWatcherPrivate::addPaths(const QStringList &paths, QStringList *files, QStringList *directories) { QStringList p = paths; QMutableListIterator it(p); while (it.hasNext()) { QString path = it.next(); QFileInfo fi(path); bool isDir = fi.isDir(); if (isDir) { if (directories->contains(path)) continue; } else { if (files->contains(path)) continue; } int wd = inotify_add_watch(inotifyFd, QFile::encodeName(path), (isDir ? (0 | IN_ATTRIB | IN_MOVE | IN_MOVE_SELF | IN_CREATE | IN_DELETE | IN_DELETE_SELF | IN_MODIFY ) : (0 | IN_ATTRIB | IN_CLOSE_WRITE | IN_MODIFY | IN_MOVE | IN_MOVE_SELF | IN_DELETE_SELF ))); if (wd < 0) { perror("DFileSystemWatcherPrivate::addPaths: inotify_add_watch failed"); continue; } it.remove(); int id = isDir ? -wd : wd; if (id < 0) { directories->append(path); } else { files->append(path); } pathToID.insert(path, id); idToPath.insert(id, path); } return p; } QStringList DFileSystemWatcherPrivate::removePaths(const QStringList &paths, QStringList *files, QStringList *directories) { QStringList p = paths; QMutableListIterator it(p); while (it.hasNext()) { QString path = it.next(); int id = pathToID.take(path); for (auto hit = idToPath.find(id); hit != idToPath.end() && hit.key() == id; ++hit) { if (hit.value() == path) { idToPath.erase(hit); break; } } it.remove(); if (!idToPath.contains(id)) { int wd = id < 0 ? -id : id; //qDebug() << "removing watch for path" << path << "wd" << wd; inotify_rm_watch(inotifyFd, wd); } if (id < 0) { directories->removeAll(path); } else { files->removeAll(path); } } return p; } void DFileSystemWatcherPrivate::_q_readFromInotify() { Q_Q(DFileSystemWatcher); // qDebug() << "QInotifyFileSystemWatcherEngine::readFromInotify"; int buffSize = 0; ioctl(inotifyFd, FIONREAD, (char *) &buffSize); QVarLengthArray buffer(buffSize); buffSize = read(inotifyFd, buffer.data(), buffSize); char *at = buffer.data(); char * const end = at + buffSize; QList eventList; QMultiHash batch_pathmap; /// only save event: IN_MOVE_TO QMultiMap cookieToFilePath; QMultiMap cookieToFileName; QSet hasMoveFromByCookie; #ifdef QT_DEBUG int exist_count = 0; #endif while (at < end) { inotify_event *event = reinterpret_cast(at); QStringList paths; at += sizeof(inotify_event) + event->len; int id = event->wd; paths = idToPath.values(id); if (paths.empty()) { // perhaps a directory? id = -id; paths = idToPath.values(id); if (paths.empty()) continue; } if (!(event->mask & IN_MOVED_TO) || !hasMoveFromByCookie.contains(event->cookie)) { auto it = std::find_if(eventList.begin(), eventList.end(), [event](inotify_event *e){ return event->wd == e->wd && event->mask == e->mask && event->cookie == e->cookie && event->len == e->len && !strcmp(event->name, e->name); }); if (it==eventList.end()) { eventList.append(event); } #ifdef QT_DEBUG else { qDebug() << "exist event:" << "event->wd" << event->wd << "event->mask" << event->mask << "event->cookie" << event->cookie << "exist counts " << ++exist_count; } #endif const QList bps = batch_pathmap.values(id); for (auto &path : paths) { if (!bps.contains(path)) { batch_pathmap.insert(id, path); } } } if (event->mask & IN_MOVED_TO) { for (auto &path : paths) { cookieToFilePath.insert(event->cookie, path); } cookieToFileName.insert(event->cookie, QString::fromUtf8(event->name)); } if (event->mask & IN_MOVED_FROM) hasMoveFromByCookie << event->cookie; } // qDebug() << "event count:" << eventList.count(); QList::const_iterator it = eventList.constBegin(); while (it != eventList.constEnd()) { const inotify_event &event = **it; ++it; // qDebug() << "inotify event, wd" << event.wd << "cookie" << event.cookie << "mask" << hex << event.mask; int id = event.wd; QStringList paths = batch_pathmap.values(id); if (paths.empty()) { id = -id; paths = batch_pathmap.values(id); if (paths.empty()) continue; } const QString &name = QString::fromUtf8(event.name); for (auto &path : paths) { // qDebug() << "event for path" << path; // /// TODO: Existence of invalid utf8 characters QFile can not read the file information // if (event.name != QString::fromLocal8Bit(event.name).toLocal8Bit()) { // if (event.mask & (IN_CREATE | IN_MOVED_TO)) { // DFMGlobal::fileNameCorrection(path); // } // } if ((event.mask & (IN_DELETE_SELF | IN_MOVE_SELF | IN_UNMOUNT)) != 0) { do { if (event.mask & IN_MOVE_SELF) { QMultiMap::const_iterator iterator = cookieToFilePath.constBegin(); bool isMove = false; while (iterator != cookieToFilePath.constEnd()) { const QString &_path = iterator.value(); const QString &_name = cookieToFileName.value(iterator.key()); if (QFileInfo(_path + QDir::separator() + _name) == QFileInfo(path)) { isMove = true; break; } ++iterator; } if (isMove) break; } /// Keep watcher // pathToID.remove(path); // idToPath.remove(id, getPathFromID(id)); // if (!idToPath.contains(id)) // inotify_rm_watch(inotifyFd, event.wd); // if (id < 0) // onDirectoryChanged(path, true); // else // onFileChanged(path, true); Q_EMIT q->fileDeleted(path, QString(), DFileSystemWatcher::QPrivateSignal()); } while (false); } else { if (id < 0) onDirectoryChanged(path, false); else onFileChanged(path, false); } QString filePath = path; if (id < 0) { if (path.endsWith(QDir::separator())) filePath = path + name; else filePath = path + QDir::separator() + name; } if (event.mask & IN_CREATE) { // qDebug() << "IN_CREATE" << filePath << name; if (name.isEmpty()) { if (pathToID.contains(path)) { q->removePath(path); q->addPath(path); } } else if (pathToID.contains(filePath)) { q->removePath(filePath); q->addPath(filePath); } Q_EMIT q->fileCreated(path, name, DFileSystemWatcher::QPrivateSignal()); } if (event.mask & IN_DELETE) { // qDebug() << "IN_DELETE" << filePath; Q_EMIT q->fileDeleted(path, name, DFileSystemWatcher::QPrivateSignal()); } if (event.mask & IN_MOVED_FROM) { const QString toName = cookieToFileName.value(event.cookie); if (cookieToFilePath.values(event.cookie).empty()) { Q_EMIT q->fileMoved(path, name, QString(), QString(), DFileSystemWatcher::QPrivateSignal()); } else { for (QString &toPath : cookieToFilePath.values(event.cookie)) { // qDebug() << "IN_MOVED_FROM" << filePath << "to path:" << toPath << "to name:" << toName; Q_EMIT q->fileMoved(path, name, toPath, toName, DFileSystemWatcher::QPrivateSignal()); } } } if (event.mask & IN_MOVED_TO) { // qDebug() << "IN_MOVED_TO" << filePath; if (!hasMoveFromByCookie.contains(event.cookie)) Q_EMIT q->fileMoved(QString(), QString(), path, name, DFileSystemWatcher::QPrivateSignal()); } if (event.mask & IN_ATTRIB) { // qDebug() << "IN_ATTRIB" << event.mask << filePath; Q_EMIT q->fileAttributeChanged(path, name, DFileSystemWatcher::QPrivateSignal()); } /*only monitor file close event which is opend by write mode*/ if (event.mask & IN_CLOSE_WRITE) { // qDebug() << "IN_CLOSE_WRITE" << event.mask << filePath; Q_EMIT q->fileClosed(path, id < 0 ? name : QString(), DFileSystemWatcher::QPrivateSignal()); } if (event.mask & IN_MODIFY) { // qDebug() << "IN_MODIFY" << event.mask << filePath << name; Q_EMIT q->fileModified(path, name, DFileSystemWatcher::QPrivateSignal()); } } } } void DFileSystemWatcherPrivate::onFileChanged(const QString &path, bool removed) { Q_Q(DFileSystemWatcher); if (!files.contains(path)) { // the path was removed after a change was detected, but before we delivered the signal return; } if (removed) { files.removeAll(path); } // Q_EMIT q->fileChanged(path, DFileSystemWatcher::QPrivateSignal()); } void DFileSystemWatcherPrivate::onDirectoryChanged(const QString &path, bool removed) { Q_Q(DFileSystemWatcher); if (!directories.contains(path)) { // perhaps the path was removed after a change was detected, but before we delivered the signal return; } if (removed) { directories.removeAll(path); } // Q_EMIT q->directoryChanged(path, DFileSystemWatcher::QPrivateSignal()); } /*! \class Dtk::Core::DFileSystemWatcher \inmodule dtkcore \brief The DFileSystemWatcher class provides an interface for monitoring files and directories for modifications. DFileSystemWatcher monitors the file system for changes to files and directories by watching a list of specified paths. Call addPath() to watch a particular file or directory. Multiple paths can be added using the addPaths() function. Existing paths can be removed by using the removePath() and removePaths() functions. DFileSystemWatcher examines each path added to it. Files that have been added to the DFileSystemWatcher can be accessed using the files() function, and directories using the directories() function. \note On systems running a Linux kernel without inotify support, file systems that contain watched paths cannot be unmounted. \note Windows CE does not support directory monitoring by default as this depends on the file system driver installed. \note The act of monitoring files and directories for modifications consumes system resources. This implies there is a limit to the number of files and directories your process can monitor simultaneously. On all BSD variants, for example, an open file descriptor is required for each monitored file. Some system limits the number of open file descriptors to 256 by default. This means that addPath() and addPaths() will fail if your process tries to add more than 256 files or directories to the file system monitor. Also note that your process may have other file descriptors open in addition to the ones for files being monitored, and these other open descriptors also count in the total. OS X uses a different backend and does not suffer from this issue. */ /*! Constructs a new file system watcher object with the given \a parent. */ DFileSystemWatcher::DFileSystemWatcher(QObject *parent) : QObject(parent) , DObject() { int fd = -1; #ifdef IN_CLOEXEC fd = inotify_init1(IN_CLOEXEC | O_NONBLOCK); #endif if (fd == -1) { fd = inotify_init1(O_NONBLOCK); } if (fd != -1) { d_d_ptr.reset(new DFileSystemWatcherPrivate(fd, this)); } else { qCritical() << "inotify_init1 failed, and the DFileSystemWatcher is invalid." << strerror(errno); } } /*! Constructs a new file system watcher object with the given \a parent which monitors the specified \a paths list. */ DFileSystemWatcher::DFileSystemWatcher(const QStringList &paths, QObject *parent) : DFileSystemWatcher(parent) { addPaths(paths); } /*! Destroys the file system watcher. */ DFileSystemWatcher::~DFileSystemWatcher() { } /*! Adds \a path to the file system watcher if \a path exists. The path is not added if it does not exist, or if it is already being monitored by the file system watcher. If \a path specifies a directory, the directoryChanged() signal will be emitted when \a path is modified or removed from disk; otherwise the fileChanged() signal is emitted when \a path is modified, renamed or removed. If the watch was successful, true is returned. Reasons for a watch failure are generally system-dependent, but may include the resource not existing, access failures, or the total watch count limit, if the platform has one. \note There may be a system dependent limit to the number of files and directories that can be monitored simultaneously. If this limit is been reached, \a path will not be monitored, and false is returned. \sa addPaths(), removePath() */ bool DFileSystemWatcher::addPath(const QString &path) { const QStringList &paths = addPaths(QStringList(path)); return paths.isEmpty(); } /*! Adds each path in \a paths to the file system watcher. Paths are not added if they not exist, or if they are already being monitored by the file system watcher. If a path specifies a directory, the directoryChanged() signal will be emitted when the path is modified or removed from disk; otherwise the fileChanged() signal is emitted when the path is modified, renamed, or removed. The return value is a list of paths that could not be watched. Reasons for a watch failure are generally system-dependent, but may include the resource not existing, access failures, or the total watch count limit, if the platform has one. \note There may be a system dependent limit to the number of files and directories that can be monitored simultaneously. If this limit has been reached, the excess \a paths will not be monitored, and they will be added to the returned QStringList. \sa addPath(), removePaths() */ QStringList DFileSystemWatcher::addPaths(const QStringList &paths) { Q_D(DFileSystemWatcher); if (!d) return paths; QStringList p = paths; QMutableListIterator it(p); while (it.hasNext()) { const QString &path = it.next(); if (path.isEmpty()) { qWarning() << Q_FUNC_INFO << "the path is empty and it is not be watched"; it.remove(); } } if (p.isEmpty()) { qWarning() << Q_FUNC_INFO << "all path are filtered and they are not be watched, paths are " << paths; return paths; } p = d->addPaths(p, &d->files, &d->directories); return p; } /*! Removes the specified \a path from the file system watcher. If the watch is successfully removed, true is returned. Reasons for watch removal failing are generally system-dependent, but may be due to the path having already been deleted, for example. \sa removePaths(), addPath() */ bool DFileSystemWatcher::removePath(const QString &path) { const QStringList &paths = removePaths(QStringList(path)); return paths.isEmpty(); } /*! Removes the specified \a paths from the file system watcher. The return value is a list of paths which were not able to be unwatched successfully. Reasons for watch removal failing are generally system-dependent, but may be due to the path having already been deleted, for example. \sa removePath(), addPaths() */ QStringList DFileSystemWatcher::removePaths(const QStringList &paths) { Q_D(DFileSystemWatcher); if (!d) return paths; QStringList p = paths; QMutableListIterator it(p); while (it.hasNext()) { const QString &path = it.next(); if (path.isEmpty()) { qWarning() << Q_FUNC_INFO << "the path is empty and it is not be removed from watched list"; it.remove(); } } if (p.isEmpty()) { qWarning() << Q_FUNC_INFO << "all path are filtered and they are not be watched, paths are " << paths; return paths; } p = d->removePaths(p, &d->files, &d->directories); return p; } /*! \fn QStringList DFileSystemWatcher::directories() const Returns a list of paths to directories that are being watched. \sa files() */ /*! \fn QStringList DFileSystemWatcher::files() const Returns a list of paths to files that are being watched. \sa directories() */ QStringList DFileSystemWatcher::directories() const { Q_D(const DFileSystemWatcher); if (!d) return QStringList(); return d->directories; } QStringList DFileSystemWatcher::files() const { Q_D(const DFileSystemWatcher); if (!d) return QStringList(); return d->files; } DCORE_END_NAMESPACE #include "moc_dfilesystemwatcher.cpp" dtkcore-6.7.46/src/filesystem/dfilesystemwatcher_win.cpp000066400000000000000000000161751522615770400235360ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dfilesystemwatcher.h" #include "private/dfilesystemwatcher_win_p.h" DCORE_BEGIN_NAMESPACE DFileSystemWatcherPrivate::DFileSystemWatcherPrivate(int fd, DFileSystemWatcher *qq) : DObjectPrivate(qq) { } DFileSystemWatcherPrivate::~DFileSystemWatcherPrivate() { } /*! \class Dtk::Core::DFileSystemWatcher \inmodule dtkcore \brief The DFileSystemWatcher class provides an interface for monitoring files and directories for modifications. DFileSystemWatcher monitors the file system for changes to files and directories by watching a list of specified paths. Call addPath() to watch a particular file or directory. Multiple paths can be added using the addPaths() function. Existing paths can be removed by using the removePath() and removePaths() functions. DFileSystemWatcher examines each path added to it. Files that have been added to the DFileSystemWatcher can be accessed using the files() function, and directories using the directories() function. The fileChanged() signal is emitted when a file has been modified, renamed or removed from disk. Similarly, the directoryChanged() signal is emitted when a directory or its contents is modified or removed. Note that DFileSystemWatcher stops monitoring files once they have been renamed or removed from disk, and directories once they have been removed from disk. \note On systems running a Linux kernel without inotify support, file systems that contain watched paths cannot be unmounted. \note Windows CE does not support directory monitoring by default as this depends on the file system driver installed. \note The act of monitoring files and directories for modifications consumes system resources. This implies there is a limit to the number of files and directories your process can monitor simultaneously. On all BSD variants, for example, an open file descriptor is required for each monitored file. Some system limits the number of open file descriptors to 256 by default. This means that addPath() and addPaths() will fail if your process tries to add more than 256 files or directories to the file system monitor. Also note that your process may have other file descriptors open in addition to the ones for files being monitored, and these other open descriptors also count in the total. OS X uses a different backend and does not suffer from this issue. \sa QFile, QDir */ /*! Constructs a new file system watcher object with the given \a parent. */ DFileSystemWatcher::DFileSystemWatcher(QObject *parent) : QObject(parent) , DObject() { } /*! Constructs a new file system watcher object with the given \a parent which monitors the specified \a paths list. */ DFileSystemWatcher::DFileSystemWatcher(const QStringList &paths, QObject *parent) : DFileSystemWatcher(parent) { addPaths(paths); } /*! Destroys the file system watcher. */ DFileSystemWatcher::~DFileSystemWatcher() { } /*! Adds \a path to the file system watcher if \a path exists. The path is not added if it does not exist, or if it is already being monitored by the file system watcher. If \a path specifies a directory, the directoryChanged() signal will be emitted when \a path is modified or removed from disk; otherwise the fileChanged() signal is emitted when \a path is modified, renamed or removed. If the watch was successful, true is returned. Reasons for a watch failure are generally system-dependent, but may include the resource not existing, access failures, or the total watch count limit, if the platform has one. \note There may be a system dependent limit to the number of files and directories that can be monitored simultaneously. If this limit is been reached, \a path will not be monitored, and false is returned. \sa addPaths(), removePath() */ bool DFileSystemWatcher::addPath(const QString &path) { return false; } /*! Adds each path in \a paths to the file system watcher. Paths are not added if they not exist, or if they are already being monitored by the file system watcher. If a path specifies a directory, the directoryChanged() signal will be emitted when the path is modified or removed from disk; otherwise the fileChanged() signal is emitted when the path is modified, renamed, or removed. The return value is a list of paths that could not be watched. Reasons for a watch failure are generally system-dependent, but may include the resource not existing, access failures, or the total watch count limit, if the platform has one. \note There may be a system dependent limit to the number of files and directories that can be monitored simultaneously. If this limit has been reached, the excess \a paths will not be monitored, and they will be added to the returned QStringList. \sa addPath(), removePaths() */ QStringList DFileSystemWatcher::addPaths(const QStringList &paths) { return QStringList(); } /*! Removes the specified \a path from the file system watcher. If the watch is successfully removed, true is returned. Reasons for watch removal failing are generally system-dependent, but may be due to the path having already been deleted, for example. \sa removePaths(), addPath() */ bool DFileSystemWatcher::removePath(const QString &path) { return false; } /*! Removes the specified \a paths from the file system watcher. The return value is a list of paths which were not able to be unwatched successfully. Reasons for watch removal failing are generally system-dependent, but may be due to the path having already been deleted, for example. \sa removePath(), addPaths() */ QStringList DFileSystemWatcher::removePaths(const QStringList &paths) { return QStringList(); } /*! \fn void DFileSystemWatcher::fileChanged(const QString &path) This signal is emitted when the file at the specified \a path is modified, renamed or removed from disk. \sa directoryChanged() */ /*! \fn void DFileSystemWatcher::directoryChanged(const QString &path) This signal is emitted when the directory at a specified \a path is modified (e.g., when a file is added or deleted) or removed from disk. Note that if there are several changes during a short period of time, some of the changes might not Q_EMIT this signal. However, the last change in the sequence of changes will always generate this signal. \sa fileChanged() */ /*! \fn QStringList DFileSystemWatcher::directories() const Returns a list of paths to directories that are being watched. \sa files() */ /*! \fn QStringList DFileSystemWatcher::files() const Returns a list of paths to files that are being watched. \sa directories() */ QStringList DFileSystemWatcher::directories() const { return QStringList(); } QStringList DFileSystemWatcher::files() const { return QStringList(); } DCORE_END_NAMESPACE #include "moc_dfilesystemwatcher.cpp" dtkcore-6.7.46/src/filesystem/dfilewatcher.cpp000066400000000000000000000174321522615770400214110ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dfilewatcher.h" #include "private/dbasefilewatcher_p.h" #include "dfilesystemwatcher.h" #include #include DCORE_BEGIN_NAMESPACE static QString joinFilePath(const QString &path, const QString &name) { if (path.endsWith(QDir::separator())) return path + name; return path + QDir::separator() + name; } class DFileWatcherPrivate : DBaseFileWatcherPrivate { public: DFileWatcherPrivate(DFileWatcher *qq) : DBaseFileWatcherPrivate(qq) {} bool start() Q_DECL_OVERRIDE; bool stop() Q_DECL_OVERRIDE; void _q_handleFileDeleted(const QString &path, const QString &parentPath); void _q_handleFileAttributeChanged(const QString &path, const QString &parentPath); void _q_handleFileMoved(const QString &from, const QString &fromParent, const QString &to, const QString &toParent); void _q_handleFileCreated(const QString &path, const QString &parentPath); void _q_handleFileModified(const QString &path, const QString &parentPath); void _q_handleFileClose(const QString &path, const QString &parentPath); static QString formatPath(const QString &path); QString path; QStringList watchFileList; static QMap filePathToWatcherCount; Q_DECLARE_PUBLIC(DFileWatcher) }; QMap DFileWatcherPrivate::filePathToWatcherCount; Q_GLOBAL_STATIC(DFileSystemWatcher, watcher_file_private) QStringList parentPathList(const QString &path) { QStringList list; QDir dir(path); list << path; while (dir.cdUp()) { list << dir.absolutePath(); } return list; } bool DFileWatcherPrivate::start() { Q_Q(DFileWatcher); started = true; Q_FOREACH (const QString &path, parentPathList(this->path)) { if (watchFileList.contains(path)) continue; if (filePathToWatcherCount.value(path, -1) <= 0) { if (!watcher_file_private->addPath(path)) { qWarning() << Q_FUNC_INFO << "start watch failed, file path =" << path; q->stopWatcher(); started = false; return false; } } watchFileList << path; filePathToWatcherCount[path] = filePathToWatcherCount.value(path, 0) + 1; } q->connect(watcher_file_private, &DFileSystemWatcher::fileDeleted, q, &DFileWatcher::onFileDeleted); q->connect(watcher_file_private, &DFileSystemWatcher::fileAttributeChanged, q, &DFileWatcher::onFileAttributeChanged); q->connect(watcher_file_private, &DFileSystemWatcher::fileMoved, q, &DFileWatcher::onFileMoved); q->connect(watcher_file_private, &DFileSystemWatcher::fileCreated, q, &DFileWatcher::onFileCreated); q->connect(watcher_file_private, &DFileSystemWatcher::fileModified, q, &DFileWatcher::onFileModified); q->connect(watcher_file_private, &DFileSystemWatcher::fileClosed, q, &DFileWatcher::onFileClosed); return true; } bool DFileWatcherPrivate::stop() { Q_Q(DFileWatcher); q->disconnect(watcher_file_private, 0, q, 0); bool ok = true; Q_FOREACH (const QString &path, watchFileList) { int count = filePathToWatcherCount.value(path, 0); --count; if (count <= 0) { filePathToWatcherCount.remove(path); watchFileList.removeOne(path); ok = ok && watcher_file_private->removePath(path); } else { filePathToWatcherCount[path] = count; } } return ok; } void DFileWatcherPrivate::_q_handleFileDeleted(const QString &path, const QString &parentPath) { if (path != this->path && parentPath != this->path) return; Q_Q(DFileWatcher); Q_EMIT q->fileDeleted(QUrl::fromLocalFile(path)); } void DFileWatcherPrivate::_q_handleFileAttributeChanged(const QString &path, const QString &parentPath) { if (path != this->path && parentPath != this->path) return; Q_Q(DFileWatcher); Q_EMIT q->fileAttributeChanged(QUrl::fromLocalFile(path)); } void DFileWatcherPrivate::_q_handleFileMoved(const QString &from, const QString &fromParent, const QString &to, const QString &toParent) { Q_Q(DFileWatcher); if ((fromParent == this->path && toParent == this->path) || from == this->path) { Q_EMIT q->fileMoved(QUrl::fromLocalFile(from), QUrl::fromLocalFile(to)); } else if (fromParent == this->path) { Q_EMIT q->fileDeleted(QUrl::fromLocalFile(from)); } else if (watchFileList.contains(from)) { Q_EMIT q->fileDeleted(url); } else if (toParent == this->path) { Q_EMIT q->subfileCreated(QUrl::fromLocalFile(to)); } } void DFileWatcherPrivate::_q_handleFileCreated(const QString &path, const QString &parentPath) { if (path != this->path && parentPath != this->path) return; Q_Q(DFileWatcher); Q_EMIT q->subfileCreated(QUrl::fromLocalFile(path)); } void DFileWatcherPrivate::_q_handleFileModified(const QString &path, const QString &parentPath) { if (path != this->path && parentPath != this->path) return; Q_Q(DFileWatcher); Q_EMIT q->fileModified(QUrl::fromLocalFile(path)); } void DFileWatcherPrivate::_q_handleFileClose(const QString &path, const QString &parentPath) { if (path != this->path && parentPath != this->path) return; Q_Q(DFileWatcher); Q_EMIT q->fileClosed(QUrl::fromLocalFile(path)); } QString DFileWatcherPrivate::formatPath(const QString &path) { QString p = QFileInfo(path).absoluteFilePath(); if (p.endsWith(QDir::separator())) p.chop(1); return p.isEmpty() ? path : p; } /*! @~english \class Dtk::Core::DFileWatcher \inmodule dtkcore \brief The DFileWatcher class provides an implementation of DBaseFileWatcher for monitoring files and directories for modifications. */ DFileWatcher::DFileWatcher(const QString &filePath, QObject *parent) : DBaseFileWatcher(*new DFileWatcherPrivate(this), QUrl::fromLocalFile(filePath), parent) { d_func()->path = DFileWatcherPrivate::formatPath(filePath); } void DFileWatcher::onFileDeleted(const QString &path, const QString &name) { if (name.isEmpty()) d_func()->_q_handleFileDeleted(path, QString()); else d_func()->_q_handleFileDeleted(joinFilePath(path, name), path); } void DFileWatcher::onFileAttributeChanged(const QString &path, const QString &name) { if (name.isEmpty()) d_func()->_q_handleFileAttributeChanged(path, QString()); else d_func()->_q_handleFileAttributeChanged(joinFilePath(path, name), path); } void DFileWatcher::onFileMoved(const QString &from, const QString &fname, const QString &to, const QString &tname) { QString fromPath, fpPath; QString toPath, tpPath; if (fname.isEmpty()) { fromPath = from; } else { fromPath = joinFilePath(from, fname); fpPath = from; } if (tname.isEmpty()) { toPath = to; } else { toPath = joinFilePath(to, tname); tpPath = to; } d_func()->_q_handleFileMoved(fromPath, fpPath, toPath, tpPath); } void DFileWatcher::onFileCreated(const QString &path, const QString &name) { d_func()->_q_handleFileCreated(joinFilePath(path, name), path); } void DFileWatcher::onFileModified(const QString &path, const QString &name) { if (name.isEmpty()) d_func()->_q_handleFileModified(path, QString()); else d_func()->_q_handleFileModified(joinFilePath(path, name), path); } void DFileWatcher::onFileClosed(const QString &path, const QString &name) { if (name.isEmpty()) d_func()->_q_handleFileClose(path, QString()); else d_func()->_q_handleFileClose(joinFilePath(path, name), path); } DCORE_END_NAMESPACE #include "moc_dfilewatcher.cpp" dtkcore-6.7.46/src/filesystem/dfilewatchermanager.cpp000066400000000000000000000060041522615770400227350ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dfilewatchermanager.h" #include "dfilewatcher.h" #include "base/private/dobject_p.h" #include #include DCORE_BEGIN_NAMESPACE class DFileWatcherManagerPrivate : public DObjectPrivate { public: DFileWatcherManagerPrivate(DFileWatcherManager *qq); QMap watchersMap; D_DECLARE_PUBLIC(DFileWatcherManager) }; DFileWatcherManagerPrivate::DFileWatcherManagerPrivate(DFileWatcherManager *qq) : DObjectPrivate(qq) { } /*! @~english \class Dtk::Core::DFileWatcherManager \inmodule dtkcore \brief The DFileWatcherManager class can help you manage file watchers and get signal when file got changed. */ DFileWatcherManager::DFileWatcherManager(QObject *parent) : QObject(parent) , DObject(*new DFileWatcherManagerPrivate(this)) { } DFileWatcherManager::~DFileWatcherManager() {} /*! @~english \brief Add file watcher for \a filePath to the file watcher manager. \return The file watcher which got created and added into the file watcher manager. */ DFileWatcher *DFileWatcherManager::add(const QString &filePath) { Q_D(DFileWatcherManager); DFileWatcher *watcher = d->watchersMap.value(filePath); if (watcher) { return watcher; } watcher = new DFileWatcher(filePath, this); connect(watcher, &DFileWatcher::fileAttributeChanged, this, [this](const QUrl &url) { Q_EMIT fileAttributeChanged(url.toLocalFile()); }); connect(watcher, &DFileWatcher::fileClosed, this, [this](const QUrl &url) { Q_EMIT fileClosed(url.toLocalFile()); }); connect(watcher, &DFileWatcher::fileDeleted, this, [this](const QUrl &url) { Q_EMIT fileDeleted(url.toLocalFile()); }); connect(watcher, &DFileWatcher::fileModified, this, [this](const QUrl &url) { Q_EMIT fileModified(url.toLocalFile()); }); connect(watcher, &DFileWatcher::fileMoved, this, [this](const QUrl &fromUrl, const QUrl &toUrl) { Q_EMIT fileMoved(fromUrl.toLocalFile(), toUrl.toLocalFile()); }); connect(watcher, &DFileWatcher::subfileCreated, this, [this](const QUrl &url) { Q_EMIT subfileCreated(url.toLocalFile()); }); d->watchersMap[filePath] = watcher; watcher->startWatcher(); return watcher; } /*! @~english \brief Remove file watcher for \a filePath from the file watcher manager. */ void DFileWatcherManager::remove(const QString &filePath) { Q_D(DFileWatcherManager); DFileWatcher *watcher = d->watchersMap.take(filePath); if (watcher) { watcher->deleteLater(); } } /*! @~english @brief Remove all file watcher */ void DFileWatcherManager::removeAll() { Q_D(DFileWatcherManager); for (auto it : d->watchersMap) { it->deleteLater(); } d->watchersMap.clear(); } /*! @~english @brief Show all file watcher */ QStringList DFileWatcherManager::watchedFiles() const { Q_D(const DFileWatcherManager); return d->watchersMap.keys(); } DCORE_END_NAMESPACE dtkcore-6.7.46/src/filesystem/dpathbuf.cpp000066400000000000000000000035461522615770400205460ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dpathbuf.h" /*! \class Dtk::Core::DPathBuf \inmodule dtkcore \brief Dtk::Core::DPathBuf cat path friendly and supoort multiplatform. \brief Dtk::Core::DPathBuf是一个用于跨平å�°æ‹¼æŽ¥è·¯å¾„的辅助类. 它能够方便的写出链å¼�结构的路径拼接代ç �。 \code DPathBuf logPath(QStandardPaths::standardLocations(QStandardPaths::HomeLocation).first()); logPath = logPath / ".cache" / "deepin" / "deepin-test-dtk" / "deepin-test-dtk.log"; \endcode */ DCORE_BEGIN_NAMESPACE /*! \fn DPathBuf DPathBuf::operator/(const QString &p) const \brief join path with operator / \a p is subpath \return a new DPathBuf with subpath p */ /*! \fn DPathBuf &DPathBuf::operator/=(const QString &p) \brief join path to self with operator /= \a p is subpath to join \return self object */ /*! \fn DPathBuf DPathBuf::operator/(const char *p) const \brief join path with operator / \a p is subpath \return a new DPathBuf with subpath p \sa Dtk::Core::DPathBuf::operator/(const QString &p) */ /*! \fn DPathBuf &DPathBuf::operator/=(const char *p) \brief join path to self with operator /= \a p is subpath to join \return self object \sa operator/=(const QString &p) */ /*! \fn DPathBuf &DPathBuf::join(const QString &p) \brief join add subpath p to self \a p is subpath to join \return slef object with subpath joined */ /*! \fn QString DPathBuf::toString() const \brief toString export native separators format string. \return string with native separators */ /*! \brief Create Dtk::Core::DPathBuf from string. \a path */ DPathBuf::DPathBuf(const QString &path) { m_path = QDir(path).absolutePath(); } DPathBuf::DPathBuf() : DPathBuf(QString()) { } DCORE_END_NAMESPACE dtkcore-6.7.46/src/filesystem/dstandardpaths.cpp000066400000000000000000000143561522615770400217560ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dstandardpaths.h" #include #include #include DCORE_BEGIN_NAMESPACE class DSnapStandardPathsPrivate { public: inline static QString writableLocation(QStandardPaths::StandardLocation /*type*/) { QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); return env.value("SNAP_USER_COMMON"); } inline static QStringList standardLocations(QStandardPaths::StandardLocation type) { QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); switch (type) { case QStandardPaths::GenericDataLocation: { QString snapRoot = env.value("SNAP"); QString genericDataDir = snapRoot + PREFIX"/share/"; return QStringList() << genericDataDir; } default: break; } return QStringList() << env.value("SNAP_USER_COMMON"); } private: DSnapStandardPathsPrivate(); ~DSnapStandardPathsPrivate(); Q_DISABLE_COPY(DSnapStandardPathsPrivate) }; /*! \class Dtk::Core::DStandardPaths \inmodule dtkcore \brief DStandardPathsæ��供兼容Snap/Dtk标准的路径模å¼�。DStandardPaths实现了Qtçš„QStandardPaths主è¦�接å�£. \sa QStandardPaths */ /*! \enum Dtk::Core::DStandardPaths::Mode \brief DStandardPaths支æŒ�的路径产生模å¼�。 \value Auto \brief å’ŒQt标准的行为表现一致。 \value Snap \brief 读å�–SNAP相关的环境å�˜é‡�,支æŒ�å°†é…�置存储在SNAP对应目录。 \value Test \brief å’ŒQt标准的行为表现一致,但是会开å�¯æµ‹è¯•模å¼�,å�‚考QStandardPaths::setTestModeEnabled。 */ static DStandardPaths::Mode s_mode = DStandardPaths::Auto; QString DStandardPaths::writableLocation(QStandardPaths::StandardLocation type) { switch (s_mode) { case Auto: case Test: return QStandardPaths::writableLocation(type); case Snap: return DSnapStandardPathsPrivate::writableLocation(type); } return QStandardPaths::writableLocation(type); } QStringList DStandardPaths::standardLocations(QStandardPaths::StandardLocation type) { switch (s_mode) { case Auto: case Test: return QStandardPaths::standardLocations(type); case Snap: return DSnapStandardPathsPrivate::standardLocations(type); } return QStandardPaths::standardLocations(type); } QString DStandardPaths::locate(QStandardPaths::StandardLocation type, const QString &fileName, QStandardPaths::LocateOptions options) { return QStandardPaths::locate(type, fileName, options); } QStringList DStandardPaths::locateAll(QStandardPaths::StandardLocation type, const QString &fileName, QStandardPaths::LocateOptions options) { return QStandardPaths::locateAll(type, fileName, options); } QString DStandardPaths::findExecutable(const QString &executableName, const QStringList &paths) { return QStandardPaths::findExecutable(executableName, paths); } void DStandardPaths::setMode(DStandardPaths::Mode mode) { s_mode = mode; QStandardPaths::setTestModeEnabled(mode == Test); } // https://gitlabwh.uniontech.com/wuhan/se/deepin-specifications/-/issues/21 QString DStandardPaths::homePath() { const QByteArray &home = qgetenv("HOME"); if (!home.isEmpty()) return QString::fromLocal8Bit(home); return homePath(getuid()); } QString DStandardPaths::path(DStandardPaths::XDG type) { switch (type) { case XDG::DataHome: { const QByteArray &path = qgetenv("XDG_DATA_HOME"); if (!path.isEmpty()) return QString::fromLocal8Bit(path); return homePath() + QStringLiteral("/.local/share"); } case XDG::CacheHome: { const QByteArray &path = qgetenv("XDG_CACHE_HOME"); if (!path.isEmpty()) return QString::fromLocal8Bit(path); return homePath() + QStringLiteral("/.cache"); } case XDG::ConfigHome: { const QByteArray &path = qgetenv("XDG_CONFIG_HOME"); if (!path.isEmpty()) return QString::fromLocal8Bit(path); return homePath() + QStringLiteral("/.config"); } case XDG::RuntimeDir: { const QByteArray &path = qgetenv("XDG_RUNTIME_DIR"); if (!path.isEmpty()) return QString::fromLocal8Bit(path); return QStringLiteral("/run/user/") + QString::number(getuid()); } case XDG::StateHome: { const QByteArray &path = qgetenv("XDG_STATE_HOME"); if (!path.isEmpty()) return QString::fromLocal8Bit(path); #ifdef Q_OS_LINUX return homePath() + QStringLiteral("/.local/state"); #else // TODO: handle it on mac return QString(); #endif } } return QString(); } QString DStandardPaths::path(DStandardPaths::DSG type) { const auto list = paths(type); return list.isEmpty() ? nullptr : list.first(); } QStringList DStandardPaths::paths(DSG type) { QStringList paths; if (type == DSG::DataDir) { const QByteArray &path = qgetenv("DSG_DATA_DIRS"); if (path.isEmpty()) { return {QLatin1String(PREFIX"/share/dsg")}; } const auto list = path.split(':'); paths.reserve(list.size()); for (const auto &i : list) paths.push_back(QString::fromLocal8Bit(i)); } else if (type == DSG::AppData) { const QByteArray &path = qgetenv("DSG_APP_DATA"); //TODO 应用数æ�®ç›®å½•规范:`/persistent/appdata/{appid}`, now `appid` is not captured. paths.push_back(QString::fromLocal8Bit(path)); } return paths; } QString DStandardPaths::filePath(DStandardPaths::XDG type, QString fileName) { const QString &dir = path(type); if (dir.isEmpty()) return QString(); return dir + QLatin1Char('/') + fileName; } QString DStandardPaths::filePath(DStandardPaths::DSG type, const QString fileName) { const QString &dir = path(type); if (dir.isEmpty()) return QString(); return dir + QLatin1Char('/') + fileName; } QString DStandardPaths::homePath(const uint uid) { struct passwd *pw = getpwuid(uid); if (!pw) return QString(); const char *homedir = pw->pw_dir; return QString::fromLocal8Bit(homedir); } DCORE_END_NAMESPACE dtkcore-6.7.46/src/filesystem/dtrashmanager_dummy.cpp000066400000000000000000000061021522615770400227730ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dtrashmanager.h" #include "DObjectPrivate" #include #include #include #include #include DCORE_BEGIN_NAMESPACE class DTrashManager_ : public DTrashManager {}; Q_GLOBAL_STATIC(DTrashManager_, globalTrashManager) static QString getNotExistsFileName(const QString &fileName, const QString &targetPath) { QByteArray name = fileName.toUtf8(); int index = name.lastIndexOf('.'); QByteArray suffix; if (index >= 0) { suffix = name.mid(index); } if (suffix.size() > 200) { suffix = suffix.left(200); } name.chop(suffix.size()); name = name.left(200 - suffix.size()); while (QFile::exists(targetPath + "/" + name + suffix)) { name = QCryptographicHash::hash(name, QCryptographicHash::Md5).toHex(); } return QString::fromUtf8(name + suffix); } static bool renameFile(const QFileInfo &fileInfo, const QString &target, QString *errorString = NULL) { if (fileInfo.isFile() || fileInfo.isSymLink()) { QFile file(fileInfo.filePath()); if (!file.rename(target)) { if (errorString) { *errorString = file.errorString(); } return false; } return true; } else { QDirIterator iterator(fileInfo.filePath(), QDir::AllEntries | QDir::NoDotAndDotDot | QDir::Hidden | QDir::System); while (iterator.hasNext()) { iterator.next(); const QString newFile = iterator.filePath().replace(0, fileInfo.filePath().length(), target); if (!QDir().mkpath(QFileInfo(newFile).path())) { if (errorString) { *errorString = QString("Make the %1 path is failed").arg(QFileInfo(newFile).path()); } return false; } if (!renameFile(iterator.fileInfo(), newFile, errorString)) { return false; } } if (!QDir().rmdir(fileInfo.filePath())) { if (errorString) { *errorString = QString("Cannot remove the %1 dir").arg(fileInfo.filePath()); } return false; } } return true; } class DTrashManagerPrivate : public DTK_CORE_NAMESPACE::DObjectPrivate { public: DTrashManagerPrivate(DTrashManager *q_ptr) : DObjectPrivate(q_ptr) {} D_DECLARE_PUBLIC(DTrashManager) }; DTrashManager *DTrashManager::instance() { return globalTrashManager; } bool DTrashManager::trashIsEmpty() const { return false; } bool DTrashManager::cleanTrash() { return false; } bool DTrashManager::moveToTrash(const QString &filePath, bool followSymlink) { return false; } DTrashManager::DTrashManager() : QObject() , DObject(*new DTrashManagerPrivate(this)) { } DCORE_END_NAMESPACE dtkcore-6.7.46/src/filesystem/dtrashmanager_linux.cpp000066400000000000000000000150211522615770400227770ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dtrashmanager.h" #include "dstandardpaths.h" #include "base/private/dobject_p.h" #include #include #include #include #include #define TRASH_PATH \ DStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + "/Trash" #define TRASH_INFO_PATH TRASH_PATH"/info" #define TRASH_FILES_PATH TRASH_PATH"/files" DCORE_BEGIN_NAMESPACE class DTrashManager_ : public DTrashManager {}; Q_GLOBAL_STATIC(DTrashManager_, globalTrashManager) static QString getNotExistsFileName(const QString &fileName, const QString &targetPath) { QByteArray name = fileName.toUtf8(); int index = name.lastIndexOf('.'); QByteArray suffix; if (index >= 0) { suffix = name.mid(index); } if (suffix.size() > 200) { suffix = suffix.left(200); } name.chop(suffix.size()); name = name.left(200 - suffix.size()); while (QFile::exists(targetPath + "/" + name + suffix)) { name = QCryptographicHash::hash(name, QCryptographicHash::Md5).toHex(); } return QString::fromUtf8(name + suffix); } static bool writeTrashInfo(const QString &fileBaseName, const QString &sourceFilePath, const QDateTime &datetime, QString *errorString = NULL) { QFile metadata(TRASH_INFO_PATH"/" + fileBaseName + ".trashinfo"); if (metadata.exists()) { if (errorString) { *errorString = QString("The %1 file is exists").arg(metadata.fileName()); } return false; } if (!metadata.open(QIODevice::WriteOnly)) { if (errorString) { *errorString = metadata.errorString(); } return false; } QByteArray data; data.append("[Trash Info]\n"); data.append("Path=").append(sourceFilePath.toUtf8().toPercentEncoding("/")).append("\n"); data.append("DeletionDate=").append(datetime.toString(Qt::ISODate).toLatin1()).append("\n"); qint64 size = metadata.write(data); metadata.close(); if (size <= 0) { if (errorString) { *errorString = metadata.errorString(); } return false; } return true; } static bool renameFile(const QFileInfo &fileInfo, const QString &target, QString *errorString = NULL) { if (fileInfo.isFile() || fileInfo.isSymLink()) { QFile file(fileInfo.filePath()); if (!file.rename(target)) { if (errorString) { *errorString = file.errorString(); } return false; } return true; } else { QDirIterator iterator(fileInfo.filePath(), QDir::AllEntries | QDir::NoDotAndDotDot | QDir::Hidden | QDir::System); while (iterator.hasNext()) { iterator.next(); const QString newFile = iterator.filePath().replace(0, fileInfo.filePath().length(), target); if (!QDir().mkpath(QFileInfo(newFile).path())) { if (errorString) { *errorString = QString("Make the %1 path is failed").arg(QFileInfo(newFile).path()); } return false; } if (!renameFile(iterator.fileInfo(), newFile, errorString)) { return false; } } if (!QDir().rename(fileInfo.filePath(), target)) { if (errorString) { *errorString = QString("Cannot remove the %1 dir").arg(fileInfo.filePath()); } return false; } } return true; } class DTrashManagerPrivate : public DTK_CORE_NAMESPACE::DObjectPrivate { public: DTrashManagerPrivate(DTrashManager *q_ptr) : DObjectPrivate(q_ptr) {} static bool removeFileOrDir(const QString &path); static bool removeFromIterator(QDirIterator &iter); D_DECLARE_PUBLIC(DTrashManager) }; DTrashManager *DTrashManager::instance() { return globalTrashManager; } bool DTrashManager::trashIsEmpty() const { QDirIterator iterator(TRASH_INFO_PATH, // QStringList() << "*.trashinfo", QDir::Files | QDir::NoDotAndDotDot | QDir::Hidden); return !iterator.hasNext(); } bool DTrashManager::cleanTrash() { QDirIterator iterator_info(TRASH_INFO_PATH, QDir::Files | QDir::NoDotAndDotDot | QDir::Hidden); QDirIterator iterator_files(TRASH_FILES_PATH, QDir::AllEntries | QDir::NoDotAndDotDot | QDir::Hidden | QDir::System, QDirIterator::Subdirectories); return DTrashManagerPrivate::removeFromIterator(iterator_info) && DTrashManagerPrivate::removeFromIterator(iterator_files); } bool DTrashManager::moveToTrash(const QString &filePath, bool followSymlink) { QFileInfo fileInfo(filePath); if (!fileInfo.exists() && (followSymlink || !fileInfo.isSymLink())) { return false; } QDir trashDir(TRASH_FILES_PATH); if (followSymlink && fileInfo.isSymLink()) { QStorageInfo storageInfo(fileInfo.filePath()); QStorageInfo trashStorageInfo(trashDir); if (storageInfo != trashStorageInfo) { return false; } } if (!trashDir.mkpath(TRASH_INFO_PATH)) { return false; } if (!trashDir.mkpath(TRASH_FILES_PATH)) { return false; } if (followSymlink && fileInfo.isSymLink()) { fileInfo.setFile(fileInfo.symLinkTarget()); } const QString &fileName = getNotExistsFileName(fileInfo.fileName(), TRASH_FILES_PATH); if (!writeTrashInfo(fileName, fileInfo.filePath(), QDateTime::currentDateTime())) { return false; } const QString &newFilePath = TRASH_FILES_PATH"/" + fileName; return renameFile(fileInfo, newFilePath); } DTrashManager::DTrashManager() : QObject() , DObject(*new DTrashManagerPrivate(this)) { } bool DTrashManagerPrivate::removeFileOrDir(const QString &path) { QFileInfo fileInfo(path); if (fileInfo.isDir() && !fileInfo.isSymLink()) { QDir dir(path); return dir.removeRecursively(); } else { return QFile::remove(path); } } bool DTrashManagerPrivate::removeFromIterator(QDirIterator &iter) { bool ok = true; while (iter.hasNext()) { QString nextPath = iter.next(); // qDebug() << iter.fileName() << iterator_info.filePath(); if (!DTrashManagerPrivate::removeFileOrDir(nextPath)) { ok = false; } } return ok; } DCORE_END_NAMESPACE dtkcore-6.7.46/src/filesystem/filesystem.cmake000066400000000000000000000044201522615770400214230ustar00rootroot00000000000000if(APPLE) set(FILESYSTEM_SOURCE ${CMAKE_CURRENT_LIST_DIR}/private/dbasefilewatcher_p.h ${CMAKE_CURRENT_LIST_DIR}/private/dfilesystemwatcher_linux_p.h ${CMAKE_CURRENT_LIST_DIR}/private/dcapfsfileengine_p.h ${CMAKE_CURRENT_LIST_DIR}/dbasefilewatcher.cpp ${CMAKE_CURRENT_LIST_DIR}/dfilesystemwatcher_dummy.cpp ${CMAKE_CURRENT_LIST_DIR}/dfilewatcher.cpp ${CMAKE_CURRENT_LIST_DIR}/dfilewatchermanager.cpp ${CMAKE_CURRENT_LIST_DIR}/dpathbuf.cpp ${CMAKE_CURRENT_LIST_DIR}/dtrashmanager_dummy.cpp ${CMAKE_CURRENT_LIST_DIR}/dstandardpaths.cpp ${CMAKE_CURRENT_LIST_DIR}/dcapfile.cpp ${CMAKE_CURRENT_LIST_DIR}/dcapmanager.cpp ${CMAKE_CURRENT_LIST_DIR}/dcapfsfileengine.cpp ) elseif(WIN32) set(FILESYSTEM_SOURCE ${CMAKE_CURRENT_LIST_DIR}/private/dbasefilewatcher_p.h ${CMAKE_CURRENT_LIST_DIR}/private/dfilesystemwatcher_linux_p.h ${CMAKE_CURRENT_LIST_DIR}/private/dcapfsfileengine_p.h ${CMAKE_CURRENT_LIST_DIR}/dbasefilewatcher.cpp ${CMAKE_CURRENT_LIST_DIR}/dfilesystemwatcher_win.cpp ${CMAKE_CURRENT_LIST_DIR}/dfilewatcher.cpp ${CMAKE_CURRENT_LIST_DIR}/dfilewatchermanager.cpp ${CMAKE_CURRENT_LIST_DIR}/dpathbuf.cpp ${CMAKE_CURRENT_LIST_DIR}/dtrashmanager_dummy.cpp ${CMAKE_CURRENT_LIST_DIR}/dstandardpaths.cpp ${CMAKE_CURRENT_LIST_DIR}/dcapfile.cpp ${CMAKE_CURRENT_LIST_DIR}/dcapmanager.cpp ${CMAKE_CURRENT_LIST_DIR}/dcapfsfileengine.cpp ) else() set(FILESYSTEM_SOURCE ${CMAKE_CURRENT_LIST_DIR}/private/dbasefilewatcher_p.h ${CMAKE_CURRENT_LIST_DIR}/private/dfilesystemwatcher_linux_p.h ${CMAKE_CURRENT_LIST_DIR}/private/dcapfsfileengine_p.h ${CMAKE_CURRENT_LIST_DIR}/dbasefilewatcher.cpp ${CMAKE_CURRENT_LIST_DIR}/dfilesystemwatcher_linux.cpp ${CMAKE_CURRENT_LIST_DIR}/dfilewatcher.cpp ${CMAKE_CURRENT_LIST_DIR}/dfilewatchermanager.cpp ${CMAKE_CURRENT_LIST_DIR}/dpathbuf.cpp ${CMAKE_CURRENT_LIST_DIR}/dtrashmanager_linux.cpp ${CMAKE_CURRENT_LIST_DIR}/dstandardpaths.cpp ${CMAKE_CURRENT_LIST_DIR}/dcapfile.cpp ${CMAKE_CURRENT_LIST_DIR}/dcapmanager.cpp ${CMAKE_CURRENT_LIST_DIR}/dcapfsfileengine.cpp ) endif() file(GLOB FILESYSTEM_HEAD ${CMAKE_CURRENT_LIST_DIR}/../../include/filesystem/* ) set(filesystem_SRCS ${FILESYSTEM_HEAD} ${FILESYSTEM_SOURCE} ) dtkcore-6.7.46/src/filesystem/private/000077500000000000000000000000001522615770400177075ustar00rootroot00000000000000dtkcore-6.7.46/src/filesystem/private/dbasefilewatcher_p.h000066400000000000000000000012131522615770400236700ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DBASEFILEWATCHER_P_H #define DBASEFILEWATCHER_P_H #include "base/private/dobject_p.h" #include DCORE_BEGIN_NAMESPACE class DBaseFileWatcher; class DBaseFileWatcherPrivate : public DObjectPrivate { public: DBaseFileWatcherPrivate(DBaseFileWatcher *qq); virtual bool start() = 0; virtual bool stop() = 0; QUrl url; bool started = false; static QList watcherList; D_DECLARE_PUBLIC(DBaseFileWatcher) }; DCORE_END_NAMESPACE #endif // DBASEFILEWATCHER_P_H dtkcore-6.7.46/src/filesystem/private/dcapfsfileengine_p.h000066400000000000000000000051241522615770400236670ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DCAPFSFILEENGINE_P_H #define DCAPFSFILEENGINE_P_H #include #include DCORE_BEGIN_NAMESPACE class DCapFSFileEngineHandler : public QAbstractFileEngineHandler { public: #if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) std::unique_ptr create(const QString &fileName) const override; #else QAbstractFileEngine *create(const QString &fileName) const override; #endif }; class DCapFSFileEnginePrivate; class DCapFSFileEngine : public QFSFileEngine, public DObject { D_DECLARE_PRIVATE(DCapFSFileEngine); public: DCapFSFileEngine(const QString &file); ~DCapFSFileEngine() override; #if QT_VERSION >= QT_VERSION_CHECK(6, 4, 0) bool open(QIODevice::OpenMode openMode, std::optional permissions = std::nullopt) override; #else bool open(QIODevice::OpenMode openMode) override; #endif bool remove() override; bool copy(const QString &newName) override; bool rename(const QString &newName) override; bool renameOverwrite(const QString &newName) override; bool link(const QString &newName) override; #if QT_VERSION >= QT_VERSION_CHECK(6, 4, 0) bool mkdir(const QString &dirName, bool createParentDirectories, std::optional permissions = std::nullopt) const override; #else bool mkdir(const QString &dirName, bool createParentDirectories) const override; #endif bool rmdir(const QString &dirName, bool recurseParentDirectories) const override; FileFlags fileFlags(FileFlags type) const override; #if QT_VERSION >= QT_VERSION_CHECK(6, 10, 0) TriStateResult cloneTo(QAbstractFileEngine *target) override; #else bool cloneTo(QAbstractFileEngine *target) override; #endif bool setSize(qint64 size) override; #if QT_VERSION < QT_VERSION_CHECK(6, 11, 0) QStringList entryList(QDir::Filters filters, const QStringList &filterNames) const override; #endif #if QT_VERSION >= QT_VERSION_CHECK(6, 8, 1) IteratorUniquePtr beginEntryList(const QString &path, QDirListing::IteratorFlags filters, const QStringList &filterNames) override; #elif QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) IteratorUniquePtr beginEntryList(const QString &path, QDir::Filters filters, const QStringList &filterNames) override; #else Iterator *beginEntryList(QDir::Filters filters, const QStringList &filterNames) override; #endif bool canReadWrite(const QString &path) const; }; DCORE_END_NAMESPACE #endif // DCAPFSFILEENGINE_P_H dtkcore-6.7.46/src/filesystem/private/dfilesystemwatcher_dummy_p.h000066400000000000000000000012311522615770400255150ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DFILESYSTEMWATCHER_WIN_P_H #define DFILESYSTEMWATCHER_WIN_P_H #include "base/private/dobject_p.h" DCORE_BEGIN_NAMESPACE class DFileSystemWatcher; class DFileSystemWatcherPrivate : public DObjectPrivate { Q_DECLARE_PUBLIC(DFileSystemWatcher) public: DFileSystemWatcherPrivate(int fd, DFileSystemWatcher *qq); ~DFileSystemWatcherPrivate(); // private slots void _q_readFromInotify(); }; void DFileSystemWatcherPrivate::_q_readFromInotify() { } DCORE_END_NAMESPACE #endif // DFILESYSTEMWATCHER_WIN_P_H dtkcore-6.7.46/src/filesystem/private/dfilesystemwatcher_linux_p.h000066400000000000000000000021561522615770400255300ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DFILESYSTEMWATCHER_P_H #define DFILESYSTEMWATCHER_P_H #include "dobject_p.h" #include #include #include DCORE_BEGIN_NAMESPACE class DFileSystemWatcher; class DFileSystemWatcherPrivate : public DObjectPrivate { Q_DECLARE_PUBLIC(DFileSystemWatcher) public: DFileSystemWatcherPrivate(int fd, DFileSystemWatcher *qq); ~DFileSystemWatcherPrivate(); QStringList addPaths(const QStringList &paths, QStringList *files, QStringList *directories); QStringList removePaths(const QStringList &paths, QStringList *files, QStringList *directories); QStringList files, directories; int inotifyFd; QHash pathToID; QMultiHash idToPath; QSocketNotifier notifier; // private slots void _q_readFromInotify(); private: void onFileChanged(const QString &path, bool removed); void onDirectoryChanged(const QString &path, bool removed); }; DCORE_END_NAMESPACE #endif // DFILESYSTEMWATCHER_P_H dtkcore-6.7.46/src/filesystem/private/dfilesystemwatcher_win_p.h000066400000000000000000000012311522615770400251570ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DFILESYSTEMWATCHER_WIN_P_H #define DFILESYSTEMWATCHER_WIN_P_H #include "base/private/dobject_p.h" DCORE_BEGIN_NAMESPACE class DFileSystemWatcher; class DFileSystemWatcherPrivate : public DObjectPrivate { Q_DECLARE_PUBLIC(DFileSystemWatcher) public: DFileSystemWatcherPrivate(int fd, DFileSystemWatcher *qq); ~DFileSystemWatcherPrivate(); // private slots void _q_readFromInotify(); }; void DFileSystemWatcherPrivate::_q_readFromInotify() { } DCORE_END_NAMESPACE #endif // DFILESYSTEMWATCHER_WIN_P_H dtkcore-6.7.46/src/filesystem/private/private.pri000066400000000000000000000003341522615770400220750ustar00rootroot00000000000000HEADERS += \ $$PWD/dbasefilewatcher_p.h \ $$PWD/dcapfsfileengine_p.h linux { HEADERS += \ $$PWD/dfilesystemwatcher_linux_p.h } else:win* { HEADERS += \ $$PWD/dfilesystemwatcher_win_p.h } dtkcore-6.7.46/src/glob.cmake000066400000000000000000000027011522615770400157760ustar00rootroot00000000000000set(OUTER_SOURCE ${CMAKE_CURRENT_LIST_DIR}/dconfig.cpp ${CMAKE_CURRENT_LIST_DIR}/dsgapplication.cpp ${CMAKE_CURRENT_LIST_DIR}/dsysinfo.cpp ${CMAKE_CURRENT_LIST_DIR}/dlicenseinfo.cpp ${CMAKE_CURRENT_LIST_DIR}/dsecurestring.cpp ${CMAKE_CURRENT_LIST_DIR}/ddesktopentry.cpp ) if (DTK5) list(APPEND OUTER_SOURCE ${CMAKE_CURRENT_LIST_DIR}/dtkcore_global.cpp) endif() set(OUTER_HEADER ${CMAKE_CURRENT_LIST_DIR}/../include/global/dtkcore_global.h ${CMAKE_CURRENT_LIST_DIR}/../include/global/dconfig.h ${CMAKE_CURRENT_LIST_DIR}/../include/global/dsgapplication.h ${CMAKE_CURRENT_LIST_DIR}/../include/global/dsysinfo.h ${CMAKE_CURRENT_LIST_DIR}/../include/global/dlicenseinfo.h ${CMAKE_CURRENT_LIST_DIR}/../include/global/dsecurestring.h ${CMAKE_CURRENT_LIST_DIR}/../include/global/ddesktopentry.h ) if(LINUX) if(DEFINED D_DSG_APP_DATA_FALLBACK) add_definitions(-DD_DSG_APP_DATA_FALLBACK="${D_DSG_APP_DATA_FALLBACK}") endif() list(APPEND OUTER_SOURCE ${CMAKE_CURRENT_LIST_DIR}/dconfigfile.cpp ) list(APPEND OUTER_HEADER ${CMAKE_CURRENT_LIST_DIR}/../include/global/dconfigfile.h ) # generic dbus interfaces if(NOT DEFINED DTK_DISABLE_DBUS_CONFIG) include(${CMAKE_CURRENT_LIST_DIR}/dbus/dbus.cmake) list(APPEND glob_SRC ${dbus_SRCS}) else() add_definitions(-DD_DISABLE_DBUS_CONFIG) endif() else() add_definitions(-DD_DISABLE_DCONFIG) endif() list(APPEND glob_SRC ${OUTER_HEADER} ${OUTER_SOURCE} ) dtkcore-6.7.46/src/log/000077500000000000000000000000001522615770400146325ustar00rootroot00000000000000dtkcore-6.7.46/src/log/LogManager.cpp000066400000000000000000000240301522615770400173510ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include "LogManager.h" #include #include #include #include #include #ifdef Q_OS_LINUX #include #include #endif #include "dstandardpaths.h" #include "dconfig_org_deepin_dtk_preference.hpp" DCORE_BEGIN_NAMESPACE #define RULES_KEY ("rules") // Courtesy qstandardpaths_unix.cpp static void appendOrganizationAndApp(QString &path) { #ifndef QT_BOOTSTRAPPED const QString org = QCoreApplication::organizationName(); if (!org.isEmpty()) path += QLatin1Char('/') + org; const QString appName = QCoreApplication::applicationName(); if (!appName.isEmpty()) path += QLatin1Char('/') + appName; #else Q_UNUSED(path); #endif } #define DEFAULT_FMT "%{time}{yyyy-MM-dd, HH:mm:ss.zzz} [%{type:-7}] [%{file:-20} %{function:-35} %{line}] %{message}" class DLogManagerPrivate { public: explicit DLogManagerPrivate(DLogManager *q) : m_format(DEFAULT_FMT) , q_ptr(q) { } dconfig_org_deepin_dtk_preference *createDConfig(const QString &appId); void initLoggingRules(); void updateLoggingRules(); bool shouldSkipConsoleAppender() const; QString m_format; QString m_logPath; ConsoleAppender* m_consoleAppender = nullptr; RollingFileAppender* m_rollingFileAppender = nullptr; JournalAppender* m_journalAppender = nullptr; QScopedPointer m_dsgConfig; QScopedPointer m_fallbackConfig; DLogManager *q_ptr = nullptr; Q_DECLARE_PUBLIC(DLogManager) }; dconfig_org_deepin_dtk_preference *DLogManagerPrivate::createDConfig(const QString &appId) { if (appId.isEmpty()) return nullptr; auto config = dconfig_org_deepin_dtk_preference::create(appId); QObject::connect(config, &dconfig_org_deepin_dtk_preference::rulesChanged, config, [this](){ updateLoggingRules(); }); return config; } void DLogManagerPrivate::initLoggingRules() { if (qEnvironmentVariableIsSet("DTK_DISABLED_LOGGING_RULES") || qEnvironmentVariableIsSet("QT_LOGGING_RULES")) return; // 1. 未指定 fallbackId 时,以 dsgAppId 为准 QString dsgAppId = DSGApplication::id(); m_dsgConfig.reset(createDConfig(dsgAppId)); if (m_dsgConfig) { QObject::connect(m_dsgConfig.data(), &dconfig_org_deepin_dtk_preference::configInitializeSucceed, m_dsgConfig.data(), [this](){ updateLoggingRules(); }); QObject::connect(m_dsgConfig.data(), &dconfig_org_deepin_dtk_preference::configInitializeFailed, m_dsgConfig.data(), [this, dsgAppId] { m_dsgConfig.reset(); qWarning() << "Logging rules config is invalid, please check `appId` [" << dsgAppId << "]arg is correct"; }); } QString fallbackId = qgetenv("DTK_LOGGING_FALLBACK_APPID"); // 2. fallbackId å’Œ dsgAppId é�žç©ºä¸”ä¸�等时,都创建和监å�¬å�˜åŒ– if (!fallbackId.isEmpty() && fallbackId != dsgAppId) m_fallbackConfig.reset(createDConfig(fallbackId)); // 3. 默认值和é�žé»˜è®¤å€¼æ—¶ï¼Œé�žé»˜è®¤å€¼ä¼˜å…ˆ if (m_fallbackConfig) { QObject::connect(m_fallbackConfig.data(), &dconfig_org_deepin_dtk_preference::configInitializeSucceed, m_fallbackConfig.data(), [this](){ updateLoggingRules(); }); QObject::connect(m_fallbackConfig.data(), &dconfig_org_deepin_dtk_preference::configInitializeFailed, m_fallbackConfig.data(), [this, fallbackId] { m_fallbackConfig.reset(); qWarning() << "Logging rules config is invalid, please check `appId` [" << fallbackId << "]arg is correct"; }); } } void DLogManagerPrivate::updateLoggingRules() { QVariant var; // 4. 优先看 dsgConfig 是å�¦é»˜è®¤å€¼ï¼Œå…¶æ¬¡ fallback 是å�¦é»˜è®¤å€¼ if (m_dsgConfig && m_dsgConfig->isInitializeSucceeded() && !m_dsgConfig->rulesIsDefaultValue()) { var = m_dsgConfig->rules(); } else if (m_fallbackConfig && m_fallbackConfig->isInitializeSucceeded() && !m_fallbackConfig->rulesIsDefaultValue()) { var = m_fallbackConfig->rules(); } else if (m_dsgConfig && m_dsgConfig->isInitializeSucceeded()) { var = m_dsgConfig->rules(); } if (var.isValid()) QLoggingCategory::setFilterRules(var.toString().replace(";", "\n")); } bool DLogManagerPrivate::shouldSkipConsoleAppender() const { if (qEnvironmentVariableIsSet("DTK_FORCE_CONSOLE_LOGGING")) return false; // Skip ConsoleAppender if running under systemd and stdout is connected to journal to avoid duplicate logging QByteArray journalStream = qgetenv("JOURNAL_STREAM"); if (journalStream.isEmpty()) return false; struct stat st; if (fstat(STDOUT_FILENO, &st) != 0) return false; auto parts = journalStream.split(':'); if (parts.size() != 2) return false; bool ok1, ok2; auto dev = parts[0].toULongLong(&ok1); auto ino = parts[1].toULongLong(&ok2); return ok1 && ok2 && st.st_dev == dev && st.st_ino == ino; } /*! @~english \class Dtk::Core::DLogManager \inmodule dtkcore \brief DLogManager is the deepin user application log manager. */ DLogManager::DLogManager() :d_ptr(new DLogManagerPrivate(this)) { d_ptr->initLoggingRules(); } void DLogManager::initConsoleAppender(){ Q_D(DLogManager); // Skip ConsoleAppender if JournalAppender is active under systemd to avoid duplicate logging if (d->shouldSkipConsoleAppender() && d->m_journalAppender) { qDebug() << "Running under systemd with JournalAppender enabled, skipping ConsoleAppender to avoid duplicate logging"; return; } d->m_consoleAppender = new ConsoleAppender; d->m_consoleAppender->setFormat(d->m_format); dlogger->registerAppender(d->m_consoleAppender); } void DLogManager::initRollingFileAppender(){ Q_D(DLogManager); d->m_rollingFileAppender = new RollingFileAppender(getlogFilePath()); d->m_rollingFileAppender->setFormat(d->m_format); d->m_rollingFileAppender->setLogFilesLimit(5); d->m_rollingFileAppender->setDatePattern(RollingFileAppender::DailyRollover); dlogger->registerAppender(d->m_rollingFileAppender); } void DLogManager::initJournalAppender() { #if (defined BUILD_WITH_SYSTEMD && defined Q_OS_LINUX) Q_D(DLogManager); d->m_journalAppender = new JournalAppender(); dlogger->registerAppender(d->m_journalAppender); // Unregister ConsoleAppender if already registered under systemd to avoid duplicate logging if (d->shouldSkipConsoleAppender() && d->m_consoleAppender) { qDebug() << "Unregistered ConsoleAppender to avoid duplicate logging with JournalAppender under systemd"; dlogger->unregisterAppender(d->m_consoleAppender); delete d->m_consoleAppender; d->m_consoleAppender = nullptr; } #else qWarning() << "BUILD_WITH_SYSTEMD not defined or OS not support!!"; #endif } /*! @~english \brief Registers the appender to write the log records to the Console. \sa registerFileAppender */ void DLogManager::registerConsoleAppender(){ DLogManager::instance()->initConsoleAppender(); } /*! @~english \brief Registers the appender to write the log records to the file. \sa getlogFilePath \sa registerConsoleAppender */ void DLogManager::registerFileAppender() { DLogManager::instance()->initRollingFileAppender(); } void DLogManager::registerJournalAppender() { DLogManager::instance()->initJournalAppender(); } /*! @~english \brief Return the path file log storage. \brief DLogManager::getlogFilePath Get the log file path \brief The default log path is ~/.cache//.log \brief If the environment variable $HOME cannot be acquired, DLogManager will not log anything \sa registerFileAppender */ QString DLogManager::getlogFilePath() { //No longer set the default log path (and mkdir) when constructing now, instead set the default value if it's empty when getlogFilePath is called. //Fix the problem that the log file is still created in the default path when the log path is set manually. if (DLogManager::instance()->d_func()->m_logPath.isEmpty()) { if (DStandardPaths::homePath().isEmpty()) { qWarning() << "Unable to locate the cache directory, cannot acquire home directory, and the log will not be written to file.."; return QString(); } QString cachePath(DStandardPaths::path(DStandardPaths::XDG::CacheHome)); appendOrganizationAndApp(cachePath); if (!QDir(cachePath).exists()) { QDir(cachePath).mkpath(cachePath); } instance()->d_func()->m_logPath = instance()->joinPath(cachePath, QString("%1.log").arg(QCoreApplication::applicationName())); } return QDir::toNativeSeparators(DLogManager::instance()->d_func()->m_logPath); } /*! @~english \brief DLogManager::setlogFilePath Set the log file path \a logFilePath Log file path \brief If the file path set is not the file path, nothing will do, and an output warning */ void DLogManager::setlogFilePath(const QString &logFilePath) { QFileInfo info(logFilePath); if (info.exists() && !info.isFile()) qWarning() << "invalid file path:" << logFilePath << " is not a file"; else DLogManager::instance()->d_func()->m_logPath = logFilePath; } void DLogManager::setLogFormat(const QString &format) { //m_format = "%{time}{yyyy-MM-dd, HH:mm:ss.zzz} [%{type:-7}] [%{file:-20} %{function:-35} %{line}] %{message}\n"; DLogManager::instance()->d_func()->m_format = format; } QString DLogManager::joinPath(const QString &path, const QString &fileName){ QString separator(QDir::separator()); return QString("%1%2%3").arg(path, separator, fileName); } DLogManager::~DLogManager() { } DCORE_END_NAMESPACE dtkcore-6.7.46/src/log/dconfig_org_deepin_dtk_preference.hpp000066400000000000000000001303751522615770400242200ustar00rootroot00000000000000/** * This file is generated by dconfig2cpp. * Command line arguments: ./build/tools/dconfig2cpp/dconfig2cpp /usr/share/dsg/configs/org.deepin.dtk.preference.json -o ./src/log/dconfig_org_deepin_dtk_preference.hpp * Generation time: 2026-01-22T14:49:01 * JSON file version: 1.0 * Tool version: 1.1 * * WARNING: DO NOT MODIFY THIS FILE MANUALLY. * If you need to change the content, please modify the dconfig2cpp tool. */ #ifndef DCONFIG_ORG_DEEPIN_DTK_PREFERENCE_H #define DCONFIG_ORG_DEEPIN_DTK_PREFERENCE_H #define DCONFIG_ORG_DEEPIN_DTK_PREFERENCE_DCONFIG_FILE_VERSION_MAJOR 1 #define DCONFIG_ORG_DEEPIN_DTK_PREFERENCE_DCONFIG_FILE_VERSION_MINOR 1 #define DCONFIG_ORG_DEEPIN_DTK_PREFERENCE_DCONFIG_FILE_autoDisplayFeature #define DCONFIG_ORG_DEEPIN_DTK_PREFERENCE_DCONFIG_FILE_colorMode #define DCONFIG_ORG_DEEPIN_DTK_PREFERENCE_DCONFIG_FILE_defaultColorMode #define DCONFIG_ORG_DEEPIN_DTK_PREFERENCE_DCONFIG_FILE_enableDtkAnimations #define DCONFIG_ORG_DEEPIN_DTK_PREFERENCE_DCONFIG_FILE_featureUpdated #define DCONFIG_ORG_DEEPIN_DTK_PREFERENCE_DCONFIG_FILE_keyboardsearchDisabled #define DCONFIG_ORG_DEEPIN_DTK_PREFERENCE_DCONFIG_FILE_rules #define DCONFIG_ORG_DEEPIN_DTK_PREFERENCE_DCONFIG_FILE_scrollBarPolicy #define DCONFIG_ORG_DEEPIN_DTK_PREFERENCE_DCONFIG_FILE_sizeMode #define DCONFIG_ORG_DEEPIN_DTK_PREFERENCE_DCONFIG_FILE_themeType #define DCONFIG_ORG_DEEPIN_DTK_PREFERENCE_DCONFIG_FILE_titlebarHeight #define DCONFIG_ORG_DEEPIN_DTK_PREFERENCE_DCONFIG_FILE_underlineShortcut #include #include #include #include #include #include #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) #include #endif #include #include #include class dconfig_org_deepin_dtk_preference : public QObject { Q_OBJECT Q_PROPERTY(bool autoDisplayFeature READ autoDisplayFeature WRITE setAutoDisplayFeature NOTIFY autoDisplayFeatureChanged RESET resetAutoDisplayFeature) Q_PROPERTY(QString colorMode READ colorMode WRITE setColorMode NOTIFY colorModeChanged RESET resetColorMode) Q_PROPERTY(QString defaultColorMode READ defaultColorMode WRITE setDefaultColorMode NOTIFY defaultColorModeChanged RESET resetDefaultColorMode) Q_PROPERTY(bool enableDtkAnimations READ enableDtkAnimations WRITE setEnableDtkAnimations NOTIFY enableDtkAnimationsChanged RESET resetEnableDtkAnimations) Q_PROPERTY(bool featureUpdated READ featureUpdated WRITE setFeatureUpdated NOTIFY featureUpdatedChanged RESET resetFeatureUpdated) Q_PROPERTY(bool keyboardsearchDisabled READ keyboardsearchDisabled WRITE setKeyboardsearchDisabled NOTIFY keyboardsearchDisabledChanged RESET resetKeyboardsearchDisabled) Q_PROPERTY(QString rules READ rules WRITE setRules NOTIFY rulesChanged RESET resetRules) Q_PROPERTY(qlonglong scrollBarPolicy READ scrollBarPolicy WRITE setScrollBarPolicy NOTIFY scrollBarPolicyChanged RESET resetScrollBarPolicy) Q_PROPERTY(qlonglong sizeMode READ sizeMode WRITE setSizeMode NOTIFY sizeModeChanged RESET resetSizeMode) Q_PROPERTY(qlonglong themeType READ themeType WRITE setThemeType NOTIFY themeTypeChanged RESET resetThemeType) Q_PROPERTY(qlonglong titlebarHeight READ titlebarHeight WRITE setTitlebarHeight NOTIFY titlebarHeightChanged RESET resetTitlebarHeight) Q_PROPERTY(bool underlineShortcut READ underlineShortcut WRITE setUnderlineShortcut NOTIFY underlineShortcutChanged RESET resetUnderlineShortcut) Q_CLASSINFO("DConfigKeyList", "autoDisplayFeature;colorMode;defaultColorMode;enableDtkAnimations;featureUpdated;keyboardsearchDisabled;rules;scrollBarPolicy;sizeMode;themeType;titlebarHeight;underlineShortcut") Q_CLASSINFO("DConfigFileName", "org.deepin.dtk.preference") Q_CLASSINFO("DConfigFileVersion", "1.0") public: explicit dconfig_org_deepin_dtk_preference(QThread *thread, DTK_CORE_NAMESPACE::DConfigBackend *backend, const QString &name, const QString &appId, const QString &subpath, bool isGeneric, QObject *parent) : QObject(parent), m_data(new Data) { m_data->m_userConfig = this; m_data->moveToThread(this->thread()); if (!thread->isRunning()) { qWarning() << QLatin1String("Warning: The provided thread is not running."); } Q_ASSERT(QThread::currentThread() != thread); auto worker = new QObject(); worker->moveToThread(thread); QPointer safeData(m_data); QMetaObject::invokeMethod(worker, [safeData, backend, name, appId, subpath, isGeneric, worker]() mutable { delete worker; worker = nullptr; if (!safeData->m_status.testAndSetOrdered(static_cast(Data::Status::Invalid), static_cast(Data::Status::Initializing))) { // CAS failed: status changed (e.g., set to Destroyed by destructor) // Schedule deletion of Data object via deleteLater to avoid direct delete in Config thread safeData->deleteLater(); return; } DTK_CORE_NAMESPACE::DConfig *config = nullptr; if (isGeneric) { if (backend) { config = DTK_CORE_NAMESPACE::DConfig::createGeneric(backend, name, subpath, nullptr); } else { config = DTK_CORE_NAMESPACE::DConfig::createGeneric(name, subpath, nullptr); } } else { if (backend) { if (appId.isNull()) { config = DTK_CORE_NAMESPACE::DConfig::create(backend, DTK_CORE_NAMESPACE::DSGApplication::id(), name, subpath, nullptr); } else { config = DTK_CORE_NAMESPACE::DConfig::create(backend, appId, name, subpath, nullptr); } } else { if (appId.isNull()) { config = DTK_CORE_NAMESPACE::DConfig::create(DTK_CORE_NAMESPACE::DSGApplication::id(), name, subpath, nullptr); } else { config = DTK_CORE_NAMESPACE::DConfig::create(appId, name, subpath, nullptr); } } } if (!config || !config->isValid()) { qWarning() << QLatin1String("Failed to create DConfig instance."); QMetaObject::invokeMethod(safeData, [safeData]() { if (safeData->m_status.testAndSetOrdered(static_cast(Data::Status::Initializing), static_cast(Data::Status::Failed))) { Q_EMIT safeData->m_userConfig->configInitializeFailed(); } else { // CAS failed, destroy data object delete safeData; } }, Qt::QueuedConnection); if (config) delete config; return; } config->moveToThread(QThread::currentThread()); // Initialize through Data class safeData->initializeInConfigThread(config); // Queue state transition to main thread, to ensure config values are fully initialized. QMetaObject::invokeMethod(safeData, [safeData, config]() { // Try to transition from Initializing to Succeeded if (safeData->m_status.testAndSetOrdered(static_cast(Data::Status::Initializing), static_cast(Data::Status::Succeeded))) { // CAS succeeded: connect config destroyed signal to cleanup Data, then emit success signal to main thread QObject::connect(config, &QObject::destroyed, safeData, &QObject::deleteLater); if (safeData->m_userConfig) { Q_EMIT safeData->m_userConfig->configInitializeSucceed(config); } } else { // CAS failed - state changed (e.g., set to Destroyed) // We must clean up the config we just created config->deleteLater(); safeData->deleteLater(); } }, Qt::QueuedConnection); }); } static dconfig_org_deepin_dtk_preference* create(const QString &appId = {}, const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread()) { return new dconfig_org_deepin_dtk_preference(thread, nullptr, QStringLiteral(u"\u006f\u0072\u0067\u002e\u0064\u0065\u0065\u0070\u0069\u006e\u002e\u0064\u0074\u006b\u002e\u0070\u0072\u0065\u0066\u0065\u0072\u0065\u006e\u0063\u0065"), appId, subpath, false, parent); } static dconfig_org_deepin_dtk_preference* create(DTK_CORE_NAMESPACE::DConfigBackend *backend, const QString &appId = {}, const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread()) { return new dconfig_org_deepin_dtk_preference(thread, backend, QStringLiteral(u"\u006f\u0072\u0067\u002e\u0064\u0065\u0065\u0070\u0069\u006e\u002e\u0064\u0074\u006b\u002e\u0070\u0072\u0065\u0066\u0065\u0072\u0065\u006e\u0063\u0065"), appId, subpath, false, parent); } static dconfig_org_deepin_dtk_preference* createByName(const QString &name, const QString &appId = {}, const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread()) { return new dconfig_org_deepin_dtk_preference(thread, nullptr, name, appId, subpath, false, parent); } static dconfig_org_deepin_dtk_preference* createByName(DTK_CORE_NAMESPACE::DConfigBackend *backend, const QString &name, const QString &appId = {}, const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread()) { return new dconfig_org_deepin_dtk_preference(thread, backend, name, appId, subpath, false, parent); } static dconfig_org_deepin_dtk_preference* createGeneric(const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread()) { return new dconfig_org_deepin_dtk_preference(thread, nullptr, QStringLiteral(u"\u006f\u0072\u0067\u002e\u0064\u0065\u0065\u0070\u0069\u006e\u002e\u0064\u0074\u006b\u002e\u0070\u0072\u0065\u0066\u0065\u0072\u0065\u006e\u0063\u0065"), {}, subpath, true, parent); } static dconfig_org_deepin_dtk_preference* create(DTK_CORE_NAMESPACE::DConfigBackend *backend, const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread()) { return new dconfig_org_deepin_dtk_preference(thread, backend, QStringLiteral(u"\u006f\u0072\u0067\u002e\u0064\u0065\u0065\u0070\u0069\u006e\u002e\u0064\u0074\u006b\u002e\u0070\u0072\u0065\u0066\u0065\u0072\u0065\u006e\u0063\u0065"), {}, subpath, true, parent); } static dconfig_org_deepin_dtk_preference* createGenericByName(const QString &name, const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread()) { return new dconfig_org_deepin_dtk_preference(thread, nullptr, name, {}, subpath, true, parent); } static dconfig_org_deepin_dtk_preference* createGenericByName(DTK_CORE_NAMESPACE::DConfigBackend *backend, const QString &name, const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread()) { return new dconfig_org_deepin_dtk_preference(thread, backend, name, {}, subpath, true, parent); } ~dconfig_org_deepin_dtk_preference() { m_data->m_userConfig = nullptr; int oldStatus = m_data->m_status.fetchAndStoreOrdered(static_cast(Data::Status::Destroyed)); if (oldStatus == static_cast(Data::Status::Succeeded)) { // When Succeeded, release config object only auto config = m_data->m_config.loadRelaxed(); Q_ASSERT(config); config->deleteLater(); // m_data will be deleted by config's destroyed signal } else if (oldStatus == static_cast(Data::Status::Failed)) { // When Failed state, schedule cleanup of Data object m_data->deleteLater(); } } Q_INVOKABLE DTK_CORE_NAMESPACE::DConfig *config() const { return m_data->m_config.loadRelaxed(); } // Deprecated: Use isInitializeSucceeded() instead Q_INVOKABLE Q_DECL_DEPRECATED_X("Use isInitializeSucceeded() instead") bool isInitializeSucceed() const { return isInitializeSucceeded(); } Q_INVOKABLE bool isInitializeSucceeded() const { return m_data->m_status.loadRelaxed() == static_cast(Data::Status::Succeeded); } Q_INVOKABLE bool isInitializeFailed() const { return m_data->m_status.loadRelaxed() == static_cast(Data::Status::Failed); } Q_INVOKABLE bool isInitializing() const { return m_data->m_status.loadRelaxed() == static_cast(Data::Status::Initializing); } Q_INVOKABLE QStringList keyList() const { return { QStringLiteral("autoDisplayFeature"), QStringLiteral("colorMode"), QStringLiteral("defaultColorMode"), QStringLiteral("enableDtkAnimations"), QStringLiteral("featureUpdated"), QStringLiteral("keyboardsearchDisabled"), QStringLiteral("rules"), QStringLiteral("scrollBarPolicy"), QStringLiteral("sizeMode"), QStringLiteral("themeType"), QStringLiteral("titlebarHeight"), QStringLiteral("underlineShortcut")}; } Q_INVOKABLE bool isDefaultValue(const QString &key) const { if (key == QStringLiteral("autoDisplayFeature")) return autoDisplayFeatureIsDefaultValue(); if (key == QStringLiteral("colorMode")) return colorModeIsDefaultValue(); if (key == QStringLiteral("defaultColorMode")) return defaultColorModeIsDefaultValue(); if (key == QStringLiteral("enableDtkAnimations")) return enableDtkAnimationsIsDefaultValue(); if (key == QStringLiteral("featureUpdated")) return featureUpdatedIsDefaultValue(); if (key == QStringLiteral("keyboardsearchDisabled")) return keyboardsearchDisabledIsDefaultValue(); if (key == QStringLiteral("rules")) return rulesIsDefaultValue(); if (key == QStringLiteral("scrollBarPolicy")) return scrollBarPolicyIsDefaultValue(); if (key == QStringLiteral("sizeMode")) return sizeModeIsDefaultValue(); if (key == QStringLiteral("themeType")) return themeTypeIsDefaultValue(); if (key == QStringLiteral("titlebarHeight")) return titlebarHeightIsDefaultValue(); if (key == QStringLiteral("underlineShortcut")) return underlineShortcutIsDefaultValue(); return false; } bool autoDisplayFeature() const { return m_data->p_autoDisplayFeature; } void setAutoDisplayFeature(const bool &value) { auto oldValue = m_data->p_autoDisplayFeature; m_data->p_autoDisplayFeature = value; m_data->markPropertySet(0); if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config, value]() { config->setValue(QStringLiteral("autoDisplayFeature"), value); }); } if (m_data->p_autoDisplayFeature != oldValue) { Q_EMIT autoDisplayFeatureChanged(); Q_EMIT valueChanged(QStringLiteral("autoDisplayFeature"), value); } } void resetAutoDisplayFeature() { if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config]() { config->reset(QStringLiteral("autoDisplayFeature")); }); } } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QBindable bindableAutoDisplayFeature() { return QBindable(this, "autoDisplayFeature"); } #endif Q_INVOKABLE bool autoDisplayFeatureIsDefaultValue() const { return !m_data->testPropertySet(0); } QString colorMode() const { return m_data->p_colorMode; } void setColorMode(const QString &value) { auto oldValue = m_data->p_colorMode; m_data->p_colorMode = value; m_data->markPropertySet(1); if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config, value]() { config->setValue(QStringLiteral("colorMode"), value); }); } if (m_data->p_colorMode != oldValue) { Q_EMIT colorModeChanged(); Q_EMIT valueChanged(QStringLiteral("colorMode"), value); } } void resetColorMode() { if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config]() { config->reset(QStringLiteral("colorMode")); }); } } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QBindable bindableColorMode() { return QBindable(this, "colorMode"); } #endif Q_INVOKABLE bool colorModeIsDefaultValue() const { return !m_data->testPropertySet(1); } QString defaultColorMode() const { return m_data->p_defaultColorMode; } void setDefaultColorMode(const QString &value) { auto oldValue = m_data->p_defaultColorMode; m_data->p_defaultColorMode = value; m_data->markPropertySet(2); if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config, value]() { config->setValue(QStringLiteral("defaultColorMode"), value); }); } if (m_data->p_defaultColorMode != oldValue) { Q_EMIT defaultColorModeChanged(); Q_EMIT valueChanged(QStringLiteral("defaultColorMode"), value); } } void resetDefaultColorMode() { if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config]() { config->reset(QStringLiteral("defaultColorMode")); }); } } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QBindable bindableDefaultColorMode() { return QBindable(this, "defaultColorMode"); } #endif Q_INVOKABLE bool defaultColorModeIsDefaultValue() const { return !m_data->testPropertySet(2); } bool enableDtkAnimations() const { return m_data->p_enableDtkAnimations; } void setEnableDtkAnimations(const bool &value) { auto oldValue = m_data->p_enableDtkAnimations; m_data->p_enableDtkAnimations = value; m_data->markPropertySet(3); if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config, value]() { config->setValue(QStringLiteral("enableDtkAnimations"), value); }); } if (m_data->p_enableDtkAnimations != oldValue) { Q_EMIT enableDtkAnimationsChanged(); Q_EMIT valueChanged(QStringLiteral("enableDtkAnimations"), value); } } void resetEnableDtkAnimations() { if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config]() { config->reset(QStringLiteral("enableDtkAnimations")); }); } } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QBindable bindableEnableDtkAnimations() { return QBindable(this, "enableDtkAnimations"); } #endif Q_INVOKABLE bool enableDtkAnimationsIsDefaultValue() const { return !m_data->testPropertySet(3); } bool featureUpdated() const { return m_data->p_featureUpdated; } void setFeatureUpdated(const bool &value) { auto oldValue = m_data->p_featureUpdated; m_data->p_featureUpdated = value; m_data->markPropertySet(4); if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config, value]() { config->setValue(QStringLiteral("featureUpdated"), value); }); } if (m_data->p_featureUpdated != oldValue) { Q_EMIT featureUpdatedChanged(); Q_EMIT valueChanged(QStringLiteral("featureUpdated"), value); } } void resetFeatureUpdated() { if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config]() { config->reset(QStringLiteral("featureUpdated")); }); } } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QBindable bindableFeatureUpdated() { return QBindable(this, "featureUpdated"); } #endif Q_INVOKABLE bool featureUpdatedIsDefaultValue() const { return !m_data->testPropertySet(4); } bool keyboardsearchDisabled() const { return m_data->p_keyboardsearchDisabled; } void setKeyboardsearchDisabled(const bool &value) { auto oldValue = m_data->p_keyboardsearchDisabled; m_data->p_keyboardsearchDisabled = value; m_data->markPropertySet(5); if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config, value]() { config->setValue(QStringLiteral("keyboardsearchDisabled"), value); }); } if (m_data->p_keyboardsearchDisabled != oldValue) { Q_EMIT keyboardsearchDisabledChanged(); Q_EMIT valueChanged(QStringLiteral("keyboardsearchDisabled"), value); } } void resetKeyboardsearchDisabled() { if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config]() { config->reset(QStringLiteral("keyboardsearchDisabled")); }); } } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QBindable bindableKeyboardsearchDisabled() { return QBindable(this, "keyboardsearchDisabled"); } #endif Q_INVOKABLE bool keyboardsearchDisabledIsDefaultValue() const { return !m_data->testPropertySet(5); } QString rules() const { return m_data->p_rules; } void setRules(const QString &value) { auto oldValue = m_data->p_rules; m_data->p_rules = value; m_data->markPropertySet(6); if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config, value]() { config->setValue(QStringLiteral("rules"), value); }); } if (m_data->p_rules != oldValue) { Q_EMIT rulesChanged(); Q_EMIT valueChanged(QStringLiteral("rules"), value); } } void resetRules() { if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config]() { config->reset(QStringLiteral("rules")); }); } } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QBindable bindableRules() { return QBindable(this, "rules"); } #endif Q_INVOKABLE bool rulesIsDefaultValue() const { return !m_data->testPropertySet(6); } qlonglong scrollBarPolicy() const { return m_data->p_scrollBarPolicy; } void setScrollBarPolicy(const qlonglong &value) { auto oldValue = m_data->p_scrollBarPolicy; m_data->p_scrollBarPolicy = value; m_data->markPropertySet(7); if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config, value]() { config->setValue(QStringLiteral("scrollBarPolicy"), value); }); } if (m_data->p_scrollBarPolicy != oldValue) { Q_EMIT scrollBarPolicyChanged(); Q_EMIT valueChanged(QStringLiteral("scrollBarPolicy"), value); } } void resetScrollBarPolicy() { if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config]() { config->reset(QStringLiteral("scrollBarPolicy")); }); } } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QBindable bindableScrollBarPolicy() { return QBindable(this, "scrollBarPolicy"); } #endif Q_INVOKABLE bool scrollBarPolicyIsDefaultValue() const { return !m_data->testPropertySet(7); } qlonglong sizeMode() const { return m_data->p_sizeMode; } void setSizeMode(const qlonglong &value) { auto oldValue = m_data->p_sizeMode; m_data->p_sizeMode = value; m_data->markPropertySet(8); if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config, value]() { config->setValue(QStringLiteral("sizeMode"), value); }); } if (m_data->p_sizeMode != oldValue) { Q_EMIT sizeModeChanged(); Q_EMIT valueChanged(QStringLiteral("sizeMode"), value); } } void resetSizeMode() { if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config]() { config->reset(QStringLiteral("sizeMode")); }); } } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QBindable bindableSizeMode() { return QBindable(this, "sizeMode"); } #endif Q_INVOKABLE bool sizeModeIsDefaultValue() const { return !m_data->testPropertySet(8); } qlonglong themeType() const { return m_data->p_themeType; } void setThemeType(const qlonglong &value) { auto oldValue = m_data->p_themeType; m_data->p_themeType = value; m_data->markPropertySet(9); if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config, value]() { config->setValue(QStringLiteral("themeType"), value); }); } if (m_data->p_themeType != oldValue) { Q_EMIT themeTypeChanged(); Q_EMIT valueChanged(QStringLiteral("themeType"), value); } } void resetThemeType() { if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config]() { config->reset(QStringLiteral("themeType")); }); } } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QBindable bindableThemeType() { return QBindable(this, "themeType"); } #endif Q_INVOKABLE bool themeTypeIsDefaultValue() const { return !m_data->testPropertySet(9); } qlonglong titlebarHeight() const { return m_data->p_titlebarHeight; } void setTitlebarHeight(const qlonglong &value) { auto oldValue = m_data->p_titlebarHeight; m_data->p_titlebarHeight = value; m_data->markPropertySet(10); if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config, value]() { config->setValue(QStringLiteral("titlebarHeight"), value); }); } if (m_data->p_titlebarHeight != oldValue) { Q_EMIT titlebarHeightChanged(); Q_EMIT valueChanged(QStringLiteral("titlebarHeight"), value); } } void resetTitlebarHeight() { if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config]() { config->reset(QStringLiteral("titlebarHeight")); }); } } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QBindable bindableTitlebarHeight() { return QBindable(this, "titlebarHeight"); } #endif Q_INVOKABLE bool titlebarHeightIsDefaultValue() const { return !m_data->testPropertySet(10); } bool underlineShortcut() const { return m_data->p_underlineShortcut; } void setUnderlineShortcut(const bool &value) { auto oldValue = m_data->p_underlineShortcut; m_data->p_underlineShortcut = value; m_data->markPropertySet(11); if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config, value]() { config->setValue(QStringLiteral("underlineShortcut"), value); }); } if (m_data->p_underlineShortcut != oldValue) { Q_EMIT underlineShortcutChanged(); Q_EMIT valueChanged(QStringLiteral("underlineShortcut"), value); } } void resetUnderlineShortcut() { if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config]() { config->reset(QStringLiteral("underlineShortcut")); }); } } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QBindable bindableUnderlineShortcut() { return QBindable(this, "underlineShortcut"); } #endif Q_INVOKABLE bool underlineShortcutIsDefaultValue() const { return !m_data->testPropertySet(11); } protected: bool event(QEvent *e) override { if (e->type() == QEvent::ThreadChange) { Q_ASSERT(this->thread() == m_data->thread()); } return QObject::event(e); } Q_SIGNALS: void configInitializeFailed(); void configInitializeSucceed(DTK_CORE_NAMESPACE::DConfig *config); void valueChanged(const QString &key, const QVariant &value); void autoDisplayFeatureChanged(); void colorModeChanged(); void defaultColorModeChanged(); void enableDtkAnimationsChanged(); void featureUpdatedChanged(); void keyboardsearchDisabledChanged(); void rulesChanged(); void scrollBarPolicyChanged(); void sizeModeChanged(); void themeTypeChanged(); void titlebarHeightChanged(); void underlineShortcutChanged(); private: // Prevent external moveToThread calls using QObject::moveToThread; class Data : public QObject { public: enum class Status { Invalid = 0, Initializing = 1, Succeeded = 2, Failed = 3, Destroyed = 4 }; explicit Data() : QObject(nullptr) {} inline void initializeInConfigThread(DTK_CORE_NAMESPACE::DConfig *config) { Q_ASSERT(!m_config.loadRelaxed()); m_config.storeRelaxed(config); if (testPropertySet(0)) { config->setValue(QStringLiteral("autoDisplayFeature"), QVariant::fromValue(p_autoDisplayFeature)); } else { updateValue(QStringLiteral("autoDisplayFeature"), QVariant::fromValue(p_autoDisplayFeature)); } if (testPropertySet(1)) { config->setValue(QStringLiteral("colorMode"), QVariant::fromValue(p_colorMode)); } else { updateValue(QStringLiteral("colorMode"), QVariant::fromValue(p_colorMode)); } if (testPropertySet(2)) { config->setValue(QStringLiteral("defaultColorMode"), QVariant::fromValue(p_defaultColorMode)); } else { updateValue(QStringLiteral("defaultColorMode"), QVariant::fromValue(p_defaultColorMode)); } if (testPropertySet(3)) { config->setValue(QStringLiteral("enableDtkAnimations"), QVariant::fromValue(p_enableDtkAnimations)); } else { updateValue(QStringLiteral("enableDtkAnimations"), QVariant::fromValue(p_enableDtkAnimations)); } if (testPropertySet(4)) { config->setValue(QStringLiteral("featureUpdated"), QVariant::fromValue(p_featureUpdated)); } else { updateValue(QStringLiteral("featureUpdated"), QVariant::fromValue(p_featureUpdated)); } if (testPropertySet(5)) { config->setValue(QStringLiteral("keyboardsearchDisabled"), QVariant::fromValue(p_keyboardsearchDisabled)); } else { updateValue(QStringLiteral("keyboardsearchDisabled"), QVariant::fromValue(p_keyboardsearchDisabled)); } if (testPropertySet(6)) { config->setValue(QStringLiteral("rules"), QVariant::fromValue(p_rules)); } else { updateValue(QStringLiteral("rules"), QVariant::fromValue(p_rules)); } if (testPropertySet(7)) { config->setValue(QStringLiteral("scrollBarPolicy"), QVariant::fromValue(p_scrollBarPolicy)); } else { updateValue(QStringLiteral("scrollBarPolicy"), QVariant::fromValue(p_scrollBarPolicy)); } if (testPropertySet(8)) { config->setValue(QStringLiteral("sizeMode"), QVariant::fromValue(p_sizeMode)); } else { updateValue(QStringLiteral("sizeMode"), QVariant::fromValue(p_sizeMode)); } if (testPropertySet(9)) { config->setValue(QStringLiteral("themeType"), QVariant::fromValue(p_themeType)); } else { updateValue(QStringLiteral("themeType"), QVariant::fromValue(p_themeType)); } if (testPropertySet(10)) { config->setValue(QStringLiteral("titlebarHeight"), QVariant::fromValue(p_titlebarHeight)); } else { updateValue(QStringLiteral("titlebarHeight"), QVariant::fromValue(p_titlebarHeight)); } if (testPropertySet(11)) { config->setValue(QStringLiteral("underlineShortcut"), QVariant::fromValue(p_underlineShortcut)); } else { updateValue(QStringLiteral("underlineShortcut"), QVariant::fromValue(p_underlineShortcut)); } connect(config, &DTK_CORE_NAMESPACE::DConfig::valueChanged, this, [this](const QString &key) { updateValue(key); }, Qt::DirectConnection); } inline void updateValue(const QString &key, const QVariant &fallback = QVariant()) { if (!m_config.loadRelaxed()) return; Q_ASSERT(QThread::currentThread() == m_config.loadRelaxed()->thread()); const QVariant &value = m_config.loadRelaxed()->value(key, fallback); if (key == QStringLiteral("autoDisplayFeature")) { markPropertySet(0, !m_config.loadRelaxed()->isDefaultValue(key)); auto newValue = qvariant_cast(value); QMetaObject::invokeMethod(this, [this, newValue, key, value]() { if (m_userConfig && p_autoDisplayFeature != newValue) { Q_ASSERT(QThread::currentThread() == m_userConfig->thread()); p_autoDisplayFeature = newValue; Q_EMIT m_userConfig->autoDisplayFeatureChanged(); Q_EMIT m_userConfig->valueChanged(key, value); } }); return; } if (key == QStringLiteral("colorMode")) { markPropertySet(1, !m_config.loadRelaxed()->isDefaultValue(key)); auto newValue = qvariant_cast(value); QMetaObject::invokeMethod(this, [this, newValue, key, value]() { if (m_userConfig && p_colorMode != newValue) { Q_ASSERT(QThread::currentThread() == m_userConfig->thread()); p_colorMode = newValue; Q_EMIT m_userConfig->colorModeChanged(); Q_EMIT m_userConfig->valueChanged(key, value); } }); return; } if (key == QStringLiteral("defaultColorMode")) { markPropertySet(2, !m_config.loadRelaxed()->isDefaultValue(key)); auto newValue = qvariant_cast(value); QMetaObject::invokeMethod(this, [this, newValue, key, value]() { if (m_userConfig && p_defaultColorMode != newValue) { Q_ASSERT(QThread::currentThread() == m_userConfig->thread()); p_defaultColorMode = newValue; Q_EMIT m_userConfig->defaultColorModeChanged(); Q_EMIT m_userConfig->valueChanged(key, value); } }); return; } if (key == QStringLiteral("enableDtkAnimations")) { markPropertySet(3, !m_config.loadRelaxed()->isDefaultValue(key)); auto newValue = qvariant_cast(value); QMetaObject::invokeMethod(this, [this, newValue, key, value]() { if (m_userConfig && p_enableDtkAnimations != newValue) { Q_ASSERT(QThread::currentThread() == m_userConfig->thread()); p_enableDtkAnimations = newValue; Q_EMIT m_userConfig->enableDtkAnimationsChanged(); Q_EMIT m_userConfig->valueChanged(key, value); } }); return; } if (key == QStringLiteral("featureUpdated")) { markPropertySet(4, !m_config.loadRelaxed()->isDefaultValue(key)); auto newValue = qvariant_cast(value); QMetaObject::invokeMethod(this, [this, newValue, key, value]() { if (m_userConfig && p_featureUpdated != newValue) { Q_ASSERT(QThread::currentThread() == m_userConfig->thread()); p_featureUpdated = newValue; Q_EMIT m_userConfig->featureUpdatedChanged(); Q_EMIT m_userConfig->valueChanged(key, value); } }); return; } if (key == QStringLiteral("keyboardsearchDisabled")) { markPropertySet(5, !m_config.loadRelaxed()->isDefaultValue(key)); auto newValue = qvariant_cast(value); QMetaObject::invokeMethod(this, [this, newValue, key, value]() { if (m_userConfig && p_keyboardsearchDisabled != newValue) { Q_ASSERT(QThread::currentThread() == m_userConfig->thread()); p_keyboardsearchDisabled = newValue; Q_EMIT m_userConfig->keyboardsearchDisabledChanged(); Q_EMIT m_userConfig->valueChanged(key, value); } }); return; } if (key == QStringLiteral("rules")) { markPropertySet(6, !m_config.loadRelaxed()->isDefaultValue(key)); auto newValue = qvariant_cast(value); QMetaObject::invokeMethod(this, [this, newValue, key, value]() { if (m_userConfig && p_rules != newValue) { Q_ASSERT(QThread::currentThread() == m_userConfig->thread()); p_rules = newValue; Q_EMIT m_userConfig->rulesChanged(); Q_EMIT m_userConfig->valueChanged(key, value); } }); return; } if (key == QStringLiteral("scrollBarPolicy")) { markPropertySet(7, !m_config.loadRelaxed()->isDefaultValue(key)); auto newValue = qvariant_cast(value); QMetaObject::invokeMethod(this, [this, newValue, key, value]() { if (m_userConfig && p_scrollBarPolicy != newValue) { Q_ASSERT(QThread::currentThread() == m_userConfig->thread()); p_scrollBarPolicy = newValue; Q_EMIT m_userConfig->scrollBarPolicyChanged(); Q_EMIT m_userConfig->valueChanged(key, value); } }); return; } if (key == QStringLiteral("sizeMode")) { markPropertySet(8, !m_config.loadRelaxed()->isDefaultValue(key)); auto newValue = qvariant_cast(value); QMetaObject::invokeMethod(this, [this, newValue, key, value]() { if (m_userConfig && p_sizeMode != newValue) { Q_ASSERT(QThread::currentThread() == m_userConfig->thread()); p_sizeMode = newValue; Q_EMIT m_userConfig->sizeModeChanged(); Q_EMIT m_userConfig->valueChanged(key, value); } }); return; } if (key == QStringLiteral("themeType")) { markPropertySet(9, !m_config.loadRelaxed()->isDefaultValue(key)); auto newValue = qvariant_cast(value); QMetaObject::invokeMethod(this, [this, newValue, key, value]() { if (m_userConfig && p_themeType != newValue) { Q_ASSERT(QThread::currentThread() == m_userConfig->thread()); p_themeType = newValue; Q_EMIT m_userConfig->themeTypeChanged(); Q_EMIT m_userConfig->valueChanged(key, value); } }); return; } if (key == QStringLiteral("titlebarHeight")) { markPropertySet(10, !m_config.loadRelaxed()->isDefaultValue(key)); auto newValue = qvariant_cast(value); QMetaObject::invokeMethod(this, [this, newValue, key, value]() { if (m_userConfig && p_titlebarHeight != newValue) { Q_ASSERT(QThread::currentThread() == m_userConfig->thread()); p_titlebarHeight = newValue; Q_EMIT m_userConfig->titlebarHeightChanged(); Q_EMIT m_userConfig->valueChanged(key, value); } }); return; } if (key == QStringLiteral("underlineShortcut")) { markPropertySet(11, !m_config.loadRelaxed()->isDefaultValue(key)); auto newValue = qvariant_cast(value); QMetaObject::invokeMethod(this, [this, newValue, key, value]() { if (m_userConfig && p_underlineShortcut != newValue) { Q_ASSERT(QThread::currentThread() == m_userConfig->thread()); p_underlineShortcut = newValue; Q_EMIT m_userConfig->underlineShortcutChanged(); Q_EMIT m_userConfig->valueChanged(key, value); } }); return; } } inline void markPropertySet(const int index, bool on = true) { if (index < 32) { if (on) m_propertySetStatus0.fetchAndOrOrdered(1 << (index - 0)); else m_propertySetStatus0.fetchAndAndOrdered(~(1 << (index - 0))); return; } Q_UNREACHABLE(); } inline bool testPropertySet(const int index) const { if (index < 32) { return (m_propertySetStatus0.loadRelaxed() & (1 << (index - 0))); } Q_UNREACHABLE(); } // Member variables QAtomicPointer m_config = nullptr; QAtomicInteger m_status = static_cast(Status::Invalid); QPointer m_userConfig = nullptr; QAtomicInteger m_propertySetStatus0 = 0; // Property storage bool p_autoDisplayFeature { false }; // Default value: "" QString p_colorMode { QLatin1String("") }; // Default value: "color" QString p_defaultColorMode { QStringLiteral(u"\u0063\u006f\u006c\u006f\u0072") }; bool p_enableDtkAnimations { false }; bool p_featureUpdated { false }; bool p_keyboardsearchDisabled { false }; // Default value: "*.debug=false" QString p_rules { QStringLiteral(u"\u002a\u002e\u0064\u0065\u0062\u0075\u0067\u003d\u0066\u0061\u006c\u0073\u0065") }; qlonglong p_scrollBarPolicy { 0 }; qlonglong p_sizeMode { 0 }; qlonglong p_themeType { 0 }; qlonglong p_titlebarHeight { -1 }; bool p_underlineShortcut { false }; }; QPointer m_data; }; #endif // DCONFIG_ORG_DEEPIN_DTK_PREFERENCE_H dtkcore-6.7.46/src/log/log.cmake000066400000000000000000000003751522615770400164220ustar00rootroot00000000000000file(GLOB LOG_HEADER ${CMAKE_CURRENT_LIST_DIR}/../../include/log/LogManager.h ) set(LOG_SOURCE ${CMAKE_CURRENT_LIST_DIR}/LogManager.cpp ${CMAKE_CURRENT_LIST_DIR}/dconfig_org_deepin_dtk_preference.hpp ) set(log_SRCS ${LOG_HEADER} ${LOG_SOURCE} ) dtkcore-6.7.46/src/settings/000077500000000000000000000000001522615770400157115ustar00rootroot00000000000000dtkcore-6.7.46/src/settings/backend/000077500000000000000000000000001522615770400173005ustar00rootroot00000000000000dtkcore-6.7.46/src/settings/backend/dsettingsdconfigbackend.cpp000066400000000000000000000040551522615770400246560ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "settings/backend/dsettingsdconfigbackend.h" #include #include #include DCORE_BEGIN_NAMESPACE class DSettingsDConfigBackendPrivate { public: explicit DSettingsDConfigBackendPrivate(DSettingsDConfigBackend *parent) : q_ptr(parent) {} DConfig *dConfig = nullptr; QMutex writeLock; DSettingsDConfigBackend *q_ptr; Q_DECLARE_PUBLIC(DSettingsDConfigBackend) }; /*! @~english @class Dtk::Core::DSettingsDConfigBackend \inmodule dtkcore @brief Storage DSetttings to an DConfig. */ /*! @~english @brief Save data to configure file name with DConfig. \a name configure file name. \a subpath subdirectory of configure file name. \a parent */ DSettingsDConfigBackend::DSettingsDConfigBackend(const QString &name, const QString &subpath, QObject *parent) : DSettingsBackend(parent), d_ptr(new DSettingsDConfigBackendPrivate(this)) { Q_D(DSettingsDConfigBackend); d->dConfig = new DConfig(name, subpath, this); } DSettingsDConfigBackend::~DSettingsDConfigBackend() { } /*! @~english @brief List all keys of DConfig @return */ QStringList DSettingsDConfigBackend::keys() const { Q_D(const DSettingsDConfigBackend); return d->dConfig->keyList(); } /*! @~english @brief Get value of key from DConfig \a key @return */ QVariant DSettingsDConfigBackend::getOption(const QString &key) const { Q_D(const DSettingsDConfigBackend); return d->dConfig->value(key); } /*! @~english @brief Set value of key to DConfig \a key \a value */ void DSettingsDConfigBackend::doSetOption(const QString &key, const QVariant &value) { Q_D(DSettingsDConfigBackend); d->writeLock.lock(); d->dConfig->setValue(key, value); d->writeLock.unlock(); } /*! @~english @brief Trigger DSettings to save option value to DConfig */ void DSettingsDConfigBackend::doSync() { Q_D(DSettingsDConfigBackend); // TODO } DCORE_END_NAMESPACE dtkcore-6.7.46/src/settings/backend/gsettingsbackend.cpp000066400000000000000000000065201522615770400233260ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "settings/backend/gsettingsbackend.h" //#include #include #include #include #include #if QT_HAS_INCLUDE() #include #else #include #endif #include DCORE_BEGIN_NAMESPACE QString unqtifyName(const QString &name) { QString ret; for (auto p : name) { const QChar c(p); if (c.isUpper()) { ret.append("-"); ret.append(c.toLower().toLatin1()); } else { ret.append(c); } } return ret; } QString qtifyName(const QString &key) { return QString(key).replace(".", "-").replace("_", "-"); } class GSettingsBackendPrivate { public: GSettingsBackendPrivate(GSettingsBackend *parent) : q_ptr(parent) {} QGSettings *gsettings; QMap keyMap; GSettingsBackend *q_ptr; Q_DECLARE_PUBLIC(GSettingsBackend) }; /*! @~english @class Dtk::Core::GSettingsBackend \inmodule dtkcore @brief Storage backend of DSettings use gsettings. You should generate gsetting schema with /usr/lib/x86_64-linux-gnu/libdtk-$$VERSION/DCore/bin/dtk-settings. You can find this tool from libdtkcore-bin. use /usr/lib/x86_64-linux-gnu/libdtk-$$VERSION/DCore/bin/dtk-settings -h for help. */ GSettingsBackend::GSettingsBackend(DSettings *settings, QObject *parent) : DSettingsBackend(parent), d_ptr(new GSettingsBackendPrivate(this)) { Q_D(GSettingsBackend); QJsonObject settingsMeta = settings->meta(); auto gsettingsMeta = settingsMeta.value("gsettings").toObject(); auto id = gsettingsMeta.value("id").toString(); auto path = gsettingsMeta.value("path").toString(); for (QString key : settings->keys()) { auto gsettingsKey = QString(key).replace(".", "-").replace("_", "-"); d->keyMap.insert(gsettingsKey, key); } d->gsettings = new QGSettings(id.toUtf8(), path.toUtf8(), this); connect(d->gsettings, &QGSettings::changed, this, [ = ](const QString & key) { auto dk = d->keyMap.value(unqtifyName(key)); // qDebug() << "gsetting change" << key << d->gsettings->get(key); Q_EMIT optionChanged(dk, d->gsettings->get(key)); }); } GSettingsBackend::~GSettingsBackend() { } /*! @~english @brief List all gsettings keys. @return Return all gsettings keys. */ QStringList GSettingsBackend::keys() const { Q_D(const GSettingsBackend); return d->gsettings->keys(); } /*! @~english @brief Get value of key. @return Return the value of the given \a key. */ QVariant GSettingsBackend::getOption(const QString &key) const { Q_D(const GSettingsBackend); return d->gsettings->get(qtifyName(key)); } /*! @~english @brief Set value to gsettings Use the \a key to save the \a value. */ void GSettingsBackend::doSetOption(const QString &key, const QVariant &value) { Q_D(GSettingsBackend); if (value != d->gsettings->get(qtifyName(key))) { // qDebug() << "doSetOption" << key << d->gsettings->get(qtifyName(key)); d->gsettings->set(qtifyName(key), value); } } /*! @~english @brief Trigger DSettings to sync option to storage. */ void GSettingsBackend::doSync() { Q_EMIT sync(); } DCORE_END_NAMESPACE dtkcore-6.7.46/src/settings/backend/qsettingbackend.cpp000066400000000000000000000043171522615770400231570ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2016 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "settings/backend/qsettingbackend.h" #include #include #include DCORE_BEGIN_NAMESPACE class QSettingBackendPrivate { public: QSettingBackendPrivate(QSettingBackend *parent) : q_ptr(parent) {} QSettings *settings = nullptr; QMutex writeLock; QSettingBackend *q_ptr; Q_DECLARE_PUBLIC(QSettingBackend) }; /*! @~english @class Dtk::Core::QSettingBackend \inmodule dtkcore @brief Storage DSetttings to an QSettings. */ /*! @~english @brief Save data to filepath with QSettings::NativeFormat format. \a filepath is path to storage data. \a parent */ QSettingBackend::QSettingBackend(const QString &filepath, QObject *parent) : DSettingsBackend(parent), d_ptr(new QSettingBackendPrivate(this)) { Q_D(QSettingBackend); d->settings = new QSettings(filepath, QSettings::NativeFormat, this); qDebug() << "create config" << d->settings->fileName(); } QSettingBackend::~QSettingBackend() { } /*! @~english @brief List all keys of QSettings @return */ QStringList QSettingBackend::keys() const { Q_D(const QSettingBackend); return d->settings->childGroups(); } /*! @~english @brief Get value of key from QSettings \a key @return */ QVariant QSettingBackend::getOption(const QString &key) const { Q_D(const QSettingBackend); d->settings->beginGroup(key); auto value = d->settings->value("value"); d->settings->endGroup(); return value; } /*! @~english @brief Set value of key to QSettings \a key \a value */ void QSettingBackend::doSetOption(const QString &key, const QVariant &value) { Q_D(QSettingBackend); d->writeLock.lock(); d->settings->beginGroup(key); auto oldValue = d->settings->value("value"); if (oldValue != value) { d->settings->setValue("value", value); } d->settings->endGroup(); d->settings->sync(); d->writeLock.unlock(); } /*! @~english @brief Trigger DSettings to save option value to QSettings */ void QSettingBackend::doSync() { Q_D(QSettingBackend); d->settings->sync(); } DCORE_END_NAMESPACE dtkcore-6.7.46/src/settings/dsettings.cpp000066400000000000000000000276071522615770400204350ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2016 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dsettings.h" #include #include #include #include #include #include #include #include "dsettingsoption.h" #include "dsettingsgroup.h" #include "dsettingsbackend.h" DCORE_BEGIN_NAMESPACE class DSettingsPrivate { public: DSettingsPrivate(DSettings *parent) : q_ptr(parent) {} DSettingsBackend *backend = nullptr; QJsonObject meta; QMap options; QMap childGroups; QList childGroupKeys; DSettings *q_ptr; Q_DECLARE_PUBLIC(DSettings) }; /*! @~english @class Dtk::Core::DSettingsBackend \inmodule dtkcore @brief DSettingsBackend is interface of DSettings storage class. Simaple example: @code { "groups": [{ "key": "base", "name": "Basic settings", "groups": [{ "key": "open_action", "name": "Open Action", "options": [{ "key": "alway_open_on_new", "type": "checkbox", "text": "Always Open On New Windows", "default": true }, { "key": "open_file_action", "name": "Open File:", "type": "combobox", "default": "" } ] }, { "key": "new_tab_windows", "name": "New Tab & Window", "options": [{ "key": "new_window_path", "name": "New Window Open:", "type": "combobox", "default": "" }, { "key": "new_tab_path", "name": "New Tab Open:", "type": "combobox", "default": "" } ] } ] }] } @endcode How to read/write key and value: @code // init a storage backend QTemporaryFile tmpFile; tmpFile.open(); auto backend = new Dtk::Core::QSettingBackend(tmpFile.fileName()); // read settings from json auto settings = Dtk::Core::DSettings::fromJsonFile(":/resources/data/dfm-settings.json"); settings->setBackend(backend); // read value auto opt = settings->option("base.new_tab_windows.new_window_path"); qDebug() << opt->value(); // modify value opt->setValue("Test") qDebug() << opt->value(); @endcode @sa Dtk::Core::DSettingsOption @sa Dtk::Core::DSettingsGroup @sa Dtk::Core::DSettingsBackend @sa Dtk::Widget::DSettingsWidgetFactory @sa Dtk::Widget::DSettingsDialog */ /*! @~english @fn virtual QStringList DSettingsBackend::keys() const = 0; @brief return all key of storage. */ /*! @~english @fn virtual QVariant DSettingsBackend::getOption(const QString &key) const = 0; @brief get value by \a key. */ /*! @~english @fn virtual void DSettingsBackend::doSync() = 0; @brief do the real sync action. */ /*! @~english @fn virtual void DSettingsBackend::doSetOption(const QString &key, const QVariant &value) = 0; @brief write \a key / \a value to storage. */ /*! @~english @fn void DSettingsBackend::optionChanged(const QString &key, const QVariant &value); @brief emitted when option \a value changed. */ /*! @~english @fn void DSettingsBackend::sync(); @brief private signal, please do not use it. */ /*! @~english @fn void DSettingsBackend::setOption(const QString &key, const QVariant &value); @brief private signal, please do not use it. \internal \a key \a value */ /*! @~english @class Dtk::Core::DSettings \inmodule dtkcore @brief DSettings is the basic library that provides unified configuration storage and interface generation tools for Dtk applications. DSetting uses json as the description file for the application configuration. The configuration of application query is divided into two basic levels: group / key value. The standard Dtk configuration control generally contains only three levels of group / subgroup / key values. For keys with more than three levels, you can use the. DSettings's API interface reads and writes, but cannot be displayed on standard DSettingsDialogs. Simple configuration file: @code { "groups": [{ "key": "base", "name": "Basic settings", "groups": [{ "key": "open_action", "name": "Open Action", "options": [{ "key": "alway_open_on_new", "type": "checkbox", "text": "Always Open On New Windows", "default": true }, { "key": "open_file_action", "name": "Open File:", "type": "combobox", "default": "" } ] }, { "key": "new_tab_windows", "name": "New Tab & Window", "options": [{ "key": "new_window_path", "name": "New Window Open:", "type": "combobox", "default": "" }, { "key": "new_tab_path", "name": "New Tab Open:", "type": "combobox", "default": "" } ] } ] }] } @endcode The group contains a root group of base with two subgroups: open_action/new_tab_windows, each of which contains several options. The complete access id for the configuration "New Window Open:" is base.new_tab_windows.new_window_path. How to read/write key and value: @code // init a storage backend QTemporaryFile tmpFile; tmpFile.open(); auto backend = new Dtk::Core::QSettingBackend(tmpFile.fileName()); // read settings from json auto settings = Dtk::Core::DSettings::fromJsonFile(":/resources/data/dfm-settings.json"); settings->setBackend(backend); // read value auto opt = settings->option("base.new_tab_windows.new_window_path"); qDebug() << opt->value(); // modify value opt->setValue("Test") qDebug() << opt->value(); @endcode @sa Dtk::Core::DSettingsOption @sa Dtk::Core::DSettingsGroup @sa Dtk::Core::DSettingsBackend @sa Dtk::Widget::DSettingsWidgetFactory @sa Dtk::Widget::DSettingsDialog */ DSettings::DSettings(QObject *parent) : QObject(parent), dd_ptr(new DSettingsPrivate(this)) { } DSettings::~DSettings() { } void DSettings::setBackend(DSettingsBackend *backend) { Q_D(DSettings); if (nullptr == backend) { return; } if (d->backend != nullptr) { qWarning() << "set backend to exist " << d->backend; } d->backend = backend; auto backendWriteThread = new QThread; d->backend->moveToThread(backendWriteThread); connect(d->backend, &DSettingsBackend::optionChanged, this, [ = ](const QString & key, const QVariant & value) { option(key)->setValue(value); }); // exit and delete thread connect(this, &DSettings::destroyed, this, [backendWriteThread](){ if (backendWriteThread->isRunning()) { backendWriteThread->quit(); backendWriteThread->wait(); } backendWriteThread->deleteLater(); }); backendWriteThread->start(); // load form backend loadValue(); } /*! @~english @brief Get DSettings from \a json. The returned data needs to be manually released after use. */ QPointer DSettings::fromJson(const QByteArray &json) { auto settingsPtr = QPointer(new DSettings); settingsPtr->parseJson(json); return settingsPtr; } QPointer DSettings::fromJsonFile(const QString &filepath) { QFile jsonFile(filepath); jsonFile.open(QIODevice::ReadOnly); auto jsonData = jsonFile.readAll(); jsonFile.close(); return DSettings::fromJson(jsonData); } QJsonObject DSettings::meta() const { Q_D(const DSettings); return d->meta; } QStringList DSettings::keys() const { Q_D(const DSettings); return d->options.keys(); } QPointer DSettings::option(const QString &key) const { Q_D(const DSettings); return d->options.value(key); } QVariant DSettings::value(const QString &key) const { Q_D(const DSettings); auto opt = d->options.value(key); if (opt.isNull()) { return QVariant(); } return opt->value(); } QStringList DSettings::groupKeys() const { Q_D(const DSettings); return d->childGroupKeys; } QList > DSettings::groups() const { Q_D(const DSettings); return d->childGroups.values(); } /*! @~english @brief DSettings::group will recurrence find childGroup \a key @return */ QPointer DSettings::group(const QString &key) const { Q_D(const DSettings); auto childKeylist = key.split("."); if (0 >= childKeylist.length()) { return nullptr; } auto mainGroupKey = childKeylist.value(0); if (1 >= childKeylist.length()) { return d->childGroups.value(mainGroupKey); } return d->childGroups.value(mainGroupKey)->childGroup(key); } QList > DSettings::options() const { Q_D(const DSettings); return d->options.values(); } QVariant DSettings::getOption(const QString &key) const { QPointer optionPointer = option(key); if (optionPointer) { return optionPointer->value(); } return QVariant(); } void DSettings::setOption(const QString &key, const QVariant &value) { option(key)->setValue(value); } void DSettings::sync() { Q_D(DSettings); if (!d->backend) { qWarning() << "backend was not setted..!"; return; } d->backend->doSync(); } void DSettings::reset() { Q_D(DSettings); for (auto option : d->options) { if (option->canReset()) { setOption(option->key(), option->defaultValue()); } } if (!d->backend) { qWarning() << "backend was not setted..!"; return; } d->backend->sync(); } void DSettings::parseJson(const QByteArray &json) { Q_D(DSettings); auto jsonDoc = QJsonDocument::fromJson(json); d->meta = jsonDoc.object(); auto mainGroups = d->meta.value("groups"); for (auto groupJson : mainGroups.toArray()) { auto group = DSettingsGroup::fromJson("", groupJson.toObject()); group->setParent(this); for (auto option : group->options()) { d->options.insert(option->key(), option); } d->childGroupKeys << group->key(); d->childGroups.insert(group->key(), group); } for (auto option : d->options.values()) { d->options.insert(option->key(), option); connect(option.data(), &DSettingsOption::valueChanged, this, [ = ](QVariant value) { if (d->backend) { Q_EMIT d->backend->setOption(option->key(), value); } else { qWarning() << "backend was not setted..!"; } Q_EMIT valueChanged(option->key(), value); }); } } void DSettings::loadValue() { Q_D(DSettings); if (!d->backend) { qWarning() << "backend was not setted..!"; return; } for (auto key : d->backend->keys()) { auto value = d->backend->getOption(key); auto opt = option(key); if (!value.isValid() || opt.isNull()) { continue; } opt->blockSignals(true); opt->setValue(value); opt->blockSignals(false); } } DCORE_END_NAMESPACE dtkcore-6.7.46/src/settings/dsettingsgroup.cpp000066400000000000000000000136131522615770400215020ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2016 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dsettingsgroup.h" #include #include #include DCORE_BEGIN_NAMESPACE class DSettingsGroupPrivate { public: DSettingsGroupPrivate(DSettingsGroup *parent) : q_ptr(parent) {} QString key; QString name; bool hide = false; QMap options; QPointer parent; QMap childOptions; QList childOptionKeys; QMap childGroups; QList childGroupKeys; void parseJson(const QString &prefixKey, const QJsonObject &group); DSettingsGroup *q_ptr; Q_DECLARE_PUBLIC(DSettingsGroup) }; /*! @~english @class Dtk::Core::DSettingsGroup \inmodule dtkcore @brief A group of DSettingsOption and DSettingsGroup. DSettingsGroup can contain a lost option and subgroup. */ DSettingsGroup::DSettingsGroup(QObject *parent) : QObject(parent), dd_ptr(new DSettingsGroupPrivate(this)) { } DSettingsGroup::~DSettingsGroup() { } /*! @~english @brief Get direct parent group of this group. @return */ QPointer DSettingsGroup::parentGroup() const { Q_D(const DSettingsGroup); return d->parent; } /*! @~english @brief Change the direct \a parentGroup of this group. */ void DSettingsGroup::setParentGroup(QPointer parentGroup) { Q_D(DSettingsGroup); d->parent = parentGroup; } /*! @~english @brief Return the full key of this group, include all parent. @return eturn the full key of this group, include all parent. */ QString DSettingsGroup::key() const { Q_D(const DSettingsGroup); return d->key; } /*! @~english @brief Get display name of this group, it may be translated. @return Get display name of this group. */ QString DSettingsGroup::name() const { Q_D(const DSettingsGroup); return d->name; } /*! @~english @brief Check this group will show on DSettings dialog. @return true indicates that this option group will be displayed。 */ bool DSettingsGroup::isHidden() const { Q_D(const DSettingsGroup); return d->hide; } /*! @~english @brief Get the child group of groupKey \a groupKey is child group key @return Returns a pointer to a subgroup. */ QPointer DSettingsGroup::childGroup(const QString &groupKey) const { Q_D(const DSettingsGroup); return d->childGroups.value(groupKey); } /*! @~english @brief Get the child option of key \a key is child option key @return Returns a pointer to the child option of key. */ QPointer DSettingsGroup::option(const QString &key) const { Q_D(const DSettingsGroup); return d->childOptions.value(key); } /*! @~english @brief Enum all direct child group of this group @return Returns a list of all subgroup Pointers. */ QList > DSettingsGroup::childGroups() const { Q_D(const DSettingsGroup); QList > grouplist; for (auto groupKey : d->childGroupKeys) { grouplist << d->childGroups.value(groupKey); } return grouplist; } /*! @~english @brief Enum all direct child option with the raw order in json description file. @return Returns a list of all suboption Pointers. */ QList > DSettingsGroup::childOptions() const { Q_D(const DSettingsGroup); QList > optionlist; for (auto optionKey : d->childOptionKeys) { optionlist << d->childOptions.value(optionKey); } return optionlist; } /*! @~english @brief Enum all direct child option of this group. @return Returns a list of all option Pointers. */ QList > DSettingsGroup::options() const { Q_D(const DSettingsGroup); return d->options.values(); } /*! @~english @brief Convert QJsonObject to DSettingsGroup. \a prefixKey instead parse prefix key from parent. \a group is an QJsonObejct instance. @return Returns a group pointer after parsing json. @sa QPointer Dtk::Core::DSettingsOption */ QPointer DSettingsGroup::fromJson(const QString &prefixKey, const QJsonObject &group) { auto groupPtr = QPointer(new DSettingsGroup); groupPtr->parseJson(prefixKey, group); return groupPtr; } /*! @~english @brief Parse QJsonObject to DSettingsGroup. \a prefixKey instead parse prefix key from parent. \a json is an QJsonObejct instance. @sa QPointer Dtk::Core::DSettingsGroup::fromJson(const QString &prefixKey, const QJsonObject &json) */ void DSettingsGroup::parseJson(const QString &prefixKey, const QJsonObject &group) { Q_D(DSettingsGroup); d->parseJson(prefixKey, group); } void DSettingsGroupPrivate::parseJson(const QString &prefixKey, const QJsonObject &group) { Q_Q(DSettingsGroup); key = group.value("key").toString(); Q_ASSERT(!key.isEmpty()); key = prefixKey.isEmpty() ? key : prefixKey + "." + key; name = group.value("name").toString(); hide = group.value("hide").toBool(); for (auto optionJson : group.value("options").toArray()) { auto optionObject = optionJson.toObject(); auto option = DSettingsOption::fromJson(key, optionObject); option->setParent(q); options.insert(option->key(), option); childOptions.insert(option->key(), option); childOptionKeys << option->key(); } auto subGroups = group.value("groups").toArray(); for (auto subGroup : subGroups) { auto child = DSettingsGroup::fromJson(key, subGroup.toObject()); child->setParent(q); child->setParentGroup(q); childGroups.insert(child->key(), child); childGroupKeys << child->key(); for (auto option : child->options()) { options.insert(option->key(), option); } } } DCORE_END_NAMESPACE dtkcore-6.7.46/src/settings/dsettingsoption.cpp000066400000000000000000000157361522615770400216660ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2016 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dsettingsoption.h" #include #include #include DCORE_BEGIN_NAMESPACE class DSettingsOptionPrivate { public: DSettingsOptionPrivate(DSettingsOption *parent) : q_ptr(parent) {} void parseJson(const QString &prefixKey, const QJsonObject &option); QPointer parent; QString key; QString name; QString viewType; QVariant defalutValue; QVariant value; QVariantMap datas; bool canReset; bool hidden; DSettingsOption *q_ptr; Q_DECLARE_PUBLIC(DSettingsOption) }; /*! @~english @class Dtk::Core::DSettingsOption \inmodule dtkcore @brief DSettingsOption is the base key/value item of DSettings. */ /*! @~english @fn void DSettingsOption::valueChanged(QVariant value); @brief Emit when option value change. \a value Changed data. */ /*! @~english @fn void DSettingsOption::dataChanged(const QString &dataType, QVariant value); @brief Emit when option data change. \a dataType Changed data type, \a value Changed data. */ /*! @~english @property Dtk::Core::DSettingsOption::value @brief Current value of this option. */ DSettingsOption::DSettingsOption(QObject *parent) : QObject(parent), dd_ptr(new DSettingsOptionPrivate(this)) { } DSettingsOption::~DSettingsOption() { } /*! @~english @brief Get direct parent group of this option. @return Returns the direct parent group of the this option. */ QPointer DSettingsOption::parentGroup() const { Q_D(const DSettingsOption); return d->parent; } /*! @~english @brief Change the direct parent group of this option. \a parentGroup parent group. */ void DSettingsOption::setParentGroup(QPointer parentGroup) { Q_D(DSettingsOption); d->parent = parentGroup; } /*! @~english @brief Return the full key of this option, include all parent. @return Return the full key of this option, include all parent. */ QString DSettingsOption::key() const { Q_D(const DSettingsOption); return d->key; } /*! @~english @brief Get display name of the option, it may be translated. @return Return the name of the option. */ QString DSettingsOption::name() const { Q_D(const DSettingsOption); return d->name; } /*! @~english @brief Check this option can be reset to default value. if false, reset action will not take effect. @return true if can be reset. */ bool DSettingsOption::canReset() const { Q_D(const DSettingsOption); return d->canReset; } /*! @~english @brief Default value of this option, must config in this json desciption file. @return Return the default value of this option. */ QVariant DSettingsOption::defaultValue() const { Q_D(const DSettingsOption); return d->defalutValue; } /*! @~english @brief Get current value of option. @return Return the current value of this option. */ QVariant DSettingsOption::value() const { Q_D(const DSettingsOption); return (!d->value.isValid() || d->value.isNull()) ? d->defalutValue : d->value; } /*! @~english @brief Custom data of option, like QObject::property. \a dataType Data type. @return Data type Indicates the data. @sa QObject::property @sa Dtk::Core::DSettingsOption::setData */ QVariant DSettingsOption::data(const QString &dataType) const { Q_D(const DSettingsOption); return d->datas.value(dataType); } /*! @~english @brief UI widget type of this option. @return Returns the UI widget type of the option. @sa Dtk::Widget::DSettingsWidgetFactory */ QString DSettingsOption::viewType() const { Q_D(const DSettingsOption); return d->viewType; } /*! @~english @brief Check this option will show on DSettings dialog. @return true if option not bind to ui element. */ bool DSettingsOption::isHidden() const { Q_D(const DSettingsOption); return d->hidden; } /*! @~english @brief Convert QJsonObject to DSettingsOption. \a prefixKey instead parse prefix key from parent. \a json is an QJsonObejct instance. @return Return the option data after parsing. */ QPointer DSettingsOption::fromJson(const QString &prefixKey, const QJsonObject &json) { auto optionPtr = QPointer(new DSettingsOption); optionPtr->parseJson(prefixKey, json); return optionPtr; } /*! @~english @brief Set current value of option. \a value Current value of option. */ void DSettingsOption::setValue(QVariant value) { Q_D(DSettingsOption); // 默认没有设置value时比较默认值。防止reset时出现所有的option都å�‘å°„valueChanged if (this->value() == value) { return; } d->value = value; Q_EMIT valueChanged(value); } ///*! // * @brief Override default value of json // * \a value // */ //void DSettingsOption::setDefault(QVariant value) //{ // Q_D(DSettingsOption); // d->defalutValue = value; //} /*! @~english @brief Set custom data. \a dataType is data id, just a unique string. \a value of the data id. @sa Dtk::Core::DSettingsOption::data */ void DSettingsOption::setData(const QString &dataType, QVariant value) { Q_D(DSettingsOption); if (d->datas.value(dataType) == value) { return; } d->datas.insert(dataType, value); Q_EMIT dataChanged(dataType, value); } /*! @~english @brief Parse QJsonObject to DSettingsOption. \a prefixKey instead parse prefix key from parent. \a option is an QJsonObejct instance. @sa QPointer Dtk::Core::DSettingsOption::fromJson(const QString &prefixKey, const QJsonObject &json) */ void DSettingsOption::parseJson(const QString &prefixKey, const QJsonObject &option) { Q_D(DSettingsOption); d->parseJson(prefixKey, option); } void DSettingsOptionPrivate::parseJson(const QString &prefixKey, const QJsonObject &option) { // Q_Q(Option); key = option.value("key").toString(); Q_ASSERT(!key.isEmpty()); Q_ASSERT(!prefixKey.isEmpty()); key = prefixKey + "." + key; name = option.value("name").toString(); canReset = !option.contains("reset") ? true : option.value("reset").toBool(); defalutValue = option.value("default").toVariant(); hidden = !option.contains("hide") ? false : option.value("hide").toBool(); viewType = option.value("type").toString(); QStringList revserdKeys; revserdKeys << "key" << "name" << "reset" << "default" << "hide" << "type"; auto allKeys = option.keys(); for (auto key : revserdKeys) { allKeys.removeAll(key); } for (auto key : allKeys) { auto value = option.value(key); if (value.isArray()) { QStringList stringlist; for (auto va : value.toArray()) { stringlist << QString("%1").arg(va.toString()); } datas.insert(key, stringlist); } else { datas.insert(key, value.toVariant()); } } } DCORE_END_NAMESPACE dtkcore-6.7.46/src/settings/settings.cmake000066400000000000000000000020211522615770400205460ustar00rootroot00000000000000if(LINUX) file(GLOB SETTINGS_SOURCES ${CMAKE_CURRENT_LIST_DIR}/*.cpp ${CMAKE_CURRENT_LIST_DIR}/backend/*.cpp ) file(GLOB SETTINGS_HEADERS ${CMAKE_CURRENT_LIST_DIR}/../../include/settings/*.h ${CMAKE_CURRENT_LIST_DIR}/../../include/settings/backend/*.h ) else() file(GLOB SETTINGS_SOURCES ${CMAKE_CURRENT_LIST_DIR}/*.cpp ${CMAKE_CURRENT_LIST_DIR}/backend/dsettingsdconfigbackend.cpp ${CMAKE_CURRENT_LIST_DIR}/backend/qsettingbackend.cpp ) file(GLOB SETTINGS_HEADERS ${CMAKE_CURRENT_LIST_DIR}/../../include/settings/*.h ${CMAKE_CURRENT_LIST_DIR}/../../include/settings/backend/dsettingsdconfigbackend.h ${CMAKE_CURRENT_LIST_DIR}/../../include/settings/backend/qsettingbackend.h ) endif() if(NOT DTK5) list(REMOVE_ITEM SETTINGS_SOURCES "${CMAKE_CURRENT_LIST_DIR}/backend/gsettingsbackend.cpp") list(REMOVE_ITEM SETTINGS_HEADERS "${CMAKE_CURRENT_LIST_DIR}/../../include/settings/backend/gsettingsbackend.h") endif() set(settings_SRC ${SETTINGS_HEADERS} ${SETTINGS_SOURCES} ) dtkcore-6.7.46/src/util/000077500000000000000000000000001522615770400150265ustar00rootroot00000000000000dtkcore-6.7.46/src/util/README.dpinyin000066400000000000000000000002521522615770400173560ustar00rootroot00000000000000Name: chinese_pinyin Version: 1.0.1 Author: flyerhzm License: MIT License Home: https://github.com/flyerhzm/chinese_pinyin Description: translate chinese hanzi to pinyin dtkcore-6.7.46/src/util/dabstractunitformatter.cpp000066400000000000000000000104341522615770400223270ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dabstractunitformatter.h" DCORE_BEGIN_NAMESPACE /*! @~english @class Dtk::Core::DAbstractUnitFormatter @ingroup dutil @brief DAbstractUnitFormatter is a interface which manages the data with the same type DAbstractUnitFormatter provides interfaces including:
1. The maximum value of one unit. 2. The minumum value of one unit. 3. The convert rate to next unit. 4. The string to display one unit. */ /*! @~english @fn int DAbstractUnitFormatter::unitMax() const = 0 @brief Get the maximum unit in the list */ /*! @~english @fn int DAbstractUnitFormatter::unitMin() const = 0 @brief Get the minumum unit in the list */ /*! @~english @fn uint DAbstractUnitFormatter::unitConvertRate(int unitId) const = 0 @brief Get the convert rate to next unit of unitId @param[in] unitId the id of one unit */ /*! @~english @fn qreal DAbstractUnitFormatter::unitValueMax(int unitId) const @brief Get the maximum value of unitId @param[in] unitId the id of one unit */ /*! @~english @fn qreal DAbstractUnitFormatter::unitValueMin(int unitId) const @brief Get the minumum value of unitId @param[in] unitId the id of one unit */ /*! @~english @fn QString DAbstractUnitFormatter::unitStr(int unitId) const = 0 @brief Get the display string of unitId @param[in] unitId the id of one unit */ /*! @~english @brief Constructor of DAbstractUnitFormatter */ DAbstractUnitFormatter::DAbstractUnitFormatter() {} /*! @~english @brief Destructor of DAbstractUnitFormatter */ DAbstractUnitFormatter::~DAbstractUnitFormatter() {} /*! @~english @brief Convert value from unit currentUnit to targetUnit. If currentUnit is smaller than targetUnit, the value will zoom out until the unit is equal to targetUnit. Instead it will zoom in. @param[in] value primitive value @param[in] currentUnit current unit of value @param[in] targetUnit target unit to convert to @return qreal the value with unit targetUnit */ qreal DAbstractUnitFormatter::formatAs(qreal value, int currentUnit, const int targetUnit) const { while (currentUnit < targetUnit) value /= unitConvertRate(currentUnit++); while (currentUnit > targetUnit) value *= unitConvertRate(--currentUnit); return value; } /*! @~english @brief Convert the value to a proper unit. If unit is larger than unitMin() or smaller than unitMax, value will be converted to the unit where value is close to the unitValueMin() @param[in] value primitive value @param[in] unit current unit @return QPair a pair of the converted value and unit */ QPair DAbstractUnitFormatter::format(const qreal value, const int unit) const { // can convert to smaller unit if (unit > unitMin() && value < unitValueMin(unit)) return format(value * unitConvertRate(unit - 1), unit - 1); // can convert to bigger unit if (unit < unitMax() && value > unitValueMax(unit)) return format(value / unitConvertRate(unit), unit + 1); return QPair(value, unit); } /*! @~english @brief A version of format() with all the convert data @param[in] value primitive value @param[in] unit current unit @return QList> pairs of all converted value and unit */ QList> DAbstractUnitFormatter::formatAsUnitList(const qreal value, int unit) const { if (qFuzzyIsNull(value)) return QList>(); if (value < unitValueMin(unit) || unit == unitMin()) { if (unit != unitMin()) return formatAsUnitList(value * unitConvertRate(unit - 1), unit - 1); else return std::move(QList>() << QPair(value, unit)); } ulong _value = ulong(value); QList> ret = formatAsUnitList(value - _value, unit); while (_value && unit != unitMax()) { const ulong rate = unitConvertRate(unit); const ulong r = _value % rate; if (r) ret.push_front(QPair(r, unit)); unit += 1; _value /= rate; } if (_value) ret.push_front(QPair(_value, unit)); return ret; } DCORE_END_NAMESPACE dtkcore-6.7.46/src/util/ddbusextendedabstractinterface.cpp000066400000000000000000000521151522615770400237650ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2015 Jolla Ltd. // // SPDX-License-Identifier: LGPL-2.1-or-later #include "ddbusextendedpendingcallwatcher_p.h" #include #include #include #include #include #include #include #include DCORE_BEGIN_NAMESPACE Q_GLOBAL_STATIC_WITH_ARGS(QByteArray, dBusInterface, ("org.freedesktop.DBus")) Q_GLOBAL_STATIC_WITH_ARGS(QByteArray, dBusPropertiesInterface, ("org.freedesktop.DBus.Properties")) Q_GLOBAL_STATIC_WITH_ARGS(QByteArray, dBusPropertiesChangedSignal, ("PropertiesChanged")) Q_GLOBAL_STATIC_WITH_ARGS(QByteArray, propertyChangedSignature, ("propertyChanged(QString,QVariant)")) Q_GLOBAL_STATIC_WITH_ARGS(QByteArray, propertyInvalidatedSignature, ("propertyInvalidated(QString)")) DDBusExtendedAbstractInterface::DDBusExtendedAbstractInterface( const QString &service, const QString &path, const char *interface, const QDBusConnection &connection, QObject *parent) : QDBusAbstractInterface(service, path, interface, connection, parent) , m_sync(true) , m_useCache(false) , m_getAllPendingCallWatcher(0) , m_propertiesChangedConnected(false) { const_cast(connection) .connect(QString("org.freedesktop.DBus"), QString("/org/freedesktop/DBus"), QString("org.freedesktop.DBus"), QString("NameOwnerChanged"), this, SLOT(onDBusNameOwnerChanged(QString, QString, QString))); } DDBusExtendedAbstractInterface::~DDBusExtendedAbstractInterface() {} void DDBusExtendedAbstractInterface::setSync(bool sync) { setSync(sync, true); } /* * @~english * @note After sync is set to false, it will always return a empty value * if you call the property's get function directly. So you can only get it * through the changed signal when you get an property, and it's also a good * idea to save a cache yourself. */ void DDBusExtendedAbstractInterface::setSync(bool sync, bool autoStart) { m_sync = sync; // init all properties if (autoStart && !m_sync && !isValid()) startServiceProcess(); } void DDBusExtendedAbstractInterface::getAllProperties() { m_lastExtendedError = QDBusError(); if (!isValid()) { QString errorMessage = QStringLiteral("This Extended DBus interface is not valid yet."); m_lastExtendedError = QDBusMessage::createError(QDBusError::Failed, errorMessage); qDebug() << Q_FUNC_INFO << errorMessage; return; } if (!m_sync && m_getAllPendingCallWatcher) { // Call already in place, not repeating ... return; } QDBusMessage msg = QDBusMessage::createMethodCall(service(), path(), *dBusPropertiesInterface(), QStringLiteral("GetAll")); msg << interface(); if (m_sync) { QDBusMessage reply = connection().call(msg); if (reply.type() != QDBusMessage::ReplyMessage) { m_lastExtendedError = QDBusError(reply); qWarning() << Q_FUNC_INFO << m_lastExtendedError.message(); return; } if (reply.signature() != QLatin1String("a{sv}")) { QString errorMessage = QStringLiteral("Invalid signature \"%1\" in return from call to %2") .arg(reply.signature(), QString(*dBusPropertiesInterface())); qWarning() << Q_FUNC_INFO << errorMessage; m_lastExtendedError = QDBusError(QDBusError::InvalidSignature, errorMessage); return; } QVariantMap value = reply.arguments().at(0).toMap(); onPropertiesChanged(interface(), value, QStringList()); } else { QDBusPendingReply async = connection().asyncCall(msg); m_getAllPendingCallWatcher = new QDBusPendingCallWatcher(async, this); connect(m_getAllPendingCallWatcher, SIGNAL(finished(QDBusPendingCallWatcher *)), this, SLOT(onAsyncGetAllPropertiesFinished(QDBusPendingCallWatcher *))); return; } } void DDBusExtendedAbstractInterface::connectNotify(const QMetaMethod &signal) { if (signal.methodType() == QMetaMethod::Signal && (signal.methodSignature() == *propertyChangedSignature() || signal.methodSignature() == *propertyInvalidatedSignature())) { if (!m_propertiesChangedConnected) { QStringList argumentMatch; argumentMatch << interface(); connection().connect(service(), path(), *dBusPropertiesInterface(), *dBusPropertiesChangedSignal(), argumentMatch, QString(), this, SLOT(onPropertiesChanged(QString, QVariantMap, QStringList))); m_propertiesChangedConnected = true; return; } } else { QDBusAbstractInterface::connectNotify(signal); } } void DDBusExtendedAbstractInterface::disconnectNotify(const QMetaMethod &signal) { if (signal.methodType() == QMetaMethod::Signal && (signal.methodSignature() == *propertyChangedSignature() || signal.methodSignature() == *propertyInvalidatedSignature())) { if (m_propertiesChangedConnected && 0 == receivers(propertyChangedSignature()->constData()) && 0 == receivers(propertyInvalidatedSignature()->constData())) { QStringList argumentMatch; argumentMatch << interface(); connection().disconnect(service(), path(), *dBusPropertiesInterface(), *dBusPropertiesChangedSignal(), argumentMatch, QString(), this, SLOT(onPropertiesChanged(QString, QVariantMap, QStringList))); m_propertiesChangedConnected = false; return; } } else { QDBusAbstractInterface::disconnectNotify(signal); } } QVariant DDBusExtendedAbstractInterface::internalPropGet(const char *propname, void *propertyPtr) { m_lastExtendedError = QDBusError(); if (m_useCache) { int propertyIndex = metaObject()->indexOfProperty(propname); QMetaProperty metaProperty = metaObject()->property(propertyIndex); #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) return QVariant{metaProperty.metaType(), propertyPtr}; #else return QVariant(metaProperty.userType(), propertyPtr); #endif } if (m_sync) { QVariant ret = property(propname); #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) ret.metaType().destruct(propertyPtr); ret.metaType().construct(propertyPtr, ret.constData()); #else QMetaType::destruct(ret.userType(), propertyPtr); QMetaType::construct(ret.userType(), propertyPtr, ret.constData()); #endif return ret; } else { if (!isValid()) { QString errorMessage = QStringLiteral("This Extended DBus interface is not valid yet."); m_lastExtendedError = QDBusMessage::createError(QDBusError::Failed, errorMessage); qDebug() << Q_FUNC_INFO << errorMessage; return QVariant(); } int propertyIndex = metaObject()->indexOfProperty(propname); if (-1 == propertyIndex) { QString errorMessage = QStringLiteral("Got unknown property \"%1\" to read").arg(QString::fromLatin1(propname)); m_lastExtendedError = QDBusMessage::createError(QDBusError::Failed, errorMessage); qWarning() << Q_FUNC_INFO << errorMessage; return QVariant(); } QMetaProperty metaProperty = metaObject()->property(propertyIndex); if (!metaProperty.isReadable()) { QString errorMessage = QStringLiteral("Property \"%1\" is NOT readable").arg(QString::fromLatin1(propname)); m_lastExtendedError = QDBusMessage::createError(QDBusError::Failed, errorMessage); qWarning() << Q_FUNC_INFO << errorMessage; return QVariant(); } // is this metatype registered? const char *expectedSignature = ""; #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) if (metaProperty.typeId() != QMetaType::QVariant) { expectedSignature = QDBusMetaType::typeToSignature(metaProperty.metaType()); #else if (int(metaProperty.type()) != QMetaType::QVariant) { expectedSignature = QDBusMetaType::typeToSignature(metaProperty.userType()); #endif if (0 == expectedSignature) { QString errorMessage = QStringLiteral("Type %1 must be registered with Qt D-Bus " "before it can be used to read property " "%2.%3") .arg(metaProperty.typeName(), interface(), propname); m_lastExtendedError = QDBusMessage::createError(QDBusError::Failed, errorMessage); qWarning() << Q_FUNC_INFO << errorMessage; return QVariant(); } } asyncProperty(propname); #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) return QVariant{metaProperty.metaType(), propertyPtr}; #else return QVariant(metaProperty.userType(), propertyPtr); #endif } } void DDBusExtendedAbstractInterface::internalPropSet(const char *propname, const QVariant &value, void *propertyPtr) { m_lastExtendedError = QDBusError(); if (m_sync) { setProperty(propname, value); } else { if (!isValid()) { QString errorMessage = QStringLiteral("This interface is not yet valid"); m_lastExtendedError = QDBusMessage::createError(QDBusError::Failed, errorMessage); qDebug() << Q_FUNC_INFO << errorMessage; return; } int propertyIndex = metaObject()->indexOfProperty(propname); if (-1 == propertyIndex) { QString errorMessage = QStringLiteral("Got unknown property \"%1\" to write").arg(QString::fromLatin1(propname)); m_lastExtendedError = QDBusMessage::createError(QDBusError::Failed, errorMessage); qWarning() << Q_FUNC_INFO << errorMessage; return; } QMetaProperty metaProperty = metaObject()->property(propertyIndex); if (!metaProperty.isWritable()) { QString errorMessage = QStringLiteral("Property \"%1\" is NOT writable").arg(QString::fromLatin1(propname)); m_lastExtendedError = QDBusMessage::createError(QDBusError::Failed, errorMessage); qWarning() << Q_FUNC_INFO << errorMessage; return; } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QVariant variant = QVariant{metaProperty.metaType(), propertyPtr}; #else QVariant variant = QVariant(metaProperty.type(), propertyPtr); #endif variant = value; asyncSetProperty(propname, variant); } } QVariant DDBusExtendedAbstractInterface::asyncProperty(const QString &propertyName) { QDBusMessage msg = QDBusMessage::createMethodCall(service(), path(), *dBusPropertiesInterface(), QStringLiteral("Get")); msg << interface() << propertyName; QDBusPendingReply async = connection().asyncCall(msg); DDBusExtendedPendingCallWatcher *watcher = new DDBusExtendedPendingCallWatcher(async, propertyName, QVariant(), this); connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher *)), this, SLOT(onAsyncPropertyFinished(QDBusPendingCallWatcher *))); return QVariant(); } void DDBusExtendedAbstractInterface::asyncSetProperty(const QString &propertyName, const QVariant &value) { QDBusMessage msg = QDBusMessage::createMethodCall(service(), path(), *dBusPropertiesInterface(), QStringLiteral("Set")); msg << interface() << propertyName << QVariant::fromValue(QDBusVariant(value)); QDBusPendingReply<> async = connection().asyncCall(msg); DDBusExtendedPendingCallWatcher *watcher = new DDBusExtendedPendingCallWatcher(async, propertyName, value, this); connect( watcher, SIGNAL(finished(QDBusPendingCallWatcher *)), this, SLOT(onAsyncSetPropertyFinished(QDBusPendingCallWatcher *))); } void DDBusExtendedAbstractInterface::startServiceProcess() { const QString &servName = service(); if (isValid()) { qWarning() << "Service" << servName << "is already started."; return; } QDBusMessage msg = QDBusMessage::createMethodCall("org.freedesktop.DBus", "/", *dBusInterface(), QStringLiteral("StartServiceByName")); msg << servName << quint32(0); QDBusPendingReply async = connection().asyncCall(msg); QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(async, this); connect(watcher, &QDBusPendingCallWatcher::finished, this, &DDBusExtendedAbstractInterface::onStartServiceProcessFinished); } void DDBusExtendedAbstractInterface::onStartServiceProcessFinished(QDBusPendingCallWatcher *w) { if (w->isError()) { m_lastExtendedError = w->error(); } else { m_lastExtendedError = QDBusError(); } QDBusPendingReply reply = *w; Q_EMIT serviceStartFinished(reply.value()); w->deleteLater(); } void DDBusExtendedAbstractInterface::onAsyncPropertyFinished(QDBusPendingCallWatcher *w) { DDBusExtendedPendingCallWatcher *watcher = qobject_cast(w); Q_ASSERT(watcher); QDBusPendingReply reply = *watcher; if (reply.isError()) { m_lastExtendedError = reply.error(); } else { int propertyIndex = metaObject()->indexOfProperty(watcher->asyncProperty().toLatin1().constData()); QVariant value = demarshall(interface(), metaObject()->property(propertyIndex), reply.value(), &m_lastExtendedError); if (m_lastExtendedError.isValid()) { Q_EMIT propertyInvalidated(watcher->asyncProperty()); } else { Q_EMIT propertyChanged(watcher->asyncProperty(), value); } } Q_EMIT asyncPropertyFinished(watcher->asyncProperty()); watcher->deleteLater(); } void DDBusExtendedAbstractInterface::onAsyncSetPropertyFinished(QDBusPendingCallWatcher *w) { DDBusExtendedPendingCallWatcher *watcher = qobject_cast(w); Q_ASSERT(watcher); QDBusPendingReply<> reply = *watcher; if (reply.isError()) { m_lastExtendedError = reply.error(); } else { m_lastExtendedError = QDBusError(); } Q_EMIT asyncSetPropertyFinished(watcher->asyncProperty()); // Resetting the property to its previous value after sending the // finished signal if (!reply.isError()) { m_lastExtendedError = QDBusError(); Q_EMIT propertyChanged(watcher->asyncProperty(), watcher->previousValue()); } watcher->deleteLater(); } void DDBusExtendedAbstractInterface::onAsyncGetAllPropertiesFinished(QDBusPendingCallWatcher *watcher) { m_getAllPendingCallWatcher = 0; QDBusPendingReply reply = *watcher; if (reply.isError()) { m_lastExtendedError = reply.error(); } else { m_lastExtendedError = QDBusError(); } Q_EMIT asyncGetAllPropertiesFinished(); if (!reply.isError()) { onPropertiesChanged(interface(), reply.value(), QStringList()); } watcher->deleteLater(); } void DDBusExtendedAbstractInterface::onPropertiesChanged(const QString &interfaceName, const QVariantMap &changedProperties, const QStringList &invalidatedProperties) { if (interfaceName == interface()) { QVariantMap::const_iterator i = changedProperties.constBegin(); while (i != changedProperties.constEnd()) { int propertyIndex = metaObject()->indexOfProperty(i.key().toLatin1().constData()); if (-1 == propertyIndex) { qDebug() << Q_FUNC_INFO << "Got unknown changed property" << i.key(); } else { QVariant value = demarshall(interface(), metaObject()->property(propertyIndex), i.value(), &m_lastExtendedError); if (m_lastExtendedError.isValid()) { Q_EMIT propertyInvalidated(i.key()); } else { Q_EMIT propertyChanged(i.key(), value); } } ++i; } QStringList::const_iterator j = invalidatedProperties.constBegin(); while (j != invalidatedProperties.constEnd()) { if (-1 == metaObject()->indexOfProperty(j->toLatin1().constData())) { qDebug() << Q_FUNC_INFO << "Got unknown invalidated property" << *j; } else { m_lastExtendedError = QDBusError(); Q_EMIT propertyInvalidated(*j); } ++j; } } } void DDBusExtendedAbstractInterface::onDBusNameOwnerChanged(const QString &name, const QString &oldOwner, const QString &newOwner) { if (name == service() && oldOwner.isEmpty()) { m_dbusOwner = newOwner; Q_EMIT serviceValidChanged(true); } else if (name == m_dbusOwner && newOwner.isEmpty()) { m_dbusOwner.clear(); Q_EMIT serviceValidChanged(false); } } QVariant DDBusExtendedAbstractInterface::demarshall(const QString &interface, const QMetaProperty &metaProperty, const QVariant &value, QDBusError *error) { Q_ASSERT(metaProperty.isValid()); Q_ASSERT(error != 0); if (value.userType() == metaProperty.userType()) { // No need demarshalling. Passing back straight away ... *error = QDBusError(); return value; } QString errorMessage; #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QVariant result = QVariant{metaProperty.metaType()}; const char *expectedSignature = QDBusMetaType::typeToSignature(metaProperty.metaType()); #else QVariant result = QVariant(metaProperty.userType(), (void *)0); const char *expectedSignature = QDBusMetaType::typeToSignature(metaProperty.userType()); #endif if (value.userType() == qMetaTypeId()) { // demarshalling a DBus argument ... QDBusArgument dbusArg = value.value(); if (expectedSignature == dbusArg.currentSignature().toLatin1()) { #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QDBusMetaType::demarshall(dbusArg, metaProperty.metaType(), result.data()); #else QDBusMetaType::demarshall(dbusArg, metaProperty.userType(), result.data()); #endif if (!result.isValid()) { errorMessage = QStringLiteral("Unexpected failure demarshalling " "upon PropertiesChanged signal arrival " "for property `%3.%4' (expected type `%5' (%6))") .arg(interface, QString::fromLatin1(metaProperty.name()), QString::fromLatin1(metaProperty.typeName()), expectedSignature); } } else { errorMessage = QStringLiteral("Unexpected `user type' (%2) " "upon PropertiesChanged signal arrival " "for property `%3.%4' (expected type `%5' (%6))") .arg(dbusArg.currentSignature(), interface, QString::fromLatin1(metaProperty.name()), QString::fromLatin1(metaProperty.typeName()), QString::fromLatin1(expectedSignature)); } } else { #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) const char *actualSignature = QDBusMetaType::typeToSignature(value.metaType()); #else const char *actualSignature = QDBusMetaType::typeToSignature(value.userType()); #endif errorMessage = QStringLiteral("Unexpected `%1' (%2) " "upon PropertiesChanged signal arrival " "for property `%3.%4' (expected type `%5' (%6))") .arg(QString::fromLatin1(value.typeName()), QString::fromLatin1(actualSignature), interface, QString::fromLatin1(metaProperty.name()), QString::fromLatin1(metaProperty.typeName()), QString::fromLatin1(expectedSignature)); } if (errorMessage.isEmpty()) { *error = QDBusError(); } else { *error = QDBusMessage::createError(QDBusError::InvalidSignature, errorMessage); qDebug() << Q_FUNC_INFO << errorMessage; } return result; } DCORE_END_NAMESPACE dtkcore-6.7.46/src/util/ddbusextendedpendingcallwatcher.cpp000066400000000000000000000013511522615770400241330ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2015 Jolla Ltd. // // SPDX-License-Identifier: LGPL-2.1-or-later #include "ddbusextendedpendingcallwatcher_p.h" DCORE_BEGIN_NAMESPACE DDBusExtendedPendingCallWatcher::DDBusExtendedPendingCallWatcher(const QDBusPendingCall &call, const QString &asyncProperty, const QVariant &previousValue, QObject *parent) : QDBusPendingCallWatcher(call, parent) , m_asyncProperty(asyncProperty) , m_previousValue(previousValue) { } DDBusExtendedPendingCallWatcher::~DDBusExtendedPendingCallWatcher() {} DCORE_END_NAMESPACE dtkcore-6.7.46/src/util/ddbusextendedpendingcallwatcher_p.h000066400000000000000000000024511522615770400241210ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2015 Jolla Ltd. // // SPDX-License-Identifier: LGPL-2.1-or-later // // W A R N I N G // ------------- // // This file is not part of the public API. This header file may // change from version to version without notice, or even be // removed. // // We mean it. // // #ifndef DDBUSEXTENDEDPENDINGCALLWATCHER_P_H #define DDBUSEXTENDEDPENDINGCALLWATCHER_P_H #include "dtkcore_global.h" #include #include DCORE_BEGIN_NAMESPACE class DDBusExtendedPendingCallWatcher : public QDBusPendingCallWatcher { Q_OBJECT public: explicit DDBusExtendedPendingCallWatcher(const QDBusPendingCall &call, const QString &asyncProperty, const QVariant &previousValue, QObject *parent = 0); ~DDBusExtendedPendingCallWatcher(); Q_PROPERTY(QString AsyncProperty READ asyncProperty) inline QString asyncProperty() const { return m_asyncProperty; } Q_PROPERTY(QVariant PreviousValue READ previousValue) inline QVariant previousValue() const { return m_previousValue; } private: QString m_asyncProperty; QVariant m_previousValue; }; DCORE_END_NAMESPACE #endif /* DDBUSEXTENDEDPENDINGCALLWATCHER_P_H */ dtkcore-6.7.46/src/util/ddbusinterface.cpp000066400000000000000000000266401522615770400205240ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "ddbusinterface.h" #include "ddbusinterface_p.h" #include #include #include #include #include #include #include DCORE_BEGIN_NAMESPACE static const QString &FreedesktopService = QStringLiteral("org.freedesktop.DBus"); static const QString &FreedesktopPath = QStringLiteral("/org/freedesktop/DBus"); static const QString &FreedesktopInterface = QStringLiteral("org.freedesktop.DBus"); static const QString &NameOwnerChanged = QStringLiteral("NameOwnerChanged"); static const QString &PropertiesInterface = QStringLiteral("org.freedesktop.DBus.Properties"); static const QString &PropertiesChanged = QStringLiteral("PropertiesChanged"); static const char *PropertyName = "propname"; #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) #define PropType(metaProperty) metaProperty.metaType() #else #define PropType(metaProperty) metaProperty.userType() #endif static QVariant demarshall(const QMetaProperty &metaProperty, const QVariant &value) { // if the value is the same with parent one, return value if (value.userType() == metaProperty.userType()) return value; // unwrap the value with parent one QVariant result = QVariant(PropType(metaProperty), nullptr); if (value.userType() == qMetaTypeId()) { QDBusArgument dbusArg = value.value(); QDBusMetaType::demarshall(dbusArg, PropType(metaProperty), result.data()); } else { auto copy = value; if (copy.convert(PropType(metaProperty))) { result = copy; } else { qDebug() << "Failed to convert value type" << value.typeName() << "to property type" << metaProperty.typeName(); } } return result; } DDBusInterfacePrivate::DDBusInterfacePrivate(DDBusInterface *interface, QObject *parent) : QObject(interface) , m_parent(parent) , m_serviceValid(false) , q_ptr(interface) { QDBusMessage message = QDBusMessage::createMethodCall(FreedesktopService, FreedesktopPath, FreedesktopInterface, "NameHasOwner"); message << interface->service(); interface->connection().callWithCallback(message, this, SLOT(onDBusNameHasOwner(bool))); interface->connection().connect(interface->service(), interface->path(), PropertiesInterface, PropertiesChanged, {interface->interface()}, QString(), this, SLOT(onPropertiesChanged(QString, QVariantMap, QStringList))); } void DDBusInterfacePrivate::updateProp(const char *propName, const QVariant &value) { if (!m_parent) return; const QMetaObject *metaObj = m_parent->metaObject(); const char *typeName(value.typeName()); void *data = const_cast(value.data()); int propertyIndex = metaObj->indexOfProperty(propName); QVariant result = value; // TODO: it now cannot convert right, Like QMap // if there is property, then try to convert with property if (propertyIndex != -1) { QMetaProperty metaProperty = metaObj->property(propertyIndex); result = demarshall(metaProperty, value); data = const_cast(result.data()); typeName = result.typeName(); } else if (value.canConvert()) { auto dbusType = qvariant_cast(value); #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) auto dbusMetaType = QDBusMetaType::signatureToMetaType(dbusType.currentSignature().toUtf8()); typeName = dbusMetaType.name(); void *dbusData = dbusMetaType.create(); QDBusMetaType::demarshall(dbusType, dbusMetaType, dbusData); data = dbusData; QObject dbusDataDeleter; QObject::connect(&dbusDataDeleter, &QObject::destroyed, m_parent, [dbusData, dbusMetaType]() { dbusMetaType.destroy(dbusData); }, Qt::QueuedConnection); #else auto dbusMetaType = QDBusMetaType::signatureToType(dbusType.currentSignature().toUtf8()); typeName = QMetaType::typeName(dbusMetaType); void *dbusData = QMetaType::create(dbusMetaType); QDBusMetaType::demarshall(dbusType, dbusMetaType, dbusData); data = dbusData; // release dbus data of `QMetaType::create`. QObject dbusDataDeleter; QObject::connect(&dbusDataDeleter, &QObject::destroyed, m_parent, [dbusData, dbusMetaType]() { QMetaType::destroy(dbusMetaType, dbusData); }, Qt::QueuedConnection); #endif } QByteArray baSignal = QStringLiteral("%1Changed(%2)").arg(propName).arg(typeName).toLatin1(); int i = metaObj->indexOfSignal(baSignal.data()); if (i != -1) { auto method = metaObj->method(i); if (method.parameterCount() == 1) { method.invoke(m_parent, Qt::DirectConnection, QGenericArgument(method.parameterTypes().first(), data)); } else { method.invoke(m_parent, Qt::DirectConnection); } } else { qDebug() << "It's not exist the property:[" << propName << "] for parent:" << m_parent << ", interface:" << q_ptr->interface() << ", and It's changed value is:" << value; } } void DDBusInterfacePrivate::initDBusConnection() { if (!m_parent) return; Q_Q(DDBusInterface); QDBusConnection connection = q->connection(); QStringList signalList; QDBusInterface inter(q->service(), q->path(), q->interface(), connection); const QMetaObject *meta = inter.metaObject(); for (int i = meta->methodOffset(); i < meta->methodCount(); ++i) { const QMetaMethod &method = meta->method(i); if (method.methodType() == QMetaMethod::Signal) { signalList << method.methodSignature(); } } const QMetaObject *parentMeta = m_parent->metaObject(); for (const QString &signal : signalList) { int i = parentMeta->indexOfSignal(QMetaObject::normalizedSignature(signal.toLatin1())); if (i != -1) { const QMetaMethod &parentMethod = parentMeta->method(i); connection.connect(q->service(), q->path(), q->interface(), parentMethod.name(), m_parent, QT_STRINGIFY(QSIGNAL_CODE) + parentMethod.methodSignature()); } } } void DDBusInterfacePrivate::onPropertiesChanged(const QString &interfaceName, const QVariantMap &changedProperties, const QStringList &invalidatedProperties) { Q_UNUSED(interfaceName) Q_UNUSED(invalidatedProperties) for (QVariantMap::const_iterator it = changedProperties.cbegin(); it != changedProperties.cend(); ++it) updateProp((it.key() + m_suffix).toLatin1(), it.value()); } void DDBusInterfacePrivate::onAsyncPropertyFinished(QDBusPendingCallWatcher *w) { QDBusPendingReply reply = *w; if (!reply.isError()) { updateProp(w->property(PropertyName).toString().toLatin1(), reply.value()); } w->deleteLater(); } void DDBusInterfacePrivate::setServiceValid(bool valid) { if (m_serviceValid != valid) { Q_Q(DDBusInterface); m_serviceValid = valid; Q_EMIT q->serviceValidChanged(m_serviceValid); } } void DDBusInterfacePrivate::onDBusNameHasOwner(bool valid) { Q_Q(DDBusInterface); setServiceValid(valid); if (valid) initDBusConnection(); else q->connection().connect(FreedesktopService, FreedesktopPath, FreedesktopInterface, NameOwnerChanged, this, SLOT(onDBusNameOwnerChanged(QString, QString, QString))); } void DDBusInterfacePrivate::onDBusNameOwnerChanged(const QString &name, const QString &oldOwner, const QString &newOwner) { Q_Q(DDBusInterface); if (name == q->service() && oldOwner.isEmpty()) { initDBusConnection(); q->connection().disconnect(FreedesktopService, FreedesktopPath, FreedesktopInterface, NameOwnerChanged, this, SLOT(onDBusNameOwnerChanged(QString, QString, QString))); setServiceValid(true); } else if (name == q->service() && newOwner.isEmpty()) setServiceValid(false); } ////////////////////////////////////////////////////////// // class DDBusInterface ////////////////////////////////////////////////////////// DDBusInterface::DDBusInterface(const QString &service, const QString &path, const QString &interface, const QDBusConnection &connection, QObject *parent) : QDBusAbstractInterface(service, path, interface.toLatin1(), connection, parent) , d_ptr(new DDBusInterfacePrivate(this, parent)) { } DDBusInterface::~DDBusInterface() {} bool DDBusInterface::serviceValid() const { Q_D(const DDBusInterface); return d->m_serviceValid; } QString DDBusInterface::suffix() const { Q_D(const DDBusInterface); return d->m_suffix; } void DDBusInterface::setSuffix(const QString &suffix) { Q_D(DDBusInterface); d->m_suffix = suffix; } inline QString originalPropname(const char *propname, QString suffix) { QString propStr(propname); return propStr.left(propStr.length() - suffix.length()); } QVariant DDBusInterface::property(const char *propName) { Q_D(DDBusInterface); QDBusMessage msg = QDBusMessage::createMethodCall(service(), path(), PropertiesInterface, QStringLiteral("Get")); msg << interface() << originalPropname(propName, d->m_suffix); QDBusPendingReply prop = connection().asyncCall(msg); if (prop.value().isValid()) { // if there is no parent, return value if (!parent()) { qWarning() << "you use it without parent, and if the value is not valid, you may get nothing"; return prop.value(); } auto metaObject = parent()->metaObject(); QVariant propresult = prop.value(); int i = metaObject->indexOfProperty(propName); if (i != -1) { QMetaProperty metaProperty = metaObject->property(i); // try to use property in parent to unwrap the value propresult = demarshall(metaProperty, propresult); } return propresult; } QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(prop, this); watcher->setProperty(PropertyName, propName); connect(watcher, &QDBusPendingCallWatcher::finished, d, &DDBusInterfacePrivate::onAsyncPropertyFinished); return QVariant(); } void DDBusInterface::setProperty(const char *propName, const QVariant &value) { Q_D(const DDBusInterface); QDBusMessage msg = QDBusMessage::createMethodCall(service(), path(), PropertiesInterface, QStringLiteral("Set")); msg << interface() << originalPropname(propName, d->m_suffix) << QVariant::fromValue(QDBusVariant(value)); QDBusPendingReply reply = connection().asyncCall(msg); reply.waitForFinished(); if (!reply.isValid()) { qWarning() << reply.error().message(); } } DCORE_END_NAMESPACE dtkcore-6.7.46/src/util/ddbusinterface_p.h000066400000000000000000000021041522615770400204750ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #pragma once #include "ddbusinterface.h" class QDBusPendingCallWatcher; DCORE_BEGIN_NAMESPACE class DDBusInterfacePrivate : public QObject { Q_OBJECT public: explicit DDBusInterfacePrivate(DDBusInterface *interface, QObject *parent); void updateProp(const char *propName, const QVariant &value); void initDBusConnection(); void setServiceValid(bool valid); private Q_SLOTS: void onPropertiesChanged(const QString &interfaceName, const QVariantMap &changedProperties, const QStringList &invalidatedProperties); void onAsyncPropertyFinished(QDBusPendingCallWatcher *w); void onDBusNameHasOwner(bool valid); void onDBusNameOwnerChanged(const QString &name, const QString &oldOwner, const QString &newOwner); public: QObject *m_parent; QString m_suffix; bool m_serviceValid; DDBusInterface *q_ptr; Q_DECLARE_PUBLIC(DDBusInterface) }; DCORE_END_NAMESPACE dtkcore-6.7.46/src/util/ddbussender.cpp000066400000000000000000000054641522615770400200450ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "ddbussender.h" #include #include DDBusSender::DDBusSender() : m_dbusData(std::make_shared()) { } DDBusSender DDBusSender::service(const QString &service) { m_dbusData->service = service; return *this; } DDBusSender DDBusSender::interface(const QString &interface) { m_dbusData->interface = interface; return *this; } DDBusCaller DDBusSender::method(const QString &method) { return DDBusCaller(method, m_dbusData); } DDBusProperty DDBusSender::property(const QString &property) { return DDBusProperty(property, m_dbusData); } DDBusSender DDBusSender::system() { DDBusSender self; self.type(QDBusConnection::SystemBus); return self; } DDBusSender DDBusSender::path(const QString &path) { m_dbusData->path = path; return *this; } DDBusSender DDBusSender::type(const QDBusConnection::BusType busType) { switch (busType) { case QDBusConnection::SessionBus: m_dbusData->connection = QDBusConnection::sessionBus(); break; case QDBusConnection::SystemBus: m_dbusData->connection = QDBusConnection::systemBus(); break; default: Q_UNREACHABLE_IMPL(); } return *this; } DDBusData::DDBusData() : connection(QDBusConnection::sessionBus()) { } QDBusPendingCall DDBusData::asyncCallWithArguments(const QString &method, const QVariantList &arguments, const QString &iface) { // When creating a QDBusAbstractInterface, Qt will try to invoke introspection into this dbus path; // This is costing in some cases when introspection is not ready; // Cause this is an asynchronous method, it'd be better not to wait for anything, just leave this to caller; // Use QDBusMessage to invoke directly instead of creating a QDBusInterface. const QString calledInterface = iface.isEmpty() ? interface : iface; QDBusMessage methodCall = QDBusMessage::createMethodCall(service, path, calledInterface, method); methodCall.setArguments(arguments); return connection.asyncCall(methodCall); } QDBusPendingCall DDBusCaller::call() { return m_dbusData->asyncCallWithArguments(m_methodName, m_arguments); } DDBusCaller::DDBusCaller(const QString &method, std::shared_ptr data) : m_dbusData(data) , m_methodName(method) { } QDBusPendingCall DDBusProperty::get() { QVariantList args{QVariant::fromValue(m_dbusData->interface), QVariant::fromValue(m_propertyName)}; return m_dbusData->asyncCallWithArguments(QStringLiteral("Get"), args, QStringLiteral("org.freedesktop.DBus.Properties")); } DDBusProperty::DDBusProperty(const QString &property, std::shared_ptr data) : m_dbusData(data) , m_propertyName(property) { } dtkcore-6.7.46/src/util/ddisksizeformatter.cpp000066400000000000000000000014311522615770400214460ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "ddisksizeformatter.h" #include DCORE_BEGIN_NAMESPACE DDiskSizeFormatter::DDiskSizeFormatter() : DAbstractUnitFormatter() { } QString DDiskSizeFormatter::unitStr(int unitId) const { switch (unitId) { case B: return QStringLiteral("B"); case K: return QStringLiteral("KB"); case M: return QStringLiteral("MB"); case G: return QStringLiteral("GB"); case T: return QStringLiteral("TB"); } return QString(); } DDiskSizeFormatter DDiskSizeFormatter::rate(int rate) { m_rate = rate; return *this; } DCORE_END_NAMESPACE dtkcore-6.7.46/src/util/dexportedinterface.cpp000066400000000000000000000071171522615770400214170ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dexportedinterface.h" #include "base/private/dobject_p.h" #include #include #include #include #include #include #include #include DCORE_BEGIN_NAMESPACE namespace DUtil { class DExportedInterfacePrivate; class DExportedInterfaceDBusInterface : public QObject, protected QDBusContext { Q_OBJECT Q_CLASSINFO("D-Bus Interface", "com.deepin.ExportedInterface") public: DExportedInterfaceDBusInterface(DExportedInterfacePrivate *priv); public Q_SLOTS: QStringList list(); QString help(const QString &action); QDBusVariant invoke(QString action, QString parameters); private: DExportedInterfacePrivate *p; }; class DExportedInterfacePrivate : public DObjectPrivate { public: DExportedInterfacePrivate(DExportedInterface *q); private: QStringList actionHelp(QString action, int indent); QHash, QString>> actions; QScopedPointer dbusif; D_DECLARE_PUBLIC(DExportedInterface) friend class DExportedInterfaceDBusInterface; }; DExportedInterface::DExportedInterface(QObject *parent) : QObject(parent), DObject(*new DExportedInterfacePrivate(this)) { D_D(DExportedInterface); QDBusConnection::sessionBus().registerObject("/", d->dbusif.data(), QDBusConnection::RegisterOption::ExportAllSlots); } DExportedInterface::~DExportedInterface() { QDBusConnection::sessionBus().unregisterObject("/"); } void DExportedInterface::registerAction(const QString &action, const QString &description, const std::function handler) { D_D(DExportedInterface); d->actions[action] = {handler, description}; } QVariant DExportedInterface::invoke(const QString &action, const QString ¶meters) const { D_DC(DExportedInterface); if (auto func = d->actions.value(action).first) { return func(parameters); } return QVariant(); } DExportedInterfacePrivate::DExportedInterfacePrivate(DExportedInterface *q) : DObjectPrivate(q) , dbusif(new DExportedInterfaceDBusInterface(this)) {} QStringList DExportedInterfacePrivate::actionHelp(QString action, int indent) { QStringList ret; if (actions.contains(action)) { ret << QString(indent * 2, ' ') + QString("%1: %2").arg(action).arg(actions[action].second); } return ret; } DExportedInterfaceDBusInterface::DExportedInterfaceDBusInterface(DExportedInterfacePrivate *priv) : QObject(nullptr) , p(priv) {} QStringList DExportedInterfaceDBusInterface::list() { return p->actions.keys(); } QString DExportedInterfaceDBusInterface::help(const QString &action) { if (action.length()) { return p->actionHelp(action, 0).join('\n'); } else { QString ret = "Available actions:"; QStringList actions = p->actions.keys(); actions.sort(); for (auto action : actions) { ret += QString("\n\n") + p->actionHelp(action, 1).join('\n'); } return ret; } } QDBusVariant DExportedInterfaceDBusInterface::invoke(QString action, QString parameters) { QDBusVariant ret; if (!p->actions.contains(action)) { sendErrorReply(QDBusError::ErrorType::InvalidArgs, QString("Action \"%1\" is not registered").arg(action)); } else { ret.setVariant(p->q_func()->invoke(action, parameters)); } return ret; } } DCORE_END_NAMESPACE #include "dexportedinterface.moc" dtkcore-6.7.46/src/util/dfileservices_dummy.cpp000066400000000000000000000056421522615770400216030ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dfileservices.h" DCORE_BEGIN_NAMESPACE static QStringList urls2uris(const QList &urls) { QStringList list; list.reserve(urls.size()); for (const QUrl url : urls) { list << url.toString(); } return list; } static QList path2urls(const QList &paths) { QList list; list.reserve(paths.size()); for (const QString &path : paths) { list << QUrl::fromLocalFile(path); } return list; } bool DFileServices::showFolder(QString localFilePath, const QString &startupId) { Q_UNUSED(localFilePath); Q_UNUSED(startupId); return false; } bool DFileServices::showFolders(const QList localFilePaths, const QString &startupId) { Q_UNUSED(localFilePaths); Q_UNUSED(startupId); return false; } bool DFileServices::showFolder(QUrl url, const QString &startupId) { Q_UNUSED(url); Q_UNUSED(startupId); return false; } bool DFileServices::showFolders(const QList urls, const QString &startupId) { Q_UNUSED(urls); Q_UNUSED(startupId); return false; } bool DFileServices::showFileItemPropertie(QString localFilePath, const QString &startupId) { Q_UNUSED(localFilePath); Q_UNUSED(startupId); return false; } bool DFileServices::showFileItemProperties(const QList localFilePaths, const QString &startupId) { Q_UNUSED(localFilePaths); Q_UNUSED(startupId); return false; } bool DFileServices::showFileItemPropertie(QUrl url, const QString &startupId) { Q_UNUSED(url); Q_UNUSED(startupId); return false; } bool DFileServices::showFileItemProperties(const QList urls, const QString &startupId) { Q_UNUSED(urls); Q_UNUSED(startupId); return false; } bool DFileServices::showFileItem(QString localFilePath, const QString &startupId) { Q_UNUSED(localFilePath); Q_UNUSED(startupId); return false; } bool DFileServices::showFileItems(const QList localFilePaths, const QString &startupId) { Q_UNUSED(localFilePaths); Q_UNUSED(startupId); return false; } bool DFileServices::showFileItem(QUrl url, const QString &startupId) { Q_UNUSED(url); Q_UNUSED(startupId); return false; } bool DFileServices::showFileItems(const QList urls, const QString &startupId) { Q_UNUSED(urls); Q_UNUSED(startupId); return false; } bool DFileServices::trash(QString localFilePath) { Q_UNUSED(localFilePath); return false; } bool DFileServices::trash(const QList localFilePaths) { Q_UNUSED(localFilePaths); return false; } bool DFileServices::trash(QUrl url) { Q_UNUSED(url); return false; } bool DFileServices::trash(const QList urls) { Q_UNUSED(urls); return false; } QString DFileServices::errorMessage() { return QString(); } DCORE_END_NAMESPACE dtkcore-6.7.46/src/util/dfileservices_linux.cpp000066400000000000000000000071371522615770400216100ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include #include #include #include "dfileservices.h" DCORE_BEGIN_NAMESPACE #define EASY_CALL_DBUS(name)\ QDBusInterface *interface = fileManager1DBusInterface();\ return interface && interface->call(#name, urls2uris(urls), startupId).type() != QDBusMessage::ErrorMessage; static QDBusInterface *fileManager1DBusInterface() { static QDBusInterface interface(QStringLiteral("org.freedesktop.FileManager1"), QStringLiteral("/org/freedesktop/FileManager1"), QStringLiteral("org.freedesktop.FileManager1")); return &interface; } static QStringList urls2uris(const QList &urls) { QStringList list; list.reserve(urls.size()); for (const QUrl &url : urls) { list << url.toString(); } return list; } static QList path2urls(const QList &paths) { QList list; list.reserve(paths.size()); for (const QString &path : paths) { list << QUrl::fromLocalFile(path); } return list; } bool DFileServices::showFolder(QString localFilePath, const QString &startupId) { return showFolder(QUrl::fromLocalFile(localFilePath), startupId); } bool DFileServices::showFolders(const QList localFilePaths, const QString &startupId) { return showFolders(path2urls(localFilePaths), startupId); } bool DFileServices::showFolder(QUrl url, const QString &startupId) { return showFolders(QList() << url, startupId); } bool DFileServices::showFolders(const QList urls, const QString &startupId) { EASY_CALL_DBUS(ShowFolders) } bool DFileServices::showFileItemPropertie(QString localFilePath, const QString &startupId) { return showFileItemPropertie(QUrl::fromLocalFile(localFilePath), startupId); } bool DFileServices::showFileItemProperties(const QList localFilePaths, const QString &startupId) { return showFileItemProperties(path2urls(localFilePaths), startupId); } bool DFileServices::showFileItemPropertie(QUrl url, const QString &startupId) { return showFileItemProperties(QList() << url, startupId); } bool DFileServices::showFileItemProperties(const QList urls, const QString &startupId) { EASY_CALL_DBUS(ShowItemProperties) } bool DFileServices::showFileItem(QString localFilePath, const QString &startupId) { return showFileItem(QUrl::fromLocalFile(localFilePath), startupId); } bool DFileServices::showFileItems(const QList localFilePaths, const QString &startupId) { return showFileItems(path2urls(localFilePaths), startupId); } bool DFileServices::showFileItem(QUrl url, const QString &startupId) { return showFileItems(QList() << url, startupId); } bool DFileServices::showFileItems(const QList urls, const QString &startupId) { EASY_CALL_DBUS(ShowItems) } bool DFileServices::trash(QString localFilePath) { return trash(QUrl::fromLocalFile(localFilePath)); } bool DFileServices::trash(const QList localFilePaths) { return trash(path2urls(localFilePaths)); } bool DFileServices::trash(QUrl url) { return trash(QList() << url); } bool DFileServices::trash(const QList urls) { QDBusInterface *interface = fileManager1DBusInterface(); return interface && interface->call("Trash", urls2uris(urls)).type() != QDBusMessage::ErrorMessage; } QString DFileServices::errorMessage() { return fileManager1DBusInterface()->lastError().message(); } DCORE_END_NAMESPACE dtkcore-6.7.46/src/util/dnotifysender.cpp000066400000000000000000000040041522615770400204050ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dnotifysender.h" #include "ddbussender.h" DCORE_BEGIN_NAMESPACE namespace DUtil { struct DNotifyData { uint m_replaceId; int m_timeOut; QString m_body; QString m_summary; QString m_appIcon; QString m_appName; QStringList m_actions; QVariantMap m_hints; }; DNotifySender::DNotifySender(const QString &summary) : m_dbusData(std::make_shared()) { m_dbusData->m_summary = summary; } DNotifySender DNotifySender::appName(const QString &appName) { m_dbusData->m_appName = appName; return *this; } DNotifySender DNotifySender::appIcon(const QString &appIcon) { m_dbusData->m_appIcon = appIcon; return *this; } DNotifySender DNotifySender::appBody(const QString &appBody) { m_dbusData->m_body = appBody; return *this; } DNotifySender DNotifySender::replaceId(const uint replaceId) { m_dbusData->m_replaceId = replaceId; return *this; } DNotifySender DNotifySender::timeOut(const int timeOut) { m_dbusData->m_timeOut = timeOut; return *this; } DNotifySender DNotifySender::actions(const QStringList &actions) { m_dbusData->m_actions = actions; return *this; } DNotifySender DNotifySender::hints(const QVariantMap &hints) { m_dbusData->m_hints = hints; return *this; } QDBusPendingCall DNotifySender::call() { return DDBusSender() .service("org.freedesktop.Notifications") .path("/org/freedesktop/Notifications") .interface("org.freedesktop.Notifications") .method(QString("Notify")) .arg(m_dbusData->m_appName) .arg(m_dbusData->m_replaceId) .arg(m_dbusData->m_appIcon) .arg(m_dbusData->m_summary) .arg(m_dbusData->m_body) .arg(m_dbusData->m_actions) .arg(m_dbusData->m_hints) .arg(m_dbusData->m_timeOut) .call(); } } // namespace DUtil DCORE_END_NAMESPACE dtkcore-6.7.46/src/util/dpinyin.cpp000066400000000000000000000141051522615770400172050ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2019 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dpinyin.h" #include #include #include #include #include #include DCORE_BEGIN_NAMESPACE static QHash dict = {}; static std::once_flag dictInitFlag; const char kDictFile[] = ":/dpinyin/resources/dpinyin.dict"; static void initDictImpl() { dict.reserve(25333); QFile file(kDictFile); if (!file.open(QIODevice::ReadOnly)) return; QByteArray content = file.readAll(); file.close(); QTextStream stream(&content, QIODevice::ReadOnly); while (!stream.atEnd()) { const QString line = stream.readLine(); // comment if (line.startsWith("#")) continue; const QStringList items = line.left(line.indexOf("#")).split(QChar(':')); if (items.size() == 2) { dict.insert(items[0].toUInt(nullptr, 16), items[1].trimmed()); } } } static void InitDict() { std::call_once(dictInitFlag, initDictImpl); } static void initToneTable(QMap &toneTable) { if (toneTable.size() > 0) return; const QString ts = "aÄ�áǎà,oÅ�óǒò,eēéěè,iīíÇ�ì,uūúǔù,vǖǘǚǜ"; for (const QString &s : ts.split(",")) { for (int i = 1; i < s.length(); ++i) { toneTable.insert(s.at(i), QString("%1%2").arg(s.at(0)).arg(i)); } } } static QString toned(const QString &str, ToneStyle ts) { // TS_Tone is default if (ts == TS_Tone) return str; static QMap toneTable; // {Ä�, a1} initToneTable(toneTable); QString newStr = str; QString toneNum = ""; // First pass: find tone number and remove tone marks for (QChar c : str) { if (toneTable.contains(c)) { QString cv = toneTable.value(c); switch (ts) { case TS_NoneTone: newStr.replace(c, cv.left(1)); break; case TS_ToneNum: newStr.replace(c, cv.left(1)); // Remove tone mark first toneNum = cv.right(1); // Extract tone number break; default: break; } } } // For TS_ToneNum, append tone number at the end if (ts == TS_ToneNum && !toneNum.isEmpty()) { newStr += toneNum; } return newStr; } static QStringList toned(const QStringList &words, ToneStyle ts) { QStringList tonedWords; for (auto str : words) tonedWords << toned(str, ts); return tonedWords; } static QStringList permutations(const QStringList &list1, const QStringList &list2) { QStringList ret; for (const QString &str1 : list1) for (const QString &str2 : list2) ret << str1 + str2; return ret; } static QStringList permutations(const QList &pyList) { QStringList result; if (pyList.size() <= 1) return pyList.value(0, result); result = permutations(pyList.value(0), pyList.value(1)); for (int i = 2; i < pyList.size(); ++i) { result = permutations(result, pyList.value(i)); // é™�制返回的大å°�, if (result.size() > 0xFFFF) { qWarning() << "Warning: Too many combinations have exceeded the limit\n"; break; } } return result; } static QStringList deduplication(const QStringList &list) { QStringList result; for (const QString &item : list) if (!result.contains(item)) result.append(item); return result; } /*! \fn QString Dtk::Core::Chinese2Pinyin(const QString &words) \brief Convert Chinese characters to Pinyin \note this function not support polyphonic characters support. \return pinyin of the words \sa Dtk::Core::pinyin */ QString Chinese2Pinyin(const QString &words) { QStringList res = pinyin(words, TS_ToneNum); return res.value(0); } /*! * @~english \enum Dtk::Core::ToneStyle pinyin tone style \value TS_NoneTone pinyin without tone \value TS_Tone pinyin with tone, default style in dictory file \value TS_ToneNum pinyin tone number */ /*! \fn QStringList Dtk::Core::pinyin(const QString &words, ToneStyle ts, bool *ok) \brief Convert Chinese characters to Pinyin with polyphonic characters support. \return pinyin list of the words */ QStringList pinyin(const QString &words, ToneStyle ts, bool *ok) { if (words.length() < 1) return QStringList(); InitDict(); if (ok) *ok = true; QList pyList; for (int i = 0; i < words.length(); ++i) { const uint key = words.at(i).unicode(); auto find_result = dict.find(key); if (find_result != dict.end()) { const QString &ret = find_result.value(); pyList << toned(ret.split(","), ts); } else { pyList << QStringList(words.at(i)); // 部分字没有在è¯�典中找到,使用字本身, ok å�¯ä»¥åˆ¤æ–­ç»“æžœ if (ok) *ok = false; } } return deduplication(permutations(pyList)); } /*! \fn QStringList Dtk::Core::firstLetters(const QString &words) \brief Convert Chinese characters to Pinyin firstLetters list \brief with polyphonic characters support. \return pinyin first letters list of the words */ QStringList firstLetters(const QString &words) { return firstLetters(words, TS_Tone); } /*! \fn QStringList Dtk::Core::firstLetters(const QString &words) \brief Convert Chinese characters to Pinyin firstLetters list \brief with controllable tone style. \return pinyin first letters list of the words */ QStringList firstLetters(const QString &words, ToneStyle ts) { QList result; bool ok = false; for (const QChar &w : words) { QStringList pys = pinyin(w, ts, &ok); if (!ok) { result << QStringList(w); continue; } for (QString &py : pys) py = py.left(1); result << pys; } return deduplication(permutations(result)); } DCORE_END_NAMESPACE dtkcore-6.7.46/src/util/dprivateaccessor_p.h000066400000000000000000000053751522615770400210710ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #pragma once #include // Private member accessor using the explicit template instantiation technique. // // C++ Standard [temp.explicit]/12 states: // "The usual access checking rules do not apply to names used to // specify explicit instantiation definitions." // // This allows passing pointers to private/protected data members and // member functions as template arguments in explicit instantiations, // bypassing normal access control — without modifying the class definition // and without the UB caused by "#define private public". // // NOTE: These helper structs must be in the SAME namespace as the Tag structs // (global namespace, since the macros expand at file scope). If they were in a // sub-namespace, the friend definition would create a different function than // the friend declaration in the Tag struct, causing undefined-reference errors. QT_WARNING_PUSH QT_WARNING_DISABLE_GCC("-Wnon-template-friend") template struct DtkCorePrivateAccessor { using MemberPtr = typename Tag::MemberPtr; friend MemberPtr get(Tag) noexcept; }; template struct DtkCorePrivateAccessorImpl : DtkCorePrivateAccessor { friend typename Tag::MemberPtr get(Tag) noexcept { return Ptr; } }; QT_WARNING_POP #define D_DECLARE_PRIVATE_MEMBER(TagName, ClassName, Member, MemberType) \ struct TagName { \ using MemberPtr = MemberType ClassName::*; \ friend MemberPtr get(TagName) noexcept; \ }; \ template struct DtkCorePrivateAccessorImpl #define D_DECLARE_PRIVATE_METHOD(TagName, ClassName, MethodName, RetType, ...) \ struct TagName { \ using MemberPtr = RetType (ClassName::*)(__VA_ARGS__); \ friend MemberPtr get(TagName) noexcept; \ }; \ template struct DtkCorePrivateAccessorImpl #define D_DECLARE_PRIVATE_CONST_METHOD(TagName, ClassName, MethodName, RetType, ...) \ struct TagName { \ using MemberPtr = RetType (ClassName::*)(__VA_ARGS__) const; \ friend MemberPtr get(TagName) noexcept; \ }; \ template struct DtkCorePrivateAccessorImpl // Trampoline: ensures get(tag) is called from a context with no class-scope // get() member that might suppress ADL (C++ [basic.lookup.argdep] para 3). namespace dtk_private_detail { template inline typename Tag::MemberPtr access(Tag t) noexcept { return get(t); } } #define D_PRIVATE_MEMBER(obj, tag) ((obj).*dtk_private_detail::access(tag)) #define D_PRIVATE_CALL(obj, tag, ...) ((obj).*dtk_private_detail::access(tag))(__VA_ARGS__) dtkcore-6.7.46/src/util/drecentmanager.cpp000066400000000000000000000172361522615770400205220ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "drecentmanager.h" #include #include #include #include #include #include #include #include #if QT_VERSION >= QT_VERSION_CHECK(6,0,0) #include #include #endif DCORE_BEGIN_NAMESPACE #define RECENT_PATH QDir::homePath() + "/.local/share/recently-used.xbel" /*! \class Dtk::Core::DRecentManager \inmodule dtkcore \brief DRecentManager 是用æ�¥ç®¡ç�†æœ€è¿‘文件列表的类,æ��供了添加与删除文件项. é�µå¾ª freedesktop 标准,在本地 share 目录存放,文件å��为: recently-used.xbel,所以æ¯�个用户都有ä¸�å�Œçš„列表。 该类的存在就是为 deepin 应用æ��供一个工具类,方便让打开的文件添加到最近文件列表中。 \sa Dtk::Core::DRecentData */ /*! \class Dtk::Core::DRecentData \inmodule dtkcore \brief 文件信æ�¯ç»“构体. \table \row \li appName \li 应用å��ç§° \row \li appExec \li 应用命令行å��ç§° \row \li mimeType \li 文件 mimetype å��称,一般ä¸�需è¦�填写,DRecentManager 内部自动获å�– \endtable \sa Dtk::Core::DRecentManager */ /*! \brief DRecentManager::addItem 在最近列表中添加一个项. \a uri 文件路径 \a data æ•°æ�®ä¿¡æ�¯ \return 如果返回 true 则æˆ�功添加,false 为添加失败 */ bool DRecentManager::addItem(const QString &uri, DRecentData &data) { if (!QFileInfo(uri).exists() || uri.isEmpty()) { return false; } QFile file(RECENT_PATH); file.open(QIODevice::ReadWrite | QIODevice::Text); #if QT_VERSION >= QT_VERSION_CHECK(6,0,0) QString dateTime = QDateTime::currentDateTime().toTimeZone(QTimeZone::UTC).toString(Qt::ISODate); #else QString dateTime = QDateTime::currentDateTime().toTimeSpec(Qt::OffsetFromUTC).toString(Qt::ISODate); #endif QDomDocument doc; if (!doc.setContent(&file)) { doc.clear(); doc.appendChild(doc.createProcessingInstruction("xml","version=\'1.0\' encoding=\'utf-8\'")); QDomElement xbelEle = doc.createElement("xbel"); xbelEle.setAttribute("xmlns:mime", "http://www.freedesktop.org/standards/shared-mime-info"); xbelEle.setAttribute("version", "1.0"); xbelEle.setAttribute("xmlns:bookmark", "http://www.freedesktop.org/standards/desktop-bookmarks"); doc.appendChild(xbelEle); } file.close(); // need to add file:// protocol. QUrl url = QUrl::fromLocalFile(uri); // get the MimeType name of the file. if (data.mimeType.isEmpty()) { data.mimeType = QMimeDatabase().mimeTypeForFile(uri).name(); } QDomElement rootEle = doc.documentElement(); QDomNodeList nodeList = rootEle.elementsByTagName("bookmark"); QDomElement bookmarkEle; bool isFound = false; // find bookmark element exists. for (int i = 0; i < nodeList.size(); ++i) { const QString fileUrl = nodeList.at(i).toElement().attribute("href"); if (fileUrl == url.toEncoded(QUrl::FullyDecoded)) { bookmarkEle = nodeList.at(i).toElement(); isFound = true; break; } } // update element content. if (isFound) { QDomNodeList appList = bookmarkEle.elementsByTagName("bookmark:application"); QDomElement appEle; bool appExists = false; for (int i = 0; i < appList.size(); ++i) { appEle = appList.at(i).toElement(); if (appEle.attribute("name") == data.appName && appEle.attribute("exec") == data.appExec) { appExists = true; break; } } if (appExists) { int count = appEle.attribute("count").toInt() + 1; bookmarkEle.setAttribute("modified", dateTime); bookmarkEle.setAttribute("visited", dateTime); appEle.setAttribute("modified", dateTime); appEle.setAttribute("count", QString::number(count)); } else { QDomNode appsNode = bookmarkEle.elementsByTagName("bookmark:applications").at(0); appEle = doc.createElement("bookmark:application"); appEle.setAttribute("name", data.appName); appEle.setAttribute("exec", data.appExec); appEle.setAttribute("modified", dateTime); appEle.setAttribute("count", "1"); appsNode.toElement().appendChild(appEle); } } // add new elements if they don't exist. else { QDomElement bookmarkEle, infoEle, metadataEle, mimeEle, appsEle, appChildEle; QString hrefStr = url.toEncoded(QUrl::FullyEncoded); bookmarkEle = doc.createElement("bookmark"); bookmarkEle.setAttribute("href", hrefStr); bookmarkEle.setAttribute("added", dateTime); bookmarkEle.setAttribute("modified", dateTime); bookmarkEle.setAttribute("visited", dateTime); infoEle = doc.createElement("info"); bookmarkEle.appendChild(infoEle); metadataEle = doc.createElement("metadata"); metadataEle.setAttribute("owner", "http://freedesktop.org"); infoEle.appendChild(metadataEle); mimeEle = doc.createElement("mime:mime-type"); mimeEle.setAttribute("type", data.mimeType); metadataEle.appendChild(mimeEle); appsEle = doc.createElement("bookmark:applications"); appChildEle = doc.createElement("bookmark:application"); appChildEle.setAttribute("name", data.appName); appChildEle.setAttribute("exec", data.appExec); appChildEle.setAttribute("modified", dateTime); appChildEle.setAttribute("count", "1"); appsEle.appendChild(appChildEle); metadataEle.appendChild(appsEle); QDomNode result = rootEle.appendChild(bookmarkEle); if (result.isNull()) { return false; } } // write to file. if (!file.open(QIODevice::WriteOnly)) { return false; } QTextStream out(&file); #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) out.setEncoding(QStringConverter::Utf8); #else out.setCodec("UTF-8"); #endif out << doc.toString(); out.flush(); file.close(); return true; } /*! \brief DRecentManager::removeItem 在最近列表中移除å�•个文件路径 \a target 需è¦�移除的文件路径 */ void DRecentManager::removeItem(const QString &target) { removeItems(QStringList() << target); } /*! \brief DRecentManager::removeItem 在最近列表中移除多个文件路径 \a list 需è¦�移除的文件路径列表 */ void DRecentManager::removeItems(const QStringList &list) { QFile file(RECENT_PATH); if (!file.open(QIODevice::ReadOnly)) { return; } QDomDocument doc; if (!doc.setContent(&file)) { file.close(); return; } file.close(); QDomElement rootEle = doc.documentElement(); QDomNodeList nodeList = rootEle.elementsByTagName("bookmark"); for (int i = 0; i < nodeList.count(); ) { const QString fileUrl = nodeList.at(i).toElement().attribute("href"); if (list.contains(QUrl::fromPercentEncoding(fileUrl.toLatin1())) || list.contains(QUrl(fileUrl).toEncoded(QUrl::FullyDecoded))) { rootEle.removeChild(nodeList.at(i)); } else { ++i; } } if (!file.open(QIODevice::WriteOnly)) { return; } QTextStream out(&file); #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) out.setEncoding(QStringConverter::Utf8); #else out.setCodec("UTF-8"); #endif out << doc.toString(); out.flush(); file.close(); return; } DCORE_END_NAMESPACE dtkcore-6.7.46/src/util/dtextencoding.cpp000066400000000000000000000340101522615770400203670ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022-2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dtextencoding.h" #include #include #include #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) #include #else #include #endif #include #include #include #include DCORE_BEGIN_NAMESPACE class LibICU { public: LibICU(); ~LibICU(); bool isValid(); bool detectEncoding(const QByteArray &content, QByteArrayList &charset); UCharsetDetector *(*icu_ucsdet_open)(UErrorCode *status); void (*icu_ucsdet_close)(UCharsetDetector *ucsd); void (*icu_ucsdet_setText)(UCharsetDetector *ucsd, const char *textIn, int32_t len, UErrorCode *status); const UCharsetMatch **(*icu_ucsdet_detectAll)(UCharsetDetector *ucsd, int32_t *matchesFound, UErrorCode *status); const char *(*icu_ucsdet_getName)(const UCharsetMatch *ucsm, UErrorCode *status); int32_t (*icu_ucsdet_getConfidence)(const UCharsetMatch *ucsm, UErrorCode *status); private: QLibrary *icuuc = nullptr; Q_DISABLE_COPY(LibICU) }; class Libuchardet { public: Libuchardet(); ~Libuchardet(); bool isValid(); QByteArray detectEncoding(const QByteArray &content); uchardet_t (*uchardet_new)(void); void (*uchardet_delete)(uchardet_t ud); int (*uchardet_handle_data)(uchardet_t ud, const char *data, size_t len); void (*uchardet_data_end)(uchardet_t ud); void (*uchardet_reset)(uchardet_t ud); const char *(*uchardet_get_charset)(uchardet_t ud); private: QLibrary *uchardet = nullptr; Q_DISABLE_COPY(Libuchardet) }; Q_GLOBAL_STATIC(LibICU, LibICUInstance); Q_GLOBAL_STATIC(Libuchardet, LibuchardetInstance); LibICU::LibICU() { // Load libicuuc.so icuuc = new QLibrary("libicuuc"); if (!icuuc->load()) { delete icuuc; icuuc = nullptr; return; } auto initFunctionError = [this]() { icuuc->unload(); delete icuuc; icuuc = nullptr; }; #define INIT_ICUUC(Name) \ icu_##Name = reinterpret_cast(icuuc->resolve(#Name)); \ if (!icu_##Name) { \ initFunctionError(); \ return; \ } // Note: use prefix 'icu' to avoid "disabled expansion of recursive macro" warning. INIT_ICUUC(ucsdet_open); INIT_ICUUC(ucsdet_close); INIT_ICUUC(ucsdet_setText); INIT_ICUUC(ucsdet_detectAll); INIT_ICUUC(ucsdet_getName); INIT_ICUUC(ucsdet_getConfidence); } LibICU::~LibICU() { if (icuuc) { delete icuuc; } } bool LibICU::isValid() { return (icuuc); } bool LibICU::detectEncoding(const QByteArray &content, QByteArrayList &charset) { UErrorCode status = U_ZERO_ERROR; UCharsetDetector *detector = icu_ucsdet_open(&status); if (U_FAILURE(status)) { return false; } icu_ucsdet_setText(detector, content.data(), content.size(), &status); if (U_FAILURE(status)) { icu_ucsdet_close(detector); return false; } int32_t matchCount = 0; const UCharsetMatch **charsetMatch = icu_ucsdet_detectAll(detector, &matchCount, &status); if (U_FAILURE(status)) { icu_ucsdet_close(detector); return false; } int recordCount = qMin(3, matchCount); for (int i = 0; i < recordCount; i++) { const char *encoding = icu_ucsdet_getName(charsetMatch[i], &status); if (U_FAILURE(status)) { icu_ucsdet_close(detector); return false; } charset << QByteArray(encoding); } icu_ucsdet_close(detector); return true; } Libuchardet::Libuchardet() { uchardet = new QLibrary("libuchardet", "0"); if (!uchardet->load()) { delete uchardet; uchardet = nullptr; return; } auto initFunctionError = [this]() { uchardet->unload(); delete uchardet; uchardet = nullptr; }; #define INIT_UCHARDET(Name) \ Name = reinterpret_cast(uchardet->resolve(#Name)); \ if (!Name) { \ initFunctionError(); \ return; \ } INIT_UCHARDET(uchardet_new); INIT_UCHARDET(uchardet_delete); INIT_UCHARDET(uchardet_handle_data); INIT_UCHARDET(uchardet_data_end); INIT_UCHARDET(uchardet_reset); INIT_UCHARDET(uchardet_get_charset); } Libuchardet::~Libuchardet() { if (uchardet) { delete uchardet; } } bool Libuchardet::isValid() { return uchardet; } QByteArray Libuchardet::detectEncoding(const QByteArray &content) { QByteArray charset; uchardet_t handle = uchardet_new(); if (0 == uchardet_handle_data(handle, content.data(), static_cast(content.size()))) { uchardet_data_end(handle); charset = QByteArray(uchardet_get_charset(handle)); } uchardet_delete(handle); return charset; } QByteArray selectCharset(const QByteArray &charset, const QByteArrayList &icuCharsetList) { if (icuCharsetList.isEmpty()) { return charset; } static QByteArray encodingGB18030("GB18030"); if (charset.isEmpty()) { return icuCharsetList.contains(encodingGB18030) ? encodingGB18030 : icuCharsetList[0]; } else { if (charset.contains(icuCharsetList[0])) { return charset; } else { return icuCharsetList[0].contains(charset) ? icuCharsetList[0] : charset; } } } QByteArray DTextEncoding::detectTextEncoding(const QByteArray &content) { if (content.isEmpty()) { return QByteArray("UTF-8"); } QByteArray charset; if (LibuchardetInstance()->isValid()) { charset = LibuchardetInstance()->detectEncoding(content); } if (LibICUInstance()->isValid()) { QByteArrayList icuCharsetList; if (LibICUInstance()->detectEncoding(content, icuCharsetList)) { if (charset.isEmpty() && !icuCharsetList.isEmpty()) { charset = icuCharsetList.first(); } else { // Improve GB18030 encoding recognition rate. charset = selectCharset(charset, icuCharsetList); } } } if (charset.isEmpty()) { #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) std::optional encoding = QStringConverter::encodingForData(content); if (encoding) { return QStringConverter::nameForEncoding(encoding.value()); } #else QTextCodec *codec = QTextCodec::codecForUtfText(content); if (codec) { return codec->name(); } #endif } // Use default encoding. if (charset.isEmpty() || charset.contains("ASCII")) { charset = QByteArray("UTF-8"); } return charset; } QByteArray DTextEncoding::detectFileEncoding(const QString &fileName, bool *isOk) { QFile file(fileName); if (!file.open(QFile::ReadOnly | QFile::Text)) { if (isOk) { *isOk = false; } return QByteArray(); } // At most 64Kb data. QByteArray content = file.read(qMin(static_cast(file.size()), USHRT_MAX)); file.close(); if (isOk) { *isOk = true; } return detectTextEncoding(content); } bool DTextEncoding::convertTextEncoding( QByteArray &content, QByteArray &outContent, const QByteArray &toEncoding, const QByteArray &fromEncoding, QString *errString) { return convertTextEncodingEx(content, outContent, toEncoding, fromEncoding, errString); } bool DTextEncoding::convertTextEncodingEx(QByteArray &content, QByteArray &outContent, const QByteArray &toEncoding, const QByteArray &fromEncoding, QString *errString, int *convertedBytes) { if (content.isEmpty() || fromEncoding == toEncoding) { return true; } if (toEncoding.isEmpty()) { if (errString) { *errString = QStringLiteral("The encode that convert to is empty."); } return false; } QByteArray contentEncoding = fromEncoding; if (contentEncoding.isEmpty()) { contentEncoding = detectTextEncoding(content); } // iconv set errno when failed. iconv_t handle = iconv_open(toEncoding.data(), contentEncoding.data()); if (reinterpret_cast(-1) != handle) { size_t inBytesLeft = static_cast(content.size()); char *inbuf = content.data(); size_t outBytesLeft = inBytesLeft * 4; char *outbuf = new char[outBytesLeft]; char *bufferHeader = outbuf; size_t maxBufferSize = outBytesLeft; size_t ret = iconv(handle, &inbuf, &inBytesLeft, &outbuf, &outBytesLeft); int convertError = 0; if (static_cast(-1) == ret) { convertError = errno; int converted = content.size() - static_cast(inBytesLeft); if (convertedBytes) { *convertedBytes = converted; } if (errString) { switch (convertError) { case EILSEQ: *errString = QString("An invalid multibyte sequence has been encountered in the input." "Converted byte index: %1") .arg(converted); break; case EINVAL: *errString = QString("An incomplete multibyte sequence has been encountered in the input. " "Converted byte index: %1") .arg(converted); break; case E2BIG: *errString = QString("There is not sufficient room at *outbuf. Converted byte index: %1").arg(converted); break; default: break; } } } iconv_close(handle); // Use iconv converted byte count. size_t realConvertSize = maxBufferSize - outBytesLeft; outContent = QByteArray(bufferHeader, static_cast(realConvertSize)); delete[] bufferHeader; // For errors, user decides to keep or remove converted text. return 0 == convertError; } else { if (EINVAL == errno && errString) { *errString = QStringLiteral("The conversion from fromcode to tocode is not supported by the implementation."); } return false; } } bool DTextEncoding::convertFileEncoding(const QString &fileName, const QByteArray &toEncoding, const QByteArray &fromEncoding, QString *errString) { if (fromEncoding == toEncoding) { return true; } QFile file(fileName); if (!file.open(QFile::ReadWrite | QFile::Text)) { if (errString) { *errString = file.errorString(); file.error(); } return false; } QByteArray content = file.readAll(); QByteArray outContent; if (!convertTextEncoding(content, outContent, toEncoding, fromEncoding, errString)) { file.close(); return false; } file.seek(0); file.write(outContent); file.resize(outContent.size()); file.close(); if (QFile::NoError != file.error()) { if (errString) { *errString = file.errorString(); } return false; } return true; } bool DTextEncoding::convertFileEncodingTo(const QString &fromFile, const QString &toFile, const QByteArray &toEncoding, const QByteArray &fromEncoding, QString *errString) { if (fromEncoding == toEncoding) { return true; } if (fromFile == toFile) { return convertFileEncoding(fromFile, toEncoding, fromEncoding, errString); } // Check from file and to file before convert. QFile readFile(fromFile); if (!readFile.open(QFile::ReadOnly | QFile::Text)) { if (errString) { *errString = QString("Open convert from file failed, %1").arg(readFile.errorString()); } return false; } QFile writeFile(toFile); if (!writeFile.open(QFile::WriteOnly | QFile::Text)) { readFile.close(); if (errString) { *errString = QString("Open convert to file failed, %1").arg(writeFile.errorString()); } return false; } QByteArray content = readFile.readAll(); readFile.close(); QByteArray outContent; if (!convertTextEncoding(content, outContent, toEncoding, fromEncoding, errString)) { writeFile.close(); writeFile.remove(); return false; } writeFile.write(outContent); writeFile.close(); if (QFile::NoError != writeFile.error()) { if (errString) { *errString = writeFile.errorString(); } return false; } return true; } DCORE_END_NAMESPACE dtkcore-6.7.46/src/util/dthreadutils.cpp000066400000000000000000000053511522615770400202320ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dthreadutils.h" DCORE_BEGIN_NAMESPACE #if DTK_VERSION < DTK_VERSION_CHECK(6, 0, 0, 0) namespace DThreadUtil { FunctionCallProxy::FunctionCallProxy(QThread *thread) { qRegisterMetaType>(); connect(this, &FunctionCallProxy::callInLiveThread, this, [] (QSemaphore *s, QPointer target, FunctionType *func) { if (Q_LIKELY(target)) { (*func)(); } else { qWarning() << "DThreadUtils::runInThread:" << "The target object is destoryed"; } s->release(); }, Qt::QueuedConnection); connect(thread, &QThread::finished, this, [this] { qWarning() << "DThreadUtils::runInThread:" << sender() << "the thread finished"; }, Qt::DirectConnection); } void FunctionCallProxy::proxyCall(QSemaphore *s, QThread *thread, QObject *target, FunctionType fun) { if (QThread::currentThread() == thread) return fun(); FunctionCallProxy proxy(thread); proxy.moveToThread(thread); // 如果线程未开å�¯äº‹ä»¶å¾ªçŽ¯ï¼Œä¸”ä¸�是主线程,则需è¦�给出严é‡�警告信æ�¯ï¼Œå› ä¸ºå�¯èƒ½ä¼šå¯¼è‡´æ­»é”� if (thread->loopLevel() <= 0 && (!QCoreApplication::instance() || thread != QCoreApplication::instance()->thread())) { qCritical() << Q_FUNC_INFO << thread << ", the thread no event loop"; } proxy.callInLiveThread(s, target ? target : &proxy, &fun); s->acquire(); } } #else class Q_DECL_HIDDEN Caller : public QObject { public: explicit Caller() : QObject() { } bool event(QEvent *event) override { if (event->type() == DThreadUtils::eventType) { auto ev = static_cast(event); ev->call(); return true; } return QObject::event(event); } }; DThreadUtils::DThreadUtils(QThread *thread) : m_thread(thread) , threadContext(nullptr) { } DThreadUtils::~DThreadUtils() { delete threadContext.loadRelaxed(); } DThreadUtils &DThreadUtils::gui() { static auto global = DThreadUtils(QCoreApplication::instance()->thread()); return global; } QThread *DThreadUtils::thread() const noexcept { return m_thread; } QObject *DThreadUtils::ensureThreadContextObject() { QObject *context; if (!threadContext.loadRelaxed()) { context = new Caller(); context->moveToThread(m_thread); if (!threadContext.testAndSetRelaxed(nullptr, context)) { context->moveToThread(nullptr); delete context; } } context = threadContext.loadRelaxed(); Q_ASSERT(context); return context; } #endif DCORE_END_NAMESPACE dtkcore-6.7.46/src/util/dtimedloop.cpp000066400000000000000000000071271522615770400177010ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dtimedloop.h" #include #include #include #include #include #include DCORE_BEGIN_NAMESPACE #ifdef QT_DEBUG Q_LOGGING_CATEGORY(logTimedLoop, "dtk.dtimedloop") #else Q_LOGGING_CATEGORY(logTimedLoop, "dtk.dtimedloop", QtInfoMsg) #endif class DTimedLoopPrivate : public DObjectPrivate { D_DECLARE_PUBLIC(DTimedLoop) public: DTimedLoopPrivate(DTimedLoop *qq = nullptr); ~DTimedLoopPrivate(); int m_returnCode = 0; QTime m_startTime; QTime m_stopTime; bool m_timeDumpFlag = false; char __padding[3]; QString m_exectionName; void setExecutionName(const QString &executionName); class LoopGuard { DTimedLoopPrivate *m_p = nullptr; public: LoopGuard(DTimedLoopPrivate *p) : m_p (p) { m_p->m_startTime = QTime::currentTime(); } ~LoopGuard() { m_p->m_stopTime = QTime::currentTime(); if (!m_p->m_timeDumpFlag) { return; } if (Q_UNLIKELY(m_p->m_exectionName.isEmpty())) { qCDebug(logTimedLoop(), "The execution time is %-5d ms", m_p->m_startTime.msecsTo(QTime::currentTime())); } else { qCDebug(logTimedLoop(), "The execution time is %-5d ms for \"%s\"", m_p->m_startTime.msecsTo(QTime::currentTime()), m_p->m_exectionName.toLocal8Bit().data()); m_p->m_exectionName.clear(); } } }; }; DTimedLoopPrivate::DTimedLoopPrivate(DTimedLoop *qq) : DObjectPrivate (qq) { } DTimedLoopPrivate::~DTimedLoopPrivate() { } void DTimedLoopPrivate::setExecutionName(const QString &executionName) { m_exectionName = executionName; } DTimedLoop::DTimedLoop(QObject *parent) noexcept : QEventLoop (parent) , DObject (*new DTimedLoopPrivate(this)) { } DTimedLoop::DTimedLoop() noexcept : QEventLoop () , DObject (*new DTimedLoopPrivate(this)) { } DTimedLoop::~DTimedLoop() { } int DTimedLoop::runningTime() { Q_D(DTimedLoop); if (QEventLoop::isRunning()) { return d->m_startTime.msecsTo(QTime::currentTime()); } return d->m_startTime.msecsTo(d->m_stopTime); } void DTimedLoop::setTimeDump(bool flag) { Q_D(DTimedLoop); d->m_timeDumpFlag = flag; } void DTimedLoop::exit(int returnCode) { // é�¿å…�在å­�线程中æ��å‰�被执行 DThreadUtil::runInMainThread([this, returnCode]{ QEventLoop::exit(returnCode); }); } int DTimedLoop::exec(QEventLoop::ProcessEventsFlags flags) { Q_D(DTimedLoop); DTimedLoopPrivate::LoopGuard guard(d); return QEventLoop::exec(flags); } int DTimedLoop::exec(int durationTimeMs, QEventLoop::ProcessEventsFlags flags) { Q_D(DTimedLoop); int runningTime = durationTimeMs < 0 ? 0 : durationTimeMs; QTimer::singleShot(runningTime, [this] { QEventLoop::exit(0); }); DTimedLoopPrivate::LoopGuard guard(d); return QEventLoop::exec(flags); } int DTimedLoop::exec(const QString &executionName, QEventLoop::ProcessEventsFlags flags) { Q_D(DTimedLoop); d->setExecutionName(executionName); return exec(flags); } int DTimedLoop::exec(int durationMs, const QString &executionName, QEventLoop::ProcessEventsFlags flags) { Q_D(DTimedLoop); d->setExecutionName(executionName); return exec(durationMs, flags); } DCORE_END_NAMESPACE dtkcore-6.7.46/src/util/dtimeunitformatter.cpp000066400000000000000000000016361522615770400214660ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dtimeunitformatter.h" #include DCORE_BEGIN_NAMESPACE DTimeUnitFormatter::DTimeUnitFormatter() : DAbstractUnitFormatter() { } uint DTimeUnitFormatter::unitConvertRate(int unitId) const { switch (unitId) { case Seconds: return 60; case Minute: return 60; case Hour: return 24; default:; } return 0; } QString DTimeUnitFormatter::unitStr(int unitId) const { switch (unitId) { case Seconds: return QStringLiteral("s"); case Minute: return QStringLiteral("m"); case Hour: return QStringLiteral("h"); case Day: return QStringLiteral("d"); default:; } return QString(); } DCORE_END_NAMESPACE dtkcore-6.7.46/src/util/dutil.cpp000066400000000000000000000062261522615770400166610ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dutil.h" namespace DUtil { QString escapeToObjectPath(const QByteArray &str) noexcept { if (str.isEmpty()) { return QStringLiteral("_"); } QString ret; ret.reserve(str.size() * 3); for (qsizetype i = 0; i < str.size(); ++i) { auto byte = static_cast(str.at(i)); if (std::isalnum(byte) != 0 || byte == '/') { ret.append(QChar::fromLatin1(byte)); } else { // TODO: a valid dbus object path component only allows "[A-Z][a-z][0-9]_" // for compatibility with existing applications, we escape all unicode to avoid breakage // but we should consider to drop this compatibility hack in the future. ret.append(u'_'); ret.append(QString::number(byte, 16).rightJustified(2, u'0').toLower()); } } ret.shrink_to_fit(); return ret; } QString escapeToObjectPath(const QString &str) noexcept { return escapeToObjectPath(str.toUtf8()); } QString unescapeFromObjectPath(const QString &str) noexcept { QByteArray ret; ret.reserve(str.length()); for (qsizetype i = 0; i < str.length();) { if (i <= str.length() - 3 && str.at(i) == u'_') { bool ok{false}; auto byte = static_cast(str.mid(i + 1, 2).toUShort(&ok, 16)); if (ok) { ret.append(static_cast(byte)); i += 3; continue; } } ret.append(str.at(i).toLatin1()); ++i; } return QString::fromUtf8(ret); } QString getAppIdFromAbsolutePath(const QString &path) noexcept { static QString desktopSuffix{u8".desktop"}; const auto &appDirs = QStandardPaths::standardLocations(QStandardPaths::ApplicationsLocation); if (!path.endsWith(desktopSuffix) || !std::any_of(appDirs.cbegin(), appDirs.constEnd(), [&path](const QString &dir) { return path.startsWith(dir); })) { return {}; } auto tmp = path.chopped(desktopSuffix.size()); auto components = tmp.split(QDir::separator(), Qt::SkipEmptyParts); auto location = std::find(components.cbegin(), components.cend(), "applications"); if (location == components.cend()) { return {}; } auto appId = QStringList{location + 1, components.cend()}.join('-'); return appId; } QStringList getAbsolutePathFromAppId(const QString &appId) noexcept { auto components = appId.split('-', Qt::SkipEmptyParts); auto appDirs = QStandardPaths::standardLocations(QStandardPaths::ApplicationsLocation); QStringList ret; for (const auto &dirPath : appDirs) { auto currentDir = dirPath; for (auto it = components.cbegin(); it != components.cend(); ++it) { auto currentName = QStringList{it, components.cend()}.join('-') + QString{".desktop"}; QDir dir{currentDir}; if (dir.exists(currentName)) { ret.append(dir.filePath(currentName)); } currentDir.append(QDir::separator() + *it); } } return ret; } } dtkcore-6.7.46/src/util/dvtablehook.cpp000066400000000000000000000345501522615770400200430ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2019 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dvtablehook.h" #include #include #ifdef Q_OS_LINUX #include #include #include QT_BEGIN_NAMESPACE QFunctionPointer qt_linux_find_symbol_sys(const char *symbol); QT_END_NAMESPACE #endif DCORE_BEGIN_NAMESPACE QMap DVtableHook::objToOriginalVfptr; QMap DVtableHook::objToGhostVfptr; QMap DVtableHook::objDestructFun; bool DVtableHook::copyVtable(quintptr **obj) { int vtable_size = getVtableSize(obj); if (vtable_size == 0) return false; // 多开辟一个元素, 新的虚表结构如下: // å�‡è®¾åŽŸè™šè¡¨å†…å­˜å¸ƒå±€å¦‚ä¸‹(考虑多继承): // C Vtable (7 entities) // +--------------------+ // struct C | offset_to_top (0) | // object +--------------------+ // 0 - struct A (primary base) | RTTI for C | // 0 - vptr_A -----------------------------> +--------------------+ // 8 - int ax | C::f0() | // 16 - struct B +--------------------+ // 16 - vptr_B ----------------------+ | C::f1() | // 24 - int bx | +--------------------+ // 28 - int cx | | offset_to_top (-16)| // sizeof(C): 32 align: 8 | +--------------------+ // | | RTTI for C | // +------> +--------------------+ // | Thunk C::f1() | // +--------------------+ // 则新的表结构为: // C Vtable (7 entities) C hooked Vtable (7 entities) // +--------------------+ +--------------------+ // struct C | offset_to_top (0) | | offset_to_top (0) | // object +--------------------+ +--------------------+ // 0 - struct A (primary base) | RTTI for C | | RTTI for C | // 0 - vptr_A -----------------------------// +--------------------+ //------> +--------------------+ // 8 - int ax | C::f0() |\ | C::f0() | (or override custom function pointer) // 16 - struct B +--------------------+ \ +--------------------+ // 16 - vptr_B ----------------------+ | C::f1() | \ | C::f1() | (or override custom function pointer) // 24 - int bx | +--------------------+ \ +--------------------+ // 28 - int cx | | offset_to_top (-16)| \ | offset_to_top (-16)| // sizeof(C): 32 align: 8 | +--------------------+ \ +--------------------+ // | | RTTI for C | + | RTTI for C | // +------> +--------------------+ | +--------------------+ // | Thunk C::f1() | | | Thunk C::f1() | // +--------------------+ | +--------------------+ // | | 0 | // | +--------------------+ // +----| original entry | // +--------------------+ quintptr *new_vtable = new quintptr[vtable_size + 2]; // store 0 and oringinal entry memcpy(new_vtable, adjustToTop(*obj), vtable_size * sizeof(quintptr)); new_vtable[vtable_size] = 0; //! save original vfptr objToOriginalVfptr[obj] = *obj; // 存储对象原虚表入å�£åœ°å�€ new_vtable[vtable_size + 1] = quintptr(*obj); *obj = adjustToEntry(new_vtable); //! save ghost vfptr objToGhostVfptr[obj] = new_vtable; return true; } bool DVtableHook::clearGhostVtable(const void *obj) { if (!objToOriginalVfptr.remove((quintptr **)obj)) // Uninitialized memory may have values, for resetVtable return false; objDestructFun.remove(obj); quintptr *vtable = objToGhostVfptr.take(obj); if (vtable) { delete[] vtable; return true; } return false; } /** \brief 通过é��历å°�试找到æž�构函数在虚表中的ä½�ç½® \a obj \a destoryObjFun \return */ int DVtableHook::getDestructFunIndex(quintptr **obj, std::function destoryObjFun) { class _DestoryProbe { public: static quintptr probe(quintptr obj) { static quintptr _obj = 0; if (obj == 0) { obj = _obj; _obj = 0; } else { _obj = obj; } return obj; } static void nothing() { } }; quintptr *vtable = *obj; int vtable_size = getVtableSize(obj); if (vtable_size == 0) return -1; quintptr *new_vtable = new quintptr[vtable_size]; std::fill(adjustToEntry(new_vtable), new_vtable + vtable_size, quintptr(&_DestoryProbe::nothing)); // 给对象设置新的虚表 *obj = adjustToEntry(new_vtable); int index = -1; for (int i = adjustToEntry(0); i < vtable_size; ++i) { new_vtable[i] = quintptr(&_DestoryProbe::probe); // å°�试销æ¯�此对象, 且观察_DestoryProbe::probe是å�¦è¢«è°ƒç”¨ // 如果被调用, 则è¯�明覆盖此虚函数能达到监控对象被销æ¯�的目的 destoryObjFun(); if (_DestoryProbe::probe(0) == quintptr(obj)) { index = adjustToTop(i); break; } } // æ�¢å¤�旧的虚表 *obj = vtable; // 销æ¯�临时虚表 delete[] new_vtable; return index; } void DVtableHook::autoCleanVtable(const void *obj) { quintptr fun = objDestructFun.value(obj); if (!fun) return; if (hasVtable(obj)) {// 需è¦�判断一下,有å�¯èƒ½åœ¨æ‰§è¡Œæž�构函数时虚表已ç»�被删除 // clean clearGhostVtable(obj); } typedef void(*Destruct)(const void*); Destruct destruct = reinterpret_cast(fun); // call origin destruct function destruct(obj); } bool DVtableHook::ensureVtable(const void *obj, std::function destoryObjFun) { quintptr **_obj = (quintptr**)(obj); if (objToOriginalVfptr.contains(_obj)) { // ä¸�知é�“什么原因, 此时obj对象的虚表已ç»�被还原 if (objToGhostVfptr.value((void *)obj) != adjustToTop(*_obj)) { clearGhostVtable((void*)obj); } else { return true; } } if (!copyVtable(_obj)) return false; // 查找对象的æž�构函数 int index = getDestructFunIndex(_obj, destoryObjFun); // 虚æž�构函数查找失败 if (index < 0) { qCWarning(vtableHook) << "Failed do override destruct function: " << obj; abort(); } quintptr *new_vtable = *_obj; // ä¿�存对象真实的æž�构函数 objDestructFun[(void*)obj] = new_vtable[index]; // 覆盖æž�构函数, 用于在对象æž�构时自动清ç�†è™šè¡¨ new_vtable[index] = reinterpret_cast(&autoCleanVtable); return true; } /*! \brief DVtableHook::hasVtable 对象的虚表已ç»�被覆盖时返回true,å�¦åˆ™è¿”回false \a obj \return */ bool DVtableHook::hasVtable(const void *obj) { quintptr **_obj = (quintptr**)(obj); // 验è¯� vtable 是å�¦åŒ¹é…� quintptr *ghost_vtable = objToGhostVfptr.value(obj); if (!ghost_vtable) { return false; } // 检查当å‰�对象的 vtable 指针是å�¦æŒ‡å�‘我们记录的 ghost vtable if (*_obj != adjustToEntry(ghost_vtable)) { // vtable ä¸�匹é…�,说明地å�€è¢«é‡�用了 qCDebug(vtableHook) << "hasVtable: vtable mismatch! Address reused by different object." << "obj:" << QString("0x%1").arg((quintptr)obj, 0, 16); return false; } return true; } void DVtableHook::resetVtable(const void *obj) { quintptr **_obj = (quintptr**)obj; int vtable_size = getVtableSize(_obj); // 获å�–obj对象原本虚表的入å�£ auto vtableHead = adjustToTop(*_obj); quintptr *vfptr_t2 = (quintptr*)vtableHead[vtable_size + 1]; // _obj - 2 + vtable_size + 1 if (!vfptr_t2) return; if (!clearGhostVtable(obj)) return; // 还原虚表 *_obj = vfptr_t2; } /*! \brief å°†å��ç§»é‡�为\a functionOffset 的虚函数还原到原本的实现 \a obj \a functionOffset \return 如果æˆ�功, 返回还原之å‰�obj对象虚表中存储的函数指针, å�¦åˆ™è¿”回0 */ quintptr DVtableHook::resetVfptrFun(const void *obj, quintptr functionOffset) { quintptr *vfptr_t1 = *(quintptr **)obj; quintptr current_fun = *(vfptr_t1 + functionOffset / sizeof(quintptr)); quintptr origin_fun = originalFun(obj, functionOffset); if (!origin_fun) { return 0; } // reset to original fun *(vfptr_t1 + functionOffset / sizeof(quintptr)) = origin_fun; return current_fun; } /*! \brief 获å�– \a obj 对象å��ç§»é‡�为 \a functionOffset 的虚函数原本的函数指针 \return 如果obj对象虚表没有被覆盖, 或者函数å��ç§»é‡�正确, 将返回0 */ quintptr DVtableHook::originalFun(const void *obj, quintptr functionOffset) { quintptr **_obj = (quintptr **)obj; if (!hasVtable(obj)) { qCWarning(vtableHook) << "Not override the object virtual table: " << obj; return 0; } int vtable_size = getVtableSize(_obj); // 获å�–obj对象原本虚表的入å�£ quintptr *vfptr_t2 = (quintptr*)(*_obj)[vtable_size - 1]; if (functionOffset > UINT_LEAST16_MAX) { qCWarning(vtableHook, "Is not a virtual function, function address: 0X%llx", functionOffset); return 0; } return *(vfptr_t2 + functionOffset / sizeof(quintptr)); } #if DTK_VERSION < DTK_VERSION_CHECK(6, 0, 0, 0) bool DVtableHook::isFinalClass(quintptr *obj) { Q_UNUSED(obj); return true; } quintptr **DVtableHook::adjustThis(quintptr *obj) { Q_UNUSED(obj); return nullptr; } #endif #if defined(Q_OS_LINUX) static int readProtFromPsm(quintptr adr, size_t length) { int prot = PROT_NONE; QString fname = "/proc/self/maps"; QFile f(fname); if (!f.open(QIODevice::ReadOnly)) { qFatal("%s", f.errorString().toStdString().data()); //return prot; // never be executed } QByteArray data = f.readAll(); bool ok = false; quintptr startAddr = 0, endAddr = 0; QTextStream ts(data); while (Q_UNLIKELY(!ts.atEnd())) { const QString line = ts.readLine(); const QStringList &maps = line.split(' '); if (Q_UNLIKELY(maps.size() < 3)) { data = f.readLine(); continue; } //"00400000-00431000" "r--p" const QStringList addrs = maps.value(0).split('-'); startAddr = addrs.value(0).toULongLong(&ok, 16); Q_ASSERT(ok); endAddr = addrs.value(1).toULongLong(&ok, 16); Q_ASSERT(ok); if (Q_LIKELY(adr >= endAddr)) { continue; } if (adr >= startAddr && adr + length <= endAddr) { QString ps = maps.value(1); //qDebug() << maps.value(0) << maps.value(1); for (QChar c : ps) { switch (c.toLatin1()) { case 'r': prot |= PROT_READ; break; case 'w': prot |= PROT_WRITE; break; case 'x': prot |= PROT_EXEC; break; default: break; // '-' 'p' don't care } } break; } else if (adr < startAddr) { qFatal("%p not found in proc maps", reinterpret_cast(adr)); //break; // 超出了地å�€ä¸�需è¦�å†�去检查了 } } return prot; } #endif bool DVtableHook::forceWriteMemory(void *adr, const void *data, size_t length) { #ifdef Q_OS_LINUX int page_size = sysconf(_SC_PAGESIZE); quintptr x = reinterpret_cast(adr); // ä¸�å‡�去一个pagesize防止跨越两个数æ�®åŒºåŸŸ(对应/proc/self/maps两行数æ�®) void *new_adr = reinterpret_cast((x /*- page_size - 1*/) & ~(page_size - 1)); size_t override_data_length = length + x - reinterpret_cast(new_adr); int oldProt = readProtFromPsm(quintptr(new_adr), override_data_length); bool writeable = oldProt & PROT_WRITE; // 增加判断是å�¦å·²ç»�å�¯å†™ï¼Œä¸�能写æ‰�调用。 // 失败时直接放弃 if (!writeable && mprotect(new_adr, override_data_length, PROT_READ | PROT_WRITE)) { qCWarning(vtableHook, "mprotect(change) failed: %s", strerror(errno)); return false; } #endif // å¤�制数æ�® memcpy(adr, data, length); #ifdef Q_OS_LINUX // æ�¢å¤�内存标志ä½� if (!writeable && mprotect(new_adr, override_data_length, oldProt)) { qCWarning(vtableHook, "mprotect(restore) failed: %s", strerror(errno)); return false; } #endif return true; } QFunctionPointer DVtableHook::resolve(const char *symbol) { #ifdef Q_OS_LINUX /** ï¼�ï¼�ä¸�è¦�使用qt_linux_find_symbol_sys函数去获å�–符å�· 在龙芯平å�°ä¸Šï¼Œqt_linux_find_symbol_sys 无法获å�–部分已加载动æ€�库的符å�·ï¼Œ å�¯èƒ½çš„原因是这个函数对 dlsym 的调用是在 libQt5Core 动æ€�库中,这个库加载的比较早, 有å�¯èƒ½æ˜¯å› æ­¤å¯¼è‡´æ— æ³•获å�–比这个库加载更晚的库中的符å�·(仅为猜测) */ return QFunctionPointer(dlsym(RTLD_DEFAULT, symbol)); #else // TODO return nullptr; #endif } DCORE_END_NAMESPACE dtkcore-6.7.46/src/util/resources/000077500000000000000000000000001522615770400170405ustar00rootroot00000000000000dtkcore-6.7.46/src/util/resources/dpinyin.dict000066400000000000000000017473071522615770400214020ustar00rootroot000000000000000x3400:qiÅ« # ã�€ 0x3401:tiÇŽn,tiàn # ã�� 0x3404:kuà # ã�„ 0x3405:wÇ” # ã�… 0x3406:yÇ�n,yÄ« # ã�† 0x340c:sì,yí # ã�Œ 0x3416:yè # ã�– 0x341c:chóu # ã�œ 0x3421:nuò # ã�¡ 0x3424:qiú # ã�¤ 0x3428:xù # ã�¨ 0x3429:xíng # ã�© 0x342b:xiÅ�ng # ã�« 0x342c:liú # ã�¬ 0x342d:lÇ�n # ã�­ 0x342e:xiÄ�ng # ã�® 0x342f:yÅ�ng # ã�¯ 0x3430:xìn # ã�° 0x3431:zhÄ›n # ã�± 0x3432:dài,fú # ã�² 0x3433:wù # ã�³ 0x3434:pÄ�n # ã�´ 0x3437:mÇŽ,mà,mián # ã�· 0x3438:qiàn # ã�¸ 0x3439:yì # ã�¹ 0x343a:zhòng,yín # ã�º 0x343b:nèi # ã�» 0x343c:chèng,zhÄ›ng # ã�¼ 0x3441:zhuÅ� # ã‘� 0x3442:fÇŽng,páng # ã‘‚ 0x3443:ÇŽo # 㑃 0x3444:wÇ” # ã‘„ 0x3445:zuò # ã‘… 0x3447:zhòu # 㑇 0x3448:dòng # 㑈 0x3449:sù # 㑉 0x344a:yì # 㑊 0x344b:jiòng,kÇ’ng,qióng # ã‘‹ 0x344c:wÄ�ng,kuÄ�ng # 㑌 0x344d:lÄ›i,lèi # ã‘� 0x344e:nÇŽo # 㑎 0x344f:zhù # ã‘� 0x3454:xÇ” # ã‘” 0x3458:jiè # 㑘 0x3459:dié,yÇ’ng # ã‘™ 0x345a:nuó # 㑚 0x345b:sù # ã‘› 0x345c:yì,chì # 㑜 0x345d:lòng # ã‘� 0x345e:yìng # 㑞 0x345f:bÄ›ng,bó,pÄ›ng # 㑟 0x3463:lán # ã‘£ 0x3464:miáo # 㑤 0x3465:yì # ã‘¥ 0x3466:lì # 㑦 0x3467:jì # ã‘§ 0x3468:yÇ” # 㑨 0x3469:luó # ã‘© 0x346a:chái # 㑪 0x346e:hún,wén # ã‘® 0x346f:xÇ” # 㑯 0x3470:huì # ã‘° 0x3471:rÇŽo # 㑱 0x3473:zhòu # 㑳 0x3475:hàn,jí,jié,zhÇŽ,zí # 㑵 0x3476:xì # ã‘¶ 0x3477:tài # ã‘· 0x3478:ÇŽi,yáo,yóu # 㑸 0x3479:huì # 㑹 0x347a:jùn # 㑺 0x347b:mà # ã‘» 0x347c:lüè # 㑼 0x347d:táng # 㑽 0x347e:xiáo,yáo # 㑾 0x347f:zhào # ã‘¿ 0x3480:zhÇŽ # ã’€ 0x3481:yÇ”,yùn # ã’� 0x3482:kù,zhuó # ã’‚ 0x3483:èr # ã’ƒ 0x3484:nàng,nèn,rÇŽn # ã’„ 0x3485:qÇ� # ã’… 0x3486:chì,kè,xì,xiào,yàn # ã’† 0x3487:mù,wÇ” # ã’‡ 0x3488:hàn # ã’ˆ 0x3489:tÇŽng # ã’‰ 0x348a:sè # ã’Š 0x348c:qióng # ã’Œ 0x348d:léi,lÄ›i # ã’� 0x348e:sÇŽ,sà,tàn # ã’Ž 0x3491:huì,kuÇ� # ã’‘ 0x3492:pú # ã’’ 0x3493:tà # ã’“ 0x3494:shÇ” # ã’” 0x3496:Ç’u # ã’– 0x3497:tái # ã’— 0x3499:mián # ã’™ 0x349a:wÄ›n # ã’š 0x349b:diào # ã’› 0x349c:yú,yÇ” # ã’œ 0x349d:miè,wà # ã’� 0x349e:jùn,kÄ› # ã’ž 0x349f:niÇŽo # ã’Ÿ 0x34a0:xiè # ã’  0x34a1:yóu # ã’¡ 0x34a4:shè,chè # ã’¤ 0x34a6:lÄ›i # ã’¦ 0x34a7:lì # ã’§ 0x34a9:luÇ’ # ã’© 0x34ab:jì # ã’« 0x34b0:quán # ã’° 0x34b2:cái # ã’² 0x34b3:liÇŽng # ã’³ 0x34b4:gÇ” # ã’´ 0x34b5:mào # ã’µ 0x34b7:guÇŽ,xìng,xÇ” # ã’· 0x34b8:suì,xuán # ã’¸ 0x34bb:mào # ã’» 0x34bc:mán # ã’¼ 0x34be:shì # ã’¾ 0x34bf:lí # ã’¿ 0x34c1:wÇŽng # ã“� 0x34c2:kòu # ã“‚ 0x34c3:chuí,dù,zhà # 㓃 0x34c4:zhèn # ã“„ 0x34c8:bèi,bìng,fèi,yè # 㓈 0x34c9:huàn,huó,huò # 㓉 0x34ca:dòng # 㓊 0x34cb:gòng # ã“‹ 0x34ce:qÄ«n,qÇ�n,qìn # 㓎 0x34cf:jiÇ’ng # ã“� 0x34d0:lù # ã“� 0x34d1:xìng # ã“‘ 0x34d3:nán # ã““ 0x34d4:xiè # ã“” 0x34d6:bì,bié # ã“– 0x34d7:jié,qÇ� # ã“— 0x34d8:sù # 㓘 0x34dc:yòu # 㓜 0x34dd:xíng # ã“� 0x34de:qì,qià,yáo # 㓞 0x34e0:diàn # ã“  0x34e1:fÇ”,fÇ’u # ã“¡ 0x34e2:luò # ã“¢ 0x34e3:qià # ã“£ 0x34e4:jié,qià # 㓤 0x34e7:yÇŽn # ã“§ 0x34e8:cí,cì # 㓨 0x34ea:lÇŽng # 㓪 0x34ed:hé # ã“­ 0x34ef:lí # 㓯 0x34f0:huà # ã“° 0x34f1:tóu # 㓱 0x34f2:piàn # 㓲 0x34f4:jùn,ruÇŽn # ã“´ 0x34f5:è # 㓵 0x34f6:qiè # ã“¶ 0x34f7:yì # ã“· 0x34f8:jué,zhuó # 㓸 0x34f9:ruì # 㓹 0x34fa:jiàn # 㓺 0x34fc:chì,chòng # 㓼 0x34fd:chóng # 㓽 0x34fe:chí # 㓾 0x3500:lüè,qíng # 㔀 0x3502:lín # 㔂 0x3503:jué,pì # 㔃 0x3504:sù # 㔄 0x3505:xiào # ã”… 0x3506:zàn # 㔆 0x3509:zhú # 㔉 0x350a:dÇŽn # 㔊 0x350b:jiàn,lán,làn # 㔋 0x350c:zhòu # 㔌 0x350d:duÇ’,zhá # ã”� 0x350e:xiè,yì # 㔎 0x350f:lì # ã”� 0x3511:chì,dào,qì,shuì # 㔑 0x3512:xí # ã”’ 0x3513:jiÇŽn,xiàn # 㔓 0x3515:jí,yì # 㔕 0x3517:fèi # ã”— 0x3518:chù # 㔘 0x3519:bÇŽng,péng # ã”™ 0x351a:kÇ’u # 㔚 0x351c:bá,bó # 㔜 0x351d:liÇŽng # ã”� 0x351e:kuài,kuàng,wàng # 㔞 0x3520:hé,jiá # ã”  0x3522:jué # 㔢 0x3523:léi,lèi # 㔣 0x3524:shÄ›n # 㔤 0x3525:pí # 㔥 0x3526:yÇŽng # 㔦 0x3527:xuè # ã”§ 0x3528:bèi # 㔨 0x3529:è # 㔩 0x352a:lÇ” # 㔪 0x352d:chè,chí,yí # ã”­ 0x352e:nuó # ã”® 0x352f:suÇŽn,xuán # 㔯 0x3530:héng # ã”° 0x3531:yÇ” # ã”± 0x3533:guÇ�,gùn,huán,jué # 㔳 0x3534:yì # ã”´ 0x3535:xiàn,xuÇŽn # 㔵 0x3536:gòng # ã”¶ 0x3537:lòu # ã”· 0x3539:lè # 㔹 0x353a:shì # 㔺 0x353c:sÇ”n # 㔼 0x353d:yào,yÇ’u # 㔽 0x353e:jié # 㔾 0x353f:zòu # 㔿 0x3541:què # ã•� 0x3542:yín # ã•‚ 0x3544:zhì # ã•„ 0x3545:jiÇŽ # ã•… 0x3546:hù # 㕆 0x3547:lá,lÄ� # 㕇 0x3548:hòu,yÇ� # 㕈 0x3549:kè # 㕉 0x354b:jìng,qín # ã•‹ 0x354c:ài # 㕌 0x354e:è,kè,kÇ”n # 㕎 0x354f:chú # ã•� 0x3550:xiÄ› # ã•� 0x3551:chú # ã•‘ 0x3552:wéi,wÄ›i,wÄ“i # ã•’ 0x3555:huàn # ã•• 0x3556:sù # ã•– 0x3557:yòu # ã•— 0x3559:jùn,ruì # ã•™ 0x355a:zhÇŽo # 㕚 0x355b:xù,yÇ’u,yòu # ã•› 0x355c:shÇ� # 㕜 0x355f:kuì # 㕟 0x3561:hé,hè,huò # ã•¡ 0x3562:gài,hài,jù,lÇ”n,nÇ’u # ã•¢ 0x3563:yÇŽn,yàn # ã•£ 0x3564:qiú # 㕤 0x3565:yÇ� # ã•¥ 0x3566:huà # 㕦 0x3568:fàn # 㕨 0x3569:zhàng # ã•© 0x356a:dÇŽn # 㕪 0x356b:fÇŽng # ã•« 0x356c:sòng # 㕬 0x356d:ào,bì # ã•­ 0x356e:fÇ”,tiào # ã•® 0x356f:nè # 㕯 0x3570:hè # ã•° 0x3571:yóu # 㕱 0x3572:huá,yíng # 㕲 0x3574:chén # ã•´ 0x3575:guó,hún,luÇ’ # 㕵 0x3576:ň,ňg # ã•¶ 0x3577:huà # ã•· 0x3578:lì # 㕸 0x3579:fá # 㕹 0x357a:háo # 㕺 0x357b:tòu # ã•» 0x357d:sì # 㕽 0x3580:lè,luò # ã–€ 0x3581:lìn # ã–� 0x3582:yì # ã–‚ 0x3583:hÇ’u,hòu # ã–ƒ 0x3585:xù # ã–… 0x3586:qú,qÇ” # ã–† 0x3587:ér # ã–‡ 0x358f:nèi # ã–� 0x3590:wÄ›i # ã–� 0x3591:xiè # ã–‘ 0x3592:tí # ã–’ 0x3593:hóng # ã–“ 0x3594:tÇ”n # ã–” 0x3595:bò,niè # ã–• 0x3596:niè # ã–– 0x3597:yín # ã–— 0x359e:wÄ�i # ã–ž 0x359f:shòu # ã–Ÿ 0x35a0:bà,nuò # ã–  0x35a1:yè # ã–¡ 0x35a2:jí,qí # ã–¢ 0x35a3:tòu # ã–£ 0x35a4:hán # ã–¤ 0x35a5:jiÇ’ng # ã–¥ 0x35a6:dÇ’ng # ã–¦ 0x35a7:wÄ›n # ã–§ 0x35a8:lù # ã–¨ 0x35a9:sÇ’u # ã–© 0x35aa:guó # ã–ª 0x35ab:líng # ã–« 0x35ad:tiÇŽn # ã–­ 0x35ae:lún # ã–® 0x35b6:yè # ã–¶ 0x35b7:shí,tí # ã–· 0x35b8:xué # ã–¸ 0x35b9:fèn # ã–¹ 0x35ba:chÇ”n # ã–º 0x35bb:róu # ã–» 0x35bc:duÇ’,lín,móu # ã–¼ 0x35bd:zé,zéi # ã–½ 0x35be:è # ã–¾ 0x35bf:xié # ã–¿ 0x35c1:è # ã—� 0x35c2:shÄ›ng # ã—‚ 0x35c3:wÄ›n,yìn # ã—ƒ 0x35c4:mán,màn # ã—„ 0x35c5:hú # ã—… 0x35c6:gé,kài # ã—† 0x35c7:xiá,ya # ã—‡ 0x35c8:màn # ã—ˆ 0x35c9:bì,è,lüè # ã—‰ 0x35ca:jí,qì,bÄ«,léi # ã—Š 0x35cb:hóu # ã—‹ 0x35cc:zhì # ã—Œ 0x35d1:bài # ã—‘ 0x35d2:ài # ã—’ 0x35d5:gòu # ã—• 0x35d6:dàn # ã—– 0x35d7:bÇŽi # ã—— 0x35d8:bó,fù # ã—˜ 0x35d9:nà,chú,zhÅ�u # ã—™ 0x35da:lì # ã—š 0x35db:xiào # ã—› 0x35dc:xiù # ã—œ 0x35e2:dòng,hóng # ã—¢ 0x35e3:tì # ã—£ 0x35e4:cù # ã—¤ 0x35e5:kuò # ã—¥ 0x35e6:láo # ã—¦ 0x35e7:zhì # ã—§ 0x35e8:ÇŽi # ã—¨ 0x35e9:xÄ« # ã—© 0x35eb:qiè # ã—« 0x35f0:chù,cóng # ã—° 0x35f1:jí # ã—± 0x35f2:huò,xì # ã—² 0x35f3:tÇŽ # ã—³ 0x35f4:yán # ã—´ 0x35f5:xù # ã—µ 0x35f7:sÇŽi # ã—· 0x35fc:yè # ã—¼ 0x35fd:xiÇŽng # ã—½ 0x35ff:hé,xià,xiÄ� # ã—¿ 0x3600:zuò # 㘀 0x3601:yì # ã˜� 0x3602:cí # 㘂 0x3605:xián # 㘅 0x3606:tái # 㘆 0x3607:róng # 㘇 0x3608:yÄ«,yì # 㘈 0x3609:zhì # 㘉 0x360a:yì # 㘊 0x360b:xián # 㘋 0x360c:jù # 㘌 0x360d:jí,qì # ã˜� 0x360e:hÇŽn,hàn # 㘎 0x3610:pào,pÄ›ng # ã˜� 0x3611:lì # 㘑 0x3613:lán # 㘓 0x3614:cÇŽn,sÇŽi # 㘔 0x3615:hÇŽn,lán # 㘕 0x3616:yán # 㘖 0x3619:yán,yÇŽn # 㘙 0x361a:hÇŽn # 㘚 0x361c:chÇ�,chóu,chù # 㘜 0x361d:niÇŽn,niè,nà,lÇŽn # ã˜� 0x361e:huò # 㘞 0x3620:bì,mì # 㘠 0x3621:xiá # 㘡 0x3622:wÄ›ng # 㘢 0x3623:xuán,yuán # 㘣 0x3625:yóu # 㘥 0x3626:qín # 㘦 0x3627:xù # 㘧 0x3628:nèi # 㘨 0x3629:bì # 㘩 0x362a:hào # 㘪 0x362b:jÇ�ng # 㘫 0x362c:ào # 㘬 0x362d:ào # 㘭 0x3632:jú # 㘲 0x3634:zuò # 㘴 0x3635:bù # 㘵 0x3636:jié # 㘶 0x3637:ài # 㘷 0x3638:zàng # 㘸 0x3639:cí # 㘹 0x363a:fá # 㘺 0x363f:niè # 㘿 0x3640:liù # 㙀 0x3641:mÇŽng,méi,mèi,mù,nà # ã™� 0x3642:duì # 㙂 0x3644:bì # 㙄 0x3645:bÇŽo # ã™… 0x3647:chù # 㙇 0x3648:hán,xià # 㙈 0x3649:tiÇŽn # 㙉 0x364a:cháng,zhàng # 㙊 0x364f:fù # ã™� 0x3650:duÇ’ # ã™� 0x3651:yÇ” # 㙑 0x3652:yÄ› # ã™’ 0x3653:kuí # 㙓 0x3654:hán # ã™” 0x3655:kuài # 㙕 0x3657:kuài # ã™— 0x3659:lÇ’ng # ã™™ 0x365b:bÇ” # ã™› 0x365c:chí,tái # 㙜 0x365d:xié # ã™� 0x365e:niè # 㙞 0x365f:lÇŽng # 㙟 0x3660:yì,yÄ« # ã™  0x3662:mán,mén # 㙢 0x3663:zhàng # 㙣 0x3664:xià # 㙤 0x3665:gÇ”n # 㙥 0x3668:jì,qí # 㙨 0x3669:liáo # 㙩 0x366a:yè,yì # 㙪 0x366b:jí # 㙫 0x366c:yín # 㙬 0x366e:dÄ�,da # ã™® 0x366f:yì # 㙯 0x3670:xiè # ã™° 0x3671:hào # ã™± 0x3672:yÇ’ng # 㙲 0x3673:hÇŽn,hé,kÇŽn # 㙳 0x3674:chàn,zhàn # ã™´ 0x3675:tái # 㙵 0x3676:táng # ã™¶ 0x3677:zhí # ã™· 0x3678:bào,bó,pú # 㙸 0x3679:méng # 㙹 0x367a:guì,kuí # 㙺 0x367b:chán,qiè,zàn # ã™» 0x367c:lÄ›i # 㙼 0x367e:xì,xué # 㙾 0x3681:qiáo,qiào,qù # ãš� 0x3682:ráng # ãš‚ 0x3683:yún,yùn,yÅ«n # 㚃 0x3685:lóng # ãš… 0x3686:fù # 㚆 0x3689:gÇ” # 㚉 0x368c:huà,huÇ’ # 㚌 0x368d:guó,kuÇ�,kuì # ãš� 0x368f:gÇŽo # ãš� 0x3690:tào # ãš� 0x3692:shÇŽn # ãš’ 0x3693:lái,lÇŽi # ãš“ 0x3694:niè # ãš” 0x3695:fú,bì # ãš• 0x3696:gÇŽo # ãš– 0x3697:qié,xié # ãš— 0x3698:bàn # 㚘 0x369b:xì # ãš› 0x369c:xù,yù # ãšœ 0x369d:kuí # ãš� 0x369e:mÄ›ng,shÄ›n,yìng,yùn # ãšž 0x369f:chuò # 㚟 0x36a1:jÇ� # ãš¡ 0x36a2:nú # 㚢 0x36a3:jiÄ�o,xiáo # 㚣 0x36a4:yì # 㚤 0x36a5:yú # 㚥 0x36a6:yí # 㚦 0x36a7:yÇŽn # ãš§ 0x36a9:rÇŽn # ãš© 0x36aa:hào # 㚪 0x36ab:shà,zhà # ãš« 0x36ad:yóu # ãš­ 0x36af:xín,xún # 㚯 0x36b0:bÇ� # ãš° 0x36b2:diÇŽn,shàn,chÄ�n # ãš² 0x36b4:bù # ãš´ 0x36b6:sì # ãš¶ 0x36b7:Ä›r,nÇŽi # ãš· 0x36b9:mÇŽo # ãš¹ 0x36ba:yùn # 㚺 0x36bd:qiÇŽo # ãš½ 0x36bf:páo # ãš¿ 0x36c2:nuÇ’ # 㛂 0x36c3:jié # 㛃 0x36c5:èr # ã›… 0x36c6:duÇ’,duò # 㛆 0x36ca:duÇ’ # 㛊 0x36cd:qiè # ã›� 0x36cf:òu,qiú # ã›� 0x36d0:sÇŽo # ã›� 0x36d1:càn # 㛑 0x36d2:dòu # ã›’ 0x36d4:péng # ã›” 0x36d5:yì # 㛕 0x36d7:zuò,qiÄ“ # ã›— 0x36d8:pò # 㛘 0x36d9:qiè,qín,shÄ›n,shèn # ã›™ 0x36da:tÇ’ng # 㛚 0x36db:xìn,zhèn # ã›› 0x36dc:yóu # 㛜 0x36dd:bèi,bèng # ã›� 0x36de:lòng # 㛞 0x36e5:tà # 㛥 0x36e6:lÇŽn # 㛦 0x36e7:mÇŽn # ã›§ 0x36e8:qiÇŽng # 㛨 0x36e9:zhóu # 㛩 0x36ea:yàn,yuán # 㛪 0x36ec:lù # 㛬 0x36ee:sÇŽo # ã›® 0x36ef:miÇŽn # 㛯 0x36f1:ruì,wÄ›i # ã›± 0x36f2:fà # 㛲 0x36f3:chà,yì # 㛳 0x36f4:nÇŽo # ã›´ 0x36f6:chóu,tán,tàn # ã›¶ 0x36f8:shù # 㛸 0x36f9:pián # 㛹 0x36fb:kuÇ� # ã›» 0x36fc:shà,chÄ� # 㛼 0x36fe:xián # 㛾 0x36ff:zhì # 㛿 0x3703:liàn,liáo,máng # 㜃 0x3704:xún # 㜄 0x3705:xù # 㜅 0x3706:mì # 㜆 0x3707:huì,yè # 㜇 0x3708:mù # 㜈 0x370a:pàng,zhÇŽn # 㜊 0x370b:yì # 㜋 0x370c:gòu # 㜌 0x370d:táng # ãœ� 0x370e:xÄ«,xì # 㜎 0x370f:yún # ãœ� 0x3710:shù # ãœ� 0x3711:fú,pó # 㜑 0x3712:yì # 㜒 0x3713:dá # 㜓 0x3715:lián # 㜕 0x3716:cáo # 㜖 0x3717:cÇŽn,chú,xuàn # 㜗 0x3718:jù # 㜘 0x3719:lù # 㜙 0x371a:sù # 㜚 0x371b:nèn,ruÇŽn # 㜛 0x371c:ào # 㜜 0x371d:ÇŽn,àn # ãœ� 0x371e:qiàn # 㜞 0x3723:rán,niàn # 㜣 0x3724:shÄ›n,niÇŽn # 㜤 0x3725:mái,mó # 㜥 0x3726:hàn,niè,sì,xié,xín # 㜦 0x3727:yuè # 㜧 0x3728:ér,nái # 㜨 0x3729:ào # 㜩 0x372a:xiÇŽn # 㜪 0x372b:mà,méi,mÄ›i # 㜫 0x372e:làn # 㜮 0x3730:yuè # 㜰 0x3731:dòng,zhì # 㜱 0x3732:wÄ›ng,yíng # 㜲 0x3733:huái # 㜳 0x3734:mèng # 㜴 0x3735:niÇŽo # 㜵 0x3736:fàn # 㜶 0x3737:mí,nÇŽi,xiÇŽn # 㜷 0x3738:niè # 㜸 0x3739:qú # 㜹 0x373a:zàn # 㜺 0x373b:liàn # 㜻 0x373c:zhí,zhì # 㜼 0x373d:zÇ� # 㜽 0x373e:hái # 㜾 0x373f:xù # 㜿 0x3740:hào # ã�€ 0x3741:xún # ã�� 0x3742:zhì # ã�‚ 0x3743:fàn,miÇŽn,wÇŽn # ã�ƒ 0x3744:chún,qì,rùn # ã�„ 0x3745:gòu # ã�… 0x3747:chún # ã�‡ 0x3748:luán # ã�ˆ 0x3749:zhù # ã�‰ 0x374a:shÇ’u # ã�Š 0x374b:liáo,liÇŽo,liú # ã�‹ 0x374c:jié,jiù,zhòu # ã�Œ 0x374d:xiÄ› # ã�� 0x374e:dìng # ã�Ž 0x374f:jiè # ã�� 0x3750:róng # ã�� 0x3751:máng,páng # ã�‘ 0x3753:gé,kè # ã�“ 0x3754:yào # ã�” 0x3755:níng # ã�• 0x3756:yí,yín # ã�– 0x3757:láng # ã�— 0x3758:yóng # ã�˜ 0x3759:yín # ã�™ 0x375b:sù # ã�› 0x375d:lín # ã�� 0x375e:yÄ� # ã�ž 0x375f:máo,mào,kuÄ�n # ã�Ÿ 0x3760:míng # ã�  0x3761:zuì # ã�¡ 0x3762:yÇ” # ã�¢ 0x3763:yè,yì # ã�£ 0x3764:gòu # ã�¤ 0x3765:mÇ� # ã�¥ 0x3766:jùn,yá # ã�¦ 0x3767:wÄ›n # ã�§ 0x376a:diàn,dÇ�ng # ã�ª 0x376b:lóng # ã�« 0x376d:xÇ�ng # ã�­ 0x376e:cuì # ã�® 0x376f:qiáo # ã�¯ 0x3770:mián # ã�° 0x3771:mèng # ã�± 0x3772:qÇ�n # ã�² 0x3774:wán # ã�´ 0x3775:dé # ã�µ 0x3776:ài,dé # ã�¶ 0x3778:biàn # ã�¸ 0x3779:nóu # ã�¹ 0x377a:lián,lín # ã�º 0x377b:jÇ�n # ã�» 0x377d:chuí,shuÇ�,zhuÇ� # ã�½ 0x377e:zuÇ’ # ã�¾ 0x377f:bó,bÇ’,fù,qiàn # ã�¿ 0x3781:yào # ãž� 0x3782:tuÇ� # ãž‚ 0x3783:jí # 㞃 0x3785:guÇ’ # ãž… 0x3786:jÇ� # 㞆 0x3787:wÄ›i # 㞇 0x378a:xù # 㞊 0x378b:niÇŽn # ãž‹ 0x378c:yùn # 㞌 0x378e:bÇŽ,fú,pá # 㞎 0x378f:zhé # ãž� 0x3790:jÅ« # ãž� 0x3791:wÄ›i # ãž‘ 0x3792:xì,xiè # ãž’ 0x3793:qÇ�,qì # ãž“ 0x3794:yí # ãž” 0x3795:xiè # ãž• 0x3796:cì # ãž– 0x3797:qiú # ãž— 0x3798:tún # 㞘 0x3799:niào # ãž™ 0x379a:qì,zhÇŽ # ãžš 0x379b:jÇ� # ãž› 0x379f:diàn # 㞟 0x37a0:láo,liáo # ãž  0x37a1:zhÇŽn # ãž¡ 0x37a4:yín # 㞤 0x37a5:cén # 㞥 0x37a6:jÇ� # 㞦 0x37a7:huì # ãž§ 0x37a8:zÇŽi,zÇ� # 㞨 0x37a9:lán # ãž© 0x37aa:náo # 㞪 0x37ab:jù,zÇ’u # ãž« 0x37ac:qìn # 㞬 0x37ad:dài # ãž­ 0x37af:jié # 㞯 0x37b0:xÇ” # ãž° 0x37b2:yòng # ãž² 0x37b3:dÇ’u # ãž³ 0x37b4:chí # ãž´ 0x37b6:mÇ�n # ãž¶ 0x37b7:huáng # ãž· 0x37b8:suì # 㞸 0x37b9:kÄ› # ãž¹ 0x37ba:zú # 㞺 0x37bb:hào # ãž» 0x37bc:chéng,shèng,zhé # ãž¼ 0x37bd:xuè # ãž½ 0x37be:ní,yì # ãž¾ 0x37bf:chì,qí # ãž¿ 0x37c0:lián # 㟀 0x37c1:àn # ãŸ� 0x37c2:chÇ�,mÇ” # 㟂 0x37c4:xiáng # 㟄 0x37c5:yáng # 㟅 0x37c6:huá # 㟆 0x37c7:cuó,cuÇ’ # 㟇 0x37c8:qiú # 㟈 0x37c9:láo # 㟉 0x37ca:fú # 㟊 0x37cb:duì # 㟋 0x37cc:máng # 㟌 0x37cd:láng # ãŸ� 0x37ce:tuÇ’ # 㟎 0x37cf:hán # ãŸ� 0x37d0:mÇŽng # ãŸ� 0x37d1:bó # 㟑 0x37d3:qí # 㟓 0x37d4:hán # 㟔 0x37d6:lòng # 㟖 0x37d8:tiáo # 㟘 0x37d9:lÇŽo,zé,zhái # 㟙 0x37da:qí # 㟚 0x37db:zàn # 㟛 0x37dc:mí # 㟜 0x37dd:péi,pÇ’u # ãŸ� 0x37de:zhàn # 㟞 0x37df:xiàng # 㟟 0x37e0:gÇŽng # 㟠 0x37e2:qí # 㟢 0x37e4:lù # 㟤 0x37e6:yùn # 㟦 0x37e7:è,niè,xùn # 㟧 0x37e8:quán # 㟨 0x37e9:mín,mÇ�n,wÄ›n # 㟩 0x37ea:wÄ›i # 㟪 0x37eb:quán # 㟫 0x37ec:shÇ”,sÇ’u # 㟬 0x37ed:mín # 㟭 0x37f0:mÇ�ng # 㟰 0x37f1:yÇŽo # 㟱 0x37f2:jué,yuán # 㟲 0x37f3:lì # 㟳 0x37f4:kuài,kuÇ�,wÄ›i # 㟴 0x37f5:gÇŽng # 㟵 0x37f6:yuán # 㟶 0x37f7:da # 㟷 0x37f9:láo # 㟹 0x37fa:lóu # 㟺 0x37fb:qiàn # 㟻 0x37fc:áo # 㟼 0x37fd:biÇŽo # 㟽 0x37ff:máng,mÇŽng # 㟿 0x3800:dÇŽo # ã € 0x3802:áo # ã ‚ 0x3804:xí # ã „ 0x3805:fú,fù # ã … 0x3807:jiù # ã ‡ 0x3808:rùn # ã ˆ 0x3809:tóng # ã ‰ 0x380a:qÅ« # ã Š 0x380b:è # ã ‹ 0x380d:jí,jié,qì # ã � 0x380e:qì # ã Ž 0x380f:huá # ã � 0x3810:jiào # ã � 0x3811:zuì # ã ‘ 0x3812:biÇŽo # ã ’ 0x3813:méng # ã “ 0x3814:bài # ã ” 0x3815:wÄ›i # ã • 0x3816:jì,yÇ� # ã – 0x3817:ào,wò # ã — 0x3818:yÇ” # ã ˜ 0x3819:háo # ã ™ 0x381a:duì,zhuó # ã š 0x381b:wò # ã › 0x381c:nì # ã œ 0x381d:cuán # ã � 0x381f:lí # ã Ÿ 0x3820:lú # ã   0x3821:niÇŽo # ã ¡ 0x3822:huái # ã ¢ 0x3823:lài,lì # ã £ 0x3825:lÇœ # ã ¥ 0x3827:mí,mÇ� # ã § 0x3828:yù # ã ¨ 0x382a:jù # ã ª 0x382d:zhÇŽn,zhàn # ã ­ 0x382f:yÇ� # ã ¯ 0x3831:jì,qÇ� # ã ± 0x3832:bÇ� # ã ² 0x3834:rèn # ã ´ 0x3836:fán # ã ¶ 0x3837:gé # ã · 0x3838:kù # ã ¸ 0x3839:jiè # ã ¹ 0x383a:miáo # ã º 0x383d:tóng # ã ½ 0x383f:cÇ� # ã ¿ 0x3840:bì # ã¡€ 0x3841:kÇŽi,kuà # ã¡� 0x3842:lì # ã¡‚ 0x3844:sÇ”n,xún # ã¡„ 0x3845:nuÇ’ # ã¡… 0x3847:jí,zhé # 㡇 0x3848:mén,wèn # 㡈 0x3849:xián,yán # 㡉 0x384a:qià,qiÇŽn # 㡊 0x384b:è,yé # ã¡‹ 0x384c:mào,mèi # 㡌 0x384f:tóu,shÅ« # ã¡� 0x3851:qiÇŽo # ã¡‘ 0x3854:wù,mù # ã¡” 0x3856:chuáng # ã¡– 0x3857:tí # ã¡— 0x3858:lián # 㡘 0x3859:bÄ«,pí # ã¡™ 0x385b:máng # ã¡› 0x385c:xuÄ› # 㡜 0x385d:fèng,fú # ã¡� 0x385e:lÄ›i,lóu # 㡞 0x3860:zhèng # ã¡  0x3861:chú # ã¡¡ 0x3862:màn # ã¡¢ 0x3863:lóng # ã¡£ 0x3865:yÇ�n # ã¡¥ 0x3867:zhèng # ã¡§ 0x3868:qiÄ�n,jiÄ�n # 㡨 0x3869:luán # ã¡© 0x386a:nié # 㡪 0x386b:yì # ã¡« 0x386d:jì # ã¡­ 0x386e:jí # ã¡® 0x386f:zhái,dù # 㡯 0x3870:yÇ” # ã¡° 0x3871:jiÇ” # 㡱 0x3872:huán # 㡲 0x3873:dÇ�,zhé,zhÇ� # 㡳 0x3875:líng # 㡵 0x3876:zhÇ� # ã¡¶ 0x3877:bÄ›n # ã¡· 0x3878:zhÇŽ,zhà # 㡸 0x3879:cì,jÅ« # 㡹 0x387a:dàn # 㡺 0x387b:liào # ã¡» 0x387c:yì # 㡼 0x387d:zhào # 㡽 0x387e:xiàn # 㡾 0x387f:chì # ã¡¿ 0x3880:cì,zì # 㢀 0x3881:chÇ� # ã¢� 0x3882:yÇŽn # 㢂 0x3883:láng # 㢃 0x3884:dòu # 㢄 0x3885:lòng # 㢅 0x3886:chán # 㢆 0x3888:tuí # 㢈 0x3889:chá # 㢉 0x388a:ÇŽi # 㢊 0x388b:chÇ� # 㢋 0x388d:yíng,yÇ�ng # ã¢� 0x388e:chà,zé,zhái,zhé # 㢎 0x388f:tóu # ã¢� 0x3891:tuí # 㢑 0x3892:chá # 㢒 0x3893:yÇŽo,zhàng # 㢓 0x3894:zÇ’ng # 㢔 0x3897:qiào # 㢗 0x3898:lián # 㢘 0x3899:qín # 㢙 0x389a:lÇ” # 㢚 0x389b:yàn # 㢛 0x389e:yì # 㢞 0x389f:chÇŽn,chÄ�n # 㢟 0x38a0:jiÇ’ng,jùn # 㢠 0x38a1:jiÇŽng # 㢡 0x38a3:jìng,qíng # 㢣 0x38a5:dòng # 㢥 0x38a7:juàn # 㢧 0x38a8:hàn # 㢨 0x38a9:dì # 㢩 0x38ac:hóng # 㢬 0x38ae:chí # 㢮 0x38af:mín # 㢯 0x38b0:bì,huán # 㢰 0x38b2:xùn # 㢲 0x38b3:lú # 㢳 0x38b5:shè,xié # 㢵 0x38b6:bì # 㢶 0x38b8:bì # 㢸 0x38ba:xián # 㢺 0x38bb:wÄ›i # 㢻 0x38bc:biè # 㢼 0x38bd:Ä›r # 㢽 0x38be:juàn # 㢾 0x38c0:zhèn # 㣀 0x38c1:bèi # ã£� 0x38c2:yì # 㣂 0x38c3:yÇ”,yù # 㣃 0x38c4:qú # 㣄 0x38c5:zàn # 㣅 0x38c6:mí,mí,pèi # 㣆 0x38c7:nÇ�,yì # 㣇 0x38c8:sì # 㣈 0x38cc:shàn # 㣌 0x38cd:tái # ã£� 0x38ce:mù # 㣎 0x38cf:jìng # ã£� 0x38d0:biàn # ã£� 0x38d1:róng # 㣑 0x38d2:cèng # 㣒 0x38d3:càn # 㣓 0x38d9:dí # 㣙 0x38da:tóng,tÇ’ng # 㣚 0x38db:tà # 㣛 0x38dc:xíng # 㣜 0x38de:duó,duò # 㣞 0x38df:xì # 㣟 0x38e0:tóng # 㣠 0x38e2:tí # 㣢 0x38e3:shÇŽn,shàn # 㣣 0x38e4:jiàn # 㣤 0x38e5:zhì # 㣥 0x38e7:yìn,yÇ’ng # 㣧 0x38ea:huÇŽn,kuò # 㣪 0x38eb:zhÇ’ng # 㣫 0x38ec:qì # 㣬 0x38ef:xiè # 㣯 0x38f0:xiè # 㣰 0x38f1:zé,zuò # 㣱 0x38f2:wéi # 㣲 0x38f5:tà # 㣵 0x38f6:zhÄ�n # 㣶 0x38f7:nìng # 㣷 0x38fb:yì # 㣻 0x38fc:rÄ›n # 㣼 0x38fd:shù # 㣽 0x38fe:chà # 㣾 0x38ff:zhuó # 㣿 0x3901:miÇŽn,tiÇŽn # ã¤� 0x3902:jí # 㤂 0x3903:fáng # 㤃 0x3904:pèi # 㤄 0x3905:ài # 㤅 0x3906:fàn # 㤆 0x3907:ÇŽo,fó,wù # 㤇 0x3908:qìn # 㤈 0x3909:qiÄ�,yá # 㤉 0x390a:xiào,yáo # 㤊 0x390d:qiÇŽo # ã¤� 0x390f:tóng # ã¤� 0x3911:yÅ�u # 㤑 0x3913:bèn # 㤓 0x3914:fú,fù # 㤔 0x3915:chù # 㤕 0x3916:zhù # 㤖 0x3918:chù,cù,zhòu # 㤘 0x391a:háng # 㤚 0x391b:nín,rèn # 㤛 0x391c:jué,yù # 㤜 0x391e:chà # 㤞 0x391f:kÇ’ng,tòu # 㤟 0x3920:liè # 㤠 0x3921:lì # 㤡 0x3922:xù,yù # 㤢 0x3924:yú,yÇ” # 㤤 0x3925:hài # 㤥 0x3926:lì # 㤦 0x3927:hóu,hòu # 㤧 0x3928:gÇ’ng,qióng # 㤨 0x3929:kè # 㤩 0x392a:yuàn # 㤪 0x392b:dé # 㤫 0x392c:huì,kuì # 㤬 0x392e:kuáng,guàng # 㤮 0x392f:jiÇ’ng,jùn # 㤯 0x3930:zÇŽn,zuò # 㤰 0x3931:fù # 㤱 0x3932:qiè,qù # 㤲 0x3933:bÄ›i # 㤳 0x3934:xí # 㤴 0x3935:cí # 㤵 0x3936:páng # 㤶 0x3938:xì # 㤸 0x3939:qiú # 㤹 0x393a:huÇŽng # 㤺 0x393d:chóu # 㤽 0x393e:sàn # 㤾 0x3940:dé # 㥀 0x3941:dé,zhí,zhòu # ã¥� 0x3942:tè # 㥂 0x3943:mèn # 㥃 0x3944:líng # 㥄 0x3945:shòu # 㥅 0x3946:diàn,tuì # 㥆 0x3947:cán,càn # 㥇 0x3948:dié # 㥈 0x3949:chè,chì # 㥉 0x394a:péng # 㥊 0x394c:jú # 㥌 0x394d:jì # ã¥� 0x394e:lái,lí # 㥎 0x394f:tiÇŽn # ã¥� 0x3950:yuàn # ã¥� 0x3952:cÇŽi # 㥒 0x3953:qÇ� # 㥓 0x3954:yú,yù # 㥔 0x3955:lián # 㥕 0x395a:yú # 㥚 0x395b:jí,kè,sù # 㥛 0x395c:wèi # 㥜 0x395d:mÇ�,miÇŽn # ã¥� 0x395e:cuì,qiàn,suì # 㥞 0x395f:xié # 㥟 0x3960:xÇ” # 㥠 0x3961:xì # 㥡 0x3962:qiú # 㥢 0x3963:huì # 㥣 0x3965:yú # 㥥 0x3966:qiè,xiá,xiÇŽn # 㥦 0x3967:shùn # 㥧 0x3968:chuí,shuì,wÄ›i # 㥨 0x3969:duÇ’ # 㥩 0x396a:lóu # 㥪 0x396c:páng # 㥬 0x396d:tài # 㥭 0x396e:zhòu # 㥮 0x396f:yÇ�n # 㥯 0x3971:fÄ›i # 㥱 0x3972:shèn,yín # 㥲 0x3973:yuán # 㥳 0x3974:yí,yÇ� # 㥴 0x3975:hùn # 㥵 0x3976:sè # 㥶 0x3977:yè,yì # 㥷 0x3978:mÇ�n # 㥸 0x3979:fÄ›n # 㥹 0x397a:hé,hè # 㥺 0x397c:yÇ�n # 㥼 0x397d:cè,zé # 㥽 0x397e:nì # 㥾 0x397f:ào # 㥿 0x3980:féng # 㦀 0x3981:lián # ã¦� 0x3982:cháng,tàng # 㦂 0x3983:chÇŽn # 㦃 0x3984:má,mì # 㦄 0x3985:diÄ“,dì # 㦅 0x3987:lù # 㦇 0x3989:yì # 㦉 0x398a:huá # 㦊 0x398c:tuì,xù,hÅ« # 㦌 0x398d:è # ã¦� 0x398e:huà # 㦎 0x398f:sÇ”n,xuàn # ã¦� 0x3990:nì # ã¦� 0x3991:liÇŽn,xiàn # 㦑 0x3992:lí # 㦒 0x3993:xiàn # 㦓 0x3994:yàn # 㦔 0x3995:lóng # 㦕 0x3996:mèn # 㦖 0x3997:jiàn,jìn # 㦗 0x399a:biÇŽn # 㦚 0x399b:yú,yÇ” # 㦛 0x399c:huò,xuè # 㦜 0x399d:miÇŽo # ã¦� 0x399e:chóu # 㦞 0x399f:hài,mái # 㦟 0x39a1:lè # 㦡 0x39a2:jié,qì # 㦢 0x39a3:wèi # 㦣 0x39a4:yì # 㦤 0x39a5:huán,xiÇŽn # 㦥 0x39a6:hè # 㦦 0x39a7:cÇŽn # 㦧 0x39a8:lán,làn # 㦨 0x39a9:yÇ�n # 㦩 0x39aa:xiè # 㦪 0x39ac:luÇ’ # 㦬 0x39ad:líng # 㦭 0x39ae:qián # 㦮 0x39af:huò # 㦯 0x39b1:wÇ’ # 㦱 0x39b4:gé,qià # 㦴 0x39b6:dié # 㦶 0x39b7:yÇ’ng # 㦷 0x39b8:jÇ� # 㦸 0x39b9:àng,yáng,yÇ�ng # 㦹 0x39ba:rÇ”,rù # 㦺 0x39bb:xí,zhé # 㦻 0x39bc:shuàng # 㦼 0x39bd:xù,yù # 㦽 0x39be:yí # 㦾 0x39bf:hù # 㦿 0x39c0:jí # ã§€ 0x39c1:qù # ã§� 0x39c2:tián # ã§‚ 0x39c4:qiÇŽn,qiú # ã§„ 0x39c5:mù,dÄ�o # ã§… 0x39c7:mÇŽo # 㧇 0x39c8:yÇ�n,yìn # 㧈 0x39c9:gài,kuì # 㧉 0x39ca:bá,pÅ� # ã§Š 0x39cb:xiÇŽn,xuÇŽn # ã§‹ 0x39cc:mào # ã§Œ 0x39cd:fÇŽng # ã§� 0x39ce:yá,yà,qiÄ� # ã§Ž 0x39d0:sÇ’ng # ã§� 0x39d1:wéi,wÄ›i # ã§‘ 0x39d2:xué,yù,yuè # ã§’ 0x39d4:guài # ã§” 0x39d5:jiù,liÇ”,yú # ã§• 0x39d6:è # ã§– 0x39d7:zÇ�,jÇ�,zhÇ� # ã§— 0x39d8:cuì,nÇŽo,zì # 㧘 0x39d9:bì # ã§™ 0x39da:wÇŽ # ã§š 0x39dc:liè # ã§œ 0x39df:kuÇŽi # ã§Ÿ 0x39e1:hài # ã§¡ 0x39e3:zhù # ã§£ 0x39e4:chòng # 㧤 0x39e5:xiÇŽn # ã§¥ 0x39e6:xuàn # 㧦 0x39e8:qiú # 㧨 0x39e9:pèi # ã§© 0x39ea:guÇ� # 㧪 0x39eb:ér # ã§« 0x39ec:gÇ’ng # 㧬 0x39ed:qióng # ã§­ 0x39ef:lÇŽo # 㧯 0x39f0:lì # ã§° 0x39f1:chèn,ná,nì,nì,tiàn # ã§± 0x39f2:sÇŽn # ã§² 0x39f3:bÇŽi,bó,zhuò # ã§³ 0x39f4:wÇ’ # ã§´ 0x39f5:póu,pÇ’u # ã§µ 0x39f7:duò,tùn # ã§· 0x39f9:tè # ã§¹ 0x39fa:tà # 㧺 0x39fb:zhÇ�,zhuó,zú # ã§» 0x39fc:biào # ã§¼ 0x39fd:gù,hú # ã§½ 0x3a00:bÇ�ng # 㨀 0x3a01:zhí,zhì # ã¨� 0x3a02:dÇ’ng # 㨂 0x3a03:chéng,duÇ� # 㨃 0x3a04:zhào # 㨄 0x3a05:nèi,ruì # 㨅 0x3a06:lÇ�n # 㨆 0x3a07:pó # 㨇 0x3a08:jÇ� # 㨈 0x3a09:mÇ�n # 㨉 0x3a0a:wÄ›i # 㨊 0x3a0b:chÄ›,lè,zhèn # 㨋 0x3a0c:gòu,rú,rÇ” # 㨌 0x3a0e:rú,ruán # 㨎 0x3a10:bÇ”,péi # ã¨� 0x3a12:kuí,wÄ›i,xié # 㨒 0x3a13:láo,liáo # 㨓 0x3a14:hàn # 㨔 0x3a15:yíng # 㨕 0x3a16:zhì # 㨖 0x3a17:jié # 㨗 0x3a18:xÇ�ng # 㨘 0x3a19:xié # 㨙 0x3a1a:xún # 㨚 0x3a1b:shÇŽn # 㨛 0x3a1c:qián # 㨜 0x3a1d:xiè # ã¨� 0x3a1e:sù # 㨞 0x3a1f:hái # 㨟 0x3a20:mì # 㨠 0x3a21:hún # 㨡 0x3a24:huì,kuÇŽi,wài # 㨤 0x3a25:nà # 㨥 0x3a26:sÇ’ng # 㨦 0x3a27:bèn # 㨧 0x3a28:liù # 㨨 0x3a29:jié # 㨩 0x3a2a:huàng # 㨪 0x3a2b:lÇŽn # 㨫 0x3a2d:hù # 㨭 0x3a2e:dÅ�u # 㨮 0x3a2f:huò,kuò # 㨯 0x3a30:gé,gÇ”n,hùn,huò,jié # 㨰 0x3a31:yáo # 㨱 0x3a32:cè # 㨲 0x3a33:guÇ� # 㨳 0x3a34:jiàn # 㨴 0x3a35:jiÇŽn # 㨵 0x3a36:chóu,dÇŽo,zhÇ’u,zhòu # 㨶 0x3a37:jìn # 㨷 0x3a38:mà # 㨸 0x3a39:huì # 㨹 0x3a3a:mén,mì,miÇŽn # 㨺 0x3a3b:cán,shÇŽn,zàn # 㨻 0x3a3c:lüè # 㨼 0x3a3d:pÇ�,pì,qiÇŽo # 㨽 0x3a3e:yàng # 㨾 0x3a3f:jù # 㨿 0x3a40:jù # ã©€ 0x3a41:què # ã©� 0x3a44:shÄ�i # ã©„ 0x3a46:jiù # 㩆 0x3a47:huà,huò # 㩇 0x3a48:xiàn,yÇ”n # 㩈 0x3a49:xié # 㩉 0x3a4b:sù,xiÄ�o # ã©‹ 0x3a4c:fèi # 㩌 0x3a4d:cè # ã©� 0x3a4e:yè # 㩎 0x3a52:qín # ã©’ 0x3a53:huÇ� # ã©“ 0x3a54:tún # ã©” 0x3a56:qiáng,tiáo # ã©– 0x3a57:xí,xié # ã©— 0x3a58:yÇ� # 㩘 0x3a5a:méng # 㩚 0x3a5b:tuán # ã©› 0x3a5c:lÇŽn # 㩜 0x3a5d:háo # ã©� 0x3a5e:cì # 㩞 0x3a5f:zhài # 㩟 0x3a60:piÇŽo # ã©  0x3a61:luÇ’ # ã©¡ 0x3a62:mí,miè # ã©¢ 0x3a66:xié # 㩦 0x3a67:bó # ã©§ 0x3a68:huì # 㩨 0x3a69:qÇ�,qÇ�ng # ã©© 0x3a6a:xié,xìn,yé # 㩪 0x3a6d:bó,jiÇŽo,xiào # ã©­ 0x3a6e:qián,xián # ã©® 0x3a6f:bÇŽn,pán,pó # 㩯 0x3a70:jiÇŽo,qiáo,xiÇ” # ã©° 0x3a71:jué # 㩱 0x3a72:kÇ”n,quán # 㩲 0x3a73:sÇ’ng # 㩳 0x3a74:jú # ã©´ 0x3a75:è # 㩵 0x3a76:niè,nÇ�ng # ã©¶ 0x3a78:dié # 㩸 0x3a79:dié,zhá # 㩹 0x3a7b:guÇ�,qÄ« # ã©» 0x3a7d:qí # 㩽 0x3a7e:chuí # 㩾 0x3a80:yú # 㪀 0x3a81:qín # ãª� 0x3a83:hé # 㪃 0x3a84:fú # 㪄 0x3a86:dÇ� # 㪆 0x3a87:xiàn # 㪇 0x3a88:guì # 㪈 0x3a89:hé # 㪉 0x3a8a:qún # 㪊 0x3a8b:hàn # 㪋 0x3a8c:tÇ’ng,yú,yÇ” # 㪌 0x3a8d:bó # ãª� 0x3a8e:shÇŽn # 㪎 0x3a8f:bÇ� # ãª� 0x3a90:lù # ãª� 0x3a91:yè # 㪑 0x3a92:ní # 㪒 0x3a93:chuái # 㪓 0x3a94:sàn,tán # 㪔 0x3a95:diào # 㪕 0x3a96:lù # 㪖 0x3a97:tÇ’u # 㪗 0x3a98:liÇŽn # 㪘 0x3a99:kÄ›,kè,kuò # 㪙 0x3a9a:sàn # 㪚 0x3a9b:zhÄ›n # 㪛 0x3a9c:chuÇŽi # 㪜 0x3a9d:liàn # ãª� 0x3a9e:mào # 㪞 0x3aa0:qiàn # 㪠 0x3aa1:kÄ› # 㪡 0x3aa2:shÇŽo # 㪢 0x3aa3:qiào # 㪣 0x3aa4:bì # 㪤 0x3aa6:yìn # 㪦 0x3aa8:shàn # 㪨 0x3aa9:sù # 㪩 0x3aaa:sà,xÇ� # 㪪 0x3aab:ruì # 㪫 0x3aac:zhuó # 㪬 0x3aad:lú # 㪭 0x3aae:líng # 㪮 0x3aaf:chá,jÇ”,qú # 㪯 0x3ab1:huàn # 㪱 0x3ab4:jiá # 㪴 0x3ab5:bàn # 㪵 0x3ab6:hú # 㪶 0x3ab7:dÇ’u # 㪷 0x3ab9:lÇ’u # 㪹 0x3abb:juàn # 㪻 0x3abc:kÄ› # 㪼 0x3abd:suÇ’,suò # 㪽 0x3abe:gé,luò # 㪾 0x3abf:zhé,shé # 㪿 0x3ac0:dÇ�ng # ã«€ 0x3ac1:duàn # ã«� 0x3ac2:zhù # ã«‚ 0x3ac3:yÇŽn # 㫃 0x3ac4:páng # ã«„ 0x3ac5:chá,qí,shí # ã«… 0x3aca:yÇ� # 㫊 0x3acd:yóu # ã«� 0x3ace:gÇ”n,kuài # 㫎 0x3acf:yÇŽo # ã«� 0x3ad0:yÇŽo # ã«� 0x3ad1:shí,zhÇ� # ã«‘ 0x3ad2:gÇ’ng # ã«’ 0x3ad3:qÇ�,qì # ã«“ 0x3ad4:gèn # ã«” 0x3ad7:hòu # ã«— 0x3ad8:mì,miÇŽn # 㫘 0x3ad9:fú # ã«™ 0x3ada:hÅ« # 㫚 0x3adb:guàng,kuáng,kuàng,mÇ” # ã«› 0x3adc:dàn,tÇŽn # 㫜 0x3adf:yán # 㫟 0x3ae2:qù # ã«¢ 0x3ae4:chÇŽng,zhào # 㫤 0x3ae5:mÇ�ng # ã«¥ 0x3ae7:bào # ã«§ 0x3aeb:xiÇŽn # ã«« 0x3aef:mào # 㫯 0x3af0:lÇŽng # ã«° 0x3af1:nÇŽn # 㫱 0x3af2:pèi # 㫲 0x3af3:chén # 㫳 0x3af6:cÇ’u,zhÇ’u # ã«¶ 0x3af8:qiè # 㫸 0x3af9:dài,shù,yú # 㫹 0x3afb:kùn # ã«» 0x3afc:dié,zhé,zhì # 㫼 0x3afd:lù # 㫽 0x3b02:yú # 㬂 0x3b03:tái # 㬃 0x3b04:chàn # 㬄 0x3b05:màn # 㬅 0x3b06:mián,miàn,mÇ�n # 㬆 0x3b07:huàn # 㬇 0x3b09:nuÇŽn,ruò # 㬉 0x3b0a:huÇŽn # 㬊 0x3b0b:hóu # 㬋 0x3b0c:jìng # 㬌 0x3b0d:bó # ã¬� 0x3b0e:xiÇŽn # 㬎 0x3b0f:lì # ã¬� 0x3b10:jÇ�n,jìn,xíng,yÇ�ng # ã¬� 0x3b12:mÇŽng,mào # 㬒 0x3b13:piào # 㬓 0x3b14:háo # 㬔 0x3b15:yáng # 㬕 0x3b17:xiàn # 㬗 0x3b18:sù # 㬘 0x3b19:wÄ›i # 㬙 0x3b1a:chè # 㬚 0x3b1c:jìn # 㬜 0x3b1d:céng # ã¬� 0x3b1e:hè # 㬞 0x3b20:shài # 㬠 0x3b21:líng # 㬡 0x3b23:duì # 㬣 0x3b25:pù # 㬥 0x3b26:yuè # 㬦 0x3b27:bó # 㬧 0x3b29:huì # 㬩 0x3b2a:dié,zhì # 㬪 0x3b2b:yàn # 㬫 0x3b2c:jù # 㬬 0x3b2d:jiào,shÇŽn,yÇŽo # 㬭 0x3b2e:kuài,nàn # 㬮 0x3b2f:liè # 㬯 0x3b30:yú # 㬰 0x3b31:tì # 㬱 0x3b33:wÇ” # 㬳 0x3b34:hÇ’ng # 㬴 0x3b35:xiáo,jiÄ�o # 㬵 0x3b36:hào # 㬶 0x3b3b:huÇŽng # 㬻 0x3b3c:fù # 㬼 0x3b3f:dùn # 㬿 0x3b41:réng # ã­� 0x3b42:jiÇŽo # ã­‚ 0x3b44:xìn # ã­„ 0x3b47:yuàn # ã­‡ 0x3b48:jué,kuài # ã­ˆ 0x3b49:huá # ã­‰ 0x3b4b:bàng # ã­‹ 0x3b4c:móu,yú # ã­Œ 0x3b4f:wÄ›i # ã­� 0x3b51:mèi # ã­‘ 0x3b52:sì # ã­’ 0x3b53:biàn # ã­“ 0x3b54:lú # ã­” 0x3b58:hé,gé # ã­˜ 0x3b59:shé,zhé # ã­™ 0x3b5a:lÇš # ã­š 0x3b5b:pài # ã­› 0x3b5c:róng # ã­œ 0x3b5d:qiú # ã­� 0x3b5e:liè # ã­ž 0x3b5f:gÇ’ng # ã­Ÿ 0x3b60:xiÇŽn # ã­  0x3b61:xì,xìn # ã­¡ 0x3b64:niÇŽo # ã­¤ 0x3b68:yé # ã­¨ 0x3b69:lèi,líng,liè # ã­© 0x3b6b:cuán,cuó,zhèn # ã­« 0x3b6c:zhuó # ã­¬ 0x3b6d:fèi # ã­­ 0x3b6e:zuò # ã­® 0x3b6f:dié,nà,zhé # ã­¯ 0x3b70:jì,jué,zuÇ� # ã­° 0x3b71:hé,xiá # ã­± 0x3b72:jí # ã­² 0x3b78:tú # ã­¸ 0x3b79:xián # ã­¹ 0x3b7a:yÇŽn # ã­º 0x3b7b:táng # ã­» 0x3b7c:tà # ã­¼ 0x3b7d:dÇ� # ã­½ 0x3b7e:jué,yuè # ã­¾ 0x3b7f:áng # ã­¿ 0x3b80:hán # 㮀 0x3b81:yáo # ã®� 0x3b82:jú # 㮂 0x3b83:ruí # 㮃 0x3b84:bÇŽng,bì,péng # 㮄 0x3b86:niè # 㮆 0x3b87:tiàn # 㮇 0x3b88:nài # 㮈 0x3b8b:yÇ’u,yù # 㮋 0x3b8c:mián,mÇ�n # 㮌 0x3b8f:nài # ã®� 0x3b90:xÇ�ng,shÄ›ng # ã®� 0x3b91:qì # 㮑 0x3b93:gèn # 㮓 0x3b94:tóng # ã®” 0x3b95:ér,ruÇŽn # 㮕 0x3b96:jiá,jiá # ã®– 0x3b97:qín # ã®— 0x3b98:mào # 㮘 0x3b99:è # ã®™ 0x3b9a:lì # 㮚 0x3b9b:chí # ã®› 0x3b9d:hé,luò # ã®� 0x3b9e:jié,ní,yá # 㮞 0x3b9f:jí,niÇŽn,pèng,ròu,kÄ� # 㮟 0x3ba1:guàn # 㮡 0x3ba2:hóu # 㮢 0x3ba3:gài,zé # 㮣 0x3ba5:fèn # 㮥 0x3ba6:sè,suÇ’ # 㮦 0x3ba8:jí,jì # 㮨 0x3baa:qióng # 㮪 0x3bab:hé # 㮫 0x3bad:xián # ã®­ 0x3bae:jié # ã®® 0x3baf:huá,hún,kuÇŽn # 㮯 0x3bb0:bí,pí # ã®° 0x3bb3:zhèn # 㮳 0x3bb6:shì,shuò # ã®¶ 0x3bb8:sòng # 㮸 0x3bb9:zhÇ� # 㮹 0x3bba:bÄ›n # 㮺 0x3bbe:lÇŽng # 㮾 0x3bbf:bì # 㮿 0x3bc0:xiÇŽn,xuàn # 㯀 0x3bc1:bàng # ã¯� 0x3bc2:dài # 㯂 0x3bc5:pí # 㯅 0x3bc6:chÇŽn # 㯆 0x3bc7:bì # 㯇 0x3bc8:sù # 㯈 0x3bc9:huò,chÅ« # 㯉 0x3bca:hén # 㯊 0x3bcb:yÇ�ng # 㯋 0x3bcc:chuán # 㯌 0x3bcd:jiÇŽng # ã¯� 0x3bce:nèn # 㯎 0x3bcf:gÇ” # ã¯� 0x3bd0:fÇŽng,tuÇ’ # ã¯� 0x3bd3:tà # 㯓 0x3bd4:cuì # 㯔 0x3bd6:dé # 㯖 0x3bd7:rÇŽn,shùn,xián,xiàn # 㯗 0x3bd8:kuÇŽn # 㯘 0x3bd9:chè # 㯙 0x3bda:dá # 㯚 0x3bdb:hú,huò # 㯛 0x3bdc:cuì # 㯜 0x3bdd:lù # ã¯� 0x3bde:juàn,yuè # 㯞 0x3bdf:lù # 㯟 0x3be0:qiàn,xiàn,xún # 㯠 0x3be1:pào # 㯡 0x3be2:zhèn # 㯢 0x3be4:lì # 㯤 0x3be5:cáo,zÄ�o # 㯥 0x3be6:qí # 㯦 0x3be9:tì # 㯩 0x3bea:líng # 㯪 0x3beb:qú # 㯫 0x3bec:liÇŽn # 㯬 0x3bed:lÇ” # 㯭 0x3bee:shÇ” # 㯮 0x3bef:gòng # 㯯 0x3bf0:zhé,zhí # 㯰 0x3bf1:biÇŽo,piáo,pÄ�o # 㯱 0x3bf2:jìn # 㯲 0x3bf3:qíng # 㯳 0x3bf6:zÅ�ng # 㯶 0x3bf7:pú # 㯷 0x3bf8:jÇ�n # 㯸 0x3bf9:biÇŽo # 㯹 0x3bfa:jiàn # 㯺 0x3bfb:gÇ”n,hùn # 㯻 0x3bff:liè # 㯿 0x3c00:lí # ã°€ 0x3c01:luÇ’ # ã°� 0x3c02:shÄ›n,sÇ”n # ã°‚ 0x3c03:mián # ã°ƒ 0x3c04:jiàn # ã°„ 0x3c05:dí # ã°… 0x3c06:bèi # ã°† 0x3c08:liÇŽn # ã°ˆ 0x3c0a:xún # ã°Š 0x3c0b:pín # ã°‹ 0x3c0c:què # ã°Œ 0x3c0d:lóng # ã°� 0x3c0e:zuì # ã°Ž 0x3c10:jué,kuí,lÄ›i,tuÇ�,tuÇ’ # ã°� 0x3c12:shé,xué # ã°’ 0x3c14:xiè # ã°” 0x3c16:lÇŽn # ã°– 0x3c17:cù # ã°— 0x3c18:yí # ã°˜ 0x3c19:nuó # ã°™ 0x3c1a:lí # ã°š 0x3c1b:yuè # ã°› 0x3c1d:yÇ� # ã°� 0x3c1f:jì,qì # ã°Ÿ 0x3c20:kàng # ã°  0x3c21:xiè # ã°¡ 0x3c23:zì # ã°£ 0x3c24:hÄ“,qiè # ã°¤ 0x3c25:huì # ã°¥ 0x3c26:qù # ã°¦ 0x3c2a:wá # ã°ª 0x3c2c:xún # ã°¬ 0x3c2e:shèn # ã°® 0x3c2f:tòu,tÇ’u,hòu # ã°¯ 0x3c30:qiè # ã°° 0x3c31:shà # ã°± 0x3c32:xù,yù # ã°² 0x3c33:yà # ã°³ 0x3c34:pó,pÇ’u # ã°´ 0x3c35:zú # ã°µ 0x3c36:yÇ’u # ã°¶ 0x3c37:zì # ã°· 0x3c38:liÇŽn,liàn,luÇŽn # ã°¸ 0x3c39:jìn # ã°¹ 0x3c3a:xiá,xià # ã°º 0x3c3b:yÇ� # ã°» 0x3c3c:qiè # ã°¼ 0x3c3d:mÇ�,yàn # ã°½ 0x3c3e:jiào # ã°¾ 0x3c40:chÇ�,chuài # ã±€ 0x3c41:shì # ã±� 0x3c43:yÇ�n # 㱃 0x3c44:mò # 㱄 0x3c45:yì # ã±… 0x3c47:sè,xì # 㱇 0x3c48:jìn # 㱈 0x3c49:yè # 㱉 0x3c4b:què # 㱋 0x3c4c:chè,yÇŽn,yé # 㱌 0x3c4d:luán # ã±� 0x3c4f:zhèng # ã±� 0x3c56:cuì # ã±– 0x3c58:àn,yÇŽn # 㱘 0x3c59:xiÇ” # ã±™ 0x3c5a:cán,hài,shàn # 㱚 0x3c5b:chuÇŽn # ã±› 0x3c5c:zhá # 㱜 0x3c5e:jí # 㱞 0x3c5f:bó,pí,pÇ� # 㱟 0x3c62:láng # ã±¢ 0x3c63:tuÇ� # ã±£ 0x3c65:líng # ã±¥ 0x3c66:è,guì,jÇ�,qÄ« # 㱦 0x3c67:wò # ã±§ 0x3c68:liàn # 㱨 0x3c69:dú # 㱩 0x3c6a:mèn,hÅ«n # 㱪 0x3c6b:làn # 㱫 0x3c6c:wÄ›i # 㱬 0x3c6d:duàn # ã±­ 0x3c6e:kuài,kuì # ã±® 0x3c6f:ái # 㱯 0x3c70:zÇŽi # ã±° 0x3c71:huì,wù,xì # ã±± 0x3c72:yì # ã±² 0x3c73:mò # ã±³ 0x3c74:zì # ã±´ 0x3c75:bèn,fèn # ã±µ 0x3c76:bèng,jiào,péng,qiÇŽo,rù # ã±¶ 0x3c78:bì,bié # 㱸 0x3c79:lì,suàn,xiàn # ã±¹ 0x3c7a:lú # 㱺 0x3c7b:luÇ’,luò # ã±» 0x3c7d:dàn,qín,zhÄ›n # ã±½ 0x3c7f:què # 㱿 0x3c80:chén # ã²€ 0x3c82:chéng # 㲂 0x3c83:jiù # 㲃 0x3c84:kòu,kÅ« # 㲄 0x3c85:jì # ã²… 0x3c86:líng # 㲆 0x3c88:sháo # 㲈 0x3c89:què # 㲉 0x3c8a:ruì # 㲊 0x3c8b:chuò,zhuó,zú # 㲋 0x3c8c:nèng # 㲌 0x3c8e:lóu # 㲎 0x3c8f:bÇŽo,piÇŽo,pín,pìng # ã²� 0x3c92:bào # ã²’ 0x3c93:róng # 㲓 0x3c95:lèi # 㲕 0x3c98:qú # 㲘 0x3c9b:zhÇ� # ã²› 0x3c9c:tán,tÇŽn # 㲜 0x3c9d:rÇ’ng # ã²� 0x3c9e:zú # 㲞 0x3c9f:yÇ�ng # 㲟 0x3ca0:máo # ã²  0x3ca1:nài,nì # 㲡 0x3ca2:biàn,bié # ã²¢ 0x3ca5:táng # ã²¥ 0x3ca6:hàn,hÄ› # 㲦 0x3ca7:zào # ã²§ 0x3ca8:róng # 㲨 0x3cab:pú # 㲫 0x3cad:tÇŽn # ã²­ 0x3caf:rán # 㲯 0x3cb0:níng # ã²° 0x3cb1:liè # ã²± 0x3cb2:dié,yì # ã²² 0x3cb3:dié # ã²³ 0x3cb4:zhòng,zhòu # ã²´ 0x3cb6:lÇœ # ã²¶ 0x3cb7:dàn # ã²· 0x3cb9:guÇ�,qiú # ã²¹ 0x3cba:jí,kè,léi # 㲺 0x3cbb:nì # ã²» 0x3cbc:yì # ã²¼ 0x3cbd:niàn,rÄ›n,xiàn # ã²½ 0x3cbe:yÇ”,yù # ã²¾ 0x3cbf:wÇŽng # 㲿 0x3cc0:guò,kÇŽi,xì # ã³€ 0x3cc1:zè # ã³� 0x3cc2:yán # 㳂 0x3cc3:cuì # 㳃 0x3cc4:xián # 㳄 0x3cc5:jiÇŽo,liú # ã³… 0x3cc6:shÇ”,tÇ’u # 㳆 0x3cc7:fù # 㳇 0x3cc8:pèi # 㳈 0x3ccd:bù # ã³� 0x3cce:biàn,fàn # 㳎 0x3ccf:chÇ�,shì # ã³� 0x3cd0:sà,zhá,zhÇŽ # ã³� 0x3cd1:yì # 㳑 0x3cd2:fÇŽ # ã³’ 0x3cd4:duì # ã³” 0x3cd5:lán # 㳕 0x3cd7:chài # ã³— 0x3cd9:xuàn # ã³™ 0x3cda:yù # 㳚 0x3cdb:yú # ã³› 0x3ce0:tà # ã³  0x3ce5:jù,lòng # ã³¥ 0x3ce6:xiè # 㳦 0x3ce7:xí # ã³§ 0x3ce8:jiÇŽn,zá,zÇŽn # 㳨 0x3cea:pàn,pì # 㳪 0x3ceb:tà # 㳫 0x3cec:xuán # 㳬 0x3ced:xián # ã³­ 0x3cee:niào # ã³® 0x3cf4:mì # ã³´ 0x3cf5:jì # ã³µ 0x3cf6:gòu,nÇ’u # ã³¶ 0x3cf7:wÄ›n,hÅ« # ã³· 0x3cf9:wÇŽng # ã³¹ 0x3cfa:yóu # 㳺 0x3cfb:zé # ã³» 0x3cfc:bì # ã³¼ 0x3cfd:mÇ� # ã³½ 0x3cff:xiè # 㳿 0x3d00:fàn # ã´€ 0x3d01:yì # ã´� 0x3d03:lèi,lì # ã´ƒ 0x3d04:yíng # ã´„ 0x3d06:jìn,xìng # ã´† 0x3d07:shè # ã´‡ 0x3d08:yìn # ã´ˆ 0x3d09:jÇ� # ã´‰ 0x3d0b:sù # ã´‹ 0x3d0f:wÇŽng # ã´� 0x3d10:miàn # ã´� 0x3d11:sù # ã´‘ 0x3d12:yì # ã´’ 0x3d13:zÇŽi # ã´“ 0x3d14:sè,yì # ã´” 0x3d15:jí # ã´• 0x3d16:luò # ã´– 0x3d18:mào # ã´˜ 0x3d19:zhá # ã´™ 0x3d1a:suì # ã´š 0x3d1b:zhì # ã´› 0x3d1c:biàn # ã´œ 0x3d1d:lí # ã´� 0x3d25:qiào # ã´¥ 0x3d26:guàn # ã´¦ 0x3d28:zhèn # ã´¨ 0x3d2a:niè # ã´ª 0x3d2b:jùn # ã´« 0x3d2c:xiè # ã´¬ 0x3d2d:yÇŽo # ã´­ 0x3d2e:xiè # ã´® 0x3d30:néng # ã´° 0x3d33:lÇ’ng # ã´³ 0x3d34:chén # ã´´ 0x3d35:mì # ã´µ 0x3d36:què # ã´¶ 0x3d38:nà,shÇŽn,yè # ã´¸ 0x3d3c:sù # ã´¼ 0x3d3d:xiè,yìn # ã´½ 0x3d3e:bó # ã´¾ 0x3d3f:dÇ�ng # ã´¿ 0x3d40:cuàn,zú # ãµ€ 0x3d42:chuÇŽng,shù # 㵂 0x3d43:shé # 㵃 0x3d44:hàn,qià,yù # 㵄 0x3d45:dàn,tàn # ãµ… 0x3d46:hào # 㵆 0x3d4a:shÄ›n,zhé # 㵊 0x3d4b:mì # 㵋 0x3d4c:chàn,qióng,xún # 㵌 0x3d4d:mèn # ãµ� 0x3d4e:hÇŽn,jiàn,kÇŽn # 㵎 0x3d4f:cuÇ� # ãµ� 0x3d50:jué # ãµ� 0x3d51:hè # 㵑 0x3d52:fèi # ãµ’ 0x3d53:shí # 㵓 0x3d54:chÄ›,chè # ãµ” 0x3d55:shèn # 㵕 0x3d56:nÇœ # ãµ– 0x3d57:fù,pán,píng # ãµ— 0x3d58:màn # 㵘 0x3d5d:yì # ãµ� 0x3d5e:chóu # 㵞 0x3d61:báo # 㵡 0x3d62:léi,lÄ›i # ãµ¢ 0x3d63:kÄ›,luÇ’ # ãµ£ 0x3d64:diàn,shà,xiá # 㵤 0x3d65:bì,mì # ãµ¥ 0x3d66:suí # 㵦 0x3d67:gé # ãµ§ 0x3d68:bì,pì # 㵨 0x3d69:yì # 㵩 0x3d6a:xián # 㵪 0x3d6b:nÇ�,yì # 㵫 0x3d6c:yíng # 㵬 0x3d6d:zhÇ” # ãµ­ 0x3d6e:chún,wÄ›n # ãµ® 0x3d6f:féng # 㵯 0x3d70:xù # ãµ° 0x3d71:piÇŽo # ãµ± 0x3d72:wÇ” # ãµ² 0x3d73:liáo,liú # ãµ³ 0x3d74:cáng # ãµ´ 0x3d75:zòu # ãµµ 0x3d77:biàn # ãµ· 0x3d78:yào,yuè # 㵸 0x3d79:huán # ãµ¹ 0x3d7a:pái,pài # 㵺 0x3d7b:sòu # ãµ» 0x3d7d:duì,lÄ›i # ãµ½ 0x3d7e:jìng,qìng # ãµ¾ 0x3d7f:xí # 㵿 0x3d81:guó # ã¶� 0x3d84:yán # ã¶„ 0x3d85:xué # ã¶… 0x3d86:chú,zhÅ« # 㶆 0x3d87:héng # 㶇 0x3d88:yíng,yìng # 㶈 0x3d8c:lián # ã¶Œ 0x3d8d:xiÇŽn # ã¶� 0x3d8e:huán # ã¶Ž 0x3d91:liàn # ã¶‘ 0x3d92:shÇŽn,shÄ›n,tàn # ã¶’ 0x3d93:cáng # ã¶“ 0x3d94:bèi # ã¶” 0x3d95:jiÇŽn # ã¶• 0x3d96:shù # ã¶– 0x3d97:fàn # ã¶— 0x3d98:diàn # 㶘 0x3d9a:bà # ã¶š 0x3d9b:yú # ã¶› 0x3d9e:nÇŽng # ã¶ž 0x3d9f:lÄ›i # ã¶Ÿ 0x3da0:yì # ã¶  0x3da1:dài,huÇ’,zuó # ã¶¡ 0x3da3:chán # ã¶£ 0x3da4:chÇŽo # 㶤 0x3da6:jìn # 㶦 0x3da7:nèn # ã¶§ 0x3dab:liÇŽo,liào # ã¶« 0x3dac:méi,mò # 㶬 0x3dad:jiù,yÇ’u # ã¶­ 0x3daf:liù # 㶯 0x3db0:hán # ã¶° 0x3db2:yòng # ã¶² 0x3db3:jìn # ã¶³ 0x3db4:chÇ�,shÇ� # ã¶´ 0x3db5:rèn # ã¶µ 0x3db6:nóng # ã¶¶ 0x3db9:hòng # ã¶¹ 0x3dba:tiàn # 㶺 0x3dbf:bó # ã¶¿ 0x3dc0:qióng # ã·€ 0x3dc2:shù # ã·‚ 0x3dc3:cuÇ� # ã·ƒ 0x3dc4:huì # ã·„ 0x3dc5:chÇŽo,miÇŽo # ã·… 0x3dc6:dòu,fù # ã·† 0x3dc7:guài,kuí # ã·‡ 0x3dc8:è # ã·ˆ 0x3dc9:wèi,yù,yùn # ã·‰ 0x3dca:fén # ã·Š 0x3dcb:tán,tÇŽn # ã·‹ 0x3dcd:lún # ã·� 0x3dce:hè,hóng,xié # ã·Ž 0x3dcf:yÇ’ng # ã·� 0x3dd0:huÇ� # ã·� 0x3dd2:yú # ã·’ 0x3dd3:zÇ’ng # ã·“ 0x3dd4:yàn # ã·” 0x3dd5:qiú # ã·• 0x3dd6:zhào # ã·– 0x3dd7:jiÇ’ng # ã·— 0x3dd8:tái # ã·˜ 0x3ddf:tuì # ã·Ÿ 0x3de0:lín # ã·  0x3de1:jiÇ’ng # ã·¡ 0x3de2:zhÇŽ # ã·¢ 0x3de4:hè,hù,xuè # ã·¤ 0x3de6:xù # ã·¦ 0x3dea:cuì,zuÇŽn # ã·ª 0x3deb:qÇ�ng # ã·« 0x3dec:mò # ã·¬ 0x3def:bèng # ã·¯ 0x3df0:lí # ã·° 0x3df3:yàn # ã·³ 0x3df4:gé,lì # ã·´ 0x3df5:mò # ã·µ 0x3df6:bèi,bì # ã·¶ 0x3df7:juÇŽn # ã·· 0x3df8:dié,yè # ã·¸ 0x3df9:shào # ã·¹ 0x3dfb:wú # ã·» 0x3dfc:yàn # ã·¼ 0x3dfe:jué # ã·¾ 0x3e00:tái # 㸀 0x3e01:hÇŽn,hàn # ã¸� 0x3e03:diÇŽn # 㸃 0x3e04:jì,jié # 㸄 0x3e05:jié # 㸅 0x3e09:xiè # 㸉 0x3e0a:là,lài,liè # 㸊 0x3e0b:fán # 㸋 0x3e0c:huò # 㸌 0x3e0d:xì # ã¸� 0x3e0e:niè # 㸎 0x3e0f:mí # ã¸� 0x3e10:rán # ã¸� 0x3e11:cuàn # 㸑 0x3e12:yín # 㸒 0x3e13:mì # 㸓 0x3e15:jué # 㸕 0x3e17:tóng # 㸗 0x3e18:wàn # 㸘 0x3e1a:lÇ� # 㸚 0x3e1b:sháo,shuò # 㸛 0x3e1c:kòng # 㸜 0x3e1d:kÇŽn # ã¸� 0x3e1e:bÇŽn # 㸞 0x3e20:tiÇŽo # 㸠 0x3e22:bèi # 㸢 0x3e23:yè,yì # 㸣 0x3e24:piàn # 㸤 0x3e25:chán # 㸥 0x3e26:hù # 㸦 0x3e27:kèn,yín # 㸧 0x3e29:àn # 㸩 0x3e2a:chún # 㸪 0x3e2b:qián # 㸫 0x3e2c:bèi,fèi,pèi # 㸬 0x3e2e:fén # 㸮 0x3e30:tuó # 㸰 0x3e31:tuó # 㸱 0x3e32:zuó,zuò # 㸲 0x3e33:líng # 㸳 0x3e35:guÇ�,wÄ›i # 㸵 0x3e37:shì # 㸷 0x3e38:hÇ’u,Ç’u,kÇ’u # 㸸 0x3e39:liè # 㸹 0x3e3b:sì # 㸻 0x3e3d:bèi # 㸽 0x3e3e:rèn # 㸾 0x3e3f:dú # 㸿 0x3e40:bó # ã¹€ 0x3e41:liáng # ã¹� 0x3e42:cì,qiÇŽn # 㹂 0x3e43:bì,fèi # 㹃 0x3e44:jì,qì # 㹄 0x3e45:zÇ’ng # ã¹… 0x3e47:hé # 㹇 0x3e48:lí,máo # 㹈 0x3e49:yuán # 㹉 0x3e4a:yuè # 㹊 0x3e4c:chÇŽn,shèng # 㹌 0x3e4d:dí,dú # ã¹� 0x3e4e:léi # 㹎 0x3e4f:jÇ�n # ã¹� 0x3e50:chóng,zhòu # ã¹� 0x3e51:sì,yí # 㹑 0x3e52:pÇ” # ã¹’ 0x3e53:yì # 㹓 0x3e56:huàn # ã¹– 0x3e57:táo,tÄ�o # ã¹— 0x3e58:rú,rù,ruí # 㹘 0x3e59:wÄ›ng # ã¹™ 0x3e5a:wÄ›ng # 㹚 0x3e5b:ráo,rÇŽo # ã¹› 0x3e5c:yín # 㹜 0x3e5d:shì # ã¹� 0x3e5e:yín,yÇ�n # 㹞 0x3e5f:jué # 㹟 0x3e60:tún # ã¹  0x3e61:xuán,xuàn # 㹡 0x3e64:qiè,què # 㹤 0x3e65:zhù # ã¹¥ 0x3e68:yòu # 㹨 0x3e6b:xì,yí # 㹫 0x3e6c:shÇ� # 㹬 0x3e6d:yì # ã¹­ 0x3e6e:mò # ã¹® 0x3e71:hú,què,rÇŽn # ã¹± 0x3e72:xiào # ã¹² 0x3e73:wú # ã¹³ 0x3e75:jìng # ã¹µ 0x3e76:tíng # ã¹¶ 0x3e77:shÇ�,xìn # ã¹· 0x3e78:ní # 㹸 0x3e7a:tà # 㹺 0x3e7c:chÇ”,jú,yù # ã¹¼ 0x3e7d:chÇŽn,shàn # ã¹½ 0x3e7e:piÇŽo # ã¹¾ 0x3e7f:diÇŽo,zhào,zhuó # 㹿 0x3e80:náo # 㺀 0x3e81:nÇŽo # ãº� 0x3e82:gÇŽn,jiàn,yán # 㺂 0x3e83:gÇ’u # 㺃 0x3e84:yÇ” # 㺄 0x3e85:hóu # 㺅 0x3e89:hù # 㺉 0x3e8a:yàng # 㺊 0x3e8c:xiàn # 㺌 0x3e8e:róng # 㺎 0x3e8f:lóu # ãº� 0x3e90:zhÇŽo # ãº� 0x3e91:cán,shÇŽn # 㺑 0x3e92:liào,yáo,xiÄ�o # 㺒 0x3e93:piào # 㺓 0x3e94:hài,wèi # 㺔 0x3e95:fán # 㺕 0x3e96:hÇŽn # 㺖 0x3e97:dàn,yán # 㺗 0x3e98:zhàn # 㺘 0x3e9a:tÇŽ # 㺚 0x3e9b:zhù # 㺛 0x3e9c:nóng # 㺜 0x3e9d:jiàn # ãº� 0x3e9e:yú # 㺞 0x3e9f:zhuó # 㺟 0x3ea0:yòu,yù # 㺠 0x3ea1:lì # 㺡 0x3ea5:chán,tán # 㺥 0x3ea6:lián # 㺦 0x3ea9:jiù,sè # 㺩 0x3eaa:pú # 㺪 0x3eab:qiú # 㺫 0x3eac:gÇ’ng # 㺬 0x3ead:zÇ� # 㺭 0x3eae:yú # 㺮 0x3eb1:réng # 㺱 0x3eb2:niÇ” # 㺲 0x3eb3:méi # 㺳 0x3eb5:jiú # 㺵 0x3eb7:xù # 㺷 0x3eb8:píng # 㺸 0x3eb9:biàn # 㺹 0x3eba:mào # 㺺 0x3ebf:yí # 㺿 0x3ec0:yóu,yú # 㻀 0x3ec2:píng # 㻂 0x3ec4:bÇŽo # 㻄 0x3ec5:huì,kuài # ã»… 0x3ec9:bù # 㻉 0x3eca:máng,mén,mèng # 㻊 0x3ecb:là,lèi # 㻋 0x3ecc:tú # 㻌 0x3ecd:wú # ã»� 0x3ece:lì,sè # 㻎 0x3ecf:líng,lÇ�ng # ã»� 0x3ed1:jì # 㻑 0x3ed2:jùn # ã»’ 0x3ed4:duÇ’,ruì # ã»” 0x3ed5:jué # 㻕 0x3ed6:dài # ã»– 0x3ed7:bèi # ã»— 0x3edd:là # ã»� 0x3ede:biÌ„n,baÌ„n # 㻞 0x3edf:suí # 㻟 0x3ee0:tú # ã»  0x3ee1:dié,jué # 㻡 0x3ee7:duò,hé # ã»§ 0x3eea:suì # 㻪 0x3eeb:bì # 㻫 0x3eec:tú # 㻬 0x3eed:sè,zé # ã»­ 0x3eee:càn # ã»® 0x3eef:tú # 㻯 0x3ef0:miÇŽn,rè,wèi,yù # ã»° 0x3ef2:lÇš # 㻲 0x3ef5:zhàn # 㻵 0x3ef6:bÇ�,bì # ã»¶ 0x3ef7:jí # ã»· 0x3ef8:cén,jìn,xín,zÄ“n # 㻸 0x3efa:lì,liè # 㻺 0x3efd:suì # 㻽 0x3eff:shÇ” # 㻿 0x3f02:é,wèn,yuÇŽn # 㼂 0x3f07:qióng # 㼇 0x3f08:luó # 㼈 0x3f09:yìn,zhèn # 㼉 0x3f0a:tún # 㼊 0x3f0b:gÇ”,jiÇ”,móu,rÇ” # 㼋 0x3f0c:yÇ” # 㼌 0x3f0d:lÄ›i # ã¼� 0x3f0e:bèi,bó,kÄ› # 㼎 0x3f0f:nÄ›i # ã¼� 0x3f10:pián # ã¼� 0x3f11:liàn,luán # 㼑 0x3f12:qiÇ”,tÇŽng # ã¼’ 0x3f13:lián,liÇŽn # 㼓 0x3f16:lì # ã¼– 0x3f17:dÇ�ng,tíng # ã¼— 0x3f18:wÇŽ # 㼘 0x3f19:zhòu # ã¼™ 0x3f1b:xíng # ã¼› 0x3f1c:àng,póu # 㼜 0x3f1d:fàn,wÇŽn # ã¼� 0x3f1e:pèng # 㼞 0x3f1f:bái # 㼟 0x3f20:tuó # ã¼  0x3f22:Ä›,yí # ã¼¢ 0x3f23:bÇŽi,bó # ã¼£ 0x3f24:qì,qiè,yà # 㼤 0x3f25:chú,kÇŽo,tÇ’u # ã¼¥ 0x3f26:gÇ’ng # 㼦 0x3f27:tóng # ã¼§ 0x3f28:hán # 㼨 0x3f29:chéng # 㼩 0x3f2a:jiá # 㼪 0x3f2b:huàn # 㼫 0x3f2c:xìng # 㼬 0x3f2d:diàn,niÇŽo # ã¼­ 0x3f2e:chÄ�i,qì # ã¼® 0x3f2f:dòng # 㼯 0x3f30:é,pí # ã¼° 0x3f31:ruÇŽn # ã¼± 0x3f32:liè # ã¼² 0x3f33:shÄ›ng # ã¼³ 0x3f34:Ç’u # ã¼´ 0x3f35:dì # ã¼µ 0x3f36:yú # ã¼¶ 0x3f37:chuán # ã¼· 0x3f38:róng # 㼸 0x3f3a:táng # 㼺 0x3f3b:cóng # ã¼» 0x3f3c:piáo # ã¼¼ 0x3f3d:shuÇŽng,chuÇŽng # ã¼½ 0x3f3e:lù # ã¼¾ 0x3f3f:tóng # 㼿 0x3f40:zhèng # ã½€ 0x3f41:lì # ã½� 0x3f42:sà # 㽂 0x3f47:guài,hú,huí,méng,sè # 㽇 0x3f48:yì # 㽈 0x3f49:hÇŽn,jiàn,xiàn # 㽉 0x3f4a:xiè # 㽊 0x3f4b:luó,luò # 㽋 0x3f4c:liù # 㽌 0x3f4e:dÇŽn,tán # 㽎 0x3f51:tán # 㽑 0x3f55:yóu # 㽕 0x3f56:nán # ã½– 0x3f58:gÇŽng # 㽘 0x3f59:jùn # ã½™ 0x3f5a:chì # 㽚 0x3f5b:gÅ�u,qú # ã½› 0x3f5c:wÇŽn # 㽜 0x3f5d:lì # ã½� 0x3f5e:liú # 㽞 0x3f5f:liè # 㽟 0x3f60:xiá # ã½  0x3f62:ÇŽn,yè # ã½¢ 0x3f63:yù # ã½£ 0x3f64:jú # 㽤 0x3f65:róu # ã½¥ 0x3f66:xún # 㽦 0x3f68:cuó # 㽨 0x3f69:càn,cào # 㽩 0x3f6a:zÄ›ng,zhÇŽ # 㽪 0x3f6b:yÇ’ng # 㽫 0x3f6c:fù # 㽬 0x3f6d:ruÇŽn # ã½­ 0x3f6f:xí # 㽯 0x3f70:shù # ã½° 0x3f71:jiÇŽo,jiÅ«,niú # ã½± 0x3f72:jiÇŽo # ã½² 0x3f73:hàn,xiè,xÇ”,yú # ã½³ 0x3f74:zhàng # ã½´ 0x3f77:shuì # ã½· 0x3f78:chén # 㽸 0x3f79:fàn,wÇŽn # ã½¹ 0x3f7a:jí # 㽺 0x3f7d:gù # ã½½ 0x3f7e:wù # ã½¾ 0x3f80:qiè # ã¾€ 0x3f81:shù # ã¾� 0x3f83:tuó # 㾃 0x3f84:dú # 㾄 0x3f85:zÇ� # ã¾… 0x3f86:rán,shÇŽn # 㾆 0x3f87:mù # 㾇 0x3f88:fù # 㾈 0x3f89:líng # 㾉 0x3f8a:jí # 㾊 0x3f8b:xiù # 㾋 0x3f8c:xuÇŽn # 㾌 0x3f8d:nái # ã¾� 0x3f8f:jiè # ã¾� 0x3f90:lì # ã¾� 0x3f91:dá # 㾑 0x3f92:jì,rú,rù # ã¾’ 0x3f94:lÇš # ã¾” 0x3f95:shÄ›n # 㾕 0x3f96:lÇ�,luó # ã¾– 0x3f97:lÇŽng,liàng # ã¾— 0x3f98:gÄ›ng # 㾘 0x3f99:yÇ�n # ã¾™ 0x3f9b:qÇ�n # ã¾› 0x3f9c:qiè # 㾜 0x3f9d:chè # ã¾� 0x3f9e:yÇ’u # 㾞 0x3f9f:bù # 㾟 0x3fa0:huáng,kuáng,kuì # ã¾  0x3fa1:què # 㾡 0x3fa2:lài # ã¾¢ 0x3fa5:xù # ã¾¥ 0x3fa6:bàng,pèi,pén # 㾦 0x3fa7:kè # ã¾§ 0x3fa8:qÇ�,yÇ� # 㾨 0x3faa:shÄ›ng # 㾪 0x3fad:zhòu # ã¾­ 0x3fae:huáng # ã¾® 0x3faf:tuí,wÄ›i # 㾯 0x3fb0:hú # ã¾° 0x3fb1:bèi,fàn,fèi,fú # ã¾± 0x3fb5:jì # ã¾µ 0x3fb6:gÇ” # ã¾¶ 0x3fb8:gÇŽo # 㾸 0x3fb9:chái # ã¾¹ 0x3fba:mà,mò # 㾺 0x3fbb:zhù # ã¾» 0x3fbc:tuÇ� # ã¾¼ 0x3fbd:tuí,zhuì # ã¾½ 0x3fbe:lián # ã¾¾ 0x3fbf:láng,lÇŽng # 㾿 0x3fc3:dài,zhì # 㿃 0x3fc4:ài # ã¿„ 0x3fc5:xiÇŽn,xuÇŽn # ã¿… 0x3fc7:xí,xì # 㿇 0x3fc9:tuí # 㿉 0x3fca:cÇŽn # 㿊 0x3fcb:sào # ã¿‹ 0x3fcd:jiè # ã¿� 0x3fce:fèn # 㿎 0x3fcf:qún # ã¿� 0x3fd1:yào # ã¿‘ 0x3fd2:dÇŽo # ã¿’ 0x3fd3:jiá # ã¿“ 0x3fd4:lÄ›i # ã¿” 0x3fd5:yán # ã¿• 0x3fd6:lú # ã¿– 0x3fd7:tuí # ã¿— 0x3fd8:yíng # 㿘 0x3fd9:pì # ã¿™ 0x3fda:luò # 㿚 0x3fdb:lí,lì # ã¿› 0x3fdc:biÄ› # 㿜 0x3fde:mào # 㿞 0x3fdf:bái,jiÇŽo # 㿟 0x3fe2:yào,zhuì # ã¿¢ 0x3fe3:hé,xiá # ã¿£ 0x3fe4:chÇ”n # 㿤 0x3fe5:hú,hé # ã¿¥ 0x3fe6:nìng # 㿦 0x3fe7:chóu # ã¿§ 0x3fe8:lì # 㿨 0x3fe9:tÇŽng # ã¿© 0x3fea:huán # 㿪 0x3feb:bì # ã¿« 0x3fed:chè # ã¿­ 0x3fee:yàng # ã¿® 0x3fef:dá # 㿯 0x3ff0:áo # ã¿° 0x3ff1:xué # 㿱 0x3ff5:rÇŽn # 㿵 0x3ff7:cuó,cÄ�o # ã¿· 0x3ff8:wÇŽn,mán # 㿸 0x3ff9:tà # 㿹 0x3ffa:báo # 㿺 0x3ffc:yán # 㿼 0x3ffe:zhù # 㿾 0x3fff:yÇŽ # ã¿¿ 0x4000:fán # 䀀 0x4001:yòu # ä€� 0x4003:tuí # 䀃 0x4004:méng # 䀄 0x4005:shè,zhé # 䀅 0x4006:jìn # 䀆 0x4007:gÇ”,què # 䀇 0x4008:qì # 䀈 0x4009:qiáo,shà # 䀉 0x400a:jiÇŽo # 䀊 0x400b:yán # 䀋 0x400d:kàn # ä€� 0x400e:miÇŽn # 䀎 0x400f:xiàn,xuàn # ä€� 0x4010:sÇŽn # ä€� 0x4011:nà,nì,wò # 䀑 0x4013:huàn # 䀓 0x4014:niú,rèn # 䀔 0x4015:chèng,zhèn # 䀕 0x4017:jué # 䀗 0x4018:xí,xié # 䀘 0x4019:qì # 䀙 0x401a:áng # 䀚 0x401b:mèi,wù # 䀛 0x401c:gÇ”,mèi,xué # 䀜 0x401f:fán,fèi,fèn # 䀟 0x4020:qú,jù # 䀠 0x4021:chàn,tàn # 䀡 0x4022:shùn # 䀢 0x4023:bì,mà # 䀣 0x4024:mào # 䀤 0x4025:shuò # 䀥 0x4026:gÇ” # 䀦 0x4027:hÇ’ng # 䀧 0x4028:huàn # 䀨 0x4029:luò # 䀩 0x402a:háng # 䀪 0x402b:jiá # 䀫 0x402c:quán # 䀬 0x402e:máng # 䀮 0x402f:bÇ” # 䀯 0x4030:gÇ”,yíng # 䀰 0x4032:mù # 䀲 0x4033:ài,là,lài # 䀳 0x4034:yÇ�ng # 䀴 0x4035:shùn # 䀵 0x4036:lÇŽng,liàng # 䀶 0x4037:jié # 䀷 0x4038:dì,zhì # 䀸 0x4039:jiá,shè,jié # 䀹 0x403b:pìn # 䀻 0x403c:rèn,zhÄ›n # 䀼 0x403d:yán # 䀽 0x403e:dÇ” # 䀾 0x403f:dì # 䀿 0x4041:lÇŽng,liàng # ä�� 0x4042:xiàn # ä�‚ 0x4044:xìng # ä�„ 0x4045:bèi,bì,mÄ›ng,mèng # ä�… 0x4046:ÇŽn,yì # ä�† 0x4047:mì # ä�‡ 0x4048:qì # ä�ˆ 0x4049:qì # ä�‰ 0x404a:wò # ä�Š 0x404b:shé # ä�‹ 0x404c:yù # ä�Œ 0x404d:jià,kè,qià # ä�� 0x404e:chéng # ä�Ž 0x404f:yÇŽo # ä�� 0x4050:yìng # ä�� 0x4051:yáng # ä�‘ 0x4052:jí # ä�’ 0x4053:jiè,zÇ’ng # ä�“ 0x4054:hàn,huÇŽn,xuÄ�n # ä�” 0x4055:mín # ä�• 0x4056:lÅ�u # ä�– 0x4057:kÇŽi # ä�— 0x4058:yÇŽo # ä�˜ 0x4059:yÇŽn,yàn # ä�™ 0x405a:sÇ”n # ä�š 0x405b:guÇ�,guì,kuì # ä�› 0x405c:huÇŽng,huàng # ä�œ 0x405d:yíng # ä�� 0x405e:shÄ›ng # ä�ž 0x405f:chá,duó # ä�Ÿ 0x4060:lián # ä�  0x4062:xuán # ä�¢ 0x4063:chuán # ä�£ 0x4064:chè,chèng # ä�¤ 0x4065:nì # ä�¥ 0x4066:qù # ä�¦ 0x4067:miáo # ä�§ 0x4068:huò # ä�¨ 0x4069:yú # ä�© 0x406a:nÇŽn,zhÇŽn # ä�ª 0x406b:hú # ä�« 0x406c:céng # ä�¬ 0x406e:qián # ä�® 0x406f:shè,xié # ä�¯ 0x4070:jiÇŽng # ä�° 0x4071:kÅ�u # ä�± 0x4072:mái # ä�² 0x4073:mÇŽng # ä�³ 0x4074:zhÇŽn # ä�´ 0x4075:biÇŽn # ä�µ 0x4076:jiÇŽo # ä�¶ 0x4077:jué,wò # ä�· 0x4078:nóng # ä�¸ 0x4079:bì # ä�¹ 0x407a:shì # ä�º 0x407b:lì,shuò # ä�» 0x407c:mò,mù # ä�¼ 0x407d:liè # ä�½ 0x407e:miè # ä�¾ 0x407f:mò # ä�¿ 0x4080:xÄ« # ä‚€ 0x4081:chán # ä‚� 0x4082:qú # ä‚‚ 0x4083:jiào,jié # 䂃 0x4084:huò,kuàng # ä‚„ 0x4086:xù # 䂆 0x4087:náng,niÇ”,nÇ’ng,páng # 䂇 0x4088:tóng # 䂈 0x4089:hóu # 䂉 0x408a:yù # 䂊 0x408d:bó # ä‚� 0x408e:zuÇŽn # 䂎 0x4090:chuò # ä‚� 0x4092:jié,qià,yà # ä‚’ 0x4094:xìng # ä‚” 0x4095:huì # ä‚• 0x4096:shí,sì # ä‚– 0x409a:yáo,yóu # 䂚 0x409b:yú # ä‚› 0x409c:bàng,péi # 䂜 0x409d:jié,zé,zhé # ä‚� 0x409e:zhè # 䂞 0x40a0:shé,shÇ� # ä‚  0x40a1:dÇ�,zhÇ� # ä‚¡ 0x40a2:dÇ’ng # ä‚¢ 0x40a3:cí # ä‚£ 0x40a4:fù,hái # 䂤 0x40a5:mín # ä‚¥ 0x40a6:zhÄ›n # 䂦 0x40a7:zhÄ›n # ä‚§ 0x40a9:yàn # ä‚© 0x40aa:diào,tiÇŽo # 䂪 0x40ab:hóng # ä‚« 0x40ac:gÇ’ng # 䂬 0x40ae:lüè # ä‚® 0x40af:guài,guàn # 䂯 0x40b0:là # ä‚° 0x40b1:cuì,ruì # 䂱 0x40b2:fÇŽ # 䂲 0x40b3:cuÇ’ # 䂳 0x40b4:yán # ä‚´ 0x40b6:jié # ä‚¶ 0x40b8:guó,xù # 䂸 0x40b9:suÇ’ # 䂹 0x40ba:wÇŽn,wÇ’ # 䂺 0x40bb:zhèng # ä‚» 0x40bc:niè # 䂼 0x40bd:diào,yì # 䂽 0x40be:lÇŽi # 䂾 0x40bf:tà,tiè # ä‚¿ 0x40c0:cuì,xùn # 䃀 0x40c2:gÇ”n,gùn # 䃂 0x40c7:mián # 䃇 0x40c9:mín # 䃉 0x40ca:jÇ” # 䃊 0x40cb:yú # 䃋 0x40cd:zhào,zhuì # äƒ� 0x40ce:zhÇŽ # 䃎 0x40d1:pán # 䃑 0x40d2:hé # 䃒 0x40d3:gòu # 䃓 0x40d4:hóng # 䃔 0x40d5:láo,luò # 䃕 0x40d6:wù # 䃖 0x40d7:chuò # 䃗 0x40d9:lù # 䃙 0x40da:cù # 䃚 0x40db:lián,qiàn # 䃛 0x40dd:qiào # äƒ� 0x40de:shú,yì # 䃞 0x40e1:cén # 䃡 0x40e3:huÇ� # 䃣 0x40e4:sù # 䃤 0x40e5:chuáng # 䃥 0x40e7:lóng # 䃧 0x40e9:náo # 䃩 0x40ea:tán # 䃪 0x40eb:dÇŽn # 䃫 0x40ec:wÄ›i # 䃬 0x40ed:gÇŽn # 䃭 0x40ee:dá # 䃮 0x40ef:lì # 䃯 0x40f1:xiàn # 䃱 0x40f2:pán,pàn # 䃲 0x40f3:là # 䃳 0x40f5:niÇŽo # 䃵 0x40f6:huái # 䃶 0x40f7:yíng # 䃷 0x40f8:xiàn # 䃸 0x40f9:làn,lÇŽng # 䃹 0x40fa:mó,mò # 䃺 0x40fb:bà,pái # 䃻 0x40fd:fú,guÇ�,sì # 䃽 0x40fe:bÇ� # 䃾 0x4100:huò # ä„€ 0x4101:yì # ä„� 0x4102:liù # ä„‚ 0x4105:juàn # ä„… 0x4106:huó,kuò # 䄆 0x4107:chéng # 䄇 0x4108:dòu # 䄈 0x4109:é # 䄉 0x410b:yÇŽn # ä„‹ 0x410c:zhuì # 䄌 0x410d:dù,duó,zhà # ä„� 0x410e:qÇ� # 䄎 0x410f:yú,yÄ�o # ä„� 0x4110:quàn # ä„� 0x4111:huó,kuò # ä„‘ 0x4112:niè,rÄ›n # ä„’ 0x4113:héng,huáng # ä„“ 0x4114:jÇ” # ä„” 0x4115:shè,shèn,tiÇŽn # ä„• 0x4118:péng # 䄘 0x4119:míng # ä„™ 0x411a:cáo # 䄚 0x411b:lóu # ä„› 0x411c:lí,chÄ« # 䄜 0x411d:chÇ”n # ä„� 0x411f:cuì # 䄟 0x4120:shàn # ä„  0x4122:qí # ä„¢ 0x4124:lài,lán # 䄤 0x4125:líng # ä„¥ 0x4126:liÇŽo # 䄦 0x4127:réng,rÇ’ng # ä„§ 0x4128:yú,yÇ” # 䄨 0x4129:náo,yì # ä„© 0x412a:chuò,diÇŽo # 䄪 0x412b:qÇ� # ä„« 0x412c:yí # 䄬 0x412d:nián # ä„­ 0x412f:jiÇŽn,xiàn # 䄯 0x4130:yá,zhá # ä„° 0x4132:chuí # 䄲 0x4136:bì # ä„¶ 0x4137:dàn,diÇŽo,shí # ä„· 0x4138:pò # 䄸 0x4139:nián,tiÇŽn # 䄹 0x413a:zhì # 䄺 0x413b:cháo,táo,zhào # ä„» 0x413c:tiÇŽn # 䄼 0x413d:tiÇŽn # 䄽 0x413e:ròu # 䄾 0x413f:yì # ä„¿ 0x4140:liè # ä…€ 0x4141:àn # ä…� 0x4142:hé # ä…‚ 0x4143:qióng # ä…ƒ 0x4144:lì # ä…„ 0x4146:zì # ä…† 0x4147:sù # ä…‡ 0x4148:yuàn # ä…ˆ 0x4149:yà # ä…‰ 0x414a:dù # ä…Š 0x414b:wÇŽn # ä…‹ 0x414d:dòng,tÇ�ng # ä…� 0x414e:yÇ’u # ä…Ž 0x414f:huì,wèi # ä…� 0x4150:jiÇŽn,qián # ä…� 0x4151:ruí,suí # ä…‘ 0x4152:máng # ä…’ 0x4153:jÇ”,qù # ä…“ 0x4156:ÇŽn # ä…– 0x4157:suì # ä…— 0x4158:lái # ä…˜ 0x4159:hùn # ä…™ 0x415a:qiÇŽng,quÇŽn,zé # ä…š 0x415c:duò # ä…œ 0x415e:nà,nài,nè # ä…ž 0x415f:cÇŽn # ä…Ÿ 0x4160:tí # ä…  0x4161:xÇ” # ä…¡ 0x4162:jiù # ä…¢ 0x4163:huáng # ä…£ 0x4164:qì # ä…¤ 0x4165:jié # ä…¥ 0x4166:máo # ä…¦ 0x4167:yàn # ä…§ 0x4169:zhÇ� # ä…© 0x416a:tuí # ä…ª 0x416c:ài,yÇŽn,yè # ä…¬ 0x416d:páng # ä…­ 0x416e:càng # ä…® 0x416f:táng # ä…¯ 0x4170:Ä›n # ä…° 0x4171:hùn # ä…± 0x4172:qí # ä…² 0x4173:chú # ä…³ 0x4174:suÇ’ # ä…´ 0x4175:zhuó # ä…µ 0x4176:nòu,wÇ” # ä…¶ 0x4177:tú # ä…· 0x4178:zú # ä…¸ 0x4179:lóu,lÇ’u # ä…¹ 0x417a:miÇŽo # ä…º 0x417b:lí # ä…» 0x417c:mán # ä…¼ 0x417d:gÇ” # ä…½ 0x417e:cén,qián,qín # ä…¾ 0x417f:huá # ä…¿ 0x4180:mÄ›i # 䆀 0x4182:lián,qiàn # 䆂 0x4183:dÇŽo,dào # 䆃 0x4184:shàn # 䆄 0x4185:cí,jÇ�,zÄ« # 䆅 0x4188:zhì # 䆈 0x4189:bà # 䆉 0x418a:cuì # 䆊 0x418b:qiÅ« # 䆋 0x418d:lóng # ä†� 0x418f:fèi # ä†� 0x4190:guó # ä†� 0x4191:chéng # 䆑 0x4192:jiù # 䆒 0x4193:è,ruÇŽn # 䆓 0x4195:jué,yuè # 䆕 0x4196:hóng # 䆖 0x4197:jiào # 䆗 0x4198:cuán,yÄ� # 䆘 0x4199:yáo # 䆙 0x419a:tóng # 䆚 0x419b:chá,zhà,zhé # 䆛 0x419c:yòu # 䆜 0x419d:shù # ä†� 0x419e:yÇŽo # 䆞 0x419f:gé # 䆟 0x41a0:huàn # 䆠 0x41a1:láng,làng # 䆡 0x41a2:jué,yuè # 䆢 0x41a3:chén # 䆣 0x41a6:shèn # 䆦 0x41a8:míng # 䆨 0x41a9:míng # 䆩 0x41ab:chuÄ�ng # 䆫 0x41ac:yÇ”n # 䆬 0x41ae:jìn # 䆮 0x41af:chuò,zhuó # 䆯 0x41b1:tÇŽn # 䆱 0x41b3:qióng,suì # 䆳 0x41b5:chéng # 䆵 0x41b7:yù,xuè # 䆷 0x41b8:chéng # 䆸 0x41b9:tÇ’ng # 䆹 0x41bb:qiào # 䆻 0x41bd:jù,qú,qún # 䆽 0x41be:lán # 䆾 0x41bf:yì # 䆿 0x41c0:róng,rÇ’ng # 䇀 0x41c3:sì,xiào # 䇃 0x41c5:fá # 䇅 0x41c7:méng # 䇇 0x41c8:guì,huà # 䇈 0x41cb:hài,rÇŽn,xiè # 䇋 0x41cc:qiào # 䇌 0x41cd:chuò # ä‡� 0x41ce:què # 䇎 0x41cf:duì # ä‡� 0x41d0:lì # ä‡� 0x41d1:bà # 䇑 0x41d2:jiè,qín,xiàn # 䇒 0x41d4:luò,nuò # 䇔 0x41d6:yÇ”n # 䇖 0x41d8:hù # 䇘 0x41d9:yÇ�n # 䇙 0x41db:zhÇ� # 䇛 0x41dc:liÇŽn # 䇜 0x41de:gÇŽn # 䇞 0x41df:jiàn # 䇟 0x41e0:zhòu,zhù # 䇠 0x41e1:zhù # 䇡 0x41e2:kÇ” # 䇢 0x41e3:nà,nèi,yÇ� # 䇣 0x41e4:duì,ruì,sù # 䇤 0x41e5:zé,zuó # 䇥 0x41e6:yÇŽng # 䇦 0x41e7:zhù # 䇧 0x41e8:gòng,xiáng # 䇨 0x41e9:yì # 䇩 0x41ec:chuÇŽng,zhÅ« # 䇬 0x41ed:lÇŽo # 䇭 0x41ee:rèn # 䇮 0x41ef:róng # 䇯 0x41f1:nà # 䇱 0x41f2:cè,jiÄ� # 䇲 0x41f5:yí # 䇵 0x41f6:jué # 䇶 0x41f7:bÇ�,bié # 䇷 0x41f8:chéng,shèng,zèng # 䇸 0x41f9:jùn # 䇹 0x41fa:chóu,dòu # 䇺 0x41fb:huì,kuì,wÄ›i # 䇻 0x41fc:chì,yì # 䇼 0x41fd:zhì # 䇽 0x41fe:yán # 䇾 0x4201:lún,luò # äˆ� 0x4202:bìng,píng # 䈂 0x4203:zhÇŽo # 䈃 0x4204:hán # 䈄 0x4205:yù # 䈅 0x4206:dài # 䈆 0x4207:zhào # 䈇 0x4208:féi # 䈈 0x4209:shà # 䈉 0x420a:líng # 䈊 0x420b:tà # 䈋 0x420d:máng # äˆ� 0x420e:yè # 䈎 0x420f:báo # äˆ� 0x4210:kuì # äˆ� 0x4211:guÇŽ,jué # 䈑 0x4212:nÇŽn # 䈒 0x4213:gé # 䈓 0x4215:chí,shi,tí,shí # 䈕 0x4217:suÇ’ # 䈗 0x4218:cí # 䈘 0x4219:zhòu # 䈙 0x421a:tái # 䈚 0x421b:kuài # 䈛 0x421c:qìn # 䈜 0x421e:dÇ” # 䈞 0x421f:cè # 䈟 0x4220:huÇŽn # 䈠 0x4222:sÇŽi # 䈢 0x4223:zhèng # 䈣 0x4224:qián # 䈤 0x4227:wÄ›i # 䈧 0x422a:xì # 䈪 0x422b:nà # 䈫 0x422c:pú # 䈬 0x422d:huái # 䈭 0x422e:jÇ”,jù,wÇŽn # 䈮 0x4232:pán # 䈲 0x4233:tà # 䈳 0x4234:qiàn,zhÇŽn # 䈴 0x4236:róng # 䈶 0x4237:luò # 䈷 0x4238:hú # 䈸 0x4239:sÇ’u # 䈹 0x423b:pú # 䈻 0x423c:miè,mì # 䈼 0x423e:shÄ�o,shuò # 䈾 0x423f:mài,mì # 䈿 0x4240:shù # 䉀 0x4241:líng # ä‰� 0x4242:lÄ›i # 䉂 0x4243:jiÇŽng # 䉃 0x4244:léng # 䉄 0x4245:zhì # 䉅 0x4246:diÇŽo # 䉆 0x4248:sÇŽn # 䉈 0x4249:hú # 䉉 0x424a:fàn,fáng # 䉊 0x424b:mèi # 䉋 0x424c:suì # 䉌 0x424d:jiÇŽn # ä‰� 0x424e:táng # 䉎 0x424f:xiè # ä‰� 0x4251:mó,wú # 䉑 0x4252:fán # 䉒 0x4253:léi,luò # 䉓 0x4255:céng # 䉕 0x4256:líng # 䉖 0x4258:cóng # 䉘 0x4259:yún # 䉙 0x425a:méng # 䉚 0x425b:yù # 䉛 0x425c:zhì # 䉜 0x425d:qÇ� # ä‰� 0x425e:dÇŽn # 䉞 0x425f:huò # 䉟 0x4260:wéi # 䉠 0x4261:tán # 䉡 0x4262:sè # 䉢 0x4263:xiè # 䉣 0x4264:sÇ’u # 䉤 0x4265:sÇ’ng # 䉥 0x4267:liú,liÇ” # 䉧 0x4268:yì # 䉨 0x426a:lèi # 䉪 0x426b:lí # 䉫 0x426c:fèi # 䉬 0x426d:liè # 䉭 0x426e:lìn # 䉮 0x426f:xiàn # 䉯 0x4270:yáo # 䉰 0x4272:biè,mí # 䉲 0x4273:xiÇŽn # 䉳 0x4274:ráng,rÇŽng # 䉴 0x4275:zhuàn # 䉵 0x4277:dàn,jìn,yán # 䉷 0x4278:biàn # 䉸 0x4279:líng,liÇ” # 䉹 0x427a:hóng # 䉺 0x427b:qí # 䉻 0x427c:liào # 䉼 0x427d:bÇŽn # 䉽 0x427e:mì,bì # 䉾 0x427f:hú,luò # 䉿 0x4280:hú # 䊀 0x4282:cè,sè # 䊂 0x4283:pèi # 䊃 0x4284:qióng # 䊄 0x4285:míng # 䊅 0x4286:jiù,qiÇ” # 䊆 0x4287:bù # 䊇 0x4288:méi # 䊈 0x4289:sÇŽn # 䊉 0x428a:mèi # 䊊 0x428d:lí # äŠ� 0x428e:quÇŽn # 䊎 0x4290:èn,huá,huàn,hún # äŠ� 0x4291:xiÇŽng # 䊑 0x4293:shì # 䊓 0x4296:lÇŽn,nÇŽn # 䊖 0x4297:huáng,huÇŽng # 䊗 0x4298:jiù # 䊘 0x4299:yán # 䊙 0x429b:sÇŽ # 䊛 0x429c:tuán # 䊜 0x429d:xiè # äŠ� 0x429e:zhé # 䊞 0x429f:mén # 䊟 0x42a0:xì # 䊠 0x42a1:mán # 䊡 0x42a3:huáng # 䊣 0x42a4:tán # 䊤 0x42a5:xiào # 䊥 0x42a6:yá,yè # 䊦 0x42a7:bì # 䊧 0x42a8:luó # 䊨 0x42a9:fán,fàn # 䊩 0x42aa:lì # 䊪 0x42ab:cuÇ�,mí # 䊫 0x42ac:chà # 䊬 0x42ad:chóu,dào # 䊭 0x42ae:dí,zhé,zhè # 䊮 0x42af:kuàng # 䊯 0x42b0:chÇ” # 䊰 0x42b2:chÇŽn # 䊲 0x42b3:mí # 䊳 0x42b4:qiàn # 䊴 0x42b5:qiú # 䊵 0x42b6:zhèn # 䊶 0x42ba:gÇ”,hù # 䊺 0x42bb:yÇŽn # 䊻 0x42bc:chÇ� # 䊼 0x42bd:guài # 䊽 0x42be:mù # 䊾 0x42bf:bó,kù # 䊿 0x42c0:kuà,huà # ä‹€ 0x42c1:gÄ›ng # ä‹� 0x42c2:yáo # ä‹‚ 0x42c3:mào # 䋃 0x42c4:wÇŽng # ä‹„ 0x42c8:rú # 䋈 0x42c9:jué,kÄ›,xué # 䋉 0x42cb:mín # ä‹‹ 0x42cc:jiÇŽng # 䋌 0x42ce:zhàn # 䋎 0x42cf:zuò # ä‹� 0x42d0:yuè # ä‹� 0x42d1:bÇ�ng # ä‹‘ 0x42d3:zhòu # ä‹“ 0x42d4:bì # ä‹” 0x42d5:rèn # ä‹• 0x42d6:yù # ä‹– 0x42d8:chuò,zhuì # 䋘 0x42d9:Ä›r # ä‹™ 0x42da:yì # 䋚 0x42db:mí,mÇ� # ä‹› 0x42dc:qìng # 䋜 0x42de:wÇŽng # 䋞 0x42df:jì # 䋟 0x42e0:bÇ” # ä‹  0x42e2:biè,biÄ“ # ä‹¢ 0x42e3:fán,pán # ä‹£ 0x42e4:yào,yuè # 䋤 0x42e5:lí # ä‹¥ 0x42e6:fán # 䋦 0x42e7:qú # ä‹§ 0x42e8:fÇ” # 䋨 0x42e9:ér # ä‹© 0x42ed:huò,yù # ä‹­ 0x42ee:jìn,qián # ä‹® 0x42ef:qÇ�,qìng # 䋯 0x42f0:jú # ä‹° 0x42f1:lái # 䋱 0x42f2:chÄ›,shéng,xÇ�ng,zhè # 䋲 0x42f3:bèi,mì # 䋳 0x42f4:niù,rÇ’ng,róu,rÇ” # ä‹´ 0x42f5:yì # 䋵 0x42f6:xù # ä‹¶ 0x42f7:liú,móu # ä‹· 0x42f8:xún # 䋸 0x42f9:fú,fù # 䋹 0x42fb:nín # ä‹» 0x42fc:tÇ�ng,yíng,tÄ«ng # 䋼 0x42fd:bÄ›ng,pÄ›ng # 䋽 0x42fe:zhÇŽ # 䋾 0x4302:òu # 䌂 0x4303:shuò # 䌃 0x4304:gÄ›ng # 䌄 0x4305:táng # 䌅 0x4306:guì # 䌆 0x4307:suÇ’ # 䌇 0x4308:tà # 䌈 0x430a:yáo,yóu # 䌊 0x430c:qì,qiè,qÇ” # 䌌 0x430d:hàn,jÇ�n # äŒ� 0x430e:lüè # 䌎 0x430f:mì,miàn # äŒ� 0x4310:mì # äŒ� 0x4312:lù # 䌒 0x4313:fán # 䌓 0x4314:òu # 䌔 0x4315:mí,mó # 䌕 0x4316:jié # 䌖 0x4317:fÇ” # 䌗 0x4318:mí # 䌘 0x4319:huÇŽng # 䌙 0x431a:sù # 䌚 0x431b:yáo # 䌛 0x431c:niè # 䌜 0x431d:jìn # äŒ� 0x431e:liÇŽn # 䌞 0x431f:bì # 䌟 0x4320:qìng,yÇŽn,yìn # 䌠 0x4321:tÇ� # 䌡 0x4322:líng # 䌢 0x4323:zuÇŽn # 䌣 0x4324:zhÇ� # 䌤 0x4325:yÇ�n # 䌥 0x4326:dÇŽo # 䌦 0x4327:chóu # 䌧 0x4328:cài # 䌨 0x4329:mì,miè # 䌩 0x432a:yán # 䌪 0x432b:lÇŽn # 䌫 0x432c:chóng # 䌬 0x432f:guàn,quán # 䌯 0x4330:shè # 䌰 0x4331:luò # 䌱 0x4334:luò # 䌴 0x4335:zhú,zhÇ” # 䌵 0x4337:chÅ�u,chóu # 䌷 0x4338:juàn # 䌸 0x4339:jiÇ’ng # 䌹 0x433a:Ä›r # 䌺 0x433b:yì # 䌻 0x433c:ruì # 䌼 0x433d:cÇŽi # 䌽 0x433e:rén # 䌾 0x433f:fú # 䌿 0x4340:lán # ä�€ 0x4341:suì # ä�� 0x4342:yú # ä�‚ 0x4343:yáo,yóu # ä�ƒ 0x4344:diÇŽn # ä�„ 0x4345:líng # ä�… 0x4346:zhù # ä�† 0x4347:tà # ä�‡ 0x4348:píng # ä�ˆ 0x4349:qián,zhÇŽi # ä�‰ 0x434a:jué # ä�Š 0x434b:chuí # ä�‹ 0x434c:bù,fú # ä�Œ 0x434d:gÇ”,gù,guàng,kòu # ä�� 0x434e:cùn # ä�Ž 0x4350:hÇŽn,hàn # ä�� 0x4351:hÇŽn # ä�‘ 0x4352:mÇ’u # ä�’ 0x4353:hù,yá # ä�“ 0x4354:hóng # ä�” 0x4355:dÇ� # ä�• 0x4356:fú,fù,hài,xiè # ä�– 0x4357:xuàn # ä�— 0x4358:mí # ä�˜ 0x4359:méi # ä�™ 0x435a:làng # ä�š 0x435b:gù # ä�› 0x435c:zhào # ä�œ 0x435d:tà,zÇŽn # ä�� 0x435e:yù # ä�ž 0x435f:zòng # ä�Ÿ 0x4360:lí # ä�  0x4361:liào,lù # ä�¡ 0x4362:wú,wÇ” # ä�¢ 0x4363:léi # ä�£ 0x4364:jÇ� # ä�¤ 0x4365:lèi,lì # ä�¥ 0x4366:lí # ä�¦ 0x4368:bó,fèi # ä�¨ 0x4369:ÇŽng,yÇŽng # ä�© 0x436a:kuì,wà # ä�ª 0x436b:tuó # ä�« 0x436e:zhào # ä�® 0x436f:guÇ�,jì # ä�¯ 0x4371:xú # ä�± 0x4372:nái,ní,nì # ä�² 0x4373:chuò,jué,què # ä�³ 0x4374:duò,ruí,wÄ›i,wèi # ä�´ 0x4376:dòng # ä�¶ 0x4377:guì,huì,wÄ›i # ä�· 0x4378:bó # ä�¸ 0x437a:huán # ä�º 0x437b:xuÇŽn # ä�» 0x437c:cán # ä�¼ 0x437d:lì # ä�½ 0x437e:tuí,yÇŽn # ä�¾ 0x437f:huáng # ä�¿ 0x4380:xuè,yuè # 䎀 0x4381:hú # äŽ� 0x4382:bÇŽo # 䎂 0x4383:rÇŽn # 䎃 0x4384:tiáo # 䎄 0x4385:fù,luò,pò # 䎅 0x4386:liào # 䎆 0x4388:yì # 䎈 0x4389:shù,yù # 䎉 0x438a:pò # 䎊 0x438b:hè,kào # 䎋 0x438c:cù # 䎌 0x438e:nà # 䎎 0x438f:àn,hán # äŽ� 0x4390:chÇŽo # äŽ� 0x4391:lù # 䎑 0x4392:zhÇŽn # 䎒 0x4393:tà # 䎓 0x4397:qiáo # 䎗 0x4398:sù # 䎘 0x439a:guàn,huì # 䎚 0x439d:chú,zhù # äŽ� 0x439f:ér,nuò # 䎟 0x43a0:ér,nuó # 䎠 0x43a1:nuÇŽn,ruÇŽn # 䎡 0x43a2:qÇ� # 䎢 0x43a3:sì,xìn # 䎣 0x43a4:chú,jú # 䎤 0x43a6:yÇŽn # 䎦 0x43a7:bàng,póu # 䎧 0x43a8:àn,yè # 䎨 0x43aa:nè # 䎪 0x43ab:chuàng,zÇ’ng # 䎫 0x43ac:bÄ“i,bà # 䎬 0x43ae:tì # 䎮 0x43af:hàn # 䎯 0x43b0:zuó # 䎰 0x43b1:bÄ“i,bà # 䎱 0x43b2:zhé # 䎲 0x43b3:wà,yuè # 䎳 0x43b4:shèng # 䎴 0x43b5:bì # 䎵 0x43b6:èr # 䎶 0x43b7:zhù # 䎷 0x43b8:wù # 䎸 0x43b9:wén # 䎹 0x43ba:zhÇ�,zhì # 䎺 0x43bb:zhÇ’u # 䎻 0x43bc:lù # 䎼 0x43bd:wén,wèn # 䎽 0x43be:gÇ”n # 䎾 0x43bf:qiú,xiòng # 䎿 0x43c0:là # ä�€ 0x43c1:zÇŽi # ä�� 0x43c2:sÇ’u # ä�‚ 0x43c3:mián # ä�ƒ 0x43c4:zhì # ä�„ 0x43c5:qì # ä�… 0x43c6:cáo # ä�† 0x43c7:piào # ä�‡ 0x43c8:lián # ä�ˆ 0x43ca:lóng # ä�Š 0x43cb:sù # ä�‹ 0x43cc:qì,yì # ä�Œ 0x43cd:yuàn # ä�� 0x43ce:féng,hàn # ä�Ž 0x43d0:jué,zhuò # ä�� 0x43d1:dì,zhì # ä�‘ 0x43d2:piàn # ä�’ 0x43d3:guÇŽn # ä�“ 0x43d4:niÇ” # ä�” 0x43d5:rÄ›n,rùn # ä�• 0x43d6:zhèn # ä�– 0x43d7:gài,kuì # ä�— 0x43d8:pÇ�,pì # ä�˜ 0x43d9:tÇŽn # ä�™ 0x43da:chÇŽo,miÇŽo # ä�š 0x43db:chÇ”n # ä�› 0x43dd:chún,zhuÇŽn # ä�� 0x43de:mò # ä�ž 0x43df:biè,bié # ä�Ÿ 0x43e0:qì # ä�  0x43e1:shì # ä�¡ 0x43e2:bÇ� # ä�¢ 0x43e3:jué,qù,qÅ« # ä�£ 0x43e4:sì # ä�¤ 0x43e6:huá,tián,wÇŽn # ä�¦ 0x43e7:ná # ä�§ 0x43e8:huÇ� # ä�¨ 0x43ea:èr # ä�ª 0x43ec:móu # ä�¬ 0x43ee:xí,xié # ä�® 0x43ef:zhì # ä�¯ 0x43f0:rÄ›n,chÇ”n # ä�° 0x43f1:jú # ä�± 0x43f2:dié # ä�² 0x43f3:zhè # ä�³ 0x43f4:shào,shè # ä�´ 0x43f5:mÄ›ng # ä�µ 0x43f6:bì # ä�¶ 0x43f7:hàn # ä�· 0x43f8:yú # ä�¸ 0x43f9:xiàn # ä�¹ 0x43fb:néng # ä�» 0x43fc:cán # ä�¼ 0x43fd:bù # ä�½ 0x43ff:qÇ� # ä�¿ 0x4400:jì # ä�€ 0x4401:niÇŽo,zhuó # ä�� 0x4402:lù # ä�‚ 0x4403:jiÇ’ng # ä�ƒ 0x4404:hàn,liÇŽn,xiàn # ä�„ 0x4405:yí # ä�… 0x4406:cÇŽi,cài # ä�† 0x4407:chún # ä�‡ 0x4408:zhí # ä�ˆ 0x4409:zì # ä�‰ 0x440a:dá,hún,hùn # ä�Š 0x440c:tiÇŽn,zhòu # ä�Œ 0x440d:zhòu # ä�� 0x440f:chÇ”n # ä�� 0x4411:zhé # ä�‘ 0x4413:róu,rù # ä�“ 0x4414:bìn # ä�” 0x4415:jí # ä�• 0x4416:yí # ä�– 0x4417:dÇ” # ä�— 0x4418:jué # ä�˜ 0x4419:gé,yì # ä�™ 0x441a:jí,jì # ä�š 0x441d:suÇ’,suò # ä�� 0x441e:ruò # ä�ž 0x441f:xiàng # ä�Ÿ 0x4420:huÇŽng # ä�  0x4421:qí # ä�¡ 0x4422:zhù # ä�¢ 0x4423:cuò,sÇ”n # ä�£ 0x4424:chí,cuó,qì,zhàn # ä�¤ 0x4425:wÄ›ng # ä�¥ 0x4427:kào # ä�§ 0x4428:gÇ” # ä�¨ 0x4429:kÇŽi # ä�© 0x442a:fàn,juÇŽn # ä�ª 0x442c:cáo # ä�¬ 0x442d:zhì # ä�­ 0x442e:chÇŽn # ä�® 0x442f:léi # ä�¯ 0x4432:zhé # ä�² 0x4433:yú # ä�³ 0x4434:guì # ä�´ 0x4435:huáng # ä�µ 0x4436:jÇ�n # ä�¶ 0x4438:guó,huò # ä�¸ 0x4439:sào,sÅ�u # ä�¹ 0x443a:tàn # ä�º 0x443c:xì # ä�¼ 0x443d:mán # ä�½ 0x443e:duó # ä�¾ 0x443f:áo,ÇŽo # ä�¿ 0x4440:pì # ä‘€ 0x4441:wù # ä‘� 0x4442:ÇŽi,xì # ä‘‚ 0x4443:méng # 䑃 0x4444:pì,yì # ä‘„ 0x4445:méng # ä‘… 0x4446:yÇŽng # 䑆 0x4447:zhì # 䑇 0x4448:bó # 䑈 0x4449:yíng # 䑉 0x444a:wéi,wèi # 䑊 0x444b:náo,rÇŽng # ä‘‹ 0x444c:lán # 䑌 0x444d:yàn,yÇ�ng # ä‘� 0x444e:chÇŽn # 䑎 0x444f:quán # ä‘� 0x4450:zhÄ›n # ä‘� 0x4451:pú # ä‘‘ 0x4453:tái,tÇŽi # ä‘“ 0x4454:fèi # ä‘” 0x4455:shÇ” # ä‘• 0x4457:dàng # ä‘— 0x4458:chá,cuó # 䑘 0x4459:rán # ä‘™ 0x445a:tián # 䑚 0x445b:chÇ�,shì,yì # ä‘› 0x445c:tà # 䑜 0x445d:jiÇŽ # ä‘� 0x445e:shùn # 䑞 0x445f:huáng # 䑟 0x4460:liÇŽo # ä‘  0x4464:jìn,jìng # 䑤 0x4465:è,sà # ä‘¥ 0x4467:fú # ä‘§ 0x4468:duò # 䑨 0x446a:è # 䑪 0x446c:yào # 䑬 0x446d:dì,zhì # ä‘­ 0x446f:dì # 䑯 0x4470:bù # ä‘° 0x4471:mán,wÇŽn # 䑱 0x4472:chè,zhái,zhào # 䑲 0x4473:lún # 䑳 0x4474:qí # ä‘´ 0x4475:mù # 䑵 0x4476:cán,qiàn # ä‘¶ 0x447b:yóu # ä‘» 0x447d:dá,tà # 䑽 0x447f:sù # ä‘¿ 0x4480:fú # ä’€ 0x4481:jì,xí,xiào,yà # ä’� 0x4482:jiÇŽng,xiÇŽng # ä’‚ 0x4483:zào # ä’ƒ 0x4484:bó,fù # ä’„ 0x4485:téng # ä’… 0x4486:chè # ä’† 0x4487:fù # ä’‡ 0x4488:bÇ”,fèi # ä’ˆ 0x4489:wÇ” # ä’‰ 0x448b:yÇŽng # ä’‹ 0x448c:mìng # ä’Œ 0x448d:pÇŽng # ä’� 0x448e:mÇŽng # ä’Ž 0x4490:méng # ä’� 0x4491:cÇŽo # ä’‘ 0x4492:tiáo,yÇŽo,yóu # ä’’ 0x4493:kÇŽi # ä’“ 0x4494:bài # ä’” 0x4495:xiÇŽo # ä’• 0x4496:xìn # ä’– 0x4497:qì # ä’— 0x449a:shÇŽo # ä’š 0x449b:héng,huàn # ä’› 0x449c:niú # ä’œ 0x449d:xiáo # ä’� 0x449e:chén # ä’ž 0x44a0:fÄ“ng,xiá # ä’  0x44a1:yÇ�n # ä’¡ 0x44a2:áng,yìng # ä’¢ 0x44a3:rÇŽn # ä’£ 0x44a4:rì # ä’¤ 0x44a5:fà,liÇ”,mán # ä’¥ 0x44a6:fàn # ä’¦ 0x44a7:qù # ä’§ 0x44a8:shÇ� # ä’¨ 0x44a9:hé,xiá # ä’© 0x44aa:biàn # ä’ª 0x44ab:dài # ä’« 0x44ac:mò # ä’¬ 0x44ad:dÄ›ng # ä’­ 0x44b2:chà # ä’² 0x44b3:duÇ’ # ä’³ 0x44b4:yÇ’u # ä’´ 0x44b5:hào # ä’µ 0x44b8:xián,xuè,yuè # ä’¸ 0x44b9:lèi # ä’¹ 0x44ba:jÇ�n # ä’º 0x44bb:qÇ� # ä’» 0x44bd:méi,wÇŽng # ä’½ 0x44c2:yán # ä“‚ 0x44c3:yì # 䓃 0x44c4:yín # ä“„ 0x44c5:qí # ä“… 0x44c6:zhé # 䓆 0x44c7:xì # 䓇 0x44c8:yì # 䓈 0x44c9:yé # 䓉 0x44ca:è,wú,yú # 䓊 0x44cc:zhì # 䓌 0x44cd:hÇŽn # ä“� 0x44ce:chuò # 䓎 0x44d0:chún # ä“� 0x44d1:bÇ�ng,píng # ä“‘ 0x44d2:kuÇŽi # ä“’ 0x44d3:chóu # ä““ 0x44d5:tuÇ’,wÄ›i # ä“• 0x44d6:qióng # ä“– 0x44d8:jiù # 䓘 0x44da:cú # 䓚 0x44db:fÇ”,gÇ”,qÅ« # ä“› 0x44dd:méng,mèng # ä“� 0x44de:lì # 䓞 0x44df:liè # 䓟 0x44e0:tà # ä“  0x44e2:gù # ä“¢ 0x44e3:liÇŽng # ä“£ 0x44e5:là # ä“¥ 0x44e6:diÇŽn # 䓦 0x44e7:cì,jí # ä“§ 0x44eb:jì,qí # ä“« 0x44ed:chà # ä“­ 0x44ee:mào # ä“® 0x44ef:dú # 䓯 0x44f1:chái,zhài # 䓱 0x44f2:ruì,sà # 䓲 0x44f3:hÄ›n # 䓳 0x44f4:ruán,ruÇŽn # ä“´ 0x44f6:lài # ä“¶ 0x44f7:xìng # ä“· 0x44f9:yì # 䓹 0x44fa:mÄ›i,wèi # 䓺 0x44fc:hè,máng # 䓼 0x44fd:jì # 䓽 0x44ff:hÇŽn,hàn # ä“¿ 0x4501:lì # ä”� 0x4502:zÇ� # 䔂 0x4503:zÇ” # 䔃 0x4504:yáo # 䔄 0x4506:lí # 䔆 0x4507:qÇ�,yÇ� # 䔇 0x4508:gÇŽn,gòng,nÇ’u # 䔈 0x4509:lì # 䔉 0x450e:sù # 䔎 0x450f:chòu # ä”� 0x4511:xié,yé # 䔑 0x4512:bèi # ä”’ 0x4513:xÇ” # 䔓 0x4514:jìng,qiÇŽn,qiú,yÇ�ng # ä”” 0x4515:pú # 䔕 0x4516:líng # ä”– 0x4517:xiáng # ä”— 0x4518:zuò # 䔘 0x4519:diào # ä”™ 0x451a:chún # 䔚 0x451b:qÇ�ng # ä”› 0x451c:nán # 䔜 0x451e:lÇœ # 䔞 0x451f:chí,chÇ�,yí # 䔟 0x4520:shÇŽo # ä”  0x4521:yú # 䔡 0x4522:huá,huà # 䔢 0x4523:lí # 䔣 0x4527:lí,lì # ä”§ 0x452a:duì,shuÇŽng # 䔪 0x452c:yì # 䔬 0x452d:nìng,zhÇ’u # ä”­ 0x452f:hú,huà,kù # 䔯 0x4530:fú,fù # ä”° 0x4532:chéng,zhuó # 䔲 0x4533:nÇŽn,rán # 䔳 0x4534:cè,cuì # ä”´ 0x4536:tí # ä”¶ 0x4537:qín # ä”· 0x4538:biÇŽo # 䔸 0x4539:suì # 䔹 0x453a:wéi # 䔺 0x453c:sè # 䔼 0x453d:ài # 䔽 0x453e:è,qì,zè # 䔾 0x453f:jiè,zÇ”n # 䔿 0x4540:kuÇŽn # ä•€ 0x4541:fÄ›i # ä•� 0x4543:yìn # 䕃 0x4545:sÇŽo # ä•… 0x4546:dòu # 䕆 0x4547:huì # 䕇 0x4548:xiè # 䕈 0x4549:zé # 䕉 0x454a:tán # 䕊 0x454b:chÇŽng,táng # ä•‹ 0x454c:zhì # 䕌 0x454d:yì # ä•� 0x454e:fú # 䕎 0x454f:é # ä•� 0x4551:jùn # ä•‘ 0x4553:chá,chuì # ä•“ 0x4554:xián # ä•” 0x4555:màn # ä•• 0x4557:bì,pèi # ä•— 0x4558:líng # 䕘 0x4559:jié # ä•™ 0x455a:kuì # 䕚 0x455b:jiá # ä•› 0x455e:làng,liáo # 䕞 0x4560:fèi # ä•  0x4561:lǘ # ä•¡ 0x4562:zhÇŽ # ä•¢ 0x4563:hé,kÄ›,shé # ä•£ 0x4565:nÇ�,yí # ä•¥ 0x4566:yíng # 䕦 0x4567:xiào # ä•§ 0x4568:téng # 䕨 0x4569:lÇŽo # ä•© 0x456a:zé # 䕪 0x456b:kuí # ä•« 0x456d:qián # ä•­ 0x456e:jú # ä•® 0x456f:piáo # 䕯 0x4570:bàn,fán,fàn # ä•° 0x4571:dÇ’u,dòu,tóu # 䕱 0x4572:lÇ�n # 䕲 0x4573:mí # 䕳 0x4574:zhuó # ä•´ 0x4575:xié,xiè # 䕵 0x4576:hù # ä•¶ 0x4577:mí # ä•· 0x4579:zá # 䕹 0x457a:cóng # 䕺 0x457b:gé,lì,lí # ä•» 0x457c:nán,nàn,rán # 䕼 0x457d:zhú # 䕽 0x457e:yán,yín # 䕾 0x457f:hàn # ä•¿ 0x4581:yì # ä–� 0x4582:luán # ä–‚ 0x4583:yuè # ä–ƒ 0x4584:rán # ä–„ 0x4585:líng # ä–… 0x4586:niàng # ä–† 0x4587:yù # ä–‡ 0x4588:nüè # ä–ˆ 0x458a:yí,yì # ä–Š 0x458b:nüè # ä–‹ 0x458c:qín,yá,yì # ä–Œ 0x458d:qián # ä–� 0x458e:xiá # ä–Ž 0x458f:chÇ” # ä–� 0x4590:jìn,yín # ä–� 0x4591:mì # ä–‘ 0x4593:nà # ä–“ 0x4594:hàn,kÇŽn # ä–” 0x4595:zÇ” # ä–• 0x4596:xiá # ä–– 0x4597:yán,yàn # ä–— 0x4598:tú # ä–˜ 0x459b:suÇ’ # ä–› 0x459c:yín,yìn # ä–œ 0x459d:chóng # ä–� 0x459e:zhÇ’u # ä–ž 0x459f:mÇŽng,méng # ä–Ÿ 0x45a0:yuán # ä–  0x45a1:nÇœ # ä–¡ 0x45a2:miáo # ä–¢ 0x45a3:zÇŽo # ä–£ 0x45a4:wÇŽn,yuán # ä–¤ 0x45a5:máo # ä–¥ 0x45a7:nà # ä–§ 0x45a8:shí # ä–¨ 0x45a9:bì,pì # ä–© 0x45aa:cí # ä–ª 0x45ab:bàng # ä–« 0x45ad:juàn # ä–­ 0x45ae:xiÇŽng # ä–® 0x45af:kuí,wÄ� # ä–¯ 0x45b0:pài # ä–° 0x45b2:xún # ä–² 0x45b3:zhà # ä–³ 0x45b4:yáo # ä–´ 0x45b8:é # ä–¸ 0x45b9:yáng # ä–¹ 0x45ba:tiáo,zhào # ä–º 0x45bb:yóu # ä–» 0x45bc:jué,xuè # ä–¼ 0x45bd:lí # ä–½ 0x45bf:lí # ä–¿ 0x45c1:jì,qÄ« # ä—� 0x45c2:hÇ” # ä—‚ 0x45c3:zhàn # ä—ƒ 0x45c4:fÇ”,pì # ä—„ 0x45c5:cháng # ä—… 0x45c6:guÇŽn,wÄ›i # ä—† 0x45c7:jú,qú # ä—‡ 0x45c8:méng # ä—ˆ 0x45ca:chéng,tàn # ä—Š 0x45cb:móu # ä—‹ 0x45cd:lÇ� # ä—� 0x45d1:yì # ä—‘ 0x45d2:bìng # ä—’ 0x45d4:hóu # ä—” 0x45d5:wÇŽn # ä—• 0x45d6:dì # ä—– 0x45d8:gé,kè # ä—˜ 0x45d9:hán # ä—™ 0x45da:bó # ä—š 0x45dc:liú # ä—œ 0x45dd:cán # ä—� 0x45de:cán,chÄ›n,shÇŽn,yÇ�n,zàn,zhàn # ä—ž 0x45df:yì # ä—Ÿ 0x45e0:xuán # ä—  0x45e1:yán # ä—¡ 0x45e2:zÇŽo # ä—¢ 0x45e3:gÇŽo,hàn # ä—£ 0x45e4:yóng # ä—¤ 0x45e8:yú # ä—¨ 0x45ea:zhè # ä—ª 0x45eb:má # ä—« 0x45ee:shuÇŽng # ä—® 0x45ef:jìn # ä—¯ 0x45f0:guàn # ä—° 0x45f1:pú # ä—± 0x45f2:lìn # ä—² 0x45f4:tíng # ä—´ 0x45f6:là,lì # ä—¶ 0x45f7:yì # ä—· 0x45f9:cì # ä—¹ 0x45fa:yÇŽn # ä—º 0x45fb:jié # ä—» 0x45fd:wèi # ä—½ 0x45fe:xiÇŽn # ä—¾ 0x45ff:níng # ä—¿ 0x4600:fù # 䘀 0x4601:gé,jié,kÄ› # ä˜� 0x4603:mò # 䘃 0x4604:fù,zhù # 䘄 0x4605:nái,nài,nÄ›ng # 䘅 0x4606:xiÇŽn # 䘆 0x4607:wén,wèn # 䘇 0x4608:lì # 䘈 0x4609:cán # 䘉 0x460a:miè # 䘊 0x460c:nì # 䘌 0x460d:chài # ä˜� 0x460f:xù # ä˜� 0x4610:nÇœ # ä˜� 0x4611:mài,mò # 䘑 0x4613:kàn,kào # 䘓 0x4615:háng # 䘕 0x4618:yù # 䘘 0x4619:wèi # 䘙 0x461a:zú # 䘚 0x461d:yì # ä˜� 0x4620:fú,pò # 䘠 0x4621:bÇ� # 䘡 0x4622:zhÇ” # 䘢 0x4623:zÇ� # 䘣 0x4624:shù # 䘤 0x4625:xiá,jiá # 䘥 0x4626:ní,nÇ� # 䘦 0x4628:jiÇŽo # 䘨 0x4629:xuàn,xún # 䘩 0x462b:nòu,rú # 䘫 0x462c:róng # 䘬 0x462d:dié,zhì # 䘭 0x462e:sà,sàng,xì # 䘮 0x4631:yù # 䘱 0x4635:lù # 䘵 0x4636:hàn,yÇŽn # 䘶 0x4638:yì # 䘸 0x4639:zuì # 䘹 0x463a:zhàn # 䘺 0x463b:sù,yù # 䘻 0x463c:wÇŽn # 䘼 0x463d:ní,nÇ�,nì # 䘽 0x463e:guÇŽn # 䘾 0x463f:jué # 䘿 0x4640:bÄ›ng # 䙀 0x4641:cán # ä™� 0x4643:duò,kuò,pán,ruán # 䙃 0x4644:qì,zhÇŽ # 䙄 0x4645:yào # ä™… 0x4646:guì,kuì # 䙆 0x4647:nuÇŽn,ruán # 䙇 0x4648:hóu # 䙈 0x4649:xún,zÇŽn # 䙉 0x464a:xiè # 䙊 0x464c:huì,kuì # 䙌 0x464e:xié # 䙎 0x464f:bó # ä™� 0x4650:kè # ä™� 0x4652:xù # ä™’ 0x4653:bÇŽi # 䙓 0x4655:chù,zÇ’ng # 䙕 0x4657:tì # ä™— 0x4658:chÇ”,zú # 䙘 0x4659:chí # ä™™ 0x465a:niÇŽo # 䙚 0x465b:guàn,gÇ”n # ä™› 0x465c:féng # 䙜 0x465d:xiè,dié # ä™� 0x465f:duò,wéi # 䙟 0x4660:jué,wò # ä™  0x4661:huì,kuì # 䙡 0x4662:zèng # 䙢 0x4663:sà # 䙣 0x4664:duÇ’,duò # 䙤 0x4665:líng # 䙥 0x4666:méng # 䙦 0x4668:guÇ’,luÇ’ # 䙨 0x4669:méng # 䙩 0x466a:lóng,màng,pàn # 䙪 0x466c:yìng # 䙬 0x466e:guàn # ä™® 0x466f:cù,zhuó # 䙯 0x4670:lí # ä™° 0x4671:dú,shÇ” # ä™± 0x4673:è # 䙳 0x4677:dé,zhé # ä™· 0x4678:dé,de # 䙸 0x4679:jiÇŽng,nÇŽo,xiàn,xiÇŽng # 䙹 0x467a:lián,liÇŽn,qiÇŽn # 䙺 0x467c:shào # 䙼 0x467d:xì,xié # 䙽 0x467f:wèi # 䙿 0x4682:hè,xì # äš‚ 0x4683:yóu # 䚃 0x4684:lù # äš„ 0x4685:lái,lài # äš… 0x4686:Ç’u,yÇŽo,yÇ�ng # 䚆 0x4687:shÄ›ng,zhì # 䚇 0x4688:juàn,wù,zhuàn # 䚈 0x4689:qì,xì # 䚉 0x468b:yùn # äš‹ 0x468d:qì # äš� 0x468f:lèng,lì,lìn # äš� 0x4690:jí # äš� 0x4691:mái # äš‘ 0x4692:chuáng,zhuàng # äš’ 0x4693:niÇŽn,shÄ›n # äš“ 0x4695:lì,luán # äš• 0x4696:líng # äš– 0x4698:chén,chéng # 䚘 0x469a:xiÇŽn # äšš 0x469b:hú # äš› 0x469d:zú # äš� 0x469e:dÇŽi # äšž 0x469f:dÇŽi # 䚟 0x46a0:hùn # äš  0x46a2:chè # 䚢 0x46a3:tí,tì # 䚣 0x46a5:nuò # 䚥 0x46a6:zhì # 䚦 0x46a7:liú # äš§ 0x46a8:fèi # 䚨 0x46a9:jiÇŽo,jiào # äš© 0x46ab:áo,xí # äš« 0x46ac:lín # 䚬 0x46ae:réng # äš® 0x46af:tÇŽo,zhèn # 䚯 0x46b0:pÇ� # äš° 0x46b1:xìn # äš± 0x46b2:shàn # äš² 0x46b3:xiè,zhì # äš³ 0x46b4:wà # äš´ 0x46b5:tÇ’u # äšµ 0x46b7:xì,yÇ�,yì # äš· 0x46b8:xiè # 䚸 0x46b9:pÇ� # äš¹ 0x46ba:yáo # 䚺 0x46bb:yáo,yóu # äš» 0x46bc:nÇœ # äš¼ 0x46bd:hào # äš½ 0x46be:nín,rén # äš¾ 0x46bf:yìn # äš¿ 0x46c0:fÇŽn # 䛀 0x46c1:nán # ä›� 0x46c2:chí,chÇ� # 䛂 0x46c3:wàng # 䛃 0x46c4:yuÇŽn # 䛄 0x46c5:xiá # ä›… 0x46c6:zhòu # 䛆 0x46c7:yuÇŽn # 䛇 0x46c8:shì # 䛈 0x46c9:mì,miàn # 䛉 0x46cb:gé,jì # 䛋 0x46cc:páo,táo # 䛌 0x46cd:fèi # ä›� 0x46ce:hù,xuè,yù # 䛎 0x46cf:ní # ä›� 0x46d0:cí # ä›� 0x46d1:mì # 䛑 0x46d2:biàn # ä›’ 0x46d4:ná # ä›” 0x46d5:yù # 䛕 0x46d6:è,yì # ä›– 0x46d7:zhÇ� # ä›— 0x46d8:nín,rén # 䛘 0x46d9:xù # ä›™ 0x46da:lüè # 䛚 0x46db:huì,qì # ä›› 0x46dc:xùn # 䛜 0x46dd:náo # ä›� 0x46de:hÇŽn,hàn # 䛞 0x46df:jiá # 䛟 0x46e0:dòu,xiáng # ä›  0x46e1:huà # 䛡 0x46e4:cù # 䛤 0x46e5:xì # 䛥 0x46e6:sòng # 䛦 0x46e7:mí # ä›§ 0x46e8:xìn # 䛨 0x46e9:wù # 䛩 0x46ea:qióng,wÄ›i # 䛪 0x46eb:zhèng # 䛫 0x46ec:táo # 䛬 0x46ed:xìng # ä›­ 0x46ee:jiù # ä›® 0x46ef:jù # 䛯 0x46f0:hún,hùn # ä›° 0x46f1:tí # ä›± 0x46f2:mán,màn # 䛲 0x46f3:jiÇŽn,yàn # 䛳 0x46f4:qÇ� # ä›´ 0x46f5:shòu # 䛵 0x46f6:lÄ›i # ä›¶ 0x46f7:wÇŽn # ä›· 0x46f8:chè,shÇŽn # 䛸 0x46f9:càn # 䛹 0x46fa:jiè # 䛺 0x46fb:yòu # ä›» 0x46fc:huÇ� # 䛼 0x46fd:zhÇŽ # 䛽 0x46fe:sù # 䛾 0x46ff:gé # 䛿 0x4700:nÇŽo # 䜀 0x4701:xì # äœ� 0x4704:chí # 䜄 0x4705:wéi # 䜅 0x4706:mò,nèi,shé,suì,zhé # 䜆 0x4707:gÇ”n,gùn # 䜇 0x470a:zÄ�o,zào # 䜊 0x470b:huì # 䜋 0x470c:luán # 䜌 0x470d:liáo # äœ� 0x470e:láo,lào # 䜎 0x4711:qià,wù # 䜑 0x4712:ào # 䜒 0x4713:niè,shè # 䜓 0x4714:suí # 䜔 0x4715:mài # 䜕 0x4716:tàn # 䜖 0x4717:xìn # 䜗 0x4718:jÇ�ng # 䜘 0x4719:án # 䜙 0x471a:tà # 䜚 0x471b:chán,chàn # 䜛 0x471c:wèi # 䜜 0x471d:tuÇŽn # äœ� 0x471e:jì # 䜞 0x471f:chén,chèn # 䜟 0x4720:chè,zhì # 䜠 0x4721:xù,xuè,yù # 䜡 0x4722:xiÇŽn # 䜢 0x4723:xÄ«,xÄ«n,yín # 䜣 0x4727:nÇŽo # 䜧 0x4729:yàn # 䜩 0x472a:qiú # 䜪 0x472b:hóng # 䜫 0x472c:sÇ’ng,xiù # 䜬 0x472d:jùn # 䜭 0x472e:liáo # 䜮 0x472f:jú # 䜯 0x4731:mÇŽn # 䜱 0x4732:liè # 䜲 0x4734:chù,shì # 䜴 0x4735:chÇ�,shì # 䜵 0x4736:xiáng # 䜶 0x4738:mÄ›i # 䜸 0x4739:shù # 䜹 0x473a:cè # 䜺 0x473b:chÇ�,shì # 䜻 0x473c:gú # 䜼 0x473d:yú # 䜽 0x4740:liáo,liú # ä�€ 0x4741:láo # ä�� 0x4742:shù # ä�‚ 0x4743:zhé # ä�ƒ 0x4748:è # ä�ˆ 0x474a:shà # ä�Š 0x474b:zòng # ä�‹ 0x474c:jué,jùn # ä�Œ 0x474d:jùn # ä�� 0x474f:lóu,lÇ’u # ä�� 0x4750:wéi # ä�� 0x4752:zhù # ä�’ 0x4753:là,liè # ä�“ 0x4755:zhé # ä�• 0x4756:zhÇŽo # ä�– 0x4758:yì # ä�˜ 0x475a:ní # ä�š 0x475d:yÇ� # ä�� 0x475e:hào # ä�ž 0x475f:yà,yè # ä�Ÿ 0x4760:huán,yuán # ä�  0x4761:màn # ä�¡ 0x4762:màn,méng # ä�¢ 0x4763:qú # ä�£ 0x4764:lÇŽo,liáo # ä�¤ 0x4765:háo # ä�¥ 0x4767:mén,mín # ä�§ 0x4768:xián # ä�¨ 0x4769:zhèn # ä�© 0x476a:shú,shÇ” # ä�ª 0x476b:zuó # ä�« 0x476c:zhù # ä�¬ 0x476d:gòu # ä�­ 0x476e:xuàn # ä�® 0x476f:yì # ä�¯ 0x4770:tí,zhì # ä�° 0x4772:jìn # ä�² 0x4773:cán # ä�³ 0x4775:bù # ä�µ 0x4776:liáng # ä�¶ 0x4777:zhì # ä�· 0x4778:jì # ä�¸ 0x4779:wÇŽn,yuàn # ä�¹ 0x477a:guàn # ä�º 0x477c:qíng # ä�¼ 0x477d:ài # ä�½ 0x477e:fù # ä�¾ 0x477f:guì # ä�¿ 0x4780:gòu,hòu,mÇ�n # 䞀 0x4781:xiàn,yàn,yÇŽng,yàng # äž� 0x4782:ruÇŽn # äž‚ 0x4783:zhì # 䞃 0x4784:biào # äž„ 0x4785:yí # äž… 0x4786:suÇ’ # 䞆 0x4787:dié,zhì # 䞇 0x4788:guÇ�,guì # 䞈 0x4789:shèng # 䞉 0x478a:xùn # 䞊 0x478b:chèn # äž‹ 0x478c:shé # 䞌 0x478d:qíng # äž� 0x4790:chÇ”n,shÇ”n # äž� 0x4791:hóng # äž‘ 0x4792:dòng # äž’ 0x4793:chÄ“ng # äž“ 0x4794:wÄ›i # äž” 0x4795:dié,nÇŽ,niè,rú,xiè,yú # äž• 0x4796:shÇ” # äž– 0x4798:jí # 䞘 0x4799:zá # äž™ 0x479a:qí # äžš 0x479c:fù # äžœ 0x479d:ÇŽo,yù # äž� 0x479e:fú # äžž 0x479f:pò # 䞟 0x47a1:tÇŽn # äž¡ 0x47a2:zhà,zuó # 䞢 0x47a3:chÄ›,chè,qiè # 䞣 0x47a4:qú # 䞤 0x47a5:yòu # 䞥 0x47a6:hé,jié # 䞦 0x47a7:hòu # äž§ 0x47a8:guÇ�,kuÇ� # 䞨 0x47a9:è,ruí # äž© 0x47aa:jiàng # 䞪 0x47ab:yÇ”n # äž« 0x47ac:tòu # 䞬 0x47ad:qiÇ”,qÅ«n # äž­ 0x47af:fù # 䞯 0x47b0:zuó # äž° 0x47b1:hú # äž± 0x47b3:bó,fèi # äž³ 0x47b5:juÄ› # äžµ 0x47b6:dì,tì # äž¶ 0x47b7:jué # äž· 0x47b8:fù # 䞸 0x47b9:huáng # äž¹ 0x47bb:yÇ’ng # äž» 0x47bc:chuÇ�,cuàn,jiàn,mèi # äž¼ 0x47bd:suÇ’ # äž½ 0x47be:chí # äž¾ 0x47c2:mán # 䟂 0x47c3:cà,zàn # 䟃 0x47c4:qì,zuó # 䟄 0x47c5:jiàn,zàn # 䟅 0x47c6:bì,bó # 䟆 0x47c8:zhí # 䟈 0x47c9:zhú # 䟉 0x47ca:qú # 䟊 0x47cb:zhÇŽn,zhàn # 䟋 0x47cc:jí,jié # 䟌 0x47cd:dián # äŸ� 0x47cf:lì # äŸ� 0x47d0:lì # äŸ� 0x47d1:lÇŽ,yuè # 䟑 0x47d2:quán # 䟒 0x47d4:fù # 䟔 0x47d5:chà # 䟕 0x47d6:tàng # 䟖 0x47d7:shì # 䟗 0x47d8:hàng # 䟘 0x47d9:qiè # 䟙 0x47da:qí # 䟚 0x47db:bó # 䟛 0x47dc:nà # 䟜 0x47dd:tòu # äŸ� 0x47de:chú # 䟞 0x47df:cù # 䟟 0x47e0:yuè # 䟠 0x47e1:dì # 䟡 0x47e2:chén,jiàn,niÇŽn # 䟢 0x47e3:chù # 䟣 0x47e4:bì # 䟤 0x47e5:máng,méng # 䟥 0x47e6:bá,bó,yuán # 䟦 0x47e7:tián # 䟧 0x47e8:mín # 䟨 0x47e9:liÄ› # 䟩 0x47ea:fÄ›ng # 䟪 0x47ec:qiù # 䟬 0x47ed:tiáo # 䟭 0x47ee:fú # 䟮 0x47ef:kuò # 䟯 0x47f0:jiÇŽn # 䟰 0x47f4:zhèn # 䟴 0x47f5:qiú # 䟵 0x47f6:cuò,zuò # 䟶 0x47f7:chì,qì # 䟷 0x47f8:kuí # 䟸 0x47f9:liè,lìn # 䟹 0x47fa:bÇŽng,bèi,pèi # 䟺 0x47fb:dù # 䟻 0x47fc:wÇ” # 䟼 0x47fe:juÄ›,zhuó # 䟾 0x47ff:lù # 䟿 0x4800:chÇŽng # ä € 0x4802:chú,chÇ” # ä ‚ 0x4803:liÇŽng # ä ƒ 0x4804:tiÇŽn # ä „ 0x4805:kÇ”n,tà # ä … 0x4806:cháng # ä † 0x4807:jué # ä ‡ 0x4808:tú # ä ˆ 0x4809:huà,huàn,huÇ� # ä ‰ 0x480a:fèi # ä Š 0x480b:bÇ�,bì,mà # ä ‹ 0x480d:qiá,xiÄ� # ä � 0x480e:wò # ä Ž 0x480f:jì # ä � 0x4810:qù # ä � 0x4811:kuÇ� # ä ‘ 0x4812:hú # ä ’ 0x4813:cù,jiù,qù # ä “ 0x4814:suì # ä ” 0x4817:qiù # ä — 0x4818:pì # ä ˜ 0x4819:bèi,páng,páo # ä ™ 0x481a:wà # ä š 0x481b:jiÇŽo,xiào,yáo # ä › 0x481c:róng # ä œ 0x481e:cù,qí # ä ž 0x481f:dié,shè # ä Ÿ 0x4820:chì # ä   0x4821:cuó # ä ¡ 0x4822:mèng # ä ¢ 0x4823:xuÇŽn,xuàn # ä £ 0x4824:duÇ’,duò # ä ¤ 0x4825:bié # ä ¥ 0x4826:zhè,zhì # ä ¦ 0x4827:chú # ä § 0x4828:chàn,mà # ä ¨ 0x4829:guì # ä © 0x482a:duàn # ä ª 0x482b:zòu # ä « 0x482c:dèng # ä ¬ 0x482d:lái,lài # ä ­ 0x482e:téng # ä ® 0x482f:yuè # ä ¯ 0x4830:quán # ä ° 0x4831:shÇ”,zhú # ä ± 0x4832:líng # ä ² 0x4834:qÇ�n,yÇ�n,zhÄ›n # ä ´ 0x4835:fù # ä µ 0x4836:shè # ä ¶ 0x4837:tiÇŽo # ä · 0x4839:hái # ä ¹ 0x483b:qióng # ä » 0x483c:diào,shù,xuè,zhú # ä ¼ 0x483d:hái # ä ½ 0x483e:shÇŽn,shàn # ä ¾ 0x483f:wài # ä ¿ 0x4840:zhÇŽn # ä¡€ 0x4841:lÇ’ng # ä¡� 0x4842:jiù # ä¡‚ 0x4843:lì # 䡃 0x4845:mÇ�n,xiÇŽn,xún,zhèn,zuÇŽn,chÅ«n # ä¡… 0x4846:róng,rÇ’ng # 䡆 0x4847:yuè # 䡇 0x4848:jué # 䡈 0x4849:kÇŽng # 䡉 0x484a:fán,fÇŽn,pèi # 䡊 0x484b:qí # ä¡‹ 0x484c:hóng # 䡌 0x484d:fú,fÇ” # ä¡� 0x484e:lú # 䡎 0x484f:hóng # ä¡� 0x4850:tuó # ä¡� 0x4851:mín # ä¡‘ 0x4852:tián # ä¡’ 0x4853:juàn # ä¡“ 0x4854:qÇ� # ä¡” 0x4855:zhÄ›ng # ä¡• 0x4856:jìng # ä¡– 0x4857:gÇ’ng # ä¡— 0x4858:tián # 䡘 0x4859:láng # ä¡™ 0x485a:mào # 䡚 0x485b:yìn # ä¡› 0x485c:lù # 䡜 0x485d:yÇ”n,yuÄ�n # ä¡� 0x485e:jú # 䡞 0x485f:pì # 䡟 0x4861:xié # ä¡¡ 0x4862:biàn # ä¡¢ 0x4865:róng # ä¡¥ 0x4866:sÇŽng # 䡦 0x4867:wÇ” # ä¡§ 0x4868:chà,chái,yín # 䡨 0x4869:gÇ”,hòu,tÇ’u,zhÄ›n,kÄ“ng # ä¡© 0x486a:chán,shàn # 䡪 0x486b:péng # ä¡« 0x486c:màn # 䡬 0x486f:shuàng,zÇ’ng # 䡯 0x4870:kÄ›ng,kÄ“ng # ä¡° 0x4871:zhuÇŽn # 䡱 0x4872:chán # 䡲 0x4874:chuáng,chÅ�ng # ä¡´ 0x4875:suì # 䡵 0x4876:bèi,pì # ä¡¶ 0x4877:kài # ä¡· 0x4879:zhì # 䡹 0x487a:wèi # 䡺 0x487b:mín # ä¡» 0x487c:líng # 䡼 0x487e:nèi,niè # 䡾 0x487f:líng # ä¡¿ 0x4880:qì # 䢀 0x4881:yuè # ä¢� 0x4883:yì # 䢃 0x4884:xÇ�,xÇ� # 䢄 0x4885:chén # 䢅 0x4887:rÇ’ng,rÇ’u # 䢇 0x4888:chén,qín # 䢈 0x4889:nóng # 䢉 0x488a:yóu # 䢊 0x488b:jì # 䢋 0x488c:bó # 䢌 0x488d:fÇŽng,fèn # ä¢� 0x4890:cú # ä¢� 0x4891:dÇ� # 䢑 0x4893:yú # 䢓 0x4894:gé,hé,jiá # 䢔 0x4895:xù # 䢕 0x4896:yù # 䢖 0x4897:hé,qÇ” # 䢗 0x4899:bài # 䢙 0x489a:gòng,háng # 䢚 0x489b:jiÇ’ng # 䢛 0x489d:yà # ä¢� 0x489e:nù,shù # 䢞 0x489f:yóu # 䢟 0x48a0:sòng # 䢠 0x48a1:xiè # 䢡 0x48a2:càng # 䢢 0x48a3:yáo # 䢣 0x48a4:shù # 䢤 0x48a5:yán,yàn # 䢥 0x48a6:shuài # 䢦 0x48a7:liào,lÇ�n,què # 䢧 0x48a9:yù # 䢩 0x48aa:bó,cuì,jiÇŽo,nÇ”,qián # 䢪 0x48ab:suí # 䢫 0x48ad:yàn # 䢭 0x48ae:lèi # 䢮 0x48af:lín # 䢯 0x48b0:tái,tì # 䢰 0x48b1:dú,zhà # 䢱 0x48b2:yuè # 䢲 0x48b3:jÇ�,jì # 䢳 0x48b5:yún # 䢵 0x48b9:jÇ” # 䢹 0x48bb:chén,jìn,tán # 䢻 0x48bd:xiàng # 䢽 0x48be:xiÇŽn # 䢾 0x48c0:guÇ�,wéi # 䣀 0x48c1:yÇ” # ä£� 0x48c2:lÄ›i,lèi # 䣂 0x48c4:tú # 䣄 0x48c5:chén # 䣅 0x48c6:xíng # 䣆 0x48c7:qiú # 䣇 0x48c8:hàng,liáo,xiàng # 䣈 0x48ca:dÇŽng # 䣊 0x48cb:cÇŽi # 䣋 0x48cc:dÇ� # 䣌 0x48cd:yÇŽn # ä£� 0x48d1:chán # 䣑 0x48d3:lí # 䣓 0x48d4:suÇ’,suò # 䣔 0x48d5:mÇŽ,mà # 䣕 0x48d6:mÇŽ # 䣖 0x48d8:táng # 䣘 0x48d9:péi # 䣙 0x48da:lóu,lú # 䣚 0x48dc:cuó # 䣜 0x48dd:tú # ä£� 0x48de:è # 䣞 0x48df:cán # 䣟 0x48e0:jié,tì # 䣠 0x48e1:tí,yí # 䣡 0x48e2:jí # 䣢 0x48e3:dÇŽng,dào # 䣣 0x48e4:jiào,jué # 䣤 0x48e5:bÇ�,mì # 䣥 0x48e6:lèi # 䣦 0x48e7:yì # 䣧 0x48e8:chún # 䣨 0x48e9:chún # 䣩 0x48ea:pò # 䣪 0x48eb:lí # 䣫 0x48ec:zÇŽi # 䣬 0x48ed:tài # 䣭 0x48ee:pò # 䣮 0x48ef:tiÇŽn # 䣯 0x48f0:jù,yuàn # 䣰 0x48f1:xù,yì # 䣱 0x48f2:fàn # 䣲 0x48f4:xù # 䣴 0x48f5:èr # 䣵 0x48f6:huó,tián # 䣶 0x48f8:rÇŽn # 䣸 0x48f9:fá # 䣹 0x48fc:liáng # 䣼 0x48fd:tÇ� # 䣽 0x48fe:mì # 䣾 0x4901:cén,chè,shè,yín # ä¤� 0x4902:méi # 䤂 0x4903:yìn # 䤃 0x4904:miÇŽn,zhuàn # 䤄 0x4905:tú # 䤅 0x4906:kuí # 䤆 0x4909:mì,míng,mò,rú # 䤉 0x490a:róng # 䤊 0x490b:guó,yù # 䤋 0x490d:mí # ä¤� 0x490e:jú # 䤎 0x490f:pÇ� # ä¤� 0x4910:jÇ�n # ä¤� 0x4911:wàng # 䤑 0x4912:jÇ�,jì # 䤒 0x4913:méng # 䤓 0x4914:jiàn,niú,xiàng # 䤔 0x4915:xuè # 䤕 0x4916:bào # 䤖 0x4917:gÇŽn # 䤗 0x4918:chÇŽn,qiÇŽn # 䤘 0x4919:lì # 䤙 0x491a:lÇ�,lüè # 䤚 0x491b:qiú # 䤛 0x491c:dùn # 䤜 0x491d:yìng # ä¤� 0x491e:yÇ”n # 䤞 0x491f:chén # 䤟 0x4920:jÄ«,zhÇ� # 䤠 0x4921:rÇŽn # 䤡 0x4923:lüè # 䤣 0x4925:guÇ� # 䤥 0x4926:yuè # 䤦 0x4927:huì # 䤧 0x4928:pì # 䤨 0x4929:chá # 䤩 0x492a:duÇ’ # 䤪 0x492b:chán # 䤫 0x492d:kuàn,shì,suì,yí # 䤭 0x492e:shè # 䤮 0x492f:xíng # 䤯 0x4930:wÄ›ng,yíng # 䤰 0x4931:shì # 䤱 0x4932:chì # 䤲 0x4933:yè # 䤳 0x4934:hán # 䤴 0x4935:fèi # 䤵 0x4936:yè # 䤶 0x4937:yán,yÇŽn # 䤷 0x4938:zuàn # 䤸 0x493a:yÇ�n # 䤺 0x493b:duò # 䤻 0x493c:xiàn # 䤼 0x493f:qiè # 䤿 0x4940:chÇŽn # 䥀 0x4941:hán # ä¥� 0x4942:mèng # 䥂 0x4943:yuè # 䥃 0x4944:cù,zÇŽn,zàn # 䥄 0x4945:qiàn,qín # 䥅 0x4946:jÇ�n,qín,ròu,wèi # 䥆 0x4947:shàn # 䥇 0x4948:mÇ” # 䥈 0x494c:zhèng # 䥌 0x494d:zhì # ä¥� 0x494e:chún # 䥎 0x494f:yÇ” # ä¥� 0x4950:móu # ä¥� 0x4951:wàn # 䥑 0x4952:jiàng # 䥒 0x4954:sù # 䥔 0x4955:piÄ› # 䥕 0x4956:tián # 䥖 0x4957:kuÇŽn # 䥗 0x4958:cù,cuò # 䥘 0x4959:suì # 䥙 0x495b:jié # 䥛 0x495c:jiàn # 䥜 0x495d:áo,Ä�o # ä¥� 0x495e:jiÇŽo # 䥞 0x495f:yè # 䥟 0x4961:yè # 䥡 0x4962:lóng # 䥢 0x4963:záo # 䥣 0x4964:báo,fú # 䥤 0x4965:lián # 䥥 0x4967:huán,xuán # 䥧 0x4968:lÇœ,lú # 䥨 0x4969:wéi # 䥩 0x496a:xiÇŽn # 䥪 0x496b:tiÄ› # 䥫 0x496c:bó # 䥬 0x496d:zhèng # 䥭 0x496e:zhú # 䥮 0x496f:bà,bài,bÄ“i # 䥯 0x4970:mèng # 䥰 0x4971:xiÄ› # 䥱 0x4975:xiÇŽo # 䥵 0x4976:lì # 䥶 0x4977:zhá # 䥷 0x4978:mí # 䥸 0x497a:yé # 䥺 0x497e:xiÄ› # 䥾 0x4982:shàn # 䦂 0x4985:shàn,zhÇŽn # 䦅 0x4986:jué # 䦆 0x4987:jì # 䦇 0x4988:fÇŽng,hÇŽn,jí,mÇ’u,zá,zuÇ’ # 䦈 0x498a:niÇŽo # 䦊 0x498b:áo # 䦋 0x498c:chù,pò,ruì # 䦌 0x498d:wù # ä¦� 0x498e:guÇŽn # 䦎 0x498f:xiè # ä¦� 0x4990:tÇ�ng # ä¦� 0x4991:xiè # 䦑 0x4992:dàng # 䦒 0x4994:tÇŽn # 䦔 0x4996:xiá,xié # 䦖 0x4997:xù # 䦗 0x4998:bì,xiÇŽn,xiàn # 䦘 0x4999:sì # 䦙 0x499a:huò,kuÇŽ,kuà # 䦚 0x499b:zhèng,zhì # 䦛 0x499c:wú,wù # 䦜 0x499e:rùn # 䦞 0x499f:chuài # 䦟 0x49a0:shÇ� # 䦠 0x49a1:huán # 䦡 0x49a2:kuò # 䦢 0x49a3:fù # 䦣 0x49a4:chuài,wÄ›n # 䦤 0x49a5:xián # 䦥 0x49a6:qín # 䦦 0x49a7:qié,xì,yÇŽn # 䦧 0x49a8:lán # 䦨 0x49aa:yà # 䦪 0x49ac:què # 䦬 0x49ae:chÇ”n # 䦮 0x49af:zhì # 䦯 0x49b1:kuÇ�,wÄ›i # 䦱 0x49b2:qiàn,yán # 䦲 0x49b3:hàng,xiàng # 䦳 0x49b4:yì # 䦴 0x49b5:nÇ� # 䦵 0x49b6:zhèng # 䦶 0x49b7:chuài,wÄ›n # 䦷 0x49b9:shí # 䦹 0x49bb:cì,zÇ� # 䦻 0x49bc:jué # 䦼 0x49bd:xù # 䦽 0x49be:yÇ”n # 䦾 0x49c1:chù,xÇ” # ä§� 0x49c2:dào,tiÇŽo,zhào # ä§‚ 0x49c3:diàn,tián # 䧃 0x49c4:gè # ä§„ 0x49c5:tì,yà,yí # ä§… 0x49c6:hóng,kÇ’u,qióng # 䧆 0x49c7:nÇ�,yÇ�,yÄ« # 䧇 0x49c9:lÇ� # 䧉 0x49cb:xiÇŽn # ä§‹ 0x49cd:xì # ä§� 0x49ce:xuàn # ä§Ž 0x49d2:lái,lÇŽn # ä§’ 0x49d4:mù,niàn # ä§” 0x49d5:chéng,yù # ä§• 0x49d6:jiàn # ä§– 0x49d7:bì # ä§— 0x49d8:qí,zhuàn # 䧘 0x49d9:líng # ä§™ 0x49da:hào # ä§š 0x49db:bàng # ä§› 0x49dc:táng # ä§œ 0x49dd:chÄ«,zhì # ä§� 0x49de:fù,mà # ä§ž 0x49df:xiàn,xuàn # ä§Ÿ 0x49e0:shuàn # ä§  0x49e4:pú # 䧤 0x49e5:huì # ä§¥ 0x49e6:wéi,huÄ« # 䧦 0x49e7:yÇ� # ä§§ 0x49e8:yè # 䧨 0x49ea:chè,zhé # 䧪 0x49eb:háo # ä§« 0x49ee:xiÇŽn,xiàn # ä§® 0x49ef:chán,zhàn # 䧯 0x49f0:hùn # ä§° 0x49f2:hàn # ä§² 0x49f3:cí,cÇ� # ä§³ 0x49f5:qí,shÄ›n,zhèn # ä§µ 0x49f6:kuí # ä§¶ 0x49f7:róu # ä§· 0x49fa:xióng # 䧺 0x49fc:hú # ä§¼ 0x49fd:cuÇ� # ä§½ 0x49ff:què # ä§¿ 0x4a00:dí,dì # 䨀 0x4a01:chè,wù,yù # ä¨� 0x4a04:yàn,Ä�n # 䨄 0x4a05:liáo # 䨅 0x4a06:bí,bì,xù # 䨆 0x4a0b:nüè # 䨋 0x4a0c:báo,bó # 䨌 0x4a0d:yÇ�ng # ä¨� 0x4a0e:hóng # 䨎 0x4a0f:cí # ä¨� 0x4a10:qià,xiá # ä¨� 0x4a11:tí # 䨑 0x4a12:yù # 䨒 0x4a13:léi,lèi # 䨓 0x4a14:báo # 䨔 0x4a16:jì # 䨖 0x4a17:fú # 䨗 0x4a18:xiàn # 䨘 0x4a19:cén,yà,yín # 䨙 0x4a1b:sè # 䨛 0x4a1e:yÇ”,yù # 䨞 0x4a20:ÇŽi # 䨠 0x4a21:hán # 䨡 0x4a22:dàn,dí,gào,tán # 䨢 0x4a23:gé,gèng # 䨣 0x4a24:dí # 䨤 0x4a25:hù,huò # 䨥 0x4a26:páng # 䨦 0x4a29:líng # 䨩 0x4a2a:mái # 䨪 0x4a2b:mài,màn # 䨫 0x4a2c:lián # 䨬 0x4a2e:xuÄ› # 䨮 0x4a2f:zhèn # 䨯 0x4a30:pò # 䨰 0x4a31:fù # 䨱 0x4a32:nóu # 䨲 0x4a33:xì # 䨳 0x4a34:duì,wèng # 䨴 0x4a35:dàn # 䨵 0x4a36:yÇ”n # 䨶 0x4a37:xiàn # 䨷 0x4a38:yÇ�n # 䨸 0x4a3a:duì # 䨺 0x4a3b:bèng # 䨻 0x4a3c:hù # 䨼 0x4a3d:fÄ›i # 䨽 0x4a3e:fÄ›i # 䨾 0x4a3f:qián,zá # 䨿 0x4a40:bèi # ä©€ 0x4a43:shì # 䩃 0x4a44:tiÇŽn # ä©„ 0x4a45:zhÇŽn # ä©… 0x4a46:jiÇŽn,zhÇŽn # 䩆 0x4a48:huì,wèi,xuÄ› # 䩈 0x4a49:fÇ” # 䩉 0x4a4a:wÇŽn,wò # 䩊 0x4a4b:mÇ’ # ä©‹ 0x4a4c:qiáo,jiÄ�o # 䩌 0x4a4d:liÇŽo # ä©� 0x4a4f:miè # ä©� 0x4a50:gé,jí # ä©� 0x4a51:hóng # ä©‘ 0x4a52:yú # ä©’ 0x4a53:qí # ä©“ 0x4a54:duò # ä©” 0x4a55:áng # ä©• 0x4a57:bà # ä©— 0x4a58:dì # 䩘 0x4a59:xuàn # ä©™ 0x4a5a:dì,diàn # 䩚 0x4a5b:bì # ä©› 0x4a5c:zhòu # 䩜 0x4a5d:páo # ä©� 0x4a5e:nián,tiÇŽn,tié,wÄ›i # 䩞 0x4a5f:yí,tì # 䩟 0x4a61:jiá # ä©¡ 0x4a62:dá,zhì # ä©¢ 0x4a63:duÇ’,tú,tuì # ä©£ 0x4a64:xì,xié # 䩤 0x4a65:dàn # ä©¥ 0x4a66:tiáo,zuò # 䩦 0x4a67:xiè # ä©§ 0x4a68:chàng # 䩨 0x4a69:yuÇŽn # ä©© 0x4a6a:guÇŽn # 䩪 0x4a6b:liÇŽng # ä©« 0x4a6c:bÄ›ng,fÄ›ng # 䩬 0x4a6e:lù # ä©® 0x4a6f:jí # 䩯 0x4a70:xuàn # ä©° 0x4a71:shù # 䩱 0x4a73:shÇ”,sù # 䩳 0x4a74:hú # ä©´ 0x4a75:yùn # 䩵 0x4a76:chÇŽn,chÄ›ng # ä©¶ 0x4a78:róng,rÇ’ng # 䩸 0x4a79:é # 䩹 0x4a7b:bà # ä©» 0x4a7c:féng # 䩼 0x4a7e:zhè # 䩾 0x4a7f:fén # ä©¿ 0x4a80:guÇŽn,ruÇŽn # 䪀 0x4a81:bÇ” # äª� 0x4a82:gé # 䪂 0x4a84:huáng # 䪄 0x4a85:dú # 䪅 0x4a86:tÇ� # 䪆 0x4a87:bó # 䪇 0x4a88:qiÇŽn,qiàn # 䪈 0x4a89:là,liè # 䪉 0x4a8a:lóng # 䪊 0x4a8b:wèi # 䪋 0x4a8c:zhàn # 䪌 0x4a8d:lán,làn # äª� 0x4a8f:nà,dÄ� # äª� 0x4a90:bì,pì # äª� 0x4a91:tuó # 䪑 0x4a92:jiào,zhì,zhù # 䪒 0x4a94:bÇ” # 䪔 0x4a95:jú # 䪕 0x4a96:pò # 䪖 0x4a97:xiá # 䪗 0x4a98:wÄ›i # 䪘 0x4a99:fú,pò # 䪙 0x4a9a:hè,tà # 䪚 0x4a9b:fán # 䪛 0x4a9c:chàn # 䪜 0x4a9d:hù # äª� 0x4a9e:zá # 䪞 0x4aa4:fán # 䪤 0x4aa5:xiè # 䪥 0x4aa6:hóng # 䪦 0x4aa7:chí # 䪧 0x4aa8:báo,qú # 䪨 0x4aa9:yín # 䪩 0x4aac:bó,pú # 䪬 0x4aad:ruÇŽn # 䪭 0x4aae:chÇ’u # 䪮 0x4aaf:yíng # 䪯 0x4ab1:gÇŽi # 䪱 0x4ab3:yÇ”n # 䪳 0x4ab4:zhÄ›n # 䪴 0x4ab5:yÇŽ # 䪵 0x4ab7:hòu # 䪷 0x4ab8:mín # 䪸 0x4ab9:péi # 䪹 0x4aba:gé # 䪺 0x4abb:biàn # 䪻 0x4abd:hào # 䪽 0x4abe:mí,zhÄ›n # 䪾 0x4abf:shÄ›ng,xìn # 䪿 0x4ac0:gÄ›n # ä«€ 0x4ac1:bì # ä«� 0x4ac2:duÇ’ # ä«‚ 0x4ac3:chún # 䫃 0x4ac4:chuà # ä«„ 0x4ac5:sàn # ä«… 0x4ac6:chéng,zhèng # 䫆 0x4ac7:rán # 䫇 0x4ac8:zèn,cén # 䫈 0x4ac9:mào # 䫉 0x4aca:bó,péi # 䫊 0x4acb:tuí # ä«‹ 0x4acc:pÇ� # 䫌 0x4acd:fÇ” # ä«� 0x4ad0:lín # ä«� 0x4ad2:mén # ä«’ 0x4ad3:wú # ä«“ 0x4ad4:qì,qiè,xì # ä«” 0x4ad5:zhì # ä«• 0x4ad6:chÄ›n,huÇ�,nòu,shèn,tíng,yà,zhù # ä«– 0x4ad7:xiá,xià # ä«— 0x4ad8:hé # 䫘 0x4ad9:sÇŽng # ä«™ 0x4adb:hóu # ä«› 0x4add:fÇ”,fù # ä«� 0x4ade:ráo,qiÄ�o # 䫞 0x4adf:hùn # 䫟 0x4ae0:péi,pÄ« # ä«  0x4ae1:qiàn,yán # ä«¡ 0x4ae3:xí # ä«£ 0x4ae4:míng # 䫤 0x4ae5:kuÇ�,wÄ›i # ä«¥ 0x4ae6:gé,kài # 䫦 0x4ae8:ào # 䫨 0x4ae9:sÇŽn # ä«© 0x4aea:shuÇŽng # 䫪 0x4aeb:lóu,lòu # ä«« 0x4aec:zhÄ›n # 䫬 0x4aed:huì # ä«­ 0x4aee:cán,cÇŽn,tì # ä«® 0x4af0:lìn,lÇ�n # ä«° 0x4af1:ná,rú # 䫱 0x4af2:hàn,kÇŽn # 䫲 0x4af3:dú # 䫳 0x4af4:jìn # ä«´ 0x4af5:mián # 䫵 0x4af6:fán # ä«¶ 0x4af7:è # ä«· 0x4af8:náo # 䫸 0x4af9:hóng # 䫹 0x4afa:hóng,hòu # 䫺 0x4afb:xué,yù # ä«» 0x4afc:xuè # 䫼 0x4afe:bÄ«,bì # 䫾 0x4b00:yÇ’u # 䬀 0x4b01:yí # ä¬� 0x4b02:xuè,yuè # 䬂 0x4b03:sà # 䬃 0x4b04:yù # 䬄 0x4b05:lì,liè,xié # 䬅 0x4b06:lì # 䬆 0x4b07:yuàn # 䬇 0x4b08:duì # 䬈 0x4b09:hào # 䬉 0x4b0a:qiè,shà # 䬊 0x4b0b:léng # 䬋 0x4b0e:guó # 䬎 0x4b0f:bù,fÇ’u # ä¬� 0x4b10:wÄ›i # ä¬� 0x4b11:wèi # 䬑 0x4b13:àn,ÇŽng # 䬓 0x4b14:xù,yú # 䬔 0x4b15:shÇŽng # 䬕 0x4b16:héng # 䬖 0x4b17:yáng # 䬗 0x4b19:yáo # 䬙 0x4b1b:bì,yù # 䬛 0x4b1d:héng,hòng # ä¬� 0x4b1e:táo # 䬞 0x4b1f:liú # 䬟 0x4b21:zhù # 䬡 0x4b23:qì # 䬣 0x4b24:cháo,zàn,zuò # 䬤 0x4b25:yì # 䬥 0x4b26:dòu # 䬦 0x4b27:yuán # 䬧 0x4b28:cù,jiù,zú # 䬨 0x4b2a:bó,fù # 䬪 0x4b2b:cÇŽn,tí # 䬫 0x4b2c:yÇŽng # 䬬 0x4b2e:yí # 䬮 0x4b2f:nián # 䬯 0x4b30:shào # 䬰 0x4b31:bèn # 䬱 0x4b33:bÇŽn # 䬳 0x4b34:mò # 䬴 0x4b35:ài # 䬵 0x4b36:èn # 䬶 0x4b37:shÄ› # 䬷 0x4b39:zhì # 䬹 0x4b3a:yàng # 䬺 0x4b3b:jiàn,kÇŽn # 䬻 0x4b3c:yuàn # 䬼 0x4b3d:duì,shuì # 䬽 0x4b3e:tí # 䬾 0x4b3f:wÄ›i,wèi # 䬿 0x4b40:xùn # ä­€ 0x4b41:zhì # ä­� 0x4b42:yì # ä­‚ 0x4b43:rÄ›n # ä­ƒ 0x4b44:shì # ä­„ 0x4b45:hú # ä­… 0x4b46:nè # ä­† 0x4b47:yì # ä­‡ 0x4b48:jiàn # ä­ˆ 0x4b49:suÇ� # ä­‰ 0x4b4a:yÇ�ng # ä­Š 0x4b4b:bÇŽo # ä­‹ 0x4b4c:hú # ä­Œ 0x4b4d:hú # ä­� 0x4b4e:xié,yè # ä­Ž 0x4b50:yàng # ä­� 0x4b51:lián,qiàn,xiàn # ä­‘ 0x4b53:èn,wèn # ä­“ 0x4b55:jiàn,zÇŽn # ä­• 0x4b56:zhù # ä­– 0x4b57:yÇ�ng # ä­— 0x4b58:yàn,yÇ�ng # ä­˜ 0x4b59:jÇ�n # ä­™ 0x4b5a:chuáng,nè # ä­š 0x4b5b:dàn # ä­› 0x4b5d:kuài # ä­� 0x4b5e:yì # ä­ž 0x4b5f:yè # ä­Ÿ 0x4b60:jiÇŽn,qiàn # ä­  0x4b61:èn,wèn # ä­¡ 0x4b62:níng # ä­¢ 0x4b63:cí # ä­£ 0x4b64:qiÇŽn # ä­¤ 0x4b65:xuè,yàng,yào,zhòu # ä­¥ 0x4b66:bó # ä­¦ 0x4b67:mÇ� # ä­§ 0x4b68:shuì # ä­¨ 0x4b69:mì,mó # ä­© 0x4b6a:liáng # ä­ª 0x4b6b:qÇ� # ä­« 0x4b6c:qÇ� # ä­¬ 0x4b6d:shÇ’u,shú,shù,tù # ä­­ 0x4b6e:bì,fú # ä­® 0x4b6f:bó # ä­¯ 0x4b70:bÄ›ng,bèng # ä­° 0x4b71:bié # ä­± 0x4b72:nÇ�,yÇ� # ä­² 0x4b73:wèi # ä­³ 0x4b74:huán,yuàn # ä­´ 0x4b75:fán # ä­µ 0x4b76:qí # ä­¶ 0x4b77:liú,máo # ä­· 0x4b78:fù # ä­¸ 0x4b79:áng,àng # ä­¹ 0x4b7a:áng # ä­º 0x4b7c:qí # ä­¼ 0x4b7d:qún # ä­½ 0x4b7e:tuó # ä­¾ 0x4b7f:yì # ä­¿ 0x4b80:bó # 䮀 0x4b81:pián # ä®� 0x4b82:bó # 䮂 0x4b84:xuán # 䮄 0x4b87:yù # 䮇 0x4b88:chí # 䮈 0x4b89:lú # 䮉 0x4b8a:yí # 䮊 0x4b8b:lì,liè # 䮋 0x4b8d:niÇŽo,xìng # ä®� 0x4b8e:xì # 䮎 0x4b8f:wú # ä®� 0x4b91:lèi # 䮑 0x4b93:zhào # 䮓 0x4b94:zuÇ�,zuÄ« # ä®” 0x4b95:chuò # 䮕 0x4b97:àn,niù,yàn # ä®— 0x4b98:ér,ní,pài,pó # 䮘 0x4b99:yù # ä®™ 0x4b9a:lèng # 䮚 0x4b9b:fù # ä®› 0x4b9c:shà,zhá # 䮜 0x4b9d:huán,huÇŽn,hún # ä®� 0x4b9e:chù,chÇ”n # 䮞 0x4b9f:sÇ’u # 䮟 0x4ba1:bì # 䮡 0x4ba2:dié # 䮢 0x4ba4:dí,hè,hé # 䮤 0x4ba5:lì # 䮥 0x4ba7:hán,hàn # ä®§ 0x4ba8:zÇŽi # 䮨 0x4ba9:gú,gÇ” # 䮩 0x4baa:chéng # 䮪 0x4bab:lóu # 䮫 0x4bac:mò # 䮬 0x4bad:mì # ä®­ 0x4bae:mài # ä®® 0x4baf:ào # 䮯 0x4bb0:zhé # ä®° 0x4bb1:zhú # ä®± 0x4bb2:huáng # 䮲 0x4bb3:fán # 䮳 0x4bb4:dèng # ä®´ 0x4bb5:tóng,yÇ’ng # 䮵 0x4bb7:dú # ä®· 0x4bb8:hú,mú,wò # 䮸 0x4bb9:wèi # 䮹 0x4bba:jì # 䮺 0x4bbb:chì,dÇŽo,dào,dÄ›i # ä®» 0x4bbc:lín # 䮼 0x4bbe:páng # 䮾 0x4bbf:jiÇŽn # 䮿 0x4bc0:niè # 䯀 0x4bc1:luó # ä¯� 0x4bc2:jí,shÄ“n # 䯂 0x4bc5:niè # 䯅 0x4bc6:yì # 䯆 0x4bc8:wán # 䯈 0x4bc9:yà,wÄ� # 䯉 0x4bca:qià # 䯊 0x4bcb:bó # 䯋 0x4bcd:líng # ä¯� 0x4bce:gàn # 䯎 0x4bcf:huó,guÄ� # ä¯� 0x4bd0:hái # ä¯� 0x4bd2:héng # 䯒 0x4bd3:kuí # 䯓 0x4bd4:cén,zé # 䯔 0x4bd6:láng # 䯖 0x4bd7:bì # 䯗 0x4bd8:huàn # 䯘 0x4bd9:pò # 䯙 0x4bda:Ç’u,yÇŽo # 䯚 0x4bdb:jiÇŽn,wàn # 䯛 0x4bdc:tì # 䯜 0x4bdd:suÇ� # ä¯� 0x4bdf:duì,xiá # 䯟 0x4be0:ÇŽo,ào # 䯠 0x4be1:jiÇŽn,jiàn,qiàn # 䯡 0x4be2:mó,mÇ’ # 䯢 0x4be3:guì,kuì # 䯣 0x4be4:kuài # 䯤 0x4be5:àn,qì # 䯥 0x4be6:mà # 䯦 0x4be7:qÇ�ng # 䯧 0x4be8:fén,hè # 䯨 0x4bea:kÇŽo # 䯪 0x4beb:hào,shà # 䯫 0x4bec:duÇ’ # 䯬 0x4bee:nái # 䯮 0x4bf0:jiè # 䯰 0x4bf1:fù,pÄ“i,pÄ« # 䯱 0x4bf2:pá # 䯲 0x4bf4:cháng # 䯴 0x4bf5:niè # 䯵 0x4bf6:mán # 䯶 0x4bf8:cì # 䯸 0x4bfa:kuò # 䯺 0x4bfc:dí # 䯼 0x4bfd:fÇ”,póu # 䯽 0x4bfe:tiáo # 䯾 0x4bff:zú,zuó # 䯿 0x4c00:wÇ’ # ä°€ 0x4c01:fèi # ä°� 0x4c02:cài # ä°‚ 0x4c03:péng # ä°ƒ 0x4c04:shì # ä°„ 0x4c06:róu # ä°† 0x4c07:qí # ä°‡ 0x4c08:chÇŽ,cuó,cuÇ’ # ä°ˆ 0x4c09:pán,pàn # ä°‰ 0x4c0a:bó # ä°Š 0x4c0b:mán # ä°‹ 0x4c0c:zÇ’ng # ä°Œ 0x4c0d:cì,qÄ«,xiÅ« # ä°� 0x4c0e:guì,huÇ�,kuì # ä°Ž 0x4c0f:jì # ä°� 0x4c10:lán # ä°� 0x4c12:méng # ä°’ 0x4c13:mián # ä°“ 0x4c14:pán # ä°” 0x4c15:lú # ä°• 0x4c16:cuán # ä°– 0x4c18:liú # ä°˜ 0x4c19:yÇ� # ä°™ 0x4c1a:wén # ä°š 0x4c1b:lì # ä°› 0x4c1c:lì # ä°œ 0x4c1d:zèng # ä°� 0x4c1e:zhÇ” # ä°ž 0x4c1f:hún # ä°Ÿ 0x4c20:shén,shÄ“n # ä°  0x4c21:chì # ä°¡ 0x4c22:xìng # ä°¢ 0x4c23:wÇŽng # ä°£ 0x4c25:huò,jì,shè,yù # ä°¥ 0x4c26:pÇ�,pì # ä°¦ 0x4c28:mèi # ä°¨ 0x4c29:chÄ›,chÇ� # ä°© 0x4c2a:mèi # ä°ª 0x4c2b:cháo # ä°« 0x4c2c:jú # ä°¬ 0x4c2d:nòu,rú # ä°­ 0x4c2f:nÇ�,rán,yì # ä°¯ 0x4c30:rú # ä°° 0x4c31:líng # ä°± 0x4c32:yà # ä°² 0x4c34:qì,zhì # ä°´ 0x4c37:bàng,bó # ä°· 0x4c39:zé # ä°¹ 0x4c3a:jiè # ä°º 0x4c3b:yú # ä°» 0x4c3c:xín,qín # ä°¼ 0x4c3d:bèi # ä°½ 0x4c3e:bÄ� # ä°¾ 0x4c3f:tuó # ä°¿ 0x4c41:qiáo # ä±� 0x4c42:yÇ’u # 䱂 0x4c43:dÇ�,zhì # 䱃 0x4c44:jiè # 䱄 0x4c45:mò # ä±… 0x4c46:shéng # 䱆 0x4c47:shàn,táo # 䱇 0x4c48:qí,yì # 䱈 0x4c49:shàn # 䱉 0x4c4a:mÇ� # 䱊 0x4c4b:dÇŽn,gÇ’ng # 䱋 0x4c4c:yí # 䱌 0x4c4d:gèng # ä±� 0x4c4e:gèng # 䱎 0x4c4f:tÇ’u # ä±� 0x4c51:xué # 䱑 0x4c52:yì # ä±’ 0x4c53:tíng # 䱓 0x4c54:tiáo # ä±” 0x4c55:móu # 䱕 0x4c56:liú,liÇ” # ä±– 0x4c58:lí # 䱘 0x4c5a:lù # 䱚 0x4c5b:huò # ä±› 0x4c5c:cuò,què # 䱜 0x4c5d:bà,pái # ä±� 0x4c5e:liú,nài,wÄ›i # 䱞 0x4c5f:jù # 䱟 0x4c60:zhàn # ä±  0x4c61:jú # 䱡 0x4c63:zú # ä±£ 0x4c64:xiàn # 䱤 0x4c65:zhì,jì # ä±¥ 0x4c68:zhì # 䱨 0x4c6b:là # 䱫 0x4c6d:gèng # ä±­ 0x4c6e:é # ä±® 0x4c6f:mú # 䱯 0x4c70:zhòng # ä±° 0x4c71:dì,tí # ä±± 0x4c72:yán # ä±² 0x4c74:gèng # ä±´ 0x4c76:láng # ä±¶ 0x4c77:yú # ä±· 0x4c79:nà,zhÇŽ # ä±¹ 0x4c7a:hái # 䱺 0x4c7b:huá # ä±» 0x4c7c:zhÇŽn # ä±¼ 0x4c7e:lóu,yú # ä±¾ 0x4c7f:chàn # 䱿 0x4c80:dié,suì,zhì,zòu # ä²€ 0x4c81:wèi # ä²� 0x4c82:xuán # 䲂 0x4c83:zÇŽo # 䲃 0x4c84:mín,mÇ�n # 䲄 0x4c8a:tuÇ’,duò # 䲊 0x4c8b:cén # 䲋 0x4c8c:kuÇŽn # 䲌 0x4c8d:téng # ä²� 0x4c8e:nÄ›i # 䲎 0x4c8f:láo # ä²� 0x4c90:lÇ” # ä²� 0x4c91:yí # 䲑 0x4c92:xiè # ä²’ 0x4c93:yÇŽn # 䲓 0x4c94:qíng,qìng,jÄ«ng # ä²” 0x4c95:pÇ”,pù # 䲕 0x4c96:chóu # ä²– 0x4c97:xián # ä²— 0x4c98:guÇŽn,kàng,wéi # 䲘 0x4c99:jié # ä²™ 0x4c9a:lài,làn # 䲚 0x4c9b:méng # ä²› 0x4c9c:yè # 䲜 0x4c9e:lì,luÇ’ # 䲞 0x4c9f:yìn # 䲟 0x4ca2:téng # ä²¢ 0x4ca3:yú # ä²£ 0x4ca6:chá,dài,dì,tuÇ’ # 䲦 0x4ca7:dù,shuì # ä²§ 0x4ca8:hóng # 䲨 0x4caa:xì # 䲪 0x4cac:qí # 䲬 0x4cae:yuán # ä²® 0x4caf:jí # 䲯 0x4cb0:yùn # ä²° 0x4cb1:fÇŽng # ä²± 0x4cb3:háng # ä²³ 0x4cb4:zhèn # ä²´ 0x4cb5:hù,què # ä²µ 0x4cb8:jiè # 䲸 0x4cb9:péi # ä²¹ 0x4cba:gàn # 䲺 0x4cbb:xuán,yuán # ä²» 0x4cbd:dÇŽo,shí # ä²½ 0x4cbe:qiÇŽo # ä²¾ 0x4cbf:cí # 䲿 0x4cc0:dié # ä³€ 0x4cc1:bá,bÇ�n,bó,yuán # ä³� 0x4cc2:tiáo # 䳂 0x4cc3:wÇŽn # 䳃 0x4cc4:cí # 䳄 0x4cc5:zhÇ� # ä³… 0x4cc6:bái # 䳆 0x4cc7:wÇ” # 䳇 0x4cc8:bÇŽo # 䳈 0x4cc9:dÅ�ng,dàn # 䳉 0x4cca:bá # 䳊 0x4ccb:tóng,zhòng # 䳋 0x4cce:jiù # 䳎 0x4ccf:guì # ä³� 0x4cd0:cì # ä³� 0x4cd1:yÇ’u,yù # 䳑 0x4cd2:yuán # ä³’ 0x4cd3:lÇŽo # 䳓 0x4cd4:jiù,jú # ä³” 0x4cd5:fóu # 䳕 0x4cd6:nèi,yè # ä³– 0x4cd7:é # ä³— 0x4cd8:é # 䳘 0x4cd9:xÇ�ng # ä³™ 0x4cda:hé,kÇŽn # 䳚 0x4cdb:yàn # ä³› 0x4cdc:tú # 䳜 0x4cdd:bù,diào,fÇ”,pÇ’u # ä³� 0x4cde:bÄ›ng # 䳞 0x4cdf:kòu,míng,mÇ’ # 䳟 0x4ce0:chuí,ruì,zhù # ä³  0x4ce2:qí # ä³¢ 0x4ce3:yuán # ä³£ 0x4ce7:hóu # ä³§ 0x4ce8:huáng # 䳨 0x4cea:juàn,tuán # 䳪 0x4ceb:kuí # 䳫 0x4cec:è,yÇŽo,yì # 䳬 0x4ced:jí # ä³­ 0x4cee:mò # ä³® 0x4cef:chóng,chÇ’ng # 䳯 0x4cf0:bÇŽo # ä³° 0x4cf1:wù # ä³± 0x4cf2:zhèn # ä³² 0x4cf3:xù # ä³³ 0x4cf4:dá,tà # ä³´ 0x4cf5:chì # ä³µ 0x4cf7:cóng # ä³· 0x4cf8:má,mái # 䳸 0x4cf9:kòu # ä³¹ 0x4cfa:yàn # 䳺 0x4cfb:cán,chán,dié,zhàn # ä³» 0x4cfd:hè # ä³½ 0x4cff:lán,rán # 䳿 0x4d00:tóng # ä´€ 0x4d01:yù # ä´� 0x4d02:hàng,xiàng # ä´‚ 0x4d03:náo # ä´ƒ 0x4d04:lì,shùn # ä´„ 0x4d05:fén # ä´… 0x4d06:pú # ä´† 0x4d07:líng # ä´‡ 0x4d08:ÇŽo # ä´ˆ 0x4d09:xuán # ä´‰ 0x4d0a:yí # ä´Š 0x4d0b:xuán # ä´‹ 0x4d0c:méng # ä´Œ 0x4d0e:lÄ›i # ä´Ž 0x4d0f:yàn # ä´� 0x4d10:bÇŽo # ä´� 0x4d11:dié # ä´‘ 0x4d12:líng # ä´’ 0x4d13:shÄ« # ä´“ 0x4d14:jiÄ�o # ä´” 0x4d15:liè # ä´• 0x4d16:jÄ«ng # ä´– 0x4d17:jú # ä´— 0x4d18:tÄ« # ä´˜ 0x4d19:pì # ä´™ 0x4d1a:gÇŽng # ä´š 0x4d1b:jiÇŽo,tú,xì,xiào,yín # ä´› 0x4d1c:huái # ä´œ 0x4d1d:bù,chuài # ä´� 0x4d1e:dí # ä´ž 0x4d1f:huán,huàn # ä´Ÿ 0x4d20:yÇŽo # ä´  0x4d21:lì # ä´¡ 0x4d22:mí # ä´¢ 0x4d26:rén,yín # ä´¦ 0x4d29:piáo # ä´© 0x4d2a:lù # ä´ª 0x4d2b:líng # ä´« 0x4d2c:yì # ä´¬ 0x4d2d:cái # ä´­ 0x4d2e:shàn # ä´® 0x4d30:shú # ä´° 0x4d31:tuÅ� # ä´± 0x4d32:mò # ä´² 0x4d33:hè,huá # ä´³ 0x4d34:tiè,nián # ä´´ 0x4d35:bÇ�ng,zhuó # ä´µ 0x4d36:péng # ä´¶ 0x4d37:hún # ä´· 0x4d39:guÇ’ # ä´¹ 0x4d3a:bù,cÇŽi,chàn # ä´º 0x4d3b:lí # ä´» 0x4d3c:chÇŽn,chàn # ä´¼ 0x4d3d:bài,pí # ä´½ 0x4d3e:cuó,cuò,yè,zhÄ›n,zÇ� # ä´¾ 0x4d3f:méng # ä´¿ 0x4d40:suÇ’ # äµ€ 0x4d41:qiàng # äµ� 0x4d42:zhí # 䵂 0x4d43:kuàng # 䵃 0x4d44:bí,bó,fèng,pÄ›ng # 䵄 0x4d45:áo # äµ… 0x4d46:méng # 䵆 0x4d47:xiàn # 䵇 0x4d49:tóu # 䵉 0x4d4b:wÄ›i # 䵋 0x4d4f:lÇŽo # äµ� 0x4d50:chÇŽn,chàn # äµ� 0x4d51:nì # 䵑 0x4d52:nì # äµ’ 0x4d53:lí # 䵓 0x4d54:dÇ’ng # äµ” 0x4d55:jù # 䵕 0x4d56:jiàn,qiàn,xiàn # äµ– 0x4d57:fú,bó # äµ— 0x4d58:shà,shài # 䵘 0x4d59:zhÇŽ # äµ™ 0x4d5a:tÇŽo # 䵚 0x4d5b:jiàn,xiàn # äµ› 0x4d5c:nÇ’ng # 䵜 0x4d5d:yà,yì # äµ� 0x4d5e:jìng,qíng # 䵞 0x4d5f:gÇŽn # 䵟 0x4d60:dí # äµ  0x4d61:jiÇŽn # 䵡 0x4d62:mèi,wèi # äµ¢ 0x4d63:dá,zhÇŽn # äµ£ 0x4d64:jiÇŽn # 䵤 0x4d65:shè,wán,yìng,yù # äµ¥ 0x4d66:xiè # 䵦 0x4d67:zài # äµ§ 0x4d68:máng # 䵨 0x4d69:lí # 䵩 0x4d6a:gùn # 䵪 0x4d6b:yù # 䵫 0x4d6c:tà # 䵬 0x4d6d:zhè # äµ­ 0x4d6e:yàng # äµ® 0x4d6f:tuÇŽn # 䵯 0x4d71:hè,xì # äµ± 0x4d72:diào # äµ² 0x4d73:wèi # äµ³ 0x4d74:yùn,zèng # äµ´ 0x4d75:zhá,zhuó,chuÄ� # äµµ 0x4d76:qú # äµ¶ 0x4d7a:tÇ�ng # 䵺 0x4d7b:gÇ”,hú,huì # äµ» 0x4d7d:cà # äµ½ 0x4d7e:fú # äµ¾ 0x4d7f:tiè # 䵿 0x4d80:tà # ä¶€ 0x4d81:tà # ä¶� 0x4d82:zhuó # ä¶‚ 0x4d83:hán # 䶃 0x4d84:píng # ä¶„ 0x4d85:hé # ä¶… 0x4d87:zhòu # 䶇 0x4d88:bó # 䶈 0x4d89:liú # 䶉 0x4d8a:nÇœ # ä¶Š 0x4d8c:pào # ä¶Œ 0x4d8d:dì,tì # ä¶� 0x4d8e:shà # ä¶Ž 0x4d8f:tÇ�,tì # ä¶� 0x4d90:wài,huì # ä¶� 0x4d91:tì # ä¶‘ 0x4d92:qí # ä¶’ 0x4d93:jì,qì # ä¶“ 0x4d94:chí,mín # ä¶” 0x4d95:pá # ä¶• 0x4d96:jìn,qín # ä¶– 0x4d97:qiÄ�,qiÇŽ,kè # ä¶— 0x4d98:lì # 䶘 0x4d99:jù # ä¶™ 0x4d9a:qÇ” # ä¶š 0x4d9b:là,liè # ä¶› 0x4d9c:gù # ä¶œ 0x4d9d:qià,xiá # ä¶� 0x4d9e:qí # ä¶ž 0x4d9f:xiàn # ä¶Ÿ 0x4da0:jiÇŽn,xián # ä¶  0x4da1:shí,zé,zhì # ä¶¡ 0x4da2:xián,jiÄ�n # ä¶¢ 0x4da3:ái # ä¶£ 0x4da4:huá # 䶤 0x4da5:jÇ”,zhÄ� # ä¶¥ 0x4da6:zé # 䶦 0x4da7:yÇŽo # ä¶§ 0x4da9:jì # ä¶© 0x4daa:chá # 䶪 0x4dab:kÇŽn,yán,yàn # ä¶« 0x4dae:yÇŽn # ä¶® 0x4db1:tóng # ä¶± 0x4db2:nán,nàn,rán # ä¶² 0x4db3:yuè # ä¶³ 0x4db5:chí,shÇ� # ä¶µ 0x4e00:yÄ« # 一 0x4e01:dÄ«ng,zhÄ“ng # ä¸� 0x4e02:kÇŽo,qiÇŽo,yú # 丂 0x4e03:qÄ« # 七 0x4e04:shàng # 丄 0x4e05:xià # 丅 0x4e07:wàn,mò # 万 0x4e08:zhàng # 丈 0x4e09:sÄ�n # 三 0x4e0a:shàng,shÇŽng # 上 0x4e0b:xià # 下 0x4e0c:qí,jÄ« # 丌 0x4e0d:bù,fÇ’u # ä¸� 0x4e0e:yÇ”,yù,yú # 与 0x4e0f:miÇŽn # ä¸� 0x4e10:gài # ä¸� 0x4e11:chÇ’u # 丑 0x4e12:chÇ’u # 丒 0x4e13:zhuÄ�n # 专 0x4e14:qiÄ›,jÅ« # 且 0x4e15:pÄ« # 丕 0x4e16:shì # 世 0x4e17:shì # 丗 0x4e18:qiÅ« # 丘 0x4e19:bÇ�ng # 丙 0x4e1a:yè # 业 0x4e1b:cóng # 丛 0x4e1c:dÅ�ng # 东 0x4e1d:sÄ« # ä¸� 0x4e1e:chéng # 丞 0x4e1f:diÅ« # 丟 0x4e20:qiÅ« # 丠 0x4e21:liÇŽng # 両 0x4e22:diÅ« # 丢 0x4e23:yÇ’u # 丣 0x4e24:liÇŽng # 两 0x4e25:yán # 严 0x4e26:bìng # 並 0x4e27:sÄ�ng,sàng # 丧 0x4e28:gÇ”n # 丨 0x4e29:jiÅ« # 丩 0x4e2a:gè,gÄ› # 个 0x4e2b:yÄ� # 丫 0x4e2c:pán # 丬 0x4e2d:zhÅ�ng,zhòng # 中 0x4e2e:jÇ� # 丮 0x4e2f:jiè # 丯 0x4e30:fÄ“ng # 丰 0x4e31:guàn,kuàng # 丱 0x4e32:chuàn # 串 0x4e33:chÇŽn # 丳 0x4e34:lín # 临 0x4e35:zhuó # 丵 0x4e36:zhÇ” # 丶 0x4e38:wán # 丸 0x4e39:dÄ�n # 丹 0x4e3a:wéi,wèi # 为 0x4e3b:zhÇ” # 主 0x4e3c:jÇ�ng # 丼 0x4e3d:lì,lí # 丽 0x4e3e:jÇ” # 举 0x4e3f:piÄ› # 丿 0x4e40:fú # ä¹€ 0x4e41:yí,jí # ä¹� 0x4e42:yì # 乂 0x4e43:nÇŽi # 乃 0x4e45:jiÇ” # ä¹… 0x4e46:jiÇ” # 乆 0x4e47:tuÅ�,zhé # 乇 0x4e48:me,mó,ma,yÄ�o # 么 0x4e49:yì # 义 0x4e4b:zhÄ« # 之 0x4e4c:wÅ« # 乌 0x4e4d:zhà # ä¹� 0x4e4e:hÅ« # 乎 0x4e4f:fá # ä¹� 0x4e50:lè,yuè,yào,lào # ä¹� 0x4e51:yín # 乑 0x4e52:pÄ«ng # ä¹’ 0x4e53:pÄ�ng # 乓 0x4e54:qiáo # ä¹” 0x4e55:hÇ” # 乕 0x4e56:guÄ�i # ä¹– 0x4e57:chéng,shèng # ä¹— 0x4e58:chéng,shèng # 乘 0x4e59:yÇ� # ä¹™ 0x4e5a:háo,yÇ� # 乚 0x4e5c:miÄ“,niè # 乜 0x4e5d:jiÇ” # ä¹� 0x4e5e:qÇ� # 乞 0x4e5f:yÄ› # 也 0x4e60:xí # ä¹  0x4e61:xiÄ�ng # 乡 0x4e62:gài # ä¹¢ 0x4e63:jiÇ” # ä¹£ 0x4e66:shÅ« # 书 0x4e68:shÇ� # 乨 0x4e69:jÄ« # 乩 0x4e6a:náng # 乪 0x4e6b:jiÄ� # 乫 0x4e6d:shí # ä¹­ 0x4e70:mÇŽi # ä¹° 0x4e71:luàn # ä¹± 0x4e73:rÇ” # ä¹³ 0x4e74:xué # ä¹´ 0x4e75:yÇŽn # ä¹µ 0x4e76:fÇ” # ä¹¶ 0x4e77:shÄ� # ä¹· 0x4e78:nÇŽ # 乸 0x4e79:qián # ä¹¹ 0x4e7e:qián,gÄ�n # ä¹¾ 0x4e7f:zhì,luàn # 乿 0x4e80:guÄ« # 亀 0x4e81:qián,gÄ�n # äº� 0x4e82:luàn # 亂 0x4e83:lÇ�n,lìn # 亃 0x4e84:yì # 亄 0x4e85:jué # 亅 0x4e86:le,liÇŽo # 了 0x4e88:yú,yÇ” # 予 0x4e89:zhÄ“ng # 争 0x4e8a:shì # 亊 0x4e8b:shì # 事 0x4e8c:èr # 二 0x4e8d:chù # äº� 0x4e8e:yú # 于 0x4e8f:kuÄ« # äº� 0x4e90:yú # äº� 0x4e91:yún # 云 0x4e92:hù # 互 0x4e93:qí # 亓 0x4e94:wÇ” # 五 0x4e95:jÇ�ng # 井 0x4e96:sì # 亖 0x4e97:suì # 亗 0x4e98:gèn # 亘 0x4e99:gèn # 亙 0x4e9a:yà # 亚 0x4e9b:xiÄ“,suò # 些 0x4e9c:yà # 亜 0x4e9d:qí,zhÄ�i # äº� 0x4e9e:yÄ�,yà # 亞 0x4e9f:jí,qì # 亟 0x4ea0:tóu # 亠 0x4ea1:wáng,wú # 亡 0x4ea2:kàng # 亢 0x4ea3:dà # 亣 0x4ea4:jiÄ�o # 交 0x4ea5:hài # 亥 0x4ea6:yì # 亦 0x4ea7:chÇŽn # 产 0x4ea8:hÄ“ng,pÄ“ng # 亨 0x4ea9:mÇ” # 亩 0x4eab:xiÇŽng # 享 0x4eac:jÄ«ng # 京 0x4ead:tíng # 亭 0x4eae:liàng # 亮 0x4eaf:xiÇŽng # 亯 0x4eb0:jÄ«ng # 亰 0x4eb1:yè # 亱 0x4eb2:qÄ«n,qìng # 亲 0x4eb3:bó # 亳 0x4eb4:yòu # 亴 0x4eb5:xiè # 亵 0x4eb6:dÇŽn,dàn # 亶 0x4eb7:lián # 亷 0x4eb8:duÇ’ # 亸 0x4eb9:wÄ›i,mén # 亹 0x4eba:rén # 人 0x4ebb:rén # 亻 0x4ebc:jí # 亼 0x4ebe:wáng # 亾 0x4ebf:yì # 亿 0x4ec0:shí,shén # 什 0x4ec1:rén # ä»� 0x4ec2:lè # 仂 0x4ec3:dÄ«ng # 仃 0x4ec4:zè # 仄 0x4ec5:jÇ�n,jìn # ä»… 0x4ec6:pÅ«,pú # 仆 0x4ec7:chóu,qiú # 仇 0x4ec8:bÄ� # 仈 0x4ec9:zhÇŽng # 仉 0x4eca:jÄ«n # 今 0x4ecb:jiè # 介 0x4ecc:bÄ«ng # 仌 0x4ecd:réng # ä»� 0x4ece:cóng,zòng # 从 0x4ecf:fó # ä»� 0x4ed0:jÄ«n,sÇŽn # ä»� 0x4ed1:lún # 仑 0x4ed3:cÄ�ng # 仓 0x4ed4:zÄ«,zÇ�,zÇŽi # ä»” 0x4ed5:shì # 仕 0x4ed6:tÄ� # ä»– 0x4ed7:zhàng # ä»— 0x4ed8:fù # 付 0x4ed9:xiÄ�n # ä»™ 0x4eda:xiÄ�n # 仚 0x4edb:tuÅ�,chà,duó # ä»› 0x4edc:hóng # 仜 0x4edd:tóng # ä»� 0x4ede:rèn # 仞 0x4edf:qiÄ�n # 仟 0x4ee0:gÇŽn,hàn # ä»  0x4ee1:yì,gÄ“ # 仡 0x4ee2:bó # 仢 0x4ee3:dài # 代 0x4ee4:líng,lÇ�ng,lìng # 令 0x4ee5:yÇ� # 以 0x4ee6:chào # 仦 0x4ee7:cháng,zhÇŽng # ä»§ 0x4ee8:sÄ� # 仨 0x4eea:yí # 仪 0x4eeb:mù # 仫 0x4eec:mén # 们 0x4eed:rèn # ä»­ 0x4eee:fÇŽn # ä»® 0x4eef:chào,miÇŽo # 仯 0x4ef0:yÇŽng,áng # ä»° 0x4ef1:qián # ä»± 0x4ef2:zhòng # 仲 0x4ef3:pÇ�,pí # 仳 0x4ef4:wò # ä»´ 0x4ef5:wÇ” # 仵 0x4ef6:jiàn # ä»¶ 0x4ef7:jià,jiè,jie # ä»· 0x4ef8:yÇŽo,fó # 仸 0x4ef9:fÄ“ng # 仹 0x4efa:cÄ�ng # 仺 0x4efb:rèn,rén # ä»» 0x4efc:wáng # 仼 0x4efd:fèn,bÄ«n # 份 0x4efe:dÄ« # 仾 0x4eff:fÇŽng # 仿 0x4f00:zhÅ�ng # ä¼€ 0x4f01:qÇ� # ä¼� 0x4f02:pèi # 伂 0x4f03:yú # 伃 0x4f04:diào # 伄 0x4f05:dùn # ä¼… 0x4f06:wÄ›n # 伆 0x4f07:yì # 伇 0x4f08:xÇ�n # 伈 0x4f09:kàng # 伉 0x4f0a:yÄ« # 伊 0x4f0b:jí # 伋 0x4f0c:ài # 伌 0x4f0d:wÇ” # ä¼� 0x4f0e:jì,qí # 伎 0x4f0f:fú # ä¼� 0x4f10:fá # ä¼� 0x4f11:xiÅ«,xÇ” # 休 0x4f12:jìn,yín # ä¼’ 0x4f13:pÄ« # 伓 0x4f14:dÇŽn # ä¼” 0x4f15:fÅ« # 伕 0x4f16:tÇŽng # ä¼– 0x4f17:zhòng # ä¼— 0x4f18:yÅ�u # 优 0x4f19:huÇ’ # ä¼™ 0x4f1a:huì,kuài # 会 0x4f1b:yÇ” # ä¼› 0x4f1c:cuì # 伜 0x4f1d:yún # ä¼� 0x4f1e:sÇŽn # 伞 0x4f1f:wÄ›i # 伟 0x4f20:chuán,zhuàn # ä¼  0x4f21:chÄ“,jÅ« # 伡 0x4f22:yá # ä¼¢ 0x4f23:qiàn # ä¼£ 0x4f24:shÄ�ng # 伤 0x4f25:chÄ�ng # ä¼¥ 0x4f26:lún # 伦 0x4f27:cÄ�ng,chen # ä¼§ 0x4f28:xùn # 伨 0x4f29:xìn # 伩 0x4f2a:wÄ›i # 伪 0x4f2b:zhù # 伫 0x4f2d:xián,xuán # ä¼­ 0x4f2e:nú,nÇ” # ä¼® 0x4f2f:bó,bÇŽi,bà # 伯 0x4f30:gÅ«,gù # ä¼° 0x4f31:nÇ� # ä¼± 0x4f32:nÇ�,nì # ä¼² 0x4f33:xiè # ä¼³ 0x4f34:bàn # ä¼´ 0x4f35:xù # ä¼µ 0x4f36:líng # ä¼¶ 0x4f37:zhòu # ä¼· 0x4f38:shÄ“n # 伸 0x4f39:qÅ« # ä¼¹ 0x4f3a:sì,cì # 伺 0x4f3b:bÄ“ng # ä¼» 0x4f3c:sì,shì # ä¼¼ 0x4f3d:qié,jiÄ�,gÄ� # ä¼½ 0x4f3e:pÄ« # ä¼¾ 0x4f3f:yì # 伿 0x4f40:sì # ä½€ 0x4f41:yÇ�,chì # ä½� 0x4f42:zhÄ“ng # 佂 0x4f43:diàn,tián # 佃 0x4f44:hÄ�n,gàn # 佄 0x4f45:mài # ä½… 0x4f46:dàn # 但 0x4f47:zhù # 佇 0x4f48:bù # 佈 0x4f49:qÅ« # 佉 0x4f4a:bÇ� # 佊 0x4f4b:zhÄ�o,shào # 佋 0x4f4c:cÇ� # 佌 0x4f4d:wèi # ä½� 0x4f4e:dÄ« # 低 0x4f4f:zhù # ä½� 0x4f50:zuÇ’ # ä½� 0x4f51:yòu # 佑 0x4f52:yÇŽng # ä½’ 0x4f53:tÇ�,tÄ« # 体 0x4f54:zhàn,diÄ�n # ä½” 0x4f55:hé,hÄ“,hè # 何 0x4f56:bì # ä½– 0x4f57:tuó # ä½— 0x4f58:shé # 佘 0x4f59:yú # ä½™ 0x4f5a:yì,dié # 佚 0x4f5b:fó,fú,bì,bó # ä½› 0x4f5c:zuò # 作 0x4f5d:gÅ�u,kòu # ä½� 0x4f5e:nìng # 佞 0x4f5f:tóng # 佟 0x4f60:nÇ� # ä½  0x4f61:xiÄ�n # 佡 0x4f62:qú # ä½¢ 0x4f63:yÅ�ng,yòng # ä½£ 0x4f64:wÇŽ # 佤 0x4f65:qiÄ�n # ä½¥ 0x4f67:kÇŽ # ä½§ 0x4f69:pèi # 佩 0x4f6a:huí,huái # 佪 0x4f6b:gé,hè # 佫 0x4f6c:lÇŽo # 佬 0x4f6d:xiáng # ä½­ 0x4f6e:gé # ä½® 0x4f6f:yáng # 佯 0x4f70:bÇŽi # ä½° 0x4f71:fÇŽ # ä½± 0x4f72:mÇ�ng # ä½² 0x4f73:jiÄ� # ä½³ 0x4f74:èr,nài # ä½´ 0x4f75:bìng # ä½µ 0x4f76:jí # ä½¶ 0x4f77:hÄ›n # ä½· 0x4f78:huó # 佸 0x4f79:guÇ� # ä½¹ 0x4f7a:quán # 佺 0x4f7b:tiÄ�o # ä½» 0x4f7c:jiÇŽo # ä½¼ 0x4f7d:cì # ä½½ 0x4f7e:yì # ä½¾ 0x4f7f:shÇ� # 使 0x4f80:xíng # ä¾€ 0x4f81:shÄ“n # ä¾� 0x4f82:tuÅ� # 侂 0x4f83:kÇŽn # 侃 0x4f84:zhí # 侄 0x4f85:gÄ�i # ä¾… 0x4f86:lái # 來 0x4f87:yí # 侇 0x4f88:chÇ� # 侈 0x4f89:kuÇŽ # 侉 0x4f8a:gÅ�ng # 侊 0x4f8b:lì # 例 0x4f8c:yÄ«n # 侌 0x4f8d:shì # ä¾� 0x4f8e:mÇ� # 侎 0x4f8f:zhÅ« # ä¾� 0x4f90:xù # ä¾� 0x4f91:yòu # 侑 0x4f92:Ä�n # ä¾’ 0x4f93:lù # 侓 0x4f94:móu # ä¾” 0x4f95:ér # 侕 0x4f96:lún # ä¾– 0x4f97:dòng,tóng,tÇ’ng # ä¾— 0x4f98:chà # 侘 0x4f99:chì # ä¾™ 0x4f9a:xùn # 侚 0x4f9b:gÅ�ng,gòng # ä¾› 0x4f9c:zhÅ�u # 侜 0x4f9d:yÄ« # ä¾� 0x4f9e:rú # 侞 0x4f9f:cún,jiàn # 侟 0x4fa0:xiá # ä¾  0x4fa1:sì # 価 0x4fa2:dài # ä¾¢ 0x4fa3:lÇš # ä¾£ 0x4fa5:jiÇŽo,yáo # ä¾¥ 0x4fa6:zhÄ“n # 侦 0x4fa7:cè,zè,zhÄ�i # ä¾§ 0x4fa8:qiáo # 侨 0x4fa9:kuài # 侩 0x4faa:chái # 侪 0x4fab:nìng # 侫 0x4fac:nóng # 侬 0x4fad:jÇ�n # ä¾­ 0x4fae:wÇ” # ä¾® 0x4faf:hóu,hòu # 侯 0x4fb0:jiÇ’ng # ä¾° 0x4fb1:chÄ›ng,tÇ�ng # ä¾± 0x4fb2:zhèn,zhÄ“n # ä¾² 0x4fb3:zuò # ä¾³ 0x4fb4:hào # ä¾´ 0x4fb5:qÄ«n # ä¾µ 0x4fb6:lÇš # ä¾¶ 0x4fb7:jú # ä¾· 0x4fb8:shù,dÅ�u # 侸 0x4fb9:tÇ�ng # ä¾¹ 0x4fba:shèn # 侺 0x4fbb:tuó,tuì # ä¾» 0x4fbc:bó # ä¾¼ 0x4fbd:nán # ä¾½ 0x4fbe:xiÄ�o # ä¾¾ 0x4fbf:biàn,pián # 便 0x4fc0:tuÇ� # ä¿€ 0x4fc1:yÇ” # ä¿� 0x4fc2:xì # ä¿‚ 0x4fc3:cù # 促 0x4fc4:é # ä¿„ 0x4fc5:qiú # ä¿… 0x4fc6:xú # 俆 0x4fc7:guàng # 俇 0x4fc8:kù # 俈 0x4fc9:wù # 俉 0x4fca:jùn # 俊 0x4fcb:yì # ä¿‹ 0x4fcc:fÇ” # 俌 0x4fcd:liáng # ä¿� 0x4fce:zÇ” # 俎 0x4fcf:qiào,xiào # ä¿� 0x4fd0:lì # ä¿� 0x4fd1:yÇ’ng # ä¿‘ 0x4fd2:hùn # ä¿’ 0x4fd3:jìng # ä¿“ 0x4fd4:qiàn # ä¿” 0x4fd5:sàn # ä¿• 0x4fd6:pÄ›i # ä¿– 0x4fd7:sú # ä¿— 0x4fd8:fú # 俘 0x4fd9:xÄ« # ä¿™ 0x4fda:lÇ� # 俚 0x4fdb:fÇ”,miÇŽn # ä¿› 0x4fdc:pÄ«ng # 俜 0x4fdd:bÇŽo # ä¿� 0x4fde:yú,yù,shù # 俞 0x4fdf:sì,qí # 俟 0x4fe0:xiá # ä¿  0x4fe1:xìn,shÄ“n # ä¿¡ 0x4fe2:xiÅ« # ä¿¢ 0x4fe3:yÇ” # ä¿£ 0x4fe4:dì # 俤 0x4fe5:chÄ“,jÅ« # ä¿¥ 0x4fe6:chóu # 俦 0x4fe8:yÇŽn # 俨 0x4fe9:liÇŽng,liÇŽ # ä¿© 0x4fea:lì # 俪 0x4feb:lái # ä¿« 0x4fed:jiÇŽn # ä¿­ 0x4fee:xiÅ« # ä¿® 0x4fef:fÇ” # 俯 0x4ff0:huò # ä¿° 0x4ff1:jù # 俱 0x4ff2:xiào # 俲 0x4ff3:pái # 俳 0x4ff4:jiàn # ä¿´ 0x4ff5:biào # 俵 0x4ff6:chù,tì # ä¿¶ 0x4ff7:fèi # ä¿· 0x4ff8:fèng # 俸 0x4ff9:yà # 俹 0x4ffa:ÇŽn # 俺 0x4ffb:bèi # ä¿» 0x4ffc:yù # 俼 0x4ffd:xÄ«n # 俽 0x4ffe:bÇ� # 俾 0x4fff:hÇ”,chí # ä¿¿ 0x5000:chÄ�ng # 倀 0x5001:zhÄ« # å€� 0x5002:bìng # 倂 0x5003:jiù # 倃 0x5004:yáo # 倄 0x5005:cuì,zú # 倅 0x5006:liÇŽng,liÇŽ # 倆 0x5007:wÇŽn # 倇 0x5008:lái # 倈 0x5009:cÄ�ng # 倉 0x500a:zÇ’ng # 倊 0x500b:gè,gÄ› # 個 0x500c:guÄ�n # 倌 0x500d:bèi # å€� 0x500e:tiÇŽn # 倎 0x500f:shÅ« # å€� 0x5010:shÅ« # å€� 0x5011:mén # 們 0x5012:dÇŽo,dào # 倒 0x5013:tán,tàn # 倓 0x5014:jué,juè # 倔 0x5015:chuí # 倕 0x5016:xìng # 倖 0x5017:péng # 倗 0x5018:tÇŽng,cháng # 倘 0x5019:hòu # 候 0x501a:yÇ� # 倚 0x501b:qÄ« # 倛 0x501c:tì # 倜 0x501d:gàn # å€� 0x501e:liàng,jìng # 倞 0x501f:jiè # 借 0x5020:suÄ« # 倠 0x5021:chàng,chÄ�ng # 倡 0x5022:jié # 倢 0x5023:fÇŽng # 倣 0x5024:zhí # 値 0x5025:kÅ�ng,kÇ’ng # 倥 0x5026:juàn # 倦 0x5027:zÅ�ng # 倧 0x5028:jù # 倨 0x5029:qiàn # 倩 0x502a:ní # 倪 0x502b:lún # 倫 0x502c:zhuÅ� # 倬 0x502d:wÅ�,wÄ“i # 倭 0x502e:luÇ’ # 倮 0x502f:sÅ�ng # 倯 0x5030:lèng # 倰 0x5031:hùn # 倱 0x5032:dÅ�ng # 倲 0x5033:zì # 倳 0x5034:bèn # 倴 0x5035:wÇ” # 倵 0x5036:jù # 倶 0x5037:nÇŽi # 倷 0x5038:cÇŽi # 倸 0x5039:jiÇŽn # 倹 0x503a:zhài # 债 0x503b:yÄ“ # 倻 0x503c:zhí # 值 0x503d:shà # 倽 0x503e:qÄ«ng # 倾 0x5040:yÄ«ng # å�€ 0x5041:chÄ“ng,chèn # å�� 0x5042:qián # å�‚ 0x5043:yÇŽn # å�ƒ 0x5044:ruÇŽn # å�„ 0x5045:zhòng,tóng # å�… 0x5046:chÇ”n # å�† 0x5047:jiÇŽ,jià # å�‡ 0x5048:jì,jié # å�ˆ 0x5049:wÄ›i # å�‰ 0x504a:yÇ” # å�Š 0x504b:bÇ�ng,bìng # å�‹ 0x504c:ruò # å�Œ 0x504d:tí # å�� 0x504e:wÄ“i # å�Ž 0x504f:piÄ�n # å�� 0x5050:yàn # å�� 0x5051:fÄ“ng # å�‘ 0x5052:tÇŽng,dàng # å�’ 0x5053:wò # å�“ 0x5054:è # å�” 0x5055:xié # å�• 0x5056:chÄ› # å�– 0x5057:shÄ›ng # å�— 0x5058:kÇŽn # å�˜ 0x5059:dì # å�™ 0x505a:zuò # å�š 0x505b:chÄ� # å�› 0x505c:tíng # å�œ 0x505d:bèi # å�� 0x505e:xiè # å�ž 0x505f:huáng # å�Ÿ 0x5060:yÇŽo # å�  0x5061:zhàn # å�¡ 0x5062:chÇ’u,qiào # å�¢ 0x5063:Ä�n # å�£ 0x5064:yóu # å�¤ 0x5065:jiàn # å�¥ 0x5066:xÅ« # å�¦ 0x5067:zhÄ� # å�§ 0x5068:cÄ« # å�¨ 0x5069:fù # å�© 0x506a:bÄ« # å�ª 0x506b:zhì # å�« 0x506c:zÇ’ng # å�¬ 0x506d:miÇŽn # å�­ 0x506e:jí # å�® 0x506f:yÇ� # å�¯ 0x5070:xiè # å�° 0x5071:xún # å�± 0x5072:cÄ�i,sÄ« # å�² 0x5073:duÄ�n # å�³ 0x5074:cè,zè,zhÄ�i # å�´ 0x5075:zhÄ“n # å�µ 0x5076:Ç’u # å�¶ 0x5077:tÅ�u # å�· 0x5078:tÅ�u # å�¸ 0x5079:bèi # å�¹ 0x507a:zán,zá,zÇŽ # å�º 0x507b:lÇš,lóu # å�» 0x507c:jié # å�¼ 0x507d:wÄ›i # å�½ 0x507e:fèn # å�¾ 0x507f:cháng # å�¿ 0x5080:kuÇ�,guÄ« # å‚€ 0x5081:sÇ’u # å‚� 0x5082:zhì,sÄ« # å‚‚ 0x5083:sù # 傃 0x5084:xiÄ� # å‚„ 0x5085:fù # å‚… 0x5086:yuàn,yuán # 傆 0x5087:rÇ’ng # 傇 0x5088:lì # 傈 0x5089:nù # 傉 0x508a:yùn # 傊 0x508b:jiÇŽng,gòu # å‚‹ 0x508c:mà # 傌 0x508d:bàng # å‚� 0x508e:diÄ�n # 傎 0x508f:táng # å‚� 0x5090:hào # å‚� 0x5091:jié # å‚‘ 0x5092:xÄ«,xì # å‚’ 0x5093:shÄ�n # å‚“ 0x5094:qiàn,jiÄ�n # å‚” 0x5095:què,jué # å‚• 0x5096:cÄ�ng,chen # å‚– 0x5097:chù # å‚— 0x5098:sÇŽn # 傘 0x5099:bèi # å‚™ 0x509a:xiào # 傚 0x509b:róng # å‚› 0x509c:yáo # 傜 0x509d:tà,tàn # å‚� 0x509e:suÅ� # 傞 0x509f:yÇŽng # 傟 0x50a0:fá # å‚  0x50a1:bìng # å‚¡ 0x50a2:jiÄ� # å‚¢ 0x50a3:dÇŽi # å‚£ 0x50a4:zài # 傤 0x50a5:tÇŽng # å‚¥ 0x50a7:bÄ«n # å‚§ 0x50a8:chÇ” # 储 0x50a9:nuó # å‚© 0x50aa:cÄ�n,càn # 傪 0x50ab:lÄ›i # å‚« 0x50ac:cuÄ« # 催 0x50ad:yÅ�ng # å‚­ 0x50ae:zÄ�o,cáo # å‚® 0x50af:zÇ’ng # 傯 0x50b0:péng # å‚° 0x50b1:sÇ’ng # 傱 0x50b2:ào # 傲 0x50b3:chuán,zhuàn # 傳 0x50b4:yÇ” # å‚´ 0x50b5:zhài # 債 0x50b6:qÄ«,còu # å‚¶ 0x50b7:shÄ�ng # å‚· 0x50b8:chuÇŽng # 傸 0x50b9:jìng # 傹 0x50ba:chì # 傺 0x50bb:shÇŽ # å‚» 0x50bc:hàn # 傼 0x50bd:zhÄ�ng # 傽 0x50be:qÄ«ng # 傾 0x50bf:yÄ�n,yàn # å‚¿ 0x50c0:dì # 僀 0x50c1:xiè # åƒ� 0x50c2:lÇš,lóu # 僂 0x50c3:bèi # 僃 0x50c4:piào,biÄ�o # 僄 0x50c5:jÇ�n,jìn # 僅 0x50c6:liàn # 僆 0x50c7:lù # 僇 0x50c8:màn # 僈 0x50c9:qiÄ�n # 僉 0x50ca:xiÄ�n # 僊 0x50cb:tÇŽn,tàn # 僋 0x50cc:yíng # 僌 0x50cd:dòng # åƒ� 0x50ce:zhuàn # 僎 0x50cf:xiàng # åƒ� 0x50d0:shàn # åƒ� 0x50d1:qiáo # 僑 0x50d2:jiÇ’ng # 僒 0x50d3:tuÇ�,tuí # 僓 0x50d4:zÇ”n # 僔 0x50d5:pú # 僕 0x50d6:xÄ« # 僖 0x50d7:láo # 僗 0x50d8:chÇŽng # 僘 0x50d9:guÄ�ng # 僙 0x50da:liáo # 僚 0x50db:qÄ« # 僛 0x50dc:chÄ“ng,dÄ“ng # 僜 0x50dd:zhàn,zhuàn,chán # åƒ� 0x50de:wÄ›i # 僞 0x50df:jÄ« # 僟 0x50e0:bÅ� # 僠 0x50e1:huì # 僡 0x50e2:chuÇŽn # 僢 0x50e3:tiÄ›,jiàn # 僣 0x50e4:dàn # 僤 0x50e5:jiÇŽo,yáo # 僥 0x50e6:jiù # 僦 0x50e7:sÄ“ng # 僧 0x50e8:fèn # 僨 0x50e9:xiàn # 僩 0x50ea:yù,jú # 僪 0x50eb:è,wù,wÅ« # 僫 0x50ec:jiÄ�o # 僬 0x50ed:jiàn # 僭 0x50ee:tóng,zhuàng # 僮 0x50ef:lÇ�n # 僯 0x50f0:bó # 僰 0x50f1:gù # 僱 0x50f3:sù # 僳 0x50f4:xiàn # 僴 0x50f5:jiÄ�ng # 僵 0x50f6:mÇ�n # 僶 0x50f7:yè # 僷 0x50f8:jìn # 僸 0x50f9:jià,jie # 價 0x50fa:qiào # 僺 0x50fb:pì # 僻 0x50fc:fÄ“ng # 僼 0x50fd:zhòu # 僽 0x50fe:ài # 僾 0x50ff:sài # 僿 0x5100:yí # å„€ 0x5101:jùn # å„� 0x5102:nóng # å„‚ 0x5103:chán,tÇŽn,shàn # 儃 0x5104:yì # å„„ 0x5105:dÄ�ng,dàng # å„… 0x5106:jÇ�ng # 儆 0x5107:xuÄ�n # 儇 0x5108:kuài # 儈 0x5109:jiÇŽn # 儉 0x510a:chù # 儊 0x510b:dÄ�n,dàn # å„‹ 0x510c:jiÇŽo # 儌 0x510d:shÇŽ # å„� 0x510e:zài # 儎 0x5110:bÄ«n,bìn # å„� 0x5111:án,àn # å„‘ 0x5112:rú # å„’ 0x5113:tái # å„“ 0x5114:chóu # å„” 0x5115:chái # å„• 0x5116:lán # å„– 0x5117:nÇ�,yì # å„— 0x5118:jÇ�n # 儘 0x5119:qiàn # å„™ 0x511a:méng # 儚 0x511b:wÇ” # å„› 0x511c:níng # 儜 0x511d:qióng # å„� 0x511e:nÇ� # 儞 0x511f:cháng # 償 0x5120:liè # å„  0x5121:lÄ›i # å„¡ 0x5122:lÇš # å„¢ 0x5123:kuÇŽng # å„£ 0x5124:bào # 儤 0x5125:yù # å„¥ 0x5126:biÄ�o # 儦 0x5127:zÇŽn # å„§ 0x5128:zhì # 儨 0x5129:sì # å„© 0x512a:yÅ�u # 優 0x512b:háo # å„« 0x512c:qìng # 儬 0x512d:chèn # å„­ 0x512e:lì # å„® 0x512f:téng # 儯 0x5130:wÄ›i # å„° 0x5131:lÇ’ng,lóng,lòng # 儱 0x5132:chÇ” # 儲 0x5133:chán,chàn # 儳 0x5134:ráng,xiÄ�ng # å„´ 0x5135:shÅ« # 儵 0x5136:huì,xié # å„¶ 0x5137:lì # å„· 0x5138:luó # 儸 0x5139:zÇŽn # 儹 0x513a:nuó # 儺 0x513b:tÇŽng # å„» 0x513c:yÇŽn # 儼 0x513d:léi # 儽 0x513e:nàng,nÄ�ng # 儾 0x513f:ér # å„¿ 0x5140:wù # å…€ 0x5141:yÇ”n # å…� 0x5142:zÄ�n # å…‚ 0x5143:yuán # å…ƒ 0x5144:xiÅ�ng # å…„ 0x5145:chÅ�ng # å…… 0x5146:zhào # å…† 0x5147:xiÅ�ng # å…‡ 0x5148:xiÄ�n # å…ˆ 0x5149:guÄ�ng # å…‰ 0x514a:duì,ruì,yuè # å…Š 0x514b:kè # å…‹ 0x514c:duì,ruì,yuè # å…Œ 0x514d:miÇŽn # å…� 0x514e:tù # å…Ž 0x514f:cháng,zhÇŽng # å…� 0x5150:ér # å…� 0x5151:duì,ruì,yuè # å…‘ 0x5152:ér # å…’ 0x5153:qÄ«n,jiÌ„n,zaÌ€n # å…“ 0x5154:tù # å…” 0x5155:sì # å…• 0x5156:yÇŽn # å…– 0x5157:yÇŽn # å…— 0x5158:shÇ� # å…˜ 0x515a:dÇŽng # å…š 0x515b:qiÄ�nkè # å…› 0x515c:dÅ�u # å…œ 0x515d:gÅ�ngfÄ“n # å…� 0x515e:háokè # å…ž 0x515f:shÄ“n # å…Ÿ 0x5160:dÅ�u # å…  0x5162:jÄ«ng # å…¢ 0x5163:gÅ�nglÇ� # å…£ 0x5164:huÇŽng # å…¤ 0x5165:rù # å…¥ 0x5166:wáng # å…¦ 0x5167:nèi # å…§ 0x5168:quán # å…¨ 0x5169:liÇŽng # å…© 0x516a:yú,shù # å…ª 0x516b:bÄ� # å…« 0x516c:gÅ�ng # å…¬ 0x516d:liù,lù # å…­ 0x516e:xÄ« # å…® 0x5170:lán # å…° 0x5171:gòng,gÅ�ng # å…± 0x5172:tiÄ�n # å…² 0x5173:guÄ�n # å…³ 0x5174:xÄ«ng,xìng # å…´ 0x5175:bÄ«ng # å…µ 0x5176:qí,jÄ« # å…¶ 0x5177:jù # å…· 0x5178:diÇŽn # å…¸ 0x5179:zÄ«,cí # å…¹ 0x517b:yÇŽng # å…» 0x517c:jiÄ�n # å…¼ 0x517d:shòu # å…½ 0x517e:jì # å…¾ 0x517f:yì # å…¿ 0x5180:jì # 冀 0x5181:chÇŽn # å†� 0x5182:jiÅ�ng # 冂 0x5184:rÇŽn # 冄 0x5185:nèi,nà # 内 0x5187:mÇŽo # 冇 0x5188:gÄ�ng # 冈 0x5189:rÇŽn # 冉 0x518a:cè # 冊 0x518b:jiÅ�ng # 冋 0x518c:cè # 册 0x518d:zài # å†� 0x518e:guÇŽ # 冎 0x518f:jiÇ’ng # å†� 0x5190:mào # å†� 0x5191:zhòu # 冑 0x5192:mào,mò # 冒 0x5193:gòu # 冓 0x5194:xú # 冔 0x5195:miÇŽn # 冕 0x5196:mì # 冖 0x5197:rÇ’ng # 冗 0x5198:yín,yóu # 冘 0x5199:xiÄ› # 写 0x519a:kÇŽn # 冚 0x519b:jÅ«n # 军 0x519c:nóng # 农 0x519d:yí # å†� 0x519e:mí # 冞 0x519f:shì # 冟 0x51a0:guÄ�n,guàn # 冠 0x51a1:mÄ›ng # 冡 0x51a2:zhÇ’ng # 冢 0x51a3:zuì # 冣 0x51a4:yuÄ�n # 冤 0x51a5:míng # 冥 0x51a6:kòu # 冦 0x51a8:fù # 冨 0x51a9:xiÄ› # 冩 0x51aa:mì # 冪 0x51ab:bÄ«ng # 冫 0x51ac:dÅ�ng # 冬 0x51ad:tài # 冭 0x51ae:gÄ�ng # 冮 0x51af:féng,píng # 冯 0x51b0:bÄ«ng # 冰 0x51b1:hù # 冱 0x51b2:chÅ�ng,chòng # 冲 0x51b3:jué # 决 0x51b4:yà # 冴 0x51b5:kuàng # 况 0x51b6:yÄ› # 冶 0x51b7:lÄ›ng # 冷 0x51b8:pàn # 冸 0x51b9:fÄ� # 冹 0x51ba:mÇ�n # 冺 0x51bb:dòng # 冻 0x51bc:xiÇŽn # 冼 0x51bd:liè # 冽 0x51be:qià # 冾 0x51bf:jiÄ�n # 冿 0x51c0:jìng,chÄ“ng # 净 0x51c1:sÅ�u # å‡� 0x51c2:mÄ›i # 凂 0x51c3:tú # 凃 0x51c4:qÄ« # 凄 0x51c5:gù # 凅 0x51c6:zhÇ”n # 准 0x51c7:sÅ�ng # 凇 0x51c8:jìng,chÄ“ng # 凈 0x51c9:liáng,liàng # 凉 0x51ca:qìng # 凊 0x51cb:diÄ�o # 凋 0x51cc:líng # 凌 0x51cd:dòng # å‡� 0x51ce:gàn # 凎 0x51cf:jiÇŽn # å‡� 0x51d0:yÄ«n # å‡� 0x51d1:còu # 凑 0x51d2:ái # 凒 0x51d3:lì # 凓 0x51d4:cÄ�ng # 凔 0x51d5:mÇ�ng # 凕 0x51d7:cuÄ« # 凗 0x51d8:sÄ« # 凘 0x51d9:duó # 凙 0x51da:jìn # 凚 0x51db:lÇ�n # 凛 0x51dc:lÇ�n # 凜 0x51dd:níng # å‡� 0x51de:xÄ« # 凞 0x51df:dú # 凟 0x51e0:jÄ«,jÇ� # 几 0x51e1:fán # 凡 0x51e2:fán # 凢 0x51e3:fán # 凣 0x51e4:fèng # 凤 0x51e5:jÅ« # 凥 0x51e6:chù,chÇ” # 処 0x51e8:fÄ“ng # 凨 0x51eb:fú # 凫 0x51ec:fÄ“ng # 凬 0x51ed:píng # 凭 0x51ee:fÄ“ng # 凮 0x51ef:kÇŽi # 凯 0x51f0:huáng # 凰 0x51f1:kÇŽi # 凱 0x51f2:gÄ�n # 凲 0x51f3:dèng # 凳 0x51f4:píng # 凴 0x51f5:kÇŽn,qiÇŽn # 凵 0x51f6:xiÅ�ng # 凶 0x51f7:kuài # 凷 0x51f8:tÅ« # 凸 0x51f9:Ä�o,wÄ� # 凹 0x51fa:chÅ« # 出 0x51fb:jÄ« # 击 0x51fc:dàng # 凼 0x51fd:hán # 函 0x51fe:hán # 凾 0x51ff:záo # 凿 0x5200:dÄ�o # 刀 0x5201:diÄ�o # åˆ� 0x5202:dÄ�o # 刂 0x5203:rèn # 刃 0x5204:rèn # 刄 0x5205:chuÄ�ng # 刅 0x5206:fÄ“n,fèn # 分 0x5207:qiÄ“,qiè # 切 0x5208:yì # 刈 0x5209:jÄ« # 刉 0x520a:kÄ�n # 刊 0x520b:qiàn # 刋 0x520c:cÇ”n # 刌 0x520d:chú # åˆ� 0x520e:wÄ›n # 刎 0x520f:jÄ« # åˆ� 0x5210:dÇŽn # åˆ� 0x5211:xíng # 刑 0x5212:huá,huà,huai,guò,guÇ’ # 划 0x5213:wán # 刓 0x5214:jué # 刔 0x5215:lí # 刕 0x5216:yuè # 刖 0x5217:liè # 列 0x5218:liú # 刘 0x5219:zé # 则 0x521a:gÄ�ng # 刚 0x521b:chuàng,chuÄ�ng # 创 0x521c:fú # 刜 0x521d:chÅ« # åˆ� 0x521e:qù # 刞 0x521f:diÄ�o # 刟 0x5220:shÄ�n # 删 0x5221:mÇ�n # 刡 0x5222:líng # 刢 0x5223:zhÅ�ng # 刣 0x5224:pàn # 判 0x5225:bié,biè # 別 0x5226:jié # 刦 0x5227:jié # 刧 0x5228:páo,bào # 刨 0x5229:lì # 利 0x522a:shÄ�n # 刪 0x522b:bié,biè # 别 0x522c:chÇŽn,chàn # 刬 0x522d:jÇ�ng # 刭 0x522e:guÄ� # 刮 0x522f:gÄ“ng # 刯 0x5230:dào # 到 0x5231:chuàng # 刱 0x5232:kuÄ« # 刲 0x5233:kÅ« # 刳 0x5234:duò # 刴 0x5235:èr # 刵 0x5236:zhì # 制 0x5237:shuÄ�,shuà # 刷 0x5238:quàn,xuàn # 券 0x5239:chà,shÄ� # 刹 0x523a:cì,cÄ« # 刺 0x523b:kè # 刻 0x523c:jié # 刼 0x523d:guì # 刽 0x523e:cì # 刾 0x523f:guì # 刿 0x5240:kÇŽi # 剀 0x5241:duò # å‰� 0x5242:jì # 剂 0x5243:tì # 剃 0x5244:jÇ�ng # 剄 0x5245:lóu # 剅 0x5246:luÇ’ # 剆 0x5247:zé # 則 0x5248:yuÄ�n # 剈 0x5249:cuò # 剉 0x524a:xiÄ�o,xuÄ“ # 削 0x524b:kÄ“i,kè # 剋 0x524c:là,lá # 剌 0x524d:qián # å‰� 0x524e:chà,shÄ� # 剎 0x524f:chuàng # å‰� 0x5250:guÇŽ # å‰� 0x5251:jiàn # 剑 0x5252:cuò # 剒 0x5253:lí # 剓 0x5254:tÄ« # 剔 0x5255:fèi # 剕 0x5256:pÅ�u # 剖 0x5257:chÇŽn,chàn # 剗 0x5258:qí # 剘 0x5259:chuàng # 剙 0x525a:zì # 剚 0x525b:gÄ�ng # 剛 0x525c:wÄ�n # 剜 0x525d:bÄ�o,bÅ� # å‰� 0x525e:jÄ« # 剞 0x525f:duÅ� # 剟 0x5260:qíng # 剠 0x5261:yÇŽn,shàn # 剡 0x5262:dÅ«,zhuó # 剢 0x5263:jiàn # 剣 0x5264:jì # 剤 0x5265:bÄ�o,bÅ� # 剥 0x5266:yÄ�n # 剦 0x5267:jù # 剧 0x5268:huò # 剨 0x5269:shèng # 剩 0x526a:jiÇŽn # 剪 0x526b:duó # 剫 0x526c:zhì,duÄ�n # 剬 0x526d:wÅ« # 剭 0x526e:guÇŽ # 剮 0x526f:fù,pì # 副 0x5270:shèng # 剰 0x5271:jiàn # 剱 0x5272:gÄ“ # 割 0x5273:dá,zhá # 剳 0x5274:kÇŽi # 剴 0x5275:chuàng,chuÄ�ng # 創 0x5276:chuán # 剶 0x5277:chÇŽn # 剷 0x5278:tuán,zhuÄ�n # 剸 0x5279:lù,jiÅ« # 剹 0x527a:lí # 剺 0x527b:pÄ“ng # 剻 0x527c:shÄ�n # 剼 0x527d:piÄ�o # 剽 0x527e:kÅ�u # 剾 0x527f:jiÇŽo,chÄ�o # 剿 0x5280:guÄ� # 劀 0x5281:qiÄ�o # åŠ� 0x5282:jué # 劂 0x5283:huá,huà # 劃 0x5284:zhÄ�,zhá # 劄 0x5285:zhuó # 劅 0x5286:lián # 劆 0x5287:jù # 劇 0x5288:pÄ«,pÇ� # 劈 0x5289:liú # 劉 0x528a:guì # 劊 0x528b:jiÇŽo,chÄ�o # 劋 0x528c:guì # 劌 0x528d:jiàn # åŠ� 0x528e:jiàn # 劎 0x528f:tÄ�ng # åŠ� 0x5290:huÅ� # åŠ� 0x5291:jì # 劑 0x5292:jiàn # 劒 0x5293:yì # 劓 0x5294:jiàn # 劔 0x5295:zhì # 劕 0x5296:chán # 劖 0x5297:zuÄ�n # 劗 0x5298:mó # 劘 0x5299:lí # 劙 0x529a:zhú # 劚 0x529b:lì # 力 0x529c:yà # 劜 0x529d:quàn # åŠ� 0x529e:bàn # 办 0x529f:gÅ�ng # 功 0x52a0:jiÄ� # 加 0x52a1:wù # 务 0x52a2:mài # 劢 0x52a3:liè # 劣 0x52a4:jìn,jìng # 劤 0x52a5:kÄ“ng # 劥 0x52a6:xié,liè # 劦 0x52a7:zhÇ� # 劧 0x52a8:dòng # 动 0x52a9:zhù,chú # 助 0x52aa:nÇ” # 努 0x52ab:jié # 劫 0x52ac:qú # 劬 0x52ad:shào # 劭 0x52ae:yì # 劮 0x52af:zhÇ” # 劯 0x52b0:miÇŽo # 劰 0x52b1:lì # 励 0x52b2:jìn,jìng # 劲 0x52b3:láo # 劳 0x52b4:láo # 労 0x52b5:juàn # 劵 0x52b6:kÇ’u # 劶 0x52b7:yáng # 劷 0x52b8:wÄ� # 劸 0x52b9:xiào # 効 0x52ba:móu # 劺 0x52bb:kuÄ�ng # 劻 0x52bc:jié # 劼 0x52bd:liè # 劽 0x52be:hé # 劾 0x52bf:shì # 势 0x52c0:kè # å‹€ 0x52c1:jìn,jìng # å‹� 0x52c2:gào # å‹‚ 0x52c3:bó,bèi # 勃 0x52c4:mÇ�n # å‹„ 0x52c5:chì # å‹… 0x52c6:láng # 勆 0x52c7:yÇ’ng # 勇 0x52c8:yÇ’ng # 勈 0x52c9:miÇŽn # 勉 0x52ca:kè # 勊 0x52cb:xÅ«n # å‹‹ 0x52cc:juàn,juÄ�n # 勌 0x52cd:qíng # å‹� 0x52ce:lù # 勎 0x52cf:bù # å‹� 0x52d0:mÄ›ng # å‹� 0x52d1:chì # å‹‘ 0x52d2:lè,lÄ“i # å‹’ 0x52d3:kài # å‹“ 0x52d4:miÇŽn # å‹” 0x52d5:dòng # å‹• 0x52d6:xù # å‹– 0x52d7:xù # å‹— 0x52d8:kÄ�n # 勘 0x52d9:wù # å‹™ 0x52da:yì # 勚 0x52db:xÅ«n # å‹› 0x52dc:wÄ›ng,yÇŽng # 勜 0x52dd:shèng # å‹� 0x52de:láo # 勞 0x52df:mù # 募 0x52e0:lù # å‹  0x52e1:piÄ�o # å‹¡ 0x52e2:shì # å‹¢ 0x52e3:jì # å‹£ 0x52e4:qín # 勤 0x52e5:jiàng # å‹¥ 0x52e6:jiÇŽo,chÄ�o # 勦 0x52e7:quàn # å‹§ 0x52e8:xiàng # 勨 0x52e9:yì # å‹© 0x52ea:qiÄ�o # 勪 0x52eb:fÄ�n # å‹« 0x52ec:juÄ�n # 勬 0x52ed:tóng,dòng # å‹­ 0x52ee:jù # å‹® 0x52ef:dÄ�n # 勯 0x52f0:xié # å‹° 0x52f1:mài # 勱 0x52f2:xÅ«n # 勲 0x52f3:xÅ«n # 勳 0x52f4:lÇœ # å‹´ 0x52f5:lì # 勵 0x52f6:chè # å‹¶ 0x52f7:ráng,xiÄ�ng # å‹· 0x52f8:quàn # 勸 0x52f9:bÄ�o # 勹 0x52fa:sháo # 勺 0x52fb:yún # å‹» 0x52fc:jiÅ« # 勼 0x52fd:bào # 勽 0x52fe:gÅ�u,gòu # 勾 0x52ff:wù # å‹¿ 0x5300:yún # 匀 0x5303:gài # 匃 0x5304:gài # 匄 0x5305:bÄ�o # 包 0x5306:cÅ�ng # 匆 0x5308:xiÅ�ng # 匈 0x5309:pÄ“ng # 匉 0x530a:jÅ« # 匊 0x530b:táo,yáo # 匋 0x530c:gé # 匌 0x530d:pú # åŒ� 0x530e:è # 匎 0x530f:páo # åŒ� 0x5310:fú # åŒ� 0x5311:gÅ�ng # 匑 0x5312:dá # 匒 0x5313:jiù # 匓 0x5314:gÅ�ng # 匔 0x5315:bÇ� # 匕 0x5316:huà,huÄ� # 化 0x5317:bÄ›i,bèi # 北 0x5318:nÇŽo # 匘 0x5319:chí,shi # 匙 0x531a:fÄ�ng # 匚 0x531b:jiù # 匛 0x531c:yí # 匜 0x531d:zÄ� # åŒ� 0x531e:jiàng # 匞 0x531f:kàng # 匟 0x5320:jiàng # 匠 0x5321:kuÄ�ng # 匡 0x5322:hÅ« # 匢 0x5323:xiá # 匣 0x5324:qÅ« # 匤 0x5325:fán # 匥 0x5326:guÇ� # 匦 0x5327:qiè # 匧 0x5328:zÄ�ng,cáng # 匨 0x5329:kuÄ�ng # 匩 0x532a:fÄ›i # 匪 0x532b:hÅ« # 匫 0x532c:yÇ” # 匬 0x532d:guÇ� # 匭 0x532e:kuì,guì # 匮 0x532f:huì # 匯 0x5330:dÄ�n # 匰 0x5331:kuì,guì # 匱 0x5332:lián # 匲 0x5333:lián # 匳 0x5334:suÇŽn # 匴 0x5335:dú # 匵 0x5336:jiù # 匶 0x5337:jué # 匷 0x5338:xì # 匸 0x5339:pÇ� # 匹 0x533a:qÅ«,Å�u # 区 0x533b:yÄ« # 医 0x533c:kÄ“,qià # 匼 0x533d:yÇŽn,yàn # 匽 0x533e:biÇŽn # 匾 0x533f:nì # 匿 0x5340:qÅ«,Å�u # å�€ 0x5341:shí # å�� 0x5342:xùn # å�‚ 0x5343:qiÄ�n # å�ƒ 0x5344:niàn # å�„ 0x5345:sà # å�… 0x5346:zú # å�† 0x5347:shÄ“ng # å�‡ 0x5348:wÇ” # å�ˆ 0x5349:huì # å�‰ 0x534a:bàn # å�Š 0x534b:shì # å�‹ 0x534c:xì # å�Œ 0x534d:wàn # å�� 0x534e:huá,huà,huÄ� # å�Ž 0x534f:xié # å�� 0x5350:wàn # å�� 0x5351:bÄ“i # å�‘ 0x5352:zú,cù # å�’ 0x5353:zhuó # å�“ 0x5354:xié # å�” 0x5355:dÄ�n,shàn,chán # å�• 0x5356:mài # å�– 0x5357:nán,nÄ� # å�— 0x5358:dÄ�n # å�˜ 0x5359:jí # å�™ 0x535a:bó # å�š 0x535b:shuài,lÇœ # å�› 0x535c:bÇ”,bo # å�œ 0x535d:guàn,kuàng # å�� 0x535e:biàn # å�ž 0x535f:bÇ” # å�Ÿ 0x5360:zhÄ�n,zhàn # å�  0x5361:kÇŽ,qiÇŽ # å�¡ 0x5362:lú # å�¢ 0x5363:yÇ’u # å�£ 0x5364:lÇ” # å�¤ 0x5365:xÄ« # å�¥ 0x5366:guà # å�¦ 0x5367:wò # å�§ 0x5368:xiè # å�¨ 0x5369:jié # å�© 0x536a:jié # å�ª 0x536b:wèi # å�« 0x536c:yÇŽng,áng # å�¬ 0x536d:qióng # å�­ 0x536e:zhÄ« # å�® 0x536f:mÇŽo # å�¯ 0x5370:yìn # å�° 0x5371:wÄ“i # å�± 0x5372:shào # å�² 0x5373:jí # å�³ 0x5374:què # å�´ 0x5375:luÇŽn # å�µ 0x5376:chÇ� # å�¶ 0x5377:juàn,juÇŽn # å�· 0x5378:xiè # å�¸ 0x5379:xù # å�¹ 0x537a:jÇ�n # å�º 0x537b:què # å�» 0x537c:wù # å�¼ 0x537d:jí # å�½ 0x537e:è # å�¾ 0x537f:qÄ«ng # å�¿ 0x5380:xÄ« # 厀 0x5382:chÇŽng,Ä�n,hàn # 厂 0x5383:wÄ“i,yán # 厃 0x5384:è # 厄 0x5385:tÄ«ng # 厅 0x5386:lì # 历 0x5387:zhé,zhái # 厇 0x5388:hàn,àn # 厈 0x5389:lì # 厉 0x538a:yÇŽ # 厊 0x538b:yÄ�,yà # 压 0x538c:yàn # 厌 0x538d:shè # åŽ� 0x538e:dÇ� # 厎 0x538f:zhÇŽ,zhÇŽi # åŽ� 0x5390:páng # åŽ� 0x5392:qiè # 厒 0x5393:yá # 厓 0x5394:zhì,shÄ« # 厔 0x5395:cè # 厕 0x5396:máng # 厖 0x5397:tí # 厗 0x5398:lí # 厘 0x5399:shè # 厙 0x539a:hòu # 厚 0x539b:tÄ«ng # 厛 0x539c:zuÄ« # 厜 0x539d:cuò # åŽ� 0x539e:fèi # 厞 0x539f:yuán # 原 0x53a0:cè # 厠 0x53a1:yuán # 厡 0x53a2:xiÄ�ng # 厢 0x53a3:yÇŽn # 厣 0x53a4:lì # 厤 0x53a5:jué # 厥 0x53a6:shà,xià # 厦 0x53a7:diÄ�n # 厧 0x53a8:chú # 厨 0x53a9:jiù # 厩 0x53aa:jÇ�n # 厪 0x53ab:áo # 厫 0x53ac:guÇ� # 厬 0x53ad:yàn # 厭 0x53ae:sÄ« # 厮 0x53af:lì # 厯 0x53b0:chÇŽng # 厰 0x53b1:qiÄ�n,lán # 厱 0x53b2:lì # 厲 0x53b3:yán # 厳 0x53b4:yÇŽn # 厴 0x53b5:yuán # 厵 0x53b6:sÄ«,mÇ’u # 厶 0x53b7:gÅ�ng,hóng # 厷 0x53b8:lín,miÇŽo # 厸 0x53b9:róu,qiú # 厹 0x53ba:qù # 厺 0x53bb:qù # 去 0x53bd:lÄ›i # 厽 0x53be:dÅ« # 厾 0x53bf:xiàn,xuán # 县 0x53c0:zhuÄ�n # å�€ 0x53c1:sÄ�n # å�� 0x53c2:cÄ�n,shÄ“n,cÄ“n,sÄ�n # å�‚ 0x53c3:cÄ�n,shÄ“n,cÄ“n,sÄ�n # å�ƒ 0x53c4:cÄ�n,shÄ“n,cÄ“n,sÄ�n # å�„ 0x53c5:cÄ�n,shÄ“n,cÄ“n,sÄ�n # å�… 0x53c6:ài # å�† 0x53c7:dài # å�‡ 0x53c8:yòu # å�ˆ 0x53c9:chÄ�,chá,chÇŽ # å�‰ 0x53ca:jí # å�Š 0x53cb:yÇ’u # å�‹ 0x53cc:shuÄ�ng # å�Œ 0x53cd:fÇŽn # å�� 0x53ce:shÅ�u # å�Ž 0x53cf:guái # å�� 0x53d0:bá # å�� 0x53d1:fÄ�,fà # å�‘ 0x53d2:ruò # å�’ 0x53d3:lì # å�“ 0x53d4:shÅ« # å�” 0x53d5:zhuó,yÇ�,lì,jué # å�• 0x53d6:qÇ” # å�– 0x53d7:shòu # å�— 0x53d8:biàn # å�˜ 0x53d9:xù # å�™ 0x53da:jiÇŽ # å�š 0x53db:pàn # å�› 0x53dc:sÇ’u # å�œ 0x53dd:jí # å�� 0x53de:wèi,yù # å�ž 0x53df:sÇ’u # å�Ÿ 0x53e0:dié # å�  0x53e1:ruì # å�¡ 0x53e2:cóng # å�¢ 0x53e3:kÇ’u # å�£ 0x53e4:gÇ” # å�¤ 0x53e5:jù,gÅ�u # å�¥ 0x53e6:lìng # å�¦ 0x53e7:guÇŽ # å�§ 0x53e8:tÄ�o,dÄ�o # å�¨ 0x53e9:kòu # å�© 0x53ea:zhÄ«,zhÇ� # å�ª 0x53eb:jiào # å�« 0x53ec:zhào,shào # å�¬ 0x53ed:bÄ� # å�­ 0x53ee:dÄ«ng # å�® 0x53ef:kÄ›,kè # å�¯ 0x53f0:tái,tÄ�i # å�° 0x53f1:chì # å�± 0x53f2:shÇ� # å�² 0x53f3:yòu # å�³ 0x53f4:qiú # å�´ 0x53f5:pÇ’ # å�µ 0x53f6:yè,xié # å�¶ 0x53f7:hào,háo # å�· 0x53f8:sÄ« # å�¸ 0x53f9:tàn # å�¹ 0x53fa:chÇ� # å�º 0x53fb:lè # å�» 0x53fc:diÄ�o # å�¼ 0x53fd:jÄ« # å�½ 0x53ff:hÅ�ng,hóng # å�¿ 0x5400:miÄ“ # å�€ 0x5401:xÅ«,yù # å�� 0x5402:máng # å�‚ 0x5403:chÄ« # å�ƒ 0x5404:gè,gÄ› # å�„ 0x5405:xuÄ�n,sòng # å�… 0x5406:yÄ�o # å�† 0x5407:zÇ� # å�‡ 0x5408:hé,gÄ› # å�ˆ 0x5409:jí # å�‰ 0x540a:diào # å�Š 0x540b:dòu,cùn # å�‹ 0x540c:tóng,tòng # å�Œ 0x540d:míng # å�� 0x540e:hòu # å�Ž 0x540f:lì # å�� 0x5410:tÇ”,tù # å�� 0x5411:xiàng # å�‘ 0x5412:zhà,zhÄ� # å�’ 0x5413:xià,hè # å�“ 0x5414:yÄ“ # å�” 0x5415:lÇš # å�• 0x5416:yÄ�,Ä� # å�– 0x5417:má,mÇŽ,ma # å�— 0x5418:Ç’u # å�˜ 0x5419:huÅ� # å�™ 0x541a:yÄ« # å�š 0x541b:jÅ«n # å�› 0x541c:chÇ’u # å�œ 0x541d:lìn # å�� 0x541e:tÅ«n # å�ž 0x541f:yín # å�Ÿ 0x5420:fèi # å�  0x5421:pÇ�,bÇ� # å�¡ 0x5422:qìn # å�¢ 0x5423:qìn # å�£ 0x5424:jiè,gè # å�¤ 0x5425:bù # å�¥ 0x5426:fÇ’u,pÇ� # å�¦ 0x5427:bÄ�,ba # å�§ 0x5428:dÅ«n # å�¨ 0x5429:fÄ“n # å�© 0x542a:é,huÄ� # å�ª 0x542b:hán # å�« 0x542c:tÄ«ng # å�¬ 0x542d:háng,kÄ“ng # å�­ 0x542e:shÇ”n # å�® 0x542f:qÇ� # å�¯ 0x5430:hóng # å�° 0x5431:zhÄ«,zÄ« # å�± 0x5432:yÇ�n,shÄ›n # å�² 0x5433:wú # å�³ 0x5434:wú # å�´ 0x5435:chÇŽo,chÄ�o # å�µ 0x5436:nà,nè # å�¶ 0x5437:xuè,chuò,jué # å�· 0x5438:xÄ« # å�¸ 0x5439:chuÄ« # å�¹ 0x543a:dÅ�u,rú # å�º 0x543b:wÄ›n # å�» 0x543c:hÇ’u # å�¼ 0x543d:hÇ’u,hÅ�ng,Å�u # å�½ 0x543e:wú,yù # å�¾ 0x543f:gào # å�¿ 0x5440:yÄ�,ya # å‘€ 0x5441:jùn # å‘� 0x5442:lÇš # å‘‚ 0x5443:è # 呃 0x5444:gé # å‘„ 0x5445:wÄ›n # å‘… 0x5446:dÄ�i # 呆 0x5447:qÇ� # 呇 0x5448:chéng # 呈 0x5449:wú # 呉 0x544a:gào # 告 0x544b:fÅ« # å‘‹ 0x544c:jiào # 呌 0x544d:hÅ�ng # å‘� 0x544e:chÇ� # 呎 0x544f:shÄ“ng # å‘� 0x5450:nà,nè # å‘� 0x5451:tÅ«n,tiÄ�n # å‘‘ 0x5452:fÇ”,ḿ # å‘’ 0x5453:yì # å‘“ 0x5454:dÄ�i,tÇŽi # å‘” 0x5455:Ç’u,Å�u,òu # å‘• 0x5456:lì # å‘– 0x5457:bei,bài # å‘— 0x5458:yuán,yún,yùn # 员 0x5459:wÄ�i,hé,wÇ’,wÄ�,guÇŽ,guÅ� # å‘™ 0x545b:qiÄ�ng,qiàng # å‘› 0x545c:wÅ« # 呜 0x545d:è # å‘� 0x545e:shÄ« # 呞 0x545f:juÇŽn # 呟 0x5460:pÄ›n # å‘  0x5461:mÇ�n,wÄ›n # å‘¡ 0x5462:ne,ní # å‘¢ 0x5464:líng # 呤 0x5465:rán # å‘¥ 0x5466:yÅ�u # 呦 0x5467:dÇ� # å‘§ 0x5468:zhÅ�u # 周 0x5469:shì # å‘© 0x546a:zhòu # 呪 0x546b:tiè,chè # å‘« 0x546c:xì # 呬 0x546d:yì # å‘­ 0x546e:qì,zhÄ« # å‘® 0x546f:píng # 呯 0x5470:zÇ�,cÄ« # å‘° 0x5471:guÄ�,gÅ«,guÇŽ # 呱 0x5472:zÄ«,cÄ« # 呲 0x5473:wèi # 味 0x5474:xÇ”,hÇ’u,gòu # å‘´ 0x5475:hÄ“,a,kÄ“ # 呵 0x5476:náo # å‘¶ 0x5477:xiÄ�,gÄ� # å‘· 0x5478:pÄ“i # 呸 0x5479:yì # 呹 0x547a:xiÄ�o,háo # 呺 0x547b:shÄ“n # å‘» 0x547c:hÅ« # 呼 0x547d:mìng # 命 0x547e:dá,dàn # 呾 0x547f:qÅ« # å‘¿ 0x5480:jÇ”,zuÇ� # å’€ 0x5482:zÄ� # å’‚ 0x5483:tuÅ� # å’ƒ 0x5484:duÅ� # å’„ 0x5485:pÇ’u # å’… 0x5486:páo # å’† 0x5487:bì # å’‡ 0x5488:fú # å’ˆ 0x5489:yÇŽng # å’‰ 0x548a:hé,hè # å’Š 0x548b:zÇŽ,zé,zhÄ� # å’‹ 0x548c:hé,hè,huó,huò,hú # å’Œ 0x548d:hÄ�i # å’� 0x548e:jiù # å’Ž 0x548f:yÇ’ng # å’� 0x5490:fù # å’� 0x5491:dÄ� # å’‘ 0x5492:zhòu # å’’ 0x5493:wÇŽ # å’“ 0x5494:kÇŽ # å’” 0x5495:gÅ« # å’• 0x5496:kÄ�,gÄ� # å’– 0x5497:zuo # å’— 0x5498:bù # å’˜ 0x5499:lóng # å’™ 0x549a:dÅ�ng # å’š 0x549b:níng # å’› 0x549d:sÄ« # å’� 0x549e:xiàn,xián # å’ž 0x549f:huò # å’Ÿ 0x54a0:qì # å’  0x54a1:èr # å’¡ 0x54a2:è # å’¢ 0x54a3:guÄ�ng # å’£ 0x54a4:zhà # å’¤ 0x54a5:dié,xÄ« # å’¥ 0x54a6:yí # å’¦ 0x54a7:liÄ›,liÄ“,lié,lie # å’§ 0x54a8:zÄ« # å’¨ 0x54a9:miÄ“ # å’© 0x54aa:mÄ« # å’ª 0x54ab:zhÇ� # å’« 0x54ac:yÇŽo # å’¬ 0x54ad:jÄ«,xÄ«,qià # å’­ 0x54ae:zhòu # å’® 0x54af:lo,kÇŽ,luò,gÄ“ # å’¯ 0x54b0:shù,xún # å’° 0x54b1:zán,zá,zÇŽ # å’± 0x54b2:xiào # å’² 0x54b3:ké,hÄ�i # å’³ 0x54b4:huÄ« # å’´ 0x54b5:kuÄ� # å’µ 0x54b6:huài,shì # å’¶ 0x54b7:táo # å’· 0x54b8:xián # å’¸ 0x54b9:è,àn # å’¹ 0x54ba:xuÇŽn,xuÄ�n # å’º 0x54bb:xiÅ« # å’» 0x54bc:wÄ�i,hé,wÇ’,wÄ�,guÇŽ,guÅ� # å’¼ 0x54bd:yÄ�n,yàn,yè # å’½ 0x54be:lÇŽo # å’¾ 0x54bf:yÄ« # å’¿ 0x54c0:Ä�i # å“€ 0x54c1:pÇ�n # å“� 0x54c2:shÄ›n # å“‚ 0x54c3:tóng # 哃 0x54c4:hÅ�ng,hÇ’ng,hòng # å“„ 0x54c5:xiÅ�ng # å“… 0x54c6:duÅ� # 哆 0x54c7:wÄ�,wa # 哇 0x54c8:hÄ�,hÇŽ,hà # 哈 0x54c9:zÄ�i # 哉 0x54ca:yòu # 哊 0x54cb:diè,dì # å“‹ 0x54cc:pài # 哌 0x54cd:xiÇŽng # å“� 0x54ce:Ä�i # 哎 0x54cf:gén,hÄ›n # å“� 0x54d0:kuÄ�ng # å“� 0x54d1:yÇŽ,yÄ� # å“‘ 0x54d2:dÄ� # å“’ 0x54d3:xiÄ�o # å““ 0x54d4:bì # å“” 0x54d5:yuÄ›,huì # å“• 0x54d7:huá,huÄ� # å“— 0x54d9:kuài # å“™ 0x54da:duÇ’ # 哚 0x54dc:jì,jiÄ“,zhÄ�i # 哜 0x54dd:nóng # å“� 0x54de:mÅ�u # 哞 0x54df:yÅ�,yo # 哟 0x54e0:hào # å“  0x54e1:yuán,yún,yùn # å“¡ 0x54e2:lòng # å“¢ 0x54e3:pÇ’u # å“£ 0x54e4:máng # 哤 0x54e5:gÄ“ # å“¥ 0x54e6:ó,ò,é # 哦 0x54e7:chÄ« # å“§ 0x54e8:shào # 哨 0x54e9:li,lÇ�,lÄ« # å“© 0x54ea:nÇŽ,nÄ›i,na,né # 哪 0x54eb:zú # å“« 0x54ec:hè # 哬 0x54ed:kÅ« # å“­ 0x54ee:xiào # å“® 0x54ef:xiàn # 哯 0x54f0:láo # å“° 0x54f1:pò,bÄ�,bÅ� # 哱 0x54f2:zhé # 哲 0x54f3:zhÄ� # 哳 0x54f4:liàng,láng # å“´ 0x54f5:bÄ� # 哵 0x54f6:miÄ“ # å“¶ 0x54f7:liè,lÇœ # å“· 0x54f8:suÄ« # 哸 0x54f9:fú # 哹 0x54fa:bÇ” # 哺 0x54fb:hÄ�n # å“» 0x54fc:hÄ“ng,hng # 哼 0x54fd:gÄ›ng # 哽 0x54fe:chuò,yuè # 哾 0x54ff:gÄ›,jiÄ� # å“¿ 0x5500:yòu # 唀 0x5501:yàn # å”� 0x5502:gÅ« # 唂 0x5503:gÅ« # 唃 0x5504:bei,bài # 唄 0x5505:hán,hàn # å”… 0x5506:suÅ� # 唆 0x5507:chún # 唇 0x5508:yì # 唈 0x5509:Ä�i,ài # 唉 0x550a:jiá,qiÇŽn # 唊 0x550b:tÇ”,tù # 唋 0x550c:dàn,xián,yán # 唌 0x550d:wÇŽn # å”� 0x550e:lì # 唎 0x550f:xÄ« # å”� 0x5510:táng # å”� 0x5511:zuò # 唑 0x5512:qiú # å”’ 0x5513:chÄ“ # 唓 0x5514:wù,wú,Å„g,Å„ # å”” 0x5515:zào # 唕 0x5516:yÇŽ # å”– 0x5517:dÅ�u # å”— 0x5518:qÇ� # 唘 0x5519:dí # å”™ 0x551a:qìn # 唚 0x551b:mà # å”› 0x551d:gòng,hÇ’ng,gÇ’ng # å”� 0x551e:dóu # 唞 0x5520:lào,láo # å”  0x5521:liÇŽng # 唡 0x5522:suÇ’ # 唢 0x5523:zào # 唣 0x5524:huàn # 唤 0x5526:shÄ� # 唦 0x5527:jÄ« # å”§ 0x5528:zÇ” # 唨 0x5529:wÅ�,wÄ›i # 唩 0x552a:fÄ›ng # 唪 0x552b:jìn,yín # 唫 0x552c:hÇ”,xià # 唬 0x552d:qì # å”­ 0x552e:shòu # å”® 0x552f:wéi # 唯 0x5530:shuÄ� # å”° 0x5531:chàng # å”± 0x5532:ér,wÄ� # 唲 0x5533:lì # 唳 0x5534:qiàng # å”´ 0x5535:ÇŽn # 唵 0x5536:jiè,zé,jí # å”¶ 0x5537:yÅ� # å”· 0x5538:niàn # 唸 0x5539:yÅ« # 唹 0x553a:tiÇŽn # 唺 0x553b:lài # å”» 0x553c:shà # 唼 0x553d:xÄ« # 唽 0x553e:tuò # 唾 0x553f:hÅ« # 唿 0x5540:ái # å•€ 0x5541:zhÅ�u,zhÄ�o,tiào # å•� 0x5542:gòu # å•‚ 0x5543:kÄ›n # 啃 0x5544:zhuó # å•„ 0x5545:zhuó,zhào # å•… 0x5546:shÄ�ng # 商 0x5547:dí # 啇 0x5548:hèng # 啈 0x5549:lán,lín # 啉 0x554a:Ä�,á,ÇŽ,à,a # 啊 0x554b:cÇŽi # å•‹ 0x554c:qiÄ�ng # 啌 0x554d:zhÅ«n,tÅ«n,xiÄ�ng,duÇ� # å•� 0x554e:wÇ” # 啎 0x554f:wèn # å•� 0x5550:cuì,qi # å•� 0x5551:shà,jié,dié,tì # å•‘ 0x5552:gÇ” # å•’ 0x5553:qÇ� # å•“ 0x5554:qÇ� # å•” 0x5555:táo # å•• 0x5556:dàn # å•– 0x5557:dàn # å•— 0x5558:yuÄ“,wÄ� # 啘 0x5559:zÇ�,cÇ� # å•™ 0x555a:bÇ�,tú # 啚 0x555b:cuì # å•› 0x555c:chuò,chuài # 啜 0x555d:hé # å•� 0x555e:yÇŽ,yÄ� # 啞 0x555f:qÇ� # 啟 0x5560:zhé # å•  0x5561:fÄ“i # å•¡ 0x5562:liÇŽng # å•¢ 0x5563:xián # å•£ 0x5564:pí # 啤 0x5565:shá # å•¥ 0x5566:lÄ�,la # 啦 0x5567:zé # å•§ 0x5568:qíng,yÄ«ng # 啨 0x5569:guà # å•© 0x556a:pÄ� # 啪 0x556b:zhÄ›,shì # å•« 0x556c:sè # 啬 0x556d:zhuàn # å•­ 0x556e:niè # å•® 0x556f:guÅ� # 啯 0x5570:luÅ�,luó,luo # å•° 0x5571:yán # 啱 0x5572:dÄ« # 啲 0x5573:quán # 啳 0x5574:tÄ�n,chÇŽn,tuÅ� # å•´ 0x5575:bo # 啵 0x5576:dìng # å•¶ 0x5577:lÄ�ng # å•· 0x5578:xiào # 啸 0x557a:táng # 啺 0x557b:chì # å•» 0x557c:tí # 啼 0x557d:Ä�n,án # 啽 0x557e:jiÅ« # 啾 0x557f:dàn # å•¿ 0x5580:kÄ� # å–€ 0x5581:yóng,yú # å–� 0x5582:wèi # å–‚ 0x5583:nán # å–ƒ 0x5584:shàn # å–„ 0x5585:yù # å–… 0x5586:zhé # å–† 0x5587:lÇŽ # å–‡ 0x5588:jiÄ“ # å–ˆ 0x5589:hóu # å–‰ 0x558a:hÇŽn # å–Š 0x558b:dié,zhá # å–‹ 0x558c:zhÅ�u # å–Œ 0x558d:chái # å–� 0x558e:wÄ�i # å–Ž 0x558f:nuò,rÄ› # å–� 0x5590:huò,guó,xù # å–� 0x5591:yÄ«n # å–‘ 0x5592:zán,zá,zÇŽ # å–’ 0x5593:yÄ�o # å–“ 0x5594:Å�,wÅ� # å–” 0x5595:miÇŽn # å–• 0x5596:hú # å–– 0x5597:yÇ”n # å–— 0x5598:chuÇŽn # å–˜ 0x5599:huì # å–™ 0x559a:huàn # å–š 0x559b:huàn,yuán,xuÇŽn,hé # å–› 0x559c:xÇ� # å–œ 0x559d:hÄ“,hè,yè # å–� 0x559e:jÄ« # å–ž 0x559f:kuì # å–Ÿ 0x55a0:zhÇ’ng,chuáng # å–  0x55a1:wéi,wèi # å–¡ 0x55a2:shà # å–¢ 0x55a3:xÇ” # å–£ 0x55a4:huáng # å–¤ 0x55a5:duó,zhà # å–¥ 0x55a6:yán # å–¦ 0x55a7:xuÄ�n # å–§ 0x55a8:liàng # å–¨ 0x55a9:yù # å–© 0x55aa:sÄ�ng,sàng # å–ª 0x55ab:chÄ« # å–« 0x55ac:qiáo,jiÄ�o # å–¬ 0x55ad:yàn # å–­ 0x55ae:dÄ�n,shàn,chán # å–® 0x55af:pèn,bÄ“n # å–¯ 0x55b0:cÄ�n,sÅ«n,qÄ« # å–° 0x55b1:lí # å–± 0x55b2:yÅ�,yo # å–² 0x55b3:zhÄ�,chÄ� # å–³ 0x55b4:wÄ“i # å–´ 0x55b5:miÄ�o # å–µ 0x55b6:yíng # å–¶ 0x55b7:pÄ“n,pèn # å–· 0x55b9:kuí # å–¹ 0x55ba:xí # å–º 0x55bb:yù # å–» 0x55bc:jiÄ“ # å–¼ 0x55bd:lóu,lou # å–½ 0x55be:kù # å–¾ 0x55bf:zào,qiÄ�o # å–¿ 0x55c0:hù # å—€ 0x55c1:tí # å—� 0x55c2:yáo # å—‚ 0x55c3:hè,xiÄ�o,xiào,hù # å—ƒ 0x55c4:shà,á # å—„ 0x55c5:xiù # å—… 0x55c6:qiÄ�ng,qiàng # å—† 0x55c7:sè # å—‡ 0x55c8:yÅ�ng # å—ˆ 0x55c9:sù # å—‰ 0x55ca:gòng,hÇ’ng,gÇ’ng # å—Š 0x55cb:xié # å—‹ 0x55cc:yì,ài # å—Œ 0x55cd:suÅ� # å—� 0x55ce:má,mÇŽ,ma # å—Ž 0x55cf:chÄ� # å—� 0x55d0:hài # å—� 0x55d1:kÄ“,kè # å—‘ 0x55d2:tà,dÄ� # å—’ 0x55d3:sÇŽng # å—“ 0x55d4:chÄ“n # å—” 0x55d5:rù # å—• 0x55d6:sÅ�u # å—– 0x55d7:wÄ�,gÇ” # å—— 0x55d8:jÄ« # å—˜ 0x55d9:bÄ“ng,pÇŽng # å—™ 0x55da:wÅ« # å—š 0x55db:xián,qiàn,qiè # å—› 0x55dc:shì # å—œ 0x55dd:gé # å—� 0x55de:zÄ« # å—ž 0x55df:jiÄ“ # å—Ÿ 0x55e0:lào # å—  0x55e1:wÄ“ng # å—¡ 0x55e2:wà # å—¢ 0x55e3:sì # å—£ 0x55e4:chÄ« # å—¤ 0x55e5:háo # å—¥ 0x55e6:suÅ� # å—¦ 0x55e8:hÄ�i,hÄ“i # å—¨ 0x55e9:suÇ’ # å—© 0x55ea:qín # å—ª 0x55eb:niè # å—« 0x55ec:hÄ“ # å—¬ 0x55ee:sÇŽi # å—® 0x55f0:gÄ› # å—° 0x55f1:ná # å—± 0x55f2:diÇŽ # å—² 0x55f3:ÇŽi,ài,Ä�i # å—³ 0x55f5:tÅ�ng # å—µ 0x55f6:bì # å—¶ 0x55f7:áo # å—· 0x55f8:áo # å—¸ 0x55f9:lián # å—¹ 0x55fa:zuÄ«,suÄ« # å—º 0x55fb:zhÄ“,zhè,zhù,zhe # å—» 0x55fc:mò # å—¼ 0x55fd:sòu # å—½ 0x55fe:sÇ’u # å—¾ 0x55ff:tÇŽn # å—¿ 0x5600:dí # 嘀 0x5601:qÄ« # å˜� 0x5602:jiào # 嘂 0x5603:chÅ�ng # 嘃 0x5604:jiào,dÇŽo # 嘄 0x5605:kÇŽi,gÄ› # 嘅 0x5606:tàn # 嘆 0x5607:shÄ�n,càn # 嘇 0x5608:cáo # 嘈 0x5609:jiÄ� # 嘉 0x560a:ái # 嘊 0x560b:xiào # 嘋 0x560c:piÄ�o # 嘌 0x560d:lóu,lou # å˜� 0x560e:gÄ�,gá,gÇŽ # 嘎 0x560f:gÇ”,jiÇŽ # å˜� 0x5610:xiÄ�o,jiÄ�o # å˜� 0x5611:hÅ« # 嘑 0x5612:huì # 嘒 0x5613:guÅ� # 嘓 0x5614:Ç’u,Å�u,òu # 嘔 0x5615:xiÄ�n # 嘕 0x5616:zé # 嘖 0x5617:cháng # 嘗 0x5618:xÅ«,shÄ« # 嘘 0x5619:pó # 嘙 0x561a:dÄ“,dÄ“i # 嘚 0x561b:má,ma # 嘛 0x561c:mà # 嘜 0x561d:hú # å˜� 0x561e:lei,lÄ“ # 嘞 0x561f:dÅ« # 嘟 0x5620:gÄ�,gá,gÇŽ # 嘠 0x5621:tÄ�ng # 嘡 0x5622:yÄ› # 嘢 0x5623:bÄ“ng # 嘣 0x5624:yÄ«ng # 嘤 0x5626:jiào # 嘦 0x5627:mì # 嘧 0x5628:xiào # 嘨 0x5629:huá,huÄ� # 嘩 0x562a:mÇŽi # 嘪 0x562b:rán # 嘫 0x562c:zuÅ�,chuài # 嘬 0x562d:pÄ“ng # 嘭 0x562e:lào,láo # 嘮 0x562f:xiào # 嘯 0x5630:jÄ« # 嘰 0x5631:zhÇ” # 嘱 0x5632:cháo,zhÄ�o # 嘲 0x5633:kuì # 嘳 0x5634:zuÇ� # 嘴 0x5635:xiÄ�o # 嘵 0x5636:sÄ« # 嘶 0x5637:háo # 嘷 0x5638:fÇ”,ḿ # 嘸 0x5639:liáo # 嘹 0x563a:qiáo,qiào # 嘺 0x563b:xÄ« # 嘻 0x563c:chù,xù,shòu # 嘼 0x563d:tÄ�n,chÇŽn # 嘽 0x563e:dàn,tán # 嘾 0x563f:hÄ“i,mò # 嘿 0x5640:xùn # 噀 0x5641:Ä› # å™� 0x5642:zÅ«n # 噂 0x5643:fÄ�n,bo # 噃 0x5644:chÄ« # 噄 0x5645:huÄ« # å™… 0x5646:zÇŽn # 噆 0x5647:chuáng # 噇 0x5648:cù,zÄ�,hé # 噈 0x5649:dàn # 噉 0x564a:jué # 噊 0x564b:tÅ«n,kuò # 噋 0x564c:cÄ“ng,chÄ“ng # 噌 0x564d:jiào # å™� 0x564e:yÄ“ # 噎 0x564f:xÄ« # å™� 0x5650:qì # å™� 0x5651:háo # 噑 0x5652:lián # å™’ 0x5653:xÅ«,shÄ« # 噓 0x5654:dÄ“ng # å™” 0x5655:huÄ« # 噕 0x5656:yín # å™– 0x5657:pÅ« # å™— 0x5658:juÄ“ # 噘 0x5659:qín # å™™ 0x565a:xún # 噚 0x565b:niè # å™› 0x565c:lÅ« # 噜 0x565d:sÄ« # å™� 0x565e:yÇŽn # 噞 0x565f:yÄ«ng # 噟 0x5660:dÄ� # å™  0x5661:zhÄ�n,dÄ�n # 噡 0x5662:Å� # 噢 0x5663:zhòu,zhuó # 噣 0x5664:jìn # 噤 0x5665:nóng # 噥 0x5666:yuÄ›,huì # 噦 0x5667:xiè # å™§ 0x5668:qì # 器 0x5669:è # 噩 0x566a:zào # 噪 0x566b:yÄ« # 噫 0x566c:shì # 噬 0x566d:jiào,qiào,chÄ« # å™­ 0x566e:yuàn # å™® 0x566f:ÇŽi,ài,Ä�i # 噯 0x5670:yÅ�ng,yÇ’ng # å™° 0x5671:jué,xué # å™± 0x5672:kuài # 噲 0x5673:yÇ” # 噳 0x5674:pÄ“n,pèn # å™´ 0x5675:dào # 噵 0x5676:gá # å™¶ 0x5677:xÄ«n,hÄ›n,hèn # å™· 0x5678:dÅ«n # 噸 0x5679:dÄ�ng # 噹 0x567b:sÄ�i # å™» 0x567c:pÄ« # 噼 0x567d:pÇ� # 噽 0x567e:yÄ«n # 噾 0x567f:zuÇ� # 噿 0x5680:níng # 嚀 0x5681:dí # åš� 0x5682:làn # åš‚ 0x5683:tà # 嚃 0x5684:huò,Ç’ # åš„ 0x5685:rú # åš… 0x5686:hÄ�o # 嚆 0x5687:hè,xià # 嚇 0x5688:yàn # 嚈 0x5689:duÅ� # 嚉 0x568a:xiù,pì # 嚊 0x568b:zhÅ�u,chóu # åš‹ 0x568c:jì,jiÄ“,zhÄ�i # 嚌 0x568d:jìn # åš� 0x568e:háo # 嚎 0x568f:tì # åš� 0x5690:cháng # åš� 0x5693:cÄ�,chÄ� # åš“ 0x5694:tì # åš” 0x5695:lÅ« # åš• 0x5696:huì # åš– 0x5697:bó,pào,bào # åš— 0x5698:yÅ�u # 嚘 0x5699:niè # åš™ 0x569a:yín # åšš 0x569b:hù # åš› 0x569c:mèi,me,mò # åšœ 0x569d:hÅ�ng # åš� 0x569e:zhé # åšž 0x569f:lí # 嚟 0x56a0:liú # åš  0x56a2:náng # 嚢 0x56a3:xiÄ�o,áo # 嚣 0x56a4:mÅ� # 嚤 0x56a5:yàn # 嚥 0x56a6:lì # 嚦 0x56a7:lú # åš§ 0x56a8:lóng # 嚨 0x56a9:pó # åš© 0x56aa:dàn # 嚪 0x56ab:chèn # åš« 0x56ac:pín # 嚬 0x56ad:pÇ� # åš­ 0x56ae:xiàng # åš® 0x56af:huò # 嚯 0x56b0:mè # åš° 0x56b1:xÄ« # åš± 0x56b2:duÇ’ # åš² 0x56b3:kù # åš³ 0x56b4:yán # åš´ 0x56b5:chán # åšµ 0x56b6:yÄ«ng # åš¶ 0x56b7:rÇŽng,rÄ�ng # åš· 0x56b8:diÇŽn,dím # 嚸 0x56b9:lá # åš¹ 0x56ba:tà # 嚺 0x56bb:xiÄ�o # åš» 0x56bc:jiáo,jué,jiào # åš¼ 0x56bd:chuò # åš½ 0x56be:huàn,huÄ�n # åš¾ 0x56bf:huò # åš¿ 0x56c0:zhuàn # 囀 0x56c1:niè # å›� 0x56c2:xiÄ�o # 囂 0x56c3:zá,cà # 囃 0x56c4:lí # 囄 0x56c5:chÇŽn # å›… 0x56c6:chài # 囆 0x56c7:lì # 囇 0x56c8:yì # 囈 0x56c9:luÅ�,luó,luo # 囉 0x56ca:náng,nÄ�ng # 囊 0x56cb:zá,zàn,cÄ�n # 囋 0x56cc:sÅ« # 囌 0x56cd:xÇ� # å›� 0x56cf:jiÄ�n # å›� 0x56d0:yàn,zá,niè # å›� 0x56d1:zhÇ” # 囑 0x56d2:lán # å›’ 0x56d3:niè # 囓 0x56d4:nÄ�ng # å›” 0x56d7:wéi,guó # å›— 0x56d8:huí # 囘 0x56d9:yÄ«n # å›™ 0x56da:qiú # 囚 0x56db:sì # å›› 0x56dc:nín # 囜 0x56dd:jiÇŽn,nÄ�n # å›� 0x56de:huí # 回 0x56df:xìn # 囟 0x56e0:yÄ«n # å›  0x56e1:nÄ�n # 囡 0x56e2:tuán # 团 0x56e3:tuán # 団 0x56e4:dùn,tún # 囤 0x56e5:kàng # 囥 0x56e6:yuÄ�n # 囦 0x56e7:jiÇ’ng # å›§ 0x56e8:piÄ�n # 囨 0x56e9:yún # 囩 0x56ea:cÅ�ng # 囪 0x56eb:hú # 囫 0x56ec:huí # 囬 0x56ed:yuán # å›­ 0x56ee:é # å›® 0x56ef:guó # 囯 0x56f0:kùn # å›° 0x56f1:cÅ�ng # å›± 0x56f2:wéi,tÅ�ng # 囲 0x56f3:tú # 図 0x56f4:wéi # å›´ 0x56f5:lún # 囵 0x56f6:guó # å›¶ 0x56f7:qÅ«n # å›· 0x56f8:rì # 囸 0x56f9:líng # 囹 0x56fa:gù # 固 0x56fb:guó # å›» 0x56fc:tÄ�i # 囼 0x56fd:guó # 国 0x56fe:tú # 图 0x56ff:yòu # 囿 0x5700:guó # 圀 0x5701:yín # åœ� 0x5702:hùn # 圂 0x5703:pÇ” # 圃 0x5704:yÇ” # 圄 0x5705:hán # 圅 0x5706:yuán # 圆 0x5707:lún # 圇 0x5708:quÄ�n,juàn,juÄ�n # 圈 0x5709:yÇ” # 圉 0x570a:qÄ«ng # 圊 0x570b:guó # 國 0x570c:chuán,chuí # 圌 0x570d:wéi # åœ� 0x570e:yuán # 圎 0x570f:quÄ�n,juàn,juÄ�n # åœ� 0x5710:kÅ« # åœ� 0x5711:pÇ” # 圑 0x5712:yuán # 園 0x5713:yuán # 圓 0x5714:yà # 圔 0x5716:tú # 圖 0x5717:tú # 圗 0x5718:tuán # 團 0x5719:lüè # 圙 0x571a:huì # 圚 0x571b:yì # 圛 0x571c:huán,yuán # 圜 0x571d:luán # åœ� 0x571e:luán # 圞 0x571f:tÇ” # 土 0x5720:yà # 圠 0x5721:tÇ” # 圡 0x5722:tÇ�ng # 圢 0x5723:shèng # 圣 0x5724:pú # 圤 0x5725:lù # 圥 0x5727:yÄ� # 圧 0x5728:zài # 在 0x5729:wéi,xÅ« # 圩 0x572a:gÄ“ # 圪 0x572b:yù,zhÅ«n # 圫 0x572c:wÅ« # 圬 0x572d:guÄ« # 圭 0x572e:pÇ� # 圮 0x572f:yí # 圯 0x5730:dì,de # 地 0x5731:qiÄ�n,sú # 圱 0x5732:qiÄ�n # 圲 0x5733:zhèn # 圳 0x5734:zhuó # 圴 0x5735:dàng # 圵 0x5736:qià # 圶 0x5739:kuàng # 圹 0x573a:cháng,chÇŽng # 场 0x573b:qí,yín # 圻 0x573c:niè # 圼 0x573d:mò # 圽 0x573e:jÄ« # 圾 0x573f:jiá # 圿 0x5740:zhÇ� # å�€ 0x5741:zhÇ�,zhì # å�� 0x5742:bÇŽn # å�‚ 0x5743:xÅ«n # å�ƒ 0x5744:yì # å�„ 0x5745:qÇ�n # å�… 0x5746:méi,fén # å�† 0x5747:jÅ«n # å�‡ 0x5748:rÇ’ng,kÄ“ng # å�ˆ 0x5749:tún,dùn # å�‰ 0x574a:fÄ�ng,fáng # å�Š 0x574b:bèn,fèn # å�‹ 0x574c:bèn # å�Œ 0x574d:tÄ�n # å�� 0x574e:kÇŽn # å�Ž 0x574f:huài,pÄ“i,pÄ«,péi # å�� 0x5750:zuò # å�� 0x5751:kÄ“ng # å�‘ 0x5752:bì # å�’ 0x5753:jÇ�ng # å�“ 0x5754:dì,làn # å�” 0x5755:jÄ«ng # å�• 0x5756:jì # å�– 0x5757:kuài # å�— 0x5758:dÇ� # å�˜ 0x5759:jÄ«ng # å�™ 0x575a:jiÄ�n # å�š 0x575b:tán # å�› 0x575c:lì # å�œ 0x575d:bà # å�� 0x575e:wù # å�ž 0x575f:fén # å�Ÿ 0x5760:zhuì # å�  0x5761:pÅ� # å�¡ 0x5762:pÇŽn,bàn # å�¢ 0x5763:táng # å�£ 0x5764:kÅ«n # å�¤ 0x5765:qÅ« # å�¥ 0x5766:tÇŽn # å�¦ 0x5767:zhÇ� # å�§ 0x5768:tuó # å�¨ 0x5769:gÄ�n # å�© 0x576a:píng # å�ª 0x576b:diàn # å�« 0x576c:guà # å�¬ 0x576d:ní # å�­ 0x576e:tái # å�® 0x576f:pÄ« # å�¯ 0x5770:jiÅ�ng # å�° 0x5771:yÇŽng # å�± 0x5772:fó # å�² 0x5773:ào # å�³ 0x5774:lù # å�´ 0x5775:qiÅ« # å�µ 0x5776:mù,mÇ” # å�¶ 0x5777:kÄ“,kÄ› # å�· 0x5778:gòu # å�¸ 0x5779:xuè # å�¹ 0x577a:fá # å�º 0x577b:dÇ�,chí # å�» 0x577c:chè # å�¼ 0x577d:líng # å�½ 0x577e:zhù # å�¾ 0x577f:fù # å�¿ 0x5780:hÅ« # 垀 0x5781:zhì # åž� 0x5782:chuí # åž‚ 0x5783:lÄ� # 垃 0x5784:lÇ’ng # åž„ 0x5785:lÇ’ng # åž… 0x5786:lú # 垆 0x5787:ào # 垇 0x5789:páo # 垉 0x578b:xíng # åž‹ 0x578c:dòng,tóng # 垌 0x578d:jì # åž� 0x578e:hè # 垎 0x578f:lÇœ # åž� 0x5790:cí # åž� 0x5791:chÇ� # åž‘ 0x5792:lÄ›i # åž’ 0x5793:gÄ�i # åž“ 0x5794:yÄ«n # åž” 0x5795:hòu # åž• 0x5796:duÄ« # åž– 0x5797:zhào # åž— 0x5798:fú # 垘 0x5799:guÄ�ng # åž™ 0x579a:yáo # åžš 0x579b:duÇ’,duò # åž› 0x579c:duÇ’,duò # åžœ 0x579d:guÇ� # åž� 0x579e:chá # åžž 0x579f:yáng # 垟 0x57a0:yín # åž  0x57a1:fá # åž¡ 0x57a2:gòu # 垢 0x57a3:yuán # 垣 0x57a4:dié # 垤 0x57a5:xié # 垥 0x57a6:kÄ›n # 垦 0x57a7:shÇŽng # åž§ 0x57a8:shÇ’u # 垨 0x57a9:è # åž© 0x57ab:diàn # åž« 0x57ac:hóng # 垬 0x57ad:yÄ� # åž­ 0x57ae:kuÇŽ # åž® 0x57b1:dàng # åž± 0x57b2:kÇŽi # åž² 0x57b4:nÇŽo # åž´ 0x57b5:ÇŽn # åžµ 0x57b6:xÄ«ng # åž¶ 0x57b7:xiàn # åž· 0x57b8:yuàn,huán # 垸 0x57b9:bÄ�ng # åž¹ 0x57ba:póu,fú # 垺 0x57bb:bà # åž» 0x57bc:yì # åž¼ 0x57bd:yìn # åž½ 0x57be:hàn # åž¾ 0x57bf:xù # åž¿ 0x57c0:chuí # 埀 0x57c1:cén # åŸ� 0x57c2:gÄ›ng # 埂 0x57c3:Ä�i # 埃 0x57c4:bÄ›ng,fÄ“ng # 埄 0x57c5:dì,fáng # 埅 0x57c6:què,jué # 埆 0x57c7:yÇ’ng # 埇 0x57c8:jùn # 埈 0x57c9:xiá,jiÄ� # 埉 0x57ca:dì # 埊 0x57cb:mái,mán # 埋 0x57cc:làng # 埌 0x57cd:juÇŽn # åŸ� 0x57ce:chéng # 城 0x57cf:yán,shÄ�n # åŸ� 0x57d0:qín,jÄ«n # åŸ� 0x57d1:zhé # 埑 0x57d2:liè # 埒 0x57d3:liè # 埓 0x57d4:pÇ”,bù # 埔 0x57d5:chéng # 埕 0x57d7:bù # 埗 0x57d8:shí # 埘 0x57d9:xÅ«n # 埙 0x57da:guÅ� # 埚 0x57db:jiÅ�ng # 埛 0x57dc:yÄ› # 埜 0x57dd:niàn # åŸ� 0x57de:dÄ« # 埞 0x57df:yù # 域 0x57e0:bù # 埠 0x57e1:yà # 埡 0x57e2:quán # 埢 0x57e3:suì,sù # 埣 0x57e4:pí,pì # 埤 0x57e5:qÄ«ng,zhÄ“ng # 埥 0x57e6:wÇŽn,wÄ�n # 埦 0x57e7:jù # 埧 0x57e8:lÇ”n # 埨 0x57e9:zhÄ“ng,chéng # 埩 0x57ea:kÅ�ng # 埪 0x57eb:chÇ’ng,shÇŽng # 埫 0x57ec:dÅ�ng # 埬 0x57ed:dài # 埭 0x57ee:tán,tàn # 埮 0x57ef:ÇŽn # 埯 0x57f0:cÇŽi,cài # 埰 0x57f1:chù,tòu # 埱 0x57f2:bÄ›ng # 埲 0x57f3:xiàn,kÇŽn # 埳 0x57f4:zhí # 埴 0x57f5:duÇ’ # 埵 0x57f6:yì,shì # 埶 0x57f7:zhí # 執 0x57f8:yì # 埸 0x57f9:péi # 培 0x57fa:jÄ« # 基 0x57fb:zhÇ”n # 埻 0x57fc:qí # 埼 0x57fd:sào,sÇŽo # 埽 0x57fe:jù # 埾 0x57ff:ní # 埿 0x5800:kÅ« # å € 0x5801:kè # å � 0x5802:táng # å ‚ 0x5803:kÅ«n # å ƒ 0x5804:nì # å „ 0x5805:jiÄ�n # å … 0x5806:duÄ« # å † 0x5807:jÄ«n # å ‡ 0x5808:gÄ�ng # å ˆ 0x5809:yù # å ‰ 0x580a:è # å Š 0x580b:péng,bèng # å ‹ 0x580c:gù # å Œ 0x580d:tù # å � 0x580e:lèng # å Ž 0x5810:yá # å � 0x5811:qiàn,zàn,jiàn # å ‘ 0x5813:àn # å “ 0x5815:duò,huÄ« # å • 0x5816:nÇŽo # å – 0x5817:tÅ« # å — 0x5818:chéng # å ˜ 0x5819:yÄ«n # å ™ 0x581a:huán # å š 0x581b:bì # å › 0x581c:liàn # å œ 0x581d:guÅ� # å � 0x581e:dié # å ž 0x581f:zhuàn # å Ÿ 0x5820:hòu # å   0x5821:bÇŽo,bÇ”,pù # å ¡ 0x5822:bÇŽo # å ¢ 0x5823:yú # å £ 0x5824:dÄ« # å ¤ 0x5825:máo,móu,wÇ” # å ¥ 0x5826:jiÄ“ # å ¦ 0x5827:ruán # å § 0x5828:è,ài,yè # å ¨ 0x5829:gèng # å © 0x582a:kÄ�n # å ª 0x582b:zÅ�ng # å « 0x582c:yú # å ¬ 0x582d:huáng # å ­ 0x582e:è # å ® 0x582f:yáo # å ¯ 0x5830:yàn # å ° 0x5831:bào # å ± 0x5832:jí # å ² 0x5833:méi # å ³ 0x5834:cháng,chÇŽng # å ´ 0x5835:dÇ” # å µ 0x5836:tuó # å ¶ 0x5837:yìn # å · 0x5838:féng # å ¸ 0x5839:zhòng # å ¹ 0x583a:jiè # å º 0x583b:jÄ«n # å » 0x583c:fÄ“ng # å ¼ 0x583d:gÄ�ng # å ½ 0x583e:chuÇŽn,chÅ«n # å ¾ 0x583f:jiÇŽn # å ¿ 0x5842:jiÇŽng # å¡‚ 0x5843:huÄ�ng # 塃 0x5844:léng # å¡„ 0x5845:duàn # å¡… 0x5847:xuÄ�n # 塇 0x5848:jì,xì # 塈 0x5849:jí # 塉 0x584a:kuài # 塊 0x584b:yíng # å¡‹ 0x584c:tÄ� # 塌 0x584d:chéng # å¡� 0x584e:yÇ’ng # 塎 0x584f:kÇŽi # å¡� 0x5850:sù # å¡� 0x5851:sù # å¡‘ 0x5852:shí # å¡’ 0x5853:mì # å¡“ 0x5854:tÇŽ # å¡” 0x5855:wÄ›ng # å¡• 0x5856:chéng # å¡– 0x5857:tú # å¡— 0x5858:táng # 塘 0x5859:què # å¡™ 0x585a:zhÇ’ng # 塚 0x585b:lì # å¡› 0x585c:péng # 塜 0x585d:bàng # å¡� 0x585e:sÄ�i,sài,sè # 塞 0x585f:zàng # 塟 0x5860:duÄ« # å¡  0x5861:tián # å¡¡ 0x5862:wù # å¡¢ 0x5863:zhèng # å¡£ 0x5864:xÅ«n # 塤 0x5865:gé # å¡¥ 0x5866:zhèn # 塦 0x5867:ài # å¡§ 0x5868:gÅ�ng # 塨 0x5869:yán # å¡© 0x586a:xiàn # 塪 0x586b:tián,zhèn # å¡« 0x586c:yuán # 塬 0x586d:wÄ“n # å¡­ 0x586e:xiè # å¡® 0x586f:liù # 塯 0x5871:lÇŽng # 塱 0x5872:cháng,chÇŽng # 塲 0x5873:péng # 塳 0x5874:bèng # å¡´ 0x5875:chén # 塵 0x5876:lù # å¡¶ 0x5877:lÇ” # å¡· 0x5878:Å�u,qiÅ« # 塸 0x5879:qiàn,zàn,jiàn # 塹 0x587a:méi # 塺 0x587b:mò # å¡» 0x587c:zhuÄ�n,tuán # 塼 0x587d:shuÇŽng # 塽 0x587e:shú # 塾 0x587f:lÇ’u # å¡¿ 0x5880:chí # 墀 0x5881:màn # å¢� 0x5882:biÄ�o # 墂 0x5883:jìng # 境 0x5884:qÄ« # 墄 0x5885:shù # 墅 0x5886:zhì,dì # 墆 0x5887:zhàng # 墇 0x5888:kàn # 墈 0x5889:yÅ�ng # 墉 0x588a:diàn # 墊 0x588b:chÄ›n # 墋 0x588c:zhÇ�,zhuó # 墌 0x588d:xì # å¢� 0x588e:guÅ� # 墎 0x588f:qiÇŽng # å¢� 0x5890:jìn # å¢� 0x5891:dì # 墑 0x5892:shÄ�ng # 墒 0x5893:mù # 墓 0x5894:cuÄ« # 墔 0x5895:yàn # 墕 0x5896:tÇŽ # 墖 0x5897:zÄ“ng # 増 0x5898:qián # 墘 0x5899:qiáng # 墙 0x589a:liáng # 墚 0x589c:zhuì # 墜 0x589d:qiÄ�o # å¢� 0x589e:zÄ“ng # 增 0x589f:xÅ« # 墟 0x58a0:shàn # 墠 0x58a1:shàn # 墡 0x58a2:fá # 墢 0x58a3:pú # 墣 0x58a4:kuài,tuí # 墤 0x58a5:tuÇŽn,dÇ’ng # 墥 0x58a6:fán # 墦 0x58a7:qiáo,què # 墧 0x58a8:mò # 墨 0x58a9:dÅ«n # 墩 0x58aa:dÅ«n # 墪 0x58ab:zÅ«n,dÅ«n # 墫 0x58ac:dì # 墬 0x58ad:shèng # 墭 0x58ae:duò,huÄ« # 墮 0x58af:duò # 墯 0x58b0:tán # 墰 0x58b1:dèng # 墱 0x58b2:wú # 墲 0x58b3:fén # 墳 0x58b4:huáng # 墴 0x58b5:tán # 墵 0x58b6:dÄ� # 墶 0x58b7:yè # 墷 0x58ba:ào # 墺 0x58bb:qiáng # 墻 0x58bc:jÄ« # 墼 0x58bd:qiÄ�o,áo # 墽 0x58be:kÄ›n # 墾 0x58bf:yì,tú # 墿 0x58c0:pí # 壀 0x58c1:bì # å£� 0x58c2:diàn # 壂 0x58c3:jiÄ�ng # 壃 0x58c4:yÄ› # 壄 0x58c5:yÅ�ng # 壅 0x58c6:xué,bó,jué # 壆 0x58c7:tán # 壇 0x58c8:lÇŽn # 壈 0x58c9:jù # 壉 0x58ca:huài # 壊 0x58cb:dàng # 壋 0x58cc:rÇŽng # 壌 0x58cd:qiàn # å£� 0x58ce:xÅ«n # 壎 0x58cf:xiàn,làn # å£� 0x58d0:xÇ� # å£� 0x58d1:hè # 壑 0x58d2:ài # 壒 0x58d3:yÄ�,yà # 壓 0x58d4:dÇŽo # 壔 0x58d5:háo # 壕 0x58d6:ruán # 壖 0x58d8:lÄ›i # 壘 0x58d9:kuàng # 壙 0x58da:lú # 壚 0x58db:yán # 壛 0x58dc:tán # 壜 0x58dd:wéi # å£� 0x58de:huài # 壞 0x58df:lÇ’ng # 壟 0x58e0:lÇ’ng # 壠 0x58e1:ruÇ� # 壡 0x58e2:lì # 壢 0x58e3:lín # 壣 0x58e4:rÇŽng # 壤 0x58e6:xÅ«n # 壦 0x58e7:yán # 壧 0x58e8:lÄ›i # 壨 0x58e9:bà # 壩 0x58eb:shì # 士 0x58ec:rén # 壬 0x58ee:zhuàng # 壮 0x58ef:zhuàng # 壯 0x58f0:shÄ“ng # 声 0x58f1:yÄ« # 壱 0x58f2:mài # 売 0x58f3:ké,qiào # 壳 0x58f4:zhù # 壴 0x58f5:zhuàng # 壵 0x58f6:hú # 壶 0x58f7:hú # 壷 0x58f8:kÇ”n # 壸 0x58f9:yÄ« # 壹 0x58fa:hú # 壺 0x58fb:xù # 壻 0x58fc:kÇ”n # 壼 0x58fd:shòu # 壽 0x58fe:mÇŽng # 壾 0x58ff:cún,dun # 壿 0x5900:shòu # 夀 0x5901:yÄ« # å¤� 0x5902:zhÇ�,zhÅ�ng # 夂 0x5903:gÇ”,yíng # 夃 0x5904:chÇ”,chù # 处 0x5905:jiàng,xiáng # 夅 0x5906:féng,fÄ“ng,páng # 夆 0x5907:bèi # 备 0x5909:biàn # 変 0x590a:suÄ« # 夊 0x590b:qÅ«n # 夋 0x590c:líng # 夌 0x590d:fù # å¤� 0x590e:cuò # 夎 0x590f:xià # å¤� 0x5910:xiòng,xuàn # å¤� 0x5912:náo # 夒 0x5913:xià # 夓 0x5914:kuí # 夔 0x5915:xÄ« # 夕 0x5916:wài # 外 0x5917:yuàn,wÇŽn,wÄ�n,yuÄ�n # 夗 0x5918:mÇŽo,wÇŽn # 夘 0x5919:sù # 夙 0x591a:duÅ� # 多 0x591b:duÅ� # 夛 0x591c:yè # 夜 0x591d:qíng # å¤� 0x591f:gòu # 够 0x5920:gòu # 夠 0x5921:qì # 夡 0x5922:mèng # 夢 0x5923:mèng # 夣 0x5924:yín # 夤 0x5925:huÇ’ # 夥 0x5926:chÄ›n # 夦 0x5927:dà,dài,tài # 大 0x5928:cè # 夨 0x5929:tiÄ�n # 天 0x592a:tài # 太 0x592b:fÅ«,fú # 夫 0x592c:guài # 夬 0x592d:yÄ�o # 夭 0x592e:yÄ�ng # 央 0x592f:hÄ�ng,bèn # 夯 0x5930:gÇŽo # 夰 0x5931:shÄ« # 失 0x5932:tÄ�o,bÄ›n # 夲 0x5933:tài # 夳 0x5934:tóu,tou # 头 0x5935:yÇŽn,tÄ�o # 夵 0x5936:bÇ� # 夶 0x5937:yí # 夷 0x5938:kuÄ�,kuà # 夸 0x5939:jiÄ�,jiá,gÄ� # 夹 0x593a:duó # 夺 0x593c:kuÇŽng # 夼 0x593d:yÇ”n # 夽 0x593e:jiÄ�,jiá,gÄ�,xiá # 夾 0x593f:bÄ� # 夿 0x5940:Ä“n # 奀 0x5941:lián # å¥� 0x5942:huàn # 奂 0x5943:dÄ«,tì # 奃 0x5944:yÇŽn,yÄ�n # 奄 0x5945:pào # 奅 0x5946:juàn # 奆 0x5947:qí,jÄ« # 奇 0x5948:nài # 奈 0x5949:fèng # 奉 0x594a:xié # 奊 0x594b:fèn # 奋 0x594c:diÇŽn # 奌 0x594e:kuí # 奎 0x594f:zòu # å¥� 0x5950:huàn # å¥� 0x5951:qì,qiè,xiè # 契 0x5952:kÄ�i # 奒 0x5953:shÄ“,chÇ�,zhà # 奓 0x5954:bÄ“n,bèn # 奔 0x5955:yì # 奕 0x5956:jiÇŽng # 奖 0x5957:tào # 套 0x5958:zàng,zhuÇŽng # 奘 0x5959:bÄ›n # 奙 0x595a:xÄ« # 奚 0x595b:huÇŽng # 奛 0x595c:fÄ›i # 奜 0x595d:diÄ�o # å¥� 0x595e:xùn,zhuì # 奞 0x595f:bÄ“ng # 奟 0x5960:diàn # 奠 0x5961:ào # 奡 0x5962:shÄ“ # 奢 0x5963:wÄ›ng # 奣 0x5964:pò,hÇŽ,tÇŽi # 奤 0x5965:ào,yù # 奥 0x5966:wù # 奦 0x5967:ào,yù # 奧 0x5968:jiÇŽng # 奨 0x5969:lián # 奩 0x596a:duó # 奪 0x596b:yÅ«n # 奫 0x596c:jiÇŽng # 奬 0x596d:shì # 奭 0x596e:fèn # 奮 0x596f:huò # 奯 0x5970:bì # 奰 0x5971:luán # 奱 0x5972:duÇ’,chÄ› # 奲 0x5973:nÇš,rÇ” # 女 0x5974:nú # 奴 0x5975:dÇ�ng,dÄ«ng,tiÇŽn # 奵 0x5976:nÇŽi # 奶 0x5977:qiÄ�n # 奷 0x5978:jiÄ�n # 奸 0x5979:tÄ�,jiÄ› # 她 0x597a:jiÇ” # 奺 0x597b:nuán # 奻 0x597c:chà # 奼 0x597d:hÇŽo,hào # 好 0x597e:xiÄ�n # 奾 0x597f:fàn # 奿 0x5980:jÇ� # 妀 0x5981:shuò # å¦� 0x5982:rú # 如 0x5983:fÄ“i,pèi # 妃 0x5984:wàng # 妄 0x5985:hóng # 妅 0x5986:zhuÄ�ng # 妆 0x5987:fù # 妇 0x5988:mÄ� # 妈 0x5989:dÄ�n # 妉 0x598a:rèn # 妊 0x598b:fÅ«,yÅ�u # 妋 0x598c:jìng # 妌 0x598d:yán # å¦� 0x598e:hài,jiè # 妎 0x598f:wèn # å¦� 0x5990:zhÅ�ng # å¦� 0x5991:pÄ� # 妑 0x5992:dù # 妒 0x5993:jì # 妓 0x5994:kÄ“ng,háng # 妔 0x5995:zhòng # 妕 0x5996:yÄ�o # 妖 0x5997:jìn # 妗 0x5998:yún # 妘 0x5999:miào # 妙 0x599a:fÇ’u,pÄ“i,pÄ« # 妚 0x599c:yuè,jué # 妜 0x599d:zhuÄ�ng # å¦� 0x599e:niÅ«,haÌ€o # 妞 0x599f:yàn # 妟 0x59a0:nà,nàn # 妠 0x59a1:xÄ«n # 妡 0x59a2:fén # 妢 0x59a3:bÇ� # 妣 0x59a4:yú # 妤 0x59a5:tuÇ’ # 妥 0x59a6:fÄ“ng # 妦 0x59a7:wàn,yuán # 妧 0x59a8:fáng # 妨 0x59a9:wÇ” # 妩 0x59aa:yù # 妪 0x59ab:guÄ« # 妫 0x59ac:dù # 妬 0x59ad:bá # 妭 0x59ae:nÄ« # 妮 0x59af:zhóu # 妯 0x59b0:zhuó # 妰 0x59b1:zhÄ�o # 妱 0x59b2:dá # 妲 0x59b3:nÇ�,nÇŽi # 妳 0x59b4:yuàn # 妴 0x59b5:tÇ’u # 妵 0x59b6:xián,xuán,xù # 妶 0x59b7:zhí,yì # 妷 0x59b8:Ä“ # 妸 0x59b9:mèi # 妹 0x59ba:mò # 妺 0x59bb:qÄ«,qì # 妻 0x59bc:bì # 妼 0x59bd:shÄ“n # 妽 0x59be:qiè # 妾 0x59bf:Ä“ # 妿 0x59c0:hé # å§€ 0x59c1:xÇ”,xÅ« # å§� 0x59c2:fá # å§‚ 0x59c3:zhÄ“ng # 姃 0x59c4:mín # å§„ 0x59c5:bàn # å§… 0x59c6:mÇ” # 姆 0x59c7:fÅ«,fú # 姇 0x59c8:líng # 姈 0x59c9:zÇ� # 姉 0x59ca:zÇ� # å§Š 0x59cb:shÇ� # å§‹ 0x59cc:rÇŽn # å§Œ 0x59cd:shÄ�n,shàn # å§� 0x59ce:yÄ�ng # å§Ž 0x59cf:mán # å§� 0x59d0:jiÄ› # å§� 0x59d1:gÅ« # å§‘ 0x59d2:sì # å§’ 0x59d3:xìng # å§“ 0x59d4:wÄ›i,wÄ“i # å§” 0x59d5:zÄ« # å§• 0x59d6:jù # å§– 0x59d7:shÄ�n,shàn # å§— 0x59d8:pÄ«n # 姘 0x59d9:rèn # å§™ 0x59da:yáo # å§š 0x59db:dòng # å§› 0x59dc:jiÄ�ng # å§œ 0x59dd:shÅ« # å§� 0x59de:jí # å§ž 0x59df:gÄ�i # å§Ÿ 0x59e0:xiàng # å§  0x59e1:huá,huó # å§¡ 0x59e2:juÄ�n # å§¢ 0x59e3:jiÄ�o,xiáo # å§£ 0x59e4:gòu,dù # 姤 0x59e5:mÇ”,lÇŽo # å§¥ 0x59e6:jiÄ�n # 姦 0x59e7:jiÄ�n # å§§ 0x59e8:yí # 姨 0x59e9:nián,niàn # å§© 0x59ea:zhí # 姪 0x59eb:zhÄ›n # å§« 0x59ec:jÄ« # 姬 0x59ed:xiàn # å§­ 0x59ee:héng # å§® 0x59ef:guÄ�ng # 姯 0x59f0:jÅ«n,xún # å§° 0x59f1:kuÄ�,hù # å§± 0x59f2:yàn # å§² 0x59f3:mÇ�ng # å§³ 0x59f4:liè # å§´ 0x59f5:pèi # å§µ 0x59f6:è,yà # å§¶ 0x59f7:yòu # å§· 0x59f8:yán # 姸 0x59f9:chà # å§¹ 0x59fa:shÄ“n,xiÄ�n # 姺 0x59fb:yÄ«n # å§» 0x59fc:shí # å§¼ 0x59fd:guÇ� # å§½ 0x59fe:quán # å§¾ 0x59ff:zÄ« # å§¿ 0x5a00:sÅ�ng # 娀 0x5a01:wÄ“i # å¨� 0x5a02:hóng # 娂 0x5a03:wá # 娃 0x5a04:lóu # 娄 0x5a05:yà # 娅 0x5a06:ráo,rÇŽo # 娆 0x5a07:jiÄ�o # 娇 0x5a08:luán # 娈 0x5a09:pÄ«ng # 娉 0x5a0a:xiàn # 娊 0x5a0b:shào,shÄ�o # 娋 0x5a0c:lÇ� # 娌 0x5a0d:chéng,shèng # å¨� 0x5a0e:xiÄ“ # 娎 0x5a0f:máng # å¨� 0x5a11:suÅ� # 娑 0x5a12:wÇ”,mÇ” # 娒 0x5a13:wÄ›i # 娓 0x5a14:kè # 娔 0x5a15:chuò,lài # 娕 0x5a16:chuò # 娖 0x5a17:tÇ�ng # 娗 0x5a18:niáng # 娘 0x5a19:xíng # 娙 0x5a1a:nán # 娚 0x5a1b:yú # 娛 0x5a1c:nà,nuó # 娜 0x5a1d:pÅ�u,bÇ� # å¨� 0x5a1e:nÄ›i,suÄ« # 娞 0x5a1f:juÄ�n # 娟 0x5a20:shÄ“n # 娠 0x5a21:zhì # 娡 0x5a22:hán # 娢 0x5a23:dì # 娣 0x5a24:zhuÄ�ng # 娤 0x5a25:é # 娥 0x5a26:pín # 娦 0x5a27:tuì # 娧 0x5a28:mÇŽn,xiàn # 娨 0x5a29:miÇŽn # 娩 0x5a2a:wú,wù,yú # 娪 0x5a2b:yán # 娫 0x5a2c:wÇ” # 娬 0x5a2d:xÄ«,Ä�i # 娭 0x5a2e:yán # 娮 0x5a2f:yú # 娯 0x5a30:sì # 娰 0x5a31:yú # 娱 0x5a32:wÄ� # 娲 0x5a34:xián # 娴 0x5a35:jÅ« # 娵 0x5a36:qÇ” # 娶 0x5a37:zhuì,shuì # 娷 0x5a38:qÄ« # 娸 0x5a39:xián # 娹 0x5a3a:zhuó # 娺 0x5a3b:dÅ�ng,dòng # 娻 0x5a3c:chÄ�ng # 娼 0x5a3d:lù # 娽 0x5a3e:ÇŽi,ái,è # 娾 0x5a3f:Ä“,Ä› # 娿 0x5a40:Ä“ # å©€ 0x5a41:lóu # å©� 0x5a42:mián # å©‚ 0x5a43:cóng # 婃 0x5a44:pÇ’u,péi,bù # å©„ 0x5a45:jú # å©… 0x5a46:pó # 婆 0x5a47:cÇŽi # 婇 0x5a48:líng # 婈 0x5a49:wÇŽn # 婉 0x5a4a:biÇŽo # 婊 0x5a4b:xiÄ�o # å©‹ 0x5a4c:shÅ« # 婌 0x5a4d:qÇ� # å©� 0x5a4e:huÄ« # 婎 0x5a4f:fù,fàn # å©� 0x5a50:wÇ’ # å©� 0x5a51:wÇ’ # å©‘ 0x5a52:tán # å©’ 0x5a53:fÄ“i # å©“ 0x5a55:jié # å©• 0x5a56:tiÄ�n # å©– 0x5a57:ní,nÇ� # å©— 0x5a58:quán,juàn # 婘 0x5a59:jìng # å©™ 0x5a5a:hÅ«n # 婚 0x5a5b:jÄ«ng # å©› 0x5a5c:qiÄ�n,jÇ�n # 婜 0x5a5d:diàn # å©� 0x5a5e:xìng # 婞 0x5a5f:hù # 婟 0x5a60:wÄ�n,wà # å©  0x5a61:lái,lài # å©¡ 0x5a62:bì # å©¢ 0x5a63:yÄ«n # å©£ 0x5a64:zhÅ�u,chÅ�u # 婤 0x5a65:chuò,nào # å©¥ 0x5a66:fù # 婦 0x5a67:jìng # å©§ 0x5a68:lún # 婨 0x5a69:nüè # å©© 0x5a6a:lán # 婪 0x5a6b:hùn,kÅ«n # å©« 0x5a6c:yín # 婬 0x5a6d:yà # å©­ 0x5a6f:lì # 婯 0x5a70:diÇŽn # å©° 0x5a71:xián # 婱 0x5a73:huà # 婳 0x5a74:yÄ«ng # å©´ 0x5a75:chán # 婵 0x5a76:shÄ›n # å©¶ 0x5a77:tíng # å©· 0x5a78:dàng,yáng # 婸 0x5a79:yÇŽo # 婹 0x5a7a:wù # 婺 0x5a7b:nàn # å©» 0x5a7c:ruò,chuò # 婼 0x5a7d:jiÇŽ # 婽 0x5a7e:tÅ�u,yú # 婾 0x5a7f:xù # å©¿ 0x5a80:yù,yú # 媀 0x5a81:wéi,wÄ›i # åª� 0x5a82:dì,tí # 媂 0x5a83:róu # 媃 0x5a84:mÄ›i # 媄 0x5a85:dÄ�n # 媅 0x5a86:ruÇŽn,nèn # 媆 0x5a87:qÄ«n # 媇 0x5a89:wò # 媉 0x5a8a:qián # 媊 0x5a8b:chÅ«n # 媋 0x5a8c:miáo # 媌 0x5a8d:fù # åª� 0x5a8e:jiÄ› # 媎 0x5a8f:duÄ�n # åª� 0x5a90:yí,pèi # åª� 0x5a91:zhòng # 媑 0x5a92:méi # 媒 0x5a93:huáng # 媓 0x5a94:mián,miÇŽn # 媔 0x5a95:Ä�n # 媕 0x5a96:yÄ«ng # 媖 0x5a97:xuÄ�n # 媗 0x5a99:wÄ“i # 媙 0x5a9a:mèi # 媚 0x5a9b:yuàn,yuán # 媛 0x5a9c:zhÄ“ng # 媜 0x5a9d:qiÅ« # åª� 0x5a9e:tí # 媞 0x5a9f:xiè # 媟 0x5aa0:tuó,duò # 媠 0x5aa1:liàn # 媡 0x5aa2:mào # 媢 0x5aa3:rÇŽn # 媣 0x5aa4:sÄ« # 媤 0x5aa5:piÄ�n # 媥 0x5aa6:wèi # 媦 0x5aa7:wÄ� # 媧 0x5aa8:cù # 媨 0x5aa9:hú # 媩 0x5aaa:ÇŽo # 媪 0x5aad:xÅ« # 媭 0x5aae:tÅ�u,yú # 媮 0x5aaf:guÄ« # 媯 0x5ab0:chú,zòu # 媰 0x5ab1:yáo # 媱 0x5ab2:pì # 媲 0x5ab3:xí # 媳 0x5ab4:yuán # 媴 0x5ab5:yìng # 媵 0x5ab6:róng # 媶 0x5ab7:rù # 媷 0x5ab8:chÄ« # 媸 0x5ab9:liú # 媹 0x5aba:mÄ›i # 媺 0x5abb:pán # 媻 0x5abc:ÇŽo # 媼 0x5abd:mÄ� # 媽 0x5abe:gòu # 媾 0x5abf:kuì # 媿 0x5ac0:qín,shÄ“n # å«€ 0x5ac1:jià # å«� 0x5ac2:sÇŽo # å«‚ 0x5ac3:zhÄ“n,zhÄ›n # 嫃 0x5ac4:yuán # å«„ 0x5ac5:jiÄ“,suÇ’ # å«… 0x5ac6:róng # 嫆 0x5ac7:míng,mÇ�ng # 嫇 0x5ac8:yÄ«ng # 嫈 0x5ac9:jí # 嫉 0x5aca:sù # 嫊 0x5acb:niÇŽo # å«‹ 0x5acc:xián # 嫌 0x5acd:tÄ�o # å«� 0x5ace:páng # 嫎 0x5acf:láng # å«� 0x5ad0:nÇŽo # å«� 0x5ad1:biáo # å«‘ 0x5ad2:ài # å«’ 0x5ad3:pì # å«“ 0x5ad4:pín # å«” 0x5ad5:yì # å«• 0x5ad6:piáo,piÄ�o # å«– 0x5ad7:yù # å«— 0x5ad8:léi # 嫘 0x5ad9:xuán # å«™ 0x5ada:màn # 嫚 0x5adb:yÄ« # å«› 0x5adc:zhÄ�ng # 嫜 0x5add:kÄ�ng # å«� 0x5ade:yÅ�ng # 嫞 0x5adf:nì # 嫟 0x5ae0:lí # å«  0x5ae1:dí # å«¡ 0x5ae2:guÄ« # å«¢ 0x5ae3:yÄ�n # å«£ 0x5ae4:jÇ�n,jìn # 嫤 0x5ae5:zhuÄ�n # å«¥ 0x5ae6:cháng # 嫦 0x5ae7:zé # å«§ 0x5ae8:hÄ�n,nÇŽn # 嫨 0x5ae9:nèn # å«© 0x5aea:lào # 嫪 0x5aeb:mó # å«« 0x5aec:zhÄ“ # 嫬 0x5aed:hù # å«­ 0x5aee:hù # å«® 0x5aef:ào # 嫯 0x5af0:nèn # å«° 0x5af1:qiáng # 嫱 0x5af3:piè # 嫳 0x5af4:gÅ« # å«´ 0x5af5:wÇ” # 嫵 0x5af6:qiáo # å«¶ 0x5af7:tuÇ’ # å«· 0x5af8:zhÇŽn # 嫸 0x5af9:miáo # 嫹 0x5afa:xián # 嫺 0x5afb:xián # å«» 0x5afc:mò # 嫼 0x5afd:liáo # 嫽 0x5afe:lián # 嫾 0x5aff:huà # å«¿ 0x5b00:guÄ« # 嬀 0x5b01:dÄ“ng # å¬� 0x5b02:zhí # 嬂 0x5b03:xÅ« # 嬃 0x5b05:huà # 嬅 0x5b06:xÄ« # 嬆 0x5b07:kuì # 嬇 0x5b08:ráo,rÇŽo # 嬈 0x5b09:xÄ« # 嬉 0x5b0a:yàn # 嬊 0x5b0b:chán # 嬋 0x5b0c:jiÄ�o # 嬌 0x5b0d:mÄ›i # å¬� 0x5b0e:fàn # 嬎 0x5b0f:fÄ�n # å¬� 0x5b10:xiÄ�n,yÇŽn,jìn # å¬� 0x5b11:yì # 嬑 0x5b12:huì # 嬒 0x5b13:jiào # 嬓 0x5b14:fù # 嬔 0x5b15:shì # 嬕 0x5b16:bì # 嬖 0x5b17:shàn # 嬗 0x5b18:suì # 嬘 0x5b19:qiáng # 嬙 0x5b1a:liÇŽn # 嬚 0x5b1b:huán,xuÄ�n,qióng # 嬛 0x5b1d:niÇŽo # å¬� 0x5b1e:dÇ’ng # 嬞 0x5b1f:yÇ� # 嬟 0x5b20:cÄ�n # 嬠 0x5b21:ài # 嬡 0x5b22:niáng # 嬢 0x5b23:níng # 嬣 0x5b24:mó # 嬤 0x5b25:tiÇŽo # 嬥 0x5b26:chóu # 嬦 0x5b27:jìn # 嬧 0x5b28:cí # 嬨 0x5b29:yú # 嬩 0x5b2a:pín # 嬪 0x5b2c:rú # 嬬 0x5b2d:nÇŽi # 嬭 0x5b2e:yÄ�n,yàn # 嬮 0x5b2f:tái # 嬯 0x5b30:yÄ«ng # 嬰 0x5b31:qiàn # 嬱 0x5b32:niÇŽo # 嬲 0x5b34:yíng # 嬴 0x5b35:mián # 嬵 0x5b37:mó # 嬷 0x5b38:shÄ›n # 嬸 0x5b39:xìng # 嬹 0x5b3a:nì # 嬺 0x5b3b:dú # 嬻 0x5b3c:liÇ” # 嬼 0x5b3d:yuÄ�n # 嬽 0x5b3e:lÇŽn # 嬾 0x5b3f:yàn # 嬿 0x5b40:shuÄ�ng # å­€ 0x5b41:líng # å­� 0x5b42:jiÇŽo # å­‚ 0x5b43:niáng # å­ƒ 0x5b44:lÇŽn # å­„ 0x5b45:xiÄ�n,qiÄ�n # å­… 0x5b46:yÄ«ng # å­† 0x5b47:shuÄ�ng # å­‡ 0x5b48:xié,huÄ« # å­ˆ 0x5b49:huÄ�n,quán # å­‰ 0x5b4a:mÇ� # å­Š 0x5b4b:lí,lì # å­‹ 0x5b4c:luán # å­Œ 0x5b4d:yÇŽn # å­� 0x5b4e:zhú,chuò # å­Ž 0x5b4f:lÇŽn # å­� 0x5b50:zÇ� # å­� 0x5b51:jié # å­‘ 0x5b52:jué # å­’ 0x5b53:jué # å­“ 0x5b54:kÇ’ng # å­” 0x5b55:yùn # å­• 0x5b56:zÄ«,mÄ� # å­– 0x5b57:zì # å­— 0x5b58:cún # å­˜ 0x5b59:sÅ«n,xùn # å­™ 0x5b5a:fú # å­š 0x5b5b:bèi,bó # å­› 0x5b5c:zÄ« # å­œ 0x5b5d:xiào # å­� 0x5b5e:xìn # å­ž 0x5b5f:mèng # å­Ÿ 0x5b60:sì # å­  0x5b61:tÄ�i # å­¡ 0x5b62:bÄ�o # å­¢ 0x5b63:jì # å­£ 0x5b64:gÅ« # å­¤ 0x5b65:nú # å­¥ 0x5b66:xué # å­¦ 0x5b68:zhuÇŽn # å­¨ 0x5b69:hái # å­© 0x5b6a:luán # å­ª 0x5b6b:sÅ«n,xùn # å­« 0x5b6c:nÄ�o # å­¬ 0x5b6d:miÄ“ # å­­ 0x5b6e:cóng # å­® 0x5b6f:qiÄ�n # å­¯ 0x5b70:shú # å­° 0x5b71:chán,càn # å­± 0x5b72:yÄ� # å­² 0x5b73:zÄ« # å­³ 0x5b74:nÇ� # å­´ 0x5b75:fÅ« # å­µ 0x5b76:zÄ« # å­¶ 0x5b77:lí # å­· 0x5b78:xué # å­¸ 0x5b79:bò # å­¹ 0x5b7a:rú # å­º 0x5b7b:nái # å­» 0x5b7c:niè # å­¼ 0x5b7d:niè # å­½ 0x5b7e:yÄ«ng # å­¾ 0x5b7f:luán # å­¿ 0x5b80:mián # 宀 0x5b81:níng,nìng,zhù # å®� 0x5b82:rÇ’ng # 宂 0x5b83:tÄ� # 它 0x5b84:guÇ� # 宄 0x5b85:zhái # å®… 0x5b86:qióng # 宆 0x5b87:yÇ” # 宇 0x5b88:shÇ’u # 守 0x5b89:Ä�n # 安 0x5b8a:tÅ«,jiÄ� # 宊 0x5b8b:sòng # 宋 0x5b8c:wán # 完 0x5b8d:ròu # å®� 0x5b8e:yÇŽo # 宎 0x5b8f:hóng # å®� 0x5b90:yí # å®� 0x5b91:jÇ�ng # 宑 0x5b92:zhÅ«n # å®’ 0x5b93:mì,fú # 宓 0x5b94:zhÇ” # å®” 0x5b95:dàng # 宕 0x5b96:hóng # å®– 0x5b97:zÅ�ng # å®— 0x5b98:guÄ�n # 官 0x5b99:zhòu # å®™ 0x5b9a:dìng # 定 0x5b9b:wÇŽn,yuÄ�n # å®› 0x5b9c:yí # 宜 0x5b9d:bÇŽo # å®� 0x5b9e:shí # 实 0x5b9f:shí # 実 0x5ba0:chÇ’ng # å®  0x5ba1:shÄ›n # 审 0x5ba2:kè # 客 0x5ba3:xuÄ�n # 宣 0x5ba4:shì # 室 0x5ba5:yòu # 宥 0x5ba6:huàn # 宦 0x5ba7:yí # å®§ 0x5ba8:tiÇŽo # 宨 0x5ba9:shÇ� # 宩 0x5baa:xiàn # 宪 0x5bab:gÅ�ng # 宫 0x5bac:chéng # 宬 0x5bad:qún # å®­ 0x5bae:gÅ�ng # å®® 0x5baf:xiÄ�o # 宯 0x5bb0:zÇŽi # å®° 0x5bb1:zhà # å®± 0x5bb2:bÇŽo,shí # 宲 0x5bb3:hài # 害 0x5bb4:yàn # å®´ 0x5bb5:xiÄ�o # 宵 0x5bb6:jiÄ�,jia,jie # å®¶ 0x5bb7:shÄ›n # å®· 0x5bb8:chén # 宸 0x5bb9:róng # 容 0x5bba:huÄ�ng,huÇŽng # 宺 0x5bbb:mì # å®» 0x5bbc:kòu # 宼 0x5bbd:kuÄ�n # 宽 0x5bbe:bÄ«n # 宾 0x5bbf:sù,xiÇ”,xiù # 宿 0x5bc0:cÇŽi,cài # 寀 0x5bc1:zÇŽn # å¯� 0x5bc2:jì # 寂 0x5bc3:yuÄ�n # 寃 0x5bc4:jì # 寄 0x5bc5:yín # 寅 0x5bc6:mì # 密 0x5bc7:kòu # 寇 0x5bc8:qÄ«ng # 寈 0x5bc9:hè # 寉 0x5bca:zhÄ“n # 寊 0x5bcb:jiàn # 寋 0x5bcc:fù # 富 0x5bcd:níng,nìng # å¯� 0x5bce:bÇ�ng,bìng # 寎 0x5bcf:huán # å¯� 0x5bd0:mèi # å¯� 0x5bd1:qÇ�n # 寑 0x5bd2:hán # 寒 0x5bd3:yù # 寓 0x5bd4:shí # 寔 0x5bd5:níng,nìng # 寕 0x5bd6:jìn,qÇ�n # 寖 0x5bd7:níng,nìng # 寗 0x5bd8:zhì # 寘 0x5bd9:yÇ” # 寙 0x5bda:bÇŽo # 寚 0x5bdb:kuÄ�n # 寛 0x5bdc:níng,nìng # 寜 0x5bdd:qÇ�n # å¯� 0x5bde:mò # 寞 0x5bdf:chá # 察 0x5be0:jù,lóu # 寠 0x5be1:guÇŽ # 寡 0x5be2:qÇ�n # 寢 0x5be3:hÅ« # 寣 0x5be4:wù # 寤 0x5be5:liáo # 寥 0x5be6:shí # 實 0x5be7:níng,nìng # 寧 0x5be8:zhài # 寨 0x5be9:shÄ›n # 審 0x5bea:wÄ›i # 寪 0x5beb:xiÄ›,xiè # 寫 0x5bec:kuÄ�n # 寬 0x5bed:huì # 寭 0x5bee:liáo # 寮 0x5bef:jùn # 寯 0x5bf0:huán # 寰 0x5bf1:yì # 寱 0x5bf2:yí # 寲 0x5bf3:bÇŽo # 寳 0x5bf4:qÄ«n,qìn # 寴 0x5bf5:chÇ’ng # 寵 0x5bf6:bÇŽo # 寶 0x5bf7:fÄ“ng # 寷 0x5bf8:cùn # 寸 0x5bf9:duì # 对 0x5bfa:sì # 寺 0x5bfb:xún # 寻 0x5bfc:dÇŽo # 导 0x5bfd:lüè,luó # 寽 0x5bfe:duì # 対 0x5bff:shòu # 寿 0x5c00:pÇ’ # å°€ 0x5c01:fÄ“ng # å°� 0x5c02:zhuÄ�n # å°‚ 0x5c03:fÅ« # å°ƒ 0x5c04:shè,yè,yì # å°„ 0x5c05:kÄ“i,kè # å°… 0x5c06:jiÄ�ng,jiàng # å°† 0x5c07:jiÄ�ng,jiàng # å°‡ 0x5c08:zhuÄ�n # å°ˆ 0x5c09:wèi,yù # å°‰ 0x5c0a:zÅ«n # å°Š 0x5c0b:xún # å°‹ 0x5c0c:shù,zhù # å°Œ 0x5c0d:duì # å°� 0x5c0e:dÇŽo # å°Ž 0x5c0f:xiÇŽo # å°� 0x5c10:jié,jí # å°� 0x5c11:shÇŽo,shào # å°‘ 0x5c12:Ä›r # å°’ 0x5c13:Ä›r # å°“ 0x5c14:Ä›r # å°” 0x5c15:gÇŽ # å°• 0x5c16:jiÄ�n # å°– 0x5c17:shú # å°— 0x5c18:chén # å°˜ 0x5c19:shàng # å°™ 0x5c1a:shàng # å°š 0x5c1c:gá # å°œ 0x5c1d:cháng # å°� 0x5c1e:liáo # å°ž 0x5c1f:xiÇŽn # å°Ÿ 0x5c20:xiÇŽn # å°  0x5c22:yóu # å°¢ 0x5c23:wÄ�ng # å°£ 0x5c24:yóu # å°¤ 0x5c25:liào # å°¥ 0x5c26:liào # å°¦ 0x5c27:yáo # å°§ 0x5c28:lóng,máng,méng,páng # å°¨ 0x5c29:wÄ�ng # å°© 0x5c2a:wÄ�ng # å°ª 0x5c2b:wÄ�ng # å°« 0x5c2c:gà # å°¬ 0x5c2d:yáo # å°­ 0x5c2e:duò # å°® 0x5c2f:kuì,kuÇ� # å°¯ 0x5c30:zhÇ’ng # å°° 0x5c31:jiù # å°± 0x5c32:gÄ�n # å°² 0x5c33:gÇ” # å°³ 0x5c34:gÄ�n # å°´ 0x5c35:tuí # å°µ 0x5c36:gÄ�n # å°¶ 0x5c37:gÄ�n # å°· 0x5c38:shÄ« # å°¸ 0x5c39:yÇ�n # å°¹ 0x5c3a:chÇ�,chÄ› # å°º 0x5c3b:kÄ�o # å°» 0x5c3c:ní # å°¼ 0x5c3d:jìn,jÇ�n # å°½ 0x5c3e:wÄ›i,yÇ� # å°¾ 0x5c3f:niào,suÄ« # å°¿ 0x5c40:jú # å±€ 0x5c41:pì # å±� 0x5c42:céng # 层 0x5c43:xì # 屃 0x5c44:bÄ« # 屄 0x5c45:jÅ« # å±… 0x5c46:jiè # 屆 0x5c47:tián # 屇 0x5c48:qÅ« # 屈 0x5c49:tì # 屉 0x5c4a:jiè # 届 0x5c4b:wÅ« # 屋 0x5c4c:diÇŽo # 屌 0x5c4d:shÄ« # å±� 0x5c4e:shÇ� # 屎 0x5c4f:píng,bÇ�ng # å±� 0x5c50:jÄ« # å±� 0x5c51:xiè # 屑 0x5c52:zhÄ›n # å±’ 0x5c53:xì # 屓 0x5c54:ní # å±” 0x5c55:zhÇŽn # 展 0x5c56:xÄ« # å±– 0x5c58:mÇŽn # 屘 0x5c59:Ä“ # å±™ 0x5c5a:lòu # 屚 0x5c5b:pÇ�ng,bÇ�ng # å±› 0x5c5c:tì # 屜 0x5c5d:fèi # å±� 0x5c5e:shÇ”,zhÇ” # 属 0x5c5f:xiè,tì # 屟 0x5c60:tú # å±  0x5c61:lÇš # 屡 0x5c62:lÇš # å±¢ 0x5c63:xÇ� # å±£ 0x5c64:céng # 層 0x5c65:lÇš # å±¥ 0x5c66:jù # 屦 0x5c67:xiè # å±§ 0x5c68:jù # 屨 0x5c69:juÄ“ # 屩 0x5c6a:liáo # 屪 0x5c6b:juÄ“ # 屫 0x5c6c:shÇ”,zhÇ” # 屬 0x5c6d:xì # å±­ 0x5c6e:chè,cÇŽo # å±® 0x5c6f:tún,zhÅ«n # 屯 0x5c70:nì,jÇ� # å±° 0x5c71:shÄ�n # å±± 0x5c73:xiÄ�n # å±³ 0x5c74:lì # å±´ 0x5c75:àn # å±µ 0x5c78:hóng,lóng # 屸 0x5c79:yì # å±¹ 0x5c7a:qÇ� # 屺 0x5c7b:rèn # å±» 0x5c7c:wù # å±¼ 0x5c7d:hàn,àn # å±½ 0x5c7e:shÄ“n # å±¾ 0x5c7f:yÇ” # 屿 0x5c80:chÅ« # å²€ 0x5c81:suì # å²� 0x5c82:qÇ�,kÇŽi # 岂 0x5c84:yuè # 岄 0x5c85:bÇŽn # å²… 0x5c86:yÇŽo # 岆 0x5c87:áng # 岇 0x5c88:yá # 岈 0x5c89:wù # 岉 0x5c8a:jié # 岊 0x5c8b:è # 岋 0x5c8c:jí # 岌 0x5c8d:qiÄ�n # å²� 0x5c8e:fén # 岎 0x5c8f:wán # å²� 0x5c90:qí # å²� 0x5c91:cén # 岑 0x5c92:qián # å²’ 0x5c93:qí # 岓 0x5c94:chà # å²” 0x5c95:jiè # 岕 0x5c96:qÅ« # å²– 0x5c97:gÇŽng # å²— 0x5c98:xiàn # 岘 0x5c99:ào # å²™ 0x5c9a:lán # 岚 0x5c9b:dÇŽo # å²› 0x5c9c:bÄ� # 岜 0x5c9d:zuò # å²� 0x5c9e:zuò # 岞 0x5c9f:yÇŽng # 岟 0x5ca0:jù # å²  0x5ca1:gÄ�ng # 岡 0x5ca2:kÄ› # å²¢ 0x5ca3:gÇ’u # å²£ 0x5ca4:xuè # 岤 0x5ca5:pÅ� # å²¥ 0x5ca6:lì # 岦 0x5ca7:tiáo # å²§ 0x5ca8:jÅ«,jÇ” # 岨 0x5ca9:yán # 岩 0x5caa:fú # 岪 0x5cab:xiù # 岫 0x5cac:jiÇŽ # 岬 0x5cad:lÇ�ng,líng # å²­ 0x5cae:tuó # å²® 0x5caf:pÄ« # 岯 0x5cb0:ào # å²° 0x5cb1:dài # å²± 0x5cb2:kuàng # å²² 0x5cb3:yuè # å²³ 0x5cb4:qÅ« # å²´ 0x5cb5:hù # å²µ 0x5cb6:pò # å²¶ 0x5cb7:mín # å²· 0x5cb8:àn # 岸 0x5cb9:tiáo # å²¹ 0x5cba:lÇ�ng,líng # 岺 0x5cbb:dÄ« # å²» 0x5cbd:dÅ�ng # å²½ 0x5cbf:kuÄ« # 岿 0x5cc0:xiù # å³€ 0x5cc1:mÇŽo # å³� 0x5cc2:tóng # 峂 0x5cc3:xué # 峃 0x5cc4:yì # 峄 0x5cc6:hé # 峆 0x5cc7:kè,bÄ� # 峇 0x5cc8:luò # 峈 0x5cc9:é # 峉 0x5cca:fù,niè # 峊 0x5ccb:xún # 峋 0x5ccc:dié # 峌 0x5ccd:lù # å³� 0x5cce:Ä›n # 峎 0x5ccf:ér # å³� 0x5cd0:gÄ�i # å³� 0x5cd1:quán # 峑 0x5cd2:tóng,dòng # å³’ 0x5cd3:yí # 峓 0x5cd4:mÇ” # å³” 0x5cd5:shí # 峕 0x5cd6:Ä�n # å³– 0x5cd7:wéi # å³— 0x5cd8:huán # 峘 0x5cd9:zhì,shì # å³™ 0x5cda:mì # 峚 0x5cdb:lÇ� # å³› 0x5cdc:fÇŽ,jÄ« # 峜 0x5cdd:tóng # å³� 0x5cde:wéi # 峞 0x5cdf:yòu # 峟 0x5ce1:xiá # 峡 0x5ce2:lÇ� # å³¢ 0x5ce3:yáo # å³£ 0x5ce4:jiào,qiáo # 峤 0x5ce5:zhÄ“ng # å³¥ 0x5ce6:luán # 峦 0x5ce7:jiÄ�o # å³§ 0x5ce8:é # 峨 0x5ce9:é # 峩 0x5cea:yù # 峪 0x5ceb:xié,yé # 峫 0x5cec:bÅ« # 峬 0x5ced:qiào # å³­ 0x5cee:qún # å³® 0x5cef:fÄ“ng # 峯 0x5cf0:fÄ“ng # å³° 0x5cf1:náo # å³± 0x5cf2:lÇ� # å³² 0x5cf3:yÅ�u # å³³ 0x5cf4:xiàn # å³´ 0x5cf5:róng # å³µ 0x5cf6:dÇŽo # å³¶ 0x5cf7:shÄ“n # å³· 0x5cf8:chéng # 峸 0x5cf9:tú # å³¹ 0x5cfa:gÄ›ng # 峺 0x5cfb:jùn # å³» 0x5cfc:gào # å³¼ 0x5cfd:xiá # å³½ 0x5cfe:yín # å³¾ 0x5cff:wú # 峿 0x5d00:lÇŽng # å´€ 0x5d01:kàn # å´� 0x5d02:láo # å´‚ 0x5d03:lái # å´ƒ 0x5d04:xiÇŽn # å´„ 0x5d05:què # å´… 0x5d06:kÅ�ng # å´† 0x5d07:chóng # å´‡ 0x5d08:chóng # å´ˆ 0x5d09:tà # å´‰ 0x5d0b:huà # å´‹ 0x5d0c:jÅ« # å´Œ 0x5d0d:lái # å´� 0x5d0e:qí # å´Ž 0x5d0f:mín # å´� 0x5d10:kÅ«n # å´� 0x5d11:kÅ«n # å´‘ 0x5d12:zú,cuì # å´’ 0x5d13:gù # å´“ 0x5d14:cuÄ« # å´” 0x5d15:yá # å´• 0x5d16:yá # å´– 0x5d17:gÇŽng,gÄ�ng # å´— 0x5d18:lún # å´˜ 0x5d19:lún # å´™ 0x5d1a:líng,léng # å´š 0x5d1b:jué # å´› 0x5d1c:duÇ’ # å´œ 0x5d1d:zhÄ“ng # å´� 0x5d1e:guÅ� # å´ž 0x5d1f:yín # å´Ÿ 0x5d20:dÅ�ng,dòng # å´  0x5d21:hán # å´¡ 0x5d22:zhÄ“ng # å´¢ 0x5d23:wÄ›i # å´£ 0x5d24:xiáo # å´¤ 0x5d25:pí,bÇ� # å´¥ 0x5d26:yÄ�n # å´¦ 0x5d27:sÅ�ng # å´§ 0x5d28:jié # å´¨ 0x5d29:bÄ“ng # å´© 0x5d2a:zú # å´ª 0x5d2b:jué # å´« 0x5d2c:dÅ�ng # å´¬ 0x5d2d:zhÇŽn,chán # å´­ 0x5d2e:gù # å´® 0x5d2f:yín # å´¯ 0x5d31:zè # å´± 0x5d32:huáng # å´² 0x5d33:yú # å´³ 0x5d34:wÇŽi,wÄ“i # å´´ 0x5d35:yáng,dàng # å´µ 0x5d36:fÄ“ng # å´¶ 0x5d37:qiú # å´· 0x5d38:yáng # å´¸ 0x5d39:tí # å´¹ 0x5d3a:yÇ� # å´º 0x5d3b:zhì,shì # å´» 0x5d3c:shì,dié # å´¼ 0x5d3d:zÇŽi # å´½ 0x5d3e:yÇŽo # å´¾ 0x5d3f:è # å´¿ 0x5d40:zhù # åµ€ 0x5d41:kÄ�n,zhàn # åµ� 0x5d42:lÇœ # 嵂 0x5d43:yÇŽn # 嵃 0x5d44:mÄ›i # 嵄 0x5d45:hán # åµ… 0x5d46:jÄ« # 嵆 0x5d47:jÄ« # 嵇 0x5d48:huàn # 嵈 0x5d49:tíng # 嵉 0x5d4a:shèng # 嵊 0x5d4b:méi # 嵋 0x5d4c:qiàn,kàn # 嵌 0x5d4d:wù,máo # åµ� 0x5d4e:yú # 嵎 0x5d4f:zÅ�ng # åµ� 0x5d50:lán # åµ� 0x5d51:kÄ›,jié # 嵑 0x5d52:yán # åµ’ 0x5d53:yán # 嵓 0x5d54:wÄ“i,wÄ›i # åµ” 0x5d55:zÅ�ng # 嵕 0x5d56:chá # åµ– 0x5d57:suì # åµ— 0x5d58:róng # 嵘 0x5d5a:qÄ«n # 嵚 0x5d5b:yú # åµ› 0x5d5d:lÇ’u # åµ� 0x5d5e:tú # 嵞 0x5d5f:cuÄ« # 嵟 0x5d60:xÄ« # åµ  0x5d61:wÄ›ng # 嵡 0x5d62:cÄ�ng # åµ¢ 0x5d63:dàng,táng # åµ£ 0x5d64:róng,yíng # 嵤 0x5d65:jié # åµ¥ 0x5d66:kÇŽi,ái # 嵦 0x5d67:liú # åµ§ 0x5d68:wù # 嵨 0x5d69:sÅ�ng # 嵩 0x5d6a:kÄ�o,qiÄ�o # 嵪 0x5d6b:zÄ« # 嵫 0x5d6c:wéi # 嵬 0x5d6d:bÄ“ng # åµ­ 0x5d6e:diÄ�n # åµ® 0x5d6f:cuó # 嵯 0x5d70:qÄ«n,qiÇŽn # åµ° 0x5d71:yÇ’ng # åµ± 0x5d72:niè # åµ² 0x5d73:cuó # åµ³ 0x5d74:jÇ� # åµ´ 0x5d77:sÇ’ng # åµ· 0x5d78:zÇ’ng # 嵸 0x5d79:jiàng # åµ¹ 0x5d7a:liáo # 嵺 0x5d7c:chÇŽn # åµ¼ 0x5d7d:dié,dì # åµ½ 0x5d7e:cÄ“n # åµ¾ 0x5d7f:dÇ�ng # 嵿 0x5d80:tÅ« # å¶€ 0x5d81:lÇ’u # å¶� 0x5d82:zhàng # å¶‚ 0x5d83:zhÇŽn,chán # 嶃 0x5d84:zhÇŽn,chán # å¶„ 0x5d85:áo,ào # å¶… 0x5d86:cáo # 嶆 0x5d87:qÅ« # 嶇 0x5d88:qiÄ�ng # 嶈 0x5d89:wÄ›i # 嶉 0x5d8a:zuÇ� # å¶Š 0x5d8b:dÇŽo # å¶‹ 0x5d8c:dÇŽo # å¶Œ 0x5d8d:xí # å¶� 0x5d8e:yù # å¶Ž 0x5d8f:pÇ�,pèi # å¶� 0x5d90:lóng # å¶� 0x5d91:xiàng # å¶‘ 0x5d92:céng # å¶’ 0x5d93:bÅ� # å¶“ 0x5d94:qÄ«n # å¶” 0x5d95:jiÄ�o # å¶• 0x5d96:yÄ�n # å¶– 0x5d97:láo # å¶— 0x5d98:zhàn # 嶘 0x5d99:lín # å¶™ 0x5d9a:liáo # å¶š 0x5d9b:liáo # å¶› 0x5d9c:qín # å¶œ 0x5d9d:dèng # å¶� 0x5d9e:tuò # å¶ž 0x5d9f:zÅ«n # å¶Ÿ 0x5da0:jiào,qiáo # å¶  0x5da1:jué,guì # å¶¡ 0x5da2:yáo # å¶¢ 0x5da3:jiÄ�o # å¶£ 0x5da4:yáo # 嶤 0x5da5:jué # å¶¥ 0x5da6:zhÄ�n,shàn # 嶦 0x5da7:yì # å¶§ 0x5da8:xué # 嶨 0x5da9:náo # å¶© 0x5daa:yè # 嶪 0x5dab:yè # å¶« 0x5dac:yí # 嶬 0x5dad:niè # å¶­ 0x5dae:xiÇŽn # å¶® 0x5daf:jí # 嶯 0x5db0:xiè,jiè # å¶° 0x5db1:kÄ›,jié # å¶± 0x5db2:guÄ«,xÄ«,juàn # å¶² 0x5db3:dì # å¶³ 0x5db4:ào # å¶´ 0x5db5:zuì # å¶µ 0x5db7:yí # å¶· 0x5db8:róng # 嶸 0x5db9:dÇŽo # å¶¹ 0x5dba:lÇ�ng # 嶺 0x5dbb:jié # å¶» 0x5dbc:yÇ” # å¶¼ 0x5dbd:yuè # å¶½ 0x5dbe:yÇ�n # å¶¾ 0x5dc0:jié # å·€ 0x5dc1:lì,liè # å·� 0x5dc2:guÄ«,xÄ«,juàn # å·‚ 0x5dc3:lóng # å·ƒ 0x5dc4:lóng # å·„ 0x5dc5:diÄ�n # å·… 0x5dc6:yíng,hÅ�ng # å·† 0x5dc7:xÄ« # å·‡ 0x5dc8:jú # å·ˆ 0x5dc9:chán # å·‰ 0x5dca:yÇ�ng # å·Š 0x5dcb:kuÄ« # å·‹ 0x5dcc:yán # å·Œ 0x5dcd:wÄ“i # å·� 0x5dce:náo # å·Ž 0x5dcf:quán # å·� 0x5dd0:chÇŽo # å·� 0x5dd1:cuán # å·‘ 0x5dd2:luán # å·’ 0x5dd3:diÄ�n # å·“ 0x5dd4:diÄ�n # å·” 0x5dd6:yán # å·– 0x5dd7:yán # å·— 0x5dd8:yÇŽn # å·˜ 0x5dd9:kuí # å·™ 0x5dda:yÇŽn # å·š 0x5ddb:chuÄ�n # å·› 0x5ddc:kuài # å·œ 0x5ddd:chuÄ�n # å·� 0x5dde:zhÅ�u # å·ž 0x5ddf:huÄ�ng # å·Ÿ 0x5de0:jÄ«ng,xíng # å·  0x5de1:xún # å·¡ 0x5de2:cháo # å·¢ 0x5de3:cháo # å·£ 0x5de4:liè # å·¤ 0x5de5:gÅ�ng # å·¥ 0x5de6:zuÇ’ # å·¦ 0x5de7:qiÇŽo # å·§ 0x5de8:jù # å·¨ 0x5de9:gÇ’ng # å·© 0x5deb:wÅ« # å·« 0x5dee:chà,chÄ�,chÄ�i,cÄ« # å·® 0x5def:qiú # å·¯ 0x5df0:qiú # å·° 0x5df1:jÇ� # å·± 0x5df2:yÇ� # å·² 0x5df3:sì # å·³ 0x5df4:bÄ� # å·´ 0x5df5:zhÄ« # å·µ 0x5df6:zhÄ�o # å·¶ 0x5df7:xiàng,hàng # å·· 0x5df8:yí # å·¸ 0x5df9:jÇ�n # å·¹ 0x5dfa:xùn # å·º 0x5dfb:juàn,juÇŽn # å·» 0x5dfd:xùn # å·½ 0x5dfe:jÄ«n # å·¾ 0x5dff:fú # å·¿ 0x5e00:zÄ� # 帀 0x5e01:bì # å¸� 0x5e02:shì # 市 0x5e03:bù # 布 0x5e04:dÄ«ng # 帄 0x5e05:shuài # 帅 0x5e06:fÄ�n # 帆 0x5e07:niè # 帇 0x5e08:shÄ« # 师 0x5e09:fÄ“n # 帉 0x5e0a:pà # 帊 0x5e0b:zhÇ� # 帋 0x5e0c:xÄ« # 希 0x5e0d:hù # å¸� 0x5e0e:dàn # 帎 0x5e0f:wéi # å¸� 0x5e10:zhàng # å¸� 0x5e11:tÇŽng,nú # 帑 0x5e12:dài # 帒 0x5e13:mò,wà # 帓 0x5e14:pèi # 帔 0x5e15:pà # 帕 0x5e16:tiè,tiÄ›,tiÄ“ # 帖 0x5e17:fú # 帗 0x5e18:lián # 帘 0x5e19:zhì # 帙 0x5e1a:zhÇ’u # 帚 0x5e1b:bó # 帛 0x5e1c:zhì # 帜 0x5e1d:dì # å¸� 0x5e1e:mò # 帞 0x5e1f:yì # 帟 0x5e20:yì # 帠 0x5e21:píng # 帡 0x5e22:qià # 帢 0x5e23:juàn,juÇŽn # 帣 0x5e24:rú # 帤 0x5e25:shuài # 帥 0x5e26:dài # 带 0x5e27:zhÄ“n # 帧 0x5e28:shuì # 帨 0x5e29:qiÄ�o # 帩 0x5e2a:zhÄ“n # 帪 0x5e2b:shÄ« # 師 0x5e2c:qún # 帬 0x5e2d:xí # 席 0x5e2e:bÄ�ng # 帮 0x5e2f:dài # 帯 0x5e30:guÄ« # 帰 0x5e31:chóu,dào # 帱 0x5e32:píng # 帲 0x5e33:zhàng # 帳 0x5e34:jiÇŽn,jiÄ�n,sàn # 帴 0x5e35:wÄ�n # 帵 0x5e36:dài # 帶 0x5e37:wéi # 帷 0x5e38:cháng # 常 0x5e39:shà,qiè # 帹 0x5e3a:qí,jì # 帺 0x5e3b:zé # 帻 0x5e3c:guó # 帼 0x5e3d:mào # 帽 0x5e3e:zhÇ” # 帾 0x5e3f:hóu # 帿 0x5e40:zhÄ“n # å¹€ 0x5e41:zhèng # å¹� 0x5e42:mì # 幂 0x5e43:wéi # 幃 0x5e44:wò # 幄 0x5e45:fú # å¹… 0x5e46:yì # 幆 0x5e47:bÄ�ng # 幇 0x5e48:píng # 幈 0x5e4a:gÅ�ng # 幊 0x5e4b:pán # 幋 0x5e4c:huÇŽng # 幌 0x5e4d:tÄ�o # å¹� 0x5e4e:mì # 幎 0x5e4f:jià # å¹� 0x5e50:téng # å¹� 0x5e51:huÄ« # 幑 0x5e52:zhÅ�ng # å¹’ 0x5e53:shÄ�n,qiÄ�o,shÄ“n # 幓 0x5e54:màn # å¹” 0x5e55:mù # 幕 0x5e56:biÄ�o # å¹– 0x5e57:guó # å¹— 0x5e58:zé # 幘 0x5e59:mù # å¹™ 0x5e5a:bÄ�ng # 幚 0x5e5b:zhàng # å¹› 0x5e5c:jÇ�ng # 幜 0x5e5d:chÇŽn,chàn # å¹� 0x5e5e:fú # 幞 0x5e5f:zhì # 幟 0x5e60:hÅ« # å¹  0x5e61:fÄ�n # 幡 0x5e62:chuáng,zhuàng # å¹¢ 0x5e63:bì # å¹£ 0x5e66:mì # 幦 0x5e67:qiÄ�o # å¹§ 0x5e68:chÄ�n,chàn # 幨 0x5e69:fén # 幩 0x5e6a:méng # 幪 0x5e6b:bÄ�ng # 幫 0x5e6c:chóu,dào # 幬 0x5e6d:miè # å¹­ 0x5e6e:chú # å¹® 0x5e6f:jié # 幯 0x5e70:xiÇŽn # å¹° 0x5e71:lán # å¹± 0x5e72:gÄ�n,gàn # å¹² 0x5e73:píng # å¹³ 0x5e74:nián # å¹´ 0x5e75:jiÄ�n # å¹µ 0x5e76:bìng,bÄ«ng # å¹¶ 0x5e77:bìng,bÄ«ng # å¹· 0x5e78:xìng # 幸 0x5e79:gàn # å¹¹ 0x5e7a:yÄ�o # 幺 0x5e7b:huàn # å¹» 0x5e7c:yòu # å¹¼ 0x5e7d:yÅ�u # å¹½ 0x5e7e:jÄ«,jÇ� # å¹¾ 0x5e7f:guÇŽng,Ä�n # 广 0x5e80:pÇ� # 庀 0x5e81:tÄ«ng # åº� 0x5e82:zè # 庂 0x5e83:guÇŽng # 広 0x5e84:zhuÄ�ng # 庄 0x5e85:mó,mÄ�,me # 庅 0x5e86:qìng # 庆 0x5e87:bì # 庇 0x5e88:qín # 庈 0x5e89:dùn,tún # 庉 0x5e8a:chuáng # 床 0x5e8b:guÇ� # 庋 0x5e8c:yÇŽ # 庌 0x5e8d:bài,tÄ«ng # åº� 0x5e8e:jiè # 庎 0x5e8f:xù # åº� 0x5e90:lú # åº� 0x5e91:wÇ” # 庑 0x5e93:kù # 库 0x5e94:yÄ«ng,yìng # 应 0x5e95:dÇ�,de # 底 0x5e96:páo # 庖 0x5e97:diàn # 店 0x5e98:yÄ� # 庘 0x5e99:miào # 庙 0x5e9a:gÄ“ng # 庚 0x5e9b:cì # 庛 0x5e9c:fÇ” # 府 0x5e9d:tóng # åº� 0x5e9e:páng # 庞 0x5e9f:fèi # 废 0x5ea0:xiáng # 庠 0x5ea1:yÇ� # 庡 0x5ea2:zhì # 庢 0x5ea3:tiÄ�o # 庣 0x5ea4:zhì # 庤 0x5ea5:xiÅ« # 庥 0x5ea6:dù,duó # 度 0x5ea7:zuò # 座 0x5ea8:xiÄ�o # 庨 0x5ea9:tú # 庩 0x5eaa:guÇ� # 庪 0x5eab:kù # 庫 0x5eac:máng,méng,páng # 庬 0x5ead:tíng # 庭 0x5eae:yóu # 庮 0x5eaf:bÅ« # 庯 0x5eb0:bìng,píng # 庰 0x5eb1:chÄ›ng # 庱 0x5eb2:lái # 庲 0x5eb3:bÄ“i,bì,pí # 庳 0x5eb4:jÄ«,cuò # 庴 0x5eb5:Ä�n # 庵 0x5eb6:shù # 庶 0x5eb7:kÄ�ng # 康 0x5eb8:yÅ�ng # 庸 0x5eb9:tuÇ’ # 庹 0x5eba:sÅ�ng # 庺 0x5ebb:shù # 庻 0x5ebc:qÇ�ng # 庼 0x5ebd:yù # 庽 0x5ebe:yÇ” # 庾 0x5ebf:miào # 庿 0x5ec0:sÅ�u # 廀 0x5ec1:cè # å»� 0x5ec2:xiÄ�ng # 廂 0x5ec3:fèi # 廃 0x5ec4:jiù # 廄 0x5ec5:è # å»… 0x5ec6:guÄ«,wÄ›i,huì # 廆 0x5ec7:liù # 廇 0x5ec8:shà,xià # 廈 0x5ec9:lián # 廉 0x5eca:láng # 廊 0x5ecb:sÅ�u # 廋 0x5ecc:zhì # 廌 0x5ecd:bù # å»� 0x5ece:qÇ�ng # 廎 0x5ecf:jiù # å»� 0x5ed0:jiù # å»� 0x5ed1:jÇ�n,qín # 廑 0x5ed2:áo # å»’ 0x5ed3:kuò # 廓 0x5ed4:lóu # å»” 0x5ed5:yìn # 廕 0x5ed6:liào # å»– 0x5ed7:dài # å»— 0x5ed8:lù # 廘 0x5ed9:yì # å»™ 0x5eda:chú # 廚 0x5edb:chán # å»› 0x5edc:tú # 廜 0x5edd:sÄ« # å»� 0x5ede:xÄ«n # 廞 0x5edf:miào # 廟 0x5ee0:chÇŽng # å»  0x5ee1:wÇ” # 廡 0x5ee2:fèi # 廢 0x5ee3:guÇŽng # 廣 0x5ee5:kuài # 廥 0x5ee6:bì # 廦 0x5ee7:qiáng,sè # å»§ 0x5ee8:xiè # 廨 0x5ee9:lÇ�n # 廩 0x5eea:lÇ�n # 廪 0x5eeb:liáo # 廫 0x5eec:lú # 廬 0x5eee:yÇ�ng # å»® 0x5eef:xiÄ�n # 廯 0x5ef0:tÄ«ng # å»° 0x5ef1:yÅ�ng # å»± 0x5ef2:lí # 廲 0x5ef3:tÄ«ng # 廳 0x5ef4:yÇ�n,yìn # å»´ 0x5ef5:xún # 廵 0x5ef6:yán # å»¶ 0x5ef7:tíng # å»· 0x5ef8:dí # 廸 0x5ef9:pò,pÇŽi # 廹 0x5efa:jiàn # 建 0x5efb:huí # å»» 0x5efc:nÇŽi # 廼 0x5efd:huí # 廽 0x5efe:gÇ’ng # 廾 0x5eff:niàn # 廿 0x5f00:kÄ�i # å¼€ 0x5f01:biàn # å¼� 0x5f02:yì # 异 0x5f03:qì # 弃 0x5f04:nòng,lòng # 弄 0x5f05:fèn # å¼… 0x5f06:jÇ” # 弆 0x5f07:yÇŽn # 弇 0x5f08:yì # 弈 0x5f09:zàng # 弉 0x5f0a:bì # 弊 0x5f0b:yì # 弋 0x5f0c:yÄ« # 弌 0x5f0d:èr # å¼� 0x5f0e:sÄ�n # 弎 0x5f0f:shì # å¼� 0x5f10:èr # å¼� 0x5f11:shì # 弑 0x5f12:shì # å¼’ 0x5f13:gÅ�ng # 弓 0x5f14:diào # å¼” 0x5f15:yÇ�n # 引 0x5f16:hù # å¼– 0x5f17:fú # å¼— 0x5f18:hóng # 弘 0x5f19:wÅ« # å¼™ 0x5f1a:tuí # 弚 0x5f1b:chí # å¼› 0x5f1c:jiàng # 弜 0x5f1d:bà # å¼� 0x5f1e:shÄ›n # 弞 0x5f1f:dì,tì,tuí # 弟 0x5f20:zhÄ�ng # å¼  0x5f21:jué,zhÄ�ng # 弡 0x5f22:tÄ�o # å¼¢ 0x5f23:fÇ” # å¼£ 0x5f24:dÇ� # 弤 0x5f25:mí,mÇ� # å¼¥ 0x5f26:xián # 弦 0x5f27:hú # å¼§ 0x5f28:chÄ�o # 弨 0x5f29:nÇ” # 弩 0x5f2a:jìng # 弪 0x5f2b:zhÄ›n # 弫 0x5f2c:yi # 弬 0x5f2d:mÇ� # å¼­ 0x5f2e:juàn,quÄ�n # å¼® 0x5f2f:wÄ�n # 弯 0x5f30:shÄ�o # å¼° 0x5f31:ruò # å¼± 0x5f32:xuÄ�n,yuÄ�n # å¼² 0x5f33:jìng # å¼³ 0x5f34:diÄ�o # å¼´ 0x5f35:zhÄ�ng # å¼µ 0x5f36:jiàng # å¼¶ 0x5f37:qiáng,qiÇŽng,jiàng # å¼· 0x5f38:péng # 弸 0x5f39:dàn,tán # å¼¹ 0x5f3a:qiáng,qiÇŽng,jiàng # 强 0x5f3b:bì # å¼» 0x5f3c:bì # å¼¼ 0x5f3d:shè # å¼½ 0x5f3e:dàn,tán # å¼¾ 0x5f3f:jiÇŽn # 弿 0x5f40:gòu # å½€ 0x5f42:fÄ� # 彂 0x5f43:bì # 彃 0x5f44:kÅ�u # 彄 0x5f46:biè # 彆 0x5f47:xiÄ�o # 彇 0x5f48:dàn,tán # 彈 0x5f49:guÅ� # 彉 0x5f4a:qiáng,qiÇŽng,jiàng # 彊 0x5f4b:hóng # 彋 0x5f4c:mí,mÇ� # 彌 0x5f4d:guÅ� # å½� 0x5f4e:wÄ�n # 彎 0x5f4f:jué # å½� 0x5f50:jì,xuÄ› # å½� 0x5f51:jì # 彑 0x5f52:guÄ« # å½’ 0x5f53:dÄ�ng,dàng # 当 0x5f54:lù # å½” 0x5f55:lù # 录 0x5f56:tuàn # å½– 0x5f57:huì # å½— 0x5f58:zhì # 彘 0x5f59:huì # å½™ 0x5f5a:huì # 彚 0x5f5b:yí # å½› 0x5f5c:yí # 彜 0x5f5d:yí # å½� 0x5f5e:yí # 彞 0x5f5f:huò # 彟 0x5f60:huò # å½  0x5f61:shÄ�n,xiÇŽn # 彡 0x5f62:xíng # å½¢ 0x5f63:wén # å½£ 0x5f64:tóng # 彤 0x5f65:yàn # å½¥ 0x5f66:yàn # 彦 0x5f67:yù # å½§ 0x5f68:chÄ« # 彨 0x5f69:cÇŽi # 彩 0x5f6a:biÄ�o # 彪 0x5f6b:diÄ�o # 彫 0x5f6c:bÄ«n # 彬 0x5f6d:péng,bÄ�ng # å½­ 0x5f6e:yÇ’ng # å½® 0x5f6f:piÄ�o,piào # 彯 0x5f70:zhÄ�ng # å½° 0x5f71:yÇ�ng # å½± 0x5f72:chÄ« # å½² 0x5f73:chì # å½³ 0x5f74:zhuó,bó # å½´ 0x5f75:tuÇ’,yí # å½µ 0x5f76:jí # å½¶ 0x5f77:páng,fÇŽng # å½· 0x5f78:zhÅ�ng # 彸 0x5f79:yì # å½¹ 0x5f7a:wÇŽng # 彺 0x5f7b:chè # å½» 0x5f7c:bÇ� # å½¼ 0x5f7d:dÄ« # å½½ 0x5f7e:líng # å½¾ 0x5f7f:fù # 彿 0x5f80:wÇŽng # å¾€ 0x5f81:zhÄ“ng # å¾� 0x5f82:cú # 徂 0x5f83:wÇŽng # 徃 0x5f84:jìng # 径 0x5f85:dài,dÄ�i # å¾… 0x5f86:xÄ« # 徆 0x5f87:xùn # 徇 0x5f88:hÄ›n # 很 0x5f89:yáng # 徉 0x5f8a:huái # 徊 0x5f8b:lÇœ # 律 0x5f8c:hòu # 後 0x5f8d:wàng,jiÄ�,wÄ� # å¾� 0x5f8e:chÄ›ng,zhèng # 徎 0x5f8f:zhì # å¾� 0x5f90:xú # å¾� 0x5f91:jìng # 徑 0x5f92:tú # å¾’ 0x5f93:cóng # 従 0x5f95:lài,lái # 徕 0x5f96:cóng # å¾– 0x5f97:dé,dÄ›i,de # å¾— 0x5f98:pái # 徘 0x5f99:xÇ� # å¾™ 0x5f9b:jì # å¾› 0x5f9c:cháng # 徜 0x5f9d:zhì # å¾� 0x5f9e:cóng,zòng # 從 0x5f9f:zhÅ�u # 徟 0x5fa0:lái,lài # å¾  0x5fa1:yù # 御 0x5fa2:xiè # å¾¢ 0x5fa3:jiè # å¾£ 0x5fa4:jiàn # 徤 0x5fa5:shì,tÇ� # å¾¥ 0x5fa6:jiÇŽ,xiá # 徦 0x5fa7:biàn # å¾§ 0x5fa8:huáng # 徨 0x5fa9:fù # 復 0x5faa:xún # 循 0x5fab:wÄ›i # 徫 0x5fac:páng # 徬 0x5fad:yáo # å¾­ 0x5fae:wÄ“i # å¾® 0x5faf:xÄ« # 徯 0x5fb0:zhÄ“ng # å¾° 0x5fb1:piào # å¾± 0x5fb2:tí,chí # å¾² 0x5fb3:dé # å¾³ 0x5fb4:zhÇ�,zhÄ“ng # å¾´ 0x5fb5:zhÇ�,zhÄ“ng # å¾µ 0x5fb6:bié # å¾¶ 0x5fb7:dé # å¾· 0x5fb8:zhÇ’ng,chÅ�ng # 徸 0x5fb9:chè # å¾¹ 0x5fba:jiÇŽo,yáo # 徺 0x5fbb:huì # å¾» 0x5fbc:jiÇŽo,jiào # å¾¼ 0x5fbd:huÄ« # å¾½ 0x5fbe:méi # å¾¾ 0x5fbf:lòng,lÇ’ng # 徿 0x5fc0:xiÄ�ng # å¿€ 0x5fc1:bào # å¿� 0x5fc2:qú,jù # å¿‚ 0x5fc3:xÄ«n # 心 0x5fc5:bì # å¿… 0x5fc6:yì # 忆 0x5fc7:lè # 忇 0x5fc8:rén # 忈 0x5fc9:dÄ�o # 忉 0x5fca:dìng,tìng # 忊 0x5fcb:gÇŽi # å¿‹ 0x5fcc:jì # 忌 0x5fcd:rÄ›n # å¿� 0x5fce:rén # 忎 0x5fcf:chàn # å¿� 0x5fd0:tÇŽn # å¿� 0x5fd1:tè # å¿‘ 0x5fd2:tè,tuÄ«,tÄ“i # å¿’ 0x5fd3:gÄ�n,hàn # å¿“ 0x5fd4:yì,qì # å¿” 0x5fd5:shì,tài # å¿• 0x5fd6:cÇ”n # å¿– 0x5fd7:zhì # å¿— 0x5fd8:wàng # 忘 0x5fd9:máng # å¿™ 0x5fda:xÄ«,liÄ› # 忚 0x5fdb:fÄ�n # å¿› 0x5fdc:yÄ«ng,yìng # 応 0x5fdd:tiÇŽn # å¿� 0x5fde:mÇ�n,wÄ›n,mín # 忞 0x5fdf:mÇ�n,wÄ›n,mín # 忟 0x5fe0:zhÅ�ng # å¿  0x5fe1:chÅ�ng # å¿¡ 0x5fe2:wù # å¿¢ 0x5fe3:jí # å¿£ 0x5fe4:wÇ” # 忤 0x5fe5:xì # å¿¥ 0x5fe6:jiá # 忦 0x5fe7:yÅ�u # å¿§ 0x5fe8:wán # 忨 0x5fe9:cÅ�ng # å¿© 0x5fea:sÅ�ng,zhÅ�ng # 忪 0x5feb:kuài # å¿« 0x5fec:yù,shÅ« # 忬 0x5fed:biàn # å¿­ 0x5fee:zhì # å¿® 0x5fef:qí,shì # 忯 0x5ff0:cuì # å¿° 0x5ff1:chén # 忱 0x5ff2:tài # 忲 0x5ff3:tún,zhÅ«n,dùn # 忳 0x5ff4:qián,qín # å¿´ 0x5ff5:niàn # 念 0x5ff6:hún # å¿¶ 0x5ff7:xiÅ�ng # å¿· 0x5ff8:niÇ” # 忸 0x5ff9:kuáng,wÇŽng # 忹 0x5ffa:xiÄ�n # 忺 0x5ffb:xÄ«n # å¿» 0x5ffc:kÄ�ng,hàng # 忼 0x5ffd:hÅ« # 忽 0x5ffe:kài,xì # 忾 0x5fff:fèn # å¿¿ 0x6000:huái # 怀 0x6001:tài # æ€� 0x6002:sÇ’ng # 怂 0x6003:wÇ” # 怃 0x6004:òu # 怄 0x6005:chàng # 怅 0x6006:chuàng # 怆 0x6007:jù # 怇 0x6008:yì # 怈 0x6009:bÇŽo,bào # 怉 0x600a:chÄ�o # 怊 0x600b:mín,mén # 怋 0x600c:pÄ“i # 怌 0x600d:zuò,zhà # æ€� 0x600e:zÄ›n # 怎 0x600f:yàng # æ€� 0x6010:kòu,jù # æ€� 0x6011:bàn # 怑 0x6012:nù # 怒 0x6013:náo,niú # 怓 0x6014:zhÄ“ng # 怔 0x6015:pà # 怕 0x6016:bù # 怖 0x6017:tiÄ“,zhÄ�n # 怗 0x6018:hù,gù # 怘 0x6019:hù # 怙 0x601a:cÅ«,jù,zÅ« # 怚 0x601b:dá # 怛 0x601c:lián # 怜 0x601d:sÄ«,sÄ�i # æ€� 0x601e:yóu,chóu # 怞 0x601f:dì # 怟 0x6020:dài # 怠 0x6021:yí # 怡 0x6022:tÅ«,dié # 怢 0x6023:yóu # 怣 0x6024:fÅ« # 怤 0x6025:jí # 急 0x6026:pÄ“ng # 怦 0x6027:xìng # 性 0x6028:yuàn # 怨 0x6029:ní # 怩 0x602a:guài # 怪 0x602b:fú # 怫 0x602c:xì # 怬 0x602d:bì # 怭 0x602e:yÅ�u,yào # 怮 0x602f:qiè # 怯 0x6030:xuàn # 怰 0x6031:cÅ�ng # 怱 0x6032:bÇ�ng # 怲 0x6033:huÇŽng # 怳 0x6034:xù,xuè # 怴 0x6035:chù # 怵 0x6036:bì,pÄ« # 怶 0x6037:shù # 怷 0x6038:xÄ«,shù # 怸 0x6039:tÄ�n # 怹 0x603b:zÇ’ng # 总 0x603c:duì # 怼 0x603f:yì # 怿 0x6040:shì # æ�€ 0x6041:nèn,nín # æ�� 0x6042:xún # æ�‚ 0x6043:shì # æ�ƒ 0x6044:xì # æ�„ 0x6045:lÇŽo # æ�… 0x6046:héng # æ�† 0x6047:kuÄ�ng # æ�‡ 0x6048:móu # æ�ˆ 0x6049:zhÇ� # æ�‰ 0x604a:xié # æ�Š 0x604b:liàn # æ�‹ 0x604c:tiÄ�o,yáo # æ�Œ 0x604d:huÇŽng # æ�� 0x604e:dié # æ�Ž 0x604f:hào # æ�� 0x6050:kÇ’ng # æ�� 0x6051:guÇ� # æ�‘ 0x6052:héng # æ�’ 0x6053:xÄ«,qÄ«,xù # æ�“ 0x6054:xiào,jiÇŽo # æ�” 0x6055:shù # æ�• 0x6057:hÅ«,kuÄ� # æ�— 0x6058:qiÅ« # æ�˜ 0x6059:yàng # æ�™ 0x605a:huì # æ�š 0x605b:huí # æ�› 0x605c:chì # æ�œ 0x605d:jiá # æ�� 0x605e:yí # æ�ž 0x605f:xiÅ�ng # æ�Ÿ 0x6060:guài # æ�  0x6061:lìn # æ�¡ 0x6062:huÄ« # æ�¢ 0x6063:zì # æ�£ 0x6064:xù # æ�¤ 0x6065:chÇ� # æ�¥ 0x6066:shàng # æ�¦ 0x6067:nÇœ # æ�§ 0x6068:hèn # æ�¨ 0x6069:Ä“n # æ�© 0x606a:kè # æ�ª 0x606b:dòng # æ�« 0x606c:tián # æ�¬ 0x606d:gÅ�ng # æ�­ 0x606e:quán,zhuÄ�n # æ�® 0x606f:xÄ« # æ�¯ 0x6070:qià # æ�° 0x6071:yuè # æ�± 0x6072:pÄ“ng # æ�² 0x6073:kÄ›n # æ�³ 0x6074:dé # æ�´ 0x6075:huì # æ�µ 0x6076:è,wù,Ä›,wÅ« # æ�¶ 0x6078:tòng # æ�¸ 0x6079:yÄ�n # æ�¹ 0x607a:kÇŽi # æ�º 0x607b:cè # æ�» 0x607c:nÇŽo # æ�¼ 0x607d:yùn # æ�½ 0x607e:máng # æ�¾ 0x607f:yÇ’ng # æ�¿ 0x6080:yÇ’ng # æ‚€ 0x6081:yuÄ�n,juàn # æ‚� 0x6082:pÄ«,pÇ� # æ‚‚ 0x6083:kÇ”n # 悃 0x6084:qiÇŽo,qiÄ�o # æ‚„ 0x6085:yuè # æ‚… 0x6086:yù,shÅ« # 悆 0x6087:tú # 悇 0x6088:jiè,kè # 悈 0x6089:xÄ« # 悉 0x608a:zhé # 悊 0x608b:lìn # æ‚‹ 0x608c:tì # 悌 0x608d:hàn # æ‚� 0x608e:hào,jiào # 悎 0x608f:qiè # æ‚� 0x6090:tì # æ‚� 0x6091:bù # æ‚‘ 0x6092:yì # æ‚’ 0x6093:qiàn # æ‚“ 0x6094:huÇ� # æ‚” 0x6095:xÄ« # æ‚• 0x6096:bèi # æ‚– 0x6097:mán,mèn # æ‚— 0x6098:yÄ«,yì # 悘 0x6099:hÄ“ng,hèng # æ‚™ 0x609a:sÇ’ng # 悚 0x609b:quÄ�n # æ‚› 0x609c:chÄ›ng # 悜 0x609d:kuÄ«,lÇ� # æ‚� 0x609e:wù # 悞 0x609f:wù # 悟 0x60a0:yÅ�u # æ‚  0x60a1:lí # æ‚¡ 0x60a2:liàng # æ‚¢ 0x60a3:huàn # æ‚£ 0x60a4:cÅ�ng # 悤 0x60a5:yì,niàn # æ‚¥ 0x60a6:yuè # 悦 0x60a7:lì # æ‚§ 0x60a8:nín # 您 0x60a9:nÇŽo # æ‚© 0x60aa:è # 悪 0x60ab:què # æ‚« 0x60ac:xuán # 悬 0x60ad:qiÄ�n # æ‚­ 0x60ae:wù # æ‚® 0x60af:mÇ�n # 悯 0x60b0:cóng # æ‚° 0x60b1:fÄ›i # 悱 0x60b2:bÄ“i # 悲 0x60b3:dé # 悳 0x60b4:cuì # æ‚´ 0x60b5:chàng # 悵 0x60b6:mèn,mÄ“n # æ‚¶ 0x60b7:lì # æ‚· 0x60b8:jì # 悸 0x60b9:guàn # 悹 0x60ba:guàn # 悺 0x60bb:xìng # æ‚» 0x60bc:dào # 悼 0x60bd:qÄ« # 悽 0x60be:kÅ�ng,kÇ’ng # 悾 0x60bf:tiÇŽn # æ‚¿ 0x60c0:lÇ”n,lùn # 惀 0x60c1:xÄ« # æƒ� 0x60c2:kÇŽn # 惂 0x60c3:gÇ”n # 惃 0x60c4:nì # 惄 0x60c5:qíng # 情 0x60c6:chóu # 惆 0x60c7:dÅ«n # 惇 0x60c8:guÇ’ # 惈 0x60c9:zhÄ�n # 惉 0x60ca:jÄ«ng # 惊 0x60cb:wÇŽn # 惋 0x60cc:yuÄ�n,wÇŽn # 惌 0x60cd:jÄ«n # æƒ� 0x60ce:jì # 惎 0x60cf:lán,lín # æƒ� 0x60d0:yù,xù # æƒ� 0x60d1:huò # 惑 0x60d2:hé,hè # 惒 0x60d3:juàn,quán # 惓 0x60d4:tán,dàn # 惔 0x60d5:tì # 惕 0x60d6:tì # 惖 0x60d7:niàn # 惗 0x60d8:wÇŽng # 惘 0x60d9:chuò,chuì # 惙 0x60da:hÅ« # 惚 0x60db:hÅ«n,mèn # 惛 0x60dc:xÄ« # 惜 0x60dd:chÇŽng,tÇŽng # æƒ� 0x60de:xÄ«n # 惞 0x60df:wéi # 惟 0x60e0:huì # 惠 0x60e1:è,wù,Ä›,wÅ« # 惡 0x60e2:suÇ’,ruÇ� # 惢 0x60e3:zÇ’ng # 惣 0x60e4:jiÄ�n # 惤 0x60e5:yÇ’ng # 惥 0x60e6:diàn # 惦 0x60e7:jù # 惧 0x60e8:cÇŽn # 惨 0x60e9:chéng # 惩 0x60ea:dé # 惪 0x60eb:bèi # 惫 0x60ec:qiè # 惬 0x60ed:cán # 惭 0x60ee:dàn,dá # 惮 0x60ef:guàn # 惯 0x60f0:duò # 惰 0x60f1:nÇŽo # 惱 0x60f2:yùn # 惲 0x60f3:xiÇŽng # 想 0x60f4:zhuì # 惴 0x60f5:dié # 惵 0x60f6:huáng # 惶 0x60f7:chÇ”n # 惷 0x60f8:qióng # 惸 0x60f9:rÄ› # 惹 0x60fa:xÄ«ng # 惺 0x60fb:cè # 惻 0x60fc:biÇŽn # 惼 0x60fd:mÇ�n # 惽 0x60fe:zÅ�ng # 惾 0x60ff:tí,shì # 惿 0x6100:qiÇŽo # æ„€ 0x6101:chóu # æ„� 0x6102:bèi # æ„‚ 0x6103:xuÄ�n # 愃 0x6104:wÄ“i # æ„„ 0x6105:gé # æ„… 0x6106:qiÄ�n # 愆 0x6107:wÄ›i # 愇 0x6108:yù # 愈 0x6109:yú,tÅ�u # 愉 0x610a:bì # 愊 0x610b:xuÄ�n # æ„‹ 0x610c:huàn # 愌 0x610d:mÇ�n # æ„� 0x610e:bì # 愎 0x610f:yì # æ„� 0x6110:miÇŽn # æ„� 0x6111:yÇ’ng # æ„‘ 0x6112:qì,kài # æ„’ 0x6113:dàng,shÄ�ng,táng,yáng # æ„“ 0x6114:yÄ«n # æ„” 0x6115:è # æ„• 0x6116:chén,xìn,dÄ�n # æ„– 0x6117:mào # æ„— 0x6118:kè,qià # 愘 0x6119:kè # æ„™ 0x611a:yú # 愚 0x611b:ài # æ„› 0x611c:qiè # 愜 0x611d:yÇŽn # æ„� 0x611e:nuò # 愞 0x611f:gÇŽn # 感 0x6120:yùn # æ„  0x6121:còng,sÅ�ng # æ„¡ 0x6122:sÄ�i,sÄ«,sÇ� # æ„¢ 0x6123:lèng # æ„£ 0x6124:fèn # 愤 0x6126:kuì # 愦 0x6127:kuì # æ„§ 0x6128:què # 愨 0x6129:gÅ�ng,gòng,hÇ’ng # æ„© 0x612a:yún # 愪 0x612b:sù # æ„« 0x612c:sù,shuò # 愬 0x612d:qí # æ„­ 0x612e:yáo,yào # æ„® 0x612f:sÇ’ng # 愯 0x6130:huàng # æ„° 0x6131:jí # 愱 0x6132:gÇ” # 愲 0x6133:jù # 愳 0x6134:chuàng # æ„´ 0x6135:nì # 愵 0x6136:xié # æ„¶ 0x6137:kÇŽi # æ„· 0x6138:zhÄ›ng # 愸 0x6139:yÇ’ng # 愹 0x613a:cÇŽo # 愺 0x613b:xùn # æ„» 0x613c:shèn # 愼 0x613d:bó # 愽 0x613e:kài,xì # 愾 0x613f:yuàn # æ„¿ 0x6140:xì,xié # æ…€ 0x6141:hùn # æ…� 0x6142:yÇ’ng # æ…‚ 0x6143:yÇŽng # æ…ƒ 0x6144:lì # æ…„ 0x6145:cÇŽo,sÄ�o # æ…… 0x6146:tÄ�o # æ…† 0x6147:yÄ«n # æ…‡ 0x6148:cí # æ…ˆ 0x6149:xù,chù # æ…‰ 0x614a:qiàn,qiè # æ…Š 0x614b:tài # æ…‹ 0x614c:huÄ�ng # æ…Œ 0x614d:yùn # æ…� 0x614e:shèn # æ…Ž 0x614f:mÇ�ng # æ…� 0x6151:shè # æ…‘ 0x6152:cáo,cóng # æ…’ 0x6153:piÄ�o # æ…“ 0x6154:mù # æ…” 0x6155:mù # æ…• 0x6156:guó # æ…– 0x6157:chì # æ…— 0x6158:cÇŽn # æ…˜ 0x6159:cán # æ…™ 0x615a:cán # æ…š 0x615b:cuÄ« # æ…› 0x615c:mín # æ…œ 0x615d:tè # æ…� 0x615e:zhÄ�ng # æ…ž 0x615f:tòng # æ…Ÿ 0x6160:ào,áo # æ…  0x6161:shuÇŽng # æ…¡ 0x6162:màn # æ…¢ 0x6163:guàn # æ…£ 0x6164:què # æ…¤ 0x6165:zào # æ…¥ 0x6166:jiù # æ…¦ 0x6167:huì # æ…§ 0x6168:kÇŽi # æ…¨ 0x6169:lián,liÇŽn # æ…© 0x616a:òu # æ…ª 0x616b:sÇ’ng # æ…« 0x616c:qín,jìn,jÇ�n # æ…¬ 0x616d:yìn # æ…­ 0x616e:lÇœ # æ…® 0x616f:shÄ�ng # æ…¯ 0x6170:wèi # æ…° 0x6171:tuán # æ…± 0x6172:mán # æ…² 0x6173:qiÄ�n # æ…³ 0x6174:shè # æ…´ 0x6175:yÅ�ng # æ…µ 0x6176:qìng # æ…¶ 0x6177:kÄ�ng # æ…· 0x6178:dì,chì # æ…¸ 0x6179:zhí,zhé # æ…¹ 0x617a:lóu,lÇš # æ…º 0x617b:juàn # æ…» 0x617c:qÄ« # æ…¼ 0x617d:qÄ« # æ…½ 0x617e:yù # æ…¾ 0x617f:píng # æ…¿ 0x6180:liáo # 憀 0x6181:còng # æ†� 0x6182:yÅ�u # 憂 0x6183:chÅ�ng # 憃 0x6184:zhÄ«,zhì # 憄 0x6185:tòng # 憅 0x6186:chÄ“ng # 憆 0x6187:qì # 憇 0x6188:qÅ« # 憈 0x6189:péng # 憉 0x618a:bèi # 憊 0x618b:biÄ“ # 憋 0x618c:qióng # 憌 0x618d:jiÄ�o # æ†� 0x618e:zÄ“ng # 憎 0x618f:chì # æ†� 0x6190:lián # æ†� 0x6191:píng # 憑 0x6192:kuì # 憒 0x6193:huì # 憓 0x6194:qiáo # 憔 0x6195:chéng,dèng,zhèng # 憕 0x6196:yìn # 憖 0x6197:yìn # 憗 0x6198:xÇ�,xÄ« # 憘 0x6199:xÇ� # 憙 0x619a:dàn,dá # 憚 0x619b:tán # 憛 0x619c:duò # 憜 0x619d:duì # æ†� 0x619e:duì,dùn,tÅ«n # 憞 0x619f:sù # 憟 0x61a0:jué # 憠 0x61a1:cè # 憡 0x61a2:xiÄ�o,jiÄ�o # 憢 0x61a3:fÄ�n # 憣 0x61a4:fèn # 憤 0x61a5:láo # 憥 0x61a6:lào,láo # 憦 0x61a7:chÅ�ng # 憧 0x61a8:hÄ�n # 憨 0x61a9:qì # 憩 0x61aa:xián,xiàn # 憪 0x61ab:mÇ�n # 憫 0x61ac:jÇ�ng # 憬 0x61ad:liÇŽo,liáo # 憭 0x61ae:wÇ” # 憮 0x61af:cÇŽn # 憯 0x61b0:jué # 憰 0x61b1:cù # 憱 0x61b2:xiàn # 憲 0x61b3:tÇŽn # 憳 0x61b4:shéng # 憴 0x61b5:pÄ« # 憵 0x61b6:yì # 憶 0x61b7:chù # 憷 0x61b8:xiÄ�n # 憸 0x61b9:náo,nÇŽo,náng # 憹 0x61ba:dàn # 憺 0x61bb:tÇŽn # 憻 0x61bc:jÇ�ng,jìng # 憼 0x61bd:sÅ�ng # 憽 0x61be:hàn # 憾 0x61bf:jiÇŽo,jÇ� # 憿 0x61c0:wèi # 懀 0x61c1:xuÄ�n,huÄ�n # æ‡� 0x61c2:dÇ’ng # 懂 0x61c3:qín # 懃 0x61c4:qín # 懄 0x61c5:jù # 懅 0x61c6:cÇŽo,sÄ�o,sào # 懆 0x61c7:kÄ›n # 懇 0x61c8:xiè # 懈 0x61c9:yÄ«ng,yìng # 應 0x61ca:ào # 懊 0x61cb:mào # 懋 0x61cc:yì # 懌 0x61cd:lÇ�n # æ‡� 0x61ce:sè # 懎 0x61cf:jùn # æ‡� 0x61d0:huái # æ‡� 0x61d1:mèn # 懑 0x61d2:lÇŽn # 懒 0x61d3:ài # 懓 0x61d4:lÇ�n # 懔 0x61d5:yÄ�n # 懕 0x61d6:guÅ� # 懖 0x61d7:xià # 懗 0x61d8:chì # 懘 0x61d9:yÇ”,yú # 懙 0x61da:yìn # 懚 0x61db:dÄ�i # 懛 0x61dc:mèng,méng,mÄ›ng # 懜 0x61dd:ài,yì,nÇ� # æ‡� 0x61de:méng,mÄ›ng # 懞 0x61df:duì # 懟 0x61e0:qí,jÄ«,jì # 懠 0x61e1:mÇ’ # 懡 0x61e2:lán,xiàn # 懢 0x61e3:mèn # 懣 0x61e4:chóu # 懤 0x61e5:zhì # 懥 0x61e6:nuò # 懦 0x61e7:nuò # 懧 0x61e8:yÄ�n # 懨 0x61e9:yÇŽng # 懩 0x61ea:bó # 懪 0x61eb:zhì # 懫 0x61ec:kuàng # 懬 0x61ed:kuÇŽng # 懭 0x61ee:yÅ�u,yÇ’u # 懮 0x61ef:fÅ« # 懯 0x61f0:liú,liÇ” # 懰 0x61f1:miè # 懱 0x61f2:chéng # 懲 0x61f4:chàn # 懴 0x61f5:mÄ›ng # 懵 0x61f6:lÇŽn # 懶 0x61f7:huái # 懷 0x61f8:xuán # 懸 0x61f9:ràng # 懹 0x61fa:chàn # 懺 0x61fb:jì # 懻 0x61fc:jù # 懼 0x61fd:huÄ�n # 懽 0x61fe:shè # 懾 0x61ff:yì # 懿 0x6200:liàn # 戀 0x6201:nÇŽn # æˆ� 0x6202:mí,mó # 戂 0x6203:tÇŽng # 戃 0x6204:jué # 戄 0x6205:gàng,zhuàng # 戅 0x6206:gàng,zhuàng # 戆 0x6207:gàng,zhuàng # 戇 0x6208:gÄ“ # 戈 0x6209:yuè # 戉 0x620a:wù # 戊 0x620b:jiÄ�n # 戋 0x620c:xÅ« # 戌 0x620d:shù # æˆ� 0x620e:róng # 戎 0x620f:xì,hÅ« # æˆ� 0x6210:chéng # æˆ� 0x6211:wÇ’ # 我 0x6212:jiè # 戒 0x6213:gÄ“ # 戓 0x6214:jiÄ�n # 戔 0x6215:qiÄ�ng # 戕 0x6216:huò # 或 0x6217:qiÄ�ng,qiàng # 戗 0x6218:zhàn # 战 0x6219:dòng # 戙 0x621a:qÄ« # 戚 0x621b:jiá # 戛 0x621c:dié # 戜 0x621d:zéi # æˆ� 0x621e:jiá # 戞 0x621f:jÇ� # 戟 0x6220:zhí # 戠 0x6221:kÄ�n # 戡 0x6222:jí # 戢 0x6223:kuí # 戣 0x6224:gài # 戤 0x6225:dÄ›ng # 戥 0x6226:zhàn # 戦 0x6227:qiÄ�ng,qiàng # 戧 0x6228:gÄ“ # 戨 0x6229:jiÇŽn # 戩 0x622a:jié # 截 0x622b:yù # 戫 0x622c:jiÇŽn # 戬 0x622d:yÇŽn # 戭 0x622e:lù # 戮 0x622f:xì,hÅ« # 戯 0x6230:zhàn # 戰 0x6231:xì,hÅ« # 戱 0x6232:xì,hÅ« # 戲 0x6233:chuÅ� # 戳 0x6234:dài # 戴 0x6235:qú # 戵 0x6236:hù # 戶 0x6237:hù # 户 0x6238:hù # 戸 0x6239:è # 戹 0x623a:shì # 戺 0x623b:tì # 戻 0x623c:mÇŽo # 戼 0x623d:hù # 戽 0x623e:lì # 戾 0x623f:fáng,páng # 房 0x6240:suÇ’ # 所 0x6241:biÇŽn,piÄ�n # æ‰� 0x6242:diàn # 扂 0x6243:jiÅ�ng # 扃 0x6244:shÇŽng,jiÅ�ng # 扄 0x6245:yí # 扅 0x6246:yÇ� # 扆 0x6247:shàn,shÄ�n # 扇 0x6248:hù # 扈 0x6249:fÄ“i # 扉 0x624a:yÇŽn # 扊 0x624b:shÇ’u # 手 0x624d:cái # æ‰� 0x624e:zÄ�,zhÄ�,zhá # 扎 0x624f:qiú # æ‰� 0x6250:lè,lì,cái # æ‰� 0x6251:pÅ« # 扑 0x6252:bÄ�,pá # 扒 0x6253:dÇŽ,dá # 打 0x6254:rÄ“ng # 扔 0x6255:fÇŽn,fú # 払 0x6257:zài # 扗 0x6258:tuÅ� # 托 0x6259:zhàng # 扙 0x625a:diÇŽo,dí,yuÄ“,lì # 扚 0x625b:káng,gÄ�ng # 扛 0x625c:yÅ«,wÅ« # 扜 0x625d:yÅ«,wÅ«,kÅ« # æ‰� 0x625e:hàn # 扞 0x625f:shÄ“n # 扟 0x6260:chÄ� # 扠 0x6261:tuÅ�,chÇ�,yÇ� # 扡 0x6262:gÇ”,xì,gÄ“,jié # 扢 0x6263:kòu # 扣 0x6264:wù # 扤 0x6265:dèn # 扥 0x6266:qiÄ�n # 扦 0x6267:zhí # 执 0x6268:rèn # 扨 0x6269:kuò # 扩 0x626a:mén # 扪 0x626b:sÇŽo,sào # 扫 0x626c:yáng # 扬 0x626d:niÇ” # 扭 0x626e:bàn # 扮 0x626f:chÄ› # 扯 0x6270:rÇŽo # 扰 0x6271:xÄ«,chÄ�,qì # 扱 0x6272:qián,qín # 扲 0x6273:bÄ�n # 扳 0x6274:jiá # 扴 0x6275:yú # 扵 0x6276:fú # 扶 0x6277:bÄ�,ào # 扷 0x6278:xÄ«,zhé # 扸 0x6279:pÄ« # 批 0x627a:zhÇ� # 扺 0x627b:zhì,sÇ”n,kÇŽn # 扻 0x627c:è # 扼 0x627d:dèn # 扽 0x627e:zhÇŽo # 找 0x627f:chéng # 承 0x6280:jì # 技 0x6281:yÇŽn # æŠ� 0x6282:kuáng,wÇŽng,zài # 抂 0x6283:biàn # 抃 0x6284:chÄ�o # 抄 0x6285:jÅ« # 抅 0x6286:wÄ›n # 抆 0x6287:hú,gÇ” # 抇 0x6288:yuè # 抈 0x6289:jué # 抉 0x628a:bÇŽ,bà # 把 0x628b:qìn # 抋 0x628c:dÇŽn,shÄ›n # 抌 0x628d:zhÄ›ng # æŠ� 0x628e:yÇ”n # 抎 0x628f:wán # æŠ� 0x6290:nè,nì,ruì,nà # æŠ� 0x6291:yì # 抑 0x6292:shÅ« # 抒 0x6293:zhuÄ� # 抓 0x6294:póu # 抔 0x6295:tóu # 投 0x6296:dÇ’u # 抖 0x6297:kàng # 抗 0x6298:zhÄ“,zhé,shé # 折 0x6299:póu,pÅ�u,fÅ« # 抙 0x629a:fÇ” # 抚 0x629b:pÄ�o # 抛 0x629c:bá # 抜 0x629d:ÇŽo,ào,niù # æŠ� 0x629e:zé # 択 0x629f:tuán # 抟 0x62a0:kÅ�u # 抠 0x62a1:lÅ«n,lún # 抡 0x62a2:qiÄ�ng,qiÇŽng,chÄ“ng # 抢 0x62a4:hù # 护 0x62a5:bào # 报 0x62a6:bÇ�ng # 抦 0x62a7:zhÇ�,zhÇŽi # 抧 0x62a8:pÄ“ng # 抨 0x62a9:nán # 抩 0x62aa:bù,pÅ« # 抪 0x62ab:pÄ« # 披 0x62ac:tái # 抬 0x62ad:yÇŽo,tÄ�o # 抭 0x62ae:zhÄ›n # 抮 0x62af:zhÄ� # 抯 0x62b0:yÄ�ng # 抰 0x62b1:bào # 抱 0x62b2:hÄ“,hè,qiÄ� # 抲 0x62b3:nÇ�,ní # 抳 0x62b4:yè # 抴 0x62b5:dÇ� # 抵 0x62b6:chì # 抶 0x62b7:pÄ«,pÄ“i # 抷 0x62b8:jiÄ� # 抸 0x62b9:mÇ’,mò,mÄ� # 抹 0x62ba:mèi # 抺 0x62bb:chÄ“n # 抻 0x62bc:yÄ� # 押 0x62bd:chÅ�u # 抽 0x62be:qÅ« # 抾 0x62bf:mÇ�n # 抿 0x62c0:zhù # æ‹€ 0x62c1:jiÄ�,yá # æ‹� 0x62c2:fú,bì # æ‹‚ 0x62c3:zhÇŽ # 拃 0x62c4:zhÇ” # æ‹„ 0x62c5:dÄ�n,dàn,dÇŽn # æ‹… 0x62c6:chÄ�i,cÄ� # 拆 0x62c7:mÇ” # 拇 0x62c8:niÄ�n # 拈 0x62c9:lÄ�,lá # 拉 0x62ca:fÇ” # 拊 0x62cb:pÄ�o # æ‹‹ 0x62cc:bàn,pàn # 拌 0x62cd:pÄ�i # æ‹� 0x62ce:lÄ«n # 拎 0x62cf:ná # æ‹� 0x62d0:guÇŽi # æ‹� 0x62d1:qián # æ‹‘ 0x62d2:jù # æ‹’ 0x62d3:tuò,tà,zhí # æ‹“ 0x62d4:bá # æ‹” 0x62d5:tuÅ� # æ‹• 0x62d6:tuÅ� # æ‹– 0x62d7:ÇŽo,ào,niù # æ‹— 0x62d8:jÅ«,gÅ�u # 拘 0x62d9:zhuÅ� # æ‹™ 0x62da:pàn,pÄ«n,fÄ�n # 拚 0x62db:zhÄ�o # æ‹› 0x62dc:bài # 拜 0x62dd:bài # æ‹� 0x62de:dÇ� # 拞 0x62df:nÇ� # 拟 0x62e0:jù # æ‹  0x62e1:kuò # æ‹¡ 0x62e2:lÇ’ng # æ‹¢ 0x62e3:jiÇŽn # æ‹£ 0x62e5:yÅ�ng # æ‹¥ 0x62e6:lán # 拦 0x62e7:níng,nÇ�ng,nìng # æ‹§ 0x62e8:bÅ� # 拨 0x62e9:zé,zhái # æ‹© 0x62ea:qiÄ�n # 拪 0x62eb:hén # æ‹« 0x62ec:kuò,guÄ� # 括 0x62ed:shì # æ‹­ 0x62ee:jié,jiá # æ‹® 0x62ef:zhÄ›ng # 拯 0x62f0:nÇ�n # æ‹° 0x62f1:gÇ’ng # 拱 0x62f2:gÇ’ng # 拲 0x62f3:quán # 拳 0x62f4:shuÄ�n # æ‹´ 0x62f5:cún,zùn # 拵 0x62f6:zÄ�,zÇŽn # æ‹¶ 0x62f7:kÇŽo # æ‹· 0x62f8:yí,chÇ�,hài # 拸 0x62f9:xié # 拹 0x62fa:cè,sè,chuò # 拺 0x62fb:huÄ« # æ‹» 0x62fc:pÄ«n # 拼 0x62fd:zhuài,zhuÄ�i,yè # 拽 0x62fe:shí,shè # 拾 0x62ff:ná # æ‹¿ 0x6300:bÄ�i # 挀 0x6301:chí # æŒ� 0x6302:guà # 挂 0x6303:zhì # 挃 0x6304:kuò,guÄ�ng # 挄 0x6305:duò # 挅 0x6306:duÇ’,duò # 挆 0x6307:zhÇ� # 指 0x6308:qiè # 挈 0x6309:àn # 按 0x630a:nòng # 挊 0x630b:zhèn # 挋 0x630c:gé # 挌 0x630d:jiào # æŒ� 0x630e:kuà,kÅ« # 挎 0x630f:dòng # æŒ� 0x6310:rú,ná # æŒ� 0x6311:tiÄ�o,tiÇŽo # 挑 0x6312:liè # 挒 0x6313:zhÄ� # 挓 0x6314:lÇš # 挔 0x6315:dié,shè # 挕 0x6316:wÄ� # 挖 0x6317:jué # 挗 0x6319:jÇ” # 挙 0x631a:zhì # 挚 0x631b:luán # 挛 0x631c:yà,yÇŽ # 挜 0x631d:zhuÄ�,wÅ� # æŒ� 0x631e:tà # 挞 0x631f:xié,jiÄ� # 挟 0x6320:náo # 挠 0x6321:dÇŽng,dàng # 挡 0x6322:jiÇŽo # 挢 0x6323:zhèng,zhÄ“ng # 挣 0x6324:jÇ� # 挤 0x6325:huÄ« # 挥 0x6326:xián # 挦 0x6328:Ä�i,ái # 挨 0x6329:tuÅ�,shuì # 挩 0x632a:nuó # 挪 0x632b:cuò # 挫 0x632c:bó # 挬 0x632d:gÄ›ng # 挭 0x632e:tÇ�,tì # 挮 0x632f:zhèn # 振 0x6330:chéng # 挰 0x6331:suÅ�,shÄ� # 挱 0x6332:suÅ�,shÄ� # 挲 0x6333:kÄ“ng,qiÄ�n # 挳 0x6334:mÄ›i # 挴 0x6335:nòng # 挵 0x6336:jú # 挶 0x6337:bàng,péng # 挷 0x6338:jiÇŽn # 挸 0x6339:yì # 挹 0x633a:tÇ�ng # 挺 0x633b:shÄ�n # 挻 0x633c:ruó # 挼 0x633d:wÇŽn # 挽 0x633e:xié,jiÄ� # 挾 0x633f:chÄ� # 挿 0x6340:péng,feÌ�ng # æ�€ 0x6341:jiÇŽo,kù # æ�� 0x6342:wÇ” # æ�‚ 0x6343:jùn # æ�ƒ 0x6344:jiù,jÅ«,qiuÌ� # æ�„ 0x6345:tÇ’ng # æ�… 0x6346:kÇ”n # æ�† 0x6347:huò,chì # æ�‡ 0x6348:tú,shÅ«,chá # æ�ˆ 0x6349:zhuÅ� # æ�‰ 0x634a:póu,pÅ�u,fÅ« # æ�Š 0x634b:luÅ�,lÇš # æ�‹ 0x634c:bÄ� # æ�Œ 0x634d:hàn # æ�� 0x634e:shÄ�o,shào # æ�Ž 0x634f:niÄ“ # æ�� 0x6350:juÄ�n # æ�� 0x6351:zè # æ�‘ 0x6352:shù,sÇ’ng,sÅ�u # æ�’ 0x6353:yé,yú # æ�“ 0x6354:jué,zhuó # æ�” 0x6355:bÇ” # æ�• 0x6356:wán # æ�– 0x6357:bù,pú,zhì # æ�— 0x6358:zùn # æ�˜ 0x6359:yè # æ�™ 0x635a:zhÄ�i # æ�š 0x635b:lÇš # æ�› 0x635c:sÅ�u # æ�œ 0x635d:tuÅ�,shuì # æ�� 0x635e:lÄ�o # æ�ž 0x635f:sÇ”n # æ�Ÿ 0x6360:bÄ�ng # æ�  0x6361:jiÇŽn # æ�¡ 0x6362:huàn # æ�¢ 0x6363:dÇŽo # æ�£ 0x6365:wàn,wÇŽn,wÄ�n,yù # æ�¥ 0x6366:qín # æ�¦ 0x6367:pÄ›ng # æ�§ 0x6368:shÄ› # æ�¨ 0x6369:liè # æ�© 0x636a:mín # æ�ª 0x636b:mén # æ�« 0x636c:fÇ”,fù,bÇ” # æ�¬ 0x636d:bÇŽi # æ�­ 0x636e:jù,jÅ« # æ�® 0x636f:dáo # æ�¯ 0x6370:wÇ’,luò,luÇ’ # æ�° 0x6371:ái # æ�± 0x6372:juÇŽn,quán # æ�² 0x6373:yuè # æ�³ 0x6374:zÇ’ng # æ�´ 0x6375:chÄ“n # æ�µ 0x6376:chuí # æ�¶ 0x6377:jié # æ�· 0x6378:tÅ« # æ�¸ 0x6379:bèn # æ�¹ 0x637a:nà # æ�º 0x637b:niÇŽn,niÄ“ # æ�» 0x637c:ruó,wÄ›i,ré # æ�¼ 0x637d:zuó # æ�½ 0x637e:wò,xiá # æ�¾ 0x637f:qÄ« # æ�¿ 0x6380:xiÄ�n # 掀 0x6381:chéng # æŽ� 0x6382:diÄ�n # 掂 0x6383:sÇŽo,sào # 掃 0x6384:lÅ«n,lún # 掄 0x6385:qìng,qiàn # 掅 0x6386:gÄ�ng # 掆 0x6387:duÅ� # 掇 0x6388:shòu # 授 0x6389:diào # 掉 0x638a:pÇ’u,póu # 掊 0x638b:dÇ� # 掋 0x638c:zhÇŽng # 掌 0x638d:hùn # æŽ� 0x638e:jÇ� # 掎 0x638f:tÄ�o # æŽ� 0x6390:qiÄ� # æŽ� 0x6391:qí # 掑 0x6392:pái,pÇŽi # 排 0x6393:shÅ« # 掓 0x6394:qiÄ�n,wàn # 掔 0x6395:líng # 掕 0x6396:yè,yÄ“ # 掖 0x6397:yà,yÇŽ # 掗 0x6398:jué # 掘 0x6399:zhÄ“ng,zhèng # 掙 0x639a:liÇŽng # 掚 0x639b:guà # 掛 0x639c:nÇ�,niè,yì # 掜 0x639d:huò,xù # æŽ� 0x639e:shàn,yàn,yÇŽn # 掞 0x639f:zhÄ›ng,dìng # 掟 0x63a0:lüè # 掠 0x63a1:cÇŽi # 採 0x63a2:tàn # 探 0x63a3:chè # 掣 0x63a4:bÄ«ng # 掤 0x63a5:jiÄ“ # 接 0x63a6:tì # 掦 0x63a7:kòng # 控 0x63a8:tuÄ« # 推 0x63a9:yÇŽn # 掩 0x63aa:cuò # 措 0x63ab:zÅ�u,zhÅ�u,chÅ�u # 掫 0x63ac:jÅ« # 掬 0x63ad:tiàn # 掭 0x63ae:qián # 掮 0x63af:kèn # 掯 0x63b0:bÄ�i # 掰 0x63b1:pá # 掱 0x63b2:jiÄ“ # 掲 0x63b3:lÇ” # 掳 0x63b4:guó # 掴 0x63b7:zhì # 掷 0x63b8:dÇŽn,shàn # 掸 0x63ba:chÄ�n,xiÄ�n,càn,shÇŽn # 掺 0x63bb:sÄ�o # 掻 0x63bc:guàn # 掼 0x63bd:pèng # 掽 0x63be:yuàn # 掾 0x63bf:nuò # 掿 0x63c0:jiÇŽn # æ�€ 0x63c1:zhÄ“ng,kÄ“ng # æ�� 0x63c2:jiÅ«,yóu # æ�‚ 0x63c3:jiÇŽn,jiÄ�n # æ�ƒ 0x63c4:yú # æ�„ 0x63c5:yán # æ�… 0x63c6:kuí # æ�† 0x63c7:nÇŽn # æ�‡ 0x63c8:hÅ�ng # æ�ˆ 0x63c9:róu # æ�‰ 0x63ca:pì,chè # æ�Š 0x63cb:wÄ“i # æ�‹ 0x63cc:sÄ�i,zÇ’ng,cÄ�i # æ�Œ 0x63cd:zòu # æ�� 0x63ce:xuÄ�n # æ�Ž 0x63cf:miáo # æ�� 0x63d0:tí,dÄ«,dÇ� # æ�� 0x63d1:niÄ“ # æ�‘ 0x63d2:chÄ� # æ�’ 0x63d3:shì # æ�“ 0x63d4:zÇ’ng,sÅ�ng # æ�” 0x63d5:zhèn,zhÄ“n # æ�• 0x63d6:yÄ« # æ�– 0x63d7:xún # æ�— 0x63d8:huáng,yóng # æ�˜ 0x63d9:biÇŽn # æ�™ 0x63da:yáng # æ�š 0x63db:huàn # æ�› 0x63dc:yÇŽn # æ�œ 0x63dd:zÇŽn,zuàn # æ�� 0x63de:ÇŽn # æ�ž 0x63df:xÅ«,jÅ« # æ�Ÿ 0x63e0:yà # æ�  0x63e1:wò # æ�¡ 0x63e2:ké,qiÄ� # æ�¢ 0x63e3:chuÇŽi,chuài,chuÄ�i,tuán,zhuÄ« # æ�£ 0x63e4:jí # æ�¤ 0x63e5:tì,dì # æ�¥ 0x63e6:là,lá # æ�¦ 0x63e7:là # æ�§ 0x63e8:chéng # æ�¨ 0x63e9:kÄ�i # æ�© 0x63ea:jiÅ« # æ�ª 0x63eb:jiÅ« # æ�« 0x63ec:tú # æ�¬ 0x63ed:jiÄ“,qì # æ�­ 0x63ee:huÄ« # æ�® 0x63ef:gèn # æ�¯ 0x63f0:chòng,dÇ’ng # æ�° 0x63f1:xiÄ�o # æ�± 0x63f2:shé,dié,yè # æ�² 0x63f3:xiÄ“ # æ�³ 0x63f4:yuán # æ�´ 0x63f5:qián,jiàn,jiÇŽn # æ�µ 0x63f6:yé # æ�¶ 0x63f7:chÄ� # æ�· 0x63f8:zhÄ� # æ�¸ 0x63f9:bÄ“i # æ�¹ 0x63fa:yáo # æ�º 0x63fd:lÇŽn # æ�½ 0x63fe:wèn # æ�¾ 0x63ff:qìn # æ�¿ 0x6400:chÄ�n # æ�€ 0x6401:gÄ“,gé # æ�� 0x6402:lÇ’u,lÅ�u # æ�‚ 0x6403:zÇ’ng # æ�ƒ 0x6404:gèn # æ�„ 0x6405:jiÇŽo # æ�… 0x6406:gòu # æ�† 0x6407:qìn # æ�‡ 0x6408:róng # æ�ˆ 0x6409:què # æ�‰ 0x640a:chÅ�u,zÇ’u # æ�Š 0x640b:chuÄ�i # æ�‹ 0x640c:zhÇŽn # æ�Œ 0x640d:sÇ”n # æ�� 0x640e:sÅ«n # æ�Ž 0x640f:bó # æ�� 0x6410:chù # æ�� 0x6411:róng,náng,nÇŽng # æ�‘ 0x6412:bàng,péng # æ�’ 0x6413:cuÅ� # æ�“ 0x6414:sÄ�o # æ�” 0x6415:kÄ“,è # æ�• 0x6416:yáo # æ�– 0x6417:dÇŽo # æ�— 0x6418:zhÄ« # æ�˜ 0x6419:nù,nuò,nòu # æ�™ 0x641a:lÄ�,xié,xiàn # æ�š 0x641b:jiÄ�n # æ�› 0x641c:sÅ�u # æ�œ 0x641d:qiÇ” # æ�� 0x641e:gÇŽo # æ�ž 0x641f:xiÇŽn,xiÄ�n # æ�Ÿ 0x6420:shuò # æ�  0x6421:sÇŽng # æ�¡ 0x6422:jìn # æ�¢ 0x6423:miè # æ�£ 0x6424:è # æ�¤ 0x6425:chuí # æ�¥ 0x6426:nuò # æ�¦ 0x6427:shÄ�n # æ�§ 0x6428:tà # æ�¨ 0x6429:jié,zhé # æ�© 0x642a:táng # æ�ª 0x642b:pán,bÄ�n,pó # æ�« 0x642c:bÄ�n # æ�¬ 0x642d:dÄ� # æ�­ 0x642e:lì # æ�® 0x642f:tÄ�o # æ�¯ 0x6430:hú # æ�° 0x6431:zhì,nái # æ�± 0x6432:wÄ�,wÇŽ,wà # æ�² 0x6433:huá # æ�³ 0x6434:qiÄ�n # æ�´ 0x6435:wèn # æ�µ 0x6436:qiÄ�ng,qiÇŽng,chÄ“ng # æ�¶ 0x6437:tián,shÄ“n # æ�· 0x6438:zhÄ“n # æ�¸ 0x6439:è # æ�¹ 0x643a:xié # æ�º 0x643b:ná,nuò # æ�» 0x643c:quán # æ�¼ 0x643d:chá # æ�½ 0x643e:zhà # æ�¾ 0x643f:gé # æ�¿ 0x6440:wÇ” # æ‘€ 0x6441:èn # æ‘� 0x6442:shè # æ‘‚ 0x6443:gÄ�ng # 摃 0x6444:shè,niè # æ‘„ 0x6445:shÅ« # æ‘… 0x6446:bÇŽi # 摆 0x6447:yáo # 摇 0x6448:bìn # 摈 0x6449:sÅ�u # 摉 0x644a:tÄ�n # 摊 0x644b:sà,shÄ�,shÇŽi # æ‘‹ 0x644c:chÇŽn,sùn # 摌 0x644d:suÅ� # æ‘� 0x644e:jiÅ«,liú,liáo,jiÇŽo,náo # 摎 0x644f:chÅ�ng # æ‘� 0x6450:chuÄ�ng # æ‘� 0x6451:guó,guÄ�i # æ‘‘ 0x6452:bìng # æ‘’ 0x6453:féng,pÄ›ng # æ‘“ 0x6454:shuÄ�i # æ‘” 0x6455:dì,tú,zhí # æ‘• 0x6456:qì,jì,chá # æ‘– 0x6458:zhÄ�i # 摘 0x6459:liÇŽn,liàn # æ‘™ 0x645a:chÄ“ng # 摚 0x645b:chÄ« # æ‘› 0x645c:guàn # 摜 0x645d:lù # æ‘� 0x645e:luò # 摞 0x645f:lÇ’u,lÅ�u # 摟 0x6460:zÇ’ng # æ‘  0x6461:gài,xì # æ‘¡ 0x6462:hù,chÅ« # æ‘¢ 0x6463:zhÄ� # æ‘£ 0x6464:qiÄ�ng # 摤 0x6465:tàng # æ‘¥ 0x6466:huà # 摦 0x6467:cuÄ« # æ‘§ 0x6468:zhì,nái # 摨 0x6469:mó,mÄ� # æ‘© 0x646a:jiÄ�ng,qiàng # 摪 0x646b:guÄ« # æ‘« 0x646c:yÇ�ng # 摬 0x646d:zhí # æ‘­ 0x646e:áo,qiáo # æ‘® 0x646f:zhì # 摯 0x6470:niè,chè # æ‘° 0x6471:mán,màn # 摱 0x6472:chàn,cán # 摲 0x6473:kÅ�u # 摳 0x6474:chÅ« # æ‘´ 0x6475:sè,mí,sù # 摵 0x6476:tuán # æ‘¶ 0x6477:jiÇŽo,chÄ�o # æ‘· 0x6478:mÅ� # 摸 0x6479:mó # 摹 0x647a:zhé # 摺 0x647b:chÄ�n,xiÄ�n,càn,shÇŽn # æ‘» 0x647c:kÄ“ng,qiÄ�n # 摼 0x647d:biào,biÄ�o # 摽 0x647e:jiàng # 摾 0x647f:yáo # æ‘¿ 0x6480:gòu # æ’€ 0x6481:qiÄ�n # æ’� 0x6482:liào # æ’‚ 0x6483:jÄ« # æ’ƒ 0x6484:yÄ«ng # æ’„ 0x6485:juÄ“,jué # æ’… 0x6486:piÄ“ # æ’† 0x6487:piÄ“,piÄ› # æ’‡ 0x6488:lÄ�o # æ’ˆ 0x6489:dÅ«n # æ’‰ 0x648a:xiàn # æ’Š 0x648b:ruán # æ’‹ 0x648c:guì # æ’Œ 0x648d:zÇŽn,zÄ�n,zÄ“n,qián # æ’� 0x648e:yÄ« # æ’Ž 0x648f:xián # æ’� 0x6490:chÄ“ng # æ’� 0x6491:chÄ“ng # æ’‘ 0x6492:sÄ�,sÇŽ # æ’’ 0x6493:náo # æ’“ 0x6494:hòng # æ’” 0x6495:sÄ« # æ’• 0x6496:hàn # æ’– 0x6497:héng,guàng # æ’— 0x6498:dÄ� # æ’˜ 0x6499:zÇ”n # æ’™ 0x649a:niÇŽn # æ’š 0x649b:lÇ�n # æ’› 0x649c:zhÄ›ng,chéng # æ’œ 0x649d:huÄ«,wéi # æ’� 0x649e:zhuàng # æ’ž 0x649f:jiÇŽo # æ’Ÿ 0x64a0:jÇ� # æ’  0x64a1:cÄ�o # æ’¡ 0x64a2:dÇŽn # æ’¢ 0x64a3:dÇŽn,shàn # æ’£ 0x64a4:chè # æ’¤ 0x64a5:bÅ� # æ’¥ 0x64a6:chÄ› # æ’¦ 0x64a7:juÄ“ # æ’§ 0x64a8:xiÄ�o,sÅ�u # æ’¨ 0x64a9:liÄ�o,liáo # æ’© 0x64aa:bèn # æ’ª 0x64ab:fÇ” # æ’« 0x64ac:qiào # æ’¬ 0x64ad:bÅ� # æ’­ 0x64ae:cuÅ�,zuÇ’ # æ’® 0x64af:zhuó # æ’¯ 0x64b0:zhuàn # æ’° 0x64b1:wÄ›i,tuÇ’ # æ’± 0x64b2:pÅ« # æ’² 0x64b3:qìn # æ’³ 0x64b4:dÅ«n # æ’´ 0x64b5:niÇŽn # æ’µ 0x64b7:xié # æ’· 0x64b8:lÅ« # æ’¸ 0x64b9:jiÇŽo # æ’¹ 0x64ba:cuÄ�n # æ’º 0x64bb:tà # æ’» 0x64bc:hàn # æ’¼ 0x64bd:qiào,yÄ�o,jÄ« # æ’½ 0x64be:zhuÄ�,wÅ� # æ’¾ 0x64bf:jiÇŽn # æ’¿ 0x64c0:gÇŽn # æ“€ 0x64c1:yÅ�ng # æ“� 0x64c2:léi,lèi # æ“‚ 0x64c3:nÇŽng # 擃 0x64c4:lÇ” # æ“„ 0x64c5:shàn # æ“… 0x64c6:zhuó # 擆 0x64c7:zé,zhái # 擇 0x64c8:pÇ” # 擈 0x64c9:chuò # 擉 0x64ca:jÄ« # 擊 0x64cb:dÇŽng,dàng # æ“‹ 0x64cc:sè # 擌 0x64cd:cÄ�o # æ“� 0x64ce:qíng # 擎 0x64cf:qíng,jÇ�ng # æ“� 0x64d0:huàn # æ“� 0x64d1:jiÄ“ # æ“‘ 0x64d2:qín # æ“’ 0x64d3:kuÇŽi # æ““ 0x64d4:dÄ�n,dàn # æ“” 0x64d5:xié # æ“• 0x64d6:qiÄ�,jiÄ�,yè # æ“– 0x64d7:pÇ�,bò # æ“— 0x64d8:bò,bÄ�i # 擘 0x64d9:ào # æ“™ 0x64da:jù,jÅ« # 據 0x64db:yè # æ“› 0x64de:sòu,sÇ’u # 擞 0x64df:mí # 擟 0x64e0:jÇ� # æ“  0x64e1:tái # æ“¡ 0x64e2:zhuó # æ“¢ 0x64e3:dÇŽo # æ“£ 0x64e4:xÇ�ng # 擤 0x64e5:lÇŽn # æ“¥ 0x64e6:cÄ� # 擦 0x64e7:jÇ” # æ“§ 0x64e8:yÄ“ # 擨 0x64e9:rÇ” # æ“© 0x64ea:yè # 擪 0x64eb:yè # æ“« 0x64ec:nÇ� # 擬 0x64ed:huò # æ“­ 0x64ee:jié # æ“® 0x64ef:bìn # 擯 0x64f0:níng,nÇ�ng,nìng # æ“° 0x64f1:gÄ“,gé # 擱 0x64f2:zhì # 擲 0x64f3:zhì,jié # 擳 0x64f4:kuò # æ“´ 0x64f5:mó # 擵 0x64f6:jiàn # æ“¶ 0x64f7:xié # æ“· 0x64f8:liè,là # 擸 0x64f9:tÄ�n # 擹 0x64fa:bÇŽi # 擺 0x64fb:sòu,sÇ’u # æ“» 0x64fc:lÅ« # 擼 0x64fd:lì,luò,yuè # 擽 0x64fe:rÇŽo # 擾 0x64ff:tÄ«,zhì,zhÄ�i # æ“¿ 0x6500:pÄ�n # 攀 0x6501:yÇŽng # æ”� 0x6502:léi,lèi # 攂 0x6503:cÄ�,sÇŽ # 攃 0x6504:shÅ« # 攄 0x6505:zÇŽn # æ”… 0x6506:niÇŽn # 攆 0x6507:xiÇŽn # 攇 0x6508:jùn,pèi # 攈 0x6509:huÅ� # 攉 0x650a:lì,luò # 攊 0x650b:là,lài # 攋 0x650c:huàn # 攌 0x650d:yíng # æ”� 0x650e:lú,luó # 攎 0x650f:lÇ’ng # æ”� 0x6510:qiÄ�n # æ”� 0x6511:qiÄ�n # 攑 0x6512:zÇŽn,cuán # æ”’ 0x6513:qiÄ�n # 攓 0x6514:lán # æ”” 0x6515:xiÄ�n,jiÄ�n # 攕 0x6516:yÄ«ng # æ”– 0x6517:méi # æ”— 0x6518:rÇŽng # 攘 0x6519:chÄ�n # æ”™ 0x651b:cuÄ�n # æ”› 0x651c:xié # 攜 0x651d:shè,niè # æ”� 0x651e:luó # 攞 0x651f:jùn # 攟 0x6520:mí,mÇ�,mó # æ”  0x6521:chÄ« # 攡 0x6522:zÇŽn,cuán # 攢 0x6523:luán # 攣 0x6524:tÄ�n # 攤 0x6525:zuàn # 攥 0x6526:lì,shài # 攦 0x6527:diÄ�n # æ”§ 0x6528:wÄ� # 攨 0x6529:dÇŽng # 攩 0x652a:jiÇŽo # 攪 0x652b:jué # 攫 0x652c:lÇŽn # 攬 0x652d:lì,luÇ’ # æ”­ 0x652e:nÇŽng # æ”® 0x652f:zhÄ« # 支 0x6530:guì # æ”° 0x6531:guÇ�,guì # æ”± 0x6532:qÄ«,yÇ�,jÄ« # 攲 0x6533:xún # 攳 0x6534:pÅ« # æ”´ 0x6535:pÅ« # 攵 0x6536:shÅ�u # æ”¶ 0x6537:kÇŽo # æ”· 0x6538:yÅ�u # 攸 0x6539:gÇŽi # 改 0x653a:yÇ� # 攺 0x653b:gÅ�ng # æ”» 0x653c:gÄ�n,hàn # 攼 0x653d:bÄ�n # 攽 0x653e:fàng # 放 0x653f:zhèng # 政 0x6540:pò # æ•€ 0x6541:diÄ�n # æ•� 0x6542:kòu # æ•‚ 0x6543:mÇ�n # 敃 0x6544:wù,móu # æ•„ 0x6545:gù # æ•… 0x6546:hé # 敆 0x6547:cè # 敇 0x6548:xiào # 效 0x6549:mÇ� # 敉 0x654a:chù,shÅ�u # 敊 0x654b:gé,guó,è # æ•‹ 0x654c:dí # 敌 0x654d:xù # æ•� 0x654e:jiào,jiÄ�o # 敎 0x654f:mÇ�n # æ•� 0x6550:chén # æ•� 0x6551:jiù # æ•‘ 0x6552:shÄ“n # æ•’ 0x6553:duó,duì # æ•“ 0x6554:yÇ” # æ•” 0x6555:chì # æ•• 0x6556:áo # æ•– 0x6557:bài # æ•— 0x6558:xù # 敘 0x6559:jiào,jiÄ�o # æ•™ 0x655a:duó,duì # 敚 0x655b:liÇŽn # æ•› 0x655c:niè # 敜 0x655d:bì # æ•� 0x655e:chÇŽng # 敞 0x655f:diÇŽn # 敟 0x6560:duÅ�,què # æ•  0x6561:yì # æ•¡ 0x6562:gÇŽn # æ•¢ 0x6563:sàn,sÇŽn # æ•£ 0x6564:kÄ› # 敤 0x6565:yàn # æ•¥ 0x6566:dÅ«n,duì # 敦 0x6567:qÄ«,yÇ�,jÄ« # æ•§ 0x6568:tÇ’u # 敨 0x6569:xiào,xué # æ•© 0x656a:duÅ�,què # 敪 0x656b:jiÇŽo # æ•« 0x656c:jìng # 敬 0x656d:yáng # æ•­ 0x656e:xiá # æ•® 0x656f:mÇ�n # 敯 0x6570:shù,shÇ”,shuò # æ•° 0x6571:ái,zhú # 敱 0x6572:qiÄ�o # 敲 0x6573:ái # 敳 0x6574:zhÄ›ng # æ•´ 0x6575:dí # 敵 0x6576:chén # æ•¶ 0x6577:fÅ« # æ•· 0x6578:shù,shÇ”,shuò # 數 0x6579:liáo # 敹 0x657a:qÅ« # 敺 0x657b:xiòng,xuàn # æ•» 0x657c:yÇ� # 敼 0x657d:jiÇŽo # 敽 0x657f:jiÇŽo # æ•¿ 0x6580:zhuó,zhú # æ–€ 0x6581:yì,dù # æ–� 0x6582:liÇŽn # æ–‚ 0x6583:bì # æ–ƒ 0x6584:lí,tái # æ–„ 0x6585:xiào # æ–… 0x6586:xiào # æ–† 0x6587:wén # æ–‡ 0x6588:xué # æ–ˆ 0x6589:qí # æ–‰ 0x658a:qí # æ–Š 0x658b:zhÄ�i # æ–‹ 0x658c:bÄ«n # æ–Œ 0x658d:jué,jiào # æ–� 0x658e:zhÄ�i # æ–Ž 0x6590:fÄ›i,fÄ“i # æ–� 0x6591:bÄ�n # æ–‘ 0x6592:bÄ�n # æ–’ 0x6593:lán # æ–“ 0x6594:yÇ”,zhÅ�ng # æ–” 0x6595:lán # æ–• 0x6596:wÄ›i,mén # æ–– 0x6597:dÇ’u,dòu # æ–— 0x6598:shÄ“ng # æ–˜ 0x6599:liào # æ–™ 0x659a:jiÇŽ # æ–š 0x659b:hú # æ–› 0x659c:xié # æ–œ 0x659d:jiÇŽ # æ–� 0x659e:yÇ” # æ–ž 0x659f:zhÄ“n # æ–Ÿ 0x65a0:jiào # æ–  0x65a1:wò,guÇŽn # æ–¡ 0x65a2:tÇ’u,tiÇŽo # æ–¢ 0x65a3:dòu # æ–£ 0x65a4:jÄ«n # æ–¤ 0x65a5:chì # æ–¥ 0x65a6:yín,zhì # æ–¦ 0x65a7:fÇ” # æ–§ 0x65a8:qiÄ�ng # æ–¨ 0x65a9:zhÇŽn # æ–© 0x65aa:qú # æ–ª 0x65ab:zhuó # æ–« 0x65ac:zhÇŽn # æ–¬ 0x65ad:duàn # æ–­ 0x65ae:zhuó # æ–® 0x65af:sÄ« # æ–¯ 0x65b0:xÄ«n # æ–° 0x65b1:zhuó # æ–± 0x65b2:zhuó # æ–² 0x65b3:qín # æ–³ 0x65b4:lín # æ–´ 0x65b5:zhuó # æ–µ 0x65b6:chù # æ–¶ 0x65b7:duàn # æ–· 0x65b8:zhú # æ–¸ 0x65b9:fÄ�ng # æ–¹ 0x65ba:chÇŽn,jiè # æ–º 0x65bb:háng # æ–» 0x65bc:yú,wÅ« # æ–¼ 0x65bd:shÄ« # æ–½ 0x65be:pèi # æ–¾ 0x65bf:liú,yóu # æ–¿ 0x65c1:páng,bàng # æ—� 0x65c2:qí # æ—‚ 0x65c3:zhÄ�n # æ—ƒ 0x65c4:máo,mào # æ—„ 0x65c5:lÇš # æ—… 0x65c6:pèi # æ—† 0x65c7:pÄ«,bì # æ—‡ 0x65c8:liú # æ—ˆ 0x65c9:fÅ« # æ—‰ 0x65ca:fÇŽng # æ—Š 0x65cb:xuán,xuàn # æ—‹ 0x65cc:jÄ«ng # æ—Œ 0x65cd:jÄ«ng # æ—� 0x65ce:nÇ� # æ—Ž 0x65cf:zú # æ—� 0x65d0:zhào # æ—� 0x65d1:yÇ� # æ—‘ 0x65d2:liú # æ—’ 0x65d3:shÄ�o # æ—“ 0x65d4:jiàn # æ—” 0x65d6:yÇ� # æ—– 0x65d7:qí # æ—— 0x65d8:zhì # æ—˜ 0x65d9:fÄ�n # æ—™ 0x65da:piÄ�o # æ—š 0x65db:fÄ�n # æ—› 0x65dc:zhÄ�n # æ—œ 0x65dd:kuài # æ—� 0x65de:suì # æ—ž 0x65df:yú # æ—Ÿ 0x65e0:wú,mó # æ—  0x65e1:jì # æ—¡ 0x65e2:jì # æ—¢ 0x65e3:jì # æ—£ 0x65e4:huò # æ—¤ 0x65e5:rì # æ—¥ 0x65e6:dàn # æ—¦ 0x65e7:jiù # æ—§ 0x65e8:zhÇ� # æ—¨ 0x65e9:zÇŽo # æ—© 0x65ea:xié # æ—ª 0x65eb:tiÄ�o # æ—« 0x65ec:xún # æ—¬ 0x65ed:xù # æ—­ 0x65ee:gÄ� # æ—® 0x65ef:lá # æ—¯ 0x65f0:gàn,hàn # æ—° 0x65f1:hàn # æ—± 0x65f2:tái,yÄ«ng # æ—² 0x65f3:dì,dí,de # æ—³ 0x65f4:xù,xÅ« # æ—´ 0x65f5:chÇŽn # æ—µ 0x65f6:shí # æ—¶ 0x65f7:kuàng # æ—· 0x65f8:yáng # æ—¸ 0x65f9:shí # æ—¹ 0x65fa:wàng # æ—º 0x65fb:mín # æ—» 0x65fc:mín # æ—¼ 0x65fd:tÅ«n,zhùn # æ—½ 0x65fe:chÅ«n # æ—¾ 0x65ff:wù,wÇ” # æ—¿ 0x6600:yún # 昀 0x6601:bèi # æ˜� 0x6602:áng # 昂 0x6603:zè # 昃 0x6604:bÇŽn # 昄 0x6605:jié # 昅 0x6606:kÅ«n # 昆 0x6607:shÄ“ng # 昇 0x6608:hù # 昈 0x6609:fÇŽng # 昉 0x660a:hào # 昊 0x660b:guì # 昋 0x660c:chÄ�ng # 昌 0x660d:xuÄ�n # æ˜� 0x660e:míng # 明 0x660f:hÅ«n # æ˜� 0x6610:fÄ“n # æ˜� 0x6611:qÇ�n # 昑 0x6612:hÅ« # 昒 0x6613:yì # 易 0x6614:xÄ« # 昔 0x6615:xÄ«n # 昕 0x6616:yán # 昖 0x6617:zè # 昗 0x6618:fÇŽng # 昘 0x6619:tán # 昙 0x661a:shèn # 昚 0x661b:jù # 昛 0x661c:yáng # 昜 0x661d:zÇŽn # æ˜� 0x661e:bÇ�ng # 昞 0x661f:xÄ«ng # 星 0x6620:yìng # 映 0x6621:xuàn # 昡 0x6622:pò # 昢 0x6623:zhÄ›n # 昣 0x6624:líng # 昤 0x6625:chÅ«n # 春 0x6626:hào # 昦 0x6627:mèi # 昧 0x6628:zuó # 昨 0x6629:mò # 昩 0x662a:biàn # 昪 0x662b:xù # 昫 0x662c:hÅ«n # 昬 0x662d:zhÄ�o # 昭 0x662e:zòng # 昮 0x662f:shì # 是 0x6630:shì # 昰 0x6631:yù # 昱 0x6632:fèi # 昲 0x6633:dié,yì # 昳 0x6634:mÇŽo # 昴 0x6635:nì # 昵 0x6636:chÇŽng # 昶 0x6637:wÄ“n # 昷 0x6638:dÅ�ng # 昸 0x6639:ÇŽi # 昹 0x663a:bÇ�ng # 昺 0x663b:áng # 昻 0x663c:zhòu # 昼 0x663d:lóng # 昽 0x663e:xiÇŽn # 显 0x663f:kuàng # 昿 0x6640:tiÇŽo # 晀 0x6641:cháo # æ™� 0x6642:shí # 時 0x6643:huÇŽng,huàng # 晃 0x6644:huÇŽng # 晄 0x6645:xuÄ�n # æ™… 0x6646:kuí # 晆 0x6647:xù,kuÄ� # 晇 0x6648:jiÇŽo # 晈 0x6649:jìn # 晉 0x664a:zhì # 晊 0x664b:jìn # 晋 0x664c:shÇŽng # 晌 0x664d:tóng # æ™� 0x664e:hÇ’ng # 晎 0x664f:yàn # æ™� 0x6650:gÄ�i # æ™� 0x6651:xiÇŽng # 晑 0x6652:shài # æ™’ 0x6653:xiÇŽo # 晓 0x6654:yè # æ™” 0x6655:yùn,yÅ«n # 晕 0x6656:huÄ« # æ™– 0x6657:hán # æ™— 0x6658:hàn # 晘 0x6659:jùn # æ™™ 0x665a:wÇŽn # 晚 0x665b:xiàn # æ™› 0x665c:kÅ«n # 晜 0x665d:zhòu # æ™� 0x665e:xÄ« # 晞 0x665f:shèng,chéng # 晟 0x6660:shèng # æ™  0x6661:bÅ« # 晡 0x6662:zhé # 晢 0x6663:zhé # 晣 0x6664:wù # 晤 0x6665:wÇŽn,hàn # 晥 0x6666:huì # 晦 0x6667:hào # æ™§ 0x6668:chén # 晨 0x6669:wÇŽn # 晩 0x666a:tiÇŽn # 晪 0x666b:zhuó # 晫 0x666c:zuì # 晬 0x666d:zhÇ’u # æ™­ 0x666e:pÇ” # æ™® 0x666f:jÇ�ng,yÇ�ng # 景 0x6670:xÄ« # æ™° 0x6671:shÇŽn # æ™± 0x6672:nÇ� # 晲 0x6673:xÄ« # 晳 0x6674:qíng # æ™´ 0x6675:qÇ�,dù # 晵 0x6676:jÄ«ng # æ™¶ 0x6677:guÇ� # æ™· 0x6678:zhÄ›ng # 晸 0x6679:yì # 晹 0x667a:zhì # 智 0x667b:àn,ÇŽn,yÇŽn # æ™» 0x667c:wÇŽn # 晼 0x667d:lín # 晽 0x667e:liàng # 晾 0x667f:chÄ“ng # 晿 0x6680:wÇŽng,wàng # 暀 0x6681:xiÇŽo # æš� 0x6682:zàn # æš‚ 0x6684:xuÄ�n # æš„ 0x6685:xuÇŽn,gèng # æš… 0x6686:yí # 暆 0x6687:xiá # 暇 0x6688:yùn,yÅ«n # 暈 0x6689:huÄ« # 暉 0x668a:xÇ” # 暊 0x668b:mÇ�n,mín # æš‹ 0x668c:kuí # 暌 0x668d:yÄ“ # æš� 0x668e:yìng # 暎 0x668f:shÇ”,dÇ” # æš� 0x6690:wÄ›i # æš� 0x6691:shÇ” # æš‘ 0x6692:qíng # æš’ 0x6693:mào # æš“ 0x6694:nán # æš” 0x6695:jiÇŽn,lán # æš• 0x6696:nuÇŽn # æš– 0x6697:àn # æš— 0x6698:yáng # 暘 0x6699:chÅ«n # æš™ 0x669a:yáo # æšš 0x669b:suÇ’ # æš› 0x669c:pÇ” # æšœ 0x669d:míng # æš� 0x669e:jiÇŽo # æšž 0x669f:kÇŽi # 暟 0x66a0:hào,gÇŽo # æš  0x66a1:wÄ›ng # æš¡ 0x66a2:chàng # 暢 0x66a3:qì # 暣 0x66a4:hào # 暤 0x66a5:yàn # 暥 0x66a6:lì # 暦 0x66a7:ài # æš§ 0x66a8:jì # 暨 0x66a9:jì # æš© 0x66aa:mèn # 暪 0x66ab:zàn # æš« 0x66ac:xiè # 暬 0x66ad:hào # æš­ 0x66ae:mù # æš® 0x66af:mù # 暯 0x66b0:cÅ�ng # æš° 0x66b1:nì # æš± 0x66b2:zhÄ�ng # æš² 0x66b3:huì # æš³ 0x66b4:bào,pù # æš´ 0x66b5:hàn # æšµ 0x66b6:xuán # æš¶ 0x66b7:chuán # æš· 0x66b8:liáo # 暸 0x66b9:xiÄ�n # æš¹ 0x66ba:tÇŽn # 暺 0x66bb:jÇ�ng # æš» 0x66bc:piÄ“ # æš¼ 0x66bd:lín # æš½ 0x66be:tÅ«n # æš¾ 0x66bf:xÄ«,xÇ� # æš¿ 0x66c0:yì # 曀 0x66c1:jì # æ›� 0x66c2:huàng # 曂 0x66c3:dài # 曃 0x66c4:yè # 曄 0x66c5:yè # æ›… 0x66c6:lì # 曆 0x66c7:tán # 曇 0x66c8:tóng # 曈 0x66c9:xiÇŽo # 曉 0x66ca:fèi # 曊 0x66cb:shÄ›n # 曋 0x66cc:zhào # 曌 0x66cd:hào # æ›� 0x66ce:yì # 曎 0x66cf:xiàng # æ›� 0x66d0:xÄ«ng # æ›� 0x66d1:shÄ“n # 曑 0x66d2:jiÇŽo # æ›’ 0x66d3:bào # 曓 0x66d4:jìng # æ›” 0x66d5:yàn # 曕 0x66d6:ài # æ›– 0x66d7:yè # æ›— 0x66d8:rú # 曘 0x66d9:shÇ” # æ›™ 0x66da:méng # 曚 0x66db:xÅ«n # æ›› 0x66dc:yào # 曜 0x66dd:pù,bào # æ›� 0x66de:lì # 曞 0x66df:chén # 曟 0x66e0:kuàng # æ›  0x66e1:dié # 曡 0x66e3:yàn # 曣 0x66e4:huò # 曤 0x66e5:lú # 曥 0x66e6:xÄ« # 曦 0x66e7:róng # æ›§ 0x66e8:lóng # 曨 0x66e9:nÇŽng # 曩 0x66ea:luÇ’ # 曪 0x66eb:luán # 曫 0x66ec:shài # 曬 0x66ed:tÇŽng # æ›­ 0x66ee:yÇŽn # æ›® 0x66ef:zhú # 曯 0x66f0:yuÄ“ # æ›° 0x66f1:yuÄ“ # æ›± 0x66f2:qÅ«,qÇ” # 曲 0x66f3:yè # 曳 0x66f4:gÄ“ng,gèng # æ›´ 0x66f5:yè # 曵 0x66f6:hÅ«,hù # æ›¶ 0x66f7:hé # æ›· 0x66f8:shÅ« # 書 0x66f9:cáo # 曹 0x66fa:cáo # 曺 0x66fc:màn # 曼 0x66fd:zÄ“ng,céng # 曽 0x66fe:zÄ“ng,céng # 曾 0x66ff:tì # 替 0x6700:zuì # 最 0x6701:cÇŽn,qián,jiàn # æœ� 0x6702:xù # 朂 0x6703:huì,kuài # 會 0x6704:yÇ�n # 朄 0x6705:qiè,hé # 朅 0x6706:fÄ“n # 朆 0x6707:bì,pí # 朇 0x6708:yuè # 月 0x6709:yÇ’u,yòu # 有 0x670a:ruÇŽn # 朊 0x670b:péng # 朋 0x670c:fén,bÄ�n # 朌 0x670d:fú,fù # æœ� 0x670e:líng # 朎 0x670f:fÄ›i,kÅ« # æœ� 0x6710:qú,xù,chÇ”n # æœ� 0x6712:nÇœ,gÇŽ # 朒 0x6713:tiÇŽo # 朓 0x6714:shuò # 朔 0x6715:zhèn # 朕 0x6716:lÇŽng # 朖 0x6717:lÇŽng # 朗 0x6718:juÄ�n,zuÄ« # 朘 0x6719:míng # 朙 0x671a:huÄ�ng,máng,wáng # 朚 0x671b:wàng # 望 0x671c:tÅ«n # 朜 0x671d:zhÄ�o,cháo # æœ� 0x671e:jÄ« # 朞 0x671f:qÄ«,jÄ« # 期 0x6720:yÄ«ng # 朠 0x6721:zÅ�ng # 朡 0x6722:wàng # 朢 0x6723:tóng,chuáng # 朣 0x6724:lÇŽng # 朤 0x6726:méng # 朦 0x6727:lóng # 朧 0x6728:mù # 木 0x6729:tin # 朩 0x672a:wèi # 未 0x672b:mò # 末 0x672c:bÄ›n # 本 0x672d:zhá # 札 0x672e:shù,shú,zhú # 朮 0x672f:shù,shú,zhú # 术 0x6731:zhÅ«,shú # 朱 0x6732:rén # 朲 0x6733:bÄ� # 朳 0x6734:pÇ”,pò,pÅ�,piáo # 朴 0x6735:duÇ’ # 朵 0x6736:duÇ’ # 朶 0x6737:dÄ�o,tiáo,mù # 朷 0x6738:lì # 朸 0x6739:qiú,guÇ� # 朹 0x673a:jÄ« # 机 0x673b:jiÅ« # 朻 0x673c:bÇ� # 朼 0x673d:xiÇ” # 朽 0x673e:chéng,chÄ“ng # 朾 0x673f:cì # 朿 0x6740:shÄ� # æ�€ 0x6742:zá # æ�‚ 0x6743:quán # æ�ƒ 0x6744:qiÄ�n # æ�„ 0x6745:yú,wÅ« # æ�… 0x6746:gÄ�n,gÇŽn # æ�† 0x6747:wÅ« # æ�‡ 0x6748:chÄ�,chà # æ�ˆ 0x6749:shÄ�n,shÄ� # æ�‰ 0x674a:xún # æ�Š 0x674b:fán # æ�‹ 0x674c:wù # æ�Œ 0x674d:zÇ� # æ�� 0x674e:lÇ� # æ�Ž 0x674f:xìng # æ�� 0x6750:cái # æ�� 0x6751:cÅ«n # æ�‘ 0x6752:rèn,ér # æ�’ 0x6753:sháo,biÄ�o # æ�“ 0x6754:tuÅ�,zhé # æ�” 0x6755:dì,duò # æ�• 0x6756:zhàng # æ�– 0x6757:máng # æ�— 0x6758:chì # æ�˜ 0x6759:yì # æ�™ 0x675a:gÅ«,gài # æ�š 0x675b:gÅ�ng # æ�› 0x675c:dù # æ�œ 0x675d:yí,lì,lí,duò,tuò # æ�� 0x675e:qÇ� # æ�ž 0x675f:shù # æ�Ÿ 0x6760:gàng,gÄ�ng # æ�  0x6761:tiáo,tiÄ�o # æ�¡ 0x6765:lái # æ�¥ 0x6767:máng # æ�§ 0x6768:yáng # æ�¨ 0x6769:mà,mÇŽ # æ�© 0x676a:miÇŽo # æ�ª 0x676b:sì,zhÇ�,xÇ� # æ�« 0x676c:yuán,wán # æ�¬ 0x676d:háng # æ�­ 0x676e:fèi,bèi # æ�® 0x676f:bÄ“i # æ�¯ 0x6770:jié # æ�° 0x6771:dÅ�ng # æ�± 0x6772:gÇŽo # æ�² 0x6773:yÇŽo # æ�³ 0x6774:xiÄ�n # æ�´ 0x6775:chÇ” # æ�µ 0x6776:chÅ«n # æ�¶ 0x6777:pá # æ�· 0x6778:shÅ«,duì # æ�¸ 0x6779:huà # æ�¹ 0x677a:xÄ«n # æ�º 0x677b:niÇ”,chÇ’u # æ�» 0x677c:zhù # æ�¼ 0x677d:chÇ’u # æ�½ 0x677e:sÅ�ng # æ�¾ 0x677f:bÇŽn # æ�¿ 0x6780:sÅ�ng # 枀 0x6781:jí # æž� 0x6782:wò,yuè # æž‚ 0x6783:jìn # 枃 0x6784:gòu # æž„ 0x6785:jÄ« # æž… 0x6786:máo # 枆 0x6787:pí # 枇 0x6788:pÄ«,mì # 枈 0x6789:wÇŽng # 枉 0x678a:àng # 枊 0x678b:fÄ�ng,bìng # æž‹ 0x678c:fén # 枌 0x678d:yì # æž� 0x678e:fú,fÅ« # 枎 0x678f:nán # æž� 0x6790:xÄ« # æž� 0x6791:hù,dÇ� # æž‘ 0x6792:yÄ� # æž’ 0x6793:dÅ�u # æž“ 0x6794:xín # æž” 0x6795:zhÄ›n # æž• 0x6796:yÇŽo,yÄ�o # æž– 0x6797:lín # æž— 0x6798:ruì # 枘 0x6799:Ä›,è # æž™ 0x679a:méi # æžš 0x679b:zhào # æž› 0x679c:guÇ’ # æžœ 0x679d:zhÄ«,qí # æž� 0x679e:cÅ�ng,zÅ�ng # æžž 0x679f:yùn # 枟 0x67a1:shÄ“ng # æž¡ 0x67a2:shÅ« # 枢 0x67a3:zÇŽo # 枣 0x67a5:lì # 枥 0x67a7:jiÇŽn # æž§ 0x67a8:chéng # 枨 0x67aa:qiÄ�ng # 枪 0x67ab:fÄ“ng # æž« 0x67ac:zhÄ�n # 枬 0x67ad:xiÄ�o # æž­ 0x67ae:xiÄ�n,zhÄ“n # æž® 0x67af:kÅ« # 枯 0x67b0:píng # æž° 0x67b1:sì,tái # æž± 0x67b2:xÇ� # æž² 0x67b3:zhÇ� # æž³ 0x67b4:guÇŽi # æž´ 0x67b5:xiÄ�o # æžµ 0x67b6:jià # æž¶ 0x67b7:jiÄ� # æž· 0x67b8:jÇ”,gÇ’u # 枸 0x67b9:bÄ�o,fú # æž¹ 0x67ba:mò # 枺 0x67bb:yì,xiè # æž» 0x67bc:yè # æž¼ 0x67bd:yè # æž½ 0x67be:shì # æž¾ 0x67bf:niè # æž¿ 0x67c0:bÇ� # 柀 0x67c1:tuó,duò # æŸ� 0x67c2:yí,duò,lí # 柂 0x67c3:líng # 柃 0x67c4:bÇ�ng # 柄 0x67c5:nÇ�,chì # 柅 0x67c6:lÄ� # 柆 0x67c7:hé # 柇 0x67c8:pán,bàn # 柈 0x67c9:fán # 柉 0x67ca:zhÅ�ng # 柊 0x67cb:dài # 柋 0x67cc:cí # 柌 0x67cd:yÇŽng,yàng,yÄ�ng,yÄ«ng # æŸ� 0x67ce:fÅ«,fÇ”,fù # 柎 0x67cf:bÇŽi,bó,bò # æŸ� 0x67d0:mÇ’u # æŸ� 0x67d1:gÄ�n # 柑 0x67d2:qÄ« # 柒 0x67d3:rÇŽn # 染 0x67d4:róu # 柔 0x67d5:mào # 柕 0x67d6:sháo,shào # 柖 0x67d7:sÅ�ng # 柗 0x67d8:zhè # 柘 0x67d9:xiá # 柙 0x67da:yòu,yóu # 柚 0x67db:shÄ“n # 柛 0x67dc:guì,jÇ” # 柜 0x67dd:tuò # æŸ� 0x67de:zuò,zhà # 柞 0x67df:nán # 柟 0x67e0:níng # 柠 0x67e1:yÇ’ng # 柡 0x67e2:dÇ�,chí # 柢 0x67e3:zhì,dié # 柣 0x67e4:zhÄ�,zÇ”,zÅ« # 柤 0x67e5:chá,zhÄ� # 查 0x67e6:dàn # 柦 0x67e7:gÅ« # 柧 0x67e9:jiù # 柩 0x67ea:Ä�o,ào # 柪 0x67eb:fú # 柫 0x67ec:jiÇŽn # 柬 0x67ed:bÄ�,fú,pèi,bó,biÄ“ # 柭 0x67ee:duò,zuó,wù # 柮 0x67ef:kÄ“ # 柯 0x67f0:nài # 柰 0x67f1:zhù # 柱 0x67f2:bì,bié # 柲 0x67f3:liÇ” # 柳 0x67f4:chái # 柴 0x67f5:shÄ�n # 柵 0x67f6:sì # 柶 0x67f7:zhù # 柷 0x67f8:bÄ“i,pÄ“i # 柸 0x67f9:shì,fèi # 柹 0x67fa:guÇŽi # 柺 0x67fb:chá,zhÄ� # 査 0x67fc:yÇŽo # 柼 0x67fd:chÄ“ng # 柽 0x67fe:jiù # 柾 0x67ff:shì # 柿 0x6800:zhÄ« # æ € 0x6801:liÇ” # æ � 0x6802:méi # æ ‚ 0x6804:róng # æ „ 0x6805:zhà,shÄ�n,shi,cè # æ … 0x6807:biÄ�o # æ ‡ 0x6808:zhàn # æ ˆ 0x6809:zhì # æ ‰ 0x680a:lóng # æ Š 0x680b:dòng # æ ‹ 0x680c:lú # æ Œ 0x680e:lì,yuè # æ Ž 0x680f:lán # æ � 0x6810:yÇ’ng # æ � 0x6811:shù # æ ‘ 0x6812:xún # æ ’ 0x6813:shuÄ�n # æ “ 0x6814:qì,qiè # æ ” 0x6815:chén # æ • 0x6816:qÄ«,xÄ« # æ – 0x6817:lì # æ — 0x6818:yí # æ ˜ 0x6819:xiáng # æ ™ 0x681a:zhèn # æ š 0x681b:lì # æ › 0x681c:sè # æ œ 0x681d:guÄ�,tiÇŽn,kuò # æ � 0x681e:kÄ�n # æ ž 0x681f:bÄ“n,bÄ«ng # æ Ÿ 0x6820:rÄ›n # æ   0x6821:xiào,jiào # æ ¡ 0x6822:bÇŽi # æ ¢ 0x6823:rÄ›n # æ £ 0x6824:bìng # æ ¤ 0x6825:zÄ« # æ ¥ 0x6826:chóu # æ ¦ 0x6827:yì,xiè # æ § 0x6828:cì # æ ¨ 0x6829:xÇ” # æ © 0x682a:zhÅ« # æ ª 0x682b:jiàn,zùn # æ « 0x682c:zuì # æ ¬ 0x682d:ér # æ ­ 0x682e:Ä›r # æ ® 0x682f:yÇ’u,yù # æ ¯ 0x6830:fá # æ ° 0x6831:gÇ’ng # æ ± 0x6832:kÇŽo # æ ² 0x6833:lÇŽo # æ ³ 0x6834:zhÄ�n # æ ´ 0x6835:liè # æ µ 0x6837:yàng # æ · 0x6838:hé,hú # æ ¸ 0x6839:gÄ“n # æ ¹ 0x683a:zhÄ«,yì # æ º 0x683b:shì # æ » 0x683c:gé # æ ¼ 0x683d:zÄ�i # æ ½ 0x683e:luán # æ ¾ 0x683f:fú # æ ¿ 0x6840:jié # æ¡€ 0x6841:héng,háng # æ¡� 0x6842:guì # æ¡‚ 0x6843:táo # 桃 0x6844:guÄ�ng,guàng # æ¡„ 0x6845:wéi # æ¡… 0x6846:kuàng # 框 0x6847:rú # 桇 0x6848:àn # 案 0x6849:Ä�n # 桉 0x684a:juàn # 桊 0x684b:yí,tí # æ¡‹ 0x684c:zhuÅ� # 桌 0x684d:kÅ« # æ¡� 0x684e:zhì # 桎 0x684f:qióng # æ¡� 0x6850:tóng # æ¡� 0x6851:sÄ�ng # æ¡‘ 0x6852:sÄ�ng # æ¡’ 0x6853:huán # æ¡“ 0x6854:jié,jú # æ¡” 0x6855:jiù # æ¡• 0x6856:xuè # æ¡– 0x6857:duò # æ¡— 0x6858:chuí # 桘 0x6859:yú,móu # æ¡™ 0x685a:zÄ�,zÇŽn # 桚 0x685c:yÄ«ng # 桜 0x685f:zhàn # 桟 0x6860:yÄ� # æ¡  0x6861:ráo,náo # æ¡¡ 0x6862:zhÄ“n # æ¡¢ 0x6863:dàng # æ¡£ 0x6864:qÄ« # 桤 0x6865:qiáo # æ¡¥ 0x6866:huà # 桦 0x6867:guì,huì # æ¡§ 0x6868:jiÇŽng # 桨 0x6869:zhuÄ�ng # æ¡© 0x686a:xún # 桪 0x686b:suÅ� # æ¡« 0x686c:shÄ� # 桬 0x686d:chén,zhèn # æ¡­ 0x686e:bÄ“i # æ¡® 0x686f:tÄ«ng,yíng # 桯 0x6870:guÄ� # æ¡° 0x6871:jìng # 桱 0x6872:bó,po # 桲 0x6873:bèn,fàn # 桳 0x6874:fú # æ¡´ 0x6875:ruí # 桵 0x6876:tÇ’ng # æ¡¶ 0x6877:jué # æ¡· 0x6878:xÄ« # 桸 0x6879:láng # 桹 0x687a:liÇ” # 桺 0x687b:fÄ“ng,fèng # æ¡» 0x687c:qÄ« # 桼 0x687d:wÄ›n # 桽 0x687e:jÅ«n # 桾 0x687f:gÇŽn # æ¡¿ 0x6880:sù,yìn # 梀 0x6881:liáng # æ¢� 0x6882:qiú # 梂 0x6883:tÇ�ng,tìng # 梃 0x6884:yÇ’u # 梄 0x6885:méi # 梅 0x6886:bÄ�ng # 梆 0x6887:lòng # 梇 0x6888:pÄ“ng # 梈 0x6889:zhuÄ�ng # 梉 0x688a:dì # 梊 0x688b:xuÄ�n,juÄ�n,xié # 梋 0x688c:tú,chá # 梌 0x688d:zào # æ¢� 0x688e:Ä�o,yòu # 梎 0x688f:gù # æ¢� 0x6890:bì # æ¢� 0x6891:dí # 梑 0x6892:hán # 梒 0x6893:zÇ� # 梓 0x6894:zhÄ« # 梔 0x6895:rèn,ér # 梕 0x6896:bèi # 梖 0x6897:gÄ›ng # 梗 0x6898:jiÇŽn # 梘 0x6899:huàn # 梙 0x689a:wÇŽn # 梚 0x689b:nuó # 梛 0x689c:jiÄ� # 梜 0x689d:tiáo,tiÄ�o # æ¢� 0x689e:jì # 梞 0x689f:xiÄ�o # 梟 0x68a0:lÇš # 梠 0x68a1:kuÇŽn # 梡 0x68a2:shÄ�o,sào # 梢 0x68a3:chén,cén # 梣 0x68a4:fÄ“n # 梤 0x68a5:sÅ�ng # 梥 0x68a6:mèng # 梦 0x68a7:wú # 梧 0x68a8:lí # 梨 0x68a9:sì,qÇ� # 梩 0x68aa:dòu # 梪 0x68ab:qÇ�n # 梫 0x68ac:yÇ�ng # 梬 0x68ad:suÅ� # 梭 0x68ae:jÅ« # 梮 0x68af:tÄ« # 梯 0x68b0:xiè # 械 0x68b1:kÇ”n # 梱 0x68b2:zhuÅ� # 梲 0x68b3:shÅ« # 梳 0x68b4:chÄ�n,yán # 梴 0x68b5:fàn # 梵 0x68b6:wÄ›i # 梶 0x68b7:jìng # 梷 0x68b8:lí # 梸 0x68b9:bÄ«n,bÄ«ng # 梹 0x68bc:chóu,táo,dào # 梼 0x68bd:zhì # 梽 0x68be:lái # 梾 0x68bf:lián,liÇŽn # 梿 0x68c0:jiÇŽn # 检 0x68c1:zhuÅ� # æ£� 0x68c2:líng # 棂 0x68c3:lí # 棃 0x68c4:qì # 棄 0x68c5:bÇ�ng # 棅 0x68c6:lún # 棆 0x68c7:cÅ�ng,sÅ�ng # 棇 0x68c8:qiàn # 棈 0x68c9:mián # 棉 0x68ca:qí # 棊 0x68cb:qí # 棋 0x68cc:cÇŽi # 棌 0x68cd:gùn,hùn # æ£� 0x68ce:chán # 棎 0x68cf:dé,zhé # æ£� 0x68d0:fÄ›i # æ£� 0x68d1:pái,bèi,pèi # 棑 0x68d2:bàng # 棒 0x68d3:bàng,pÇ’u,bèi,bÄ“i # 棓 0x68d4:hÅ«n # 棔 0x68d5:zÅ�ng # 棕 0x68d6:chéng # 棖 0x68d7:zÇŽo # 棗 0x68d8:jí # 棘 0x68d9:lì,liè # 棙 0x68da:péng # 棚 0x68db:yù # 棛 0x68dc:yù # 棜 0x68dd:gù # æ£� 0x68de:jùn # 棞 0x68df:dòng # 棟 0x68e0:táng # 棠 0x68e1:gÄ�ng # 棡 0x68e2:wÇŽng # 棢 0x68e3:dì,dài,tì # 棣 0x68e4:què # 棤 0x68e5:fán # 棥 0x68e6:chÄ“ng # 棦 0x68e7:zhàn # 棧 0x68e8:qÇ� # 棨 0x68e9:yuÄ�n # 棩 0x68ea:yÇŽn,yàn # 棪 0x68eb:yù # 棫 0x68ec:quÄ�n,juàn # 棬 0x68ed:yì # 棭 0x68ee:sÄ“n # 森 0x68ef:rÄ›n,shÄ›n # 棯 0x68f0:chuí # 棰 0x68f1:léng,lÄ“ng,líng # 棱 0x68f2:qÄ« # 棲 0x68f3:zhuÅ� # 棳 0x68f4:fú,sù # 棴 0x68f5:kÄ“ # 棵 0x68f6:lái # 棶 0x68f7:zÅ�u,sÇ’u # 棷 0x68f8:zÅ�u # 棸 0x68f9:zhào,zhuÅ� # 棹 0x68fa:guÄ�n # 棺 0x68fb:fÄ“n # 棻 0x68fc:fén # 棼 0x68fd:chÄ“n,shÄ“n # 棽 0x68fe:qíng # 棾 0x68ff:ní,nÇ� # 棿 0x6900:wÇŽn # 椀 0x6901:guÇ’ # æ¤� 0x6902:lù # 椂 0x6903:háo # 椃 0x6904:jiÄ“,qiè # 椄 0x6905:yÇ�,yÄ« # 椅 0x6906:chóu,zhòu,diÄ�o # 椆 0x6907:jÇ” # 椇 0x6908:jú # 椈 0x6909:chéng,shèng # 椉 0x690a:zú,cuì # 椊 0x690b:liáng # 椋 0x690c:qiÄ�ng,kÅ�ng # 椌 0x690d:zhí # æ¤� 0x690e:zhuÄ«,chuí # 椎 0x690f:yÄ� # æ¤� 0x6910:jÅ« # æ¤� 0x6911:bÄ“i,pí # 椑 0x6912:jiÄ�o # 椒 0x6913:zhuó # 椓 0x6914:zÄ« # 椔 0x6915:bÄ«n # 椕 0x6916:péng # 椖 0x6917:dìng # 椗 0x6918:chÇ” # 椘 0x691c:jiÇŽn # 検 0x691d:guÄ« # æ¤� 0x691e:xì # 椞 0x691f:dú # 椟 0x6920:qiàn # 椠 0x6924:luó # 椤 0x6925:zhÄ« # 椥 0x692a:pèng # 椪 0x692b:shàn # 椫 0x692d:tuÇ’ # 椭 0x692e:sÄ“n # 椮 0x692f:duÇ’,chuán # 椯 0x6930:yÄ“ # 椰 0x6931:fù # 椱 0x6932:wÄ›i,huÄ« # 椲 0x6933:wÄ“i # 椳 0x6934:duàn # 椴 0x6935:jiÇŽ,jiÄ� # 椵 0x6936:zÅ�ng # 椶 0x6937:jiÄ�n,hán # 椷 0x6938:yí # 椸 0x6939:zhÄ“n,shèn # 椹 0x693a:xí # 椺 0x693b:yàn,yà # 椻 0x693c:yÇŽn # 椼 0x693d:chuán # 椽 0x693e:jiÄ�n # 椾 0x693f:chÅ«n # 椿 0x6940:yÇ” # 楀 0x6941:hé # æ¥� 0x6942:zhÄ�,chá # 楂 0x6943:wò # 楃 0x6944:piÄ�n # 楄 0x6945:bÄ« # 楅 0x6946:yÄ�o # 楆 0x6947:guÅ�,kuÇŽ # 楇 0x6948:xÅ« # 楈 0x6949:ruò # 楉 0x694a:yáng # 楊 0x694b:là # 楋 0x694c:yán # 楌 0x694d:bÄ›n # æ¥� 0x694e:huÄ« # 楎 0x694f:kuí # æ¥� 0x6950:jiè # æ¥� 0x6951:kuí # 楑 0x6952:sÄ« # 楒 0x6953:fÄ“ng # 楓 0x6954:xiÄ“ # 楔 0x6955:tuÇ’ # 楕 0x6956:jí,zhì # 楖 0x6957:jiàn # 楗 0x6958:mù # 楘 0x6959:máo # 楙 0x695a:chÇ” # 楚 0x695b:kÇ”,hù # 楛 0x695c:hú # 楜 0x695d:liàn # æ¥� 0x695e:léng # 楞 0x695f:tíng # 楟 0x6960:nán # 楠 0x6961:yú # 楡 0x6962:yóu,yÇ’u # 楢 0x6963:méi # 楣 0x6964:sÇ’ng,cÅ�ng # 楤 0x6965:xuàn,yuán # 楥 0x6966:xuàn # 楦 0x6967:yÇŽng,yàng,yÄ«ng # 楧 0x6968:zhÄ“n # 楨 0x6969:pián # 楩 0x696a:dié,yè # 楪 0x696b:jí # 楫 0x696c:jiÄ“ # 楬 0x696d:yè # 業 0x696e:chÇ” # 楮 0x696f:shÇ”n,dùn # 楯 0x6970:yú # 楰 0x6971:còu,zòu # 楱 0x6972:wÄ“i # 楲 0x6973:méi # 楳 0x6974:dì,dÇ�,shì # 楴 0x6975:jí # 極 0x6976:jié # 楶 0x6977:kÇŽi,jiÄ“ # 楷 0x6978:qiÅ« # 楸 0x6979:yíng # 楹 0x697a:róu,ròu # 楺 0x697b:huáng # 楻 0x697c:lóu # 楼 0x697d:lè,yuè # 楽 0x6980:pÇ�n # 榀 0x6982:gài # 概 0x6983:tán # 榃 0x6984:lÇŽn # 榄 0x6985:wÄ“n,yùn # 榅 0x6986:yú # 榆 0x6987:chèn # 榇 0x6988:lǘ # 榈 0x6989:jÇ” # 榉 0x698d:xiè # æ¦� 0x698e:jiÇŽ # 榎 0x698f:yì # æ¦� 0x6990:zhÇŽn,niÇŽn,zhèn # æ¦� 0x6991:fú,fù,bó # 榑 0x6992:nuò # 榒 0x6993:mì # 榓 0x6994:láng # 榔 0x6995:róng # 榕 0x6996:gÇ” # 榖 0x6997:jiàn,jìn # 榗 0x6998:jÇ” # 榘 0x6999:tÄ� # 榙 0x699a:yÇŽo # 榚 0x699b:zhÄ“n # 榛 0x699c:bÇŽng,bàng # 榜 0x699d:shÄ�,xiè # æ¦� 0x699e:yuán # 榞 0x699f:zÇ� # 榟 0x69a0:míng # 榠 0x69a1:sù # 榡 0x69a2:jià # 榢 0x69a3:yáo # 榣 0x69a4:jié # 榤 0x69a5:huàng # 榥 0x69a6:gàn # 榦 0x69a7:fÄ›i # 榧 0x69a8:zhà # 榨 0x69a9:qián # 榩 0x69aa:mà,mÄ� # 榪 0x69ab:sÇ”n # 榫 0x69ac:yuán # 榬 0x69ad:xiè # 榭 0x69ae:róng # 榮 0x69af:shí # 榯 0x69b0:zhÄ« # 榰 0x69b1:cuÄ« # 榱 0x69b2:wÄ“n # 榲 0x69b3:tíng # 榳 0x69b4:liú # 榴 0x69b5:róng # 榵 0x69b6:táng # 榶 0x69b7:què # 榷 0x69b8:zhÄ�i # 榸 0x69b9:sì # 榹 0x69ba:shèng # 榺 0x69bb:tà # 榻 0x69bc:kÄ“ # 榼 0x69bd:xÄ« # 榽 0x69be:gù # 榾 0x69bf:qÄ« # 榿 0x69c0:gÇŽo # æ§€ 0x69c1:gÇŽo # æ§� 0x69c2:sÅ«n # æ§‚ 0x69c3:pán # 槃 0x69c4:tÄ�o # æ§„ 0x69c5:gé # æ§… 0x69c6:chÅ«n # 槆 0x69c7:diÄ�n # 槇 0x69c8:nòu # 槈 0x69c9:jí # 槉 0x69ca:shuò # æ§Š 0x69cb:gòu # æ§‹ 0x69cc:chuí # æ§Œ 0x69cd:qiÄ�ng # æ§� 0x69ce:chá # æ§Ž 0x69cf:qiÇŽn,lián,xiàn # æ§� 0x69d0:huái # æ§� 0x69d1:méi # æ§‘ 0x69d2:xù # æ§’ 0x69d3:gàng # æ§“ 0x69d4:gÄ�o # æ§” 0x69d5:zhuÅ� # æ§• 0x69d6:tuó # æ§– 0x69d8:yàng # 様 0x69d9:diÄ�n,zhÄ›n,zhÄ“n # æ§™ 0x69da:jiÇŽ # æ§š 0x69db:jiàn,kÇŽn # æ§› 0x69dc:zuì # æ§œ 0x69df:bÄ«n,bÄ«ng # æ§Ÿ 0x69e0:zhÅ« # æ§  0x69e2:xí,dié # æ§¢ 0x69e3:jÄ«,guÄ« # æ§£ 0x69e4:lián,liÇŽn # 槤 0x69e5:huì # æ§¥ 0x69e6:róng,yÅ�ng # 槦 0x69e7:qiàn # æ§§ 0x69e8:guÇ’ # 槨 0x69e9:gài # æ§© 0x69ea:gài # 槪 0x69eb:tuán,shuàn,quán # æ§« 0x69ec:huà # 槬 0x69ed:qì,sè # æ§­ 0x69ee:sÄ“n # æ§® 0x69ef:cuÄ«,zhÇ� # 槯 0x69f0:pèng # æ§° 0x69f1:yÇ’u,chÇŽo # æ§± 0x69f2:hú # æ§² 0x69f3:jiÇŽng # æ§³ 0x69f4:hù # æ§´ 0x69f5:huàn # æ§µ 0x69f6:guì # æ§¶ 0x69f7:niè # æ§· 0x69f8:yì # 槸 0x69f9:gÄ�o # æ§¹ 0x69fa:kÄ�ng # 槺 0x69fb:guÄ« # æ§» 0x69fc:guÄ« # æ§¼ 0x69fd:cáo # æ§½ 0x69fe:màn,wàn # æ§¾ 0x69ff:jÇ�n # æ§¿ 0x6a00:dÄ« # 樀 0x6a01:zhuÄ�ng # æ¨� 0x6a02:lè,yuè,yào,lào # 樂 0x6a03:láng # 樃 0x6a04:chén # 樄 0x6a05:cÅ�ng,zÅ�ng # 樅 0x6a06:lí,chÄ« # 樆 0x6a07:xiÅ« # 樇 0x6a08:qíng # 樈 0x6a09:shÇŽng,shuÇŽng # 樉 0x6a0a:fán # 樊 0x6a0b:tÅ�ng # 樋 0x6a0c:guàn # 樌 0x6a0d:zé # æ¨� 0x6a0e:sù # 樎 0x6a0f:léi,lÄ›i # æ¨� 0x6a10:lÇ” # æ¨� 0x6a11:liáng # 樑 0x6a12:mì # 樒 0x6a13:lóu # 樓 0x6a14:cháo,jiÇŽo,chÄ�o # 樔 0x6a15:sù # 樕 0x6a16:kÄ“ # 樖 0x6a17:chÅ« # 樗 0x6a18:táng # 樘 0x6a19:biÄ�o # 標 0x6a1a:lù # 樚 0x6a1b:jiÅ«,liáo # 樛 0x6a1c:zhè # 樜 0x6a1d:zhÄ� # æ¨� 0x6a1e:shÅ« # 樞 0x6a1f:zhÄ�ng # 樟 0x6a20:mán # 樠 0x6a21:mó,mú # 模 0x6a22:niÇŽo,mù # 樢 0x6a23:yàng # 樣 0x6a24:tiáo # 樤 0x6a25:péng # 樥 0x6a26:zhù # 樦 0x6a27:shÄ�,xiè # 樧 0x6a28:xÄ« # 樨 0x6a29:quán # 権 0x6a2a:héng,hèng # 横 0x6a2b:jiÄ�n # 樫 0x6a2c:cÅ�ng # 樬 0x6a2f:qiáng # 樯 0x6a31:yÄ«ng # 樱 0x6a32:èr # 樲 0x6a33:xún # 樳 0x6a34:zhí # 樴 0x6a35:qiáo # 樵 0x6a36:zuÄ« # 樶 0x6a37:cóng # 樷 0x6a38:pÇ” # 樸 0x6a39:shù # 樹 0x6a3a:huà # 樺 0x6a3b:guì # 樻 0x6a3c:zhÄ“n # 樼 0x6a3d:zÅ«n # 樽 0x6a3e:yuè # 樾 0x6a3f:shàn # 樿 0x6a40:xÄ« # æ©€ 0x6a41:chÅ«n # æ©� 0x6a42:diàn # æ©‚ 0x6a43:fá,fèi # 橃 0x6a44:gÇŽn # æ©„ 0x6a45:mó # æ©… 0x6a46:wú # 橆 0x6a47:qiÄ�o # 橇 0x6a48:ráo,náo # 橈 0x6a49:lìn # 橉 0x6a4a:liú # 橊 0x6a4b:qiáo # æ©‹ 0x6a4c:xiàn # 橌 0x6a4d:rùn # æ©� 0x6a4e:fÇŽn # 橎 0x6a4f:zhÇŽn,jiÇŽn # æ©� 0x6a50:tuó # æ©� 0x6a51:liáo # æ©‘ 0x6a52:yún # æ©’ 0x6a53:shùn # æ©“ 0x6a54:tuí,dÅ«n # æ©” 0x6a55:chÄ“ng # æ©• 0x6a56:táng,chÄ“ng # æ©– 0x6a57:méng # æ©— 0x6a58:jú # 橘 0x6a59:chéng # æ©™ 0x6a5a:sù,qiÅ« # 橚 0x6a5b:jué # æ©› 0x6a5c:jué # 橜 0x6a5d:tán,diàn # æ©� 0x6a5e:huì # 橞 0x6a5f:jÄ« # 機 0x6a60:nuó # æ©  0x6a61:xiàng # æ©¡ 0x6a62:tuÇ’ # æ©¢ 0x6a63:níng # æ©£ 0x6a64:ruÇ� # 橤 0x6a65:zhÅ« # æ©¥ 0x6a66:tóng,chuáng # 橦 0x6a67:zÄ“ng,céng # æ©§ 0x6a68:fén,fèn,fèi # 橨 0x6a69:qióng # æ©© 0x6a6a:rÇŽn,yÄ�n # 橪 0x6a6b:héng,hèng # æ©« 0x6a6c:qián # 橬 0x6a6d:gÅ« # æ©­ 0x6a6e:liÇ” # æ©® 0x6a6f:lào # 橯 0x6a70:gÄ�o # æ©° 0x6a71:chú # 橱 0x6a76:jÇ� # æ©¶ 0x6a77:dÅ�u # æ©· 0x6a79:lÇ” # 橹 0x6a7c:yuán # 橼 0x6a7d:tà # 橽 0x6a7e:shÅ«,qiÄ�o # 橾 0x6a7f:jiÄ�ng # æ©¿ 0x6a80:tán # 檀 0x6a81:lÇ�n # æª� 0x6a82:nóng # 檂 0x6a83:yÇ�n # 檃 0x6a84:xí # 檄 0x6a85:huì # 檅 0x6a86:shÄ�n # 檆 0x6a87:zuì # 檇 0x6a88:xuán # 檈 0x6a89:chÄ“ng # 檉 0x6a8a:gàn # 檊 0x6a8b:jÅ« # 檋 0x6a8c:zuì # 檌 0x6a8d:yì # æª� 0x6a8e:qín # 檎 0x6a8f:pÇ” # æª� 0x6a90:yán # æª� 0x6a91:léi # 檑 0x6a92:fÄ“ng # 檒 0x6a93:huÇ� # 檓 0x6a94:dàng # 檔 0x6a95:jì # 檕 0x6a96:suì # 檖 0x6a97:bò # 檗 0x6a98:píng,bò # 檘 0x6a99:chéng # 檙 0x6a9a:chÇ” # 檚 0x6a9b:zhuÄ� # 檛 0x6a9c:guì,huì # 檜 0x6a9d:jí # æª� 0x6a9e:jiÄ› # 檞 0x6a9f:jiÇŽ # 檟 0x6aa0:qíng # 檠 0x6aa1:zhái,shì,tú # 檡 0x6aa2:jiÇŽn # 檢 0x6aa3:qiáng # 檣 0x6aa4:dào # 檤 0x6aa5:yÇ� # 檥 0x6aa6:biÄ�o,biÇŽo # 檦 0x6aa7:sÅ�ng # 檧 0x6aa8:shÄ“ # 檨 0x6aa9:lÇ�n # 檩 0x6aab:chá # 檫 0x6aac:méng # 檬 0x6aad:yín # 檭 0x6aae:chóu,táo,dÇŽo # 檮 0x6aaf:tái # 檯 0x6ab0:mián # 檰 0x6ab1:qí # 檱 0x6ab3:bÄ«n,bÄ«ng # 檳 0x6ab4:huò # 檴 0x6ab5:jì # 檵 0x6ab6:qiÄ�n,lián # 檶 0x6ab7:nÇ�,mí # 檷 0x6ab8:níng # 檸 0x6ab9:yÄ« # 檹 0x6aba:gÇŽo # 檺 0x6abb:jiàn,kÇŽn # 檻 0x6abc:yÇ�n # 檼 0x6abd:nòu,ruÇŽn,rú # 檽 0x6abe:qÇ�ng # 檾 0x6abf:yÇŽn # 檿 0x6ac0:qí # æ«€ 0x6ac1:mì # æ«� 0x6ac2:zhào # æ«‚ 0x6ac3:guì # 櫃 0x6ac4:chÅ«n # æ«„ 0x6ac5:jÄ«,jì # æ«… 0x6ac6:kuí # 櫆 0x6ac7:pó # 櫇 0x6ac8:dèng # 櫈 0x6ac9:chú # 櫉 0x6acb:mián # æ«‹ 0x6acc:yÅ�u # 櫌 0x6acd:zhì # æ«� 0x6ace:huÇŽng,guÇ’,gÇ” # 櫎 0x6acf:qiÄ�n # æ«� 0x6ad0:lÄ›i # æ«� 0x6ad1:léi,lÄ›i # æ«‘ 0x6ad2:sà # æ«’ 0x6ad3:lÇ” # æ«“ 0x6ad4:lì # æ«” 0x6ad5:cuán # æ«• 0x6ad6:lÇœ,chÅ« # æ«– 0x6ad7:miè,mèi # æ«— 0x6ad8:huì # 櫘 0x6ad9:Å�u # æ«™ 0x6ada:lǘ # 櫚 0x6adb:zhì # æ«› 0x6adc:gÄ�o # 櫜 0x6add:dú # æ«� 0x6ade:yuán # 櫞 0x6adf:lì,yuè # 櫟 0x6ae0:fèi # æ«  0x6ae1:zhuó,zhù # æ«¡ 0x6ae2:sÇ’u # æ«¢ 0x6ae3:lián,liÇŽn # æ«£ 0x6ae5:chú # æ«¥ 0x6ae7:zhÅ« # æ«§ 0x6ae8:lú # 櫨 0x6ae9:yán # æ«© 0x6aea:lì # 櫪 0x6aeb:zhÅ« # æ«« 0x6aec:chèn # 櫬 0x6aed:jué,jì # æ«­ 0x6aee:è # æ«® 0x6aef:sÅ« # 櫯 0x6af0:huái,guÄ« # æ«° 0x6af1:niè # 櫱 0x6af2:yù # 櫲 0x6af3:lóng # 櫳 0x6af4:là,lài # æ«´ 0x6af6:xiÇŽn # æ«¶ 0x6af8:jÇ” # 櫸 0x6af9:xiÄ�o # 櫹 0x6afa:líng # 櫺 0x6afb:yÄ«ng # æ«» 0x6afc:jiÄ�n # 櫼 0x6afd:yÇ�n # 櫽 0x6afe:yòu,yóu # 櫾 0x6aff:yíng # æ«¿ 0x6b00:xiÄ�ng # 欀 0x6b01:nóng # æ¬� 0x6b02:bó # 欂 0x6b03:chán,zhàn # 欃 0x6b04:lán # 欄 0x6b05:jÇ” # 欅 0x6b06:shuÄ�ng # 欆 0x6b07:shè # 欇 0x6b08:wéi,zuì # 欈 0x6b09:cóng # 欉 0x6b0a:quán # 權 0x6b0b:qú # 欋 0x6b0e:yù # 欎 0x6b0f:luó # æ¬� 0x6b10:lì # æ¬� 0x6b11:cuán # 欑 0x6b12:luán # 欒 0x6b13:dÇŽng # 欓 0x6b14:qú # 欔 0x6b16:lÇŽn # 欖 0x6b17:lán # 欗 0x6b18:zhú # 欘 0x6b19:léi # 欙 0x6b1a:lÇ� # 欚 0x6b1b:bà # 欛 0x6b1c:náng # 欜 0x6b1d:yù # æ¬� 0x6b1e:líng # 欞 0x6b20:qiàn # 欠 0x6b21:cì # 次 0x6b22:huÄ�n # 欢 0x6b23:xÄ«n # 欣 0x6b24:yú # 欤 0x6b25:yù,yì # 欥 0x6b26:qiÄ�n,xiÄ�n # 欦 0x6b27:Å�u # 欧 0x6b28:xÅ« # 欨 0x6b29:chÄ�o # 欩 0x6b2a:chù,qù,xì # 欪 0x6b2b:qì # 欫 0x6b2c:kài,ài # 欬 0x6b2d:yì,yÄ«n # 欭 0x6b2e:jué # 欮 0x6b2f:xì,kài # 欯 0x6b30:xù # 欰 0x6b31:hÄ“ # 欱 0x6b32:yù # 欲 0x6b33:kuài # 欳 0x6b34:láng # 欴 0x6b35:kuÇŽn # 欵 0x6b36:shuò,sòu # 欶 0x6b37:xÄ« # 欷 0x6b38:Ä“i,éi,Ä›i,èi,ÇŽi # 欸 0x6b39:qÄ« # 欹 0x6b3a:qÄ« # 欺 0x6b3b:xÅ«,chuÄ� # 欻 0x6b3c:chÇ�,chuài # 欼 0x6b3d:qÄ«n # 欽 0x6b3e:kuÇŽn # 款 0x6b3f:kÇŽn,qiàn # 欿 0x6b40:kuÇŽn # æ­€ 0x6b41:kÇŽn,kè # æ­� 0x6b42:chuÇŽn,chuán # æ­‚ 0x6b43:shà # æ­ƒ 0x6b45:yÄ�n,yÄ«n # æ­… 0x6b46:xÄ«n # æ­† 0x6b47:xiÄ“ # æ­‡ 0x6b48:yú # æ­ˆ 0x6b49:qiàn # æ­‰ 0x6b4a:xiÄ�o # æ­Š 0x6b4b:yÄ“ # æ­‹ 0x6b4c:gÄ“ # æ­Œ 0x6b4d:wÅ« # æ­� 0x6b4e:tàn # æ­Ž 0x6b4f:jìn,qÅ«n # æ­� 0x6b50:Å�u # æ­� 0x6b51:hÅ« # æ­‘ 0x6b52:tì # æ­’ 0x6b53:huÄ�n # æ­“ 0x6b54:xÅ« # æ­” 0x6b55:pÄ“n # æ­• 0x6b56:xÇ� # æ­– 0x6b57:xiào # æ­— 0x6b58:xÅ« # æ­˜ 0x6b59:xÄ«,shè # æ­™ 0x6b5b:liÇŽn,hÄ�n # æ­› 0x6b5c:chù # æ­œ 0x6b5d:yì # æ­� 0x6b5e:è # æ­ž 0x6b5f:yú # æ­Ÿ 0x6b60:chuò # æ­  0x6b61:huÄ�n # æ­¡ 0x6b62:zhÇ� # æ­¢ 0x6b63:zhèng,zhÄ“ng # æ­£ 0x6b64:cÇ� # æ­¤ 0x6b65:bù # æ­¥ 0x6b66:wÇ” # æ­¦ 0x6b67:qí # æ­§ 0x6b68:bù # æ­¨ 0x6b69:bù # æ­© 0x6b6a:wÄ�i # æ­ª 0x6b6b:jù # æ­« 0x6b6c:qián # æ­¬ 0x6b6d:zhì,chí # æ­­ 0x6b6e:sè # æ­® 0x6b6f:chÇ� # æ­¯ 0x6b70:sè,shà # æ­° 0x6b71:zhÇ’ng # æ­± 0x6b72:suì # æ­² 0x6b73:suì # æ­³ 0x6b74:lì # æ­´ 0x6b75:zé # æ­µ 0x6b76:yú # æ­¶ 0x6b77:lì # æ­· 0x6b78:guÄ« # æ­¸ 0x6b79:dÇŽi # æ­¹ 0x6b7a:è # æ­º 0x6b7b:sÇ� # æ­» 0x6b7c:jiÄ�n # æ­¼ 0x6b7d:zhé # æ­½ 0x6b7e:mò,wÄ›n # æ­¾ 0x6b7f:mò # æ­¿ 0x6b80:yÄ�o # 殀 0x6b81:mò # æ®� 0x6b82:cú # 殂 0x6b83:yÄ�ng # 殃 0x6b84:tiÇŽn # 殄 0x6b85:shÄ“ng # æ®… 0x6b86:dài # 殆 0x6b87:shÄ�ng # 殇 0x6b88:xù # 殈 0x6b89:xùn # 殉 0x6b8a:shÅ« # 殊 0x6b8b:cán # 残 0x6b8c:jÇ�ng,jué # 殌 0x6b8d:piÇŽo # æ®� 0x6b8e:qià # 殎 0x6b8f:qiú # æ®� 0x6b90:sù # æ®� 0x6b91:qíng,jìng # 殑 0x6b92:yÇ”n # æ®’ 0x6b93:liàn # 殓 0x6b94:yì # æ®” 0x6b95:fÇ’u,bó # 殕 0x6b96:zhí,shi # æ®– 0x6b97:yè,yÄ�n,yàn # æ®— 0x6b98:cán # 殘 0x6b99:hÅ«n,mèi # æ®™ 0x6b9a:dÄ�n # 殚 0x6b9b:jí # æ®› 0x6b9c:dié # 殜 0x6b9e:yÇ”n # 殞 0x6b9f:wÄ“n # 殟 0x6ba0:chòu # æ®  0x6ba1:bìn # 殡 0x6ba2:tì # 殢 0x6ba3:jìn # 殣 0x6ba4:shÄ�ng # 殤 0x6ba5:yín # 殥 0x6ba6:chÄ« # 殦 0x6ba7:jiù # æ®§ 0x6ba8:kuì,huì # 殨 0x6ba9:cuàn # 殩 0x6baa:yì # 殪 0x6bab:dÄ�n # 殫 0x6bac:dù # 殬 0x6bad:jiÄ�ng # æ®­ 0x6bae:liàn # æ®® 0x6baf:bìn # 殯 0x6bb0:dú # æ®° 0x6bb2:jiÄ�n # 殲 0x6bb3:shÅ« # 殳 0x6bb4:Å�u # æ®´ 0x6bb5:duàn # 段 0x6bb6:zhù # æ®¶ 0x6bb7:yÄ«n,yÄ�n,yÇ�n # æ®· 0x6bb8:qìng,kÄ“ng,shÄ“ng # 殸 0x6bb9:yì # 殹 0x6bba:shÄ� # 殺 0x6bbb:ké,qiào # æ®» 0x6bbc:ké,qiào # 殼 0x6bbd:xiáo,yáo,xiào # 殽 0x6bbe:xùn # 殾 0x6bbf:diàn # 殿 0x6bc0:huÇ� # 毀 0x6bc1:huÇ� # æ¯� 0x6bc2:gÇ” # 毂 0x6bc3:qiÄ�o # 毃 0x6bc4:jÄ« # 毄 0x6bc5:yì # 毅 0x6bc6:Å�u # 毆 0x6bc7:huÇ� # 毇 0x6bc8:duàn # 毈 0x6bc9:yÄ« # 毉 0x6bca:xiÄ�o # 毊 0x6bcb:wú # 毋 0x6bcc:guàn,wÄ�n # 毌 0x6bcd:mÇ” # æ¯� 0x6bce:mÄ›i # 毎 0x6bcf:mÄ›i # æ¯� 0x6bd0:ÇŽi # æ¯� 0x6bd1:jiÄ› # 毑 0x6bd2:dú,dài # 毒 0x6bd3:yù # 毓 0x6bd4:bÇ� # 比 0x6bd5:bì # 毕 0x6bd6:bì # 毖 0x6bd7:pí # 毗 0x6bd8:pí # 毘 0x6bd9:bì # 毙 0x6bda:chán # 毚 0x6bdb:máo # 毛 0x6bde:bÇ� # 毞 0x6be0:jiÄ� # 毠 0x6be1:zhÄ�n # 毡 0x6be2:sÄ�i # 毢 0x6be3:mù # 毣 0x6be4:tuò # 毤 0x6be5:xún,xùn # 毥 0x6be6:Ä›r # 毦 0x6be7:róng # 毧 0x6be8:xiÇŽn # 毨 0x6be9:jÅ« # 毩 0x6bea:mú # 毪 0x6beb:háo # 毫 0x6bec:qiú # 毬 0x6bed:dòu,nuò # 毭 0x6bef:tÇŽn # 毯 0x6bf0:péi # 毰 0x6bf1:jÅ« # 毱 0x6bf2:duÅ� # 毲 0x6bf3:cuì # 毳 0x6bf4:bÄ« # 毴 0x6bf5:sÄ�n # 毵 0x6bf7:mào # 毷 0x6bf8:sÄ�i,suÄ« # 毸 0x6bf9:shÅ« # 毹 0x6bfa:shÅ« # 毺 0x6bfb:tuò # 毻 0x6bfc:hé # 毼 0x6bfd:jiàn # 毽 0x6bfe:tà # 毾 0x6bff:sÄ�n # 毿 0x6c00:lǘ # æ°€ 0x6c01:mú # æ°� 0x6c02:máo # æ°‚ 0x6c03:tóng # æ°ƒ 0x6c04:rÇ’ng # æ°„ 0x6c05:chÇŽng # æ°… 0x6c06:pÇ” # æ°† 0x6c07:lÇ” # æ°‡ 0x6c08:zhÄ�n # æ°ˆ 0x6c09:sào # æ°‰ 0x6c0a:zhÄ�n # æ°Š 0x6c0b:méng # æ°‹ 0x6c0c:lÇ” # æ°Œ 0x6c0d:qú # æ°� 0x6c0e:dié # æ°Ž 0x6c0f:shì,zhÄ« # æ°� 0x6c10:dÄ«,dÇ� # æ°� 0x6c11:mín # æ°‘ 0x6c12:jué # æ°’ 0x6c13:méng,máng # æ°“ 0x6c14:qì # æ°” 0x6c15:piÄ“ # æ°• 0x6c16:nÇŽi # æ°– 0x6c17:qì # æ°— 0x6c18:dÄ�o # æ°˜ 0x6c19:xiÄ�n # æ°™ 0x6c1a:chuÄ�n # æ°š 0x6c1b:fÄ“n # æ°› 0x6c1c:yáng,rì # æ°œ 0x6c1d:nèi # æ°� 0x6c1f:fú # æ°Ÿ 0x6c20:shÄ“n # æ°  0x6c21:dÅ�ng # æ°¡ 0x6c22:qÄ«ng # æ°¢ 0x6c23:qì # æ°£ 0x6c24:yÄ«n # æ°¤ 0x6c25:xÄ« # æ°¥ 0x6c26:hài # æ°¦ 0x6c27:yÇŽng # æ°§ 0x6c28:Ä�n # æ°¨ 0x6c29:yà # æ°© 0x6c2a:kè # æ°ª 0x6c2b:qÄ«ng # æ°« 0x6c2c:yà # æ°¬ 0x6c2d:dÅ�ng # æ°­ 0x6c2e:dàn # æ°® 0x6c2f:lÇœ # æ°¯ 0x6c30:qíng # æ°° 0x6c31:yÇŽng # æ°± 0x6c32:yÅ«n # æ°² 0x6c33:yÅ«n # æ°³ 0x6c34:shuÇ� # æ°´ 0x6c36:zhÄ›ng,chéng,zhèng # æ°¶ 0x6c37:bÄ«ng # æ°· 0x6c38:yÇ’ng # æ°¸ 0x6c39:dàng # æ°¹ 0x6c3b:lè # æ°» 0x6c3c:nì # æ°¼ 0x6c3d:tÇ”n # æ°½ 0x6c3e:fàn # æ°¾ 0x6c3f:guÇ�,jiÇ” # æ°¿ 0x6c40:tÄ«ng # æ±€ 0x6c41:zhÄ« # æ±� 0x6c42:qiú # 求 0x6c43:bÄ«n,pà,pÄ� # 汃 0x6c44:zè # 汄 0x6c45:miÇŽn # æ±… 0x6c46:cuÄ�n # 汆 0x6c47:huì # 汇 0x6c48:diÄ�o # 汈 0x6c49:hàn # 汉 0x6c4a:chà # 汊 0x6c4b:zhuó,què # 汋 0x6c4c:chuàn # 汌 0x6c4d:wán # æ±� 0x6c4e:fàn # 汎 0x6c4f:tài,dà # æ±� 0x6c50:xÄ« # æ±� 0x6c51:tuÅ� # 汑 0x6c52:máng # æ±’ 0x6c53:qiú # 汓 0x6c54:qì # æ±” 0x6c55:shàn # 汕 0x6c56:pìn # æ±– 0x6c57:hàn,hán # æ±— 0x6c58:qiÄ�n # 汘 0x6c59:wÅ« # æ±™ 0x6c5a:wÅ« # 汚 0x6c5b:xùn # æ±› 0x6c5c:sì # 汜 0x6c5d:rÇ” # æ±� 0x6c5e:gÇ’ng # 汞 0x6c5f:jiÄ�ng # 江 0x6c60:chí # æ±  0x6c61:wÅ« # 污 0x6c64:tÄ�ng,shÄ�ng # 汤 0x6c65:zhÄ«,jì # æ±¥ 0x6c66:zhÇ� # 汦 0x6c67:qiÄ�n # æ±§ 0x6c68:mì # 汨 0x6c69:gÇ”,yù # 汩 0x6c6a:wÄ�ng # 汪 0x6c6b:jÇ�ng # 汫 0x6c6c:jÇ�ng # 汬 0x6c6d:ruì # æ±­ 0x6c6e:jÅ«n # æ±® 0x6c6f:hóng # 汯 0x6c70:tài # æ±° 0x6c71:tài # æ±± 0x6c72:jí # æ±² 0x6c73:biàn # æ±³ 0x6c74:biàn # æ±´ 0x6c75:gàn,hán,cén # æ±µ 0x6c76:wèn,mén # æ±¶ 0x6c77:zhÅ�ng # æ±· 0x6c78:fÄ�ng,pÄ�ng # 汸 0x6c79:xiÅ�ng # æ±¹ 0x6c7a:jué # 決 0x6c7b:hÇ”,huÇŽng # æ±» 0x6c7d:qì # æ±½ 0x6c7e:fén # æ±¾ 0x6c7f:xù # 汿 0x6c80:xù # æ²€ 0x6c81:qìn # æ²� 0x6c82:yí # 沂 0x6c83:wò # 沃 0x6c84:yún # 沄 0x6c85:yuán # æ²… 0x6c86:hàng # 沆 0x6c87:yÇŽn # 沇 0x6c88:shÄ›n,chén # 沈 0x6c89:chén # 沉 0x6c8a:dàn # 沊 0x6c8b:yóu # 沋 0x6c8c:dùn,zhuàn # 沌 0x6c8d:hù # æ²� 0x6c8e:huò # 沎 0x6c8f:qÄ« # æ²� 0x6c90:mù # æ²� 0x6c91:nÇœ,niÇ” # 沑 0x6c92:méi,mò # æ²’ 0x6c93:tà,dá # 沓 0x6c94:miÇŽn # æ²” 0x6c95:mì,wù # 沕 0x6c96:chÅ�ng # æ²– 0x6c97:hóng,pÄ�ng # æ²— 0x6c98:bÇ� # 沘 0x6c99:shÄ�,shà # æ²™ 0x6c9a:zhÇ� # 沚 0x6c9b:pèi # æ²› 0x6c9c:pàn # 沜 0x6c9d:zhuÇ�,zÇ� # æ²� 0x6c9e:zÄ� # 沞 0x6c9f:gÅ�u # 沟 0x6ca0:pài # æ²  0x6ca1:méi,mò # 没 0x6ca2:zé # æ²¢ 0x6ca3:fÄ“ng # æ²£ 0x6ca4:òu,Å�u # 沤 0x6ca5:lì # æ²¥ 0x6ca6:lún # 沦 0x6ca7:cÄ�ng # æ²§ 0x6ca8:fÄ“ng # 沨 0x6ca9:wéi # 沩 0x6caa:hù # 沪 0x6cab:mò # 沫 0x6cac:mèi # 沬 0x6cad:shù # æ²­ 0x6cae:jÇ”,jù # æ²® 0x6caf:zá # 沯 0x6cb0:tuÅ�,duó # æ²° 0x6cb1:tuó # æ²± 0x6cb2:tuó,duò # æ²² 0x6cb3:hé # æ²³ 0x6cb4:lì # æ²´ 0x6cb5:mÇ�,lì # æ²µ 0x6cb6:yí,chí # æ²¶ 0x6cb7:fÄ� # æ²· 0x6cb8:fèi # 沸 0x6cb9:yóu # æ²¹ 0x6cba:tián # 沺 0x6cbb:zhì # æ²» 0x6cbc:zhÇŽo # æ²¼ 0x6cbd:gÅ« # æ²½ 0x6cbe:zhÄ�n # æ²¾ 0x6cbf:yán # 沿 0x6cc0:sÄ« # æ³€ 0x6cc1:kuàng # æ³� 0x6cc2:jiÇ’ng # 泂 0x6cc3:jÅ« # 泃 0x6cc4:xiè,yì # 泄 0x6cc5:qiú # æ³… 0x6cc6:yì,dié # 泆 0x6cc7:jiÄ� # 泇 0x6cc8:zhÅ�ng # 泈 0x6cc9:quán # 泉 0x6cca:bó,pÅ� # 泊 0x6ccb:huì # 泋 0x6ccc:mì,bì # 泌 0x6ccd:bÄ“n,bèn # æ³� 0x6cce:zé # 泎 0x6ccf:chù,shè # æ³� 0x6cd0:lè # æ³� 0x6cd1:yÅ�u,yòu,Ä�o # 泑 0x6cd2:gÅ« # æ³’ 0x6cd3:hóng # 泓 0x6cd4:gÄ�n # æ³” 0x6cd5:fÇŽ # 法 0x6cd6:mÇŽo # æ³– 0x6cd7:sì # æ³— 0x6cd8:hÅ« # 泘 0x6cd9:pÄ“ng,píng # æ³™ 0x6cda:cÇ� # 泚 0x6cdb:fàn # æ³› 0x6cdc:zhÄ« # 泜 0x6cdd:sù # æ³� 0x6cde:nìng # 泞 0x6cdf:chÄ“ng # 泟 0x6ce0:líng # æ³  0x6ce1:pào,pÄ�o # 泡 0x6ce2:bÅ� # æ³¢ 0x6ce3:qì # æ³£ 0x6ce4:sì # 泤 0x6ce5:ní,nì # æ³¥ 0x6ce6:jú # 泦 0x6ce7:yuè,sà # æ³§ 0x6ce8:zhù # 注 0x6ce9:shÄ“ng # 泩 0x6cea:lèi # 泪 0x6ceb:xuàn # 泫 0x6cec:jué,xuè # 泬 0x6ced:fú # æ³­ 0x6cee:pàn # æ³® 0x6cef:mÇ�n # 泯 0x6cf0:tài # æ³° 0x6cf1:yÄ�ng # æ³± 0x6cf2:jÇ� # æ³² 0x6cf3:yÇ’ng # æ³³ 0x6cf4:guàn # æ³´ 0x6cf5:bèng # æ³µ 0x6cf6:xué # æ³¶ 0x6cf7:lóng,shuÄ�ng # æ³· 0x6cf8:lú # 泸 0x6cfa:luò,pÅ� # 泺 0x6cfb:xiè # æ³» 0x6cfc:pÅ� # æ³¼ 0x6cfd:zé,shì # æ³½ 0x6cfe:jÄ«ng # æ³¾ 0x6cff:yín # 泿 0x6d00:pán # æ´€ 0x6d01:jié # æ´� 0x6d02:yè # æ´‚ 0x6d03:huÄ« # æ´ƒ 0x6d04:huí # æ´„ 0x6d05:zài # æ´… 0x6d06:chéng # æ´† 0x6d07:yÄ«n # æ´‡ 0x6d08:wéi # æ´ˆ 0x6d09:hòu # æ´‰ 0x6d0a:jiàn # æ´Š 0x6d0b:yáng # æ´‹ 0x6d0c:liè # æ´Œ 0x6d0d:sì # æ´� 0x6d0e:jì # æ´Ž 0x6d0f:ér # æ´� 0x6d10:xíng # æ´� 0x6d11:fú,fù # æ´‘ 0x6d12:sÇŽ,xÇ� # æ´’ 0x6d13:sè,qì,zì # æ´“ 0x6d14:zhÇ� # æ´” 0x6d15:yìn # æ´• 0x6d16:wú # æ´– 0x6d17:xÇ�,xiÇŽn # æ´— 0x6d18:kÇŽo,kào # æ´˜ 0x6d19:zhÅ« # æ´™ 0x6d1a:jiàng # æ´š 0x6d1b:luò # æ´› 0x6d1d:àn,yàn,è # æ´� 0x6d1e:dòng # æ´ž 0x6d1f:yí # æ´Ÿ 0x6d20:sì # æ´  0x6d21:lÄ›i,lèi # æ´¡ 0x6d22:yÄ« # æ´¢ 0x6d23:mÇ� # æ´£ 0x6d24:quán # æ´¤ 0x6d25:jÄ«n # æ´¥ 0x6d26:pò # æ´¦ 0x6d27:wÄ›i # æ´§ 0x6d28:xiáo # æ´¨ 0x6d29:xiè # æ´© 0x6d2a:hóng # æ´ª 0x6d2b:xù # æ´« 0x6d2c:sù,shuò # æ´¬ 0x6d2d:kuÄ�ng # æ´­ 0x6d2e:táo # æ´® 0x6d2f:qiè,jié # æ´¯ 0x6d30:jù # æ´° 0x6d31:Ä›r # æ´± 0x6d32:zhÅ�u # æ´² 0x6d33:rù # æ´³ 0x6d34:píng # æ´´ 0x6d35:xún # æ´µ 0x6d36:xiÅ�ng # æ´¶ 0x6d37:zhì # æ´· 0x6d38:guÄ�ng # æ´¸ 0x6d39:huán # æ´¹ 0x6d3a:míng # æ´º 0x6d3b:huó # æ´» 0x6d3c:wÄ� # æ´¼ 0x6d3d:qià # æ´½ 0x6d3e:pài,pÄ� # æ´¾ 0x6d3f:wÅ« # æ´¿ 0x6d40:qÅ« # æµ€ 0x6d41:liú # æµ� 0x6d42:yì # 浂 0x6d43:jiÄ� # 浃 0x6d44:jìng # 浄 0x6d45:qiÇŽn,jiÄ�n # æµ… 0x6d46:jiÄ�ng,jiàng # 浆 0x6d47:jiÄ�o # 浇 0x6d48:zhÄ“n # 浈 0x6d49:shÄ« # 浉 0x6d4a:zhuó # 浊 0x6d4b:cè # 测 0x6d4d:kuài,huì # æµ� 0x6d4e:jì,jÇ� # 济 0x6d4f:liú # æµ� 0x6d50:chÇŽn # æµ� 0x6d51:hún # 浑 0x6d52:hÇ”,xÇ” # æµ’ 0x6d53:nóng # 浓 0x6d54:xún # æµ” 0x6d55:jìn # 浕 0x6d56:liè # æµ– 0x6d57:qiú # æµ— 0x6d58:wÄ›i # 浘 0x6d59:zhè # æµ™ 0x6d5a:jùn,xùn # 浚 0x6d5b:hán # æµ› 0x6d5c:bÄ�ng # 浜 0x6d5d:máng # æµ� 0x6d5e:zhuó # 浞 0x6d5f:yÅ�u,dí # 浟 0x6d60:xÄ« # æµ  0x6d61:bó # 浡 0x6d62:dòu # æµ¢ 0x6d63:huàn # æµ£ 0x6d64:hóng # 浤 0x6d65:yì # æµ¥ 0x6d66:pÇ” # 浦 0x6d67:yÇ�ng,chéng,yíng # æµ§ 0x6d68:lÇŽn # 浨 0x6d69:hào # 浩 0x6d6a:làng # 浪 0x6d6b:hÇŽn # 浫 0x6d6c:lÇ� # 浬 0x6d6d:gÄ“ng # æµ­ 0x6d6e:fú # æµ® 0x6d6f:wú # 浯 0x6d70:lì # æµ° 0x6d71:chún # æµ± 0x6d72:féng,hóng # æµ² 0x6d73:yì # æµ³ 0x6d74:yù # æµ´ 0x6d75:tóng # æµµ 0x6d76:láo # æµ¶ 0x6d77:hÇŽi # æµ· 0x6d78:jìn # 浸 0x6d79:jiÄ� # æµ¹ 0x6d7a:chÅ�ng # 浺 0x6d7b:jiÇ’ng,jiÅ�ng # æµ» 0x6d7c:mÄ›i # æµ¼ 0x6d7d:suÄ«,nÄ›i # æµ½ 0x6d7e:chÄ“ng # æµ¾ 0x6d7f:pèi # 浿 0x6d80:xiàn # æ¶€ 0x6d81:shèn # æ¶� 0x6d82:tú # æ¶‚ 0x6d83:kùn # 涃 0x6d84:pÄ«ng # æ¶„ 0x6d85:niè # æ¶… 0x6d86:hàn # 涆 0x6d87:jÄ«ng # 涇 0x6d88:xiÄ�o # 消 0x6d89:shè # 涉 0x6d8a:niÇŽn # æ¶Š 0x6d8b:tÅ« # æ¶‹ 0x6d8c:yÇ’ng,chÅ�ng # æ¶Œ 0x6d8d:xiào # æ¶� 0x6d8e:xián # æ¶Ž 0x6d8f:tÇ�ng # æ¶� 0x6d90:é # æ¶� 0x6d91:sù # æ¶‘ 0x6d92:tÅ«n,yÅ«n # æ¶’ 0x6d93:juÄ�n # æ¶“ 0x6d94:cén # æ¶” 0x6d95:tì # æ¶• 0x6d96:lì # æ¶– 0x6d97:shuì # æ¶— 0x6d98:sì # 涘 0x6d99:lèi # æ¶™ 0x6d9a:shuì # æ¶š 0x6d9b:tÄ�o # æ¶› 0x6d9c:dú # æ¶œ 0x6d9d:lào # æ¶� 0x6d9e:lái # æ¶ž 0x6d9f:lián # æ¶Ÿ 0x6da0:wéi # æ¶  0x6da1:wÅ�,guÅ� # æ¶¡ 0x6da2:yún # æ¶¢ 0x6da3:huàn # æ¶£ 0x6da4:dí # 涤 0x6da6:rùn # 润 0x6da7:jiàn # æ¶§ 0x6da8:zhÇŽng,zhàng # 涨 0x6da9:sè # æ¶© 0x6daa:fú # 涪 0x6dab:guÄ�n # æ¶« 0x6dac:xìng # 涬 0x6dad:shòu,tÄ�o # æ¶­ 0x6dae:shuàn # æ¶® 0x6daf:yá # 涯 0x6db0:chuò # æ¶° 0x6db1:zhàng # æ¶± 0x6db2:yè # æ¶² 0x6db3:kÅ�ng,náng # æ¶³ 0x6db4:wÇŽn,wò,yuÄ�n # æ¶´ 0x6db5:hán # æ¶µ 0x6db6:tuÅ�,tuò # æ¶¶ 0x6db7:dÅ�ng # æ¶· 0x6db8:hé # 涸 0x6db9:wÅ� # æ¶¹ 0x6dba:jÅ« # 涺 0x6dbb:shè # æ¶» 0x6dbc:liáng,liàng # æ¶¼ 0x6dbd:hÅ«n # æ¶½ 0x6dbe:tà # æ¶¾ 0x6dbf:zhuÅ� # æ¶¿ 0x6dc0:diàn # æ·€ 0x6dc1:qiè,jí # æ·� 0x6dc2:dé # æ·‚ 0x6dc3:juàn # æ·ƒ 0x6dc4:zÄ« # æ·„ 0x6dc5:xÄ« # æ·… 0x6dc6:xiáo # æ·† 0x6dc7:qí # æ·‡ 0x6dc8:gÇ” # æ·ˆ 0x6dc9:guÇ’,guàn # æ·‰ 0x6dca:yÄ�n # æ·Š 0x6dcb:lín,lìn # æ·‹ 0x6dcc:tÇŽng,chÇŽng # æ·Œ 0x6dcd:zhÅ�u # æ·� 0x6dce:pÄ›ng # æ·Ž 0x6dcf:hào # æ·� 0x6dd0:chÄ�ng # æ·� 0x6dd1:shÅ« # æ·‘ 0x6dd2:qÄ« # æ·’ 0x6dd3:fÄ�ng # æ·“ 0x6dd4:zhí # æ·” 0x6dd5:lù # æ·• 0x6dd6:nào,chuò,zhuÅ� # æ·– 0x6dd7:jú # æ·— 0x6dd8:táo # æ·˜ 0x6dd9:cóng # æ·™ 0x6dda:lèi # æ·š 0x6ddb:zhè # æ·› 0x6ddc:píng,péng # æ·œ 0x6ddd:féi # æ·� 0x6dde:sÅ�ng # æ·ž 0x6ddf:tiÇŽn # æ·Ÿ 0x6de0:pì,pèi # æ·  0x6de1:dàn # æ·¡ 0x6de2:yù,xù # æ·¢ 0x6de3:ní # æ·£ 0x6de4:yÅ« # æ·¤ 0x6de5:lù # æ·¥ 0x6de6:gàn # æ·¦ 0x6de7:mì # æ·§ 0x6de8:jìng,chÄ“ng # æ·¨ 0x6de9:líng # æ·© 0x6dea:lún # æ·ª 0x6deb:yín # æ·« 0x6dec:cuì # æ·¬ 0x6ded:qú # æ·­ 0x6dee:huái # æ·® 0x6def:yù # æ·¯ 0x6df0:niÇŽn,shÄ›n # æ·° 0x6df1:shÄ“n # æ·± 0x6df2:biÄ�o,hÇ” # æ·² 0x6df3:chún,zhÅ«n # æ·³ 0x6df4:hÅ« # æ·´ 0x6df5:yuÄ�n # æ·µ 0x6df6:lái # æ·¶ 0x6df7:hùn,hún # æ·· 0x6df8:qÄ«ng # æ·¸ 0x6df9:yÄ�n # æ·¹ 0x6dfa:qiÇŽn # æ·º 0x6dfb:tiÄ�n # æ·» 0x6dfc:miÇŽo # æ·¼ 0x6dfd:zhÇ� # æ·½ 0x6dfe:yÇ�n # æ·¾ 0x6dff:bó # æ·¿ 0x6e00:bèn # 渀 0x6e01:yuÄ�n # æ¸� 0x6e02:wèn,mín # 渂 0x6e03:ruò,rè,luò # 渃 0x6e04:fÄ“i # 渄 0x6e05:qÄ«ng # 清 0x6e06:yuÄ�n # 渆 0x6e07:kÄ› # 渇 0x6e08:jì,jÇ� # 済 0x6e09:shè # 渉 0x6e0a:yuÄ�n # 渊 0x6e0c:lù # 渌 0x6e0d:zì # æ¸� 0x6e0e:dú,dòu # 渎 0x6e10:jiàn,jiÄ�n # æ¸� 0x6e11:miÇŽn,shéng # 渑 0x6e12:pài # 渒 0x6e14:yú # 渔 0x6e15:yuÄ�n # 渕 0x6e16:shÄ›n # 渖 0x6e17:shèn # 渗 0x6e18:róu # 渘 0x6e19:huàn # 渙 0x6e1a:zhÇ” # 渚 0x6e1b:jiÇŽn # 減 0x6e1c:nuÇŽn,nuán # 渜 0x6e1d:yú # æ¸� 0x6e1e:qiú,wù # 渞 0x6e1f:tíng,tÄ«ng # 渟 0x6e20:qú,jù # 渠 0x6e21:dù # 渡 0x6e22:fÄ“ng # 渢 0x6e23:zhÄ� # 渣 0x6e24:bó # 渤 0x6e25:wò # 渥 0x6e26:wÅ�,guÅ� # 渦 0x6e27:tí,dÄ«,dì # 渧 0x6e28:wÄ›i # 渨 0x6e29:wÄ“n # 温 0x6e2a:rú # 渪 0x6e2b:xiè # 渫 0x6e2c:cè # 測 0x6e2d:wèi # 渭 0x6e2e:hé # 渮 0x6e2f:gÇŽng,jiÇŽng # 港 0x6e30:yÄ�n,yÇŽn # 渰 0x6e31:hóng # 渱 0x6e32:xuàn # 渲 0x6e33:mÇ� # 渳 0x6e34:kÄ› # 渴 0x6e35:máo # 渵 0x6e36:yÄ«ng # 渶 0x6e37:yÇŽn # 渷 0x6e38:yóu # 游 0x6e39:hÅ�ng,qìng # 渹 0x6e3a:miÇŽo # 渺 0x6e3b:shÄ›ng # 渻 0x6e3c:mÄ›i # 渼 0x6e3d:zÄ�i # 渽 0x6e3e:hún # 渾 0x6e3f:nài # 渿 0x6e40:guÇ� # æ¹€ 0x6e41:chì # æ¹� 0x6e42:è # 湂 0x6e43:pài # 湃 0x6e44:méi # 湄 0x6e45:liàn # æ¹… 0x6e46:qì # 湆 0x6e47:qì # 湇 0x6e48:méi # 湈 0x6e49:tián # 湉 0x6e4a:còu # 湊 0x6e4b:wéi # 湋 0x6e4c:cÄ�n # 湌 0x6e4d:tuÄ�n # æ¹� 0x6e4e:miÇŽn # 湎 0x6e4f:huì,mÇ�n,xÅ« # æ¹� 0x6e50:pò # æ¹� 0x6e51:xÇ”,xÅ« # 湑 0x6e52:jí # æ¹’ 0x6e53:pén # 湓 0x6e54:jiÄ�n # æ¹” 0x6e55:jiÇŽn # 湕 0x6e56:hú # æ¹– 0x6e57:fèng # æ¹— 0x6e58:xiÄ�ng # 湘 0x6e59:yì # æ¹™ 0x6e5a:yìn # 湚 0x6e5b:zhàn # æ¹› 0x6e5c:shí # 湜 0x6e5d:jiÄ“ # æ¹� 0x6e5e:zhÄ“n # 湞 0x6e5f:huáng # 湟 0x6e60:tàn # æ¹  0x6e61:yú # 湡 0x6e62:bì # æ¹¢ 0x6e63:mÇ�n,hÅ«n # æ¹£ 0x6e64:shÄ« # 湤 0x6e65:tÅ« # æ¹¥ 0x6e66:shÄ“ng # 湦 0x6e67:yÇ’ng # æ¹§ 0x6e68:jú # 湨 0x6e69:dòng # 湩 0x6e6b:qiÅ«,jiÇŽo # 湫 0x6e6c:qiÅ«,jiÇŽo # 湬 0x6e6e:yÄ�n,yÄ«n # æ¹® 0x6e6f:tÄ�ng,shÄ�ng # 湯 0x6e70:lóng # æ¹° 0x6e71:huò # æ¹± 0x6e72:yuán # æ¹² 0x6e73:nÇŽn # æ¹³ 0x6e74:bàn,pán # æ¹´ 0x6e75:yÇ’u # æ¹µ 0x6e76:quán # æ¹¶ 0x6e77:zhuÄ�ng,hún # æ¹· 0x6e78:liàng # 湸 0x6e79:chán # æ¹¹ 0x6e7a:xián # 湺 0x6e7b:chún # æ¹» 0x6e7c:niè # æ¹¼ 0x6e7d:zÄ« # æ¹½ 0x6e7e:wÄ�n # æ¹¾ 0x6e7f:shÄ« # 湿 0x6e80:mÇŽn # 満 0x6e81:yíng # æº� 0x6e83:kuì,huì # 溃 0x6e85:jiàn,jiÄ�n # 溅 0x6e86:xù # 溆 0x6e87:lóu # 溇 0x6e88:wéi # 溈 0x6e89:gài # 溉 0x6e8c:pÅ� # 溌 0x6e8d:jìn # æº� 0x6e8e:yàn,guì # 溎 0x6e8f:táng # æº� 0x6e90:yuán # æº� 0x6e91:suÇ’ # 溑 0x6e92:yuán # 溒 0x6e93:lián,liÇŽn,nián,xián,xiàn # 溓 0x6e94:yÇŽo # 溔 0x6e95:méng # 溕 0x6e96:zhÇ”n # 準 0x6e97:chéng # 溗 0x6e98:kè # 溘 0x6e99:tài # 溙 0x6e9a:dá,tÇŽ # 溚 0x6e9b:wÄ� # 溛 0x6e9c:liÅ«,liù # 溜 0x6e9d:gÅ�u # æº� 0x6e9e:sÄ�o # 溞 0x6e9f:míng # 溟 0x6ea0:zhà # 溠 0x6ea1:shí # 溡 0x6ea2:yì # 溢 0x6ea3:lùn # 溣 0x6ea4:mÇŽ # 溤 0x6ea5:pÇ” # 溥 0x6ea6:wÄ“i # 溦 0x6ea7:lì # 溧 0x6ea8:zÄ�i # 溨 0x6ea9:wù # 溩 0x6eaa:xÄ« # 溪 0x6eab:wÄ“n # 溫 0x6eac:qiÄ�ng # 溬 0x6ead:zé # 溭 0x6eae:shÄ« # 溮 0x6eaf:sù # 溯 0x6eb0:ái # 溰 0x6eb1:zhÄ“n,qín # 溱 0x6eb2:sÅ�u # 溲 0x6eb3:yún # 溳 0x6eb4:xiù # 溴 0x6eb5:yÄ«n # 溵 0x6eb6:róng # 溶 0x6eb7:hùn # 溷 0x6eb8:sù # 溸 0x6eb9:suò # 溹 0x6eba:nì,niào # 溺 0x6ebb:tÄ� # 溻 0x6ebc:shÄ« # 溼 0x6ebd:rù # 溽 0x6ebe:Ä�i # 溾 0x6ebf:pàn # 溿 0x6ec0:chù,xù # 滀 0x6ec1:chú # æ»� 0x6ec2:pÄ�ng # 滂 0x6ec3:wÄ›ng,wÄ“ng # 滃 0x6ec4:cÄ�ng # 滄 0x6ec5:miè # æ»… 0x6ec6:gé # 滆 0x6ec7:diÄ�n # 滇 0x6ec8:hào,xuè # 滈 0x6ec9:huàng # 滉 0x6eca:qì,xì,xiÄ“ # 滊 0x6ecb:zÄ« # 滋 0x6ecc:dí # 滌 0x6ecd:zhì # æ»� 0x6ece:xíng,yíng # 滎 0x6ecf:fÇ” # æ»� 0x6ed0:jié # æ»� 0x6ed1:huá # 滑 0x6ed2:gÄ“ # æ»’ 0x6ed3:zÇ� # 滓 0x6ed4:tÄ�o # æ»” 0x6ed5:téng # 滕 0x6ed6:suÄ« # æ»– 0x6ed7:bì # æ»— 0x6ed8:jiào # 滘 0x6ed9:huì # æ»™ 0x6eda:gÇ”n # 滚 0x6edb:yín # æ»› 0x6edc:zé,hào # 滜 0x6edd:lóng # æ»� 0x6ede:zhì # 滞 0x6edf:yàn # 滟 0x6ee0:shè # æ»  0x6ee1:mÇŽn # 满 0x6ee2:yíng # 滢 0x6ee3:chún # 滣 0x6ee4:lÇœ # 滤 0x6ee5:làn # 滥 0x6ee6:luán # 滦 0x6ee8:bÄ«n # 滨 0x6ee9:tÄ�n # 滩 0x6eea:yù # 滪 0x6eeb:xiÇ” # 滫 0x6eec:hù # 滬 0x6eed:bì # æ»­ 0x6eee:biÄ�o # æ»® 0x6eef:zhì # 滯 0x6ef0:jiàng # æ»° 0x6ef1:kòu # æ»± 0x6ef2:shèn # 滲 0x6ef3:shÄ�ng # 滳 0x6ef4:dÄ« # æ»´ 0x6ef5:mì # 滵 0x6ef6:áo # æ»¶ 0x6ef7:lÇ” # æ»· 0x6ef8:hÇ”,xÇ” # 滸 0x6ef9:hÅ« # 滹 0x6efa:yÅ�u # 滺 0x6efb:chÇŽn # æ»» 0x6efc:fàn # 滼 0x6efd:yÅ�ng # 滽 0x6efe:gÇ”n # 滾 0x6eff:mÇŽn # 滿 0x6f00:qÇ�ng # æ¼€ 0x6f01:yú # æ¼� 0x6f02:piÄ�o,piÇŽo,piào # 漂 0x6f03:jì # 漃 0x6f04:yá # 漄 0x6f05:cháo # æ¼… 0x6f06:qÄ« # 漆 0x6f07:xÇ� # 漇 0x6f08:jì # 漈 0x6f09:lù # 漉 0x6f0a:lóu # 漊 0x6f0b:lóng # 漋 0x6f0c:jÇ�n # 漌 0x6f0d:guó # æ¼� 0x6f0e:cóng,sÇ’ng # 漎 0x6f0f:lòu # æ¼� 0x6f10:zhí # æ¼� 0x6f11:gài # 漑 0x6f12:qiáng # æ¼’ 0x6f13:lí # 漓 0x6f14:yÇŽn # æ¼” 0x6f15:cáo # 漕 0x6f16:jiào # æ¼– 0x6f17:cÅ�ng # æ¼— 0x6f18:chún # 漘 0x6f19:tuán,zhuÄ�n # æ¼™ 0x6f1a:òu,Å�u # 漚 0x6f1b:téng # æ¼› 0x6f1c:yÄ› # 漜 0x6f1d:xí # æ¼� 0x6f1e:mì # 漞 0x6f1f:táng # 漟 0x6f20:mò # æ¼  0x6f21:shÄ�ng # 漡 0x6f22:hàn # æ¼¢ 0x6f23:lián # æ¼£ 0x6f24:lÇŽn # 漤 0x6f25:wÄ� # æ¼¥ 0x6f26:chí # 漦 0x6f27:gÄ�n # æ¼§ 0x6f28:féng,péng # 漨 0x6f29:xuán # 漩 0x6f2a:yÄ« # 漪 0x6f2b:màn # 漫 0x6f2c:zì # 漬 0x6f2d:mÇŽng # æ¼­ 0x6f2e:kÄ�ng # æ¼® 0x6f2f:luò,tà # 漯 0x6f30:bÄ“n,pÄ“ng # æ¼° 0x6f31:shù # æ¼± 0x6f32:zhÇŽng,zhàng # æ¼² 0x6f33:zhÄ�ng # æ¼³ 0x6f34:chóng,zhuàng # æ¼´ 0x6f35:xù # æ¼µ 0x6f36:huàn # æ¼¶ 0x6f37:huÇ’,huò,kuò # æ¼· 0x6f38:jiàn,jiÄ�n # 漸 0x6f39:yÄ�n # æ¼¹ 0x6f3a:shuÇŽng # 漺 0x6f3b:liáo,liú # æ¼» 0x6f3c:cuÇ�,cuÄ« # æ¼¼ 0x6f3d:tí # æ¼½ 0x6f3e:yàng # æ¼¾ 0x6f3f:jiÄ�ng,jiàng # 漿 0x6f40:cóng,zÇ’ng # æ½€ 0x6f41:yÇ�ng # æ½� 0x6f42:hóng # 潂 0x6f43:xiÇ” # 潃 0x6f44:shù # 潄 0x6f45:guàn # æ½… 0x6f46:yíng # 潆 0x6f47:xiÄ�o # 潇 0x6f4a:xù # 潊 0x6f4b:liàn # 潋 0x6f4c:zhì # 潌 0x6f4d:wéi # æ½� 0x6f4e:pì,piÄ“ # 潎 0x6f4f:yù # æ½� 0x6f50:jiào,qiáo # æ½� 0x6f51:pÅ� # 潑 0x6f52:dàng,xiàng # æ½’ 0x6f53:huì # 潓 0x6f54:jié # æ½” 0x6f55:wÇ” # 潕 0x6f56:pá # æ½– 0x6f57:jí # æ½— 0x6f58:pÄ�n # 潘 0x6f59:wéi # æ½™ 0x6f5a:sù # 潚 0x6f5b:qián # æ½› 0x6f5c:qián # 潜 0x6f5d:xÄ«,yà # æ½� 0x6f5e:lù # 潞 0x6f5f:xì # 潟 0x6f60:xùn,sùn # æ½  0x6f61:dùn # 潡 0x6f62:huáng,guÄ�ng # æ½¢ 0x6f63:mÇ�n # æ½£ 0x6f64:rùn # 潤 0x6f65:sù # æ½¥ 0x6f66:lÇŽo,lào,liáo # 潦 0x6f67:zhÄ“n # æ½§ 0x6f68:cÅ�ng,zòng # 潨 0x6f69:yì # 潩 0x6f6a:zhí,zhì # 潪 0x6f6b:wÄ�n # 潫 0x6f6c:tÄ�n,shàn # 潬 0x6f6d:tán # æ½­ 0x6f6e:cháo # æ½® 0x6f6f:xún # 潯 0x6f70:kuì,huì # æ½° 0x6f72:shào # æ½² 0x6f73:tú,zhÄ� # æ½³ 0x6f74:zhÅ« # æ½´ 0x6f75:sàn,sÇŽ # æ½µ 0x6f76:hÄ“i # æ½¶ 0x6f77:bì # æ½· 0x6f78:shÄ�n # 潸 0x6f79:chán # æ½¹ 0x6f7a:chán # 潺 0x6f7b:shÇ” # æ½» 0x6f7c:tóng # æ½¼ 0x6f7d:pÅ« # æ½½ 0x6f7e:lín # æ½¾ 0x6f7f:wéi # 潿 0x6f80:sè # æ¾€ 0x6f81:sè # æ¾� 0x6f82:chéng # 澂 0x6f83:jiÇ’ng # 澃 0x6f84:chéng,dèng # 澄 0x6f85:huà # æ¾… 0x6f86:jiÄ�o # 澆 0x6f87:lào # 澇 0x6f88:chè # 澈 0x6f89:gÇŽn # 澉 0x6f8a:cÅ«n,cún # 澊 0x6f8b:jÇ�ng # 澋 0x6f8c:sÄ« # 澌 0x6f8d:shù,zhù # æ¾� 0x6f8e:péng # 澎 0x6f8f:hán # æ¾� 0x6f90:yún # æ¾� 0x6f91:liÅ«,liù # 澑 0x6f92:hòng,gÇ’ng # æ¾’ 0x6f93:fú # 澓 0x6f94:hào # æ¾” 0x6f95:hé # 澕 0x6f96:xián # æ¾– 0x6f97:jiàn # æ¾— 0x6f98:shÄ�n # 澘 0x6f99:xì # æ¾™ 0x6f9c:lán # 澜 0x6f9e:yú # 澞 0x6f9f:lÇ�n # 澟 0x6fa0:miÇŽn,shéng # æ¾  0x6fa1:zÇŽo # 澡 0x6fa2:dÄ�ng # æ¾¢ 0x6fa3:huàn # æ¾£ 0x6fa4:zé,shì # 澤 0x6fa5:xiè # æ¾¥ 0x6fa6:yù # 澦 0x6fa7:lÇ� # æ¾§ 0x6fa8:shì # 澨 0x6fa9:xué # 澩 0x6faa:líng # 澪 0x6fab:wàn,màn # 澫 0x6fac:zÄ« # 澬 0x6fad:yÅ�ng,yÇ’ng # æ¾­ 0x6fae:kuài,huì # æ¾® 0x6faf:càn # 澯 0x6fb0:liàn # æ¾° 0x6fb1:diàn # æ¾± 0x6fb2:yè # æ¾² 0x6fb3:ào # æ¾³ 0x6fb4:huán # æ¾´ 0x6fb5:zhÄ“n # æ¾µ 0x6fb6:chán # æ¾¶ 0x6fb7:màn # æ¾· 0x6fb8:gÇŽn # 澸 0x6fb9:dàn,tán # æ¾¹ 0x6fba:yì # 澺 0x6fbb:suì # æ¾» 0x6fbc:pì # æ¾¼ 0x6fbd:jù # æ¾½ 0x6fbe:tà # æ¾¾ 0x6fbf:qín # 澿 0x6fc0:jÄ« # æ¿€ 0x6fc1:zhuó # æ¿� 0x6fc2:lián # æ¿‚ 0x6fc3:nóng # 濃 0x6fc4:guÅ�,wÅ� # æ¿„ 0x6fc5:jìn # æ¿… 0x6fc6:fén,pÄ“n # 濆 0x6fc7:sè # 濇 0x6fc8:jí,shà # 濈 0x6fc9:suÄ« # 濉 0x6fca:huì,huò # 濊 0x6fcb:chÇ” # æ¿‹ 0x6fcc:tà # 濌 0x6fcd:sÅ�ng # æ¿� 0x6fce:dÇ�ng,tìng # 濎 0x6fd0:zhÇ” # æ¿� 0x6fd1:lài # æ¿‘ 0x6fd2:bÄ«n # æ¿’ 0x6fd3:lián # æ¿“ 0x6fd4:mÇ�,nÇ� # æ¿” 0x6fd5:shÄ« # æ¿• 0x6fd6:shù # æ¿– 0x6fd7:mì # æ¿— 0x6fd8:nìng # 濘 0x6fd9:yíng # æ¿™ 0x6fda:yíng # 濚 0x6fdb:méng # æ¿› 0x6fdc:jìn # 濜 0x6fdd:qí # æ¿� 0x6fde:bì,pì # 濞 0x6fdf:jì,jÇ� # 濟 0x6fe0:háo # æ¿  0x6fe1:rú # æ¿¡ 0x6fe2:cuì,zuÇ� # æ¿¢ 0x6fe3:wò # æ¿£ 0x6fe4:tÄ�o # 濤 0x6fe5:yÇ�n # æ¿¥ 0x6fe6:yÄ«n # 濦 0x6fe7:duì # æ¿§ 0x6fe8:cí # 濨 0x6fe9:huò,hù # æ¿© 0x6fea:qìng # 濪 0x6feb:làn # æ¿« 0x6fec:jùn,xùn # 濬 0x6fed:ÇŽi,kài,kè # æ¿­ 0x6fee:pú # æ¿® 0x6fef:zhuó,zhào # 濯 0x6ff0:wéi # æ¿° 0x6ff1:bÄ«n # 濱 0x6ff2:gÇ” # 濲 0x6ff3:qián # 濳 0x6ff4:yíng # æ¿´ 0x6ff6:kuò # æ¿¶ 0x6ff7:fèi # æ¿· 0x6ffa:jiàn,jiÄ�n # 濺 0x6ffb:wÄ›i,duì # æ¿» 0x6ffc:luò,pÅ� # 濼 0x6ffd:zàn,cuán # 濽 0x6ffe:lÇœ # 濾 0x6fff:lì # æ¿¿ 0x7000:yÅ�u # 瀀 0x7001:yÇŽng,yàng # ç€� 0x7002:lÇ” # 瀂 0x7003:sì # 瀃 0x7004:zhì # 瀄 0x7005:yíng # 瀅 0x7006:dú,dòu # 瀆 0x7007:wÇŽng,wÄ�ng # 瀇 0x7008:huÄ« # 瀈 0x7009:xiè # 瀉 0x700a:pán # 瀊 0x700b:shÄ›n # 瀋 0x700c:biÄ�o # 瀌 0x700d:chán # ç€� 0x700e:miè,mò # 瀎 0x700f:liú # ç€� 0x7010:jiÄ�n # ç€� 0x7011:pù,bào # 瀑 0x7012:sè # 瀒 0x7013:chéng,dèng # 瀓 0x7014:gÇ” # 瀔 0x7015:bÄ«n # 瀕 0x7016:huò # 瀖 0x7017:xiàn # 瀗 0x7018:lú # 瀘 0x7019:qìn # 瀙 0x701a:hàn # 瀚 0x701b:yíng # 瀛 0x701c:róng # 瀜 0x701d:lì # ç€� 0x701e:jìng # 瀞 0x701f:xiÄ�o # 瀟 0x7020:yíng # 瀠 0x7021:suÇ� # 瀡 0x7022:wÄ›i,duì # 瀢 0x7023:xiè # 瀣 0x7024:huái,wÄ�i # 瀤 0x7025:xuè # 瀥 0x7026:zhÅ« # 瀦 0x7027:lóng,shuÄ�ng # 瀧 0x7028:lài # 瀨 0x7029:duì # 瀩 0x702a:fàn # 瀪 0x702b:hú # 瀫 0x702c:lài # 瀬 0x702f:yíng # 瀯 0x7030:mí # 瀰 0x7031:jì # 瀱 0x7032:liàn # 瀲 0x7033:jiàn,zùn # 瀳 0x7034:yÄ«ng,yÇ�ng,yìng # 瀴 0x7035:fèn # 瀵 0x7036:lín # 瀶 0x7037:yì # 瀷 0x7038:jiÄ�n # 瀸 0x7039:yuè # 瀹 0x703a:chán # 瀺 0x703b:dài # 瀻 0x703c:ráng,nÇŽng # 瀼 0x703d:jiÇŽn # 瀽 0x703e:lán # 瀾 0x703f:fán # 瀿 0x7040:shuàng # ç�€ 0x7041:yuÄ�n # ç�� 0x7042:zhuó,jiào,zé # ç�‚ 0x7043:fÄ“ng # ç�ƒ 0x7044:shè # ç�„ 0x7045:lÄ›i # ç�… 0x7046:lán # ç�† 0x7047:cóng # ç�‡ 0x7048:qú # ç�ˆ 0x7049:yÅ�ng # ç�‰ 0x704a:qián # ç�Š 0x704b:fÇŽ # ç�‹ 0x704c:guàn # ç�Œ 0x704d:jué # ç�� 0x704e:yàn # ç�Ž 0x704f:hào # ç�� 0x7051:sÇŽ # ç�‘ 0x7052:zàn,cuán # ç�’ 0x7053:luán,luàn # ç�“ 0x7054:yàn # ç�” 0x7055:lí # ç�• 0x7056:mÇ� # ç�– 0x7057:shàn # ç�— 0x7058:tÄ�n # ç�˜ 0x7059:dÇŽng,tÇŽng # ç�™ 0x705a:jiÇŽo # ç�š 0x705b:chÇŽn # ç�› 0x705d:hào # ç�� 0x705e:bà # ç�ž 0x705f:zhú # ç�Ÿ 0x7060:lÇŽn # ç�  0x7061:lán # ç�¡ 0x7062:nÇŽng # ç�¢ 0x7063:wÄ�n # ç�£ 0x7064:luán # ç�¤ 0x7065:xún,quán,quàn # ç�¥ 0x7066:xiÇŽn # ç�¦ 0x7067:yàn # ç�§ 0x7068:gàn # ç�¨ 0x7069:yàn # ç�© 0x706a:yù # ç�ª 0x706b:huÇ’ # ç�« 0x706c:huÇ’,biÄ�o # ç�¬ 0x706d:miè # ç�­ 0x706e:guÄ�ng # ç�® 0x706f:dÄ“ng # ç�¯ 0x7070:huÄ« # ç�° 0x7071:xiÄ�o # ç�± 0x7072:xiÄ�o # ç�² 0x7074:hÅ�ng # ç�´ 0x7075:líng # ç�µ 0x7076:zào # ç�¶ 0x7077:zhuàn # ç�· 0x7078:jiÇ” # ç�¸ 0x7079:zhà,yù # ç�¹ 0x707a:xiè # ç�º 0x707b:chì # ç�» 0x707c:zhuó # ç�¼ 0x707d:zÄ�i # ç�½ 0x707e:zÄ�i # ç�¾ 0x707f:càn # ç�¿ 0x7080:yáng # ç‚€ 0x7081:qì # ç‚� 0x7082:zhÅ�ng # ç‚‚ 0x7083:fén,bèn # 炃 0x7084:niÇ” # ç‚„ 0x7085:jiÇ’ng,guì # ç‚… 0x7086:wén # 炆 0x7087:pÅ« # 炇 0x7088:yì # 炈 0x7089:lú # 炉 0x708a:chuÄ« # 炊 0x708b:pÄ« # ç‚‹ 0x708c:kài # 炌 0x708d:pàn # ç‚� 0x708e:yán # 炎 0x708f:yán # ç‚� 0x7090:pàng,fÄ“ng # ç‚� 0x7091:mù # ç‚‘ 0x7092:chÇŽo # ç‚’ 0x7093:liào # ç‚“ 0x7094:quÄ“,guì # ç‚” 0x7095:kàng # ç‚• 0x7096:dùn # ç‚– 0x7097:guÄ�ng # ç‚— 0x7098:xìn # 炘 0x7099:zhì # ç‚™ 0x709b:guÄ�ng # ç‚› 0x709c:wÄ›i # 炜 0x709d:qiàng # ç‚� 0x709f:dá # 炟 0x70a0:xiá # ç‚  0x70a1:zhÄ“ng # ç‚¡ 0x70a2:zhú # ç‚¢ 0x70a3:kÄ› # ç‚£ 0x70a4:zhào,zhÄ�o # 炤 0x70a5:fú # ç‚¥ 0x70a6:bá # 炦 0x70a7:xiè # ç‚§ 0x70a8:xiè # 炨 0x70a9:lìng # ç‚© 0x70aa:zhuÅ�,chù # 炪 0x70ab:xuàn # ç‚« 0x70ac:jù # 炬 0x70ad:tàn # ç‚­ 0x70ae:páo,bÄ�o,pào # ç‚® 0x70af:jiÇ’ng # 炯 0x70b0:páo,fÇ’u # ç‚° 0x70b1:tái # 炱 0x70b2:tái # 炲 0x70b3:bÇ�ng # 炳 0x70b4:yÇŽng # ç‚´ 0x70b5:tÅ�ng # 炵 0x70b6:shÇŽn,qián,shÄ�n # ç‚¶ 0x70b7:zhù # ç‚· 0x70b8:zhà,zhá # 炸 0x70b9:diÇŽn # 点 0x70ba:wéi,wèi # 為 0x70bb:shí # ç‚» 0x70bc:liàn # 炼 0x70bd:chì # 炽 0x70be:huÇŽng # 炾 0x70c0:hÅ« # 烀 0x70c1:shuò # çƒ� 0x70c2:làn # 烂 0x70c3:tÄ«ng # 烃 0x70c4:jiÇŽo,yào # 烄 0x70c5:xù # 烅 0x70c6:héng # 烆 0x70c7:quÇŽn # 烇 0x70c8:liè # 烈 0x70c9:huàn # 烉 0x70ca:yáng,yàng # 烊 0x70cb:xiÄ�o # 烋 0x70cc:xiÅ« # 烌 0x70cd:xiÇŽn # çƒ� 0x70ce:yín # 烎 0x70cf:wÅ« # çƒ� 0x70d0:zhÅ�u # çƒ� 0x70d1:yáo # 烑 0x70d2:shì # 烒 0x70d3:wÄ“i # 烓 0x70d4:tóng,dòng # 烔 0x70d5:miè # 烕 0x70d6:zÄ�i # 烖 0x70d7:kài # 烗 0x70d8:hÅ�ng # 烘 0x70d9:lào,luò # 烙 0x70da:xiá # 烚 0x70db:zhú # 烛 0x70dc:xuÇŽn # 烜 0x70dd:zhÄ“ng # çƒ� 0x70de:pò # 烞 0x70df:yÄ�n # 烟 0x70e0:huí,huÇ� # 烠 0x70e1:guÄ�ng # 烡 0x70e2:chè # 烢 0x70e3:huÄ« # 烣 0x70e4:kÇŽo # 烤 0x70e6:fán # 烦 0x70e7:shÄ�o # 烧 0x70e8:yè # 烨 0x70e9:huì # 烩 0x70eb:tàng # 烫 0x70ec:jìn # 烬 0x70ed:rè # 热 0x70ef:xÄ« # 烯 0x70f0:fú,páo # 烰 0x70f1:jiÇ’ng # 烱 0x70f2:xiè,chè # 烲 0x70f3:pÇ” # 烳 0x70f4:tÄ«ng # 烴 0x70f5:zhuó # 烵 0x70f6:tÇ�ng # 烶 0x70f7:wán # 烷 0x70f8:hÇŽi # 烸 0x70f9:pÄ“ng # 烹 0x70fa:lÇŽng # 烺 0x70fb:yàn # 烻 0x70fc:xù # 烼 0x70fd:fÄ“ng # 烽 0x70fe:chì # 烾 0x70ff:róng # 烿 0x7100:hú # ç„€ 0x7102:shÅ« # ç„‚ 0x7103:hè # 焃 0x7104:xÅ«n,hÅ«n # ç„„ 0x7105:kù # ç„… 0x7106:juÄ�n,yè # 焆 0x7107:xiÄ�o # 焇 0x7108:xÄ« # 焈 0x7109:yÄ�n # 焉 0x710a:hàn # 焊 0x710b:zhuàng # ç„‹ 0x710c:qÅ«,jùn # 焌 0x710d:dì # ç„� 0x710e:xiè,chè # 焎 0x710f:jí,qì # ç„� 0x7110:wù # ç„� 0x7113:hán # ç„“ 0x7114:yàn # ç„” 0x7115:huàn # ç„• 0x7116:mèn # ç„– 0x7117:jú # ç„— 0x7118:dào,tÄ�o # 焘 0x7119:bèi # ç„™ 0x711a:fén # 焚 0x711b:lìn # ç„› 0x711c:kÅ«n # 焜 0x711d:hùn # ç„� 0x711e:tÅ«n # 焞 0x711f:xÄ« # 焟 0x7120:cuì # ç„  0x7121:wú,mó # ç„¡ 0x7122:hÅ�ng # ç„¢ 0x7123:chÇŽo,jù # ç„£ 0x7124:fÇ” # 焤 0x7125:wò,ài # ç„¥ 0x7126:jiÄ�o # 焦 0x7127:zÇ’ng,cÅ�ng # ç„§ 0x7128:fèng # 焨 0x7129:píng # ç„© 0x712a:qióng # 焪 0x712b:ruò # ç„« 0x712c:xÄ«,yì # 焬 0x712d:qióng # ç„­ 0x712e:xìn # ç„® 0x712f:zhuÅ�,chÄ�o # 焯 0x7130:yàn # ç„° 0x7131:yàn # 焱 0x7132:yì # 焲 0x7133:jué # 焳 0x7134:yù # ç„´ 0x7135:gàng # 焵 0x7136:rán # ç„¶ 0x7137:pí # ç„· 0x7138:xiÇ’ng,yÄ«ng # 焸 0x713a:shÄ“ng # 焺 0x713b:chàng # ç„» 0x713c:shÄ�o # 焼 0x713f:gÄ“ng # ç„¿ 0x7141:chén # ç…� 0x7142:hè # ç…‚ 0x7143:kuÇ� # ç…ƒ 0x7144:zhÇ’ng # ç…„ 0x7145:duàn # ç…… 0x7146:xiÄ� # ç…† 0x7147:huÄ«,yùn,xÅ«n # ç…‡ 0x7148:fèng # ç…ˆ 0x7149:liàn # ç…‰ 0x714a:xuÄ�n # ç…Š 0x714b:xÄ«ng # ç…‹ 0x714c:huáng # ç…Œ 0x714d:jiÇŽo,qiÄ�o # ç…� 0x714e:jiÄ�n # ç…Ž 0x714f:bì # ç…� 0x7150:yÄ«ng # ç…� 0x7151:zhÇ” # ç…‘ 0x7152:wÄ›i # ç…’ 0x7153:tuÄ�n # ç…“ 0x7154:shÇŽn,qián,shÄ�n # ç…” 0x7155:xÄ«,yí # ç…• 0x7156:nuÇŽn,xuÄ�n # ç…– 0x7157:nuÇŽn # ç…— 0x7158:chán # ç…˜ 0x7159:yÄ�n # ç…™ 0x715a:jiÇ’ng # ç…š 0x715b:jiÇ’ng # ç…› 0x715c:yù # ç…œ 0x715d:mèi # ç…� 0x715e:shÄ�,shà # ç…ž 0x715f:wèi # ç…Ÿ 0x7160:yè,zhá # ç…  0x7161:jìn # ç…¡ 0x7162:qióng # ç…¢ 0x7163:róu # ç…£ 0x7164:méi # ç…¤ 0x7165:huàn # ç…¥ 0x7166:xù # ç…¦ 0x7167:zhào # ç…§ 0x7168:wÄ“i # ç…¨ 0x7169:fán # ç…© 0x716a:qiú # ç…ª 0x716b:suì # ç…« 0x716c:yáng,yàng # ç…¬ 0x716d:liè # ç…­ 0x716e:zhÇ” # ç…® 0x7170:zào # ç…° 0x7171:guÄ� # ç…± 0x7172:bÄ�o # ç…² 0x7173:hú # ç…³ 0x7174:yÅ«n,yÇ”n # ç…´ 0x7175:nÇŽn # ç…µ 0x7178:biÄ�n # ç…¸ 0x7179:gòu # ç…¹ 0x717a:tuì # ç…º 0x717b:táng # ç…» 0x717c:chÇŽo # ç…¼ 0x717d:shÄ�n # ç…½ 0x717e:Ä“n,yÅ«n # ç…¾ 0x717f:bó # ç…¿ 0x7180:huÇŽng # 熀 0x7181:xié # ç†� 0x7182:xì # 熂 0x7183:wù # 熃 0x7184:xÄ« # 熄 0x7185:yÅ«n,yÇ”n # 熅 0x7186:hé # 熆 0x7187:hè,xiÄ�o # 熇 0x7188:xÄ« # 熈 0x7189:yún # 熉 0x718a:xióng # 熊 0x718b:xióng # 熋 0x718c:shÇŽn # 熌 0x718e:yào # 熎 0x718f:xÅ«n,xùn # ç†� 0x7190:mì # ç†� 0x7191:lián # 熑 0x7192:yíng # 熒 0x7193:wÇ” # 熓 0x7194:róng # 熔 0x7197:qiàng # 熗 0x7198:liÅ« # 熘 0x7199:xÄ« # 熙 0x719a:bì # 熚 0x719b:biÄ�o # 熛 0x719c:cÅ�ng,zÇ’ng # 熜 0x719d:lù,Ä�o # ç†� 0x719e:jiÄ�n # 熞 0x719f:shú,shóu # 熟 0x71a0:yì # 熠 0x71a1:lóu # 熡 0x71a2:péng,fÄ“ng # 熢 0x71a3:suÄ«,cuÇ� # 熣 0x71a4:yì # 熤 0x71a5:tÄ“ng,tÅ�ng # 熥 0x71a6:jué # 熦 0x71a7:zÅ�ng # 熧 0x71a8:yùn,yù # 熨 0x71a9:hù # 熩 0x71aa:yí # 熪 0x71ab:zhì # 熫 0x71ac:Ä�o,áo # 熬 0x71ad:wèi # 熭 0x71ae:liÇ” # 熮 0x71af:hàn,rÇŽn # 熯 0x71b0:Å�u,Ç’u # 熰 0x71b1:rè # 熱 0x71b2:jiÇ’ng # 熲 0x71b3:màn # 熳 0x71b5:shÄ�ng # 熵 0x71b6:cuàn # 熶 0x71b7:zèng # 熷 0x71b8:jiÄ�n # 熸 0x71b9:xÄ« # 熹 0x71ba:xÄ« # 熺 0x71bb:xÄ« # 熻 0x71bc:yì # 熼 0x71bd:xiào # 熽 0x71be:chì # 熾 0x71bf:huáng,huÇŽng # 熿 0x71c0:chÇŽn,dÇŽn,chàn # 燀 0x71c1:yè # ç‡� 0x71c2:tán # 燂 0x71c3:rán # 燃 0x71c4:yàn # 燄 0x71c5:xún # 燅 0x71c6:qiÄ�o # 燆 0x71c7:jùn # 燇 0x71c8:dÄ“ng # 燈 0x71c9:dùn # 燉 0x71ca:shÄ“n # 燊 0x71cb:jiÄ�o,qiáo,jué,zhuó # 燋 0x71cc:fén # 燌 0x71cd:sÄ« # ç‡� 0x71ce:liáo,liÇŽo # 燎 0x71cf:yù # ç‡� 0x71d0:lín # ç‡� 0x71d1:tóng,dòng # 燑 0x71d2:shÄ�o # 燒 0x71d3:fén # 燓 0x71d4:fán # 燔 0x71d5:yàn,yÄ�n # 燕 0x71d6:xún # 燖 0x71d7:làn # 燗 0x71d8:mÄ›i # 燘 0x71d9:tàng # 燙 0x71da:yì # 燚 0x71db:jiÇ’ng # 燛 0x71dc:mèn # 燜 0x71df:yíng # 營 0x71e0:yù # 燠 0x71e1:yì # 燡 0x71e2:xué # 燢 0x71e3:lán # 燣 0x71e4:tài,liè # 燤 0x71e5:zào # 燥 0x71e6:càn # 燦 0x71e7:suì # 燧 0x71e8:xÄ« # 燨 0x71e9:què # 燩 0x71ea:zÇ’ng # 燪 0x71eb:lián # 燫 0x71ec:huÇ� # 燬 0x71ed:zhú # 燭 0x71ee:xiè # 燮 0x71ef:líng # 燯 0x71f0:wÄ“i # 燰 0x71f1:yì # 燱 0x71f2:xié # 燲 0x71f3:zhào # 燳 0x71f4:huì # 燴 0x71f7:lán # 燷 0x71f8:xÅ« # 燸 0x71f9:xiÇŽn # 燹 0x71fa:hè # 燺 0x71fb:xÅ«n # 燻 0x71fc:jìn # 燼 0x71fd:chóu # 燽 0x71fe:dào,tÄ�o # 燾 0x71ff:yào # 燿 0x7200:hè # 爀 0x7201:làn # çˆ� 0x7202:biÄ�o # 爂 0x7203:róng,yíng # 爃 0x7204:lì,liè # 爄 0x7205:mò # 爅 0x7206:bào # 爆 0x7207:ruò # 爇 0x7208:lÇœ # 爈 0x7209:là,liè # 爉 0x720a:Ä�o # 爊 0x720b:xÅ«n,xùn # 爋 0x720c:kuàng,huÇŽng # 爌 0x720d:shuò # çˆ� 0x720f:lì # çˆ� 0x7210:lú # çˆ� 0x7211:jué # 爑 0x7212:liáo,liÇŽo # 爒 0x7213:yàn,xún # 爓 0x7214:xÄ« # 爔 0x7215:xiè # 爕 0x7216:lóng # 爖 0x7217:yè # 爗 0x7219:rÇŽng # 爙 0x721a:yuè # 爚 0x721b:làn # 爛 0x721c:cóng # 爜 0x721d:jué # çˆ� 0x721e:chóng # 爞 0x721f:guàn # 爟 0x7221:chè # 爡 0x7222:mí # 爢 0x7223:tÇŽng # 爣 0x7224:làn # 爤 0x7225:zhú # 爥 0x7227:líng # 爧 0x7228:cuàn # 爨 0x7229:yù # 爩 0x722a:zhÇŽo,zhuÇŽ # 爪 0x722c:pá # 爬 0x722d:zhÄ“ng # 爭 0x722e:páo # 爮 0x722f:chÄ“ng,chèn # 爯 0x7230:yuán # 爰 0x7231:ài # 爱 0x7232:wéi,wèi # 爲 0x7234:jué # 爴 0x7235:jué # 爵 0x7236:fù,fÇ” # 父 0x7237:yé # 爷 0x7238:bà # 爸 0x7239:diÄ“ # 爹 0x723a:yé # 爺 0x723b:yáo # 爻 0x723c:zÇ” # 爼 0x723d:shuÇŽng # 爽 0x723e:Ä›r # 爾 0x723f:pán # 爿 0x7240:chuáng # 牀 0x7241:kÄ“ # ç‰� 0x7242:zÄ�ng # 牂 0x7243:dié # 牃 0x7244:qiÄ�ng # 牄 0x7245:yÅ�ng # 牅 0x7246:qiáng # 牆 0x7247:piàn,piÄ�n # 片 0x7248:bÇŽn # 版 0x7249:pàn # 牉 0x724a:cháo # 牊 0x724b:jiÄ�n # 牋 0x724c:pái # 牌 0x724d:dú # ç‰� 0x724e:chuÄ�ng # 牎 0x724f:yú # ç‰� 0x7250:zhá # ç‰� 0x7251:biÄ�n,miàn # 牑 0x7252:dié # 牒 0x7253:bÇŽng # 牓 0x7254:bó # 牔 0x7255:chuÄ�ng # 牕 0x7256:yÇ’u # 牖 0x7258:dú # 牘 0x7259:yá # 牙 0x725a:chÄ“ng,chèng # 牚 0x725b:niú # 牛 0x725d:pìn # ç‰� 0x725e:jiÅ«,lè # 牞 0x725f:móu,mù # 牟 0x7260:tÄ� # 牠 0x7261:mÇ” # 牡 0x7262:láo # 牢 0x7263:rèn # 牣 0x7264:mÄ�ng # 牤 0x7265:fÄ�ng # 牥 0x7266:máo # 牦 0x7267:mù # 牧 0x7268:gÄ�ng # 牨 0x7269:wù # 物 0x726a:yàn # 牪 0x726b:gÄ“,qiú # 牫 0x726c:bèi # 牬 0x726d:sì # 牭 0x726e:jiàn # 牮 0x726f:gÇ” # 牯 0x7270:yòu,chÅ�u # 牰 0x7271:kÄ“ # 牱 0x7272:shÄ“ng # 牲 0x7273:mÇ” # 牳 0x7274:dÇ� # 牴 0x7275:qiÄ�n # 牵 0x7276:quàn # 牶 0x7277:quán # 牷 0x7278:zì # 牸 0x7279:tè # 特 0x727a:xÄ« # 牺 0x727b:máng # 牻 0x727c:kÄ“ng # 牼 0x727d:qiÄ�n # 牽 0x727e:wÇ” # 牾 0x727f:gù # 牿 0x7280:xÄ« # 犀 0x7281:lí # çŠ� 0x7282:lí # 犂 0x7283:pÇ’u # 犃 0x7284:jÄ« # 犄 0x7285:gÄ�ng # 犅 0x7286:zhí,tè # 犆 0x7287:bÄ“n # 犇 0x7288:quán # 犈 0x7289:chún # 犉 0x728a:dú # 犊 0x728b:jù # 犋 0x728c:jiÄ� # 犌 0x728d:jiÄ�n,qián # çŠ� 0x728e:fÄ“ng # 犎 0x728f:piÄ�n # çŠ� 0x7290:kÄ“ # çŠ� 0x7291:jú # 犑 0x7292:kào # 犒 0x7293:chú # 犓 0x7294:xì # 犔 0x7295:bèi # 犕 0x7296:luò # 犖 0x7297:jiè # 犗 0x7298:má # 犘 0x7299:sÄ�n # 犙 0x729a:wèi # 犚 0x729b:máo,lí # 犛 0x729c:dÅ«n # 犜 0x729d:tóng # çŠ� 0x729f:jiàng # 犟 0x72a1:lì # 犡 0x72a2:dú # 犢 0x72a3:liè # 犣 0x72a4:pái # 犤 0x72a5:piÄ�o # 犥 0x72a6:bào # 犦 0x72a7:xÄ« # 犧 0x72a8:chÅ�u # 犨 0x72a9:wéi # 犩 0x72aa:kuí # 犪 0x72ab:chÅ�u # 犫 0x72ac:quÇŽn # 犬 0x72ae:quÇŽn,bá # 犮 0x72af:fàn # 犯 0x72b0:qiú # 犰 0x72b1:jÇ� # 犱 0x72b2:chái # 犲 0x72b3:zhuó,bào # 犳 0x72b4:hÄ�n,àn # 犴 0x72b5:gÄ“ # 犵 0x72b6:zhuàng # 状 0x72b7:guÇŽng # 犷 0x72b8:mÇŽ # 犸 0x72b9:yóu # 犹 0x72ba:kàng,gÇŽng # 犺 0x72bb:pèi,fèi # 犻 0x72bc:hÇ’u # 犼 0x72bd:yà # 犽 0x72be:yín # 犾 0x72bf:huÄ�n,fÄ�n # 犿 0x72c0:zhuàng # ç‹€ 0x72c1:yÇ”n # ç‹� 0x72c2:kuáng # ç‹‚ 0x72c3:niÇ” # 狃 0x72c4:dí # ç‹„ 0x72c5:kuáng # ç‹… 0x72c6:zhòng # 狆 0x72c7:mù # 狇 0x72c8:bèi # 狈 0x72c9:pÄ« # 狉 0x72ca:jú # 狊 0x72cb:yí,quán,chí # ç‹‹ 0x72cc:shÄ“ng,xÄ«ng # 狌 0x72cd:páo # ç‹� 0x72ce:xiá # 狎 0x72cf:tuó,yí # ç‹� 0x72d0:hú # ç‹� 0x72d1:líng # ç‹‘ 0x72d2:fèi # ç‹’ 0x72d3:pÄ« # ç‹“ 0x72d4:nÇ� # ç‹” 0x72d5:yÇŽo # ç‹• 0x72d6:yòu # ç‹– 0x72d7:gÇ’u # ç‹— 0x72d8:xuè # 狘 0x72d9:jÅ« # ç‹™ 0x72da:dàn # 狚 0x72db:bó # ç‹› 0x72dc:kÇ” # 狜 0x72dd:xiÇŽn # ç‹� 0x72de:níng # 狞 0x72df:huán,huÄ�n # 狟 0x72e0:hÄ›n # ç‹  0x72e1:jiÇŽo # ç‹¡ 0x72e2:hé,mò # ç‹¢ 0x72e3:zhào # ç‹£ 0x72e4:jié # 狤 0x72e5:xùn # ç‹¥ 0x72e6:shÄ�n # 狦 0x72e7:tà,shì # ç‹§ 0x72e8:róng # 狨 0x72e9:shòu # ç‹© 0x72ea:tóng,dòng # 狪 0x72eb:lÇŽo # ç‹« 0x72ec:dú # 独 0x72ed:xiá # ç‹­ 0x72ee:shÄ« # ç‹® 0x72ef:kuài # 狯 0x72f0:zhÄ“ng # ç‹° 0x72f1:yù # 狱 0x72f2:sÅ«n # 狲 0x72f3:yú # 狳 0x72f4:bì # ç‹´ 0x72f5:máng,dòu # 狵 0x72f6:xÄ«,shÇ� # ç‹¶ 0x72f7:juàn # ç‹· 0x72f8:lí # 狸 0x72f9:xiá # 狹 0x72fa:yín # 狺 0x72fb:suÄ�n # ç‹» 0x72fc:láng # 狼 0x72fd:bèi # 狽 0x72fe:zhì # 狾 0x72ff:yán # ç‹¿ 0x7300:shÄ� # 猀 0x7301:lì # çŒ� 0x7302:hàn # 猂 0x7303:xiÇŽn # 猃 0x7304:jÄ«ng # 猄 0x7305:pái # 猅 0x7306:fÄ“i # 猆 0x7307:xiÄ�o # 猇 0x7308:bài,pí # 猈 0x7309:qí # 猉 0x730a:ní # 猊 0x730b:biÄ�o # 猋 0x730c:yìn # 猌 0x730d:lái # çŒ� 0x730e:liè # 猎 0x730f:jiÄ�n,yàn # çŒ� 0x7310:qiÄ�ng # çŒ� 0x7311:kÅ«n # 猑 0x7312:yàn # 猒 0x7313:guÅ� # 猓 0x7314:zòng # 猔 0x7315:mí # 猕 0x7316:chÄ�ng # 猖 0x7317:yÄ«,yÇ� # 猗 0x7318:zhì # 猘 0x7319:zhÄ“ng # 猙 0x731a:yá,wèi # 猚 0x731b:mÄ›ng # 猛 0x731c:cÄ�i # 猜 0x731d:cù # çŒ� 0x731e:shÄ“ # 猞 0x7321:luó # 猡 0x7322:hú # 猢 0x7323:zÅ�ng # 猣 0x7324:guì # 猤 0x7325:wÄ›i # 猥 0x7326:fÄ“ng # 猦 0x7327:wÅ� # 猧 0x7328:yuán # 猨 0x7329:xÄ«ng # 猩 0x732a:zhÅ« # 猪 0x732b:mÄ�o,máo # 猫 0x732c:wèi # 猬 0x732d:chuàn,chuÄ�n # 猭 0x732e:xiàn # 献 0x732f:tuÄ�n,tuàn # 猯 0x7330:yà,jiá,qiè # 猰 0x7331:náo # 猱 0x7332:xiÄ“,hè,gé,hài # 猲 0x7333:jiÄ� # 猳 0x7334:hóu # 猴 0x7335:biÄ�n,piàn # 猵 0x7336:yóu # 猶 0x7337:yóu # 猷 0x7338:méi # 猸 0x7339:chá # 猹 0x733a:yáo # 猺 0x733b:sÅ«n # 猻 0x733c:bó,pò # 猼 0x733d:míng # 猽 0x733e:huá # 猾 0x733f:yuán # 猿 0x7340:sÅ�u # ç�€ 0x7341:mÇŽ # ç�� 0x7342:huán # ç�‚ 0x7343:dÄ�i # ç�ƒ 0x7344:yù # ç�„ 0x7345:shÄ« # ç�… 0x7346:háo # ç�† 0x7348:yì # ç�ˆ 0x7349:zhÄ“n # ç�‰ 0x734a:cÄ�ng # ç�Š 0x734b:háo,gÄ�o # ç�‹ 0x734c:màn # ç�Œ 0x734d:jìng # ç�� 0x734e:jiÇŽng # ç�Ž 0x734f:mò # ç�� 0x7350:zhÄ�ng # ç�� 0x7351:chán # ç�‘ 0x7352:áo # ç�’ 0x7353:áo # ç�“ 0x7354:háo # ç�” 0x7355:suÇ’,cuÄ« # ç�• 0x7356:fén,fèn # ç�– 0x7357:jué # ç�— 0x7358:bì # ç�˜ 0x7359:bì # ç�™ 0x735a:huáng # ç�š 0x735b:pú # ç�› 0x735c:lín,lìn # ç�œ 0x735d:xù # ç�� 0x735e:tóng # ç�ž 0x735f:yào,xiÄ�o # ç�Ÿ 0x7360:liáo # ç�  0x7361:shuò,xÄ« # ç�¡ 0x7362:xiÄ�o # ç�¢ 0x7365:jiào # ç�¥ 0x7366:gé,liè,xiÄ“ # ç�¦ 0x7367:juàn # ç�§ 0x7368:dú # ç�¨ 0x7369:huì # ç�© 0x736a:kuài # ç�ª 0x736b:xiÇŽn # ç�« 0x736c:xiè # ç�¬ 0x736d:tÇŽ # ç�­ 0x736e:xiÇŽn # ç�® 0x736f:xÅ«n # ç�¯ 0x7370:níng # ç�° 0x7371:biÄ�n,piàn # ç�± 0x7372:huò # ç�² 0x7373:nòu,rú # ç�³ 0x7374:méng # ç�´ 0x7375:liè # ç�µ 0x7376:náo,nÇŽo,yÅ�u # ç�¶ 0x7377:guÇŽng # ç�· 0x7378:shòu # ç�¸ 0x7379:lú # ç�¹ 0x737a:tÇŽ # ç�º 0x737b:xiàn # ç�» 0x737c:mí # ç�¼ 0x737d:ráng # ç�½ 0x737e:huÄ�n # ç�¾ 0x737f:náo,yÅ�u # ç�¿ 0x7380:luó # 玀 0x7381:xiÇŽn # çŽ� 0x7382:qí # 玂 0x7383:jué # 玃 0x7384:xuán # 玄 0x7385:miào # 玅 0x7386:zÄ« # 玆 0x7387:shuài,lÇœ # 率 0x7388:lú # 玈 0x7389:yù # 玉 0x738a:sù # 玊 0x738b:wáng,wàng # 王 0x738c:qiú # 玌 0x738d:gÇŽ # çŽ� 0x738e:dÄ«ng # 玎 0x738f:lè # çŽ� 0x7390:bÄ� # çŽ� 0x7391:jÄ« # 玑 0x7392:hóng # 玒 0x7393:dì # 玓 0x7394:chuàn # 玔 0x7395:gÄ�n # 玕 0x7396:jiÇ” # 玖 0x7397:yú # 玗 0x7398:qÇ� # 玘 0x7399:yú # 玙 0x739a:chàng,yáng # 玚 0x739b:mÇŽ # 玛 0x739c:hóng # 玜 0x739d:wÇ” # çŽ� 0x739e:fÅ« # 玞 0x739f:mín,wén # 玟 0x73a0:jiè # 玠 0x73a1:yà # 玡 0x73a2:bÄ«n,fÄ“n # 玢 0x73a3:biàn # 玣 0x73a4:bàng # 玤 0x73a5:yuè # 玥 0x73a6:jué # 玦 0x73a7:mén,yÇ”n # 玧 0x73a8:jué # 玨 0x73a9:wán # 玩 0x73aa:jiÄ�n,qián # 玪 0x73ab:méi # 玫 0x73ac:dÇŽn # 玬 0x73ad:pín # 玭 0x73ae:wÄ›i # 玮 0x73af:huán # 环 0x73b0:xiàn # 现 0x73b1:qiÄ�ng,cÄ�ng # 玱 0x73b2:líng # 玲 0x73b3:dài # 玳 0x73b4:yì # 玴 0x73b5:án,gÄ�n # 玵 0x73b6:píng # 玶 0x73b7:diàn # 玷 0x73b8:fú # 玸 0x73b9:xuán,xián # 玹 0x73ba:xÇ� # 玺 0x73bb:bÅ� # 玻 0x73bc:cÄ«,cÇ� # 玼 0x73bd:gÇ’u # 玽 0x73be:jiÇŽ # 玾 0x73bf:sháo # 玿 0x73c0:pò # ç�€ 0x73c1:cí # ç�� 0x73c2:kÄ“ # ç�‚ 0x73c3:rÇŽn # ç�ƒ 0x73c4:shÄ“ng # ç�„ 0x73c5:shÄ“n # ç�… 0x73c6:yí,tÄ�i # ç�† 0x73c7:zÇ”,jù # ç�‡ 0x73c8:jiÄ� # ç�ˆ 0x73c9:mín # ç�‰ 0x73ca:shÄ�n # ç�Š 0x73cb:liÇ” # ç�‹ 0x73cc:bì # ç�Œ 0x73cd:zhÄ“n # ç�� 0x73ce:zhÄ“n # ç�Ž 0x73cf:jué # ç�� 0x73d0:fà # ç�� 0x73d1:lóng # ç�‘ 0x73d2:jÄ«n # ç�’ 0x73d3:jiào # ç�“ 0x73d4:jiàn # ç�” 0x73d5:lì # ç�• 0x73d6:guÄ�ng # ç�– 0x73d7:xiÄ�n # ç�— 0x73d8:zhÅ�u # ç�˜ 0x73d9:gÇ’ng # ç�™ 0x73da:yÄ�n # ç�š 0x73db:xiù # ç�› 0x73dc:yáng # ç�œ 0x73dd:xÇ” # ç�� 0x73de:luò # ç�ž 0x73df:sù # ç�Ÿ 0x73e0:zhÅ« # ç�  0x73e1:qín # ç�¡ 0x73e2:yín,kèn # ç�¢ 0x73e3:xún # ç�£ 0x73e4:bÇŽo # ç�¤ 0x73e5:Ä›r # ç�¥ 0x73e6:xiàng # ç�¦ 0x73e7:yáo # ç�§ 0x73e8:xiá # ç�¨ 0x73e9:héng # ç�© 0x73ea:guÄ« # ç�ª 0x73eb:chÅ�ng # ç�« 0x73ec:xù # ç�¬ 0x73ed:bÄ�n # ç�­ 0x73ee:pèi # ç�® 0x73f0:dÄ�ng # ç�° 0x73f2:hún,huÄ« # ç�² 0x73f3:wén # ç�³ 0x73f4:é # ç�´ 0x73f5:chéng # ç�µ 0x73f6:dì,tí # ç�¶ 0x73f7:wÇ” # ç�· 0x73f8:wú # ç�¸ 0x73f9:chéng # ç�¹ 0x73fa:jùn # ç�º 0x73fb:méi # ç�» 0x73fc:bèi # ç�¼ 0x73fd:tÇ�ng # ç�½ 0x73fe:xiàn # ç�¾ 0x73ff:chù # ç�¿ 0x7400:hán # ç�€ 0x7401:xuán,qióng # ç�� 0x7402:yán # ç�‚ 0x7403:qiú # ç�ƒ 0x7404:xuàn # ç�„ 0x7405:láng # ç�… 0x7406:lÇ� # ç�† 0x7407:xiù # ç�‡ 0x7408:fú,fÅ« # ç�ˆ 0x7409:liú # ç�‰ 0x740a:yá # ç�Š 0x740b:xÄ« # ç�‹ 0x740c:líng # ç�Œ 0x740d:lí # ç�� 0x740e:jÄ«n # ç�Ž 0x740f:liÇŽn # ç�� 0x7410:suÇ’ # ç�� 0x7413:wán # ç�“ 0x7414:diàn # ç�” 0x7415:pín,bÇ�ng # ç�• 0x7416:zhÇŽn # ç�– 0x7417:cuì,sè # ç�— 0x7418:mín # ç�˜ 0x7419:yù # ç�™ 0x741a:jÅ« # ç�š 0x741b:chÄ“n # ç�› 0x741c:lái # ç�œ 0x741d:mín # ç�� 0x741e:shèng # ç�ž 0x741f:wéi,yù # ç�Ÿ 0x7420:tiÇŽn,tiàn # ç�  0x7421:shÅ« # ç�¡ 0x7422:zhuó,zuó # ç�¢ 0x7423:bÄ›ng,pÄ›i # ç�£ 0x7424:chÄ“ng # ç�¤ 0x7425:hÇ” # ç�¥ 0x7426:qí # ç�¦ 0x7427:è # ç�§ 0x7428:kÅ«n # ç�¨ 0x7429:chÄ�ng # ç�© 0x742a:qí # ç�ª 0x742b:bÄ›ng # ç�« 0x742c:wÇŽn # ç�¬ 0x742d:lù # ç�­ 0x742e:cóng # ç�® 0x742f:guÇŽn # ç�¯ 0x7430:yÇŽn # ç�° 0x7431:diÄ�o # ç�± 0x7432:bèi # ç�² 0x7433:lín # ç�³ 0x7434:qín # ç�´ 0x7435:pí # ç�µ 0x7436:pá # ç�¶ 0x7437:què # ç�· 0x7438:zhuó # ç�¸ 0x7439:qín # ç�¹ 0x743a:fà # ç�º 0x743c:qióng # ç�¼ 0x743d:dÇ” # ç�½ 0x743e:jiè # ç�¾ 0x743f:hún,huÄ« # ç�¿ 0x7440:yÇ” # ç‘€ 0x7441:mào # ç‘� 0x7442:méi # ç‘‚ 0x7444:xuÄ�n # ç‘„ 0x7445:tí # ç‘… 0x7446:xÄ«ng # 瑆 0x7447:dài # 瑇 0x7448:róu # 瑈 0x7449:mín # 瑉 0x744a:jiÄ�n # 瑊 0x744b:wÄ›i # ç‘‹ 0x744c:ruÇŽn # 瑌 0x744d:huàn # ç‘� 0x744e:xié,jiÄ“ # 瑎 0x744f:chuÄ�n # ç‘� 0x7450:jiÇŽn # ç‘� 0x7451:zhuàn # ç‘‘ 0x7452:chàng,yáng # ç‘’ 0x7453:liàn # ç‘“ 0x7454:quán # ç‘” 0x7455:xiá # ç‘• 0x7456:duàn # ç‘– 0x7457:yuàn # ç‘— 0x7458:yé # 瑘 0x7459:nÇŽo # ç‘™ 0x745a:hú # 瑚 0x745b:yÄ«ng # ç‘› 0x745c:yú # 瑜 0x745d:huáng # ç‘� 0x745e:ruì # 瑞 0x745f:sè # 瑟 0x7460:liú # ç‘  0x7462:róng # ç‘¢ 0x7463:suÇ’ # ç‘£ 0x7464:yáo # 瑤 0x7465:wÄ“n # ç‘¥ 0x7466:wÇ” # 瑦 0x7467:zhÄ“n # ç‘§ 0x7468:jìn # 瑨 0x7469:yíng # ç‘© 0x746a:mÇŽ # 瑪 0x746b:tÄ�o # ç‘« 0x746c:liú # 瑬 0x746d:táng # ç‘­ 0x746e:lì # ç‘® 0x746f:láng # 瑯 0x7470:guÄ« # ç‘° 0x7471:tiàn,tián,zhèn # 瑱 0x7472:qiÄ�ng,cÄ�ng # 瑲 0x7473:cuÅ� # 瑳 0x7474:jué # ç‘´ 0x7475:zhÇŽo # 瑵 0x7476:yáo # ç‘¶ 0x7477:ài # ç‘· 0x7478:bÄ«n,pián # 瑸 0x7479:tú,shÅ« # 瑹 0x747a:cháng # 瑺 0x747b:kÅ«n # ç‘» 0x747c:zhuÄ�n # 瑼 0x747d:cÅ�ng # 瑽 0x747e:jÇ�n # 瑾 0x747f:yÄ« # ç‘¿ 0x7480:cuÇ� # ç’€ 0x7481:cÅ�ng # ç’� 0x7482:qí # ç’‚ 0x7483:lí # ç’ƒ 0x7484:jÇ�ng # ç’„ 0x7485:zÇŽo,suÇ’ # ç’… 0x7486:qiú # ç’† 0x7487:xuán # ç’‡ 0x7488:áo # ç’ˆ 0x7489:liÇŽn # ç’‰ 0x748a:mén # ç’Š 0x748b:zhÄ�ng # ç’‹ 0x748c:yín # ç’Œ 0x748e:yÄ«ng # ç’Ž 0x748f:zhì # ç’� 0x7490:lù # ç’� 0x7491:wú # ç’‘ 0x7492:dÄ“ng # ç’’ 0x7494:zÄ“ng # ç’” 0x7495:xún # ç’• 0x7496:qú # ç’– 0x7497:dàng # ç’— 0x7498:lín # ç’˜ 0x7499:liáo # ç’™ 0x749a:qióng,jué # ç’š 0x749b:sù # ç’› 0x749c:huáng # ç’œ 0x749d:guÄ« # ç’� 0x749e:pú # ç’ž 0x749f:jÇ�ng # ç’Ÿ 0x74a0:fán # ç’  0x74a1:jÄ«n # ç’¡ 0x74a2:liú # ç’¢ 0x74a3:jÄ« # ç’£ 0x74a5:jÇ�ng # ç’¥ 0x74a6:ài # ç’¦ 0x74a7:bì # ç’§ 0x74a8:càn # ç’¨ 0x74a9:qú # ç’© 0x74aa:zÇŽo # ç’ª 0x74ab:dÄ�ng # ç’« 0x74ac:jiÇŽo # ç’¬ 0x74ad:guÇŽn # ç’­ 0x74ae:tÇŽn # ç’® 0x74af:huì,kuài # ç’¯ 0x74b0:huán # ç’° 0x74b1:sè # ç’± 0x74b2:suì # ç’² 0x74b3:tián # ç’³ 0x74b5:yú # ç’µ 0x74b6:jìn # ç’¶ 0x74b7:lú,fÅ« # ç’· 0x74b8:bÄ«n,pián # ç’¸ 0x74b9:shú # ç’¹ 0x74ba:wèn # ç’º 0x74bb:zuÇ� # ç’» 0x74bc:lán # ç’¼ 0x74bd:xÇ� # ç’½ 0x74be:jì,zÄ« # ç’¾ 0x74bf:xuán # ç’¿ 0x74c0:ruÇŽn # ç“€ 0x74c1:wò # ç“� 0x74c2:gài # ç“‚ 0x74c3:léi # 瓃 0x74c4:dú # ç“„ 0x74c5:lì # ç“… 0x74c6:zhì # 瓆 0x74c7:róu # 瓇 0x74c8:lí # 瓈 0x74c9:zàn # 瓉 0x74ca:qióng # 瓊 0x74cb:tì # ç“‹ 0x74cc:guÄ« # 瓌 0x74cd:suí # ç“� 0x74ce:là # 瓎 0x74cf:lóng # ç“� 0x74d0:lú # ç“� 0x74d1:lì # ç“‘ 0x74d2:zàn # ç“’ 0x74d3:làn # ç““ 0x74d4:yÄ«ng # ç“” 0x74d5:mí,xÇ� # ç“• 0x74d6:xiÄ�ng # ç“– 0x74d7:qióng,wÄ›i,wèi # ç“— 0x74d8:guàn # 瓘 0x74d9:dào # ç“™ 0x74da:zàn # 瓚 0x74db:huán,yè,yà # ç“› 0x74dc:guÄ� # 瓜 0x74dd:bó # ç“� 0x74de:dié # 瓞 0x74df:bó,páo # 瓟 0x74e0:hù # ç“  0x74e1:zhí,hú # ç“¡ 0x74e2:piáo # ç“¢ 0x74e3:bàn # ç“£ 0x74e4:ráng # 瓤 0x74e5:lì # ç“¥ 0x74e6:wÇŽ,wà # 瓦 0x74e8:xiáng,hóng # 瓨 0x74ea:bÇŽn # 瓪 0x74eb:pén # ç“« 0x74ec:fÇŽng # 瓬 0x74ed:dÇŽn # ç“­ 0x74ee:wèng # ç“® 0x74ef:Å�u # 瓯 0x74f3:hú # 瓳 0x74f4:líng # ç“´ 0x74f5:yí # 瓵 0x74f6:píng # ç“¶ 0x74f7:cí # ç“· 0x74f9:juàn,juÄ�n # 瓹 0x74fa:cháng # 瓺 0x74fb:chÄ« # ç“» 0x74fd:dàng # 瓽 0x74fe:wÄ� # 瓾 0x74ff:bù # ç“¿ 0x7500:zhuì # 甀 0x7501:píng # ç”� 0x7502:biÄ�n # 甂 0x7503:zhòu # 甃 0x7504:zhÄ“n # 甄 0x7506:cí # 甆 0x7507:yÄ«ng # 甇 0x7508:qì # 甈 0x7509:xián # 甉 0x750a:lÇ’u # 甊 0x750b:dì # 甋 0x750c:Å�u # 甌 0x750d:méng # ç”� 0x750e:zhuÄ�n # 甎 0x750f:bèng # ç”� 0x7510:lìn # ç”� 0x7511:zèng # 甑 0x7512:wÇ” # ç”’ 0x7513:pì # 甓 0x7514:dÄ�n # ç”” 0x7515:wèng # 甕 0x7516:yÄ«ng # ç”– 0x7517:yÇŽn # ç”— 0x7518:gÄ�n # 甘 0x7519:dài # ç”™ 0x751a:shèn,shén # 甚 0x751b:tián # ç”› 0x751c:tián # 甜 0x751d:hán # ç”� 0x751e:cháng # 甞 0x751f:shÄ“ng # 生 0x7520:qíng # ç”  0x7521:shÄ“n # 甡 0x7522:chÇŽn # 產 0x7523:chÇŽn # 産 0x7524:ruí # 甤 0x7525:shÄ“ng # 甥 0x7526:sÅ« # 甦 0x7527:shÄ“n # ç”§ 0x7528:yòng # 用 0x7529:shuÇŽi # 甩 0x752a:lù # 甪 0x752b:fÇ” # 甫 0x752c:yÇ’ng # 甬 0x752d:béng # ç”­ 0x752e:béng,fèng # ç”® 0x752f:níng,nìng # 甯 0x7530:tián # ç”° 0x7531:yóu # ç”± 0x7532:jiÇŽ # 甲 0x7533:shÄ“n # 申 0x7534:yóu,zhá # ç”´ 0x7535:diàn # 电 0x7536:fú # ç”¶ 0x7537:nán # ç”· 0x7538:diàn,tián,shèng # 甸 0x7539:pÄ«ng # 甹 0x753a:tÇ�ng,dÄ«ng # 町 0x753b:huà # ç”» 0x753c:tÇ�ng,dÄ«ng # 甼 0x753d:zhèn # 甽 0x753e:zÄ�i,zÄ« # 甾 0x753f:méng # 甿 0x7540:bì # ç•€ 0x7541:bì,qí # ç•� 0x7542:mÇ” # ç•‚ 0x7543:xún # 畃 0x7544:liú # ç•„ 0x7545:chàng # ç•… 0x7546:mÇ” # 畆 0x7547:yún # 畇 0x7548:fàn # 畈 0x7549:fú # 畉 0x754a:gÄ“ng # 畊 0x754b:tián # ç•‹ 0x754c:jiè # 界 0x754d:jiè # ç•� 0x754e:quÇŽn # 畎 0x754f:wèi # ç•� 0x7550:fú,bì # ç•� 0x7551:tián # ç•‘ 0x7552:mÇ” # ç•’ 0x7554:pàn # ç•” 0x7555:jiÄ�ng # ç•• 0x7556:wÄ� # ç•– 0x7557:dá,fú # ç•— 0x7558:nán # 畘 0x7559:liú # ç•™ 0x755a:bÄ›n # 畚 0x755b:zhÄ›n # ç•› 0x755c:xù,chù # 畜 0x755d:mÇ” # ç•� 0x755e:mÇ” # 畞 0x755f:cè,jì # 畟 0x7561:gÄ�i # ç•¡ 0x7562:bì # ç•¢ 0x7563:dá # ç•£ 0x7564:zhì,chóu,shì # 畤 0x7565:lüè # ç•¥ 0x7566:qí # 畦 0x7567:lüè # ç•§ 0x7568:fÄ�n,pÄ�n # 畨 0x756a:fÄ�n,pÄ�n # 番 0x756b:huà # ç•« 0x756c:shÄ“,yú # 畬 0x756d:shÄ“ # ç•­ 0x756e:mÇ” # ç•® 0x756f:jùn # 畯 0x7570:yì # ç•° 0x7571:liú # 畱 0x7572:shÄ“ # 畲 0x7573:dié # 畳 0x7574:chóu # ç•´ 0x7575:huà # 畵 0x7576:dÄ�ng,dàng,dÇŽng # ç•¶ 0x7577:zhuì # ç•· 0x7578:jÄ« # 畸 0x7579:wÇŽn # 畹 0x757a:jiÄ�ng,jiàng # 畺 0x757b:chéng # ç•» 0x757c:chàng # 畼 0x757d:tuÇŽn # 畽 0x757e:léi # 畾 0x757f:jÄ« # ç•¿ 0x7580:chÄ� # ç–€ 0x7581:liú # ç–� 0x7583:tuÇŽn # ç–ƒ 0x7584:lín,lìn # ç–„ 0x7585:jiÄ�ng # ç–… 0x7586:jiÄ�ng,qiáng # ç–† 0x7587:chóu # ç–‡ 0x7588:pì # ç–ˆ 0x7589:dié # ç–‰ 0x758a:dié # ç–Š 0x758b:pÇ�,yÇŽ,shÅ« # ç–‹ 0x758c:jié,qiè # ç–Œ 0x758d:dàn # ç–� 0x758e:shÅ« # ç–Ž 0x758f:shÅ« # ç–� 0x7590:zhì,dì # ç–� 0x7591:yí,nÇ� # ç–‘ 0x7592:nè # ç–’ 0x7593:nÇŽi # ç–“ 0x7594:dÄ«ng # ç–” 0x7595:bÇ� # ç–• 0x7596:jiÄ“ # ç–– 0x7597:liáo # ç–— 0x7598:gÄ�ng # ç–˜ 0x7599:gÄ“,yì # ç–™ 0x759a:jiù # ç–š 0x759b:zhÇ’u # ç–› 0x759c:xià # ç–œ 0x759d:shàn # ç–� 0x759e:xÅ« # ç–ž 0x759f:nüè,yào # ç–Ÿ 0x75a0:lì,lài # ç–  0x75a1:yáng # ç–¡ 0x75a2:chèn # ç–¢ 0x75a3:yóu # ç–£ 0x75a4:bÄ� # ç–¤ 0x75a5:jiè # ç–¥ 0x75a6:jué,xuè # ç–¦ 0x75a7:qí # ç–§ 0x75a8:yÇŽ,xiÄ� # ç–¨ 0x75a9:cuì # ç–© 0x75aa:bì # ç–ª 0x75ab:yì # ç–« 0x75ac:lì # ç–¬ 0x75ad:zòng # ç–­ 0x75ae:chuÄ�ng # ç–® 0x75af:fÄ“ng # ç–¯ 0x75b0:zhù # ç–° 0x75b1:pào # ç–± 0x75b2:pí # ç–² 0x75b3:gÄ�n # ç–³ 0x75b4:kÄ“ # ç–´ 0x75b5:cÄ« # ç–µ 0x75b6:xuÄ“ # ç–¶ 0x75b7:zhÄ« # ç–· 0x75b8:dÇŽn,da # ç–¸ 0x75b9:zhÄ›n # ç–¹ 0x75ba:fá,biÇŽn # ç–º 0x75bb:zhÇ� # ç–» 0x75bc:téng # ç–¼ 0x75bd:jÅ« # ç–½ 0x75be:jí # ç–¾ 0x75bf:fèi,féi # ç–¿ 0x75c0:gÅ�u # ç—€ 0x75c1:shÄ�n,diàn # ç—� 0x75c2:jiÄ� # ç—‚ 0x75c3:xuán # ç—ƒ 0x75c4:zhà # ç—„ 0x75c5:bìng # ç—… 0x75c6:niè # ç—† 0x75c7:zhèng,zhÄ“ng # ç—‡ 0x75c8:yÅ�ng # ç—ˆ 0x75c9:jìng # ç—‰ 0x75ca:quán # ç—Š 0x75cb:téng,chóng # ç—‹ 0x75cc:tÅ�ng,tóng # ç—Œ 0x75cd:yí # ç—� 0x75ce:jiÄ“ # ç—Ž 0x75cf:wÄ›i,yòu,yù # ç—� 0x75d0:huí # ç—� 0x75d1:tÄ�n,shÇ� # ç—‘ 0x75d2:yÇŽng # ç—’ 0x75d3:zhì,chì # ç—“ 0x75d4:zhì # ç—” 0x75d5:hén # ç—• 0x75d6:yÇŽ # ç—– 0x75d7:mèi # ç—— 0x75d8:dòu # ç—˜ 0x75d9:jìng # ç—™ 0x75da:xiÄ�o # ç—š 0x75db:tòng # ç—› 0x75dc:tÅ« # ç—œ 0x75dd:máng # ç—� 0x75de:pÇ� # ç—ž 0x75df:xiÄ�o # ç—Ÿ 0x75e0:suÄ�n # ç—  0x75e1:pÅ«,pù # ç—¡ 0x75e2:lì # ç—¢ 0x75e3:zhì # ç—£ 0x75e4:cuó # ç—¤ 0x75e5:duó # ç—¥ 0x75e6:wù # ç—¦ 0x75e7:shÄ� # ç—§ 0x75e8:láo # ç—¨ 0x75e9:shòu # ç—© 0x75ea:huàn # ç—ª 0x75eb:xián # ç—« 0x75ec:yì # ç—¬ 0x75ed:bÄ“ng,péng # ç—­ 0x75ee:zhàng # ç—® 0x75ef:guÇŽn # ç—¯ 0x75f0:tán # ç—° 0x75f1:fèi,féi # ç—± 0x75f2:má # ç—² 0x75f3:má,lìn # ç—³ 0x75f4:chÄ« # ç—´ 0x75f5:jì # ç—µ 0x75f6:tiÇŽn,diàn # ç—¶ 0x75f7:Ä�n,yè,è # ç—· 0x75f8:chì # ç—¸ 0x75f9:bì # ç—¹ 0x75fa:bì # ç—º 0x75fb:mín # ç—» 0x75fc:gù # ç—¼ 0x75fd:duÄ« # ç—½ 0x75fe:kÄ“,Ä“ # ç—¾ 0x75ff:wÄ›i # ç—¿ 0x7600:yÅ« # 瘀 0x7601:cuì # ç˜� 0x7602:yÇŽ # 瘂 0x7603:zhú # 瘃 0x7604:cù # 瘄 0x7605:dàn,dÄ�n # 瘅 0x7606:shèn # 瘆 0x7607:zhÇ’ng # 瘇 0x7608:zhì,chì # 瘈 0x7609:yù # 瘉 0x760a:hóu # 瘊 0x760b:fÄ“ng # 瘋 0x760c:là # 瘌 0x760d:yáng # ç˜� 0x760e:chén # 瘎 0x760f:tú # ç˜� 0x7610:yÇ” # ç˜� 0x7611:guÅ� # 瘑 0x7612:wén # 瘒 0x7613:huàn # 瘓 0x7614:kù # 瘔 0x7615:jiÇŽ,xiá,xiÄ� # 瘕 0x7616:yÄ«n # 瘖 0x7617:yì # 瘗 0x7618:lòu # 瘘 0x7619:sào # 瘙 0x761a:jué # 瘚 0x761b:chì # 瘛 0x761c:xÄ« # 瘜 0x761d:guÄ�n # ç˜� 0x761e:yì # 瘞 0x761f:wÄ“n # 瘟 0x7620:jí # 瘠 0x7621:chuÄ�ng # 瘡 0x7622:bÄ�n # 瘢 0x7623:huì,lÄ›i # 瘣 0x7624:liú # 瘤 0x7625:chài,cuó # 瘥 0x7626:shòu # 瘦 0x7627:nüè,yào # 瘧 0x7628:diÄ�n,chÄ“n # 瘨 0x7629:dá,da # 瘩 0x762a:biÄ“,biÄ› # 瘪 0x762b:tÄ�n # 瘫 0x762c:zhàng # 瘬 0x762d:biÄ�o # 瘭 0x762e:shèn # 瘮 0x762f:cù # 瘯 0x7630:luÇ’ # 瘰 0x7631:yì # 瘱 0x7632:zòng # 瘲 0x7633:chÅ�u # 瘳 0x7634:zhàng # 瘴 0x7635:zhài # 瘵 0x7636:sòu # 瘶 0x7637:sè # 瘷 0x7638:qué # 瘸 0x7639:diào # 瘹 0x763a:lòu # 瘺 0x763b:lòu # 瘻 0x763c:mò # 瘼 0x763d:qín # 瘽 0x763e:yÇ�n # 瘾 0x763f:yÇ�ng # 瘿 0x7640:huáng # 癀 0x7641:fú # ç™� 0x7642:liáo # 療 0x7643:lóng # 癃 0x7644:qiáo,jiào # 癄 0x7645:liú # ç™… 0x7646:láo # 癆 0x7647:xián # 癇 0x7648:fèi # 癈 0x7649:dàn,dÄ�n # 癉 0x764a:yìn # 癊 0x764b:hè # 癋 0x764c:ái # 癌 0x764d:bÄ�n # ç™� 0x764e:xián # 癎 0x764f:guÄ�n # ç™� 0x7650:guì,wÄ“i # ç™� 0x7651:nòng,nóng # 癑 0x7652:yù # ç™’ 0x7653:wÄ“i # 癓 0x7654:yì # ç™” 0x7655:yÅ�ng # 癕 0x7656:pÇ� # ç™– 0x7657:lÄ›i # ç™— 0x7658:lì,lài # 癘 0x7659:shÇ” # ç™™ 0x765a:dàn # 癚 0x765b:lÇ�n # ç™› 0x765c:diàn # 癜 0x765d:lÇ�n # ç™� 0x765e:lài,là # 癞 0x765f:biÄ“,biÄ› # 癟 0x7660:jì # ç™  0x7661:chÄ« # 癡 0x7662:yÇŽng # 癢 0x7663:xuÇŽn # 癣 0x7664:jiÄ“ # 癤 0x7665:zhÄ“ng # 癥 0x7667:lì # ç™§ 0x7668:huò # 癨 0x7669:lài # 癩 0x766b:diÄ�n # 癫 0x766c:xuÇŽn # 癬 0x766d:yÇ�ng # ç™­ 0x766e:yÇ�n # ç™® 0x766f:qú # 癯 0x7670:yÅ�ng # ç™° 0x7671:tÄ�n # ç™± 0x7672:diÄ�n # 癲 0x7673:luÇ’ # 癳 0x7674:luán # ç™´ 0x7675:luán # 癵 0x7676:bÅ� # ç™¶ 0x7678:guÇ� # 癸 0x7679:bá # 癹 0x767a:fÄ� # 発 0x767b:dÄ“ng # ç™» 0x767c:fÄ� # 發 0x767d:bái # 白 0x767e:bÇŽi # 百 0x767f:qié # 癿 0x7680:jí,bÄ« # 皀 0x7681:zào # çš� 0x7682:zào # çš‚ 0x7683:mào # 皃 0x7684:de,dí,dì # çš„ 0x7685:pÄ�,bà # çš… 0x7686:jiÄ“ # 皆 0x7687:huáng # 皇 0x7688:guÄ« # 皈 0x7689:cÇ� # 皉 0x768a:líng # 皊 0x768b:gÄ�o,háo # çš‹ 0x768c:mò # 皌 0x768d:jí # çš� 0x768e:jiÇŽo # 皎 0x768f:pÄ›ng # çš� 0x7690:gÄ�o,yáo # çš� 0x7691:ái # çš‘ 0x7692:é # çš’ 0x7693:hào # çš“ 0x7694:hàn # çš” 0x7695:bì # çš• 0x7696:wÇŽn # çš– 0x7697:chóu # çš— 0x7698:qiàn # 皘 0x7699:xÄ« # çš™ 0x769a:ái # çšš 0x769b:xiÇŽo # çš› 0x769c:hào # çšœ 0x769d:huàng # çš� 0x769e:hào # çšž 0x769f:zé # 皟 0x76a0:cuÇ� # çš  0x76a1:hào # çš¡ 0x76a2:xiÇŽo # 皢 0x76a3:yè # 皣 0x76a4:pó # 皤 0x76a5:hào # 皥 0x76a6:jiÇŽo # 皦 0x76a7:ài # çš§ 0x76a8:xÄ«ng # 皨 0x76a9:huàng # çš© 0x76aa:lì,luò,bÅ� # 皪 0x76ab:piÇŽo # çš« 0x76ac:hé # 皬 0x76ad:jiào # çš­ 0x76ae:pí # çš® 0x76af:gÇŽn # 皯 0x76b0:pào # çš° 0x76b1:zhòu # çš± 0x76b2:jÅ«n # çš² 0x76b3:qiú # çš³ 0x76b4:cÅ«n # çš´ 0x76b5:què # çšµ 0x76b6:zhÄ� # çš¶ 0x76b7:gÇ” # çš· 0x76b8:jÅ«n # 皸 0x76b9:jÅ«n # çš¹ 0x76ba:zhòu # 皺 0x76bb:zhÄ�,cÇ” # çš» 0x76bc:gÇ” # çš¼ 0x76bd:zhÄ�o,zhÇŽn,dÇŽn # çš½ 0x76be:dú # çš¾ 0x76bf:mÇ�n # çš¿ 0x76c0:qÇ� # 盀 0x76c1:yíng # ç›� 0x76c2:yú # 盂 0x76c3:bÄ“i # 盃 0x76c4:diào # 盄 0x76c5:zhÅ�ng # ç›… 0x76c6:pén # 盆 0x76c7:hé # 盇 0x76c8:yíng # 盈 0x76c9:hé # 盉 0x76ca:yì # 益 0x76cb:bÅ� # 盋 0x76cc:wÇŽn # 盌 0x76cd:hé # ç›� 0x76ce:àng # 盎 0x76cf:zhÇŽn # ç›� 0x76d0:yán # ç›� 0x76d1:jiÄ�n,jiàn # 监 0x76d2:hé # ç›’ 0x76d3:yÅ« # 盓 0x76d4:kuÄ« # ç›” 0x76d5:fàn # 盕 0x76d6:gài,gÄ›,hé # ç›– 0x76d7:dào # ç›— 0x76d8:pán # 盘 0x76d9:fÇ” # ç›™ 0x76da:qiú # 盚 0x76db:shèng,chéng # ç›› 0x76dc:dào # 盜 0x76dd:lù # ç›� 0x76de:zhÇŽn # 盞 0x76df:méng # 盟 0x76e0:lí # ç›  0x76e1:jìn # 盡 0x76e2:xù # 盢 0x76e3:jiÄ�n,jiàn # 監 0x76e4:pán # 盤 0x76e5:guàn # 盥 0x76e6:Ä�n # 盦 0x76e7:lú # ç›§ 0x76e8:xÇ” # 盨 0x76e9:zhÅ�u,chóu # 盩 0x76ea:dàng # 盪 0x76eb:Ä�n # 盫 0x76ec:gÇ” # 盬 0x76ed:lì # ç›­ 0x76ee:mù # ç›® 0x76ef:dÄ«ng # 盯 0x76f0:gàn # ç›° 0x76f1:xÅ« # ç›± 0x76f2:máng # 盲 0x76f3:máng,wàng # 盳 0x76f4:zhí # ç›´ 0x76f5:qì # 盵 0x76f6:yuÇŽn # ç›¶ 0x76f7:xián,tián # ç›· 0x76f8:xiÄ�ng,xiàng # 相 0x76f9:dÇ”n # 盹 0x76fa:xÄ«n # 盺 0x76fb:xì,pÇŽn # ç›» 0x76fc:pàn # 盼 0x76fd:fÄ“ng # 盽 0x76fe:dùn # 盾 0x76ff:mín # 盿 0x7700:míng # 眀 0x7701:shÄ›ng,xÇ�ng # çœ� 0x7702:shì # 眂 0x7703:yún,hùn # 眃 0x7704:miÇŽn # 眄 0x7705:pÄ�n # 眅 0x7706:fÇŽng # 眆 0x7707:miÇŽo # 眇 0x7708:dÄ�n # 眈 0x7709:méi # 眉 0x770a:mào # 眊 0x770b:kàn,kÄ�n # 看 0x770c:xiàn # 県 0x770d:kÅ�u # çœ� 0x770e:shì # 眎 0x770f:yÄ�ng,yÇŽng,yìng # çœ� 0x7710:zhÄ“ng # çœ� 0x7711:yÇŽo,Ä�o,ÇŽo # 眑 0x7712:shÄ“n # 眒 0x7713:huò # 眓 0x7714:dà # 眔 0x7715:zhÄ›n # 眕 0x7716:kuàng # 眖 0x7717:jÅ«,xÅ«,kÅ�u # 眗 0x7718:shèn # 眘 0x7719:yí,chì # 眙 0x771a:shÄ›ng # 眚 0x771b:mèi # 眛 0x771c:mò,miè # 眜 0x771d:zhù # çœ� 0x771e:zhÄ“n # 眞 0x771f:zhÄ“n # 真 0x7720:mián # 眠 0x7721:shì # 眡 0x7722:yuÄ�n # 眢 0x7723:dié,tì # 眣 0x7724:nì # 眤 0x7725:zì # 眥 0x7726:zì # 眦 0x7727:chÇŽo # 眧 0x7728:zhÇŽ # 眨 0x7729:xuàn # 眩 0x772a:bÇ�ng,fÇŽng # 眪 0x772b:pàng,pán # 眫 0x772c:lóng # 眬 0x772d:guì,suÄ« # 眭 0x772e:tóng # 眮 0x772f:mÄ«,mí # 眯 0x7730:dié,zhì # 眰 0x7731:dì # 眱 0x7732:nè # 眲 0x7733:míng # 眳 0x7734:xuàn,shùn,xún # 眴 0x7735:chÄ« # 眵 0x7736:kuàng # 眶 0x7737:juàn # 眷 0x7738:móu # 眸 0x7739:zhèn # 眹 0x773a:tiào # 眺 0x773b:yáng # 眻 0x773c:yÇŽn # 眼 0x773d:mò # 眽 0x773e:zhòng # 眾 0x773f:mò # 眿 0x7740:zhe,zhuó,zháo,zhÄ�o # ç�€ 0x7741:zhÄ“ng # ç�� 0x7742:méi # ç�‚ 0x7743:suÅ� # ç�ƒ 0x7744:qiáo,shào,xiÄ�o # ç�„ 0x7745:hàn # ç�… 0x7746:huÇŽn # ç�† 0x7747:dì # ç�‡ 0x7748:chÄ›ng # ç�ˆ 0x7749:cuó,zhuài # ç�‰ 0x774a:juàn # ç�Š 0x774b:é # ç�‹ 0x774c:miÇŽn # ç�Œ 0x774d:xiàn # ç�� 0x774e:xÄ« # ç�Ž 0x774f:kùn # ç�� 0x7750:lài # ç�� 0x7751:jiÇŽn # ç�‘ 0x7752:shÇŽn # ç�’ 0x7753:tiÇŽn # ç�“ 0x7754:gùn # ç�” 0x7755:wÄ�n # ç�• 0x7756:lèng # ç�– 0x7757:shì # ç�— 0x7758:qióng # ç�˜ 0x7759:lì # ç�™ 0x775a:yá # ç�š 0x775b:jÄ«ng # ç�› 0x775c:zhÄ“ng # ç�œ 0x775d:lí # ç�� 0x775e:lài # ç�ž 0x775f:suì,zuì # ç�Ÿ 0x7760:juàn # ç�  0x7761:shuì # ç�¡ 0x7762:huÄ«,suÄ« # ç�¢ 0x7763:dÅ« # ç�£ 0x7764:bì # ç�¤ 0x7765:bì,pì # ç�¥ 0x7766:mù # ç�¦ 0x7767:hÅ«n # ç�§ 0x7768:nì # ç�¨ 0x7769:lù # ç�© 0x776a:yì,zé,gÄ�o # ç�ª 0x776b:jié # ç�« 0x776c:cÇŽi # ç�¬ 0x776d:zhÇ’u # ç�­ 0x776e:yú # ç�® 0x776f:hÅ«n # ç�¯ 0x7770:mà # ç�° 0x7771:xià # ç�± 0x7772:xÇ�ng,xìng # ç�² 0x7773:huÄ« # ç�³ 0x7774:hùn # ç�´ 0x7776:chÇ”n # ç�¶ 0x7777:jiÄ�n # ç�· 0x7778:mèi # ç�¸ 0x7779:dÇ” # ç�¹ 0x777a:hóu # ç�º 0x777b:xuÄ�n # ç�» 0x777c:tí # ç�¼ 0x777d:kuí # ç�½ 0x777e:gÄ�o # ç�¾ 0x777f:ruì # ç�¿ 0x7780:mào # 瞀 0x7781:xù # çž� 0x7782:fá # çž‚ 0x7783:wò # 瞃 0x7784:miáo # çž„ 0x7785:chÇ’u # çž… 0x7786:guì,wèi,kuì # 瞆 0x7787:mÄ«,mí # 瞇 0x7788:wÄ›ng # 瞈 0x7789:kòu,jì # 瞉 0x778a:dàng # 瞊 0x778b:chÄ“n # çž‹ 0x778c:kÄ“ # 瞌 0x778d:sÇ’u # çž� 0x778e:xiÄ� # 瞎 0x778f:qióng,huán # çž� 0x7790:mò # çž� 0x7791:míng # çž‘ 0x7792:mán,mén # çž’ 0x7793:fèn # çž“ 0x7794:zé # çž” 0x7795:zhàng # çž• 0x7796:yì # çž– 0x7797:diÄ�o,dÅ�u # çž— 0x7798:kÅ�u # 瞘 0x7799:mò # çž™ 0x779a:shùn # çžš 0x779b:cÅ�ng # çž› 0x779c:lóu,lǘ,lou # çžœ 0x779d:chÄ« # çž� 0x779e:mán,mén # çžž 0x779f:piÇŽo # 瞟 0x77a0:chÄ“ng # çž  0x77a1:guÄ« # çž¡ 0x77a2:méng,mÄ›ng # 瞢 0x77a4:rún,shùn # 瞤 0x77a5:piÄ“ # 瞥 0x77a6:xÄ« # 瞦 0x77a7:qiáo # çž§ 0x77a8:pú # 瞨 0x77a9:zhÇ” # çž© 0x77aa:dèng # 瞪 0x77ab:shÄ›n # çž« 0x77ac:shùn # 瞬 0x77ad:liÇŽo,liào # çž­ 0x77ae:chè # çž® 0x77af:xián,jiàn # 瞯 0x77b0:kàn # çž° 0x77b1:yè # çž± 0x77b2:xuè # çž² 0x77b3:tóng # çž³ 0x77b4:wÇ”,mí # çž´ 0x77b5:lín # çžµ 0x77b6:guì,kuì # çž¶ 0x77b7:jiàn # çž· 0x77b8:yè # 瞸 0x77b9:ài # çž¹ 0x77ba:huì # 瞺 0x77bb:zhÄ�n # çž» 0x77bc:jiÇŽn # çž¼ 0x77bd:gÇ” # çž½ 0x77be:zhào # çž¾ 0x77bf:qú,jù # çž¿ 0x77c0:wéi # 矀 0x77c1:chÇ’u # çŸ� 0x77c2:sào # 矂 0x77c3:nÇ�ng,chÄ“ng # 矃 0x77c4:xÅ«n # 矄 0x77c5:yào # 矅 0x77c6:huò,yuè # 矆 0x77c7:mÄ“ng # 矇 0x77c8:mián # 矈 0x77c9:pín # 矉 0x77ca:mián # 矊 0x77cb:lÄ›i # 矋 0x77cc:kuàng,guÅ� # 矌 0x77cd:jué # çŸ� 0x77ce:xuÄ�n # 矎 0x77cf:mián # çŸ� 0x77d0:huò # çŸ� 0x77d1:lú # 矑 0x77d2:méng,mÄ›ng # 矒 0x77d3:lóng # 矓 0x77d4:guàn,quán # 矔 0x77d5:mÇŽn,mán # 矕 0x77d6:xÇ� # 矖 0x77d7:chù # 矗 0x77d8:tÇŽng # 矘 0x77d9:kàn # 矙 0x77da:zhÇ” # 矚 0x77db:máo # 矛 0x77dc:jÄ«n,qín,guÄ�n # 矜 0x77dd:jÄ«n,qín,guÄ�n # çŸ� 0x77de:yù,xù,jué # 矞 0x77df:shuò # 矟 0x77e0:zé # 矠 0x77e1:jué # 矡 0x77e2:shÇ� # 矢 0x77e3:yÇ� # 矣 0x77e4:shÄ›n # 矤 0x77e5:zhÄ«,zhì # 知 0x77e6:hóu,hòu # 矦 0x77e7:shÄ›n # 矧 0x77e8:yÇ�ng # 矨 0x77e9:jÇ” # 矩 0x77ea:zhÅ�u # 矪 0x77eb:jiÇŽo,jiáo # 矫 0x77ec:cuó # 矬 0x77ed:duÇŽn # 短 0x77ee:ÇŽi # 矮 0x77ef:jiÇŽo,jiáo # 矯 0x77f0:zÄ“ng # 矰 0x77f1:yuÄ“ # 矱 0x77f2:bà # 矲 0x77f3:shí,dàn # 石 0x77f4:dìng # 矴 0x77f5:qì # 矵 0x77f6:jÄ« # 矶 0x77f7:zÇ� # 矷 0x77f8:gÄ�n # 矸 0x77f9:wù # 矹 0x77fa:zhé # 矺 0x77fb:kÅ« # 矻 0x77fc:gÄ�ng,qiÄ�ng,kòng # 矼 0x77fd:xÄ« # 矽 0x77fe:fán # 矾 0x77ff:kuàng # 矿 0x7800:dàng # ç € 0x7801:mÇŽ # ç � 0x7802:shÄ� # ç ‚ 0x7803:dÄ�n # ç ƒ 0x7804:jué # ç „ 0x7805:lì # ç … 0x7806:fÅ« # ç † 0x7807:mín # ç ‡ 0x7808:è # ç ˆ 0x7809:xÅ«,huÄ� # ç ‰ 0x780a:kÄ�ng # ç Š 0x780b:zhÇ� # ç ‹ 0x780c:qì,qiè # ç Œ 0x780d:kÇŽn # ç � 0x780e:jiè # ç Ž 0x780f:pÄ«n,bÄ«n,fÄ“n # ç � 0x7810:è # ç � 0x7811:yà # ç ‘ 0x7812:pÄ« # ç ’ 0x7813:zhé # ç “ 0x7814:yán,yàn # ç ” 0x7815:suì # ç • 0x7816:zhuÄ�n # ç – 0x7817:chÄ“ # ç — 0x7818:dùn # ç ˜ 0x7819:wÇŽ # ç ™ 0x781a:yàn # ç š 0x781c:fÄ“ng # ç œ 0x781d:fÇŽ # ç � 0x781e:mò # ç ž 0x781f:zhÇŽ # ç Ÿ 0x7820:jÅ« # ç   0x7821:yù # ç ¡ 0x7822:kÄ“,luÇ’ # ç ¢ 0x7823:tuó # ç £ 0x7824:tuó # ç ¤ 0x7825:dÇ� # ç ¥ 0x7826:zhài # ç ¦ 0x7827:zhÄ“n # ç § 0x7828:Ä› # ç ¨ 0x7829:fú,fèi # ç © 0x782a:mÇ” # ç ª 0x782b:zhù,zhÇ” # ç « 0x782c:lì,lÄ�,lá # ç ¬ 0x782d:biÄ�n # ç ­ 0x782e:nÇ” # ç ® 0x782f:pÄ«ng # ç ¯ 0x7830:pÄ“ng # ç ° 0x7831:líng # ç ± 0x7832:pào # ç ² 0x7833:lè # ç ³ 0x7834:pò # ç ´ 0x7835:bÅ� # ç µ 0x7836:pò # ç ¶ 0x7837:shÄ“n # ç · 0x7838:zá # ç ¸ 0x7839:ài # ç ¹ 0x783a:lì # ç º 0x783b:lóng # ç » 0x783c:tóng # ç ¼ 0x783e:lì # ç ¾ 0x7840:chÇ” # ç¡€ 0x7841:kÄ“ng # ç¡� 0x7842:quán # ç¡‚ 0x7843:zhÅ« # 硃 0x7844:kuÄ�ng,guÄ�ng # ç¡„ 0x7845:guÄ« # ç¡… 0x7846:è # 硆 0x7847:náo # 硇 0x7848:qià # 硈 0x7849:lù # 硉 0x784a:wÄ›i,guì # 硊 0x784b:ài # ç¡‹ 0x784c:luò,gè # 硌 0x784d:kèn,xiàn,gÇ”n,yÇ�n # ç¡� 0x784e:xíng # 硎 0x784f:yán,yàn # ç¡� 0x7850:dòng # ç¡� 0x7851:pÄ“ng,píng # ç¡‘ 0x7852:xÄ« # ç¡’ 0x7854:hóng # ç¡” 0x7855:shuò,shí # ç¡• 0x7856:xiá # ç¡– 0x7857:qiÄ�o # ç¡— 0x7859:wéi,wèi,ái,gài # ç¡™ 0x785a:qiáo # 硚 0x785c:kÄ“ng # 硜 0x785d:xiÄ�o # ç¡� 0x785e:què,kè,kù # 硞 0x785f:chàn # 硟 0x7860:láng # ç¡  0x7861:hÅ�ng # ç¡¡ 0x7862:yù # ç¡¢ 0x7863:xiÄ�o # ç¡£ 0x7864:xiá # 硤 0x7865:mÇŽng,bàng # ç¡¥ 0x7866:luò,lòng # 硦 0x7867:yÇ’ng,tóng # ç¡§ 0x7868:chÄ“ # 硨 0x7869:chè # ç¡© 0x786a:wò # 硪 0x786b:liú # ç¡« 0x786c:yìng # 硬 0x786d:máng # ç¡­ 0x786e:què # ç¡® 0x786f:yàn # 硯 0x7870:shÄ� # ç¡° 0x7871:kÇ”n # 硱 0x7872:yù # 硲 0x7875:lÇ” # 硵 0x7876:chÄ›n # ç¡¶ 0x7877:jiÇŽn # ç¡· 0x7878:nüè # 硸 0x7879:sÅ�ng # 硹 0x787a:zhuó # 硺 0x787b:kÄ“ng,kÄ›ng # ç¡» 0x787c:péng # 硼 0x787d:yÄ�n,yÇŽn # 硽 0x787e:zhuì,chuí,duÇ’ # 硾 0x787f:kÅ�ng # ç¡¿ 0x7880:chÄ“ng # 碀 0x7881:qí # ç¢� 0x7882:zòng,cóng # 碂 0x7883:qìng # 碃 0x7884:lín # 碄 0x7885:jÅ«n # 碅 0x7886:bÅ� # 碆 0x7887:dìng # 碇 0x7888:mín # 碈 0x7889:diÄ�o # 碉 0x788a:jiÄ�n,zhàn # 碊 0x788b:hè # 碋 0x788c:lù,liù # 碌 0x788d:ài # ç¢� 0x788e:suì # 碎 0x788f:què,xÄ« # ç¢� 0x7890:léng # ç¢� 0x7891:bÄ“i # 碑 0x7892:yín # 碒 0x7893:duì # 碓 0x7894:wÇ” # 碔 0x7895:qí # 碕 0x7896:lún,lÇ”n,lùn # 碖 0x7897:wÇŽn # 碗 0x7898:diÇŽn # 碘 0x7899:náo,gÄ�ng # 碙 0x789a:bèi # 碚 0x789b:qì # 碛 0x789c:chÄ›n # 碜 0x789d:ruÇŽn # ç¢� 0x789e:yán # 碞 0x789f:dié # 碟 0x78a0:dìng # 碠 0x78a1:zhóu # 碡 0x78a2:tuó # 碢 0x78a3:jié,yà # 碣 0x78a4:yÄ«ng # 碤 0x78a5:biÇŽn # 碥 0x78a6:kè # 碦 0x78a7:bì # 碧 0x78a8:wÄ›i,wèi # 碨 0x78a9:shuò,shí # 碩 0x78aa:zhÄ“n # 碪 0x78ab:duàn # 碫 0x78ac:xiá # 碬 0x78ad:dàng # 碭 0x78ae:tí,dÄ« # 碮 0x78af:nÇŽo # 碯 0x78b0:pèng # 碰 0x78b1:jiÇŽn # 碱 0x78b2:dì # 碲 0x78b3:tàn # 碳 0x78b4:chá,chÄ� # 碴 0x78b6:qì # 碶 0x78b8:fÄ“ng # 碸 0x78b9:xuàn # 碹 0x78ba:què # 確 0x78bb:què,qiÄ�o # 碻 0x78bc:mÇŽ # 碼 0x78bd:gÅ�ng # 碽 0x78be:niÇŽn # 碾 0x78bf:sù,xiè # 碿 0x78c0:é # 磀 0x78c1:cí # ç£� 0x78c2:liú,liù # 磂 0x78c3:sÄ«,tí # 磃 0x78c4:táng # 磄 0x78c5:bàng,páng # 磅 0x78c6:huá,kÄ›,gÅ« # 磆 0x78c7:pÄ« # 磇 0x78c8:kuÇ�,wÄ›i # 磈 0x78c9:sÇŽng # 磉 0x78ca:lÄ›i # 磊 0x78cb:cuÅ� # 磋 0x78cc:tián # 磌 0x78cd:xiá,qià,yà # ç£� 0x78ce:xÄ« # 磎 0x78cf:lián,qiÄ�n # ç£� 0x78d0:pán # ç£� 0x78d1:ái,wèi # 磑 0x78d2:yÇ”n # 磒 0x78d3:duÄ« # 磓 0x78d4:zhé # 磔 0x78d5:kÄ“ # 磕 0x78d6:lá,lÄ� # 磖 0x78d8:yáo # 磘 0x78d9:gÇ”n # 磙 0x78da:zhuÄ�n # 磚 0x78db:chán # 磛 0x78dc:qì # 磜 0x78dd:áo,qiÄ�o # ç£� 0x78de:pÄ“ng,pèng # 磞 0x78df:liù # 磟 0x78e0:lÇ” # 磠 0x78e1:kàn # 磡 0x78e2:chuÇŽng # 磢 0x78e3:chÄ›n # 磣 0x78e4:yÄ«n,yÇ�n # 磤 0x78e5:lÄ›i,léi # 磥 0x78e6:biÄ�o # 磦 0x78e7:qì # 磧 0x78e8:mó,mò # 磨 0x78e9:qì,zhú # 磩 0x78ea:cuÄ« # 磪 0x78eb:zÅ�ng # 磫 0x78ec:qìng # 磬 0x78ed:chuò # 磭 0x78ef:jÄ« # 磯 0x78f0:shàn # 磰 0x78f1:láo,luò # 磱 0x78f2:qú # 磲 0x78f3:zÄ“ng # 磳 0x78f4:dèng # 磴 0x78f5:jiàn # 磵 0x78f6:xì # 磶 0x78f7:lín # 磷 0x78f8:dìng # 磸 0x78f9:diàn # 磹 0x78fa:huáng # 磺 0x78fb:pán,bÅ� # 磻 0x78fc:jí,shé # 磼 0x78fd:qiÄ�o # 磽 0x78fe:dÄ« # 磾 0x78ff:lì # 磿 0x7901:jiÄ�o # ç¤� 0x7903:zhÇŽng # 礃 0x7904:qiáo # 礄 0x7905:dÅ«n # 礅 0x7906:jiÇŽn # 礆 0x7907:yù # 礇 0x7908:zhuì # 礈 0x7909:hé,qiÄ�o,qiào # 礉 0x790a:kè,huò # 礊 0x790b:zé # 礋 0x790c:léi,lÄ›i # 礌 0x790d:jié # ç¤� 0x790e:chÇ” # 礎 0x790f:yè # ç¤� 0x7910:què,hú # ç¤� 0x7911:dàng # 礑 0x7912:yÇ� # 礒 0x7913:jiÄ�ng # 礓 0x7914:pÄ« # 礔 0x7915:pÄ« # 礕 0x7916:yù # 礖 0x7917:pÄ«n # 礗 0x7918:è,qì # 礘 0x7919:ài # 礙 0x791a:kÄ“ # 礚 0x791b:jiÄ�n # 礛 0x791c:yù # 礜 0x791d:ruÇŽn # ç¤� 0x791e:méng # 礞 0x791f:pào # 礟 0x7920:cí # 礠 0x7921:bÅ� # 礡 0x7923:miè # 礣 0x7924:cÇŽ # 礤 0x7925:xián,xín # 礥 0x7926:kuàng # 礦 0x7927:léi,lÄ›i,lèi # 礧 0x7928:lÄ›i # 礨 0x7929:zhì # 礩 0x792a:lì # 礪 0x792b:lì # 礫 0x792c:fán # 礬 0x792d:què # 礭 0x792e:pào # 礮 0x792f:yÄ«ng # 礯 0x7930:lì # 礰 0x7931:lóng # 礱 0x7932:lóng # 礲 0x7933:mò # 礳 0x7934:bó # 礴 0x7935:shuÄ�ng # 礵 0x7936:guàn # 礶 0x7937:jiÄ�n # 礷 0x7938:cÇŽ # 礸 0x7939:yán,yÇŽn # 礹 0x793a:shì # 示 0x793b:shì # 礻 0x793c:lÇ� # 礼 0x793d:réng # 礽 0x793e:shè # 社 0x793f:yuè # 礿 0x7940:sì # 祀 0x7941:qí # ç¥� 0x7942:tÄ� # 祂 0x7943:mà # 祃 0x7944:xiè # 祄 0x7945:yÄ�o # 祅 0x7946:xiÄ�n # 祆 0x7947:zhÇ�,qí # 祇 0x7948:qí # 祈 0x7949:zhÇ� # 祉 0x794a:bÄ“ng,fÄ�ng # 祊 0x794b:duì # 祋 0x794c:zhòng # 祌 0x794e:yÄ« # 祎 0x794f:shí # ç¥� 0x7950:yòu # ç¥� 0x7951:zhì # 祑 0x7952:tiáo # 祒 0x7953:fú # 祓 0x7954:fù # 祔 0x7955:mì,bì # 祕 0x7956:zÇ” # 祖 0x7957:zhÄ« # 祗 0x7958:suàn # 祘 0x7959:mèi # 祙 0x795a:zuò # 祚 0x795b:qÅ« # 祛 0x795c:hù # 祜 0x795d:zhù # ç¥� 0x795e:shén # 神 0x795f:suì # 祟 0x7960:cí # 祠 0x7961:chái # 祡 0x7962:mí # 祢 0x7963:lÇš # 祣 0x7964:yÇ” # 祤 0x7965:xiáng # 祥 0x7966:wú # 祦 0x7967:tiÄ�o # 祧 0x7968:piào,piÄ�o # 票 0x7969:zhù # 祩 0x796a:guÇ� # 祪 0x796b:xiá # 祫 0x796c:zhÄ« # 祬 0x796d:jì,zhài # 祭 0x796e:gào # 祮 0x796f:zhÄ“n # 祯 0x7970:gào # 祰 0x7971:shuì,lèi # 祱 0x7972:jìn # 祲 0x7973:shèn # 祳 0x7974:gÄ�i # 祴 0x7975:kÇ”n # 祵 0x7976:dì # 祶 0x7977:dÇŽo # 祷 0x7978:huò # 祸 0x7979:táo # 祹 0x797a:qí # 祺 0x797b:gù # 祻 0x797c:guàn # 祼 0x797d:zuì # 祽 0x797e:líng # 祾 0x797f:lù # 祿 0x7980:bÇ�ng # 禀 0x7981:jÄ«n,jìn # ç¦� 0x7982:dÇŽo # 禂 0x7983:zhí # 禃 0x7984:lù # 禄 0x7985:chán,shàn # 禅 0x7986:bì,pí # 禆 0x7987:chÇ” # 禇 0x7988:huÄ« # 禈 0x7989:yÇ’u # 禉 0x798a:xì # 禊 0x798b:yÄ«n # 禋 0x798c:zÄ« # 禌 0x798d:huò # ç¦� 0x798e:zhÄ“n # 禎 0x798f:fú # ç¦� 0x7990:yuàn # ç¦� 0x7991:xú # 禑 0x7992:xiÇŽn # 禒 0x7993:shÄ�ng,yáng # 禓 0x7994:tí,zhÇ� # 禔 0x7995:yÄ« # 禕 0x7996:méi # 禖 0x7997:sÄ« # 禗 0x7998:dì # 禘 0x799a:zhuó # 禚 0x799b:zhÄ“n # 禛 0x799c:yíng # 禜 0x799d:jì # ç¦� 0x799e:gào # 禞 0x799f:táng # 禟 0x79a0:sÄ« # 禠 0x79a1:mà # 禡 0x79a2:tà # 禢 0x79a4:xuÄ�n # 禤 0x79a5:qí # 禥 0x79a6:yù # 禦 0x79a7:xÇ� # 禧 0x79a8:jÄ«,jì # 禨 0x79a9:sì # 禩 0x79aa:shàn,chán # 禪 0x79ab:dàn # 禫 0x79ac:guì # 禬 0x79ad:suì # 禭 0x79ae:lÇ� # 禮 0x79af:nóng # 禯 0x79b0:mí # 禰 0x79b1:dÇŽo # 禱 0x79b2:lì # 禲 0x79b3:ráng # 禳 0x79b4:yuè # 禴 0x79b5:tí # 禵 0x79b6:zàn # 禶 0x79b7:lèi # 禷 0x79b8:róu # 禸 0x79b9:yÇ” # 禹 0x79ba:yú,yù,Ç’u # 禺 0x79bb:lí # 离 0x79bc:xiè # 禼 0x79bd:qín # 禽 0x79be:hé # 禾 0x79bf:tÅ« # 禿 0x79c0:xiù # ç§€ 0x79c1:sÄ« # ç§� 0x79c2:rén # ç§‚ 0x79c3:tÅ« # 秃 0x79c4:zÇ�,zì # ç§„ 0x79c5:chá,ná # ç§… 0x79c6:gÇŽn # 秆 0x79c7:yì,zhí # 秇 0x79c8:xiÄ�n # 秈 0x79c9:bÇ�ng # 秉 0x79ca:nián # ç§Š 0x79cb:qiÅ« # ç§‹ 0x79cc:qiÅ« # ç§Œ 0x79cd:zhÇ’ng,zhòng,chóng # ç§� 0x79ce:fèn # ç§Ž 0x79cf:hào,mào # ç§� 0x79d0:yún # ç§� 0x79d1:kÄ“ # ç§‘ 0x79d2:miÇŽo # ç§’ 0x79d3:zhÄ« # ç§“ 0x79d4:jÄ«ng # ç§” 0x79d5:bÇ� # ç§• 0x79d6:zhÇ� # ç§– 0x79d7:yù # ç§— 0x79d8:mì,bì # 秘 0x79d9:kù,kÅ« # ç§™ 0x79da:bàn # ç§š 0x79db:pÄ« # ç§› 0x79dc:ní,nì # ç§œ 0x79dd:lì # ç§� 0x79de:yóu # ç§ž 0x79df:zÅ« # ç§Ÿ 0x79e0:pÄ« # ç§  0x79e1:bó # ç§¡ 0x79e2:líng # ç§¢ 0x79e3:mò # ç§£ 0x79e4:chèng # 秤 0x79e5:nián # ç§¥ 0x79e6:qín # 秦 0x79e7:yÄ�ng # ç§§ 0x79e8:zuó # 秨 0x79e9:zhì # ç§© 0x79ea:dÄ« # 秪 0x79eb:shú # ç§« 0x79ec:jù # 秬 0x79ed:zÇ� # ç§­ 0x79ee:huó,kuò # ç§® 0x79ef:jÄ« # 积 0x79f0:chÄ“ng,chèn,chèng # ç§° 0x79f1:tóng # ç§± 0x79f2:shì,zhì # ç§² 0x79f3:huó,kuò # ç§³ 0x79f4:huÅ� # ç§´ 0x79f5:yÄ«n # ç§µ 0x79f6:zÄ« # ç§¶ 0x79f7:zhì # ç§· 0x79f8:jiÄ“ # 秸 0x79f9:rÄ›n # ç§¹ 0x79fa:dù # 秺 0x79fb:yí # ç§» 0x79fc:zhÅ« # ç§¼ 0x79fd:huì # ç§½ 0x79fe:nóng # ç§¾ 0x79ff:fù,pÅ« # ç§¿ 0x7a00:xÄ« # 稀 0x7a01:gÇŽo # ç¨� 0x7a02:láng # 稂 0x7a03:fÅ« # 稃 0x7a04:xùn,zè # 稄 0x7a05:shuì # 稅 0x7a06:lÇš # 稆 0x7a07:kÇ”n # 稇 0x7a08:gÇŽn # 稈 0x7a09:jÄ«ng # 稉 0x7a0a:tí # 稊 0x7a0b:chéng # 程 0x7a0c:tú,shÇ” # 稌 0x7a0d:shÄ�o,shào # ç¨� 0x7a0e:shuì # 税 0x7a0f:yà # ç¨� 0x7a10:lÇ”n # ç¨� 0x7a11:lù # 稑 0x7a12:gÅ« # 稒 0x7a13:zuó # 稓 0x7a14:rÄ›n # 稔 0x7a15:zhùn,zhÇ”n # 稕 0x7a16:bàng # 稖 0x7a17:bài # 稗 0x7a18:jÄ«,qí # 稘 0x7a19:zhÄ« # 稙 0x7a1a:zhì # 稚 0x7a1b:kÇ”n # 稛 0x7a1c:léng,lÄ“ng,líng # 稜 0x7a1d:péng # ç¨� 0x7a1e:kÄ“ # 稞 0x7a1f:bÇ�ng # 稟 0x7a20:chóu # 稠 0x7a21:zuì,zú,sÅ« # 稡 0x7a22:yù # 稢 0x7a23:sÅ« # 稣 0x7a24:lüè # 稤 0x7a26:yÄ« # 稦 0x7a27:xì,qiè # 稧 0x7a28:biÇŽn # 稨 0x7a29:jì # 稩 0x7a2a:fú # 稪 0x7a2b:pì,bì # 稫 0x7a2c:nuò # 稬 0x7a2d:jiÄ“ # 稭 0x7a2e:zhÇ’ng,zhòng # 種 0x7a2f:zÅ�ng,zÇ’ng # 稯 0x7a30:xÇ”,xÅ« # 稰 0x7a31:chÄ“ng,chèn,chèng # 稱 0x7a32:dào # 稲 0x7a33:wÄ›n # 稳 0x7a34:xián,jiÄ�n,liàn # 稴 0x7a35:zÄ«,jiÅ« # 稵 0x7a36:yù # 稶 0x7a37:jì # 稷 0x7a38:xù # 稸 0x7a39:zhÄ›n # 稹 0x7a3a:zhì # 稺 0x7a3b:dào # 稻 0x7a3c:jià # 稼 0x7a3d:jÄ«,qÇ� # 稽 0x7a3e:gÇŽo # 稾 0x7a3f:gÇŽo # 稿 0x7a40:gÇ” # ç©€ 0x7a41:róng # ç©� 0x7a42:suì # ç©‚ 0x7a44:jì # ç©„ 0x7a45:kÄ�ng # ç©… 0x7a46:mù # 穆 0x7a47:cÇŽn,shÄ�n,cÄ“n # 穇 0x7a48:mén,méi # 穈 0x7a49:zhì # 穉 0x7a4a:jì # 穊 0x7a4b:lù # ç©‹ 0x7a4c:sÅ« # 穌 0x7a4d:jÄ« # ç©� 0x7a4e:yÇ�ng # 穎 0x7a4f:wÄ›n # ç©� 0x7a50:qiÅ« # ç©� 0x7a51:sè # ç©‘ 0x7a53:yì # ç©“ 0x7a54:huáng # ç©” 0x7a55:qiè # ç©• 0x7a56:jÇ�,jì # ç©– 0x7a57:suì # ç©— 0x7a58:xiÄ�o,rào # 穘 0x7a59:pú # ç©™ 0x7a5a:jiÄ�o # 穚 0x7a5b:zhuÅ�,bó # ç©› 0x7a5c:tóng,zhÇ’ng # 穜 0x7a5e:lÇ” # 穞 0x7a5f:suì # 穟 0x7a60:nóng # ç©  0x7a61:sè # ç©¡ 0x7a62:huì # ç©¢ 0x7a63:ráng # ç©£ 0x7a64:nuò # 穤 0x7a65:yÇ” # ç©¥ 0x7a67:jì # ç©§ 0x7a68:tuí # 穨 0x7a69:wÄ›n # ç©© 0x7a6a:chÄ“ng,chèn,chèng # 穪 0x7a6b:huò # ç©« 0x7a6c:kuàng # 穬 0x7a6d:lÇš # ç©­ 0x7a6e:biÄ�o,pÄ�o # ç©® 0x7a70:ráng # ç©° 0x7a71:zhuÅ�,jué # 穱 0x7a72:lí # 穲 0x7a73:cuán,zàn # 穳 0x7a74:xué # ç©´ 0x7a75:wÄ� # 穵 0x7a76:jiÅ« # ç©¶ 0x7a77:qióng # ç©· 0x7a78:xÄ« # 穸 0x7a79:qióng # 穹 0x7a7a:kÅ�ng,kòng,kÇ’ng # 空 0x7a7b:yÅ«,yÇ” # ç©» 0x7a7c:shÄ“n # 穼 0x7a7d:jÇ�ng # 穽 0x7a7e:yào # 穾 0x7a7f:chuÄ�n # ç©¿ 0x7a80:zhÅ«n # 窀 0x7a81:tÅ« # çª� 0x7a82:láo # 窂 0x7a83:qiè # 窃 0x7a84:zhÇŽi # 窄 0x7a85:yÇŽo # 窅 0x7a86:biÇŽn # 窆 0x7a87:báo # 窇 0x7a88:yÇŽo # 窈 0x7a89:bìng # 窉 0x7a8a:wÄ� # 窊 0x7a8b:zhú,kÅ« # 窋 0x7a8c:jiào,liáo,liù # 窌 0x7a8d:qiào # çª� 0x7a8e:diào # 窎 0x7a8f:wÅ« # çª� 0x7a90:wÄ�,guÄ« # çª� 0x7a91:yáo # 窑 0x7a92:zhì # 窒 0x7a93:chuÄ�ng # 窓 0x7a94:yào # 窔 0x7a95:tiÇŽo,yáo # 窕 0x7a96:jiào # 窖 0x7a97:chuÄ�ng # 窗 0x7a98:jiÇ’ng # 窘 0x7a99:xiÄ�o # 窙 0x7a9a:chéng # 窚 0x7a9b:kòu # 窛 0x7a9c:cuàn # 窜 0x7a9d:wÅ� # çª� 0x7a9e:dàn # 窞 0x7a9f:kÅ« # 窟 0x7aa0:kÄ“ # 窠 0x7aa1:zhuó # 窡 0x7aa2:huò # 窢 0x7aa3:sÅ« # 窣 0x7aa5:kuÄ« # 窥 0x7aa6:dòu # 窦 0x7aa8:yìn,xÅ«n # 窨 0x7aa9:wÅ� # 窩 0x7aaa:wÄ� # 窪 0x7aab:yà,yÄ“ # 窫 0x7aac:yú # 窬 0x7aad:jù # 窭 0x7aae:qióng # 窮 0x7aaf:yáo # 窯 0x7ab0:yáo # 窰 0x7ab1:tiÇŽo # 窱 0x7ab2:cháo # 窲 0x7ab3:yÇ” # 窳 0x7ab4:tián,diÄ�n,yÇŽn # 窴 0x7ab5:diào # 窵 0x7ab6:jù # 窶 0x7ab7:liào # 窷 0x7ab8:xÄ« # 窸 0x7ab9:wù # 窹 0x7aba:kuÄ« # 窺 0x7abb:chuÄ�ng # 窻 0x7abc:chÄ�o,kÄ“ # 窼 0x7abe:kuÇŽn,cuàn # 窾 0x7abf:lóng # 窿 0x7ac0:chÄ“ng,chèng # ç«€ 0x7ac1:cuì # ç«� 0x7ac2:liáo # ç«‚ 0x7ac3:zào # 竃 0x7ac4:cuàn # ç«„ 0x7ac5:qiào # ç«… 0x7ac6:qióng # 竆 0x7ac7:dòu # 竇 0x7ac8:zào # 竈 0x7ac9:lÇ’ng # 竉 0x7aca:qiè # 竊 0x7acb:lì # ç«‹ 0x7acc:chù # 竌 0x7ace:fù # 竎 0x7ad0:chù,qì # ç«� 0x7ad1:hóng # ç«‘ 0x7ad2:qí # ç«’ 0x7ad6:shù # ç«– 0x7ad7:miào # ç«— 0x7ad8:qÇ”,kÇ’u # 竘 0x7ad9:zhàn # ç«™ 0x7ada:zhù # 竚 0x7adb:líng # ç«› 0x7adc:lóng # 竜 0x7add:bìng # ç«� 0x7ade:jìng # 竞 0x7adf:jìng # 竟 0x7ae0:zhÄ�ng # ç«  0x7ae2:sì # ç«¢ 0x7ae3:jùn # ç«£ 0x7ae4:hóng # 竤 0x7ae5:tóng # ç«¥ 0x7ae6:sÇ’ng # 竦 0x7ae7:jìng,zhÄ›n # ç«§ 0x7ae8:diào # 竨 0x7ae9:yì # ç«© 0x7aea:shù # 竪 0x7aeb:jìng # ç«« 0x7aec:qÇ” # 竬 0x7aed:jié # ç«­ 0x7aee:píng # ç«® 0x7aef:duÄ�n # 端 0x7af0:lí # ç«° 0x7af1:zhuÇŽn # 竱 0x7af2:céng,zÄ“ng # 竲 0x7af3:dÄ“ng # 竳 0x7af4:cÅ«n # ç«´ 0x7af5:wÄ�i # 竵 0x7af6:jìng # ç«¶ 0x7af7:kÇŽn,kàn # ç«· 0x7af8:jìng # 竸 0x7af9:zhú # 竹 0x7afa:zhú,dÇ” # 竺 0x7afb:lè,jÄ«n # ç«» 0x7afc:péng # 竼 0x7afd:yú # 竽 0x7afe:chí # 竾 0x7aff:gÄ�n # ç«¿ 0x7b00:máng # 笀 0x7b01:zhú # ç¬� 0x7b03:dÇ” # 笃 0x7b04:jÄ« # 笄 0x7b05:jiÇŽo,jiào # 笅 0x7b06:bÄ� # 笆 0x7b07:suàn # 笇 0x7b08:jí # 笈 0x7b09:qÇ�n # 笉 0x7b0a:zhào # 笊 0x7b0b:sÇ”n # 笋 0x7b0c:yá # 笌 0x7b0d:zhuì,ruì # ç¬� 0x7b0e:yuán # 笎 0x7b0f:hù # ç¬� 0x7b10:háng,hàng # ç¬� 0x7b11:xiào # 笑 0x7b12:cén,jìn,hán # 笒 0x7b13:pí,bì # 笓 0x7b14:bÇ� # 笔 0x7b15:jiÇŽn # 笕 0x7b16:yÇ� # 笖 0x7b17:dÅ�ng # 笗 0x7b18:shÄ�n # 笘 0x7b19:shÄ“ng # 笙 0x7b1a:dÄ�,xiá,nà # 笚 0x7b1b:dí # 笛 0x7b1c:zhú # 笜 0x7b1d:nà # ç¬� 0x7b1e:chÄ« # 笞 0x7b1f:gÅ« # 笟 0x7b20:lì # 笠 0x7b21:qiè # 笡 0x7b22:mÇ�n # 笢 0x7b23:bÄ�o # 笣 0x7b24:tiáo # 笤 0x7b25:sì # 笥 0x7b26:fú # 符 0x7b27:cè # 笧 0x7b28:bèn # 笨 0x7b29:fá # 笩 0x7b2a:dá # 笪 0x7b2b:zÇ� # 笫 0x7b2c:dì # 第 0x7b2d:líng # 笭 0x7b2e:zuó,zé # 笮 0x7b2f:nú # 笯 0x7b30:fú,fèi # 笰 0x7b31:gÇ’u # 笱 0x7b32:fán # 笲 0x7b33:jiÄ� # 笳 0x7b34:gÄ›,gÇŽn # 笴 0x7b35:fàn # 笵 0x7b36:shÇ� # 笶 0x7b37:mÇŽo # 笷 0x7b38:pÇ’ # 笸 0x7b3a:jiÄ�n # 笺 0x7b3b:qióng # 笻 0x7b3c:lóng,lÇ’ng # 笼 0x7b3e:biÄ�n # 笾 0x7b3f:luò # 笿 0x7b40:guì # ç­€ 0x7b41:qÅ« # ç­� 0x7b42:chí # ç­‚ 0x7b43:yÄ«n # ç­ƒ 0x7b44:yào # ç­„ 0x7b45:xiÇŽn # ç­… 0x7b46:bÇ� # ç­† 0x7b47:qióng # ç­‡ 0x7b48:kuò # ç­ˆ 0x7b49:dÄ›ng # ç­‰ 0x7b4a:jiÇŽo,jiào # ç­Š 0x7b4b:jÄ«n # ç­‹ 0x7b4c:quán # ç­Œ 0x7b4d:sÇ”n # ç­� 0x7b4e:rú # ç­Ž 0x7b4f:fá # ç­� 0x7b50:kuÄ�ng # ç­� 0x7b51:zhù,zhú # ç­‘ 0x7b52:tÇ’ng # ç­’ 0x7b53:jÄ« # ç­“ 0x7b54:dá,dÄ� # ç­” 0x7b55:háng # ç­• 0x7b56:cè # ç­– 0x7b57:zhòng # ç­— 0x7b58:kòu # ç­˜ 0x7b59:lái # ç­™ 0x7b5a:bì # ç­š 0x7b5b:shÄ�i # ç­› 0x7b5c:dÄ�ng # ç­œ 0x7b5d:zhÄ“ng # ç­� 0x7b5e:cè # ç­ž 0x7b5f:fÅ« # ç­Ÿ 0x7b60:yún,jÅ«n # ç­  0x7b61:tú # ç­¡ 0x7b62:pá # ç­¢ 0x7b63:lí # ç­£ 0x7b64:láng,làng # ç­¤ 0x7b65:jÇ” # ç­¥ 0x7b66:guÇŽn # ç­¦ 0x7b67:jiÇŽn # ç­§ 0x7b68:hán # ç­¨ 0x7b69:tÇ’ng # ç­© 0x7b6a:xiá # ç­ª 0x7b6b:zhì,zhÇ� # ç­« 0x7b6c:chéng # ç­¬ 0x7b6d:suàn # ç­­ 0x7b6e:shì # ç­® 0x7b6f:zhù # ç­¯ 0x7b70:zuó # ç­° 0x7b71:xiÇŽo # ç­± 0x7b72:shÄ�o # ç­² 0x7b73:tíng # ç­³ 0x7b74:cè,jiÄ� # ç­´ 0x7b75:yán # ç­µ 0x7b76:gào # ç­¶ 0x7b77:kuài # ç­· 0x7b78:gÄ�n # ç­¸ 0x7b79:chóu # ç­¹ 0x7b7b:gàng # ç­» 0x7b7c:yún # ç­¼ 0x7b7e:qiÄ�n # ç­¾ 0x7b7f:xiÇŽo # ç­¿ 0x7b80:jiÇŽn # 简 0x7b81:póu,bù,fú,pú # ç®� 0x7b82:lái # 箂 0x7b83:zÅ�u # 箃 0x7b84:pái,bÄ“i # 箄 0x7b85:bì # ç®… 0x7b86:bì # 箆 0x7b87:gè # 箇 0x7b88:tái,chí # 箈 0x7b89:guÇŽi,dài # 箉 0x7b8a:yÅ« # 箊 0x7b8b:jiÄ�n # 箋 0x7b8c:zhào,dào # 箌 0x7b8d:gÅ« # ç®� 0x7b8e:chí # 箎 0x7b8f:zhÄ“ng # ç®� 0x7b90:qìng,jÄ«ng # ç®� 0x7b91:shà # 箑 0x7b92:zhÇ’u # ç®’ 0x7b93:lù # 箓 0x7b94:bó # ç®” 0x7b95:jÄ« # 箕 0x7b96:lín,lÇ�n # ç®– 0x7b97:suàn # ç®— 0x7b98:jùn,qÅ«n # 箘 0x7b99:fú # ç®™ 0x7b9a:zhá # 箚 0x7b9b:gÅ« # ç®› 0x7b9c:kÅ�ng # 箜 0x7b9d:qián # ç®� 0x7b9e:quÄ�n # 箞 0x7b9f:jùn # 箟 0x7ba0:chuí # ç®  0x7ba1:guÇŽn # 管 0x7ba2:wÇŽn,yuÄ�n # 箢 0x7ba3:cè # 箣 0x7ba4:zú # 箤 0x7ba5:pÇ’ # 箥 0x7ba6:zé # 箦 0x7ba7:qiè # ç®§ 0x7ba8:tuò # 箨 0x7ba9:luó # 箩 0x7baa:dÄ�n # 箪 0x7bab:xiÄ�o # 箫 0x7bac:ruò # 箬 0x7bad:jiàn # ç®­ 0x7baf:biÄ�n # 箯 0x7bb0:sÇ”n # ç®° 0x7bb1:xiÄ�ng # ç®± 0x7bb2:xiÇŽn # 箲 0x7bb3:píng # 箳 0x7bb4:zhÄ“n # ç®´ 0x7bb5:xÄ«ng # 箵 0x7bb6:hú # ç®¶ 0x7bb7:shÄ«,yí # ç®· 0x7bb8:zhù # 箸 0x7bb9:yuÄ“,yào,chuò # 箹 0x7bba:chÅ«n # 箺 0x7bbb:lÇœ # ç®» 0x7bbc:wÅ« # 箼 0x7bbd:dÇ’ng # 箽 0x7bbe:shuò,xiÄ�o,qiào # 箾 0x7bbf:jí # 箿 0x7bc0:jié # 節 0x7bc1:huáng # ç¯� 0x7bc2:xÄ«ng # 篂 0x7bc3:mèi # 篃 0x7bc4:fàn # 範 0x7bc5:chuán # 篅 0x7bc6:zhuàn # 篆 0x7bc7:piÄ�n # 篇 0x7bc8:fÄ“ng # 篈 0x7bc9:zhù,zhú # 築 0x7bca:hóng # 篊 0x7bcb:qiè # 篋 0x7bcc:hóu # 篌 0x7bcd:qiÅ« # ç¯� 0x7bce:miÇŽo # 篎 0x7bcf:qiàn # ç¯� 0x7bd1:kuì # 篑 0x7bd3:lÇ’u # 篓 0x7bd4:yún # 篔 0x7bd5:hé # 篕 0x7bd6:táng # 篖 0x7bd7:yuè # 篗 0x7bd8:chÅ�u # 篘 0x7bd9:gÄ�o # 篙 0x7bda:fÄ›i # 篚 0x7bdb:ruò # 篛 0x7bdc:zhÄ“ng # 篜 0x7bdd:gÅ�u # ç¯� 0x7bde:niè # 篞 0x7bdf:qiàn # 篟 0x7be0:xiÇŽo # 篠 0x7be1:cuàn # 篡 0x7be2:gÅ�ng,gÇŽn,lÇ’ng # 篢 0x7be3:péng,páng # 篣 0x7be4:dÇ” # 篤 0x7be5:lì # 篥 0x7be6:bì # 篦 0x7be7:zhuó,huò # 篧 0x7be8:chú # 篨 0x7be9:shÄ�i # 篩 0x7bea:chí # 篪 0x7beb:zhù # 篫 0x7bec:qiÄ�ng,cÄ�ng # 篬 0x7bed:lóng,lÇ’ng # 篭 0x7bee:lán # 篮 0x7bef:jiÇŽn,jiÄ�n # 篯 0x7bf0:bù # 篰 0x7bf1:lí # 篱 0x7bf2:huì # 篲 0x7bf3:bì # 篳 0x7bf4:zhú,dí # 篴 0x7bf5:cÅ�ng # 篵 0x7bf6:yÄ�n # 篶 0x7bf7:péng # 篷 0x7bf8:cÄ“n,zÄ�n,cÇŽn # 篸 0x7bf9:zhuàn,zuàn,suÇŽn # 篹 0x7bfa:pí # 篺 0x7bfb:piÇŽo,biÄ�o # 篻 0x7bfc:dÅ�u # 篼 0x7bfd:yù # 篽 0x7bfe:miè # 篾 0x7bff:tuán,zhuÄ�n # 篿 0x7c00:zé # ç°€ 0x7c01:shÄ�i # ç°� 0x7c02:guó,guì # ç°‚ 0x7c03:yí # ç°ƒ 0x7c04:hù # ç°„ 0x7c05:chÇŽn # ç°… 0x7c06:kòu # ç°† 0x7c07:cù # ç°‡ 0x7c08:píng # ç°ˆ 0x7c09:zào # ç°‰ 0x7c0a:jÄ« # ç°Š 0x7c0b:guÇ� # ç°‹ 0x7c0c:sù # ç°Œ 0x7c0d:lÇ’u # ç°� 0x7c0e:cè,jí # ç°Ž 0x7c0f:lù # ç°� 0x7c10:niÇŽn # ç°� 0x7c11:suÅ� # ç°‘ 0x7c12:cuàn # ç°’ 0x7c14:suÅ� # ç°” 0x7c15:lè # ç°• 0x7c16:duàn # ç°– 0x7c18:xiÄ�o # ç°˜ 0x7c19:bó # ç°™ 0x7c1a:mì,miè # ç°š 0x7c1b:shÄ�i,sÄ« # ç°› 0x7c1c:dàng # ç°œ 0x7c1d:liáo # ç°� 0x7c1e:dÄ�n # ç°ž 0x7c1f:diàn # ç°Ÿ 0x7c20:fÇ” # ç°  0x7c21:jiÇŽn # ç°¡ 0x7c22:mÇ�n # ç°¢ 0x7c23:kuì # ç°£ 0x7c24:dài # ç°¤ 0x7c25:jiÄ�o # ç°¥ 0x7c26:dÄ“ng # ç°¦ 0x7c27:huáng # ç°§ 0x7c28:sÇ”n,zhuàn # ç°¨ 0x7c29:láo # ç°© 0x7c2a:zÄ�n # ç°ª 0x7c2b:xiÄ�o # ç°« 0x7c2c:lù # ç°¬ 0x7c2d:shì # ç°­ 0x7c2e:zÄ�n # ç°® 0x7c30:pái # ç°° 0x7c32:pái # ç°² 0x7c33:gÇŽn,gàn # ç°³ 0x7c34:jù # ç°´ 0x7c35:lù # ç°µ 0x7c36:lù # ç°¶ 0x7c37:yán # ç°· 0x7c38:bò,bÇ’ # ç°¸ 0x7c39:dÄ�ng # ç°¹ 0x7c3a:sài # ç°º 0x7c3b:zhuÄ� # ç°» 0x7c3c:gÅ�u # ç°¼ 0x7c3d:qiÄ�n # ç°½ 0x7c3e:lián # ç°¾ 0x7c3f:bù,bó # ç°¿ 0x7c40:zhòu # ç±€ 0x7c41:lài # ç±� 0x7c43:lán # 籃 0x7c44:kuì # 籄 0x7c45:yú # ç±… 0x7c46:yuè # 籆 0x7c47:háo # 籇 0x7c48:zhÄ“n,jiÄ�n # 籈 0x7c49:tái # 籉 0x7c4a:tì # 籊 0x7c4b:niè # 籋 0x7c4c:chóu # 籌 0x7c4d:jí # ç±� 0x7c50:téng # ç±� 0x7c51:zhuàn # 籑 0x7c52:zhòu # ç±’ 0x7c53:fÄ�n,pÄ�n,biÄ�n # 籓 0x7c54:sÇ’u,shÇ” # ç±” 0x7c55:zhòu # 籕 0x7c57:zhuó # ç±— 0x7c58:téng # 籘 0x7c59:lù # ç±™ 0x7c5a:lú # 籚 0x7c5b:jiÇŽn,jiÄ�n # ç±› 0x7c5c:tuò # 籜 0x7c5d:yíng # ç±� 0x7c5e:yù # 籞 0x7c5f:lài # 籟 0x7c60:lóng,lÇ’ng # ç±  0x7c62:lián # ç±¢ 0x7c63:lán # ç±£ 0x7c64:qiÄ�n # 籤 0x7c65:yuè # ç±¥ 0x7c66:zhÅ�ng # 籦 0x7c67:qú # ç±§ 0x7c68:lián # 籨 0x7c69:biÄ�n # 籩 0x7c6a:duàn # 籪 0x7c6b:zuÇŽn # 籫 0x7c6c:lí # 籬 0x7c6d:shÄ�i # ç±­ 0x7c6e:luó # ç±® 0x7c6f:yíng # 籯 0x7c70:yuè # ç±° 0x7c71:zhuó # ç±± 0x7c72:yù # ç±² 0x7c73:mÇ� # ç±³ 0x7c74:dí # ç±´ 0x7c75:fán # ç±µ 0x7c76:shÄ“n # ç±¶ 0x7c77:zhé # ç±· 0x7c78:shÄ“n # 籸 0x7c79:nÇš # ç±¹ 0x7c7a:hé # 籺 0x7c7b:lèi # ç±» 0x7c7c:xiÄ�n # ç±¼ 0x7c7d:zÇ� # ç±½ 0x7c7e:ní # ç±¾ 0x7c7f:cùn # 籿 0x7c81:qiÄ�n # ç²� 0x7c83:bÇ� # 粃 0x7c84:bÇŽn # 粄 0x7c85:wù # ç²… 0x7c86:shÄ�,chÇŽo # 粆 0x7c87:kÄ�ng,jÄ«ng # 粇 0x7c88:róu # 粈 0x7c89:fÄ›n # 粉 0x7c8a:bì # 粊 0x7c8b:cuì # 粋 0x7c8d:zhé # ç²� 0x7c8e:mÇ� # 粎 0x7c91:bÄ� # 粑 0x7c92:lì # ç²’ 0x7c93:gÄ�n # 粓 0x7c94:jù # ç²” 0x7c95:pò # 粕 0x7c96:yù # ç²– 0x7c97:cÅ« # ç²— 0x7c98:nián,zhÄ�n # 粘 0x7c99:zhòu # ç²™ 0x7c9a:chÄ« # 粚 0x7c9b:sù # ç²› 0x7c9c:tiào # 粜 0x7c9d:lì # ç²� 0x7c9e:xÄ« # 粞 0x7c9f:sù # 粟 0x7ca0:hóng # ç²  0x7ca1:tóng # 粡 0x7ca2:zÄ«,cí # ç²¢ 0x7ca3:cè,sè # ç²£ 0x7ca4:yuè # 粤 0x7ca5:zhÅ�u,yù # ç²¥ 0x7ca6:lín # 粦 0x7ca7:zhuÄ�ng # ç²§ 0x7ca8:bÇŽi # 粨 0x7caa:fèn # 粪 0x7cae:liáng # ç²® 0x7caf:xiàn # 粯 0x7cb0:fÅ«,fú # ç²° 0x7cb1:liáng # ç²± 0x7cb2:càn # ç²² 0x7cb3:jÄ«ng # ç²³ 0x7cb4:lÇ� # ç²´ 0x7cb5:yuè # ç²µ 0x7cb6:lù # ç²¶ 0x7cb7:jú # ç²· 0x7cb8:qí # 粸 0x7cb9:cuì # ç²¹ 0x7cba:bài # 粺 0x7cbb:zhÄ�ng # ç²» 0x7cbc:lín # ç²¼ 0x7cbd:zòng # ç²½ 0x7cbe:jÄ«ng # ç²¾ 0x7cbf:guÇ’ # 粿 0x7cc1:sÇŽn,shÄ“n # ç³� 0x7cc2:shÄ“n # 糂 0x7cc3:táng # 糃 0x7cc4:biÄ�n,biÇŽn # 糄 0x7cc5:róu # ç³… 0x7cc6:miàn # 糆 0x7cc7:hóu # 糇 0x7cc8:xÇ” # 糈 0x7cc9:zòng # 糉 0x7cca:hÅ«,hú,hù # 糊 0x7ccb:jiàn # 糋 0x7ccc:zÄ�n # 糌 0x7ccd:cí # ç³� 0x7cce:lí # 糎 0x7ccf:xiè # ç³� 0x7cd0:fÅ« # ç³� 0x7cd1:nuò # 糑 0x7cd2:bèi # ç³’ 0x7cd3:gÇ”,gòu # 糓 0x7cd4:xiÇ” # ç³” 0x7cd5:gÄ�o # 糕 0x7cd6:táng # ç³– 0x7cd7:qiÇ” # ç³— 0x7cd9:cÄ�o # ç³™ 0x7cda:zhuÄ�ng # 糚 0x7cdb:táng # ç³› 0x7cdc:mí,méi # 糜 0x7cdd:sÇŽn,shÄ“n # ç³� 0x7cde:fèn # 糞 0x7cdf:zÄ�o # 糟 0x7ce0:kÄ�ng # ç³  0x7ce1:jiàng # 糡 0x7ce2:mó # ç³¢ 0x7ce3:sÇŽn,shÄ“n # ç³£ 0x7ce4:sÇŽn # 糤 0x7ce5:nuò # ç³¥ 0x7ce6:xÄ« # 糦 0x7ce7:liáng # ç³§ 0x7ce8:jiàng # 糨 0x7ce9:kuài # 糩 0x7cea:bó # 糪 0x7ceb:huán # 糫 0x7ced:zòng # ç³­ 0x7cee:xiàn # ç³® 0x7cef:nuò # 糯 0x7cf0:tuán # ç³° 0x7cf1:niè # ç³± 0x7cf2:lì # ç³² 0x7cf3:zuò # ç³³ 0x7cf4:dí # ç³´ 0x7cf5:niè # ç³µ 0x7cf6:tiào # ç³¶ 0x7cf7:làn # ç³· 0x7cf8:mì,sÄ« # 糸 0x7cf9:sÄ« # ç³¹ 0x7cfa:jiÅ«,jiÇ” # 糺 0x7cfb:xì,jì # ç³» 0x7cfc:gÅ�ng # ç³¼ 0x7cfd:zhÄ“ng,zhÄ›ng # ç³½ 0x7cfe:jiÅ« # ç³¾ 0x7cff:gÅ�ng # 糿 0x7d00:jì # ç´€ 0x7d01:chà,chÇŽ # ç´� 0x7d02:zhòu # ç´‚ 0x7d03:xún # ç´ƒ 0x7d04:yuÄ“,yÄ�o # ç´„ 0x7d05:hóng,gÅ�ng # ç´… 0x7d06:yÅ« # ç´† 0x7d07:hé,gÄ“ # ç´‡ 0x7d08:wán # ç´ˆ 0x7d09:rèn # ç´‰ 0x7d0a:wÄ›n # ç´Š 0x7d0b:wén,wèn # ç´‹ 0x7d0c:qiú # ç´Œ 0x7d0d:nà # ç´� 0x7d0e:zÄ« # ç´Ž 0x7d0f:tÇ’u # ç´� 0x7d10:niÇ” # ç´� 0x7d11:fóu # ç´‘ 0x7d12:jì,jié,jiè # ç´’ 0x7d13:shÅ« # ç´“ 0x7d14:chún # ç´” 0x7d15:pÄ«,pí,bÇ� # ç´• 0x7d16:zhèn # ç´– 0x7d17:shÄ� # ç´— 0x7d18:hóng # ç´˜ 0x7d19:zhÇ� # ç´™ 0x7d1a:jí # ç´š 0x7d1b:fÄ“n # ç´› 0x7d1c:yún # ç´œ 0x7d1d:rèn # ç´� 0x7d1e:dÇŽn # ç´ž 0x7d1f:jÄ«n,jìn # ç´Ÿ 0x7d20:sù # ç´  0x7d21:fÇŽng # ç´¡ 0x7d22:suÇ’ # ç´¢ 0x7d23:cuì # ç´£ 0x7d24:jiÇ” # ç´¤ 0x7d25:zhÄ�,zÄ� # ç´¥ 0x7d27:jÇ�n # ç´§ 0x7d28:fÅ«,fù # ç´¨ 0x7d29:zhì # ç´© 0x7d2a:qÄ« # ç´ª 0x7d2b:zÇ� # ç´« 0x7d2c:chÅ�u,chóu # ç´¬ 0x7d2d:hóng # ç´­ 0x7d2e:zhÄ�,zÄ� # ç´® 0x7d2f:léi,lÄ›i,lèi # ç´¯ 0x7d30:xì # ç´° 0x7d31:fú # ç´± 0x7d32:xiè # ç´² 0x7d33:shÄ“n # ç´³ 0x7d34:bÅ�,bì # ç´´ 0x7d35:zhù # ç´µ 0x7d36:qÅ«,qÇ” # ç´¶ 0x7d37:líng # ç´· 0x7d38:zhù # ç´¸ 0x7d39:shào # ç´¹ 0x7d3a:gàn # ç´º 0x7d3b:yÇŽng # ç´» 0x7d3c:fú # ç´¼ 0x7d3d:tuó # ç´½ 0x7d3e:zhÄ›n,tiÇŽn # ç´¾ 0x7d3f:dài # ç´¿ 0x7d40:chù # çµ€ 0x7d41:shÄ« # çµ� 0x7d42:zhÅ�ng # 終 0x7d43:xián # 絃 0x7d44:zÇ” # 組 0x7d45:jiÅ�ng,jiÇ’ng # çµ… 0x7d46:bàn # 絆 0x7d47:qú # 絇 0x7d48:mò # 絈 0x7d49:shù # 絉 0x7d4a:zuì # 絊 0x7d4c:jÄ«ng # 経 0x7d4d:rèn # çµ� 0x7d4e:háng # 絎 0x7d4f:xiè # çµ� 0x7d50:jié,jiÄ“ # çµ� 0x7d51:zhÅ« # 絑 0x7d52:chóu # çµ’ 0x7d53:guà,kuÄ� # 絓 0x7d54:bÇŽi,mò # çµ” 0x7d55:jué # 絕 0x7d56:kuàng # çµ– 0x7d57:hú # çµ— 0x7d58:cì # 絘 0x7d59:huán,gÄ“ng # çµ™ 0x7d5a:gÄ“ng # 絚 0x7d5b:tÄ�o # çµ› 0x7d5c:xié,jié # 絜 0x7d5d:kù # çµ� 0x7d5e:jiÇŽo # 絞 0x7d5f:quán,shuÄ�n # 絟 0x7d60:gÇŽi,ÇŽi # çµ  0x7d61:luò,lào # 絡 0x7d62:xuàn # çµ¢ 0x7d63:bÄ“ng,bÄ«ng,pÄ“ng # çµ£ 0x7d64:xiàn # 絤 0x7d65:fú # çµ¥ 0x7d66:gÄ›i,jÇ� # 給 0x7d67:tÅ�ng,tóng,dòng # çµ§ 0x7d68:róng # 絨 0x7d69:tiào,diào,dào # 絩 0x7d6a:yÄ«n # 絪 0x7d6b:lÄ›i,lèi,léi # 絫 0x7d6c:xiè # 絬 0x7d6d:juàn # çµ­ 0x7d6e:xù # çµ® 0x7d6f:gÄ�i,hài # 絯 0x7d70:dié # çµ° 0x7d71:tÇ’ng # çµ± 0x7d72:sÄ« # çµ² 0x7d73:jiàng # çµ³ 0x7d74:xiáng # çµ´ 0x7d75:huì # çµµ 0x7d76:jué # çµ¶ 0x7d77:zhí # çµ· 0x7d78:jiÇŽn # 絸 0x7d79:juàn # çµ¹ 0x7d7a:chÄ«,zhÇ� # 絺 0x7d7b:miÇŽn,wèn,mán,wàn # çµ» 0x7d7c:zhèn # çµ¼ 0x7d7d:lÇš # çµ½ 0x7d7e:chéng # çµ¾ 0x7d7f:qiú # 絿 0x7d80:shÅ« # ç¶€ 0x7d81:bÇŽng # ç¶� 0x7d82:tÇ’ng # ç¶‚ 0x7d83:xiÄ�o # 綃 0x7d84:huán,huàn,wàn # ç¶„ 0x7d85:qÄ«n,xiÄ�n # ç¶… 0x7d86:gÄ›ng # 綆 0x7d87:xÅ« # 綇 0x7d88:tí,tì # 綈 0x7d89:xiù # 綉 0x7d8a:xié # ç¶Š 0x7d8b:hóng # ç¶‹ 0x7d8c:xì # ç¶Œ 0x7d8d:fú # ç¶� 0x7d8e:tÄ«ng # ç¶Ž 0x7d8f:suí # ç¶� 0x7d90:duì # ç¶� 0x7d91:kÇ”n # ç¶‘ 0x7d92:fÅ« # ç¶’ 0x7d93:jÄ«ng # ç¶“ 0x7d94:hù # ç¶” 0x7d95:zhÄ« # ç¶• 0x7d96:yán,xiàn # ç¶– 0x7d97:jiÇ’ng # ç¶— 0x7d98:féng # 綘 0x7d99:jì # ç¶™ 0x7d9c:zÅ�ng,zèng # ç¶œ 0x7d9d:lín,chÄ“n # ç¶� 0x7d9e:duÇ’ # ç¶ž 0x7d9f:lì,liè # ç¶Ÿ 0x7da0:lÇœ # ç¶  0x7da1:jÄ«ng # ç¶¡ 0x7da2:chóu # ç¶¢ 0x7da3:quÇŽn # ç¶£ 0x7da4:shào # 綤 0x7da5:qí # ç¶¥ 0x7da6:qí # 綦 0x7da7:zhÇ”n,zhùn # ç¶§ 0x7da8:jÄ«,qí # 綨 0x7da9:wÇŽn # ç¶© 0x7daa:qiàn,qÄ«ng,zhÄ“ng # 綪 0x7dab:xiàn # ç¶« 0x7dac:shòu # 綬 0x7dad:wéi # ç¶­ 0x7dae:qìng,qÇ� # ç¶® 0x7daf:táo # 綯 0x7db0:wÇŽn # ç¶° 0x7db1:gÄ�ng # ç¶± 0x7db2:wÇŽng # ç¶² 0x7db3:bÄ“ng,bÄ›ng,bèng # ç¶³ 0x7db4:zhuì # ç¶´ 0x7db5:cÇŽi # ç¶µ 0x7db6:guÇ’ # ç¶¶ 0x7db7:cuì # ç¶· 0x7db8:lún,guÄ�n # 綸 0x7db9:liÇ” # ç¶¹ 0x7dba:qÇ� # 綺 0x7dbb:zhàn # ç¶» 0x7dbc:bì # ç¶¼ 0x7dbd:chuò,chÄ�o # ç¶½ 0x7dbe:líng # ç¶¾ 0x7dbf:mián # ç¶¿ 0x7dc0:qÄ« # ç·€ 0x7dc1:jÄ« # ç·� 0x7dc2:tián,tÇŽn,chÄ�n # ç·‚ 0x7dc3:zÅ�ng # ç·ƒ 0x7dc4:gÇ”n # ç·„ 0x7dc5:zÅ�u # ç·… 0x7dc6:xÄ« # ç·† 0x7dc7:zÄ« # ç·‡ 0x7dc8:xìng # ç·ˆ 0x7dc9:liÇŽng # ç·‰ 0x7dca:jÇ�n # ç·Š 0x7dcb:fÄ“i # ç·‹ 0x7dcc:ruí # ç·Œ 0x7dcd:mín # ç·� 0x7dce:yù # ç·Ž 0x7dcf:zÇ’ng # ç·� 0x7dd0:fán # ç·� 0x7dd1:lÇœ,lù # ç·‘ 0x7dd2:xù # ç·’ 0x7dd3:yÄ«ng # ç·“ 0x7dd4:shàng # ç·” 0x7dd6:xù # ç·– 0x7dd7:xiÄ�ng # ç·— 0x7dd8:jiÄ�n # ç·˜ 0x7dd9:kè # ç·™ 0x7dda:xiàn # ç·š 0x7ddb:ruÇŽn,ruàn # ç·› 0x7ddc:mián # ç·œ 0x7ddd:jÄ«,qÄ« # ç·� 0x7dde:duàn # ç·ž 0x7ddf:chóng,zhòng # ç·Ÿ 0x7de0:dì # ç·  0x7de1:mín # ç·¡ 0x7de2:miáo,máo # ç·¢ 0x7de3:yuán # ç·£ 0x7de4:xiè,yè # ç·¤ 0x7de5:bÇŽo # ç·¥ 0x7de6:sÄ« # ç·¦ 0x7de7:qiÅ« # ç·§ 0x7de8:biÄ�n # ç·¨ 0x7de9:huÇŽn # ç·© 0x7dea:gÄ“ng,gèng # ç·ª 0x7deb:zÇ’ng # ç·« 0x7dec:miÇŽn # ç·¬ 0x7ded:wèi # ç·­ 0x7dee:fù # ç·® 0x7def:wÄ›i # ç·¯ 0x7df0:tÅ�u,xÅ«,shÅ« # ç·° 0x7df1:gÅ�u # ç·± 0x7df2:miÇŽo # ç·² 0x7df3:xié # ç·³ 0x7df4:liàn # ç·´ 0x7df5:zÅ�ng,zòng # ç·µ 0x7df6:biàn,pián # ç·¶ 0x7df7:gÇ”n,yùn # ç·· 0x7df8:yÄ«n # ç·¸ 0x7df9:tí # ç·¹ 0x7dfa:guÄ�,wÅ� # ç·º 0x7dfb:zhì # ç·» 0x7dfc:yùn,yÅ«n,wÄ“n # ç·¼ 0x7dfd:chÄ“ng # ç·½ 0x7dfe:chán # ç·¾ 0x7dff:dài # ç·¿ 0x7e00:xié # 縀 0x7e01:yuán # ç¸� 0x7e02:zÇ’ng # 縂 0x7e03:xÅ« # 縃 0x7e06:gÄ“ng,gèng # 縆 0x7e08:yíng # 縈 0x7e09:jìn # 縉 0x7e0a:yì # 縊 0x7e0b:zhuì # 縋 0x7e0c:nì # 縌 0x7e0d:bÄ�ng,bàng # ç¸� 0x7e0e:gÇ”,hú # 縎 0x7e0f:pán # ç¸� 0x7e10:zhòu # ç¸� 0x7e11:jiÄ�n # 縑 0x7e12:cÄ«,cuò,suÇ’ # 縒 0x7e13:quán # 縓 0x7e14:shuÇŽng # 縔 0x7e15:yùn,yÅ«n,wÄ“n # 縕 0x7e16:xiá # 縖 0x7e17:cuÄ«,suÄ«,shuÄ�i # 縗 0x7e18:xì # 縘 0x7e19:róng,rÇ’ng,ròng # 縙 0x7e1a:tÄ�o # 縚 0x7e1b:fù # 縛 0x7e1c:yún # 縜 0x7e1d:zhÄ›n # ç¸� 0x7e1e:gÇŽo # 縞 0x7e1f:rù # 縟 0x7e20:hú # 縠 0x7e21:zài,zÄ“ng # 縡 0x7e22:téng # 縢 0x7e23:xiàn,xuán # 縣 0x7e24:sù # 縤 0x7e25:zhÄ›n # 縥 0x7e26:zòng # 縦 0x7e27:tÄ�o # 縧 0x7e29:cài # 縩 0x7e2a:bì # 縪 0x7e2b:féng,fèng # 縫 0x7e2c:cù # 縬 0x7e2d:lí # 縭 0x7e2e:suÅ�,sù # 縮 0x7e2f:yÇŽn,yÇ�n # 縯 0x7e30:xÇ� # 縰 0x7e31:zòng,zÇ’ng # 縱 0x7e32:léi # 縲 0x7e33:zhuàn,juàn # 縳 0x7e34:qiàn # 縴 0x7e35:màn # 縵 0x7e36:zhí # 縶 0x7e37:lÇš # 縷 0x7e38:mù,mò # 縸 0x7e39:piÇŽo,piÄ�o # 縹 0x7e3a:lián # 縺 0x7e3b:mí # 縻 0x7e3c:xuàn # 縼 0x7e3d:zÇ’ng # 總 0x7e3e:jì # 績 0x7e3f:shÄ�n # 縿 0x7e40:suì # ç¹€ 0x7e41:fán,pó # ç¹� 0x7e42:lÇœ # 繂 0x7e43:bÄ“ng,bÄ›ng,bèng # 繃 0x7e44:yÄ« # 繄 0x7e45:sÄ�o # ç¹… 0x7e46:móu,miù,miào,mù,liÇŽo # 繆 0x7e47:yáo,yóu,zhòu # 繇 0x7e48:qiÇŽng # 繈 0x7e49:shéng,hún # 繉 0x7e4b:jì # 繋 0x7e4d:xiù # ç¹� 0x7e4e:rán # 繎 0x7e4f:xuàn # ç¹� 0x7e50:suì # ç¹� 0x7e51:qiÄ�o # 繑 0x7e52:zÄ“ng,zèng # ç¹’ 0x7e53:zuÇ’ # 繓 0x7e54:zhÄ«,zhì # ç¹” 0x7e55:shàn # 繕 0x7e56:sÇŽn # ç¹– 0x7e57:lín # ç¹— 0x7e58:jú,jué # 繘 0x7e59:fÄ�n # ç¹™ 0x7e5a:liáo # 繚 0x7e5b:chuÅ�,chuò # ç¹› 0x7e5c:zÅ«n,zÇ”n # 繜 0x7e5d:jiàn # ç¹� 0x7e5e:rào # 繞 0x7e5f:chÇŽn,chán # 繟 0x7e60:ruÇ� # ç¹  0x7e61:xiù # 繡 0x7e62:huì,huí # ç¹¢ 0x7e63:huà # ç¹£ 0x7e64:zuÇŽn # 繤 0x7e65:xÄ« # ç¹¥ 0x7e66:qiÇŽng # 繦 0x7e68:da # 繨 0x7e69:shéng # 繩 0x7e6a:huì # 繪 0x7e6b:xì,jì # 繫 0x7e6c:sè # 繬 0x7e6d:jiÇŽn # ç¹­ 0x7e6e:jiÄ�ng # ç¹® 0x7e6f:huán # 繯 0x7e70:qiÄ�o,sÄ�o # ç¹° 0x7e71:cÅ�ng # ç¹± 0x7e72:xiè # ç¹² 0x7e73:jiÇŽo,zhuó # ç¹³ 0x7e74:bì # ç¹´ 0x7e75:dàn,tán,chán # ç¹µ 0x7e76:yì # ç¹¶ 0x7e77:nÇ’ng # ç¹· 0x7e78:suì # 繸 0x7e79:yì # ç¹¹ 0x7e7a:shÄ� # 繺 0x7e7b:rú,xÅ« # ç¹» 0x7e7c:jì # ç¹¼ 0x7e7d:bÄ«n # ç¹½ 0x7e7e:qiÇŽn # ç¹¾ 0x7e7f:lán # 繿 0x7e80:pú,fú # 纀 0x7e81:xÅ«n # çº� 0x7e82:zuÇŽn # 纂 0x7e83:zÄ« # 纃 0x7e84:péng # 纄 0x7e85:yào,lì # 纅 0x7e86:mò # 纆 0x7e87:lèi # 纇 0x7e88:xiè # 纈 0x7e89:zuÇŽn # 纉 0x7e8a:kuàng # 纊 0x7e8b:yÅ�u # 纋 0x7e8c:xù # 續 0x7e8d:léi # çº� 0x7e8e:xiÄ�n # 纎 0x7e8f:chán # çº� 0x7e91:lú # 纑 0x7e92:chán # 纒 0x7e93:yÄ«ng # 纓 0x7e94:cái # 纔 0x7e95:xiÄ�ng,rÇŽng # 纕 0x7e96:xiÄ�n # 纖 0x7e97:zuÄ« # 纗 0x7e98:zuÇŽn # 纘 0x7e99:luò # 纙 0x7e9a:lí,xÇ�,lÇ�,sÇŽ # 纚 0x7e9b:dào # 纛 0x7e9c:lÇŽn # 纜 0x7e9d:léi # çº� 0x7e9e:liàn # 纞 0x7e9f:sÄ« # 纟 0x7ea0:jiÅ« # 纠 0x7ea1:yÅ« # 纡 0x7ea2:hóng,gÅ�ng # 红 0x7ea3:zhòu # 纣 0x7ea4:xiÄ�n,qiàn # 纤 0x7ea5:hé,gÄ“ # 纥 0x7ea6:yuÄ“,yÄ�o # 约 0x7ea7:jí # 级 0x7ea8:wán # 纨 0x7ea9:kuàng # 纩 0x7eaa:jì,jÇ� # 纪 0x7eab:rèn # 纫 0x7eac:wÄ›i # 纬 0x7ead:yún # 纭 0x7eae:hóng # 纮 0x7eaf:chún # 纯 0x7eb0:pÄ«,pí,bÇ� # 纰 0x7eb1:shÄ� # 纱 0x7eb2:gÄ�ng # 纲 0x7eb3:nà # 纳 0x7eb4:rèn # 纴 0x7eb5:zòng,zÇ’ng # 纵 0x7eb6:lún,guÄ�n # 纶 0x7eb7:fÄ“n # 纷 0x7eb8:zhÇ� # 纸 0x7eb9:wén,wèn # 纹 0x7eba:fÇŽng # 纺 0x7ebb:zhù # 纻 0x7ebc:zhèn # 纼 0x7ebd:niÇ” # 纽 0x7ebe:shÅ« # 纾 0x7ebf:xiàn # 线 0x7ec0:gàn # 绀 0x7ec1:xiè # ç»� 0x7ec2:fú # 绂 0x7ec3:liàn # 练 0x7ec4:zÇ” # 组 0x7ec5:shÄ“n # ç»… 0x7ec6:xì # 细 0x7ec7:zhÄ«,zhì # 织 0x7ec8:zhÅ�ng # 终 0x7ec9:zhòu # 绉 0x7eca:bàn # 绊 0x7ecb:fú # 绋 0x7ecc:chù # 绌 0x7ecd:shào # ç»� 0x7ece:yì # 绎 0x7ecf:jÄ«ng # ç»� 0x7ed0:dài # ç»� 0x7ed1:bÇŽng # 绑 0x7ed2:róng # ç»’ 0x7ed3:jié,jiÄ“ # 结 0x7ed4:kù # ç»” 0x7ed5:rào # 绕 0x7ed6:dié # ç»– 0x7ed7:háng # ç»— 0x7ed8:huì # 绘 0x7ed9:gÄ›i,jÇ� # ç»™ 0x7eda:xuàn # 绚 0x7edb:jiàng # ç»› 0x7edc:luò,lào # 络 0x7edd:jué # ç»� 0x7ede:jiÇŽo # 绞 0x7edf:tÇ’ng # 统 0x7ee0:gÄ›ng # ç»  0x7ee1:xiÄ�o # 绡 0x7ee2:juàn # 绢 0x7ee3:xiù # 绣 0x7ee4:xì # 绤 0x7ee5:suí # 绥 0x7ee6:tÄ�o # 绦 0x7ee7:jì # ç»§ 0x7ee8:tí,tì # 绨 0x7ee9:jì # 绩 0x7eea:xù # 绪 0x7eeb:líng # 绫 0x7eec:yÄ«ng # 绬 0x7eed:xù # ç»­ 0x7eee:qÇ� # ç»® 0x7eef:fÄ“i # 绯 0x7ef0:chuò,chÄ�o # ç»° 0x7ef1:shàng # ç»± 0x7ef2:gÇ”n # 绲 0x7ef3:shéng # 绳 0x7ef4:wéi # ç»´ 0x7ef5:mián # 绵 0x7ef6:shòu # ç»¶ 0x7ef7:bÄ“ng,bÄ›ng,bèng # ç»· 0x7ef8:chóu # 绸 0x7ef9:táo # 绹 0x7efa:liÇ” # 绺 0x7efb:quÇŽn # ç»» 0x7efc:zÅ�ng,zèng # 综 0x7efd:zhàn # 绽 0x7efe:wÇŽn # 绾 0x7eff:lÇœ,lù # 绿 0x7f00:zhuì # ç¼€ 0x7f01:zÄ« # ç¼� 0x7f02:kè # 缂 0x7f03:xiÄ�ng # 缃 0x7f04:jiÄ�n # 缄 0x7f05:miÇŽn # ç¼… 0x7f06:lÇŽn # 缆 0x7f07:tí # 缇 0x7f08:miÇŽo # 缈 0x7f09:jÄ«,qÄ« # 缉 0x7f0a:yùn,yÅ«n,wÄ“n # 缊 0x7f0b:huì,huí # 缋 0x7f0c:sÄ« # 缌 0x7f0d:duÇ’ # ç¼� 0x7f0e:duàn # 缎 0x7f0f:biàn,pián # ç¼� 0x7f10:xiàn # ç¼� 0x7f11:gÅ�u # 缑 0x7f12:zhuì # ç¼’ 0x7f13:huÇŽn # 缓 0x7f14:dì # ç¼” 0x7f15:lÇš # 缕 0x7f16:biÄ�n # ç¼– 0x7f17:mín # ç¼— 0x7f18:yuán # 缘 0x7f19:jìn # ç¼™ 0x7f1a:fù # 缚 0x7f1b:rù # ç¼› 0x7f1c:zhÄ›n # 缜 0x7f1d:féng,fèng # ç¼� 0x7f1e:cuÄ«,suÄ«,shuÄ�i # 缞 0x7f1f:gÇŽo # 缟 0x7f20:chán # ç¼  0x7f21:lí # 缡 0x7f22:yì # ç¼¢ 0x7f23:jiÄ�n # ç¼£ 0x7f24:bÄ«n # 缤 0x7f25:piÇŽo,piÄ�o # ç¼¥ 0x7f26:màn # 缦 0x7f27:léi # ç¼§ 0x7f28:yÄ«ng # 缨 0x7f29:suÅ�,sù # 缩 0x7f2a:móu,miù,miào,mù,liÇŽo # 缪 0x7f2b:sÄ�o # 缫 0x7f2c:xié # 缬 0x7f2d:liáo # ç¼­ 0x7f2e:shàn # ç¼® 0x7f2f:zÄ“ng,zèng # 缯 0x7f30:jiÄ�ng # ç¼° 0x7f31:qiÇŽn # ç¼± 0x7f32:qiÄ�o,sÄ�o # ç¼² 0x7f33:huán # ç¼³ 0x7f34:jiÇŽo,zhuó # ç¼´ 0x7f35:zuÇŽn # ç¼µ 0x7f36:fÇ’u # ç¼¶ 0x7f37:xiè # ç¼· 0x7f38:gÄ�ng # 缸 0x7f39:fÇ’u # ç¼¹ 0x7f3a:quÄ“ # 缺 0x7f3b:fÇ’u # ç¼» 0x7f3d:bÅ� # ç¼½ 0x7f3e:píng # ç¼¾ 0x7f3f:xiàng # 缿 0x7f41:gÄ�ng # ç½� 0x7f42:yÄ«ng # 罂 0x7f43:yÄ«ng # 罃 0x7f44:qìng # 罄 0x7f45:xià # ç½… 0x7f46:guàn # 罆 0x7f47:zÅ«n # 罇 0x7f48:tán # 罈 0x7f4a:qì # 罊 0x7f4b:wèng # 罋 0x7f4c:yÄ«ng # 罌 0x7f4d:léi # ç½� 0x7f4e:tán # 罎 0x7f4f:lú # ç½� 0x7f50:guàn # ç½� 0x7f51:wÇŽng # 网 0x7f52:wÇŽng # ç½’ 0x7f53:wÇŽng # 罓 0x7f54:wÇŽng # ç½” 0x7f55:hÇŽn # 罕 0x7f57:luó # ç½— 0x7f58:fú # 罘 0x7f59:shÄ“n # ç½™ 0x7f5a:fá # 罚 0x7f5b:gÅ« # ç½› 0x7f5c:zhÇ” # 罜 0x7f5d:jÅ« # ç½� 0x7f5e:máo # 罞 0x7f5f:gÇ” # 罟 0x7f60:mín # ç½  0x7f61:gÄ�ng # 罡 0x7f62:bà,ba,pí # ç½¢ 0x7f63:guà # ç½£ 0x7f64:tí # 罤 0x7f65:juàn # ç½¥ 0x7f66:fú # 罦 0x7f67:shÄ“n # ç½§ 0x7f68:yÇŽn # 罨 0x7f69:zhào # 罩 0x7f6a:zuì # 罪 0x7f6b:guÇŽi,guà # 罫 0x7f6c:zhuó # 罬 0x7f6d:yù # ç½­ 0x7f6e:zhì # ç½® 0x7f6f:ÇŽn # 罯 0x7f70:fá # ç½° 0x7f71:lÇŽn # ç½± 0x7f72:shÇ” # ç½² 0x7f73:sÄ« # ç½³ 0x7f74:pí # ç½´ 0x7f75:mà # ç½µ 0x7f76:liÇ” # ç½¶ 0x7f77:bà,ba,pí # ç½· 0x7f78:fá # 罸 0x7f79:lí # ç½¹ 0x7f7a:cháo # 罺 0x7f7b:wèi # ç½» 0x7f7c:bì # ç½¼ 0x7f7d:jì # ç½½ 0x7f7e:zÄ“ng # ç½¾ 0x7f7f:chÅ�ng # 罿 0x7f80:liÇ” # ç¾€ 0x7f81:jÄ« # ç¾� 0x7f82:juàn # 羂 0x7f83:mì # 羃 0x7f84:zhào # 羄 0x7f85:luó # ç¾… 0x7f86:pí # 羆 0x7f87:jÄ« # 羇 0x7f88:jÄ« # 羈 0x7f89:luán # 羉 0x7f8a:yáng,xiáng # 羊 0x7f8b:mÇ� # 羋 0x7f8c:qiÄ�ng # 羌 0x7f8d:dá # ç¾� 0x7f8e:mÄ›i # 美 0x7f8f:yáng,xiáng # ç¾� 0x7f90:líng # ç¾� 0x7f91:yÇ’u # 羑 0x7f92:fén # ç¾’ 0x7f93:bÄ� # 羓 0x7f94:gÄ�o # ç¾” 0x7f95:yàng # 羕 0x7f96:gÇ” # ç¾– 0x7f97:qiÄ�ng # ç¾— 0x7f98:zÄ�ng # 羘 0x7f99:mÄ›i,gÄ�o # ç¾™ 0x7f9a:líng # 羚 0x7f9b:yì,xÄ« # ç¾› 0x7f9c:zhù # 羜 0x7f9d:dÄ« # ç¾� 0x7f9e:xiÅ« # 羞 0x7f9f:qiÇŽng # 羟 0x7fa0:yí # ç¾  0x7fa1:xiàn # 羡 0x7fa2:róng # ç¾¢ 0x7fa3:qún # ç¾£ 0x7fa4:qún # 群 0x7fa5:qiÇŽng # ç¾¥ 0x7fa6:huán # 羦 0x7fa7:suÅ� # ç¾§ 0x7fa8:xiàn # 羨 0x7fa9:yì # 義 0x7fab:qiÄ�ng,kòng # 羫 0x7fac:qián,xián,yán # 羬 0x7fad:yú # ç¾­ 0x7fae:gÄ“ng # ç¾® 0x7faf:jié # 羯 0x7fb0:tÄ�ng # ç¾° 0x7fb1:yuán # ç¾± 0x7fb2:xÄ« # ç¾² 0x7fb3:fán # ç¾³ 0x7fb4:shÄ�n # ç¾´ 0x7fb5:fén # ç¾µ 0x7fb6:shÄ�n # ç¾¶ 0x7fb7:liÇŽn # ç¾· 0x7fb8:léi # 羸 0x7fb9:gÄ“ng # ç¾¹ 0x7fba:nóu # 羺 0x7fbb:qiàng # ç¾» 0x7fbc:chàn # ç¾¼ 0x7fbd:yÇ” # ç¾½ 0x7fbe:hóng,gòng # ç¾¾ 0x7fbf:yì # 羿 0x7fc0:chÅ�ng # ç¿€ 0x7fc1:wÄ“ng # ç¿� 0x7fc2:fÄ“n # ç¿‚ 0x7fc3:hóng # 翃 0x7fc4:chì # ç¿„ 0x7fc5:chì # ç¿… 0x7fc6:cuì # 翆 0x7fc7:fú # 翇 0x7fc8:xiá # 翈 0x7fc9:bÄ›n # 翉 0x7fca:yì # 翊 0x7fcb:là # ç¿‹ 0x7fcc:yì # 翌 0x7fcd:pÄ«,bì,pÅ� # ç¿� 0x7fce:líng # 翎 0x7fcf:liù # ç¿� 0x7fd0:zhì # ç¿� 0x7fd1:qú,yù # ç¿‘ 0x7fd2:xí # ç¿’ 0x7fd3:xié # ç¿“ 0x7fd4:xiáng # ç¿” 0x7fd5:xÄ« # ç¿• 0x7fd6:xÄ« # ç¿– 0x7fd7:ké # ç¿— 0x7fd8:qiáo,qiào # 翘 0x7fd9:huì # ç¿™ 0x7fda:huÄ« # 翚 0x7fdb:xiÄ�o # ç¿› 0x7fdc:shà # 翜 0x7fdd:hóng # ç¿� 0x7fde:jiÄ�ng # 翞 0x7fdf:dí,zhái # 翟 0x7fe0:cuì # ç¿  0x7fe1:fÄ›i # ç¿¡ 0x7fe2:dào,zhÅ�u # ç¿¢ 0x7fe3:shà # ç¿£ 0x7fe4:chì # 翤 0x7fe5:zhù # ç¿¥ 0x7fe6:jiÇŽn # 翦 0x7fe7:xuÄ�n # ç¿§ 0x7fe8:chì # 翨 0x7fe9:piÄ�n # ç¿© 0x7fea:zÅ�ng # 翪 0x7feb:wán # ç¿« 0x7fec:huÄ« # 翬 0x7fed:hóu # ç¿­ 0x7fee:hé # ç¿® 0x7fef:hè # 翯 0x7ff0:hàn # ç¿° 0x7ff1:áo # 翱 0x7ff2:piÄ�o # 翲 0x7ff3:yì # 翳 0x7ff4:lián # ç¿´ 0x7ff5:hóu,qú # 翵 0x7ff7:lín # ç¿· 0x7ff8:pÄ›n # 翸 0x7ff9:qiáo,qiào # 翹 0x7ffa:áo # 翺 0x7ffb:fÄ�n # ç¿» 0x7ffc:yì # 翼 0x7ffd:huì # 翽 0x7ffe:xuÄ�n # 翾 0x7fff:dào # ç¿¿ 0x8000:yào # 耀 0x8001:lÇŽo # è€� 0x8003:kÇŽo # 考 0x8004:mào # 耄 0x8005:zhÄ› # 者 0x8006:qí,shì # 耆 0x8007:gÇ’u # 耇 0x8008:gÇ’u # 耈 0x8009:gÇ’u # 耉 0x800a:dié # 耊 0x800b:dié # 耋 0x800c:ér # 而 0x800d:shuÇŽ # è€� 0x800e:ruÇŽn,nuò # 耎 0x800f:ér,nài # è€� 0x8010:nài # è€� 0x8011:duÄ�n,zhuÄ�n # 耑 0x8012:lÄ›i # 耒 0x8013:tÄ«ng # 耓 0x8014:zÇ� # 耔 0x8015:gÄ“ng # 耕 0x8016:chào # 耖 0x8017:hào # 耗 0x8018:yún # 耘 0x8019:bà,pá # 耙 0x801a:pÄ« # 耚 0x801b:sì,chí # 耛 0x801c:sì # 耜 0x801d:qù,chú # è€� 0x801e:jiÄ� # 耞 0x801f:jù # 耟 0x8020:huÅ� # 耠 0x8021:chú # 耡 0x8022:lào # 耢 0x8023:lún,lÇ”n # 耣 0x8024:jí,jiè # 耤 0x8025:tÇŽng # 耥 0x8026:Ç’u # 耦 0x8027:lóu # 耧 0x8028:nòu # 耨 0x8029:jiÇŽng # 耩 0x802a:pÇŽng # 耪 0x802b:zhá,zé # 耫 0x802c:lóu # 耬 0x802d:jÄ« # 耭 0x802e:lào # 耮 0x802f:huò # 耯 0x8030:yÅ�u # 耰 0x8031:mò # 耱 0x8032:huái # 耲 0x8033:Ä›r # 耳 0x8034:yì # 耴 0x8035:dÄ«ng # 耵 0x8036:yé,yÄ“ # 耶 0x8037:dÄ� # 耷 0x8038:sÇ’ng # 耸 0x8039:qín # 耹 0x803a:yún,yíng # 耺 0x803b:chÇ� # 耻 0x803c:dÄ�n # 耼 0x803d:dÄ�n # 耽 0x803e:hóng # 耾 0x803f:gÄ›ng # 耿 0x8040:zhí # è�€ 0x8042:niè # è�‚ 0x8043:dÄ�n # è�ƒ 0x8044:zhÄ›n # è�„ 0x8045:chè # è�… 0x8046:líng # è�† 0x8047:zhÄ“ng # è�‡ 0x8048:yÇ’u # è�ˆ 0x8049:wà,tuÇ�,zhuó # è�‰ 0x804a:liáo # è�Š 0x804b:lóng # è�‹ 0x804c:zhí # è�Œ 0x804d:níng # è�� 0x804e:tiÄ�o # è�Ž 0x804f:ér,nÇœ # è�� 0x8050:yà # è�� 0x8051:tiÄ“,zhé # è�‘ 0x8052:guÅ� # è�’ 0x8054:lián # è�” 0x8055:hào # è�• 0x8056:shèng # è�– 0x8057:liè # è�— 0x8058:pìn # è�˜ 0x8059:jÄ«ng # è�™ 0x805a:jù # è�š 0x805b:bÇ� # è�› 0x805c:dÇ�,zhì # è�œ 0x805d:guó # è�� 0x805e:wén # è�ž 0x805f:xù # è�Ÿ 0x8060:pÄ«ng # è�  0x8061:cÅ�ng # è�¡ 0x8064:tíng # è�¤ 0x8065:jÇ” # è�¥ 0x8066:cÅ�ng # è�¦ 0x8067:kuÄ« # è�§ 0x8069:kuì # è�© 0x806a:cÅ�ng # è�ª 0x806b:lián # è�« 0x806c:wÄ“ng # è�¬ 0x806d:kuì # è�­ 0x806e:lián # è�® 0x806f:lián # è�¯ 0x8070:cÅ�ng # è�° 0x8071:áo # è�± 0x8072:shÄ“ng # è�² 0x8073:sÇ’ng # è�³ 0x8074:tÄ«ng # è�´ 0x8075:kuì # è�µ 0x8076:niè # è�¶ 0x8077:zhí # è�· 0x8078:dÄ�n # è�¸ 0x8079:níng # è�¹ 0x807b:nÇ�,jiàn # è�» 0x807c:tÄ«ng # è�¼ 0x807d:tÄ«ng # è�½ 0x807e:lóng # è�¾ 0x807f:yù # è�¿ 0x8080:yù # è‚€ 0x8081:zhào # è‚� 0x8082:sì # è‚‚ 0x8083:sù # 肃 0x8084:yì # è‚„ 0x8085:sù # è‚… 0x8086:sì # 肆 0x8087:zhào # 肇 0x8088:zhào # 肈 0x8089:ròu # 肉 0x808a:yì # 肊 0x808b:lèi,lÄ“ # è‚‹ 0x808c:jÄ« # 肌 0x808d:qiú # è‚� 0x808e:kÄ›n # 肎 0x808f:cào # è‚� 0x8090:gÄ“ # è‚� 0x8091:bó,dí # è‚‘ 0x8092:huàn # è‚’ 0x8093:huÄ�ng # è‚“ 0x8094:chÇ� # è‚” 0x8095:rèn # è‚• 0x8096:xiÄ�o,xiào # è‚– 0x8097:rÇ” # è‚— 0x8098:zhÇ’u # 肘 0x8099:yuÄ�n # è‚™ 0x809a:dù,dÇ” # 肚 0x809b:gÄ�ng # è‚› 0x809c:róng,chÄ“n # 肜 0x809d:gÄ�n # è‚� 0x809e:chÄ�i # 肞 0x809f:wò # 肟 0x80a0:cháng # è‚  0x80a1:gÇ” # è‚¡ 0x80a2:zhÄ« # è‚¢ 0x80a3:qín,hán,hàn # è‚£ 0x80a4:fÅ« # 肤 0x80a5:féi # è‚¥ 0x80a6:bÄ�n # 肦 0x80a7:pÄ“i # è‚§ 0x80a8:pàng,pán,pàn # 肨 0x80a9:jiÄ�n # è‚© 0x80aa:fáng # 肪 0x80ab:zhÅ«n,chún # è‚« 0x80ac:yóu # 肬 0x80ad:nà # è‚­ 0x80ae:Ä�ng # è‚® 0x80af:kÄ›n # 肯 0x80b0:rán # è‚° 0x80b1:gÅ�ng # 肱 0x80b2:yù,yÅ� # 育 0x80b3:wÄ›n # 肳 0x80b4:yáo # è‚´ 0x80b5:qí # 肵 0x80b6:pí,bÇ�,bì # è‚¶ 0x80b7:qiÇŽn # è‚· 0x80b8:xÄ« # 肸 0x80b9:xÄ« # 肹 0x80ba:fèi # 肺 0x80bb:kÄ›n # è‚» 0x80bc:jÇ�ng # 肼 0x80bd:tài # 肽 0x80be:shèn # 肾 0x80bf:zhÇ’ng # è‚¿ 0x80c0:zhàng # 胀 0x80c1:xié # èƒ� 0x80c2:shèn # 胂 0x80c3:wèi # 胃 0x80c4:zhòu # 胄 0x80c5:dié # 胅 0x80c6:dÇŽn # 胆 0x80c7:fèi,bì # 胇 0x80c8:bá # 胈 0x80c9:bó # 胉 0x80ca:qú # 胊 0x80cb:tián # 胋 0x80cc:bèi,bÄ“i # 背 0x80cd:guÄ� # èƒ� 0x80ce:tÄ�i # 胎 0x80cf:zÇ�,fèi # èƒ� 0x80d0:fÄ›i,kÅ« # èƒ� 0x80d1:zhÄ« # 胑 0x80d2:nì # 胒 0x80d3:píng,pÄ“ng # 胓 0x80d4:zì # 胔 0x80d5:fÅ«,fú,zhÇ’u # 胕 0x80d6:pàng,pán,pàn # 胖 0x80d7:zhÄ“n # 胗 0x80d8:xián # 胘 0x80d9:zuò # 胙 0x80da:pÄ“i # 胚 0x80db:jiÇŽ # 胛 0x80dc:shèng # 胜 0x80dd:zhÄ« # èƒ� 0x80de:bÄ�o # 胞 0x80df:mÇ” # 胟 0x80e0:qÅ« # 胠 0x80e1:hú # 胡 0x80e2:qià # 胢 0x80e3:chÇ� # 胣 0x80e4:yìn # 胤 0x80e5:xÅ« # 胥 0x80e6:yÄ�ng # 胦 0x80e7:lóng # 胧 0x80e8:dòng # 胨 0x80e9:kÇŽ # 胩 0x80ea:lú # 胪 0x80eb:jìng # 胫 0x80ec:nÇ” # 胬 0x80ed:yÄ�n # 胭 0x80ee:pÄ�ng # 胮 0x80ef:kuà # 胯 0x80f0:yí # 胰 0x80f1:guÄ�ng # 胱 0x80f2:hÇŽi # 胲 0x80f3:gÄ“,gé # 胳 0x80f4:dòng # 胴 0x80f5:chÄ« # 胵 0x80f6:jiÄ�o # 胶 0x80f7:xiÅ�ng # 胷 0x80f8:xiÅ�ng # 胸 0x80f9:ér # 胹 0x80fa:àn # 胺 0x80fb:héng # 胻 0x80fc:pián # 胼 0x80fd:néng,nài # 能 0x80fe:zì # 胾 0x8100:zhÄ“ng # è„€ 0x8101:tiÇŽo # è„� 0x8102:zhÄ« # è„‚ 0x8103:cuì # 脃 0x8104:méi # è„„ 0x8105:xié # è„… 0x8106:cuì # 脆 0x8107:xié # 脇 0x8108:mài,mò # 脈 0x8109:mài,mò # 脉 0x810a:jÇ� # 脊 0x810d:kuài # è„� 0x810e:sà # 脎 0x810f:zàng # è„� 0x8110:qí # è„� 0x8111:nÇŽo # è„‘ 0x8112:mÇ� # è„’ 0x8113:nóng # è„“ 0x8114:luán # è„” 0x8115:wàn # è„• 0x8116:bó # è„– 0x8117:wÄ›n # è„— 0x8118:wÇŽn # 脘 0x8119:xiÅ« # è„™ 0x811a:jiÇŽo,jué # 脚 0x811b:jìng # è„› 0x811c:róu # 脜 0x811d:hÄ“ng # è„� 0x811e:cuÇ’ # 脞 0x811f:liè # 脟 0x8120:shÄ�n # è„  0x8121:tÇ�ng # è„¡ 0x8122:méi # è„¢ 0x8123:chún # è„£ 0x8124:shèn # 脤 0x8125:jiá # è„¥ 0x8126:tè # 脦 0x8127:juÄ�n # è„§ 0x8128:cù # 脨 0x8129:xiÅ« # è„© 0x812a:xìn # 脪 0x812b:tuÅ� # è„« 0x812c:pÄ�o # 脬 0x812d:chéng # è„­ 0x812e:nÄ›i # è„® 0x812f:fÇ”,pÇ” # 脯 0x8130:dòu # è„° 0x8131:tuÅ� # 脱 0x8132:niào # 脲 0x8134:pÇ� # è„´ 0x8135:gÇ” # 脵 0x8136:luó # è„¶ 0x8137:lì # è„· 0x8138:liÇŽn # 脸 0x8139:zhàng # 脹 0x813a:cuÄ« # 脺 0x813b:jiÄ“ # è„» 0x813c:liÇŽng # 脼 0x813d:shuí # 脽 0x813e:pí # 脾 0x813f:biÄ�o # è„¿ 0x8140:lún # è…€ 0x8141:pián # è…� 0x8142:guò # è…‚ 0x8143:juàn # è…ƒ 0x8144:chuí # è…„ 0x8145:dàn # è…… 0x8146:tiÇŽn # è…† 0x8147:nÄ›i # è…‡ 0x8148:jÄ«ng # è…ˆ 0x8149:nái # è…‰ 0x814a:là,xÄ« # è…Š 0x814b:yè # è…‹ 0x814c:Ä�,yÄ�n # è…Œ 0x814d:rèn # è…� 0x814e:shèn # è…Ž 0x814f:zhuì # è…� 0x8150:fÇ” # è…� 0x8151:fÇ” # è…‘ 0x8152:jÅ« # è…’ 0x8153:féi # è…“ 0x8154:qiÄ�ng # è…” 0x8155:wàn # è…• 0x8156:dòng # è…– 0x8157:pí # è…— 0x8158:guó # è…˜ 0x8159:zÅ�ng # è…™ 0x815a:dìng # è…š 0x815b:wò # è…› 0x815c:méi # è…œ 0x815d:ruÇŽn # è…� 0x815e:zhuàn # è…ž 0x815f:chì # è…Ÿ 0x8160:còu # è…  0x8161:luó # è…¡ 0x8162:Ç’u # è…¢ 0x8163:dì # è…£ 0x8164:Ä�n # è…¤ 0x8165:xÄ«ng # è…¥ 0x8166:nÇŽo # è…¦ 0x8167:shù # è…§ 0x8168:shuàn # è…¨ 0x8169:nÇŽn # è…© 0x816a:yùn # è…ª 0x816b:zhÇ’ng # è…« 0x816c:róu # è…¬ 0x816d:è # è…­ 0x816e:sÄ�i # è…® 0x816f:tú # è…¯ 0x8170:yÄ�o # è…° 0x8171:jiàn # è…± 0x8172:wÄ›i # è…² 0x8173:jiÇŽo,jué # è…³ 0x8174:yú # è…´ 0x8175:jiÄ� # è…µ 0x8176:duàn # è…¶ 0x8177:bì # è…· 0x8178:cháng # è…¸ 0x8179:fù # è…¹ 0x817a:xiàn # è…º 0x817b:nì # è…» 0x817c:miÇŽn # è…¼ 0x817d:wà # è…½ 0x817e:téng # è…¾ 0x817f:tuÇ� # è…¿ 0x8180:bÇŽng,páng # 膀 0x8181:qiÇŽn # è†� 0x8182:lÇš # 膂 0x8183:wà # 膃 0x8184:shòu # 膄 0x8185:táng # 膅 0x8186:sù # 膆 0x8187:zhuì # 膇 0x8188:gé # 膈 0x8189:yì # 膉 0x818a:bó # 膊 0x818b:liáo # 膋 0x818c:jí # 膌 0x818d:pí # è†� 0x818e:xié # 膎 0x818f:gÄ�o,gào # è†� 0x8190:lÇš # è†� 0x8191:bìn # 膑 0x8193:cháng # 膓 0x8194:lù,biÄ�o # 膔 0x8195:guó # 膕 0x8196:pÄ�ng # 膖 0x8197:chuái # 膗 0x8198:biÄ�o # 膘 0x8199:jiÇŽng # 膙 0x819a:fÅ« # 膚 0x819b:táng # 膛 0x819c:mó # 膜 0x819d:xÄ« # è†� 0x819e:zhuÄ�n,chuán,chún,zhuÇŽn # 膞 0x819f:lÇœ # 膟 0x81a0:jiÄ�o # 膠 0x81a1:yìng # 膡 0x81a2:lǘ # 膢 0x81a3:zhì # 膣 0x81a5:cÅ«n # 膥 0x81a6:lìn # 膦 0x81a7:tóng # 膧 0x81a8:péng # 膨 0x81a9:nì # 膩 0x81aa:chuài # 膪 0x81ab:liáo # 膫 0x81ac:cuì # 膬 0x81ad:kuì # 膭 0x81ae:xiÄ�o # 膮 0x81af:tÄ“ng # 膯 0x81b0:fán,pán # 膰 0x81b1:zhí # 膱 0x81b2:jiÄ�o # 膲 0x81b3:shàn # 膳 0x81b4:hÅ«,wÇ” # 膴 0x81b5:cuì # 膵 0x81b6:rùn # 膶 0x81b7:xiÄ�ng # 膷 0x81b8:suÇ� # 膸 0x81b9:fèn # 膹 0x81ba:yÄ«ng # 膺 0x81bb:shÄ�n,dàn # 膻 0x81bc:zhuÄ� # 膼 0x81bd:dÇŽn # 膽 0x81be:kuài # 膾 0x81bf:nóng # 膿 0x81c0:tún # 臀 0x81c1:lián # è‡� 0x81c2:bì,bei # 臂 0x81c3:yÅ�ng # 臃 0x81c4:jué # 臄 0x81c5:chù # 臅 0x81c6:yì # 臆 0x81c7:juÇŽn # 臇 0x81c8:là,gé # 臈 0x81c9:liÇŽn # 臉 0x81ca:sÄ�o,sào # 臊 0x81cb:tún # 臋 0x81cc:gÇ” # 臌 0x81cd:qí # è‡� 0x81ce:cuì # 臎 0x81cf:bìn # è‡� 0x81d0:xÅ«n # è‡� 0x81d1:nào # 臑 0x81d2:wò,yuè # 臒 0x81d3:zàng # 臓 0x81d4:xiàn # 臔 0x81d5:biÄ�o # 臕 0x81d6:xìng # 臖 0x81d7:kuÄ�n # 臗 0x81d8:là # 臘 0x81d9:yÄ�n # 臙 0x81da:lú # 臚 0x81db:huò # 臛 0x81dc:zÄ� # 臜 0x81dd:luÇ’ # è‡� 0x81de:qú # 臞 0x81df:zàng # 臟 0x81e0:luán # 臠 0x81e1:ní,luán # 臡 0x81e2:zÄ� # 臢 0x81e3:chén # 臣 0x81e4:qiÄ�n,xián # 臤 0x81e5:wò # 臥 0x81e6:guàng,jiÇ’ng # 臦 0x81e7:zÄ�ng,zàng,cáng # 臧 0x81e8:lín # 臨 0x81e9:guÇŽng,jiÇ’ng # 臩 0x81ea:zì # 自 0x81eb:jiÇŽo # 臫 0x81ec:niè # 臬 0x81ed:chòu,xiù # 臭 0x81ee:jì # 臮 0x81ef:gÄ�o # 臯 0x81f0:chòu # 臰 0x81f1:mián,biÄ�n # 臱 0x81f2:niè # 臲 0x81f3:zhì # 至 0x81f4:zhì # 致 0x81f5:gé # 臵 0x81f6:jiàn # 臶 0x81f7:dié,zhí # 臷 0x81f8:zhÄ«,jìn # 臸 0x81f9:xiÅ« # 臹 0x81fa:tái # 臺 0x81fb:zhÄ“n # 臻 0x81fc:jiù # 臼 0x81fd:xiàn # 臽 0x81fe:yú # 臾 0x81ff:chÄ� # 臿 0x8200:yÇŽo # 舀 0x8201:yú # èˆ� 0x8202:chÅ�ng # 舂 0x8203:xì # 舃 0x8204:xì # 舄 0x8205:jiù # 舅 0x8206:yú # 舆 0x8207:yÇ” # 與 0x8208:xÄ«ng # 興 0x8209:jÇ” # 舉 0x820a:jiù # 舊 0x820b:xìn # 舋 0x820c:shé # 舌 0x820d:shÄ›,shè # èˆ� 0x820f:jiÇ” # èˆ� 0x8210:shì # èˆ� 0x8211:tÄ�n # 舑 0x8212:shÅ« # 舒 0x8213:shì # 舓 0x8214:tiÇŽn # 舔 0x8215:tàn # 舕 0x8216:pù # 舖 0x8217:pù # 舗 0x8218:guÇŽn # 舘 0x8219:huà # 舙 0x821a:tiàn # 舚 0x821b:chuÇŽn # 舛 0x821c:shùn # 舜 0x821d:xiá # èˆ� 0x821e:wÇ” # 舞 0x821f:zhÅ�u # 舟 0x8220:dÄ�o # 舠 0x8221:chuán # 舡 0x8222:shÄ�n # 舢 0x8223:yÇ� # 舣 0x8225:pÄ� # 舥 0x8226:tài # 舦 0x8227:fán # 舧 0x8228:bÇŽn # 舨 0x8229:chuán # 舩 0x822a:háng # 航 0x822b:fÇŽng # 舫 0x822c:bÄ�n,bÅ�,pán # 般 0x822d:bÇ� # 舭 0x822f:zhÅ�ng # 舯 0x8230:jiàn # 舰 0x8231:cÄ�ng # 舱 0x8232:líng # 舲 0x8233:zhú # 舳 0x8234:zé # 舴 0x8235:duò # 舵 0x8236:bó # 舶 0x8237:xián # 舷 0x8238:gÄ› # 舸 0x8239:chuán # 船 0x823a:xiá # 舺 0x823b:lú # 舻 0x823c:qióng # 舼 0x823d:páng # 舽 0x823e:xÄ« # 舾 0x8240:fú # 艀 0x8241:zào # è‰� 0x8242:féng # 艂 0x8243:lí # 艃 0x8244:shÄ�o # 艄 0x8245:yú # 艅 0x8246:láng # 艆 0x8247:tÇ�ng # 艇 0x8249:wÄ›i # 艉 0x824a:bó # 艊 0x824b:mÄ›ng # 艋 0x824c:niàn # 艌 0x824d:jÅ« # è‰� 0x824e:huáng # 艎 0x824f:shÇ’u # è‰� 0x8250:kè # è‰� 0x8251:biàn # 艑 0x8252:mù # 艒 0x8253:dié # 艓 0x8255:bàng # 艕 0x8256:chÄ� # 艖 0x8257:yì # 艗 0x8258:sÅ�u # 艘 0x8259:cÄ�ng # 艙 0x825a:cáo # 艚 0x825b:lóu # 艛 0x825c:dài # 艜 0x825e:yào # 艞 0x825f:chÅ�ng # 艟 0x8261:dÄ�ng # 艡 0x8262:qiáng # 艢 0x8263:lÇ” # 艣 0x8264:yÇ� # 艤 0x8265:jí # 艥 0x8266:jiàn # 艦 0x8267:huò # 艧 0x8268:méng # 艨 0x8269:qí # 艩 0x826a:lÇ” # 艪 0x826b:lú # 艫 0x826c:chán # 艬 0x826d:shuÄ�ng # 艭 0x826e:gèn # 艮 0x826f:liáng # 良 0x8270:jiÄ�n # 艰 0x8271:jiÄ�n # 艱 0x8272:sè,shÇŽi # 色 0x8273:yàn # 艳 0x8274:fú # 艴 0x8275:pÄ«ng # 艵 0x8276:yàn # 艶 0x8277:yàn # 艷 0x8278:cÇŽo # 艸 0x827a:yì # 艺 0x827b:lè # 艻 0x827c:dÇ�ng # 艼 0x827d:jiÄ�o,qiú # 艽 0x827e:ài,yì # 艾 0x827f:nÇŽi # 艿 0x8280:tiáo # 芀 0x8281:qiú # èŠ� 0x8282:jié,jiÄ“ # 节 0x8283:péng # 芃 0x8284:wán # 芄 0x8285:yì # 芅 0x8286:chÄ�i,chÄ� # 芆 0x8287:mián # 芇 0x8288:mÇ� # 芈 0x8289:gÇŽn # 芉 0x828a:qiÄ�n # 芊 0x828b:yù # 芋 0x828c:yù # 芌 0x828d:sháo # èŠ� 0x828e:xiÅ�ng # 芎 0x828f:dù # èŠ� 0x8290:hù,xià # èŠ� 0x8291:qÇ� # 芑 0x8292:máng # 芒 0x8293:zì,zÇ� # 芓 0x8294:huì,hÅ« # 芔 0x8295:suÄ« # 芕 0x8296:zhì # 芖 0x8297:xiÄ�ng # 芗 0x8298:bì,pí # 芘 0x8299:fú # 芙 0x829a:tún,chÅ«n # 芚 0x829b:wÄ›i # 芛 0x829c:wú # 芜 0x829d:zhÄ« # èŠ� 0x829e:qì # 芞 0x829f:shÄ�n # 芟 0x82a0:wén # 芠 0x82a1:qiàn # 芡 0x82a2:rén # 芢 0x82a3:fú # 芣 0x82a4:kÅ�u # 芤 0x82a5:jiè,gài # 芥 0x82a6:lú # 芦 0x82a7:xù,zhù # 芧 0x82a8:jÄ« # 芨 0x82a9:qín # 芩 0x82aa:qí # 芪 0x82ab:yuán,yán # 芫 0x82ac:fÄ“n # 芬 0x82ad:bÄ� # 芭 0x82ae:ruì # 芮 0x82af:xÄ«n,xìn # 芯 0x82b0:jì # 芰 0x82b1:huÄ� # 花 0x82b2:lún,huÄ� # 芲 0x82b3:fÄ�ng # 芳 0x82b4:wù,hÅ« # 芴 0x82b5:jué # 芵 0x82b6:gÅ�u,gÇ’u # 芶 0x82b7:zhÇ� # 芷 0x82b8:yún # 芸 0x82b9:qín # 芹 0x82ba:ÇŽo # 芺 0x82bb:chú # 芻 0x82bc:máo,mào # 芼 0x82bd:yá # 芽 0x82be:fèi,fú # 芾 0x82bf:réng # 芿 0x82c0:háng # è‹€ 0x82c1:cÅ�ng # è‹� 0x82c2:chán,yín # è‹‚ 0x82c3:yÇ’u # 苃 0x82c4:biàn # è‹„ 0x82c5:yì # è‹… 0x82c7:wÄ›i # 苇 0x82c8:lì # 苈 0x82c9:pÇ� # 苉 0x82ca:è # 苊 0x82cb:xiàn # è‹‹ 0x82cc:cháng # 苌 0x82cd:cÄ�ng # è‹� 0x82ce:zhù # 苎 0x82cf:sÅ«,sù # è‹� 0x82d0:dì,tí # è‹� 0x82d1:yuàn # è‹‘ 0x82d2:rÇŽn # è‹’ 0x82d3:líng # è‹“ 0x82d4:tái,tÄ�i # è‹” 0x82d5:tiáo,sháo # è‹• 0x82d6:dí # è‹– 0x82d7:miáo # è‹— 0x82d8:qÇ�ng # 苘 0x82d9:lì,jÄ« # è‹™ 0x82da:yòng # 苚 0x82db:kÄ“,hÄ“ # è‹› 0x82dc:mù # 苜 0x82dd:bèi # è‹� 0x82de:bÄ�o # 苞 0x82df:gÇ’u # 苟 0x82e0:mín # è‹  0x82e1:yÇ� # è‹¡ 0x82e2:yÇ� # è‹¢ 0x82e3:jù,qÇ” # è‹£ 0x82e4:piÄ› # 苤 0x82e5:ruò,rÄ› # è‹¥ 0x82e6:kÇ” # 苦 0x82e7:zhù,níng # è‹§ 0x82e8:nÇ� # 苨 0x82e9:pÄ�,bó # è‹© 0x82ea:bÇ�ng # 苪 0x82eb:shÄ�n,shàn # è‹« 0x82ec:xiú # 苬 0x82ed:yÇŽo # è‹­ 0x82ee:xiÄ�n # è‹® 0x82ef:bÄ›n # 苯 0x82f0:hóng # è‹° 0x82f1:yÄ«ng # 英 0x82f2:zuó,zhÇŽ # 苲 0x82f3:dÅ�ng # 苳 0x82f4:jÅ«,chá # è‹´ 0x82f5:dié # 苵 0x82f6:nié # è‹¶ 0x82f7:gÄ�n # è‹· 0x82f8:hÅ« # 苸 0x82f9:píng,pÄ“ng # 苹 0x82fa:méi # 苺 0x82fb:fú # è‹» 0x82fc:shÄ“ng,ruí # 苼 0x82fd:gÅ« # 苽 0x82fe:bì # 苾 0x82ff:wèi # è‹¿ 0x8300:fú # 茀 0x8301:zhuó # èŒ� 0x8302:mào # 茂 0x8303:fàn # 范 0x8304:qié,jiÄ� # 茄 0x8305:máo # 茅 0x8306:máo # 茆 0x8307:bá # 茇 0x8308:zÇ�,cí # 茈 0x8309:mò # 茉 0x830a:zÄ« # 茊 0x830b:zhÇ� # 茋 0x830c:chí # 茌 0x830d:jì # èŒ� 0x830e:jÄ«ng # 茎 0x830f:lóng # èŒ� 0x8311:niÇŽo # 茑 0x8313:xué # 茓 0x8314:yíng # 茔 0x8315:qióng # 茕 0x8316:gè # 茖 0x8317:míng # 茗 0x8318:lì # 茘 0x8319:róng # 茙 0x831a:yìn # 茚 0x831b:gèn # 茛 0x831c:qiàn,xÄ« # 茜 0x831d:chÇŽi,zhÇ� # èŒ� 0x831e:chén # 茞 0x831f:yù # 茟 0x8320:hÄ�o # 茠 0x8321:zì # 茡 0x8322:liè # 茢 0x8323:wú # 茣 0x8324:jì # 茤 0x8325:guÄ« # 茥 0x8326:cì # 茦 0x8327:jiÇŽn # 茧 0x8328:cí # 茨 0x8329:hòu # 茩 0x832a:guÄ�ng # 茪 0x832b:máng # 茫 0x832c:chá # 茬 0x832d:jiÄ�o # 茭 0x832e:jiÄ�o # 茮 0x832f:fú # 茯 0x8330:yú # 茰 0x8331:zhÅ« # 茱 0x8332:zÄ« # 茲 0x8333:jiÄ�ng # 茳 0x8334:huí # 茴 0x8335:yÄ«n # 茵 0x8336:chá # 茶 0x8337:fá # 茷 0x8338:róng # 茸 0x8339:rú # 茹 0x833a:chÅ�ng # 茺 0x833b:mÇŽng # 茻 0x833c:tóng # 茼 0x833d:zhòng # 茽 0x833f:zhú # 茿 0x8340:xún # è�€ 0x8341:huán # è�� 0x8342:fÅ« # è�‚ 0x8343:quán # è�ƒ 0x8344:gÄ�i # è�„ 0x8345:dá # è�… 0x8346:jÄ«ng # è�† 0x8347:xìng # è�‡ 0x8348:chuÇŽn # è�ˆ 0x8349:cÇŽo # è�‰ 0x834a:jÄ«ng # è�Š 0x834b:ér # è�‹ 0x834c:àn # è�Œ 0x834d:qiáo # è�� 0x834e:chí # è�Ž 0x834f:rÄ›n # è�� 0x8350:jiàn # è�� 0x8351:yí,tí # è�‘ 0x8352:huÄ�ng # è�’ 0x8353:píng # è�“ 0x8354:lì # è�” 0x8355:jÄ«n # è�• 0x8356:lÇŽo # è�– 0x8357:shù # è�— 0x8358:zhuÄ�ng # è�˜ 0x8359:dá # è�™ 0x835a:jiá # è�š 0x835b:ráo # è�› 0x835c:bì # è�œ 0x835d:cè # è�� 0x835e:qiáo # è�ž 0x835f:huì # è�Ÿ 0x8360:jì,qí # è�  0x8361:dàng # è�¡ 0x8363:róng # è�£ 0x8364:hÅ«n,xÅ«n # è�¤ 0x8365:xíng,yÄ«ng # è�¥ 0x8366:luò # è�¦ 0x8367:yíng # è�§ 0x8368:qián,xún # è�¨ 0x8369:jìn # è�© 0x836a:sÅ«n # è�ª 0x836b:yÄ«n,yìn # è�« 0x836c:mÇŽi # è�¬ 0x836d:hóng # è�­ 0x836e:zhòu # è�® 0x836f:yào # è�¯ 0x8370:dù # è�° 0x8371:wÄ›i # è�± 0x8372:lí # è�² 0x8373:dòu # è�³ 0x8374:fÅ« # è�´ 0x8375:rÄ›n # è�µ 0x8376:yín # è�¶ 0x8377:hé # è�· 0x8378:bí # è�¸ 0x8379:bù # è�¹ 0x837a:yÇ”n # è�º 0x837b:dí # è�» 0x837c:tú # è�¼ 0x837d:suÄ« # è�½ 0x837e:suÄ« # è�¾ 0x837f:chéng # è�¿ 0x8380:chén # 莀 0x8381:wú # èŽ� 0x8382:bié # 莂 0x8383:xÄ« # 莃 0x8384:gÄ›ng # 莄 0x8385:lì # 莅 0x8386:pú # 莆 0x8387:zhù # 莇 0x8388:mò # 莈 0x8389:lì # 莉 0x838a:zhuÄ�ng # 莊 0x838b:zuó # 莋 0x838c:tuÅ� # 莌 0x838d:qiú # èŽ� 0x838e:suÅ�,shÄ� # 莎 0x838f:suÅ� # èŽ� 0x8390:chén # èŽ� 0x8391:péng,fÄ“ng # 莑 0x8392:jÇ” # 莒 0x8393:méi # 莓 0x8394:méng # 莔 0x8395:xìng # 莕 0x8396:jìng # 莖 0x8397:chÄ“ # 莗 0x8398:shÄ“n,xÄ«n # 莘 0x8399:jÅ«n # 莙 0x839a:yán # 莚 0x839b:tíng # 莛 0x839c:yóu # 莜 0x839d:cuò # èŽ� 0x839e:guÄ�n,guÇŽn,wÇŽn # 莞 0x839f:hàn # 莟 0x83a0:yÇ’u # 莠 0x83a1:cuò # 莡 0x83a2:jiá # 莢 0x83a3:wáng # 莣 0x83a4:sù,yóu # 莤 0x83a5:niÇ” # 莥 0x83a6:shÄ�o,xiÄ�o # 莦 0x83a7:xiàn # 莧 0x83a8:làng,liáng # 莨 0x83a9:fú,piÇŽo # 莩 0x83aa:é # 莪 0x83ab:mò,mù # 莫 0x83ac:wèn,wÇŽn,miÇŽn # 莬 0x83ad:jié # 莭 0x83ae:nán # 莮 0x83af:mù # 莯 0x83b0:kÇŽn # 莰 0x83b1:lái # 莱 0x83b2:lián # 莲 0x83b3:shì,shí # 莳 0x83b4:wÅ� # 莴 0x83b6:xiÄ�n,liÇŽn # 莶 0x83b7:huò # 获 0x83b8:yóu # 莸 0x83b9:yíng # 莹 0x83ba:yÄ«ng # 莺 0x83bc:chún # 莼 0x83bd:mÇŽng # 莽 0x83be:mÇŽng # 莾 0x83bf:cì # 莿 0x83c0:wÇŽn,yùn,yù # è�€ 0x83c1:jÄ«ng # è�� 0x83c2:dì # è�‚ 0x83c3:qú # è�ƒ 0x83c4:dÅ�ng # è�„ 0x83c5:jiÄ�n # è�… 0x83c6:zÅ�u,chù # è�† 0x83c7:gÅ« # è�‡ 0x83c8:lÄ� # è�ˆ 0x83c9:lù # è�‰ 0x83ca:jú # è�Š 0x83cb:wèi # è�‹ 0x83cc:jÅ«n,jùn # è�Œ 0x83cd:niè,rÄ›n # è�� 0x83ce:kÅ«n # è�Ž 0x83cf:hé # è�� 0x83d0:pú # è�� 0x83d1:zÄ«,zì,zÄ�i # è�‘ 0x83d2:gÇŽo # è�’ 0x83d3:guÇ’ # è�“ 0x83d4:fú # è�” 0x83d5:lún # è�• 0x83d6:chÄ�ng # è�– 0x83d7:chóu # è�— 0x83d8:sÅ�ng # è�˜ 0x83d9:chuí # è�™ 0x83da:zhàn # è�š 0x83db:mén # è�› 0x83dc:cài # è�œ 0x83dd:bá # è�� 0x83de:lí # è�ž 0x83df:tù,tú # è�Ÿ 0x83e0:bÅ� # è�  0x83e1:hàn # è�¡ 0x83e2:bào # è�¢ 0x83e3:qìn # è�£ 0x83e4:juÇŽn # è�¤ 0x83e5:xÄ« # è�¥ 0x83e6:qín # è�¦ 0x83e7:dÇ� # è�§ 0x83e8:jiÄ“,shà # è�¨ 0x83e9:pú # è�© 0x83ea:dàng # è�ª 0x83eb:jÇ�n # è�« 0x83ec:qiáo,zhÇŽo # è�¬ 0x83ed:tái,zhÄ«,chí # è�­ 0x83ee:gÄ“ng # è�® 0x83ef:huá,huà,huÄ� # è�¯ 0x83f0:gÅ« # è�° 0x83f1:líng # è�± 0x83f2:fÄ“i,fÄ›i # è�² 0x83f3:qín,qÄ«n,jÄ«n # è�³ 0x83f4:Ä�n # è�´ 0x83f5:wÇŽng # è�µ 0x83f6:bÄ›ng # è�¶ 0x83f7:zhÇ’u # è�· 0x83f8:yÄ�n # è�¸ 0x83f9:zÅ« # è�¹ 0x83fa:jiÄ�n # è�º 0x83fb:lÇ�n,má # è�» 0x83fc:tÇŽn # è�¼ 0x83fd:shÅ« # è�½ 0x83fe:tián,tiàn # è�¾ 0x83ff:dào # è�¿ 0x8400:hÇ” # è�€ 0x8401:qí # è�� 0x8402:hé # è�‚ 0x8403:cuì # è�ƒ 0x8404:táo # è�„ 0x8405:chÅ«n # è�… 0x8406:bì # è�† 0x8407:cháng # è�‡ 0x8408:huán # è�ˆ 0x8409:fèi # è�‰ 0x840a:lái # è�Š 0x840b:qÄ« # è�‹ 0x840c:méng # è�Œ 0x840d:píng # è�� 0x840e:wÄ›i # è�Ž 0x840f:dàn # è�� 0x8410:shà # è�� 0x8411:huán # è�‘ 0x8412:yÇŽn # è�’ 0x8413:yí # è�“ 0x8414:tiáo # è�” 0x8415:qí # è�• 0x8416:wÇŽn # è�– 0x8417:cè # è�— 0x8418:nài # è�˜ 0x841a:tuò # è�š 0x841b:jiÅ« # è�› 0x841c:tiÄ“ # è�œ 0x841d:luó # è�� 0x8420:pÄ�n # è�  0x8424:yíng # è�¤ 0x8425:yíng # è�¥ 0x8426:yíng # è�¦ 0x8427:xiÄ�o # è�§ 0x8428:sà # è�¨ 0x8429:qiÅ« # è�© 0x842a:kÄ“ # è�ª 0x842b:xiÄ�ng # è�« 0x842c:wàn # è�¬ 0x842d:yÇ” # è�­ 0x842e:yú # è�® 0x842f:fù # è�¯ 0x8430:liàn # è�° 0x8431:xuÄ�n # è�± 0x8432:xuÄ�n # è�² 0x8433:nÇŽn # è�³ 0x8434:cè # è�´ 0x8435:wÅ� # è�µ 0x8436:chÇ”n # è�¶ 0x8437:shÄ�o # è�· 0x8438:yú # è�¸ 0x8439:biÄ�n # è�¹ 0x843a:mào # è�º 0x843b:Ä�n # è�» 0x843c:è # è�¼ 0x843d:là,luò,lào # è�½ 0x843e:yíng # è�¾ 0x843f:kuò # è�¿ 0x8440:kuò # è‘€ 0x8441:jiÄ�ng # è‘� 0x8442:miÇŽn # è‘‚ 0x8443:zuò # 葃 0x8444:zuò # è‘„ 0x8445:zÅ« # è‘… 0x8446:bÇŽo # 葆 0x8447:róu # 葇 0x8448:xÇ� # 葈 0x8449:yè # 葉 0x844a:Ä�n # 葊 0x844b:qú # è‘‹ 0x844c:jiÄ�n # 葌 0x844d:fú # è‘� 0x844e:lÇœ # 葎 0x844f:jÄ«ng # è‘� 0x8450:pén # è‘� 0x8451:fÄ“ng # è‘‘ 0x8452:hóng # è‘’ 0x8453:hóng # è‘“ 0x8454:hóu # è‘” 0x8455:xìng # è‘• 0x8456:tÅ« # è‘– 0x8457:zhù,zhuó,zhe # è‘— 0x8458:zÄ« # 葘 0x8459:xiÄ�ng # è‘™ 0x845a:shèn,rèn # 葚 0x845b:gé,gÄ› # è‘› 0x845c:qiÄ� # 葜 0x845d:qíng # è‘� 0x845e:mÇ� # 葞 0x845f:huáng # 葟 0x8460:shÄ“n # è‘  0x8461:pú # è‘¡ 0x8462:gài # è‘¢ 0x8463:dÇ’ng # è‘£ 0x8464:zhòu # 葤 0x8465:qián # è‘¥ 0x8466:wÄ›i # 葦 0x8467:bó # è‘§ 0x8468:wÄ“i # 葨 0x8469:pÄ� # è‘© 0x846a:jì # 葪 0x846b:hú # è‘« 0x846c:zàng # 葬 0x846d:jiÄ� # è‘­ 0x846e:duàn # è‘® 0x846f:yào # 葯 0x8470:jùn # è‘° 0x8471:cÅ�ng # 葱 0x8472:quán # 葲 0x8473:wÄ“i # 葳 0x8474:zhÄ“n # è‘´ 0x8475:kuí # 葵 0x8476:tíng # è‘¶ 0x8477:hÅ«n # è‘· 0x8478:xÇ� # 葸 0x8479:shÄ« # 葹 0x847a:qì # 葺 0x847b:lán # è‘» 0x847c:zÅ�ng # 葼 0x847d:yÄ�o # 葽 0x847e:yuÄ�n # 葾 0x847f:méi # è‘¿ 0x8480:yÅ«n # è’€ 0x8481:shù # è’� 0x8482:dì # è’‚ 0x8483:zhuàn # è’ƒ 0x8484:guÄ�n # è’„ 0x8486:xuÄ“ # è’† 0x8487:chÇŽn # è’‡ 0x8488:kÇŽi # è’ˆ 0x8489:kuì,kuài # è’‰ 0x848b:jiÇŽng # è’‹ 0x848c:lóu # è’Œ 0x848d:wÄ›i # è’� 0x848e:pài # è’Ž 0x8490:sÅ�u # è’� 0x8491:yÄ«n # è’‘ 0x8492:shÄ« # è’’ 0x8493:chún # è’“ 0x8494:shì,shí # è’” 0x8495:yÅ«n # è’• 0x8496:zhÄ“n # è’– 0x8497:làng # è’— 0x8498:rú,ná # è’˜ 0x8499:mÄ“ng,méng,mÄ›ng # è’™ 0x849a:lì # è’š 0x849b:quÄ“ # è’› 0x849c:suàn # è’œ 0x849d:yuán,huán # è’� 0x849e:lì # è’ž 0x849f:jÇ” # è’Ÿ 0x84a0:xÄ« # è’  0x84a1:bàng # è’¡ 0x84a2:chú # è’¢ 0x84a3:xú,shú # è’£ 0x84a4:tú # è’¤ 0x84a5:liú # è’¥ 0x84a6:huò # è’¦ 0x84a7:diÇŽn # è’§ 0x84a8:qiàn # è’¨ 0x84a9:zÅ«,jù # è’© 0x84aa:pò # è’ª 0x84ab:cuó # è’« 0x84ac:yuÄ�n # è’¬ 0x84ad:chú # è’­ 0x84ae:yù # è’® 0x84af:kuÇŽi # è’¯ 0x84b0:pán # è’° 0x84b1:pú # è’± 0x84b2:pú # è’² 0x84b3:nà # è’³ 0x84b4:shuò # è’´ 0x84b5:xí,xì # è’µ 0x84b6:fén # è’¶ 0x84b7:yún # è’· 0x84b8:zhÄ“ng # è’¸ 0x84b9:jiÄ�n # è’¹ 0x84ba:jí # è’º 0x84bb:ruò # è’» 0x84bc:cÄ�ng # è’¼ 0x84bd:Ä“n # è’½ 0x84be:mí # è’¾ 0x84bf:hÄ�o # è’¿ 0x84c0:sÅ«n # è“€ 0x84c1:zhÄ“n # è“� 0x84c2:míng # è“‚ 0x84c3:sÅ�u,sÇ’u # 蓃 0x84c4:xù # è“„ 0x84c5:liú # è“… 0x84c6:xí # 蓆 0x84c7:gÅ« # 蓇 0x84c8:láng # 蓈 0x84c9:róng # 蓉 0x84ca:wÄ›ng # 蓊 0x84cb:gài,gÄ›,hé # è“‹ 0x84cc:cuò # 蓌 0x84cd:shÄ« # è“� 0x84ce:táng # 蓎 0x84cf:luÇ’ # è“� 0x84d0:rù # è“� 0x84d1:suÅ� # è“‘ 0x84d2:xuÄ�n # è“’ 0x84d3:bèi # è““ 0x84d4:yÇŽo,zhuó # è“” 0x84d5:guì # è“• 0x84d6:bì # è“– 0x84d7:zÇ’ng # è“— 0x84d8:gÇ”n # 蓘 0x84da:tiáo # 蓚 0x84db:cè # è“› 0x84dd:lán # è“� 0x84df:jì # 蓟 0x84e0:lí # è“  0x84e1:shÄ“n # è“¡ 0x84e2:lÇŽng # è“¢ 0x84e3:yù # è“£ 0x84e5:yíng # è“¥ 0x84e6:mò # 蓦 0x84e7:diào,tiáo,dí # è“§ 0x84e8:tiáo # 蓨 0x84e9:mÇŽo # è“© 0x84ea:tÅ�ng # 蓪 0x84eb:zhú # è“« 0x84ec:péng # 蓬 0x84ed:Ä�n # è“­ 0x84ee:lián # è“® 0x84ef:cÅ�ng # 蓯 0x84f0:xÇ� # è“° 0x84f1:píng # 蓱 0x84f2:qiÅ«,xÅ«,fÅ« # 蓲 0x84f3:jÇ�n # 蓳 0x84f4:chún # è“´ 0x84f5:jié # 蓵 0x84f6:wéi # è“¶ 0x84f7:tuÄ« # è“· 0x84f8:cáo # 蓸 0x84f9:yù # 蓹 0x84fa:yì # 蓺 0x84fb:zí,jú # è“» 0x84fc:liÇŽo,lù # 蓼 0x84fd:bì # 蓽 0x84fe:lÇ” # 蓾 0x84ff:xù # è“¿ 0x8500:bù # 蔀 0x8501:zhÄ�ng # è”� 0x8502:léi # 蔂 0x8503:qiáng,jiàng # 蔃 0x8504:màn # 蔄 0x8505:yán # è”… 0x8506:líng # 蔆 0x8507:jì # 蔇 0x8508:biÄ�o # 蔈 0x8509:gÇ”n # 蔉 0x850a:hàn # 蔊 0x850b:dí # 蔋 0x850c:sù # 蔌 0x850d:lù # è”� 0x850e:shè # 蔎 0x850f:shÄ�ng # è”� 0x8510:dí # è”� 0x8511:miè # 蔑 0x8512:hÅ«n # è”’ 0x8513:màn,wàn # 蔓 0x8514:bo # è”” 0x8515:dì # 蔕 0x8516:cuó # è”– 0x8517:zhè # è”— 0x8518:shÄ“n # 蔘 0x8519:xuàn # è”™ 0x851a:wèi,yù # 蔚 0x851b:hú # è”› 0x851c:áo # 蔜 0x851d:mÇ� # è”� 0x851e:lóu # 蔞 0x851f:cù # 蔟 0x8520:zhÅ�ng # è”  0x8521:cài # 蔡 0x8522:pó # 蔢 0x8523:jiÇŽng # 蔣 0x8524:mì # 蔤 0x8525:cÅ�ng # 蔥 0x8526:niÇŽo # 蔦 0x8527:huì # è”§ 0x8528:juàn # 蔨 0x8529:yín # 蔩 0x852a:jiÄ�n # 蔪 0x852b:niÄ�n # 蔫 0x852c:shÅ« # 蔬 0x852d:yÄ«n # è”­ 0x852e:guó # è”® 0x852f:chén # 蔯 0x8530:hù # è”° 0x8531:shÄ� # è”± 0x8532:kòu # 蔲 0x8533:qiàn # 蔳 0x8534:má # è”´ 0x8535:zàng # 蔵 0x8537:qiáng # è”· 0x8538:dÅ�u # 蔸 0x8539:liÇŽn # 蔹 0x853a:lìn # 蔺 0x853b:kòu # è”» 0x853c:ÇŽi # 蔼 0x853d:bì # 蔽 0x853e:lí # 蔾 0x853f:wÄ›i # 蔿 0x8540:jí # è•€ 0x8541:qián,xún # è•� 0x8542:shèng # è•‚ 0x8543:fÄ�n,fán,bÅ� # 蕃 0x8544:méng # è•„ 0x8545:Ç’u # è•… 0x8546:chÇŽn # 蕆 0x8547:diÇŽn # 蕇 0x8548:xùn # 蕈 0x8549:jiÄ�o,qiáo # 蕉 0x854a:ruÇ� # 蕊 0x854b:ruÇ� # è•‹ 0x854c:lÄ›i # 蕌 0x854d:yú # è•� 0x854e:qiáo # 蕎 0x854f:zhÅ« # è•� 0x8550:huá # è•� 0x8551:jiÄ�n # è•‘ 0x8552:mÇŽi # è•’ 0x8553:yún # è•“ 0x8554:bÄ�o # è•” 0x8555:yóu # è•• 0x8556:qú # è•– 0x8557:lù # è•— 0x8558:ráo # 蕘 0x8559:huì # è•™ 0x855a:è # 蕚 0x855b:tí # è•› 0x855c:fÄ›i # 蕜 0x855d:jué # è•� 0x855e:zuì # 蕞 0x855f:fà # 蕟 0x8560:rú # è•  0x8561:fén # è•¡ 0x8562:kuì # è•¢ 0x8563:shùn # è•£ 0x8564:ruí # 蕤 0x8565:yÇŽ # è•¥ 0x8566:xÅ« # 蕦 0x8567:fù # è•§ 0x8568:jué # 蕨 0x8569:dàng # è•© 0x856a:wú # 蕪 0x856b:dÇ’ng # è•« 0x856c:sÄ« # 蕬 0x856d:xiÄ�o # è•­ 0x856e:xì # è•® 0x856f:sà # 蕯 0x8570:yùn,wÄ“n # è•° 0x8572:qí # 蕲 0x8573:jiÄ�n # 蕳 0x8574:yùn # è•´ 0x8575:sÅ«n # 蕵 0x8576:líng # è•¶ 0x8577:yù # è•· 0x8578:xiá # 蕸 0x8579:wèng # 蕹 0x857a:jí # 蕺 0x857b:hòng # è•» 0x857c:sì # 蕼 0x857d:nóng # 蕽 0x857e:lÄ›i # 蕾 0x857f:xuÄ�n # è•¿ 0x8580:yùn # è–€ 0x8581:yù # è–� 0x8582:xí,xiào # è–‚ 0x8583:hào # è–ƒ 0x8584:báo,bó,bò # è–„ 0x8585:hÄ�o # è–… 0x8586:ài # è–† 0x8587:wÄ“i # è–‡ 0x8588:huì # è–ˆ 0x8589:huì # è–‰ 0x858a:jì # è–Š 0x858b:cí,zÄ« # è–‹ 0x858c:xiÄ�ng # è–Œ 0x858d:wàn,luàn # è–� 0x858e:miè # è–Ž 0x858f:yì # è–� 0x8590:léng # è–� 0x8591:jiÄ�ng # è–‘ 0x8592:càn # è–’ 0x8593:shÄ“n # è–“ 0x8594:qiáng,sè # è–” 0x8595:lián # è–• 0x8596:kÄ“ # è–– 0x8597:yuán # è–— 0x8598:dá # è–˜ 0x8599:tì # è–™ 0x859a:tÄ�ng # è–š 0x859b:xuÄ“ # è–› 0x859c:bì # è–œ 0x859d:zhÄ�n # è–� 0x859e:sÅ«n # è–ž 0x859f:xiÄ�n,liÇŽn # è–Ÿ 0x85a0:fán # è–  0x85a1:dÇ�ng # è–¡ 0x85a2:xiè # è–¢ 0x85a3:gÇ” # è–£ 0x85a4:xiè # è–¤ 0x85a5:shÇ” # è–¥ 0x85a6:jiàn # è–¦ 0x85a7:hÄ�o,kÇŽo # è–§ 0x85a8:hÅ�ng # è–¨ 0x85a9:sà # è–© 0x85aa:xÄ«n # è–ª 0x85ab:xÅ«n # è–« 0x85ac:yào # è–¬ 0x85ae:sÇ’u # è–® 0x85af:shÇ” # è–¯ 0x85b0:xÅ«n # è–° 0x85b1:duì # è–± 0x85b2:pín # è–² 0x85b3:yuÇŽn,wÄ›i # è–³ 0x85b4:níng # è–´ 0x85b5:chóu,zhòu # è–µ 0x85b6:mái,wÅ� # è–¶ 0x85b7:rú # è–· 0x85b8:piáo # è–¸ 0x85b9:tái # è–¹ 0x85ba:jì,qí # è–º 0x85bb:zÇŽo # è–» 0x85bc:chén # è–¼ 0x85bd:zhÄ“n # è–½ 0x85be:Ä›r # è–¾ 0x85bf:nÇ� # è–¿ 0x85c0:yíng # è—€ 0x85c1:gÇŽo # è—� 0x85c2:cóng # è—‚ 0x85c3:xiÄ�o,hào # è—ƒ 0x85c4:qí # è—„ 0x85c5:fá # è—… 0x85c6:jiÇŽn # è—† 0x85c7:xù,yù,xÅ« # è—‡ 0x85c8:kuí # è—ˆ 0x85c9:jiè,jí # è—‰ 0x85ca:biÇŽn # è—Š 0x85cb:diào,zhuó # è—‹ 0x85cc:mí # è—Œ 0x85cd:lán # è—� 0x85ce:jìn # è—Ž 0x85cf:cáng,zàng # è—� 0x85d0:miÇŽo # è—� 0x85d1:qióng # è—‘ 0x85d2:qì # è—’ 0x85d3:xiÇŽn # è—“ 0x85d5:Ç’u # è—• 0x85d6:xián # è—– 0x85d7:sù # è—— 0x85d8:lǘ # è—˜ 0x85d9:yì # è—™ 0x85da:xù # è—š 0x85db:xiÄ› # è—› 0x85dc:lí # è—œ 0x85dd:yì # è—� 0x85de:lÇŽ # è—ž 0x85df:lÄ›i # è—Ÿ 0x85e0:jiào # è—  0x85e1:dí # è—¡ 0x85e2:zhÇ� # è—¢ 0x85e3:bÄ“i # è—£ 0x85e4:téng # è—¤ 0x85e5:yào # è—¥ 0x85e6:mò # è—¦ 0x85e7:huàn # è—§ 0x85e8:biÄ�o,pÄ�o # è—¨ 0x85e9:fÄ�n # è—© 0x85ea:sÇ’u # è—ª 0x85eb:tán # è—« 0x85ec:tuÄ« # è—¬ 0x85ed:qióng # è—­ 0x85ee:qiáo # è—® 0x85ef:wèi # è—¯ 0x85f0:liú,liÇ” # è—° 0x85f1:huì,huí # è—± 0x85f3:gÇŽo # è—³ 0x85f4:yùn # è—´ 0x85f6:lì # è—¶ 0x85f7:shÇ” # è—· 0x85f8:zhÅ«,chú # è—¸ 0x85f9:ÇŽi # è—¹ 0x85fa:lìn # è—º 0x85fb:zÇŽo # è—» 0x85fc:xuÄ�n # è—¼ 0x85fd:qìn # è—½ 0x85fe:lài # è—¾ 0x85ff:huò # è—¿ 0x8600:tuò # 蘀 0x8601:wù # è˜� 0x8602:ruÇ� # 蘂 0x8603:ruÇ� # 蘃 0x8604:qí # 蘄 0x8605:héng # 蘅 0x8606:lú # 蘆 0x8607:sÅ« # 蘇 0x8608:tuí # 蘈 0x8609:máng # 蘉 0x860a:yùn # 蘊 0x860b:pín,píng # 蘋 0x860c:yù # 蘌 0x860d:xÅ«n # è˜� 0x860e:jì # 蘎 0x860f:jiÅ�ng # è˜� 0x8610:xuÄ�n # è˜� 0x8611:mó # 蘑 0x8613:sÅ« # 蘓 0x8614:jiÅ�ng # 蘔 0x8616:niè # 蘖 0x8617:bò # 蘗 0x8618:ráng # 蘘 0x8619:yì # 蘙 0x861a:xiÇŽn # 蘚 0x861b:yú # 蘛 0x861c:jú # 蘜 0x861d:liÇŽn # è˜� 0x861e:liÇŽn # 蘞 0x861f:yÇ�n # 蘟 0x8620:qiáng # 蘠 0x8621:yÄ«ng # 蘡 0x8622:lóng # 蘢 0x8623:tÇ’u # 蘣 0x8624:huÄ� # 蘤 0x8625:yuè # 蘥 0x8626:lìng # 蘦 0x8627:qú # 蘧 0x8628:yáo # 蘨 0x8629:fán # 蘩 0x862a:mí # 蘪 0x862b:lán # 蘫 0x862c:guÄ« # 蘬 0x862d:lán # 蘭 0x862e:jì # 蘮 0x862f:dàng # 蘯 0x8631:lèi # 蘱 0x8632:léi # 蘲 0x8633:huÄ« # 蘳 0x8634:fÄ“ng # 蘴 0x8635:zhÄ« # 蘵 0x8636:wèi # 蘶 0x8637:kuí # 蘷 0x8638:zhàn # 蘸 0x8639:huái # 蘹 0x863a:lí # 蘺 0x863b:jì # 蘻 0x863c:mí # 蘼 0x863d:lÄ›i # 蘽 0x863e:huài # 蘾 0x863f:luó # 蘿 0x8640:jÄ« # 虀 0x8641:kuí # è™� 0x8642:lù # 虂 0x8643:jiÄ�n # 虃 0x8646:léi # 虆 0x8647:quÇŽn # 虇 0x8648:xiÄ�o # 虈 0x8649:yì # 虉 0x864a:luán # 虊 0x864b:mén # 虋 0x864c:biÄ“ # 虌 0x864d:hÅ« # è™� 0x864e:hÇ” # 虎 0x864f:lÇ” # è™� 0x8650:nüè # è™� 0x8651:lÇœ # 虑 0x8652:sÄ« # è™’ 0x8653:xiÄ�o # 虓 0x8654:qián # è™” 0x8655:chÇ” # 處 0x8656:hÅ« # è™– 0x8657:xÅ« # è™— 0x8658:cuó # 虘 0x8659:fú # è™™ 0x865a:xÅ« # 虚 0x865b:xÅ« # è™› 0x865c:lÇ” # 虜 0x865d:hÇ” # è™� 0x865e:yú # 虞 0x865f:hào,háo # 號 0x8660:jiÄ�o # è™  0x8661:jù # 虡 0x8662:guó # 虢 0x8663:bào # 虣 0x8664:yán # 虤 0x8665:zhàn # 虥 0x8666:zhàn # 虦 0x8667:kuÄ« # è™§ 0x8668:bÄ«n # 虨 0x8669:xì # 虩 0x866a:shù # 虪 0x866b:chóng # 虫 0x866c:qiú # 虬 0x866d:diÄ�o # è™­ 0x866e:jÇ� # è™® 0x866f:qiú # 虯 0x8670:dÄ«ng # è™° 0x8671:shÄ« # è™± 0x8673:jué # 虳 0x8674:zhé # è™´ 0x8675:shé # 虵 0x8676:yú # è™¶ 0x8677:hán # è™· 0x8678:zÇ� # 虸 0x8679:hóng # 虹 0x867a:huÇ�,huÄ« # 虺 0x867b:méng # è™» 0x867c:gè # 虼 0x867d:suÄ« # 虽 0x867e:xiÄ�,hÄ� # 虾 0x867f:chài # 虿 0x8680:shí # 蚀 0x8681:yÇ� # èš� 0x8682:mÇŽ,mÄ�,mà # èš‚ 0x8683:xiÇŽng # 蚃 0x8684:fÄ�ng,bàng # èš„ 0x8685:è # èš… 0x8686:bÄ� # 蚆 0x8687:chÇ� # 蚇 0x8688:qiÄ�n # 蚈 0x8689:wén # 蚉 0x868a:wén # 蚊 0x868b:ruì # èš‹ 0x868c:bàng,bèng # 蚌 0x868d:pí # èš� 0x868e:yuè # 蚎 0x868f:yuè # èš� 0x8690:jÅ«n # èš� 0x8691:qí # èš‘ 0x8692:tóng # èš’ 0x8693:yÇ�n # èš“ 0x8694:qí,zhÇ� # èš” 0x8695:cán # èš• 0x8696:yuán,wán # èš– 0x8697:jué,quÄ“ # èš— 0x8698:huí # 蚘 0x8699:qín,qián # èš™ 0x869a:qí # èšš 0x869b:zhòng # èš› 0x869c:yá # èšœ 0x869d:háo # èš� 0x869e:mù # èšž 0x869f:wáng # 蚟 0x86a0:fén # èš  0x86a1:fén # èš¡ 0x86a2:háng # 蚢 0x86a3:gÅ�ng,zhÅ�ng # 蚣 0x86a4:zÇŽo # 蚤 0x86a5:fù,fÇ” # 蚥 0x86a6:rán # 蚦 0x86a7:jiè # èš§ 0x86a8:fú # 蚨 0x86a9:chÄ« # èš© 0x86aa:dÇ’u # 蚪 0x86ab:bào # èš« 0x86ac:xiÇŽn # 蚬 0x86ad:ní # èš­ 0x86ae:dài,dé # èš® 0x86af:qiÅ« # 蚯 0x86b0:yóu # èš° 0x86b1:zhà # èš± 0x86b2:píng # èš² 0x86b3:chí # èš³ 0x86b4:yòu # èš´ 0x86b5:kÄ“ # èšµ 0x86b6:hÄ�n # èš¶ 0x86b7:jù # èš· 0x86b8:lì # 蚸 0x86b9:fù # èš¹ 0x86ba:rán # 蚺 0x86bb:zhá # èš» 0x86bc:gÇ’u,qú,xù # èš¼ 0x86bd:pí # èš½ 0x86be:pí,bÇ’ # èš¾ 0x86bf:xián # èš¿ 0x86c0:zhù # 蛀 0x86c1:diÄ�o # è›� 0x86c2:bié # 蛂 0x86c3:bÄ«ng # 蛃 0x86c4:gÅ« # 蛄 0x86c5:zhÄ�n # è›… 0x86c6:qÅ« # 蛆 0x86c7:shé,yí # 蛇 0x86c8:tiÄ› # 蛈 0x86c9:líng # 蛉 0x86ca:gÇ” # 蛊 0x86cb:dàn # 蛋 0x86cc:tún # 蛌 0x86cd:yíng # è›� 0x86ce:lì # 蛎 0x86cf:chÄ“ng # è›� 0x86d0:qÅ« # è›� 0x86d1:móu # 蛑 0x86d2:gé,luò # è›’ 0x86d3:cì # 蛓 0x86d4:huí # è›” 0x86d5:huí # 蛕 0x86d6:máng,bàng # è›– 0x86d7:fù # è›— 0x86d8:yáng # 蛘 0x86d9:wÄ� # è›™ 0x86da:liè # 蛚 0x86db:zhÅ« # è›› 0x86dc:yÄ« # 蛜 0x86dd:xián # è›� 0x86de:kuò # 蛞 0x86df:jiÄ�o # 蛟 0x86e0:lì # è›  0x86e1:yì,xÇ” # 蛡 0x86e2:píng # 蛢 0x86e3:jié # 蛣 0x86e4:gé,há # 蛤 0x86e5:shé # 蛥 0x86e6:yí # 蛦 0x86e7:wÇŽng # è›§ 0x86e8:mò # 蛨 0x86e9:qióng # 蛩 0x86ea:qiè,ní # 蛪 0x86eb:guÇ� # 蛫 0x86ec:qióng # 蛬 0x86ed:zhì # è›­ 0x86ee:mán # è›® 0x86f0:zhé # è›° 0x86f1:jiá # è›± 0x86f2:náo # 蛲 0x86f3:sÄ« # 蛳 0x86f4:qí # è›´ 0x86f5:xíng # 蛵 0x86f6:jiè # è›¶ 0x86f7:qiú # è›· 0x86f8:xiÄ�o,shÄ�o # 蛸 0x86f9:yÇ’ng # 蛹 0x86fa:jiá # 蛺 0x86fb:tuì # è›» 0x86fc:chÄ“ # 蛼 0x86fd:bèi # 蛽 0x86fe:é,yÇ� # 蛾 0x86ff:hàn # 蛿 0x8700:shÇ” # 蜀 0x8701:xuán # èœ� 0x8702:fÄ“ng # 蜂 0x8703:shèn # 蜃 0x8704:shèn # 蜄 0x8705:fÇ” # 蜅 0x8706:xiÇŽn # 蜆 0x8707:zhé # 蜇 0x8708:wú # 蜈 0x8709:fú # 蜉 0x870a:lì # 蜊 0x870b:láng # 蜋 0x870c:bì # 蜌 0x870d:chú # èœ� 0x870e:yuÄ�n # 蜎 0x870f:yÇ’u # èœ� 0x8710:jié # èœ� 0x8711:dàn # 蜑 0x8712:yán # 蜒 0x8713:tíng # 蜓 0x8714:diàn # 蜔 0x8715:tuì # 蜕 0x8716:huí # 蜖 0x8717:wÅ� # 蜗 0x8718:zhÄ« # 蜘 0x8719:zhÅ�ng # 蜙 0x871a:fÄ“i # 蜚 0x871b:jÅ« # 蜛 0x871c:mì # 蜜 0x871d:qí # èœ� 0x871e:qí # 蜞 0x871f:yù # 蜟 0x8720:jùn # 蜠 0x8721:là,zhà # 蜡 0x8722:mÄ›ng # 蜢 0x8723:qiÄ�ng # 蜣 0x8724:sÄ« # 蜤 0x8725:xÄ« # 蜥 0x8726:lún # 蜦 0x8727:lì # 蜧 0x8728:dié # 蜨 0x8729:tiáo # 蜩 0x872a:táo # 蜪 0x872b:kÅ«n # 蜫 0x872c:hán # 蜬 0x872d:hàn # 蜭 0x872e:yù # 蜮 0x872f:bàng # 蜯 0x8730:féi # 蜰 0x8731:pí # 蜱 0x8732:wÄ“i # 蜲 0x8733:dÅ«n # 蜳 0x8734:yì # 蜴 0x8735:yuÄ�n # 蜵 0x8736:suò # 蜶 0x8737:quán # 蜷 0x8738:qiÇŽn # 蜸 0x8739:ruì # 蜹 0x873a:ní # 蜺 0x873b:qÄ«ng # 蜻 0x873c:wèi # 蜼 0x873d:liÇŽng # 蜽 0x873e:guÇ’ # 蜾 0x873f:wÄ�n # 蜿 0x8740:dÅ�ng # è�€ 0x8741:è # è�� 0x8742:bÇŽn # è�‚ 0x8743:dì # è�ƒ 0x8744:wÇŽng # è�„ 0x8745:cán # è�… 0x8746:yÇŽng # è�† 0x8747:yíng # è�‡ 0x8748:guÅ� # è�ˆ 0x8749:chán # è�‰ 0x874b:là # è�‹ 0x874c:kÄ“ # è�Œ 0x874d:jí # è�� 0x874e:xiÄ“ # è�Ž 0x874f:tíng # è�� 0x8750:mào # è�� 0x8751:xÅ« # è�‘ 0x8752:mián # è�’ 0x8753:yú # è�“ 0x8754:jiÄ“ # è�” 0x8755:shí # è�• 0x8756:xuÄ�n # è�– 0x8757:huáng # è�— 0x8758:yÇŽn # è�˜ 0x8759:biÄ�n # è�™ 0x875a:róu # è�š 0x875b:wÄ“i # è�› 0x875c:fù # è�œ 0x875d:yuán # è�� 0x875e:mèi # è�ž 0x875f:wèi # è�Ÿ 0x8760:fú # è�  0x8761:rú,ruăn # è�¡ 0x8762:xié # è�¢ 0x8763:yóu # è�£ 0x8764:qiú,yóu # è�¤ 0x8765:máo # è�¥ 0x8766:xiÄ�,hÄ� # è�¦ 0x8767:yÄ«ng # è�§ 0x8768:shÄ« # è�¨ 0x8769:chóng # è�© 0x876a:tÄ�ng # è�ª 0x876b:zhÅ« # è�« 0x876c:zÅ�ng # è�¬ 0x876d:dì # è�­ 0x876e:fù # è�® 0x876f:yuán # è�¯ 0x8770:kuí # è�° 0x8771:méng # è�± 0x8772:là # è�² 0x8773:dài # è�³ 0x8774:hú # è�´ 0x8775:qiÅ« # è�µ 0x8776:dié # è�¶ 0x8777:lì # è�· 0x8778:wÅ� # è�¸ 0x8779:yÅ«n # è�¹ 0x877a:qÇ” # è�º 0x877b:nÇŽn # è�» 0x877c:lóu # è�¼ 0x877d:chÅ«n # è�½ 0x877e:róng # è�¾ 0x877f:yíng # è�¿ 0x8780:jiÄ�ng # 螀 0x8782:láng # èž‚ 0x8783:páng # 螃 0x8784:sÄ« # èž„ 0x8785:xÄ« # èž… 0x8786:cì # 螆 0x8787:xÄ«,qÄ« # 螇 0x8788:yuán # 螈 0x8789:wÄ“ng # 螉 0x878a:lián # 螊 0x878b:sÅ�u # èž‹ 0x878c:bÄ�n # 螌 0x878d:róng # èž� 0x878e:róng # 螎 0x878f:jí # èž� 0x8790:wÅ« # èž� 0x8791:xiù # èž‘ 0x8792:hàn # èž’ 0x8793:qín # èž“ 0x8794:yí # èž” 0x8795:bÄ«,pí # èž• 0x8796:huá # èž– 0x8797:táng # èž— 0x8798:yÇ� # 螘 0x8799:dù # èž™ 0x879a:nài,nÄ›ng # èžš 0x879b:hé,xiá # èž› 0x879c:hú # èžœ 0x879d:guì,huÇ� # èž� 0x879e:mÇŽ,mÄ�,mà # èžž 0x879f:míng # 螟 0x87a0:yì # èž  0x87a1:wén # èž¡ 0x87a2:yíng # 螢 0x87a3:téng # 螣 0x87a4:zhÅ�ng # 螤 0x87a5:cÄ�ng # 螥 0x87a8:mÇŽn # 螨 0x87aa:shÄ�ng # 螪 0x87ab:shì,zhÄ“ # èž« 0x87ac:cáo # 螬 0x87ad:chÄ« # èž­ 0x87ae:dì # èž® 0x87af:áo # 螯 0x87b0:lù # èž° 0x87b1:wèi # èž± 0x87b2:dié,zhì # èž² 0x87b3:táng # èž³ 0x87b4:chén # èž´ 0x87b5:piÄ�o # èžµ 0x87b6:qú,jù # èž¶ 0x87b7:pí # èž· 0x87b8:yú # 螸 0x87b9:chán,jiàn # èž¹ 0x87ba:luó # 螺 0x87bb:lóu # èž» 0x87bc:qÇ�n # èž¼ 0x87bd:zhÅ�ng # èž½ 0x87be:yÇ�n # èž¾ 0x87bf:jiÄ�ng # èž¿ 0x87c0:shuài # 蟀 0x87c1:wén # èŸ� 0x87c2:xiÄ�o # 蟂 0x87c3:wàn # 蟃 0x87c4:zhé # 蟄 0x87c5:zhè # 蟅 0x87c6:má,mò # 蟆 0x87c7:má # 蟇 0x87c8:guÅ� # 蟈 0x87c9:liú # 蟉 0x87ca:máo # 蟊 0x87cb:xÄ« # 蟋 0x87cc:cÅ�ng # 蟌 0x87cd:lí # èŸ� 0x87ce:mÇŽn # 蟎 0x87cf:xiÄ�o # èŸ� 0x87d1:zhÄ�ng # 蟑 0x87d2:mÇŽng,mÄ›ng # 蟒 0x87d3:xiàng # 蟓 0x87d4:mò # 蟔 0x87d5:zuÄ« # 蟕 0x87d6:sÄ« # 蟖 0x87d7:qiÅ« # 蟗 0x87d8:tè # 蟘 0x87d9:zhí # 蟙 0x87da:péng # 蟚 0x87db:péng # 蟛 0x87dc:jiÇŽo # 蟜 0x87dd:qú # èŸ� 0x87de:biÄ“,bié # 蟞 0x87df:liáo # 蟟 0x87e0:pán # 蟠 0x87e1:guÇ� # 蟡 0x87e2:xÇ� # 蟢 0x87e3:jÇ� # 蟣 0x87e4:zhuÄ�n # 蟤 0x87e5:huáng # 蟥 0x87e6:fèi,bÄ“n # 蟦 0x87e7:láo,liáo # 蟧 0x87e8:jué # 蟨 0x87e9:jué # 蟩 0x87ea:huì # 蟪 0x87eb:yín,xún # 蟫 0x87ec:chán # 蟬 0x87ed:jiÄ�o # 蟭 0x87ee:shàn # 蟮 0x87ef:náo # 蟯 0x87f0:xiÄ�o # 蟰 0x87f1:wú # 蟱 0x87f2:chóng # 蟲 0x87f3:xún # 蟳 0x87f4:sÄ« # 蟴 0x87f6:chÄ“ng # 蟶 0x87f7:dÄ�ng # 蟷 0x87f8:lí # 蟸 0x87f9:xiè # 蟹 0x87fa:shàn # 蟺 0x87fb:yÇ� # 蟻 0x87fc:jÇ�ng # 蟼 0x87fd:dá # 蟽 0x87fe:chán # 蟾 0x87ff:qì # 蟿 0x8800:cÄ« # è € 0x8801:xiÇŽng # è � 0x8802:shè # è ‚ 0x8803:luÇ’ # è ƒ 0x8804:qín # è „ 0x8805:yíng # è … 0x8806:chài # è † 0x8807:lì # è ‡ 0x8808:zéi # è ˆ 0x8809:xuÄ�n # è ‰ 0x880a:lián # è Š 0x880b:zhú # è ‹ 0x880c:zé # è Œ 0x880d:xiÄ“ # è � 0x880e:mÇŽng # è Ž 0x880f:xiè # è � 0x8810:qí # è � 0x8811:róng # è ‘ 0x8812:jiÇŽn # è ’ 0x8813:mÄ›ng # è “ 0x8814:háo # è ” 0x8815:rú # è • 0x8816:huò # è – 0x8817:zhuó # è — 0x8818:jié # è ˜ 0x8819:pín # è ™ 0x881a:hÄ“ # è š 0x881b:miè # è › 0x881c:fán # è œ 0x881d:lÄ›i # è � 0x881e:jié # è ž 0x881f:là # è Ÿ 0x8820:mÇ�n # è   0x8821:lÇ� # è ¡ 0x8822:chÇ”n # è ¢ 0x8823:lì # è £ 0x8824:qiÅ« # è ¤ 0x8825:niè # è ¥ 0x8826:lú # è ¦ 0x8827:dù # è § 0x8828:xiÄ�o # è ¨ 0x8829:zhÅ« # è © 0x882a:lóng # è ª 0x882b:lí # è « 0x882c:lóng # è ¬ 0x882d:fÄ“ng # è ­ 0x882e:yÄ“ # è ® 0x882f:pí # è ¯ 0x8830:náng # è ° 0x8831:gÇ” # è ± 0x8832:juÄ�n # è ² 0x8833:yÄ«ng # è ³ 0x8835:xÄ« # è µ 0x8836:cán # è ¶ 0x8837:qú # è · 0x8838:quán # è ¸ 0x8839:dù # è ¹ 0x883a:cán # è º 0x883b:mán # è » 0x883c:qú # è ¼ 0x883d:jié # è ½ 0x883e:zhú # è ¾ 0x883f:zhuó # è ¿ 0x8840:xiÄ›,xuè # è¡€ 0x8841:huÄ�ng # è¡� 0x8842:nÇœ # è¡‚ 0x8843:pÄ“i # 衃 0x8844:nÇœ # è¡„ 0x8845:xìn # è¡… 0x8846:zhòng # 衆 0x8847:mài # 衇 0x8848:Ä›r # 衈 0x8849:kè # 衉 0x884a:miè # 衊 0x884b:xì # è¡‹ 0x884c:háng,xíng,héng,hàng # 行 0x884d:yÇŽn # è¡� 0x884e:kàn # 衎 0x884f:yuàn # è¡� 0x8851:líng # è¡‘ 0x8852:xuàn # è¡’ 0x8853:shù # è¡“ 0x8854:xián # è¡” 0x8855:tòng # è¡• 0x8856:xiàng # è¡– 0x8857:jiÄ“ # è¡— 0x8858:xián # 衘 0x8859:yá # è¡™ 0x885a:hú # 衚 0x885b:wèi # è¡› 0x885c:dào # 衜 0x885d:chÅ�ng # è¡� 0x885e:wèi # 衞 0x885f:dào # 衟 0x8860:zhÅ«n # è¡  0x8861:héng # è¡¡ 0x8862:qú # è¡¢ 0x8863:yÄ« # è¡£ 0x8865:bÇ” # è¡¥ 0x8866:gÇŽn # 衦 0x8867:yú # è¡§ 0x8868:biÇŽo # 表 0x8869:chà # è¡© 0x886a:yì # 衪 0x886b:shÄ�n # è¡« 0x886c:chèn # 衬 0x886d:fÅ« # è¡­ 0x886e:gÇ”n # è¡® 0x886f:fÄ“n # 衯 0x8870:shuÄ�i,cuÄ« # è¡° 0x8871:jié # 衱 0x8872:nà # 衲 0x8873:zhÅ�ng # 衳 0x8874:dÇŽn # è¡´ 0x8875:rì # 衵 0x8876:zhòng # è¡¶ 0x8877:zhÅ�ng # è¡· 0x8878:jiè # 衸 0x8879:zhÇ� # 衹 0x887a:xié # 衺 0x887b:rán # è¡» 0x887c:zhÄ« # 衼 0x887d:rèn # 衽 0x887e:qÄ«n # 衾 0x887f:jÄ«n # è¡¿ 0x8880:jÅ«n # 袀 0x8881:yuán # è¢� 0x8882:mèi # 袂 0x8883:chài # 袃 0x8884:ÇŽo # 袄 0x8885:niÇŽo # 袅 0x8886:huÄ« # 袆 0x8887:rán # 袇 0x8888:jiÄ� # 袈 0x8889:tuó,tuÅ� # 袉 0x888a:lÇ�ng,líng # 袊 0x888b:dài # 袋 0x888c:bào,páo,pào # 袌 0x888d:páo # è¢� 0x888e:yào # 袎 0x888f:zuò # è¢� 0x8890:bì # è¢� 0x8891:shào # 袑 0x8892:tÇŽn # 袒 0x8893:jù,jiÄ“ # 袓 0x8894:hè,kè # 袔 0x8895:xué # 袕 0x8896:xiù # 袖 0x8897:zhÄ›n # 袗 0x8898:yí,yì # 袘 0x8899:pà # 袙 0x889a:fú # 袚 0x889b:dÄ« # 袛 0x889c:wà # 袜 0x889d:fù # è¢� 0x889e:gÇ”n # 袞 0x889f:zhì # 袟 0x88a0:zhì # 袠 0x88a1:rán # 袡 0x88a2:pàn # 袢 0x88a3:yì # 袣 0x88a4:mào # 袤 0x88a6:nà,jué # 袦 0x88a7:gÅ�u # 袧 0x88a8:xuàn # 袨 0x88a9:zhé # 袩 0x88aa:qÅ« # 袪 0x88ab:bèi,pÄ« # 被 0x88ac:yù # 袬 0x88ad:xí # 袭 0x88af:bó # 袯 0x88b1:fú # 袱 0x88b2:chÇ�,nuÇ’ # 袲 0x88b3:chÇ�,qÇ�,duÇ’,nuÇ’ # 袳 0x88b4:kù # 袴 0x88b5:rèn # 袵 0x88b6:péng # 袶 0x88b7:jiá,jié,qiÄ� # 袷 0x88b8:jiàn,zùn # 袸 0x88b9:bó,mò # 袹 0x88ba:jié # 袺 0x88bb:ér # 袻 0x88bc:gÄ“ # 袼 0x88bd:rú # 袽 0x88be:zhÅ« # 袾 0x88bf:guÄ«,guà # 袿 0x88c0:yÄ«n # 裀 0x88c1:cái # è£� 0x88c2:liè,liÄ› # 裂 0x88c5:zhuÄ�ng # 装 0x88c6:dÄ�ng # 裆 0x88c8:kÅ«n # 裈 0x88c9:kèn # 裉 0x88ca:niÇŽo # 裊 0x88cb:shù # 裋 0x88cc:jiá # 裌 0x88cd:kÇ”n # è£� 0x88ce:chéng,chÄ›ng # 裎 0x88cf:lÇ� # è£� 0x88d0:juÄ�n # è£� 0x88d1:shÄ“n # 裑 0x88d2:póu # 裒 0x88d3:gé,jiÄ“ # 裓 0x88d4:yì # 裔 0x88d5:yù # 裕 0x88d6:zhÄ›n # 裖 0x88d7:liú # 裗 0x88d8:qiú # 裘 0x88d9:qún # 裙 0x88da:jì # 裚 0x88db:yì # 裛 0x88dc:bÇ” # 補 0x88dd:zhuÄ�ng # è£� 0x88de:shuì # 裞 0x88df:shÄ� # 裟 0x88e0:qún # 裠 0x88e1:lÇ� # 裡 0x88e2:lián # 裢 0x88e3:liÇŽn # 裣 0x88e4:kù # 裤 0x88e5:jiÇŽn # 裥 0x88e6:bÄ�o # 裦 0x88e7:chÄ�n # 裧 0x88e8:bì,pí # 裨 0x88e9:kÅ«n # 裩 0x88ea:táo # 裪 0x88eb:yuàn # 裫 0x88ec:líng # 裬 0x88ed:chÇ� # 裭 0x88ee:chÄ�ng # 裮 0x88ef:chóu,dÄ�o # 裯 0x88f0:duÅ� # 裰 0x88f1:biÇŽo # 裱 0x88f2:liÇŽng # 裲 0x88f3:cháng,shang # 裳 0x88f4:péi # 裴 0x88f5:péi # 裵 0x88f6:fÄ“i # 裶 0x88f7:yuÄ�n,gÇ”n # 裷 0x88f8:luÇ’ # 裸 0x88f9:guÇ’ # 裹 0x88fa:yÇŽn,Ä�n # 裺 0x88fb:dú # 裻 0x88fc:xÄ«,tì # 裼 0x88fd:zhì # 製 0x88fe:jÅ« # 裾 0x88ff:yÇ� # 裿 0x8900:qí # 褀 0x8901:guÇ’ # è¤� 0x8902:guà # 褂 0x8903:kèn # 褃 0x8905:tì # 褅 0x8906:tí # 褆 0x8907:fù # 複 0x8908:chóng # 褈 0x8909:xiè # 褉 0x890a:biÇŽn # 褊 0x890b:dié # 褋 0x890c:kÅ«n # 褌 0x890d:duÄ�n # è¤� 0x890e:xiù,yòu # 褎 0x890f:xiù # è¤� 0x8910:hè # è¤� 0x8911:yuàn # 褑 0x8912:bÄ�o # 褒 0x8913:bÇŽo # 褓 0x8914:fù,fú # 褔 0x8915:yú # 褕 0x8916:tuàn # 褖 0x8917:yÇŽn # 褗 0x8918:huÄ« # 褘 0x8919:bèi # 褙 0x891a:zhÇ”,chÇ” # 褚 0x891b:lÇš # 褛 0x891e:yùn # 褞 0x891f:tÄ� # 褟 0x8920:gÅ�u # 褠 0x8921:dÄ� # 褡 0x8922:huái # 褢 0x8923:róng # 褣 0x8924:yuán # 褤 0x8925:rù # 褥 0x8926:nài # 褦 0x8927:jiÇ’ng # 褧 0x8928:suÇ’ # 褨 0x8929:bÄ�n # 褩 0x892a:tuì,tùn # 褪 0x892b:chÇ� # 褫 0x892c:sÇŽng # 褬 0x892d:niÇŽo # 褭 0x892e:yÄ«ng # 褮 0x892f:jiè # 褯 0x8930:qiÄ�n # 褰 0x8931:huái # 褱 0x8932:kù # 褲 0x8933:lián # 褳 0x8934:lán # 褴 0x8935:lí # 褵 0x8936:zhÄ› # 褶 0x8937:shÄ« # 褷 0x8938:lÇš # 褸 0x8939:yì # 褹 0x893a:diÄ“ # 褺 0x893b:xiè # 褻 0x893c:xiÄ�n # 褼 0x893d:wèi # 褽 0x893e:biÇŽo # 褾 0x893f:cáo # 褿 0x8940:jì # 襀 0x8941:qiÇŽng # è¥� 0x8942:sÄ“n # 襂 0x8943:bÄ�o # 襃 0x8944:xiÄ�ng # 襄 0x8946:fú # 襆 0x8947:jiÇŽn # 襇 0x8948:zhuàn # 襈 0x8949:jiÇŽn # 襉 0x894a:cuì # 襊 0x894b:jí # 襋 0x894c:dÄ�n # 襌 0x894d:zá # è¥� 0x894e:fán # 襎 0x894f:bó # è¥� 0x8950:xiàng # è¥� 0x8951:xín # 襑 0x8952:bié # 襒 0x8953:ráo # 襓 0x8954:mÇŽn # 襔 0x8955:lán # 襕 0x8956:ÇŽo # 襖 0x8957:zé # 襗 0x8958:guì # 襘 0x8959:cào # 襙 0x895a:suì # 襚 0x895b:nóng # 襛 0x895c:chÄ�n # 襜 0x895d:liÇŽn # è¥� 0x895e:bì # 襞 0x895f:jÄ«n # 襟 0x8960:dÄ�ng # 襠 0x8961:shÇ” # 襡 0x8962:tÇŽn # 襢 0x8963:bì # 襣 0x8964:lán # 襤 0x8965:fú # 襥 0x8966:rú # 襦 0x8967:zhÇ� # 襧 0x8969:shÇ” # 襩 0x896a:wà # 襪 0x896b:shì # 襫 0x896c:bÇŽi # 襬 0x896d:xié # 襭 0x896e:bó # 襮 0x896f:chèn # 襯 0x8970:lÇŽi # 襰 0x8971:lóng # 襱 0x8972:xí # 襲 0x8973:xiÄ�n # 襳 0x8974:lán # 襴 0x8975:zhÄ› # 襵 0x8976:dài # 襶 0x8978:zàn # 襸 0x8979:shÄ« # 襹 0x897a:jiÇŽn # 襺 0x897b:pàn # 襻 0x897c:yì # 襼 0x897e:yà # 襾 0x897f:xÄ« # 西 0x8980:yà # 覀 0x8981:yào,yÄ�o # è¦� 0x8982:fÄ›ng # 覂 0x8983:tán,qín # 覃 0x8985:fiào # 覅 0x8986:fù # 覆 0x8987:bà # 覇 0x8988:hé # 覈 0x8989:jÄ« # 覉 0x898a:jÄ« # 覊 0x898b:jiàn,xiàn # 見 0x898c:guÄ�n,guàn # 覌 0x898d:biàn # è¦� 0x898e:yàn # 覎 0x898f:guÄ« # è¦� 0x8990:jué,jiào # è¦� 0x8991:piÇŽn # 覑 0x8992:mào # 覒 0x8993:mì # 覓 0x8994:mì # 覔 0x8995:piÄ“,miè # 覕 0x8996:shì # 視 0x8997:sì # 覗 0x8998:chÄ�n # 覘 0x8999:zhÄ›n # 覙 0x899a:jué,jiào # 覚 0x899b:mì # 覛 0x899c:tiào # 覜 0x899d:lián # è¦� 0x899e:yào # 覞 0x899f:zhì # 覟 0x89a0:jÅ«n # 覠 0x89a1:xÄ« # 覡 0x89a2:shÇŽn # 覢 0x89a3:wÄ“i # 覣 0x89a4:xì # 覤 0x89a5:tiÇŽn # 覥 0x89a6:yú # 覦 0x89a7:lÇŽn # 覧 0x89a8:è # 覨 0x89a9:dÇ” # 覩 0x89aa:qÄ«n,qìng # 親 0x89ab:pÇŽng # 覫 0x89ac:jì # 覬 0x89ad:míng # 覭 0x89ae:yíng,yÇ�ng # 覮 0x89af:gòu # 覯 0x89b0:qÅ«,qù # 覰 0x89b1:zhàn,zhÄ�n # 覱 0x89b2:jìn # 覲 0x89b3:guÄ�n,guàn # 観 0x89b4:dèng # 覴 0x89b5:jiàn,biÇŽn # 覵 0x89b6:luó,luÇŽn # 覶 0x89b7:qù,qÅ« # 覷 0x89b8:jiàn # 覸 0x89b9:wéi # 覹 0x89ba:jué,jiào # 覺 0x89bb:qù,qÅ« # 覻 0x89bc:luó # 覼 0x89bd:lÇŽn # 覽 0x89be:shÄ›n # 覾 0x89bf:dí # 覿 0x89c0:guÄ�n,guàn # è§€ 0x89c1:jiàn,xiàn # è§� 0x89c2:guÄ�n,guàn # è§‚ 0x89c3:yàn # 觃 0x89c4:guÄ« # è§„ 0x89c5:mì # è§… 0x89c6:shì # 视 0x89c7:chÄ�n # 觇 0x89c8:lÇŽn # 览 0x89c9:jué,jiào # 觉 0x89ca:jì # è§Š 0x89cb:xí # è§‹ 0x89cc:dí # è§Œ 0x89cd:tiÇŽn # è§� 0x89ce:yú # è§Ž 0x89cf:gòu # è§� 0x89d0:jìn # è§� 0x89d1:qù,qÅ« # è§‘ 0x89d2:jiÇŽo,jué # è§’ 0x89d3:qiú # è§“ 0x89d4:jÄ«n # è§” 0x89d5:cÅ« # è§• 0x89d6:jué # è§– 0x89d7:zhì # è§— 0x89d8:chào # 觘 0x89d9:jí # è§™ 0x89da:gÅ« # è§š 0x89db:dàn # è§› 0x89dc:zÄ«,zuÇ� # è§œ 0x89dd:dÇ� # è§� 0x89de:shÄ�ng # è§ž 0x89df:huà,xiè # è§Ÿ 0x89e0:quán # è§  0x89e1:gé # è§¡ 0x89e2:shì # è§¢ 0x89e3:jiÄ›,jiè,xiè # è§£ 0x89e4:guÇ� # 觤 0x89e5:gÅ�ng # è§¥ 0x89e6:chù # 触 0x89e7:jiÄ›,jiè,xiè # è§§ 0x89e8:hùn # 觨 0x89e9:qiú # è§© 0x89ea:xÄ«ng # 觪 0x89eb:sù # è§« 0x89ec:ní # 觬 0x89ed:jÄ«,qí # è§­ 0x89ee:jué # è§® 0x89ef:zhì # 觯 0x89f0:zhÄ� # è§° 0x89f1:bì # è§± 0x89f2:xÄ«ng # è§² 0x89f3:hú # è§³ 0x89f4:shÄ�ng # è§´ 0x89f5:gÅ�ng # è§µ 0x89f6:zhì # è§¶ 0x89f7:xué,hù # è§· 0x89f8:chù # 觸 0x89f9:xÄ« # è§¹ 0x89fa:yí # 觺 0x89fb:lì,lù # è§» 0x89fc:jué # è§¼ 0x89fd:xÄ« # è§½ 0x89fe:yàn # è§¾ 0x89ff:xÄ« # è§¿ 0x8a00:yán # 言 0x8a02:dìng # 訂 0x8a03:fù # 訃 0x8a04:qiú # 訄 0x8a05:qiú # 訅 0x8a06:jiào # 訆 0x8a07:hÅ�ng # 訇 0x8a08:jì # 計 0x8a09:fàn # 訉 0x8a0a:xùn # 訊 0x8a0b:diào # 訋 0x8a0c:hòng # 訌 0x8a0d:chài,chÄ�,chà # è¨� 0x8a0e:tÇŽo # 討 0x8a0f:xÅ« # è¨� 0x8a10:jié # è¨� 0x8a11:dàn,yí # 訑 0x8a12:rèn # 訒 0x8a13:xùn # 訓 0x8a14:yín # 訔 0x8a15:shàn # 訕 0x8a16:qì # 訖 0x8a17:tuÅ� # 託 0x8a18:jì # 記 0x8a19:xùn # 訙 0x8a1a:yín # 訚 0x8a1b:é # 訛 0x8a1c:fÄ“n # 訜 0x8a1d:yà # è¨� 0x8a1e:yÄ�o # 訞 0x8a1f:sòng # 訟 0x8a20:shÄ›n # 訠 0x8a21:yín # 訡 0x8a22:xÄ«n # 訢 0x8a23:jué # 訣 0x8a24:xiáo,ná # 訤 0x8a25:nè # 訥 0x8a26:chén # 訦 0x8a27:yóu # 訧 0x8a28:zhÇ� # 訨 0x8a29:xiÅ�ng # 訩 0x8a2a:fÇŽng # 訪 0x8a2b:xìn # 訫 0x8a2c:chÄ�o # 訬 0x8a2d:shè # 設 0x8a2e:yán # 訮 0x8a2f:sÇŽ # 訯 0x8a30:zhùn # 訰 0x8a31:xÅ« # 許 0x8a32:yì # 訲 0x8a33:yì # 訳 0x8a34:sù # 訴 0x8a35:chÄ« # 訵 0x8a36:hÄ“ # 訶 0x8a37:shÄ“n # 訷 0x8a38:hé # 訸 0x8a39:xù # 訹 0x8a3a:zhÄ›n # 診 0x8a3b:zhù # 註 0x8a3c:zhèng # 証 0x8a3d:gòu # 訽 0x8a3e:zÄ« # 訾 0x8a3f:zÇ� # 訿 0x8a40:zhÄ�n # è©€ 0x8a41:gÇ” # è©� 0x8a42:fù # è©‚ 0x8a43:jiÇŽn # 詃 0x8a44:dié # è©„ 0x8a45:líng # è©… 0x8a46:dÇ� # 詆 0x8a47:yàng # 詇 0x8a48:lì # 詈 0x8a49:náo # 詉 0x8a4a:pàn # 詊 0x8a4b:zhòu # è©‹ 0x8a4c:gàn # 詌 0x8a4d:yì # è©� 0x8a4e:jù # 詎 0x8a4f:yào # è©� 0x8a50:zhà # è©� 0x8a51:tuó # è©‘ 0x8a52:yí,dài # è©’ 0x8a53:qÇ” # è©“ 0x8a54:zhào # è©” 0x8a55:píng # è©• 0x8a56:bì # è©– 0x8a57:xiòng # è©— 0x8a58:qÅ« # 詘 0x8a59:bá # è©™ 0x8a5a:dá # 詚 0x8a5b:zÇ” # è©› 0x8a5c:tÄ�o # 詜 0x8a5d:zhÇ” # è©� 0x8a5e:cí # 詞 0x8a5f:zhé # 詟 0x8a60:yÇ’ng # è©  0x8a61:xÇ” # è©¡ 0x8a62:xún # è©¢ 0x8a63:yì # è©£ 0x8a64:huÇŽng # 詤 0x8a65:hé # è©¥ 0x8a66:shì # 試 0x8a67:chá # è©§ 0x8a68:xiào # 詨 0x8a69:shÄ« # è©© 0x8a6a:hÄ›n # 詪 0x8a6b:chà # è©« 0x8a6c:gòu # 詬 0x8a6d:guÇ� # è©­ 0x8a6e:quán # è©® 0x8a6f:huì # 詯 0x8a70:jié # è©° 0x8a71:huà # 話 0x8a72:gÄ�i # 該 0x8a73:xiáng # 詳 0x8a74:wÄ“i # è©´ 0x8a75:shÄ“n # 詵 0x8a76:chóu # è©¶ 0x8a77:tóng # è©· 0x8a78:mí # 詸 0x8a79:zhÄ�n # 詹 0x8a7a:míng # 詺 0x8a7b:luò # è©» 0x8a7c:huÄ« # 詼 0x8a7d:yán # 詽 0x8a7e:xiÅ�ng # 詾 0x8a7f:guà # è©¿ 0x8a80:èr # 誀 0x8a81:bìng # èª� 0x8a82:tiÇŽo,diào # 誂 0x8a83:yí,chÇ�,chì # 誃 0x8a84:lÄ›i # 誄 0x8a85:zhÅ« # 誅 0x8a86:kuÄ�ng # 誆 0x8a87:kuÄ�,kuà # 誇 0x8a88:wÅ« # 誈 0x8a89:yù # 誉 0x8a8a:téng # 誊 0x8a8b:jì # 誋 0x8a8c:zhì # 誌 0x8a8d:rèn # èª� 0x8a8e:cù # 誎 0x8a8f:lÇŽng,làng # èª� 0x8a90:é # èª� 0x8a91:kuáng # 誑 0x8a92:Ä“i,éi,Ä›i,èi,xÄ« # 誒 0x8a93:shì # 誓 0x8a94:tÇ�ng # 誔 0x8a95:dàn # 誕 0x8a96:bèi,bó # 誖 0x8a97:chán # 誗 0x8a98:yòu # 誘 0x8a99:kÄ“ng # 誙 0x8a9a:qiào # 誚 0x8a9b:qÄ«n # 誛 0x8a9c:shuà # 誜 0x8a9d:Ä�n # èª� 0x8a9e:yÇ”,yù # 語 0x8a9f:xiào # 誟 0x8aa0:chéng # 誠 0x8aa1:jiè # 誡 0x8aa2:xiàn # 誢 0x8aa3:wÅ« # 誣 0x8aa4:wù # 誤 0x8aa5:gào # 誥 0x8aa6:sòng # 誦 0x8aa7:bÅ« # 誧 0x8aa8:huì # 誨 0x8aa9:jìng # 誩 0x8aaa:shuÅ�,shuì,yuè # 說 0x8aab:zhèn # 誫 0x8aac:shuÅ�,shuì,yuè # 説 0x8aad:dú # 読 0x8aaf:chàng # 誯 0x8ab0:shuí,shéi # 誰 0x8ab1:jié # 誱 0x8ab2:kè # 課 0x8ab3:qÅ«,juè # 誳 0x8ab4:cóng # 誴 0x8ab5:xiáo # 誵 0x8ab6:suì # 誶 0x8ab7:wÇŽng # 誷 0x8ab8:xián # 誸 0x8ab9:fÄ›i # 誹 0x8aba:chÄ«,lài # 誺 0x8abb:tà # 誻 0x8abc:yì # 誼 0x8abd:nì,ná # 誽 0x8abe:yín # 誾 0x8abf:diào,tiáo # 調 0x8ac0:pÇ�,bÄ“i # è«€ 0x8ac1:zhuó # è«� 0x8ac2:chÇŽn # è«‚ 0x8ac3:chÄ“n # 諃 0x8ac4:zhÅ«n # è«„ 0x8ac5:jì,jÄ« # è«… 0x8ac6:qÄ« # 諆 0x8ac7:tán # 談 0x8ac8:zhuì # 諈 0x8ac9:wÄ›i # 諉 0x8aca:jÅ« # 諊 0x8acb:qÇ�ng # è«‹ 0x8acc:dÇ’ng # 諌 0x8acd:zhèng # è«� 0x8ace:zé,zuò,zhÇŽ,cuò # 諎 0x8acf:zÅ�u # è«� 0x8ad0:qiÄ�n # è«� 0x8ad1:zhuó # è«‘ 0x8ad2:liàng # è«’ 0x8ad3:jiàn # è«“ 0x8ad4:chù,jí # è«” 0x8ad5:xià,háo # è«• 0x8ad6:lùn,lún # è«– 0x8ad7:shÄ›n # è«— 0x8ad8:biÇŽo # 諘 0x8ad9:huà # è«™ 0x8ada:biàn # 諚 0x8adb:yú # è«› 0x8adc:dié # 諜 0x8add:xÅ« # è«� 0x8ade:piÇŽn # 諞 0x8adf:shì,dì # 諟 0x8ae0:xuÄ�n # è«  0x8ae1:shì # è«¡ 0x8ae2:hùn # è«¢ 0x8ae3:huà,guÄ� # è«£ 0x8ae4:è # 諤 0x8ae5:zhòng # è«¥ 0x8ae6:dì # 諦 0x8ae7:xié # è«§ 0x8ae8:fú # 諨 0x8ae9:pÇ” # è«© 0x8aea:tíng # 諪 0x8aeb:jiàn # è«« 0x8aec:qÇ� # 諬 0x8aed:yù # è«­ 0x8aee:zÄ« # è«® 0x8aef:zhuÄ�n # 諯 0x8af0:xÇ�,shÄ�i,Ä�i # è«° 0x8af1:huì # 諱 0x8af2:yÄ«n # 諲 0x8af3:Ä�n # 諳 0x8af4:xián # è«´ 0x8af5:nán,nàn # 諵 0x8af6:chén # è«¶ 0x8af7:fÄ›ng # è«· 0x8af8:zhÅ« # 諸 0x8af9:yáng # 諹 0x8afa:yàn # 諺 0x8afb:huáng # è«» 0x8afc:xuÄ�n # 諼 0x8afd:gé # 諽 0x8afe:nuò # 諾 0x8aff:xÇ” # è«¿ 0x8b00:móu # 謀 0x8b01:yè # è¬� 0x8b02:wèi # 謂 0x8b04:téng # 謄 0x8b05:zhÅ�u # 謅 0x8b06:shàn # 謆 0x8b07:jiÇŽn # 謇 0x8b08:bó # 謈 0x8b0a:huÇŽng # 謊 0x8b0b:huò # 謋 0x8b0c:gÄ“ # 謌 0x8b0d:yíng # è¬� 0x8b0e:mí # 謎 0x8b0f:xiÇŽo # è¬� 0x8b10:mì # è¬� 0x8b11:xÇ� # 謑 0x8b12:qiÄ�ng # 謒 0x8b13:chÄ“n # 謓 0x8b14:xuè # 謔 0x8b15:tí # 謕 0x8b16:sù # 謖 0x8b17:bàng # 謗 0x8b18:chí # 謘 0x8b19:qiÄ�n # 謙 0x8b1a:shì # 謚 0x8b1b:jiÇŽng # 講 0x8b1c:yuán # 謜 0x8b1d:xiè # è¬� 0x8b1e:hè # 謞 0x8b1f:tÄ�o # 謟 0x8b20:yáo # 謠 0x8b21:yáo # 謡 0x8b23:yú # 謣 0x8b24:biÄ�o # 謤 0x8b25:còng # 謥 0x8b26:qÇ�ng # 謦 0x8b27:lí # 謧 0x8b28:mó # 謨 0x8b29:mó # 謩 0x8b2a:shÄ�ng # 謪 0x8b2b:zhé # 謫 0x8b2c:miù # 謬 0x8b2d:jiÇŽn # 謭 0x8b2e:zé # 謮 0x8b2f:jiÄ“ # 謯 0x8b30:lián # 謰 0x8b31:lóu # 謱 0x8b32:càn # 謲 0x8b33:Å�u # 謳 0x8b34:gùn # 謴 0x8b35:xí # 謵 0x8b36:zhuó # 謶 0x8b37:áo # 謷 0x8b38:áo # 謸 0x8b39:jÇ�n # 謹 0x8b3a:zhé # 謺 0x8b3b:yí # 謻 0x8b3c:hÅ« # 謼 0x8b3d:jiàng # 謽 0x8b3e:mán # 謾 0x8b3f:cháo # 謿 0x8b40:hàn # è­€ 0x8b41:huá # è­� 0x8b42:chÇŽn # è­‚ 0x8b43:xÅ« # è­ƒ 0x8b44:zÄ“ng # è­„ 0x8b45:sè # è­… 0x8b46:xÄ« # è­† 0x8b47:zhÄ� # è­‡ 0x8b48:duì # è­ˆ 0x8b49:zhèng # è­‰ 0x8b4a:náo # è­Š 0x8b4b:lán # è­‹ 0x8b4c:é # è­Œ 0x8b4d:yÄ«ng # è­� 0x8b4e:jué # è­Ž 0x8b4f:jÄ« # è­� 0x8b50:zÇ”n # è­� 0x8b51:jiÇŽo # è­‘ 0x8b52:bò # è­’ 0x8b53:huì # è­“ 0x8b54:zhuàn # è­” 0x8b55:wú # è­• 0x8b56:zèn # è­– 0x8b57:zhá # è­— 0x8b58:shí,zhì # è­˜ 0x8b59:qiáo # è­™ 0x8b5a:tán # è­š 0x8b5b:jiàn # è­› 0x8b5c:pÇ” # è­œ 0x8b5d:shéng # è­� 0x8b5e:xuÄ�n # è­ž 0x8b5f:zào # è­Ÿ 0x8b60:tán # è­  0x8b61:dÇŽng # è­¡ 0x8b62:suì # è­¢ 0x8b63:xiÇŽn # è­£ 0x8b64:jÄ« # è­¤ 0x8b65:jiào # è­¥ 0x8b66:jÇ�ng # è­¦ 0x8b67:zhàn # è­§ 0x8b68:nóng # è­¨ 0x8b69:yÄ« # è­© 0x8b6a:ÇŽi # è­ª 0x8b6b:zhÄ�n # è­« 0x8b6c:pì # è­¬ 0x8b6d:huÇ� # è­­ 0x8b6e:huà # è­® 0x8b6f:yì # è­¯ 0x8b70:yì # è­° 0x8b71:shàn # è­± 0x8b72:ràng # è­² 0x8b73:ròu # è­³ 0x8b74:qiÇŽn # è­´ 0x8b75:duì # è­µ 0x8b76:tà # è­¶ 0x8b77:hù # è­· 0x8b78:zhÅ�u # è­¸ 0x8b79:háo # è­¹ 0x8b7a:ài # è­º 0x8b7b:yÄ«ng # è­» 0x8b7c:jiÄ�n # è­¼ 0x8b7d:yù # è­½ 0x8b7e:jiÇŽn # è­¾ 0x8b7f:huì # è­¿ 0x8b80:dú # 讀 0x8b81:zhé # è®� 0x8b82:juàn,xuÄ�n # 讂 0x8b83:zàn # 讃 0x8b84:lÄ›i # 讄 0x8b85:shÄ›n # è®… 0x8b86:wèi # 讆 0x8b87:chÇŽn # 讇 0x8b88:lì # 讈 0x8b89:yí,tuÄ« # 讉 0x8b8a:biàn # 變 0x8b8b:zhé # 讋 0x8b8c:yàn # 讌 0x8b8d:è # è®� 0x8b8e:chóu # 讎 0x8b8f:wèi # è®� 0x8b90:chóu # è®� 0x8b91:yào # 讑 0x8b92:chán # è®’ 0x8b93:ràng # 讓 0x8b94:yÇ�n # è®” 0x8b95:lán # 讕 0x8b96:chèn # è®– 0x8b97:xié # è®— 0x8b98:niè # 讘 0x8b99:huÄ�n # è®™ 0x8b9a:zàn # 讚 0x8b9b:yì # è®› 0x8b9c:dÇŽng # 讜 0x8b9d:zhán # è®� 0x8b9e:yàn # 讞 0x8b9f:dú # 讟 0x8ba0:yán # è®  0x8ba1:jì # 计 0x8ba2:dìng # 订 0x8ba3:fù # 讣 0x8ba4:rèn # 认 0x8ba5:jÄ« # 讥 0x8ba6:jié # 讦 0x8ba7:hòng # è®§ 0x8ba8:tÇŽo # 讨 0x8ba9:ràng # 让 0x8baa:shàn # 讪 0x8bab:qì # 讫 0x8bac:tuÅ� # 讬 0x8bad:xùn # è®­ 0x8bae:yì # è®® 0x8baf:xùn # 讯 0x8bb0:jì # è®° 0x8bb1:rèn # è®± 0x8bb2:jiÇŽng # 讲 0x8bb3:huì # 讳 0x8bb4:Å�u # è®´ 0x8bb5:jù # 讵 0x8bb6:yà # è®¶ 0x8bb7:nè # è®· 0x8bb8:xÇ”,hÇ” # 许 0x8bb9:é # 讹 0x8bba:lùn,lún # 论 0x8bbb:xiÅ�ng # è®» 0x8bbc:sòng # 讼 0x8bbd:fÄ›ng # 讽 0x8bbe:shè # 设 0x8bbf:fÇŽng # 访 0x8bc0:jué # 诀 0x8bc1:zhèng # è¯� 0x8bc2:gÇ” # 诂 0x8bc3:hÄ“ # 诃 0x8bc4:píng # 评 0x8bc5:zÇ” # 诅 0x8bc6:shí,zhì # 识 0x8bc7:xiòng # 诇 0x8bc8:zhà # 诈 0x8bc9:sù # 诉 0x8bca:zhÄ›n # 诊 0x8bcb:dÇ� # 诋 0x8bcc:zhÅ�u # 诌 0x8bcd:cí # è¯� 0x8bce:qÅ« # 诎 0x8bcf:zhào # è¯� 0x8bd0:bì # è¯� 0x8bd1:yì # 译 0x8bd2:yí,dài # 诒 0x8bd3:kuÄ�ng # 诓 0x8bd4:lÄ›i # 诔 0x8bd5:shì # 试 0x8bd6:guà # 诖 0x8bd7:shÄ« # 诗 0x8bd8:jié,jí # 诘 0x8bd9:huÄ« # 诙 0x8bda:chéng # 诚 0x8bdb:zhÅ« # 诛 0x8bdc:shÄ“n # 诜 0x8bdd:huà # è¯� 0x8bde:dàn # 诞 0x8bdf:gòu # 诟 0x8be0:quán # 诠 0x8be1:guÇ� # 诡 0x8be2:xún # 询 0x8be3:yì # 诣 0x8be4:zhèng # 诤 0x8be5:gÄ�i # 该 0x8be6:xiáng,yáng # 详 0x8be7:chà # 诧 0x8be8:hùn # 诨 0x8be9:xÇ” # 诩 0x8bea:zhÅ�u,chóu # 诪 0x8beb:jiè # 诫 0x8bec:wÅ« # 诬 0x8bed:yÇ”,yù # 语 0x8bee:qiào # 诮 0x8bef:wù # 误 0x8bf0:gào # 诰 0x8bf1:yòu # 诱 0x8bf2:huì # 诲 0x8bf3:kuáng # 诳 0x8bf4:shuÅ�,shuì,yuè # 说 0x8bf5:sòng # 诵 0x8bf6:Ä“i,éi,Ä›i,èi,xÄ« # 诶 0x8bf7:qÇ�ng # 请 0x8bf8:zhÅ« # 诸 0x8bf9:zÅ�u # 诹 0x8bfa:nuò # 诺 0x8bfb:dú,dòu # 读 0x8bfc:zhuó # 诼 0x8bfd:fÄ›i # 诽 0x8bfe:kè # 课 0x8bff:wÄ›i # 诿 0x8c00:yú # è°€ 0x8c01:shuí,shéi # è°� 0x8c02:shÄ›n # è°‚ 0x8c03:tiáo,diào,zhÅ�u # è°ƒ 0x8c04:chÇŽn # è°„ 0x8c05:liàng # è°… 0x8c06:zhÅ«n # è°† 0x8c07:suì # è°‡ 0x8c08:tán # è°ˆ 0x8c09:shÄ›n # è°‰ 0x8c0a:yì # è°Š 0x8c0b:móu # è°‹ 0x8c0c:chén,shèn # è°Œ 0x8c0d:dié # è°� 0x8c0e:huÇŽng # è°Ž 0x8c0f:jiàn # è°� 0x8c10:xié # è°� 0x8c11:xuè # è°‘ 0x8c12:yè # è°’ 0x8c13:wèi # è°“ 0x8c14:è # è°” 0x8c15:yù # è°• 0x8c16:xuÄ�n # è°– 0x8c17:chán # è°— 0x8c18:zÄ« # è°˜ 0x8c19:Ä�n # è°™ 0x8c1a:yàn # è°š 0x8c1b:dì # è°› 0x8c1c:mí,mèi # è°œ 0x8c1d:piÇŽn # è°� 0x8c1e:xÅ« # è°ž 0x8c1f:mó # è°Ÿ 0x8c20:dÇŽng # è°  0x8c21:sù # è°¡ 0x8c22:xiè # è°¢ 0x8c23:yáo # è°£ 0x8c24:bàng # è°¤ 0x8c25:shì # è°¥ 0x8c26:qiÄ�n # è°¦ 0x8c27:mì # è°§ 0x8c28:jÇ�n # è°¨ 0x8c29:mán # è°© 0x8c2a:zhé # è°ª 0x8c2b:jiÇŽn # è°« 0x8c2c:miù # è°¬ 0x8c2d:tán # è°­ 0x8c2e:zèn # è°® 0x8c2f:qiáo # è°¯ 0x8c30:lán # è°° 0x8c31:pÇ” # è°± 0x8c32:jué # è°² 0x8c33:yàn # è°³ 0x8c34:qiÇŽn # è°´ 0x8c35:zhÄ�n # è°µ 0x8c36:chèn # è°¶ 0x8c37:gÇ”,yù # è°· 0x8c38:qiÄ�n # è°¸ 0x8c39:hóng # è°¹ 0x8c3a:xiÄ� # è°º 0x8c3b:jí # è°» 0x8c3c:hóng # è°¼ 0x8c3d:hÄ�n # è°½ 0x8c3e:hÅ�ng # è°¾ 0x8c3f:xÄ« # è°¿ 0x8c40:xÄ« # è±€ 0x8c41:huÅ�,huò,huá # è±� 0x8c42:liáo # 豂 0x8c43:hÇŽn # 豃 0x8c44:dú # 豄 0x8c45:lóng # è±… 0x8c46:dòu # 豆 0x8c47:jiÄ�ng # 豇 0x8c48:qÇ�,kÇŽi # 豈 0x8c49:chÇ� # 豉 0x8c4a:lÇ� # 豊 0x8c4b:dÄ“ng # 豋 0x8c4c:wÄ�n # 豌 0x8c4d:bÄ« # è±� 0x8c4e:shù # 豎 0x8c4f:xiàn # è±� 0x8c50:fÄ“ng # è±� 0x8c51:zhì # 豑 0x8c52:zhì # è±’ 0x8c53:yàn # 豓 0x8c54:yàn # è±” 0x8c55:shÇ� # 豕 0x8c56:chù # è±– 0x8c57:huÄ« # è±— 0x8c58:tún # 豘 0x8c59:yì # è±™ 0x8c5a:tún # 豚 0x8c5b:yì # è±› 0x8c5c:jiÄ�n # 豜 0x8c5d:bÄ� # è±� 0x8c5e:hòu # 豞 0x8c5f:è # 豟 0x8c60:chú # è±  0x8c61:xiàng # 象 0x8c62:huàn # è±¢ 0x8c63:jiÄ�n,yàn # è±£ 0x8c64:kÄ›n # 豤 0x8c65:gÄ�i # è±¥ 0x8c66:jù # 豦 0x8c67:fú # è±§ 0x8c68:xÄ« # 豨 0x8c69:bÄ«n # 豩 0x8c6a:háo # 豪 0x8c6b:yù # 豫 0x8c6c:zhÅ« # 豬 0x8c6d:jiÄ� # è±­ 0x8c6e:fén # è±® 0x8c6f:xÄ« # 豯 0x8c70:hù # è±° 0x8c71:wÄ“n # è±± 0x8c72:huán # è±² 0x8c73:bÄ«n # è±³ 0x8c74:dí # è±´ 0x8c75:zÅ�ng # è±µ 0x8c76:fén # è±¶ 0x8c77:yì # è±· 0x8c78:zhì # 豸 0x8c79:bào # è±¹ 0x8c7a:chái # 豺 0x8c7b:àn # è±» 0x8c7c:pí # è±¼ 0x8c7d:nà # è±½ 0x8c7e:pÄ« # è±¾ 0x8c7f:gÇ’u # 豿 0x8c80:nà # è²€ 0x8c81:yòu # è²� 0x8c82:diÄ�o # 貂 0x8c83:mò # 貃 0x8c84:sì # 貄 0x8c85:xiÅ« # è²… 0x8c86:huán,huÄ�n # 貆 0x8c87:kÄ›n,kÅ«n # 貇 0x8c88:hé,mò # 貈 0x8c89:hé,háo,mò # 貉 0x8c8a:mò # 貊 0x8c8b:àn # 貋 0x8c8c:mào # 貌 0x8c8d:lí # è²� 0x8c8e:ní # 貎 0x8c8f:bÇ� # è²� 0x8c90:yÇ” # è²� 0x8c91:jiÄ� # 貑 0x8c92:tuÄ�n,tuàn # è²’ 0x8c93:mÄ�o,máo # 貓 0x8c94:pí # è²” 0x8c95:xÄ« # 貕 0x8c96:yì # è²– 0x8c97:jù,lóu # è²— 0x8c98:mò # 貘 0x8c99:chÅ« # è²™ 0x8c9a:tán # 貚 0x8c9b:huÄ�n # è²› 0x8c9c:jué # 貜 0x8c9d:bèi # è²� 0x8c9e:zhÄ“n # 貞 0x8c9f:yuán,yún,yùn # 貟 0x8ca0:fù # è²  0x8ca1:cái # 財 0x8ca2:gòng # è²¢ 0x8ca3:dài,tè # è²£ 0x8ca4:yì,yí # 貤 0x8ca5:háng # è²¥ 0x8ca6:wán # 貦 0x8ca7:pín # è²§ 0x8ca8:huò # 貨 0x8ca9:fàn # 販 0x8caa:tÄ�n # 貪 0x8cab:guàn # 貫 0x8cac:zé,zhài # 責 0x8cad:zhì # è²­ 0x8cae:èr # è²® 0x8caf:zhù # 貯 0x8cb0:shì # è²° 0x8cb1:bì # è²± 0x8cb2:zÄ« # è²² 0x8cb3:èr # è²³ 0x8cb4:guì # è²´ 0x8cb5:piÇŽn # è²µ 0x8cb6:biÇŽn # è²¶ 0x8cb7:mÇŽi # è²· 0x8cb8:dài # 貸 0x8cb9:shèng # è²¹ 0x8cba:kuàng # 貺 0x8cbb:fèi # è²» 0x8cbc:tiÄ“ # è²¼ 0x8cbd:yí # è²½ 0x8cbe:chí # è²¾ 0x8cbf:mào # 貿 0x8cc0:hè # è³€ 0x8cc1:bì,bÄ“n # è³� 0x8cc2:lù # 賂 0x8cc3:lìn # 賃 0x8cc4:huì # 賄 0x8cc5:gÄ�i # è³… 0x8cc6:pián # 賆 0x8cc7:zÄ« # 資 0x8cc8:jiÇŽ,gÇ”,jià # 賈 0x8cc9:xù # 賉 0x8cca:zéi # 賊 0x8ccb:jiÇŽo # 賋 0x8ccc:gÄ�i # 賌 0x8ccd:zÄ�ng # è³� 0x8cce:jiàn # 賎 0x8ccf:yÄ«ng # è³� 0x8cd0:jùn # è³� 0x8cd1:zhèn # 賑 0x8cd2:shÄ“ # è³’ 0x8cd3:bÄ«n # 賓 0x8cd4:bÄ«n # è³” 0x8cd5:qiú # 賕 0x8cd6:shÄ“ # è³– 0x8cd7:chuàn # è³— 0x8cd8:zÄ�ng # 賘 0x8cd9:zhÅ�u # è³™ 0x8cda:lài # 賚 0x8cdb:zàn # è³› 0x8cdc:cì # 賜 0x8cdd:chÄ“n # è³� 0x8cde:shÇŽng # 賞 0x8cdf:tiÇŽn # 賟 0x8ce0:péi # è³  0x8ce1:gÄ“ng # 賡 0x8ce2:xián # è³¢ 0x8ce3:mài # è³£ 0x8ce4:jiàn # 賤 0x8ce5:suì # è³¥ 0x8ce6:fù # 賦 0x8ce7:dÇŽn # è³§ 0x8ce8:cóng # 賨 0x8ce9:cóng # 賩 0x8cea:zhì # 質 0x8ceb:jÄ« # 賫 0x8cec:zhàng # 賬 0x8ced:dÇ” # è³­ 0x8cee:jìn # è³® 0x8cef:xiÅ�ng,mín # 賯 0x8cf0:chÇ”n # è³° 0x8cf1:yÇ”n # è³± 0x8cf2:bÇŽo # è³² 0x8cf3:zÄ�i # è³³ 0x8cf4:lài # è³´ 0x8cf5:fèng # è³µ 0x8cf6:càng # è³¶ 0x8cf7:jÄ« # è³· 0x8cf8:shèng # 賸 0x8cf9:ài # è³¹ 0x8cfa:zhuàn,zuàn # 賺 0x8cfb:fù # è³» 0x8cfc:gòu # è³¼ 0x8cfd:sài # è³½ 0x8cfe:zé # è³¾ 0x8cff:liáo # 賿 0x8d00:yì # è´€ 0x8d01:bài # è´� 0x8d02:chÄ›n # è´‚ 0x8d03:wàn,zhuàn # è´ƒ 0x8d04:zhì # è´„ 0x8d05:zhuì # è´… 0x8d06:biÄ�o # è´† 0x8d07:yÅ«n # è´‡ 0x8d08:zèng # è´ˆ 0x8d09:dàn # è´‰ 0x8d0a:zàn # è´Š 0x8d0b:yàn # è´‹ 0x8d0d:shàn # è´� 0x8d0e:wàn # è´Ž 0x8d0f:yíng # è´� 0x8d10:jìn # è´� 0x8d11:gàn # è´‘ 0x8d12:xián # è´’ 0x8d13:zÄ�ng # è´“ 0x8d14:bì # è´” 0x8d15:dú # è´• 0x8d16:shú # è´– 0x8d17:yàn # è´— 0x8d19:xuàn # è´™ 0x8d1a:lòng # è´š 0x8d1b:gàn # è´› 0x8d1c:zÄ�ng # è´œ 0x8d1d:bèi # è´� 0x8d1e:zhÄ“n # è´ž 0x8d1f:fù # è´Ÿ 0x8d20:yuán,yùn # è´  0x8d21:gòng # è´¡ 0x8d22:cái # è´¢ 0x8d23:zé,zhài # è´£ 0x8d24:xián # è´¤ 0x8d25:bài # è´¥ 0x8d26:zhàng # è´¦ 0x8d27:huò # è´§ 0x8d28:zhì # è´¨ 0x8d29:fàn # è´© 0x8d2a:tÄ�n # è´ª 0x8d2b:pín # è´« 0x8d2c:biÇŽn # è´¬ 0x8d2d:gòu # è´­ 0x8d2e:zhù # è´® 0x8d2f:guàn # è´¯ 0x8d30:èr # è´° 0x8d31:jiàn # è´± 0x8d32:bì,bÄ“n # è´² 0x8d33:shì # è´³ 0x8d34:tiÄ“ # è´´ 0x8d35:guì # è´µ 0x8d36:kuàng # è´¶ 0x8d37:dài # è´· 0x8d38:mào # è´¸ 0x8d39:fèi # è´¹ 0x8d3a:hè # è´º 0x8d3b:yí # è´» 0x8d3c:zéi # è´¼ 0x8d3d:zhì # è´½ 0x8d3e:gÇ”,jiÇŽ # è´¾ 0x8d3f:huì # è´¿ 0x8d40:zÄ« # èµ€ 0x8d41:lìn # èµ� 0x8d42:lù # 赂 0x8d43:zÄ�ng # 赃 0x8d44:zÄ« # 资 0x8d45:gÄ�i # èµ… 0x8d46:jìn # 赆 0x8d47:qiú # 赇 0x8d48:zhèn # 赈 0x8d49:lài # 赉 0x8d4a:shÄ“ # 赊 0x8d4b:fù # 赋 0x8d4c:dÇ” # 赌 0x8d4d:jÄ« # èµ� 0x8d4e:shú # 赎 0x8d4f:shÇŽng # èµ� 0x8d50:cì # èµ� 0x8d51:bì # 赑 0x8d52:zhÅ�u # èµ’ 0x8d53:gÄ“ng # 赓 0x8d54:péi # èµ” 0x8d55:dÇŽn # 赕 0x8d56:lài # èµ– 0x8d57:fèng # èµ— 0x8d58:zhuì # 赘 0x8d59:fù # èµ™ 0x8d5a:zhuàn # 赚 0x8d5b:sài # èµ› 0x8d5c:zé # 赜 0x8d5d:yàn # èµ� 0x8d5e:zàn # 赞 0x8d5f:yÅ«n # 赟 0x8d60:zèng # èµ  0x8d61:shàn # 赡 0x8d62:yíng # èµ¢ 0x8d63:gàn # èµ£ 0x8d64:chì # 赤 0x8d65:xÄ« # èµ¥ 0x8d66:shè # 赦 0x8d67:nÇŽn # èµ§ 0x8d68:tóng # 赨 0x8d69:xì # 赩 0x8d6a:chÄ“ng # 赪 0x8d6b:hè # 赫 0x8d6c:chÄ“ng # 赬 0x8d6d:zhÄ› # èµ­ 0x8d6e:xiá # èµ® 0x8d6f:táng # 赯 0x8d70:zÇ’u # èµ° 0x8d71:zÇ’u # èµ± 0x8d72:lì # èµ² 0x8d73:jiÅ« # èµ³ 0x8d74:fù # èµ´ 0x8d75:zhào # èµµ 0x8d76:gÇŽn # èµ¶ 0x8d77:qÇ� # èµ· 0x8d78:shàn # 赸 0x8d79:qióng # èµ¹ 0x8d7a:yÇ�n # 赺 0x8d7b:xiÇŽn # èµ» 0x8d7c:zÄ« # èµ¼ 0x8d7d:jué # èµ½ 0x8d7e:qÇ�n # èµ¾ 0x8d7f:chí # 赿 0x8d80:cÄ« # è¶€ 0x8d81:chèn # è¶� 0x8d82:chèn # è¶‚ 0x8d83:dié,tú # 趃 0x8d84:qiè,jÅ« # è¶„ 0x8d85:chÄ�o # è¶… 0x8d86:dÄ« # 趆 0x8d87:xì # 趇 0x8d88:zhÄ�n # 趈 0x8d89:jué # 趉 0x8d8a:yuè # è¶Š 0x8d8b:qÅ«,cù # è¶‹ 0x8d8c:jí,jié # è¶Œ 0x8d8d:qÅ« # è¶� 0x8d8e:chú # è¶Ž 0x8d8f:guÄ�,huó # è¶� 0x8d90:xuè # è¶� 0x8d91:zÄ« # è¶‘ 0x8d92:tiào # è¶’ 0x8d93:duÇ’ # è¶“ 0x8d94:liè # è¶” 0x8d95:gÇŽn # è¶• 0x8d96:suÅ� # è¶– 0x8d97:cù # è¶— 0x8d98:xí # 趘 0x8d99:zhào # è¶™ 0x8d9a:sù # è¶š 0x8d9b:yÇ�n # è¶› 0x8d9c:jú # è¶œ 0x8d9d:jiàn # è¶� 0x8d9e:què,qì,jí # è¶ž 0x8d9f:tàng,tÄ�ng # è¶Ÿ 0x8da0:chuÅ�,zhuó # è¶  0x8da1:cuÇ� # è¶¡ 0x8da2:lù # è¶¢ 0x8da3:qù,cù # è¶£ 0x8da4:dàng # 趤 0x8da5:qiÅ« # è¶¥ 0x8da6:zÄ« # 趦 0x8da7:tí # è¶§ 0x8da8:qÅ«,cù # 趨 0x8da9:chì # è¶© 0x8daa:huáng # 趪 0x8dab:qiáo # è¶« 0x8dac:qiÄ�o # 趬 0x8dad:jiào # è¶­ 0x8dae:zào # è¶® 0x8daf:tì,yuè # 趯 0x8db1:zÇŽn # è¶± 0x8db2:zÇŽn # è¶² 0x8db3:zú # è¶³ 0x8db4:pÄ� # è¶´ 0x8db5:bào,bÅ� # è¶µ 0x8db6:kuà,wù # è¶¶ 0x8db7:kÄ“ # è¶· 0x8db8:dÇ”n # 趸 0x8db9:jué,guì # è¶¹ 0x8dba:fÅ« # 趺 0x8dbb:chÄ›n # è¶» 0x8dbc:jiÇŽn # è¶¼ 0x8dbd:fÄ�ng,fàng,páng # è¶½ 0x8dbe:zhÇ� # è¶¾ 0x8dbf:tÄ� # è¶¿ 0x8dc0:yuè # è·€ 0x8dc1:bà,páo # è·� 0x8dc2:qí,qÇ� # è·‚ 0x8dc3:yuè # è·ƒ 0x8dc4:qiÄ�ng,qiàng # è·„ 0x8dc5:tuò # è·… 0x8dc6:tái # è·† 0x8dc7:yì # è·‡ 0x8dc8:jiàn,chén # è·ˆ 0x8dc9:líng # è·‰ 0x8dca:mèi # è·Š 0x8dcb:bá # è·‹ 0x8dcc:diÄ“ # è·Œ 0x8dcd:kÅ« # è·� 0x8dce:tuó # è·Ž 0x8dcf:jiÄ� # è·� 0x8dd0:cÄ«,cÇ� # è·� 0x8dd1:pÇŽo,páo # è·‘ 0x8dd2:qiÇŽ # è·’ 0x8dd3:zhù # è·“ 0x8dd4:jÅ« # è·” 0x8dd5:diÇŽn,tiÄ“,dié # è·• 0x8dd6:zhí # è·– 0x8dd7:fÅ« # è·— 0x8dd8:pán,bàn # è·˜ 0x8dd9:jÅ«,jù,qiè # è·™ 0x8dda:shÄ�n # è·š 0x8ddb:bÇ’ # è·› 0x8ddc:ní # è·œ 0x8ddd:jù # è·� 0x8dde:lì,luò # è·ž 0x8ddf:gÄ“n # è·Ÿ 0x8de0:yí # è·  0x8de1:jì # è·¡ 0x8de2:dài,duò,duÅ�,chí # è·¢ 0x8de3:xiÇŽn # è·£ 0x8de4:jiÄ�o # è·¤ 0x8de5:duò # è·¥ 0x8de6:zhÅ« # è·¦ 0x8de7:quán # è·§ 0x8de8:kuà # è·¨ 0x8de9:zhuÇŽi # è·© 0x8dea:guì # è·ª 0x8deb:qióng # è·« 0x8dec:kuÇ� # è·¬ 0x8ded:xiáng # è·­ 0x8dee:dié # è·® 0x8def:lù # è·¯ 0x8df0:pián,bèng # è·° 0x8df1:zhì # è·± 0x8df2:jié # è·² 0x8df3:tiào,táo # è·³ 0x8df4:cÇŽi # è·´ 0x8df5:jiàn # è·µ 0x8df6:dá # è·¶ 0x8df7:qiÄ�o # è·· 0x8df8:bì # è·¸ 0x8df9:xiÄ�n # è·¹ 0x8dfa:duò # è·º 0x8dfb:jÄ« # è·» 0x8dfc:jú # è·¼ 0x8dfd:jì # è·½ 0x8dfe:shÅ«,chÅ�u # è·¾ 0x8dff:tú # è·¿ 0x8e00:chuò # 踀 0x8e01:jìng # è¸� 0x8e02:niè # 踂 0x8e03:xiÄ�o # 踃 0x8e04:bù # 踄 0x8e05:xué # 踅 0x8e06:cÅ«n # 踆 0x8e07:mÇ” # 踇 0x8e08:shÅ« # 踈 0x8e09:liáng,liàng # 踉 0x8e0a:yÇ’ng # 踊 0x8e0b:jiÇŽo # 踋 0x8e0c:chóu # 踌 0x8e0d:qiÄ�o # è¸� 0x8e0f:tà # è¸� 0x8e10:jiàn # è¸� 0x8e11:jÄ« # 踑 0x8e12:wÅ� # 踒 0x8e13:wÄ›i # 踓 0x8e14:chuÅ� # 踔 0x8e15:jié # 踕 0x8e16:jí # 踖 0x8e17:niè # 踗 0x8e18:jÅ« # 踘 0x8e19:niè # 踙 0x8e1a:lún # 踚 0x8e1b:lù # 踛 0x8e1c:lèng # 踜 0x8e1d:huái # è¸� 0x8e1e:jù # 踞 0x8e1f:chí # 踟 0x8e20:wÇŽn # 踠 0x8e21:quán # 踡 0x8e22:tÄ« # 踢 0x8e23:bó # 踣 0x8e24:zú # 踤 0x8e25:qiè # 踥 0x8e26:qÄ«,yÇ� # 踦 0x8e27:cù # 踧 0x8e28:zÅ�ng # 踨 0x8e29:cÇŽi # 踩 0x8e2a:zÅ�ng # 踪 0x8e2b:pèng # 踫 0x8e2c:zhì # 踬 0x8e2d:zhÄ“ng # 踭 0x8e2e:diÇŽn # 踮 0x8e2f:zhí # 踯 0x8e30:yú # 踰 0x8e31:duó # 踱 0x8e32:dùn # 踲 0x8e33:chuÇŽn # 踳 0x8e34:yÇ’ng # 踴 0x8e35:zhÇ’ng # 踵 0x8e36:dì # 踶 0x8e37:zhÄ› # 踷 0x8e38:chÄ›n # 踸 0x8e39:chuài # 踹 0x8e3a:jiàn # 踺 0x8e3b:guÄ� # 踻 0x8e3c:táng # 踼 0x8e3d:jÇ” # 踽 0x8e3e:fú # 踾 0x8e3f:cù # 踿 0x8e40:dié # è¹€ 0x8e41:pián # è¹� 0x8e42:róu # 蹂 0x8e43:nuò # 蹃 0x8e44:tí # 蹄 0x8e45:chÇŽ # è¹… 0x8e46:tuÇ� # 蹆 0x8e47:jiÇŽn # 蹇 0x8e48:dÇŽo # 蹈 0x8e49:cuÅ� # 蹉 0x8e4a:qÄ«,xÄ« # 蹊 0x8e4b:tà # 蹋 0x8e4c:qiÄ�ng # 蹌 0x8e4d:niÇŽn # è¹� 0x8e4e:diÄ�n # 蹎 0x8e4f:tí # è¹� 0x8e50:jí # è¹� 0x8e51:niè # 蹑 0x8e52:pán # è¹’ 0x8e53:liÅ« # 蹓 0x8e54:zàn # è¹” 0x8e55:bì # 蹕 0x8e56:chÅ�ng # è¹– 0x8e57:lù # è¹— 0x8e58:liáo # 蹘 0x8e59:cù # è¹™ 0x8e5a:tÄ�ng # 蹚 0x8e5b:dài # è¹› 0x8e5c:sù # 蹜 0x8e5d:xÇ� # è¹� 0x8e5e:kuÇ� # 蹞 0x8e5f:jì # 蹟 0x8e60:zhí # è¹  0x8e61:qiÄ�ng # 蹡 0x8e62:dí,zhí # è¹¢ 0x8e63:pán # è¹£ 0x8e64:zÅ�ng # 蹤 0x8e65:lián # è¹¥ 0x8e66:bèng # 蹦 0x8e67:zÄ�o # è¹§ 0x8e68:niÇŽn # 蹨 0x8e69:bié # 蹩 0x8e6a:tuí # 蹪 0x8e6b:jú # 蹫 0x8e6c:dÄ“ng # 蹬 0x8e6d:cèng # è¹­ 0x8e6e:xiÄ�n # è¹® 0x8e6f:fán # 蹯 0x8e70:chú # è¹° 0x8e71:zhÅ�ng # è¹± 0x8e72:dÅ«n,cún # è¹² 0x8e73:bÅ� # è¹³ 0x8e74:cù,jiu # è¹´ 0x8e75:cù # è¹µ 0x8e76:jué,juÄ› # è¹¶ 0x8e77:jué # è¹· 0x8e78:lìn # 蹸 0x8e79:tà # è¹¹ 0x8e7a:qiÄ�o # 蹺 0x8e7b:qiÄ�o,juÄ“,jiÇŽo # è¹» 0x8e7c:pÇ” # è¹¼ 0x8e7d:liÄ�o # è¹½ 0x8e7e:dÅ«n # è¹¾ 0x8e7f:cuÄ�n # 蹿 0x8e80:guàn # 躀 0x8e81:zào # èº� 0x8e82:tà # 躂 0x8e83:bì # 躃 0x8e84:bì # 躄 0x8e85:zhú # 躅 0x8e86:jù # 躆 0x8e87:chú # 躇 0x8e88:qiào # 躈 0x8e89:dÇ”n # 躉 0x8e8a:chóu # 躊 0x8e8b:jÄ« # 躋 0x8e8c:wÇ” # 躌 0x8e8d:yuè # èº� 0x8e8e:niÇŽn # 躎 0x8e8f:lìn # èº� 0x8e90:liè # èº� 0x8e91:zhí # 躑 0x8e92:lì,luò # 躒 0x8e93:zhì # 躓 0x8e94:chán # 躔 0x8e95:chú # 躕 0x8e96:duàn # 躖 0x8e97:wèi # 躗 0x8e98:lóng,lÇ’ng # 躘 0x8e99:lìn # 躙 0x8e9a:xiÄ�n # 躚 0x8e9b:wèi # 躛 0x8e9c:zuÄ�n # 躜 0x8e9d:lán # èº� 0x8e9e:xiè # 躞 0x8e9f:ráng # 躟 0x8ea0:sÇŽ,xiè # 躠 0x8ea1:niè # 躡 0x8ea2:tà # 躢 0x8ea3:qú # 躣 0x8ea4:jí # 躤 0x8ea5:cuÄ�n # 躥 0x8ea6:zuÄ�n # 躦 0x8ea7:xÇ� # 躧 0x8ea8:kuí # 躨 0x8ea9:jué # 躩 0x8eaa:lìn # 躪 0x8eab:shÄ“n # 身 0x8eac:gÅ�ng # 躬 0x8ead:dÄ�n # 躭 0x8eaf:qÅ« # 躯 0x8eb0:tÇ� # 躰 0x8eb1:duÇ’ # 躱 0x8eb2:duÇ’ # 躲 0x8eb3:gÅ�ng # 躳 0x8eb4:láng # 躴 0x8eb6:luÇ’ # 躶 0x8eb7:ÇŽi # 躷 0x8eb8:jÄ« # 躸 0x8eb9:jÅ« # 躹 0x8eba:tÇŽng # 躺 0x8ebd:yÇŽn # 躽 0x8ebf:kÄ�ng # 躿 0x8ec0:qÅ« # 軀 0x8ec1:lóu # è»� 0x8ec2:lào # 軂 0x8ec3:duÇ’ # 軃 0x8ec4:zhí # 軄 0x8ec6:tÇ� # 軆 0x8ec7:dào # 軇 0x8ec9:yù # 軉 0x8eca:chÄ“,jÅ« # 車 0x8ecb:yà,zhá,gá # 軋 0x8ecc:guÇ� # 軌 0x8ecd:jÅ«n # è»� 0x8ece:wèi # 軎 0x8ecf:yuè # è»� 0x8ed0:xìn,xiàn # è»� 0x8ed1:dài # 軑 0x8ed2:xuÄ�n # è»’ 0x8ed3:fàn,guÇ� # 軓 0x8ed4:rèn # è»” 0x8ed5:shÄ�n # 軕 0x8ed6:kuáng # è»– 0x8ed7:shÅ« # è»— 0x8ed8:tún # 軘 0x8ed9:chén # è»™ 0x8eda:dài # 軚 0x8edb:è # è»› 0x8edc:nà # 軜 0x8edd:qí # è»� 0x8ede:máo # 軞 0x8edf:ruÇŽn # 軟 0x8ee0:kuáng # è»  0x8ee1:qián # 軡 0x8ee2:zhuàn,zhuÇŽn # 転 0x8ee3:hÅ�ng # 軣 0x8ee4:hÅ« # 軤 0x8ee5:qú # 軥 0x8ee6:kuàng # 軦 0x8ee7:dÇ� # è»§ 0x8ee8:líng # 軨 0x8ee9:dài # 軩 0x8eea:Ä�o,ào # 軪 0x8eeb:zhÄ›n # 軫 0x8eec:fàn # 軬 0x8eed:kuÄ�ng # è»­ 0x8eee:yÇŽng # è»® 0x8eef:pÄ“ng # 軯 0x8ef0:bèi # è»° 0x8ef1:gÅ« # è»± 0x8ef2:gÅ« # 軲 0x8ef3:páo # 軳 0x8ef4:zhù # è»´ 0x8ef5:rÇ’ng # 軵 0x8ef6:è # è»¶ 0x8ef7:bá # è»· 0x8ef8:zhóu,zhòu # 軸 0x8ef9:zhÇ� # 軹 0x8efa:yáo # 軺 0x8efb:kÄ“,kÄ› # è»» 0x8efc:yì,dié # 軼 0x8efd:qÄ«ng # 軽 0x8efe:shì # 軾 0x8eff:píng # 軿 0x8f00:ér # è¼€ 0x8f01:gÇ’ng # è¼� 0x8f02:jú # 輂 0x8f03:jiào # 較 0x8f04:guÄ�ng # 輄 0x8f05:lù # è¼… 0x8f06:kÇŽi # 輆 0x8f07:quán # 輇 0x8f08:zhÅ�u # 輈 0x8f09:zài # 載 0x8f0a:zhì # 輊 0x8f0b:shÄ“ # 輋 0x8f0c:liàng # 輌 0x8f0d:yù # è¼� 0x8f0e:shÄ�o # 輎 0x8f0f:yóu # è¼� 0x8f10:wàn # è¼� 0x8f11:yÇ�n # 輑 0x8f12:zhé # è¼’ 0x8f13:wÇŽn # 輓 0x8f14:fÇ” # è¼” 0x8f15:qÄ«ng # 輕 0x8f16:zhÅ�u # è¼– 0x8f17:ní # è¼— 0x8f18:líng # 輘 0x8f19:zhé # è¼™ 0x8f1a:hàn,zhàn # 輚 0x8f1b:liàng # è¼› 0x8f1c:zÄ« # 輜 0x8f1d:huÄ« # è¼� 0x8f1e:wÇŽng # 輞 0x8f1f:chuò # 輟 0x8f20:guÇ’ # è¼  0x8f21:kÇŽn # 輡 0x8f22:yÇ� # è¼¢ 0x8f23:péng # è¼£ 0x8f24:qiàn # 輤 0x8f25:gÇ”n # è¼¥ 0x8f26:niÇŽn # 輦 0x8f27:píng # è¼§ 0x8f28:guÇŽn # 輨 0x8f29:bèi # 輩 0x8f2a:lún # 輪 0x8f2b:pái # 輫 0x8f2c:liáng # 輬 0x8f2d:ruÇŽn # è¼­ 0x8f2e:róu # è¼® 0x8f2f:jí # 輯 0x8f30:yáng # è¼° 0x8f31:xián # è¼± 0x8f32:chuán # è¼² 0x8f33:còu # è¼³ 0x8f34:chÅ«n # è¼´ 0x8f35:gé # è¼µ 0x8f36:yóu # è¼¶ 0x8f37:hÅ�ng # è¼· 0x8f38:shÅ« # 輸 0x8f39:fù # è¼¹ 0x8f3a:zÄ« # 輺 0x8f3b:fú # è¼» 0x8f3c:wÄ“n # è¼¼ 0x8f3d:fàn # è¼½ 0x8f3e:zhÇŽn # è¼¾ 0x8f3f:yú # 輿 0x8f40:wÄ“n # è½€ 0x8f41:tÄ�o # è½� 0x8f42:gÇ” # 轂 0x8f43:zhÄ“n # 轃 0x8f44:xiá # 轄 0x8f45:yuán # è½… 0x8f46:lù # 轆 0x8f47:jiÄ�o # 轇 0x8f48:cháo # 轈 0x8f49:zhuÇŽn # 轉 0x8f4a:wèi # 轊 0x8f4b:hÅ«n # 轋 0x8f4d:zhé # è½� 0x8f4e:jiào # 轎 0x8f4f:zhàn # è½� 0x8f50:bú # è½� 0x8f51:lÇŽo # 轑 0x8f52:fén # è½’ 0x8f53:fÄ�n # 轓 0x8f54:lín # è½” 0x8f55:gé # 轕 0x8f56:sè # è½– 0x8f57:kÇŽn # è½— 0x8f58:huàn # 轘 0x8f59:yÇ� # è½™ 0x8f5a:jí # 轚 0x8f5b:duì # è½› 0x8f5c:ér # 轜 0x8f5d:yú # è½� 0x8f5e:jiàn # 轞 0x8f5f:hÅ�ng # 轟 0x8f60:léi # è½  0x8f61:pèi # 轡 0x8f62:lì # è½¢ 0x8f63:lì # è½£ 0x8f64:lú # 轤 0x8f65:lìn # è½¥ 0x8f66:chÄ“,jÅ« # 车 0x8f67:yà,zhá,gá # è½§ 0x8f68:guÇ� # 轨 0x8f69:xuÄ�n # 轩 0x8f6a:dài # 轪 0x8f6b:rèn # 轫 0x8f6c:zhuÇŽn,zhuàn,zhuÇŽi # 转 0x8f6d:è # è½­ 0x8f6e:lún # è½® 0x8f6f:ruÇŽn # 软 0x8f70:hÅ�ng # è½° 0x8f71:gÅ« # è½± 0x8f72:kÄ“ # è½² 0x8f73:lú # è½³ 0x8f74:zhóu,zhòu # è½´ 0x8f75:zhÇ� # è½µ 0x8f76:yì # è½¶ 0x8f77:hÅ« # è½· 0x8f78:zhÄ›n # 轸 0x8f79:lì # è½¹ 0x8f7a:yáo # 轺 0x8f7b:qÄ«ng # è½» 0x8f7c:shì # è½¼ 0x8f7d:zÇŽi,zài # è½½ 0x8f7e:zhì # è½¾ 0x8f7f:jiào # 轿 0x8f80:zhÅ�u # è¾€ 0x8f81:quán # è¾� 0x8f82:lù # 辂 0x8f83:jiào # 较 0x8f84:zhé # 辄 0x8f85:fÇ” # è¾… 0x8f86:liàng # 辆 0x8f87:niÇŽn # 辇 0x8f88:bèi # 辈 0x8f89:huÄ« # 辉 0x8f8a:gÇ”n # 辊 0x8f8b:wÇŽng # 辋 0x8f8c:liáng # 辌 0x8f8d:chuò # è¾� 0x8f8e:zÄ« # 辎 0x8f8f:còu # è¾� 0x8f90:fú # è¾� 0x8f91:jí # 辑 0x8f92:wÄ“n # è¾’ 0x8f93:shÅ« # 输 0x8f94:pèi # è¾” 0x8f95:yuán # 辕 0x8f96:xiá # è¾– 0x8f97:zhÇŽn,niÇŽn # è¾— 0x8f98:lù # 辘 0x8f99:zhé # è¾™ 0x8f9a:lín # 辚 0x8f9b:xÄ«n # è¾› 0x8f9c:gÅ« # 辜 0x8f9d:cí # è¾� 0x8f9e:cí # 辞 0x8f9f:bì,pì # 辟 0x8fa0:zuì # è¾  0x8fa1:biàn # 辡 0x8fa2:là # è¾¢ 0x8fa3:là # è¾£ 0x8fa4:cí # 辤 0x8fa5:xuÄ“ # è¾¥ 0x8fa6:bàn # 辦 0x8fa7:biàn # è¾§ 0x8fa8:biàn # 辨 0x8fa9:biàn # 辩 0x8fab:biàn # 辫 0x8fac:bÄ�n # 辬 0x8fad:cí # è¾­ 0x8fae:biàn # è¾® 0x8faf:biàn # 辯 0x8fb0:chén # è¾° 0x8fb1:rÇ” # è¾± 0x8fb2:nóng # è¾² 0x8fb3:nóng # è¾³ 0x8fb4:zhÄ›n # è¾´ 0x8fb5:chuò # è¾µ 0x8fb6:chuò # è¾¶ 0x8fb8:réng # 辸 0x8fb9:biÄ�n # è¾¹ 0x8fba:dào,biÄ�n # 辺 0x8fbd:liáo # è¾½ 0x8fbe:dá # è¾¾ 0x8fbf:chÄ�n # 辿 0x8fc0:gÄ�n # è¿€ 0x8fc1:qiÄ�n # è¿� 0x8fc2:yÅ« # è¿‚ 0x8fc3:yÅ« # 迃 0x8fc4:qì # è¿„ 0x8fc5:xùn # è¿… 0x8fc6:yÇ�,yí # 迆 0x8fc7:guò,guo,guÅ� # 过 0x8fc8:mài # 迈 0x8fc9:qÄ« # 迉 0x8fca:zÄ� # 迊 0x8fcb:wàng,kuÄ�ng # è¿‹ 0x8fcd:zhÅ«n # è¿� 0x8fce:yíng # 迎 0x8fcf:dá # è¿� 0x8fd0:yùn # è¿� 0x8fd1:jìn # è¿‘ 0x8fd2:háng # è¿’ 0x8fd3:yà # è¿“ 0x8fd4:fÇŽn # è¿” 0x8fd5:wÇ” # è¿• 0x8fd6:dá # è¿– 0x8fd7:é # è¿— 0x8fd8:hái,huán # 还 0x8fd9:zhè,zhèi # è¿™ 0x8fdb:jìn # è¿› 0x8fdc:yuÇŽn,yuàn # 远 0x8fdd:wéi # è¿� 0x8fde:lián # 连 0x8fdf:chí # 迟 0x8fe0:chè # è¿  0x8fe1:chí # è¿¡ 0x8fe2:tiáo # è¿¢ 0x8fe3:zhì,lì # è¿£ 0x8fe4:yÇ�,yí # 迤 0x8fe5:jiÇ’ng # è¿¥ 0x8fe6:jiÄ� # 迦 0x8fe7:chén # è¿§ 0x8fe8:dài # 迨 0x8fe9:Ä›r # è¿© 0x8fea:dí # 迪 0x8feb:pò,pÇŽi # è¿« 0x8fec:zhù,wÇŽng # 迬 0x8fed:dié # è¿­ 0x8fee:zé # è¿® 0x8fef:táo # 迯 0x8ff0:shù # è¿° 0x8ff1:yÇ�,yí # 迱 0x8ff3:jìng # 迳 0x8ff4:huí # è¿´ 0x8ff5:dòng # 迵 0x8ff6:yòu # è¿¶ 0x8ff7:mí # è¿· 0x8ff8:bèng # 迸 0x8ff9:jì # 迹 0x8ffa:nÇŽi # 迺 0x8ffb:yí # è¿» 0x8ffc:jié # 迼 0x8ffd:zhuÄ«,duÄ« # 追 0x8ffe:liè # 迾 0x8fff:xùn # è¿¿ 0x9000:tuì # 退 0x9001:sòng # é€� 0x9002:shì # 适 0x9003:táo # 逃 0x9004:páng # 逄 0x9005:hòu # 逅 0x9006:nì # 逆 0x9007:dùn # 逇 0x9008:jiÇ’ng # 逈 0x9009:xuÇŽn # 选 0x900a:xùn # 逊 0x900b:bÅ« # 逋 0x900c:yÅ�u # 逌 0x900d:xiÄ�o # é€� 0x900e:qiú # 逎 0x900f:tòu # é€� 0x9010:zhú # é€� 0x9011:qiú # 逑 0x9012:dì # 递 0x9013:dì # 逓 0x9014:tú # 途 0x9015:jìng # 逕 0x9016:tì # 逖 0x9017:dòu # 逗 0x9018:yÇ� # 逘 0x9019:zhè # 這 0x901a:tÅ�ng # 通 0x901b:guàng # 逛 0x901c:wÇ” # 逜 0x901d:shì # é€� 0x901e:chÄ›ng # 逞 0x901f:sù # 速 0x9020:zào # 造 0x9021:qÅ«n # 逡 0x9022:féng # 逢 0x9023:lián # 連 0x9024:suò # 逤 0x9025:huí # 逥 0x9026:lÇ� # 逦 0x9028:lái # 逨 0x9029:bèn # 逩 0x902a:cuò # 逪 0x902b:zhú,jué # 逫 0x902c:bèng # 逬 0x902d:huàn # 逭 0x902e:dài # 逮 0x902f:lù # 逯 0x9030:yóu # 逰 0x9031:zhÅ�u # 週 0x9032:jìn # 進 0x9033:yù # 逳 0x9034:chuÅ� # 逴 0x9035:kuí # 逵 0x9036:wÄ“i # 逶 0x9037:tì # 逷 0x9038:yì # 逸 0x9039:dá # 逹 0x903a:yuÇŽn # 逺 0x903b:luó # 逻 0x903c:bÄ« # 逼 0x903d:nuò # 逽 0x903e:yú # 逾 0x903f:dàng # 逿 0x9040:suí # é�€ 0x9041:dùn # é�� 0x9042:suì # é�‚ 0x9043:yÇŽn # é�ƒ 0x9044:chuán # é�„ 0x9045:chí # é�… 0x9046:dì,tí # é�† 0x9047:yù # é�‡ 0x9048:shí # é�ˆ 0x9049:zhÄ“n # é�‰ 0x904a:yóu # é�Š 0x904b:yùn # é�‹ 0x904c:è # é�Œ 0x904d:biàn # é�� 0x904e:guò # é�Ž 0x904f:è # é�� 0x9050:xiá # é�� 0x9051:huáng # é�‘ 0x9052:qiú # é�’ 0x9053:dào # é�“ 0x9054:dá # é�” 0x9055:wéi # é�• 0x9057:yí,wèi # é�— 0x9058:gòu # é�˜ 0x9059:yáo # é�™ 0x905a:chòu # é�š 0x905b:liù # é�› 0x905c:xùn # é�œ 0x905d:tà # é�� 0x905e:dì # é�ž 0x905f:chí # é�Ÿ 0x9060:yuÇŽn # é�  0x9061:sù # é�¡ 0x9062:tà # é�¢ 0x9063:qiÇŽn # é�£ 0x9065:yáo # é�¥ 0x9066:guàn # é�¦ 0x9067:zhÄ�ng # é�§ 0x9068:áo # é�¨ 0x9069:shì # é�© 0x906a:cà # é�ª 0x906b:chì # é�« 0x906c:sù # é�¬ 0x906d:zÄ�o # é�­ 0x906e:zhÄ“ # é�® 0x906f:dùn # é�¯ 0x9070:dì # é�° 0x9071:lóu # é�± 0x9072:chí # é�² 0x9073:cuÅ� # é�³ 0x9074:lín # é�´ 0x9075:zÅ«n # é�µ 0x9076:rào # é�¶ 0x9077:qiÄ�n # é�· 0x9078:xuÇŽn # é�¸ 0x9079:yù # é�¹ 0x907a:yí,wèi,suí # é�º 0x907b:è # é�» 0x907c:liáo # é�¼ 0x907d:jù # é�½ 0x907e:shì # é�¾ 0x907f:bì # é�¿ 0x9080:yÄ�o # é‚€ 0x9081:mài # é‚� 0x9082:xiè # é‚‚ 0x9083:suì # 邃 0x9084:huán,hái # é‚„ 0x9085:zhÄ�n # é‚… 0x9086:téng # 邆 0x9087:Ä›r # 邇 0x9088:miÇŽo # 邈 0x9089:biÄ�n # 邉 0x908a:biÄ�n # 邊 0x908b:lÄ� # é‚‹ 0x908c:lí,chí # 邌 0x908d:yuán # é‚� 0x908e:yáo # 邎 0x908f:luó # é‚� 0x9090:lÇ� # é‚� 0x9091:yì # é‚‘ 0x9092:tíng # é‚’ 0x9093:dèng # é‚“ 0x9094:qÇ� # é‚” 0x9095:yÅ�ng # é‚• 0x9096:shÄ�n # é‚– 0x9097:hán # é‚— 0x9098:yú # 邘 0x9099:máng # é‚™ 0x909a:rú # 邚 0x909b:qióng # é‚› 0x909d:kuàng # é‚� 0x909e:fÅ« # 邞 0x909f:kàng,háng # 邟 0x90a0:bÄ«n # é‚  0x90a1:fÄ�ng # é‚¡ 0x90a2:xíng # é‚¢ 0x90a3:nà,nÇŽ,nèi,nÄ�,nè,nuó # é‚£ 0x90a5:shÄ›n # é‚¥ 0x90a6:bÄ�ng # 邦 0x90a7:yuán # é‚§ 0x90a8:cÅ«n # 邨 0x90a9:huÇ’ # é‚© 0x90aa:xié,yá,yé,yú,xú # 邪 0x90ab:bÄ�ng # é‚« 0x90ac:wÅ« # 邬 0x90ad:jù # é‚­ 0x90ae:yóu # é‚® 0x90af:hán # 邯 0x90b0:tái # é‚° 0x90b1:qiÅ« # 邱 0x90b2:bì # 邲 0x90b3:pÄ« # 邳 0x90b4:bÇ�ng # é‚´ 0x90b5:shào # 邵 0x90b6:bèi # é‚¶ 0x90b7:wÇŽ # é‚· 0x90b8:dÇ� # 邸 0x90b9:zÅ�u # 邹 0x90ba:yè # 邺 0x90bb:lín # é‚» 0x90bc:kuÄ�ng # 邼 0x90bd:guÄ« # 邽 0x90be:zhÅ« # 邾 0x90bf:shÄ« # é‚¿ 0x90c0:kÅ« # 郀 0x90c1:yù # éƒ� 0x90c2:gÄ�i,hái # 郂 0x90c3:hé # 郃 0x90c4:qiè,xì # 郄 0x90c5:zhì # 郅 0x90c6:jí # 郆 0x90c7:xún,huán # 郇 0x90c8:hòu # 郈 0x90c9:xíng # 郉 0x90ca:jiÄ�o # 郊 0x90cb:xí # 郋 0x90cc:guÄ« # 郌 0x90cd:nà # éƒ� 0x90ce:láng,làng # 郎 0x90cf:jiá # éƒ� 0x90d0:kuài # éƒ� 0x90d1:zhèng # 郑 0x90d3:yùn # 郓 0x90d4:yán # 郔 0x90d5:chéng # 郕 0x90d6:dòu # 郖 0x90d7:xÄ« # 郗 0x90d8:lÇš # 郘 0x90d9:fÇ” # 郙 0x90da:wú # 郚 0x90db:fú # 郛 0x90dc:gào # 郜 0x90dd:hÇŽo # éƒ� 0x90de:láng # 郞 0x90df:jiá # 郟 0x90e0:gÄ›ng # 郠 0x90e1:jùn # 郡 0x90e2:yÇ�ng # 郢 0x90e3:bó # 郣 0x90e4:xì # 郤 0x90e5:bèi # 郥 0x90e6:lì,zhí # 郦 0x90e7:yún # 郧 0x90e8:bù # 部 0x90e9:xiáo,ÇŽo # 郩 0x90ea:qÄ« # 郪 0x90eb:pí # 郫 0x90ec:qÄ«ng # 郬 0x90ed:guÅ� # 郭 0x90ef:tán # 郯 0x90f0:zÅ�u # 郰 0x90f1:píng # 郱 0x90f2:lái # 郲 0x90f3:ní # 郳 0x90f4:chÄ“n # 郴 0x90f5:yóu # 郵 0x90f6:bù # 郶 0x90f7:xiÄ�ng # 郷 0x90f8:dÄ�n # 郸 0x90f9:jú # 郹 0x90fa:yÅ�ng # 郺 0x90fb:qiÄ�o # 郻 0x90fc:yÄ« # 郼 0x90fd:dÅ�u,dÅ« # 都 0x90fe:yÇŽn # 郾 0x90ff:méi # 郿 0x9100:ruò # é„€ 0x9101:bèi # é„� 0x9102:è # é„‚ 0x9103:shÅ« # 鄃 0x9104:juàn # é„„ 0x9105:yÇ” # é„… 0x9106:yùn # 鄆 0x9107:hóu # 鄇 0x9108:kuí # 鄈 0x9109:xiÄ�ng # 鄉 0x910a:xiÄ�ng # 鄊 0x910b:sÅ�u # é„‹ 0x910c:táng # 鄌 0x910d:míng # é„� 0x910e:xÄ« # 鄎 0x910f:rÇ” # é„� 0x9110:chù # é„� 0x9111:zÄ« # é„‘ 0x9112:zÅ�u # é„’ 0x9113:yì # é„“ 0x9114:wÅ« # é„” 0x9115:xiÄ�ng # é„• 0x9116:yún # é„– 0x9117:hào # é„— 0x9118:yÅ�ng # 鄘 0x9119:bÇ� # é„™ 0x911a:mào # 鄚 0x911b:cháo # é„› 0x911c:fÅ« # 鄜 0x911d:liÇŽo # é„� 0x911e:yín # 鄞 0x911f:zhuÄ�n # 鄟 0x9120:hù # é„  0x9121:qiÄ�o # é„¡ 0x9122:yÄ�n # é„¢ 0x9123:zhÄ�ng # é„£ 0x9124:màn # 鄤 0x9125:qiÄ�o # é„¥ 0x9126:xÇ” # 鄦 0x9127:dèng # é„§ 0x9128:bì # 鄨 0x9129:xún # é„© 0x912a:bì # 鄪 0x912b:zÄ“ng # é„« 0x912c:wéi # 鄬 0x912d:zhèng # é„­ 0x912e:mào # é„® 0x912f:shàn # 鄯 0x9130:lín # é„° 0x9131:pó # 鄱 0x9132:dÄ�n # 鄲 0x9133:méng # 鄳 0x9134:yè # é„´ 0x9135:cào # 鄵 0x9136:kuài # é„¶ 0x9137:fÄ“ng # é„· 0x9138:méng # 鄸 0x9139:zÅ�u # 鄹 0x913a:kuàng # 鄺 0x913b:liÇŽn # é„» 0x913c:zàn # 鄼 0x913d:chán # 鄽 0x913e:yÅ�u # 鄾 0x913f:qí # é„¿ 0x9140:yàn # é…€ 0x9141:chán # é…� 0x9142:cuó,zàn # é…‚ 0x9143:líng # é…ƒ 0x9144:huÄ�n # é…„ 0x9145:xÄ« # é…… 0x9146:fÄ“ng # é…† 0x9147:cuó,zàn # é…‡ 0x9148:lì # é…ˆ 0x9149:yÇ’u # é…‰ 0x914a:dÄ«ng,dÇ�ng # é…Š 0x914b:qiú # é…‹ 0x914c:zhuó # é…Œ 0x914d:pèi # é…� 0x914e:zhòu # é…Ž 0x914f:yÇ� # é…� 0x9150:gÄ�n # é…� 0x9151:yú # é…‘ 0x9152:jiÇ” # é…’ 0x9153:yÇŽn # é…“ 0x9154:zuì # é…” 0x9155:máo # é…• 0x9156:dÄ�n # é…– 0x9157:xù # é…— 0x9158:dòu # é…˜ 0x9159:zhÄ“n # é…™ 0x915a:fÄ“n # é…š 0x915d:yùn # é…� 0x915e:tài # é…ž 0x915f:tiÄ�n # é…Ÿ 0x9160:qiÇŽ # é…  0x9161:tuó # é…¡ 0x9162:zuò,cù # é…¢ 0x9163:hÄ�n # é…£ 0x9164:gÅ« # é…¤ 0x9165:sÅ« # é…¥ 0x9166:pÅ�,fÄ� # é…¦ 0x9167:chóu # é…§ 0x9168:zài # é…¨ 0x9169:mÇ�ng # é…© 0x916a:lào # é…ª 0x916b:chuò # é…« 0x916c:chóu # é…¬ 0x916d:yòu # é…­ 0x916e:tóng # é…® 0x916f:zhÇ� # é…¯ 0x9170:xiÄ�n # é…° 0x9171:jiàng # é…± 0x9172:chéng # é…² 0x9173:yìn # é…³ 0x9174:tú # é…´ 0x9175:jiào # é…µ 0x9176:méi # é…¶ 0x9177:kù # é…· 0x9178:suÄ�n # é…¸ 0x9179:lèi # é…¹ 0x917a:pú # é…º 0x917b:zuì # é…» 0x917c:hÇŽi # é…¼ 0x917d:yàn # é…½ 0x917e:shÄ«,shÄ�i # é…¾ 0x917f:niàng # é…¿ 0x9180:wéi # 醀 0x9181:lù # é†� 0x9182:lÇŽn # 醂 0x9183:yÄ�n # 醃 0x9184:táo # 醄 0x9185:pÄ“i # 醅 0x9186:zhÇŽn # 醆 0x9187:chún # 醇 0x9188:tán,dàn # 醈 0x9189:zuì # 醉 0x918a:zhuì # 醊 0x918b:cù # 醋 0x918c:kÅ«n # 醌 0x918d:tí,tÇ� # é†� 0x918e:xián # 醎 0x918f:dÅ« # é†� 0x9190:hú # é†� 0x9191:xÇ” # 醑 0x9192:xÇ�ng # 醒 0x9193:tÇŽn # 醓 0x9194:qiú,chÅ�u # 醔 0x9195:chún # 醕 0x9196:yùn # 醖 0x9197:pÅ�,fÄ� # 醗 0x9198:kÄ“ # 醘 0x9199:sÅ�u # 醙 0x919a:mí # 醚 0x919b:quán # 醛 0x919c:chÇ’u # 醜 0x919d:cuÅ� # é†� 0x919e:yùn # 醞 0x919f:yòng # 醟 0x91a0:àng # 醠 0x91a1:zhà # 醡 0x91a2:hÇŽi # 醢 0x91a3:táng # 醣 0x91a4:jiàng # 醤 0x91a5:piÇŽo # 醥 0x91a6:chÇŽn,chÄ›n # 醦 0x91a7:yù # 醧 0x91a8:lí # 醨 0x91a9:zÄ�o # 醩 0x91aa:láo # 醪 0x91ab:yÄ« # 醫 0x91ac:jiàng # 醬 0x91ad:bú # 醭 0x91ae:jiào # 醮 0x91af:xÄ« # 醯 0x91b0:tán # 醰 0x91b1:pÅ�,fÄ� # 醱 0x91b2:nóng # 醲 0x91b3:yì,shì # 醳 0x91b4:lÇ� # 醴 0x91b5:jù # 醵 0x91b6:yàn,liÇŽn,xiÄ�n # 醶 0x91b7:yì # 醷 0x91b8:niàng # 醸 0x91b9:rú # 醹 0x91ba:xÅ«n # 醺 0x91bb:chóu # 醻 0x91bc:yàn # 醼 0x91bd:líng # 醽 0x91be:mí # 醾 0x91bf:mí # 醿 0x91c0:niàng,niáng # 釀 0x91c1:xìn # é‡� 0x91c2:jiào # 釂 0x91c3:shÄ« # 釃 0x91c4:mí # 釄 0x91c5:yàn # 釅 0x91c6:biàn # 釆 0x91c7:cÇŽi,cài # 采 0x91c8:shì # 釈 0x91c9:yòu # 釉 0x91ca:shì # 释 0x91cb:shì # 釋 0x91cc:lÇ� # 里 0x91cd:zhòng,chóng # é‡� 0x91ce:yÄ› # 野 0x91cf:liáng,liàng # é‡� 0x91d0:lí,xÇ�,xÄ« # é‡� 0x91d1:jÄ«n # 金 0x91d3:gá # 釓 0x91d4:yÇ� # 釔 0x91d5:liÇŽo,liào # 釕 0x91d6:dÄ�o # 釖 0x91d7:zhÄ�o # 釗 0x91d8:dÄ«ng,dìng # 釘 0x91d9:pÅ� # 釙 0x91da:qiú # 釚 0x91db:hé # 釛 0x91dc:fÇ” # 釜 0x91dd:zhÄ“n # é‡� 0x91de:zhí # 釞 0x91df:bÄ� # 釟 0x91e0:luàn # 釠 0x91e1:fÇ” # 釡 0x91e2:nÇŽi # 釢 0x91e3:diào # 釣 0x91e4:shÄ�n,shàn # 釤 0x91e5:qiÇŽo,jiÇŽo # 釥 0x91e6:kòu # 釦 0x91e7:chuàn # 釧 0x91e8:zÇ� # 釨 0x91e9:fán # 釩 0x91ea:huá,yú # 釪 0x91eb:huá,wÅ« # 釫 0x91ec:hàn # 釬 0x91ed:gÄ�ng # 釭 0x91ee:qí # 釮 0x91ef:máng # 釯 0x91f0:rì,rèn,jiàn # 釰 0x91f1:dì,dài # 釱 0x91f2:sì # 釲 0x91f3:xì # 釳 0x91f4:yì # 釴 0x91f5:chÄ�i # 釵 0x91f6:shÄ«,yí # 釶 0x91f7:tÇ” # 釷 0x91f8:xÄ« # 釸 0x91f9:nÇš # 釹 0x91fa:qiÄ�n # 釺 0x91fc:rì,rèn,jiàn # 釼 0x91fd:pÄ«,zhÄ�o # 釽 0x91fe:yé,yá # 釾 0x91ff:jÄ«n,yÇ�n,yín # 釿 0x9200:bÇŽ,pá # 鈀 0x9201:fÄ�ng # éˆ� 0x9202:chén # 鈂 0x9203:xíng # 鈃 0x9204:dÇ’u # 鈄 0x9205:yuè # 鈅 0x9206:qiÄ�n # 鈆 0x9207:fÅ« # 鈇 0x9208:bù # 鈈 0x9209:nà # 鈉 0x920a:xÄ«n # 鈊 0x920b:é # 鈋 0x920c:jué # 鈌 0x920d:dùn # éˆ� 0x920e:gÅ�u # 鈎 0x920f:yÇ�n # éˆ� 0x9210:qián # éˆ� 0x9211:bÇŽn # 鈑 0x9212:sà # 鈒 0x9213:rèn # 鈓 0x9214:chÄ�o # 鈔 0x9215:niÇ” # 鈕 0x9216:fÄ“n # 鈖 0x9217:yÇ”n # 鈗 0x9218:yÇ� # 鈘 0x9219:qín # 鈙 0x921a:pÄ« # 鈚 0x921b:guÅ� # 鈛 0x921c:hóng # 鈜 0x921d:yín # éˆ� 0x921e:jÅ«n # 鈞 0x921f:diào # 鈟 0x9220:yì # 鈠 0x9221:zhÅ�ng # 鈡 0x9222:xÇ� # 鈢 0x9223:gài # 鈣 0x9224:rì # 鈤 0x9225:huÇ’ # 鈥 0x9226:tài # 鈦 0x9227:kàng # 鈧 0x922c:duó # 鈬 0x922d:zÄ« # 鈭 0x922e:ní # 鈮 0x922f:tú # 鈯 0x9230:shì # 鈰 0x9231:mín # 鈱 0x9232:gÅ« # 鈲 0x9233:kÄ“ # 鈳 0x9234:líng # 鈴 0x9235:bÇ�ng # 鈵 0x9236:sì # 鈶 0x9237:gÇ” # 鈷 0x9238:bó # 鈸 0x9239:pí # 鈹 0x923a:yù # 鈺 0x923b:sì # 鈻 0x923c:zuó # 鈼 0x923d:bÅ« # 鈽 0x923e:yóu # 鈾 0x923f:diàn # 鈿 0x9240:jiÇŽ # 鉀 0x9241:zhÄ“n # é‰� 0x9242:shÇ� # 鉂 0x9243:shì # 鉃 0x9244:tiÄ› # 鉄 0x9245:jù # 鉅 0x9246:zuÄ�n # 鉆 0x9247:shÄ« # 鉇 0x9248:tÄ�,tuó # 鉈 0x9249:xuàn # 鉉 0x924a:zhÄ�o # 鉊 0x924b:bào,páo # 鉋 0x924c:hé # 鉌 0x924d:bì # é‰� 0x924e:shÄ“ng # 鉎 0x924f:chú # é‰� 0x9250:shí # é‰� 0x9251:bó # 鉑 0x9252:zhù # 鉒 0x9253:chì # 鉓 0x9254:zÄ� # 鉔 0x9255:pÇ’ # 鉕 0x9256:tóng # 鉖 0x9257:qián # 鉗 0x9258:fú # 鉘 0x9259:zhÇŽi # 鉙 0x925a:mÇŽo # 鉚 0x925b:qiÄ�n # 鉛 0x925c:fú # 鉜 0x925d:lì # é‰� 0x925e:yuè # 鉞 0x925f:pÄ« # 鉟 0x9260:yÄ�ng # 鉠 0x9261:bàn # 鉡 0x9262:bÅ� # 鉢 0x9263:jié # 鉣 0x9264:gÅ�u # 鉤 0x9265:shù # 鉥 0x9266:zhÄ“ng # 鉦 0x9267:mÇ” # 鉧 0x9268:xÇ� # 鉨 0x9269:xÇ� # 鉩 0x926a:dì # 鉪 0x926b:jiÄ� # 鉫 0x926c:mù # 鉬 0x926d:tÇŽn # 鉭 0x926e:shén # 鉮 0x926f:yÇ� # 鉯 0x9270:sÄ« # 鉰 0x9271:kuàng # 鉱 0x9272:kÇŽ # 鉲 0x9273:bÄ›i # 鉳 0x9274:jiàn # 鉴 0x9275:tóng # 鉵 0x9276:xíng # 鉶 0x9277:hóng # 鉷 0x9278:jiÇŽo # 鉸 0x9279:chÇ� # 鉹 0x927a:Ä›r # 鉺 0x927b:gè # 鉻 0x927c:bÇ�ng,píng # 鉼 0x927d:shì # 鉽 0x927e:máo # 鉾 0x927f:hÄ�,kÄ“ # 鉿 0x9280:yín # 銀 0x9281:jÅ«n # éŠ� 0x9282:zhÅ�u # 銂 0x9283:chòng # 銃 0x9284:xiÇŽng,jiÅ�ng # 銄 0x9285:tóng # 銅 0x9286:mò # 銆 0x9287:lèi # 銇 0x9288:jÄ« # 銈 0x9289:yù,sì # 銉 0x928a:xù,huì # 銊 0x928b:rén,rÄ›n # 銋 0x928c:zùn # 銌 0x928d:zhì # éŠ� 0x928e:qióng # 銎 0x928f:shàn,shuò # éŠ� 0x9290:chì,lì # éŠ� 0x9291:xiÇŽn,xÇ� # 銑 0x9292:xíng # 銒 0x9293:quán # 銓 0x9294:pÄ« # 銔 0x9295:tiÄ› # 銕 0x9296:zhÅ« # 銖 0x9297:hóu,xiàng # 銗 0x9298:míng # 銘 0x9299:kuÇŽ # 銙 0x929a:diào,tiáo,yáo # 銚 0x929b:xiÄ�n,kuò,tiÇŽn,guÄ� # 銛 0x929c:xián # 銜 0x929d:xiÅ« # éŠ� 0x929e:jÅ«n # 銞 0x929f:chÄ� # 銟 0x92a0:lÇŽo # 銠 0x92a1:jí # 銡 0x92a2:pÇ� # 銢 0x92a3:rú # 銣 0x92a4:mÇ� # 銤 0x92a5:yÄ« # 銥 0x92a6:yÄ«n # 銦 0x92a7:guÄ�ng # 銧 0x92a8:ÇŽn # 銨 0x92a9:diÅ« # 銩 0x92aa:yÇ’u # 銪 0x92ab:sè # 銫 0x92ac:kào # 銬 0x92ad:qián # 銭 0x92ae:luán # 銮 0x92b0:Ä�i # 銰 0x92b1:diào # 銱 0x92b2:hàn # 銲 0x92b3:ruì # 銳 0x92b4:shì,zhì # 銴 0x92b5:kÄ“ng # 銵 0x92b6:qiú # 銶 0x92b7:xiÄ�o # 銷 0x92b8:zhé,niè # 銸 0x92b9:xiù # 銹 0x92ba:zàng # 銺 0x92bb:tÄ« # 銻 0x92bc:cuò # 銼 0x92bd:xiÄ�n,kuò,tiÇŽn,guÄ� # 銽 0x92be:hòng,gÇ’ng # 銾 0x92bf:zhÅ�ng,yÅ�ng # 銿 0x92c0:tÅ�u,tù,dòu # é‹€ 0x92c1:lÇš # é‹� 0x92c2:méi,méng # é‹‚ 0x92c3:láng # 鋃 0x92c4:wàn,jiÇŽn # é‹„ 0x92c5:xÄ«n # é‹… 0x92c6:yún # 鋆 0x92c7:bèi # 鋇 0x92c8:wù # 鋈 0x92c9:sù # 鋉 0x92ca:yù # 鋊 0x92cb:chán # é‹‹ 0x92cc:tÇ�ng,dìng # 鋌 0x92cd:bó # é‹� 0x92ce:hàn # 鋎 0x92cf:jiá # é‹� 0x92d0:hóng # é‹� 0x92d1:juÄ�n,jiÄ�n,cuÄ�n # é‹‘ 0x92d2:fÄ“ng # é‹’ 0x92d3:chÄ�n # é‹“ 0x92d4:wÇŽn # é‹” 0x92d5:zhì # é‹• 0x92d6:sÄ«,tuó # é‹– 0x92d7:xuÄ�n,juÄ�n,juàn # é‹— 0x92d8:huá,wú,wÅ« # 鋘 0x92d9:wú,yÇ” # é‹™ 0x92da:tiáo # 鋚 0x92db:kuàng # é‹› 0x92dc:zhuó,chuò # 鋜 0x92dd:lüè # é‹� 0x92de:xíng,xìng,jÄ«ng # 鋞 0x92df:qÇ�n # 鋟 0x92e0:shèn # é‹  0x92e1:hán # é‹¡ 0x92e2:lüè # é‹¢ 0x92e3:yé # é‹£ 0x92e4:chú # 鋤 0x92e5:zèng # é‹¥ 0x92e6:jÅ«,jú # 鋦 0x92e7:xiàn # é‹§ 0x92e8:é # 鋨 0x92e9:máng # é‹© 0x92ea:pÅ«,pù # 鋪 0x92eb:lí # é‹« 0x92ec:pàn # 鋬 0x92ed:ruì # é‹­ 0x92ee:chéng # é‹® 0x92ef:gào # 鋯 0x92f0:lÇ� # é‹° 0x92f1:tè # 鋱 0x92f3:zhù # 鋳 0x92f5:tÅ« # 鋵 0x92f6:liÇ” # é‹¶ 0x92f7:zuì,niè # é‹· 0x92f8:jù,jÅ« # 鋸 0x92f9:chÇŽng # 鋹 0x92fa:yuÇŽn,yuÄ�n,wÇŽn,wÄ�n # 鋺 0x92fb:jiÄ�n,jiàn # é‹» 0x92fc:gÄ�ng,gàng # 鋼 0x92fd:diào # 鋽 0x92fe:táo # 鋾 0x92ff:shÇŽng # é‹¿ 0x9300:lún # 錀 0x9301:kè # éŒ� 0x9302:líng # 錂 0x9303:pÄ« # 錃 0x9304:lù # 錄 0x9305:lí # 錅 0x9306:qÄ«ng # 錆 0x9307:péi # 錇 0x9308:juÇŽn # 錈 0x9309:mín # 錉 0x930a:zuì # 錊 0x930b:péng # 錋 0x930c:àn # 錌 0x930d:pÄ« # éŒ� 0x930e:xiàn # 錎 0x930f:yÄ� # éŒ� 0x9310:zhuÄ« # éŒ� 0x9311:lèi # 錑 0x9312:Ä� # 錒 0x9313:kÅ�ng # 錓 0x9314:tà # 錔 0x9315:kÅ«n # 錕 0x9316:dú # 錖 0x9317:nèi # 錗 0x9318:chuí # 錘 0x9319:zÄ« # 錙 0x931a:zhÄ“ng # 錚 0x931b:bÄ“n # 錛 0x931c:niè # 錜 0x931d:cóng # éŒ� 0x931e:chún,duì # 錞 0x931f:tán # 錟 0x9320:dìng # 錠 0x9321:qí # 錡 0x9322:qián # 錢 0x9323:zhuì # 錣 0x9324:jÄ« # 錤 0x9325:yù # 錥 0x9326:jÇ�n # 錦 0x9327:guÇŽn # 錧 0x9328:máo # 錨 0x9329:chÄ�ng # 錩 0x932a:tiÇŽn # 錪 0x932b:xÄ« # 錫 0x932c:liàn # 錬 0x932d:diÄ�o # 錭 0x932e:gù # 錮 0x932f:cuò # 錯 0x9330:shù # 錰 0x9331:zhÄ“n # 錱 0x9332:lù # 録 0x9333:mÄ›ng # 錳 0x9334:lù # 錴 0x9335:huÄ� # 錵 0x9336:biÇŽo # 錶 0x9337:gá # 錷 0x9338:lái # 錸 0x9339:kÄ›n # 錹 0x933c:nài # 錼 0x933d:wàn # 錽 0x933e:zàn # 錾 0x9340:dé # é�€ 0x9341:xiÄ�n # é�� 0x9343:huò # é�ƒ 0x9344:liàng # é�„ 0x9346:mén # é�† 0x9347:kÇŽi # é�‡ 0x9348:yÄ�ng # é�ˆ 0x9349:chí # é�‰ 0x934a:liàn # é�Š 0x934b:guÅ� # é�‹ 0x934c:xiÇŽn # é�Œ 0x934d:dù # é�� 0x934e:tú # é�Ž 0x934f:wéi # é�� 0x9350:zÅ�ng # é�� 0x9351:fù # é�‘ 0x9352:róu # é�’ 0x9353:jí # é�“ 0x9354:è # é�” 0x9355:jÅ«n # é�• 0x9356:chÄ›n # é�– 0x9357:tí # é�— 0x9358:zhá # é�˜ 0x9359:hù # é�™ 0x935a:yáng # é�š 0x935b:duàn # é�› 0x935c:xiá # é�œ 0x935d:yú # é�� 0x935e:kÄ“ng # é�ž 0x935f:shÄ“ng # é�Ÿ 0x9360:huáng # é�  0x9361:wÄ›i # é�¡ 0x9362:fù # é�¢ 0x9363:zhÄ�o # é�£ 0x9364:chÄ� # é�¤ 0x9365:qiè # é�¥ 0x9366:shÄ« # é�¦ 0x9367:hÅ�ng # é�§ 0x9368:kuí # é�¨ 0x9369:nuò # é�© 0x936a:móu # é�ª 0x936b:qiÄ�o # é�« 0x936c:qiÄ�o # é�¬ 0x936d:hóu # é�­ 0x936e:tÅ�u # é�® 0x936f:cÅ�ng # é�¯ 0x9370:huán # é�° 0x9371:yè # é�± 0x9372:mín # é�² 0x9373:jiàn # é�³ 0x9374:duÄ�n # é�´ 0x9375:jiàn # é�µ 0x9376:sÄ« # é�¶ 0x9377:kuí # é�· 0x9378:hú # é�¸ 0x9379:xuÄ�n # é�¹ 0x937a:zhÄ› # é�º 0x937b:jié # é�» 0x937c:zhÄ“n # é�¼ 0x937d:biÄ�n # é�½ 0x937e:zhÅ�ng # é�¾ 0x937f:zÄ« # é�¿ 0x9380:xiÅ« # 鎀 0x9381:yé # éŽ� 0x9382:mÄ›i # 鎂 0x9383:pài # 鎃 0x9384:Ä�i # 鎄 0x9385:jiè # 鎅 0x9387:méi # 鎇 0x9388:cuÅ�,chÄ� # 鎈 0x9389:dÄ�,tà # 鎉 0x938a:bàng # 鎊 0x938b:xiá # 鎋 0x938c:lián # 鎌 0x938d:suÇ’,sè # éŽ� 0x938e:kài # 鎎 0x938f:liú # éŽ� 0x9390:yáo,zú # éŽ� 0x9391:yè,tà,gé # 鎑 0x9392:nòu # 鎒 0x9393:wÄ“ng # 鎓 0x9394:róng # 鎔 0x9395:táng # 鎕 0x9396:suÇ’ # 鎖 0x9397:qiÄ�ng,chÄ“ng # 鎗 0x9398:gé,lì # 鎘 0x9399:shuò # 鎙 0x939a:chuí # 鎚 0x939b:bó # 鎛 0x939c:pán # 鎜 0x939d:dÄ� # éŽ� 0x939e:bÄ«,bì,pÄ« # 鎞 0x939f:sÇŽng # 鎟 0x93a0:gÄ�ng # 鎠 0x93a1:zÄ« # 鎡 0x93a2:wÅ« # 鎢 0x93a3:yíng # 鎣 0x93a4:huàng # 鎤 0x93a5:tiáo # 鎥 0x93a6:liú,liù # 鎦 0x93a7:kÇŽi # 鎧 0x93a8:sÇ”n # 鎨 0x93a9:shÄ� # 鎩 0x93aa:sÅ�u # 鎪 0x93ab:wàn,jiÇŽn # 鎫 0x93ac:gÇŽo,hào # 鎬 0x93ad:zhèn # 鎭 0x93ae:zhèn # 鎮 0x93af:láng # 鎯 0x93b0:yì # 鎰 0x93b1:yuán # 鎱 0x93b2:tÇŽng # 鎲 0x93b3:niè # 鎳 0x93b4:xí # 鎴 0x93b5:jiÄ� # 鎵 0x93b6:gÄ“ # 鎶 0x93b7:mÇŽ # 鎷 0x93b8:juÄ�n # 鎸 0x93bb:suÇ’ # 鎻 0x93bf:ná # 鎿 0x93c0:lÇ” # é�€ 0x93c1:suÇ’ # é�� 0x93c2:Å�u # é�‚ 0x93c3:zú,chuò # é�ƒ 0x93c4:tuán # é�„ 0x93c5:xiÅ«,xiù # é�… 0x93c6:guàn # é�† 0x93c7:xuàn # é�‡ 0x93c8:liàn # é�ˆ 0x93c9:shòu,sÅ�u # é�‰ 0x93ca:ào # é�Š 0x93cb:mÇŽn # é�‹ 0x93cc:mò # é�Œ 0x93cd:luó # é�� 0x93ce:bì # é�Ž 0x93cf:wèi # é�� 0x93d0:liú # é�� 0x93d1:dí,dÄ« # é�‘ 0x93d2:sÇŽn,qiÄ�o,càn # é�’ 0x93d3:cÅ�ng # é�“ 0x93d4:yí # é�” 0x93d5:lù,áo # é�• 0x93d6:áo # é�– 0x93d7:kÄ“ng # é�— 0x93d8:qiÄ�ng # é�˜ 0x93d9:cuÄ« # é�™ 0x93da:qÄ« # é�š 0x93db:shÇŽng # é�› 0x93dc:tÄ�ng,táng # é�œ 0x93dd:màn # é�� 0x93de:yÅ�ng # é�ž 0x93df:chÇŽn # é�Ÿ 0x93e0:fÄ“ng # é�  0x93e1:jìng # é�¡ 0x93e2:biÄ�o # é�¢ 0x93e3:shù # é�£ 0x93e4:lòu # é�¤ 0x93e5:xiù # é�¥ 0x93e6:cÅ�ng # é�¦ 0x93e7:lóng # é�§ 0x93e8:zàn # é�¨ 0x93e9:jiàn,zàn # é�© 0x93ea:cáo # é�ª 0x93eb:lí # é�« 0x93ec:xià # é�¬ 0x93ed:xÄ« # é�­ 0x93ee:kÄ�ng # é�® 0x93f0:bèng # é�° 0x93f3:zhÄ“ng # é�³ 0x93f4:lù # é�´ 0x93f5:huá # é�µ 0x93f6:jí # é�¶ 0x93f7:pú # é�· 0x93f8:huì,suì,ruì # é�¸ 0x93f9:qiÇŽng,qiÄ�ng # é�¹ 0x93fa:pÅ� # é�º 0x93fb:lín # é�» 0x93fc:sè # é�¼ 0x93fd:xiù # é�½ 0x93fe:sÇŽn,xiàn,sà # é�¾ 0x93ff:chÄ“ng # é�¿ 0x9400:guì,kuì # é�€ 0x9401:sÄ« # é�� 0x9402:liú # é�‚ 0x9403:náo # é�ƒ 0x9404:huáng # é�„ 0x9405:piÄ› # é�… 0x9406:suì # é�† 0x9407:fán # é�‡ 0x9408:qiáo # é�ˆ 0x9409:quÄ�n # é�‰ 0x940a:xÄ« # é�Š 0x940b:tàng # é�‹ 0x940c:xiàng # é�Œ 0x940d:jué # é�� 0x940e:jiÄ�o # é�Ž 0x940f:zÅ«n # é�� 0x9410:liào # é�� 0x9411:qì # é�‘ 0x9412:láo # é�’ 0x9413:duÄ« # é�“ 0x9414:xín # é�” 0x9415:zÄ�n # é�• 0x9416:jÄ« # é�– 0x9417:jiÇŽn # é�— 0x9418:zhÅ�ng # é�˜ 0x9419:dèng # é�™ 0x941a:yÄ� # é�š 0x941b:yÇ�ng # é�› 0x941c:duÄ« # é�œ 0x941d:jué # é�� 0x941e:nòu # é�ž 0x941f:zÄ�n # é�Ÿ 0x9420:pÇ” # é�  0x9421:tiÄ› # é�¡ 0x9424:dÇ�ng # é�¤ 0x9425:shàn # é�¥ 0x9426:kÄ�i # é�¦ 0x9427:jiÇŽn # é�§ 0x9428:fèi # é�¨ 0x9429:suì # é�© 0x942a:lÇ” # é�ª 0x942b:juÄ�n # é�« 0x942c:huì # é�¬ 0x942d:yù # é�­ 0x942e:lián # é�® 0x942f:zhuÅ� # é�¯ 0x9430:qiÄ�o # é�° 0x9431:jiàn # é�± 0x9432:zhuó # é�² 0x9433:léi # é�³ 0x9434:bì # é�´ 0x9435:tiÄ› # é�µ 0x9436:huán # é�¶ 0x9437:yè # é�· 0x9438:duó # é�¸ 0x9439:guò # é�¹ 0x943a:dÄ�ng,chÄ“ng # é�º 0x943b:jù # é�» 0x943c:fén # é�¼ 0x943d:dá # é�½ 0x943e:bèi # é�¾ 0x943f:yì # é�¿ 0x9440:ài # é‘€ 0x9441:zÅ�ng # é‘� 0x9442:xùn # é‘‚ 0x9443:diào # 鑃 0x9444:zhù # é‘„ 0x9445:héng # é‘… 0x9446:zhuì # 鑆 0x9447:jÄ« # 鑇 0x9448:niè # 鑈 0x9449:hé # 鑉 0x944a:huò # 鑊 0x944b:qÄ«ng # é‘‹ 0x944c:bÄ«n # 鑌 0x944d:yÄ«ng # é‘� 0x944e:guì # 鑎 0x944f:níng # é‘� 0x9450:xÅ« # é‘� 0x9451:jiàn # é‘‘ 0x9452:jiàn # é‘’ 0x9454:chÇŽ # é‘” 0x9455:zhì # é‘• 0x9456:miè # é‘– 0x9457:lí # é‘— 0x9458:léi # 鑘 0x9459:jÄ« # é‘™ 0x945a:zuÄ�n # 鑚 0x945b:kuàng # é‘› 0x945c:shÇŽng # 鑜 0x945d:péng # é‘� 0x945e:là # 鑞 0x945f:dú # 鑟 0x9460:shuò # é‘  0x9461:chuò # é‘¡ 0x9462:lÇœ # é‘¢ 0x9463:biÄ�o # é‘£ 0x9464:bào # 鑤 0x9465:lÇ” # é‘¥ 0x9468:lóng # 鑨 0x9469:è # é‘© 0x946a:lú # 鑪 0x946b:xÄ«n # é‘« 0x946c:jiàn # 鑬 0x946d:lán # é‘­ 0x946e:bó # é‘® 0x946f:jiÄ�n # 鑯 0x9470:yuè,yào # é‘° 0x9471:chán # 鑱 0x9472:xiÄ�ng # 鑲 0x9473:jiàn # 鑳 0x9474:xÄ« # é‘´ 0x9475:guàn # 鑵 0x9476:cáng # é‘¶ 0x9477:niè # é‘· 0x9478:lÄ›i # 鑸 0x9479:cuÄ�n # 鑹 0x947a:qú # 鑺 0x947b:pàn # é‘» 0x947c:luó # 鑼 0x947d:zuÄ�n # 鑽 0x947e:luán # 鑾 0x947f:záo # é‘¿ 0x9480:niè # é’€ 0x9481:jué # é’� 0x9482:tÇŽng # é’‚ 0x9483:zhú # é’ƒ 0x9484:làn # é’„ 0x9485:jÄ«n # é’… 0x9486:gá # é’† 0x9487:yÇ� # é’‡ 0x9488:zhÄ“n # é’ˆ 0x9489:dÄ«ng,dìng # é’‰ 0x948a:zhÄ�o # é’Š 0x948b:pÅ� # é’‹ 0x948c:liÇŽo,liào # é’Œ 0x948d:tÇ” # é’� 0x948e:qiÄ�n # é’Ž 0x948f:chuàn # é’� 0x9490:shÄ�n,shàn # é’� 0x9491:sà,xì # é’‘ 0x9492:fán # é’’ 0x9493:diào # é’“ 0x9494:mén # é’” 0x9495:nÇš # é’• 0x9496:yáng # é’– 0x9497:chÄ�i # é’— 0x9498:xíng # é’˜ 0x9499:gài # é’™ 0x949a:bù # é’š 0x949b:tài # é’› 0x949c:jù # é’œ 0x949d:dùn # é’� 0x949e:chÄ�o # é’ž 0x949f:zhÅ�ng # é’Ÿ 0x94a0:nà # é’  0x94a1:bèi # é’¡ 0x94a2:gÄ�ng,gàng # é’¢ 0x94a3:bÇŽn # é’£ 0x94a4:qián # é’¤ 0x94a5:yuè,yào # é’¥ 0x94a6:qÄ«n # é’¦ 0x94a7:jÅ«n # é’§ 0x94a8:wÅ« # é’¨ 0x94a9:gÅ�u # é’© 0x94aa:kàng # é’ª 0x94ab:fÄ�ng # é’« 0x94ac:huÇ’ # é’¬ 0x94ad:dÇ’u # é’­ 0x94ae:niÇ” # é’® 0x94af:bÇŽ,pá # é’¯ 0x94b0:yù # é’° 0x94b1:qián # é’± 0x94b2:zhÄ“ng,zhèng # é’² 0x94b3:qián # é’³ 0x94b4:gÇ” # é’´ 0x94b5:bÅ� # é’µ 0x94b6:kÄ“ # é’¶ 0x94b7:pÇ’ # é’· 0x94b8:bÅ« # é’¸ 0x94b9:bó # é’¹ 0x94ba:yuè # é’º 0x94bb:zuÄ�n,zuàn # é’» 0x94bc:mù # é’¼ 0x94bd:tÇŽn # é’½ 0x94be:jiÇŽ # é’¾ 0x94bf:diàn,tián # é’¿ 0x94c0:yóu # é“€ 0x94c1:tiÄ› # é“� 0x94c2:bó # é“‚ 0x94c3:líng # 铃 0x94c4:shuò # é“„ 0x94c5:qiÄ�n,yán # é“… 0x94c6:mÇŽo # 铆 0x94c7:bào,páo # 铇 0x94c8:shì # 铈 0x94c9:xuàn # 铉 0x94ca:tÄ�,tuó # 铊 0x94cb:bì # é“‹ 0x94cc:ní # 铌 0x94cd:pí,pÄ« # é“� 0x94ce:duó # 铎 0x94cf:xíng # é“� 0x94d0:kào # é“� 0x94d1:lÇŽo # é“‘ 0x94d2:Ä›r # é“’ 0x94d3:máng # é““ 0x94d4:yÄ�,yà # é“” 0x94d5:yÇ’u # é“• 0x94d6:chéng # é“– 0x94d7:jiá # é“— 0x94d8:yé # 铘 0x94d9:náo # é“™ 0x94da:zhì # 铚 0x94db:dÄ�ng,chÄ“ng # é“› 0x94dc:tóng # 铜 0x94dd:lÇš # é“� 0x94de:diào # 铞 0x94df:yÄ«n # 铟 0x94e0:kÇŽi # é“  0x94e1:zhá # é“¡ 0x94e2:zhÅ« # é“¢ 0x94e3:xiÇŽn,xÇ� # é“£ 0x94e4:tÇ�ng,dìng # 铤 0x94e5:diÅ« # é“¥ 0x94e6:xiÄ�n,kuò,tiÇŽn,guÄ� # 铦 0x94e7:huá # é“§ 0x94e8:quán # 铨 0x94e9:shÄ� # é“© 0x94ea:hÄ�,kÄ“ # 铪 0x94eb:diào,tiáo,yáo # é“« 0x94ec:gè # 铬 0x94ed:míng # é“­ 0x94ee:zhÄ“ng # é“® 0x94ef:sè # 铯 0x94f0:jiÇŽo # é“° 0x94f1:yÄ« # 铱 0x94f2:chÇŽn # 铲 0x94f3:chòng # 铳 0x94f4:tàng,tÄ�ng # é“´ 0x94f5:ÇŽn # 铵 0x94f6:yín # é“¶ 0x94f7:rú # é“· 0x94f8:zhù # 铸 0x94f9:láo # 铹 0x94fa:pÅ«,pù # 铺 0x94fb:wú,yÇ” # é“» 0x94fc:lái # 铼 0x94fd:tè # 铽 0x94fe:liàn # 链 0x94ff:kÄ“ng # é“¿ 0x9500:xiÄ�o # 销 0x9501:suÇ’ # é”� 0x9502:lÇ� # 锂 0x9503:zèng # 锃 0x9504:chú # 锄 0x9505:guÅ� # é”… 0x9506:gào # 锆 0x9507:é # 锇 0x9508:xiù # 锈 0x9509:cuò # 锉 0x950a:lüè # 锊 0x950b:fÄ“ng # 锋 0x950c:xÄ«n # 锌 0x950d:liÇ” # é”� 0x950e:kÄ�i # 锎 0x950f:jiÇŽn # é”� 0x9510:ruì # é”� 0x9511:tÄ« # 锑 0x9512:láng # é”’ 0x9513:qÇ�n # 锓 0x9514:jÅ« # é”” 0x9515:Ä� # 锕 0x9516:qiÄ�ng # é”– 0x9517:zhÄ› # é”— 0x9518:nuò # 锘 0x9519:cuò # é”™ 0x951a:máo # 锚 0x951b:bÄ“n # é”› 0x951c:qí # 锜 0x951d:dé # é”� 0x951e:kè # 锞 0x951f:kÅ«n # 锟 0x9520:chÄ�ng # é”  0x9521:xÄ« # 锡 0x9522:gù # 锢 0x9523:luó # 锣 0x9524:chuí # 锤 0x9525:zhuÄ« # 锥 0x9526:jÇ�n # 锦 0x9527:zhì # é”§ 0x9528:xiÄ�n # 锨 0x9529:juÇŽn # 锩 0x952a:huò # 锪 0x952b:péi # 锫 0x952c:tán # 锬 0x952d:dìng # é”­ 0x952e:jiàn # é”® 0x952f:jù # 锯 0x9530:mÄ›ng # é”° 0x9531:zÄ« # é”± 0x9532:qiè # 锲 0x9533:yÄ«ng # 锳 0x9534:kÇŽi # é”´ 0x9535:qiÄ�ng # 锵 0x9536:sÄ« # é”¶ 0x9537:è # é”· 0x9538:chÄ� # 锸 0x9539:qiÄ�o # 锹 0x953a:zhÅ�ng # 锺 0x953b:duàn # é”» 0x953c:sÅ�u # 锼 0x953d:huáng # 锽 0x953e:huán # 锾 0x953f:Ä�i # 锿 0x9540:dù # é•€ 0x9541:mÄ›i # é•� 0x9542:lòu # é•‚ 0x9543:zÄ« # 镃 0x9544:fèi # é•„ 0x9545:méi # é•… 0x9546:mò # 镆 0x9547:zhèn # 镇 0x9548:bó # 镈 0x9549:gé,lì # 镉 0x954a:niè # 镊 0x954b:tÇŽng # é•‹ 0x954c:juÄ�n # 镌 0x954d:niè # é•� 0x954e:ná # 镎 0x954f:liú # é•� 0x9550:gÇŽo,hào # é•� 0x9551:bàng # é•‘ 0x9552:yì # é•’ 0x9553:jiÄ� # é•“ 0x9554:bÄ«n # é•” 0x9555:róng # é•• 0x9556:biÄ�o # é•– 0x9557:tÄ�ng # é•— 0x9558:màn # 镘 0x9559:luó # é•™ 0x955a:bèng # 镚 0x955b:yÅ�ng # é•› 0x955c:jìng # 镜 0x955d:dí # é•� 0x955e:zú # 镞 0x955f:xuàn # 镟 0x9560:liú # é•  0x9561:xín,tán,chán # é•¡ 0x9562:jué # é•¢ 0x9563:liào # é•£ 0x9564:pú # 镤 0x9565:lÇ” # é•¥ 0x9566:duÄ« # 镦 0x9567:lán # é•§ 0x9568:pÇ” # 镨 0x9569:cuÄ�n # é•© 0x956a:qiÇŽng # 镪 0x956b:dèng # é•« 0x956c:huò # 镬 0x956d:léi # é•­ 0x956e:huán # é•® 0x956f:zhuó # 镯 0x9570:lián # é•° 0x9571:yì # 镱 0x9572:chÇŽ # 镲 0x9573:biÄ�o # 镳 0x9574:là # é•´ 0x9575:chán # 镵 0x9576:xiÄ�ng # é•¶ 0x9577:cháng,zhÇŽng # é•· 0x9578:cháng # 镸 0x9579:jiÇ” # 镹 0x957a:ÇŽo # 镺 0x957b:dié # é•» 0x957c:jié # 镼 0x957d:liÇŽo # 镽 0x957e:mí # 镾 0x957f:cháng,zhÇŽng # é•¿ 0x9580:mén # é–€ 0x9581:mà # é–� 0x9582:shuÄ�n # é–‚ 0x9583:shÇŽn # é–ƒ 0x9584:huò,shÇŽn # é–„ 0x9585:mén # é–… 0x9586:yán # é–† 0x9587:bì # é–‡ 0x9588:hàn,bì # é–ˆ 0x9589:bì # é–‰ 0x958b:kÄ�i # é–‹ 0x958c:kÄ�ng,kàng # é–Œ 0x958d:bÄ“ng # é–� 0x958e:hóng # é–Ž 0x958f:rùn # é–� 0x9590:sàn # é–� 0x9591:xián # é–‘ 0x9592:xián,jiÄ�n,jiàn # é–’ 0x9593:jiÄ�n,jiàn # é–“ 0x9594:mÇ�n # é–” 0x9595:xiÄ�,xiÇŽ # é–• 0x9597:dòu # é–— 0x9598:zhá # é–˜ 0x9599:nào # é–™ 0x959b:pÄ“ng,pèng # é–› 0x959c:xiÇŽ,kÄ› # é–œ 0x959d:líng # é–� 0x959e:biàn,guÄ�n # é–ž 0x959f:bì # é–Ÿ 0x95a0:rùn # é–  0x95a1:hé # é–¡ 0x95a2:guÄ�n # é–¢ 0x95a3:gé # é–£ 0x95a4:hé,gé # é–¤ 0x95a5:fá # é–¥ 0x95a6:chù # é–¦ 0x95a7:hòng,xiàng # é–§ 0x95a8:guÄ« # é–¨ 0x95a9:mÇ�n # é–© 0x95ab:kÇ”n # é–« 0x95ac:làng # é–¬ 0x95ad:lǘ # é–­ 0x95ae:tíng,tÇ�ng # é–® 0x95af:shà # é–¯ 0x95b0:jú # é–° 0x95b1:yuè # é–± 0x95b2:yuè # é–² 0x95b3:chÇŽn # é–³ 0x95b4:qù # é–´ 0x95b5:lìn # é–µ 0x95b6:chÄ�ng # é–¶ 0x95b7:shÄ� # é–· 0x95b8:kÇ”n # é–¸ 0x95b9:yÄ�n # é–¹ 0x95ba:wén # é–º 0x95bb:yán # é–» 0x95bc:è,yÄ�n # é–¼ 0x95bd:hÅ«n # é–½ 0x95be:yù # é–¾ 0x95bf:wén # é–¿ 0x95c0:hòng # é—€ 0x95c1:bÄ�o # é—� 0x95c2:hòng,juÇŽn,xiàng # é—‚ 0x95c3:qù # é—ƒ 0x95c4:yÇŽo # é—„ 0x95c5:wén # é—… 0x95c6:bÇŽn,pàn # é—† 0x95c7:àn # é—‡ 0x95c8:wéi # é—ˆ 0x95c9:yÄ«n # é—‰ 0x95ca:kuò # é—Š 0x95cb:què # é—‹ 0x95cc:lán # é—Œ 0x95cd:dÅ«,shé # é—� 0x95d0:tián # é—� 0x95d1:niè # é—‘ 0x95d2:tà # é—’ 0x95d3:kÇŽi # é—“ 0x95d4:hé # é—” 0x95d5:què,quÄ“ # é—• 0x95d6:chuÇŽng # é—– 0x95d7:guÄ�n # é—— 0x95d8:dòu # é—˜ 0x95d9:qÇ� # é—™ 0x95da:kuÄ« # é—š 0x95db:táng,tÄ�ng,chÄ�ng # é—› 0x95dc:guÄ�n # é—œ 0x95dd:piáo # é—� 0x95de:kàn,hÇŽn # é—ž 0x95df:xì,sè,tà # é—Ÿ 0x95e0:huì # é—  0x95e1:chÇŽn # é—¡ 0x95e2:pì # é—¢ 0x95e3:dÄ�ng,dàng # é—£ 0x95e4:huán # é—¤ 0x95e5:tà # é—¥ 0x95e6:wén # é—¦ 0x95e8:mén # é—¨ 0x95e9:shuÄ�n # é—© 0x95ea:shÇŽn # é—ª 0x95eb:yán # é—« 0x95ec:hàn,bì # é—¬ 0x95ed:bì # é—­ 0x95ee:wèn # é—® 0x95ef:chuÇŽng # é—¯ 0x95f0:rùn # é—° 0x95f1:wéi # é—± 0x95f2:xián # é—² 0x95f3:hóng # é—³ 0x95f4:jiÄ�n,jiàn # é—´ 0x95f5:mÇ�n # é—µ 0x95f6:kàng,kÄ�ng # é—¶ 0x95f7:mèn,mÄ“n # é—· 0x95f8:zhá # é—¸ 0x95f9:nào # é—¹ 0x95fa:guÄ« # é—º 0x95fb:wén # é—» 0x95fc:tà # é—¼ 0x95fd:mÇ�n # é—½ 0x95fe:lǘ # é—¾ 0x95ff:kÇŽi # é—¿ 0x9600:fá # 阀 0x9601:gé # é˜� 0x9602:hé # 阂 0x9603:kÇ”n # 阃 0x9604:jiÅ« # 阄 0x9605:yuè # 阅 0x9606:làng # 阆 0x9607:dÅ«,shé # 阇 0x9608:yù # 阈 0x9609:yÄ�n # 阉 0x960a:chÄ�ng # 阊 0x960b:xì # 阋 0x960c:wén # 阌 0x960d:hÅ«n # é˜� 0x960e:yán # 阎 0x960f:è,yÄ�n # é˜� 0x9610:chÇŽn # é˜� 0x9611:lán # 阑 0x9612:qù # 阒 0x9613:huì # 阓 0x9614:kuò # 阔 0x9615:què # 阕 0x9616:hé # 阖 0x9617:tián # 阗 0x9618:tà # 阘 0x9619:quÄ“,què # 阙 0x961a:kàn # 阚 0x961b:huán # 阛 0x961c:fù # 阜 0x961d:fÇ” # é˜� 0x961e:lè # 阞 0x961f:duì # 队 0x9620:xìn # 阠 0x9621:qiÄ�n # 阡 0x9622:wù # 阢 0x9623:yì # 阣 0x9624:tuó # 阤 0x9625:yÄ«n # 阥 0x9626:yáng # 阦 0x9627:dÇ’u # 阧 0x9628:è # 阨 0x9629:shÄ“ng # 阩 0x962a:bÇŽn # 阪 0x962b:péi # 阫 0x962c:kÄ“ng # 阬 0x962d:yÇ”n # 阭 0x962e:ruÇŽn # 阮 0x962f:zhÇ� # 阯 0x9630:pí # 阰 0x9631:jÇ�ng # 阱 0x9632:fáng # 防 0x9633:yáng # 阳 0x9634:yÄ«n # 阴 0x9635:zhèn # 阵 0x9636:jiÄ“ # 阶 0x9637:chÄ“ng # 阷 0x9638:è # 阸 0x9639:qÅ« # 阹 0x963a:dÇ� # 阺 0x963b:zÇ” # 阻 0x963c:zuò # 阼 0x963d:diàn,yán # 阽 0x963e:lín # 阾 0x963f:Ä�,Ä“ # 阿 0x9640:tuó # 陀 0x9641:tuó # é™� 0x9642:bÄ“i,pí,pÅ� # 陂 0x9643:bÇ�ng # 陃 0x9644:fù # 附 0x9645:jì # é™… 0x9646:lù,liù # 陆 0x9647:lÇ’ng # 陇 0x9648:chén # 陈 0x9649:xíng # 陉 0x964a:duò # 陊 0x964b:lòu # 陋 0x964c:mò # 陌 0x964d:jiàng,xiáng # é™� 0x964e:shÅ« # 陎 0x964f:duò # é™� 0x9650:xiàn # é™� 0x9651:ér # 陑 0x9652:guÇ� # é™’ 0x9653:yÅ« # 陓 0x9654:gÄ�i # é™” 0x9655:shÇŽn # 陕 0x9656:jùn # é™– 0x9657:qiào # é™— 0x9658:xíng # 陘 0x9659:chún # é™™ 0x965a:wÇ” # 陚 0x965b:bì # é™› 0x965c:xiá # 陜 0x965d:shÇŽn # é™� 0x965e:shÄ“ng # 陞 0x965f:zhì # 陟 0x9660:pÅ« # é™  0x9661:dÇ’u # 陡 0x9662:yuàn # 院 0x9663:zhèn # 陣 0x9664:chú # 除 0x9665:xiàn # 陥 0x9667:niè # é™§ 0x9668:yÇ”n # 陨 0x9669:xiÇŽn # 险 0x966a:péi # 陪 0x966b:fèi # 陫 0x966c:zÅ�u # 陬 0x966d:qí,yÄ« # é™­ 0x966e:duì # é™® 0x966f:lún # 陯 0x9670:yÄ«n # é™° 0x9671:jÅ« # é™± 0x9672:chuí # 陲 0x9673:chén # 陳 0x9674:pÄ« # é™´ 0x9675:líng # 陵 0x9676:táo,yáo # é™¶ 0x9677:xiàn # é™· 0x9678:lù # 陸 0x967a:xiÇŽn # 険 0x967b:yÄ«n # é™» 0x967c:zhÇ” # 陼 0x967d:yáng # 陽 0x967e:réng # 陾 0x967f:xiá # 陿 0x9680:chóng # 隀 0x9681:yàn,yÇŽn # éš� 0x9682:yÄ«n # éš‚ 0x9683:yú,yáo,shù # 隃 0x9684:dÄ« # éš„ 0x9685:yú # éš… 0x9686:lóng # 隆 0x9687:wÄ“i # 隇 0x9688:wÄ“i # 隈 0x9689:niè # 隉 0x968a:duì,zhuì # 隊 0x968b:suí,duò # éš‹ 0x968c:àn # 隌 0x968d:huáng # éš� 0x968e:jiÄ“ # 階 0x968f:suí # éš� 0x9690:yÇ�n,yìn # éš� 0x9691:qí,gÄ�i,ái # éš‘ 0x9692:yÇŽn # éš’ 0x9693:huÄ«,duò # éš“ 0x9694:gé # éš” 0x9695:yÇ”n # éš• 0x9696:wù # éš– 0x9697:wÄ›i,kuí # éš— 0x9698:ài # 隘 0x9699:xì # éš™ 0x969a:táng # éšš 0x969b:jì # éš› 0x969c:zhàng # éšœ 0x969d:dÇŽo # éš� 0x969e:áo # éšž 0x969f:xì # 隟 0x96a0:yÇ�n,yìn # éš  0x96a2:rÇŽo # 隢 0x96a3:lín # 隣 0x96a4:tuí # 隤 0x96a5:dèng # 隥 0x96a6:pí # 隦 0x96a7:suì # éš§ 0x96a8:suí # 隨 0x96a9:ào,yù # éš© 0x96aa:xiÇŽn # 險 0x96ab:fén # éš« 0x96ac:nÇ� # 隬 0x96ad:ér # éš­ 0x96ae:jÄ« # éš® 0x96af:dÇŽo # 隯 0x96b0:xí # éš° 0x96b1:yÇ�n,yìn # éš± 0x96b2:zhì # éš² 0x96b3:huÄ«,duò # éš³ 0x96b4:lÇ’ng # éš´ 0x96b5:xÄ« # éšµ 0x96b6:lì # éš¶ 0x96b7:lì # éš· 0x96b8:lì # 隸 0x96b9:zhuÄ«,cuÄ«,wéi # éš¹ 0x96ba:hú,hè # 隺 0x96bb:zhÄ« # éš» 0x96bc:sÇ”n # éš¼ 0x96bd:jùn,juàn # éš½ 0x96be:nán,nàn,nuó # éš¾ 0x96bf:yì # éš¿ 0x96c0:què,qiÄ�o,qiÇŽo # 雀 0x96c1:yàn # é›� 0x96c2:qín # 雂 0x96c3:jiÄ�n # 雃 0x96c4:xióng # 雄 0x96c5:yÇŽ # é›… 0x96c6:jí # 集 0x96c7:gù # 雇 0x96c8:huán # 雈 0x96c9:zhì # 雉 0x96ca:gòu # 雊 0x96cb:jùn,juàn # 雋 0x96cc:cí # 雌 0x96cd:yÅ�ng # é›� 0x96ce:jÅ« # 雎 0x96cf:chú # é›� 0x96d0:hÅ« # é›� 0x96d1:zá # 雑 0x96d2:luò # é›’ 0x96d3:yú # 雓 0x96d4:chóu # é›” 0x96d5:diÄ�o # 雕 0x96d6:suÄ« # é›– 0x96d7:hàn # é›— 0x96d8:huò # 雘 0x96d9:shuÄ�ng # é›™ 0x96da:guàn,huán # 雚 0x96db:chú # é›› 0x96dc:zá # 雜 0x96dd:yÅ�ng # é›� 0x96de:jÄ« # 雞 0x96df:guÄ«,xÄ« # 雟 0x96e0:chóu # é›  0x96e1:liù # 雡 0x96e2:lí # 離 0x96e3:nán,nàn,nuó # 難 0x96e4:yù,xué # 雤 0x96e5:zá # 雥 0x96e6:chóu # 雦 0x96e7:jí # é›§ 0x96e8:yÇ”,yù # 雨 0x96e9:yú # 雩 0x96ea:xuÄ› # 雪 0x96eb:nÇŽ # 雫 0x96ec:fÇ’u # 雬 0x96ed:sè,xí # é›­ 0x96ee:mù # é›® 0x96ef:wén # 雯 0x96f0:fÄ“n # é›° 0x96f1:pÄ�ng # é›± 0x96f2:yún # 雲 0x96f3:lì # 雳 0x96f4:chì # é›´ 0x96f5:yÄ�ng # 雵 0x96f6:líng # é›¶ 0x96f7:léi # é›· 0x96f8:án # 雸 0x96f9:báo # 雹 0x96fa:wù,méng # 雺 0x96fb:diàn # é›» 0x96fc:dàng # 雼 0x96fd:hÅ«,hù # 雽 0x96fe:wù # 雾 0x96ff:diào # 雿 0x9700:xÅ« # 需 0x9701:jì # éœ� 0x9702:mù # 霂 0x9703:chén # 霃 0x9704:xiÄ�o # 霄 0x9705:zhá # 霅 0x9706:tíng # 霆 0x9707:zhèn # 震 0x9708:pèi # 霈 0x9709:méi # 霉 0x970a:líng # 霊 0x970b:qÄ« # 霋 0x970c:zhÅ�u # 霌 0x970d:huò # éœ� 0x970e:shà # 霎 0x970f:fÄ“i # éœ� 0x9710:hóng # éœ� 0x9711:zhÄ�n # 霑 0x9712:yÄ«n # 霒 0x9713:ní # 霓 0x9714:shù # 霔 0x9715:tún # 霕 0x9716:lín # 霖 0x9718:dòng # 霘 0x9719:yÄ«ng # 霙 0x971a:wù # 霚 0x971b:líng # 霛 0x971c:shuÄ�ng # 霜 0x971d:líng # éœ� 0x971e:xiá # 霞 0x971f:hóng # 霟 0x9720:yÄ«n # 霠 0x9721:mài # 霡 0x9722:mài # 霢 0x9723:yÇ”n # 霣 0x9724:liù # 霤 0x9725:mèng # 霥 0x9726:bÄ«n # 霦 0x9727:wù # 霧 0x9728:wèi # 霨 0x9729:kuò # 霩 0x972a:yín # 霪 0x972b:xí # 霫 0x972c:yì # 霬 0x972d:ÇŽi # 霭 0x972e:dàn # 霮 0x972f:tèng # 霯 0x9730:xiàn # 霰 0x9731:yù # 霱 0x9732:lòu,lù # 露 0x9733:lóng # 霳 0x9734:dài # 霴 0x9735:jí # 霵 0x9736:pÄ�ng # 霶 0x9737:yáng # 霷 0x9738:bà # 霸 0x9739:pÄ« # 霹 0x973a:wÄ“i # 霺 0x973c:xì # 霼 0x973d:jì # 霽 0x973e:mái # 霾 0x973f:méng # 霿 0x9740:méng # é�€ 0x9741:léi # é�� 0x9742:lì # é�‚ 0x9743:huò # é�ƒ 0x9744:ÇŽi # é�„ 0x9745:fèi # é�… 0x9746:dài # é�† 0x9747:lóng # é�‡ 0x9748:lìng # é�ˆ 0x9749:ài # é�‰ 0x974a:fÄ“ng # é�Š 0x974b:lì # é�‹ 0x974c:bÇŽo # é�Œ 0x974e:hè # é�Ž 0x974f:hè # é�� 0x9750:bìng # é�� 0x9751:qÄ«ng # é�‘ 0x9752:qÄ«ng # é�’ 0x9753:jìng,liàng # é�“ 0x9754:tiÄ�n # é�” 0x9755:zhèng # é�• 0x9756:jìng # é�– 0x9757:chÄ“ng # é�— 0x9758:qìng # é�˜ 0x9759:jìng # é�™ 0x975a:jìng,liàng # é�š 0x975b:diàn # é�› 0x975c:jìng # é�œ 0x975d:tiÄ�n # é�� 0x975e:fÄ“i # é�ž 0x975f:fÄ“i # é�Ÿ 0x9760:kào # é�  0x9761:mí # é�¡ 0x9762:miàn # é�¢ 0x9763:miàn # é�£ 0x9764:pào # é�¤ 0x9765:yè # é�¥ 0x9766:miÇŽn # é�¦ 0x9767:huì # é�§ 0x9768:yè # é�¨ 0x9769:gé,jí # é�© 0x976a:dÄ«ng # é�ª 0x976b:chá # é�« 0x976c:jiÄ�n # é�¬ 0x976d:rèn # é�­ 0x976e:dí # é�® 0x976f:dù # é�¯ 0x9770:wù # é�° 0x9771:rèn # é�± 0x9772:qín # é�² 0x9773:jìn # é�³ 0x9774:xuÄ“ # é�´ 0x9775:niÇ” # é�µ 0x9776:bÇŽ # é�¶ 0x9777:yÇ�n # é�· 0x9778:sÇŽ # é�¸ 0x9779:nà # é�¹ 0x977a:mò # é�º 0x977b:zÇ” # é�» 0x977c:dá # é�¼ 0x977d:bàn # é�½ 0x977e:xiè # é�¾ 0x977f:yào # é�¿ 0x9780:táo # 鞀 0x9781:bèi # éž� 0x9782:jiÄ“ # éž‚ 0x9783:hóng # 鞃 0x9784:páo # éž„ 0x9785:yÄ�ng,yàng # éž… 0x9787:yÄ«n # 鞇 0x9788:gé,tà,sÇŽ # 鞈 0x9789:táo # 鞉 0x978a:jié,jí # 鞊 0x978b:xié # éž‹ 0x978c:Ä�n # 鞌 0x978d:Ä�n # éž� 0x978e:hén # 鞎 0x978f:gÇ’ng # éž� 0x9791:dá # éž‘ 0x9792:qiáo # éž’ 0x9793:tÄ«ng # éž“ 0x9794:mán,mèn # éž” 0x9795:biÄ�n,yìng # éž• 0x9796:suÄ« # éž– 0x9797:tiáo # éž— 0x9798:qiào,shÄ�o # 鞘 0x9799:xuÄ�n,juÄ�n # éž™ 0x979a:kòng # éžš 0x979b:bÄ›ng # éž› 0x979c:tà # éžœ 0x979d:shàng,zhÇŽng # éž� 0x979e:bÇ�ng,pí,bì,bÄ“i # éžž 0x979f:kuò # 鞟 0x97a0:jÅ« # éž  0x97a1:la # éž¡ 0x97a2:xiè,dié # 鞢 0x97a3:róu # 鞣 0x97a4:bÄ�ng # 鞤 0x97a5:Ä“ng # 鞥 0x97a6:qiÅ« # 鞦 0x97a7:qiÅ« # éž§ 0x97a8:hé # 鞨 0x97a9:qiào # éž© 0x97aa:mù,móu # 鞪 0x97ab:jÅ« # éž« 0x97ac:jiàn,jiÄ�n # 鞬 0x97ad:biÄ�n # éž­ 0x97ae:dÄ« # éž® 0x97af:jiÄ�n # 鞯 0x97b1:tÄ�o # éž± 0x97b2:gÅ�u # éž² 0x97b3:tà # éž³ 0x97b4:bèi # éž´ 0x97b5:xié # éžµ 0x97b6:pán # éž¶ 0x97b7:gé # éž· 0x97b8:bì,bÇ�ng # 鞸 0x97b9:kuò # éž¹ 0x97bb:lóu # éž» 0x97bc:guì # éž¼ 0x97bd:qiáo # éž½ 0x97be:xuÄ“ # éž¾ 0x97bf:jÄ« # éž¿ 0x97c0:jiÄ�n # 韀 0x97c1:jiÄ�ng # éŸ� 0x97c2:chàn # 韂 0x97c3:dá # 韃 0x97c4:huò # 韄 0x97c5:xiÇŽn # 韅 0x97c6:qiÄ�n # 韆 0x97c7:dú # 韇 0x97c8:wÄ� # 韈 0x97c9:jiÄ�n # 韉 0x97ca:lán # 韊 0x97cb:wéi # 韋 0x97cc:rèn # 韌 0x97cd:fú # éŸ� 0x97ce:mèi,wà # 韎 0x97cf:quàn # éŸ� 0x97d0:gé # éŸ� 0x97d1:wÄ›i # 韑 0x97d2:qiào # 韒 0x97d3:hán # 韓 0x97d4:chàng # 韔 0x97d6:rÇ’u # 韖 0x97d7:yùn # 韗 0x97d8:shè,xiè # 韘 0x97d9:wÄ›i # 韙 0x97da:gé # 韚 0x97db:bài # 韛 0x97dc:tÄ�o # 韜 0x97dd:gÅ�u # éŸ� 0x97de:yùn # 韞 0x97e0:bì # 韠 0x97e1:wÄ›i # 韡 0x97e2:suì # 韢 0x97e3:dú # 韣 0x97e4:wà # 韤 0x97e5:dú # 韥 0x97e6:wéi # 韦 0x97e7:rèn # 韧 0x97e8:fú # 韨 0x97e9:hán # 韩 0x97ea:wÄ›i # 韪 0x97eb:yùn,wÄ“n # 韫 0x97ec:tÄ�o # 韬 0x97ed:jiÇ” # 韭 0x97ee:jiÇ” # 韮 0x97ef:xiÄ�n # 韯 0x97f0:xiè # 韰 0x97f1:xiÄ�n # 韱 0x97f2:jÄ« # 韲 0x97f3:yÄ«n # 音 0x97f4:zá # 韴 0x97f5:yùn # 韵 0x97f6:sháo # 韶 0x97f7:lè # 韷 0x97f8:péng # 韸 0x97f9:huáng # 韹 0x97fa:yÄ«ng # 韺 0x97fb:yùn # 韻 0x97fc:péng # 韼 0x97fd:Ä�n # 韽 0x97fe:yÄ«n # 韾 0x97ff:xiÇŽng # 響 0x9800:hù # é € 0x9801:yè # é � 0x9802:dÇ�ng # é ‚ 0x9803:qÇ�ng # é ƒ 0x9804:qiú # é „ 0x9805:xiàng # é … 0x9806:shùn # é † 0x9807:hÄ�n # é ‡ 0x9808:xÅ« # é ˆ 0x9809:yí # é ‰ 0x980a:xÅ« # é Š 0x980b:Ä› # é ‹ 0x980c:sòng # é Œ 0x980d:kuÇ� # é � 0x980e:qí # é Ž 0x980f:háng # é � 0x9810:yù # é � 0x9811:wán # é ‘ 0x9812:bÄ�n # é ’ 0x9813:dùn # é “ 0x9814:dí # é ” 0x9815:dÄ�n # é • 0x9816:pàn # é – 0x9817:pÅ� # é — 0x9818:lÇ�ng # é ˜ 0x9819:chè # é ™ 0x981a:jÇ�ng # é š 0x981b:lèi # é › 0x981c:hé # é œ 0x981d:qiÄ�o # é � 0x981e:è # é ž 0x981f:é # é Ÿ 0x9820:wÄ›i # é   0x9821:jié # é ¡ 0x9822:kuò # é ¢ 0x9823:shÄ›n # é £ 0x9824:yí # é ¤ 0x9825:yí # é ¥ 0x9826:kÄ“ # é ¦ 0x9827:duÇ� # é § 0x9828:yÇ” # é ¨ 0x9829:pÄ«ng # é © 0x982a:lèi # é ª 0x982b:fÇ” # é « 0x982c:jiá # é ¬ 0x982d:tóu # é ­ 0x982e:huì # é ® 0x982f:kuí # é ¯ 0x9830:jiá # é ° 0x9831:luÅ� # é ± 0x9832:tÇ�ng # é ² 0x9833:chÄ“ng # é ³ 0x9834:yÇ�ng # é ´ 0x9835:jÅ«n # é µ 0x9836:hú # é ¶ 0x9837:hàn # é · 0x9838:jÇ�ng # é ¸ 0x9839:tuí # é ¹ 0x983a:tuí # é º 0x983b:bÄ«n,pín # é » 0x983c:lài # é ¼ 0x983d:tuí # é ½ 0x983e:zÄ« # é ¾ 0x983f:zÄ« # é ¿ 0x9840:chuí # é¡€ 0x9841:dìng # é¡� 0x9842:lài # é¡‚ 0x9843:tán # 顃 0x9844:hàn # é¡„ 0x9845:qiÄ�n # é¡… 0x9846:kÄ“ # 顆 0x9847:cuì # 顇 0x9848:jiÇ’ng # 顈 0x9849:qÄ«n # 顉 0x984a:yí # 顊 0x984b:sÄ�i # é¡‹ 0x984c:tí # 題 0x984d:é # é¡� 0x984e:è # 顎 0x984f:yán # é¡� 0x9850:wèn # é¡� 0x9851:kÇŽn # é¡‘ 0x9852:yóng # é¡’ 0x9853:zhuÄ�n # é¡“ 0x9854:yán # é¡” 0x9855:xiÇŽn # é¡• 0x9856:xìn # é¡– 0x9857:yÇ� # é¡— 0x9858:yuàn # 願 0x9859:sÇŽng # é¡™ 0x985a:diÄ�n # 顚 0x985b:diÄ�n # é¡› 0x985c:jiÇŽng # 顜 0x985d:kuÄ« # é¡� 0x985e:lèi # 類 0x985f:láo # 顟 0x9860:piÇŽo # é¡  0x9861:wài # é¡¡ 0x9862:mÄ�n # é¡¢ 0x9863:cù # é¡£ 0x9864:yáo # 顤 0x9865:hào # é¡¥ 0x9866:qiáo # 顦 0x9867:gù # é¡§ 0x9868:xùn # 顨 0x9869:yÇŽn # é¡© 0x986a:huì # 顪 0x986b:chàn,zhàn,shÄ�n # é¡« 0x986c:rú # 顬 0x986d:méng # é¡­ 0x986e:bÄ«n # é¡® 0x986f:xiÇŽn # 顯 0x9870:pín # é¡° 0x9871:lú # 顱 0x9872:lÇŽn # 顲 0x9873:niè # 顳 0x9874:quán # é¡´ 0x9875:yè # 页 0x9876:dÇ�ng # é¡¶ 0x9877:qÇ�ng # é¡· 0x9878:hÄ�n # 顸 0x9879:xiàng # 项 0x987a:shùn # 顺 0x987b:xÅ« # é¡» 0x987c:xÅ« # 顼 0x987d:wán # 顽 0x987e:gù # 顾 0x987f:dùn,dú # é¡¿ 0x9880:qí # 颀 0x9881:bÄ�n # é¢� 0x9882:sòng # 颂 0x9883:háng # 颃 0x9884:yù # 预 0x9885:lú # 颅 0x9886:lÇ�ng # 领 0x9887:pÅ� # 颇 0x9888:jÇ�ng,gÄ›ng # 颈 0x9889:jié,xié,jiá # 颉 0x988a:jiá # 颊 0x988b:tÇ�ng # 颋 0x988c:hé,gé # 颌 0x988d:yÇ�ng # é¢� 0x988e:jiÇ’ng # 颎 0x988f:kÄ“ # é¢� 0x9890:yí # é¢� 0x9891:pín,bÄ«n # 频 0x9892:huì # 颒 0x9893:tuí # 颓 0x9894:hàn # 颔 0x9895:yÇ�ng # 颕 0x9896:yÇ�ng # 颖 0x9897:kÄ“ # 颗 0x9898:tí # 题 0x9899:yóng # 颙 0x989a:è # 颚 0x989b:zhuÄ�n # 颛 0x989c:yán # 颜 0x989d:é # é¢� 0x989e:niè # 颞 0x989f:mÄ�n # 颟 0x98a0:diÄ�n # 颠 0x98a1:sÇŽng # 颡 0x98a2:hào # 颢 0x98a3:lèi # 颣 0x98a4:chàn,zhàn # 颤 0x98a5:rú # 颥 0x98a6:pín # 颦 0x98a7:quán # 颧 0x98a8:fÄ“ng,fÄ›ng # 風 0x98a9:biÄ�o,diÅ« # 颩 0x98ab:fú # 颫 0x98ac:xiÄ� # 颬 0x98ad:zhÇŽn # 颭 0x98ae:biÄ�o # 颮 0x98af:sà # 颯 0x98b0:bá,fú # 颰 0x98b1:tái # 颱 0x98b2:liè # 颲 0x98b3:guÄ� # 颳 0x98b4:xuàn # 颴 0x98b5:xiÄ�o # 颵 0x98b6:jù # 颶 0x98b7:biÄ�o # 颷 0x98b8:sÄ« # 颸 0x98b9:wÄ›i # 颹 0x98ba:yáng # 颺 0x98bb:yáo # 颻 0x98bc:sÅ�u # 颼 0x98bd:kÇŽi # 颽 0x98be:sÄ�o,sÅ�u # 颾 0x98bf:fÄ�n # 颿 0x98c0:liú # 飀 0x98c1:xí # é£� 0x98c2:liù,liáo # 飂 0x98c3:piÄ�o # 飃 0x98c4:piÄ�o # 飄 0x98c5:liú # 飅 0x98c6:biÄ�o # 飆 0x98c7:biÄ�o # 飇 0x98c8:biÄ�o # 飈 0x98c9:liáo # 飉 0x98cb:sè # 飋 0x98cc:fÄ“ng # 飌 0x98cd:xiÅ« # é£� 0x98ce:fÄ“ng,fÄ›ng # 风 0x98cf:yáng # é£� 0x98d0:zhÇŽn # é£� 0x98d1:biÄ�o # 飑 0x98d2:sà # 飒 0x98d3:jù # 飓 0x98d4:sÄ« # 飔 0x98d5:sÅ�u # 飕 0x98d6:yáo # 飖 0x98d7:liú # 飗 0x98d8:piÄ�o # 飘 0x98d9:biÄ�o # 飙 0x98da:biÄ�o # 飚 0x98db:fÄ“i # 飛 0x98dc:fÄ�n # 飜 0x98dd:fÄ“i # é£� 0x98de:fÄ“i # 飞 0x98df:shí,sì,yì # 食 0x98e0:shí # 飠 0x98e1:cÄ�n # 飡 0x98e2:jÄ« # 飢 0x98e3:dìng # 飣 0x98e4:sì # 飤 0x98e5:tuÅ� # 飥 0x98e6:zhÄ�n # 飦 0x98e7:sÅ«n # 飧 0x98e8:xiÇŽng # 飨 0x98e9:tún # 飩 0x98ea:rèn # 飪 0x98eb:yù # 飫 0x98ec:yÇŽng,juàn # 飬 0x98ed:chì # 飭 0x98ee:yÇ�n,yìn # 飮 0x98ef:fàn # 飯 0x98f0:fàn # 飰 0x98f1:sÅ«n # 飱 0x98f2:yÇ�n,yìn # 飲 0x98f3:zhù,tÇ’u # 飳 0x98f4:yí,sì # 飴 0x98f5:zuò,zé,zhÄ� # 飵 0x98f6:bì # 飶 0x98f7:jiÄ› # 飷 0x98f8:tÄ�o # 飸 0x98f9:bÇŽo # 飹 0x98fa:cí # 飺 0x98fb:tiè # 飻 0x98fc:sì # 飼 0x98fd:bÇŽo # 飽 0x98fe:shì # 飾 0x98ff:duò # 飿 0x9900:hài # 餀 0x9901:rèn # é¤� 0x9902:tiÇŽn # 餂 0x9903:jiÇŽo # 餃 0x9904:hé # 餄 0x9905:bÇ�ng # 餅 0x9906:yáo # 餆 0x9907:tóng # 餇 0x9908:cí # 餈 0x9909:xiÇŽng # 餉 0x990a:yÇŽng # 養 0x990b:juàn # 餋 0x990c:Ä›r # 餌 0x990d:yàn # é¤� 0x990e:lè # 餎 0x990f:xÄ« # é¤� 0x9910:cÄ�n # é¤� 0x9911:bÅ� # 餑 0x9912:nÄ›i # 餒 0x9913:è # 餓 0x9914:bÅ« # 餔 0x9915:jùn # 餕 0x9916:dòu # 餖 0x9917:sù # 餗 0x9918:yú # 餘 0x9919:shì # 餙 0x991a:yáo # 餚 0x991b:hún # 餛 0x991c:guÇ’ # 餜 0x991d:shì # é¤� 0x991e:jiàn # 餞 0x991f:chuò # 餟 0x9920:bÇ�ng # 餠 0x9921:xiàn # 餡 0x9922:bù # 餢 0x9923:yè # 餣 0x9924:dàn # 餤 0x9925:fÄ“i # 餥 0x9926:zhÄ�ng # 餦 0x9927:wèi # 餧 0x9928:guÇŽn # 館 0x9929:è # 餩 0x992a:nuÇŽn # 餪 0x992b:yùn # 餫 0x992c:hú # 餬 0x992d:huáng # 餭 0x992e:tiè # 餮 0x992f:huì # 餯 0x9930:jiÄ�n # 餰 0x9931:hóu # 餱 0x9932:ài # 餲 0x9933:xíng # 餳 0x9934:fÄ“n # 餴 0x9935:wèi # 餵 0x9936:gÇ” # 餶 0x9937:chÄ� # 餷 0x9938:sòng # 餸 0x9939:táng # 餹 0x993a:bó # 餺 0x993b:gÄ�o # 餻 0x993c:xì # 餼 0x993d:kuì # 餽 0x993e:liù # 餾 0x993f:sÅ�u # 餿 0x9940:táo # 饀 0x9941:yè # é¥� 0x9942:wÄ“n # 饂 0x9943:mó # 饃 0x9944:táng # 饄 0x9945:mán # 饅 0x9946:bì # 饆 0x9947:yù # 饇 0x9948:xiÅ« # 饈 0x9949:jÇ�n # 饉 0x994a:sÇŽn # 饊 0x994b:kuì # 饋 0x994c:zhuàn # 饌 0x994d:shàn # é¥� 0x994e:xÄ« # 饎 0x994f:dàn # é¥� 0x9950:yì # é¥� 0x9951:jÄ« # 饑 0x9952:ráo # 饒 0x9953:chÄ“ng # 饓 0x9954:yÅ�ng # 饔 0x9955:tÄ�o # 饕 0x9956:wèi # 饖 0x9957:xiÇŽng # 饗 0x9958:zhÄ�n # 饘 0x9959:fÄ“n # 饙 0x995a:hài # 饚 0x995b:méng # 饛 0x995c:yàn # 饜 0x995d:mó # é¥� 0x995e:chán # 饞 0x995f:xiÇŽng,náng # 饟 0x9960:luó # 饠 0x9961:zàn # 饡 0x9962:náng # 饢 0x9963:shí # 饣 0x9964:dìng # 饤 0x9965:jÄ« # 饥 0x9966:tuÅ� # 饦 0x9967:xíng # 饧 0x9968:tún # 饨 0x9969:xì # 饩 0x996a:rèn # 饪 0x996b:yù # 饫 0x996c:chì # 饬 0x996d:fàn # 饭 0x996e:yÇ�n # 饮 0x996f:jiàn # 饯 0x9970:shì # 饰 0x9971:bÇŽo # 饱 0x9972:sì # 饲 0x9973:duò # 饳 0x9974:yí # 饴 0x9975:Ä›r # 饵 0x9976:ráo # 饶 0x9977:xiÇŽng # 饷 0x9978:hé # 饸 0x9979:gÄ“,le # 饹 0x997a:jiÇŽo # 饺 0x997b:xÄ« # 饻 0x997c:bÇ�ng # 饼 0x997d:bÅ� # 饽 0x997e:dòu # 饾 0x997f:è # 饿 0x9980:yú # 馀 0x9981:nÄ›i # é¦� 0x9982:jùn # 馂 0x9983:guÇ’ # 馃 0x9984:hún # 馄 0x9985:xiàn # 馅 0x9986:guÇŽn # 馆 0x9987:chÄ� # 馇 0x9988:kuì # 馈 0x9989:gÇ” # 馉 0x998a:sÅ�u # 馊 0x998b:chán # 馋 0x998c:yè # 馌 0x998d:mó # é¦� 0x998e:bó # 馎 0x998f:liù,liú # é¦� 0x9990:xiÅ« # é¦� 0x9991:jÇ�n # 馑 0x9992:mán # 馒 0x9993:sÇŽn # 馓 0x9994:zhuàn # 馔 0x9995:náng,nÇŽng # 馕 0x9996:shÇ’u # 首 0x9997:kuí # 馗 0x9998:guó # 馘 0x9999:xiÄ�ng # 香 0x999a:fÄ“n # 馚 0x999b:bó # 馛 0x999c:ní # 馜 0x999d:bì # é¦� 0x999e:bó # 馞 0x999f:tú # 馟 0x99a0:hÄ�n # 馠 0x99a1:fÄ“i # 馡 0x99a2:jiÄ�n # 馢 0x99a3:Ä�n # 馣 0x99a4:ài # 馤 0x99a5:fù # 馥 0x99a6:xiÄ�n # 馦 0x99a7:yÅ«n,wò # 馧 0x99a8:xÄ«n # 馨 0x99a9:fén # 馩 0x99aa:pÄ«n # 馪 0x99ab:xÄ«n # 馫 0x99ac:mÇŽ # 馬 0x99ad:yù # 馭 0x99ae:féng,píng # 馮 0x99af:hàn,hán # 馯 0x99b0:dí # 馰 0x99b1:tuó,duò # 馱 0x99b2:tuÅ�,zhé # 馲 0x99b3:chí # 馳 0x99b4:xùn # 馴 0x99b5:zhù # 馵 0x99b6:zhÄ«,shì # 馶 0x99b7:pèi # 馷 0x99b8:xìn,jìn # 馸 0x99b9:rì # 馹 0x99ba:sà # 馺 0x99bb:yÇ”n # 馻 0x99bc:wén # 馼 0x99bd:zhí # 馽 0x99be:dÇŽn,dàn # 馾 0x99bf:lú # 馿 0x99c0:yóu # é§€ 0x99c1:bó # é§� 0x99c2:bÇŽo # é§‚ 0x99c3:jué,kuài # 駃 0x99c4:tuó,duò # é§„ 0x99c5:yì # é§… 0x99c6:qÅ« # 駆 0x99c8:qÅ« # 駈 0x99c9:jiÅ�ng # 駉 0x99ca:pÇ’ # é§Š 0x99cb:zhÄ�o # é§‹ 0x99cc:yuÄ�n # é§Œ 0x99cd:pÄ“ng # é§� 0x99ce:zhòu # é§Ž 0x99cf:jù # é§� 0x99d0:zhù # é§� 0x99d1:nú # é§‘ 0x99d2:jÅ« # é§’ 0x99d3:pÄ« # é§“ 0x99d4:zÇŽng # é§” 0x99d5:jià # é§• 0x99d6:líng # é§– 0x99d7:zhÄ›n # é§— 0x99d8:tái,dài # 駘 0x99d9:fù # é§™ 0x99da:yÇŽng # é§š 0x99db:shÇ� # é§› 0x99dc:bì # é§œ 0x99dd:tuó # é§� 0x99de:tuó # é§ž 0x99df:sì # é§Ÿ 0x99e0:liú # é§  0x99e1:mà # é§¡ 0x99e2:pián # é§¢ 0x99e3:táo # é§£ 0x99e4:zhì # 駤 0x99e5:róng # é§¥ 0x99e6:téng # 駦 0x99e7:dòng # é§§ 0x99e8:xún,xuÄ�n # 駨 0x99e9:quán # é§© 0x99ea:shÄ“n # 駪 0x99eb:jiÅ�ng # é§« 0x99ec:Ä›r # 駬 0x99ed:hài # é§­ 0x99ee:bó # é§® 0x99f0:yÄ«n # é§° 0x99f1:luò # é§± 0x99f3:dàn # é§³ 0x99f4:hài # é§´ 0x99f5:liú # é§µ 0x99f6:jú # é§¶ 0x99f7:sÇ’ng # é§· 0x99f8:qÄ«n # 駸 0x99f9:máng # é§¹ 0x99fa:liáng,láng # 駺 0x99fb:hàn # é§» 0x99fc:tú # é§¼ 0x99fd:xuÄ�n # é§½ 0x99fe:tuì # é§¾ 0x99ff:jùn # é§¿ 0x9a00:Ä› # 騀 0x9a01:chÄ›ng # é¨� 0x9a02:xÄ«ng # 騂 0x9a03:sì # 騃 0x9a04:lù # 騄 0x9a05:zhuÄ« # 騅 0x9a06:zhÅ�u # 騆 0x9a07:shè # 騇 0x9a08:pián # 騈 0x9a09:kÅ«n # 騉 0x9a0a:táo # 騊 0x9a0b:lái # 騋 0x9a0c:zÅ�ng # 騌 0x9a0d:kè # é¨� 0x9a0e:qí # 騎 0x9a0f:qí # é¨� 0x9a10:yàn # é¨� 0x9a11:fÄ“i # 騑 0x9a12:sÄ�o # 騒 0x9a13:yàn # 験 0x9a14:gé # 騔 0x9a15:yÇŽo # 騕 0x9a16:wù # 騖 0x9a17:piàn # 騗 0x9a18:cÅ�ng # 騘 0x9a19:piàn # 騙 0x9a1a:qián # 騚 0x9a1b:fÄ“i # 騛 0x9a1c:huáng # 騜 0x9a1d:qián # é¨� 0x9a1e:huÅ� # 騞 0x9a1f:yú # 騟 0x9a20:tí # 騠 0x9a21:quán # 騡 0x9a22:xiá # 騢 0x9a23:zÅ�ng # 騣 0x9a24:kuí # 騤 0x9a25:róu # 騥 0x9a26:sÄ« # 騦 0x9a27:guÄ� # 騧 0x9a28:tuó # 騨 0x9a29:guÄ« # 騩 0x9a2a:sÅ�u # 騪 0x9a2b:qiÄ�n # 騫 0x9a2c:chéng # 騬 0x9a2d:zhì # 騭 0x9a2e:liú # 騮 0x9a2f:péng # 騯 0x9a30:téng # 騰 0x9a31:xí # 騱 0x9a32:cÇŽo # 騲 0x9a33:dú # 騳 0x9a34:yàn # 騴 0x9a35:yuán # 騵 0x9a36:zÅ�u # 騶 0x9a37:sÄ�o # 騷 0x9a38:shàn # 騸 0x9a39:qí # 騹 0x9a3a:zhì # 騺 0x9a3b:shuÄ�ng # 騻 0x9a3c:lù # 騼 0x9a3d:xí # 騽 0x9a3e:luó # 騾 0x9a3f:zhÄ�ng # 騿 0x9a40:mò # é©€ 0x9a41:ào # é©� 0x9a42:cÄ�n # é©‚ 0x9a43:piào # 驃 0x9a44:cÅ�ng # é©„ 0x9a45:qÅ« # é©… 0x9a46:bì # 驆 0x9a47:zhì # 驇 0x9a48:yù # 驈 0x9a49:xÅ« # 驉 0x9a4a:huá # 驊 0x9a4b:bÅ� # é©‹ 0x9a4c:sù # 驌 0x9a4d:xiÄ�o # é©� 0x9a4e:lín # 驎 0x9a4f:zhàn # é©� 0x9a50:dÅ«n # é©� 0x9a51:liú # é©‘ 0x9a52:tuó # é©’ 0x9a53:céng # é©“ 0x9a54:diàn # é©” 0x9a55:jiÄ�o # é©• 0x9a56:tiÄ› # é©– 0x9a57:yàn # é©— 0x9a58:luó # 驘 0x9a59:zhÄ�n # é©™ 0x9a5a:jÄ«ng # 驚 0x9a5b:yì # é©› 0x9a5c:yè # 驜 0x9a5d:tuó # é©� 0x9a5e:pÄ«n # 驞 0x9a5f:zhòu # 驟 0x9a60:yàn # é©  0x9a61:lóng # é©¡ 0x9a62:lǘ # é©¢ 0x9a63:téng # é©£ 0x9a64:xiÄ�ng # 驤 0x9a65:jì # é©¥ 0x9a66:shuÄ�ng # 驦 0x9a67:jú # é©§ 0x9a68:xí # 驨 0x9a69:huÄ�n # é©© 0x9a6a:lí # 驪 0x9a6b:biÄ�o # é©« 0x9a6c:mÇŽ # 马 0x9a6d:yù # é©­ 0x9a6e:tuó,duò # é©® 0x9a6f:xùn # 驯 0x9a70:chí # é©° 0x9a71:qÅ« # 驱 0x9a72:rì # 驲 0x9a73:bó # 驳 0x9a74:lǘ # é©´ 0x9a75:zÇŽng # 驵 0x9a76:shÇ� # é©¶ 0x9a77:sì # é©· 0x9a78:fù # 驸 0x9a79:jÅ« # 驹 0x9a7a:zÅ�u # 驺 0x9a7b:zhù # é©» 0x9a7c:tuó # 驼 0x9a7d:nú # 驽 0x9a7e:jià # 驾 0x9a7f:yì # é©¿ 0x9a80:tái # 骀 0x9a81:xiÄ�o # éª� 0x9a82:mà # 骂 0x9a83:yÄ«n # 骃 0x9a84:jiÄ�o # 骄 0x9a85:huá # 骅 0x9a86:luò # 骆 0x9a87:hài # 骇 0x9a88:pián # 骈 0x9a89:biÄ�o # 骉 0x9a8a:lí # 骊 0x9a8b:chÄ›ng # 骋 0x9a8c:yàn # 验 0x9a8d:xÄ«ng # éª� 0x9a8e:qÄ«n # 骎 0x9a8f:jùn # éª� 0x9a90:qí # éª� 0x9a91:qí # 骑 0x9a92:kè # 骒 0x9a93:zhuÄ« # 骓 0x9a94:zÅ�ng # 骔 0x9a95:sù # 骕 0x9a96:cÄ�n # 骖 0x9a97:piàn # 骗 0x9a98:zhì # 骘 0x9a99:kuí # 骙 0x9a9a:sÄ�o,sÇŽo # 骚 0x9a9b:wù # 骛 0x9a9c:áo # 骜 0x9a9d:liú # éª� 0x9a9e:qiÄ�n # 骞 0x9a9f:shàn # 骟 0x9aa0:piào,biÄ�o # 骠 0x9aa1:luó # 骡 0x9aa2:cÅ�ng # 骢 0x9aa3:chÇŽn # 骣 0x9aa4:zhòu # 骤 0x9aa5:jì # 骥 0x9aa6:shuÄ�ng # 骦 0x9aa7:xiÄ�ng # 骧 0x9aa8:gÇ”,gÅ« # 骨 0x9aa9:wÄ›i # 骩 0x9aaa:wÄ›i # 骪 0x9aab:wÄ›i # 骫 0x9aac:yú # 骬 0x9aad:gàn # 骭 0x9aae:yì # 骮 0x9aaf:Ä�ng # 骯 0x9ab0:tóu # 骰 0x9ab1:jiè # 骱 0x9ab2:bào # 骲 0x9ab3:bèi,mó # 骳 0x9ab4:cÄ« # 骴 0x9ab5:tÇ� # 骵 0x9ab6:dÇ� # 骶 0x9ab7:kÅ« # 骷 0x9ab8:hái # 骸 0x9ab9:qiÄ�o,xiÄ�o # 骹 0x9aba:hóu # 骺 0x9abb:kuà # 骻 0x9abc:gé # 骼 0x9abd:tuÇ� # 骽 0x9abe:gÄ›ng # 骾 0x9abf:pián # 骿 0x9ac0:bì # é«€ 0x9ac1:kÄ“ # é«� 0x9ac2:qià # é«‚ 0x9ac3:yú # 髃 0x9ac4:suí # é«„ 0x9ac5:lóu # é«… 0x9ac6:bó # 髆 0x9ac7:xiÄ�o # 髇 0x9ac8:bÇŽng,pÇŽng # 髈 0x9ac9:bó,jué # 髉 0x9aca:cÄ« # 髊 0x9acb:kuÄ�n # é«‹ 0x9acc:bìn # 髌 0x9acd:mó # é«� 0x9ace:liáo # 髎 0x9acf:lóu # é«� 0x9ad0:xiÄ�o # é«� 0x9ad1:dú # é«‘ 0x9ad2:zÄ�ng # é«’ 0x9ad3:suÇ� # é«“ 0x9ad4:tÇ�,tÄ« # é«” 0x9ad5:bìn # é«• 0x9ad6:kuÄ�n # é«– 0x9ad7:lú # é«— 0x9ad8:gÄ�o # 高 0x9ad9:gÄ�o # é«™ 0x9ada:qiào # 髚 0x9adb:kÄ�o # é«› 0x9adc:qiÇŽo # 髜 0x9add:láo # é«� 0x9ade:sào # 髞 0x9adf:biÄ�o # 髟 0x9ae0:kÅ«n # é«  0x9ae1:kÅ«n # é«¡ 0x9ae2:dí # é«¢ 0x9ae3:fÇŽng # é«£ 0x9ae4:xiÅ« # 髤 0x9ae5:rán # é«¥ 0x9ae6:máo # 髦 0x9ae7:dàn # é«§ 0x9ae8:kÅ«n # 髨 0x9ae9:bìn # é«© 0x9aea:fà # 髪 0x9aeb:tiáo # é«« 0x9aec:pÄ« # 髬 0x9aed:zÄ« # é«­ 0x9aee:fà # é«® 0x9aef:rán # 髯 0x9af0:tì # é«° 0x9af1:bào # 髱 0x9af2:bì,pÇ’ # 髲 0x9af3:máo,méng # 髳 0x9af4:fú # é«´ 0x9af5:ér # 髵 0x9af6:èr # é«¶ 0x9af7:qÅ« # é«· 0x9af9:xiÅ« # 髹 0x9afa:kuò,yuè # 髺 0x9afb:jì # é«» 0x9afc:péng # 髼 0x9afd:zhuÄ� # 髽 0x9afe:shÄ�o # 髾 0x9aff:shÄ� # é«¿ 0x9b00:tì # 鬀 0x9b01:lì # é¬� 0x9b02:bìn # 鬂 0x9b03:zÅ�ng # 鬃 0x9b04:tì # 鬄 0x9b05:péng # 鬅 0x9b06:sÅ�ng # 鬆 0x9b07:zhÄ“ng # 鬇 0x9b08:quán # 鬈 0x9b09:zÅ�ng # 鬉 0x9b0a:shùn # 鬊 0x9b0b:jiÇŽn # 鬋 0x9b0c:duÇ’ # 鬌 0x9b0d:hú # é¬� 0x9b0e:là # 鬎 0x9b0f:jiÅ« # é¬� 0x9b10:qí # é¬� 0x9b11:lián # 鬑 0x9b12:zhÄ›n # 鬒 0x9b13:bìn # 鬓 0x9b14:péng # 鬔 0x9b15:mà # 鬕 0x9b16:sÄ�n # 鬖 0x9b17:mán # 鬗 0x9b18:mán # 鬘 0x9b19:sÄ“ng # 鬙 0x9b1a:xÅ« # 鬚 0x9b1b:liè # 鬛 0x9b1c:qiÄ�n # 鬜 0x9b1d:qiÄ�n # é¬� 0x9b1e:nóng # 鬞 0x9b1f:huán # 鬟 0x9b20:kuò # 鬠 0x9b21:níng # 鬡 0x9b22:bìn # 鬢 0x9b23:liè # 鬣 0x9b24:ráng # 鬤 0x9b25:dòu # 鬥 0x9b26:dòu # 鬦 0x9b27:nào # 鬧 0x9b28:hòng # 鬨 0x9b29:xì # 鬩 0x9b2a:dòu # 鬪 0x9b2b:kàn # 鬫 0x9b2c:dòu # 鬬 0x9b2d:dòu # 鬭 0x9b2e:jiÅ« # 鬮 0x9b2f:chàng # 鬯 0x9b30:yù # 鬰 0x9b31:yù # 鬱 0x9b32:gé,lì # 鬲 0x9b33:yàn # 鬳 0x9b34:fÇ” # 鬴 0x9b35:zèng # 鬵 0x9b36:guÄ« # 鬶 0x9b37:zÅ�ng # 鬷 0x9b38:liù # 鬸 0x9b39:guÄ« # 鬹 0x9b3a:shÄ�ng # 鬺 0x9b3b:yù # 鬻 0x9b3c:guÇ� # 鬼 0x9b3d:mèi # 鬽 0x9b3e:jì # 鬾 0x9b3f:qí # 鬿 0x9b40:gà # é­€ 0x9b41:kuí # é­� 0x9b42:hún # é­‚ 0x9b43:bá # é­ƒ 0x9b44:pò,tuò,bó # é­„ 0x9b45:mèi # é­… 0x9b46:xÅ« # é­† 0x9b47:yÇŽn # é­‡ 0x9b48:xiÄ�o # é­ˆ 0x9b49:liÇŽng # é­‰ 0x9b4a:yù # é­Š 0x9b4b:tuí # é­‹ 0x9b4c:qÄ« # é­Œ 0x9b4d:wÇŽng # é­� 0x9b4e:liÇŽng # é­Ž 0x9b4f:wèi # é­� 0x9b50:gÄ�n # é­� 0x9b51:chÄ« # é­‘ 0x9b52:piÄ�o # é­’ 0x9b53:bì # é­“ 0x9b54:mó # é­” 0x9b55:jÄ« # é­• 0x9b56:xÅ« # é­– 0x9b57:chÇ’u # é­— 0x9b58:yÇŽn # é­˜ 0x9b59:zhÄ�n # é­™ 0x9b5a:yú # é­š 0x9b5b:dÄ�o # é­› 0x9b5c:rén # é­œ 0x9b5d:jì # é­� 0x9b5f:hóng # é­Ÿ 0x9b60:tuÅ� # é­  0x9b61:diào # é­¡ 0x9b62:jÇ� # é­¢ 0x9b63:yú # é­£ 0x9b64:é # é­¤ 0x9b65:jì # é­¥ 0x9b66:shÄ� # é­¦ 0x9b67:háng # é­§ 0x9b68:tún # é­¨ 0x9b69:mò # é­© 0x9b6a:jiè # é­ª 0x9b6b:shÄ›n # é­« 0x9b6c:bÇŽn # é­¬ 0x9b6d:yuán # é­­ 0x9b6e:pí # é­® 0x9b6f:lÇ” # é­¯ 0x9b70:wén # é­° 0x9b71:hú # é­± 0x9b72:lú # é­² 0x9b73:zÄ� # é­³ 0x9b74:fáng # é­´ 0x9b75:fén # é­µ 0x9b76:nà # é­¶ 0x9b77:yóu # é­· 0x9b7a:hé # é­º 0x9b7b:xiá # é­» 0x9b7c:qÅ« # é­¼ 0x9b7d:hÄ�n # é­½ 0x9b7e:pÄ« # é­¾ 0x9b7f:líng # é­¿ 0x9b80:tuó # 鮀 0x9b81:bà # é®� 0x9b82:qiú # 鮂 0x9b83:píng # 鮃 0x9b84:fú # 鮄 0x9b85:bì # é®… 0x9b86:cÇ�,jì # 鮆 0x9b87:wèi # 鮇 0x9b88:jÅ« # 鮈 0x9b89:diÄ�o # 鮉 0x9b8a:bó,bà # 鮊 0x9b8b:yóu # 鮋 0x9b8c:gÇ”n # 鮌 0x9b8d:pí # é®� 0x9b8e:nián # 鮎 0x9b8f:xÄ«ng # é®� 0x9b90:tái # é®� 0x9b91:bào # 鮑 0x9b92:fù # é®’ 0x9b93:zhÇŽ,zhà # 鮓 0x9b94:jù # é®” 0x9b95:gÅ« # 鮕 0x9b99:tÇŽ # é®™ 0x9b9a:jié # 鮚 0x9b9b:shÅ« # é®› 0x9b9c:hòu # 鮜 0x9b9d:xiÇŽng # é®� 0x9b9e:ér # 鮞 0x9b9f:Ä�n # 鮟 0x9ba0:wéi # é®  0x9ba1:zhào # 鮡 0x9ba2:zhÅ« # 鮢 0x9ba3:yìn # 鮣 0x9ba4:liè # 鮤 0x9ba5:luò,gé # 鮥 0x9ba6:tóng # 鮦 0x9ba7:yí # é®§ 0x9ba8:yì # 鮨 0x9ba9:bìng # 鮩 0x9baa:wÄ›i # 鮪 0x9bab:jiÄ�o # 鮫 0x9bac:kÅ« # 鮬 0x9bad:guÄ«,xié,wÄ�,kuí # é®­ 0x9bae:xiÄ�n,xiÇŽn # é®® 0x9baf:gé # 鮯 0x9bb0:huí # é®° 0x9bb3:kào # 鮳 0x9bb5:tuÅ� # 鮵 0x9bb6:jÅ«n # é®¶ 0x9bb7:tí # é®· 0x9bb8:miÇŽn # 鮸 0x9bb9:shÄ�o # 鮹 0x9bba:zhÇŽ # 鮺 0x9bbb:suÅ� # é®» 0x9bbc:qÄ«n # 鮼 0x9bbd:yú # 鮽 0x9bbe:nÄ›i # 鮾 0x9bbf:zhé # 鮿 0x9bc0:gÇ”n # 鯀 0x9bc1:gÄ›ng # é¯� 0x9bc3:wú # 鯃 0x9bc4:qiú # 鯄 0x9bc5:shÄ�n # 鯅 0x9bc6:pÅ«,bÅ« # 鯆 0x9bc7:huàn # 鯇 0x9bc8:tiáo # 鯈 0x9bc9:lÇ� # 鯉 0x9bca:shÄ� # 鯊 0x9bcb:shÄ� # 鯋 0x9bcc:kào # 鯌 0x9bcd:méng # é¯� 0x9bd2:yÇ’ng # 鯒 0x9bd3:shÄ“n # 鯓 0x9bd4:zÄ« # 鯔 0x9bd5:qí # 鯕 0x9bd6:qÄ«ng,zhÄ“ng # 鯖 0x9bd7:xiÇŽng # 鯗 0x9bd8:nÄ›i # 鯘 0x9bd9:chún # 鯙 0x9bda:jì # 鯚 0x9bdb:diÄ�o # 鯛 0x9bdc:qiè # 鯜 0x9bdd:gù # é¯� 0x9bde:zhÇ’u # 鯞 0x9bdf:dÅ�ng # 鯟 0x9be0:lái # 鯠 0x9be1:fÄ“i # 鯡 0x9be2:ní # 鯢 0x9be3:yì,sÄ« # 鯣 0x9be4:kÅ«n # 鯤 0x9be5:lù # 鯥 0x9be6:jiù # 鯦 0x9be7:chÄ�ng # 鯧 0x9be8:jÄ«ng # 鯨 0x9be9:lún # 鯩 0x9bea:líng # 鯪 0x9beb:zÅ�u # 鯫 0x9bec:lí # 鯬 0x9bed:mÄ›ng # 鯭 0x9bee:zÅ�ng # 鯮 0x9bef:zhì # 鯯 0x9bf0:nián # 鯰 0x9bf4:shÄ« # 鯴 0x9bf5:shÄ“n # 鯵 0x9bf6:huàn # 鯶 0x9bf7:tí # 鯷 0x9bf8:hóu # 鯸 0x9bf9:xÄ«ng # 鯹 0x9bfa:zhÅ« # 鯺 0x9bfb:là # 鯻 0x9bfc:zÅ�ng # 鯼 0x9bfd:jì # 鯽 0x9bfe:biÄ�n # 鯾 0x9bff:biÄ�n # 鯿 0x9c00:huàn # é°€ 0x9c01:quán # é°� 0x9c02:zéi # é°‚ 0x9c03:wÄ“i # é°ƒ 0x9c04:wÄ“i # é°„ 0x9c05:yú # é°… 0x9c06:chÅ«n # é°† 0x9c07:róu # é°‡ 0x9c08:dié # é°ˆ 0x9c09:huáng # é°‰ 0x9c0a:liàn # é°Š 0x9c0b:yÇŽn # é°‹ 0x9c0c:qiÅ« # é°Œ 0x9c0d:qiÅ« # é°� 0x9c0e:jiÇŽn # é°Ž 0x9c0f:bÄ« # é°� 0x9c10:è # é°� 0x9c11:yáng # é°‘ 0x9c12:fù # é°’ 0x9c13:sÄ�i,xÇ� # é°“ 0x9c14:jiÄ�n # é°” 0x9c15:xiÄ� # é°• 0x9c16:tuÇ’ # é°– 0x9c17:hú # é°— 0x9c19:ruò # é°™ 0x9c1b:wÄ“n # é°› 0x9c1c:jiÄ�n # é°œ 0x9c1d:hào # é°� 0x9c1e:wÅ« # é°ž 0x9c1f:páng # é°Ÿ 0x9c20:sÄ�o # é°  0x9c21:liú # é°¡ 0x9c22:mÇŽ # é°¢ 0x9c23:shí # é°£ 0x9c24:shÄ« # é°¤ 0x9c25:guÄ�n # é°¥ 0x9c27:téng # é°§ 0x9c28:tÇŽ # é°¨ 0x9c29:yáo # é°© 0x9c2a:è # é°ª 0x9c2b:yóng # é°« 0x9c2c:qián # é°¬ 0x9c2d:qí # é°­ 0x9c2e:wÄ“n # é°® 0x9c2f:ruò # é°¯ 0x9c31:lián # é°± 0x9c32:áo # é°² 0x9c33:lè # é°³ 0x9c34:huÄ« # é°´ 0x9c35:mÇ�n # é°µ 0x9c36:jì # é°¶ 0x9c37:tiáo # é°· 0x9c38:qÅ« # é°¸ 0x9c39:jiÄ�n # é°¹ 0x9c3a:shÄ“n # é°º 0x9c3b:mán # é°» 0x9c3c:xí # é°¼ 0x9c3d:qiú # é°½ 0x9c3e:piào # é°¾ 0x9c3f:jì # é°¿ 0x9c40:jì # é±€ 0x9c41:zhú # é±� 0x9c42:jiÄ�ng # 鱂 0x9c43:xiÅ« # 鱃 0x9c44:zhuÄ�n # 鱄 0x9c45:yÅ�ng # é±… 0x9c46:zhÄ�ng # 鱆 0x9c47:kÄ�ng # 鱇 0x9c48:xuÄ› # 鱈 0x9c49:biÄ“ # 鱉 0x9c4a:yù # 鱊 0x9c4b:qÅ« # 鱋 0x9c4c:xiàng # 鱌 0x9c4d:bÅ� # é±� 0x9c4e:jiÇŽo # 鱎 0x9c4f:xún # é±� 0x9c50:sù # é±� 0x9c51:huáng # 鱑 0x9c52:zÅ«n # é±’ 0x9c53:shàn # 鱓 0x9c54:shàn # é±” 0x9c55:fÄ�n # 鱕 0x9c56:guì # é±– 0x9c57:lín # é±— 0x9c58:xún # 鱘 0x9c59:yáo # é±™ 0x9c5a:xÇ� # 鱚 0x9c5d:fèn # é±� 0x9c5e:guÄ�n # 鱞 0x9c5f:hòu # 鱟 0x9c60:kuài # é±  0x9c61:zéi # 鱡 0x9c62:sÄ�o # é±¢ 0x9c63:zhÄ�n # é±£ 0x9c64:gÇŽn # 鱤 0x9c65:guì # é±¥ 0x9c66:yìng # 鱦 0x9c67:lÇ� # é±§ 0x9c68:cháng # 鱨 0x9c6c:rú # 鱬 0x9c6d:jì # é±­ 0x9c6e:xù # é±® 0x9c6f:hù # 鱯 0x9c71:lÇ� # é±± 0x9c72:liè # é±² 0x9c73:lè # é±³ 0x9c74:miè # é±´ 0x9c75:zhÄ“n # é±µ 0x9c76:xiÇŽng # é±¶ 0x9c77:è # é±· 0x9c78:lú # 鱸 0x9c79:guàn # é±¹ 0x9c7a:lí # 鱺 0x9c7b:xiÄ�n # é±» 0x9c7c:yú # é±¼ 0x9c7d:dÄ�o # é±½ 0x9c7e:jÇ� # é±¾ 0x9c7f:yóu # 鱿 0x9c80:tún # é²€ 0x9c81:lÇ” # é²� 0x9c82:fáng # 鲂 0x9c83:bÄ�,bà # 鲃 0x9c84:hé,gÄ› # 鲄 0x9c85:bà # é²… 0x9c86:píng # 鲆 0x9c87:nián # 鲇 0x9c88:lú # 鲈 0x9c89:yóu # 鲉 0x9c8a:zhÇŽ,zhà # 鲊 0x9c8b:fù # 鲋 0x9c8c:bó,bà # 鲌 0x9c8d:bào # é²� 0x9c8e:hòu # 鲎 0x9c8f:pí # é²� 0x9c90:tái # é²� 0x9c91:guÄ«,xié # 鲑 0x9c92:jié # é²’ 0x9c93:kào # 鲓 0x9c94:wÄ›i # é²” 0x9c95:ér # 鲕 0x9c96:tóng # é²– 0x9c97:zéi # é²— 0x9c98:hòu # 鲘 0x9c99:kuài # é²™ 0x9c9a:jì # 鲚 0x9c9b:jiÄ�o # é²› 0x9c9c:xiÄ�n,xiÇŽn # 鲜 0x9c9d:zhÇŽ # é²� 0x9c9e:xiÇŽng # 鲞 0x9c9f:xún # 鲟 0x9ca0:gÄ›ng # é²  0x9ca1:lí # 鲡 0x9ca2:lián # é²¢ 0x9ca3:jiÄ�n # é²£ 0x9ca4:lÇ� # 鲤 0x9ca5:shí # é²¥ 0x9ca6:tiáo # 鲦 0x9ca7:gÇ”n # é²§ 0x9ca8:shÄ� # 鲨 0x9ca9:huàn # 鲩 0x9caa:jÅ«n # 鲪 0x9cab:jì # 鲫 0x9cac:yÇ’ng # 鲬 0x9cad:qÄ«ng,zhÄ“ng # é²­ 0x9cae:líng # é²® 0x9caf:qí # 鲯 0x9cb0:zÅ�u # é²° 0x9cb1:fÄ“i # é²± 0x9cb2:kÅ«n # é²² 0x9cb3:chÄ�ng # é²³ 0x9cb4:gù # é²´ 0x9cb5:ní # é²µ 0x9cb6:nián # é²¶ 0x9cb7:diÄ�o # é²· 0x9cb8:jÄ«ng # 鲸 0x9cb9:shÄ“n # é²¹ 0x9cba:shÄ« # 鲺 0x9cbb:zÄ« # é²» 0x9cbc:fèn # é²¼ 0x9cbd:dié # é²½ 0x9cbe:bÄ« # é²¾ 0x9cbf:cháng # 鲿 0x9cc0:tí # é³€ 0x9cc1:wÄ“n # é³� 0x9cc2:wÄ“i # 鳂 0x9cc3:sÄ�i,xÇ� # 鳃 0x9cc4:è # 鳄 0x9cc5:qiÅ« # é³… 0x9cc6:fù # 鳆 0x9cc7:huáng # 鳇 0x9cc8:quán # 鳈 0x9cc9:jiÄ�ng # 鳉 0x9cca:biÄ�n # 鳊 0x9ccb:sÄ�o # 鳋 0x9ccc:áo # 鳌 0x9ccd:qí # é³� 0x9cce:tÇŽ # 鳎 0x9ccf:guÄ�n # é³� 0x9cd0:yáo # é³� 0x9cd1:páng # 鳑 0x9cd2:jiÄ�n # é³’ 0x9cd3:lè # 鳓 0x9cd4:biào # é³” 0x9cd5:xuÄ› # 鳕 0x9cd6:biÄ“ # é³– 0x9cd7:mán # é³— 0x9cd8:mÇ�n # 鳘 0x9cd9:yÅ�ng # é³™ 0x9cda:wèi # 鳚 0x9cdb:xí # é³› 0x9cdc:guì,jué # 鳜 0x9cdd:shàn # é³� 0x9cde:lín # 鳞 0x9cdf:zÅ«n # 鳟 0x9ce0:hù # é³  0x9ce1:gÇŽn # 鳡 0x9ce2:lÇ� # é³¢ 0x9ce3:zhÄ�n,shàn # é³£ 0x9ce4:guÇŽn # 鳤 0x9ce5:niÇŽo,diÇŽo # é³¥ 0x9ce6:yÇ� # 鳦 0x9ce7:fú # é³§ 0x9ce8:lì # 鳨 0x9ce9:jiÅ« # 鳩 0x9cea:bú # 鳪 0x9ceb:yàn # 鳫 0x9cec:fú # 鳬 0x9ced:diÄ�o,zhÄ�o # é³­ 0x9cee:jÄ« # é³® 0x9cef:fèng # 鳯 0x9cf1:gÄ�n,hàn,yàn # é³± 0x9cf2:shÄ« # é³² 0x9cf3:fèng # é³³ 0x9cf4:míng # é³´ 0x9cf5:bÇŽo # é³µ 0x9cf6:yuÄ�n # é³¶ 0x9cf7:zhÄ« # é³· 0x9cf8:hù # 鳸 0x9cf9:qín # é³¹ 0x9cfa:fÅ«,guÄ« # 鳺 0x9cfb:bÄ�n,fén # é³» 0x9cfc:wén # é³¼ 0x9cfd:jiÄ�n,qiÄ�n,zhÄ�n # é³½ 0x9cfe:shÄ« # é³¾ 0x9cff:yù # 鳿 0x9d00:fÇ’u # é´€ 0x9d01:yÄ�o # é´� 0x9d02:jué # é´‚ 0x9d03:jué # é´ƒ 0x9d04:pÇ� # é´„ 0x9d05:huÄ�n # é´… 0x9d06:zhèn # é´† 0x9d07:bÇŽo # é´‡ 0x9d08:yàn # é´ˆ 0x9d09:yÄ� # é´‰ 0x9d0a:zhèng # é´Š 0x9d0b:fÄ�ng # é´‹ 0x9d0c:fèng # é´Œ 0x9d0d:wén # é´� 0x9d0e:Å�u # é´Ž 0x9d0f:dài # é´� 0x9d10:jiÄ� # é´� 0x9d11:rú # é´‘ 0x9d12:líng # é´’ 0x9d13:miè # é´“ 0x9d14:fú # é´” 0x9d15:tuó # é´• 0x9d16:mín # é´– 0x9d17:lì # é´— 0x9d18:biÇŽn # é´˜ 0x9d19:zhì # é´™ 0x9d1a:gÄ“ # é´š 0x9d1b:yuÄ�n # é´› 0x9d1c:cí # é´œ 0x9d1d:qú # é´� 0x9d1e:xiÄ�o # é´ž 0x9d1f:chÄ« # é´Ÿ 0x9d20:dàn # é´  0x9d21:jÅ« # é´¡ 0x9d22:yÄ�o # é´¢ 0x9d23:gÅ« # é´£ 0x9d24:zhÅ�ng # é´¤ 0x9d25:yù # é´¥ 0x9d26:yÄ�ng # é´¦ 0x9d27:yù # é´§ 0x9d28:yÄ� # é´¨ 0x9d29:dié # é´© 0x9d2a:yù # é´ª 0x9d2c:yÄ«ng # é´¬ 0x9d2d:duÄ« # é´­ 0x9d2e:wÅ« # é´® 0x9d2f:ér # é´¯ 0x9d30:guÄ� # é´° 0x9d31:ài # é´± 0x9d32:zhÄ« # é´² 0x9d33:yàn # é´³ 0x9d34:héng # é´´ 0x9d35:xiÄ�o # é´µ 0x9d36:jiá # é´¶ 0x9d37:liè # é´· 0x9d38:zhÅ« # é´¸ 0x9d39:yáng # é´¹ 0x9d3a:yí # é´º 0x9d3b:hóng # é´» 0x9d3c:lù # é´¼ 0x9d3d:rú # é´½ 0x9d3e:móu # é´¾ 0x9d3f:gÄ“ # é´¿ 0x9d40:rén # éµ€ 0x9d41:jiÄ�o # éµ� 0x9d42:xiÅ« # 鵂 0x9d43:zhÅ�u # 鵃 0x9d44:chÄ« # 鵄 0x9d45:luò # éµ… 0x9d49:luán # 鵉 0x9d4a:jiá # 鵊 0x9d4b:jì # 鵋 0x9d4c:tú # 鵌 0x9d4d:huÄ�n # éµ� 0x9d4e:tuÇ’ # 鵎 0x9d4f:bÅ« # éµ� 0x9d50:wú # éµ� 0x9d51:jiÄ�n # 鵑 0x9d52:yù # éµ’ 0x9d53:bó # 鵓 0x9d54:jùn # éµ” 0x9d55:jùn # 鵕 0x9d56:bÄ« # éµ– 0x9d57:xÄ« # éµ— 0x9d58:jùn # 鵘 0x9d59:jú # éµ™ 0x9d5a:tÅ« # 鵚 0x9d5b:jìng # éµ› 0x9d5c:tí # 鵜 0x9d5d:é # éµ� 0x9d5e:é # 鵞 0x9d5f:kuáng # 鵟 0x9d60:hú # éµ  0x9d61:wÇ” # 鵡 0x9d62:shÄ“n # éµ¢ 0x9d63:lài # éµ£ 0x9d66:lù # 鵦 0x9d67:pí # éµ§ 0x9d68:shÅ« # 鵨 0x9d69:fú # 鵩 0x9d6a:Ä�n # 鵪 0x9d6b:zhuó # 鵫 0x9d6c:péng # 鵬 0x9d6d:qín # éµ­ 0x9d6e:qiÄ�n # éµ® 0x9d6f:bÄ“i # 鵯 0x9d70:diÄ�o # éµ° 0x9d71:lù # éµ± 0x9d72:què # éµ² 0x9d73:jiÄ�n # éµ³ 0x9d74:jú # éµ´ 0x9d75:tù # éµµ 0x9d76:yÄ� # éµ¶ 0x9d77:yuÄ�n # éµ· 0x9d78:qí # 鵸 0x9d79:lí # éµ¹ 0x9d7a:yè # 鵺 0x9d7b:zhuÄ« # éµ» 0x9d7c:kÅ�ng # éµ¼ 0x9d7d:duò # éµ½ 0x9d7e:kÅ«n # éµ¾ 0x9d7f:shÄ“ng # 鵿 0x9d80:qí # é¶€ 0x9d81:jÄ«ng # é¶� 0x9d82:yì # é¶‚ 0x9d83:yì # 鶃 0x9d84:jÄ«ng # é¶„ 0x9d85:zÄ« # é¶… 0x9d86:lái # 鶆 0x9d87:dÅ�ng # 鶇 0x9d88:qÄ« # 鶈 0x9d89:chún # 鶉 0x9d8a:gÄ“ng # é¶Š 0x9d8b:jÅ« # é¶‹ 0x9d8c:qÅ« # é¶Œ 0x9d8f:jÄ« # é¶� 0x9d90:shù # é¶� 0x9d92:chì # é¶’ 0x9d93:miáo # é¶“ 0x9d94:róu # é¶” 0x9d95:Ä�n # é¶• 0x9d96:qiÅ« # é¶– 0x9d97:tí,chí # é¶— 0x9d98:hú # 鶘 0x9d99:tí,chí # é¶™ 0x9d9a:è # é¶š 0x9d9b:jiÄ“ # é¶› 0x9d9c:máo # é¶œ 0x9d9d:fú,bì # é¶� 0x9d9e:chÅ«n # é¶ž 0x9d9f:tú # é¶Ÿ 0x9da0:yÇŽn # é¶  0x9da1:hé,jiè # é¶¡ 0x9da2:yuán # é¶¢ 0x9da3:piÄ�n,biÇŽn # é¶£ 0x9da4:kÅ«n # 鶤 0x9da5:méi # é¶¥ 0x9da6:hú # 鶦 0x9da7:yÄ«ng # é¶§ 0x9da8:chuàn,zhì # 鶨 0x9da9:wù # é¶© 0x9daa:jú # 鶪 0x9dac:cÄ�ng,qiÄ�ng # 鶬 0x9dad:fÇŽng # é¶­ 0x9dae:hè,hú # é¶® 0x9daf:yÄ«ng # 鶯 0x9db0:yuán # é¶° 0x9db1:xiÄ�n # é¶± 0x9db2:wÄ“ng # é¶² 0x9db3:shÄ« # é¶³ 0x9db4:hè # é¶´ 0x9db5:chú # é¶µ 0x9db6:táng # é¶¶ 0x9db7:xiá # é¶· 0x9db8:ruò # 鶸 0x9db9:liú # é¶¹ 0x9dba:jÄ« # 鶺 0x9dbb:gÇ”,hú # é¶» 0x9dbc:jiÄ�n # é¶¼ 0x9dbd:sÇ”n,xùn # é¶½ 0x9dbe:hàn # é¶¾ 0x9dbf:cí # é¶¿ 0x9dc0:cí # é·€ 0x9dc1:yì # é·� 0x9dc2:yào # é·‚ 0x9dc3:yàn # é·ƒ 0x9dc4:jÄ« # é·„ 0x9dc5:lì # é·… 0x9dc6:tián # é·† 0x9dc7:kòu # é·‡ 0x9dc8:tÄ« # é·ˆ 0x9dc9:tÄ« # é·‰ 0x9dca:yì # é·Š 0x9dcb:tú # é·‹ 0x9dcc:mÇŽ # é·Œ 0x9dcd:xiÄ�o # é·� 0x9dce:gÄ�o # é·Ž 0x9dcf:tián # é·� 0x9dd0:chén # é·� 0x9dd1:jì # é·‘ 0x9dd2:tuán # é·’ 0x9dd3:zhè # é·“ 0x9dd4:áo # é·” 0x9dd5:yÇŽo # é·• 0x9dd6:yÄ« # é·– 0x9dd7:Å�u # é·— 0x9dd8:chì # é·˜ 0x9dd9:zhì # é·™ 0x9dda:liù # é·š 0x9ddb:yÅ�ng # é·› 0x9ddc:lóu,lÇš # é·œ 0x9ddd:bì # é·� 0x9dde:shuÄ�ng # é·ž 0x9ddf:zhuó # é·Ÿ 0x9de0:yú # é·  0x9de1:wú # é·¡ 0x9de2:jué # é·¢ 0x9de3:yín # é·£ 0x9de4:tí # é·¤ 0x9de5:sÄ« # é·¥ 0x9de6:jiÄ�o # é·¦ 0x9de7:yì # é·§ 0x9de8:huá # é·¨ 0x9de9:bì # é·© 0x9dea:yÄ«ng # é·ª 0x9deb:sù # é·« 0x9dec:huáng # é·¬ 0x9ded:fán # é·­ 0x9dee:jiÄ�o # é·® 0x9def:liáo # é·¯ 0x9df0:yàn # é·° 0x9df1:gÄ�o # é·± 0x9df2:jiù # é·² 0x9df3:xián # é·³ 0x9df4:xián # é·´ 0x9df5:tú # é·µ 0x9df6:mÇŽi # é·¶ 0x9df7:zÅ«n # é·· 0x9df8:yù # é·¸ 0x9df9:yÄ«ng # é·¹ 0x9dfa:lù # é·º 0x9dfb:tuán # é·» 0x9dfc:xián # é·¼ 0x9dfd:xué # é·½ 0x9dfe:yì # é·¾ 0x9dff:pì # é·¿ 0x9e00:zhÇ” # 鸀 0x9e01:luó # é¸� 0x9e02:xÄ« # 鸂 0x9e03:yì # 鸃 0x9e04:jÄ« # 鸄 0x9e05:zé # 鸅 0x9e06:yú # 鸆 0x9e07:zhÄ�n # 鸇 0x9e08:yè # 鸈 0x9e09:yáng # 鸉 0x9e0a:pì # 鸊 0x9e0b:níng # 鸋 0x9e0c:hù # 鸌 0x9e0d:mí # é¸� 0x9e0e:yÄ«ng # 鸎 0x9e0f:méng # é¸� 0x9e10:dí # é¸� 0x9e11:yuè # 鸑 0x9e12:yù # 鸒 0x9e13:lÄ›i # 鸓 0x9e14:bÇ” # 鸔 0x9e15:lú # 鸕 0x9e16:hè # 鸖 0x9e17:lóng # 鸗 0x9e18:shuÄ�ng # 鸘 0x9e19:yuè # 鸙 0x9e1a:yÄ«ng # 鸚 0x9e1b:guàn # 鸛 0x9e1c:qú # 鸜 0x9e1d:lí # é¸� 0x9e1e:luán # 鸞 0x9e1f:niÇŽo,diÇŽo # 鸟 0x9e20:jiÅ« # 鸠 0x9e21:jÄ« # 鸡 0x9e22:yuÄ�n # 鸢 0x9e23:míng # 鸣 0x9e24:shÄ« # 鸤 0x9e25:Å�u # 鸥 0x9e26:yÄ� # 鸦 0x9e27:cÄ�ng # 鸧 0x9e28:bÇŽo # 鸨 0x9e29:zhèn # 鸩 0x9e2a:gÅ« # 鸪 0x9e2b:dÅ�ng # 鸫 0x9e2c:lú # 鸬 0x9e2d:yÄ� # 鸭 0x9e2e:xiÄ�o # 鸮 0x9e2f:yÄ�ng # 鸯 0x9e30:líng # 鸰 0x9e31:chÄ« # 鸱 0x9e32:qú # 鸲 0x9e33:yuÄ�n # 鸳 0x9e34:xué # 鸴 0x9e35:tuó # 鸵 0x9e36:sÄ« # 鸶 0x9e37:zhì # 鸷 0x9e38:ér # 鸸 0x9e39:guÄ� # 鸹 0x9e3a:xiÅ« # 鸺 0x9e3b:héng # 鸻 0x9e3c:zhÅ�u # 鸼 0x9e3d:gÄ“ # 鸽 0x9e3e:luán # 鸾 0x9e3f:hóng # 鸿 0x9e40:wú # é¹€ 0x9e41:bó # é¹� 0x9e42:lí # 鹂 0x9e43:juÄ�n # 鹃 0x9e44:hú,gÇ”,hè # 鹄 0x9e45:é # é¹… 0x9e46:yù # 鹆 0x9e47:xián # 鹇 0x9e48:tí # 鹈 0x9e49:wÇ” # 鹉 0x9e4a:què # 鹊 0x9e4b:miáo # 鹋 0x9e4c:Ä�n # 鹌 0x9e4d:kÅ«n # é¹� 0x9e4e:bÄ“i # 鹎 0x9e4f:péng # é¹� 0x9e50:qiÄ�n # é¹� 0x9e51:chún # 鹑 0x9e52:gÄ“ng # é¹’ 0x9e53:yuÄ�n # 鹓 0x9e54:sù # é¹” 0x9e55:hú # 鹕 0x9e56:hé # é¹– 0x9e57:è # é¹— 0x9e58:gÇ”,hú # 鹘 0x9e59:qiÅ« # é¹™ 0x9e5a:cí # 鹚 0x9e5b:méi # é¹› 0x9e5c:wù # 鹜 0x9e5d:yì # é¹� 0x9e5e:yào # 鹞 0x9e5f:wÄ“ng # 鹟 0x9e60:liú # é¹  0x9e61:jÄ« # 鹡 0x9e62:yì # é¹¢ 0x9e63:jiÄ�n # é¹£ 0x9e64:hè # 鹤 0x9e65:yÄ« # é¹¥ 0x9e66:yÄ«ng # 鹦 0x9e67:zhè # é¹§ 0x9e68:liù # 鹨 0x9e69:liáo # 鹩 0x9e6a:jiÄ�o # 鹪 0x9e6b:jiù # 鹫 0x9e6c:yù # 鹬 0x9e6d:lù # é¹­ 0x9e6e:huán # é¹® 0x9e6f:zhÄ�n # 鹯 0x9e70:yÄ«ng # é¹° 0x9e71:hù # é¹± 0x9e72:méng # é¹² 0x9e73:guàn # é¹³ 0x9e74:shuÄ�ng # é¹´ 0x9e75:lÇ” # é¹µ 0x9e76:jÄ«n # é¹¶ 0x9e77:líng # é¹· 0x9e78:jiÇŽn # 鹸 0x9e79:xián # é¹¹ 0x9e7a:cuó # 鹺 0x9e7b:jiÇŽn # é¹» 0x9e7c:jiÇŽn # é¹¼ 0x9e7d:yán # é¹½ 0x9e7e:cuó # é¹¾ 0x9e7f:lù # 鹿 0x9e80:yÅ�u # 麀 0x9e81:cÅ« # éº� 0x9e82:jÇ� # 麂 0x9e83:páo,biÄ�o # 麃 0x9e84:cÅ« # 麄 0x9e85:páo # 麅 0x9e86:zhù,cÅ« # 麆 0x9e87:jÅ«n,qún # 麇 0x9e88:zhÇ” # 麈 0x9e89:jiÄ�n # 麉 0x9e8a:mí # 麊 0x9e8b:mí # 麋 0x9e8c:yÇ” # 麌 0x9e8d:liú # éº� 0x9e8e:chén # 麎 0x9e8f:jÅ«n # éº� 0x9e90:lín # éº� 0x9e91:ní # 麑 0x9e92:qí # 麒 0x9e93:lù # 麓 0x9e94:jiù # 麔 0x9e95:jÅ«n # 麕 0x9e96:jÄ«ng # 麖 0x9e97:lí,lì # 麗 0x9e98:xiÄ�ng # 麘 0x9e99:xián # 麙 0x9e9a:jiÄ� # 麚 0x9e9b:mí # 麛 0x9e9c:lì # 麜 0x9e9d:shè # éº� 0x9e9e:zhÄ�ng # 麞 0x9e9f:lín # 麟 0x9ea0:jÄ«ng # 麠 0x9ea1:qí # 麡 0x9ea2:líng # 麢 0x9ea3:yán # 麣 0x9ea4:cÅ« # 麤 0x9ea5:mài # 麥 0x9ea6:mài # 麦 0x9ea7:hé # 麧 0x9ea8:chÇŽo # 麨 0x9ea9:fÅ« # 麩 0x9eaa:miàn # 麪 0x9eab:miàn # 麫 0x9eac:fÅ« # 麬 0x9ead:pào # 麭 0x9eae:qù # 麮 0x9eaf:qÅ« # 麯 0x9eb0:móu # 麰 0x9eb1:fÅ« # 麱 0x9eb2:xiàn # 麲 0x9eb3:lái # 麳 0x9eb4:qÅ« # 麴 0x9eb5:miàn # 麵 0x9eb7:fÄ“ng # 麷 0x9eb8:fÅ« # 麸 0x9eb9:qÅ« # 麹 0x9eba:miàn # 麺 0x9ebb:má # 麻 0x9ebc:mó,me # 麼 0x9ebd:mó,me,ma # 麽 0x9ebe:huÄ« # 麾 0x9ec0:zÅ�u # 黀 0x9ec1:nún # é»� 0x9ec2:fén # 黂 0x9ec3:huáng # 黃 0x9ec4:huáng # 黄 0x9ec5:jÄ«n # é»… 0x9ec6:guÄ�ng # 黆 0x9ec7:tiÄ�n # 黇 0x9ec8:tÇ’u # 黈 0x9ec9:hóng # 黉 0x9eca:huà # 黊 0x9ecb:kuàng # 黋 0x9ecc:hóng # 黌 0x9ecd:shÇ” # é»� 0x9ece:lí # 黎 0x9ecf:nián # é»� 0x9ed0:chÄ« # é»� 0x9ed1:hÄ“i # 黑 0x9ed2:hÄ“i # é»’ 0x9ed3:yì # 黓 0x9ed4:qián # é»” 0x9ed5:dÇŽn # 黕 0x9ed6:xì # é»– 0x9ed7:tún # é»— 0x9ed8:mò # 默 0x9ed9:mò # é»™ 0x9eda:qián # 黚 0x9edb:dài # é»› 0x9edc:chù # 黜 0x9edd:yÇ’u # é»� 0x9ede:diÇŽn # 點 0x9edf:yÄ« # 黟 0x9ee0:xiá # é»  0x9ee1:yÇŽn # 黡 0x9ee2:qÅ« # 黢 0x9ee3:mÄ›i # 黣 0x9ee4:yÇŽn # 黤 0x9ee5:qíng # 黥 0x9ee6:yuè # 黦 0x9ee7:lí # é»§ 0x9ee8:dÇŽng # 黨 0x9ee9:dú # 黩 0x9eea:cÇŽn # 黪 0x9eeb:yÄ�n # 黫 0x9eec:yÇŽn # 黬 0x9eed:yÇŽn # é»­ 0x9eee:dàn,shèn # é»® 0x9eef:àn # 黯 0x9ef0:zhÄ›n,yÄ�n # é»° 0x9ef1:dài # é»± 0x9ef2:cÇŽn # 黲 0x9ef3:yÄ« # 黳 0x9ef4:méi # é»´ 0x9ef5:dÇŽn,zhÇŽn # 黵 0x9ef6:yÇŽn # é»¶ 0x9ef7:dú # é»· 0x9ef8:lú # 黸 0x9ef9:zhÇ� # 黹 0x9efa:fÄ›n # 黺 0x9efb:fú # é»» 0x9efc:fÇ” # 黼 0x9efd:mÇ�n,miÇŽn,mÄ›ng # 黽 0x9efe:mÇ�n,miÇŽn,mÄ›ng # 黾 0x9eff:yuán # 黿 0x9f00:cù # é¼€ 0x9f01:qù # é¼� 0x9f02:cháo # 鼂 0x9f03:wÄ� # 鼃 0x9f04:zhÅ« # 鼄 0x9f05:zhÄ« # é¼… 0x9f06:mÄ›ng # 鼆 0x9f07:áo # 鼇 0x9f08:biÄ“ # 鼈 0x9f09:tuó # 鼉 0x9f0a:bì # 鼊 0x9f0b:yuán # 鼋 0x9f0c:cháo,zhÄ�o # 鼌 0x9f0d:tuó # é¼� 0x9f0e:dÇ�ng # 鼎 0x9f0f:mì # é¼� 0x9f10:nài # é¼� 0x9f11:dÇ�ng # 鼑 0x9f12:zÄ« # é¼’ 0x9f13:gÇ” # 鼓 0x9f14:gÇ” # é¼” 0x9f15:dÅ�ng # 鼕 0x9f16:fén # é¼– 0x9f17:táo # é¼— 0x9f18:yuÄ�n # 鼘 0x9f19:pí # é¼™ 0x9f1a:chÄ�ng # 鼚 0x9f1b:gÄ�o # é¼› 0x9f1c:cào # 鼜 0x9f1d:yuÄ�n # é¼� 0x9f1e:tÄ�ng # 鼞 0x9f1f:tÄ“ng # 鼟 0x9f20:shÇ” # é¼  0x9f21:shÇ” # 鼡 0x9f22:fén # é¼¢ 0x9f23:fèi # é¼£ 0x9f24:wén # 鼤 0x9f25:bá # é¼¥ 0x9f26:diÄ�o # 鼦 0x9f27:tuó # é¼§ 0x9f28:zhÅ�ng # 鼨 0x9f29:qú # 鼩 0x9f2a:shÄ“ng # 鼪 0x9f2b:shí # 鼫 0x9f2c:yòu # 鼬 0x9f2d:shí # é¼­ 0x9f2e:tíng # é¼® 0x9f2f:wú # 鼯 0x9f30:jú # é¼° 0x9f31:jÄ«ng # é¼± 0x9f32:hún # é¼² 0x9f33:jú # é¼³ 0x9f34:yÇŽn # é¼´ 0x9f35:tÅ« # é¼µ 0x9f36:sÄ« # é¼¶ 0x9f37:xÄ« # é¼· 0x9f38:xiàn # 鼸 0x9f39:yÇŽn # é¼¹ 0x9f3a:léi # 鼺 0x9f3b:bí # é¼» 0x9f3c:yào # é¼¼ 0x9f3d:qiú # é¼½ 0x9f3e:hÄ�n # é¼¾ 0x9f3f:wù # 鼿 0x9f40:wù # é½€ 0x9f41:hÅ�u # é½� 0x9f42:xiè # 齂 0x9f43:è # 齃 0x9f44:zhÄ� # 齄 0x9f45:xiù # é½… 0x9f46:wèng # 齆 0x9f47:zhÄ� # 齇 0x9f48:nòng # 齈 0x9f49:nàng # 齉 0x9f4a:qí,zhÄ�i # 齊 0x9f4b:zhÄ�i # 齋 0x9f4c:jì # 齌 0x9f4d:zÄ« # é½� 0x9f4e:jí # 齎 0x9f4f:jÄ« # é½� 0x9f50:qí,jì,zÄ«,zhÄ�i # é½� 0x9f51:jÄ« # 齑 0x9f52:chÇ� # é½’ 0x9f53:chèn # 齓 0x9f54:chèn # é½” 0x9f55:hé # 齕 0x9f56:yá # é½– 0x9f57:yÄ«n # é½— 0x9f58:xiè # 齘 0x9f59:bÄ�o # é½™ 0x9f5a:zé # 齚 0x9f5b:xiè # é½› 0x9f5c:zÄ« # 齜 0x9f5d:chÄ« # é½� 0x9f5e:yàn # 齞 0x9f5f:jÇ” # 齟 0x9f60:tiáo # é½  0x9f61:líng # 齡 0x9f62:líng # é½¢ 0x9f63:chÅ« # é½£ 0x9f64:quán # 齤 0x9f65:xiè # é½¥ 0x9f66:yín # 齦 0x9f67:niè # é½§ 0x9f68:jiù # 齨 0x9f69:yÇŽo # 齩 0x9f6a:chuò # 齪 0x9f6b:yÇ”n # 齫 0x9f6c:yÇ” # 齬 0x9f6d:chÇ” # é½­ 0x9f6e:yÇ� # é½® 0x9f6f:ní # 齯 0x9f70:zé # é½° 0x9f71:zÅ�u # é½± 0x9f72:qÇ” # é½² 0x9f73:yÇ”n # é½³ 0x9f74:yÇŽn # é½´ 0x9f75:yú # é½µ 0x9f76:è # é½¶ 0x9f77:wò # é½· 0x9f78:yì # 齸 0x9f79:cÄ« # é½¹ 0x9f7a:zÅ�u # 齺 0x9f7b:diÄ�n # é½» 0x9f7c:chÇ” # é½¼ 0x9f7d:jìn # é½½ 0x9f7e:yà # é½¾ 0x9f7f:chÇ� # 齿 0x9f80:chèn # é¾€ 0x9f81:hé # é¾� 0x9f82:yín,kÄ›n # 龂 0x9f83:jÇ” # 龃 0x9f84:líng # 龄 0x9f85:bÄ�o # é¾… 0x9f86:tiáo # 龆 0x9f87:zÄ« # 龇 0x9f88:yín,kÄ›n # 龈 0x9f89:yÇ” # 龉 0x9f8a:chuò # 龊 0x9f8b:qÇ” # 龋 0x9f8c:wò # 龌 0x9f8d:lóng,lÇ’ng # é¾� 0x9f8e:páng # 龎 0x9f8f:gÅ�ng,wò # é¾� 0x9f90:páng # é¾� 0x9f91:yÇŽn # 龑 0x9f92:lóng # é¾’ 0x9f93:lóng,lÇ’ng # 龓 0x9f94:gÅ�ng # é¾” 0x9f95:kÄ�n # 龕 0x9f96:dá # é¾– 0x9f97:líng # é¾— 0x9f98:dá # 龘 0x9f99:lóng # é¾™ 0x9f9a:gÅ�ng # 龚 0x9f9b:kÄ�n # é¾› 0x9f9c:guÄ«,jÅ«n,qiÅ« # 龜 0x9f9d:qiÅ« # é¾� 0x9f9e:biÄ“ # 龞 0x9f9f:guÄ«,jÅ«n,qiÅ« # 龟 0x9fa0:yuè # é¾  0x9fa1:chuÄ« # 龡 0x9fa2:hé # é¾¢ 0x9fa3:jiÇŽo # é¾£ 0x9fa4:xié # 龤 0x9fa5:yù # é¾¥ 0x9fc3:shÇŽn # 鿃 0xf90e:lài,là # 癩 0xfa0c:wù,wÅ« # 兀 0xfa0d:hù, huò # ï¨� 0xfa10:zhÇ’ng # ï¨� 0xfa12:qíng # 晴 0xfa15:xÄ« # 凞 0xfa16:zhÅ« # 猪 0xfa17:yì # 益 0xfa18:lÇ� # 礼 0xfa19:shén # 神 0xfa1a:xiáng # 祥 0xfa1b:fú,fù # 福 0xfa1c:jìng # 靖 0xfa1d:jÄ«ng,qíng,jìng # ï¨� 0xfa1e:yÇ” # 羽 0xfa22:zhÅ« # 諸 0xfa25:yì # 逸 0xfa26:dÅ« # 都 0xfa2a:fàn # 飯 0xfa2b:sì # 飼 0xfa2c:guÇŽn # 館 0xfa2d:hè # 鶴 dtkcore-6.7.46/src/util/util.cmake000066400000000000000000000047321522615770400170130ustar00rootroot00000000000000if(LINUX) set(UTILS_SOURCES ${CMAKE_CURRENT_LIST_DIR}/dtimeunitformatter.cpp ${CMAKE_CURRENT_LIST_DIR}/dabstractunitformatter.cpp ${CMAKE_CURRENT_LIST_DIR}/ddisksizeformatter.cpp ${CMAKE_CURRENT_LIST_DIR}/ddbussender.cpp ${CMAKE_CURRENT_LIST_DIR}/drecentmanager.cpp ${CMAKE_CURRENT_LIST_DIR}/dnotifysender.cpp ${CMAKE_CURRENT_LIST_DIR}/dpinyin.cpp ${CMAKE_CURRENT_LIST_DIR}/dexportedinterface.cpp ${CMAKE_CURRENT_LIST_DIR}/dvtablehook.cpp ${CMAKE_CURRENT_LIST_DIR}/dthreadutils.cpp ${CMAKE_CURRENT_LIST_DIR}/dtimedloop.cpp ${CMAKE_CURRENT_LIST_DIR}/dfileservices_linux.cpp ${CMAKE_CURRENT_LIST_DIR}/dexportedinterface.cpp ${CMAKE_CURRENT_LIST_DIR}/ddbusinterface.cpp ${CMAKE_CURRENT_LIST_DIR}/ddbusextendedabstractinterface.cpp ${CMAKE_CURRENT_LIST_DIR}/ddbusextendedpendingcallwatcher.cpp ${CMAKE_CURRENT_LIST_DIR}/dtextencoding.cpp ${CMAKE_CURRENT_LIST_DIR}/dutil.cpp ) else() set(UTILS_SOURCES ${CMAKE_CURRENT_LIST_DIR}/dtimeunitformatter.cpp ${CMAKE_CURRENT_LIST_DIR}/dabstractunitformatter.cpp ${CMAKE_CURRENT_LIST_DIR}/ddisksizeformatter.cpp ${CMAKE_CURRENT_LIST_DIR}/ddbussender.cpp ${CMAKE_CURRENT_LIST_DIR}/drecentmanager.cpp ${CMAKE_CURRENT_LIST_DIR}/dnotifysender.cpp ${CMAKE_CURRENT_LIST_DIR}/dpinyin.cpp ${CMAKE_CURRENT_LIST_DIR}/dexportedinterface.cpp ${CMAKE_CURRENT_LIST_DIR}/dvtablehook.cpp ${CMAKE_CURRENT_LIST_DIR}/dthreadutils.cpp ${CMAKE_CURRENT_LIST_DIR}/dtimedloop.cpp ${CMAKE_CURRENT_LIST_DIR}/dfileservices_dummy.cpp ${CMAKE_CURRENT_LIST_DIR}/dexportedinterface.cpp ${CMAKE_CURRENT_LIST_DIR}/ddbusinterface.cpp ${CMAKE_CURRENT_LIST_DIR}/ddbusextendedabstractinterface.cpp ${CMAKE_CURRENT_LIST_DIR}/ddbusextendedpendingcallwatcher.cpp ${CMAKE_CURRENT_LIST_DIR}/dtextencoding.cpp ${CMAKE_CURRENT_LIST_DIR}/dutil.cpp ) endif() file(GLOB UTILS_HEADERS ${PROJECT_SOURCE_DIR}/include/util/*.h ) set(PRIVATE_HEADERS ${CMAKE_CURRENT_LIST_DIR}/ddbusinterface_p.h ${CMAKE_CURRENT_LIST_DIR}/ddbusextendedpendingcallwatcher_p.h) if(NOT DTK5) list(REMOVE_ITEM UTILS_SOURCES "${CMAKE_CURRENT_LIST_DIR}/dtimedloop.cpp") list(REMOVE_ITEM UTILS_HEADERS "${PROJECT_SOURCE_DIR}/include/util/dtimedloop.h") # no longer be used list(REMOVE_ITEM UTILS_HEADERS "${PROJECT_SOURCE_DIR}/include/util/dasync.h") endif() set(utils_SRC ${UTILS_HEADERS} ${PRIVATE_HEADERS} ${UTILS_SOURCES} ${CMAKE_CURRENT_LIST_DIR}/util.qrc ) dtkcore-6.7.46/src/util/util.qrc000066400000000000000000000001541522615770400165120ustar00rootroot00000000000000 resources/dpinyin.dict dtkcore-6.7.46/tests/000077500000000000000000000000001522615770400144245ustar00rootroot00000000000000dtkcore-6.7.46/tests/CMakeLists.txt000066400000000000000000000062201522615770400171640ustar00rootroot00000000000000# 方便 test 脚本中调用 set(BIN_NAME "ut-DtkCore") set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) # dbus set(CMAKE_CXX_FLAGS "-fno-access-control") if (CMAKE_BUILD_TYPE STREQUAL "Debug") add_compile_options(-fsanitize=address) add_link_options(-fsanitize=address) endif() find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Gui) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core) if(LINUX) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS DBus) find_package(PkgConfig REQUIRED) if("${QT_VERSION_MAJOR}" STREQUAL "5") pkg_check_modules(QGSettings REQUIRED IMPORTED_TARGET gsettings-qt) elseif(${QT_VERSION_MAJOR} EQUAL 6) if(${Qt6Core_VERSION} VERSION_GREATER_EQUAL 6.10.0) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS CorePrivate) endif() else() message(FATAL_ERROR "Unsupported Qt version: ${QT_VERSION_MAJOR}") endif() endif() find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Xml) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Concurrent) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Test) find_package(GTest REQUIRED) include(GoogleTest) # for test.so set(TEST_SO_NAME vtabletest${DTK_NAME_SUFFIX}) add_subdirectory(./testso) # test file(GLOB TEST_HEADER ut_.*h) file(GLOB TEST_SOURCE *.cpp) file(GLOB FackDBus "./fakedbus/*.h" "./fakedbus/*.cpp" ) if(NOT DTK5) list(REMOVE_ITEM TEST_SOURCE "${CMAKE_CURRENT_LIST_DIR}/ut_gsettingsbackend.cpp") list(REMOVE_ITEM TEST_SOURCE "${CMAKE_CURRENT_LIST_DIR}/ut_dasync.cpp") endif() set(test_SRC ${TEST_HEADER} ${TEST_SOURCE} ${FackDBus} ) # end test add_executable(${BIN_NAME} ${test_SRC} ./data.qrc ) target_compile_definitions(${BIN_NAME} PUBLIC PREFIX="${DSG_PREFIX_PATH}" DSYSINFO_PREFIX="${DSYSINFO_PREFIX}" ) add_dependencies(${BIN_NAME} ${TEST_SO_NAME}) target_link_libraries( ${BIN_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::Gui Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::CorePrivate Qt${QT_VERSION_MAJOR}::Xml Qt${QT_VERSION_MAJOR}::Concurrent Qt${QT_VERSION_MAJOR}::Test ${GTEST_LIBRARIES} ${LIB_NAME} -l${TEST_SO_NAME} ) if(LINUX) if(${QT_VERSION_MAJOR} STREQUAL "5") target_link_libraries( ${BIN_NAME} PRIVATE PkgConfig::QGSettings ) endif() target_link_libraries( ${BIN_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::DBus -lpthread -lm -lgcov -ldl ) endif() #end LINUX target_link_directories(${BIN_NAME} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/testso/) target_include_directories( ${BIN_NAME} PUBLIC ../include/util/ ../include/dci/ ../include/log/ ../include/base/ ../include/base/private/ ../include/global/ ../include/DtkCore/ ../include/settings/ ../include/filesystem/ ../include/ ../src/log/ ./testso/ ) # Set RPATH to find libvtabletest*.so in the build directory set_target_properties(${BIN_NAME} PROPERTIES SKIP_BUILD_RPATH FALSE ) gtest_discover_tests(${BIN_NAME}) dtkcore-6.7.46/tests/data.qrc000066400000000000000000000017061522615770400160500ustar00rootroot00000000000000 data/dt-settings.json data/dconf-example.meta.json data/dconf-example.override.json data/dconf-override/dconf-example.override.a.json data/dconf-override/dconf-example.override.a.b.json data/dconf-global.meta.json data/dconf-global.override.json data/dconf-example_other_app_configure.meta.json data/LGPLv3.txt data/example-license.json data/dconf-example.override.noexistitem.json data/dconf-serial-test.meta.json data/dconf-serial-test.override.json data/dconfig2cpp/basic-types.meta.json data/dconfig2cpp/numeric-types.meta.json data/dconfig2cpp/complex-types.meta.json dtkcore-6.7.46/tests/data/000077500000000000000000000000001522615770400153355ustar00rootroot00000000000000dtkcore-6.7.46/tests/data/LGPLv3.txt000066400000000000000000000167171522615770400171210ustar00rootroot00000000000000GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. dtkcore-6.7.46/tests/data/dconf-example.meta.json000077500000000000000000000065301522615770400217060ustar00rootroot00000000000000{ "magic": "dsg.config.meta", "version": "1.0", "contents": { "canExit": { "value": true, "serial": 0, "flags": ["global"], "name": "I am name", "name[zh_CN]": "我是å��å­—", "description": "I am description", "permissions": "readwrite", "visibility": "private" }, "key2": { "value": "125", "serial": 0, "flags": ["nooverride"], "name": "I am name", "name[zh_CN]": "我是å��å­—", "description": "I am description", "permissions": "readwrite", "visibility": "public" }, "key3": { "value": "application", "serial": 0, "flags": ["global"], "name": "I am name", "name[zh_CN]": "我是å��å­—", "description": "I am description", "permissions": "readwrite", "visibility": "public" }, "number": { "value": 1, "serial": 0, "flags": ["global"], "name": "array value type", "permissions": "readwrite", "visibility": "public" }, "numberDouble": { "value": 1.0, "serial": 0, "flags": ["global"], "name": "double value type", "permissions": "readwrite", "visibility": "public" }, "array": { "value": ["value1", "value2"], "serial": 0, "flags": ["global"], "name": "array value type", "permissions": "readwrite", "visibility": "public" }, "array_map": { "value": [{"key1": "value1", "key2": "value2"}], "serial": 0, "flags": ["global"], "name": "array value type", "permissions": "readwrite", "visibility": "public" }, "array_map_struct": { "value": [{"key1": {"field1": "value1"}, "key2": "value2"}], "serial": 0, "flags": ["global"], "name": "array value type", "permissions": "readwrite", "visibility": "public" }, "map": { "value": {"key1": "value1", "key2": "value2"}, "serial": 0, "flags": ["global"], "name": "array value type", "permissions": "readwrite", "visibility": "public" }, "map_array": { "value": {"key1": ["value1"], "key2": ["value2"]}, "serial": 0, "flags": ["global"], "name": "array value type", "permissions": "readwrite", "visibility": "public" }, "struct": { "value": {"key1": "value1", "key2": "value2"}, "serial": 0, "flags": ["global"], "name": "array value type", "permissions": "readwrite", "visibility": "public" }, "publicConfig": { "value": true, "serial": 0, "flags": ["user-public"], "name": "public configure", "name[zh_CN]": "我是公开的é…�ç½®", "description": "I am public configure", "permissions": "readwrite", "visibility": "private" }, "readwrite": { "value": true, "serial": 0, "flags": [], "name": "readwrite configure", "name[zh_CN]": "我是å�¯è¯»å†™é…�ç½®", "description": "I am a readwrite configure", "permissions": "readwrite", "visibility": "private" }, "readonly": { "value": true, "serial": 0, "flags": [], "name": "readonly configure", "name[zh_CN]": "我是å�ªè¯»é…�ç½®", "description": "I am a readonly configure", "permissions": "readonly", "visibility": "private" } } } dtkcore-6.7.46/tests/data/dconf-example.override.json000066400000000000000000000002611522615770400225670ustar00rootroot00000000000000{ "magic": "dsg.config.override", "version": "1.0", "contents": { "key3": { "value": "override", "serial": 0, "permissions": "readwrite" } } } dtkcore-6.7.46/tests/data/dconf-example.override.noexistitem.json000066400000000000000000000002701522615770400251360ustar00rootroot00000000000000{ "magic": "dsg.config.override", "version": "1.0", "contents": { "noexistitem": { "value": "override", "serial": 0, "permissions": "readwrite" } } } dtkcore-6.7.46/tests/data/dconf-example_other_app_configure.meta.json000077500000000000000000000011351522615770400260040ustar00rootroot00000000000000{ "magic": "dsg.config.meta", "version": "1.0", "contents": { "appPublic": { "value": "publicValue", "serial": 0, "flags": ["global"], "name": "I am a public field for all application", "description": "I am description", "permissions": "readwrite", "visibility": "private" }, "appPrivate": { "value": "appPrivate", "serial": 0, "flags": ["nooverride"], "name": "I am a private field for the application", "description": "I am description", "permissions": "readwrite", "visibility": "public" } } } dtkcore-6.7.46/tests/data/dconf-global.meta.json000077500000000000000000000005151522615770400215100ustar00rootroot00000000000000{ "magic": "dsg.config.meta", "version": "1.0", "contents": { "key3": { "value": "global", "serial": 0, "flags": ["global"], "name": "I am name", "name[zh_CN]": "我是å��å­—", "description": "I am description", "permissions": "readwrite", "visibility": "public" } } } dtkcore-6.7.46/tests/data/dconf-global.override.json000077500000000000000000000002571522615770400224040ustar00rootroot00000000000000{ "magic": "dsg.config.override", "version": "1.0", "contents": { "key3": { "value": "global", "serial": 0, "permissions": "readwrite" } } } dtkcore-6.7.46/tests/data/dconf-override/000077500000000000000000000000001522615770400202435ustar00rootroot00000000000000dtkcore-6.7.46/tests/data/dconf-override/dconf-example.override.a.b.json000077500000000000000000000002641522615770400261420ustar00rootroot00000000000000{ "magic": "dsg.config.override", "version": "1.0", "contents": { "key3": { "value": "override /a/b", "serial": 0, "permissions": "readwrite" } } } dtkcore-6.7.46/tests/data/dconf-override/dconf-example.override.a.json000077500000000000000000000002641522615770400257220ustar00rootroot00000000000000{ "magic": "dsg.config.override", "version": "1.0", "contents": { "key3": { "value": "override /a", "serial": 0, "permissions": "readwrite" } } } dtkcore-6.7.46/tests/data/dconf-serial-test.meta.json000066400000000000000000000004211522615770400224750ustar00rootroot00000000000000{ "magic": "dsg.config.meta", "version": "1.0", "contents": { "testKey": { "value": "initial", "serial": 0, "flags": [], "name": "test key for serial comparison", "permissions": "readwrite", "visibility": "private" } } } dtkcore-6.7.46/tests/data/dconf-serial-test.override.json000066400000000000000000000002211522615770400233640ustar00rootroot00000000000000{ "magic": "dsg.config.override", "version": "1.0", "contents": { "testKey": { "value": "initial", "serial": 1 } } } dtkcore-6.7.46/tests/data/dconfig2cpp/000077500000000000000000000000001522615770400175335ustar00rootroot00000000000000dtkcore-6.7.46/tests/data/dconfig2cpp/basic-types.meta.json000066400000000000000000000037651522615770400236110ustar00rootroot00000000000000{ "magic": "dsg.config.meta", "version": "1.0", "contents": { "booleanTrue": { "value": true, "serial": 0, "flags": ["global"], "name": "Boolean true value", "permissions": "readwrite", "visibility": "public" }, "booleanFalse": { "value": false, "serial": 0, "flags": ["global"], "name": "Boolean false value", "permissions": "readwrite", "visibility": "public" }, "stringValue": { "value": "hello world", "serial": 0, "flags": ["global"], "name": "String value", "permissions": "readwrite", "visibility": "public" }, "emptyString": { "value": "", "serial": 0, "flags": ["global"], "name": "Empty string value", "permissions": "readwrite", "visibility": "public" }, "integerPositive": { "value": 42, "serial": 0, "flags": ["global"], "name": "Positive integer", "permissions": "readwrite", "visibility": "public" }, "integerNegative": { "value": -10, "serial": 0, "flags": ["global"], "name": "Negative integer", "permissions": "readwrite", "visibility": "public" }, "integerZero": { "value": 0, "serial": 0, "flags": ["global"], "name": "Zero integer", "permissions": "readwrite", "visibility": "public" }, "doubleValue": { "value": 3.14, "serial": 0, "flags": ["global"], "name": "Double value with decimal", "permissions": "readwrite", "visibility": "public" }, "doubleZero": { "value": 0.0, "serial": 0, "flags": ["global"], "name": "Double zero with decimal point", "permissions": "readwrite", "visibility": "public" }, "scientificValue": { "value": 1.5e3, "serial": 0, "flags": ["global"], "name": "Scientific notation value", "permissions": "readwrite", "visibility": "public" } } }dtkcore-6.7.46/tests/data/dconfig2cpp/complex-types.meta.json000066400000000000000000000021001522615770400241550ustar00rootroot00000000000000{ "magic": "dsg.config.meta", "version": "1.0", "contents": { "emptyArray": { "value": [], "serial": 0, "flags": ["global"], "name": "Empty array", "permissions": "readwrite", "visibility": "public" }, "stringArray": { "value": ["item1", "item2", "item3"], "serial": 0, "flags": ["global"], "name": "String array", "permissions": "readwrite", "visibility": "public" }, "mixedArray": { "value": ["string", 42, true, 3.14], "serial": 0, "flags": ["global"], "name": "Mixed type array", "permissions": "readwrite", "visibility": "public" }, "emptyObject": { "value": {}, "serial": 0, "flags": ["global"], "name": "Empty object", "permissions": "readwrite", "visibility": "public" }, "simpleObject": { "value": {"key1": "value1", "key2": "value2"}, "serial": 0, "flags": ["global"], "name": "Simple object", "permissions": "readwrite", "visibility": "public" } } }dtkcore-6.7.46/tests/data/dconfig2cpp/numeric-types.meta.json000066400000000000000000000022221522615770400241550ustar00rootroot00000000000000{ "magic": "dsg.config.meta", "version": "1.0", "contents": { "pureInteger": { "value": 123, "serial": 0, "flags": ["global"], "name": "Pure integer - should be int/qint64", "permissions": "readwrite", "visibility": "public" }, "doubleWithDecimal": { "value": 123.45, "serial": 0, "flags": ["global"], "name": "Double with decimal - should be double", "permissions": "readwrite", "visibility": "public" }, "doubleWithZeroDecimal": { "value": 123.0, "serial": 0, "flags": ["global"], "name": "Double with .0 - should be double", "permissions": "readwrite", "visibility": "public" }, "scientificNotation": { "value": 1.0e0, "serial": 0, "flags": ["global"], "name": "Scientific notation - should be double", "permissions": "readwrite", "visibility": "public" }, "largeInteger": { "value": 9223372036854775807, "serial": 0, "flags": ["global"], "name": "Large integer - should be qint64", "permissions": "readwrite", "visibility": "public" } } }dtkcore-6.7.46/tests/data/dt-settings.json000066400000000000000000000171201522615770400204760ustar00rootroot00000000000000{ "groups": [ { "key": "base", "name": "Basic settings", "groups": [ { "key": "theme", "name": "Theme", "options": [ { "key": "theme", "type": "checkpicture", "default": 0 }, { "key": "opticy", "name": "Opticy", "type": "slider", "max": 100, "min": 0, "default": 90 } ] }, { "key": "font", "name": "Font Style", "options": [ { "key": "family", "name": "Font", "type": "combobox", "default": "" }, { "key": "size", "name": "Font Size", "type": "spinbutton", "default": 12 }, { "key": "style", "name": "Font Style", "type": "buttongroup", "items": ["B","/"], "default": 0 } ] } ] }, { "key": "shortcuts", "name": "Shortcuts", "groups": [ { "key": "ternimal", "name": "Ternimal", "options": [ { "key": "copy", "name": "Copy", "type": "shortcut", "default": "Ctrl+Alt+C" }, { "key": "paste", "name": "Paste", "type": "shortcut", "default": "Ctrl+Alt+V" }, { "key": "scroll_up", "name": "Scroll Up", "type": "shortcut", "default": "Alt+." }, { "key": "scroll_down", "name": "Scroll down", "type": "shortcut", "default": "Alt+," } ] }, { "key": "workspace", "name": "Workspace", "options": [ { "key": "new_window", "name": "New Window", "type": "shortcut", "default": "Ctrl+Shitf+<" }, { "key": "next_tab", "name": "Next Tab", "type": "shortcut", "default": "Ctrl+N" }, { "key": "prev_up", "name": "Previous Tab", "type": "shortcut", "default": "Ctrl+Shitf+>" }, { "key": "close_tab", "name": "Close Tab", "type": "shortcut", "default": "Ctrl+W" } ] } ] }, { "key": "advance", "name": "Advance", "groups": [ { "key": "cursor", "name": "Cursor", "options": [ { "key": "shrap", "name": "Cursor Shrap", "type": "buttongroup", "items": ["â–ˆ","_","|"], "default": 0 }, { "key": "blink", "type": "checkbox", "text": "Cursor blink", "default": true }, { "key": "radiogroup", "name": " ", "type": "radiogroup", "items": ["Minimize to tray","Exit Deepin Music"], "default": 0 } ] }, { "key": "encoding", "name": "Default encoding", "options": [ { "key": "encoding", "name": "Encoding", "type": "combobox", "default": "utf-8" } ] }, { "key": "coustom", "name": "Coustom", "options": [ { "key": "coustom_command", "name": "Coustom Command", "type": "lineedit", "default": "" }, { "key": "coustom_directory", "name": "Coustom Directory", "type": "lineedit", "default": "" } ] }, { "key": "scroll", "name": "Scroll", "options": [ { "key": "scroll_bottom", "text": "Scroll Bottom", "type": "checkbox", "default": "" }, { "key": "scroll_line_count", "name": "Scroll line count", "type": "spinbutton", "default": 10 } ] }, { "key": "compatibility", "name": "Compatibility", "options": [ { "key": "breakspce_action", "name": "Breakspce Action", "type": "combobox", "default": "" }, { "key": "delete_action", "name": "Delete Action", "type": "combobox", "default": "" } ] } ] } ] } dtkcore-6.7.46/tests/data/example-license.json000066400000000000000000000002661522615770400213070ustar00rootroot00000000000000[ { "name": "dtk", "version": "5.6.8", "copyright": "Copyright 2023 The Uniontech Company Ltd. All rights reserved.", "license": "LGPLv3" } ] dtkcore-6.7.46/tests/fakedbus/000077500000000000000000000000001522615770400162105ustar00rootroot00000000000000dtkcore-6.7.46/tests/fakedbus/fakedbusservice.cpp000066400000000000000000000035301522615770400220620ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "fakedbusservice.h" #include #include #include FakeDBusService::FakeDBusService(QObject *parent) : QObject(parent) , m_strproperty("testDBusService") , m_objectpaths({QDBusObjectPath("/ss"), QDBusObjectPath("/bb")}) { registerService(); } FakeDBusService::~FakeDBusService() { unregisterService(); } void FakeDBusService::registerService() { QDBusConnection bus = QDBusConnection::sessionBus(); if (!bus.registerService(m_service)) { QString errorMsg = bus.lastError().message(); if (errorMsg.isEmpty()) errorMsg = "maybe it's running"; qWarning() << QString("Can't register the %1 service, %2.").arg(m_service).arg(errorMsg); } if (!bus.registerObject(m_path, this, QDBusConnection::ExportScriptableContents)) { qWarning() << QString("Can't register %1 the D-Bus object.").arg(m_path); } } void FakeDBusService::unregisterService() { QDBusConnection bus = QDBusConnection::sessionBus(); bus.unregisterObject(m_path); bus.unregisterService(m_service); } FakeDBusServiceParent::FakeDBusServiceParent(QObject *parent) : QObject(parent) { m_dDbusFakeDBusServiceInter = new DDBusInterface(FakeDBusService::get_service(), FakeDBusService::get_path(), FakeDBusService::get_interface(), QDBusConnection::sessionBus(), this); } QList FakeDBusServiceParent::objectpaths() { return qvariant_cast>(m_dDbusFakeDBusServiceInter->property("objectPaths")); } dtkcore-6.7.46/tests/fakedbus/fakedbusservice.h000066400000000000000000000034221522615770400215270ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #pragma once #include #include #include using Dtk::Core::DDBusInterface; class FakeDBusServiceParent: public QObject { Q_OBJECT public: explicit FakeDBusServiceParent(QObject *parent = nullptr); Q_PROPERTY(QList objectPaths READ objectpaths NOTIFY objectpathsChanged); QList objectpaths(); signals: void objectpathsChanged(); private: DDBusInterface *m_dDbusFakeDBusServiceInter; }; class FakeDBusService : public QObject { Q_OBJECT Q_CLASSINFO("D-Bus Interface", "org.deepin.FakeDBusService") public: explicit FakeDBusService(QObject *parent = nullptr); ~FakeDBusService(); Q_PROPERTY(QString strProperty READ strproperty WRITE setStrproperty) Q_PROPERTY(QList objectPaths READ objectpaths) static QString get_service() { return "org.deepin.FakeDBusService"; } static QString get_path() { return "/org/deepin/FakeDBusService"; } static QString get_interface() { return "org.deepin.FakeDBusService"; } public Q_SLOTS: inline QString strproperty() { return m_strproperty; } void setStrproperty(const QString &var) { if (var != m_strproperty) m_strproperty = var; } inline QList objectpaths() { return m_objectpaths; } // ExportScriptableContents Q_SCRIPTABLE QString foo() { return QString("bar"); } private: const QString m_service{"org.deepin.FakeDBusService"}; const QString m_path{"/org/deepin/FakeDBusService"}; void registerService(); void unregisterService(); QString m_strproperty; QList m_objectpaths; }; dtkcore-6.7.46/tests/main.cpp000066400000000000000000000014131522615770400160530ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "ut_dutil.h" #include #ifdef QT_DEBUG #include #endif int main(int argc, char *argv[]) { qputenv("DSG_APP_ID", "tests"); QCoreApplication app(argc, argv); app.setApplicationName("tests"); app.setOrganizationName("deepin"); #if DTK_VERSION < DTK_VERSION_CHECK(6, 0, 0, 0) DTimedLoop loop; #endif testing::InitGoogleTest(&argc, argv); int retVal = RUN_ALL_TESTS(); #ifdef QT_DEBUG __sanitizer_set_report_path("asan.log"); #endif #if DTK_VERSION < DTK_VERSION_CHECK(6, 0, 0, 0) return loop.exec(0, "main execution") + retVal; #else return 0; #endif } dtkcore-6.7.46/tests/test-recoverage.sh000077500000000000000000000017321522615770400200650ustar00rootroot00000000000000#!/bin/bash # SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. # # SPDX-License-Identifier: LGPL-3.0-or-later set -ex BUILD_DIR=`pwd`/../build/tests/ HTML_DIR=${BUILD_DIR}/html XML_DIR=${BUILD_DIR}/report export ASAN_OPTIONS="halt_on_error=0" # back to project directroy cd .. cmake -Bbuild -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/usr -DBUILD_EXAMPLES=OFF -DBUILD_DOCS=OFF -DEnableCov=ON -DDSYSINFO_PREFIX=/tmp cmake --build build -j$(nproc) cd $BUILD_DIR ./ut-DtkCore --gtest_output=xml:${XML_DIR}/report_dtkcore.xml # find *.gcda from build dir lcov -d ../ -c -o coverage_all.info lcov --remove coverage_all.info "*/tests/*" "*/usr/include*" "*build/src*" "*build-ut/src*" --output-file coverage.info cd .. genhtml -o $HTML_DIR $BUILD_DIR/coverage.info && mv ${BUILD_DIR}/html/index.html ${BUILD_DIR}/html/cov_dtkcore.html test -e ${BUILD_DIR}/asan.log* && mv ${BUILD_DIR}/asan.log* ${BUILD_DIR}/asan_dtkcore.log || touch ${BUILD_DIR}/asan.log dtkcore-6.7.46/tests/test_helper.hpp000066400000000000000000000027201522615770400174540ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #pragma once #include class EnvGuard { public: void set(const char *name, const QByteArray &value, bool mkpath = true) { m_name = name; if (m_originValue.isEmpty()) m_originValue = qgetenv(m_name); qputenv(m_name, value); if (mkpath && !QDir(value).exists()) { QDir().mkpath(value); } } void unset(const char *name) { m_name = name; m_originValue = qgetenv(m_name); qunsetenv(m_name); } void restore() { qputenv(m_name, m_originValue); } QString value() { return qgetenv(m_name); } ~EnvGuard() { if (m_name) restore(); } private: QByteArray m_originValue; const char* m_name = nullptr; }; class FileGuard { public: explicit FileGuard(const QString &fileName) : m_fileName(fileName){ } virtual ~FileGuard() { QFile::remove(m_fileName); } const QString fileName() const { return m_fileName; } private: QString m_fileName; }; class FileCopyGuard : public FileGuard { public: FileCopyGuard(const QString &source, const QString &target) : FileGuard(target) { if (!QFile::exists(QFileInfo(target).path())) QDir().mkpath(QFileInfo(target).path()); QFile::copy(source, target); } }; dtkcore-6.7.46/tests/testso/000077500000000000000000000000001522615770400157455ustar00rootroot00000000000000dtkcore-6.7.46/tests/testso/CMakeLists.txt000066400000000000000000000005441522615770400205100ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2023 Uniontech Software Technology Co.,Ltd. # # SPDX-License-Identifier: LGPL-3.0-or-later file(GLOB_RECURSE TESTSO "*.cpp" "*.h") add_compile_options(-fno-sanitize=all) add_link_options(-fno-sanitize=all) add_library(${TEST_SO_NAME} SHARED ${TESTSO}) target_link_libraries(${TEST_SO_NAME} PUBLIC Qt${QT_VERSION_MAJOR}::Core) dtkcore-6.7.46/tests/testso/testso.cpp000066400000000000000000000003551522615770400177750ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "testso.h" char TestClass::A::test(int v) { qDebug() << Q_FUNC_INFO << this << v; return 'a'; } dtkcore-6.7.46/tests/testso/testso.h000066400000000000000000000011301522615770400174320ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include namespace TestClass { // test case use multiple inheritance struct A { int aa; virtual char test(int v); virtual ~A() {} }; struct B { int bx; virtual char test(int v) { qDebug() << Q_FUNC_INFO << v; return 'b'; } virtual ~B() {} }; struct C : public A, public B { int cx; char test(int v) override { qDebug() << Q_FUNC_INFO << v; return 'c'; } }; } // namespace TestClass dtkcore-6.7.46/tests/ut_dasync.cpp000066400000000000000000000207721522615770400171310ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include #include #include "dasync.h" #include "dtimedloop.h" #include "ut_dutil.h" DCORE_USE_NAMESPACE #if 0 // 为了方便托管 std::thread 而创建的辅助类 class Thread : public QObject { std::thread *m_thread = nullptr; public: template Thread(FUNC &&func, QObject *parent = nullptr) : QObject (parent) , m_thread (new std::thread(func)) { } void detach() { m_thread->detach(); } void join() { m_thread->join(); } virtual ~Thread() { if (m_thread) { delete m_thread; m_thread = nullptr; } } }; bool gInSubFlag = true; // 全局内存托管,防止 asan 报错 QObject gRoot; template void DetachedRun(FUNC &&func) { Thread *thread = new Thread(func, &gRoot); if (!gInSubFlag) { func(); } thread->detach(); } class ut_DAsync : public testing::Test, public QObject { public: class Test : public QObject { public: Test(int in, QObject *parent = nullptr) : QObject (parent) , count (in) { } int count = 0; }; ut_DAsync() { } virtual ~ut_DAsync() {} virtual void SetUp() { task1 = new DAsync(this); // 测试 task2 在线程内部new能正常工作 task3 = new DAsync(this); // task4~task7 测试固定的API,功能大å�Œå°�异,在函数内部创建 task8 = new DAsync(this); task9 = new DAsync(this); task10 = new DAsync(this); m_loop = new DTimedLoop(this); m_loop->setTimeDump(true); } virtual void TearDown() { // 释放资æº�è¦�用 deleteLater 或者托管内存 // é�¿å…�线程ä¸�å�Œæ­¥æ—¶ç›´æŽ¥ delete 导致 asan å�¶å�‘性报使用释放掉的堆内存 } // 首先è¦�ä¿�è¯�这些ä¸�å�Œç±»åž‹çš„æ¨¡æ�¿å�‚数的声明没有编译问题 DAsync *task1 = nullptr; DAsync *task2 = nullptr; DAsync *task3 = nullptr; DAsync *task4 = nullptr; DAsync *task5 = nullptr; DAsync *task6 = nullptr; // 第一个模æ�¿å�‚数是 void 的类型的仅执行一次函数调用 DAsync *task7 = nullptr; DAsync *task8 = nullptr; DAsync *task9 = nullptr; DAsync *task10 = nullptr; // m_loop 须是 static 的,asan 会有误报 static DTimedLoop *m_loop; }; DTimedLoop *ut_DAsync::m_loop = nullptr; TEST_F(ut_DAsync, testRunInCorrectThread) { // 测试 post 中的函数一定在é�žä¸»çº¿ç¨‹å¼‚步调用 // 返回结果传到 then 中的函数在主线程中调用 task1->post([](int arg) { HAVE_FUN(ASSERT_TRUE(!D_THREAD_IN_MAIN())); return arg; })->then([&](int arg) { ASSERT_EQ(arg, 1); HAVE_FUN(ASSERT_TRUE(D_THREAD_IN_MAIN())); m_loop->exit(); })->start(); task1->postData(1); m_loop->exec("testRunInCorrectThread"); } TEST_F(ut_DAsync, testRunInSubThread) { // 和上é�¢ testRunInCorrectThread 测项类似 // task2, 测试 task 在é�žä¸»çº¿ç¨‹ä¸­ä¾�然能正确创建和è¿�行 bool startedFlag = false; DetachedRun([&]{ // 这里用托管也å�¯ä»¥çš„,但是会有警告 task2 = new DAsync(/*this*/); task2->post([](int arg) { HAVE_FUN(ASSERT_TRUE(!D_THREAD_IN_MAIN())); return arg; })->then([&](int arg) { static int i = 0; ASSERT_EQ(arg, i++); HAVE_FUN(ASSERT_TRUE(D_THREAD_IN_MAIN())); if (i > 3) m_loop->exit(); })->start(); startedFlag = true; }); DetachedRun([&]{ static int i = 0; while (true) { // è¦�自己设置 flag,因为在ä¸�å�Œçš„线程中, // 到这里 task2 还ä¸�一定已ç»�被创建完毕 if (startedFlag) { task2->postData(i++); if (i > 3) { break; } } usleep(100*1000); } }); m_loop->exec("testRunInSubThread"); } TEST_F(ut_DAsync, testMultiThreadSynchronization) { // task3, 在å­�线程中输入 0~999, 在 post 中乘以 2 输出到主线程 then 中 static int n = 1000; static int result = 0; task3->post([](int arg) -> QString { return QString("%1").arg(arg * 2); })->then([](QString arg) { static int i = 0; ASSERT_TRUE(arg == QString("%1").arg(i * 2)); i++; result = n; })->start(); DetachedRun([&] { int i = 0; while (i < n) { if (!task3->isFinished()) { task3->postData(i++); } } task3->cancelAll(); }); DetachedRun([&] { // 该线程å�¯åЍå�Žä¼šä¸€ç›´é˜»å¡žç­‰å¾…,直到 cancelAll 被调用, // 说明任务结æ�Ÿäº†ï¼Œå°±å�¯ä»¥å¾€ä¸‹èµ°ï¼Œåˆ¤æ–­æ‰§è¡Œç»“æžœ task3->waitForFinished(false); ASSERT_EQ(result, n); m_loop->exit(); }); m_loop->exec("testMultiThreadSynchronization"); } TEST_F(ut_DAsync, testOneTimeTask) { // task8, 测试一次性任务,确ä¿�两个函数å�ªä¼šè¿›æ�¥æ‰§è¡Œä¸€æ¬¡ task8->post([] { static int i = 0; return QString("testOneTimeTask%1").arg(i++); })->then([&](const QString &arg) { ASSERT_TRUE(arg == "testOneTimeTask0"); m_loop->exit(); })->start(); m_loop->exec("test task8"); // task9, 测试一次性任务,确ä¿�å�ªæœ‰ post 的函数能够被执行到 task9->post([&]{ m_loop->exit(); })->start(); // task9->startUp(); # 或者在å�ˆé€‚的时候调用 m_loop->exec("test task9"); // task10, 测试仅有 post 的任务的正确执行 task10->post([&] (int arg) { static int j = 0; ASSERT_EQ(arg, j++); if (j == 2) { m_loop->exit(); } }); task10->postData(0); task10->startUp(); task10->postData(1); m_loop->exec("test task10"); } TEST_F(ut_DAsync, testFixedApi) { // 测试这些固定的 API 能够正确处ç�†ä¸�å�Œçš„å�‚数类型 // task4 task4 = new DAsync(this); static int i = 0; while (i < 100) { task4->postData(QString::number(i++)); } task4->post([](const QString &arg) -> QString { static int j = 0; HAVE_FUN(ASSERT_TRUE(arg == QString::number(j++))); return arg; })->then([](QString arg) { static int k = 0; ASSERT_TRUE(arg == QString::number(k++)); if (k == 100) { m_loop->exit(); } })->start(); m_loop->exec("test task4"); // 和上é�¢çš„ä¸�一样的地方就是 postData 在 start å‰�å�Žéƒ½è°ƒç”¨äº† // task5 i = 0; task5 = new DAsync(this); while (i < 50) { task5->postData(new Test(i++, this)); } task5->post([](Test *arg) -> Test * { static int j = 0; HAVE_FUN(ASSERT_TRUE(arg->count == j++)); return arg; })->then([](Test *arg) { static int k = 0; HAVE_FUN(ASSERT_TRUE(arg->count == k++)); if (k == 100) { m_loop->exit(); } })->start(); while (i < 100) { task5->postData(new Test(i++, this)); } m_loop->exec("test task5"); // task6 i = 0; task6 = new DAsync(this); while (i < 50) { task6->postData(QString::number(i++)); } task6->post([](QString arg) { static int j = 0; HAVE_FUN(ASSERT_TRUE(arg == QString::number(j++))); })->then([]() { static int k = 0; k++; if (k == 100) { m_loop->exit(); } })->start(false); DetachedRun([&]{ usleep(100 * 1000); while (i < 100) { task6->postData(QString::number(i++)); } task6->startUp(); }); m_loop->exec("test task6"); // task7 task7 = new DAsync(this); task7->post([]() { static int j = 0; HAVE_FUN(ASSERT_TRUE(0 == j++)); })->then([]() { static int k = 0; HAVE_FUN(ASSERT_TRUE(0 == k++)); m_loop->exit(); })->start(); m_loop->exec("test task7"); } #endif dtkcore-6.7.46/tests/ut_dcapfile.cpp000066400000000000000000000111711522615770400174100ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "filesystem/dcapmanager.h" #include "filesystem/dcapfile.h" #include #include #include #include DCORE_USE_NAMESPACE #ifndef GTEST_SKIP #define SKIP return GTEST_SUCCEED() << "Skip all tests" #else #define SKIP GTEST_SKIP() << "Skip all tests" #endif #define TMPCAP_PATH "/tmp/cap" class ut_DCapFile : public testing::Test { protected: void SetUp() override; void TearDown() override; DCapManager *manager; QFile *file; }; void ut_DCapFile::SetUp() { manager = DCapManager::instance(); manager->removePath("/tmp"); manager->appendPath(TMPCAP_PATH); file = new QFile(nullptr); QDir dir(TMPCAP_PATH); if (!dir.exists()) ASSERT_TRUE(dir.mkdir(TMPCAP_PATH)); } void ut_DCapFile::TearDown() { manager->appendPath("/tmp"); delete file; QDir dir(TMPCAP_PATH); if (dir.exists()) ASSERT_TRUE(dir.removeRecursively()); } TEST(ut_DCapManager, paths) { auto size = DCapManager::instance()->paths().size(); EXPECT_TRUE(size > 0); DCapManager::instance()->appendPaths({"/path/to/myCap"}); EXPECT_TRUE(DCapManager::instance()->paths().contains("/path/to/myCap")); DCapManager::instance()->removePaths({"/path/to/myCap"}); EXPECT_FALSE(DCapManager::instance()->paths().contains("/path/to/myCap")); } TEST(ut_DCapFileAndDir, testDCapFileOpen) { DCapFile file("/tmp/test0"); ASSERT_TRUE(file.open(DCapFile::WriteOnly)); // Default, '/tmp' is allowable for writing. file.close(); DCapManager::instance()->removePath("/tmp"); ASSERT_FALSE(file.open(DCapFile::WriteOnly)); DCapManager::instance()->appendPath("/tmp"); } TEST(ut_DCapFileAndDir, testDCapFileOperation) { auto CheckResult = [](bool result) { DCapFile file("/tmp/test0"); ASSERT_EQ(file.open(DCapFile::WriteOnly), result); file.close(); ASSERT_EQ(file.exists(), result); ASSERT_EQ(DCapFile::exists(file.fileName()), result); ASSERT_EQ(file.remove(), result); ASSERT_EQ(file.open(DCapFile::WriteOnly), result); file.close(); ASSERT_EQ(DCapFile::remove(file.fileName()), result); ASSERT_EQ(file.open(DCapFile::WriteOnly), result); file.close(); ASSERT_EQ(file.rename("/tmp/test1"), result); ASSERT_EQ(DCapFile::rename(file.fileName(), "/tmp/test0"), result); file.setFileName("/tmp/test0"); ASSERT_EQ(file.link("/tmp/test_link0"), result); ASSERT_EQ(DCapFile::link(file.fileName(), "/tmp/test_link1"), result); ASSERT_EQ(DCapFile::remove("/tmp/test_link0"), result); ASSERT_EQ(DCapFile::remove("/tmp/test_link1"), result); file.setFileName("/tmp/test0"); ASSERT_EQ(file.copy("/tmp/test_copy0"), result); ASSERT_EQ(DCapFile::copy(file.fileName(), "/tmp/test_copy1"), result); ASSERT_EQ(DCapFile::remove("/tmp/test_copy0"), result); ASSERT_EQ(DCapFile::remove("/tmp/test_copy1"), result); ASSERT_EQ(file.resize(10), result); ASSERT_EQ(file.size() == 10, result); ASSERT_EQ(DCapFile::resize(file.fileName(), 5), result); ASSERT_EQ(file.size() == 5, result); ASSERT_EQ(file.remove(), result); }; CheckResult(true); DCapManager::instance()->removePath("/tmp"); CheckResult(false); DCapManager::instance()->appendPath("/tmp"); } TEST(ut_DCapFileAndDir, testDCapDirOperation) { DCapDir dir("/tmp"); ASSERT_TRUE(dir.exists()); ASSERT_FALSE(dir.entryList().isEmpty()); ASSERT_FALSE(dir.entryInfoList().isEmpty()); DCapFile file(dir.path() + "/test0"); ASSERT_TRUE(file.open(DCapFile::WriteOnly)); file.close(); ASSERT_TRUE(dir.exists("test0")); ASSERT_TRUE(dir.mkdir("cap")); ASSERT_TRUE(dir.exists("cap")); ASSERT_TRUE(dir.rmdir("cap")); ASSERT_FALSE(dir.exists("cap")); dir.mkdir("cap"); ASSERT_TRUE(dir.cd("cap")); ASSERT_TRUE(dir.exists()); DCapManager::instance()->removePath("/tmp"); DCapManager::instance()->appendPath(dir.path()); ASSERT_FALSE(dir.cd("..")); dir.setPath("/tmp"); ASSERT_TRUE(dir.entryList().isEmpty()); ASSERT_TRUE(dir.entryInfoList().isEmpty()); ASSERT_TRUE(dir.exists("cap")); ASSERT_FALSE(dir.remove("test0")); ASSERT_FALSE(dir.rename("test0", "test1")); ASSERT_TRUE(dir.mkpath(TMPCAP_PATH"/subdir")); ASSERT_TRUE(dir.rmpath(TMPCAP_PATH"/subdir")); DCapManager::instance()->appendPath("/tmp"); ASSERT_TRUE(dir.rename("test0", "test1")); ASSERT_TRUE(dir.remove("test1")); } dtkcore-6.7.46/tests/ut_dconfig.cpp000066400000000000000000000167031522615770400172600ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include #include #include #include #include "test_helper.hpp" #include "backend/dsettingsdconfigbackend.h" DCORE_USE_NAMESPACE static EnvGuard dsgDataDir; static constexpr char const *APP_ID = "tests"; static constexpr char const *FILE_NAME = "example"; class ut_DConfig : public testing::Test { protected: static void SetUpTestCase() { fileBackendLocalPerfix.set("DSG_DCONFIG_FILE_BACKEND_LOCAL_PREFIX", "/tmp/example"); backendType.set("DSG_DCONFIG_BACKEND_TYPE", "FileBackend"); dsgDataDir.set("DSG_DATA_DIRS", PREFIX"/share/dsg"); } static void TearDownTestCase() { QDir(fileBackendLocalPerfix.value()).removeRecursively(); fileBackendLocalPerfix.restore(); backendType.restore(); dsgDataDir.restore(); } virtual void SetUp() override {} virtual void TearDown() override; static EnvGuard backendType; static EnvGuard fileBackendLocalPerfix; QString metaFilePath = QString("%1" PREFIX"/share/dsg/configs/%2/%3.json").arg(fileBackendLocalPerfix.value(), APP_ID, FILE_NAME); QString noAppIdMetaFilePath = QString("%1" PREFIX"/share/dsg/configs/%2.json").arg(fileBackendLocalPerfix.value(), FILE_NAME); }; EnvGuard ut_DConfig::fileBackendLocalPerfix; EnvGuard ut_DConfig::backendType; void ut_DConfig::TearDown() { QDir(fileBackendLocalPerfix.value()).removeRecursively(); } TEST_F(ut_DConfig, backend) { FileCopyGuard guard(":/data/dconf-example.meta.json", metaFilePath); DConfig config(FILE_NAME); ASSERT_EQ(config.backendName(), QString("FileBackend")); } TEST_F(ut_DConfig, isValid) { FileCopyGuard guard(":/data/dconf-example.meta.json", metaFilePath); DConfig config(FILE_NAME); ASSERT_TRUE(config.isValid()); } TEST_F(ut_DConfig, value) { FileCopyGuard guard(":/data/dconf-example.meta.json", metaFilePath); const QStringList array{"1", "2"}; QVariantMap map; map.insert("key1", "value1"); map.insert("key2", "value2"); { DConfig config(FILE_NAME); config.setValue("key2", "126"); ASSERT_EQ(config.value("key2").toString(), QString("126")); config.setValue("array", array); ASSERT_EQ(config.value("array").toStringList(), array); config.setValue("map", map); ASSERT_EQ(config.value("map").toMap(), map); } { DConfig config(FILE_NAME); ASSERT_EQ(config.value("key2").toString(), QString("126")); ASSERT_EQ(config.value("array").toStringList(), array); ASSERT_EQ(config.value("map").toMap(), map); } { DConfig config(FILE_NAME); config.reset("canExit"); ASSERT_EQ(config.value("canExit").toBool(), true); config.reset("key2"); ASSERT_EQ(config.value("key2").toString(), QString("125")); config.reset("number"); ASSERT_EQ(config.value("number").toInt(), 1); config.reset("array"); const QStringList &originArray {"value1", "value2"}; ASSERT_EQ(config.value("array").toStringList(), originArray); config.reset("map"); QVariantMap originMap; originMap.insert("key1", "value1"); originMap.insert("key2", "value2"); ASSERT_EQ(config.value("map").toMap(), originMap); } } TEST_F(ut_DConfig, keyList) { FileCopyGuard guard(":/data/dconf-example.meta.json", metaFilePath); DConfig config(FILE_NAME); QStringList keyList{QString("key2"), QString("canExit")}; for (auto item : keyList) { ASSERT_TRUE(config.keyList().contains(item)); } } TEST_F(ut_DConfig, OtherAppConfigfile) { FileCopyGuard guard(":/data/dconf-example.meta.json", metaFilePath); constexpr char const *APP_OTHER = "tests_other"; FileCopyGuard gurand(":/data/dconf-example_other_app_configure.meta.json", QString("%1" PREFIX"/share/dsg/configs/%2/%3.json").arg(fileBackendLocalPerfix.value(), APP_OTHER, FILE_NAME)); QScopedPointer config(DConfig::create(APP_OTHER, FILE_NAME)); ASSERT_TRUE(config->isValid()); ASSERT_EQ(config->value("appPublic").toString(), QString("publicValue")); } TEST_F(ut_DConfig, appIdWriteConfig) { FileCopyGuard guard(":/data/dconf-example.meta.json", noAppIdMetaFilePath); { // 内部会传递appid,强制appidä¸�为空 DConfig config(FILE_NAME); config.setValue("key2", "user-with-appid"); ASSERT_EQ(config.value("key2"), "user-with-appid"); } { // appid为公共id QScopedPointer config(DConfig::createGeneric(FILE_NAME)); ASSERT_TRUE(config->isValid()); ASSERT_EQ(config->value("key2").toString(), QString("125")); } { // 传递appid QScopedPointer config(DConfig::create(APP_ID, FILE_NAME)); ASSERT_TRUE(config->isValid()); ASSERT_EQ(config->value("key2").toString(), "user-with-appid"); } } TEST_F(ut_DConfig, noAppidWirteConfig) { FileCopyGuard guard(":/data/dconf-example.meta.json", noAppIdMetaFilePath); FileCopyGuard guard2(":/data/dconf-example.meta.json", metaFilePath); { // 内部会传递appid,强制appidä¸�为公共id QScopedPointer config(DConfig::createGeneric(FILE_NAME)); ASSERT_TRUE(config->isValid()); config->setValue("key2", "user-with-no-appid"); ASSERT_EQ(config->value("key2"), "user-with-no-appid"); } { // appid为公共id,获å�–公共id的值 QScopedPointer config(DConfig::createGeneric(FILE_NAME)); ASSERT_EQ(config->value("key2"), "user-with-no-appid"); } { // 传递appid,fallback到公共id的值 QScopedPointer config(DConfig::create(APP_ID, FILE_NAME)); ASSERT_EQ(config->value("key2"), "user-with-no-appid"); } } TEST_F(ut_DConfig, DSettingsDConfigBackend) { FileCopyGuard guard(":/data/dconf-example.meta.json", metaFilePath); { DSettingsDConfigBackend backend(FILE_NAME); QStringList keyList{ QString("key2"), QString("canExit") }; for (auto item : keyList) { ASSERT_TRUE(backend.keys().contains(item)); } } { DSettingsDConfigBackend backend(FILE_NAME); ASSERT_EQ(backend.getOption("key2").toString(), QString("125")); } { DConfig config(FILE_NAME); config.setValue("key2", "126"); // save cache file } { // reload cache file DSettingsDConfigBackend backend(FILE_NAME); ASSERT_EQ(backend.getOption("key2").toString(), QString("126")); } } TEST_F(ut_DConfig, isDefaultValue) { FileCopyGuard guard(":/data/dconf-example.meta.json", metaFilePath); { DConfig config(FILE_NAME); ASSERT_EQ(config.isDefaultValue("key2"), true); } { DConfig config(FILE_NAME); config.setValue("key2", "126"); EXPECT_EQ(config.isDefaultValue("key2"), false); } { DConfig config(FILE_NAME); config.setValue("key2", "126"); config.reset("key2"); EXPECT_EQ(config.isDefaultValue("key2"), true); } } TEST_F(ut_DConfig, isReadOnly) { FileCopyGuard guard(":/data/dconf-example.meta.json", metaFilePath); { DConfig config(FILE_NAME); EXPECT_TRUE(config.isValid()); ASSERT_EQ(config.isReadOnly("readwrite"), false); EXPECT_EQ(config.isReadOnly("readonly"), true); } } dtkcore-6.7.46/tests/ut_dconfig2cpp.cpp000066400000000000000000000227351522615770400200470ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include #include #include #include #include #include #include #include #include #include #include class ut_dconfig2cpp : public testing::Test { protected: void SetUp() override { tempDir = new QTemporaryDir(); ASSERT_TRUE(tempDir->isValid()); } void TearDown() override { delete tempDir; tempDir = nullptr; } // Get dconfig2cpp tool path QString getToolPath() const { QStringList possiblePaths = { "../tools/dconfig2cpp/dconfig2cpp", "../../tools/dconfig2cpp/dconfig2cpp", "./tools/dconfig2cpp/dconfig2cpp", "tools/dconfig2cpp/dconfig2cpp" }; for (const QString &path : possiblePaths) { const auto programPath = QCoreApplication::applicationDirPath() + "/" + path; if (QFile::exists(programPath)) { return programPath; } } return "dconfig2cpp"; // Assume it's in PATH } // Call dconfig2cpp to generate code struct GenerationResult { bool success; QString generatedFilePath; QString errorMessage; int exitCode; }; GenerationResult generateCode(const QString& jsonFilePath) { GenerationResult result; result.success = false; result.exitCode = -1; // If it's a QRC path, copy to temporary directory first QString actualJsonPath = jsonFilePath; if (jsonFilePath.startsWith(":/")) { QFile sourceFile(jsonFilePath); if (!sourceFile.open(QIODevice::ReadOnly)) { result.errorMessage = QString("Failed to open resource file: %1").arg(jsonFilePath); return result; } QFileInfo fileInfo(jsonFilePath); QString tempJsonPath = tempDir->path() + "/" + fileInfo.fileName(); QFile tempFile(tempJsonPath); if (!tempFile.open(QIODevice::WriteOnly)) { result.errorMessage = QString("Failed to create temp file: %1").arg(tempJsonPath); return result; } tempFile.write(sourceFile.readAll()); tempFile.close(); sourceFile.close(); actualJsonPath = tempJsonPath; } if (!QFile::exists(actualJsonPath)) { result.errorMessage = QString("Input JSON file does not exist: %1").arg(actualJsonPath); return result; } QString toolPath = getToolPath(); QProcess process; QFileInfo fileInfo(actualJsonPath); QString baseName = fileInfo.completeBaseName().replace('.', '_').replace('-', '_'); result.generatedFilePath = tempDir->path() + "/" + baseName + ".hpp"; QStringList arguments; arguments << "-o" << result.generatedFilePath << actualJsonPath; process.start(toolPath, arguments); if (!process.waitForStarted(5000)) { result.errorMessage = QString("Failed to start dconfig2cpp tool: %1").arg(process.errorString()); return result; } if (!process.waitForFinished(10000)) { result.errorMessage = "dconfig2cpp tool execution timeout"; process.kill(); return result; } result.exitCode = process.exitCode(); if (result.exitCode == 0) { result.success = true; if (!QFile::exists(result.generatedFilePath)) { result.success = false; result.errorMessage = QString("Generated file not found: %1").arg(result.generatedFilePath); } } else { result.errorMessage = QString("dconfig2cpp failed with exit code %1. Error: %2") .arg(result.exitCode) .arg(QString::fromUtf8(process.readAllStandardError())); } return result; } QTemporaryDir *tempDir; }; TEST_F(ut_dconfig2cpp, BasicTypesGeneration) { QString testFile = ":/data/dconfig2cpp/basic-types.meta.json"; // If resource file doesn't exist, use filesystem path if (!QFile::exists(testFile)) { testFile = "./data/dconfig2cpp/basic-types.meta.json"; } ASSERT_TRUE(QFile::exists(testFile)) << "Test data file not found: " << testFile.toStdString(); auto result = generateCode(testFile); ASSERT_TRUE(result.success) << result.errorMessage.toStdString(); ASSERT_TRUE(QFile::exists(result.generatedFilePath)); } TEST_F(ut_dconfig2cpp, BasicTypesPropertyValidation) { QString testFile = ":/data/dconfig2cpp/basic-types.meta.json"; if (!QFile::exists(testFile)) { testFile = "./data/dconfig2cpp/basic-types.meta.json"; } ASSERT_TRUE(QFile::exists(testFile)); auto result = generateCode(testFile); ASSERT_TRUE(result.success) << result.errorMessage.toStdString(); // Read generated header file content QFile generatedFile(result.generatedFilePath); ASSERT_TRUE(generatedFile.open(QIODevice::ReadOnly | QIODevice::Text)); QString generatedContent = generatedFile.readAll(); generatedFile.close(); // Expected Q_PROPERTY declarations QStringList expectedProperties = { "Q_PROPERTY(bool booleanTrue READ booleanTrue WRITE setBooleanTrue", "Q_PROPERTY(bool booleanFalse READ booleanFalse WRITE setBooleanFalse", "Q_PROPERTY(QString stringValue READ stringValue WRITE setStringValue", "Q_PROPERTY(QString emptyString READ emptyString WRITE setEmptyString", "Q_PROPERTY(qlonglong integerPositive READ integerPositive WRITE setIntegerPositive", "Q_PROPERTY(qlonglong integerNegative READ integerNegative WRITE setIntegerNegative", "Q_PROPERTY(qlonglong integerZero READ integerZero WRITE setIntegerZero", "Q_PROPERTY(double doubleValue READ doubleValue WRITE setDoubleValue", "Q_PROPERTY(double doubleZero READ doubleZero WRITE setDoubleZero", "Q_PROPERTY(double scientificValue READ scientificValue WRITE setScientificValue" }; // Verify each expected Q_PROPERTY exists for (const QString &expectedProperty : expectedProperties) { EXPECT_TRUE(generatedContent.contains(expectedProperty)) << "Expected property not found: " << expectedProperty.toStdString(); } } TEST_F(ut_dconfig2cpp, NumericTypesDetection) { QString testFile = ":/data/dconfig2cpp/numeric-types.meta.json"; if (!QFile::exists(testFile)) { testFile = "./data/dconfig2cpp/numeric-types.meta.json"; } ASSERT_TRUE(QFile::exists(testFile)); auto result = generateCode(testFile); ASSERT_TRUE(result.success) << result.errorMessage.toStdString(); // Read generated header file content QFile generatedFile(result.generatedFilePath); ASSERT_TRUE(generatedFile.open(QIODevice::ReadOnly | QIODevice::Text)); QString generatedContent = generatedFile.readAll(); generatedFile.close(); // Expected Q_PROPERTY declarations - based on numeric type detection rules QStringList expectedProperties = { "Q_PROPERTY(qlonglong pureInteger READ pureInteger WRITE setPureInteger", // Pure integer -> qlonglong "Q_PROPERTY(double doubleWithDecimal READ doubleWithDecimal WRITE setDoubleWithDecimal", // Decimal -> double "Q_PROPERTY(double doubleWithZeroDecimal READ doubleWithZeroDecimal WRITE setDoubleWithZeroDecimal", // .0 -> double "Q_PROPERTY(double scientificNotation READ scientificNotation WRITE setScientificNotation", // Scientific notation -> double "Q_PROPERTY(qlonglong largeInteger READ largeInteger WRITE setLargeInteger" // Large integer -> qlonglong }; // Verify each expected Q_PROPERTY exists for (const QString &expectedProperty : expectedProperties) { EXPECT_TRUE(generatedContent.contains(expectedProperty)) << "Expected property not found: " << expectedProperty.toStdString(); } } TEST_F(ut_dconfig2cpp, ComplexTypesGeneration) { QString testFile = ":/data/dconfig2cpp/complex-types.meta.json"; if (!QFile::exists(testFile)) { testFile = "./data/dconfig2cpp/complex-types.meta.json"; } ASSERT_TRUE(QFile::exists(testFile)); auto result = generateCode(testFile); ASSERT_TRUE(result.success) << result.errorMessage.toStdString(); // Read generated header file content QFile generatedFile(result.generatedFilePath); ASSERT_TRUE(generatedFile.open(QIODevice::ReadOnly | QIODevice::Text)); QString generatedContent = generatedFile.readAll(); generatedFile.close(); // Expected Q_PROPERTY declarations - complex types QStringList expectedProperties = { "Q_PROPERTY(QList emptyArray READ emptyArray WRITE setEmptyArray", "Q_PROPERTY(QList stringArray READ stringArray WRITE setStringArray", "Q_PROPERTY(QList mixedArray READ mixedArray WRITE setMixedArray", "Q_PROPERTY(QVariantMap emptyObject READ emptyObject WRITE setEmptyObject", "Q_PROPERTY(QVariantMap simpleObject READ simpleObject WRITE setSimpleObject" }; // Verify each expected Q_PROPERTY exists for (const QString &expectedProperty : expectedProperties) { EXPECT_TRUE(generatedContent.contains(expectedProperty)) << "Expected property not found: " << expectedProperty.toStdString(); } } dtkcore-6.7.46/tests/ut_dconfig2cpp_dconfig_org_deepin_dtk_preference.cpp000066400000000000000000000233041522615770400267640ustar00rootroot00000000000000// Copyright (C) 2026 UnionTech Software Technology Co., Ltd. // SPDX-License-Identifier: LGPL-3.0-or-later // Test: dconfig_org_deepin_dtk_preference crash stability // This test verifies the thread-safe generated DConfig class handles: // 1. Immediate destruction during initialization // 2. Destruction after successful initialization // 3. Destruction during active initialization (race condition) // 4. Signal thread affinity and correctness // 5. Property change operations under stress // 6. Concurrent config instances #include #include #include #include #include #include #include #include #include #include // Include the generated DConfig class #include "dconfig_org_deepin_dtk_preference.hpp" class ut_dconfig_org_deepin_dtk_preference : public testing::Test { protected: // Test configuration constants - reduced for faster execution static constexpr int IMMEDIATE_DESTROY_CYCLES = 10; static constexpr int POST_INIT_DESTROY_CYCLES = 5; static constexpr int MID_INIT_DESTROY_CYCLES = 20; static constexpr int PROPERTY_CHANGE_CYCLES = 5; static constexpr int RAPID_CHANGE_CYCLES = 3; static constexpr int CONCURRENT_CONFIG_CYCLES = 3; static constexpr int INIT_TIMEOUT_MS = 2000; // Total timeout for initialization static constexpr const char *DSG_CONFIG_SERVICE = "org.desktopspec.ConfigManager"; // Static flag to track if DConfig service is available static bool s_dConfigAvailable; // Helper to create config dconfig_org_deepin_dtk_preference *createConfig() { return dconfig_org_deepin_dtk_preference::create( QStringLiteral("org.deepin.dtk.preference"), QStringLiteral("/test")); } // Check if DConfig service is available using DBus static bool isDConfigServiceAvailable() { // Check if service is registered if (!QDBusConnection::systemBus().interface()->isServiceRegistered(DSG_CONFIG_SERVICE)) { return false; } // Check if service is activatable (similar to DConfig::isServiceActivatable) const QDBusReply activatableNames = QDBusConnection::systemBus().interface()->callWithArgumentList( QDBus::AutoDetect, QLatin1String("ListActivatableNames"), QList()); return activatableNames.isValid() && activatableNames.value().contains(DSG_CONFIG_SERVICE); } static void SetUpTestSuite() { // Quick check using DBus instead of creating actual config s_dConfigAvailable = isDConfigServiceAvailable(); } }; // Static member initialization bool ut_dconfig_org_deepin_dtk_preference::s_dConfigAvailable = false; // Test 1: Simple creation and immediate deletion TEST_F(ut_dconfig_org_deepin_dtk_preference, test_immediate_destroy) { if (!s_dConfigAvailable) { GTEST_SKIP() << "DConfig service not available on this system"; } for (int cycle = 0; cycle < IMMEDIATE_DESTROY_CYCLES; ++cycle) { auto config = createConfig(); // Delete immediately without waiting for initialization delete config; QCoreApplication::processEvents(); } } // Test 2: Destroy after signal connection is established TEST_F(ut_dconfig_org_deepin_dtk_preference, test_destroy_after_initialization) { if (!s_dConfigAvailable) { GTEST_SKIP() << "DConfig service not available on this system"; } for (int cycle = 0; cycle < POST_INIT_DESTROY_CYCLES; ++cycle) { auto config = createConfig(); // Wait for initialization bool initialized = QTest::qWaitFor([config]() { return config->isInitializeSucceeded(); }, INIT_TIMEOUT_MS); if (initialized) { auto dconfig = config->config(); EXPECT_TRUE(dconfig->isValid()) << "DConfig is not valid in cycle " << cycle; } delete config; } } // Test 3: Destroy DURING initialization (mid-initialization race condition) TEST_F(ut_dconfig_org_deepin_dtk_preference, test_destroy_during_initialization) { if (!s_dConfigAvailable) { GTEST_SKIP() << "DConfig service not available on this system"; } for (int cycle = 0; cycle < MID_INIT_DESTROY_CYCLES; ++cycle) { auto config = createConfig(); // Delete after a very short delay to hit the initialization window int delayMicros = (cycle % 10) * 100; // 0-900 microseconds if (delayMicros > 0) { QCoreApplication::processEvents(); QThread::usleep(delayMicros); } delete config; QCoreApplication::processEvents(); } } // Test 4: Verify signal thread affinity TEST_F(ut_dconfig_org_deepin_dtk_preference, test_signal_thread_affinity) { if (!s_dConfigAvailable) { GTEST_SKIP() << "DConfig service not available on this system"; } auto config = createConfig(); QThread *mainThread = QThread::currentThread(); QThread *signalThread = nullptr; QSignalSpy spyAutoDisplay(config, &dconfig_org_deepin_dtk_preference::autoDisplayFeatureChanged); // Connect to verify thread affinity QObject::connect(config, &dconfig_org_deepin_dtk_preference::autoDisplayFeatureChanged, qApp, [&]() { signalThread = QThread::currentThread(); }, Qt::DirectConnection); // Wait for initialization ASSERT_TRUE(QTest::qWaitFor([config]() { return config->isInitializeSucceeded(); }, INIT_TIMEOUT_MS)) << "Config failed to initialize"; auto dconfig = config->config(); ASSERT_TRUE(dconfig->isValid()) << "DConfig is not valid"; // Trigger property change bool currentValue = config->autoDisplayFeature(); config->setAutoDisplayFeature(!currentValue); // Wait for signal using QSignalSpy EXPECT_EQ(spyAutoDisplay.count(), 1) << "autoDisplayFeatureChanged signal not emitted"; EXPECT_EQ(signalThread, mainThread) << "Signal emitted in wrong thread"; delete config; } // Test 5: Trigger property change then destroy TEST_F(ut_dconfig_org_deepin_dtk_preference, test_property_change_then_destroy) { if (!s_dConfigAvailable) { GTEST_SKIP() << "DConfig service not available on this system"; } for (int cycle = 0; cycle < PROPERTY_CHANGE_CYCLES; ++cycle) { auto config = createConfig(); if (!QTest::qWaitFor([config]() { return config->isInitializeSucceeded(); }, INIT_TIMEOUT_MS)) { delete config; continue; } auto dconfig = config->config(); EXPECT_TRUE(dconfig->isValid()) << "DConfig is not valid in cycle " << cycle; // Change a property and immediately delete config->setColorMode(QString("test_theme_%1").arg(cycle)); delete config; } } // Test 6: Rapid property changes then destroy TEST_F(ut_dconfig_org_deepin_dtk_preference, test_rapid_changes_then_destroy) { if (!s_dConfigAvailable) { GTEST_SKIP() << "DConfig service not available on this system"; } for (int cycle = 0; cycle < RAPID_CHANGE_CYCLES; ++cycle) { auto config = createConfig(); if (!QTest::qWaitFor([config]() { return config->isInitializeSucceeded(); }, INIT_TIMEOUT_MS)) { delete config; continue; } auto dconfig = config->config(); EXPECT_TRUE(dconfig->isValid()) << "DConfig is not valid in cycle " << cycle; // Rapidly change multiple properties for (int j = 0; j < 5; ++j) { config->setColorMode(QString("theme_%1").arg(j)); config->setDefaultColorMode(QString("color_%1").arg(j)); QTest::qWait(1); } delete config; } } // Test 7: Concurrent multiple configs TEST_F(ut_dconfig_org_deepin_dtk_preference, test_concurrent_configs) { if (!s_dConfigAvailable) { GTEST_SKIP() << "DConfig service not available on this system"; } for (int cycle = 0; cycle < CONCURRENT_CONFIG_CYCLES; ++cycle) { QList configs; // Create multiple configs at once for (int i = 0; i < 3; ++i) { auto config = createConfig(); configs.append(config); } // Wait for all to initialize for (auto config : configs) { EXPECT_TRUE(QTest::qWaitFor([config]() { return config->isInitializeSucceeded(); }, INIT_TIMEOUT_MS)); } // Clean up all configs qDeleteAll(configs); } } // Test 8: Verify property getters and setters TEST_F(ut_dconfig_org_deepin_dtk_preference, test_property_getters_and_setters) { if (!s_dConfigAvailable) { GTEST_SKIP() << "DConfig service not available on this system"; } auto config = createConfig(); // Wait for initialization ASSERT_TRUE(QTest::qWaitFor([config]() { return config->isInitializeSucceeded(); }, INIT_TIMEOUT_MS)) << "Config failed to initialize"; // Test getters - should not crash bool autoDisplay = config->autoDisplayFeature(); // Test setters config->setAutoDisplayFeature(!autoDisplay); // Use QSignalSpy to verify signals are emitted QSignalSpy spyAutoDisplay(config, &dconfig_org_deepin_dtk_preference::autoDisplayFeatureChanged); // Trigger changes config->setAutoDisplayFeature(autoDisplay); // Set back to original // Wait for signals with timeout EXPECT_TRUE(QTest::qWaitFor([&spyAutoDisplay] () { return spyAutoDisplay.count() > 0; }, 1000)) << "autoDisplayFeatureChanged signal not emitted"; delete config; } GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(ut_dconfig_org_deepin_dtk_preference); dtkcore-6.7.46/tests/ut_dconfigfile.cpp000066400000000000000000000662541522615770400201260ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include #include #include #include #include "test_helper.hpp" #if QT_VERSION >= QT_VERSION_CHECK(6,0,0) #define type typeId // In qt6 type is deprecated and typeId should be used, this macro is for more convenient compatibility with qt6 #endif DCORE_USE_NAMESPACE static constexpr char const *LocalPrefix = "/tmp/example"; static QString NoAppId; class ut_DConfigFile : public testing::Test { protected: static void SetUpTestCase() { home.set("HOME", "/tmp/home"); dsgDataDir.set("DSG_DATA_DIRS", PREFIX"/share/dsg"); } static void TearDownTestCase() { dsgDataDir.restore(); home.restore(); } virtual void TearDown() override; const char *APP_ID = "org.foo.appid"; const char *FILE_NAME = "org.foo.name"; QString metaPath = QString("%1" PREFIX"/share/dsg/configs/%2").arg(LocalPrefix, APP_ID); QString metaGlobalPath = QString("%1" PREFIX"/share/dsg/configs").arg(LocalPrefix); QString overridePath = QString("%1" PREFIX"/share/dsg/configs/overrides/%2/%3").arg(LocalPrefix, APP_ID, FILE_NAME); const char *OTHER_APP_ID = "tests_other"; QString noAppidMetaPath = QString("%1" PREFIX"/share/dsg/configs").arg(LocalPrefix); QString noAppidOverridePath = QString("%1" PREFIX"/share/dsg/configs/overrides/%2").arg(LocalPrefix, FILE_NAME); uint uid = getuid(); static EnvGuard dsgDataDir; static EnvGuard home; }; EnvGuard ut_DConfigFile::dsgDataDir; EnvGuard ut_DConfigFile::home; void ut_DConfigFile::TearDown() { QDir(LocalPrefix).removeRecursively(); } TEST_F(ut_DConfigFile, testLoad) { QByteArray meta = R"delimiter( { "magic": "dsg.config.meta", "version": "1.0", "contents": { "canExit": { "value": false, "serial": 0, "name": "I am name", "name[zh_CN]": "我是å��å­—", "description": "我是æ��è¿°", "description[en_US]": "I am description", "permissions": "readwrite", "visibility": "private" } } } )delimiter"; QBuffer buffer; buffer.setData(meta); DConfigFile config(APP_ID, FILE_NAME); ASSERT_TRUE(config.load(&buffer, {})); ASSERT_EQ(config.meta()->keyList(), QStringList{QLatin1String("canExit")}); QScopedPointer userCache(config.createUserCache(uid)); ASSERT_EQ(config.value("canExit", userCache.get()).toBool(), false); ASSERT_EQ(config.meta()->version().major, 1); ASSERT_EQ(config.meta()->version().minor, 0); ASSERT_EQ(config.meta()->visibility("canExit"), DConfigFile::Private); ASSERT_EQ(config.meta()->displayName("canExit", QLocale::AnyLanguage), "I am name"); ASSERT_EQ(config.meta()->displayName("canExit", QLocale::Chinese), QString("我是å��å­—")); ASSERT_EQ(config.meta()->description("canExit", QLocale::AnyLanguage), "我是æ��è¿°"); ASSERT_EQ(config.meta()->description("canExit", QLocale::English), "I am description"); ASSERT_EQ(config.meta()->permissions("canExit"), DConfigFile::ReadWrite); } TEST_F(ut_DConfigFile, setValueTypeCheck) { FileCopyGuard guard(":/data/dconf-example.meta.json", QString("%1/%2.json").arg(metaPath, FILE_NAME)); DConfigFile config(APP_ID, FILE_NAME); config.load(LocalPrefix); QScopedPointer userCache(config.createUserCache(uid)); userCache->load(LocalPrefix); { const auto type = config.value("canExit", userCache.get()).type(); ASSERT_TRUE(config.setValue("canExit", false, "test", userCache.get())); ASSERT_TRUE(config.setValue("canExit", "true", "test", userCache.get())); ASSERT_FALSE(config.setValue("canExit", "true2", "test", userCache.get())); ASSERT_EQ(config.value("canExit", userCache.get()).type(), type); } { const auto type = config.value("key2", userCache.get()).type(); ASSERT_TRUE(config.setValue("key2", "121", "test", userCache.get())); ASSERT_FALSE(config.setValue("key2", 121, "test", userCache.get())); ASSERT_EQ(config.value("key2", userCache.get()).type(), type); } { const auto type = config.value("number", userCache.get()).type(); ASSERT_TRUE(config.setValue("number", 1, "test", userCache.get())); ASSERT_TRUE(config.setValue("number", 2.0, "test", userCache.get())); ASSERT_TRUE(config.setValue("number", "3", "test", userCache.get())); ASSERT_FALSE(config.setValue("number", "1ab", "test", userCache.get())); ASSERT_EQ(config.value("number", userCache.get()).type(), type); } { const auto type = config.value("numberDouble", userCache.get()).type(); ASSERT_TRUE(config.setValue("numberDouble", 1.2, "test", userCache.get())); ASSERT_EQ(config.value("numberDouble", userCache.get()), 1.2); } // The default literal in meta is "1.0" (a float literal); toVariant() // would normally degrade it to qlonglong, losing the float intent. With // the raw-text float detection fix, the default must stay double so that // a later `dde-dconfig set -v 1.3` takes the Double branch. { const auto defaultValue = config.value("numberDouble", userCache.get()); ASSERT_EQ(defaultValue.userType(), static_cast(QMetaType::Double)); } // Conversely, "number" has default literal "1" (no fractional part), so // it must remain an integer. { const auto defaultValue = config.value("number", userCache.get()); ASSERT_EQ(defaultValue.userType(), static_cast(QMetaType::LongLong)); } { const auto type = config.value("array", userCache.get()).type(); const QStringList array{"value1", "value2"}; ASSERT_TRUE(config.setValue("array", QStringList(), "test", userCache.get())); ASSERT_TRUE(config.setValue("array", array, "test", userCache.get())); ASSERT_TRUE(config.setValue("array", QJsonDocument::fromJson("[]").toVariant(), "test", userCache.get())); ASSERT_FALSE(config.setValue("array", "", "test", userCache.get())); #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) ASSERT_FALSE(config.setValue("array", "value1", "test", userCache.get())); #else ASSERT_TRUE(config.setValue("array", "value1", "test", userCache.get())); #endif ASSERT_EQ(config.value("array", userCache.get()).type(), type); } { const auto type = config.value("array_map", userCache.get()).type(); QVariantList array; QVariantMap map1; map1["key1"] = "value1"; map1["key2"] = "value2"; array.append(map1); ASSERT_EQ(config.value("array_map", userCache.get()).toList(), array); ASSERT_TRUE(config.setValue("array_map", QVariantList(), "test", userCache.get())); ASSERT_TRUE(config.setValue("array_map", array, "test", userCache.get())); ASSERT_TRUE(config.setValue("array_map", QJsonDocument::fromJson("[]").toVariant(), "test", userCache.get())); ASSERT_FALSE(config.setValue("array_map", "", "test", userCache.get())); #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) ASSERT_FALSE(config.setValue("array_map", "value1", "test", userCache.get())); #else ASSERT_TRUE(config.setValue("array_map", "value1", "test", userCache.get())); #endif ASSERT_EQ(config.value("array_map", userCache.get()).type(), type); } { const auto type = config.value("map", userCache.get()).type(); QVariantMap map; map.insert("key1", "value1"); map.insert("key2", "value2"); ASSERT_TRUE(config.setValue("map", QVariantMap(), "test", userCache.get())); ASSERT_TRUE(config.setValue("map", map, "test", userCache.get())); ASSERT_TRUE(config.setValue("map", QJsonDocument::fromJson("{}").toVariant(), "test", userCache.get())); ASSERT_FALSE(config.setValue("map", QJsonDocument::fromJson("[]").toVariant(), "test", userCache.get())); ASSERT_FALSE(config.setValue("map", "key1", "test", userCache.get())); ASSERT_EQ(config.value("map", userCache.get()).type(), type); } { const auto type = config.value("map_array", userCache.get()).type(); QVariantMap map; map.insert("key1", QStringList{"value1"}); map.insert("key2", QStringList{"value2"}); #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) ASSERT_EQ(config.value("map_array", userCache.get()).toMap(), map); #else auto ret = config.value("map_array", userCache.get()).toMap(); ASSERT_EQ(ret.keys(), map.keys()); auto value1 = ret.values(); auto value2 = map.values(); ASSERT_EQ(value1.size(), value2.size()); for(std::size_t i = 0; i < value1.size(); ++i){ ASSERT_EQ(value1[i].toStringList(), value2[i].toStringList()); } #endif ASSERT_TRUE(config.setValue("map_array", QVariantMap(), "test", userCache.get())); ASSERT_TRUE(config.setValue("map_array", map, "test", userCache.get())); ASSERT_TRUE(config.setValue("map_array", QJsonDocument::fromJson("{}").toVariant(), "test", userCache.get())); ASSERT_FALSE(config.setValue("map_array", "", "test", userCache.get())); ASSERT_FALSE(config.setValue("map_array", "value1", "test", userCache.get())); ASSERT_EQ(config.value("map_array", userCache.get()).type(), type); } } TEST_F(ut_DConfigFile, fileIODevice) { FileCopyGuard guard(":/data/dconf-example.meta.json", QString("%1/%2.json").arg(metaPath, FILE_NAME)); { DConfigFile config(APP_ID, FILE_NAME); ASSERT_TRUE(config.load(LocalPrefix)); QScopedPointer userCache(config.createUserCache(uid)); ASSERT_TRUE(userCache->load(LocalPrefix)); } { DConfigFile config(APP_ID, FILE_NAME); config.load(LocalPrefix); QScopedPointer userCache(config.createUserCache(uid)); userCache->load(LocalPrefix); config.setValue("canExit", false, "test", userCache.get()); config.setValue("key2", QString("128"), "test", userCache.get()); ASSERT_TRUE(config.save(LocalPrefix)); ASSERT_TRUE(userCache->save(LocalPrefix)); } { DConfigFile config(APP_ID, FILE_NAME); ASSERT_TRUE(config.load(LocalPrefix)); QScopedPointer userCache(config.createUserCache(uid)); ASSERT_TRUE(userCache->load(LocalPrefix)); ASSERT_EQ(config.value("canExit", userCache.get()), false); ASSERT_EQ(config.value("key2", userCache.get()).toString(), QString("128")); } } TEST_F(ut_DConfigFile, appmeta) { FileCopyGuard guard(":/data/dconf-example.meta.json", QString("%1/%2.json").arg(metaPath, FILE_NAME)); { DConfigFile config(APP_ID, FILE_NAME); config.load(LocalPrefix); ASSERT_TRUE(config.load(LocalPrefix)); QScopedPointer userCache(config.createUserCache(uid)); ASSERT_TRUE(userCache->load(LocalPrefix)); ASSERT_EQ(config.value("key3", userCache.get()).toString(), QString("application")); } } TEST_F(ut_DConfigFile, globalmeta) { FileCopyGuard guard(":/data/dconf-global.meta.json", QString("%1/%2.json").arg(metaPath, FILE_NAME)); DConfigFile config(APP_ID, FILE_NAME); ASSERT_TRUE(config.load(LocalPrefix)); QScopedPointer userCache(config.createUserCache(uid)); ASSERT_TRUE(userCache->load(LocalPrefix)); ASSERT_EQ(config.value("key3", userCache.get()), QString("global")); } TEST_F(ut_DConfigFile, meta) { FileCopyGuard guard(":/data/dconf-example.meta.json", QString("%1/%2.json").arg(metaPath, FILE_NAME)); FileCopyGuard guard2(":/data/dconf-global.meta.json", QString("%1/%2.json").arg(metaGlobalPath, FILE_NAME)); DConfigFile config(APP_ID, FILE_NAME); ASSERT_TRUE(config.load(LocalPrefix)); QScopedPointer userCache(config.createUserCache(uid)); ASSERT_TRUE(userCache->load(LocalPrefix)); ASSERT_EQ(config.value("key3", userCache.get()), QString("application")); const QStringList array{"value1", "value2"}; ASSERT_EQ(config.value("array", userCache.get()).toStringList(), array); QVariantMap map; map.insert("key1", "value1"); map.insert("key2", "value2"); ASSERT_EQ(config.value("map", userCache.get()).toMap(), map); } TEST_F(ut_DConfigFile, fileOverride) { FileCopyGuard guard(":/data/dconf-example.meta.json", QString("%1/%2.json").arg(metaPath, FILE_NAME)); { DConfigFile config(APP_ID, FILE_NAME); config.load(LocalPrefix); QScopedPointer userCache(config.createUserCache(uid)); ASSERT_TRUE(userCache->load(LocalPrefix)); ASSERT_EQ(config.value("key3", userCache.get()), QString("application")); } FileCopyGuard guard1(":/data/dconf-example.override.json", QString("%1/%2.json").arg(overridePath, FILE_NAME)); { DConfigFile config(APP_ID, FILE_NAME); config.load(LocalPrefix); QScopedPointer userCache(config.createUserCache(uid)); ASSERT_TRUE(userCache->load(LocalPrefix)); ASSERT_EQ(config.value("key3", userCache.get()), QString("override")); } FileCopyGuard guard2(":/data/dconf-override/dconf-example.override.a.json", QString("%1/a/%2.json").arg(overridePath, FILE_NAME)); { { DConfigFile config(APP_ID, FILE_NAME, "/a"); config.load(LocalPrefix); QScopedPointer userCache(config.createUserCache(uid)); ASSERT_TRUE(userCache->load(LocalPrefix)); ASSERT_EQ(config.value("key3", userCache.get()).toString(), QString("override /a")); } } FileCopyGuard guard3(":/data/dconf-override/dconf-example.override.a.b.json", QString("%1/a/b/%2.json").arg(overridePath, FILE_NAME)); { { DConfigFile config(APP_ID, FILE_NAME, "/a/b"); config.load(LocalPrefix); QScopedPointer userCache(config.createUserCache(uid)); ASSERT_TRUE(userCache->load(LocalPrefix)); ASSERT_EQ(config.value("key3", userCache.get()).toString(), QString("override /a/b")); } } } TEST_F(ut_DConfigFile, fileOverrideNoExistItem) { FileCopyGuard guard(":/data/dconf-example.meta.json", QString("%1/%2.json").arg(metaPath, FILE_NAME)); FileCopyGuard guard2(":/data/dconf-example.override.noexistitem.json", QString("%1/%2.json").arg(overridePath, FILE_NAME)); { DConfigFile config(APP_ID, FILE_NAME); ASSERT_TRUE(config.load(LocalPrefix)); ASSERT_FALSE(config.meta()->keyList().contains("noexistitem")); } } TEST_F(ut_DConfigFile, noAppIdWithGlobalConfiguration) { FileCopyGuard guard(":/data/dconf-example.meta.json", QString("%1/%2.json").arg(noAppidMetaPath, FILE_NAME)); { DConfigFile config(NoAppId, FILE_NAME); ASSERT_TRUE(config.load(LocalPrefix)); ASSERT_EQ(config.value("key3"), QString("application")); config.setValue("key3", "global-with-no-appid", "test"); config.save(LocalPrefix); } { DConfigFile config(NoAppId, FILE_NAME); config.load(LocalPrefix); ASSERT_EQ(config.value("key3"), "global-with-no-appid"); } } TEST_F(ut_DConfigFile, noAppIdWithUserConfiguration) { FileCopyGuard guard(":/data/dconf-example.meta.json", QString("%1/%2.json").arg(noAppidMetaPath, FILE_NAME)); { DConfigFile config(NoAppId, FILE_NAME); ASSERT_TRUE(config.load(LocalPrefix)); QScopedPointer userCache(config.createUserCache(uid)); ASSERT_TRUE(userCache->load(LocalPrefix)); ASSERT_EQ(config.value("key2", userCache.get()), QString("125")); config.setValue("key2", "user-with-no-appid", "test", userCache.get()); ASSERT_TRUE(userCache->save(LocalPrefix)); } { DConfigFile config(NoAppId, FILE_NAME); config.load(LocalPrefix); QScopedPointer userCache(config.createUserCache(uid)); userCache->load(LocalPrefix); ASSERT_EQ(config.value("key2", userCache.get()), "user-with-no-appid"); } } TEST_F(ut_DConfigFile, noAppIdUserConfiguration) { // meta安装在公共目录,使用空的appid设置é…�置项, 则无论是å�¦ä¼ å…¥appid,获å�–的是å�‡ä¸ºç©ºappidçš„cache值 FileCopyGuard guard(":/data/dconf-example.meta.json", QString("%1/%2.json").arg(noAppidMetaPath, FILE_NAME)); { // ä¸�ä¼ å…¥appid设置é…�置项 DConfigFile config(NoAppId, FILE_NAME); config.load(LocalPrefix); QScopedPointer userCache(config.createUserCache(uid)); userCache->load(LocalPrefix); config.setValue("key2", "user-with-no-appid", "test", userCache.get()); userCache->save(LocalPrefix); } { // ä¸�ä¼ å…¥appid,获å�–的为空appid的值 DConfigFile config(NoAppId, FILE_NAME); config.load(LocalPrefix); QScopedPointer userCache(config.createUserCache(uid)); userCache->load(LocalPrefix); ASSERT_EQ(config.value("key2", userCache.get()), "user-with-no-appid"); } } TEST_F(ut_DConfigFile, appIdOverrideNoAppIdUserConfiguration) { // meta安装在公共目录,appid覆盖了meta文件,使用空的appid设置é…�置项, 则无论是å�¦ä¼ å…¥appid,获å�–的是å�‡ä¸ºç©ºappidçš„cache值 FileCopyGuard guard(":/data/dconf-example.meta.json", QString("%1/%2.json").arg(noAppidMetaPath, FILE_NAME)); FileCopyGuard guard2(":/data/dconf-example.meta.json", QString("%1/%2.json").arg(metaPath, FILE_NAME)); { DConfigFile config(NoAppId, FILE_NAME); config.load(LocalPrefix); QScopedPointer userCache(config.createUserCache(uid)); userCache->load(LocalPrefix); config.setValue("key2", "user-with-no-appid", "test", userCache.get()); userCache->save(LocalPrefix); } { // ä¸�ä¼ å…¥appid,获å�–的为空appid的值 DConfigFile config(NoAppId, FILE_NAME); config.load(LocalPrefix); QScopedPointer userCache(config.createUserCache(uid)); userCache->load(LocalPrefix); ASSERT_EQ(config.value("key2", userCache.get()), "user-with-no-appid"); } { // ä¼ å…¥appid设置é…�置项 DConfigFile config(APP_ID, FILE_NAME); config.load(LocalPrefix); QScopedPointer userCache(config.createUserCache(uid)); userCache->load(LocalPrefix); config.setValue("key2", "user-with-appid", "test", userCache.get()); userCache->save(LocalPrefix); } { // ä¸�ä¼ å…¥appid,获å�–的是空appid的值 DConfigFile config(NoAppId, FILE_NAME); config.load(LocalPrefix); QScopedPointer userCache(config.createUserCache(uid)); userCache->load(LocalPrefix); ASSERT_EQ(config.value("key2", userCache.get()), "user-with-no-appid"); } { // ä¼ å…¥appid,获å�–的是å�«appid的值 DConfigFile config(APP_ID, FILE_NAME); config.load(LocalPrefix); QScopedPointer userCache(config.createUserCache(uid)); userCache->load(LocalPrefix); ASSERT_EQ(config.value("key2", userCache.get()).toString().toStdString(), "user-with-appid"); } } TEST_F(ut_DConfigFile, setCachePathPrefix) { FileCopyGuard guard(":/data/dconf-example.meta.json", QString("%1/%2.json").arg(metaPath, FILE_NAME)); { DConfigFile config(APP_ID, FILE_NAME); config.globalCache()->setCachePathPrefix("/configs-global"); ASSERT_TRUE(config.load(LocalPrefix)); QScopedPointer userCache(config.createUserCache(uid)); userCache->setCachePathPrefix("/configs-user"); ASSERT_TRUE(userCache->load(LocalPrefix)); ASSERT_EQ(config.value("key2", userCache.get()), QString("125")); ASSERT_EQ(config.value("key3", userCache.get()), QString("application")); config.setValue("key2", QString("user-config"), "test", userCache.get()); config.setValue("key3", "global-config", "test", userCache.get()); config.save(LocalPrefix); userCache->save(LocalPrefix); } { DConfigFile config(APP_ID, FILE_NAME); config.globalCache()->setCachePathPrefix("/configs-global"); ASSERT_TRUE(config.load(LocalPrefix)); QScopedPointer userCache(config.createUserCache(uid)); userCache->setCachePathPrefix("/configs-user"); ASSERT_TRUE(userCache->load(LocalPrefix)); ASSERT_EQ(config.value("key2", userCache.get()), QString("user-config")); ASSERT_EQ(config.value("key3", userCache.get()), QString("global-config")); } } TEST_F(ut_DConfigFile, setSubpath) { FileCopyGuard guard(":/data/dconf-example.meta.json", QString("%1/%2.json").arg(metaPath, FILE_NAME)); { DConfigFile config(APP_ID, FILE_NAME); ASSERT_TRUE(config.load(LocalPrefix)); } { DConfigFile config(APP_ID, FILE_NAME, "a/b"); ASSERT_FALSE(config.load(LocalPrefix)); } { DConfigFile config(APP_ID, FILE_NAME, "/a/b"); ASSERT_TRUE(config.load(LocalPrefix)); } { DConfigFile config(APP_ID, FILE_NAME, "/a/b/.."); ASSERT_TRUE(config.load(LocalPrefix)); } { DConfigFile config(APP_ID, FILE_NAME, "/../a/b"); ASSERT_FALSE(config.load(LocalPrefix)); } { DConfigFile config(APP_ID, FILE_NAME, "/a/b/../../.."); ASSERT_FALSE(config.load(LocalPrefix)); } } TEST_F(ut_DConfigFile, userPublic) { FileCopyGuard guard(":/data/dconf-example.meta.json", QString("%1/%2.json").arg(metaPath, FILE_NAME)); { DConfigFile config(APP_ID, FILE_NAME); ASSERT_TRUE(config.load(LocalPrefix)); ASSERT_TRUE(config.meta()->flags("publicConfig").testFlag(DConfigFile::UserPublic)); ASSERT_FALSE(config.meta()->flags("canExit").testFlag(DConfigFile::UserPublic)); } } TEST_F(ut_DConfigFile, setValueWithSerialComparison) { // 测试 DConfigCacheImpl::setValue 中的 serial 比较逻辑 // 当值相å�Œä½† serial ä¸�å�Œæ—¶ï¼Œåº”该返回 true(更新缓存) FileCopyGuard guard(":/data/dconf-serial-test.meta.json", QString("%1/%2.json").arg(metaPath, FILE_NAME)); // 场景1: 值和 serial 都相å�Œ → 返回 false { DConfigFile config(APP_ID, FILE_NAME); ASSERT_TRUE(config.load(LocalPrefix)); QScopedPointer userCache(config.createUserCache(uid)); ASSERT_TRUE(userCache->load(LocalPrefix)); // 首次设置值,serial=0 从 meta ä¼ å…¥ ASSERT_TRUE(config.setValue("testKey", "test_value", "test", userCache.get())); // å†�次设置相å�Œçš„值,serial 相å�Œ → 返回 false ASSERT_FALSE(config.setValue("testKey", "test_value", "test", userCache.get())); } // 场景2: 值相å�Œï¼Œserial ä¸�å�Œ → 返回 true(新修å¤�的场景) { DConfigFile config(APP_ID, FILE_NAME); ASSERT_TRUE(config.load(LocalPrefix)); QScopedPointer userCache(config.createUserCache(uid)); ASSERT_TRUE(userCache->load(LocalPrefix)); // 设置值,缓存中 serial=0 ASSERT_TRUE(config.setValue("testKey", "test_value", "test", userCache.get())); // 使用 override 文件将 serial å�‡çº§åˆ° 1 FileCopyGuard guard2(":/data/dconf-serial-test.override.json", QString("%1/%2.json").arg(overridePath, FILE_NAME)); // é‡�新加载é…�置,此时 meta serial=1 DConfigFile config2(APP_ID, FILE_NAME); ASSERT_TRUE(config2.load(LocalPrefix)); QScopedPointer userCache2(config2.createUserCache(uid)); ASSERT_TRUE(userCache2->load(LocalPrefix)); // 设置相å�Œçš„值,但 meta serial=1, cache serial=0 → 应该返回 true ASSERT_TRUE(config2.setValue("testKey", "test_value", "test", userCache2.get())); } // 场景3: 值ä¸�å�Œï¼Œserial 相å�Œ → 返回 true { DConfigFile config(APP_ID, FILE_NAME); ASSERT_TRUE(config.load(LocalPrefix)); QScopedPointer userCache(config.createUserCache(uid)); ASSERT_TRUE(userCache->load(LocalPrefix)); // 设置åˆ�始值 ASSERT_TRUE(config.setValue("testKey", "value1", "test", userCache.get())); // 设置ä¸�å�Œçš„值,serial 相å�Œ → 返回 true ASSERT_TRUE(config.setValue("testKey", "value2", "test", userCache.get())); } // 场景4: 值ä¸�å�Œï¼Œserial ä¸�å�Œ → 返回 true { DConfigFile config(APP_ID, FILE_NAME); ASSERT_TRUE(config.load(LocalPrefix)); QScopedPointer userCache(config.createUserCache(uid)); ASSERT_TRUE(userCache->load(LocalPrefix)); // 设置åˆ�始值 ASSERT_TRUE(config.setValue("testKey", "value1", "test", userCache.get())); // 使用 override 文件将 serial å�‡çº§åˆ° 1 FileCopyGuard guard2(":/data/dconf-serial-test.override.json", QString("%1/%2.json").arg(overridePath, FILE_NAME)); // é‡�新加载é…�ç½® DConfigFile config2(APP_ID, FILE_NAME); ASSERT_TRUE(config2.load(LocalPrefix)); QScopedPointer userCache2(config2.createUserCache(uid)); ASSERT_TRUE(userCache2->load(LocalPrefix)); // 设置ä¸�å�Œçš„值,serial 也ä¸�å�Œ → 返回 true ASSERT_TRUE(config2.setValue("testKey", "value3", "test", userCache2.get())); } } class ut_DConfigFileCheckName : public ut_DConfigFile, public ::testing::WithParamInterface> { }; TEST_P(ut_DConfigFileCheckName, checkName) { const auto [fileName, isValid] = GetParam(); FileCopyGuard guard(":/data/dconf-example.meta.json", QString("%1/%2.json").arg(metaPath, fileName)); DConfigFile config(APP_ID, fileName); ASSERT_EQ(config.load(LocalPrefix), isValid); } INSTANTIATE_TEST_SUITE_P(checkName, ut_DConfigFileCheckName, ::testing::Values( std::tuple{QString("org-foo"), true}, std::tuple{QString("org foo"), true}, std::tuple{QString("org.foo2"), true}, std::tuple{QString("org/foo"), false}, std::tuple{QString("./org-foo"), false}, std::tuple{QString("../configs/org-foo"), false})); class ut_DConfigFileCheckAppId : public ut_DConfigFile, public ::testing::WithParamInterface> { }; TEST_P(ut_DConfigFileCheckAppId, checkAppId) { const auto [appId, isValid] = GetParam(); FileCopyGuard guard(":/data/dconf-example.meta.json", QString("%1/%2/%3.json").arg(noAppidMetaPath, appId, FILE_NAME)); DConfigFile config(appId, FILE_NAME); ASSERT_EQ(config.load(LocalPrefix), isValid); } INSTANTIATE_TEST_SUITE_P(checkAppId, ut_DConfigFileCheckAppId, ::testing::Values( std::tuple{NoAppId, true}, std::tuple{QString("org-foo"), true}, std::tuple{QString("org foo"), false}, std::tuple{QString("org.foo2"), true}, std::tuple{QString("org/foo"), false}, std::tuple{QString("./org-foo"), false}, std::tuple{QString("../configs/org-foo"), false})); dtkcore-6.7.46/tests/ut_ddbusextendedabstractinterface.cpp000066400000000000000000000122361522615770400240730ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include #include "fakedbus/fakedbusservice.h" #include #include DCORE_USE_NAMESPACE class DBusExtendedInterfaceFoo : public DDBusExtendedAbstractInterface { Q_OBJECT public: static inline const char *staticInterfaceName() { return "org.deepin.FakeDBusService"; } explicit DBusExtendedInterfaceFoo(QObject *parent = nullptr) : DDBusExtendedAbstractInterface(FakeDBusService::get_service(), FakeDBusService::get_path(), staticInterfaceName(), QDBusConnection::sessionBus(), parent) { connect(this, &DBusExtendedInterfaceFoo::propertyChanged, this, [this](const QString &propName, const QVariant &value){ if (propName == QStringLiteral("strProperty")) { const QString &strProperty = qvariant_cast(value); if (m_strProp != strProperty) { m_strProp = strProperty; Q_EMIT StrPropertyChanged(m_strProp); } return; } qWarning() << "property not handle: " << propName; return; }); } ~DBusExtendedInterfaceFoo(){ } Q_PROPERTY(QString strProperty READ strProperty WRITE setStrProperty NOTIFY StrPropertyChanged) QString strProperty() { return qvariant_cast(internalPropGet("strProperty", &m_strProp)); } void setStrProperty(const QString &value) { internalPropSet("strProperty", QVariant::fromValue(value), &m_strProp); } Q_SIGNALS: // SIGNALS void StrPropertyChanged(const QString & value) const; private: QString m_strProp; }; class ut_DDBusExtendedAbstractInterface : public testing::Test { public: void SetUp() override { m_fakeService = new FakeDBusService; m_dbusExtend = new DBusExtendedInterfaceFoo; } void TearDown() override { delete m_fakeService; delete m_dbusExtend; } DBusExtendedInterfaceFoo *m_dbusExtend = nullptr; FakeDBusService *m_fakeService = nullptr; }; TEST_F(ut_DDBusExtendedAbstractInterface, sync) { EXPECT_TRUE(m_dbusExtend->sync()); m_dbusExtend->setSync(false, false); EXPECT_FALSE(m_dbusExtend->sync()); } TEST_F(ut_DDBusExtendedAbstractInterface, useCache) { EXPECT_FALSE(m_dbusExtend->useCache()); m_dbusExtend->setUseCache(true); EXPECT_TRUE(m_dbusExtend->useCache()); } TEST_F(ut_DDBusExtendedAbstractInterface, startServiceProcess) { EXPECT_TRUE(m_dbusExtend->isValid()); m_dbusExtend->startServiceProcess(); } TEST_F(ut_DDBusExtendedAbstractInterface, getAllProperties) { QSignalSpy spy(m_dbusExtend, &DDBusExtendedAbstractInterface::asyncGetAllPropertiesFinished); m_dbusExtend->setSync(false); m_dbusExtend->getAllProperties(); EXPECT_TRUE(QTest::qWaitFor([&spy, this]() { return spy.count() >= 1 && !m_dbusExtend->lastExtendedError().isValid(); }, 2000)); } TEST_F(ut_DDBusExtendedAbstractInterface, internalPropGet) { QSignalSpy asyncPropertyFinishedSpy(m_dbusExtend, &DDBusExtendedAbstractInterface::asyncPropertyFinished); QSignalSpy propertyChangedSpy(m_dbusExtend, &DDBusExtendedAbstractInterface::propertyChanged); m_dbusExtend->setSync(false); // internalPropGet m_dbusExtend->strProperty(); QObject::connect(m_dbusExtend, &DDBusExtendedAbstractInterface::propertyChanged, m_dbusExtend, [](const QString &propertyName, const QVariant &value){ if (propertyName == "strProp") EXPECT_EQ(value.toString(), "testDBusService"); qInfo() << "propertyChanged" << propertyName << value; }); EXPECT_TRUE(QTest::qWaitFor([&]() { return asyncPropertyFinishedSpy.count() >= 1 && propertyChangedSpy.count() >= 1 && !m_dbusExtend->lastExtendedError().isValid(); }, 2000)); } TEST_F(ut_DDBusExtendedAbstractInterface, internalPropSet) { QSignalSpy asyncPropertyFinishedSpy(m_dbusExtend, &DDBusExtendedAbstractInterface::asyncSetPropertyFinished); QSignalSpy propertyChangedSpy(m_dbusExtend, &DDBusExtendedAbstractInterface::propertyChanged); m_dbusExtend->setSync(false); // internalPropSet m_dbusExtend->setStrProperty("MyProp"); QObject::connect(m_dbusExtend, &DDBusExtendedAbstractInterface::propertyChanged, m_dbusExtend, [](const QString &propertyName, const QVariant &value){ if (propertyName == "strProp") EXPECT_EQ(value.toString(), "MyProp"); qInfo() << "propertyChanged" << propertyName << value; }); EXPECT_TRUE(QTest::qWaitFor([&]() { return asyncPropertyFinishedSpy.count() >= 1 && propertyChangedSpy.count() >= 1 && !m_dbusExtend->lastExtendedError().isValid(); }, 2000)); } #include "ut_ddbusextendedabstractinterface.moc" dtkcore-6.7.46/tests/ut_ddbusinterface.cpp000066400000000000000000000031301522615770400206170ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include #include "fakedbus/fakedbusservice.h" #include #include using Dtk::Core::DDBusInterface; class ut_DDBusInterface : public testing::Test { public: void SetUp() override { m_testservice = new FakeDBusService(); m_testDBusInterfaceParent = new FakeDBusServiceParent(); // if parent is nullptr m_testInterface = new DDBusInterface(FakeDBusService::get_service(), FakeDBusService::get_path(), FakeDBusService::get_interface(), QDBusConnection::sessionBus()); } void TearDown() override { delete m_testDBusInterfaceParent; delete m_testInterface; delete m_testservice; } DDBusInterface *m_testInterface; FakeDBusService *m_testservice; FakeDBusServiceParent *m_testDBusInterfaceParent; }; TEST_F(ut_DDBusInterface, TestProperty) { auto objectpaths = m_testservice->objectpaths(); EXPECT_EQ(m_testDBusInterfaceParent->objectpaths().length(), objectpaths.length()); auto strproperty = qvariant_cast(m_testInterface->property("strProperty")); EXPECT_EQ(strproperty, m_testservice->strproperty()); } TEST_F(ut_DDBusInterface, suffix) { EXPECT_EQ(m_testInterface->suffix(), ""); m_testInterface->setSuffix("-suffix"); EXPECT_EQ(m_testInterface->suffix(), "-suffix"); } dtkcore-6.7.46/tests/ut_ddbussender.cpp000066400000000000000000000033731522615770400201500ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include "ddbussender.h" #include #include #include "fakedbus/fakedbusservice.h" using Dtk::Core::DDBusInterface; class ut_DDBusSender : public testing::Test { public: void SetUp() override { m_testservice = new FakeDBusService(); m_sender = new DDBusSender; } void TearDown() override { delete m_testservice; delete m_sender; } FakeDBusService *m_testservice = nullptr; DDBusSender *m_sender = nullptr; }; TEST_F(ut_DDBusSender, DDBusCaller) { QDBusPendingReply reply = m_sender->service(m_testservice->get_service()) .path(m_testservice->get_path()) .interface(m_testservice->get_interface()) .method(QString("foo")) .call(); reply.waitForFinished(); if (reply.error().isValid()) qWarning() << reply.error().message(); ASSERT_TRUE(reply.value() == QString("bar")); } TEST_F(ut_DDBusSender, DDBusProperty) { auto prop = m_sender->service(m_testservice->get_service()) .path(m_testservice->get_path()) .interface(m_testservice->get_interface()) .property(QString("strProperty")); QDBusPendingReply reply = prop.get(); reply.waitForFinished(); if (reply.error().isValid()) qWarning() << reply.error().message(); ASSERT_TRUE(reply.value().toString() == QString("testDBusService")); auto res = prop.set("myProp"); res.waitForFinished(); if (res.error().isValid()) qWarning() << res.error().message(); ASSERT_TRUE(m_testservice->strproperty() == QString("myProp")); } dtkcore-6.7.46/tests/ut_ddci.cpp000066400000000000000000000447711522615770400165600ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include #include #include #include #include #include #include DCORE_USE_NAMESPACE class ut_DCI : public testing::Test { public: void SetUp() override { QLoggingCategory::setFilterRules("dtk.dci.file.debug=true\n" "dtk.dci.fileengine.debug=true"); } }; TEST_F(ut_DCI, DDciFile) { { // 空文件 DDciFile dciFile; ASSERT_TRUE(dciFile.isValid()); ASSERT_TRUE(dciFile.exists("/")); ASSERT_EQ(dciFile.list("/").count(), 0); ASSERT_EQ(dciFile.toData(), QByteArrayLiteral("DCI\0\1\0\0\0")); } { // 最å°�æ•°æ�®æ–‡ä»¶ DDciFile dciFile(QByteArrayLiteral("DCI\0\1\0\0\0")); ASSERT_TRUE(dciFile.isValid()); ASSERT_TRUE(dciFile.exists("/")); ASSERT_EQ(dciFile.list("/").count(), 0); ASSERT_EQ(dciFile.toData(), QByteArrayLiteral("DCI\0\1\0\0\0")); } { // 错误的版本 DDciFile dciFile(QByteArrayLiteral("DCI\0\0\0\0\0")); ASSERT_FALSE(dciFile.isValid()); } { // 错误的文件数é‡� DDciFile dciFile(QByteArrayLiteral("DCI\0\1\255\255\255")); ASSERT_FALSE(dciFile.isValid()); } { // 创建目录 DDciFile dciFile; ASSERT_TRUE(dciFile.mkdir("/test")); ASSERT_TRUE(dciFile.exists("/test")); ASSERT_EQ(dciFile.list("/"), QStringList{"/test"}); ASSERT_EQ(dciFile.childrenCount("/"), 1); } { // 创建目录 DDciFile dciFile; ASSERT_TRUE(dciFile.mkdir("/test")); ASSERT_TRUE(dciFile.exists("/test")); ASSERT_EQ(dciFile.list("/"), QStringList{"/test"}); ASSERT_EQ(dciFile.type("/test"), DDciFile::Directory); ASSERT_EQ(dciFile.childrenCount("/"), 1); // 创建文件 ASSERT_TRUE(dciFile.writeFile("/test/test.txt", "test\n")); ASSERT_TRUE(dciFile.exists("/test/test.txt")); ASSERT_EQ(dciFile.list("/test"), QStringList{"/test/test.txt"}); ASSERT_EQ(dciFile.childrenCount("/test"), 1); ASSERT_EQ(dciFile.type("/test/test.txt"), DDciFile::File); ASSERT_EQ(dciFile.dataRef("/test/test.txt"), QByteArray("test\n")); // 软链接 // 链接一个ä¸�存在的文件 ASSERT_TRUE(dciFile.link("/no", "/1.link")); ASSERT_TRUE(dciFile.exists("/1.link")); ASSERT_EQ(dciFile.type("/1.link"), DDciFile::Symlink); ASSERT_EQ(dciFile.symlinkTarget("/1.link"), "/no"); ASSERT_EQ(dciFile.symlinkTarget("/1.link", true), "/no"); // 当链接目标无效时,无论如何都ä¸�å…�许写入数æ�® ASSERT_FALSE(dciFile.writeFile("/1.link", "", false)); ASSERT_FALSE(dciFile.writeFile("/1.link", "", true)); // 链接一个目录 ASSERT_TRUE(dciFile.link("/test", "/2.link")); ASSERT_TRUE(dciFile.symlinkTarget("/2.link").isEmpty()); ASSERT_FALSE(dciFile.mkdir("/2.link/test")); // 链接一个存在的文件 ASSERT_TRUE(dciFile.link("/test/test.txt", "/3.link")); ASSERT_EQ(dciFile.symlinkTarget("/3.link"), "/test/test.txt"); ASSERT_EQ(dciFile.dataRef("/3.link"), QByteArray("test\n")); ASSERT_TRUE(dciFile.writeFile("/3.link", "TEST", true)); ASSERT_EQ(dciFile.dataRef("/test/test.txt"), QByteArray("TEST")); // 相对路径链接 ASSERT_TRUE(dciFile.link("./test/test.txt", "/4.link")); ASSERT_EQ(dciFile.symlinkTarget("/4.link"), "/test/test.txt"); ASSERT_EQ(dciFile.symlinkTarget("/4.link", true), "./test/test.txt"); ASSERT_EQ(dciFile.dataRef("/4.link"), QByteArray("TEST")); // 链接一个软链接,测试 ".." 类型的相对路径 ASSERT_TRUE(dciFile.link("../4.link", "/test/5.link")); ASSERT_EQ(dciFile.symlinkTarget("/test/5.link"), "/4.link"); ASSERT_EQ(dciFile.symlinkTarget("/test/5.link", true), "../4.link"); ASSERT_EQ(dciFile.dataRef("/test/5.link"), QByteArray("TEST")); ASSERT_TRUE(dciFile.writeFile("/test/5.link", "test\n", true)); ASSERT_EQ(dciFile.dataRef("/test/test.txt"), QByteArray("test\n")); // 链接å�Œç›®å½•文件 ASSERT_TRUE(dciFile.link("test.txt", "/test/6.link")); ASSERT_EQ(dciFile.dataRef("/test/6.link"), QByteArray("test\n")); // 链接对象删除 ASSERT_TRUE(dciFile.remove("/4.link")); ASSERT_TRUE(dciFile.exists("/test/5.link")); ASSERT_EQ(dciFile.symlinkTarget("/test/5.link"), "/4.link"); ASSERT_TRUE(dciFile.dataRef("/test/5.link").isEmpty()); ASSERT_FALSE(dciFile.writeFile("/test/5.link", "", true)); // 链接对象改å�� ASSERT_TRUE(dciFile.rename("/test/6.link", "/test/7.link")); ASSERT_EQ(dciFile.dataRef("/test/7.link"), QByteArray("test\n")); // 链接对象更æ�¢ç›®å½• ASSERT_TRUE(dciFile.rename("/test/7.link", "/7.link")); ASSERT_EQ(dciFile.symlinkTarget("/7.link"), "/test.txt"); ASSERT_TRUE(dciFile.dataRef("/7.link").isEmpty()); { // å¤�制数æ�® DDciFile dciFile2(dciFile.toData()); ASSERT_TRUE(dciFile2.isValid()); ASSERT_EQ(dciFile2.list("/"), dciFile.list("/")); ASSERT_EQ(dciFile2.list("/test"), dciFile.list("/test")); ASSERT_EQ(dciFile2.dataRef("/test/test.txt"), QByteArray("test\n")); ASSERT_EQ(dciFile2.dataRef("/test/3.link"), dciFile2.dataRef("/test/text.txt")); ASSERT_EQ(dciFile.toData(), dciFile2.toData()); } // 清ç�†é“¾æŽ¥æ–‡ä»¶ for (const QString &file : dciFile.list("/", false)) { if (dciFile.type(file) == DDciFile::Symlink) dciFile.remove(file); } for (const QString &file : dciFile.list("/test", false)) { if (dciFile.type(file) == DDciFile::Symlink) dciFile.remove(file); } // 改写文件数æ�® ASSERT_FALSE(dciFile.writeFile("/test/test.txt", "override the\"test.txt\"")); ASSERT_TRUE(dciFile.writeFile("/test/test.txt", "override the\"test.txt\"", true)); ASSERT_EQ(dciFile.dataRef("/test/test.txt"), "override the\"test.txt\""); // 文件删除 ASSERT_TRUE(dciFile.remove("/test/test.txt")); ASSERT_FALSE(dciFile.exists("/test/test.txt")); ASSERT_EQ(dciFile.list("/test"), QStringList{}); // 目录删除 ASSERT_TRUE(dciFile.writeFile("/test/test.txt", "")); ASSERT_TRUE(dciFile.remove("/test")); ASSERT_FALSE(dciFile.exists("/test")); ASSERT_EQ(dciFile.list("/"), QStringList{}); ASSERT_EQ(dciFile.toData(), QByteArrayLiteral("DCI\0\1\0\0\0")); } { DDciFile dciFile; ASSERT_TRUE(dciFile.mkdir("/test")); ASSERT_TRUE(dciFile.writeFile("/test.txt", "")); // é‡�命å�� ASSERT_TRUE(dciFile.rename("/test.txt", "/test/new_test.txt")); ASSERT_TRUE(dciFile.exists("/test/new_test.txt")); ASSERT_FALSE(dciFile.rename("/test.txt", "/test/new_test.txt")); ASSERT_EQ(dciFile.list("/test", true), QStringList{"new_test.txt"}); ASSERT_EQ(dciFile.list("/test"), QStringList{"/test/new_test.txt"}); // override é‡�命å�� ASSERT_TRUE(dciFile.writeFile("/test.txt", "test", false)); ASSERT_FALSE(dciFile.rename("/test.txt", "/test/new_test.txt", false)); ASSERT_TRUE(dciFile.rename("/test.txt", "/test/new_test.txt", true)); ASSERT_EQ(dciFile.dataRef("/test/new_test.txt"), "test"); // 文件清空 ASSERT_TRUE(dciFile.remove("/")); ASSERT_EQ(dciFile.list("/"), QStringList{}); ASSERT_EQ(dciFile.childrenCount("/"), 0); ASSERT_EQ(dciFile.toData(), QByteArrayLiteral("DCI\0\1\0\0\0")); } // DDciFile::copy { DDciFile dciFile; // 文件å¤�制 ASSERT_TRUE(dciFile.writeFile("/test.txt", "test")); ASSERT_TRUE(dciFile.copy("/test.txt", "/test.txt.new")); ASSERT_TRUE(dciFile.exists("/test.txt.new")); ASSERT_EQ(dciFile.list("/", true), (QStringList{"test.txt", "test.txt.new"})); ASSERT_EQ(dciFile.dataRef("/test.txt"), dciFile.dataRef("/test.txt.new")); // 目录å¤�制 ASSERT_TRUE(dciFile.mkdir("/test")); ASSERT_TRUE(dciFile.rename("/test.txt", "/test/test.txt")); ASSERT_TRUE(dciFile.copy("/test", "/test.new")); ASSERT_TRUE(dciFile.exists("/test.new/test.txt")); ASSERT_EQ(dciFile.list("/test.new", true), (QStringList{"test.txt"})); ASSERT_EQ(dciFile.dataRef("/test/test.txt"), dciFile.dataRef("/test.new/test.txt")); } // 文件排åº� { DDciFile dciFile; dciFile.mkdir("/b01"); dciFile.writeFile("/a2.txt", ""); dciFile.writeFile("/b2", ""); dciFile.writeFile("/a11.txt", ""); const auto &list = dciFile.list("/", true); ASSERT_EQ(list, (QStringList{"a2.txt", "a11.txt", "b01", "b2"})); dciFile.writeFile("/b01/222", ""); dciFile.link("/b01/33", "/b01/1111"); dciFile.writeFile("/b01/33", ""); ASSERT_EQ(dciFile.list("/b01", true), (QStringList{"33", "222", "1111"})); ASSERT_TRUE(dciFile.rename("/a11.txt", "/b01/200")); ASSERT_TRUE(dciFile.copy("/a2.txt", "/b01/200.txt")); ASSERT_EQ(dciFile.list("/", true), (QStringList{"a2.txt", "b01", "b2"})); ASSERT_EQ(dciFile.list("/b01", true), (QStringList{"33", "200", "200.txt", "222", "1111"})); } } class TestDCIFileHelper { public: TestDCIFileHelper(const QString &fileName) : fileName(fileName) { if (QFile::exists(fileName)) QFile::remove(fileName); } ~TestDCIFileHelper() { QFile::remove(fileName); } inline QString dciFormatFilePath(const QString &subfile = QString()) const { return "dci:" + fileName + subfile; } inline QString sourceFileName() const { return fileName; } private: QString fileName; }; static QByteArray readAll(const QString &file) { QFile f(file); if (!f.open(QIODevice::ReadOnly)) return {}; return f.readAll(); } TEST_F(ut_DCI, DFileEngine) { DDciFile::registerFileEngine(); { TestDCIFileHelper helper(QDir::temp().absoluteFilePath("test.dci")); // 空 dci 文件创建 QFile file(helper.dciFormatFilePath()); ASSERT_TRUE(file.exists()); QFileInfo info(file); ASSERT_TRUE(info.isDir()); ASSERT_TRUE(info.isRoot()); // 文件夹ä¸�å�¯å†™å…¥ ASSERT_FALSE(file.open(QIODevice::WriteOnly)); // 空文件é��历 QDir dir(info.absoluteFilePath()); ASSERT_EQ(dir.entryList(), QStringList{}); } { TestDCIFileHelper helper(QDir::temp().absoluteFilePath("test.dci")); { // 内部文件创建 QFile file(helper.dciFormatFilePath("/test.txt")); ASSERT_FALSE(file.open(QIODevice::ReadOnly)); ASSERT_TRUE(file.open(QIODevice::ReadOnly | QIODevice::WriteOnly)); ASSERT_TRUE(file.exists()); ASSERT_TRUE(QFileInfo(file).isFile()); ASSERT_TRUE(file.write("Hello") == 5); ASSERT_TRUE(file.seek(0)); ASSERT_EQ(file.readAll(), "Hello"); ASSERT_TRUE(file.flush()); // 链接文件创建,ç»�对路径链接 ASSERT_TRUE(file.link(helper.dciFormatFilePath("/test.txt.link"))); { QFile linkFile(helper.dciFormatFilePath("/test.txt.link")); ASSERT_TRUE(QFileInfo(linkFile).isSymLink()); ASSERT_EQ(linkFile.symLinkTarget(), "/test.txt"); ASSERT_TRUE(linkFile.open(QIODevice::ReadOnly)); ASSERT_EQ(linkFile.readAll(), "Hello"); ASSERT_EQ(linkFile.size(), file.size()); } file.close(); // 文件信æ�¯ QFileInfo info1(file); QFileInfo info2(helper.sourceFileName()); ASSERT_FALSE(info1.isRoot()); ASSERT_EQ(info1.permissions(), info2.permissions()); ASSERT_EQ(info1.fileTime(QFile::FileAccessTime), info2.fileTime(QFile::FileAccessTime)); ASSERT_EQ(info1.fileTime(QFile::FileBirthTime), info2.fileTime(QFile::FileBirthTime)); ASSERT_EQ(info1.fileTime(QFile::FileMetadataChangeTime), info2.fileTime(QFile::FileMetadataChangeTime)); ASSERT_EQ(info1.fileTime(QFile::FileModificationTime), info2.fileTime(QFile::FileModificationTime)); ASSERT_EQ(info1.ownerId(), info2.ownerId()); ASSERT_EQ(info1.owner(), info2.owner()); ASSERT_EQ(info1.groupId(), info2.groupId()); ASSERT_EQ(info1.group(), info2.group()); // 目录é��历 QDir dir(helper.dciFormatFilePath()); ASSERT_EQ(dir.entryList(), (QStringList{"test.txt", "test.txt.link"})); // 文件大å°� ASSERT_EQ(file.size(), 5); ASSERT_TRUE(file.resize(10)); ASSERT_EQ(file.size(), 10); ASSERT_EQ(QFile(helper.dciFormatFilePath("/test.txt.link")).size(), 10); } { // 文件读å�– QFile file(helper.dciFormatFilePath("/test.txt")); ASSERT_TRUE(file.exists()); ASSERT_TRUE(file.open(QIODevice::ReadOnly)); ASSERT_EQ(file.readAll(), QByteArrayLiteral("Hello\0\0\0\0\0")); file.close(); // [/test.txt, /test.txt.link] } { // 文件内容改写 QFile file(helper.dciFormatFilePath("/test.txt")); ASSERT_TRUE(file.open(QIODevice::ReadWrite)); ASSERT_TRUE(file.seek(1)); ASSERT_TRUE(file.putChar('E')); char ch; ASSERT_TRUE(file.getChar(&ch)); ASSERT_EQ(ch, 'l'); ASSERT_EQ(file.readAll(), QByteArrayLiteral("lo\0\0\0\0\0")); ASSERT_TRUE(file.seek(0)); ASSERT_EQ(file.readAll(), QByteArrayLiteral("HEllo\0\0\0\0\0")); ASSERT_EQ(readAll(helper.dciFormatFilePath("/test.txt.link")), QByteArrayLiteral("HEllo\0\0\0\0\0")); } // 目录创建 ASSERT_TRUE(QDir(helper.dciFormatFilePath()).mkdir("1")); ASSERT_FALSE(QDir(helper.dciFormatFilePath()).mkdir("2/3")); ASSERT_TRUE(QDir(helper.dciFormatFilePath()).mkpath("2/3")); ASSERT_TRUE(QFileInfo(helper.dciFormatFilePath("/1")).isDir()); // [/test.txt, /test.txt.link, /1, /2, /2/3] // 目录 rename ASSERT_FALSE(QFile::rename(helper.dciFormatFilePath("/1"), "/1")); ASSERT_TRUE(QFile::rename(helper.dciFormatFilePath("/1"), helper.dciFormatFilePath("/1.new"))); ASSERT_TRUE(QFile::rename(helper.dciFormatFilePath("/2"), helper.dciFormatFilePath("/2.new"))); ASSERT_TRUE(QFile::rename(helper.dciFormatFilePath("/2.new/3"), helper.dciFormatFilePath("/3"))); // [/test.txt, /test.txt.link, /1.new, /2.new, /3] // 文件 rename ASSERT_TRUE(QFile::rename(helper.dciFormatFilePath("/test.txt"), helper.dciFormatFilePath("/test.txt.new"))); ASSERT_TRUE(QFile::rename(helper.dciFormatFilePath("/test.txt.new"), helper.dciFormatFilePath("/1.new/test.txt"))); // [/1.new, /1.new/test.txt.new, /test.txt.link, /2.new, /3] // 此时的 link file 应该无效 ASSERT_TRUE(readAll(helper.dciFormatFilePath("/test.txt.link")).isEmpty()); // 链接文件 rename ASSERT_TRUE(QFile::rename(helper.dciFormatFilePath("/test.txt.link"), helper.dciFormatFilePath("/1.new/test.txt.link"))); // å¤�制 ASSERT_TRUE(QFile::copy(helper.dciFormatFilePath("/1.new/test.txt"), helper.dciFormatFilePath("/test.txt"))); // 链接文件å¤�制 ASSERT_TRUE(QFile::copy(helper.dciFormatFilePath("/1.new/test.txt.link"), helper.dciFormatFilePath("/test.txt.link"))); // 检查å¤�制/renameå�Žçš„链接文件 ASSERT_EQ(QFile(helper.dciFormatFilePath("/test.txt.link")).symLinkTarget(), QStringLiteral("/test.txt")); ASSERT_EQ(readAll(helper.dciFormatFilePath("/test.txt.link")), readAll(helper.dciFormatFilePath("/test.txt"))); ASSERT_EQ(QFile(helper.dciFormatFilePath("/1.new/test.txt.link")).symLinkTarget(), QStringLiteral("/test.txt")); ASSERT_EQ(readAll(helper.dciFormatFilePath("/1.new/test.txt.link")), readAll(helper.dciFormatFilePath("/test.txt"))); // å¤�制目录 ASSERT_TRUE(QFile::copy(helper.dciFormatFilePath("/1.new"), helper.dciFormatFilePath("/1"))); ASSERT_EQ(QDir(helper.dciFormatFilePath("/1")).entryList(), QDir(helper.dciFormatFilePath("/1.new")).entryList()); // [/1.new, /1.new/test.txt, /1.new/test.txt.link, /2.new, /3, /test.txt, /test.txt.link, /1] // 目录é��历 QStringList list { helper.dciFormatFilePath("/1"), helper.dciFormatFilePath("/1/test.txt.link"), helper.dciFormatFilePath("/1/test.txt"), helper.dciFormatFilePath("/1.new"), helper.dciFormatFilePath("/1.new/test.txt"), helper.dciFormatFilePath("/1.new/test.txt.link"), helper.dciFormatFilePath("/2.new"), helper.dciFormatFilePath("/3"), helper.dciFormatFilePath("/test.txt"), helper.dciFormatFilePath("/test.txt.link") }; QDirIterator di(helper.dciFormatFilePath(), QDirIterator::Subdirectories); while (di.hasNext()) { const QString &file = di.next(); ASSERT_TRUE(list.removeOne(file)); } ASSERT_TRUE(list.isEmpty()); // 删除 ASSERT_TRUE(QFile::remove(helper.dciFormatFilePath("/test.txt"))); ASSERT_TRUE(QFile::remove(helper.dciFormatFilePath("/test.txt.link"))); ASSERT_TRUE(QFile::remove(helper.dciFormatFilePath("/2.new"))); ASSERT_TRUE(QFile::remove(helper.dciFormatFilePath("/1.new"))); // [/3] ASSERT_EQ(QDir(helper.dciFormatFilePath()).entryList(), (QStringList {"1", "3"})); } } dtkcore-6.7.46/tests/ut_ddesktopentrytest.cpp000066400000000000000000000074071522615770400214470ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2019 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include #include #include #include #include DCORE_USE_NAMESPACE const QString testFileContent = { QStringLiteral(R"desktop(# A. Example Desktop Entry File [Desktop Entry] Version=1.0 Type=Application Name=Foo Viewer Name[zh_CN]=ç¦�查看器 Comment=The best viewer for Foo objects available! # Next line have an extra " character Comment[zh_CN]=最棒的 "ç¦� 查看器ï¼� TryExec=fooview Exec=fooview %F Icon=fooview MimeType=image/x-foo; Actions=Gallery;Create; [Desktop Action Gallery] Exec=fooview --gallery Name=Browse Gallery [Desktop Action Create] Exec=fooview --create-new Name=Create a new Foo! Icon=fooview-new )desktop") }; class ut_DesktopEntry : public testing::Test { public: static void SetUpTestCase() { //qDebug() << "*****************" << __FUNCTION__; } static void TearDownTestCase() { //qDebug() << "*****************" << __FUNCTION__; } virtual void SetUp(); virtual void TearDown(); }; void ut_DesktopEntry::SetUp() { } void ut_DesktopEntry::TearDown() { } TEST_F(ut_DesktopEntry, ParseFile) { QTemporaryFile file("testReadXXXXXX.desktop"); ASSERT_TRUE(file.open()); const QString fileName = file.fileName(); QTextStream ts(&file); ts << testFileContent; file.close(); ASSERT_TRUE(QFile::exists(fileName)); QScopedPointer desktopFile(new DDesktopEntry(fileName)); QStringList allGroups = desktopFile->allGroups(); ASSERT_EQ(allGroups.count(), 3); ASSERT_TRUE(allGroups.contains("Desktop Entry") && allGroups.contains("Desktop Action Gallery") && allGroups.contains("Desktop Action Create")); ASSERT_EQ(desktopFile->allGroups(true)[0], QStringLiteral("Desktop Entry")); ASSERT_EQ(desktopFile->localizedValue("Name", "zh_CN"), QStringLiteral("ç¦�查看器")); ASSERT_EQ(desktopFile->localizedValue("Name", "empty"), QStringLiteral("Foo Viewer")); ASSERT_EQ(desktopFile->keys("Desktop Entry"), QStringList({"Actions", "Comment", "Comment[zh_CN]", "Exec", "Icon", "MimeType", "Name", "Name[zh_CN]", "TryExec", "Type", "Version"})); { struct RestoreLocale { ~RestoreLocale() { QLocale::setDefault(QLocale::system()); } } restoreLocale; Q_UNUSED(restoreLocale); QLocale::setDefault(QLocale("zh_CN")); ASSERT_EQ(desktopFile->localizedValue("Name"), QStringLiteral("ç¦�查看器")); QLocale::setDefault(QLocale::c()); ASSERT_EQ(desktopFile->localizedValue("Name"), QStringLiteral("Foo Viewer")); } ASSERT_EQ(desktopFile->stringValue("Name"), QStringLiteral("Foo Viewer")); ASSERT_EQ(desktopFile->setRawValue("Bar Viewer", "Name"), true); ASSERT_EQ(desktopFile->stringValue("Name"), QStringLiteral("Bar Viewer")); ASSERT_EQ(desktopFile->setLocalizedValue("霸查看器", "zh_CN", "Name"), true); ASSERT_EQ(desktopFile->localizedValue("Name", "zh_CN"), QStringLiteral("霸查看器")); ASSERT_EQ(desktopFile->contains("Semicolon"), false); ASSERT_EQ(desktopFile->setRawValue(";grp\\;2;grp3;", "Semicolon"), true); ASSERT_EQ(desktopFile->stringListValue("Semicolon"), QStringList({"", "grp;2", "grp3"})); ASSERT_EQ(desktopFile->contains("Semicolon"), true); ASSERT_EQ(desktopFile->removeEntry("Semicolon"), true); ASSERT_EQ(desktopFile->contains("Semicolon"), false); //qDebug() << desktopFile->save(); //qDebug() << fileName; } TEST_F(ut_DesktopEntry, escape) { QString slash("\\\\"); ASSERT_TRUE(DDesktopEntry::escapeExec(slash) == slash); ASSERT_TRUE(DDesktopEntry::unescapeExec(slash) == slash); } dtkcore-6.7.46/tests/ut_ddisksizeformatter.cpp000066400000000000000000000041231522615770400215550ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include "util/ddisksizeformatter.h" DCORE_USE_NAMESPACE class ut_DDiskSizeFormatter : public testing::Test { protected: void SetUp() override; void TearDown() override; DDiskSizeFormatter diskSizeFormatter; }; void ut_DDiskSizeFormatter::SetUp() { } void ut_DDiskSizeFormatter::TearDown() { } TEST_F(ut_DDiskSizeFormatter, testDDiskSizeFormatterFormatAs) { diskSizeFormatter.rate(1024); qreal result0 = diskSizeFormatter.formatAs(2048, DDiskSizeFormatter::B, DDiskSizeFormatter::K); ASSERT_TRUE(qFuzzyCompare(result0, 2)); qreal result1 = diskSizeFormatter.formatAs(2, DDiskSizeFormatter::K, DDiskSizeFormatter::B); ASSERT_TRUE(qFuzzyCompare(result1, 2048)); qreal result2 = diskSizeFormatter.formatAs(2, DDiskSizeFormatter::K, DDiskSizeFormatter::K); ASSERT_TRUE(qFuzzyCompare(result2, 2)); } TEST_F(ut_DDiskSizeFormatter, testDDiskSizeFormatterFormat) { diskSizeFormatter.rate(1024); QPair result = diskSizeFormatter.format(2048, DDiskSizeFormatter::B); ASSERT_TRUE(qFuzzyCompare(result.first, 2)); ASSERT_EQ(result.second, DDiskSizeFormatter::K); } TEST_F(ut_DDiskSizeFormatter, testDDiskSizeFormatterFormatAsUnitList) { diskSizeFormatter.rate(1024); QList> result = diskSizeFormatter.formatAsUnitList(2049, DDiskSizeFormatter::K); ASSERT_TRUE(qFuzzyCompare(result[0].first, 2)); ASSERT_EQ(result[0].second, DDiskSizeFormatter::M); ASSERT_TRUE(qFuzzyCompare(result[1].first, 1)); ASSERT_EQ(result[1].second, DDiskSizeFormatter::K); } TEST_F(ut_DDiskSizeFormatter, testDDiskSizeFormatterUnitStr) { ASSERT_EQ(diskSizeFormatter.unitStr(DDiskSizeFormatter::B), "B"); ASSERT_EQ(diskSizeFormatter.unitStr(DDiskSizeFormatter::K), "KB"); ASSERT_EQ(diskSizeFormatter.unitStr(DDiskSizeFormatter::M), "MB"); ASSERT_EQ(diskSizeFormatter.unitStr(DDiskSizeFormatter::G), "GB"); ASSERT_EQ(diskSizeFormatter.unitStr(DDiskSizeFormatter::T), "TB"); } dtkcore-6.7.46/tests/ut_dexpected.cpp000066400000000000000000000025571522615770400176160ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include "dexpected.h" DCORE_USE_NAMESPACE TEST(ut_DExpected, unexpected) { DExpected exp_void { DUnexpected { emplace_tag::USE_EMPLACE, 404, "Not Found"} }; EXPECT_FALSE(exp_void.hasValue()); EXPECT_EQ(exp_void.error().getErrorCode(), 404); EXPECT_EQ(exp_void.error().getErrorMessage(), "Not Found"); } TEST(ut_DExpected, expected) { DExpected exp_void {}; EXPECT_TRUE(exp_void.hasValue()); // void DExpected exp_int {200}; EXPECT_TRUE(exp_int.hasValue()); EXPECT_EQ(exp_int.value(), 200); } TEST(ut_DError, defaultError) { DError error; EXPECT_EQ(error.getErrorCode(), -1); EXPECT_EQ(error.getErrorMessage(), QString()); } TEST(ut_DError, setError) { DError error(404, "Not Found"); EXPECT_EQ(error.getErrorCode(), 404); EXPECT_EQ(error.getErrorMessage(), "Not Found"); error.setErrorCode(502); error.setErrorMessage("Bad Gateway"); EXPECT_EQ(error.getErrorCode(), 502); EXPECT_EQ(error.getErrorMessage(), "Bad Gateway"); } TEST(ut_DError, operator) { DError error(404, "Not Found"); DError copy = error; EXPECT_EQ(copy, error); copy.setErrorCode(502); EXPECT_NE(copy, error); qDebug() << error; // operator << } dtkcore-6.7.46/tests/ut_dexportedinterface.cpp000066400000000000000000000053211522615770400215200ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include #include #include DCORE_USE_NAMESPACE class ut_DExportedInterface : public testing::Test { public: static void SetUpTestSuite() { QDBusConnection::sessionBus().registerService("org.deepin.ExpIntfTest"); _infc = new DUtil::DExportedInterface; _infc->registerAction("quit", "quit the application", [](QString)->QVariant { qDebug() << "quit? No Way!"; return QVariant(); }); _infc->registerAction("answer", "answer to the ultimate question of life, the universe, and everything", [](QString)->QVariant { return QVariant(42); }); } static void TearDownTestSuite() { QDBusConnection::sessionBus().unregisterService("org.deepin.ExpIntfTest"); delete _infc; } static DUtil::DExportedInterface *_infc; }; DUtil::DExportedInterface *ut_DExportedInterface::_infc = nullptr; TEST_F(ut_DExportedInterface, list) { auto caller = DDBusSender().service("org.deepin.ExpIntfTest") .path("/") .interface("com.deepin.ExportedInterface") .method("list"); auto msg = caller.call(); msg.waitForFinished(); QDBusReply reply = msg; EXPECT_EQ(reply.value().size(), 2); } TEST_F(ut_DExportedInterface, help) { auto caller = DDBusSender().service("org.deepin.ExpIntfTest") .path("/") .interface("com.deepin.ExportedInterface") .method("help") .arg(QString("quit")); auto msg = caller.call(); msg.waitForFinished(); QDBusReply reply = msg; EXPECT_EQ(reply.value(), "quit: quit the application"); } TEST_F(ut_DExportedInterface, invoke) { auto caller = DDBusSender().service("org.deepin.ExpIntfTest") .path("/") .interface("com.deepin.ExportedInterface") .method("invoke") .arg(QString("answer")) .arg(QString("balabala")); auto msg = caller.call(); msg.waitForFinished(); QDBusReply reply = msg; EXPECT_EQ(reply.value(), 42); caller = DDBusSender().service("org.deepin.ExpIntfTest") .path("/") .interface("com.deepin.ExportedInterface") .method("invoke") .arg(QString("unkownAction")) // invoke an unregistered action .arg(QString("balabala")); msg = caller.call(); msg.waitForFinished(); EXPECT_TRUE(msg.isError()); EXPECT_TRUE(msg.error().type() == QDBusError::ErrorType::InvalidArgs); } dtkcore-6.7.46/tests/ut_dfilesystemwatcher.cpp000066400000000000000000000053331522615770400215520ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include #if QT_VERSION >= QT_VERSION_CHECK(6,0,0) #include //Avoid changing the access control of the standard library #endif #define private public #include "filesystem/dfilesystemwatcher.h" #undef private DCORE_USE_NAMESPACE class ut_DFileSystemWatcher : public testing::Test { protected: void SetUp() override; void TearDown() override; DFileSystemWatcher *fileSystemWatcher = nullptr; }; void ut_DFileSystemWatcher::SetUp() { fileSystemWatcher = new DFileSystemWatcher(nullptr); QDir dir0("/tmp/etc0/"); if (!dir0.exists()) dir0.mkdir("/tmp/etc0/"); QDir dir1("/tmp/etc1/"); if (!dir1.exists()) dir1.mkdir("/tmp/etc1/"); } void ut_DFileSystemWatcher::TearDown() { if (fileSystemWatcher) { delete fileSystemWatcher; fileSystemWatcher = nullptr; } QDir dir0("/tmp/etc0/"); if (dir0.exists()) dir0.remove("/tmp/etc0/"); QDir dir1("/tmp/etc1/"); if (dir1.exists()) dir1.remove("/tmp/etc1/"); } TEST_F(ut_DFileSystemWatcher, testDFileSystemWatcherAddPath) { if (!fileSystemWatcher->d_func()) return; fileSystemWatcher->addPath("/tmp/etc0"); QStringList dirs = fileSystemWatcher->directories(); ASSERT_TRUE(dirs.contains("/tmp/etc0")); } TEST_F(ut_DFileSystemWatcher, testDFileSystemWatcherAddPaths) { if (!fileSystemWatcher->d_func()) return; fileSystemWatcher->addPaths( QStringList() << "/tmp/etc0" << "/tmp/etc1"); QStringList dirs = fileSystemWatcher->directories(); ASSERT_TRUE(dirs.contains("/tmp/etc0")); ASSERT_TRUE(dirs.contains("/tmp/etc1")); } TEST_F(ut_DFileSystemWatcher, testDFileSystemWatcherRemovePath) { if (!fileSystemWatcher->d_func()) return; fileSystemWatcher->addPath("/tmp/etc0"); QStringList dirs0 = fileSystemWatcher->directories(); ASSERT_TRUE(dirs0.contains("/tmp/etc0")); fileSystemWatcher->removePath("/tmp/etc0"); QStringList dirs1 = fileSystemWatcher->directories(); ASSERT_FALSE(dirs1.contains("/tmp/etc0")); } TEST_F(ut_DFileSystemWatcher, testDFileSystemWatcherRemovePaths) { if (!fileSystemWatcher->d_func()) return; fileSystemWatcher->addPaths( QStringList() << "/tmp/etc0" << "/tmp/etc1"); QStringList dirs0 = fileSystemWatcher->directories(); ASSERT_TRUE(dirs0.contains("/tmp/etc0")); ASSERT_TRUE(dirs0.contains("/tmp/etc1")); fileSystemWatcher->removePaths(QStringList() << "/tmp/etc0" << "/tmp/etc1"); QStringList dirs1 = fileSystemWatcher->directories(); ASSERT_FALSE(dirs1.contains("/tmp/etc0")); ASSERT_FALSE(dirs1.contains("/tmp/etc1")); } dtkcore-6.7.46/tests/ut_dfilewatcher.cpp000066400000000000000000000115251522615770400203050ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include #include #include #include #include "filesystem/dfilewatcher.h" DCORE_USE_NAMESPACE class ut_DFileWatcher : public testing::Test { protected: void SetUp() override; void TearDown() override; DFileWatcher *fileWatcher = nullptr; }; void ut_DFileWatcher::SetUp() { QDir dir("/tmp/etc/"); if (!dir.exists()) dir.mkdir("/tmp/etc/"); QFile file("/tmp/etc/test"); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) return; file.close(); fileWatcher = new DFileWatcher("/tmp/etc/test"); } void ut_DFileWatcher::TearDown() { if (fileWatcher) { delete fileWatcher; fileWatcher = nullptr; } QDir dir("/tmp/etc/"); if (dir.exists()) dir.remove("/tmp/etc/"); QFile file("/tmp/etc/test"); if (file.exists()) file.remove(); QFile file1("/tmp/etc/test1"); if (file1.exists()) file1.remove(); } TEST_F(ut_DFileWatcher, testDFileWatcherFileUrl) { QUrl url = fileWatcher->fileUrl(); ASSERT_TRUE(url.toString() == "file:///tmp/etc/test"); } TEST_F(ut_DFileWatcher, testDFileWatcherStartWatcher) { if (!fileWatcher->startWatcher()) return; fileWatcher->setEnabledSubfileWatcher(QUrl()); ASSERT_TRUE(fileWatcher->startWatcher()); } TEST_F(ut_DFileWatcher, testDFileWatcherStopWatcher) { if (!fileWatcher->startWatcher()) return; ASSERT_TRUE(fileWatcher->startWatcher()); ASSERT_TRUE(fileWatcher->stopWatcher()); } TEST_F(ut_DFileWatcher, testDFileWatcherRestartWatcher) { if (!fileWatcher->startWatcher()) return; ASSERT_TRUE(fileWatcher->startWatcher()); ASSERT_TRUE(fileWatcher->restartWatcher()); } TEST_F(ut_DFileWatcher, testDFileSystemWatcherFileDeleted) { if (!fileWatcher->startWatcher()) return; ASSERT_TRUE(fileWatcher->startWatcher()); QSignalSpy spy(fileWatcher, &DBaseFileWatcher::fileDeleted); QFile file("/tmp/etc/test"); if (file.exists()) file.remove(); ASSERT_TRUE(QTest::qWaitFor([&spy](){ return spy.count() >= 1; }, 1000)); ASSERT_TRUE(spy.count() >= 1); } TEST_F(ut_DFileWatcher, testDFileSystemWatcherFileAttributeChanged) { if (!fileWatcher->startWatcher()) return; ASSERT_TRUE(fileWatcher->startWatcher()); QSignalSpy spy(fileWatcher, &DBaseFileWatcher::fileAttributeChanged); QFile file("/tmp/etc/test"); if (file.exists()) { file.remove(); } if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) return; file.close(); ASSERT_TRUE(QTest::qWaitFor([&spy](){ return spy.count() >= 1; }, 1000)); ASSERT_TRUE(spy.count() >= 1); } TEST_F(ut_DFileWatcher, testDFileSystemWatcherFileMoved) { if (!fileWatcher->startWatcher()) return; ASSERT_TRUE(fileWatcher->startWatcher()); #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QSignalSpy spy(fileWatcher, &DBaseFileWatcher::fileMoved); #else QSignalSpy spy(fileWatcher, &DBaseFileWatcher::fileDeleted); #endif QString oldFile("/tmp/etc/test"); QString newFile("/tmp/etc/test1"); QFile::rename(oldFile, newFile); ASSERT_TRUE(QTest::qWaitFor([&spy](){ return spy.count() >= 1; }, 1000)); ASSERT_TRUE(spy.count() >= 1); } TEST_F(ut_DFileWatcher, testDFileSystemWatcherSubfileCreated) { if (!fileWatcher->startWatcher()) return; ASSERT_TRUE(fileWatcher->startWatcher()); QSignalSpy spy(fileWatcher, &DBaseFileWatcher::subfileCreated); QFile file("/tmp/etc/test"); if (file.exists()) { file.remove(); } if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) return; ASSERT_TRUE(QTest::qWaitFor([&spy](){ return spy.count() >= 1; }, 1000)); ASSERT_TRUE(spy.count() >= 1); } TEST_F(ut_DFileWatcher, testDFileSystemWatcherFileModified) { if (!fileWatcher->startWatcher()) return; ASSERT_TRUE(fileWatcher->startWatcher()); QSignalSpy spy(fileWatcher, &DBaseFileWatcher::fileModified); QFile file("/tmp/etc/test"); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { return; } QTextStream out(&file); out << "hello"; file.close(); ASSERT_TRUE(QTest::qWaitFor([&spy](){ return spy.count() >= 1; }, 1000)); ASSERT_TRUE(spy.count() >= 1); } TEST_F(ut_DFileWatcher, testDFileSystemWatcherFileClosed) { if (!fileWatcher->startWatcher()) return; ASSERT_TRUE(fileWatcher->startWatcher()); QSignalSpy spy(fileWatcher, &DBaseFileWatcher::fileClosed); QFile file("/tmp/etc/test"); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { return; } file.close(); ASSERT_TRUE(QTest::qWaitFor([&spy](){ return spy.count() >= 1; }, 1000)); ASSERT_TRUE(spy.count() >= 1); } dtkcore-6.7.46/tests/ut_dfilewatchermanager.cpp000066400000000000000000000040541522615770400216370ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include #include #include #include #include #include #include #include "filesystem/dfilewatcher.h" #include "filesystem/dfilewatchermanager.h" DCORE_USE_NAMESPACE class ut_DFileWatcherManager : public testing::Test { protected: void SetUp() override; void TearDown() override; DFileWatcherManager *fileWatcherManager = nullptr; }; void ut_DFileWatcherManager::SetUp() { fileWatcherManager = new DFileWatcherManager(nullptr); } void ut_DFileWatcherManager::TearDown() { if (fileWatcherManager) { delete fileWatcherManager; fileWatcherManager = nullptr; } } TEST_F(ut_DFileWatcherManager, testDFileWatcherManagerAdd) { QTemporaryFile tmpfile; if (!tmpfile.open()) return; auto watcher = fileWatcherManager->add(tmpfile.fileName()); if (!watcher->startWatcher()) return; // test fileDeleted signal QSignalSpy spy(watcher, &DBaseFileWatcher::fileDeleted); if (tmpfile.exists()) tmpfile.remove(); ASSERT_TRUE(QTest::qWaitFor([&spy]() { return spy.count() >= 1; }, 1000)); ASSERT_TRUE(spy.count() >= 1); watcher->stopWatcher(); } TEST_F(ut_DFileWatcherManager, testDFileWatcherManagerRemove) { fileWatcherManager->add("/tmp/test"); fileWatcherManager->remove("/tmp/test"); ASSERT_EQ(fileWatcherManager->watchedFiles().count(), 0); } TEST_F(ut_DFileWatcherManager, testDFileWatcherManagerRemoveAll) { fileWatcherManager->add("/tmp/test"); fileWatcherManager->add("/tmp/test1"); fileWatcherManager->removeAll(); ASSERT_EQ(fileWatcherManager->watchedFiles().count(), 0); } TEST_F(ut_DFileWatcherManager, testDFileSystemWatcherwatchedFiles) { fileWatcherManager->add("/tmp/test"); fileWatcherManager->add("/tmp/test1"); fileWatcherManager->watchedFiles(); ASSERT_EQ(fileWatcherManager->watchedFiles().count(), 2); } dtkcore-6.7.46/tests/ut_dlicenseinfo.cpp000066400000000000000000000021061522615770400203010ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include #include "dlicenseinfo.h" DCORE_USE_NAMESPACE TEST(ut_DLicenseInfo, testLicense) { DLicenseInfo licenseInfo; QString jsonContent = u8R"([ { "name": "dtk", "version": "5.6.8", "copyright": "Copyright 2023 THe Uniontech Company Ltd. All rights reserved.", "license": "LGPLv3" } ] )"; licenseInfo.setLicenseSearchPath(":/data/"); ASSERT_TRUE(licenseInfo.loadContent(jsonContent.toLatin1())); EXPECT_EQ(licenseInfo.componentInfos().count(), 1); ASSERT_TRUE(licenseInfo.loadFile(":/data/example-license.json")); EXPECT_EQ(licenseInfo.componentInfos().count(), 1); ASSERT_FALSE(licenseInfo.licenseContent("LGPLv3").isEmpty()); } dtkcore-6.7.46/tests/ut_dlog.cpp000066400000000000000000000017671522615770400166000ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #define private public #include "log/LogManager.h" #undef private #include "dpathbuf.h" #include "dstandardpaths.h" #include "test_helper.hpp" #include DCORE_USE_NAMESPACE TEST(ut_DLogManager, testDLogManager) { DPathBuf logPath(QStandardPaths::standardLocations(QStandardPaths::CacheLocation).first()); logPath = logPath / "tests.log"; ASSERT_EQ(DLogManager::getlogFilePath(), logPath.toString()); } TEST(ut_DLogManager, testDefaultLogPath) { EnvGuard guard; guard.unset("HOME"); // unset HOME env will not init default log file path ASSERT_TRUE(DLogManager::getlogFilePath().contains(DStandardPaths::homePath())); } TEST(ut_DLogManager, testSetInvalidLogPath) { QString tmp = QDir::tempPath(); DLogManager::setlogFilePath(tmp); // set log file path to a dir is not supported ASSERT_NE(DLogManager::getlogFilePath(), tmp); } dtkcore-6.7.46/tests/ut_dnotifysender.cpp000066400000000000000000000022411522615770400205140ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #define private public #include "dnotifysender.h" #undef private DCORE_USE_NAMESPACE struct DUtil::DNotifyData { uint m_replaceId; int m_timeOut; QString m_body; QString m_summary; QString m_appIcon; QString m_appName; QStringList m_actions; QVariantMap m_hints; }; TEST(ut_DNotifySender, notify) { DUtil::DNotifySender notifySender("summary"); notifySender.appName("appName") .replaceId(123456) .appIcon("iconName") .appBody("msg body") .actions({"1", "2"}) .timeOut(5000); //.call(); EXPECT_TRUE(notifySender.m_dbusData->m_summary == "summary"); EXPECT_TRUE(notifySender.m_dbusData->m_body == "msg body"); EXPECT_TRUE(notifySender.m_dbusData->m_replaceId == 123456); EXPECT_TRUE(notifySender.m_dbusData->m_appIcon == "iconName"); EXPECT_TRUE(notifySender.m_dbusData->m_actions == QStringList({"1", "2"})); EXPECT_TRUE(notifySender.m_dbusData->m_timeOut == 5000); } dtkcore-6.7.46/tests/ut_dpathbuf.cpp000066400000000000000000000032201522615770400174320ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include #include "filesystem/dpathbuf.h" DCORE_USE_NAMESPACE class ut_DPathBuf : public testing::Test { protected: void SetUp() override; void TearDown() override; DPathBuf *pathBuf = nullptr; }; void ut_DPathBuf::SetUp() { pathBuf = new DPathBuf("/tmp/etc"); QDir dir("/tmp/etc/"); if (!dir.exists()) dir.mkdir("/tmp/etc/"); } void ut_DPathBuf::TearDown() { if (pathBuf) { delete pathBuf; pathBuf = nullptr; } QDir dir("/tmp/etc/"); if (dir.exists()) dir.remove("/tmp/etc/"); } TEST_F(ut_DPathBuf, testDPathBufOperatorSlashQString) { *pathBuf = *pathBuf / QString("test"); auto str = pathBuf->toString(); ASSERT_TRUE(str == "/tmp/etc/test"); } TEST_F(ut_DPathBuf, testDPathBufOperatorSlashEqualQString) { *pathBuf /= QString("test"); auto str = pathBuf->toString(); ASSERT_TRUE(str == "/tmp/etc/test"); } TEST_F(ut_DPathBuf, testDPathBufOperatorSlashChar) { *pathBuf = *pathBuf / "test"; auto str = pathBuf->toString(); ASSERT_TRUE(str == "/tmp/etc/test"); } TEST_F(ut_DPathBuf, testDPathBufOperatorSlashEqualChar) { *pathBuf /= "test"; auto str = pathBuf->toString(); ASSERT_TRUE(str == "/tmp/etc/test"); } TEST_F(ut_DPathBuf, testDPathBufJoin) { *pathBuf = pathBuf->join(QString("test")); auto str = pathBuf->toString(); ASSERT_TRUE(str == "/tmp/etc/test"); } TEST_F(ut_DPathBuf, testToString) { auto str = pathBuf->toString(); ASSERT_TRUE(str == "/tmp/etc"); } dtkcore-6.7.46/tests/ut_dpinyin.cpp000066400000000000000000000045531522615770400173210ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include "util/dpinyin.h" #include DCORE_USE_NAMESPACE class ut_DPinyin : public testing::Test { protected: void SetUp() override; void TearDown() override; }; void ut_DPinyin::SetUp() { } void ut_DPinyin::TearDown() { } TEST_F(ut_DPinyin, testChinese2Pinyin) { auto pinyin = Chinese2Pinyin("你好, world"); ASSERT_EQ(pinyin, "ni3hao3, world"); } TEST_F(ut_DPinyin, pinyin) { bool ok = false; QString words("深度音ä¹�"); QStringList tones = {"shÄ“ndùyÄ«nlè", "shÄ“ndùyÄ«nyuè", "shÄ“ndùyÄ«nyào", "shÄ“ndùyÄ«nlào", "shÄ“nduóyÄ«nlè", "shÄ“nduóyÄ«nyuè", "shÄ“nduóyÄ«nyào", "shÄ“nduóyÄ«nlào"}; QStringList noneTones = {"shenduyinle", "shenduyinyue", "shenduyinyao", "shenduyinlao", "shenduoyinle", "shenduoyinyue", "shenduoyinyao", "shenduoyinlao"}; QStringList numTones = {"shen1du4yin1le4", "shen1du4yin1yue4", "shen1du4yin1yao4", "shen1du4yin1lao4", "shen1duo2yin1le4", "shen1duo2yin1yue4", "shen1duo2yin1yao4", "shen1duo2yin1lao4"}; QStringList py = pinyin(words, TS_ToneNum, &ok); ASSERT_TRUE(ok); bool isPermutation = std::is_permutation(py.begin() , py.end(), numTones.begin()); ASSERT_TRUE(isPermutation); py = pinyin(words, TS_NoneTone, &ok); ASSERT_TRUE(ok); isPermutation = std::is_permutation(py.begin() , py.end(), noneTones.begin()); ASSERT_TRUE(isPermutation); py = pinyin(words, TS_Tone, &ok); ASSERT_TRUE(ok); isPermutation = std::is_permutation(py.begin() , py.end(), tones.begin()); ASSERT_TRUE(isPermutation); } TEST_F(ut_DPinyin, firstLetters) { QStringList letters = {"sdyl", "sdyy"}; QString words("深度音ä¹�"); QStringList ls = firstLetters(words); bool isPermutation = std::is_permutation(ls.begin() , ls.end(), letters.begin()); ASSERT_TRUE(isPermutation); QString words2("安全中心"); QStringList && result = firstLetters(words2, TS_NoneTone); ASSERT_TRUE(result.count() == 1); ASSERT_TRUE(result.constFirst() == "aqzx"); ASSERT_TRUE(result.constFirst() != firstLetters(words2).constFirst()); } dtkcore-6.7.46/tests/ut_drecentmanager.cpp000066400000000000000000000047071522615770400206270ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include #include #include #include #include "util/drecentmanager.h" DCORE_USE_NAMESPACE class ut_DRecentManager: public testing::Test { protected: void SetUp() override; void TearDown() override; }; void ut_DRecentManager::SetUp() { QFile file("/tmp/test"); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) return; file.close(); } void ut_DRecentManager::TearDown() { QFile file("/tmp/test"); if (file.exists()) file.remove(); } TEST_F(ut_DRecentManager, testDRecentManagerAddItem) { DRecentData data; data.appExec = "deepin-editor"; data.appName = "Deepin Editor"; data.mimeType = "text/plain"; bool ok = DRecentManager::addItem("/tmp/test", data); bool isFound = false; QFile file(QDir::homePath() + "/.local/share/recently-used.xbel"); QDomDocument doc; if (doc.setContent(&file)) { QDomElement rootEle = doc.documentElement(); QDomNodeList nodeList = rootEle.elementsByTagName("bookmark"); QDomElement bookmarkEle; QUrl url = QUrl::fromLocalFile("/tmp/test"); for (int i = 0; i < nodeList.size(); ++i) { const QString fileUrl = nodeList.at(i).toElement().attribute("href"); if (fileUrl == url.toEncoded(QUrl::FullyDecoded)) { bookmarkEle = nodeList.at(i).toElement(); isFound = true; break; } } ASSERT_TRUE(isFound == ok); } } TEST_F(ut_DRecentManager, testDRecentManagerRemoveItem) { QString testFile = QUrl::fromLocalFile("/tmp/test").toEncoded(QUrl::FullyDecoded); DRecentManager::removeItem(testFile); QFile file(QDir::homePath() + "/.local/share/recently-used.xbel"); QDomDocument doc; bool isFound = false; if (doc.setContent(&file)) { QDomElement rootEle = doc.documentElement(); QDomNodeList nodeList = rootEle.elementsByTagName("bookmark"); QDomElement bookmarkEle; for (int i = 0; i < nodeList.size(); ++i) { const QString fileUrl = nodeList.at(i).toElement().attribute("href"); if (fileUrl == testFile) { bookmarkEle = nodeList.at(i).toElement(); isFound = true; break; } } } ASSERT_TRUE(!isFound); } dtkcore-6.7.46/tests/ut_dsecurestring.cpp000066400000000000000000000013251522615770400205220ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include "dsecurestring.h" DCORE_USE_NAMESPACE class ut_DSecureString : public testing::Test { protected: void SetUp() override; void TearDown() override; DSecureString *secureString; QString string; }; void ut_DSecureString::SetUp() { secureString = new DSecureString(string); } void ut_DSecureString::TearDown() { if (secureString) { delete secureString; secureString = nullptr; } } TEST_F(ut_DSecureString, testString) { QString test = secureString->fromLatin1("test"); ASSERT_TRUE(test == QString("test")); } dtkcore-6.7.46/tests/ut_dsettings.cpp000066400000000000000000000141361522615770400176510ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include #include #include #include "settings/dsettings.h" #include "settings/dsettingsoption.h" #include "settings/dsettingsgroup.h" #include "settings/backend/gsettingsbackend.h" #include "settings/backend/qsettingbackend.h" DCORE_USE_NAMESPACE class ut_DSettings : public testing::Test { protected: void SetUp() override; void TearDown() override; DSettings *settings; QString jsonContent; }; void ut_DSettings::SetUp() { settings = new DSettings; QFile file("/tmp/test.json"); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) return; QTextStream out(&file); jsonContent = " { \"groups\": [{ " " \"key\": \"base\", " " \"name\": \"Basic settings\", " " \"groups\": [{ " " \"key\": \"open_action\", " " \"name\": \"Open Action\", " " \"options\": [{ " " \"key\": \"alway_open_on_new\", " " \"type\": \"checkbox\", " " \"text\": \"Always Open On New Windows\", " " \"default\": true " " }] " " }] }]}"; out << jsonContent; file.close(); } void ut_DSettings::TearDown() { if (settings) { delete settings; settings = nullptr; } QFile file("/tmp/test.json"); if (file.exists()) file.remove(); } TEST_F(ut_DSettings, testDSettingSetBackend) { QPointer tmpSetting = DSettings::fromJson(jsonContent.toLatin1()); QScopedPointer scopeSettings(tmpSetting.data()); QSettingBackend qBackend("/tmp/test.json"); scopeSettings->setBackend(&qBackend); QStringList qKeys = qBackend.keys(); ASSERT_TRUE(qKeys.isEmpty()); } TEST_F(ut_DSettings, testDSettingFromJson) { QPointer tmpSetting = DSettings::fromJson(jsonContent.toLatin1()); QScopedPointer scopeSettings(tmpSetting.data()); auto keys = scopeSettings->keys(); ASSERT_TRUE(!keys.isEmpty()); } TEST_F(ut_DSettings, testDSettingFromJsonFile) { QPointer tmpSetting = DSettings::fromJsonFile("/tmp/test.json"); QScopedPointer scopeSettings(tmpSetting.data()); QStringList keys = scopeSettings->keys(); ASSERT_TRUE(!keys.isEmpty()); } TEST_F(ut_DSettings, testDSettingMeta) { QPointer tmpSetting = DSettings::fromJsonFile("/tmp/test.json"); QScopedPointer scopeSettings(tmpSetting.data()); QJsonObject jsonObject = scopeSettings->meta(); ASSERT_TRUE(!jsonObject.isEmpty()); } TEST_F(ut_DSettings, testDSettingKeys) { QPointer tmpSetting = DSettings::fromJsonFile("/tmp/test.json"); QScopedPointer scopeSettings(tmpSetting.data()); QStringList keys = scopeSettings->keys(); ASSERT_TRUE(!keys.isEmpty()); } TEST_F(ut_DSettings, testDSettingOptions) { QPointer tmpSetting = DSettings::fromJsonFile("/tmp/test.json"); QScopedPointer scopeSettings(tmpSetting.data()); QList> options = scopeSettings->options(); ASSERT_TRUE(!options.isEmpty()); } TEST_F(ut_DSettings, testDSettingOption) { QPointer tmpSetting = DSettings::fromJsonFile("/tmp/test.json"); QScopedPointer scopeSettings(tmpSetting.data()); QStringList keys = scopeSettings->keys(); QPointer option = scopeSettings->option(keys[0]); QString optionKey = option->key(); ASSERT_TRUE(!optionKey.isEmpty()); QString optionName = option->name(); ASSERT_TRUE(optionName.isEmpty()); ASSERT_TRUE(option->canReset()); ASSERT_TRUE(option->defaultValue().toBool()); ASSERT_TRUE(option->viewType() == "checkbox"); } TEST_F(ut_DSettings, testDSettingValue) { QPointer tmpSetting = DSettings::fromJsonFile("/tmp/test.json"); QScopedPointer scopeSettings(tmpSetting.data()); QStringList keys = scopeSettings->keys(); QVariant value = scopeSettings->value(keys[0]); ASSERT_TRUE(value.toBool()); } TEST_F(ut_DSettings, testDSettingGroupKeys) { QPointer tmpSetting = DSettings::fromJsonFile("/tmp/test.json"); QScopedPointer scopeSettings(tmpSetting.data()); QStringList groupKeys = scopeSettings->groupKeys(); ASSERT_TRUE(!groupKeys.isEmpty()); } TEST_F(ut_DSettings, testDSettingGroups) { QPointer tmpSetting = DSettings::fromJsonFile("/tmp/test.json"); QScopedPointer scopeSettings(tmpSetting.data()); QList> groups = scopeSettings->groups(); ASSERT_TRUE(!groups.isEmpty()); } TEST_F(ut_DSettings, testDSettingGroup) { QPointer tmpSetting = DSettings::fromJsonFile("/tmp/test.json"); QScopedPointer scopeSettings(tmpSetting.data()); QStringList keys = scopeSettings->keys(); QPointer group = scopeSettings->group("base.open_action"); QString optionKey = group->key(); ASSERT_TRUE(!optionKey.isEmpty()); } TEST_F(ut_DSettings, testDSettingGetOption) { QPointer tmpSetting = DSettings::fromJsonFile("/tmp/test.json"); QScopedPointer scopeSettings(tmpSetting.data()); QStringList keys = scopeSettings->keys(); QVariant option = scopeSettings->getOption(keys[0]); ASSERT_TRUE(option.toBool()); } TEST_F(ut_DSettings, testDSettingSync) { QPointer tmpSetting = DSettings::fromJson(jsonContent.toLatin1()); QScopedPointer scopeSettings(tmpSetting.data()); scopeSettings->sync(); QStringList keys = scopeSettings->keys(); ASSERT_TRUE(!keys.isEmpty()); } TEST_F(ut_DSettings, testDSettingReset) { QPointer tmpSetting = DSettings::fromJson(jsonContent.toLatin1()); QScopedPointer scopeSettings(tmpSetting.data()); scopeSettings->reset(); QStringList keys = scopeSettings->keys(); QVariant option = scopeSettings->getOption(keys[0]); ASSERT_TRUE(option.toBool()); } dtkcore-6.7.46/tests/ut_dsgapplication.cpp000066400000000000000000000005631522615770400206450ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include #include "dsgapplication.h" DCORE_USE_NAMESPACE TEST(ut_DSGApplication, id) { if (!qgetenv("DSG_APP_ID").isEmpty()) { EXPECT_EQ(DSGApplication::id(), qgetenv("DSG_APP_ID")); } } dtkcore-6.7.46/tests/ut_dstandardpaths.cpp000066400000000000000000000122171522615770400206470ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include #include #include #include #include "test_helper.hpp" #include "filesystem/dstandardpaths.h" DCORE_USE_NAMESPACE class ut_DStandardPaths : public testing::Test { protected: void SetUp() override; void TearDown() override; }; void ut_DStandardPaths::SetUp() { QDir dir("/tmp/etc/"); if (!dir.exists()) dir.mkdir("/tmp/etc/"); DStandardPaths::setMode(DStandardPaths::Snap); QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); if (env.value("SNAP_USER_COMMON").isEmpty()) qputenv("SNAP_USER_COMMON", "/tmp/etc"); } void ut_DStandardPaths::TearDown() { QDir dir("/tmp/etc/"); if (dir.exists()) dir.remove("/tmp/etc/"); QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); if (env.value("SNAP_USER_COMMON") == "/tmp/etc") qputenv("SNAP_USER_COMMON", ""); DStandardPaths::setMode(DStandardPaths::Auto); } TEST_F(ut_DStandardPaths, testDStandardPathsWritableLocation) { QString dir = DStandardPaths::writableLocation(QStandardPaths::DesktopLocation); ASSERT_TRUE(dir == "/tmp/etc"); DStandardPaths::setMode(DStandardPaths::Test); dir = DStandardPaths::writableLocation(QStandardPaths::DesktopLocation); ASSERT_TRUE(dir == QStandardPaths::writableLocation(QStandardPaths::DesktopLocation)); } TEST_F(ut_DStandardPaths, testDStandardPathsStandardLocations) { QStringList dirs = DStandardPaths::standardLocations(QStandardPaths::DesktopLocation); ASSERT_TRUE(dirs.contains("/tmp/etc")); DStandardPaths::setMode(DStandardPaths::Test); dirs = DStandardPaths::standardLocations(QStandardPaths::DesktopLocation); ASSERT_TRUE(dirs == QStandardPaths::standardLocations(QStandardPaths::DesktopLocation)); } TEST_F(ut_DStandardPaths, testD_Q) { ASSERT_EQ(DStandardPaths::locate(QStandardPaths::ApplicationsLocation, "sh"), QStandardPaths::locate(QStandardPaths::ApplicationsLocation, "sh")); ASSERT_EQ(DStandardPaths::locateAll(QStandardPaths::ApplicationsLocation, "sh"), QStandardPaths::locateAll(QStandardPaths::ApplicationsLocation, "sh")); ASSERT_EQ(DStandardPaths::findExecutable("sh"), QStandardPaths::findExecutable("sh")); } TEST_F(ut_DStandardPaths, homepath) { EnvGuard homeGuard; homeGuard.unset("HOME"); auto homePath = DStandardPaths::homePath(); ASSERT_EQ(DStandardPaths::homePath(getuid()), homePath); homeGuard.set("HOME", "/tmp/home", false); homePath = DStandardPaths::homePath(); ASSERT_EQ("/tmp/home", homePath); homeGuard.restore(); } TEST_F(ut_DStandardPaths, xdgpath) { auto testFunc = [](DStandardPaths::XDG type, const QLatin1String &env, const QByteArray &sufix, const QString &prefix = DStandardPaths::homePath()) { EnvGuard guard; guard.unset(env.data()); QString path = DStandardPaths::path(type); const QString &localpath = prefix + sufix; ASSERT_EQ(path, localpath); QByteArray custom = QByteArray("/tmp/home") + sufix; guard.set(env.data(), custom, false); qputenv(env.data(), custom.data()); path = DStandardPaths::path(type); ASSERT_EQ(path, custom); guard.restore(); }; testFunc(DStandardPaths::XDG::DataHome, QLatin1String("XDG_DATA_HOME"), "/.local/share"); testFunc(DStandardPaths::XDG::CacheHome, QLatin1String("XDG_CACHE_HOME"), "/.cache"); testFunc(DStandardPaths::XDG::ConfigHome, QLatin1String("XDG_CONFIG_HOME"), "/.config"); testFunc(DStandardPaths::XDG::RuntimeDir, QLatin1String("XDG_RUNTIME_DIR"), QByteArray::number(getuid()), "/run/user/"); } TEST_F(ut_DStandardPaths, dsgpath) { { EnvGuard guard; guard.unset("DSG_APP_DATA"); QString path = DStandardPaths::path(DStandardPaths::DSG::AppData); ASSERT_EQ(path, QString()); guard.set("DSG_APP_DATA", "/tmp/dsg"); path = DStandardPaths::path(DStandardPaths::DSG::AppData); ASSERT_EQ(path, "/tmp/dsg"); guard.restore(); } { EnvGuard guard; guard.unset("DSG_DATA_DIRS"); QString path = DStandardPaths::path(DStandardPaths::DSG::DataDir); ASSERT_EQ(path, QString(PREFIX"/share/dsg")); guard.set("DSG_DATA_DIRS", "/tmp/dsg"); path = DStandardPaths::path(DStandardPaths::DSG::DataDir); ASSERT_EQ(path, "/tmp/dsg"); guard.restore(); } } TEST_F(ut_DStandardPaths, filepath) { { EnvGuard guard; guard.unset("DSG_APP_DATA"); QString path = DStandardPaths::filePath(DStandardPaths::DSG::AppData, "filename"); ASSERT_EQ(path, QString()); guard.set("DSG_APP_DATA", "/tmp/dsg"); path = DStandardPaths::filePath(DStandardPaths::DSG::AppData, "filename"); ASSERT_EQ(path, "/tmp/dsg/filename"); guard.restore(); } QString path = DStandardPaths::filePath(DStandardPaths::XDG::CacheHome, "filename"); ASSERT_EQ(path, DStandardPaths::path(DStandardPaths::XDG::CacheHome).append("/filename")); } dtkcore-6.7.46/tests/ut_dsysinfo.cpp000066400000000000000000000356271522615770400175130ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include #include #include #include "dsysinfo.h" #include "ddesktopentry.h" #include "test_helper.hpp" DCORE_USE_NAMESPACE class ut_DSysInfo : public testing::Test { protected: void SetUp() override { if (QLatin1String(DSYSINFO_PREFIX).isEmpty()) { GTEST_SKIP_("DSYSINFO_PREFIX not defined..."); } } void TearDown() override { } }; TEST_F(ut_DSysInfo, testOsVersion) { FileGuard guard("/tmp/etc/os-version"); DDesktopEntry entry(guard.fileName()); entry.setStringValue("UnionTech OS Desktop", "SystemName", "Version"); entry.setStringValue("统信桌é�¢æ“�作系统", "SystemName[zh_CN]", "Version"); entry.setStringValue("Desktop", "ProductType", "Version"); entry.setStringValue("桌é�¢", "ProductType[zh_CN]", "Version"); entry.setStringValue("Professional", "EditionName", "Version"); entry.setStringValue("专业版", "EditionName[zh_CN]", "Version"); entry.setStringValue("20", "MajorVersion", "Version"); entry.setStringValue("100A", "MinorVersion", "Version"); entry.setStringValue("11Z18.107.109", "OsBuild", "Version"); ASSERT_TRUE(entry.save()); ASSERT_TRUE(DSysInfo::uosSystemName(QLocale("C")) == "UnionTech OS Desktop"); ASSERT_TRUE(DSysInfo::uosSystemName(QLocale("zh_CN")) == "统信桌é�¢æ“�作系统"); ASSERT_TRUE(DSysInfo::uosProductTypeName(QLocale("zh_CN")) == "桌é�¢"); ASSERT_TRUE(DSysInfo::uosProductTypeName(QLocale("C")) == "Desktop"); ASSERT_TRUE(DSysInfo::uosEditionName(QLocale("zh_CN")) == "专业版"); ASSERT_TRUE(DSysInfo::uosEditionName(QLocale("C")) == "Professional"); ASSERT_TRUE(DSysInfo::majorVersion() == "20"); ASSERT_TRUE(DSysInfo::minorVersion() == "100A"); ASSERT_TRUE(DSysInfo::buildVersion() == "107.109"); // test minVersion.BC SP1….SP99 for (int i = 0; i < 3; ++i) { int sp = QRandomGenerator::global()->generate() % 100; entry.setStringValue(QString("%1").arg(1001 + sp * 10), "MinorVersion", "Version"); ASSERT_TRUE(entry.save()); ASSERT_TRUE(DSysInfo::spVersion() == (sp ? QString("SP%1").arg(sp) : QString())); } // test minVersion.D udpate1~udpate9 updateA~udpateZ for (int i = 0; i < 10; ++i) { entry.setStringValue(QString("%1").arg(1000 + i), "MinorVersion", "Version"); ASSERT_TRUE(entry.save()); ASSERT_TRUE(DSysInfo::udpateVersion() == (i ? QString("update%1").arg(i) : QString())); } for (char c = 'A'; c <= 'Z'; ++c) { entry.setStringValue(QString("100").append(c), "MinorVersion", "Version"); ASSERT_TRUE(entry.save()); ASSERT_TRUE(DSysInfo::udpateVersion() == QString("update%1").arg(c)); } // test incalide MinorVersion entry.setStringValue(QString("100?"), "MinorVersion", "Version"); ASSERT_TRUE(entry.save()); ASSERT_TRUE(DSysInfo::udpateVersion() == QString()); // restore MinorVersion entry.setStringValue(QString("1000"), "MinorVersion", "Version"); ASSERT_TRUE(entry.save()); // test OsBuild.B == 1 && OsBuild.D = [1, 6] ASSERT_TRUE(DSysInfo::uosType() == DSysInfo::UosDesktop); for (int i = 1; i <= 6; ++i) { entry.setStringValue(QString("%1").arg(11008.107 + i * 10), "OsBuild", "Version"); ASSERT_TRUE(entry.save()); switch (i) { case 1: ASSERT_TRUE(DSysInfo::uosEditionType() == DSysInfo::UosProfessional); break; case 2: ASSERT_TRUE(DSysInfo::uosEditionType() == DSysInfo::UosHome); break; case 4: ASSERT_TRUE(DSysInfo::uosEditionType() == DSysInfo::UosMilitary); break; case 5: ASSERT_TRUE(DSysInfo::uosEditionType() == DSysInfo::UosDeviceEdition); break; case 6: ASSERT_TRUE(DSysInfo::uosEditionType() == DSysInfo::UosEducation); break; default: break; } } // test OsBuild.B == 2 && OsBuild.D = [1, 5] entry.setStringValue("12018.107", "OsBuild", "Version"); ASSERT_TRUE(entry.save()); ASSERT_TRUE(DSysInfo::uosType() == DSysInfo::UosServer); for (int i = 1; i <= 5; ++i) { entry.setStringValue(QString("%1").arg(12008.107 + i * 10), "OsBuild", "Version"); ASSERT_TRUE(entry.save()); switch (i) { case 1: ASSERT_TRUE(DSysInfo::uosEditionType() == DSysInfo::UosEnterprise); break; case 2: ASSERT_TRUE(DSysInfo::uosEditionType() == DSysInfo::UosEnterpriseC); break; case 3: ASSERT_TRUE(DSysInfo::uosEditionType() == DSysInfo::UosEuler); break; case 4: ASSERT_TRUE(DSysInfo::uosEditionType() == DSysInfo::UosMilitaryS); break; case 5: ASSERT_TRUE(DSysInfo::uosEditionType() == DSysInfo::UosDeviceEdition); break; default: break; } } // test OsBuild.B == 3 entry.setStringValue("13018.107", "OsBuild", "Version"); ASSERT_TRUE(entry.save()); ASSERT_TRUE(DSysInfo::uosType() == DSysInfo::UosDevice); ASSERT_TRUE(DSysInfo::uosEditionType() == DSysInfo::UosEnterprise); // test invalid OsBuild.B entry.setStringValue("10018.107", "OsBuild", "Version"); ASSERT_TRUE(entry.save()); ASSERT_TRUE(DSysInfo::uosType() == DSysInfo::UosTypeUnknown); // 社区版测试 entry.setStringValue("Community", "EditionName", "Version"); entry.setStringValue("社区版", "EditionName[zh_CN]", "Version"); entry.setStringValue("21.1.2", "MinorVersion", "Version"); entry.setStringValue("11038.107", "OsBuild", "Version"); ASSERT_TRUE(entry.save()); ASSERT_TRUE(DSysInfo::uosEditionName(QLocale("zh_CN")) == "社区版"); ASSERT_TRUE(DSysInfo::uosEditionName(QLocale("C")) == "Community"); ASSERT_TRUE(DSysInfo::minorVersion() == "21.1.2"); ASSERT_TRUE(DSysInfo::buildVersion() == "107"); //社区版A_BC_D模å¼� test minVersion.BC SP1….SP99 for (int i = 0; i < 3; ++i) { int sp = QRandomGenerator::global()->generate() % 100; entry.setStringValue(QString("%1").arg(1001 + sp * 10), "MinorVersion", "Version"); ASSERT_TRUE(entry.save()); ASSERT_TRUE(DSysInfo::spVersion() == (sp ? QString("SP%1").arg(sp) : QString())); } //社区版A_BC_D模å¼� test minVersion.D udpate1~udpate9 updateA~udpateZ for (int i = 0; i < 10; ++i) { entry.setStringValue(QString("%1").arg(1000 + i), "MinorVersion", "Version"); ASSERT_TRUE(entry.save()); ASSERT_TRUE(DSysInfo::udpateVersion() == (i ? QString("update%1").arg(i) : QString())); } auto dmax = [](int x, int y){ return x > y ? x : y; }; //社区版A_B_C模å¼� test minVersion.BC SP1….SP99 const QString &defalutSP("21.%1"); for (int i = 1; i < 3; ++i) { int sp = dmax(QRandomGenerator::global()->generate() % 100, 1); entry.setStringValue(defalutSP.arg(sp), "MinorVersion", "Version"); ASSERT_TRUE(entry.save()); ASSERT_TRUE(DSysInfo::spVersion() == QString("SP%1").arg(sp)); } //社区版A_B_C模å¼� test minVersion.D udpate1~udpate9 updateA~udpateZ const QString &defalutUpdate("21.1.%1"); for (int i = 1; i < 3; ++i) { int sp = dmax(QRandomGenerator::global()->generate() % 100, 1); entry.setStringValue(defalutUpdate.arg(sp), "MinorVersion", "Version"); ASSERT_TRUE(entry.save()); ASSERT_TRUE(DSysInfo::udpateVersion() == QString("update%1").arg(sp)); } // 家庭版测试 entry.setStringValue("Home", "EditionName", "Version"); entry.setStringValue("家庭版", "EditionName[zh_CN]", "Version"); entry.setStringValue("21.0", "MinorVersion", "Version"); entry.setStringValue("11078.107", "OsBuild", "Version"); ASSERT_TRUE(entry.save()); ASSERT_TRUE(DSysInfo::uosEditionName(QLocale("zh_CN")) == "家庭版"); ASSERT_TRUE(DSysInfo::uosEditionName(QLocale("C")) == "Home"); ASSERT_TRUE(DSysInfo::minorVersion() == "21.0"); ASSERT_TRUE(DSysInfo::buildVersion() == "107"); ASSERT_TRUE(DSysInfo::spVersion() == QStringLiteral("")); ASSERT_TRUE(DSysInfo::udpateVersion() == QStringLiteral("")); } TEST_F(ut_DSysInfo, testdistributionInfo) { FileGuard fg("/tmp/share/deepin/distribution.info"); DDesktopEntry entry(fg.fileName()); entry.setStringValue("Deepin", "Name", "Distribution"); entry.setStringValue("www.deepin.org", "WebsiteName", "Distribution"); entry.setStringValue("https://www.deepin.org", "Website", "Distribution"); entry.setStringValue("Logo.svg", "Logo", "Distribution"); entry.setStringValue("LogoLight.svg", "LogoLight", "Distribution"); entry.setStringValue("LogoTransparent.svg", "LogoTransparent", "Distribution"); entry.setStringValue("Deepin-Manufacturer", "Name", "Manufacturer"); entry.setStringValue("Deepin-Distributor", "Name", "Distributor"); ASSERT_TRUE(entry.save()); EnvGuard guard; guard.set("XDG_DATA_HOME", "/tmp/share"); ASSERT_EQ(DSysInfo::distributionInfoPath(), fg.fileName()); auto website = DSysInfo::distributionOrgWebsite(); ASSERT_EQ(website.first, "www.deepin.org"); ASSERT_EQ(website.second, "https://www.deepin.org"); ASSERT_EQ(DSysInfo::distributionOrgLogo(DSysInfo::Distribution, DSysInfo::Normal), "Logo.svg"); ASSERT_EQ(DSysInfo::distributionOrgLogo(DSysInfo::Distribution, DSysInfo::Light), "LogoLight.svg"); ASSERT_EQ(DSysInfo::distributionOrgLogo(DSysInfo::Distribution, DSysInfo::Symbolic), ""); // not set ASSERT_EQ(DSysInfo::distributionOrgLogo(DSysInfo::Distribution, DSysInfo::Transparent), "LogoTransparent.svg"); ASSERT_EQ(DSysInfo::distributionOrgName(DSysInfo::Distribution), "Deepin"); ASSERT_EQ(DSysInfo::distributionOrgName(DSysInfo::Distributor), "Deepin-Distributor"); ASSERT_EQ(DSysInfo::distributionOrgName(DSysInfo::Manufacturer), "Deepin-Manufacturer"); guard.restore(); } TEST_F(ut_DSysInfo, osRelease) { FileGuard fg("/tmp/etc/os-release"); DDesktopEntry entry(fg.fileName()); entry.setStringValue("Deepin", "ID", "Release"); entry.setStringValue("20.9", "VERSION_ID", "Release"); entry.setStringValue("Deepin 20.9", "PRETTY_NAME", "Release"); ASSERT_TRUE(entry.save()); ASSERT_EQ(DSysInfo::operatingSystemName(), "Deepin 20.9"); ASSERT_EQ(DSysInfo::productType(), DSysInfo::Deepin); ASSERT_EQ(DSysInfo::productTypeString(), "Deepin"); ASSERT_EQ(DSysInfo::productVersion(), "20.9"); // isDeepin ASSERT_TRUE(DSysInfo::isDeepin()); entry.setStringValue("Uos", "ID", "Release"); ASSERT_TRUE(entry.save()); ASSERT_TRUE(DSysInfo::isDeepin()); entry.setStringValue("arch", "ID", "Release"); ASSERT_TRUE(entry.save()); ASSERT_FALSE(DSysInfo::isDeepin()); QString types[] = {"UnknownType", "Deepin", "Arch", "CentOS", "Debian", "Fedora", "LinuxMint", "Manjaro", "openSUSE","SailfishOS", "Ubuntu", "Uos", "Gentoo", "NixOS"}; for (int i = DSysInfo::UnknownType; i <= DSysInfo::NixOS; ++i) { entry.setStringValue(types[i], "ID", "Release"); ASSERT_TRUE(entry.save()); ASSERT_EQ(DSysInfo::productType(), DSysInfo::ProductType(i)); } } TEST_F(ut_DSysInfo, isDDE) { FileGuard fg("/tmp/etc/os-release"); DDesktopEntry entry(fg.fileName()); entry.setStringValue("Deepin 20.9", "PRETTY_NAME", "Release"); entry.setStringValue("Deepin", "ID", "Release"); entry.setStringValue("20.9", "VERSION_ID", "Release"); ASSERT_TRUE(entry.save()); FileGuard fg2("/tmp/etc/deepin-version"); DDesktopEntry entry2(fg2.fileName()); entry2.setStringValue("20.9", "Version", "Release"); entry2.setStringValue("Desktop", "Type", "Release"); ASSERT_TRUE(entry2.save()); // isDeepin && deepinType valid ASSERT_TRUE(DSysInfo::isDeepin()); ASSERT_TRUE(DSysInfo::isDDE()); // isDeepin but deepinType unknow entry2.setStringValue("Unknown", "Type", "Release"); ASSERT_TRUE(entry2.save()); ASSERT_TRUE(DSysInfo::isDeepin()); ASSERT_FALSE(DSysInfo::isDDE()); // !isDeepin && XDG_SESSION_DESKTOP == dde or deepin { entry.setStringValue("Unknown", "ID", "Release"); ASSERT_TRUE(entry.save()); ASSERT_FALSE(DSysInfo::isDeepin()); EnvGuard guard; guard.set("XDG_SESSION_DESKTOP", "dde"); ASSERT_TRUE(DSysInfo::isDDE()); guard.restore(); guard.set("XDG_SESSION_DESKTOP", "deepin"); ASSERT_TRUE(DSysInfo::isDDE()); guard.restore(); guard.set("XDG_SESSION_DESKTOP", "Unknown"); ASSERT_FALSE(DSysInfo::isDDE()); guard.restore(); } } TEST_F(ut_DSysInfo, deepinVersion) { FileGuard fg("/tmp/etc/deepin-version"); DDesktopEntry entry(fg.fileName()); entry.setStringValue("20.9", "Version", "Release"); entry.setStringValue("Desktop", "Type", "Release"); entry.setStringValue("社区版", "Type[zh_CN]", "Release"); entry.setStringValue("Y2020E0001", "Edition", "Release"); entry.setStringValue("Y2020CR001", "Copyright", "Release"); entry.setStringValue("build1", "Buildid", "Addition"); //entry.setStringValue("", "Milestone", "Addition"); ASSERT_TRUE(entry.save()); ASSERT_EQ(DSysInfo::deepinTypeDisplayName(QLocale("C")), "Desktop"); ASSERT_EQ(DSysInfo::deepinTypeDisplayName(QLocale("zh_CN")), "社区版"); ASSERT_EQ(DSysInfo::deepinVersion(), "20.9"); ASSERT_EQ(DSysInfo::deepinEdition(), "Y2020E0001"); ASSERT_EQ(DSysInfo::deepinCopyright(), "Y2020CR001"); qInfo() << "DSysInfo::deepinType()" << DSysInfo::deepinType(); ASSERT_EQ(DSysInfo::deepinType(), DSysInfo::DeepinDesktop); { // isCommunityEdition Not Uos FileGuard fg("/tmp/etc/os-release"); DDesktopEntry entry(fg.fileName()); entry.setStringValue("Deepin", "ID", "Release"); ASSERT_TRUE(entry.save()); ASSERT_TRUE(DSysInfo::isCommunityEdition()); entry.setStringValue("Uos", "ID", "Release"); ASSERT_TRUE(entry.save()); ASSERT_FALSE(DSysInfo::isCommunityEdition()); } entry.setStringValue("Professional", "Type", "Release"); ASSERT_TRUE(entry.save()); ASSERT_EQ(DSysInfo::deepinType(), DSysInfo::DeepinProfessional); ASSERT_FALSE(DSysInfo::isCommunityEdition()); entry.setStringValue("Server", "Type", "Release"); ASSERT_TRUE(entry.save()); ASSERT_EQ(DSysInfo::deepinType(), DSysInfo::DeepinServer); ASSERT_FALSE(DSysInfo::isCommunityEdition()); entry.setStringValue("Personal", "Type", "Release"); ASSERT_TRUE(entry.save()); ASSERT_EQ(DSysInfo::deepinType(), DSysInfo::DeepinPersonal); ASSERT_FALSE(DSysInfo::isCommunityEdition()); } TEST_F(ut_DSysInfo, other) { qDebug() << DSysInfo::computerName(); qDebug() << DSysInfo::memoryInstalledSize(); qDebug() << DSysInfo::memoryTotalSize(); qDebug() << DSysInfo::systemDiskSize(); } dtkcore-6.7.46/tests/ut_dtextencoding.cpp000066400000000000000000000240441522615770400205030ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022-2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dtextencoding.h" #include #include #include #include #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) #include #else #include #endif DCORE_USE_NAMESPACE class ut_DTextEncoding : public testing::Test { public: static void SetUpTestCase(); bool rewriteTempFile(const QByteArray &data); void removeTempFile(); static bool canLoadUchardet; static bool canLoadICU; static QString tmpFileName; static QByteArray dataGB18030; static QByteArray dataEUC_JP; static QByteArray dataKOI8_R; protected: void TearDown() override; }; bool ut_DTextEncoding::canLoadUchardet = false; bool ut_DTextEncoding::canLoadICU = false; QString ut_DTextEncoding::tmpFileName; // Utf8 Chinese Text(Hex): 中文测试一二三四123456789abcdefgh QByteArray ut_DTextEncoding::dataGB18030 = "\xd6\xd0\xce\xc4\xb2\xe2\xca\xd4\xd2\xbb\xb6\xfe\xc8\xfd\xcb\xc4\x31\x32\x33\x34\x35" "\x36\x37\x38\x39\x61\x62\x63\x64\x65\x66\x67\x68"; // Utf8 Japanese Text(Hex): 日本語ã�®ãƒ†ã‚¹ãƒˆ ワン ツー スリー フォー 123456789abcdefgh QByteArray ut_DTextEncoding::dataEUC_JP = "\xc6\xfc\xcb\xdc\xb8\xec\xa4\xce\xa5\xc6\xa5\xb9\xa5\xc8\x20\xa5\xef\xa5\xf3\x20\xa5\xc4\xa1\xbc\x20\xa5\xb9\xa5\xea\xa1\xbc" "\x20\xa5\xd5\xa5\xa9\xa1\xbc\x20\x31\x32\x33\x34\x35\x36\x37\x38\x39\x61\x62\x63\x64\x65\x66\x67\x68"; // Utf8 Russian Text(Hex): РуÑ�Ñ�кий теÑ�Ñ‚ раз два три четыре 123456789abcdefgh QByteArray ut_DTextEncoding::dataKOI8_R = "\xf2\xd5\xd3\xd3\xcb\xc9\xca\x20\xd4\xc5\xd3\xd4\x20\xd2\xc1\xda\x20\xc4\xd7\xc1\x20\xd4\xd2\xc9\x20\xde\xc5\xd4\xd9\xd2\xc5" "\x20\x31\x32\x33\x34\x35\x36\x37\x38\x39\x61\x62\x63\x64\x65\x66\x67\x68"; void ut_DTextEncoding::SetUpTestCase() { QLibrary uchardet("libuchardet", "0"); if (!uchardet.isLoaded()) { canLoadUchardet = uchardet.load(); if (canLoadUchardet) { uchardet.unload(); } } QLibrary icuuc("libicuuc"); if (icuuc.isLoaded()) { canLoadICU = icuuc.load(); if (canLoadICU) { icuuc.unload(); } } } bool ut_DTextEncoding::rewriteTempFile(const QByteArray &data) { QTemporaryFile tmpFile; if (!tmpFile.open()) { return false; } tmpFileName = tmpFile.fileName(); tmpFile.setAutoRemove(false); tmpFile.write(data); tmpFile.close(); return true; } void ut_DTextEncoding::removeTempFile() { if (QFile::exists(tmpFileName)) { QFile::remove(tmpFileName); } } void ut_DTextEncoding::TearDown() { removeTempFile(); } TEST_F(ut_DTextEncoding, testDetectTextEncode) { // Default encoding is utf-8. ASSERT_EQ("UTF-8", DTextEncoding::detectTextEncoding("")); ASSERT_EQ("UTF-8", DTextEncoding::detectTextEncoding("12345678ABCDEFG")); ASSERT_EQ("GB18030", DTextEncoding::detectTextEncoding(dataGB18030)); ASSERT_EQ("EUC-JP", DTextEncoding::detectTextEncoding(dataEUC_JP)); ASSERT_EQ("KOI8-R", DTextEncoding::detectTextEncoding(dataKOI8_R)); } TEST_F(ut_DTextEncoding, testDetectTextEncodeWithUchardet) { if (canLoadUchardet) { QByteArray uchardetEncoding("EUC-TW"); #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) auto encode = QStringConverter::encodingForName(uchardetEncoding); ASSERT_FALSE(encode); #else // QTextCodec not suppotted EUC-TW. QTextCodec *codec = QTextCodec::codecForName(uchardetEncoding); ASSERT_EQ(codec, nullptr); #endif // Utf8 text: ç¹�體中文測試一二三四 QByteArray dataZhTraditional("\u7e41\u9ad4\u4e2d\u6587\u6e2c\u8a66\u4e00\u4e8c\u4e09\u56db"); QByteArray dataEUC_TW; ASSERT_TRUE(DTextEncoding::convertTextEncoding(dataZhTraditional, dataEUC_TW, uchardetEncoding)); ASSERT_EQ(uchardetEncoding, DTextEncoding::detectTextEncoding(dataEUC_TW)); QByteArray convertGB18030; ASSERT_TRUE(DTextEncoding::convertTextEncoding(dataEUC_TW, convertGB18030, "GB18030")); QByteArray convertUTF8; ASSERT_TRUE(DTextEncoding::convertTextEncoding(convertGB18030, convertUTF8, "UTF-8")); ASSERT_EQ(dataZhTraditional, convertUTF8); } } TEST_F(ut_DTextEncoding, testDetectFileEncode) { bool isOk = false; ASSERT_EQ("", DTextEncoding::detectFileEncoding(tmpFileName, &isOk)); ASSERT_FALSE(isOk); ASSERT_TRUE(rewriteTempFile("")); ASSERT_EQ("UTF-8", DTextEncoding::detectFileEncoding(tmpFileName, &isOk)); ASSERT_TRUE(isOk); ASSERT_TRUE(rewriteTempFile(dataGB18030)); ASSERT_EQ("GB18030", DTextEncoding::detectFileEncoding(tmpFileName, &isOk)); ASSERT_TRUE(isOk); ASSERT_TRUE(rewriteTempFile(dataEUC_JP)); ASSERT_EQ("EUC-JP", DTextEncoding::detectFileEncoding(tmpFileName, &isOk)); ASSERT_TRUE(isOk); ASSERT_TRUE(rewriteTempFile(dataKOI8_R)); ASSERT_EQ("KOI8-R", DTextEncoding::detectFileEncoding(tmpFileName, &isOk)); ASSERT_TRUE(isOk); } TEST_F(ut_DTextEncoding, testConvertTextEncoding) { QByteArray dataUTF_8; ASSERT_TRUE(DTextEncoding::convertTextEncoding(dataGB18030, dataUTF_8, "UTF-8")); ASSERT_EQ("UTF-8", DTextEncoding::detectTextEncoding(dataUTF_8)); // QStringConverter not support GB18030. #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QTextCodec *codec = QTextCodec::codecForName("GB18030"); ASSERT_EQ(codec->toUnicode(dataGB18030).toUtf8(), dataUTF_8); QByteArray convertedGB18030; ASSERT_TRUE(DTextEncoding::convertTextEncoding(dataUTF_8, convertedGB18030, "GB18030")); ASSERT_EQ(dataGB18030, convertedGB18030); #endif // Convert with multi bytes encoding. QByteArray dataUTF_16; ASSERT_TRUE(DTextEncoding::convertTextEncoding(dataUTF_8, dataUTF_16, "UTF-16")); ASSERT_EQ("UTF-16", DTextEncoding::detectTextEncoding(dataUTF_16)); #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) // Qt6 using utf-16 string by default, not utf-8. auto fromUtf16 = QStringDecoder(QStringDecoder::Utf16); QString strUtf16 = fromUtf16.decode(dataUTF_16); ASSERT_EQ(strUtf16, QString::fromUtf8(dataUTF_8)); #else codec = QTextCodec::codecForName("UTF-16"); ASSERT_EQ(codec->toUnicode(dataUTF_16).toUtf8(), dataUTF_8); #endif QByteArray convertedUTF8; ASSERT_TRUE(DTextEncoding::convertTextEncoding(dataUTF_16, convertedUTF8, "UTF-8")); ASSERT_EQ(dataUTF_8, convertedUTF8); QByteArray dataUTF_32; ASSERT_TRUE(DTextEncoding::convertTextEncoding(dataUTF_8, dataUTF_32, "UTF-32")); ASSERT_EQ("UTF-32", DTextEncoding::detectTextEncoding(dataUTF_32)); #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) auto fromUtf32 = QStringDecoder(QStringDecoder::Utf32); QString strUtf32 = fromUtf32.decode(dataUTF_32); ASSERT_EQ(strUtf32, QString::fromUtf8(dataUTF_8)); #else codec = QTextCodec::codecForName("UTF-32"); ASSERT_EQ(codec->toUnicode(dataUTF_32).toUtf8(), dataUTF_8); #endif ASSERT_TRUE(DTextEncoding::convertTextEncoding(dataUTF_32, convertedUTF8, "UTF-8")); ASSERT_EQ(dataUTF_8, convertedUTF8); } TEST_F(ut_DTextEncoding, testConvertTextEncodingWithError) { QByteArray dataUTF_8; ASSERT_FALSE(DTextEncoding::convertTextEncoding(dataGB18030, dataUTF_8, "ERROR")); ASSERT_FALSE(DTextEncoding::convertTextEncoding(dataGB18030, dataUTF_8, "KOI8-R")); QByteArray tmpUTF_8Error = "\x31\x32\x33\xFF\xFF\xFF\x31\x32\x33"; QByteArray tmpUTF_16; QString error; int converted = 0; bool ret = DTextEncoding::convertTextEncodingEx(tmpUTF_8Error, tmpUTF_16, "UTF-16", "UTF-8", &error, &converted); ASSERT_FALSE(ret); ASSERT_FALSE(error.isEmpty()); ASSERT_EQ(converted, 3); QByteArray tmpUTF_8Error2 = "\xFF\xFF"; converted = 3; ret = DTextEncoding::convertTextEncodingEx(tmpUTF_8Error2, tmpUTF_16, "UTF-16", "UTF-8", &error, &converted); ASSERT_FALSE(ret); ASSERT_EQ(converted, 0); } TEST_F(ut_DTextEncoding, testConvertFileEncoding) { ASSERT_TRUE(rewriteTempFile(dataGB18030)); ASSERT_TRUE(DTextEncoding::convertFileEncoding(tmpFileName, "UTF-8")); ASSERT_EQ("UTF-8", DTextEncoding::detectFileEncoding(tmpFileName)); ASSERT_TRUE(DTextEncoding::convertFileEncoding(tmpFileName, "UTF-32")); ASSERT_EQ("UTF-32", DTextEncoding::detectFileEncoding(tmpFileName)); ASSERT_FALSE(DTextEncoding::convertFileEncoding("", "UTF-32")); } TEST_F(ut_DTextEncoding, testConvertFileEncodingTo) { QString tmpConvertFileName("/tmp/ut_DTextEncoding_temp_testConvertFileEncodingTo.txt"); if (QFile::exists(tmpConvertFileName)) { ASSERT_TRUE(QFile::remove(tmpConvertFileName)); } ASSERT_TRUE(rewriteTempFile(dataGB18030)); ASSERT_TRUE(DTextEncoding::convertFileEncodingTo(tmpFileName, tmpConvertFileName, "GB18030")); ASSERT_TRUE(QFile::exists(tmpConvertFileName)); ASSERT_TRUE(DTextEncoding::convertFileEncodingTo(tmpFileName, tmpConvertFileName, "UTF-8")); ASSERT_TRUE(QFile::exists(tmpConvertFileName)); ASSERT_EQ("UTF-8", DTextEncoding::detectFileEncoding(tmpConvertFileName)); ASSERT_TRUE(DTextEncoding::convertFileEncodingTo(tmpFileName, tmpConvertFileName, "UTF-32")); ASSERT_EQ("UTF-32", DTextEncoding::detectFileEncoding(tmpConvertFileName)); ASSERT_TRUE(QFile::remove(tmpConvertFileName)); } TEST_F(ut_DTextEncoding, testConvertFileEncodingToWithError) { QString tmpConvertFileName("/tmp/ut_DTextEncoding_temp_testConvertFileEncodingToWithError.txt"); if (QFile::exists(tmpConvertFileName)) { ASSERT_TRUE(QFile::remove(tmpConvertFileName)); } ASSERT_FALSE(DTextEncoding::convertFileEncodingTo("", tmpConvertFileName, "UTF-32")); ASSERT_FALSE(DTextEncoding::convertFileEncodingTo(tmpFileName, "", "UTF-32")); ASSERT_FALSE(DTextEncoding::convertFileEncodingTo(tmpFileName, tmpConvertFileName, "ERROR")); ASSERT_FALSE(QFile::exists(tmpConvertFileName)); ASSERT_TRUE(rewriteTempFile(dataGB18030)); ASSERT_FALSE(DTextEncoding::convertFileEncodingTo(tmpFileName, tmpConvertFileName, "EUC-JP")); ASSERT_FALSE(QFile::exists(tmpConvertFileName)); } dtkcore-6.7.46/tests/ut_dthreadutils.cpp000066400000000000000000000147501522615770400203430ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include #include #include #include #include #include #include #include DCORE_USE_NAMESPACE #if DTK_VERSION < DTK_VERSION_CHECK(6, 0, 0, 0) class ThreadUtils : public QObject { Q_OBJECT public Q_SLOTS: void testCallInMainThread(); }; void ThreadUtils::testCallInMainThread() { DThreadUtil::runInMainThread([]() { bool result = QThread::currentThread() == QCoreApplication::instance()->thread(); ASSERT_TRUE(result); }); auto fe = QtConcurrent::run([] { ASSERT_TRUE(DThreadUtil::runInMainThread([](QThread *thread) -> bool { return QThread::currentThread() == QCoreApplication::instance()->thread() && QThread::currentThread() != thread; }, QThread::currentThread())); }); ASSERT_TRUE(QTest::qWaitFor([&] { return fe.isFinished(); })); } class ut_DThreadUtils : public testing::Test { public: virtual void SetUp() { m_threadutil = new ThreadUtils(); } virtual void TearDown() { delete m_threadutil; } protected: ThreadUtils *m_threadutil = nullptr; }; TEST_F(ut_DThreadUtils, CallInMainThread) { ASSERT_TRUE(m_threadutil); m_threadutil->testCallInMainThread(); } #else class ut_DThreadUtils :public testing::Test{ public: virtual void SetUp() { t = new QThread(); t->start(); m_threadutil = new DThreadUtils(t); } virtual void TearDown() { t->exit(); t->wait(); delete t; delete m_threadutil; } protected: QThread *t{nullptr}; DThreadUtils *m_threadutil{nullptr}; }; class QWorker : public QObject { Q_OBJECT public: explicit QWorker(QObject *parent = nullptr):QObject(parent){} ~QWorker() = default; public Q_SLOTS: int testFunc(int i, double j) { int r =qFloor(i + j); wait(); emit testFuncTrigger(r); return r; } void setWaitForSecs(int sec){ m_waitSecs = sec; } void wait() { std::unique_lock lock(m_mutex); m_cv.wait_for(lock, std::chrono::seconds(m_waitSecs)); } void notifyOne() { m_cv.notify_one(); } Q_SIGNALS: void testFuncTrigger(int v); private: std::mutex m_mutex; std::condition_variable m_cv; int m_waitSecs = 2; }; class CallableObject{ public: CallableObject() = default; ~CallableObject() = default; QString operator()(const QString &str){ s += str; std::this_thread::sleep_for(std::chrono::microseconds(100)); return s; } QString testFunc(const QString &){ return s; } private: QString s{"CallableObject: "}; }; TEST_F(ut_DThreadUtils, testThread) { auto tmp = m_threadutil->thread(); EXPECT_EQ(tmp, t); } TEST_F(ut_DThreadUtils, testRunWithQObj) { QWorker w; QSignalSpy spy(&w, &QWorker::testFuncTrigger); auto result = m_threadutil->run(&w, &QWorker::testFunc, 10, 24.6); std::this_thread::sleep_for(std::chrono::microseconds(100)); EXPECT_TRUE(result.isStarted()); EXPECT_TRUE(result.isRunning()); w.notifyOne(); result.waitForFinished(); EXPECT_TRUE(result.isFinished()); auto raw = result.result(); EXPECT_EQ(raw, 34); EXPECT_EQ(spy.count(), 1); } TEST_F(ut_DThreadUtils,testRunWithLambda) { auto threadId1 = std::this_thread::get_id(); auto result = m_threadutil->run([](decltype(threadId1) id){ EXPECT_NE(std::this_thread::get_id(), id); return true; }, threadId1); result.waitForFinished(); auto raw = result.result(); EXPECT_TRUE(raw); } TEST_F(ut_DThreadUtils,testRunWithCallableObj) { CallableObject obj; QString tmp{"Hello"}; auto result1 = m_threadutil->run(obj, tmp); result1.waitForFinished(); auto raw1 = result1.result(); EXPECT_EQ(raw1, QString{"CallableObject: Hello"}); auto result2 = m_threadutil->run(&obj, &CallableObject::testFunc, tmp); result2.waitForFinished(); auto raw2 = result2.result(); EXPECT_EQ(raw2, QString{"CallableObject: "}); } TEST_F(ut_DThreadUtils, testExecWithQObj) { QWorker w; w.setWaitForSecs(0); QSignalSpy spy(&w, SIGNAL(testFuncTrigger(int))); auto result = m_threadutil->exec(&w, &QWorker::testFunc, 10, 24.6); EXPECT_EQ(result, 34); EXPECT_EQ(spy.count(), 1); } TEST_F(ut_DThreadUtils, testExecWithLambda) { auto threadId1 = std::this_thread::get_id(); auto result = m_threadutil->exec ( [](decltype(threadId1) id) { EXPECT_NE(std::this_thread::get_id(), id); return true; }, threadId1); EXPECT_TRUE(result); } TEST_F(ut_DThreadUtils, testExecWithCallableObj) { CallableObject obj; QString tmp{"Hello"}; auto result1 = m_threadutil->exec(obj, tmp); EXPECT_EQ(result1, QString{"CallableObject: Hello"}); auto result2 = m_threadutil->exec(&obj, &CallableObject::testFunc, tmp); EXPECT_EQ(result2, QString{"CallableObject: "}); } TEST_F(ut_DThreadUtils, testDirectlyInvoke) { DThreadUtils tu(QThread::currentThread()); QWorker w; w.setWaitForSecs(0); QSignalSpy spy(&w, SIGNAL(testFuncTrigger(int))); auto result = tu.run(&w, &QWorker::testFunc, 10, 24.6); auto raw = result.result(); // no wait EXPECT_EQ(raw, 34); EXPECT_EQ(spy.count(), 1); } TEST_F(ut_DThreadUtils, testCancel) { CallableObject obj; QString tmp{"Hello"}; int cancelCounter{0}; auto result1 = m_threadutil->run(obj, tmp); auto cancelResult = result1.onCanceled([&cancelCounter]() { cancelCounter += 1; return QString{"failed"}; }); result1.cancel(); EXPECT_FALSE(result1.isFinished()); EXPECT_FALSE(result1.isValid()); EXPECT_TRUE(result1.isCanceled()); cancelResult.waitForFinished(); EXPECT_EQ(cancelCounter, 1); EXPECT_EQ(cancelResult.result(), QString{"failed"}); } TEST_F(ut_DThreadUtils, testDestructCancel) { auto w = new QWorker{}; auto failedCounter{0}; auto result = m_threadutil->run(w, &QWorker::testFunc, 10, 24.6); delete w; auto failedResult = result.onFailed([&failedCounter]() { failedCounter += 1; return -1; }); EXPECT_FALSE(result.isValid()); failedResult.waitForFinished(); EXPECT_EQ(failedCounter, 1); EXPECT_EQ(failedResult.result(), -1); } #endif #include "ut_dthreadutils.moc" dtkcore-6.7.46/tests/ut_dtimeunitformatter.cpp000066400000000000000000000036441522615770400215750ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include "util/dtimeunitformatter.h" #include "filesystem/dtrashmanager.h" DCORE_USE_NAMESPACE class ut_DTimeUnitFormatter : public testing::Test { protected: void SetUp() override; void TearDown() override; DTimeUnitFormatter timeUnitFormatter; }; void ut_DTimeUnitFormatter::SetUp() { } void ut_DTimeUnitFormatter::TearDown() { } TEST_F(ut_DTimeUnitFormatter, testDTimeUnitFormatterFormatAs) { qreal result0 = timeUnitFormatter.formatAs(120, DTimeUnitFormatter::Seconds, DTimeUnitFormatter::Minute); ASSERT_TRUE(qFuzzyCompare(result0, 2)); qreal result1 = timeUnitFormatter.formatAs(2, DTimeUnitFormatter::Minute, DTimeUnitFormatter::Seconds); ASSERT_TRUE(qFuzzyCompare(result1, 120)); qreal result2 = timeUnitFormatter.formatAs(2, DTimeUnitFormatter::Seconds, DTimeUnitFormatter::Seconds); ASSERT_TRUE(qFuzzyCompare(result2, 2)); } TEST_F(ut_DTimeUnitFormatter, testDTimeUnitFormatterFormat) { QPair result = timeUnitFormatter.format(120, DTimeUnitFormatter::Seconds); ASSERT_TRUE(qFuzzyCompare(result.first, 2)); ASSERT_EQ(result.second, DTimeUnitFormatter::Minute); } TEST_F(ut_DTimeUnitFormatter, testDTimeUnitFormatterFormatAsUnitList) { QList> result = timeUnitFormatter.formatAsUnitList(121, DTimeUnitFormatter::Seconds); ASSERT_TRUE(qFuzzyCompare(result[0].first, 121)); ASSERT_EQ(result[0].second, DTimeUnitFormatter::Seconds); } TEST_F(ut_DTimeUnitFormatter, testDTimeUnitFormatterUnitStr) { ASSERT_EQ(timeUnitFormatter.unitStr(DTimeUnitFormatter::Seconds), "s"); ASSERT_EQ(timeUnitFormatter.unitStr(DTimeUnitFormatter::Minute), "m"); ASSERT_EQ(timeUnitFormatter.unitStr(DTimeUnitFormatter::Hour), "h"); ASSERT_EQ(timeUnitFormatter.unitStr(DTimeUnitFormatter::Day), "d"); } dtkcore-6.7.46/tests/ut_dtrashmanager.cpp000066400000000000000000000025351522615770400204650ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include #include "filesystem/dstandardpaths.h" #include "filesystem/dtrashmanager.h" DCORE_USE_NAMESPACE class ut_DTrashManager : public testing::Test { protected: void SetUp() override; void TearDown() override; QString path; }; void ut_DTrashManager::SetUp() { DStandardPaths::setMode(DStandardPaths::Auto); path = DStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + "/Trash/files"; QFile file(path + "/test"); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) return; file.close(); } void ut_DTrashManager::TearDown() { QFile file("/tmp/test"); if (file.exists()) file.remove(); } TEST_F(ut_DTrashManager, testDTrashManagerTrashIsEmpty) { DTrashManager::instance()->moveToTrash(path + "/test"); bool ok = DTrashManager::instance()->trashIsEmpty(); ASSERT_TRUE(ok = ok ? ok : !ok); } TEST_F(ut_DTrashManager, testDTrashManagerCleanTrash) { bool ok = DTrashManager::instance()->cleanTrash(); ASSERT_TRUE(ok = ok ? ok : !ok); } TEST_F(ut_DTrashManager, testDTrashManagerMoveToTrash) { bool ok = DTrashManager::instance()->moveToTrash(path + "/test"); ASSERT_TRUE(ok = ok ? ok : !ok); } dtkcore-6.7.46/tests/ut_dutil.cpp000066400000000000000000000075701522615770400167720ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "ut_dutil.h" #include #include "util/dtimeunitformatter.h" #include "util/ddisksizeformatter.h" DCORE_USE_NAMESPACE void ut_DUtil::SetUpTestCase() { //qDebug() << "*****************" << __FUNCTION__; } void ut_DUtil::TearDownTestCase() { //qDebug() << "*****************" << __FUNCTION__; } void ut_DUtil::SetUp() { QDir dir("/tmp/etc/"); if (!dir.exists()) dir.mkdir("/tmp/etc/"); } void ut_DUtil::TearDown() { QDir dir("/tmp/etc/"); if (dir.exists()) dir.remove("/tmp/etc/"); } TEST_F(ut_DUtil, testTimeFormatter) { const DTimeUnitFormatter timeFormatter; // 3600 seconds == 1 hour const auto r0 = timeFormatter.format(3600, DTimeUnitFormatter::Seconds); ASSERT_TRUE(qFuzzyCompare(r0.first, 1) && r0.second == DTimeUnitFormatter::Hour); // 86400 seconds == 1 day const auto r1 = timeFormatter.format(86400, DTimeUnitFormatter::Seconds); ASSERT_TRUE(qFuzzyCompare(r1.first, 1) && r1.second == DTimeUnitFormatter::Day); // 129600 seconds == 1.5 day const auto r3 = timeFormatter.format(129600, DTimeUnitFormatter::Seconds); ASSERT_TRUE(qFuzzyCompare(1.5, r3.first) && r3.second == DTimeUnitFormatter::Day); // 1.5 day == 36 hours const auto r4 = timeFormatter.formatAs(1.5, DTimeUnitFormatter::Day, DTimeUnitFormatter::Hour); ASSERT_TRUE(qFuzzyCompare(r4, 36)); } TEST_F(ut_DUtil, testTimeFormatterList) { const DTimeUnitFormatter timeFormatter; // 135120.5 Minutes == 93 days + 20 hours + 30 seconds const auto r = timeFormatter.formatAsUnitList(135120.5, DTimeUnitFormatter::Minute); ASSERT_TRUE(qFuzzyCompare(r[0].first, 93) && r[0].second == DTimeUnitFormatter::Day); ASSERT_TRUE(qFuzzyCompare(r[1].first, 20) && r[1].second == DTimeUnitFormatter::Hour); ASSERT_TRUE(qFuzzyCompare(r[2].first, 30) && r[2].second == DTimeUnitFormatter::Seconds); } TEST_F(ut_DUtil, testDiskFormatter) { const DDiskSizeFormatter diskFormatter1000 = DDiskSizeFormatter(); // 1000 K == 1 M const auto i0 = diskFormatter1000.format(1000, DDiskSizeFormatter::K); ASSERT_TRUE(qFuzzyCompare(i0.first, 1) && i0.second == DDiskSizeFormatter::M); // 1000 K == 1000000 B const auto i1 = diskFormatter1000.formatAs(1000, DDiskSizeFormatter::K, DDiskSizeFormatter::B); ASSERT_TRUE(qFuzzyCompare(i1, 1000000)); } TEST_F(ut_DUtil, testDiskFormatterList) { const DDiskSizeFormatter diskFormatter = DDiskSizeFormatter(); // 1351223412.1234 KB == 1 TB + 351 GB + 223 MB + 412 KB + 123.4 B const auto r = diskFormatter.formatAsUnitList(1351223412.1234, DDiskSizeFormatter::K); ASSERT_TRUE(qFuzzyCompare(r[0].first, 1) && r[0].second == DDiskSizeFormatter::T); ASSERT_TRUE(qFuzzyCompare(r[1].first, 351) && r[1].second == DDiskSizeFormatter::G); ASSERT_TRUE(qFuzzyCompare(r[2].first, 223) && r[2].second == DDiskSizeFormatter::M); ASSERT_TRUE(qFuzzyCompare(r[3].first, 412) && r[3].second == DDiskSizeFormatter::K); // TODO: test failed // Q_ASSERT(r[4].first == 123.4 && r[4].second == DiskSizeFormatter::B); } TEST_F(ut_DUtil, testDiskFormatter1024) { const DDiskSizeFormatter diskFormatter = DDiskSizeFormatter().rate(1024); // 1024 K == 1 M const auto d0 = diskFormatter.format(1024, DDiskSizeFormatter::K); ASSERT_TRUE(qFuzzyCompare(d0.first, 1) && d0.second == DDiskSizeFormatter::M); // 100000000000 B == 93.13225746154785 G const auto d1 = diskFormatter.format(100000000000, DDiskSizeFormatter::B); ASSERT_TRUE(qFuzzyCompare(93.13225746154785, d1.first) && d1.second == DDiskSizeFormatter::G); // 100000000000 B == 0.09094947017729282 T const auto d2 = diskFormatter.formatAs(100000000000, DDiskSizeFormatter::B, DDiskSizeFormatter::T); ASSERT_TRUE(qFuzzyCompare(0.09094947017729282, d2)); } dtkcore-6.7.46/tests/ut_dutil.h000066400000000000000000000012161522615770400164260ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #pragma once #include "dtkcore_global.h" #include #if DTK_VERSION < DTK_VERSION_CHECK(6, 0, 0, 0) #include "dtimedloop.h" DCORE_USE_NAMESPACE #endif // 有返回值的 lambda 表达å¼�ã€�函数里é�¢ä½¿ç”¨ ASSERT_XXX // 总之,ä¸�管有没有返回值,用它就对了 #ifndef HAVE_FUN #define HAVE_FUN(X) [&](){X;}(); #endif class ut_DUtil : public testing::Test { protected: static void SetUpTestCase(); static void TearDownTestCase(); virtual void SetUp(); virtual void TearDown(); }; dtkcore-6.7.46/tests/ut_dvtablehook.cpp000066400000000000000000000102671522615770400201500ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2019 - 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include "testso.h" #include class ut_DVtableHook : public testing::Test { public: static void SetUpTestCase() { qDebug() << "*****************" << __FUNCTION__; } static void TearDownTestCase() { qDebug() << "*****************" << __FUNCTION__; } virtual void SetUp(); virtual void TearDown(); virtual ~ut_DVtableHook() {} }; void ut_DVtableHook::SetUp() { } void ut_DVtableHook::TearDown() { } using namespace TestClass; DCORE_USE_NAMESPACE static char test(A *obj, int v) { qDebug() << Q_FUNC_INFO << obj << v; return 'x'; } static char test2(A *obj, int v, bool v2) { qDebug() << Q_FUNC_INFO << obj << v << v2; return 'y'; } TEST_F(ut_DVtableHook, objectFun2ObjectFun) { A *a = new A(); B *b = new B(); ASSERT_TRUE(DVtableHook::overrideVfptrFun(a, &A::test, b, &B::test)); ASSERT_TRUE(DVtableHook::hasVtable(a)); ASSERT_EQ(a->test(0), 'b'); DVtableHook::resetVfptrFun(a, &A::test); ASSERT_EQ(a->test(0), 'a'); delete a; ASSERT_TRUE(!DVtableHook::hasVtable(a)); delete b; } TEST_F(ut_DVtableHook, objectFun2Fun) { A *a = new A(); ASSERT_TRUE(DVtableHook::overrideVfptrFun(a, &A::test, &test)); ASSERT_EQ(a->test(1), 'x'); DVtableHook::resetVtable(a); ASSERT_TRUE(!DVtableHook::hasVtable(a)); delete a; } TEST_F(ut_DVtableHook, objectFun2StdFun) { A *a = new A(); ASSERT_TRUE(DVtableHook::overrideVfptrFun(a, &A::test, std::bind(&test2, std::placeholders::_1, std::placeholders::_2, true))); ASSERT_EQ(a->test(2), 'y'); DVtableHook::resetVtable(a); ASSERT_TRUE(!DVtableHook::hasVtable(a)); // not support // A *a2 = new A(); // ASSERT_TRUE(DVtableHook::overrideVfptrFun(a2, &A::test, std::bind(&test2, std::placeholders::_1, std::placeholders::_2, false))); // ASSERT_TRUE(!a2->test(2)); // DVtableHook::resetVtable(a2); // ASSERT_TRUE(!DVtableHook::hasVtable(a2)); delete a; } TEST_F(ut_DVtableHook, objectFun2LambdaFun) { A *a = new A(); auto lambda1 = [](A *obj, int v) { qDebug() << Q_FUNC_INFO << obj << v; return '1'; }; auto lambda2 = [](A *obj, int v) { qDebug() << Q_FUNC_INFO << obj << v; return '2'; }; ASSERT_TRUE(DVtableHook::overrideVfptrFun(a, &A::test, lambda1)); ASSERT_EQ(a->test(3), '1'); ASSERT_TRUE(DVtableHook::overrideVfptrFun(a, &A::test, lambda2)); ASSERT_EQ(a->test(3), '2'); DVtableHook::resetVtable(a); ASSERT_TRUE(!DVtableHook::hasVtable(a)); delete a; } TEST_F(ut_DVtableHook, fun2ObjectFun) { B *b = new B(); ASSERT_TRUE(DVtableHook::overrideVfptrFun(&A::test, b, &B::test)); A *a = new A(); ASSERT_TRUE(DVtableHook::getVtableOfObject(a) == DVtableHook::getVtableOfClass()); ASSERT_EQ(a->test(4), 'b'); delete a; delete b; } TEST_F(ut_DVtableHook, fun2Fun) { ASSERT_TRUE(DVtableHook::overrideVfptrFun(&A::test, &test)); A *a = new A(); ASSERT_EQ(a->test(5), 'x'); delete a; } TEST_F(ut_DVtableHook, fun2StdFun) { A *a = new A(); ASSERT_TRUE(DVtableHook::overrideVfptrFun(&A::test, std::bind(&test2, std::placeholders::_1, std::placeholders::_2, true))); ASSERT_EQ(a->test(6), 'y'); DVtableHook::resetVtable(a); ASSERT_TRUE(!DVtableHook::hasVtable(a)); delete a; } TEST_F(ut_DVtableHook, fun2LambdaFun) { A *a = new A(); auto lambda = [](A *obj, int v) { qDebug() << Q_FUNC_INFO << obj << v; return 'z'; }; ASSERT_TRUE(DVtableHook::overrideVfptrFun(&A::test, lambda)); ASSERT_EQ(a->test(7), 'z'); DVtableHook::resetVtable(a); ASSERT_TRUE(!DVtableHook::hasVtable(a)); delete a; } TEST_F(ut_DVtableHook, testRTTI) { A *c1 = new C(); auto original = typeid(*c1).name(); auto lambda3 = [](C *obj, int v) { qDebug() << Q_FUNC_INFO << obj << v; return '3'; }; ASSERT_TRUE(DVtableHook::overrideVfptrFun(dynamic_cast(c1), &C::test, lambda3)); ASSERT_EQ(c1->test(0), '3'); ASSERT_EQ(typeid(*c1).name(), original); delete c1; } dtkcore-6.7.46/tests/ut_gsettingsbackend.cpp000066400000000000000000000047301522615770400211630ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include #include #include #include "settings/dsettings.h" #include "settings/dsettingsoption.h" #include "settings/dsettingsgroup.h" #include "settings/backend/gsettingsbackend.h" #include "settings/backend/qsettingbackend.h" DCORE_USE_NAMESPACE class ut_GSettings : public testing::Test { protected: void SetUp() override; void TearDown() override; DSettings *settings = nullptr; GSettingsBackend * gSettingBackend = nullptr; QString jsonContent; }; void ut_GSettings::SetUp() { GTEST_SKIP_("Do not test GSettingsBackend. schema was removed..."); QFile file("/tmp/test.json"); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) return; QTextStream out(&file); jsonContent = " { " " \"gsettings\": { " " \"id\": \"com.deepin.dtk\"," " \"path\": \"/dtk/deepin/deepin-terminal/\" " "}," " \"groups\": [{ " " \"key\": \"base\", " " \"name\": \"Basic settings\", " " \"groups\": [{ " " \"key\": \"open_action\", " " \"name\": \"Open Action\", " " \"options\": [{ " " \"key\": \"paletteType\", " " \"type\": \"checkbox\", " " \"text\": \"Always Open On New Windows\", " " \"default\": true " " }] " " }] }]" "}"; out << jsonContent; file.close(); settings = DSettings::fromJson(jsonContent.toLatin1()); gSettingBackend = new GSettingsBackend(settings); } void ut_GSettings::TearDown() { if (gSettingBackend) { delete gSettingBackend; gSettingBackend = nullptr; } if (settings) { delete settings; settings = nullptr; } QFile file("/tmp/test.json"); if (file.exists()) file.remove(); } TEST_F(ut_GSettings, testGSettingBackendKeys) { QStringList qKeys = gSettingBackend->keys(); ASSERT_TRUE(!qKeys.isEmpty()); } TEST_F(ut_GSettings, testGSettingBackendGetOption) { QStringList qKeys = gSettingBackend->keys(); ASSERT_TRUE(!qKeys.isEmpty()); QVariant value = gSettingBackend->getOption(qKeys[0]); ASSERT_TRUE(!value.toString().isEmpty()); } dtkcore-6.7.46/tests/ut_qsettingsbackend.cpp000066400000000000000000000055651522615770400212040ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include #include #include #include "settings/dsettings.h" #include "settings/dsettingsoption.h" #include "settings/dsettingsgroup.h" #include "settings/backend/gsettingsbackend.h" #include "settings/backend/qsettingbackend.h" DCORE_USE_NAMESPACE class ut_QSettingsBackend : public testing::Test { protected: void SetUp() override; void TearDown() override; QString jsonContent; QString iniContent; }; void ut_QSettingsBackend::SetUp() { QFile file("/tmp/test.ini"); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) return; QTextStream out(&file); jsonContent = " { \"groups\": [{ " " \"key\": \"base\", " " \"name\": \"Basic settings\", " " \"groups\": [{ " " \"key\": \"open_action\", " " \"name\": \"Open Action\", " " \"options\": [{ " " \"key\": \"alway_open_on_new\", " " \"type\": \"checkbox\", " " \"text\": \"Always Open On New Windows\", " " \"default\": true " " }] " " }] }]}"; iniContent = "[Test] \n \ value=false "; out << iniContent; file.close(); } void ut_QSettingsBackend::TearDown() { QFile file("/tmp/test.ini"); if (file.exists()) file.remove(); } TEST_F(ut_QSettingsBackend, testQSettingsBackendKeys) { DSettings tmpSetting; QSettingBackend qBackend("/tmp/test.ini"); tmpSetting.setBackend(&qBackend); QStringList qKeys = qBackend.keys(); ASSERT_TRUE(!qKeys.isEmpty()); } TEST_F(ut_QSettingsBackend, testQSettingsBackendGetOption) { QPointer tmpSetting = DSettings::fromJson(jsonContent.toLatin1()); QScopedPointer scopeSettings(tmpSetting.data()); QSettingBackend qBackend("/tmp/test.ini"); scopeSettings->setBackend(&qBackend); scopeSettings->sync(); QStringList qKeys = qBackend.keys(); ASSERT_TRUE(!qKeys.isEmpty()); QVariant value = qBackend.getOption("Test"); ASSERT_TRUE(!value.toBool()); } TEST_F(ut_QSettingsBackend, testQSettingsBackendDoOption) { QPointer tmpSetting = DSettings::fromJson(jsonContent.toLatin1()); QScopedPointer scopeSettings(tmpSetting.data()); QSettingBackend qBackend("/tmp/test.ini"); scopeSettings->setBackend(&qBackend); Q_EMIT qBackend.setOption("Test", true); QStringList qKeys = qBackend.keys(); ASSERT_TRUE(!qKeys.isEmpty()); QVariant value = qBackend.getOption("Test"); ASSERT_TRUE(!value.toBool()); // ensure `DSettings` is released before `SettingBackend` if `doSetOption` maybe execute. scopeSettings.reset(); } dtkcore-6.7.46/tests/ut_singleton.cpp000066400000000000000000000031521522615770400176430ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2016 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "ut_singleton.h" #include #include #include Singleton::Singleton(QObject *parent) : QObject(parent), count(0) { } MultiSingletonTester::MultiSingletonTester(QObject *parent) : QObject(parent) { } void MultiSingletonTester::run() { Singleton::ref().count.ref(); } int MultiSingletonTester::count() const { #if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) return Singleton::ref().count.loadRelaxed(); #else return Singleton::ref().count.load(); #endif } TEST(ut_DSingleton, testDSingleton) { const int exampleCount = 5; QVector threads; QVector testers; threads.reserve(exampleCount); testers.reserve(exampleCount); for (int i = 0; i < exampleCount; i++) { auto thread = new QThread(); auto tester = new MultiSingletonTester; tester->moveToThread(thread); QObject::connect(thread, &QThread::started, tester, &MultiSingletonTester::run); threads.push_back(thread); testers.push_back(tester); thread->start(); } for (auto thread : threads) { thread->quit(); } ASSERT_TRUE(QTest::qWaitFor([threads] { for (auto thread : threads) { if (!thread->isFinished()) { return false; } } return true; })); for (auto tester : testers) { ASSERT_EQ(tester->count(), exampleCount); } qDeleteAll(threads); qDeleteAll(testers); } dtkcore-6.7.46/tests/ut_singleton.h000066400000000000000000000011461522615770400173110ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2016 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #pragma once #include #include "base/dsingleton.h" class Singleton : public QObject , public Dtk::Core::DSingleton { Q_OBJECT friend class Dtk::Core::DSingleton; public: explicit Singleton(QObject *parent = nullptr); QAtomicInt count; }; class MultiSingletonTester : public QObject { Q_OBJECT public: explicit MultiSingletonTester(QObject *parent = nullptr); int count() const; public Q_SLOTS: void run(); }; dtkcore-6.7.46/toolGenerate/000077500000000000000000000000001522615770400157125ustar00rootroot00000000000000dtkcore-6.7.46/toolGenerate/dconfig2cpp/000077500000000000000000000000001522615770400201105ustar00rootroot00000000000000dtkcore-6.7.46/toolGenerate/dconfig2cpp/dconf-example_meta.hpp000066400000000000000000001354661522615770400243700ustar00rootroot00000000000000/** * This file is generated by dconfig2cpp. * Command line arguments: ./build/tools/dconfig2cpp/dconfig2cpp ./tests/data/dconf-example.meta.json -o ./toolGenerate/dconfig2cpp/dconf-example_meta.hpp * Generation time: 2026-01-21T14:02:08 * JSON file version: 1.0 * * WARNING: DO NOT MODIFY THIS FILE MANUALLY. * If you need to change the content, please modify the dconfig2cpp tool. */ #ifndef DCONFIG_DCONF-EXAMPLE_META_H #define DCONFIG_DCONF-EXAMPLE_META_H #include #include #include #include #include #include #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) #include #endif #include #include #include class dconfig_dconf-example_meta : public QObject { Q_OBJECT Q_PROPERTY(QList array READ array WRITE setArray NOTIFY arrayChanged RESET resetArray) Q_PROPERTY(QList array_map READ array_map WRITE setArray_map NOTIFY array_mapChanged RESET resetArray_map) Q_PROPERTY(QList array_map_struct READ array_map_struct WRITE setArray_map_struct NOTIFY array_map_structChanged RESET resetArray_map_struct) Q_PROPERTY(bool canExit READ canExit WRITE setCanExit NOTIFY canExitChanged RESET resetCanExit) Q_PROPERTY(QString key2 READ key2 WRITE setKey2 NOTIFY key2Changed RESET resetKey2) Q_PROPERTY(QString key3 READ key3 WRITE setKey3 NOTIFY key3Changed RESET resetKey3) Q_PROPERTY(QVariantMap map READ map WRITE setMap NOTIFY mapChanged RESET resetMap) Q_PROPERTY(QVariantMap map_array READ map_array WRITE setMap_array NOTIFY map_arrayChanged RESET resetMap_array) Q_PROPERTY(qlonglong number READ number WRITE setNumber NOTIFY numberChanged RESET resetNumber) Q_PROPERTY(double numberDouble READ numberDouble WRITE setNumberDouble NOTIFY numberDoubleChanged RESET resetNumberDouble) Q_PROPERTY(bool publicConfig READ publicConfig WRITE setPublicConfig NOTIFY publicConfigChanged RESET resetPublicConfig) Q_PROPERTY(bool readonly READ readonly WRITE setReadonly NOTIFY readonlyChanged RESET resetReadonly) Q_PROPERTY(bool readwrite READ readwrite WRITE setReadwrite NOTIFY readwriteChanged RESET resetReadwrite) Q_PROPERTY(QVariantMap struct READ struct WRITE setStruct NOTIFY structChanged RESET resetStruct) Q_CLASSINFO("DConfigKeyList", "array;array_map;array_map_struct;canExit;key2;key3;map;map_array;number;numberDouble;publicConfig;readonly;readwrite;struct") Q_CLASSINFO("DConfigFileName", "dconf-example.meta") Q_CLASSINFO("DConfigFileVersion", "1.0") public: explicit dconfig_dconf-example_meta(QThread *thread, DTK_CORE_NAMESPACE::DConfigBackend *backend, const QString &name, const QString &appId, const QString &subpath, bool isGeneric, QObject *parent) : QObject(parent), m_data(new Data) { m_data->m_userConfig = this; m_data->moveToThread(this->thread()); if (!thread->isRunning()) { qWarning() << QLatin1String("Warning: The provided thread is not running."); } Q_ASSERT(QThread::currentThread() != thread); auto worker = new QObject(); worker->moveToThread(thread); QPointer safeData(m_data); QMetaObject::invokeMethod(worker, [safeData, backend, name, appId, subpath, isGeneric, worker]() mutable { delete worker; worker = nullptr; if (!safeData->m_status.testAndSetOrdered(static_cast(Data::Status::Invalid), static_cast(Data::Status::Initializing))) { // CAS failed: status changed (e.g., set to Destroyed by destructor) // Schedule deletion of Data object via deleteLater to avoid direct delete in Config thread safeData->deleteLater(); return; } DTK_CORE_NAMESPACE::DConfig *config = nullptr; if (isGeneric) { if (backend) { config = DTK_CORE_NAMESPACE::DConfig::createGeneric(backend, name, subpath, nullptr); } else { config = DTK_CORE_NAMESPACE::DConfig::createGeneric(name, subpath, nullptr); } } else { if (backend) { if (appId.isNull()) { config = DTK_CORE_NAMESPACE::DConfig::create(backend, DTK_CORE_NAMESPACE::DSGApplication::id(), name, subpath, nullptr); } else { config = DTK_CORE_NAMESPACE::DConfig::create(backend, appId, name, subpath, nullptr); } } else { if (appId.isNull()) { config = DTK_CORE_NAMESPACE::DConfig::create(DTK_CORE_NAMESPACE::DSGApplication::id(), name, subpath, nullptr); } else { config = DTK_CORE_NAMESPACE::DConfig::create(appId, name, subpath, nullptr); } } } if (!config || !config->isValid()) { qWarning() << QLatin1String("Failed to create DConfig instance."); QMetaObject::invokeMethod(safeData, [safeData]() { if (safeData->m_status.testAndSetOrdered(static_cast(Data::Status::Initializing), static_cast(Data::Status::Failed))) { Q_EMIT safeData->m_userConfig->configInitializeFailed(); } else { // CAS failed, destroy data object delete safeData; } }, Qt::QueuedConnection); if (config) delete config; return; } config->moveToThread(QThread::currentThread()); // Initialize through Data class safeData->initializeInConfigThread(config); QMetaObject::invokeMethod(safeData, [safeData, config]() { // Try to transition from Initializing to Succeeded if (safeData->m_status.testAndSetOrdered(static_cast(Data::Status::Initializing), static_cast(Data::Status::Succeeded))) { // CAS succeeded: connect config destroyed signal to cleanup Data, then emit success signal to main thread QObject::connect(config, &QObject::destroyed, safeData, &QObject::deleteLater); if (safeData->m_userConfig) { Q_EMIT safeData->m_userConfig->configInitializeSucceed(config); } } else { // CAS failed - state changed (e.g., set to Destroyed) // We must clean up the config we just created config->deleteLater(); safeData->deleteLater(); } }, Qt::QueuedConnection); }); } static dconfig_dconf-example_meta* create(const QString &appId = {}, const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread()) { return new dconfig_dconf-example_meta(thread, nullptr, QStringLiteral(u"\u0064\u0063\u006f\u006e\u0066\u002d\u0065\u0078\u0061\u006d\u0070\u006c\u0065\u002e\u006d\u0065\u0074\u0061"), appId, subpath, false, parent); } static dconfig_dconf-example_meta* create(DTK_CORE_NAMESPACE::DConfigBackend *backend, const QString &appId = {}, const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread()) { return new dconfig_dconf-example_meta(thread, backend, QStringLiteral(u"\u0064\u0063\u006f\u006e\u0066\u002d\u0065\u0078\u0061\u006d\u0070\u006c\u0065\u002e\u006d\u0065\u0074\u0061"), appId, subpath, false, parent); } static dconfig_dconf-example_meta* createByName(const QString &name, const QString &appId = {}, const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread()) { return new dconfig_dconf-example_meta(thread, nullptr, name, appId, subpath, false, parent); } static dconfig_dconf-example_meta* createByName(DTK_CORE_NAMESPACE::DConfigBackend *backend, const QString &name, const QString &appId = {}, const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread()) { return new dconfig_dconf-example_meta(thread, backend, name, appId, subpath, false, parent); } static dconfig_dconf-example_meta* createGeneric(const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread()) { return new dconfig_dconf-example_meta(thread, nullptr, QStringLiteral(u"\u0064\u0063\u006f\u006e\u0066\u002d\u0065\u0078\u0061\u006d\u0070\u006c\u0065\u002e\u006d\u0065\u0074\u0061"), {}, subpath, true, parent); } static dconfig_dconf-example_meta* create(DTK_CORE_NAMESPACE::DConfigBackend *backend, const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread()) { return new dconfig_dconf-example_meta(thread, backend, QStringLiteral(u"\u0064\u0063\u006f\u006e\u0066\u002d\u0065\u0078\u0061\u006d\u0070\u006c\u0065\u002e\u006d\u0065\u0074\u0061"), {}, subpath, true, parent); } static dconfig_dconf-example_meta* createGenericByName(const QString &name, const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread()) { return new dconfig_dconf-example_meta(thread, nullptr, name, {}, subpath, true, parent); } static dconfig_dconf-example_meta* createGenericByName(DTK_CORE_NAMESPACE::DConfigBackend *backend, const QString &name, const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread()) { return new dconfig_dconf-example_meta(thread, backend, name, {}, subpath, true, parent); } ~dconfig_dconf-example_meta() { m_data->m_userConfig = nullptr; int oldStatus = m_data->m_status.fetchAndStoreOrdered(static_cast(Data::Status::Destroyed)); if (oldStatus == static_cast(Data::Status::Succeeded)) { // When Succeeded, release config object only auto config = m_data->m_config.loadRelaxed(); Q_ASSERT(config); config->deleteLater(); // m_data will be deleted by config's destroyed signal } else if (oldStatus == static_cast(Data::Status::Failed)) { // When Failed state, schedule cleanup of Data object m_data->deleteLater(); } } Q_INVOKABLE DTK_CORE_NAMESPACE::DConfig *config() const { return m_data->m_config.loadRelaxed(); } // Deprecated: Use isInitializeSucceeded() instead Q_INVOKABLE Q_DECL_DEPRECATED_X("Use isInitializeSucceeded() instead") bool isInitializeSucceed() const { return isInitializeSucceeded(); } Q_INVOKABLE bool isInitializeSucceeded() const { return m_data->m_status.loadRelaxed() == static_cast(Data::Status::Succeeded); } Q_INVOKABLE bool isInitializeFailed() const { return m_data->m_status.loadRelaxed() == static_cast(Data::Status::Failed); } Q_INVOKABLE bool isInitializing() const { return m_data->m_status.loadRelaxed() == static_cast(Data::Status::Initializing); } Q_INVOKABLE QStringList keyList() const { return { QStringLiteral("array"), QStringLiteral("array_map"), QStringLiteral("array_map_struct"), QStringLiteral("canExit"), QStringLiteral("key2"), QStringLiteral("key3"), QStringLiteral("map"), QStringLiteral("map_array"), QStringLiteral("number"), QStringLiteral("numberDouble"), QStringLiteral("publicConfig"), QStringLiteral("readonly"), QStringLiteral("readwrite"), QStringLiteral("struct")}; } Q_INVOKABLE bool isDefaultValue(const QString &key) const { if (key == QStringLiteral("array")) return arrayIsDefaultValue(); if (key == QStringLiteral("array_map")) return array_mapIsDefaultValue(); if (key == QStringLiteral("array_map_struct")) return array_map_structIsDefaultValue(); if (key == QStringLiteral("canExit")) return canExitIsDefaultValue(); if (key == QStringLiteral("key2")) return key2IsDefaultValue(); if (key == QStringLiteral("key3")) return key3IsDefaultValue(); if (key == QStringLiteral("map")) return mapIsDefaultValue(); if (key == QStringLiteral("map_array")) return map_arrayIsDefaultValue(); if (key == QStringLiteral("number")) return numberIsDefaultValue(); if (key == QStringLiteral("numberDouble")) return numberDoubleIsDefaultValue(); if (key == QStringLiteral("publicConfig")) return publicConfigIsDefaultValue(); if (key == QStringLiteral("readonly")) return readonlyIsDefaultValue(); if (key == QStringLiteral("readwrite")) return readwriteIsDefaultValue(); if (key == QStringLiteral("struct")) return structIsDefaultValue(); return false; } QList array() const { return m_data->p_array; } void setArray(const QList &value) { auto oldValue = m_data->p_array; m_data->p_array = value; m_data->markPropertySet(0); if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config, value]() { config->setValue(QStringLiteral("array"), value); }); } if (m_data->p_array != oldValue) { Q_EMIT arrayChanged(); Q_EMIT valueChanged(QStringLiteral("array"), value); } } void resetArray() { if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config]() { config->reset(QStringLiteral("array")); }); } } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QBindable> bindableArray() { return QBindable>(this, "array"); } #endif Q_INVOKABLE bool arrayIsDefaultValue() const { return !m_data->testPropertySet(0); } QList array_map() const { return m_data->p_array_map; } void setArray_map(const QList &value) { auto oldValue = m_data->p_array_map; m_data->p_array_map = value; m_data->markPropertySet(1); if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config, value]() { config->setValue(QStringLiteral("array_map"), value); }); } if (m_data->p_array_map != oldValue) { Q_EMIT array_mapChanged(); Q_EMIT valueChanged(QStringLiteral("array_map"), value); } } void resetArray_map() { if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config]() { config->reset(QStringLiteral("array_map")); }); } } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QBindable> bindableArray_map() { return QBindable>(this, "array_map"); } #endif Q_INVOKABLE bool array_mapIsDefaultValue() const { return !m_data->testPropertySet(1); } QList array_map_struct() const { return m_data->p_array_map_struct; } void setArray_map_struct(const QList &value) { auto oldValue = m_data->p_array_map_struct; m_data->p_array_map_struct = value; m_data->markPropertySet(2); if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config, value]() { config->setValue(QStringLiteral("array_map_struct"), value); }); } if (m_data->p_array_map_struct != oldValue) { Q_EMIT array_map_structChanged(); Q_EMIT valueChanged(QStringLiteral("array_map_struct"), value); } } void resetArray_map_struct() { if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config]() { config->reset(QStringLiteral("array_map_struct")); }); } } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QBindable> bindableArray_map_struct() { return QBindable>(this, "array_map_struct"); } #endif Q_INVOKABLE bool array_map_structIsDefaultValue() const { return !m_data->testPropertySet(2); } bool canExit() const { return m_data->p_canExit; } void setCanExit(const bool &value) { auto oldValue = m_data->p_canExit; m_data->p_canExit = value; m_data->markPropertySet(3); if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config, value]() { config->setValue(QStringLiteral("canExit"), value); }); } if (m_data->p_canExit != oldValue) { Q_EMIT canExitChanged(); Q_EMIT valueChanged(QStringLiteral("canExit"), value); } } void resetCanExit() { if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config]() { config->reset(QStringLiteral("canExit")); }); } } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QBindable bindableCanExit() { return QBindable(this, "canExit"); } #endif Q_INVOKABLE bool canExitIsDefaultValue() const { return !m_data->testPropertySet(3); } QString key2() const { return m_data->p_key2; } void setKey2(const QString &value) { auto oldValue = m_data->p_key2; m_data->p_key2 = value; m_data->markPropertySet(4); if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config, value]() { config->setValue(QStringLiteral("key2"), value); }); } if (m_data->p_key2 != oldValue) { Q_EMIT key2Changed(); Q_EMIT valueChanged(QStringLiteral("key2"), value); } } void resetKey2() { if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config]() { config->reset(QStringLiteral("key2")); }); } } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QBindable bindableKey2() { return QBindable(this, "key2"); } #endif Q_INVOKABLE bool key2IsDefaultValue() const { return !m_data->testPropertySet(4); } QString key3() const { return m_data->p_key3; } void setKey3(const QString &value) { auto oldValue = m_data->p_key3; m_data->p_key3 = value; m_data->markPropertySet(5); if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config, value]() { config->setValue(QStringLiteral("key3"), value); }); } if (m_data->p_key3 != oldValue) { Q_EMIT key3Changed(); Q_EMIT valueChanged(QStringLiteral("key3"), value); } } void resetKey3() { if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config]() { config->reset(QStringLiteral("key3")); }); } } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QBindable bindableKey3() { return QBindable(this, "key3"); } #endif Q_INVOKABLE bool key3IsDefaultValue() const { return !m_data->testPropertySet(5); } QVariantMap map() const { return m_data->p_map; } void setMap(const QVariantMap &value) { auto oldValue = m_data->p_map; m_data->p_map = value; m_data->markPropertySet(6); if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config, value]() { config->setValue(QStringLiteral("map"), value); }); } if (m_data->p_map != oldValue) { Q_EMIT mapChanged(); Q_EMIT valueChanged(QStringLiteral("map"), value); } } void resetMap() { if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config]() { config->reset(QStringLiteral("map")); }); } } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QBindable bindableMap() { return QBindable(this, "map"); } #endif Q_INVOKABLE bool mapIsDefaultValue() const { return !m_data->testPropertySet(6); } QVariantMap map_array() const { return m_data->p_map_array; } void setMap_array(const QVariantMap &value) { auto oldValue = m_data->p_map_array; m_data->p_map_array = value; m_data->markPropertySet(7); if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config, value]() { config->setValue(QStringLiteral("map_array"), value); }); } if (m_data->p_map_array != oldValue) { Q_EMIT map_arrayChanged(); Q_EMIT valueChanged(QStringLiteral("map_array"), value); } } void resetMap_array() { if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config]() { config->reset(QStringLiteral("map_array")); }); } } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QBindable bindableMap_array() { return QBindable(this, "map_array"); } #endif Q_INVOKABLE bool map_arrayIsDefaultValue() const { return !m_data->testPropertySet(7); } qlonglong number() const { return m_data->p_number; } void setNumber(const qlonglong &value) { auto oldValue = m_data->p_number; m_data->p_number = value; m_data->markPropertySet(8); if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config, value]() { config->setValue(QStringLiteral("number"), value); }); } if (m_data->p_number != oldValue) { Q_EMIT numberChanged(); Q_EMIT valueChanged(QStringLiteral("number"), value); } } void resetNumber() { if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config]() { config->reset(QStringLiteral("number")); }); } } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QBindable bindableNumber() { return QBindable(this, "number"); } #endif Q_INVOKABLE bool numberIsDefaultValue() const { return !m_data->testPropertySet(8); } double numberDouble() const { return m_data->p_numberDouble; } void setNumberDouble(const double &value) { auto oldValue = m_data->p_numberDouble; m_data->p_numberDouble = value; m_data->markPropertySet(9); if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config, value]() { config->setValue(QStringLiteral("numberDouble"), value); }); } if (m_data->p_numberDouble != oldValue) { Q_EMIT numberDoubleChanged(); Q_EMIT valueChanged(QStringLiteral("numberDouble"), value); } } void resetNumberDouble() { if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config]() { config->reset(QStringLiteral("numberDouble")); }); } } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QBindable bindableNumberDouble() { return QBindable(this, "numberDouble"); } #endif Q_INVOKABLE bool numberDoubleIsDefaultValue() const { return !m_data->testPropertySet(9); } bool publicConfig() const { return m_data->p_publicConfig; } void setPublicConfig(const bool &value) { auto oldValue = m_data->p_publicConfig; m_data->p_publicConfig = value; m_data->markPropertySet(10); if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config, value]() { config->setValue(QStringLiteral("publicConfig"), value); }); } if (m_data->p_publicConfig != oldValue) { Q_EMIT publicConfigChanged(); Q_EMIT valueChanged(QStringLiteral("publicConfig"), value); } } void resetPublicConfig() { if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config]() { config->reset(QStringLiteral("publicConfig")); }); } } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QBindable bindablePublicConfig() { return QBindable(this, "publicConfig"); } #endif Q_INVOKABLE bool publicConfigIsDefaultValue() const { return !m_data->testPropertySet(10); } bool readonly() const { return m_data->p_readonly; } void setReadonly(const bool &value) { auto oldValue = m_data->p_readonly; m_data->p_readonly = value; m_data->markPropertySet(11); if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config, value]() { config->setValue(QStringLiteral("readonly"), value); }); } if (m_data->p_readonly != oldValue) { Q_EMIT readonlyChanged(); Q_EMIT valueChanged(QStringLiteral("readonly"), value); } } void resetReadonly() { if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config]() { config->reset(QStringLiteral("readonly")); }); } } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QBindable bindableReadonly() { return QBindable(this, "readonly"); } #endif Q_INVOKABLE bool readonlyIsDefaultValue() const { return !m_data->testPropertySet(11); } bool readwrite() const { return m_data->p_readwrite; } void setReadwrite(const bool &value) { auto oldValue = m_data->p_readwrite; m_data->p_readwrite = value; m_data->markPropertySet(12); if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config, value]() { config->setValue(QStringLiteral("readwrite"), value); }); } if (m_data->p_readwrite != oldValue) { Q_EMIT readwriteChanged(); Q_EMIT valueChanged(QStringLiteral("readwrite"), value); } } void resetReadwrite() { if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config]() { config->reset(QStringLiteral("readwrite")); }); } } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QBindable bindableReadwrite() { return QBindable(this, "readwrite"); } #endif Q_INVOKABLE bool readwriteIsDefaultValue() const { return !m_data->testPropertySet(12); } QVariantMap struct() const { return m_data->p_struct; } void setStruct(const QVariantMap &value) { auto oldValue = m_data->p_struct; m_data->p_struct = value; m_data->markPropertySet(13); if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config, value]() { config->setValue(QStringLiteral("struct"), value); }); } if (m_data->p_struct != oldValue) { Q_EMIT structChanged(); Q_EMIT valueChanged(QStringLiteral("struct"), value); } } void resetStruct() { if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config]() { config->reset(QStringLiteral("struct")); }); } } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QBindable bindableStruct() { return QBindable(this, "struct"); } #endif Q_INVOKABLE bool structIsDefaultValue() const { return !m_data->testPropertySet(13); } protected: bool event(QEvent *e) override { if (e->type() == QEvent::ThreadChange) { Q_ASSERT(this->thread() == m_data->thread()); } return QObject::event(e); } Q_SIGNALS: void configInitializeFailed(); void configInitializeSucceed(DTK_CORE_NAMESPACE::DConfig *config); void valueChanged(const QString &key, const QVariant &value); void arrayChanged(); void array_mapChanged(); void array_map_structChanged(); void canExitChanged(); void key2Changed(); void key3Changed(); void mapChanged(); void map_arrayChanged(); void numberChanged(); void numberDoubleChanged(); void publicConfigChanged(); void readonlyChanged(); void readwriteChanged(); void structChanged(); private: // Prevent external moveToThread calls using QObject::moveToThread; class Data : public QObject { public: enum class Status { Invalid = 0, Initializing = 1, Succeeded = 2, Failed = 3, Destroyed = 4 }; explicit Data() : QObject(nullptr) {} inline void initializeInConfigThread(DTK_CORE_NAMESPACE::DConfig *config) { Q_ASSERT(!m_config.loadRelaxed()); m_config.storeRelaxed(config); if (testPropertySet(0)) { config->setValue(QStringLiteral("array"), QVariant::fromValue(p_array)); } else { updateValue(QStringLiteral("array"), QVariant::fromValue(p_array)); } if (testPropertySet(1)) { config->setValue(QStringLiteral("array_map"), QVariant::fromValue(p_array_map)); } else { updateValue(QStringLiteral("array_map"), QVariant::fromValue(p_array_map)); } if (testPropertySet(2)) { config->setValue(QStringLiteral("array_map_struct"), QVariant::fromValue(p_array_map_struct)); } else { updateValue(QStringLiteral("array_map_struct"), QVariant::fromValue(p_array_map_struct)); } if (testPropertySet(3)) { config->setValue(QStringLiteral("canExit"), QVariant::fromValue(p_canExit)); } else { updateValue(QStringLiteral("canExit"), QVariant::fromValue(p_canExit)); } if (testPropertySet(4)) { config->setValue(QStringLiteral("key2"), QVariant::fromValue(p_key2)); } else { updateValue(QStringLiteral("key2"), QVariant::fromValue(p_key2)); } if (testPropertySet(5)) { config->setValue(QStringLiteral("key3"), QVariant::fromValue(p_key3)); } else { updateValue(QStringLiteral("key3"), QVariant::fromValue(p_key3)); } if (testPropertySet(6)) { config->setValue(QStringLiteral("map"), QVariant::fromValue(p_map)); } else { updateValue(QStringLiteral("map"), QVariant::fromValue(p_map)); } if (testPropertySet(7)) { config->setValue(QStringLiteral("map_array"), QVariant::fromValue(p_map_array)); } else { updateValue(QStringLiteral("map_array"), QVariant::fromValue(p_map_array)); } if (testPropertySet(8)) { config->setValue(QStringLiteral("number"), QVariant::fromValue(p_number)); } else { updateValue(QStringLiteral("number"), QVariant::fromValue(p_number)); } if (testPropertySet(9)) { config->setValue(QStringLiteral("numberDouble"), QVariant::fromValue(p_numberDouble)); } else { updateValue(QStringLiteral("numberDouble"), QVariant::fromValue(p_numberDouble)); } if (testPropertySet(10)) { config->setValue(QStringLiteral("publicConfig"), QVariant::fromValue(p_publicConfig)); } else { updateValue(QStringLiteral("publicConfig"), QVariant::fromValue(p_publicConfig)); } if (testPropertySet(11)) { config->setValue(QStringLiteral("readonly"), QVariant::fromValue(p_readonly)); } else { updateValue(QStringLiteral("readonly"), QVariant::fromValue(p_readonly)); } if (testPropertySet(12)) { config->setValue(QStringLiteral("readwrite"), QVariant::fromValue(p_readwrite)); } else { updateValue(QStringLiteral("readwrite"), QVariant::fromValue(p_readwrite)); } if (testPropertySet(13)) { config->setValue(QStringLiteral("struct"), QVariant::fromValue(p_struct)); } else { updateValue(QStringLiteral("struct"), QVariant::fromValue(p_struct)); } connect(config, &DTK_CORE_NAMESPACE::DConfig::valueChanged, this, [this](const QString &key) { updateValue(key); }, Qt::DirectConnection); } inline void updateValue(const QString &key, const QVariant &fallback = QVariant()) { if (!m_config.loadRelaxed()) return; Q_ASSERT(QThread::currentThread() == m_config.loadRelaxed()->thread()); const QVariant &value = m_config.loadRelaxed()->value(key, fallback); if (key == QStringLiteral("array")) { markPropertySet(0, !m_config.loadRelaxed()->isDefaultValue(key)); auto newValue = qvariant_cast>(value); QMetaObject::invokeMethod(this, [this, newValue, key, value]() { if (m_userConfig && p_array != newValue) { Q_ASSERT(QThread::currentThread() == m_userConfig->thread()); p_array = newValue; Q_EMIT m_userConfig->arrayChanged(); Q_EMIT m_userConfig->valueChanged(key, value); } }); return; } if (key == QStringLiteral("array_map")) { markPropertySet(1, !m_config.loadRelaxed()->isDefaultValue(key)); auto newValue = qvariant_cast>(value); QMetaObject::invokeMethod(this, [this, newValue, key, value]() { if (m_userConfig && p_array_map != newValue) { Q_ASSERT(QThread::currentThread() == m_userConfig->thread()); p_array_map = newValue; Q_EMIT m_userConfig->array_mapChanged(); Q_EMIT m_userConfig->valueChanged(key, value); } }); return; } if (key == QStringLiteral("array_map_struct")) { markPropertySet(2, !m_config.loadRelaxed()->isDefaultValue(key)); auto newValue = qvariant_cast>(value); QMetaObject::invokeMethod(this, [this, newValue, key, value]() { if (m_userConfig && p_array_map_struct != newValue) { Q_ASSERT(QThread::currentThread() == m_userConfig->thread()); p_array_map_struct = newValue; Q_EMIT m_userConfig->array_map_structChanged(); Q_EMIT m_userConfig->valueChanged(key, value); } }); return; } if (key == QStringLiteral("canExit")) { markPropertySet(3, !m_config.loadRelaxed()->isDefaultValue(key)); auto newValue = qvariant_cast(value); QMetaObject::invokeMethod(this, [this, newValue, key, value]() { if (m_userConfig && p_canExit != newValue) { Q_ASSERT(QThread::currentThread() == m_userConfig->thread()); p_canExit = newValue; Q_EMIT m_userConfig->canExitChanged(); Q_EMIT m_userConfig->valueChanged(key, value); } }); return; } if (key == QStringLiteral("key2")) { markPropertySet(4, !m_config.loadRelaxed()->isDefaultValue(key)); auto newValue = qvariant_cast(value); QMetaObject::invokeMethod(this, [this, newValue, key, value]() { if (m_userConfig && p_key2 != newValue) { Q_ASSERT(QThread::currentThread() == m_userConfig->thread()); p_key2 = newValue; Q_EMIT m_userConfig->key2Changed(); Q_EMIT m_userConfig->valueChanged(key, value); } }); return; } if (key == QStringLiteral("key3")) { markPropertySet(5, !m_config.loadRelaxed()->isDefaultValue(key)); auto newValue = qvariant_cast(value); QMetaObject::invokeMethod(this, [this, newValue, key, value]() { if (m_userConfig && p_key3 != newValue) { Q_ASSERT(QThread::currentThread() == m_userConfig->thread()); p_key3 = newValue; Q_EMIT m_userConfig->key3Changed(); Q_EMIT m_userConfig->valueChanged(key, value); } }); return; } if (key == QStringLiteral("map")) { markPropertySet(6, !m_config.loadRelaxed()->isDefaultValue(key)); auto newValue = qvariant_cast(value); QMetaObject::invokeMethod(this, [this, newValue, key, value]() { if (m_userConfig && p_map != newValue) { Q_ASSERT(QThread::currentThread() == m_userConfig->thread()); p_map = newValue; Q_EMIT m_userConfig->mapChanged(); Q_EMIT m_userConfig->valueChanged(key, value); } }); return; } if (key == QStringLiteral("map_array")) { markPropertySet(7, !m_config.loadRelaxed()->isDefaultValue(key)); auto newValue = qvariant_cast(value); QMetaObject::invokeMethod(this, [this, newValue, key, value]() { if (m_userConfig && p_map_array != newValue) { Q_ASSERT(QThread::currentThread() == m_userConfig->thread()); p_map_array = newValue; Q_EMIT m_userConfig->map_arrayChanged(); Q_EMIT m_userConfig->valueChanged(key, value); } }); return; } if (key == QStringLiteral("number")) { markPropertySet(8, !m_config.loadRelaxed()->isDefaultValue(key)); auto newValue = qvariant_cast(value); QMetaObject::invokeMethod(this, [this, newValue, key, value]() { if (m_userConfig && p_number != newValue) { Q_ASSERT(QThread::currentThread() == m_userConfig->thread()); p_number = newValue; Q_EMIT m_userConfig->numberChanged(); Q_EMIT m_userConfig->valueChanged(key, value); } }); return; } if (key == QStringLiteral("numberDouble")) { markPropertySet(9, !m_config.loadRelaxed()->isDefaultValue(key)); auto newValue = qvariant_cast(value); QMetaObject::invokeMethod(this, [this, newValue, key, value]() { if (m_userConfig && p_numberDouble != newValue) { Q_ASSERT(QThread::currentThread() == m_userConfig->thread()); p_numberDouble = newValue; Q_EMIT m_userConfig->numberDoubleChanged(); Q_EMIT m_userConfig->valueChanged(key, value); } }); return; } if (key == QStringLiteral("publicConfig")) { markPropertySet(10, !m_config.loadRelaxed()->isDefaultValue(key)); auto newValue = qvariant_cast(value); QMetaObject::invokeMethod(this, [this, newValue, key, value]() { if (m_userConfig && p_publicConfig != newValue) { Q_ASSERT(QThread::currentThread() == m_userConfig->thread()); p_publicConfig = newValue; Q_EMIT m_userConfig->publicConfigChanged(); Q_EMIT m_userConfig->valueChanged(key, value); } }); return; } if (key == QStringLiteral("readonly")) { markPropertySet(11, !m_config.loadRelaxed()->isDefaultValue(key)); auto newValue = qvariant_cast(value); QMetaObject::invokeMethod(this, [this, newValue, key, value]() { if (m_userConfig && p_readonly != newValue) { Q_ASSERT(QThread::currentThread() == m_userConfig->thread()); p_readonly = newValue; Q_EMIT m_userConfig->readonlyChanged(); Q_EMIT m_userConfig->valueChanged(key, value); } }); return; } if (key == QStringLiteral("readwrite")) { markPropertySet(12, !m_config.loadRelaxed()->isDefaultValue(key)); auto newValue = qvariant_cast(value); QMetaObject::invokeMethod(this, [this, newValue, key, value]() { if (m_userConfig && p_readwrite != newValue) { Q_ASSERT(QThread::currentThread() == m_userConfig->thread()); p_readwrite = newValue; Q_EMIT m_userConfig->readwriteChanged(); Q_EMIT m_userConfig->valueChanged(key, value); } }); return; } if (key == QStringLiteral("struct")) { markPropertySet(13, !m_config.loadRelaxed()->isDefaultValue(key)); auto newValue = qvariant_cast(value); QMetaObject::invokeMethod(this, [this, newValue, key, value]() { if (m_userConfig && p_struct != newValue) { Q_ASSERT(QThread::currentThread() == m_userConfig->thread()); p_struct = newValue; Q_EMIT m_userConfig->structChanged(); Q_EMIT m_userConfig->valueChanged(key, value); } }); return; } } inline void markPropertySet(const int index, bool on = true) { if (index < 32) { if (on) m_propertySetStatus0.fetchAndOrOrdered(1 << (index - 0)); else m_propertySetStatus0.fetchAndAndOrdered(~(1 << (index - 0))); return; } Q_UNREACHABLE(); } inline bool testPropertySet(const int index) const { if (index < 32) { return (m_propertySetStatus0.loadRelaxed() & (1 << (index - 0))); } Q_UNREACHABLE(); } // Member variables QAtomicPointer m_config = nullptr; QAtomicInteger m_status = static_cast(Status::Invalid); QPointer m_userConfig = nullptr; QAtomicInteger m_propertySetStatus0 = 0; // Property storage QList p_array { QList{QVariant(QStringLiteral(u"\u0076\u0061\u006c\u0075\u0065\u0031")), QVariant(QStringLiteral(u"\u0076\u0061\u006c\u0075\u0065\u0032"))} }; QList p_array_map { QList{QVariant(QVariantMap{{QStringLiteral(u"\u006b\u0065\u0079\u0031"), QVariant(QStringLiteral(u"\u0076\u0061\u006c\u0075\u0065\u0031"))}, {QStringLiteral(u"\u006b\u0065\u0079\u0032"), QVariant(QStringLiteral(u"\u0076\u0061\u006c\u0075\u0065\u0032"))}})} }; QList p_array_map_struct { QList{QVariant(QVariantMap{{QStringLiteral(u"\u006b\u0065\u0079\u0031"), QVariant(QVariantMap{{QStringLiteral(u"\u0066\u0069\u0065\u006c\u0064\u0031"), QVariant(QStringLiteral(u"\u0076\u0061\u006c\u0075\u0065\u0031"))}})}, {QStringLiteral(u"\u006b\u0065\u0079\u0032"), QVariant(QStringLiteral(u"\u0076\u0061\u006c\u0075\u0065\u0032"))}})} }; bool p_canExit { true }; // Default value: "125" QString p_key2 { QStringLiteral(u"\u0031\u0032\u0035") }; // Default value: "application" QString p_key3 { QStringLiteral(u"\u0061\u0070\u0070\u006c\u0069\u0063\u0061\u0074\u0069\u006f\u006e") }; QVariantMap p_map { QVariantMap{{QStringLiteral(u"\u006b\u0065\u0079\u0031"), QVariant(QStringLiteral(u"\u0076\u0061\u006c\u0075\u0065\u0031"))}, {QStringLiteral(u"\u006b\u0065\u0079\u0032"), QVariant(QStringLiteral(u"\u0076\u0061\u006c\u0075\u0065\u0032"))}} }; QVariantMap p_map_array { QVariantMap{{QStringLiteral(u"\u006b\u0065\u0079\u0031"), QVariant(QList{QVariant(QStringLiteral(u"\u0076\u0061\u006c\u0075\u0065\u0031"))})}, {QStringLiteral(u"\u006b\u0065\u0079\u0032"), QVariant(QList{QVariant(QStringLiteral(u"\u0076\u0061\u006c\u0075\u0065\u0032"))})}} }; qlonglong p_number { 1 }; double p_numberDouble { 1 }; bool p_publicConfig { true }; bool p_readonly { true }; bool p_readwrite { true }; QVariantMap p_struct { QVariantMap{{QStringLiteral(u"\u006b\u0065\u0079\u0031"), QVariant(QStringLiteral(u"\u0076\u0061\u006c\u0075\u0065\u0031"))}, {QStringLiteral(u"\u006b\u0065\u0079\u0032"), QVariant(QStringLiteral(u"\u0076\u0061\u006c\u0075\u0065\u0032"))}} }; }; QPointer m_data; }; #endif // DCONFIG_DCONF-EXAMPLE_META_H dtkcore-6.7.46/toolGenerate/dconfig2cpp/dconf-example_other_app_configure_meta.hpp000066400000000000000000000445611522615770400304650ustar00rootroot00000000000000/** * This file is generated by dconfig2cpp. * Command line arguments: ./build/tools/dconfig2cpp/dconfig2cpp ./tests/data/dconf-example_other_app_configure.meta.json -o ./toolGenerate/dconfig2cpp/dconf-example_other_app_configure_meta.hpp * Generation time: 2026-01-21T14:02:20 * JSON file version: 1.0 * * WARNING: DO NOT MODIFY THIS FILE MANUALLY. * If you need to change the content, please modify the dconfig2cpp tool. */ #ifndef DCONFIG_DCONF-EXAMPLE_OTHER_APP_CONFIGURE_META_H #define DCONFIG_DCONF-EXAMPLE_OTHER_APP_CONFIGURE_META_H #include #include #include #include #include #include #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) #include #endif #include #include #include class dconfig_dconf-example_other_app_configure_meta : public QObject { Q_OBJECT Q_PROPERTY(QString appPrivate READ appPrivate WRITE setAppPrivate NOTIFY appPrivateChanged RESET resetAppPrivate) Q_PROPERTY(QString appPublic READ appPublic WRITE setAppPublic NOTIFY appPublicChanged RESET resetAppPublic) Q_CLASSINFO("DConfigKeyList", "appPrivate;appPublic") Q_CLASSINFO("DConfigFileName", "dconf-example_other_app_configure.meta") Q_CLASSINFO("DConfigFileVersion", "1.0") public: explicit dconfig_dconf-example_other_app_configure_meta(QThread *thread, DTK_CORE_NAMESPACE::DConfigBackend *backend, const QString &name, const QString &appId, const QString &subpath, bool isGeneric, QObject *parent) : QObject(parent), m_data(new Data) { m_data->m_userConfig = this; m_data->moveToThread(this->thread()); if (!thread->isRunning()) { qWarning() << QLatin1String("Warning: The provided thread is not running."); } Q_ASSERT(QThread::currentThread() != thread); auto worker = new QObject(); worker->moveToThread(thread); QPointer safeData(m_data); QMetaObject::invokeMethod(worker, [safeData, backend, name, appId, subpath, isGeneric, worker]() mutable { delete worker; worker = nullptr; if (!safeData->m_status.testAndSetOrdered(static_cast(Data::Status::Invalid), static_cast(Data::Status::Initializing))) { // CAS failed: status changed (e.g., set to Destroyed by destructor) // Schedule deletion of Data object via deleteLater to avoid direct delete in Config thread safeData->deleteLater(); return; } DTK_CORE_NAMESPACE::DConfig *config = nullptr; if (isGeneric) { if (backend) { config = DTK_CORE_NAMESPACE::DConfig::createGeneric(backend, name, subpath, nullptr); } else { config = DTK_CORE_NAMESPACE::DConfig::createGeneric(name, subpath, nullptr); } } else { if (backend) { if (appId.isNull()) { config = DTK_CORE_NAMESPACE::DConfig::create(backend, DTK_CORE_NAMESPACE::DSGApplication::id(), name, subpath, nullptr); } else { config = DTK_CORE_NAMESPACE::DConfig::create(backend, appId, name, subpath, nullptr); } } else { if (appId.isNull()) { config = DTK_CORE_NAMESPACE::DConfig::create(DTK_CORE_NAMESPACE::DSGApplication::id(), name, subpath, nullptr); } else { config = DTK_CORE_NAMESPACE::DConfig::create(appId, name, subpath, nullptr); } } } if (!config || !config->isValid()) { qWarning() << QLatin1String("Failed to create DConfig instance."); QMetaObject::invokeMethod(safeData, [safeData]() { if (safeData->m_status.testAndSetOrdered(static_cast(Data::Status::Initializing), static_cast(Data::Status::Failed))) { Q_EMIT safeData->m_userConfig->configInitializeFailed(); } else { // CAS failed, destroy data object delete safeData; } }, Qt::QueuedConnection); if (config) delete config; return; } config->moveToThread(QThread::currentThread()); // Initialize through Data class safeData->initializeInConfigThread(config); QMetaObject::invokeMethod(safeData, [safeData, config]() { // Try to transition from Initializing to Succeeded if (safeData->m_status.testAndSetOrdered(static_cast(Data::Status::Initializing), static_cast(Data::Status::Succeeded))) { // CAS succeeded: connect config destroyed signal to cleanup Data, then emit success signal to main thread QObject::connect(config, &QObject::destroyed, safeData, &QObject::deleteLater); if (safeData->m_userConfig) { Q_EMIT safeData->m_userConfig->configInitializeSucceed(config); } } else { // CAS failed - state changed (e.g., set to Destroyed) // We must clean up the config we just created config->deleteLater(); safeData->deleteLater(); } }, Qt::QueuedConnection); }); } static dconfig_dconf-example_other_app_configure_meta* create(const QString &appId = {}, const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread()) { return new dconfig_dconf-example_other_app_configure_meta(thread, nullptr, QStringLiteral(u"\u0064\u0063\u006f\u006e\u0066\u002d\u0065\u0078\u0061\u006d\u0070\u006c\u0065\u005f\u006f\u0074\u0068\u0065\u0072\u005f\u0061\u0070\u0070\u005f\u0063\u006f\u006e\u0066\u0069\u0067\u0075\u0072\u0065\u002e\u006d\u0065\u0074\u0061"), appId, subpath, false, parent); } static dconfig_dconf-example_other_app_configure_meta* create(DTK_CORE_NAMESPACE::DConfigBackend *backend, const QString &appId = {}, const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread()) { return new dconfig_dconf-example_other_app_configure_meta(thread, backend, QStringLiteral(u"\u0064\u0063\u006f\u006e\u0066\u002d\u0065\u0078\u0061\u006d\u0070\u006c\u0065\u005f\u006f\u0074\u0068\u0065\u0072\u005f\u0061\u0070\u0070\u005f\u0063\u006f\u006e\u0066\u0069\u0067\u0075\u0072\u0065\u002e\u006d\u0065\u0074\u0061"), appId, subpath, false, parent); } static dconfig_dconf-example_other_app_configure_meta* createByName(const QString &name, const QString &appId = {}, const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread()) { return new dconfig_dconf-example_other_app_configure_meta(thread, nullptr, name, appId, subpath, false, parent); } static dconfig_dconf-example_other_app_configure_meta* createByName(DTK_CORE_NAMESPACE::DConfigBackend *backend, const QString &name, const QString &appId = {}, const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread()) { return new dconfig_dconf-example_other_app_configure_meta(thread, backend, name, appId, subpath, false, parent); } static dconfig_dconf-example_other_app_configure_meta* createGeneric(const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread()) { return new dconfig_dconf-example_other_app_configure_meta(thread, nullptr, QStringLiteral(u"\u0064\u0063\u006f\u006e\u0066\u002d\u0065\u0078\u0061\u006d\u0070\u006c\u0065\u005f\u006f\u0074\u0068\u0065\u0072\u005f\u0061\u0070\u0070\u005f\u0063\u006f\u006e\u0066\u0069\u0067\u0075\u0072\u0065\u002e\u006d\u0065\u0074\u0061"), {}, subpath, true, parent); } static dconfig_dconf-example_other_app_configure_meta* create(DTK_CORE_NAMESPACE::DConfigBackend *backend, const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread()) { return new dconfig_dconf-example_other_app_configure_meta(thread, backend, QStringLiteral(u"\u0064\u0063\u006f\u006e\u0066\u002d\u0065\u0078\u0061\u006d\u0070\u006c\u0065\u005f\u006f\u0074\u0068\u0065\u0072\u005f\u0061\u0070\u0070\u005f\u0063\u006f\u006e\u0066\u0069\u0067\u0075\u0072\u0065\u002e\u006d\u0065\u0074\u0061"), {}, subpath, true, parent); } static dconfig_dconf-example_other_app_configure_meta* createGenericByName(const QString &name, const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread()) { return new dconfig_dconf-example_other_app_configure_meta(thread, nullptr, name, {}, subpath, true, parent); } static dconfig_dconf-example_other_app_configure_meta* createGenericByName(DTK_CORE_NAMESPACE::DConfigBackend *backend, const QString &name, const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread()) { return new dconfig_dconf-example_other_app_configure_meta(thread, backend, name, {}, subpath, true, parent); } ~dconfig_dconf-example_other_app_configure_meta() { m_data->m_userConfig = nullptr; int oldStatus = m_data->m_status.fetchAndStoreOrdered(static_cast(Data::Status::Destroyed)); if (oldStatus == static_cast(Data::Status::Succeeded)) { // When Succeeded, release config object only auto config = m_data->m_config.loadRelaxed(); Q_ASSERT(config); config->deleteLater(); // m_data will be deleted by config's destroyed signal } else if (oldStatus == static_cast(Data::Status::Failed)) { // When Failed state, schedule cleanup of Data object m_data->deleteLater(); } } Q_INVOKABLE DTK_CORE_NAMESPACE::DConfig *config() const { return m_data->m_config.loadRelaxed(); } // Deprecated: Use isInitializeSucceeded() instead Q_INVOKABLE Q_DECL_DEPRECATED_X("Use isInitializeSucceeded() instead") bool isInitializeSucceed() const { return isInitializeSucceeded(); } Q_INVOKABLE bool isInitializeSucceeded() const { return m_data->m_status.loadRelaxed() == static_cast(Data::Status::Succeeded); } Q_INVOKABLE bool isInitializeFailed() const { return m_data->m_status.loadRelaxed() == static_cast(Data::Status::Failed); } Q_INVOKABLE bool isInitializing() const { return m_data->m_status.loadRelaxed() == static_cast(Data::Status::Initializing); } Q_INVOKABLE QStringList keyList() const { return { QStringLiteral("appPrivate"), QStringLiteral("appPublic")}; } Q_INVOKABLE bool isDefaultValue(const QString &key) const { if (key == QStringLiteral("appPrivate")) return appPrivateIsDefaultValue(); if (key == QStringLiteral("appPublic")) return appPublicIsDefaultValue(); return false; } QString appPrivate() const { return m_data->p_appPrivate; } void setAppPrivate(const QString &value) { auto oldValue = m_data->p_appPrivate; m_data->p_appPrivate = value; m_data->markPropertySet(0); if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config, value]() { config->setValue(QStringLiteral("appPrivate"), value); }); } if (m_data->p_appPrivate != oldValue) { Q_EMIT appPrivateChanged(); Q_EMIT valueChanged(QStringLiteral("appPrivate"), value); } } void resetAppPrivate() { if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config]() { config->reset(QStringLiteral("appPrivate")); }); } } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QBindable bindableAppPrivate() { return QBindable(this, "appPrivate"); } #endif Q_INVOKABLE bool appPrivateIsDefaultValue() const { return !m_data->testPropertySet(0); } QString appPublic() const { return m_data->p_appPublic; } void setAppPublic(const QString &value) { auto oldValue = m_data->p_appPublic; m_data->p_appPublic = value; m_data->markPropertySet(1); if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config, value]() { config->setValue(QStringLiteral("appPublic"), value); }); } if (m_data->p_appPublic != oldValue) { Q_EMIT appPublicChanged(); Q_EMIT valueChanged(QStringLiteral("appPublic"), value); } } void resetAppPublic() { if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config]() { config->reset(QStringLiteral("appPublic")); }); } } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QBindable bindableAppPublic() { return QBindable(this, "appPublic"); } #endif Q_INVOKABLE bool appPublicIsDefaultValue() const { return !m_data->testPropertySet(1); } protected: bool event(QEvent *e) override { if (e->type() == QEvent::ThreadChange) { Q_ASSERT(this->thread() == m_data->thread()); } return QObject::event(e); } Q_SIGNALS: void configInitializeFailed(); void configInitializeSucceed(DTK_CORE_NAMESPACE::DConfig *config); void valueChanged(const QString &key, const QVariant &value); void appPrivateChanged(); void appPublicChanged(); private: // Prevent external moveToThread calls using QObject::moveToThread; class Data : public QObject { public: enum class Status { Invalid = 0, Initializing = 1, Succeeded = 2, Failed = 3, Destroyed = 4 }; explicit Data() : QObject(nullptr) {} inline void initializeInConfigThread(DTK_CORE_NAMESPACE::DConfig *config) { Q_ASSERT(!m_config.loadRelaxed()); m_config.storeRelaxed(config); if (testPropertySet(0)) { config->setValue(QStringLiteral("appPrivate"), QVariant::fromValue(p_appPrivate)); } else { updateValue(QStringLiteral("appPrivate"), QVariant::fromValue(p_appPrivate)); } if (testPropertySet(1)) { config->setValue(QStringLiteral("appPublic"), QVariant::fromValue(p_appPublic)); } else { updateValue(QStringLiteral("appPublic"), QVariant::fromValue(p_appPublic)); } connect(config, &DTK_CORE_NAMESPACE::DConfig::valueChanged, this, [this](const QString &key) { updateValue(key); }, Qt::DirectConnection); } inline void updateValue(const QString &key, const QVariant &fallback = QVariant()) { if (!m_config.loadRelaxed()) return; Q_ASSERT(QThread::currentThread() == m_config.loadRelaxed()->thread()); const QVariant &value = m_config.loadRelaxed()->value(key, fallback); if (key == QStringLiteral("appPrivate")) { markPropertySet(0, !m_config.loadRelaxed()->isDefaultValue(key)); auto newValue = qvariant_cast(value); QMetaObject::invokeMethod(this, [this, newValue, key, value]() { if (m_userConfig && p_appPrivate != newValue) { Q_ASSERT(QThread::currentThread() == m_userConfig->thread()); p_appPrivate = newValue; Q_EMIT m_userConfig->appPrivateChanged(); Q_EMIT m_userConfig->valueChanged(key, value); } }); return; } if (key == QStringLiteral("appPublic")) { markPropertySet(1, !m_config.loadRelaxed()->isDefaultValue(key)); auto newValue = qvariant_cast(value); QMetaObject::invokeMethod(this, [this, newValue, key, value]() { if (m_userConfig && p_appPublic != newValue) { Q_ASSERT(QThread::currentThread() == m_userConfig->thread()); p_appPublic = newValue; Q_EMIT m_userConfig->appPublicChanged(); Q_EMIT m_userConfig->valueChanged(key, value); } }); return; } } inline void markPropertySet(const int index, bool on = true) { if (index < 32) { if (on) m_propertySetStatus0.fetchAndOrOrdered(1 << (index - 0)); else m_propertySetStatus0.fetchAndAndOrdered(~(1 << (index - 0))); return; } Q_UNREACHABLE(); } inline bool testPropertySet(const int index) const { if (index < 32) { return (m_propertySetStatus0.loadRelaxed() & (1 << (index - 0))); } Q_UNREACHABLE(); } // Member variables QAtomicPointer m_config = nullptr; QAtomicInteger m_status = static_cast(Status::Invalid); QPointer m_userConfig = nullptr; QAtomicInteger m_propertySetStatus0 = 0; // Property storage // Default value: "appPrivate" QString p_appPrivate { QStringLiteral(u"\u0061\u0070\u0070\u0050\u0072\u0069\u0076\u0061\u0074\u0065") }; // Default value: "publicValue" QString p_appPublic { QStringLiteral(u"\u0070\u0075\u0062\u006c\u0069\u0063\u0056\u0061\u006c\u0075\u0065") }; }; QPointer m_data; }; #endif // DCONFIG_DCONF-EXAMPLE_OTHER_APP_CONFIGURE_META_H dtkcore-6.7.46/toolGenerate/dconfig2cpp/dconf-global_meta.hpp000066400000000000000000000352101522615770400241570ustar00rootroot00000000000000/** * This file is generated by dconfig2cpp. * Command line arguments: ./build/tools/dconfig2cpp/dconfig2cpp ./tests/data/dconf-global.meta.json -o ./toolGenerate/dconfig2cpp/dconf-global_meta.hpp * Generation time: 2026-01-21T14:02:35 * JSON file version: 1.0 * * WARNING: DO NOT MODIFY THIS FILE MANUALLY. * If you need to change the content, please modify the dconfig2cpp tool. */ #ifndef DCONFIG_DCONF-GLOBAL_META_H #define DCONFIG_DCONF-GLOBAL_META_H #include #include #include #include #include #include #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) #include #endif #include #include #include class dconfig_dconf-global_meta : public QObject { Q_OBJECT Q_PROPERTY(QString key3 READ key3 WRITE setKey3 NOTIFY key3Changed RESET resetKey3) Q_CLASSINFO("DConfigKeyList", "key3") Q_CLASSINFO("DConfigFileName", "dconf-global.meta") Q_CLASSINFO("DConfigFileVersion", "1.0") public: explicit dconfig_dconf-global_meta(QThread *thread, DTK_CORE_NAMESPACE::DConfigBackend *backend, const QString &name, const QString &appId, const QString &subpath, bool isGeneric, QObject *parent) : QObject(parent), m_data(new Data) { m_data->m_userConfig = this; m_data->moveToThread(this->thread()); if (!thread->isRunning()) { qWarning() << QLatin1String("Warning: The provided thread is not running."); } Q_ASSERT(QThread::currentThread() != thread); auto worker = new QObject(); worker->moveToThread(thread); QPointer safeData(m_data); QMetaObject::invokeMethod(worker, [safeData, backend, name, appId, subpath, isGeneric, worker]() mutable { delete worker; worker = nullptr; if (!safeData->m_status.testAndSetOrdered(static_cast(Data::Status::Invalid), static_cast(Data::Status::Initializing))) { // CAS failed: status changed (e.g., set to Destroyed by destructor) // Schedule deletion of Data object via deleteLater to avoid direct delete in Config thread safeData->deleteLater(); return; } DTK_CORE_NAMESPACE::DConfig *config = nullptr; if (isGeneric) { if (backend) { config = DTK_CORE_NAMESPACE::DConfig::createGeneric(backend, name, subpath, nullptr); } else { config = DTK_CORE_NAMESPACE::DConfig::createGeneric(name, subpath, nullptr); } } else { if (backend) { if (appId.isNull()) { config = DTK_CORE_NAMESPACE::DConfig::create(backend, DTK_CORE_NAMESPACE::DSGApplication::id(), name, subpath, nullptr); } else { config = DTK_CORE_NAMESPACE::DConfig::create(backend, appId, name, subpath, nullptr); } } else { if (appId.isNull()) { config = DTK_CORE_NAMESPACE::DConfig::create(DTK_CORE_NAMESPACE::DSGApplication::id(), name, subpath, nullptr); } else { config = DTK_CORE_NAMESPACE::DConfig::create(appId, name, subpath, nullptr); } } } if (!config || !config->isValid()) { qWarning() << QLatin1String("Failed to create DConfig instance."); QMetaObject::invokeMethod(safeData, [safeData]() { if (safeData->m_status.testAndSetOrdered(static_cast(Data::Status::Initializing), static_cast(Data::Status::Failed))) { Q_EMIT safeData->m_userConfig->configInitializeFailed(); } else { // CAS failed, destroy data object delete safeData; } }, Qt::QueuedConnection); if (config) delete config; return; } config->moveToThread(QThread::currentThread()); // Initialize through Data class safeData->initializeInConfigThread(config); QMetaObject::invokeMethod(safeData, [safeData, config]() { // Try to transition from Initializing to Succeeded if (safeData->m_status.testAndSetOrdered(static_cast(Data::Status::Initializing), static_cast(Data::Status::Succeeded))) { // CAS succeeded: connect config destroyed signal to cleanup Data, then emit success signal to main thread QObject::connect(config, &QObject::destroyed, safeData, &QObject::deleteLater); if (safeData->m_userConfig) { Q_EMIT safeData->m_userConfig->configInitializeSucceed(config); } } else { // CAS failed - state changed (e.g., set to Destroyed) // We must clean up the config we just created config->deleteLater(); safeData->deleteLater(); } }, Qt::QueuedConnection); }); } static dconfig_dconf-global_meta* create(const QString &appId = {}, const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread()) { return new dconfig_dconf-global_meta(thread, nullptr, QStringLiteral(u"\u0064\u0063\u006f\u006e\u0066\u002d\u0067\u006c\u006f\u0062\u0061\u006c\u002e\u006d\u0065\u0074\u0061"), appId, subpath, false, parent); } static dconfig_dconf-global_meta* create(DTK_CORE_NAMESPACE::DConfigBackend *backend, const QString &appId = {}, const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread()) { return new dconfig_dconf-global_meta(thread, backend, QStringLiteral(u"\u0064\u0063\u006f\u006e\u0066\u002d\u0067\u006c\u006f\u0062\u0061\u006c\u002e\u006d\u0065\u0074\u0061"), appId, subpath, false, parent); } static dconfig_dconf-global_meta* createByName(const QString &name, const QString &appId = {}, const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread()) { return new dconfig_dconf-global_meta(thread, nullptr, name, appId, subpath, false, parent); } static dconfig_dconf-global_meta* createByName(DTK_CORE_NAMESPACE::DConfigBackend *backend, const QString &name, const QString &appId = {}, const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread()) { return new dconfig_dconf-global_meta(thread, backend, name, appId, subpath, false, parent); } static dconfig_dconf-global_meta* createGeneric(const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread()) { return new dconfig_dconf-global_meta(thread, nullptr, QStringLiteral(u"\u0064\u0063\u006f\u006e\u0066\u002d\u0067\u006c\u006f\u0062\u0061\u006c\u002e\u006d\u0065\u0074\u0061"), {}, subpath, true, parent); } static dconfig_dconf-global_meta* create(DTK_CORE_NAMESPACE::DConfigBackend *backend, const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread()) { return new dconfig_dconf-global_meta(thread, backend, QStringLiteral(u"\u0064\u0063\u006f\u006e\u0066\u002d\u0067\u006c\u006f\u0062\u0061\u006c\u002e\u006d\u0065\u0074\u0061"), {}, subpath, true, parent); } static dconfig_dconf-global_meta* createGenericByName(const QString &name, const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread()) { return new dconfig_dconf-global_meta(thread, nullptr, name, {}, subpath, true, parent); } static dconfig_dconf-global_meta* createGenericByName(DTK_CORE_NAMESPACE::DConfigBackend *backend, const QString &name, const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread()) { return new dconfig_dconf-global_meta(thread, backend, name, {}, subpath, true, parent); } ~dconfig_dconf-global_meta() { m_data->m_userConfig = nullptr; int oldStatus = m_data->m_status.fetchAndStoreOrdered(static_cast(Data::Status::Destroyed)); if (oldStatus == static_cast(Data::Status::Succeeded)) { // When Succeeded, release config object only auto config = m_data->m_config.loadRelaxed(); Q_ASSERT(config); config->deleteLater(); // m_data will be deleted by config's destroyed signal } else if (oldStatus == static_cast(Data::Status::Failed)) { // When Failed state, schedule cleanup of Data object m_data->deleteLater(); } } Q_INVOKABLE DTK_CORE_NAMESPACE::DConfig *config() const { return m_data->m_config.loadRelaxed(); } // Deprecated: Use isInitializeSucceeded() instead Q_INVOKABLE Q_DECL_DEPRECATED_X("Use isInitializeSucceeded() instead") bool isInitializeSucceed() const { return isInitializeSucceeded(); } Q_INVOKABLE bool isInitializeSucceeded() const { return m_data->m_status.loadRelaxed() == static_cast(Data::Status::Succeeded); } Q_INVOKABLE bool isInitializeFailed() const { return m_data->m_status.loadRelaxed() == static_cast(Data::Status::Failed); } Q_INVOKABLE bool isInitializing() const { return m_data->m_status.loadRelaxed() == static_cast(Data::Status::Initializing); } Q_INVOKABLE QStringList keyList() const { return { QStringLiteral("key3")}; } Q_INVOKABLE bool isDefaultValue(const QString &key) const { if (key == QStringLiteral("key3")) return key3IsDefaultValue(); return false; } QString key3() const { return m_data->p_key3; } void setKey3(const QString &value) { auto oldValue = m_data->p_key3; m_data->p_key3 = value; m_data->markPropertySet(0); if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config, value]() { config->setValue(QStringLiteral("key3"), value); }); } if (m_data->p_key3 != oldValue) { Q_EMIT key3Changed(); Q_EMIT valueChanged(QStringLiteral("key3"), value); } } void resetKey3() { if (auto config = m_data->m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [config]() { config->reset(QStringLiteral("key3")); }); } } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QBindable bindableKey3() { return QBindable(this, "key3"); } #endif Q_INVOKABLE bool key3IsDefaultValue() const { return !m_data->testPropertySet(0); } protected: bool event(QEvent *e) override { if (e->type() == QEvent::ThreadChange) { Q_ASSERT(this->thread() == m_data->thread()); } return QObject::event(e); } Q_SIGNALS: void configInitializeFailed(); void configInitializeSucceed(DTK_CORE_NAMESPACE::DConfig *config); void valueChanged(const QString &key, const QVariant &value); void key3Changed(); private: // Prevent external moveToThread calls using QObject::moveToThread; class Data : public QObject { public: enum class Status { Invalid = 0, Initializing = 1, Succeeded = 2, Failed = 3, Destroyed = 4 }; explicit Data() : QObject(nullptr) {} inline void initializeInConfigThread(DTK_CORE_NAMESPACE::DConfig *config) { Q_ASSERT(!m_config.loadRelaxed()); m_config.storeRelaxed(config); if (testPropertySet(0)) { config->setValue(QStringLiteral("key3"), QVariant::fromValue(p_key3)); } else { updateValue(QStringLiteral("key3"), QVariant::fromValue(p_key3)); } connect(config, &DTK_CORE_NAMESPACE::DConfig::valueChanged, this, [this](const QString &key) { updateValue(key); }, Qt::DirectConnection); } inline void updateValue(const QString &key, const QVariant &fallback = QVariant()) { if (!m_config.loadRelaxed()) return; Q_ASSERT(QThread::currentThread() == m_config.loadRelaxed()->thread()); const QVariant &value = m_config.loadRelaxed()->value(key, fallback); if (key == QStringLiteral("key3")) { markPropertySet(0, !m_config.loadRelaxed()->isDefaultValue(key)); auto newValue = qvariant_cast(value); QMetaObject::invokeMethod(this, [this, newValue, key, value]() { if (m_userConfig && p_key3 != newValue) { Q_ASSERT(QThread::currentThread() == m_userConfig->thread()); p_key3 = newValue; Q_EMIT m_userConfig->key3Changed(); Q_EMIT m_userConfig->valueChanged(key, value); } }); return; } } inline void markPropertySet(const int index, bool on = true) { if (index < 32) { if (on) m_propertySetStatus0.fetchAndOrOrdered(1 << (index - 0)); else m_propertySetStatus0.fetchAndAndOrdered(~(1 << (index - 0))); return; } Q_UNREACHABLE(); } inline bool testPropertySet(const int index) const { if (index < 32) { return (m_propertySetStatus0.loadRelaxed() & (1 << (index - 0))); } Q_UNREACHABLE(); } // Member variables QAtomicPointer m_config = nullptr; QAtomicInteger m_status = static_cast(Status::Invalid); QPointer m_userConfig = nullptr; QAtomicInteger m_propertySetStatus0 = 0; // Property storage // Default value: "global" QString p_key3 { QStringLiteral(u"\u0067\u006c\u006f\u0062\u0061\u006c") }; }; QPointer m_data; }; #endif // DCONFIG_DCONF-GLOBAL_META_H dtkcore-6.7.46/toolGenerate/qdbusxml2cpp/000077500000000000000000000000001522615770400203365ustar00rootroot00000000000000dtkcore-6.7.46/toolGenerate/qdbusxml2cpp/org.desktopspec.ConfigManager.ManagerAdaptor.cpp000066400000000000000000000072741522615770400315510ustar00rootroot00000000000000/* * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp ./dtkcore/src/dbus/org.desktopspec.ConfigManager.Manager.xml -a ./dtkcore/toolGenerate/qdbusxml2cpp/org.desktopspec.ConfigManager.ManagerAdaptor -i ./dtkcore/toolGenerate/qdbusxml2cpp/org.desktopspec.ConfigManager.Manager.h * * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. */ #include "./dtkcore/toolGenerate/qdbusxml2cpp/org.desktopspec.ConfigManager.ManagerAdaptor.h" #include #include #include #include #include #include #include /* * Implementation of adaptor class ManagerAdaptor */ ManagerAdaptor::ManagerAdaptor(QObject *parent) : QDBusAbstractAdaptor(parent) { // constructor setAutoRelaySignals(true); } ManagerAdaptor::~ManagerAdaptor() { // destructor } QStringList ManagerAdaptor::keyList() const { // get the value of property keyList return qvariant_cast< QStringList >(parent()->property("keyList")); } QString ManagerAdaptor::version() const { // get the value of property version return qvariant_cast< QString >(parent()->property("version")); } QString ManagerAdaptor::description(const QString &key, const QString &language) { // handle method call org.desktopspec.ConfigManager.Manager.description QString description; QMetaObject::invokeMethod(parent(), "description", Q_RETURN_ARG(QString, description), Q_ARG(QString, key), Q_ARG(QString, language)); return description; } bool ManagerAdaptor::isDefaultValue(const QString &key) { // handle method call org.desktopspec.ConfigManager.Manager.isDefaultValue bool isDefaultValue; QMetaObject::invokeMethod(parent(), "isDefaultValue", Q_RETURN_ARG(bool, isDefaultValue), Q_ARG(QString, key)); return isDefaultValue; } QString ManagerAdaptor::name(const QString &key, const QString &language) { // handle method call org.desktopspec.ConfigManager.Manager.name QString name; QMetaObject::invokeMethod(parent(), "name", Q_RETURN_ARG(QString, name), Q_ARG(QString, key), Q_ARG(QString, language)); return name; } QString ManagerAdaptor::permissions(const QString &key) { // handle method call org.desktopspec.ConfigManager.Manager.permissions QString permissions; QMetaObject::invokeMethod(parent(), "permissions", Q_RETURN_ARG(QString, permissions), Q_ARG(QString, key)); return permissions; } void ManagerAdaptor::release() { // handle method call org.desktopspec.ConfigManager.Manager.release QMetaObject::invokeMethod(parent(), "release"); } void ManagerAdaptor::reset(const QString &key) { // handle method call org.desktopspec.ConfigManager.Manager.reset QMetaObject::invokeMethod(parent(), "reset", Q_ARG(QString, key)); } void ManagerAdaptor::setValue(const QString &key, const QDBusVariant &value) { // handle method call org.desktopspec.ConfigManager.Manager.setValue QMetaObject::invokeMethod(parent(), "setValue", Q_ARG(QString, key), Q_ARG(QDBusVariant, value)); } QDBusVariant ManagerAdaptor::value(const QString &key) { // handle method call org.desktopspec.ConfigManager.Manager.value QDBusVariant value; QMetaObject::invokeMethod(parent(), "value", Q_RETURN_ARG(QDBusVariant, value), Q_ARG(QString, key)); return value; } QString ManagerAdaptor::visibility(const QString &key) { // handle method call org.desktopspec.ConfigManager.Manager.visibility QString visibility; QMetaObject::invokeMethod(parent(), "visibility", Q_RETURN_ARG(QString, visibility), Q_ARG(QString, key)); return visibility; } dtkcore-6.7.46/toolGenerate/qdbusxml2cpp/org.desktopspec.ConfigManager.ManagerAdaptor.h000066400000000000000000000074031522615770400312100ustar00rootroot00000000000000/* * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp ./dtkcore/src/dbus/org.desktopspec.ConfigManager.Manager.xml -a ./dtkcore/toolGenerate/qdbusxml2cpp/org.desktopspec.ConfigManager.ManagerAdaptor -i ./dtkcore/toolGenerate/qdbusxml2cpp/org.desktopspec.ConfigManager.Manager.h * * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd. * * This is an auto-generated file. * This file may have been hand-edited. Look for HAND-EDIT comments * before re-generating it. */ #ifndef ORG_DESKTOPSPEC_CONFIGMANAGER_MANAGERADAPTOR_H #define ORG_DESKTOPSPEC_CONFIGMANAGER_MANAGERADAPTOR_H #include #include #include "./dtkcore/toolGenerate/qdbusxml2cpp/org.desktopspec.ConfigManager.Manager.h" QT_BEGIN_NAMESPACE class QByteArray; template class QList; template class QMap; class QString; class QStringList; class QVariant; QT_END_NAMESPACE /* * Adaptor class for interface org.desktopspec.ConfigManager.Manager */ class ManagerAdaptor: public QDBusAbstractAdaptor { Q_OBJECT Q_CLASSINFO("D-Bus Interface", "org.desktopspec.ConfigManager.Manager") Q_CLASSINFO("D-Bus Introspection", "" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" "") public: ManagerAdaptor(QObject *parent); virtual ~ManagerAdaptor(); public: // PROPERTIES Q_PROPERTY(QStringList keyList READ keyList) QStringList keyList() const; Q_PROPERTY(QString version READ version) QString version() const; public Q_SLOTS: // METHODS QString description(const QString &key, const QString &language); bool isDefaultValue(const QString &key); QString name(const QString &key, const QString &language); QString permissions(const QString &key); void release(); void reset(const QString &key); void setValue(const QString &key, const QDBusVariant &value); QDBusVariant value(const QString &key); QString visibility(const QString &key); Q_SIGNALS: // SIGNALS void valueChanged(const QString &key); }; #endif dtkcore-6.7.46/toolGenerate/qdbusxml2cpp/org.desktopspec.ConfigManagerAdaptor.cpp000066400000000000000000000034071522615770400301720ustar00rootroot00000000000000/* * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp ./dtkcore/src/dbus/org.desktopspec.ConfigManager.xml -a ./dtkcore/toolGenerate/qdbusxml2cpp/org.desktopspec.ConfigManagerAdaptor -i ./dtkcore/toolGenerate/qdbusxml2cpp/org.desktopspec.ConfigManager.h * * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. */ #include "./dtkcore/toolGenerate/qdbusxml2cpp/org.desktopspec.ConfigManagerAdaptor.h" #include #include #include #include #include #include #include /* * Implementation of adaptor class ConfigManagerAdaptor */ ConfigManagerAdaptor::ConfigManagerAdaptor(QObject *parent) : QDBusAbstractAdaptor(parent) { // constructor setAutoRelaySignals(true); } ConfigManagerAdaptor::~ConfigManagerAdaptor() { // destructor } QDBusObjectPath ConfigManagerAdaptor::acquireManager(const QString &appid, const QString &name, const QString &subpath) { // handle method call org.desktopspec.ConfigManager.acquireManager QDBusObjectPath path; QMetaObject::invokeMethod(parent(), "acquireManager", Q_RETURN_ARG(QDBusObjectPath, path), Q_ARG(QString, appid), Q_ARG(QString, name), Q_ARG(QString, subpath)); return path; } void ConfigManagerAdaptor::sync(const QString &path) { // handle method call org.desktopspec.ConfigManager.sync QMetaObject::invokeMethod(parent(), "sync", Q_ARG(QString, path)); } void ConfigManagerAdaptor::update(const QString &path) { // handle method call org.desktopspec.ConfigManager.update QMetaObject::invokeMethod(parent(), "update", Q_ARG(QString, path)); } dtkcore-6.7.46/toolGenerate/qdbusxml2cpp/org.desktopspec.ConfigManagerAdaptor.h000066400000000000000000000040651522615770400276400ustar00rootroot00000000000000/* * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp ./dtkcore/src/dbus/org.desktopspec.ConfigManager.xml -a ./dtkcore/toolGenerate/qdbusxml2cpp/org.desktopspec.ConfigManagerAdaptor -i ./dtkcore/toolGenerate/qdbusxml2cpp/org.desktopspec.ConfigManager.h * * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd. * * This is an auto-generated file. * This file may have been hand-edited. Look for HAND-EDIT comments * before re-generating it. */ #ifndef ORG_DESKTOPSPEC_CONFIGMANAGERADAPTOR_H #define ORG_DESKTOPSPEC_CONFIGMANAGERADAPTOR_H #include #include #include "./dtkcore/toolGenerate/qdbusxml2cpp/org.desktopspec.ConfigManager.h" QT_BEGIN_NAMESPACE class QByteArray; template class QList; template class QMap; class QString; class QStringList; class QVariant; QT_END_NAMESPACE /* * Adaptor class for interface org.desktopspec.ConfigManager */ class ConfigManagerAdaptor: public QDBusAbstractAdaptor { Q_OBJECT Q_CLASSINFO("D-Bus Interface", "org.desktopspec.ConfigManager") Q_CLASSINFO("D-Bus Introspection", "" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" "") public: ConfigManagerAdaptor(QObject *parent); virtual ~ConfigManagerAdaptor(); public: // PROPERTIES public Q_SLOTS: // METHODS QDBusObjectPath acquireManager(const QString &appid, const QString &name, const QString &subpath); void sync(const QString &path); void update(const QString &path); Q_SIGNALS: // SIGNALS }; #endif dtkcore-6.7.46/tools/000077500000000000000000000000001522615770400144225ustar00rootroot00000000000000dtkcore-6.7.46/tools/CMakeLists.txt000066400000000000000000000002521522615770400171610ustar00rootroot00000000000000add_subdirectory(dci) add_subdirectory(deepin-os-release) add_subdirectory(qdbusxml2cpp) add_subdirectory(settings) add_subdirectory(ch2py) add_subdirectory(dconfig2cpp) dtkcore-6.7.46/tools/ch2py/000077500000000000000000000000001522615770400154475ustar00rootroot00000000000000dtkcore-6.7.46/tools/ch2py/CMakeLists.txt000066400000000000000000000013561522615770400202140ustar00rootroot00000000000000set(TARGET_NAME ch2py) set(BIN_NAME ${TARGET_NAME}${DTK_NAME_SUFFIX}) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core) set(CMAKE_AUTORCC ON) add_executable(${BIN_NAME} ${PROJECT_SOURCE_DIR}/src/util/dpinyin.cpp ${PROJECT_SOURCE_DIR}/src/util/util.qrc main.cpp ) target_link_libraries(${BIN_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::Core ) target_include_directories(${BIN_NAME} PRIVATE $ $ $ ) set_target_properties(${BIN_NAME} PROPERTIES OUTPUT_NAME ${TARGET_NAME}) install(TARGETS ${BIN_NAME} DESTINATION "${TOOL_INSTALL_DIR}") dtkcore-6.7.46/tools/ch2py/main.cpp000066400000000000000000000045221522615770400171020ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include #include #include #include "dpinyin.h" DCORE_USE_NAMESPACE int main(int argc, char **argv) { QCoreApplication a(argc, argv); a.setOrganizationName("deepin"); a.setApplicationName("ch2py"); a.setApplicationVersion("0.0.1"); QCommandLineParser cp; cp.setApplicationDescription("ch2py tool is a command tool that convert Chinese words to Pinyin.\n" "The commands of DCI tools can be expressed as follows:\n" "\t ch2py [chinese words]\n" "\t ch2py --tonestyle notones [chinese words]\n" "\t ch2py --letters [chinese words]\n" ); QCommandLineOption tonestyle = QCommandLineOption(QStringList() << "s" << "tonestyle", "tone style value can be \"notones\",\"tones\",\"numtones\"", "tonestyle", "tones"); QCommandLineOption letters = QCommandLineOption(QStringList() << "l" << "letters", "convert Chinese words to Pinyin first letters"); cp.addOption(tonestyle); cp.addOption(letters); cp.addPositionalArgument("words", "words to be converted to pinyin"); cp.addHelpOption(); cp.process(a); QString words = cp.positionalArguments().join(" "); if (words.isEmpty()) { cp.showHelp(); } QString tones = cp.value("tonestyle"); ToneStyle ts = TS_Tone; if (!tones.compare("notones")) ts = TS_NoneTone; else if (!tones.compare("numtones")) ts = TS_ToneNum; QElapsedTimer timer; timer.start(); qint64 size = -1; if (cp.isSet(letters)) { const auto &ls = firstLetters(words); printf("%s\n", qPrintable(ls.join("\n"))); size = ls.size(); } else { const auto &py = pinyin(words, ts); printf("%s\n", qPrintable(py.join("\n"))); size = py.size(); } std:: cout << "Total size: " << size << ", time:" << timer.elapsed() << " ms" << std::endl; return 0; } dtkcore-6.7.46/tools/dci/000077500000000000000000000000001522615770400151615ustar00rootroot00000000000000dtkcore-6.7.46/tools/dci/CMakeLists.txt000066400000000000000000000017011522615770400177200ustar00rootroot00000000000000set(TARGET_NAME dci) set(BIN_NAME ${TARGET_NAME}${DTK_NAME_SUFFIX}) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core) if(${QT_VERSION_MAJOR} EQUAL 6) if(${Qt6Core_VERSION} VERSION_GREATER_EQUAL 6.10.0) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS CorePrivate) endif() endif() add_definitions(-DDTK_NO_PROJECT) # start dci include(../../src/dci/dci.cmake) add_executable(${BIN_NAME} ${dci_SRCS} main.cpp ) target_link_libraries(${BIN_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::CorePrivate ) target_include_directories(${BIN_NAME} PUBLIC ../../include/ ../../include/dci/ ../../include/DtkCore/ ../../include/base/ ../../include/global/ ) target_include_directories(${BIN_NAME} PRIVATE ../../src/ ) set_target_properties(${BIN_NAME} PROPERTIES OUTPUT_NAME ${TARGET_NAME}) #end dci install(TARGETS ${BIN_NAME} DESTINATION "${TOOL_INSTALL_DIR}") dtkcore-6.7.46/tools/dci/main.cpp000066400000000000000000000224561522615770400166220ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include #include #include #include #include #include #include #include "dci/ddcifile.h" static QString getSymLinkTarget(const QString &file, const QString &originPath) { char target[512] = {0}; const auto ret = readlink(file.toLocal8Bit().constData(), target, 511); if (ret <= 0) return QString(); QString tar = QByteArray(target, ret); QString path = originPath; if (originPath.endsWith('/')) path = path.left(path.length() - 1); if (tar.startsWith(path)) { tar = tar.remove(0, path.length()); } return tar; } static bool copyFilesToDci(DDciFile *dci, const QString &targetDir, const QString &sourceDir, const QString &originPath) { QDir dir(sourceDir); for (const auto &info : dir.entryInfoList(QDir::AllEntries | QDir::NoDotAndDotDot)) { const QString &newFile = QDir(targetDir).filePath(info.fileName()); if (info.isDir()) { if (!dci->mkdir(newFile)) return false; if (!copyFilesToDci(dci, newFile, info.absoluteFilePath(), originPath)) return false; } else if (info.isSymLink()) { if (!dci->link(getSymLinkTarget(info.absoluteFilePath(), originPath), newFile)) return false; } else if (info.isFile()) { QFile file(info.absoluteFilePath()); if (!file.open(QIODevice::ReadOnly)) return false; if (!dci->writeFile(newFile, file.readAll())) return false; } } return true; } QString cleanPath(const QString &path) { return path.size() < 2 || !path.endsWith(QDir::separator()) ? path : path.chopped(1); } bool createTo(const QString &sourceDir, const QString &targetDir) { QFileInfo info(cleanPath(sourceDir)); if (!info.isDir()) return false; const QString &iconName = info.fileName(); if (iconName.isEmpty()) { printf("The icon name is not correctly resolved in the source path: \"%s\".\n", qPrintable(sourceDir)); return false; } const auto newFile = QDir(targetDir).filePath(iconName + ".dci"); if (QFile::exists(newFile)) { printf("The path \"%s\" already exists.\n", qPrintable(newFile)); return false; } DDciFile dci; if (!copyFilesToDci(&dci, "/", sourceDir, sourceDir)) return false; return dci.writeToFile(newFile); } static bool copyFilesFromDci(const DDciFile *dci, const QString &targetDir, const QString &sourceDir, QMap &pathMap) { QDir target(targetDir); for (const QString &file : dci->list(sourceDir)) { const QString &newFileName = QFileInfo(file).fileName(); const QString &newFilePath = target.filePath(newFileName); pathMap.insert(file, newFilePath); const auto &type = dci->type(file); if (type == DDciFile::Directory) { if (!target.mkdir(newFileName)) return false; if (!copyFilesFromDci(dci, newFilePath, file, pathMap)) return false; } else if (type == DDciFile::File) { QFile newFile(newFilePath); if (!newFile.open(QIODevice::WriteOnly)) return false; const auto &data = dci->dataRef(file); if (newFile.write(data) != data.size()) return false; } else if (type == DDciFile::Symlink) { // link the real source later } else { return false; } } return true; } bool exportTo(const QString &dciFile, const QString &targetDir) { QFileInfo info(dciFile); if (!info.isFile() || info.suffix() != "dci") return false; const QString &newDir = QDir(targetDir).filePath(info.baseName()); if (QDir(newDir).exists()) return false; if (!QDir::current().mkdir(newDir)) return false; DDciFile dci(dciFile); if (!dci.isValid()) return false; QMap pathMap; if (!copyFilesFromDci(&dci, QDir(newDir).absolutePath(), "/", pathMap)) return false; // link to real source for (auto it = pathMap.begin(); it != pathMap.end(); it++) { if (dci.type(it.key()) == DDciFile::Symlink) { const QString &realSource = it.value(); const QDir &dirInDci(QFileInfo(it.key()).path()); const QDir &dirRealSrc(QFileInfo(realSource).path()); const QString &target = dci.symlinkTarget(it.key(), true); const QString &absoluteTarget = QDir::cleanPath(dirInDci.absoluteFilePath(target)); const QString &realTarget = pathMap.value(absoluteTarget); // link to relative path(e.g. xx.webp -> ../../normal.light/x/xx.webp) if (!QFile::link(dirRealSrc.relativeFilePath(realTarget), realSource)) { qErrnoWarning(strerror(errno)); return false; } } } return true; } #define SPACE_CHAR " " #define BEGINE_CHAR "├── " #define MIDDLE_CHAR "│ " #define END_CHAR "└── " #define ARROW_CHAR " -> " static inline QString pathName(const QString &path) { QDir dir(path); return dir.dirName().isEmpty() ? path : dir.dirName(); } void print(DDciFile &dci, const QString &dir = QString("/"), QString prefix = QString()) { const auto &fileList = dci.list(dir); QString dirName = pathName(dir); printf("%s\n", qPrintable(prefix + dirName)); prefix.replace(END_CHAR, SPACE_CHAR); prefix.replace(BEGINE_CHAR, MIDDLE_CHAR); for (const auto &file : fileList) { QString newPrefix = prefix; newPrefix.append(file == fileList.last() ? END_CHAR : BEGINE_CHAR); if (dci.type(file) == DDciFile::Directory) { print(dci, file, newPrefix); } else { QString fileName = pathName(file); QString symlinkTarget; if (dci.type(file) == DDciFile::Symlink) { symlinkTarget.append(ARROW_CHAR).append(dci.symlinkTarget(file)); } printf("%s\n", qPrintable(newPrefix + fileName + symlinkTarget)); } } } bool tree(const QString &dciFile) { QFileInfo info(dciFile); DDciFile dci(dciFile); if (!dci.isValid()) return false; print(dci, "/"); return true; } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); a.setOrganizationName("zccrs"); a.setApplicationName("dci"); a.setApplicationVersion("0.0.1"); QCommandLineParser commandParser; commandParser.setApplicationDescription("DCI tool is a command tool that automatically packs and unpacks DCI directories.\n" "If you have created an icon directory according to the correct DCI directory specification,\n" "you can easily make the DCI icons with this tool.\n" "The commands of DCI tools can be expressed as follows:\n" "\t dci --create [target file path] [source directory path]\n" "\t dci --export [target directory path] [source file path]\n" "\t dci --tree [target file path]\n" "For example, the tool is used in the following ways: \n" "\t dci --create ~/Desktop ~/Desktop/action_add\n" "\t dci --export ~/Desktop ~/Desktop/action_add.dci\n" "\t dci --tree ~/Desktop/action_add.dci\n"); auto options = QList { QCommandLineOption("create", "Create the new dci files by the directorys", "targetDirectiry"), QCommandLineOption("export", "Export the dci files to the directorys", "targetDirectory"), QCommandLineOption("tree", "tree view the dci file", "targetDciFile"), }; commandParser.addOptions(options); commandParser.addPositionalArgument("sources", "The directorys of create or the dci files of export", "[dir1 dir2...]/[file1 file2...]"); commandParser.addHelpOption(); commandParser.addVersionOption(); commandParser.process(a); if (commandParser.isSet(options.at(0))) { for (const QString &dir : commandParser.positionalArguments()) { if (!createTo(dir, commandParser.value(options.at(0)))) { printf("Failed on create dci file for \"%s\"\n", qPrintable(dir)); } } } else if (commandParser.isSet(options.at(1))) { for (const QString &dci : commandParser.positionalArguments()) { if (!exportTo(dci, commandParser.value(options.at(1)))) { printf("Failed on export the \"%s\" dci file\n", qPrintable(dci)); } } } else if (commandParser.isSet(options.at(2))) { const QString &dci = commandParser.value(options.at(2)); if (!tree(dci)) { printf("Failed on view the \"%s\" dci file\n", qPrintable(dci)); } } else { commandParser.showHelp(-1); } return 0; } dtkcore-6.7.46/tools/dconfig2cpp/000077500000000000000000000000001522615770400166205ustar00rootroot00000000000000dtkcore-6.7.46/tools/dconfig2cpp/CMakeLists.txt000066400000000000000000000010001522615770400213470ustar00rootroot00000000000000set(TARGET_NAME dconfig2cpp) set(BIN_NAME ${TARGET_NAME}${DTK_NAME_SUFFIX}) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core) add_executable(${BIN_NAME} main.cpp ) target_link_libraries( ${BIN_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::Core ) set_target_properties( ${BIN_NAME} PROPERTIES OUTPUT_NAME ${TARGET_NAME} EXPORT_NAME DConfig2Cpp ) install( TARGETS ${BIN_NAME} EXPORT Dtk${DTK_NAME_SUFFIX}ToolsTargets DESTINATION ${TOOL_INSTALL_DIR} ) dtkcore-6.7.46/tools/dconfig2cpp/main.cpp000066400000000000000000001041111522615770400202460ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2024-2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include #include #include #include #include #include #include #include struct Version { quint16 major; quint16 minor; }; static constexpr Version ToolVersion{1, 1}; static QString toUnicodeEscape(const QString& input) { QString result; for (QChar ch : input) { result += QString("\\u%1").arg(static_cast(ch.unicode()), 4, 16, QChar('0')); } return result; } // Check if the original JSON value is in floating-point format static bool isOriginalValueFloat(const QByteArray& jsonData, const QString& propertyName, const QJsonValue& value) { if (!value.isDouble()) { return false; } // Build search pattern to find the number in "propertyName": { "value": number } QString searchPattern = QString("\"%1\"\\s*:\\s*\\{[^}]*\"value\"\\s*:\\s*([0-9.eE+-]+)").arg(propertyName); QRegularExpression regex(searchPattern); QString jsonString = QString::fromUtf8(jsonData); QRegularExpressionMatch match = regex.match(jsonString); if (match.hasMatch()) { QString numberStr = match.captured(1); // If contains decimal point or scientific notation, it's a floating-point number return numberStr.contains('.') || numberStr.contains('e', Qt::CaseInsensitive); } return false; } // Converts a QJsonValue to a corresponding C++ code representation static QString jsonValueToCppCode(const QJsonValue &value){ if (value.isBool()) { return value.toBool() ? QLatin1String("true") : QLatin1String("false"); } else if (value.isDouble()) { const auto variantValue = value.toVariant(); if (variantValue.userType() == QVariant(static_cast(1)).userType()) { return QString::number(value.toInt()); } else if (variantValue.userType() == QVariant(static_cast(1)).userType()) { return QString::number(variantValue.toLongLong()); } return QString::number(value.toDouble()); } else if (value.isString()) { const auto string = value.toString(); if (string.isEmpty()) { return QLatin1String("QLatin1String(\"\")"); } return QString("QStringLiteral(u\"%1\")").arg(toUnicodeEscape(string)); } else if (value.isNull()) { return "QVariant::fromValue(nullptr)"; } else if (value.isArray()) { QStringList elements; const auto array = value.toArray(); for (const QJsonValue &element : array) { elements << "QVariant(" + jsonValueToCppCode(element) + ")"; } return "QList{" + elements.join(", ") + "}"; } else if (value.isObject()) { QStringList elements; QJsonObject obj = value.toObject(); for (auto it = obj.begin(); it != obj.end(); ++it) { elements << QString("{QStringLiteral(u\"%1\"), QVariant(%2)}") .arg(toUnicodeEscape(it.key()), jsonValueToCppCode(it.value())); } return "QVariantMap{" + elements.join(", ") + "}"; } else { return "QVariant()"; } } int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); app.setApplicationVersion(QString("%1.%2").arg(ToolVersion.major).arg(ToolVersion.minor)); QCommandLineParser parser; parser.setApplicationDescription(QLatin1String("DConfig to C++ class generator")); parser.addHelpOption(); parser.addVersionOption(); // Define command line options QCommandLineOption classNameOption(QStringList() << QLatin1String("c") << QLatin1String("class-name"), QLatin1String("Name of the generated class"), QLatin1String("className")); parser.addOption(classNameOption); QCommandLineOption sourceFileOption(QStringList() << QLatin1String("o") << QLatin1String("output"), QLatin1String("Path to the output source(header only) file"), QLatin1String("sourceFile")); parser.addOption(sourceFileOption); QCommandLineOption forceRequestThread(QStringList() << QLatin1String("force-request-thread"), QLatin1String("Force request thread to create DConfig instance")); parser.addOption(forceRequestThread); QCommandLineOption noComment(QStringList() << QLatin1String("no-comment"), QLatin1String("Do not generate comments in the generated code")); parser.addOption(noComment); parser.addPositionalArgument(QLatin1String("json-file"), QLatin1String("Path to the input JSON file")); parser.process(app); const QStringList args = parser.positionalArguments(); if (args.size() != 1) { parser.showHelp(-1); } QString className = parser.value(classNameOption); const QString jsonFileName = QFileInfo(args.first()).completeBaseName(); if (className.isEmpty()) { className = QLatin1String("dconfig_") + QString(jsonFileName).replace('.', '_'); } QString sourceFilePath = parser.value(sourceFileOption); if (sourceFilePath.isEmpty()) { sourceFilePath = className.toLower() + QLatin1String(".hpp"); } QFile file(args.first()); if (!file.open(QIODevice::ReadOnly)) { qWarning() << QLatin1String("Failed to open file:") << args.first(); return -1; } QByteArray data = file.readAll(); QJsonDocument doc = QJsonDocument::fromJson(data); QJsonObject root = doc.object(); // Check magic value if (root[QLatin1String("magic")].toString() != QLatin1String("dsg.config.meta")) { qWarning() << QLatin1String("Invalid magic value in JSON file"); return -1; } // Generate header and source files QFile headerFile(sourceFilePath); if (!headerFile.open(QIODevice::WriteOnly | QIODevice::Text)) { qWarning() << QLatin1String("Failed to open file for writing:") << sourceFilePath; return -1; } QTextStream headerStream(&headerFile); // Extract version and add it as a comment in the generated code QString version = root[QLatin1String("version")].toString(); // Parse version to get major QString fileMajorVersion; const auto versionParts = version.split('.'); if (versionParts.size() == 2) { fileMajorVersion = versionParts[0]; } if (fileMajorVersion != "1") { qWarning() << QLatin1String("Warning: The JSON file version isn't supported."); return -1; } // Generate header and source file comments QString commandLineArgs = QCoreApplication::arguments().join(QLatin1String(" ")); QString generationTime = QDateTime::currentDateTime().toString(Qt::ISODate); if (!parser.isSet(noComment)) { QString headerComment = QString( "/**\n" " * This file is generated by dconfig2cpp.\n" " * Command line arguments: %1\n" " * Generation time: %2\n" " * JSON file version: %3\n" " * Tool version: %4\n" " *\n" " * WARNING: DO NOT MODIFY THIS FILE MANUALLY.\n" " * If you need to change the content, please modify the dconfig2cpp tool.\n" " */\n\n" ).arg(commandLineArgs, generationTime, version, QString("%1.%2").arg(ToolVersion.major).arg(ToolVersion.minor)); headerStream << headerComment; } QJsonObject contents = root[QLatin1String("contents")].toObject(); // First pass: collect all property names for macro definitions QStringList allPropertyNames; for (auto it = contents.begin(); it != contents.end(); ++it) { allPropertyNames << it.key(); } // Write header file content headerStream << "#ifndef " << className.toUpper() << "_H\n"; headerStream << "#define " << className.toUpper() << "_H\n\n"; // Add version macros headerStream << "#define " << className.toUpper() << "_DCONFIG_FILE_VERSION_MAJOR " << ToolVersion.major << "\n"; headerStream << "#define " << className.toUpper() << "_DCONFIG_FILE_VERSION_MINOR " << ToolVersion.minor << "\n"; // Add property macros for (const QString &propName : allPropertyNames) { headerStream << "#define " << className.toUpper() << "_DCONFIG_FILE_" << propName << "\n"; } headerStream << "\n"; headerStream << "#include \n"; headerStream << "#include \n"; headerStream << "#include \n"; headerStream << "#include \n"; headerStream << "#include \n"; headerStream << "#include \n"; headerStream << "#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)\n" << "#include \n" << "#endif\n"; headerStream << "#include \n"; headerStream << "#include \n"; headerStream << "#include \n\n"; headerStream << "class " << className << " : public QObject {\n"; headerStream << " Q_OBJECT\n\n"; struct Property { QString typeName; QString propertyName; QString capitalizedPropertyName; QString propertyNameString; QJsonValue defaultValue; }; QList properties; QStringList propertyNames; QStringList propertyNameStrings; static QStringList usedKeywords = { className, "create", "createByName", "config", "keyList", "isInitializeSucceed", "isInitializeSucceeded", "isInitializeFailed", "isInitializing", "isDefaultValue", "m_config", "m_status", "m_data", }; for (int i = 0; i <= (contents.size()) / 32; ++i) { usedKeywords << QLatin1String("m_propertySetStatus") + QString::number(i); } // Iterate over JSON contents to extract properties for (auto it = contents.begin(); it != contents.end(); ++it) { QJsonObject obj = it.value().toObject(); QString propertyName = it.key(); QString typeName; const auto value = obj[QLatin1String("value")]; if (value.isBool()) { typeName = "bool"; } else if (value.isArray()) { typeName = "QList"; } else if (value.isObject()) { typeName = "QVariantMap"; } else if (value.isDouble()) { // QJson treats all numbers in JSON as double. Although converting QJsonValue to // QVariant can distinguish between double and int, Qt's JSON parsing attempts to // convert floating-point numbers with decimal parts of 0, such as 1.0, to integers, // resulting in the generated property type being qlonglong. However, dconfig expects // floating-point numbers, so we try to identify whether it is a floating-point number // or an integer by matching strings. if (isOriginalValueFloat(data, propertyName, value)) { typeName = "double"; } else { typeName = "qlonglong"; } } else if (value.isString()) { typeName = "QString"; } else { typeName = "QVariant"; } QString capitalizedPropertyName = propertyName; if (!capitalizedPropertyName.isEmpty() && capitalizedPropertyName[0].isLower()) { capitalizedPropertyName[0] = capitalizedPropertyName[0].toUpper(); } propertyNames << propertyName; properties.append(Property({ typeName, propertyName, capitalizedPropertyName, "QStringLiteral(\"" + propertyName + "\")", obj[QLatin1String("value")] })); propertyNameStrings << properties.last().propertyNameString; const QString readFunction = usedKeywords.contains(propertyName) ? QLatin1String(" READ get") + capitalizedPropertyName : QLatin1String(" READ ") + propertyName; headerStream << " Q_PROPERTY(" << typeName << " " << propertyName << readFunction << " WRITE set" << capitalizedPropertyName << " NOTIFY " << propertyName << "Changed" << " RESET reset" << capitalizedPropertyName << ")\n"; } headerStream << " Q_CLASSINFO(\"DConfigKeyList\", \"" << propertyNames.join(";") <<"\")\n" << " Q_CLASSINFO(\"DConfigFileName\", \"" << QString(jsonFileName).replace("\n", "\\n").replace("\r", "\\r") <<"\")\n" << " Q_CLASSINFO(\"DConfigFileVersion\", \"" << version <<"\")\n\n" << "public:\n" << " explicit " << className << R"((QThread *thread, DTK_CORE_NAMESPACE::DConfigBackend *backend, const QString &name, const QString &appId, const QString &subpath, bool isGeneric, QObject *parent) : QObject(parent), m_data(new Data) { m_data->m_userConfig = this; m_data->moveToThread(this->thread()); if (!thread->isRunning()) { qWarning() << QLatin1String("Warning: The provided thread is not running."); } Q_ASSERT(QThread::currentThread() != thread); auto worker = new QObject(); worker->moveToThread(thread); QPointer safeData(m_data); QMetaObject::invokeMethod(worker, [safeData, backend, name, appId, subpath, isGeneric, worker]() mutable { delete worker; worker = nullptr; if (!safeData->m_status.testAndSetOrdered(static_cast(Data::Status::Invalid), static_cast(Data::Status::Initializing))) { // CAS failed: status changed (e.g., set to Destroyed by destructor) // Schedule deletion of Data object via deleteLater to avoid direct delete in Config thread safeData->deleteLater(); return; } DTK_CORE_NAMESPACE::DConfig *config = nullptr; if (isGeneric) { if (backend) { config = DTK_CORE_NAMESPACE::DConfig::createGeneric(backend, name, subpath, nullptr); } else { config = DTK_CORE_NAMESPACE::DConfig::createGeneric(name, subpath, nullptr); } } else { if (backend) { if (appId.isNull()) { config = DTK_CORE_NAMESPACE::DConfig::create(backend, DTK_CORE_NAMESPACE::DSGApplication::id(), name, subpath, nullptr); } else { config = DTK_CORE_NAMESPACE::DConfig::create(backend, appId, name, subpath, nullptr); } } else { if (appId.isNull()) { config = DTK_CORE_NAMESPACE::DConfig::create(DTK_CORE_NAMESPACE::DSGApplication::id(), name, subpath, nullptr); } else { config = DTK_CORE_NAMESPACE::DConfig::create(appId, name, subpath, nullptr); } } } if (!config || !config->isValid()) { qWarning() << QLatin1String("Failed to create DConfig instance."); QMetaObject::invokeMethod(safeData, [safeData]() { if (safeData->m_status.testAndSetOrdered(static_cast(Data::Status::Initializing), static_cast(Data::Status::Failed))) { Q_EMIT safeData->m_userConfig->configInitializeFailed(); } else { // CAS failed, destroy data object delete safeData; } }, Qt::QueuedConnection); if (config) delete config; return; } config->moveToThread(QThread::currentThread()); // Initialize through Data class safeData->initializeInConfigThread(config); // Queue state transition to main thread, to ensure config values are fully initialized. QMetaObject::invokeMethod(safeData, [safeData, config]() { // Try to transition from Initializing to Succeeded if (safeData->m_status.testAndSetOrdered(static_cast(Data::Status::Initializing), static_cast(Data::Status::Succeeded))) { // CAS succeeded: connect config destroyed signal to cleanup Data, then emit success signal to main thread QObject::connect(config, &QObject::destroyed, safeData, &QObject::deleteLater); if (safeData->m_userConfig) { Q_EMIT safeData->m_userConfig->configInitializeSucceed(config); } } else { // CAS failed - state changed (e.g., set to Destroyed) // We must clean up the config we just created config->deleteLater(); safeData->deleteLater(); } }, Qt::QueuedConnection); }); } )"; const QString jsonFileString = "QStringLiteral(u\"" + toUnicodeEscape(jsonFileName) + "\")"; // Generate constructors if (parser.isSet(forceRequestThread)) headerStream << " static " << className << "* create(QThread *thread, const QString &appId = {}, const QString &subpath = {}, QObject *parent = nullptr)\n"; else headerStream << " static " << className << "* create(const QString &appId = {}, const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread())\n"; headerStream << " { return new " << className << "(thread, nullptr, " << jsonFileString << ", appId, subpath, false, parent); }\n"; if (parser.isSet(forceRequestThread)) headerStream << " static " << className << "* create(QThread *thread, DTK_CORE_NAMESPACE::DConfigBackend *backend, const QString &appId = {}, const QString &subpath = {}, QObject *parent = nullptr)\n"; else headerStream << " static " << className << "* create(DTK_CORE_NAMESPACE::DConfigBackend *backend, const QString &appId = {}, const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread())\n"; headerStream << " { return new " << className << "(thread, backend, " << jsonFileString << ", appId, subpath, false, parent); }\n"; if (parser.isSet(forceRequestThread)) headerStream << " static " << className << "* createByName(QThread *thread, const QString &name, const QString &appId = {}, const QString &subpath = {}, QObject *parent = nullptr)\n"; else headerStream << " static " << className << "* createByName(const QString &name, const QString &appId = {}, const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread())\n"; headerStream << " { return new " << className << "(thread, nullptr, name, appId, subpath, false, parent); }\n"; if (parser.isSet(forceRequestThread)) headerStream << " static " << className << "* createByName(QThread *thread, DTK_CORE_NAMESPACE::DConfigBackend *backend, const QString &name, const QString &appId = {}, const QString &subpath = {}, QObject *parent = nullptr)\n"; else headerStream << " static " << className << "* createByName(DTK_CORE_NAMESPACE::DConfigBackend *backend, const QString &name, const QString &appId = {}, const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread())\n"; headerStream << " { return new " << className << "(thread, backend, name, appId, subpath, false, parent); }\n"; if (parser.isSet(forceRequestThread)) headerStream << " static " << className << "* createGeneric(QThread *thread, const QString &subpath = {}, QObject *parent = nullptr)\n"; else headerStream << " static " << className << "* createGeneric(const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread())\n"; headerStream << " { return new " << className << "(thread, nullptr, " << jsonFileString << ", {}, subpath, true, parent); }\n"; if (parser.isSet(forceRequestThread)) headerStream << " static " << className << "* create(QThread *thread, DTK_CORE_NAMESPACE::DConfigBackend *backend, const QString &subpath = {}, QObject *parent = nullptr)\n"; else headerStream << " static " << className << "* create(DTK_CORE_NAMESPACE::DConfigBackend *backend, const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread())\n"; headerStream << " { return new " << className << "(thread, backend, " << jsonFileString << ", {}, subpath, true, parent); }\n"; if (parser.isSet(forceRequestThread)) headerStream << " static " << className << "* createGenericByName(QThread *thread, const QString &name, const QString &subpath = {}, QObject *parent = nullptr)\n"; else headerStream << " static " << className << "* createGenericByName(const QString &name, const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread())\n"; headerStream << " { return new " << className << "(thread, nullptr, name, {}, subpath, true, parent); }\n"; if (parser.isSet(forceRequestThread)) headerStream << " static " << className << "* createGenericByName(QThread *thread, DTK_CORE_NAMESPACE::DConfigBackend *backend, const QString &name, const QString &subpath = {}, QObject *parent = nullptr)\n"; else headerStream << " static " << className << "* createGenericByName(DTK_CORE_NAMESPACE::DConfigBackend *backend, const QString &name, const QString &subpath = {}, QObject *parent = nullptr, QThread *thread = DTK_CORE_NAMESPACE::DConfig::globalThread())\n"; headerStream << " { return new " << className << "(thread, backend, name, {}, subpath, true, parent); }\n"; // Destructor headerStream << " ~" << className << R"(() { m_data->m_userConfig = nullptr; int oldStatus = m_data->m_status.fetchAndStoreOrdered(static_cast(Data::Status::Destroyed)); if (oldStatus == static_cast(Data::Status::Succeeded)) { // When Succeeded, release config object only auto config = m_data->m_config.loadRelaxed(); Q_ASSERT(config); config->deleteLater(); // m_data will be deleted by config's destroyed signal } else if (oldStatus == static_cast(Data::Status::Failed)) { // When Failed state, schedule cleanup of Data object m_data->deleteLater(); } } Q_INVOKABLE DTK_CORE_NAMESPACE::DConfig *config() const { return m_data->m_config.loadRelaxed(); } // Deprecated: Use isInitializeSucceeded() instead Q_INVOKABLE Q_DECL_DEPRECATED_X("Use isInitializeSucceeded() instead") bool isInitializeSucceed() const { return isInitializeSucceeded(); } Q_INVOKABLE bool isInitializeSucceeded() const { return m_data->m_status.loadRelaxed() == static_cast(Data::Status::Succeeded); } Q_INVOKABLE bool isInitializeFailed() const { return m_data->m_status.loadRelaxed() == static_cast(Data::Status::Failed); } Q_INVOKABLE bool isInitializing() const { return m_data->m_status.loadRelaxed() == static_cast(Data::Status::Initializing); } )"; headerStream << " Q_INVOKABLE QStringList keyList() const {\n" << " return { " << propertyNameStrings.join(",\n ") << "};\n" << " }\n\n"; headerStream << " Q_INVOKABLE bool isDefaultValue(const QString &key) const {\n"; for (int i = 0; i < properties.size(); ++i) { headerStream << " if (key == " << properties.at(i).propertyNameString << ")\n" << " return " << properties.at(i).propertyName << "IsDefaultValue();\n"; } headerStream << " return false;\n" << " }\n\n"; // Generate property getter and setter methods for (int i = 0; i < properties.size(); ++i) { const Property &property = properties[i]; const QString readFunction = usedKeywords.contains(property.propertyName) ? "get" + property.capitalizedPropertyName : property.propertyName; assert(!usedKeywords.contains(readFunction)); headerStream << " " << property.typeName << " " << readFunction << "() const {\n" << " return m_data->p_" << property.propertyName << ";\n }\n"; headerStream << " void set" << property.capitalizedPropertyName << "(const " << property.typeName << " &value) {\n" << " auto oldValue = m_data->p_" << property.propertyName << ";\n" << " m_data->p_" << property.propertyName << " = value;\n" << " m_data->markPropertySet(" << i << ");\n" << " if (auto config = m_data->m_config.loadRelaxed()) {\n" << " QMetaObject::invokeMethod(config, [config, value]() {\n" << " config->setValue(" << property.propertyNameString << ", value);\n" << " });\n" << " }\n" << " if (m_data->p_" << property.propertyName << " != oldValue) {\n" << " Q_EMIT " << property.propertyName << "Changed();\n" << " Q_EMIT valueChanged(" << property.propertyNameString << ", value);\n" << " }\n" << " }\n" << " void reset" << property.capitalizedPropertyName << "() {\n" << " if (auto config = m_data->m_config.loadRelaxed()) {\n" << " QMetaObject::invokeMethod(config, [config]() {\n" << " config->reset(" << property.propertyNameString << ");\n" << " });\n" << " }\n" << " }\n"; headerStream << "#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)\n"; headerStream << " QBindable<" << property.typeName << "> bindable" << property.capitalizedPropertyName << "() {\n" << " return QBindable<" << property.typeName << ">(this, \"" << property.propertyName << "\");\n" << " }\n"; headerStream << "#endif\n"; headerStream << " Q_INVOKABLE bool " << property.propertyName << "IsDefaultValue() const {\n" << " return !m_data->testPropertySet(" << i << ");\n" << " }\n"; } headerStream << "protected:\n" << " bool event(QEvent *e) override {\n" << " if (e->type() == QEvent::ThreadChange) {\n" << " Q_ASSERT(this->thread() == m_data->thread());\n" << " }\n" << " return QObject::event(e);\n" << " }\n" << "Q_SIGNALS:\n" << " void configInitializeFailed();\n" << " void configInitializeSucceed(DTK_CORE_NAMESPACE::DConfig *config);\n" << " void valueChanged(const QString &key, const QVariant &value);\n"; for (const auto &p : properties) headerStream << " void " << p.propertyName << "Changed();\n"; headerStream << "\nprivate:\n" << " // Prevent external moveToThread calls\n" << " using QObject::moveToThread;\n" << " class Data : public QObject {\n" << " public:\n" << " enum class Status {\n" << " Invalid = 0,\n" << " Initializing = 1,\n" << " Succeeded = 2,\n" << " Failed = 3,\n" << " Destroyed = 4\n" << " };\n" << "\n" << " explicit Data()\n" << " : QObject(nullptr) {}\n" << "\n" << " inline void initializeInConfigThread(DTK_CORE_NAMESPACE::DConfig *config) {\n" << " Q_ASSERT(!m_config.loadRelaxed());\n" << " m_config.storeRelaxed(config);\n"; for (int i = 0; i < properties.size(); ++i) { const Property &property = properties[i]; headerStream << " if (testPropertySet(" << i << ")) {\n"; headerStream << " config->setValue(" << property.propertyNameString << ", QVariant::fromValue(p_" << property.propertyName << "));\n"; headerStream << " } else {\n"; headerStream << " updateValue(" << property.propertyNameString << ", QVariant::fromValue(p_" << property.propertyName << "));\n"; headerStream << " }\n"; } headerStream << " connect(config, &DTK_CORE_NAMESPACE::DConfig::valueChanged, this, [this](const QString &key) {\n" << " updateValue(key);\n" << " }, Qt::DirectConnection);\n" << R"( } inline void updateValue(const QString &key, const QVariant &fallback = QVariant()) { if (!m_config.loadRelaxed()) return; Q_ASSERT(QThread::currentThread() == m_config.loadRelaxed()->thread()); const QVariant &value = m_config.loadRelaxed()->value(key, fallback); )"; for (int i = 0; i < properties.size(); ++i) { const Property &property = properties.at(i); headerStream << " if (key == " << property.propertyNameString << ") {\n"; headerStream << " markPropertySet(" << i << ", !m_config.loadRelaxed()->isDefaultValue(key));\n"; headerStream << " auto newValue = qvariant_cast<" << property.typeName << ">(value);\n" << " QMetaObject::invokeMethod(this, [this, newValue, key, value]() {\n" << " if (m_userConfig && p_" << property.propertyName << " != newValue) {\n" << " Q_ASSERT(QThread::currentThread() == m_userConfig->thread());\n" << " p_" << property.propertyName << " = newValue;\n" << " Q_EMIT m_userConfig->" << property.propertyName << "Changed();\n" << " Q_EMIT m_userConfig->valueChanged(key, value);\n" << " }\n" << " });\n" << " return;\n" << " }\n"; } headerStream << " }\n"; // Mark property as set headerStream << " inline void markPropertySet(const int index, bool on = true) {\n"; for (int i = 0; i <= (properties.size()) / 32; ++i) { headerStream << " if (index < " << (i + 1) * 32 << ") {\n" << " if (on)\n" << " m_propertySetStatus" << QString::number(i) << ".fetchAndOrOrdered(1 << (index - " << i * 32 << "));\n" << " else\n" << " m_propertySetStatus" << QString::number(i) << ".fetchAndAndOrdered(~(1 << (index - " << i * 32 << ")));\n" << " return;\n" << " }\n"; } headerStream << " Q_UNREACHABLE();\n }\n"; // Test if property is set headerStream << " inline bool testPropertySet(const int index) const {\n"; for (int i = 0; i <= (properties.size()) / 32; ++i) { headerStream << " if (index < " << (i + 1) * 32 << ") {\n" << " return (m_propertySetStatus" << QString::number(i) << ".loadRelaxed() & (1 << (index - " << i * 32 << ")));\n" << " }\n"; } headerStream << " Q_UNREACHABLE();\n" << " }\n"; headerStream << " // Member variables\n" << " QAtomicPointer m_config = nullptr;\n" << " QAtomicInteger m_status = static_cast(Status::Invalid);\n" << " QPointer<" << className << "> m_userConfig = nullptr;\n"; for (int i = 0; i <= (properties.size()) / 32; ++i) { headerStream << " QAtomicInteger m_propertySetStatus" << i << " = 0;\n"; } headerStream << "\n // Property storage\n"; for (const Property &property : properties) { if (property.typeName == QLatin1String("QString")) { headerStream << " // Default value: \"" << property.defaultValue.toString().replace("\n", "\\n").replace("\r", "\\r") << "\"\n"; } headerStream << " " << property.typeName << " p_" << property.propertyName << " { " << jsonValueToCppCode(property.defaultValue) << " };\n"; } headerStream << " };\n\n" << " QPointer m_data;\n" << "};\n\n" << "#endif // " << className.toUpper() << "_H\n"; return 0; } dtkcore-6.7.46/tools/deepin-os-release/000077500000000000000000000000001522615770400177235ustar00rootroot00000000000000dtkcore-6.7.46/tools/deepin-os-release/CMakeLists.txt000066400000000000000000000025171522615770400224700ustar00rootroot00000000000000set(TARGET_NAME deepin-os-release) set(BIN_NAME ${TARGET_NAME}${DTK_NAME_SUFFIX}) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(CMAKE_AUTOMOC ON) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core) if(${QT_VERSION_MAJOR} EQUAL 6) if(${Qt6Core_VERSION} VERSION_GREATER_EQUAL 6.10.0) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS CorePrivate) endif() endif() add_definitions(-DDTK_NO_PROJECT) # start dci set(dci_SRCS ../../include/global/dsysinfo.h ../../include/global/ddesktopentry.h ../../src/dsysinfo.cpp ../../src/ddesktopentry.cpp ) add_executable(${BIN_NAME} ${dci_SRCS} main.cpp ) target_compile_definitions(${BIN_NAME} PUBLIC DSYSINFO_PREFIX="${DSYSINFO_PREFIX}") target_link_libraries(${BIN_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::CorePrivate ) target_include_directories(${BIN_NAME} PUBLIC $ $ $ $ $ $ ) set_target_properties(${BIN_NAME} PROPERTIES OUTPUT_NAME ${TARGET_NAME}) install(TARGETS ${BIN_NAME} DESTINATION "${TOOL_INSTALL_DIR}") #end dci dtkcore-6.7.46/tools/deepin-os-release/main.cpp000066400000000000000000000145251522615770400213620ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dsysinfo.h" #include #include #include #include #include #include DCORE_USE_NAMESPACE bool distributionInfoValid() { return QFile::exists(DSysInfo::distributionInfoPath()); } void printDistributionOrgInfo(DSysInfo::OrgType type) { QString sectionName = DSysInfo::distributionInfoSectionName(type); printf("%s Name: %s\n", qPrintable(sectionName), qPrintable(DSysInfo::distributionOrgName(type))); printf("%s Logo (Normal size): %s\n", qPrintable(sectionName), qPrintable(DSysInfo::distributionOrgLogo(type))); printf("%s Website: %s\n", qPrintable(sectionName), qPrintable(DSysInfo::distributionOrgWebsite(type).second)); } int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); Q_UNUSED(app) QCommandLineParser parser; QCommandLineOption option_all("all", "Print All Information"); QCommandLineOption option_deepin_type("deepin-type", " "); QCommandLineOption option_deepin_version("deepin-version", " "); QCommandLineOption option_deepin_edition("deepin-edition", " "); QCommandLineOption option_deepin_copyright("deepin-copyright", " "); QCommandLineOption option_product_type("product-type", " "); QCommandLineOption option_product_version("product-version", " "); QCommandLineOption option_computer_name("computer-name", "Computer Name"); QCommandLineOption option_cpu_model("cpu-model", "CPU Model"); QCommandLineOption option_installed_memory_size("installed-memory-size", "Installed Memory Size (GiB)"); QCommandLineOption option_memory_size("memory-size", "Memory Size (GiB)"); QCommandLineOption option_disk_size("disk-size", "Disk Size (GiB)"); QCommandLineOption option_distribution_info("distribution-info", "Distribution information"); QCommandLineOption option_distributer_info("distributer-info", "Distributer information"); parser.addOptions({option_all, option_deepin_type, option_deepin_version, option_deepin_edition, option_deepin_copyright, option_product_type, option_product_version, option_computer_name, option_cpu_model, option_installed_memory_size, option_memory_size, option_disk_size, option_distribution_info, option_distributer_info}); parser.addHelpOption(); parser.addVersionOption(); parser.process(app); if (argc < 2) parser.showHelp(); if (parser.isSet(option_all)) { printf("Computer Name: %s\n", qPrintable(DSysInfo::computerName())); printf("CPU Model: %s x %d\n", qPrintable(DSysInfo::cpuModelName()), QThread::idealThreadCount()); printf("Installed Memory Size: %f GiB\n", DSysInfo::memoryInstalledSize() / 1024.0 / 1024 / 1024); printf("Memory Size: %f GiB\n", DSysInfo::memoryTotalSize() / 1024.0 / 1024 / 1024); printf("Disk Size: %f GiB\n", DSysInfo::systemDiskSize() / 1024.0 / 1024 / 1024); if (DSysInfo::isDeepin() && DSysInfo::isDDE()) { printf("Deepin Type: %s\n", qPrintable(DSysInfo::deepinTypeDisplayName())); printf("Deepin Version: %s\n", qPrintable(DSysInfo::deepinVersion())); if (!DSysInfo::deepinEdition().isEmpty()) printf("Deepin Edition: %s\n", qPrintable(DSysInfo::deepinEdition())); if (!DSysInfo::deepinCopyright().isEmpty()) printf("Deepin Copyright: %s\n", qPrintable(DSysInfo::deepinCopyright())); } printf("Operating System Name: %s\n", qPrintable(DSysInfo::operatingSystemName())); printf("Product Type: %s\n", qPrintable(DSysInfo::productTypeString())); printf("Product Version: %s\n", qPrintable(DSysInfo::productVersion())); if (DSysInfo::isDeepin()) { printf("Uos Product Name: %s\n", qPrintable(DSysInfo::uosProductTypeName())); printf("Uos SystemName Name: %s\n", qPrintable(DSysInfo::uosSystemName())); printf("Uos Edition Name: %s\n", qPrintable(DSysInfo::uosEditionName())); printf("Uos SP Version: %s\n", qPrintable(DSysInfo::spVersion())); printf("Uos update Version: %s\n", qPrintable(DSysInfo::udpateVersion())); printf("Uos major Version: %s\n", qPrintable(DSysInfo::majorVersion())); printf("Uos minor Version: %s\n", qPrintable(DSysInfo::minorVersion())); printf("Uos build Version: %s\n", qPrintable(DSysInfo::buildVersion())); } if (distributionInfoValid()) { printDistributionOrgInfo(DSysInfo::Distribution); printDistributionOrgInfo(DSysInfo::Distributor); } } else { if (parser.isSet(option_deepin_type)) printf("%s", qPrintable(DSysInfo::uosEditionName(QLocale::c()))); else if (parser.isSet(option_deepin_version)) printf("%s", qPrintable(DSysInfo::majorVersion())); else if (parser.isSet(option_deepin_edition)) printf("%s", qPrintable(DSysInfo::deepinEdition())); else if (parser.isSet(option_deepin_copyright)) printf("%s", qPrintable(DSysInfo::deepinCopyright())); else if (parser.isSet(option_product_type)) printf("%s", qPrintable(DSysInfo::productTypeString())); else if (parser.isSet(option_product_version)) printf("%s", qPrintable(DSysInfo::productVersion())); else if (parser.isSet(option_cpu_model)) printf("%s x %d", qPrintable(DSysInfo::cpuModelName()), QThread::idealThreadCount()); else if (parser.isSet(option_computer_name)) printf("%s", qPrintable(DSysInfo::computerName())); else if (parser.isSet(option_installed_memory_size)) printf("%f", DSysInfo::memoryInstalledSize() / 1024.0 / 1024 / 1024); else if (parser.isSet(option_memory_size)) printf("%f", DSysInfo::memoryTotalSize() / 1024.0 / 1024 / 1024); else if (parser.isSet(option_disk_size)) printf("%f", DSysInfo::systemDiskSize() / 1024.0 / 1024 / 1024); else if (parser.isSet(option_distribution_info)) { printDistributionOrgInfo(DSysInfo::Distribution); } else if (parser.isSet(option_distributer_info)) { printDistributionOrgInfo(DSysInfo::Distributor); } } return 0; } dtkcore-6.7.46/tools/qdbusxml2cpp/000077500000000000000000000000001522615770400170465ustar00rootroot00000000000000dtkcore-6.7.46/tools/qdbusxml2cpp/CMakeLists.txt000066400000000000000000000020241522615770400216040ustar00rootroot00000000000000set(TARGET_NAME qdbusxml2cpp-fix) set(BIN_NAME ${TARGET_NAME}${DTK_NAME_SUFFIX}) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS DBus) if(${QT_VERSION_MAJOR} EQUAL 6) if (${Qt6DBus_VERSION} VERSION_GREATER_EQUAL 6.10.0) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS DBusPrivate) endif() endif() add_executable(${BIN_NAME} qdbusxml2cpp.cpp ) target_link_libraries( ${BIN_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::DBus Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::DBusPrivate ) set_target_properties( ${BIN_NAME} PROPERTIES OUTPUT_NAME ${TARGET_NAME} EXPORT_NAME Xml2Cpp ) install( TARGETS ${BIN_NAME} EXPORT Dtk${DTK_NAME_SUFFIX}ToolsTargets DESTINATION ${TOOL_INSTALL_DIR} ) install( EXPORT Dtk${DTK_NAME_SUFFIX}ToolsTargets FILE Dtk${DTK_NAME_SUFFIX}ToolsTargets.cmake NAMESPACE Dtk${DTK_NAME_SUFFIX}:: DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/Dtk${DTK_NAME_SUFFIX}Tools" ) dtkcore-6.7.46/tools/qdbusxml2cpp/README000066400000000000000000000001551522615770400177270ustar00rootroot00000000000000This is a modified version of the offficial qdbusxml2cpp, born with the support of property changed signals. dtkcore-6.7.46/tools/qdbusxml2cpp/qdbusxml2cpp.cpp000066400000000000000000001452401522615770400222040ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2016 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define PROGRAMNAME "qdbusxml2cpp-fix" #define PROGRAMVERSION "0.8" #define PROGRAMCOPYRIGHT "Copyright (C) 2016 Deepin Technology Co., Ltd." #define ANNOTATION_NO_WAIT "org.freedesktop.DBus.Method.NoReply" #if QT_VERSION >= QT_VERSION_CHECK(5,15,0) #define endl Qt::endl #else #define endl endl #endif static QString globalClassName; static QString parentClassName; static QString proxyFile; static QString adaptorFile; static QString inputFile; static bool skipNamespaces; static bool verbose; static bool includeMocs; static bool skipIncludeAnnotations; static QString commandLine; static QStringList includes; static QStringList wantedInterfaces; static const char help[] = "Usage: " PROGRAMNAME " [options...] [xml-or-xml-file] [interfaces...]\n" "Produces the C++ code to implement the interfaces defined in the input file.\n" "\n" "Options:\n" " -a Write the adaptor code to \n" " -c Use as the class name for the generated classes\n" " -h Show this information\n" " -i Add #include to the output\n" " -l When generating an adaptor, use as the parent class\n" " -m Generate #include \"filename.moc\" statements in the .cpp files\n" " -N Don't use namespaces\n" " -p Write the proxy code to \n" " -v Be verbose.\n" " -S Skip include annotation headers from \"types/\".\n" " -V Show the program version and quit.\n" "\n" "If the file name given to the options -a and -p does not end in .cpp or .h, the\n" "program will automatically append the suffixes and produce both files.\n" "You can also use a colon (:) to separate the header name from the source file\n" "name, as in '-a filename_p.h:filename.cpp'.\n" "\n" "If you pass a dash (-) as the argument to either -p or -a, the output is written\n" "to the standard output\n"; static const char includeList[] = "#include \n" "#include \n" "#include \n" "#include \n" "#include \n" "#include \n" "\n" "#include \n"; static const char forwardDeclarations[] = "QT_BEGIN_NAMESPACE\n" "class QByteArray;\n" "template class QList;\n" "template class QMap;\n" "class QString;\n" "class QStringList;\n" "class QVariant;\n" "QT_END_NAMESPACE\n"; static void showHelp() { printf("%s", help); exit(0); } static void showVersion() { printf("%s version %s\n", PROGRAMNAME, PROGRAMVERSION); printf("D-Bus binding tool for Qt\n"); exit(0); } static QString nextArg(QStringList &args, int i, char opt) { QString arg = args.value(i); if (arg.isEmpty()) { printf("-%c needs at least one argument\n", opt); exit(1); } return args.takeAt(i); } static void parseCmdLine(QStringList args) { args.takeFirst(); commandLine = QLatin1String(PROGRAMNAME " "); commandLine += args.join(QLatin1Char(' ')); int i = 0; while (i < args.count()) { if (!args.at(i).startsWith(QLatin1Char('-'))) { ++i; continue; } QString arg = args.takeAt(i); char c = '\0'; if (arg.length() == 2) c = arg.at(1).toLatin1(); else if (arg == QLatin1String("--help")) c = 'h'; switch (c) { case 'a': adaptorFile = nextArg(args, i, 'a'); break; case 'c': globalClassName = nextArg(args, i, 'c'); break; case 'v': verbose = true; break; case 'i': includes << nextArg(args, i, 'i'); break; case 'l': parentClassName = nextArg(args, i, 'l'); break; case 'm': includeMocs = true; break; case 'N': skipNamespaces = true; break; case 'S': skipIncludeAnnotations = true; break; case '?': case 'h': showHelp(); break; case 'V': showVersion(); break; case 'p': proxyFile = nextArg(args, i, 'p'); break; default: printf("unknown option: '%s'\n", qPrintable(arg)); exit(1); } } if (!args.isEmpty()) inputFile = args.takeFirst(); wantedInterfaces << args; } static QDBusIntrospection::Interfaces readInput() { QFile input(inputFile); if (inputFile.isEmpty() || inputFile == QLatin1String("-")) { input.open(stdin, QIODevice::ReadOnly); } else { input.open(QIODevice::ReadOnly); } QByteArray data = input.readAll(); // check if the input is already XML data = data.trimmed(); if (data.startsWith("= QT_VERSION_CHECK(6, 0, 0) retval = QString("moc_%1cpp").arg(retval); #else retval += QLatin1String("moc"); #endif return retval; } static QTextStream &writeHeader(QTextStream &ts, bool changesWillBeLost) { ts << "/*" << endl << " * This file was generated by " PROGRAMNAME " version " PROGRAMVERSION << endl << " * Command line was: " << commandLine << endl << " *" << endl << " * " PROGRAMNAME " is " PROGRAMCOPYRIGHT << endl << " *" << endl << " * This is an auto-generated file." << endl; if (changesWillBeLost) ts << " * Do not edit! All changes made to it will be lost." << endl; else ts << " * This file may have been hand-edited. Look for HAND-EDIT comments" << endl << " * before re-generating it." << endl; ts << " */" << endl << endl; return ts; } enum ClassType { Proxy, Adaptor }; static QString classNameForInterface(const QString &interface, ClassType classType) { if (!globalClassName.isEmpty()) return globalClassName; QStringList parts = interface.split(QLatin1Char('.')); QString retval; if (classType == Proxy) foreach (QString part, parts) { part[0] = part[0].toUpper(); retval += part; } else { retval = parts.last(); retval[0] = retval[0].toUpper(); } if (classType == Proxy) retval += QLatin1String("Interface"); else retval += QLatin1String("Adaptor"); return retval; } static QString annotationValue(QDBusIntrospection::Annotations annotations, const QString &name) { #if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0) return annotations.value(name).value; #else return annotations.value(name); #endif } static QByteArray qtTypeName(const QString &signature, const QDBusIntrospection::Annotations &annotations, int paramId = -1, const char *direction = "Out") { #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) const auto& type = QDBusMetaType::signatureToMetaType(signature.toLatin1()); if (type.id() == QMetaType::Type::UnknownType) { #else int type = QDBusMetaType::signatureToType(signature.toLatin1()); if (type == QVariant::Invalid) { #endif QString annotationName = QString::fromLatin1("org.qtproject.QtDBus.QtTypeName"); if (paramId >= 0) annotationName += QString::fromLatin1(".%1%2").arg(QLatin1String(direction)).arg(paramId); QString qttype = annotationValue(annotations, annotationName); if (!qttype.isEmpty()) return qttype.toLatin1(); QString oldAnnotationName = QString::fromLatin1("com.trolltech.QtDBus.QtTypeName"); if (paramId >= 0) oldAnnotationName += QString::fromLatin1(".%1%2").arg(QLatin1String(direction)).arg(paramId); qttype = annotationValue(annotations, oldAnnotationName); if (qttype.isEmpty()) { fprintf(stderr, "Got unknown type `%s'\n", qPrintable(signature)); fprintf(stderr, "You should add \"/> to the XML description\n", qPrintable(annotationName)); exit(1); } fprintf(stderr, "Warning: deprecated annotation '%s' found; suggest updating to '%s'\n", qPrintable(oldAnnotationName), qPrintable(annotationName)); return qttype.toLatin1(); } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) return type.name(); #else return QVariant::typeToName(QVariant::Type(type)); #endif } static QString nonConstRefArg(const QByteArray &arg) { return QLatin1String(arg + " &"); } static QString templateArg(const QByteArray &arg) { if (!arg.endsWith('>')) return QLatin1String(arg); return QLatin1String(arg + ' '); } static QString constRefArg(const QByteArray &arg) { if (!arg.startsWith('Q')) return QLatin1String(arg + ' '); else return QString(QLatin1String("const %1 &")).arg(QLatin1String(arg)); } static QStringList makeArgNames(const QDBusIntrospection::Arguments &inputArgs, const QDBusIntrospection::Arguments &outputArgs = QDBusIntrospection::Arguments()) { QStringList retval; const int numInputArgs = inputArgs.count(); const int numOutputArgs = outputArgs.count(); retval.reserve(numInputArgs + numOutputArgs); for (int i = 0; i < numInputArgs; ++i) { const QDBusIntrospection::Argument &arg = inputArgs.at(i); QString name = arg.name; if (name.isEmpty()) name = QString(QLatin1String("in%1")).arg(i); else name.replace(QLatin1Char('-'), QLatin1Char('_')); while (retval.contains(name)) name += QLatin1String("_"); retval << name; } for (int i = 0; i < numOutputArgs; ++i) { const QDBusIntrospection::Argument &arg = outputArgs.at(i); QString name = arg.name; if (name.isEmpty()) name = QString(QLatin1String("out%1")).arg(i); else name.replace(QLatin1Char('-'), QLatin1Char('_')); while (retval.contains(name)) name += QLatin1String("_"); retval << name; } return retval; } static void writeArgList(QTextStream &ts, const QStringList &argNames, const QDBusIntrospection::Annotations &annotations, const QDBusIntrospection::Arguments &inputArgs, const QDBusIntrospection::Arguments &outputArgs = QDBusIntrospection::Arguments()) { // input args: bool first = true; int argPos = 0; for (int i = 0; i < inputArgs.count(); ++i) { const QDBusIntrospection::Argument &arg = inputArgs.at(i); QString type = constRefArg(qtTypeName(arg.type, annotations, i, "In")); if (!first) ts << ", "; ts << type << argNames.at(argPos++); first = false; } argPos++; // output args // yes, starting from 1 for (int i = 1; i < outputArgs.count(); ++i) { const QDBusIntrospection::Argument &arg = outputArgs.at(i); QString name = arg.name; if (!first) ts << ", "; ts << nonConstRefArg(qtTypeName(arg.type, annotations, i, "Out")) << argNames.at(argPos++); first = false; } } static QString propertyGetter(const QDBusIntrospection::Property &property) { QString getter = annotationValue(property.annotations, "org.qtproject.QtDBus.PropertyGetter"); if (!getter.isEmpty()) return getter; getter = annotationValue(property.annotations, "com.trolltech.QtDBus.propertyGetter"); if (!getter.isEmpty()) { fprintf(stderr, "Warning: deprecated annotation 'com.trolltech.QtDBus.propertyGetter' found;" " suggest updating to 'org.qtproject.QtDBus.PropertyGetter'\n"); return getter; } getter = property.name; getter[0] = getter[0].toLower(); return getter; } static QString propertySetter(const QDBusIntrospection::Property &property) { QString setter = annotationValue(property.annotations, "org.qtproject.QtDBus.PropertySetter"); if (!setter.isEmpty()) return setter; setter = annotationValue(property.annotations, "com.trolltech.QtDBus.propertySetter"); if (!setter.isEmpty()) { fprintf(stderr, "Warning: deprecated annotation 'com.trolltech.QtDBus.propertySetter' found;" " suggest updating to 'org.qtproject.QtDBus.PropertySetter'\n"); return setter; } setter = QLatin1String("set") + property.name; setter[3] = setter[3].toUpper(); return setter; } static QString propertyNotifier(const QDBusIntrospection::Property &property) { QString notifier = annotationValue(property.annotations, "org.qtproject.QtDBus.PropertyNotifier"); if (!notifier.isEmpty()) return notifier; notifier = property.name + QLatin1String("Changed"); notifier[0] = notifier[0].toUpper(); return notifier; } static QString methodName(const QDBusIntrospection::Method &method) { QString name = annotationValue(method.annotations, "org.qtproject.QtDBus.MethodName"); if (!name.isEmpty()) return name; return method.name; } static QString stringify(const QString &data) { QString retval; int i; for (i = 0; i < data.length(); ++i) { retval += QLatin1Char('\"'); for (; i < data.length() && data[i] != QLatin1Char('\n') && data[i] != QLatin1Char('\r'); ++i) if (data[i] == QLatin1Char('\"')) retval += QLatin1String("\\\""); else retval += data[i]; if (i + 1 < data.length() && data[i] == QLatin1Char('\r') && data[i + 1] == QLatin1Char('\n')) i++; retval += QLatin1String("\\n\"\n"); } return retval; } static bool openFile(const QString &fileName, QFile &file) { if (fileName.isEmpty()) return false; bool isOk = false; if (fileName == QLatin1String("-")) { isOk = file.open(stdout, QIODevice::WriteOnly | QIODevice::Text); } else { file.setFileName(fileName); isOk = file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text); } if (!isOk) fprintf(stderr, "Unable to open '%s': %s\n", qPrintable(fileName), qPrintable(file.errorString())); return isOk; } static void writeProxy(const QString &filename, const QDBusIntrospection::Interfaces &interfaces) { // open the file QString headerName = header(filename); QByteArray headerData; QTextStream hs(&headerData); QString cppName = cpp(filename); QByteArray cppData; QTextStream cs(&cppData); // write the header: writeHeader(hs, true); if (cppName != headerName) writeHeader(cs, false); // include guards: QString includeGuard; if (!headerName.isEmpty() && headerName != QLatin1String("-")) { includeGuard = headerName.toUpper().replace(QLatin1Char('.'), QLatin1Char('_')); int pos = includeGuard.lastIndexOf(QLatin1Char('/')); if (pos != -1) includeGuard = includeGuard.mid(pos + 1); } else { includeGuard = QLatin1String("QDBUSXML2CPP_PROXY"); } includeGuard = QString(QLatin1String("%1")) .arg(includeGuard); hs << "#ifndef " << includeGuard << endl << "#define " << includeGuard << endl << endl; // include our stuff: hs << "#include " << endl << includeList << "#include " << endl; foreach (const QString &include, includes) { hs << "#include \"" << include << "\"" << endl; if (headerName.isEmpty()) cs << "#include \"" << include << "\"" << endl; } hs << endl; if (cppName != headerName) { if (!headerName.isEmpty() && headerName != QLatin1String("-")) cs << "#include \"" << headerName << "\"" << endl << endl; } QStringList annotations; for (const QDBusIntrospection::Interface *interface : interfaces) { for (const auto &method : interface->methods) { for (int i(0); i != method.outputArgs.size(); ++i) { const QDBusIntrospection::Argument &arg = method.outputArgs[i]; #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) if (QDBusMetaType::signatureToMetaType(arg.type.toLatin1()).id() != QMetaType::Type::UnknownType) #else if (QDBusMetaType::signatureToType(arg.type.toLatin1()) != QVariant::Invalid) #endif continue; annotations << qtTypeName(arg.type, method.annotations, i, "Out"); } for (int i(0); i != method.inputArgs.size(); ++i) { const QDBusIntrospection::Argument &arg = method.inputArgs[i]; #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) if (QDBusMetaType::signatureToMetaType(arg.type.toLatin1()).id() != QMetaType::Type::UnknownType) #else if (QDBusMetaType::signatureToType(arg.type.toLatin1()) != QVariant::Invalid) #endif continue; annotations << qtTypeName(arg.type, method.annotations, i, "In"); } } for (const auto &property : interface->properties) { #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) if (QDBusMetaType::signatureToMetaType(property.type.toLatin1()).id() != QMetaType::Type::UnknownType) #else if (QDBusMetaType::signatureToType(property.type.toLatin1()) != QVariant::Invalid) #endif continue; annotations << qtTypeName(property.type, property.annotations); } } annotations.removeDuplicates(); if (!skipIncludeAnnotations) { for (const QString &annotation : annotations) { if (annotation.indexOf('<') == -1) { hs << "#include \"types/" << annotation.toLower() << ".h\"" << endl; } } } hs << endl; foreach (const QDBusIntrospection::Interface *interface, interfaces) { QString className = "__" + classNameForInterface(interface->name, Proxy); // using namespace Dtk::Core in cpp cs << "DCORE_USE_NAMESPACE" << endl; // comment: hs << "/*" << endl << " * Proxy class for interface " << interface->name << endl << " */" << endl; cs << "/*" << endl << " * Implementation of interface class " << className << endl << " */" << endl << endl; // private class declare hs << "class " << className << "Private;" << endl; // class header: add Dtk::Core hs << "class " << className << " : public DTK_CORE_NAMESPACE::DDBusExtendedAbstractInterface" << endl << "{" << endl << " Q_OBJECT" << endl; hs << endl; // private class defines cs << "class " << className << "Private" << endl << "{" << endl << "public:" << endl << " " << className << "Private() = default;" << endl << endl; // private class member cs << " // begin member variables" << endl; for (const auto &property : interface->properties) { QByteArray type = qtTypeName(property.type, property.annotations); cs << " " << type << " " << property.name << ';' << endl; } cs << endl; // stuffs member cs << "public:" << endl << " QMap m_processingCalls;" << endl << " QMap> m_waittingCalls;" << endl; cs << "};" << endl << endl; // end of private class defines // the interface name hs << "public:" << endl << " static inline const char *staticInterfaceName()" << endl << " { return \"" << interface->name << "\"; }" << endl << endl; // constructors/destructors: hs << "public:" << endl << " explicit " << className << "(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0);" << endl << endl << " ~" << className << "();" << endl << endl; cs << className << "::" << className << "(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent)" << endl << " : DDBusExtendedAbstractInterface(service, path, staticInterfaceName(), connection, parent)" << endl << " , d_ptr(new " << className << "Private)" << endl << "{" << endl; if (!interface->properties.isEmpty()) cs << " connect(this, &" << className << "::propertyChanged, this, &" << className << "::onPropertyChanged);" << endl << endl; for (const QString &annotation : annotations) { if (annotation.indexOf('<') != -1) { #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) cs << " if (QMetaType::fromName(\"" << annotation << "\").id() == QMetaType::UnknownType) {" << endl; #else cs << " if (QMetaType::type(\"" << annotation << "\") == QMetaType::UnknownType) {" << endl; #endif cs << " qRegisterMetaType< " << annotation << " >(\"" << annotation << "\");" << endl; cs << " qDBusRegisterMetaType< " << annotation << " >();" << endl; cs << " }" << endl; } else { #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) cs << " if (QMetaType::fromName(\"" << annotation << "\").id() == QMetaType::UnknownType)" << endl; #else cs << " if (QMetaType::type(\"" << annotation << "\") == QMetaType::UnknownType)" << endl; #endif cs << " register" << annotation << "MetaType();" << endl; } } cs << "}" << endl << endl << className << "::~" << className << "()" << endl << "{" << endl << " qDeleteAll(d_ptr->m_processingCalls.values());" << endl << " delete d_ptr;" << endl << "}" << endl << endl; if (!interface->properties.isEmpty()) { // onPropertyChanged cs << "void " << className << "::onPropertyChanged(const QString &propName, const QVariant &value)" << endl; cs << "{" << endl; for (const auto &property : interface->properties) { char first = property.name[0].toLatin1(); QString name = property.name; name[0] = QChar(first & ~0x20); QByteArray type = qtTypeName(property.type, property.annotations); cs << " if (propName == QStringLiteral(\"" << property.name << "\"))" << endl; cs << " {" << endl; cs << " const " << type << " &" << property.name << " = qvariant_cast<" << type << ">(value);" << endl; cs << " " << "if (d_ptr->" << property.name << " != " << property.name << ")" << endl; cs << " {" << endl; cs << " d_ptr->" << property.name << " = " << property.name << ';' << endl; cs << " Q_EMIT " << name << "Changed(d_ptr->" << property.name << ");" << endl; cs << " }" << endl; cs << " return;" << endl; cs << " }" << endl; cs << endl; } cs << " qWarning() << \"property not handle: \" << propName;" << endl; cs << " return;" << endl; cs << "}" << endl << endl; } // properties: foreach (const QDBusIntrospection::Property &property, interface->properties) { QByteArray type = qtTypeName(property.type, property.annotations); // QString templateType = templateArg(type); // QString constRefType = constRefArg(type); QString getter = propertyGetter(property); QString setter = propertySetter(property); QString notifier = propertyNotifier(property); hs << " Q_PROPERTY(" << type << " " << property.name; // getter: if (property.access != QDBusIntrospection::Property::Write) // it's readble hs << " READ " << getter; // setter if (property.access != QDBusIntrospection::Property::Read) // it's writeable hs << " WRITE " << setter; //notifier hs << " NOTIFY " << notifier; hs << ")" << endl; // getter: if (property.access != QDBusIntrospection::Property::Write) { // getter declare hs << " " << type << " " << getter << "();" << endl; // getter define cs << type << " " << className << "::" << getter << "()" << endl << "{" << endl << " return qvariant_cast<" << type << ">(internalPropGet(\"" << property.name << "\", &d_ptr->" << property.name << "));" << endl << "}" << endl << endl; } // setter: if (property.access != QDBusIntrospection::Property::Read) { // setter declare hs << " void " << setter << "(" << constRefArg(type) << "value);" << endl; // setter define cs << "void " << className << "::" << setter << "(" << constRefArg(type) << "value)" << endl << "{" << endl << endl << " internalPropSet(\"" << property.name << "\", QVariant::fromValue(value), &d_ptr->" << property.name << ");" << endl << "}" << endl << endl; } hs << endl; } // methods: hs << "public Q_SLOTS: // METHODS" << endl; foreach (const QDBusIntrospection::Method &method, interface->methods) { bool isDeprecated = annotationValue(method.annotations, "org.freedesktop.DBus.Deprecated") == QLatin1String("true"); bool isNoReply = annotationValue(method.annotations, QLatin1String(ANNOTATION_NO_WAIT)) == QLatin1String("true"); if (isNoReply && !method.outputArgs.isEmpty()) { fprintf(stderr, "warning: method %s in interface %s is marked 'no-reply' but has output arguments.\n", qPrintable(method.name), qPrintable(interface->name)); continue; } hs << " inline " << (isDeprecated ? "Q_DECL_DEPRECATED " : ""); if (isNoReply) { hs << "Q_NOREPLY void "; } else { hs << "QDBusPendingReply<"; for (int i = 0; i < method.outputArgs.count(); ++i) hs << (i > 0 ? ", " : "") << templateArg(qtTypeName(method.outputArgs.at(i).type, method.annotations, i, "Out")); hs << "> "; } hs << methodName(method) << "("; QStringList argNames = makeArgNames(method.inputArgs); writeArgList(hs, argNames, method.annotations, method.inputArgs); hs << ")" << endl << " {" << endl << " QList argumentList;" << endl; if (!method.inputArgs.isEmpty()) { hs << " argumentList"; for (int argPos = 0; argPos < method.inputArgs.count(); ++argPos) hs << " << QVariant::fromValue(" << argNames.at(argPos) << ')'; hs << ";" << endl; } if (isNoReply) hs << " callWithArgumentList(QDBus::NoBlock, " << "QStringLiteral(\"" << method.name << "\"), argumentList);" << endl; else hs << " return asyncCallWithArgumentList(QStringLiteral(\"" << method.name << "\"), argumentList);" << endl; // close the function: hs << " }" << endl; hs << endl; // queued version for void return type functions if (method.outputArgs.count() == 0) { hs << " inline void " << method.name << "Queued("; writeArgList(hs, argNames, method.annotations, method.inputArgs, method.outputArgs); hs << ")" << endl << " {" << endl << " QList argumentList;" << endl; int argPos = 0; if (!method.inputArgs.isEmpty()) { hs << " argumentList"; for (argPos = 0; argPos < method.inputArgs.count(); ++argPos) hs << " << QVariant::fromValue(" << argNames.at(argPos) << ')'; hs << ";" << endl; } hs << endl << " CallQueued(" << "QStringLiteral(\"" << method.name << "\"), argumentList);" << endl << " }" << endl; } hs << endl; if (method.outputArgs.count() > 1) { const auto templateArgument = templateArg(qtTypeName(method.outputArgs.first().type, method.annotations, 0, "Out")); // generate the old-form QDBusReply methods with multiple incoming parameters hs << " inline " << (isDeprecated ? "Q_DECL_DEPRECATED " : "") << "QDBusReply<" << templateArgument << "> "; hs << method.name << "("; QStringList argNames = makeArgNames(method.inputArgs, method.outputArgs); writeArgList(hs, argNames, method.annotations, method.inputArgs, method.outputArgs); hs << ")" << endl << " {" << endl << " QList argumentList;" << endl; int argPos = 0; if (!method.inputArgs.isEmpty()) { hs << " argumentList"; for (argPos = 0; argPos < method.inputArgs.count(); ++argPos) hs << " << QVariant::fromValue(" << argNames.at(argPos) << ')'; hs << ";" << endl; } hs << " QDBusMessage reply = callWithArgumentList(QDBus::Block, " << "QStringLiteral(\"" << method.name << "\"), argumentList);" << endl; argPos++; hs << " if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == " << method.outputArgs.count() << ") {" << endl; // yes, starting from 1 for (int i = 1; i < method.outputArgs.count(); ++i) hs << " " << argNames.at(argPos++) << " = qdbus_cast<" << templateArg(qtTypeName(method.outputArgs.at(i).type, method.annotations, i, "Out")) << ">(reply.arguments().at(" << i << "));" << endl; hs << " }" << endl << " return reply;" << endl << " }" << endl; } hs << endl; } hs << endl; hs << "Q_SIGNALS: // SIGNALS" << endl; foreach (const QDBusIntrospection::Signal &signal, interface->signals_) { hs << " "; if (annotationValue(signal.annotations, QLatin1String("org.freedesktop.DBus.Deprecated")) == QLatin1String("true")) hs << "Q_DECL_DEPRECATED "; hs << "void " << signal.name << "("; QStringList argNames = makeArgNames(signal.outputArgs); writeArgList(hs, argNames, signal.annotations, signal.outputArgs); hs << ");" << endl; // finished for header } //propery changed signals hs << " // begin property changed signals" << endl; foreach (const QDBusIntrospection::Property &property, interface->properties) { hs << " "; QByteArray type = qtTypeName(property.type, property.annotations); QString constRefType = constRefArg(type); QString notifier = propertyNotifier(property); //notifier hs << "void " << notifier << "(" << constRefType << " value" << ") const;" << endl; } hs << endl; // queued stuffs hs << "public Q_SLOTS:" << endl << " void CallQueued(const QString &callName, const QList &args);" << endl << endl; cs << "void " << className << "::CallQueued(const QString &callName, const QList &args)" << endl << "{" << endl << " if (d_ptr->m_waittingCalls.contains(callName))" << endl << " {" << endl << " d_ptr->m_waittingCalls[callName] = args;" << endl << " return;" << endl << " }" << endl << " if (d_ptr->m_processingCalls.contains(callName))" << endl << " {" << endl << " d_ptr->m_waittingCalls.insert(callName, args);" << endl << " } else {" << endl << " QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(asyncCallWithArgumentList(callName, args));" << endl << " connect(watcher, &QDBusPendingCallWatcher::finished, this, &" << className << "::onPendingCallFinished);" << endl << " d_ptr->m_processingCalls.insert(callName, watcher);" << endl << " }" << endl << "}" << endl << endl; hs << "private Q_SLOTS:" << endl << " void onPendingCallFinished(QDBusPendingCallWatcher *w);" << endl; if (!interface->properties.isEmpty()) hs << " void onPropertyChanged(const QString &propName, const QVariant &value);" << endl; hs << endl; cs << "void " << className << "::onPendingCallFinished(QDBusPendingCallWatcher *w)" << endl << "{" << endl << " w->deleteLater();" << endl << " const auto callName = d_ptr->m_processingCalls.key(w);" << endl << " Q_ASSERT(!callName.isEmpty());" << endl << " if (callName.isEmpty())" << endl << " return;" << endl << " d_ptr->m_processingCalls.remove(callName);" << endl << " if (!d_ptr->m_waittingCalls.contains(callName))" << endl << " return;" << endl << " const auto args = d_ptr->m_waittingCalls.take(callName);" << endl << " CallQueued(callName, args);" << endl << "}" << endl; // private member hs << "private:" << endl << " " << className << "Private *d_ptr;" << endl; // close the class: hs << "};" << endl << endl; } if (!skipNamespaces) { QStringList last; QDBusIntrospection::Interfaces::ConstIterator it = interfaces.constBegin(); do { QStringList current; QString name; if (it != interfaces.constEnd()) { current = it->constData()->name.split(QLatin1Char('.')); name = current.takeLast(); } int i = 0; while (i < current.count() && i < last.count() && current.at(i) == last.at(i)) ++i; // i parts matched // close last.arguments().count() - i namespaces: for (int j = i; j < last.count(); ++j) hs << QString((last.count() - j - 1 + i) * 2, QLatin1Char(' ')) << "}" << endl; // open current.arguments().count() - i namespaces for (int j = i; j < current.count(); ++j) hs << QString(j * 2, QLatin1Char(' ')) << "namespace " << current.at(j).toLower() << " {" << endl; // add this class: if (!name.isEmpty()) { hs << QString(current.count() * 2, QLatin1Char(' ')) << "typedef ::__" << classNameForInterface(it->constData()->name, Proxy) << " " << name << ";" << endl; } if (it == interfaces.constEnd()) break; ++it; last = current; } while (true); } // close the include guard hs << "#endif" << endl; QString mocName = moc(filename); if (includeMocs && !mocName.isEmpty()) cs << endl << "#include \"" << mocName << "\"" << endl; cs.flush(); hs.flush(); QFile file; const bool headerOpen = openFile(headerName, file); if (headerOpen) file.write(headerData); if (headerName == cppName) { if (headerOpen) file.write(cppData); } else { QFile cppFile; if (openFile(cppName, cppFile)) cppFile.write(cppData); } } static void writeAdaptor(const QString &filename, const QDBusIntrospection::Interfaces &interfaces) { // open the file QString headerName = header(filename); QByteArray headerData; QTextStream hs(&headerData); QString cppName = cpp(filename); QByteArray cppData; QTextStream cs(&cppData); // write the headers writeHeader(hs, false); if (cppName != headerName) writeHeader(cs, true); // include guards: QString includeGuard; if (!headerName.isEmpty() && headerName != QLatin1String("-")) { includeGuard = headerName.toUpper().replace(QLatin1Char('.'), QLatin1Char('_')); int pos = includeGuard.lastIndexOf(QLatin1Char('/')); if (pos != -1) includeGuard = includeGuard.mid(pos + 1); } else { includeGuard = QLatin1String("QDBUSXML2CPP_ADAPTOR"); } includeGuard = QString(QLatin1String("%1")) .arg(includeGuard); hs << "#ifndef " << includeGuard << endl << "#define " << includeGuard << endl << endl; // include our stuff: hs << "#include " << endl; if (cppName == headerName) hs << "#include " << endl << "#include " << endl; hs << "#include " << endl; foreach (const QString &include, includes) { hs << "#include \"" << include << "\"" << endl; if (headerName.isEmpty()) cs << "#include \"" << include << "\"" << endl; } if (cppName != headerName) { if (!headerName.isEmpty() && headerName != QLatin1String("-")) cs << "#include \"" << headerName << "\"" << endl; cs << "#include " << endl << includeList << endl; hs << forwardDeclarations; } else { hs << includeList; } hs << endl; QString parent = parentClassName; if (parentClassName.isEmpty()) parent = QLatin1String("QObject"); foreach (const QDBusIntrospection::Interface *interface, interfaces) { QString className = classNameForInterface(interface->name, Adaptor); // comment: hs << "/*" << endl << " * Adaptor class for interface " << interface->name << endl << " */" << endl; cs << "/*" << endl << " * Implementation of adaptor class " << className << endl << " */" << endl << endl; // class header: hs << "class " << className << ": public QDBusAbstractAdaptor" << endl << "{" << endl << " Q_OBJECT" << endl << " Q_CLASSINFO(\"D-Bus Interface\", \"" << interface->name << "\")" << endl << " Q_CLASSINFO(\"D-Bus Introspection\", \"\"" << endl << stringify(interface->introspection) << " \"\")" << endl << "public:" << endl << " " << className << "(" << parent << " *parent);" << endl << " virtual ~" << className << "();" << endl << endl; if (!parentClassName.isEmpty()) hs << " inline " << parent << " *parent() const" << endl << " { return static_cast<" << parent << " *>(QObject::parent()); }" << endl << endl; // constructor/destructor cs << className << "::" << className << "(" << parent << " *parent)" << endl << " : QDBusAbstractAdaptor(parent)" << endl << "{" << endl << " // constructor" << endl << " setAutoRelaySignals(true);" << endl << "}" << endl << endl << className << "::~" << className << "()" << endl << "{" << endl << " // destructor" << endl << "}" << endl << endl; hs << "public: // PROPERTIES" << endl; foreach (const QDBusIntrospection::Property &property, interface->properties) { QByteArray type = qtTypeName(property.type, property.annotations); QString constRefType = constRefArg(type); QString getter = propertyGetter(property); QString setter = propertySetter(property); hs << " Q_PROPERTY(" << type << " " << property.name; if (property.access != QDBusIntrospection::Property::Write) hs << " READ " << getter; if (property.access != QDBusIntrospection::Property::Read) hs << " WRITE " << setter; hs << ")" << endl; // getter: if (property.access != QDBusIntrospection::Property::Write) { hs << " " << type << " " << getter << "() const;" << endl; cs << type << " " << className << "::" << getter << "() const" << endl << "{" << endl << " // get the value of property " << property.name << endl << " return qvariant_cast< " << type << " >(parent()->property(\"" << property.name << "\"));" << endl << "}" << endl << endl; } // setter if (property.access != QDBusIntrospection::Property::Read) { hs << " void " << setter << "(" << type << "value);" << endl; cs << "void " << className << "::" << setter << "(" << type << "value)" << endl << "{" << endl << " // set the value of property " << property.name << endl << " parent()->setProperty(\"" << property.name << "\", QVariant::fromValue(value"; if (constRefType.contains(QLatin1String("QDBusVariant"))) cs << ".variant()"; cs << "));" << endl << "}" << endl << endl; } hs << endl; } hs << "public Q_SLOTS: // METHODS" << endl; foreach (const QDBusIntrospection::Method &method, interface->methods) { bool isNoReply = annotationValue(method.annotations, QLatin1String(ANNOTATION_NO_WAIT)) == QLatin1String("true"); if (isNoReply && !method.outputArgs.isEmpty()) { fprintf(stderr, "warning: method %s in interface %s is marked 'no-reply' but has output arguments.\n", qPrintable(method.name), qPrintable(interface->name)); continue; } hs << " "; if (annotationValue(method.annotations, QLatin1String("org.freedesktop.DBus.Deprecated")) == QLatin1String("true")) hs << "Q_DECL_DEPRECATED "; QByteArray returnType; if (isNoReply) { hs << "Q_NOREPLY void "; cs << "void "; } else if (method.outputArgs.isEmpty()) { hs << "void "; cs << "void "; } else { returnType = qtTypeName(method.outputArgs.first().type, method.annotations, 0, "Out"); hs << returnType << " "; cs << returnType << " "; } QString name = methodName(method); hs << name << "("; cs << className << "::" << name << "("; QStringList argNames = makeArgNames(method.inputArgs, method.outputArgs); writeArgList(hs, argNames, method.annotations, method.inputArgs, method.outputArgs); writeArgList(cs, argNames, method.annotations, method.inputArgs, method.outputArgs); hs << ");" << endl; // finished for header cs << ")" << endl << "{" << endl << " // handle method call " << interface->name << "." << methodName(method) << endl; // make the call bool usingInvokeMethod = false; if (parentClassName.isEmpty() && method.inputArgs.count() <= 10 && method.outputArgs.count() <= 1) usingInvokeMethod = true; if (usingInvokeMethod) { // we are using QMetaObject::invokeMethod if (!returnType.isEmpty()) cs << " " << returnType << " " << argNames.at(method.inputArgs.count()) << ";" << endl; static const char invoke[] = " QMetaObject::invokeMethod(parent(), \""; cs << invoke << name << "\""; if (!method.outputArgs.isEmpty()) cs << ", Q_RETURN_ARG(" << qtTypeName(method.outputArgs.at(0).type, method.annotations, 0, "Out") << ", " << argNames.at(method.inputArgs.count()) << ")"; for (int i = 0; i < method.inputArgs.count(); ++i) cs << ", Q_ARG(" << qtTypeName(method.inputArgs.at(i).type, method.annotations, i, "In") << ", " << argNames.at(i) << ")"; cs << ");" << endl; if (!returnType.isEmpty()) cs << " return " << argNames.at(method.inputArgs.count()) << ";" << endl; } else { if (parentClassName.isEmpty()) cs << " //"; else cs << " "; if (!method.outputArgs.isEmpty()) cs << "return "; if (parentClassName.isEmpty()) cs << "static_cast(parent())->"; else cs << "parent()->"; cs << name << "("; int argPos = 0; bool first = true; for (int i = 0; i < method.inputArgs.count(); ++i) { cs << (first ? "" : ", ") << argNames.at(argPos++); first = false; } ++argPos; // skip retval, if any for (int i = 1; i < method.outputArgs.count(); ++i) { cs << (first ? "" : ", ") << argNames.at(argPos++); first = false; } cs << ");" << endl; } cs << "}" << endl << endl; } hs << "Q_SIGNALS: // SIGNALS" << endl; foreach (const QDBusIntrospection::Signal &signal, interface->signals_) { hs << " "; if (annotationValue(signal.annotations, QLatin1String("org.freedesktop.DBus.Deprecated")) == QLatin1String("true")) hs << "Q_DECL_DEPRECATED "; hs << "void " << signal.name << "("; QStringList argNames = makeArgNames(signal.outputArgs); writeArgList(hs, argNames, signal.annotations, signal.outputArgs); hs << ");" << endl; // finished for header } // close the class: hs << "};" << endl << endl; } // close the include guard hs << "#endif" << endl; QString mocName = moc(filename); if (includeMocs && !mocName.isEmpty()) cs << endl << "#include \"" << mocName << "\"" << endl; cs.flush(); hs.flush(); QFile file; const bool headerOpen = openFile(headerName, file); if (headerOpen) file.write(headerData); if (headerName == cppName) { if (headerOpen) file.write(cppData); } else { QFile cppFile; if (openFile(cppName, cppFile)) cppFile.write(cppData); } } int main(int argc, char **argv) { if (argc < 2) showHelp(); QStringList arguments; arguments.reserve(argc); for (int i = 0; i < argc; ++i) { arguments.append(QString::fromLocal8Bit(argv[i])); } parseCmdLine(arguments); QDBusIntrospection::Interfaces interfaces = readInput(); cleanInterfaces(interfaces); if (!proxyFile.isEmpty() || adaptorFile.isEmpty()) writeProxy(proxyFile, interfaces); if (!adaptorFile.isEmpty()) writeAdaptor(adaptorFile, interfaces); return 0; } dtkcore-6.7.46/tools/settings/000077500000000000000000000000001522615770400162625ustar00rootroot00000000000000dtkcore-6.7.46/tools/settings/CMakeLists.txt000066400000000000000000000017741522615770400210330ustar00rootroot00000000000000set(TARGET_NAME dtk-settings) set(BIN_NAME ${TARGET_NAME}${DTK_NAME_SUFFIX}) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Xml) if(${QT_VERSION_MAJOR} STREQUAL "5") find_package(PkgConfig REQUIRED) pkg_check_modules(QGSettings REQUIRED IMPORTED_TARGET gsettings-qt) endif() add_executable(${BIN_NAME} main.cpp ) target_link_libraries( ${BIN_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Xml ${LIB_NAME} ) if(${QT_VERSION_MAJOR} STREQUAL "5") target_link_libraries( ${BIN_NAME} PRIVATE PkgConfig::QGSettings ) endif() target_include_directories( ${BIN_NAME} PUBLIC ../../include/util/ ../../include/dci/ ../../include/log/ ../../include/base/ ../../include/global/ ../../include/DtkCore/ ../../include/settings/ ../../include/filesystem/ ../../include/ ) set_target_properties(${BIN_NAME} PROPERTIES OUTPUT_NAME ${TARGET_NAME}) install(TARGETS ${BIN_NAME} DESTINATION "${TOOL_INSTALL_DIR}") dtkcore-6.7.46/tools/settings/main.cpp000066400000000000000000000256731522615770400177270ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include #include #include #include #include "settings/dsettings.h" #include "settings/dsettingsgroup.h" #include "settings/dsettingsoption.h" #include #include #include #include #ifndef DTK_SETTINGS_TOOLS_VERSION #define DTK_SETTINGS_TOOLS_VERSION "0.1.2" #endif // DTK_SETTINGS_TOOLS_VERSION static QString CppTemplate = "// This file was generated by dtk-settings-tools version " DTK_SETTINGS_TOOLS_VERSION " \n" "\n" "#include \n" "\n" "void GenerateSettingTranslate()\n" "{\n" "%1" "}\n"; /* * GVariant Type Name/Code C++ Type Name QVariant Type Name * -------------------------------------------------------------------------- * boolean b bool QVariant::Bool * byte y char QVariant::Char * int16 n int QVariant::Int * uint16 q unsigned int QVariant::UInt * int32 i int QVariant::Int * uint32 u unsigned int QVariant::UInt * int64 x long long QVariant::LongLong * uint64 t unsigned long long QVariant::ULongLong * double d double QVariant::Double * string s QString QVariant::String * string array* as QStringList QVariant::StringList * byte array ay QByteArray QVariant::ByteArray * dictionary a{ss} QVariantMap QVariant::Map */ #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QString gsettings_type_from_QVarint(const QMetaType::Type qtype) { switch (qtype) { case QMetaType::Type::Bool: return "b"; case QMetaType::Type::Int: return "i"; case QMetaType::Type::UInt: return "u"; case QMetaType::Type::LongLong: return "x"; case QMetaType::Type::ULongLong: return "t"; case QMetaType::Type::Double: return "d"; case QMetaType::Type::QString: return "s"; case QMetaType::Type::QStringList: return "as"; case QMetaType::Type::QByteArray: return "ay"; case QMetaType::Type::QVariantMap: return "a{ss}"; default: return ""; } } #else QString gsettings_type_from_QVarint(const QVariant::Type qtype) { switch (qtype) { case QVariant::Bool: return "b"; case QVariant::Int: return "i"; case QVariant::UInt: return "u"; case QVariant::LongLong: return "x"; case QVariant::ULongLong: return "t"; case QVariant::Double: return "d"; case QVariant::String: return "s"; case QVariant::StringList: return "as"; case QVariant::ByteArray: return "ay"; case QVariant::Map: return "a{ss}"; default: return ""; } } #endif QString gsettings_value_from_QVarint(const QVariant value) { #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) switch (value.typeId()) { case QMetaType::Type::Bool: return value.toString(); case QMetaType::Type::Int: return value.toString(); case QMetaType::Type::UInt: return value.toString(); case QMetaType::Type::LongLong: return value.toString(); case QMetaType::Type::ULongLong: return value.toString(); case QMetaType::Type::Double: return value.toString(); case QMetaType::Type::QString: return QString("\"%1\"").arg(value.toString()); case QMetaType::Type::QStringList: return value.toString(); case QMetaType::Type::QByteArray: return value.toString(); case QMetaType::Type::QVariantMap: return value.toString(); default: return ""; } #else switch (value.type()) { case QVariant::Bool: return value.toString(); case QVariant::Int: return value.toString(); case QVariant::UInt: return value.toString(); case QVariant::LongLong: return value.toString(); case QVariant::ULongLong: return value.toString(); case QVariant::Double: return value.toString(); case QVariant::String: return QString("\"%1\"").arg(value.toString()); case QVariant::StringList: return value.toString(); case QVariant::ByteArray: return value.toString(); case QVariant::Map: return value.toString(); default: return ""; } #endif } QJsonObject parseGSettingsMeta(const QString &jsonPath) { QFile jsonFile(jsonPath); jsonFile.open(QIODevice::ReadOnly); auto jsonData = jsonFile.readAll(); jsonFile.close(); QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData); return jsonDoc.object().value("gsettings").toObject(); } static bool writeGSettingXML(Dtk::Core::DSettings *settings, QJsonObject gsettingsMeta, const QString &xmlPath) { QDomDocument document; QDomProcessingInstruction header = document.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"utf-8\""); document.appendChild(header); QDomElement schemalist = document.createElement("schemalist"); auto id = gsettingsMeta.value("id").toString(); auto path = gsettingsMeta.value("path").toString(); QDomElement schema = document.createElement("schema"); schema.setAttribute("id", id); schema.setAttribute("path", path); for (QString key : settings->keys()) { auto codeKey = QString(key).replace(".", "-").replace("_", "-"); auto value = settings->option(key)->value(); #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) auto gtype = gsettings_type_from_QVarint(static_cast(value.typeId())); #else auto gtype = gsettings_type_from_QVarint(value.type()); #endif if (gtype.isEmpty()) { #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) qDebug() << "skip unsupported type:" << value.typeId() << key; #else qDebug() << "skip unsupported type:" << value.type() << key; #endif continue; } QDomElement keyXml = document.createElement("key"); keyXml.setAttribute("name", codeKey); keyXml.setAttribute("type", gtype); QString defaultData = gsettings_value_from_QVarint(value); QDomElement defaultEle = document.createElement("default"); QDomCharacterData data = document.createTextNode(defaultData); defaultEle.appendChild(data); keyXml.appendChild(defaultEle); schema.appendChild(keyXml); } schemalist.appendChild(schema); document.appendChild(schemalist); QFile file(xmlPath); if (!file.open(QIODevice::WriteOnly)) { return false; } QTextStream stream(&file); stream << document.toString(); file.close(); return true; } int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); app.setOrganizationName("deepin"); app.setApplicationName("dtk-settings-tools"); app.setApplicationVersion(DTK_SETTINGS_TOOLS_VERSION); QCommandLineParser parser; parser.setApplicationDescription("Generate translation of dtksetting."); parser.addHelpOption(); parser.addVersionOption(); QCommandLineOption gsettingsArg(QStringList() << "g" << "gsettings", QCoreApplication::tr("generate gsetting schema"), "xml-file"); QCommandLineOption outputFileArg(QStringList() << "o" << "output", QCoreApplication::tr("Output cpp file"), "cpp-file"); parser.addOption(gsettingsArg); parser.addOption(outputFileArg); parser.addPositionalArgument("json-file", QCoreApplication::tr("Json file description config")); parser.process(app); if (0 == (parser.optionNames().length() + parser.positionalArguments().length())) { parser.showHelp(0); } auto jsonFile = parser.positionalArguments().value(0); auto settings = Dtk::Core::DSettings::fromJsonFile(jsonFile); QMap transtaleMaps; // qDebug() << settings->groupKeys(); for (QString groupKey : settings->groupKeys()) { auto codeKey = QString(groupKey).replace(".", "_"); auto group = settings->group(groupKey); // qDebug() << codeKey << group->name(); // add Name if (!group->name().isEmpty()) { transtaleMaps.insert("group_" + codeKey + "Name", group->name()); } // TODO: only two level for (auto childGroup : group->childGroups()) { auto codeKey = childGroup->key().replace(".", "_"); // qDebug() << codeKey << childGroup->name(); // add Name if (!childGroup->name().isEmpty()) { transtaleMaps.insert("group_" + codeKey + "Name", childGroup->name()); } } } for (QString key : settings->keys()) { auto codeKey = QString(key).replace(".", "_"); auto opt = settings->option(key); QStringList skipI18nKeys = opt->data("i18n_skip_keys").toStringList(); if (skipI18nKeys.contains("all")) { continue; } // add Name if (!opt->name().isEmpty() && !skipI18nKeys.contains("name")) { transtaleMaps.insert(codeKey + "Name", opt->name()); } // add text if (!opt->data("text").toString().isEmpty() && !skipI18nKeys.contains("text")) { transtaleMaps.insert(codeKey + "Text", opt->data("text").toString()); } // add items if (!opt->data("items").toStringList().isEmpty() && !skipI18nKeys.contains("items")) { auto items = opt->data("items").toStringList(); for (int i = 0; i < items.length(); ++i) { transtaleMaps.insert(codeKey + QString("Text%1").arg(i), items.value(i)); } } } QString cppCode; for (auto key : transtaleMaps.keys()) { auto stringCode = QString(" auto %1 = QObject::tr(\"%2\");\n").arg(key).arg(transtaleMaps.value(key)); cppCode.append(stringCode); } if (parser.isSet(outputFileArg)) { QString outputCpp = CppTemplate.arg(cppCode); QFile outputFile(parser.value(outputFileArg)); if (!outputFile.open(QIODevice::WriteOnly)) { qCritical() << "can not open output file!"; exit(1); } outputFile.write(outputCpp.toUtf8()); outputFile.close(); } if (parser.isSet(gsettingsArg)) { QString outputXml = parser.value(gsettingsArg); writeGSettingXML(settings, parseGSettingsMeta(jsonFile), outputXml); } delete settings; return 0; }