[
  {
    "path": ".github/ISSUE_TEMPLATE/bug-报告.md",
    "content": "---\nname: Bug 报告\nabout: 创建报告以帮助我们改进\ntitle: ''\nlabels: bug\nassignees: ''\n\n---\n\n**描述错误**\n对错误的清晰而简洁的描述。\n\n**重现步骤**\n重现行为的步骤：\n1. 转到“……”\n2. 点击“……”\n3. 向下滚动到“……”\n4. 看到错误\n\n**期望行为**\n对您期望发生的事情的清晰而简洁的描述。\n\n**截图**\n如果适用，请添加截图以帮助解释您的问题。\n\n**QQ 版本列表实用工具（请填写以下信息）：**\n- 版本：（例如 v1.2.2-Release）\n\n**智能手机（请填写以下信息）：**\n - 设备：（例如 Google Pixel 8 Pro）\n - 操作系统：（例如 Android 14）\n\n**其他上下文**\n在这里添加有关问题的任何其他上下文。\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/功能请求.md",
    "content": "---\nname: 功能请求\nabout: 为此项目提出建议\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**您的功能请求是否与问题有关？请描述。**\n对问题的清晰而简洁的描述。例如：我总是感到沮丧，当……\n\n**描述您希望发生的解决方案**\n对您希望发生的事情的清晰而简洁的描述。\n\n**描述您考虑过的替代方案**\n对您考虑过的任何替代解决方案或功能的清晰而简洁的描述。\n\n**其他上下文**\n在这里添加有关功能请求的任何其他上下文或截图。\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "# To get started with Dependabot version updates, you'll need to specify which\n# package ecosystems to update and where the package manifests are located.\n# Please see the documentation for all configuration options:\n# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates\n\nversion: 2\nupdates:\n  - package-ecosystem: gradle\n    directory: /\n    schedule:\n      interval: monthly\n    ignore:\n      # 智谱 AI 开放平台 Java SDK 版本号不是语义版本号 SemVer，会被 Maven 或 GitHub Dependabot 误判，因此需要手动忽略。\n      - dependency-name: cn.bigmodel.openapi:oapi-java-sdk\n      - dependency-name: androidx.core:core-splashscreen\n    groups:\n      maven-dependencies:\n        patterns:\n          - \"*\"\n\n  - package-ecosystem: github-actions\n    directory: /\n    schedule:\n      interval: daily\n    groups:\n      action-dependencies:\n        patterns:\n          - \"*\"\n\n"
  },
  {
    "path": ".github/pull_request_template.md",
    "content": "## 这个 PR 解决了什么问题？\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- [ ] 此 PR 已实现我的所有预期更改，可以被合并。\n- [ ] 我确认此 PR 全部代码仅由本人（或联合作者）编写，代码所有权归本人（或联合作者）所有。\n- [ ] 此 PR 更新日志已提供（或无须提供）。\n- [ ] Readme 文档无须补充（或已补充）。\n\n> 请确认下列选项并打勾。如不认可选项内容或存在需备注内容，请在选项旁随附补充说明。\n\n- [ ] 我认可并确认我贡献的代码将以 [GNU Affero General Public License Version 3](https://github.com/klxiaoniu/QQVersionList/blob/master/LICENSE) 开源许可进行发行。\n- （单项选择）若后续项目决定更改开源许可：\n  - [ ] 请通知我并等待我的决定\n  - [ ] 无需通知，我授权项目所有者自行决定我的贡献的开源许可变更。\n  - [ ] 其他，请补充说明：_______\n"
  },
  {
    "path": ".github/workflows/codeql.yml",
    "content": "# For most projects, this workflow file will not need changing; you simply need\n# to commit it to your repository.\n#\n# You may wish to alter this file to override the set of languages analyzed,\n# or to provide custom queries or build logic.\n#\n# ******** NOTE ********\n# We have attempted to detect the languages in your repository. Please check\n# the `language` matrix defined below to confirm you have the correct set of\n# supported CodeQL languages.\n#\nname: \"CodeQL\"\n\non:\n  push:\n    branches: [ \"master\" ]\n  pull_request:\n    branches: [ \"master\" ]\n  schedule:\n    - cron: '30 1 * * 0'\n\njobs:\n  analyze:\n    name: Analyze\n    # Runner size impacts CodeQL analysis time. To learn more, please see:\n    #   - https://gh.io/recommended-hardware-resources-for-running-codeql\n    #   - https://gh.io/supported-runners-and-hardware-resources\n    #   - https://gh.io/using-larger-runners\n    # Consider using larger runners for possible analysis time improvements.\n    # runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }}\n    runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }}\n    timeout-minutes: ${{ (matrix.language == 'swift' && 120) || 360 }}\n    permissions:\n      actions: read\n      contents: read\n      security-events: write\n\n    strategy:\n      fail-fast: false\n      matrix:\n        language: [ 'java-kotlin' ]\n        # CodeQL supports [ 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'swift' ]\n        # Use only 'java-kotlin' to analyze code written in Java, Kotlin or both\n        # Use only 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both\n        # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support\n\n    if: ${{ github.event_name != 'pull_request' && (github.repository == 'klxiaoniu/QQVersionList' || github.repository == 'ArcticFoxPro/QQVersionList') }}\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v6\n\n      - name: Setup local.properties\n        run: echo \"\" > local.properties\n\n      # 向 app 目录插入 google-services.json，文件内容来自 Secret\n      - name: Insert google-services.json\n        run: |\n          cat <<EOF > app/google-services.json\n          ${{ secrets.GOOGLE_SERVICES }}\n          EOF\n        shell: bash\n\n      - name: Set up JDK\n        uses: actions/setup-java@v5\n        with:\n          java-version: '21'\n          distribution: 'temurin'\n\n      # Initializes the CodeQL tools for scanning.\n      - name: Initialize CodeQL\n        uses: github/codeql-action/init@v4\n        with:\n          languages: ${{ matrix.language }}\n          # If you wish to specify custom queries, you can do so here or in a config file.\n          # By default, queries listed here will override any specified in a config file.\n          # Prefix the list here with \"+\" to use these queries and those in the config file.\n\n          # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs\n          # queries: security-extended,security-and-quality\n\n\n      # Autobuild attempts to build any compiled languages (C/C++, C#, Go, Java, or Swift).\n      # If this step fails, then you should remove it and run the build manually (see below)\n      # - name: Autobuild\n      #   uses: github/codeql-action/autobuild@v3\n\n      # ℹ️ Command-line programs to run using the OS shell.\n      # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun\n\n      #   If the Autobuild fails above, remove it and uncomment the following three lines.\n      #   modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.\n\n      - run: |\n          echo \"Run, Build Application using script\"\n          ./gradlew build\n\n      - name: Perform CodeQL Analysis\n        uses: github/codeql-action/analyze@v4\n        with:\n          category: \"/language:${{matrix.language}}\""
  },
  {
    "path": ".github/workflows/crowdin.yml",
    "content": "name: Crowdin Action\n\non:\n  push:\n    branches: [ master ]\n  schedule:\n    - cron: '0 0 * * *'\n\njobs:\n  synchronize-with-crowdin:\n    runs-on: ubuntu-latest\n\n    if: github.repository == 'klxiaoniu/QQVersionList'\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v6\n\n      - name: crowdin action\n        uses: crowdin/github-action@v2\n        with:\n          upload_sources: true\n          upload_translations: true\n          download_translations: true\n          localization_branch_name: i18n_crowdin_translations\n          create_pull_request: true\n          pull_request_title: 'New Crowdin Translations'\n          pull_request_body: 'New Crowdin translations by [Crowdin GitHub Action](https://github.com/crowdin/github-action)'\n          pull_request_labels: '本地化（I18n）'\n          pull_request_assignees: 'crowdin-bot'\n          pull_request_base_branch_name: 'master'\n          auto_approve_imported: true\n        env:\n          # A classic GitHub Personal Access Token with the 'repo' scope selected (the user should have write access to the repository).\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n          \n          # A numeric ID, found at https://crowdin.com/project/<projectName>/tools/api\n          CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }}\n\n          # Visit https://crowdin.com/settings#api-key to create this token\n          CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/push_ci.yml",
    "content": "name: Android CI\n\non:\n  push:\n    branches: [ \"master\" ]\n    paths-ignore:\n      - '**.md'\n      - '**.txt'\n      - '.github/**'\n      - '.idea/**'\n      - '!.github/workflows/**'\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n\n    if: ${{ !startsWith(github.event.head_commit.message, '[skip ci]') && success() && github.repository == 'klxiaoniu/QQVersionList' }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v6\n        with:\n          fetch-depth: 0\n\n      - name: Setup local.properties\n        run: echo \"\" > local.properties\n\n      # 向 app 目录插入 google-services.json，文件内容来自 Secret\n      - name: Insert google-services.json\n        run: |\n          cat <<EOF > app/google-services.json\n          ${{ secrets.GOOGLE_SERVICES }}\n          EOF\n        shell: bash\n\n      - name: set up JDK 21\n        uses: actions/setup-java@v5\n        with:\n          java-version: '21'\n          distribution: 'temurin'\n          cache: gradle\n\n      - name: Grant execute permission for gradlew\n        run: chmod +x gradlew\n      - name: Build with Gradle\n        run: |\n          echo ${{ secrets.SIGN_KEYSTORE_BASE64 }} | base64 -d > keystore.jks\n          ./gradlew build\n        env:\n          KEYSTORE_PATH: \"../keystore.jks\"\n          KEYSTORE_PASSWORD: ${{ secrets.SIGN_KEYSTORE_PASSWORD }}\n          KEY_ALIAS: ${{ secrets.SIGN_ALIAS }}\n          KEY_PASSWORD: ${{ secrets.SIGN_KEY_PASSWORD }}\n\n      - name: Upload release\n        uses: actions/upload-artifact@v7.0.1\n        with:\n          path: ${{github.workspace}}/app/build/outputs/apk/release/*.apk\n          name: QQVersionList-release-${{ github.event.head_commit.id }}\n          retention-days: 90\n\n      - name: Upload mappings\n        uses: actions/upload-artifact@v7.0.1\n        with:\n          path: ${{github.workspace}}/app/build/outputs/mapping/release/mapping.txt\n          name: QQVersionList-release-${{ github.event.head_commit.id }}-mapping\n          retention-days: 90"
  },
  {
    "path": ".gitignore",
    "content": "*.iml\n.gradle\n/local.properties\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n.cxx\nlocal.properties\n/app/release\n/.idea\n/app/debug\napp/google-services.json\n"
  },
  {
    "path": "DataListShared.md",
    "content": "# QQ 版本列表实用工具个人信息第三方共享清单\n\n1. 本清单仅反映您在全部功能模式下，我们对您的信息与第三方共享的情况。\n2. 为了完成相应的功能，我们会接入来自第三方的应用开发工具包（SDK）来获得技术支持，比如实现云端消息推送和帮助我们统计了解产品用户分布和数据分析，我们可能会向此类合作伙伴提供以下个人信息。我们在不同时期可能会选择使用其中部分合作方或变更合作方，故清单内的合作伙伴可能会进行调整。\n\n## OkHttp3\n\n- **第三方主体名称**：Square\n- **使用场景描述**：网络请求\n- **共享的个人信息类型**：无\n- **使用的系统权限**：网络权限\n- **第三方隐私政策或用户协议或官网链接**：https://square.github.io/okhttp/\n\n## Google Analytics\n\n- **第三方主体名称**：Google LLC\n- **使用场景描述**：统计分析，被 Firebase Cloud Messaging 所绑定\n- **共享的个人信息类型**：移动设备标识符、基于网络地址的地理位置信息、Firebase 安装 ID\n- **使用的系统权限**：网络权限\n- **第三方隐私政策或用户协议或官网链接**：https://www.google.com/analytics/terms/\n\n## Firebase Cloud Messaging\n\n- **第三方主体名称**：Google LLC\n- **使用场景描述**：推送消息通知\n- **共享的个人信息类型**：Firebase 安装 ID\n- **使用的系统权限**：通知权限、网络权限\n- **第三方隐私政策或用户协议或官网链接**：https://firebase.google.com/support/privacy\n\n## Java API for GitHub\n\n- **第三方主体名称**：Kohsuke Kawaguchi\n- **使用场景描述**：请求 GitHub REST API\n- **共享的个人信息类型**：GitHub 个人访问令牌\n- **使用的系统权限**：网络权限\n- **第三方隐私政策或用户协议或官网链接**：https://github.com/hub4j/github-api\n\n## 智谱 AI 开放平台大模型接口 Java SDK\n\n- **第三方主体名称**：北京智谱华章科技有限公司\n- **使用场景描述**：智谱 AI 开放平台大模型接口调用\n- **共享的个人信息类型**：智谱 AI 开放平台 Token\n- **使用的系统权限**：网络权限\n- **第三方隐私政策或用户协议或官网链接**：https://bigmodel.cn/dev/howuse/privacypolicy\n"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU AFFERO GENERAL PUBLIC LICENSE\n                       Version 3, 19 November 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU Affero General Public License is a free, copyleft license for\nsoftware and other kinds of works, specifically designed to ensure\ncooperation with the community in the case of network server software.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nour General Public Licenses are intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  Developers that use our General Public Licenses protect your rights\nwith two steps: (1) assert copyright on the software, and (2) offer\nyou this License which gives you legal permission to copy, distribute\nand/or modify the software.\n\n  A secondary benefit of defending all users' freedom is that\nimprovements made in alternate versions of the program, if they\nreceive widespread use, become available for other developers to\nincorporate.  Many developers of free software are heartened and\nencouraged by the resulting cooperation.  However, in the case of\nsoftware used on network servers, this result may fail to come about.\nThe GNU General Public License permits making a modified version and\nletting the public access it on a server without ever releasing its\nsource code to the public.\n\n  The GNU Affero General Public License is designed specifically to\nensure that, in such cases, the modified source code becomes available\nto the community.  It requires the operator of a network server to\nprovide the source code of the modified version running there to the\nusers of that server.  Therefore, public use of a modified version, on\na publicly accessible server, gives the public access to the source\ncode of the modified version.\n\n  An older license, called the Affero General Public License and\npublished by Affero, was designed to accomplish similar goals.  This is\na different license, not a version of the Affero GPL, but Affero has\nreleased a new version of the Affero GPL which permits relicensing under\nthis license.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU Affero General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Remote Network Interaction; Use with the GNU General Public License.\n\n  Notwithstanding any other provision of this License, if you modify the\nProgram, your modified version must prominently offer all users\ninteracting with it remotely through a computer network (if your version\nsupports such interaction) an opportunity to receive the Corresponding\nSource of your version by providing access to the Corresponding Source\nfrom a network server at no charge, through some standard or customary\nmeans of facilitating copying of software.  This Corresponding Source\nshall include the Corresponding Source for any work covered by version 3\nof the GNU General Public License that is incorporated pursuant to the\nfollowing paragraph.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the work with which it is combined will remain governed by version\n3 of the GNU General Public License.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU Affero General Public License from time to time.  Such new versions\nwill be similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU Affero General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU Affero General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU Affero General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as published\n    by the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If your software can interact with users remotely through a computer\nnetwork, you should also make sure that it provides a way for users to\nget its source.  For example, if your program is a web application, its\ninterface could display a \"Source\" link that leads users to an archive\nof the code.  There are many ways you could offer source, and different\nsolutions will be better for different programs; see section 13 for the\nspecific requirements.\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU AGPL, see\n<https://www.gnu.org/licenses/>."
  },
  {
    "path": "README.md",
    "content": "# QQ 版本列表实用工具 for Android\n\n![QQ 版本列表实用工具 Banner](https://raw.githubusercontent.com/klxiaoniu/QQVersionList/master/QQVerToolBanner.png)\n\n<div align=\"center\">\n\n[![Sourcery](https://img.shields.io/badge/Sourcery-enabled-brightgreen)](https://sourcery.ai)\n\n[注意事项](#注意事项) | [简介](#简介) | [如何使用](#如何使用) | [获取更新](#获取更新) | [常见问题](#常见问题) | [其它](#其它)\n\n[贡献成员](#贡献成员) | [开源相关](#开源相关) | [商业服务鸣谢](#商业服务鸣谢) | [星标趋势](#星标趋势) | [孪生项目](#孪生项目)\n\n</div> \n\n<details>\n\n<summary>关于近期多家国内 Android OEM 系统报毒 QQ 版本列表实用工具的声明</summary>\n\n## 关于近期多家国内 Android OEM 系统报毒 QQ 版本列表实用工具的声明\n\n近期我们发现多家国内 Android OEM 系统（包括但不限于小米 MIUI/HyperOS、荣耀 MagicOS 等）将 QQ 版本列表实用工具列为病毒，特在此发表声明：\n\n### 1. 产品声明与保证\n\nQQ 版本列表实用工具严格遵守中华人民共和国相关法律法规。我们确认，该应用程序的所有代码及其更新版本均未包含任何恶意代码或病毒性质的内容。\n\n### 2. 开源许可证声明\n\nQQ 版本列表实用工具的源代码依据经过开源促进会（[Open Source Initiative](https://opensource.org)）认证的 GNU Affero General Public License Version 3（AGPL v3）协议开放源代码，用户可以依照协议条款自由查看、审计和使用源代码。\n\n### 3. 法律责任\n\n若任何个人或组织因上述误报行为遭受损害，QQ 版本列表实用工具保留依法追究法律责任的权利。\n\n特此声明！\n\n附 VirusTotal 对 QQ 版本列表实用工具 v1.2.2-3b425fc 的扫描结果：https://www.virustotal.com/gui/file/865f30709812664937192d55c64568f7c8df3406f0dda3faf5534e64eef756c2\n\n</details>\n\n<span id=\"注意事项\"></span>\n\n## 注意事项：使用前须知\n\n> [!WARNING]\n> 请确保您在使用前充分审慎阅读了[用户协议](https://github.com/klxiaoniu/QQVersionList/blob/master/UserAgreement.md)。鉴于 QQ 测试版可能存在不可预知的稳定性问题，您在下载及使用该测试版本之前，必须明确并确保自身具备足够的风险识别和承受能力。根据相关条款，您使用本软件时应当已了解并同意，因下载或使用 QQ 测试版而可能产生的任何直接或间接损失、损害以及其他不利后果，均由您自行承担全部责任。\n\n> [!WARNING]\n> QQ 版本列表实用工具为[自由软件](https://www.gnu.org/philosophy/free-sw.html)，其第一方软件本体及源代码仅可在 GitHub 或相关官方平台上免费并自由获取。根据[用户协议](https://github.com/klxiaoniu/QQVersionList/blob/master/UserAgreement.md)，如果您从未经 GitHub 或相关官方平台获取本应用，QQ 版本列表实用工具无法保证该应用能够正常使用，并对因此给您造成的损失不予负责。\n\n> [!WARNING]\n> QQ 版本列表实用工具提供的所有服务及内容均旨在促进合法的学习交流活动，严禁用户将其用于任何非法、违规或侵犯他人权益的目的。敬请所有用户严格遵守相关法律法规，在使用本应用的过程中秉持合法、正当与诚信原则，切勿涉足任何违法用途。如有违反，相关法律责任将由行为人自负，同时，本应用亦保留采取一切必要措施的权利，包括但不限于暂停或终止服务，并追究其法律责任。\n\n> [!WARNING]\n> QQ 版本列表实用工具不面向中国大陆境内公众用户提供服务，因此不会在中国大陆境内进行移动互联网应用程序备案。根据[中华人民共和国《工业和信息化部关于开展移动互联网应用程序备案工作的通知》（工信部信管〔2023〕105号）](https://www.gov.cn/zhengce/zhengceku/202308/content_6897341.htm)，应用程序分发平台不得为未履行备案手续的应用程序提供分发服务。请任何未经 QQ 版本列表实用工具授权而私自上架 QQ 版本列表实用工具的在中华人民共和国境内运营的各软件下载站或应用程序分发平台立即全面下架 QQ 版本列表实用工具。因私自上架 QQ 版本列表实用工具而触犯相关法律法规或产生任何直接或间接损失、损害以及其他不利后果的，均由您自行承担全部责任。\n\n## 简介\n\nQQ 版本列表实用工具 for Android 是一个使用 Material 3 组件库构建，可用于查看 Android QQ 与 Android TIM 版本列表的 Android 软件。QQ 版本列表实用工具用户可以通过本应用了解到 Android QQ 与 Android TIM 版本更新的最新信息。\n\n<span id=\"如何使用\"></span>\n\n## 如何使用？\n\n### 版本列表\n\n在进入 QQ 版本列表实用工具时，您首先会看到一系列显示“x.y.z”“xxx MB”的卡片，这些卡片组成的列表即为 Android QQ 的版本列表[^1]，卡片列表展示了已经或即将发布的 Android QQ 版本。\n\n[^1]: Android QQ 版本信息来源：https://im.qq.com/rainbow/androidQQVersionList\n\n从右向左滑动版本列表，可切换到 TIM 版本列表[^2]和微信版本列表[^3]。\n\n[^2]: Android TIM 版本信息来源：https://im.qq.com/rainbow/TIMDownload\n\n[^3]: Android 微信版本信息来源：https://weixin.qq.com/updates\n\n通过点击卡片右侧箭头按钮，可展开卡片以查阅到更为详尽的信息。\n\n默认情况下，长按卡片文字会弹出展示卡片原始 JSON 字符串的对话框，长按对话框文字可选择复制字符串内容。可在设置中关闭此功能。\n\n### 应用包分析\n\n在 QQ 版本列表实用工具首页，长按顶部“本机 QQ/TIM”卡片即可查看本机 QQ/TIM 的应用包分析。\n\n也可将 QQ/TIM APK 文件通过系统分享至 QQ 版本列表实用工具以查看该 QQ/TIM APK 的应用包分析。\n\n### 实验性功能\n\n> [!IMPORTANT]\n> QQ 版本列表实用工具可能以软件实验形式提供一些尚不稳定的服务，此类服务会明确标注“实验性”（或其的其它语言形式）。您使用此类服务即代表您已明确并确保自身具备足够的风险识别和承受能力。因使用此类实验性服务而可能产生的任何直接或间接损失、损害以及其它不利后果，QQ 版本列表实用工具不承担责任。\n\n在 QQ 版本列表实用工具界面，点击底部锥形瓶按钮即可进入实验性功能对话框。\n\n#### 从腾讯服务器配置拉取微信最新测试版下载直链\n\nAndroid 微信测试版相关信息配置在[腾讯服务器配置文件](https://dldir1v6.qq.com/weixin/android/weixin_android_alpha_config.json)内。可使用 QQ 版本列表实用工具提供的“从腾讯服务器配置拉取微信最新测试版下载直链”功能尝试获取微信最新测试版下载直链。\n\n> [!WARNING]\n> 此功能并非每次请求都能成功获取到 Android 微信测试版下载直链，当无法获取下载直链时可能存在的情况是微信还未发布测试版或测试版已撤包。QQ 版本列表实用工具不对此功能及其任何后果作出任何可靠性保证。请明确并确保自身具备足够的风险识别和承受能力。\n\n#### 从微信输入法测试通道获取微信输入法最新测试版下载直链\n\nAndroid 微信输入法测试版下载直链可由[微信输入法公网测试通道](https://z.weixin.qq.com/android/download?channel=latest)重定向获取。可使用 QQ 版本列表实用工具提供的“从微信输入法测试通道获取微信输入法最新测试版下载直链”功能尝试获取微信输入法最新测试版下载直链。\n\n#### 腾讯应用宝更新获取（实验性）\n\nQQ、TIM、微信、企业微信、微信输入法使用腾讯应用宝（[腾讯应用开放平台](https://app.open.qq.com/)）分发软件最新安装包。可使用 QQ 版本列表实用工具提供的腾讯应用宝更新获取（实验性）获取 QQ、TIM、微信、企业微信、微信输入法最新腾讯应用宝上架版本安装包下载直链。\n\n在 QQ 版本列表实用工具界面，点击底部锥形瓶按钮即可看到“腾讯应用宝更新获取（实验性）”选项，点击即可进入“腾讯应用宝更新获取（实验性）”对话框。之后按提示进行操作即可。\n\n#### TDS 腾讯端服务 Shiply 容器与发布平台更新获取（实验性）\n\n腾讯 QQ 使用 [TDS 腾讯端服务 Shiply 容器与发布平台](https://shiply.tds.qq.com/)，根据 QQ 号（uin）及其终端信息分发小范围灰度测试安装包。当您所使用的 Android QQ 收到官方升级弹窗提醒时，可使用 QQ 版本列表实用工具提供的 TDS 腾讯端服务 Shiply 容器与发布平台更新获取（实验性）尝试获取升级安装包下载直链。\n\n在 QQ 版本列表实用工具界面，点击底部锥形瓶按钮即可看到“TDS 腾讯端服务 Shiply 容器与发布平台更新获取（实验性）”选项，点击即可进入“Shiply 平台更新获取（实验性）”对话框。\n\n对话框含有两个输入框，分别是“uin”和“版本”。请在“uin”输入框填写收到官方升级弹窗提醒的 QQ 号，在“版本”输入框填写收到官方升级弹窗提醒时正在使用的 QQ 版本。\n\n在“进阶配置”中可配置“appid（非必填）”等可选参数。\n\n填写完毕后，点击“开始”，QQ 版本列表实用工具将会尝试根据填写参数构造内容并以此向 Shiply 平台发送 POST 请求。\n\n如果返回内容包含 Android 应用安装包下载直链，QQ 版本列表实用工具将会自动对 Android 应用安装包下载直链进行识别和置顶推荐，点击推荐卡片可进行进一步操作（如下载、分享等），长按推荐卡片即可快捷复制直链。\n\n> [!WARNING]\n> 此功能并非每次请求都能成功获取到 Android QQ 应用安装包下载直链，无法获取 Android QQ 应用安装包下载直链则表示填写的参数不在 Shiply 平台认可与分发范围内。QQ 版本列表实用工具不对此功能及其任何后果作出任何可靠性保证。请明确并确保自身具备足够的风险识别和承受能力。\n\n### 扫版（维护模式）\n\n> [!WARNING]\n> 由于 Android QQ 和 Android TIM 的较新版本越来越倾向于使用包含特征码的下载直链，使得通过枚举法获取到 Android QQ 和 Android TIM 的下载直链变得异常困难。基于此，QQ 版本列表实用工具的扫版功能进入维护模式。\n> \n> #### 扫版进入维护模式意味着什么？\n> \n> - 现行相关功能仍可继续使用；\n> - 不再对相关功能进行积极开发，也不再接受相关新功能请求；\n> - QQ 版本列表实用工具不再对相关功能及其任何后果作出任何可靠性保证。使用时请明确并确保自身具备足够的风险识别和承受能力。\n\n在 Android QQ - 首页侧滑菜单 - 设置 - 关于QQ与帮助 中可得知，Android QQ 的版本号通常为 `x.y.z.nnnnn`。其中 `x.y.z` 在这里被称为“主版本号”，而 `nnnnn` 被称为“小版本号”。\n\n在 QQ 版本列表实用工具界面，点击右下角放大镜图标浮动按钮即可进入“扫版 Extended”对话框。\n\n对话框含有三个输入框，分别是“主版本号”、“扫版类型”和“小版本号”。“主版本号”已经预填入了版本列表显示的最新版本号，也可自行修改。\n\n- 若选择扫正式版，无需填写小版本号，软件将尝试访问以下链接：\n  - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>_64.apk`\n  - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>_64_HB.apk`\n  - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>_64_HB1.apk`\n  - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>_64_HB2.apk`\n  - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>_64_HB3.apk`\n  - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>_64_BBPJ.apk`\n  - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>_HB_64.apk`\n  - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>_HB1_64.apk`\n  - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>_HB2_64.apk`\n  - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>_HB3_64.apk`\n  - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>_BBPJ_64.apk`\n  - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>_64_HD.apk`\n  - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>_64_HD1.apk`\n  - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>_64_HD2.apk`\n  - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>_64_HD3.apk`\n  - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>_HD_64.apk`\n  - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>_HD1_64.apk`\n  - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>_HD2_64.apk`\n  - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>_HD3_64.apk`\n\n- 若选择扫测试版，则需要填写起始小版本号：\n\n  - 默认情况下，软件将尝试访问 `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>.<小版本号>_64.apk` ，若当次访问未果，默认情况下将按照设置逻辑自动递增小版本号后再次尝试访问，直到访问成功为止。\n\n  - 在设置中打开扩展测试版扫版格式后，软件将尝试访问以下链接：\n    <details>\n    <summary>点击展开</summary>\n\n    - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>.<小版本号>_64.apk`\n    - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>.<小版本号>_64_HB.apk`\n    - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>.<小版本号>_64_HB1.apk`\n    - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>.<小版本号>_64_HB2.apk`\n    - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>.<小版本号>_64_HB3.apk`\n    - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>.<小版本号>_HB_64.apk`\n    - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>.<小版本号>_HB1_64.apk`\n    - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>.<小版本号>_HB2_64.apk`\n    - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>.<小版本号>_HB3_64.apk`\n    - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>.<小版本号>_64_HD.apk`\n    - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>.<小版本号>_64_HD1.apk`\n    - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>.<小版本号>_64_HD2.apk`\n    - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>.<小版本号>_64_HD3.apk`\n    - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>.<小版本号>_HD_64.apk`\n    - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>.<小版本号>_HD1_64.apk`\n    - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>.<小版本号>_HD2_64.apk`\n    - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>.<小版本号>_HD3_64.apk`\n    - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>.<小版本号>_64_HD1HB.apk`\n    - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>.<小版本号>_HD1HB_64.apk`\n    - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>.<小版本号>_test.apk`\n    </details>\n\n    若当次访问未果，默认情况下将按照设置逻辑自动递增小版本号后再次尝试访问，直到访问成功为止。\n\n  - 设置自定义扫版后缀后，可以扫描以下直链格式：\n\n    - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号><自定义后缀>.apk`\n    - `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>.<小版本号><自定义后缀>.apk`\n\n- 若选择 TIM 扫版，对应的直链为：\n  - `https://downv6.qq.com/qqweb/QQ_1/android_apk/TIM_<主版本号>.<小版本号><自定义后缀>.apk`\n\n  填入相应输入框内容后，软件将尝试访问上述链接。若当次访问未果，默认情况下将自动递增小版本号后再次尝试访问，直到访问成功为止。\n\n> [!TIP]\n> QQ 版本列表实用工具实验性支持了 Android 微信的扫版。若选择微信扫版，对话框将变更为四个输入框，分别是“主版本号”、“扫版类型”、“真实版本号”和“十六进制代码”，对应的直链为：\n>\n> - `http://dldir1v6.qq.com/weixin/android/weixin<主版本号>android<真实版本号>_<十六进制代码>_arm64.apk`\n> - `http://dldir1v6.qq.com/weixin/android/weixin<主版本号>android<真实版本号>_<十六进制代码>_arm64_1.apk`\n>\n> 填入相应输入框内容后，软件将尝试访问上述链接。若当次访问未果，默认情况下将自动递增十六进制代码后再次尝试访问，直到访问成功为止。\n\n访问成功后，软件会弹出成功对话框，对话框下方提供了一系列动作按钮，依次是“分享”、“下载”、“停止”、“跳过”和“复制”。\n\n> [!WARNING]\n> 微信扫版为 QQ 版本列表实用工具附带的实验性功能，可能存在不可预知的稳定性问题。请明确并确保自身具备足够的风险识别和承受能力。\n\n#### Firebase 服务（实验性）\n\n借助 Google Firebase 云消息传递，QQ 版本列表实用工具 1.4.1 版本实现了检测到版本列表更新后向用户推送系统通知的功能。\n\n在 QQ 版本列表实用工具界面，点击底部锥形瓶按钮即可看到“初始化 Firebase 服务”选项，点击后即可初始化 Firebase 服务。\n\n初始化 Firebase 服务后，将立即在本地由 Firebase SDK 生成注册令牌，并将标识符和配置数据上传到 Firebase 服务器。此操作一经启用即无法撤销。\n\n初始化 Firebase 服务后，点击设置即可看到“版本列表更新时推送系统通知（通过 Firebase 云消息传递）”开关。打开后，QQ 版本列表实用工具首先将申请系统通知权限，之后将与 Google 服务器进行通信，上述步骤完成后即可订阅版本列表更新通知。\n\n> [!IMPORTANT]\n> Firebase 服务依赖于设备 Google Play 服务，设备缺失 Google Play 服务时将无法使用 Firebase 服务。[^4]\n\n[^4]: Firebase Android SDK 对 Google Play 服务的依赖：https://firebase.google.cn/docs/android/android-play-services\n\n> [!IMPORTANT]\n> 订阅版本列表更新通知需和 Google 服务器进行通信，请确保您的设备可以正常连接到 Google 服务器。\n\n> [!WARNING]\n> 在中国大陆发行的 Android 设备可能存在无法接收 Firebase 云消息传递的情况。\n\n> [!WARNING]\n> “通过 Firebase 云消息传递的版本列表更新提醒”为实验性功能，QQ 版本列表实用工具不对此功能的及时性和有效性做出任何可靠性保证。\n\n<span id=\"获取更新\"></span>\n\n## 获取更新\n\n<a href='https://github.com/klxiaoniu/QQVersionList/releases'><img src='https://raw.githubusercontent.com/klxiaoniu/QQVersionList/master/ReadmeAssets/GitHub-Badge.png' width=\"300\" alt=\"Get it on GitHub\"></a>\n\n<a href='https://github.com/klxiaoniu/QQVersionList/blob/master/ReadmeAssets/Get-it-on-Obtainium.md'><img src='https://raw.githubusercontent.com/ImranR98/Obtainium/main/assets/graphics/badge_obtainium.png' width=\"300\" alt=\"Obtanium\"></a>\n\n## 常见问题\n\n### QQ 版本列表实用工具能否实现“检测到新测试版本下载直链自动提醒您”的功能？\n\nQQ 版本列表实用工具不能实现“检测到新测试版本下载直链自动提醒您”的功能，因为这需要自有服务器，并且需要自有服务器去长时间请求腾讯服务器，存在法律和技术风险。\n\n### 设置 - 扫版直链格式设置 里的“其它”是什么？\n\n#### “使用 QQ 8.9.58 测试版直链格式”\n\n腾讯 QQ 团队曾在且目前仅在 QQ 8.9.58 测试 QQNT 技术架构时使用了 `https://downv6.qq.com/qqweb/QQ_1/android_apk/qq_<主版本号>.<小版本号>_64.apk` 直链格式。鉴于此，QQ 版本列表实用工具添加了支持此类非标准但实际存在的直链的选项。\n\n勾选“使用 QQ 8.9.58 测试版直链格式”后，“正式版”“测试版”扫版格式将变更为 `https://downv6.qq.com/qqweb/QQ_1/android_apk/qq_<主版本号><自定义后缀>.apk` 或 `https://downv6.qq.com/qqweb/QQ_1/android_apk/qq_<主版本号>.<小版本号><自定义后缀>.apk`。\n\n#### “扫版类型添加 QQ 9.0.8.14600 空格直链格式”\n\n2023 年 12 月 22 日，腾讯 QQ 官方团队在上传 Android QQ 9.0.8.14600 版本时，不慎将常规链接格式 `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_9.0.8.14600.64_apk` 错误配置为包含 URL 编码空格形式的链接地址 `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android%209.0.8.14600%2064.apk` 。 鉴于此，QQ 版本列表实用工具增设了“空格扫版”扫版模式，该功能在原有的“测试版”扫版模式上将版本号中的 `.` 字符替换为 URL 编码的空格符 `%20`，以适应并支持此类非标准但实际存在的直链。\n\n勾选“扫版类型添加 QQ 9.0.8.14600 空格直链格式”后，QQ 版本列表实用工具将会在扫版类型下拉菜单添加“空格扫版”选项，选中即可使用上述格式。\n\n### 为什么默认添加了 QQ 测试版扫版小版本号必须为 5 的倍数这项限制？\n\n基于对 Android QQ 长期以来的版本号发布规律进行深入观察和分析的结果，我们发现 Android QQ 小版本号更新通常遵循每增加一个有效版本即递增 5 的倍数这一特定模式。为了贴近这一潜在实际规范并确保 QQ 版本列表实用工具的快捷性，QQ 版本列表实用工具依据最佳实践原则，默认设置小版本号和扫版必须为 5 的倍数的限制规则。此限制并非强制，用户可随时进入设置解除此限制。\n\n### 版本列表中已经有新的版本号了，为什么我使用枚举扫版却获取不到下载链接？\n\n即使版本列表已出现了新的版本号，也并不意味着 QQ 团队已经完成了新版本（含测试版）安装包在腾讯公网服务器的部署和发布。一种可能的情况是，QQ 团队正在进行新版本的内部测试阶段或小范围灰度推送阶段，因而尚未对外提供广泛公网下载渠道。\n\n### 为什么不提供 Android 微信的版本列表更新日志？\n\n目前还没有找到来自官方的可靠且请求次数少而信息密度大的 Android 微信版本列表更新日志数据源，因此 QQ 版本列表实用工具无法提供 Android 微信的版本列表更新日志，烦请前往浏览器查看微信官网提供的更新日志。如果您发现了可靠的 Android 微信版本列表更新日志数据源，欢迎提出 Issue(s) 或提交 PR。\n\n## 其它\n\n欢迎[帮助我们完成本地化翻译](https://crowdin.com/project/qqversionstool)！提交翻译则代表您同意您的译文将跟随 QQ 版本列表实用工具项目采用 [GNU Affero General Public License Version 3](/LICENSE) 开源许可。\n\n[![Crowdin](https://badges.crowdin.net/qqversionstool/localized.svg)](https://crowdin.com/project/qqversionstool)\n\n> [!IMPORTANT]\n> QQ 版本列表实用工具始终坚守法律底线，秉持尊重与保护所有用户及第三方合法权益的原则。我们深切认识到任何可能存在的权益侵犯行为都会对权益方造成潜在影响，对此，我们表示由衷歉意，并承诺，一旦接到权益方的权益受到侵犯的通知，我们将立即依法启动核查程序，并在确认侵权事实后，迅速采取有效措施，以最大程度地消除不良影响，恢复并保障权益方的合法权益。敬请相关权益方在发现 QQ 版本列表实用工具存在任何侵权内容时，及时与我们取得联系，我们将竭诚为权益方提供必要的协助与支持。\n\n> [!NOTE]\n> “腾讯”“QQ”“腾讯 QQ”“腾讯 TIM”“微信”“WeChat”“Weixin”“腾讯微信”“企业微信”“WeCom”“微信输入法”“WeType”“应用宝”“腾讯应用宝”“腾讯企点”等是深圳市腾讯计算机系统有限公司和/或其关联公司的商标。本项目对“腾讯”“QQ”“腾讯 QQ”“腾讯 TIM”“微信”“WeChat”“Weixin”“腾讯微信”“企业微信”“WeCom”“微信输入法”“WeType”“应用宝”“腾讯应用宝”“腾讯企点”等的使用旨在注明和指向对应主体，并非表示对“腾讯”“QQ”“腾讯 QQ”“腾讯 TIM”“微信”“WeChat”“Weixin”“腾讯微信”“企业微信”“WeCom”“微信输入法”“WeType”“应用宝”“腾讯应用宝”“腾讯企点”等商标的注册和拥有。\n>\n> Android™ 是 Google LLC 的商标。\n> \n> Unreal® 及其徽标是 Epic Games, Inc. 在美国及其他国家或地区的商标或注册商标。\n\n## 贡献成员\n\n<a href=\"https://github.com/klxiaoniu/QQVersionList/graphs/contributors\">\n  <img src=\"https://contrib.rocks/image?repo=klxiaoniu/QQVersionList\" alt=\"贡献成员\"/>\n</a>\n\n## 开源相关\n\nQQ 版本列表实用工具采用 [GNU Affero General Public License Version 3](https://github.com/klxiaoniu/QQVersionList/blob/master/LICENSE) 开源许可。\n\nQQ 版本列表实用工具的诞生离不开以下开源项目，感谢以下开源项目的作者和贡献者：\n\n- [Material Components for Android（Android Open Source Project）](https://github.com/material-components/material-components-android/)，Licensed under [Apache License Version 2.0](https://github.com/material-components/material-components-android/blob/master/LICENSE)\n- [Android Jetpack（Android Open Source Project）](https://developer.android.com/jetpack)，Licensed under [Apache License Version 2.0](https://github.com/androidx/androidx/blob/androidx-main/LICENSE.txt)\n- [Remix Icon（Remix Design）](https://remixicon.com/)，Licensed under [Apache License Version 2.0](https://remixicon.com/license)\n- [OkHttp（Square）](https://square.github.io/okhttp/)，Licensed under [Apache License Version 2.0](https://github.com/square/okhttp/blob/master/LICENSE.txt)\n- [Kotlin（JetBrains）](https://kotlinlang.org/)，Licensed under [Apache License Version 2.0](https://github.com/JetBrains/kotlin/blob/master/license%2FREADME.md)\n- [Gson（Google）](https://github.com/google/gson/)，Licensed under [Apache License Version 2.0](https://github.com/google/gson/blob/master/LICENSE)\n- [Coil](https://coil-kt.github.io/coil/)，Licensed under [Apache License Version 2.0](https://github.com/coil-kt/coil/blob/main/LICENSE.txt)\n- [Eclipse Temurin™](https://adoptium.net/temurin/)，Licensed under GNU General Public License, version 2 with the Classpath Exception\n- [Oracle JDK](https://www.oracle.com/java/technologies/downloads/)，Licensed under [Oracle No-Fee Terms and Conditions](https://www.java.com/freeuselicense)\n- [JetBrains Runtime](https://github.com/JetBrains/JetBrainsRuntime)，Licensed under [GNU General Public License Version 2](https://github.com/JetBrains/JetBrainsRuntime/blob/main/LICENSE)\n- [Kotlin Serialization](https://github.com/Kotlin/kotlinx.serialization)，Licensed under [Apache License Version 2.0](https://github.com/Kotlin/kotlinx.serialization/blob/master/LICENSE.txt)\n- [Get QQ Update Link（owo233）](https://github.com/callng/GQUL)，Licensed under [The Unlicense](https://github.com/callng/GQUL/blob/master/LICENSE)\n- [Paris（Airbnb）](https://github.com/airbnb/paris)，Licensed under [Apache License Version 2.0](https://github.com/airbnb/paris/blob/master/LICENSE)\n- [Apache Maven™](https://maven.apache.org/)，Licensed under [Apache License Version 2.0](https://github.com/apache/maven/blob/master/LICENSE)\n- [Gradle](https://gradle.org/)，Licensed under [Apache License Version 2.0](https://github.com/gradle/gradle/blob/master/LICENSE)\n- [Material Symbols / Material Icons（Google）](https://fonts.google.com/icons)，Licensed under [Apache License Version 2.0](https://github.com/google/material-design-icons/blob/master/LICENSE)\n- [Obtainium（Imran）](https://github.com/ImranR98/Obtainium)，Licensed under [GNU General Public License Version 3](https://github.com/ImranR98/Obtainium/blob/main/LICENSE.md)\n- [Secrets Gradle Plugin for Android（Google）](https://github.com/google/secrets-gradle-plugin)，Licensed under [Apache License Version 2.0](https://github.com/google/secrets-gradle-plugin/blob/main/LICENSE)\n- [Firebase Android Open Source Development（Google）](https://firebase.google.com/)，Licensed under [Apache License Version 2.0](https://github.com/firebase/firebase-android-sdk/blob/main/LICENSE)\n- [AndroidFastScroll（张海）](https://github.com/zhanghai/AndroidFastScroll)，Licensed under [Apache License Version 2.0](https://github.com/zhanghai/AndroidFastScroll/blob/master/LICENSE)\n- [Kotlin Coroutines on Android](https://github.com/Kotlin/kotlinx.coroutines)，Licensed under [Apache License Version 2.0](https://github.com/Kotlin/kotlinx.coroutines/blob/master/LICENSE.txt)\n- [Google Play services Plugins](https://github.com/google/play-services-plugins)，Licensed under [Apache License Version 2.0](https://github.com/google/play-services-plugins/blob/main/LICENSE)\n- [Apache Commons™](https://commons.apache.org/)，Licensed under [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)\n- [腾讯 Kona 国密套件](https://github.com/Tencent/TencentKonaSMSuite)，Licensed under [GNU General Public License, version 2 with the Classpath Exception](https://github.com/Tencent/TencentKonaSMSuite/blob/master/LICENSE.txt)\n- [斑朵 Boundo（Cliff Liu）](https://github.com/cliuff/boundo)，Licensed under [Apache License Version 2.0](https://github.com/cliuff/boundo/blob/master/LICENSE)\n- [Smali/Baksmali（Google fork of JesusFreke's）](https://github.com/google/smali)\n- [智谱 AI 开放平台大模型接口 Java SDK](https://github.com/MetaGLM/zhipuai-sdk-java-v4)，Licensed under [MIT License](https://github.com/MetaGLM/zhipuai-sdk-java-v4/blob/main/LICENSE)\n- [Jackson Core & Databind（FasterXML）](https://github.com/FasterXML/jackson)，Licensed under Apache License Version 2.0\n- [Java API for GitHub（Kohsuke Kawaguchi）](https://github.com/hub4j/github-api)，Licensed under [MIT License](https://github.com/hub4j/github-api/blob/main/LICENSE.txt)\n- [jsoup: Java HTML Parser](https://jsoup.org/)，Licensed under [MIT License](https://jsoup.org/license)\n- [Pangu.java](https://github.com/vinta/pangu.java)，Licensed under [MIT License](https://github.com/vinta/pangu.java/blob/master/LICENSE)\n- [AboutLibraries（Mike Penz）](https://github.com/mikepenz/AboutLibraries)，Licensed under [Apache License Version 2.0](https://github.com/mikepenz/AboutLibraries/blob/develop/LICENSE)\n\n## 商业服务鸣谢\n\n- 感谢 [Crowdin](https://crowdin.com/) 为本开源项目提供免费的[开源项目计划](https://crowdin.com/page/open-source-project-setup-request)。[Crowdin](https://crowdin.com/) 是面向团队和企业的 AI 驱动本地化软件。使用 600+ 个应用和集成自动翻译您的内容。\n\n## 星标趋势\n\n[![星标趋势](https://starchart.cc/klxiaoniu/QQVersionList.svg?variant=adaptive)](https://starchart.cc/klxiaoniu/QQVersionList)\n\n## 孪生项目\n\n[QQ 版本列表 Vigor for WeChat MiniProgram](https://github.com/ArcticFoxPro/QQVersionListTool-WeChatMiniProgram)，Licensed under [木兰公共许可证, 第2版](https://github.com/ArcticFoxPro/QQVersionListTool-WeChatMiniProgram/blob/main/LICENSE)\n\n[![QQ 版本列表 Vigor Banner](https://raw.githubusercontent.com/ArcticFoxPro/QQVersionListTool-WeChatMiniProgram/main/QQVerLiteBanner.png)](https://github.com/ArcticFoxPro/QQVersionListTool-WeChatMiniProgram)\n"
  },
  {
    "path": "ReadmeAssets/Get-it-on-JiuQi-NotifCenter-WeChatMiniProgram.md",
    "content": "> [!warning]\n> 2024 年 10 月 17 日，九七公司「通知中心」微信小程序改名为「通知侠」重新上线，但因内容安全为由去掉了 GitHub Releases 更新订阅。故此页面内容不再可用。\n\n---\n\n> [!important]\n> 2024 年 8 月 2 日，[九七公司「通知中心」微信小程序被微信公众平台以“无实质服务内容引导跳转”暂停服务](https://mp.weixin.qq.com/s/ITU6H_UjA804srGeE2-FOA)。此页面内容可能在一段时间内不可用。\n\n# 获取更新——基于九七公司「通知中心」微信小程序方案\n\n您可以使用广州九七网络科技有限公司「通知中心」微信小程序来接收 QQ 版本列表实用工具的未来更新。「通知中心」微信小程序可以让您在微信平台上一站式收到三方软件发布新版本的通知。\n\n「通知中心」微信小程序含有微信广告平台提供的广告。\n\n## 快速订阅\n\n复制下方链接，在微信任意会话窗口（如文件传输助手）中发送后点击打开：\n\n```\n#小程序://通知中心/ZVsvPVMyrGbTwkf\n```\n\n之后点击订阅，并按照提示完成后续步骤即可。\n\n## 手动订阅\n\n1. 微信搜一搜「通知中心」，在搜索结果中找到小程序认证主体为广州九七网络科技有限公司的「通知中心」小程序，点击进入。\n2. 在小程序首页找到 软件开发-GitHub Release，输入：\n    ```\n    https://github.com/klxiaoniu/QQVersionList/\n    ```\n3. 点击添加按钮，并按照提示完成后续步骤即可。\n"
  },
  {
    "path": "ReadmeAssets/Get-it-on-Obtainium.md",
    "content": "# 获取更新——基于 [Obtainium](https://github.com/ImranR98/Obtainium) 方案\n\n您可以使用开源软件 [Obtainium](https://github.com/ImranR98/Obtainium) 来接收 QQ 版本列表实用工具的未来更新。Obtainium 可以让您从一个 APP 内直接从其他 APP 的发布源获取安装包和更新应用程序，并在发布新版本时收到通知。\n\n## 一键导入\n\n若您的 Android 设备已安装 Obtainium，点击下方图片即可快速导入 QQ 版本列表实用工具的 Obtainium 配置。\n\n<a href='http://apps.obtainium.imranr.dev/redirect.html?r=obtainium://app/%7B%22id%22:%22com.xiaoniu.qqversionlist%22,%22url%22:%22https://github.com/klxiaoniu/QQVersionList%22,%22author%22:%22%E5%BF%AB%E4%B9%90%E5%B0%8F%E7%89%9B%E3%80%81%E6%9C%89%E9%B2%AB%E9%9B%AA%E7%8B%90%22,%22name%22:%22QQ%20%E7%89%88%E6%9C%AC%E5%88%97%E8%A1%A8%E5%AE%9E%E7%94%A8%E5%B7%A5%E5%85%B7%22,%22preferredApkIndex%22:0,%22additionalSettings%22:%22%7B%5C%22includePrereleases%5C%22:false,%5C%22appName%5C%22:%5C%22QQ%20%E7%89%88%E6%9C%AC%E5%88%97%E8%A1%A8%E5%AE%9E%E7%94%A8%E5%B7%A5%E5%85%B7%5C%22,%5C%22versionExtractionRegEx%5C%22:%5C%22(?%3C=v)(.*)%5C%22,%5C%22matchGroupToUse%5C%22:%5C%22$0-Release%5C%22%7D%22%7D'><img src='https://raw.githubusercontent.com/ImranR98/Obtainium/main/assets/graphics/badge_obtainium.png' width=\"300\" alt=\"Obtanium\"></a>\n\n## 手动导入\n\n下载安装并打开 Obtainium，点击底部导航栏“添加应用”，在“来源 URL”中输入：\n\n```\nhttps://github.com/klxiaoniu/QQVersionList/\n```\n\n然后在下方“提取版本号的正则表达式”内填入：\n\n```\n(?<=v)(.*)\n```\n\n“从上述匹配结果中引用的捕获组”填入：\n\n```\n$0-Release\n```\n\n填入完成后，点击“添加”按钮即可。"
  },
  {
    "path": "SECURITY.md",
    "content": "## 上报漏洞 Reporting a Vulnerability\n\n如果您发现了关于此项目的任何漏洞，请不要公开，请在[此处](https://github.com/klxiaoniu/QQVersionList/security)向我们私下报告漏洞。\n\nIf you discover any vulnerabilities regarding this project, please do not make them public and report them to us privately at [here](https://github.com/klxiaoniu/QQVersionList/security)."
  },
  {
    "path": "UserAgreement.md",
    "content": "# QQ 版本列表实用工具用户协议\n\n> 此用户协议于 2024 年 10 月 28 日修订，并于 2024 年 10 月 29 日实施。\n\n## 导言\n\n欢迎您使用 QQ 版本列表实用工具。\n\n为使用 QQ 版本列表实用工具及服务，您应当阅读并遵守《QQ 版本列表实用工具用户协议》（以下简称“本协议”）。请您务必审慎阅读，充分理解各条款内容，特别是免除或者限制责任的条款，以及开通或使用某项服务的单独协议，并选择接受或不接受。限制、免责条款可能以加粗形式提示您注意。\n\n除非您已阅读并接受本协议所有条款，否则您无权获取和使用 QQ 版本列表实用工具及相关服务。您的任何使用本应用行为即视为您已阅读并同意上述协议的约束。如果您未满 18 周岁，请在法定监护人的陪同下阅读本协议及其它上述协议，并特别注意未成年人使用条款。\n\n## 一、协议的范围\n\n本协议是您与 QQ 版本列表实用工具之间关于您下载，安装，使用，复制 QQ 版本列表实用工具，以及使用 QQ 版本列表实用工具相关服务所订立的协议。\n\n## 二、关于 QQ 版本列表实用工具提供的服务\n\nQQ 版本列表实用工具提供的服务是指提供 Android QQ 和 Android TIM 版本列表的查看和对腾讯服务器提供的 Android QQ 及其它可能存在的腾讯软件产品的下载链接的枚举法扫描。QQ 版本列表实用工具用户可以通过本应用及时获取到 Android QQ 及其它可能存在的腾讯软件产品的版本更新的最新信息。\n\nQQ 版本列表实用工具不面向中国大陆境内公众用户提供服务。请确认您并非中国大陆公民。\n\n此外，QQ 版本列表实用工具可能以软件实验形式提供一些尚不稳定的服务，您在使用此类服务时，必须明确并确保自身具备足够的风险识别和承受能力。\n\n## 三、软件的获取\n\n您可以直接从 GitHub 平台获取 QQ 版本列表实用工具本体及其附带开源许可和知识产权相关文本的源代码。获取应用后，您需要按照该应用提示的步骤正确使用。\n\n如果您从未经 GitHub 或相关官方平台获取本应用，QQ 版本列表实用工具无法保证该应用能够正常使用，并对因此给您造成的损失不予负责。\n\n如果您不再需要使用 QQ 版本列表实用工具，可以不再打开应用使用或卸载应用。\n\n## 四、软件的更新\n\n为了改善用户体验，完善服务内容，QQ 版本列表实用工具将不断努力开发新的服务，并为您不时提供软件更新（这些更新可能会采取软件替换，修改，功能强化，版本升级等形式）。\n\n为了保证 QQ 版本列表实用工具及服务的安全性和功能的一致性，QQ 版本列表实用工具有权不向您特别通知而对软件进行更新，或者对软件的部分功能效果进行改变或限制。\n\nQQ 版本列表实用工具新版本发布后，旧版本的软件可能无法使用，QQ 版本列表实用工具不保证旧版 QQ 版本列表实用工具及相应的服务继续可用，请您随时核对并获取最新版本。\n\n## 五、用户个人信息保护\n\n保护用户个人信息是 QQ 版本列表实用工具的一项基本原则，QQ 版本列表实用工具本身不会主动获取和存储您的个人信息。\n\n但在您使用过程中，可能会因网络通信的必要性而被软件本体或腾讯服务器自动获取您的 IP 地址等网络相关信息，我们将严格遵守法律法规的规定，并采取适当措施保护您的网络信息安全。\n\n若您启用 QQ 版本列表实用工具中的 Firebase 服务时，Firebase SDK 将立即在本地生成注册令牌，并上传您的移动设备标识符、基于网络地址的地理位置信息、Firebase 安装 ID。此操作一经启用即无法撤销。\n\nQQ 版本列表实用工具可能以软件实验形式提供一些尚不稳定的服务，用户在使用此类实验性服务时可能需要用户手动填写个人信息。QQ 版本列表实用工具承诺不会获取和存储您填写的任何个人信息。\n\nQQ 版本列表实用工具非常重视对未成年人个人信息的保护。若您是 18 周岁（不含）以下的未成年人，在使用 QQ 版本列表实用工具的服务前，应事先取得您的法定监护人的书面同意。\n\n## 六、主权力义务条款\n\n您理解并同意，为了向您提供有效的服务，您在此许可 QQ 版本列表实用工具利用您移动通讯终端设备的处理器和宽带等资源。QQ 版本列表实用工具使用过程中可能产生的数据流量的费用，您需自行向运营商了解相关资费信息。\n\nQQ 版本列表实用工具可能以软件实验形式提供一些尚不稳定的服务，此类服务会明确标注“实验性”（或其的其它语言形式）。您使用此类服务即代表您已明确并确保自身具备足够的风险识别和承受能力。\n\n## 七、用户行为规范\n\n您充分了解并同意使用本应用服务时须遵守法律法规，不得利用 QQ 版本列表实用工具从事违法违规行为，包括但不限于：\n\n1. 发布、传送、传播、储存危害国家安全统一、破坏社会稳定、违反公序良俗、侮辱、诽谤、淫秽、暴力以及任何违反国家法律法规的内容；\n2. 发布、传送、传播、储存侵害他人知识产权、商业秘密等合法权利的内容；\n3. 恶意虚构事实、隐瞒真相以误导、欺骗他人；\n4. 发布、传送、传播广告信息及垃圾信息；\n5. 将 QQ 版本列表实用工具用于任何未经许可的商业目的，包括但不限于以营利为目的推广、销售产品或服务；\n6. 其它法律法规禁止的行为。\n\n如果用户违反了本条约定，相关国家机关、机构、公司或个人等实体可能会对用户提起诉讼、罚款或采取其它制裁措施，并要求 QQ 版本列表实用工具给予协助。造成损害的，用户应依法予以赔偿，QQ 版本列表实用工具不承担任何责任。\n\n如果 QQ 版本列表实用工具发现或收到他人举报您发布的信息违反本条约定，QQ 版本列表实用工具有权进行独立判断并采取技术手段予以删除、屏蔽或断开链接。同时，QQ 版本列表实用工具有权视用户行为性质采取包括但不限于暂停或终止服务，限制、冻结或终止 QQ 版本列表实用工具使用，追究法律责任等措施。\n\n用户违反本条约定，导致任何第三方损害的，用户应当独立承担责任；QQ 版本列表实用工具因此遭受损失的，用户也应当一并赔偿。\n\n## 八、软件使用规范\n\n除非法律允许或 QQ 版本列表实用工具的书面许可，您使用 QQ 版本列表实用工具过程中不得删除 QQ 版本列表实用工具及其副本上关于知识产权和开放源代码许可的信息。\n\n## 九、免责条款\n\n您充分了解并同意：\n\nQQ 版本列表实用工具仅为用户提供 Android QQ 和 Android TIM 版本信息展示和上述产品及其它可能存在的腾讯软件产品的官方版本获取服务，所有下载链接均来源于腾讯官方服务器。对于链接的有效性、可用性以及任何由腾讯官方服务器产生或导致的任何问题，QQ 版本列表实用工具不承担责任。\n\n鉴于 QQ、TIM 和其它任意腾讯软件产品的测试版本可能存在不可预知的稳定性问题，您在下载及使用任何腾讯软件产品的任何测试版本即代表您已明确并确保自身具备足够的风险识别和承受能力。您明确并同意其使用任何腾讯软件产品的任何测试版本所存在的风险将完全由其本人和/或其法定责任主体承担，QQ 版本列表实用工具对此不承担任何责任。\n\nQQ 版本列表实用工具可能以软件实验形式提供一些尚不稳定的服务，此类服务会明确标注“实验性”（或其的其它语言形式）。您使用此类服务即代表您已明确并确保自身具备足够的风险识别和承受能力。因使用此类实验性服务而可能产生的任何直接或间接损失、损害以及其它不利后果，QQ 版本列表实用工具不承担责任。\n\n除 QQ 版本列表实用工具注明之用户协议外，其它因不当使用本应用而导致的任何意外、疏忽、合约毁坏、诽谤、版权或其它知识产权侵犯及其所造成的任何损失，QQ 版本列表实用工具概不负责，亦不承担任何法律责任。\n\n对于因不可抗力或因黑客攻击、通讯线路中断等 QQ 版本列表实用工具不能控制的原因造成的网络服务中断或其它缺陷，导致用户不能正常使用本应用，QQ 版本列表实用工具不承担任何责任，但将尽力减少因此给用户造成的损失或影响。\n\n本协议未涉及的问题请参见中华人民共和国相关适用法律法规，当本协议与中华人民共和国相关适用法律法规冲突时，以中华人民共和国相关适用法律法规为准。本条所述之免责条款并不影响用户根据适用法律享有的法定权利。\n\n## 十、其它\n\n您使用 QQ 版本列表实用工具即视为您已阅读并同意接受 QQ 版本列表实用工具协议的约束。QQ 版本列表实用工具有权在必要时修改本协议条款。如果您不接受修改后的条款，应当停止使用 QQ 版本列表实用工具。\n\nQQ 版本列表实用工具有权随时修改本协议，并将在应用内显著位置弹窗通知用户。修订后的协议自公布之日起在一定期限后生效，请用户定期查看相关公告，继续使用本应用即视为同意接受修订后的协议。\n\nQQ 版本列表实用工具基于 GNU Affero General Public License Version 3 许可开放源代码。\n\n本应用与深圳市腾讯计算机系统有限公司和/或其关联公司无关。\n\n“腾讯”“QQ”“腾讯 QQ”“腾讯 TIM”“微信”“WeChat”“Weixin”“腾讯微信”“企业微信”“WeCom”“微信输入法”“WeType”“应用宝”“腾讯应用宝”等是深圳市腾讯计算机系统有限公司和/或其关联公司的商标。本项目对“腾讯”“QQ”“腾讯 QQ”“腾讯 TIM”“微信”“WeChat”“Weixin”“腾讯微信”“企业微信”“WeCom”“微信输入法”“WeType”“应用宝”“腾讯应用宝”等的使用旨在注明和指向对应主体，并非表示对“腾讯”“QQ”“腾讯 QQ”“腾讯 TIM”“微信”“WeChat”“Weixin”“腾讯微信”“企业微信”“WeCom”“微信输入法”“WeType”“应用宝”“腾讯应用宝”等商标的注册和拥有。\n\nAndroid™ 是 Google LLC 的商标。\n\nGITHUB® 是 GitHub, Inc. 在美国和其他国家或地区的商标或注册商标。\n\nUnreal® 及其徽标是 Epic Games, Inc. 在美国及其它国家或地区的商标或注册商标。\n\n本协议的签订地是中华人民共和国福建省福州市。\n\n本协议适用中华人民共和国相关适用法律法规。如果双方发生纠纷，应友好协商解决；如协商不成，您同意将纠纷提交给签订地具有管辖权的法院提起诉讼。\n\n本协议中的某些条款因故无法适用，则本协议的其它条款继续适用且无法适用的条款将会被修改，以便其能够依法适用。\n\n本协议是您和 QQ 版本列表实用工具之间关于本产品相关事项的最终的、完整的、排他的协议，且取代和合并之前当事人关于此类事项（包括任何形式的最终用户许可、开放源代码许可、服务条款和隐私政策）的讨论和协议。\n\n每部分的标题只为阅读之便而无任何法律或合同义务。\n\n本协议可能存在多种语言版本。各语言版本之间如有不一致之处，以中文版本为准。\n\n除非我们书面同意，您不得转让本协议所规定的权利义务。任何违反上述规定企图转让的行为均无效。在法律许可的范围内，QQ 版本列表实用工具对本协议享有最终解释权。\n\nQQ 版本列表实用工具\n\n2024 年 10 月 28 日\n"
  },
  {
    "path": "app/.gitignore",
    "content": "/build"
  },
  {
    "path": "app/build.gradle.kts",
    "content": "import org.jetbrains.kotlin.gradle.dsl.JvmTarget\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n\r\n/*\r\n    Qverbow Util\r\n    Copyright (C) 2023 klxiaoniu\r\n\r\n    This program is free software: you can redistribute it and/or modify\r\n    it under the terms of the GNU Affero General Public License as\r\n    published by the Free Software Foundation, either version 3 of the\r\n    License, or (at your option) any later version.\r\n\r\n    This program is distributed in the hope that it will be useful,\r\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n    GNU Affero General Public License for more details.\r\n\r\n    You should have received a copy of the GNU Affero General Public License\r\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\r\n*/\r\n\r\nplugins {\r\n    alias(libs.plugins.android.application)\r\n    alias(libs.plugins.kotlin.android)\r\n    id(\"com.google.android.libraries.mapsplatform.secrets-gradle-plugin\")\r\n    id(\"com.google.gms.google-services\")\r\n    kotlin(\"plugin.serialization\") version \"2.2.10\"\r\n    alias(libs.plugins.compose.compiler)\r\n    alias(libs.plugins.aboutlibraries)\r\n}\r\n\r\nprivate fun gitCommitHash(project: Project): String {\r\n    return project.providers.exec {\r\n        commandLine(\"git rev-parse --verify --short HEAD\".split(\" \"))\r\n    }.standardOutput.asText.get().trim()\r\n}\r\n\r\nprivate fun gitCommitCount(project: Project): Int {\r\n    return project.providers.exec {\r\n        commandLine(\"git rev-list HEAD --count\".split(\" \"))\r\n    }.standardOutput.asText.get().trim().toInt()\r\n}\r\n\r\nval gitCommitCount = gitCommitCount(project)\r\nval gitCommitHash = gitCommitHash(project)\r\n\r\nandroid {\r\n    namespace = \"com.xiaoniu.qqversionlist\"\r\n    compileSdk = 36\r\n\r\n    defaultConfig {\r\n        applicationId = \"com.xiaoniu.qqversionlist\"\r\n        minSdk = 24\r\n        targetSdk = 36\r\n        versionCode = gitCommitCount\r\n        versionName = \"1.5.3-$gitCommitHash\"\r\n        testInstrumentationRunner = \"androidx.test.runner.AndroidJUnitRunner\"\r\n        externalNativeBuild {\r\n            cmake {\r\n                arguments += listOf(\"-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON\")\r\n            }\r\n        }\r\n    }\r\n\r\n    signingConfigs {\r\n        System.getenv(\"KEYSTORE_PATH\")?.let {\r\n            create(\"release\") {\r\n                storeFile = file(it)\r\n                storePassword = System.getenv(\"KEYSTORE_PASSWORD\")\r\n                keyAlias = System.getenv(\"KEY_ALIAS\")\r\n                keyPassword = System.getenv(\"KEY_PASSWORD\")\r\n            }\r\n        }\r\n    }\r\n\r\n    buildTypes {\r\n        release {\r\n            isMinifyEnabled = true\r\n            proguardFiles(\r\n                getDefaultProguardFile(\"proguard-android-optimize.txt\"), \"proguard-rules.pro\"\r\n            )\r\n            signingConfig =\r\n                signingConfigs.findByName(\"release\") ?: signingConfigs.findByName(\"debug\")\r\n            signingConfig?.enableV2Signing = true\r\n            signingConfig?.enableV3Signing = true\r\n            signingConfig?.enableV4Signing = true\r\n        }\r\n    }\r\n\r\n    compileOptions {\r\n        sourceCompatibility = JavaVersion.VERSION_21\r\n        targetCompatibility = JavaVersion.VERSION_21\r\n    }\r\n\r\n    buildFeatures {\r\n        viewBinding = true\r\n        buildConfig = true\r\n        compose = true\r\n    }\r\n}\r\n\r\nkotlin {\r\n    compilerOptions {\r\n        jvmTarget = JvmTarget.JVM_21\r\n    }\r\n}\r\n\r\naboutLibraries {\r\n    license.mapLicensesToSpdx = false\r\n}\r\n\r\ndependencies {\r\n    implementation(libs.aboutlibraries.core)\r\n    implementation(libs.androidx.activity)\r\n    implementation(libs.androidx.activity.compose)\r\n    implementation(libs.androidx.activity.ktx)\r\n    implementation(libs.androidx.appcompat)\r\n    implementation(libs.androidx.biometric)\r\n    implementation(libs.androidx.browser)\r\n    implementation(platform(libs.androidx.compose.bom))\r\n    implementation(libs.androidx.constraintlayout)\r\n    implementation(libs.androidx.core.ktx)\r\n    implementation(libs.androidx.core.splashscreen)\r\n    implementation(libs.androidx.datastore.preferences)\r\n    implementation(libs.androidx.fragment.ktx)\r\n    implementation(libs.androidx.lifecycle.livedata.ktx)\r\n    implementation(libs.androidx.lifecycle.runtime.ktx)\r\n    implementation(libs.androidx.lifecycle.viewmodel.compose)\r\n    implementation(libs.androidx.lifecycle.viewmodel.ktx)\r\n    implementation(libs.androidx.material3)\r\n    implementation(libs.androidx.material3.window.sizeclass)\r\n    implementation(libs.androidx.recyclerview)\r\n    implementation(libs.androidx.runtime.livedata)\r\n    implementation(libs.androidx.ui)\r\n    implementation(libs.androidx.ui.graphics)\r\n    implementation(libs.androidx.ui.tooling.preview)\r\n    implementation(libs.androidx.viewpager2)\r\n    implementation(libs.coil)\r\n    implementation(libs.coil.network.okhttp)\r\n    implementation(libs.commons.compress)\r\n    implementation(libs.commons.io)\r\n    implementation(libs.firebase.analytics)\r\n    implementation(libs.firebase.messaging)\r\n    implementation(platform(libs.firebase.bom))\r\n    implementation(libs.github.api)\r\n    implementation(libs.gson)\r\n    implementation(libs.jsoup)\r\n    implementation(libs.kona.crypto)\r\n    implementation(libs.kona.provider)\r\n    implementation(libs.kotlinx.coroutines.android)\r\n    implementation(libs.kotlinx.serialization.json)\r\n    implementation(libs.library)\r\n    implementation(libs.material)\r\n    implementation(libs.maven.artifact)\r\n    implementation(libs.oapi.java.sdk)\r\n    implementation(libs.okhttp)\r\n    implementation(libs.pangu)\r\n    implementation(libs.paris)\r\n    implementation(libs.smali.dexlib2)\r\n    testImplementation(libs.junit)\r\n    androidTestImplementation(platform(libs.androidx.compose.bom))\r\n    androidTestImplementation(libs.androidx.espresso.core)\r\n    androidTestImplementation(libs.androidx.junit)\r\n    androidTestImplementation(libs.androidx.ui.test.junit4)\r\n    debugImplementation(libs.androidx.ui.tooling)\r\n    debugImplementation(libs.androidx.ui.test.manifest)\r\n}\r\n"
  },
  {
    "path": "app/proguard-rules.pro",
    "content": "#    Qverbow Util\r\n#    Copyright (C) 2023 klxiaoniu\r\n#\r\n#    This program is free software: you can redistribute it and/or modify\r\n#    it under the terms of the GNU Affero General Public License as\r\n#    published by the Free Software Foundation, either version 3 of the\r\n#    License, or (at your option) any later version.\r\n#\r\n#    This program is distributed in the hope that it will be useful,\r\n#    but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n#    GNU Affero General Public License for more details.\r\n#\r\n#    You should have received a copy of the GNU Affero General Public License\r\n#    along with this program.  If not, see <https://www.gnu.org/licenses/>.\r\n\r\n-keep class com.xiaoniu.qqversionlist.data.** { *; }\r\n-keep class com.tencent.kona.crypto.provider.* { *; }\r\n-keep class com.fasterxml.jackson.core.type.TypeReference { *; }\r\n-keep class com.zhipu.oapi.service.v4.api.* { *; }\r\n-keep class com.zhipu.oapi.service.v4.model.* { *; }\r\n-keep class io.reactivex.Single { *; }\r\n-keep class org.kohsuke.github.* { *; }\r\n\r\n-dontwarn com.sun.tools.javac.processing.JavacFiler\r\n-dontwarn com.sun.tools.javac.processing.JavacProcessingEnvironment\r\n-dontwarn com.sun.tools.javac.util.Context\r\n-dontwarn com.sun.tools.javac.util.Options\r\n-dontwarn java.beans.ConstructorProperties\r\n-dontwarn java.beans.Transient\r\n-dontwarn javax.lang.model.SourceVersion\r\n-dontwarn javax.lang.model.element.AnnotationMirror\r\n-dontwarn javax.lang.model.element.Element\r\n-dontwarn javax.lang.model.element.ExecutableElement\r\n-dontwarn javax.tools.Diagnostic$Kind\r\n-dontwarn javax.tools.JavaFileManager$Location\r\n-dontwarn javax.tools.JavaFileManager\r\n-dontwarn javax.tools.StandardLocation\r\n-dontwarn lombok.**\r\n-dontwarn org.apache.tools.ant.BuildException\r\n-dontwarn org.apache.tools.ant.Location\r\n-dontwarn org.apache.tools.ant.Project\r\n-dontwarn org.apache.tools.ant.Task\r\n-dontwarn org.apache.tools.ant.types.FileSet\r\n-dontwarn org.apache.tools.ant.types.Path\r\n-dontwarn org.apache.tools.ant.types.Reference\r\n-dontwarn org.apache.tools.ant.types.ResourceCollection\r\n-dontwarn org.eclipse.**\r\n-dontwarn org.osgi.framework.Bundle\r\n-dontwarn org.osgi.framework.BundleContext\r\n-dontwarn com.infradna.tool.bridge_method_injector.BridgeMethodsAdded\r\n-dontwarn com.infradna.tool.bridge_method_injector.WithBridgeMethods\r\n-dontwarn edu.umd.cs.findbugs.annotations.NonNull\r\n-dontwarn edu.umd.cs.findbugs.annotations.SuppressFBWarnings\r\n-dontwarn okhttp3.internal.annotations.EverythingIsNonNull\r\n-dontwarn edu.umd.cs.findbugs.annotations.CheckForNull"
  },
  {
    "path": "app/src/androidTest/java/com/xiaoniu/qqversionlist/ExampleInstrumentedTest.kt",
    "content": "package com.xiaoniu.qqversionlist\r\n\r\nimport androidx.test.ext.junit.runners.AndroidJUnit4\r\nimport androidx.test.platform.app.InstrumentationRegistry\r\nimport org.junit.Assert.*\r\nimport org.junit.Test\r\nimport org.junit.runner.RunWith\r\n\r\n/**\r\n * Instrumented test, which will execute on an Android device.\r\n *\r\n * See [testing documentation](http://d.android.com/tools/testing).\r\n */\r\n@RunWith(AndroidJUnit4::class)\r\nclass ExampleInstrumentedTest {\r\n    @Test\r\n    fun useAppContext() {\r\n        // Context of the app under test.\r\n        val appContext = InstrumentationRegistry.getInstrumentation().targetContext\r\n        assertEquals(\"com.xiaoniu.qqversionlist\", appContext.packageName)\r\n    }\r\n}"
  },
  {
    "path": "app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n    xmlns:tools=\"http://schemas.android.com/tools\">\r\n\r\n    <uses-permission android:name=\"android.permission.INTERNET\" />\r\n    <uses-permission android:name=\"android.permission.VIBRATE\" />\r\n    <uses-permission android:name=\"android.permission.POST_NOTIFICATIONS\" />\r\n\r\n    <queries>\r\n        <package android:name=\"com.tencent.mobileqq\" />\r\n        <package android:name=\"com.tencent.tim\" />\r\n        <package android:name=\"com.tencent.mm\" />\r\n    </queries>\r\n\r\n    <application\r\n        android:name=\".QverbowApplication\"\r\n        android:allowBackup=\"true\"\r\n        android:dataExtractionRules=\"@xml/data_extraction_rules\"\r\n        android:enableOnBackInvokedCallback=\"true\"\r\n        android:fullBackupContent=\"@xml/backup_rules\"\r\n        android:hardwareAccelerated=\"true\"\r\n        android:icon=\"@mipmap/ic_launcher\"\r\n        android:label=\"@string/app_name\"\r\n        android:largeHeap=\"true\"\r\n        android:roundIcon=\"@mipmap/ic_launcher_round\"\r\n        android:supportsRtl=\"true\"\r\n        android:theme=\"@style/Theme.QQVersionList\"\r\n        android:usesCleartextTraffic=\"true\"\r\n        tools:targetApi=\"35\">\r\n        <activity\r\n            android:name=\".ui.OSSLicensesActivity\"\r\n            android:exported=\"false\"\r\n            android:label=\"@string/openSourceLicenseTitle\"\r\n            android:theme=\"@style/Theme.QQVersionList\" />\r\n        <activity\r\n            android:name=\".ui.OSSLicensesMenuActivity\"\r\n            android:exported=\"false\"\r\n            android:label=\"@string/openSourceLicenseTitle\"\r\n            android:theme=\"@style/Theme.QQVersionList\" />\r\n        <activity\r\n            android:name=\".ui.MainActivity\"\r\n            android:configChanges=\"orientation|screenSize|screenLayout\"\r\n            android:exported=\"true\"\r\n            android:windowSoftInputMode=\"adjustNothing\">\r\n            <intent-filter>\r\n                <action android:name=\"android.intent.action.MAIN\" />\r\n\r\n                <category android:name=\"android.intent.category.LAUNCHER\" />\r\n            </intent-filter>\r\n\r\n            <meta-data\r\n                android:name=\"android.app.shortcuts\"\r\n                android:resource=\"@xml/shortcuts\" />\r\n        </activity>\r\n        <activity\r\n            android:name=\".ui.LocalAppDetailsActivity\"\r\n            android:exported=\"true\">\r\n            <intent-filter>\r\n                <action android:name=\"android.intent.action.VIEW\" />\r\n\r\n                <category android:name=\"android.intent.category.DEFAULT\" />\r\n                <category android:name=\"android.intent.category.BROWSABLE\" />\r\n\r\n                <data android:mimeType=\"application/vnd.android.package-archive\" />\r\n                <data android:scheme=\"file\" />\r\n            </intent-filter>\r\n            <intent-filter>\r\n                <action android:name=\"android.intent.action.SEND\" />\r\n\r\n                <category android:name=\"android.intent.category.DEFAULT\" />\r\n\r\n                <data android:mimeType=\"application/vnd.android.package-archive\" />\r\n            </intent-filter>\r\n        </activity>\r\n        <!--\r\n Set custom default icon. This is used when no icon is set for incoming notification messages.\r\n             See README(https://goo.gl/l4GJaQ) for more.\r\n        -->\r\n        <meta-data\r\n            android:name=\"com.google.firebase.messaging.default_notification_icon\"\r\n            android:resource=\"@drawable/qv_logo_notification\" />\r\n        <meta-data\r\n            android:name=\"firebase_messaging_auto_init_enabled\"\r\n            android:value=\"false\" />\r\n        <meta-data\r\n            android:name=\"firebase_analytics_collection_enabled\"\r\n            android:value=\"false\" />\r\n        <meta-data\r\n            android:name=\"com.google.firebase.messaging.default_notification_channel_id\"\r\n            android:value=\"@string/rainbow_notification_channel_id\" />\r\n\r\n        <service\r\n            android:name=\".service.FirebaseMessagingService\"\r\n            android:exported=\"false\">\r\n            <intent-filter>\r\n                <action android:name=\"com.google.firebase.MESSAGING_EVENT\" />\r\n            </intent-filter>\r\n        </service>\r\n    </application>\r\n\r\n</manifest>"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/QverbowApplication.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist\n\nimport android.app.Application\nimport com.google.android.material.color.DynamicColors\nimport com.tencent.kona.crypto.KonaCryptoProvider\nimport java.security.Security\n\nclass QverbowApplication : Application() {\n    companion object {\n        lateinit var instance: QverbowApplication\n\n        const val SHIPLY_DEFAULT_APPID = \"537230561\"\n        const val SHIPLY_DEFAULT_SDK_VERSION = \"1.3.36-RC03\"\n        const val SHIPLY_APPID_QQ = \"4cd6974be1\"\n        const val SHIPLY_APPID_TIM = \"ad6b501b0e\"\n        const val SHIPLY_SIGN_ID_QQ = \"0ccc46ca-154c-4c6b-8b0b-4d8537ffcbcc\"\n        const val SHIPLY_SIGN_ID_TIM = \"33641818-aee7-445a-82d4-b7d0bce3a85a\"\n\n        const val ANDROID_QQ_PACKAGE_NAME = \"com.tencent.mobileqq\"\n        const val ANDROID_TIM_PACKAGE_NAME = \"com.tencent.tim\"\n        const val ANDROID_WECHAT_PACKAGE_NAME = \"com.tencent.mm\"\n        const val ANDROID_WECOM_PACKAGE_NAME = \"com.tencent.wework\"\n        const val ANDROID_WETYPE_PACKAGE_NAME = \"com.tencent.wetype\"\n        const val ANDROID_QIDIAN_PACKAGE_NAME = \"com.tencent.qidian\"\n\n        const val EARLIEST_ACCESSIBILITY_QQ_VERSION = false\n        const val EARLIEST_ACCESSIBILITY_TIM_VERSION = false\n        const val EARLIEST_QQNT_FRAMEWORK_QQ_VERSION_STABLE = \"8.9.63\"\n        const val EARLIEST_QQNT_FRAMEWORK_TIM_VERSION_STABLE = \"4.0.0\"\n        const val EARLIEST_UNREAL_ENGINE_QQ_VERSION_STABLE = \"8.8.55\"\n        const val EARLIEST_KUIKLY_FRAMEWORK_QQ_VERSION_STABLE = \"8.9.50\"\n        const val EARLIEST_KUIKLY_FRAMEWORK_TIM_VERSION_STABLE = \"4.0.0\"\n\n        const val ZHIPU_TOKEN = \"ZhipuAIMaaSPlatformToken\"\n        const val GITHUB_TOKEN = \"GitHubPersonalAccessToken\"\n    }\n\n    override fun onCreate() {\n        // Android 12+ 动态颜色\n        DynamicColors.applyToActivitiesIfAvailable(this)\n        instance = this\n        super.onCreate()\n        Security.addProvider(KonaCryptoProvider()) // 腾讯 Kona 国密套件需要在应用启动时添加 Provider\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/data/LocalAppStackResult.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.data\n\ndata class LocalAppStackResult(\n    val id: String,\n    val dex: String\n)\n"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/data/LocalAppStackRule.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.data\n\ndata class LocalAppStackRule(\n    val id: String,\n    val dex: Array<String>,\n    val type: String,\n    val url: String? = null,\n    val desc: String? = null\n) {\n    override fun equals(other: Any?): Boolean {\n        if (this === other) return true\n        if (javaClass != other?.javaClass) return false\n\n        other as LocalAppStackRule\n\n        if (id != other.id) return false\n        if (!dex.contentEquals(other.dex)) return false\n        if (type != other.type) return false\n        if (url != other.url) return false\n        if (desc != other.desc) return false\n\n        return true\n    }\n\n    override fun hashCode(): Int {\n        var result = id.hashCode()\n        result = 31 * result + dex.contentHashCode()\n        result = 31 * result + type.hashCode()\n        result = 31 * result + (url?.hashCode() ?: 0)\n        result = 31 * result + (desc?.hashCode() ?: 0)\n        return result\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/data/QQVersionBean.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.data\n\nimport kotlinx.serialization.Serializable\n\n/**\n * @param versions QQ 版本代码\n * @param versionNumber QQ 版本号\n * @param size QQ 版本额定大小\n * @param featureTitle QQ 版本特性标题\n * @param imgs QQ 应用宣传图片列表\n * @param summary QQ 版本特性描述列表\n * @param jsonString 该 QQ 版本 JSON 字符串详情\n * @param displayType 卡片展示类型，0 为收起态，1 为展开态\n * @param displayInstall 展示是否安装到本机的标签\n * @param isQQNTFramework 该版本是否基于 QQNT 技术架构\n * @param isUnrealEngine 该版本是否存在 Unreal Engine Lib\n * @param isKuiklyInside 该版本是否存在 TDS 腾讯端服务 Kukily 开发框架\n */\n@Serializable\ndata class QQVersionBean(\n    val versions: String,\n    val versionNumber: String,\n    val size: String,\n    val featureTitle: String,\n    val imgs: List<String>,\n    val summary: List<String>,\n\n    var jsonString: String = \"\",\n    var displayType: Int = 0, // 0为收起\n    var displayInstall: Boolean = false, // false 为不展示\n    var isAccessibility: Boolean = false,\n    var isQQNTFramework: Boolean = false,\n    var isUnrealEngine: Boolean = false,\n    var isKuiklyInside: Boolean = false\n)\n"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/data/QverbowRelease.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.data\n\nimport java.util.Date\n\ndata class QverbowRelease(\n    val tagName: String,\n    val name: String?,\n    val body: String?,\n    val createdAt: Date,\n    val htmlUrl: String,\n    val zipballUrl: String?,\n    val tarballUrl: String?,\n    val isDraft: Boolean,\n    val isPrerelease: Boolean,\n    val assets: List<QverbowReleaseAssets>?\n)\n\n"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/data/QverbowReleaseAssets.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.data\n\nclass QverbowReleaseAssets(\n    val name: String, val browserDownloadUrl: String, val contentType: String, val size: Long\n)\n"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/data/TIMVersionBean.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.data\n\nimport kotlinx.serialization.Serializable\n\n/**\n * @param version TIM 版本号\n * @param datetime TIM 版本发布日期\n * @param fix TIM 版本优化描述\n * @param feature TIM 版本新功能描述\n * @param link TIM 最新官网正式版下载链接\n * @param jsonString 该 TIM 版本 JSON 字符串详情\n * @param displayType 卡片展示类型，0 为收起态，1 为展开态\n * @param displayInstall 展示是否安装到本机的标签\n * @param isQQNTFramework 该版本是否基于 QQNT 技术架构\n * @param isKuiklyInside 该版本是否存在 TDS 腾讯端服务 Kukily 开发框架\n */\n@Serializable\ndata class TIMVersionBean(\n    val version: String,\n    val datetime: String,\n    val fix: List<String>,\n    val feature: List<String>,\n\n    var link: String = \"\",\n    var jsonString: String = \"\",\n    var displayType: Int = 0, // 0为收起\n    var displayInstall: Boolean = false, // false 为不展示\n    var isAccessibility: Boolean = false,\n    var isQQNTFramework: Boolean = false,\n    var isKuiklyInside: Boolean = false\n)\n"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/data/WeixinVersionBean.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.data\n\ndata class WeixinVersionBean(\n    val version: String,\n    val datetime: String,\n\n    val isAlpha: Boolean = false,\n    var displayInstall: Boolean = false, // false 为不展示\n    var displayType: Int = 0, // 0为收起\n    var link: String = \"\",\n)\n"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/service/FirebaseMessagingService.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.service\n\nimport android.app.NotificationManager\nimport androidx.core.app.NotificationCompat\nimport com.google.firebase.messaging.FirebaseMessagingService\nimport com.google.firebase.messaging.RemoteMessage\nimport com.xiaoniu.qqversionlist.R\n\nclass FirebaseMessagingService : FirebaseMessagingService() {\n    override fun onNewToken(token: String) {\n        super.onNewToken(token)\n    }\n\n    override fun onMessageReceived(remoteMessage: RemoteMessage) {\n        if (!remoteMessage.data.isNotEmpty()) {\n            // 创建 Notification\n            val notificationBuilder = NotificationCompat.Builder(\n                this, getString(R.string.rainbow_notification_channel_id)\n            ).setSmallIcon(R.drawable.qv_logo_notification)\n                .setContentTitle(remoteMessage.notification!!.title)\n                .setContentText(remoteMessage.notification!!.body)\n                .setPriority(NotificationCompat.PRIORITY_DEFAULT)\n                .setContentIntent(null)\n                .setAutoCancel(true)\n\n            // 获取 NotificationManager 并发送通知\n            val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager\n            notificationManager.notify(1, notificationBuilder.build())\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/ui/ExpUrlListAdapter.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.ui\n\nimport android.content.Intent\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.recyclerview.widget.RecyclerView\nimport com.google.android.material.card.MaterialCardView\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.xiaoniu.qqversionlist.R\nimport com.xiaoniu.qqversionlist.databinding.ExpLinkNextButtonBinding\nimport com.xiaoniu.qqversionlist.databinding.ItemExpBackUrlCardBinding\nimport com.xiaoniu.qqversionlist.util.ClipboardUtil.copyText\nimport com.xiaoniu.qqversionlist.util.FileUtil.downloadFile\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\nimport okhttp3.OkHttpClient\nimport okhttp3.Request\n\nclass ExpUrlListAdapter(private val urlList: List<String>) :\n    RecyclerView.Adapter<ExpUrlListAdapter.ExpUrlViewHolder>() {\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ExpUrlViewHolder {\n        val binding =\n            ItemExpBackUrlCardBinding.inflate(LayoutInflater.from(parent.context), parent, false)\n        return ExpUrlViewHolder(binding)\n    }\n\n    inner class ExpUrlViewHolder(binding: ItemExpBackUrlCardBinding) :\n        RecyclerView.ViewHolder(binding.root) {\n        val expUrlText = binding.expUrlText\n        var currentUrl: String? = null\n\n        init {\n            val expUrlCard = itemView.findViewById<MaterialCardView>(R.id.exp_url_card)\n            expUrlCard.setOnClickListener {\n                currentUrl?.let { url ->\n                    CoroutineScope(Dispatchers.IO).launch {\n                        var appSize = \"\"\n                        try {\n                            val okHttpClient = OkHttpClient()\n                            val request = Request.Builder().url(url).head().build()\n                            val response = okHttpClient.newCall(request).execute()\n                            appSize = \"%.2f\".format(\n                                response.header(\"Content-Length\")?.toDoubleOrNull()\n                                    ?.div(1024 * 1024)\n                            )\n                        } catch (_: Exception) {\n                        } finally {\n                            withContext(Dispatchers.Main) {\n                                val expLinkNextButtonBinding =\n                                    ExpLinkNextButtonBinding.inflate(\n                                        LayoutInflater.from(itemView.context)\n                                    )\n                                expLinkNextButtonBinding.root.parent?.let { parent ->\n                                    if (parent is ViewGroup) parent.removeView(\n                                        expLinkNextButtonBinding.root\n                                    )\n                                }\n                                val expNextMaterialDialog =\n                                    MaterialAlertDialogBuilder(itemView.context)\n                                        .setTitle(R.string.additionalActions)\n                                        .setIcon(R.drawable.flask_line)\n                                        .setView(expLinkNextButtonBinding.root).apply {\n                                            if (appSize != \"\" && appSize != \"-1\" && appSize != \"0\") setMessage(\n                                                \"${itemView.context.getString(R.string.downloadLink)}$url\\n\\n${\n                                                    itemView.context.getString(\n                                                        R.string.fileSize\n                                                    )\n                                                }$appSize MB\"\n                                            )\n                                            else setMessage(\"${itemView.context.getString(R.string.downloadLink)}$url\")\n                                        }.show()\n\n                                expLinkNextButtonBinding.apply {\n                                    expNextBtnCopy.setOnClickListener {\n                                        expNextMaterialDialog.dismiss()\n                                        itemView.context.copyText(url)\n                                    }\n\n                                    expNextBtnDownload.setOnClickListener {\n                                        expNextMaterialDialog.dismiss()\n                                        downloadFile(itemView.context, url)\n                                    }\n\n                                    expNextBtnShare.setOnClickListener {\n                                        expNextMaterialDialog.dismiss()\n                                        val shareIntent = Intent(Intent.ACTION_SEND).apply {\n                                            type = \"text/plain\"\n                                            putExtra(Intent.EXTRA_TEXT, url)\n                                        }\n                                        itemView.context.startActivity(\n                                            Intent.createChooser(\n                                                shareIntent,\n                                                itemView.context.getString(R.string.shareTo)\n                                            )\n                                        )\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n            expUrlCard.setOnLongClickListener {\n                currentUrl?.let { url ->\n                    itemView.context.copyText(url)\n                }\n                true\n            }\n        }\n    }\n\n    override fun onBindViewHolder(holder: ExpUrlViewHolder, position: Int) {\n        val currentUrl = urlList[position]\n        holder.expUrlText.text = currentUrl\n        holder.currentUrl = currentUrl\n    }\n\n    override fun getItemCount(): Int {\n        return urlList.size\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/ui/LocalAppDetailsActivity.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.ui\n\nimport android.content.Intent\nimport android.net.Uri\nimport android.os.Build\nimport android.os.Build.VERSION.SDK_INT\nimport android.os.Bundle\nimport android.provider.OpenableColumns\nimport android.view.LayoutInflater\nimport android.widget.TextView\nimport androidx.activity.enableEdgeToEdge\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.compose.foundation.Image\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.size\nimport androidx.compose.material3.Card\nimport androidx.compose.material3.CardDefaults\nimport androidx.compose.material3.ExperimentalMaterial3Api\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.ColorFilter\nimport androidx.compose.ui.res.painterResource\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.unit.dp\nimport androidx.core.content.IntentCompat\nimport androidx.core.view.ViewCompat\nimport androidx.core.view.WindowInsetsCompat\nimport androidx.core.view.isVisible\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.Observer\nimport androidx.lifecycle.ViewModelProvider\nimport coil3.load\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.google.android.material.progressindicator.LinearProgressIndicator\nimport com.google.gson.GsonBuilder\nimport com.google.gson.JsonObject\nimport com.xiaoniu.qqversionlist.QverbowApplication.Companion.ZHIPU_TOKEN\nimport com.xiaoniu.qqversionlist.R\nimport com.xiaoniu.qqversionlist.data.LocalAppStackResult\nimport com.xiaoniu.qqversionlist.databinding.ActivityLocalAppDetailsBinding\nimport com.xiaoniu.qqversionlist.databinding.DialogChangesLlmInferenceBinding\nimport com.xiaoniu.qqversionlist.databinding.DialogLocalQqTimInfoBinding\nimport com.xiaoniu.qqversionlist.ui.LocalAppDetailsActivityViewModel.Companion.DEX_PRE_RULES\nimport com.xiaoniu.qqversionlist.ui.LocalAppDetailsActivityViewModel.Companion.RULES_ID_ORDER\nimport com.xiaoniu.qqversionlist.ui.LocalAppDetailsActivityViewModel.Companion.RULE_TYPE_OPEN_SOURCE_3RD_PARTY\nimport com.xiaoniu.qqversionlist.ui.LocalAppDetailsActivityViewModel.Companion.RULE_TYPE_OTEAM_TENCENT\nimport com.xiaoniu.qqversionlist.ui.LocalAppDetailsActivityViewModel.Companion.RULE_TYPE_PRIVATE_TENCENT\nimport com.xiaoniu.qqversionlist.ui.MainActivity.Companion.JUDGE_UA_TARGET\nimport com.xiaoniu.qqversionlist.ui.theme.QQVersionListTheme\nimport com.xiaoniu.qqversionlist.util.ClipboardUtil.copyText\nimport com.xiaoniu.qqversionlist.util.DataStoreUtil\nimport com.xiaoniu.qqversionlist.util.InfoUtil.dialogError\nimport com.xiaoniu.qqversionlist.util.InfoUtil.openUrlWithChromeCustomTab\nimport com.xiaoniu.qqversionlist.util.InfoUtil.showToast\nimport com.xiaoniu.qqversionlist.util.KeyStoreUtil\nimport com.xiaoniu.qqversionlist.util.StringUtil.pangu\nimport com.xiaoniu.qqversionlist.util.ZhipuSDKUtil.getZhipuWrite\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\nimport org.apache.commons.io.FileUtils\nimport java.io.File\nimport java.net.SocketTimeoutException\nimport java.nio.file.FileSystems\nimport java.util.Locale\nimport kotlin.collections.sortedWith\n\nclass LocalAppDetailsActivity : AppCompatActivity() {\n    lateinit var viewModel: LocalAppDetailsActivityViewModel\n    lateinit var binding: ActivityLocalAppDetailsBinding\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        enableEdgeToEdge()\n\n        // 不加这段代码的话 Google 可能会在系统栏加遮罩\n        if (SDK_INT >= Build.VERSION_CODES.Q) window.isNavigationBarContrastEnforced = false\n\n        setContentView(R.layout.activity_local_app_details)\n        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->\n            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())\n            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)\n            insets\n        }\n        if (DataStoreUtil.getIntKV(\"userAgreement\", 0) < JUDGE_UA_TARGET) {\n            showToast(R.string.haveNotAgreeUA)\n            finish()\n        }\n        binding = ActivityLocalAppDetailsBinding.inflate(layoutInflater)\n        val localInterChangesLlmGen = DataStoreUtil.getBooleanKV(\"localInterChangesLlmGen\", false)\n        val viewRoot = binding.root\n        setContentView(viewRoot)\n        viewModel = ViewModelProvider(this)[LocalAppDetailsActivityViewModel::class.java]\n        binding.apply {\n            topAppBar.setNavigationOnClickListener {\n                finish()\n            }\n            progressLine.apply {\n                showAnimationBehavior = LinearProgressIndicator.SHOW_NONE\n                hideAnimationBehavior = LinearProgressIndicator.HIDE_ESCAPE\n            }\n            viewModel.apply {\n                isAIShowing.observe(this@LocalAppDetailsActivity) { isAIShowing ->\n                    if (isAIShowing && localInterChangesLlmGen) {\n                        floatingActionButtonLlm.setOnClickListener {\n                            val dialogChangesLlmInferenceBinding =\n                                DialogChangesLlmInferenceBinding.inflate(\n                                    layoutInflater\n                                )\n\n                            val changeText =\n                                activityDiff.value + \"\\n\\n\" + serviceDiff.value + \"\\n\\n\" + receiverDiff.value + \"\\n\\n\" + providerDiff.value + \"\\n\\n\" + permissionDiff.value\n                            val versionChange =\n                                \"${appName.value} ${localVersionNameWithInter.value} → ${versionName.value}\"\n\n                            CoroutineScope(\n                                Dispatchers.IO\n                            ).launch {\n                                try {\n                                    val token = KeyStoreUtil.getStringKVwithKeyStore(ZHIPU_TOKEN)\n                                    val tokenIsNullOrEmpty = token.isNullOrEmpty()\n                                    if (!tokenIsNullOrEmpty) {\n                                        runOnUiThread { viewModel.setChangesBackLLMWorking(true) }\n                                        val llmResponse = getZhipuWrite(\n                                            getString(\n                                                R.string.llmInferenceLocalChangesPrompt,\n                                                appName.value,\n                                                localVersionNameWithInter.value,\n                                                versionName.value,\n                                                Locale.getDefault().toString()\n                                            ),\n                                            versionChange + \"\\n\\n\" + changeText,\n                                            token\n                                        )\n                                        val gson = GsonBuilder().setPrettyPrinting().create()\n                                        val responseObject = gson.fromJson(\n                                            llmResponse, JsonObject::class.java\n                                        )\n\n                                        runOnUiThread {\n                                            if (responseObject.getAsJsonPrimitive(\"code\").asInt == 200) {\n                                                val zhipuContent =\n                                                    responseObject.getAsJsonObject(\"data\").asJsonObject.getAsJsonArray(\n                                                        \"choices\"\n                                                    ).asJsonArray.first().asJsonObject.getAsJsonObject(\n                                                        \"message\"\n                                                    ).asJsonObject.getAsJsonPrimitive(\n                                                        \"content\"\n                                                    ).asString\n                                                viewModel.setChangesBackLLMGenText(zhipuContent.pangu())\n                                            } else {\n                                                val zhipuContent =\n                                                    responseObject.getAsJsonPrimitive(\"msg\").asString + getString(\n                                                        R.string.colon\n                                                    ) + responseObject.getAsJsonObject(\"error\").asJsonObject.getAsJsonPrimitive(\n                                                        \"message\"\n                                                    ).asString\n                                                viewModel.setChangesBackLLMGenText(zhipuContent)\n                                            }\n                                            viewModel.setChangesBackLLMWorking(false)\n                                        }\n                                    } else runOnUiThread {\n                                        viewModel.setChangesBackLLMWorking(false)\n                                        viewModel.setChangesBackLLMGenText(getString(R.string.zhipuTokenIsNull))\n                                    }\n                                } catch (_: SocketTimeoutException) {\n                                    runOnUiThread {\n                                        viewModel.setChangesBackLLMWorking(false)\n                                        viewModel.setChangesBackLLMGenText(getString(R.string.timeout))\n                                    }\n                                } catch (e: Exception) {\n                                    runOnUiThread {\n                                        e.printStackTrace()\n                                        dialogError(e)\n                                    }\n                                }\n                            }\n\n                            val dialogChangesLlmInference =\n                                MaterialAlertDialogBuilder(this@LocalAppDetailsActivity).setTitle(R.string.llmInferenceLocalChanges)\n                                    .setView(dialogChangesLlmInferenceBinding.root)\n                                    .setIcon(R.drawable.ai_generate_2).show()\n\n                            dialogChangesLlmInferenceBinding.versionChangeInfo.text = versionChange\n\n                            viewModel.isChangesBackLLMWorking.observe(this@LocalAppDetailsActivity,\n                                Observer { isWorking ->\n                                    if (DataStoreUtil.getBooleanKV(\"updateLogLlmGen\", false)) {\n                                        dialogChangesLlmInferenceBinding.llmGenCard.isVisible =\n                                            !isWorking && viewModel.changesBackLLMGenText.value.toString()\n                                                .isNotEmpty()\n                                        dialogChangesLlmInferenceBinding.progressIndicator.isVisible =\n                                            isWorking\n                                        dialogChangesLlmInferenceBinding.btnCopy.isVisible =\n                                            !isWorking && viewModel.changesBackLLMGenText.value.toString()\n                                                .isNotEmpty()\n                                        dialogChangesLlmInferenceBinding.btnCopy.setOnClickListener {\n                                            copyText(\n                                                viewModel.changesBackLLMGenText.value.toString() + \"\\n\\n\" + getString(\n                                                    R.string.genByAITips\n                                                )\n                                            )\n                                        }\n                                    } else {\n                                        dialogChangesLlmInferenceBinding.llmGenCard.isVisible =\n                                            false\n                                        dialogChangesLlmInferenceBinding.progressIndicator.isVisible =\n                                            false\n                                        dialogChangesLlmInferenceBinding.btnCopy.isVisible = false\n                                        dialogChangesLlmInferenceBinding.btnCopy.setOnClickListener(\n                                            null\n                                        )\n                                    }\n                                })\n                            viewModel.changesBackLLMGenText.observe(this@LocalAppDetailsActivity,\n                                Observer { text ->\n                                    dialogChangesLlmInferenceBinding.llmGenText.text = text\n                                })\n\n                            dialogChangesLlmInferenceBinding.btnOk.setOnClickListener {\n                                dialogChangesLlmInference.dismiss()\n                            }\n                        }\n                        floatingActionButtonLlm.show()\n                    } else {\n                        floatingActionButtonLlm.setOnClickListener(null)\n                        floatingActionButtonLlm.hide()\n                    }\n                }\n                localAppStackResults.observe(this@LocalAppDetailsActivity) { result ->\n                    stackInfoList.setContent {\n                        QQVersionListTheme { LocalAppDetailsStackWindow(result) }\n                    }\n                }\n                appIconImage.observe(this@LocalAppDetailsActivity) { appIconImage ->\n                    if (appIconImage != null) {\n                        localIcon.isVisible = true\n                        localIcon.load(appIconImage)\n                    } else localIcon.isVisible = false\n                }\n                isLoading.observe(this@LocalAppDetailsActivity) { isLoading ->\n                    if (isLoading) {\n                        progressLine.show()\n                        detailInfo.isVisible = false\n                        detailInfo.setOnClickListener(null)\n                    } else {\n                        progressLine.hide()\n                        if (isWeixin.value == false && isErr.value == false) {\n                            detailInfo.isVisible = true\n                            detailInfo.setOnClickListener {\n                                val localInfoAllText = (if (targetSDK.value != 0) \"Target SDK${\n                                    getString(R.string.colon)\n                                }${targetSDK.value}\" else \"\") + (if (minSDK.value != 0) \"\\nMin SDK${\n                                    getString(R.string.colon)\n                                }${minSDK.value}\" else \"\") + (if (compileSDK.value != 0) \"\\nCompile SDK${\n                                    getString(R.string.colon)\n                                }${\n                                    compileSDK.value\n                                }\" else \"\") + \"\\nVersion Name${getString(R.string.colon)}${\n                                    versionName.value\n                                }\" + (if (rdmUUID.value != \"\") \"\\nRdm UUID${\n                                    getString(R.string.colon)\n                                }${\n                                    rdmUUID.value\n                                }\" else \"\") + (if (versionCode.value != \"\") \"\\nVersion Code${\n                                    getString(R.string.colon)\n                                }${\n                                    versionCode.value\n                                }\" else \"\") + (if (appSettingParams.value != \"\") \"\\nAppSetting_params${\n                                    getString(R.string.colon)\n                                }${\n                                    appSettingParams.value\n                                }\" else \"\") + (if (appSettingParamsPad.value != \"\") \"\\nAppSetting_params_pad${\n                                    getString(R.string.colon)\n                                }${\n                                    appSettingParamsPad.value\n                                }\" else \"\") + (if (qua.value != \"\") \"\\nQUA${\n                                    getString(R.string.colon)\n                                }${qua.value}\" else \"\")\n\n                                val dialogLocalQqTimInfoBinding =\n                                    DialogLocalQqTimInfoBinding.inflate(\n                                        LayoutInflater.from(this@LocalAppDetailsActivity)\n                                    )\n\n                                MaterialAlertDialogBuilder(this@LocalAppDetailsActivity).setView(\n                                    dialogLocalQqTimInfoBinding.root\n                                ).setTitle(R.string.localDetailsMsg)\n                                    .setIcon(R.drawable.phone_find_line).apply {\n                                        dialogLocalQqTimInfoBinding.apply {\n                                            val dialogLocalSdkDesc = localSDKText.value\n\n                                            dialogLocalSdk.apply {\n                                                setCellDescription(dialogLocalSdkDesc)\n                                                this.setOnClickListener {\n                                                    context.copyText(\n                                                        \"Android SDK${\n                                                            getString(R.string.colon)\n                                                        }$dialogLocalSdkDesc\"\n                                                    )\n                                                }\n                                            }\n                                            dialogLocalVersionName.apply {\n                                                setCellDescription(versionName.value)\n                                                this.setOnClickListener {\n                                                    context.copyText(\n                                                        \"Version Name${\n                                                            getString(R.string.colon)\n                                                        }${versionName.value}\"\n                                                    )\n                                                }\n                                            }\n                                            dialogLocalRdmUuid.apply {\n                                                if (rdmUUID.value != \"\") {\n                                                    setCellDescription(rdmUUID.value)\n                                                    this.setOnClickListener {\n                                                        context.copyText(\n                                                            \"Rdm UUID${\n                                                                getString(R.string.colon)\n                                                            }${rdmUUID.value}\"\n                                                        )\n                                                    }\n                                                } else dialogLocalRdmUuid.isVisible = false\n                                            }\n                                            dialogLocalVersionCode.apply {\n                                                if (versionCode.value != \"\") {\n                                                    setCellDescription(versionCode.value)\n                                                    this.setOnClickListener {\n                                                        context.copyText(\n                                                            \"Version Code${\n                                                                getString(R.string.colon)\n                                                            }${versionCode.value}\"\n                                                        )\n                                                    }\n                                                } else dialogLocalVersionCode.isVisible = false\n                                            }\n                                            dialogLocalAppsettingParams.apply {\n                                                if (appSettingParams.value != \"\") {\n                                                    setCellDescription(appSettingParams.value)\n                                                    this.setOnClickListener {\n                                                        context.copyText(\n                                                            \"AppSetting_params${\n                                                                getString(R.string.colon)\n                                                            }${appSettingParams.value}\"\n                                                        )\n                                                    }\n                                                } else dialogLocalAppsettingParams.isVisible = false\n                                            }\n                                            dialogLocalAppsettingParamsPad.apply {\n                                                if (appSettingParamsPad.value != \"\") {\n                                                    setCellDescription(appSettingParamsPad.value)\n                                                    this.setOnClickListener {\n                                                        context.copyText(\n                                                            \"AppSetting_params_pad${\n                                                                getString(R.string.colon)\n                                                            }${appSettingParamsPad.value}\"\n                                                        )\n                                                    }\n                                                } else dialogLocalAppsettingParamsPad.isVisible =\n                                                    false\n                                            }\n                                            dialogLocalQua.apply {\n                                                if (qua.value != \"\") {\n                                                    setCellDescription(qua.value)\n                                                    this.setOnClickListener {\n                                                        context.copyText(\n                                                            \"QUA${\n                                                                getString(\n                                                                    R.string.colon\n                                                                )\n                                                            }${qua.value}\"\n                                                        )\n                                                    }\n                                                } else dialogLocalQua.isVisible = false\n                                            }\n                                            dialogLocalCopyAll.setOnClickListener {\n                                                context.copyText(localInfoAllText)\n                                            }\n                                        }\n                                    }.show()\n                            }\n                        } else {\n                            detailInfo.isVisible = false\n                            detailInfo.setOnClickListener(null)\n                        }\n                    }\n                }\n                channelText.observe(this@LocalAppDetailsActivity) { text ->\n                    if (text == \"\" || isWeixin.value == true) binding.localChannelCard.isVisible =\n                        false else {\n                        localChannelCard.isVisible = true\n                        localChannelText.text = text\n                    }\n                }\n                isErr.observe(this@LocalAppDetailsActivity) { isErr ->\n                    stackInfo.isVisible = !isErr\n                }\n                observeString(appName, binding.localName)\n                observeString(localVersion, binding.localVersion)\n                observeString(localSDKText, binding.localSdk)\n                observeStringWithVisible(isTIM, timBasedVer, binding.localTimBase)\n            }\n        }\n\n        try {\n            val intent = intent\n            when {\n                intent.hasExtra(\"localAppType\") -> {\n                    val localAppType = intent.getStringExtra(\"localAppType\")\n                    if (localAppType == \"QQ\" || localAppType == \"TIM\" || localAppType == \"Weixin\") viewModel.getInfo(\n                        this, localAppType\n                    )\n                    if (localAppType == \"QQ\") binding.topAppBar.title =\n                        getString(R.string.localQQVersionDetails)\n                    else if (localAppType == \"TIM\") binding.topAppBar.title =\n                        getString(R.string.localTIMVersionDetails)\n                    else if (localAppType == \"Weixin\") binding.topAppBar.title =\n                        getString(R.string.localWeixinVersionDetails)\n                }\n\n                intent.action == Intent.ACTION_SEND || intent.action == Intent.ACTION_VIEW -> {\n                    binding.topAppBar.title = getString(R.string.apkAnalyze)\n                    val action = intent.action\n                    val uri = when (action) {\n                        Intent.ACTION_SEND -> IntentCompat.getParcelableExtra(\n                            intent, Intent.EXTRA_STREAM, Uri::class.java\n                        )\n\n                        Intent.ACTION_VIEW -> intent.data\n                        else -> null\n                    }\n                    if (uri != null) {\n                        val path = uri.path\n                        if (path != null) {\n                            val normalizedPath =\n                                if (SDK_INT >= Build.VERSION_CODES.O) FileSystems.getDefault()\n                                    .getPath(path).normalize()\n                                    .toString() else File(path).canonicalPath\n                            if (!normalizedPath.startsWith(\"/data\")) {\n                                val cacheDir = File(cacheDir, \"apkAnalysis\")\n                                if (cacheDir.exists()) cacheDir.deleteRecursively()\n                                cacheDir.mkdirs()\n                                val requiredSpace = 500 * 1024 * 1024L // 500MB\n                                val freeSpace = cacheDir.freeSpace\n                                val fileSize = getFileSizeFromUri(uri)\n                                if (freeSpace >= requiredSpace + if (fileSize != -1L) fileSize else 0) {\n                                    val destinationFile = File(cacheDir, \"temp_apk.apk\")\n                                    contentResolver.openInputStream(uri)?.use { inputStream ->\n                                        FileUtils.copyInputStreamToFile(\n                                            inputStream, destinationFile\n                                        )\n                                    }\n                                    viewModel.getInfo(this, \"inter\", destinationFile.path)\n                                } else viewModel.setAppName(getString(R.string.notEnoughSpaceOnTheDevice))\n                            } else viewModel.setAppName(getString(R.string.unknownErr))\n                        } else viewModel.setAppName(getString(R.string.unknownErr))\n                    } else viewModel.setAppName(getString(R.string.unknownErr))\n                }\n\n                else -> {\n                    viewModel.setAppName(getString(R.string.unknownErr))\n                    binding.topAppBar.apply {\n                        title = getString(R.string.app_name)\n                        subtitle = null\n                    }\n                }\n            }\n        } catch (e: Exception) {\n            e.printStackTrace()\n            dialogError(e)\n        }\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        viewModel.cleanCache(this)\n    }\n\n    private fun observeString(liveData: LiveData<String>, textView: TextView) {\n        liveData.observe(this@LocalAppDetailsActivity) { text ->\n            textView.text = text\n        }\n    }\n\n    private fun observeStringWithVisible(\n        liveDataBoolean: LiveData<Boolean>, liveDataString: LiveData<String>, textView: TextView\n    ) {\n        liveDataBoolean.observe(this@LocalAppDetailsActivity) { boolean ->\n            liveDataString.observe(this@LocalAppDetailsActivity) { text ->\n                textView.isVisible = text != \"\" && boolean\n                textView.text = text\n            }\n        }\n    }\n\n    private fun showStackDescDialog(\n        titleRes: Int, messageRes: Int, url: String?, iconRes: Int? = null\n    ) {\n        MaterialAlertDialogBuilder(this@LocalAppDetailsActivity).setTitle(titleRes)\n            .setMessage(messageRes).setPositiveButton(R.string.done) { _, _ -> }.apply {\n                if (iconRes != null) setIcon(iconRes)\n                if (url != null) setNeutralButton(R.string.details) { _, _ ->\n                    openUrlWithChromeCustomTab(url)\n                }\n            }.show()\n    }\n\n    private fun getFileSizeFromUri(uri: Uri): Long {\n        return try {\n            contentResolver.query(uri, null, null, null, null)?.use { cursor ->\n                val sizeIndex = cursor.getColumnIndex(OpenableColumns.SIZE)\n                cursor.moveToFirst()\n                if (sizeIndex != -1) cursor.getLong(sizeIndex) else -1L\n            } ?: -1L\n        } catch (_: Exception) {\n            -1L\n        }\n    }\n\n    @OptIn(ExperimentalMaterial3Api::class)\n    @Composable\n    private fun LocalAppDetailsStackWindow(\n        result: MutableList<LocalAppStackResult>\n    ) {\n        Column {\n            (if (result.isEmpty()) mutableListOf() else result).sortedWith(compareBy<LocalAppStackResult> {\n                if (RULES_ID_ORDER.indexOf(it.id) == -1) Int.MAX_VALUE\n                else RULES_ID_ORDER.indexOf(it.id)\n            }.thenComparing(compareBy<LocalAppStackResult> { it.id.lowercase() })\n            ).forEach { item -> StackItem(item = item) }\n        }\n    }\n\n    @OptIn(ExperimentalMaterial3Api::class)\n    @Composable\n    private fun StackItem(item: LocalAppStackResult) {\n        Card(modifier = Modifier\n            .fillMaxWidth()\n            .padding(5.dp), colors = CardDefaults.cardColors(\n            containerColor = MaterialTheme.colorScheme.surfaceContainerLow,\n            contentColor = MaterialTheme.colorScheme.onSurfaceVariant\n        ), onClick = {\n            when (item.id) {\n                LocalAppDetailsActivityViewModel.RULE_ID_QQNT -> showStackDescDialog(\n                    R.string.localDetailsQQNT,\n                    R.string.localDetailsQQNTDesc,\n                    DEX_PRE_RULES.find { it.id == item.id }?.url,\n                    R.drawable.qqnt_logo_unofficial_fix\n                )\n\n                LocalAppDetailsActivityViewModel.RULE_ID_BUGLY -> showStackDescDialog(\n                    R.string.localDetailsBugly,\n                    R.string.localDetailsBuglyDesc,\n                    DEX_PRE_RULES.find { it.id == item.id }?.url,\n                    R.drawable.bugly_official\n                )\n\n                LocalAppDetailsActivityViewModel.RULE_ID_UE_LIBRARY -> showStackDescDialog(\n                    R.string.localDetailsUELibrary,\n                    R.string.localDetailsUELibraryDesc,\n                    DEX_PRE_RULES.find { it.id == item.id }?.url,\n                    R.drawable.ue_icon_2023_black\n                )\n\n                LocalAppDetailsActivityViewModel.RULE_ID_HIPPY -> showStackDescDialog(\n                    R.string.localDetailsHippy,\n                    R.string.localDetailsHippyDesc,\n                    DEX_PRE_RULES.find { it.id == item.id }?.url,\n                    R.drawable.hippy_official\n                )\n\n                LocalAppDetailsActivityViewModel.RULE_ID_KUIKLY -> showStackDescDialog(\n                    R.string.localDetailsKuikly,\n                    R.string.localDetailsKuiklyDesc,\n                    DEX_PRE_RULES.find { it.id == item.id }?.url,\n                    R.drawable.kuikly_official\n                )\n\n                LocalAppDetailsActivityViewModel.RULE_ID_SHIPLY -> showStackDescDialog(\n                    R.string.localDetailsShiply,\n                    R.string.localDetailsShiplyDesc,\n                    DEX_PRE_RULES.find { it.id == item.id }?.url,\n                    R.drawable.shiply_official\n                )\n\n                LocalAppDetailsActivityViewModel.RULE_ID_RIGHTLY -> showStackDescDialog(\n                    R.string.localDetailsRightly,\n                    R.string.localDetailsRightlyDesc,\n                    DEX_PRE_RULES.find { it.id == item.id }?.url,\n                    R.drawable.rightly_official\n                )\n\n                LocalAppDetailsActivityViewModel.RULE_ID_TENCENT_BEACON -> showStackDescDialog(\n                    R.string.localDetailsTencentBeacon,\n                    R.string.localDetailsTencentBeaconDesc,\n                    DEX_PRE_RULES.find { it.id == item.id }?.url,\n                    R.drawable.beacon_official\n                )\n\n                LocalAppDetailsActivityViewModel.RULE_ID_COMPOSE_MULTIPLATFORM -> showStackDescDialog(\n                    R.string.localDetailsComposeMultiplatform,\n                    R.string.localDetailsComposeMultiplatformDesc,\n                    DEX_PRE_RULES.find { it.id == item.id }?.url,\n                    R.drawable.compose\n                )\n\n                LocalAppDetailsActivityViewModel.RULE_ID_JETPACK_COMPOSE -> showStackDescDialog(\n                    R.string.localDetailsJetpackCompose,\n                    R.string.localDetailsJetpackComposeDesc,\n                    DEX_PRE_RULES.find { it.id == item.id }?.url,\n                    R.drawable.compose\n                )\n\n                LocalAppDetailsActivityViewModel.RULE_ID_FLUTTER -> showStackDescDialog(\n                    R.string.localDetailsFlutter,\n                    R.string.localDetailsFlutterDesc,\n                    DEX_PRE_RULES.find { it.id == item.id }?.url,\n                    R.drawable.flutter_line\n                )\n\n                LocalAppDetailsActivityViewModel.RULE_ID_MMKV -> showStackDescDialog(\n                    R.string.localDetailsMMKV,\n                    R.string.localDetailsMMKVDesc,\n                    DEX_PRE_RULES.find { it.id == item.id }?.url,\n                    R.drawable.oteam_official\n                )\n\n                LocalAppDetailsActivityViewModel.RULE_ID_WCDB -> showStackDescDialog(\n                    R.string.localDetailsWCDB,\n                    R.string.localDetailsWCDBDesc,\n                    DEX_PRE_RULES.find { it.id == item.id }?.url,\n                    R.drawable.oteam_official\n                )\n\n                LocalAppDetailsActivityViewModel.RULE_ID_MARS -> showStackDescDialog(\n                    R.string.localDetailsMars,\n                    R.string.localDetailsMarsDesc,\n                    DEX_PRE_RULES.find { it.id == item.id }?.url,\n                    R.drawable.oteam_official\n                )\n\n                LocalAppDetailsActivityViewModel.RULE_ID_MATRIX -> showStackDescDialog(\n                    R.string.localDetailsMatrix,\n                    R.string.localDetailsMatrixDesc,\n                    DEX_PRE_RULES.find { it.id == item.id }?.url,\n                    R.drawable.oteam_official\n                )\n\n                LocalAppDetailsActivityViewModel.RULE_ID_TINKER -> showStackDescDialog(\n                    R.string.localDetailsTinker,\n                    R.string.localDetailsTinkerDesc,\n                    DEX_PRE_RULES.find { it.id == item.id }?.url,\n                    R.drawable.oteam_official\n                )\n\n                LocalAppDetailsActivityViewModel.RULE_ID_REACT_NATIVE -> showStackDescDialog(\n                    R.string.localDetailsReactNative,\n                    R.string.localDetailsReactNativeDesc,\n                    DEX_PRE_RULES.find { it.id == item.id }?.url,\n                    R.drawable.reactjs_line\n                )\n\n                LocalAppDetailsActivityViewModel.RULE_ID_TENCENT_BROWSING_SERVICE -> showStackDescDialog(\n                    R.string.localDetailsTBS,\n                    R.string.localDetailsTBSDesc,\n                    DEX_PRE_RULES.find { it.id == item.id }?.url,\n                    R.drawable.tencent_logo\n                )\n\n                LocalAppDetailsActivityViewModel.RULE_ID_SKYLINE_RENDERING_ENGINE -> showStackDescDialog(\n                    R.string.localDetailsSkylineRenderingEngine,\n                    R.string.localDetailsSkylineRenderingEngineDesc,\n                    DEX_PRE_RULES.find { it.id == item.id }?.url,\n                    R.drawable.mini_program_line\n                )\n\n                else -> null\n            }\n        }) {\n            Row(\n                modifier = Modifier\n                    .fillMaxWidth()\n                    .padding(12.dp),\n                verticalAlignment = Alignment.CenterVertically\n            ) {\n                Image(\n                    painter = painterResource(\n                        id = getIconResId(item.id)\n                    ),\n                    contentDescription = null,\n                    modifier = Modifier\n                        .size(32.dp)\n                        .padding(start = 4.dp, end = 4.dp),\n                    colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.primary),\n                )\n                Column(\n                    modifier = Modifier\n                        .weight(1f)\n                        .padding(start = 6.dp, end = 6.dp)\n                ) {\n                    Text(\n                        text = getItemTitle(item.id),\n                        style = MaterialTheme.typography.titleSmall,\n                        color = MaterialTheme.colorScheme.onSurface\n                    )\n\n                    Text(\n                        text = stringResource(id = R.string.thisVerContains, item.dex),\n                        style = MaterialTheme.typography.bodySmall,\n                        color = MaterialTheme.colorScheme.onSurfaceVariant,\n                        modifier = Modifier.padding(top = 4.dp)\n                    )\n                }\n                Image(\n                    painter = painterResource(id = R.drawable.arrow_right_s_line),\n                    contentDescription = null,\n                    modifier = Modifier.size(24.dp)\n                )\n            }\n        }\n    }\n\n    @Composable\n    private fun getIconResId(id: String): Int {\n        return when (id) {\n            LocalAppDetailsActivityViewModel.RULE_ID_QQNT -> R.drawable.qqnt_logo_unofficial_fix\n            LocalAppDetailsActivityViewModel.RULE_ID_BUGLY -> R.drawable.bugly_official\n            LocalAppDetailsActivityViewModel.RULE_ID_SHIPLY -> R.drawable.shiply_official\n            LocalAppDetailsActivityViewModel.RULE_ID_KUIKLY -> R.drawable.kuikly_official\n            LocalAppDetailsActivityViewModel.RULE_ID_HIPPY -> R.drawable.hippy_official\n            LocalAppDetailsActivityViewModel.RULE_ID_RIGHTLY -> R.drawable.rightly_official\n            LocalAppDetailsActivityViewModel.RULE_ID_UE_LIBRARY -> R.drawable.ue_icon_2023_black\n            LocalAppDetailsActivityViewModel.RULE_ID_TENCENT_BEACON -> R.drawable.beacon_official\n            LocalAppDetailsActivityViewModel.RULE_ID_JETPACK_COMPOSE -> R.drawable.compose\n            LocalAppDetailsActivityViewModel.RULE_ID_COMPOSE_MULTIPLATFORM -> R.drawable.compose\n            LocalAppDetailsActivityViewModel.RULE_ID_FLUTTER -> R.drawable.flutter_line\n            LocalAppDetailsActivityViewModel.RULE_ID_REACT_NATIVE -> R.drawable.reactjs_line\n            LocalAppDetailsActivityViewModel.RULE_ID_TENCENT_BROWSING_SERVICE -> R.drawable.tencent_logo\n            LocalAppDetailsActivityViewModel.RULE_ID_SKYLINE_RENDERING_ENGINE -> R.drawable.mini_program_line\n            else -> when (DEX_PRE_RULES.find { it.id == id }?.type) {\n                RULE_TYPE_PRIVATE_TENCENT -> R.drawable.tencent_logo\n                RULE_TYPE_OPEN_SOURCE_3RD_PARTY -> R.drawable.open_source_line\n                RULE_TYPE_OTEAM_TENCENT -> R.drawable.oteam_official\n                else -> R.drawable.tools_line\n            }\n        }\n    }\n\n    @Composable\n    private fun getItemTitle(id: String): String {\n        return when (id) {\n            LocalAppDetailsActivityViewModel.RULE_ID_QQNT -> stringResource(R.string.localDetailsQQNT)\n            LocalAppDetailsActivityViewModel.RULE_ID_BUGLY -> stringResource(R.string.localDetailsBugly)\n            LocalAppDetailsActivityViewModel.RULE_ID_SHIPLY -> stringResource(R.string.localDetailsShiply)\n            LocalAppDetailsActivityViewModel.RULE_ID_KUIKLY -> stringResource(R.string.localDetailsKuikly)\n            LocalAppDetailsActivityViewModel.RULE_ID_HIPPY -> stringResource(R.string.localDetailsHippy)\n            LocalAppDetailsActivityViewModel.RULE_ID_RIGHTLY -> stringResource(R.string.localDetailsRightly)\n            LocalAppDetailsActivityViewModel.RULE_ID_UE_LIBRARY -> stringResource(R.string.localDetailsUELibrary)\n            LocalAppDetailsActivityViewModel.RULE_ID_TENCENT_BEACON -> stringResource(R.string.localDetailsTencentBeacon)\n            LocalAppDetailsActivityViewModel.RULE_ID_JETPACK_COMPOSE -> stringResource(R.string.localDetailsJetpackCompose)\n            LocalAppDetailsActivityViewModel.RULE_ID_COMPOSE_MULTIPLATFORM -> stringResource(R.string.localDetailsComposeMultiplatform)\n            LocalAppDetailsActivityViewModel.RULE_ID_FLUTTER -> stringResource(R.string.localDetailsFlutter)\n            LocalAppDetailsActivityViewModel.RULE_ID_REACT_NATIVE -> stringResource(R.string.localDetailsReactNative)\n            LocalAppDetailsActivityViewModel.RULE_ID_TENCENT_BROWSING_SERVICE -> stringResource(R.string.localDetailsTBS)\n            LocalAppDetailsActivityViewModel.RULE_ID_SKYLINE_RENDERING_ENGINE -> stringResource(R.string.localDetailsSkylineRenderingEngine)\n            else -> id\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/ui/LocalAppDetailsActivityViewModel.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.ui\n\nimport android.app.Activity\nimport android.content.Context\nimport android.content.pm.ActivityInfo\nimport android.content.pm.ApplicationInfo\nimport android.content.pm.PackageInfo\nimport android.content.pm.PackageManager\nimport android.content.pm.PermissionInfo\nimport android.content.pm.ProviderInfo\nimport android.content.pm.ServiceInfo\nimport android.graphics.drawable.Drawable\nimport android.os.Build\nimport android.os.Build.VERSION.SDK_INT\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.MutableLiveData\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport com.xiaoniu.qqversionlist.QverbowApplication.Companion.ANDROID_QQ_PACKAGE_NAME\nimport com.xiaoniu.qqversionlist.QverbowApplication.Companion.ANDROID_TIM_PACKAGE_NAME\nimport com.xiaoniu.qqversionlist.QverbowApplication.Companion.ANDROID_WECHAT_PACKAGE_NAME\nimport com.xiaoniu.qqversionlist.R\nimport com.xiaoniu.qqversionlist.data.LocalAppStackResult\nimport com.xiaoniu.qqversionlist.data.LocalAppStackRule\nimport com.xiaoniu.qqversionlist.util.DexResolver\nimport com.xiaoniu.qqversionlist.util.FileUtil.ZipFileCompat\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.joinAll\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.sync.Semaphore\nimport kotlinx.coroutines.sync.withPermit\nimport kotlinx.coroutines.withContext\nimport org.apache.commons.io.IOUtils\nimport java.io.File\nimport java.io.FileInputStream\nimport java.nio.charset.Charset\nimport java.security.MessageDigest\nimport kotlin.use\n\nclass LocalAppDetailsActivityViewModel : ViewModel() {\n    companion object {\n        const val RULE_TYPE_PRIVATE_TENCENT = \"Tencent Private\" // 腾讯私有库\n        const val RULE_TYPE_PRIVATE_3RD_PARTY = \"3rd Party Private\" // 第三方私有库\n        const val RULE_TYPE_OTEAM_TENCENT = \"Tencent Oteam\" // 腾讯开源协同\n        const val RULE_TYPE_OPEN_SOURCE_3RD_PARTY = \"3rd Party Open Source\" // 第三方开源库\n\n        const val RULE_ID_QQNT = \"QQNT\"\n        const val RULE_ID_BUGLY = \"Bugly\"\n        const val RULE_ID_SHIPLY = \"Shiply\"\n        const val RULE_ID_KUIKLY = \"Kuikly\"\n        const val RULE_ID_HIPPY = \"Hippy\"\n        const val RULE_ID_RIGHTLY = \"Rightly\"\n        const val RULE_ID_UE_LIBRARY = \"UELibrary\"\n        const val RULE_ID_TENCENT_BEACON = \"腾讯灯塔\"\n        const val RULE_ID_JETPACK_COMPOSE = \"Jetpack Compose\"\n        const val RULE_ID_COMPOSE_MULTIPLATFORM = \"Compose Multiplatform\"\n        const val RULE_ID_FLUTTER = \"Flutter\"\n        const val RULE_ID_MMKV = \"MMKV\"\n        const val RULE_ID_WCDB = \"WCDB\"\n        const val RULE_ID_MARS = \"Mars\"\n        const val RULE_ID_MATRIX = \"Matrix\"\n        const val RULE_ID_TINKER = \"Tinker\"\n        const val RULE_ID_REACT_NATIVE = \"React Native\"\n        const val RULE_ID_TENCENT_BROWSING_SERVICE = \"腾讯浏览服务\"\n        const val RULE_ID_SKYLINE_RENDERING_ENGINE = \"Skyline 渲染引擎\"\n\n        val DEX_QQNT = arrayOf(\"com.tencent.qqnt\")\n        val DEX_BUGLY = arrayOf(\"com.tencent.bugly\")\n        val DEX_SHIPLY = arrayOf(\"com.tencent.rdelivery\")\n        val DEX_KUIKLY = arrayOf(\"com.tencent.kuikly\",\"com.tencent.kuikly-open\", \"kuikly.com.tencent\")\n        val DEX_HIPPY = arrayOf(\"com.tencent.hippy\")\n        val DEX_RIGHTLY = arrayOf(\"com.tdsrightly\", \"com.tencent.rightly\", \"com.tds.rightly\")\n        val DEX_UE_LIBRARY = arrayOf(\"com.epicgames.ue4\", \"com.epicgames.ue5\")\n        val DEX_TENCENT_BEACON = arrayOf(\"com.tencent.beacon\")\n        val DEX_JETPACK_COMPOSE = arrayOf(\"androidx.compose\")\n        val DEX_COMPOSE_MULTIPLATFORM = arrayOf(\"org.jetbrains.compose\")\n        val DEX_FLUTTER = arrayOf(\"io.flutter\")\n        val DEX_MMKV = arrayOf(\"com.tencent.mmkv\")\n        val DEX_WCDB = arrayOf(\"com.tencent.wcdb\")\n        val DEX_MARS = arrayOf(\"com.tencent.mars\")\n        val DEX_MATRIX = arrayOf(\"com.tencent.matrix\")\n        val DEX_TINKER = arrayOf(\"com.tencent.tinker\")\n        val DEX_REACT_NATIVE = arrayOf(\"com.facebook.react\")\n        val DEX_TENCENT_BROWSING_SERVICE = arrayOf(\"com.tencent.tbs\")\n        val DEX_SKYLINE_RENDERING_ENGINE = arrayOf(\"com.tencent.skyline\", \"com.tencent.luggage.skyline\")\n\n        const val URL_BUGLY = \"https://bugly.tds.qq.com/v2/index/tds-main\"\n        const val URL_UE_LIBRARY =\n            \"https://dev.epicgames.com/documentation/unreal-engine/building-unreal-engine-as-a-library\"\n        const val URL_KUIKLY = \"https://kuikly.tds.qq.com/\"\n        const val URL_HIPPY = \"https://hippy.tds.qq.com/\"\n        const val URL_SHIPLY = \"https://shiply.tds.qq.com/\"\n        const val URL_RIGHTLY = \"https://rightly.tds.qq.com/\"\n        const val URL_TENCENT_BEACON = \"https://beacon.qq.com/\"\n        const val URL_JETPACK_COMPOSE = \"https://developer.android.com/compose\"\n        const val URL_COMPOSE_MULTIPLATFORM = \"https://www.jetbrains.com/compose-multiplatform/\"\n        const val URL_FLUTTER = \"https://flutter.dev/\"\n        const val URL_MMKV = \"https://github.com/Tencent/MMKV\"\n        const val URL_WCDB = \"https://github.com/Tencent/wcdb\"\n        const val URL_MARS = \"https://github.com/Tencent/Mars\"\n        const val URL_MATRIX = \"https://github.com/Tencent/matrix\"\n        const val URL_TINKER = \"https://github.com/Tencent/tinker\"\n        const val URL_REACT_NATIVE = \"https://reactnative.dev/\"\n        const val URL_TENCENT_BROWSING_SERVICE = \"https://x5.tencent.com/\"\n        const val URL_SKYLINE_RENDERING_ENGINE = \"https://developers.weixin.qq.com/miniprogram/dev/framework/runtime/skyline/introduction.html\"\n\n        val DEX_PRE_RULES = listOf<LocalAppStackRule>(\n            LocalAppStackRule(RULE_ID_QQNT, DEX_QQNT, RULE_TYPE_PRIVATE_TENCENT),\n            LocalAppStackRule(RULE_ID_BUGLY, DEX_BUGLY, RULE_TYPE_PRIVATE_TENCENT, URL_BUGLY),\n            LocalAppStackRule(RULE_ID_SHIPLY, DEX_SHIPLY, RULE_TYPE_PRIVATE_TENCENT, URL_SHIPLY),\n            LocalAppStackRule(RULE_ID_KUIKLY, DEX_KUIKLY, RULE_TYPE_PRIVATE_TENCENT, URL_KUIKLY),\n            LocalAppStackRule(RULE_ID_HIPPY, DEX_HIPPY, RULE_TYPE_PRIVATE_TENCENT, URL_HIPPY),\n            LocalAppStackRule(RULE_ID_RIGHTLY, DEX_RIGHTLY, RULE_TYPE_PRIVATE_TENCENT, URL_RIGHTLY),\n            LocalAppStackRule(\n                RULE_ID_UE_LIBRARY, DEX_UE_LIBRARY, RULE_TYPE_PRIVATE_3RD_PARTY, URL_UE_LIBRARY\n            ),\n            LocalAppStackRule(\n                RULE_ID_TENCENT_BEACON,\n                DEX_TENCENT_BEACON,\n                RULE_TYPE_PRIVATE_TENCENT,\n                URL_TENCENT_BEACON\n            ),\n            LocalAppStackRule(\n                RULE_ID_JETPACK_COMPOSE,\n                DEX_JETPACK_COMPOSE,\n                RULE_TYPE_OPEN_SOURCE_3RD_PARTY,\n                URL_JETPACK_COMPOSE\n            ),\n            LocalAppStackRule(\n                RULE_ID_COMPOSE_MULTIPLATFORM,\n                DEX_COMPOSE_MULTIPLATFORM,\n                RULE_TYPE_OPEN_SOURCE_3RD_PARTY,\n                URL_COMPOSE_MULTIPLATFORM\n            ),\n            LocalAppStackRule(\n                RULE_ID_FLUTTER, DEX_FLUTTER, RULE_TYPE_OPEN_SOURCE_3RD_PARTY, URL_FLUTTER\n            ),\n            LocalAppStackRule(RULE_ID_MMKV, DEX_MMKV, RULE_TYPE_OTEAM_TENCENT, URL_MMKV),\n            LocalAppStackRule(RULE_ID_WCDB, DEX_WCDB, RULE_TYPE_OTEAM_TENCENT, URL_WCDB),\n            LocalAppStackRule(RULE_ID_MARS, DEX_MARS, RULE_TYPE_OTEAM_TENCENT, URL_MARS),\n            LocalAppStackRule(RULE_ID_MATRIX, DEX_MATRIX, RULE_TYPE_OTEAM_TENCENT, URL_MATRIX),\n            LocalAppStackRule(RULE_ID_TINKER, DEX_TINKER, RULE_TYPE_OTEAM_TENCENT, URL_TINKER),\n            LocalAppStackRule(\n                RULE_ID_REACT_NATIVE,\n                DEX_REACT_NATIVE,\n                RULE_TYPE_OPEN_SOURCE_3RD_PARTY,\n                URL_REACT_NATIVE\n            ),\n            LocalAppStackRule(\n                RULE_ID_TENCENT_BROWSING_SERVICE,\n                DEX_TENCENT_BROWSING_SERVICE,\n                RULE_TYPE_PRIVATE_TENCENT,\n                URL_TENCENT_BROWSING_SERVICE\n            ),\n            LocalAppStackRule(\n                RULE_ID_SKYLINE_RENDERING_ENGINE,\n                DEX_SKYLINE_RENDERING_ENGINE,\n                RULE_TYPE_PRIVATE_TENCENT,\n                URL_SKYLINE_RENDERING_ENGINE\n            )\n        )\n\n        val RULES_ID_ORDER = listOf(\n            RULE_ID_QQNT,\n            RULE_ID_COMPOSE_MULTIPLATFORM,\n            RULE_ID_JETPACK_COMPOSE,\n            RULE_ID_FLUTTER,\n            RULE_ID_REACT_NATIVE,\n            RULE_ID_UE_LIBRARY,\n            RULE_ID_BUGLY,\n            RULE_ID_SHIPLY,\n            RULE_ID_KUIKLY,\n            RULE_ID_HIPPY,\n            RULE_ID_RIGHTLY\n        )\n    }\n\n    private val _isLoading = MutableLiveData<Boolean>().apply { value = false }\n    val isLoading: LiveData<Boolean> = _isLoading\n\n    private val _isErr = MutableLiveData<Boolean>().apply { value = false }\n    val isErr: LiveData<Boolean> = _isErr\n\n    private val _isAIShowing = MutableLiveData<Boolean>().apply { value = false }\n    val isAIShowing: LiveData<Boolean> = _isAIShowing\n\n    private val _localSM3 = MutableLiveData<String>().apply { value = \"\" }\n    val localSM3: LiveData<String> = _localSM3\n\n    private val _interSM3 = MutableLiveData<String>().apply { value = \"\" }\n    val interSM3: LiveData<String> = _interSM3\n\n    private val _localVersionNameWithInter = MutableLiveData<String>().apply { value = \"\" }\n    val localVersionNameWithInter: LiveData<String> = _localVersionNameWithInter\n\n    private val _localVersion = MutableLiveData<String>().apply { value = \"\" }\n    val localVersion: LiveData<String> = _localVersion\n\n    private val _channelText = MutableLiveData<String>().apply { value = \"\" }\n    val channelText: LiveData<String> = _channelText\n\n    private val _localSDKText = MutableLiveData<String>().apply { value = \"\" }\n    val localSDKText: LiveData<String> = _localSDKText\n\n    private val _isTIM = MutableLiveData<Boolean>().apply { value = false }\n    val isTIM: LiveData<Boolean> = _isTIM\n\n    private val _timBasedVer = MutableLiveData<String>().apply { value = \"\" }\n    val timBasedVer: LiveData<String> = _timBasedVer\n\n    private val _isWeixin = MutableLiveData<Boolean>().apply { value = false }\n    val isWeixin: LiveData<Boolean> = _isWeixin\n\n    // 基础信息\n    private val _appName = MutableLiveData<String>().apply { value = \"\" }\n    val appName: LiveData<String> = _appName\n\n    private val _appIconImage = MutableLiveData<Drawable>()\n    val appIconImage: LiveData<Drawable> = _appIconImage\n\n    private val _targetSDK = MutableLiveData<Int>().apply { value = 0 }\n    val targetSDK: LiveData<Int> = _targetSDK\n\n    private val _minSDK = MutableLiveData<Int>().apply { value = 0 }\n    val minSDK: LiveData<Int> = _minSDK\n\n    private val _compileSDK = MutableLiveData<Int>().apply { value = 0 }\n    val compileSDK: LiveData<Int> = _compileSDK\n\n    private val _versionName = MutableLiveData<String>().apply { value = \"\" }\n    val versionName: LiveData<String> = _versionName\n\n    private val _rdmUUID = MutableLiveData<String>().apply { value = \"\" }\n    val rdmUUID: LiveData<String> = _rdmUUID\n\n    private val _versionCode = MutableLiveData<String>().apply { value = \"\" }\n    val versionCode: LiveData<String> = _versionCode\n\n    private val _appSettingParams = MutableLiveData<String>().apply { value = \"\" }\n    val appSettingParams: LiveData<String> = _appSettingParams\n\n    private val _appSettingParamsPad = MutableLiveData<String>().apply { value = \"\" }\n    val appSettingParamsPad: LiveData<String> = _appSettingParamsPad\n\n    private val _qua = MutableLiveData<String>().apply { value = \"\" }\n    val qua: LiveData<String> = _qua\n\n    // 栈信息检查结果\n    private val _localAppStackResults =\n        MutableLiveData<MutableList<LocalAppStackResult>>().apply { value = mutableListOf() }\n    val localAppStackResults: LiveData<MutableList<LocalAppStackResult>> = _localAppStackResults\n\n    private val _activityDiff = MutableLiveData<String>().apply { value = \"\" }\n    val activityDiff: LiveData<String> = _activityDiff\n\n    private val _serviceDiff = MutableLiveData<String>().apply { value = \"\" }\n    val serviceDiff: LiveData<String> = _serviceDiff\n\n    private val _providerDiff = MutableLiveData<String>().apply { value = \"\" }\n    val providerDiff: LiveData<String> = _providerDiff\n\n    private val _receiverDiff = MutableLiveData<String>().apply { value = \"\" }\n    val receiverDiff: LiveData<String> = _receiverDiff\n\n    private val _permissionDiff = MutableLiveData<String>().apply { value = \"\" }\n    val permissionDiff: LiveData<String> = _permissionDiff\n\n    private val _isChangesBackLLMWorking = MutableLiveData<Boolean>().apply { value = false }\n    val isChangesBackLLMWorking: LiveData<Boolean> = _isChangesBackLLMWorking\n\n    private val _changesBackLLMGenText = MutableLiveData<String>().apply { value = \"\" }\n    val changesBackLLMGenText: LiveData<String> = _changesBackLLMGenText\n\n    fun setLoading(isLoading: Boolean) {\n        _isLoading.value = isLoading\n    }\n\n    fun setErr(isErr: Boolean) {\n        _isErr.value = isErr\n    }\n\n    fun setAIShowing(isAIShowing: Boolean) {\n        _isAIShowing.value = isAIShowing\n    }\n\n    fun setLocalSM3(sm3: String) {\n        _localSM3.value = sm3\n    }\n\n    fun setInterSM3(sm3: String) {\n        _interSM3.value = sm3\n    }\n\n    fun setLocalVersionNameWithInter(versionName: String) {\n        _localVersionNameWithInter.value = versionName\n    }\n\n    fun setLocalVersion(version: String) {\n        _localVersion.value = version\n    }\n\n    fun setChannelText(text: String) {\n        _channelText.value = text\n    }\n\n    fun setLocalSDKText(text: String) {\n        _localSDKText.value = text\n    }\n\n    fun setIsTIM(isTIM: Boolean) {\n        _isTIM.value = isTIM\n    }\n\n    fun setTIMBasedVer(context: Context, ver: String) {\n        _timBasedVer.value = context.getString(R.string.basedOnQQVer, ver)\n    }\n\n    fun setIsWeixin(isWeixin: Boolean) {\n        _isWeixin.value = isWeixin\n    }\n\n    fun setAppName(appName: String) {\n        _appName.value = appName\n    }\n\n    fun setAppIconImage(appIconImage: Drawable) {\n        _appIconImage.value = appIconImage\n    }\n\n    fun setTargetSDK(targetSDK: Int) {\n        _targetSDK.value = targetSDK\n    }\n\n    fun setMinSDK(minSDK: Int) {\n        _minSDK.value = minSDK\n    }\n\n    fun setCompileSDK(compileSDK: Int) {\n        _compileSDK.value = compileSDK\n    }\n\n    fun setVersionName(versionName: String) {\n        _versionName.value = versionName\n    }\n\n    fun setRdmUUID(rdmUUID: String) {\n        _rdmUUID.value = rdmUUID\n    }\n\n    fun setVersionCode(versionCode: String) {\n        _versionCode.value = versionCode\n    }\n\n    fun setAppSettingParams(appSettingParams: String) {\n        _appSettingParams.value = appSettingParams\n    }\n\n    fun setAppSettingParamsPad(appSettingParamsPad: String) {\n        _appSettingParamsPad.value = appSettingParamsPad\n    }\n\n    fun setQua(qua: String) {\n        _qua.value = qua\n    }\n\n    fun setLocalAppStackResults(result: MutableList<LocalAppStackResult>) {\n        _localAppStackResults.value = result\n    }\n\n    fun setActivityDiff(diff: String) {\n        _activityDiff.value = diff\n    }\n\n    fun setServiceDiff(diff: String) {\n        _serviceDiff.value = diff\n    }\n\n    fun setProviderDiff(diff: String) {\n        _providerDiff.value = diff\n    }\n\n    fun setReceiverDiff(diff: String) {\n        _receiverDiff.value = diff\n    }\n\n    fun setPermissionDiff(diff: String) {\n        _permissionDiff.value = diff\n    }\n\n    fun setChangesBackLLMWorking(isWorking: Boolean) {\n        _isChangesBackLLMWorking.value = isWorking\n    }\n\n    fun setChangesBackLLMGenText(text: String) {\n        _changesBackLLMGenText.value = text\n    }\n\n    fun getInfo(activity: Activity, type: String, appPath: String? = null) {\n        setLoading(true)\n        var packageInfo: PackageInfo? = null\n        var applicationInfo: ApplicationInfo? = null\n        if (type == \"inter\") {\n            val packageInfoPre = activity.packageManager.getPackageArchiveInfo(\n                appPath!!,\n                PackageManager.GET_META_DATA or PackageManager.GET_ACTIVITIES or PackageManager.GET_SERVICES or PackageManager.GET_RECEIVERS or PackageManager.GET_PROVIDERS or PackageManager.GET_PERMISSIONS\n            )\n            val applicationInfoPre = packageInfoPre?.applicationInfo\n            if (packageInfoPre != null && applicationInfoPre != null) {\n                packageInfo = packageInfoPre\n                applicationInfo = applicationInfoPre\n            }\n        } else {\n            setIsTIM(type == \"TIM\")\n            setIsWeixin(type == \"Weixin\")\n            packageInfo = activity.packageManager.getPackageInfo(\n                when (type) {\n                    \"TIM\" -> ANDROID_TIM_PACKAGE_NAME\n                    \"Weixin\" -> ANDROID_WECHAT_PACKAGE_NAME\n                    else -> ANDROID_QQ_PACKAGE_NAME\n                }, 0\n            )\n            applicationInfo = activity.packageManager.getApplicationInfo(\n                when (type) {\n                    \"TIM\" -> ANDROID_TIM_PACKAGE_NAME\n                    \"Weixin\" -> ANDROID_WECHAT_PACKAGE_NAME\n                    else -> ANDROID_QQ_PACKAGE_NAME\n                }, PackageManager.GET_META_DATA\n            )\n        }\n        if (packageInfo == null || applicationInfo == null) {\n            setErr(true)\n            setAppName(activity.getString(R.string.unknownErr))\n            cleanCache(activity)\n            setLoading(false)\n            return\n        }\n        val packageName = getAppPackageName(applicationInfo)\n        if (packageName == ANDROID_QQ_PACKAGE_NAME || packageName == ANDROID_TIM_PACKAGE_NAME || packageName == ANDROID_WECHAT_PACKAGE_NAME) {\n            when (packageName) {\n                ANDROID_TIM_PACKAGE_NAME -> setIsTIM(true)\n                ANDROID_WECHAT_PACKAGE_NAME -> setIsWeixin(true)\n            }\n\n            val allJobs = mutableListOf<Job>().apply {\n                add(viewModelScope.launch(Dispatchers.IO) {\n                    val baseJobs = mutableListOf<Job>().apply {\n                        add(viewModelScope.launch(Dispatchers.IO) {\n                            val appName = getAppName(applicationInfo, activity)\n                            withContext(Dispatchers.Main) {\n                                setAppName(appName)\n                            }\n                        })\n                        add(viewModelScope.launch(Dispatchers.IO) {\n                            val appIconImage = getAppIconImage(applicationInfo, activity)\n                            if (appIconImage != null) withContext(Dispatchers.Main) {\n                                setAppIconImage(appIconImage)\n                            }\n                        })\n                        add(viewModelScope.launch(Dispatchers.IO) {\n                            val targetSDK = getTargetSDK(applicationInfo)\n                            withContext(Dispatchers.Main) {\n                                setTargetSDK(targetSDK)\n                            }\n                        })\n                        add(viewModelScope.launch(Dispatchers.IO) {\n                            val minSDK = getMinSDK(applicationInfo)\n                            withContext(Dispatchers.Main) {\n                                setMinSDK(minSDK)\n                            }\n                        })\n                        add(viewModelScope.launch(Dispatchers.IO) {\n                            val compileSDK = getCompileSDK(applicationInfo)\n                            withContext(Dispatchers.Main) {\n                                if (compileSDK != null) setCompileSDK(compileSDK) else setCompileSDK(\n                                    0\n                                )\n                            }\n                        })\n                        checkAndSetProperty(this, ::getVersionName, ::setVersionName, packageInfo)\n                        checkAndSetProperty(this, ::getVersionCode, ::setVersionCode, packageInfo)\n                        if (isWeixin.value == false) {\n                            checkAndSetProperty(this, ::getRdmUUID, ::setRdmUUID, applicationInfo)\n                            checkAndSetProperty(\n                                this, ::getAppSettingParams, ::setAppSettingParams, applicationInfo\n                            )\n                            checkAndSetProperty(\n                                this,\n                                ::getAppSettingParamsPad,\n                                ::setAppSettingParamsPad,\n                                applicationInfo\n                            )\n                            add(viewModelScope.launch(Dispatchers.IO) {\n                                val qua = getQua(packageInfo)\n                                withContext(Dispatchers.Main) {\n                                    setQua(if (qua.isNullOrEmpty()) \"\" else qua.replace(\"\\n\", \"\"))\n                                }\n                            })\n                        }\n                    }\n                    baseJobs.joinAll()\n                    val checkIsSamePackageJobs = mutableListOf<Job>().apply {\n                        add(viewModelScope.launch(Dispatchers.IO) {\n                            if (type == \"inter\") {\n                                val interSM3 = getSM3(applicationInfo)\n                                withContext(Dispatchers.Main) {\n                                    setInterSM3(interSM3)\n                                }\n                            }\n                        })\n                        add(viewModelScope.launch(Dispatchers.IO) {\n                            try {\n                                val applicationInfo = activity.packageManager.getApplicationInfo(\n                                    packageName, PackageManager.GET_META_DATA\n                                )\n                                val packageInfo = activity.packageManager.getPackageInfo(\n                                    packageName, 0\n                                )\n                                val localSM3 = getSM3(applicationInfo)\n                                val localVersionName = getVersionName(packageInfo)\n                                withContext(Dispatchers.Main) {\n                                    setLocalSM3(localSM3)\n                                    if (localVersionName != null) setLocalVersionNameWithInter(\n                                        localVersionName\n                                    )\n                                }\n                            } catch (_: Exception) {\n                                withContext(Dispatchers.Main) { setLocalSM3(\"\") }\n                            }\n                        })\n                    }\n                    checkIsSamePackageJobs.joinAll()\n                    val isSamePackage = localSM3.value == interSM3.value\n                    val diffPackagesJob = mutableListOf<Job>().apply {\n                        add(viewModelScope.launch(Dispatchers.IO) {\n                            if (type == \"inter\" && !isSamePackage && localSM3.value != \"\" && SDK_INT >= Build.VERSION_CODES.P) {\n                                val localPackageInfo = activity.packageManager.getPackageInfo(\n                                    packageName,\n                                    PackageManager.GET_ACTIVITIES or PackageManager.GET_SERVICES or PackageManager.GET_RECEIVERS or PackageManager.GET_PROVIDERS or PackageManager.GET_PERMISSIONS\n                                )\n                                val interPackageInfo = packageInfo\n                                val localVersionCode = getVersionCode(localPackageInfo)\n                                val interVersionCode = getVersionCode(interPackageInfo)\n                                if (localVersionCode != null && interVersionCode != null) withContext(\n                                    Dispatchers.Main\n                                ) {\n                                    compareActivities(\n                                        localPackageInfo.activities, interPackageInfo.activities\n                                    )\n                                    compareServices(\n                                        localPackageInfo.services, interPackageInfo.services\n                                    )\n                                    compareReceivers(\n                                        localPackageInfo.receivers, interPackageInfo.receivers\n                                    )\n                                    compareProviders(\n                                        localPackageInfo.providers, interPackageInfo.providers\n                                    )\n                                    comparePermissions(\n                                        localPackageInfo.permissions, interPackageInfo.permissions\n                                    )\n                                }\n                            }\n                        })\n                    }\n                    diffPackagesJob.joinAll()\n                    withContext(Dispatchers.Main) {\n                        compileSDK.value?.let { sdkVersion ->\n                            if (sdkVersion != 0) setLocalSDKText(\"Target ${targetSDK.value} | Min ${minSDK.value} | Compile $sdkVersion\") else setLocalSDKText(\n                                \"Target ${targetSDK.value} | Min ${minSDK.value}\"\n                            )\n                        }\n                        if (isWeixin.value == true) {\n                            setLocalVersion(\"${versionName.value} (${versionCode.value})\")\n                        } else {\n                            versionCode.value?.let { versionCode ->\n                                rdmUUID.value?.let { rdmUUID ->\n                                    setLocalVersion(\"${versionName.value}.${rdmUUID.split(\"_\")[0]} ($versionCode)\")\n                                } ?: setLocalVersion(\n                                    \"${versionName.value}.${rdmUUID.value!!.split(\"_\")[0]}\"\n                                )\n                            }\n                                ?: setLocalVersion(\"${versionName.value}.${rdmUUID.value!!.split(\"_\")[0]}\")\n                            appSettingParams.value?.let { appSettingParams ->\n                                val parts = appSettingParams.split(\"#\")\n                                if (parts.size > 3) setChannelText(parts[3]) else setChannelText(\"\")\n                            } ?: setChannelText(\"\")\n                            if (isTIM.value == true) qua.value?.let { qua ->\n                                setTIMBasedVer(\n                                    activity, if (qua.length > 3) qua.split(\"_\")[3] else \"\"\n                                )\n                            }\n                        }\n                        if (type == \"inter\" && !isSamePackage && localSM3.value != \"\" && SDK_INT >= Build.VERSION_CODES.P) setAIShowing(\n                            true\n                        )\n                    }\n                })\n                add(viewModelScope.launch(Dispatchers.IO) {\n                    val semaphore = Semaphore(3)\n                    val dexJobs = mutableListOf<Job>()\n                    DEX_PRE_RULES.forEach { rule ->\n                        dexJobs.add(viewModelScope.launch(Dispatchers.IO) {\n                            semaphore.withPermit {\n                                val findDex = checkLibrary(applicationInfo.sourceDir, rule.dex)\n                                if (findDex != null) {\n                                    withContext(Dispatchers.Main) {\n                                        val oldList = localAppStackResults.value\n                                        val newList =\n                                            (if (oldList.isNullOrEmpty()) mutableListOf() else oldList).apply {\n                                                if (!this.any { it.id == rule.id }) {\n                                                    this.add(LocalAppStackResult(rule.id, findDex))\n                                                }\n                                            }\n                                        setLocalAppStackResults(newList.toMutableList())\n                                    }\n                                }\n                            }\n                        })\n                    }\n                    dexJobs.joinAll()\n                })\n            }\n            viewModelScope.launch {\n                allJobs.joinAll()\n                setLoading(false)\n                cleanCache(activity)\n            }\n        } else {\n            setErr(true)\n            setAppName(activity.getString(R.string.packageNameIsErr))\n            setLoading(false)\n            cleanCache(activity)\n            return\n        }\n    }\n\n    private fun getSM3(applicationInfo: ApplicationInfo): String {\n        val appSourceDir = applicationInfo.sourceDir\n        val messageDigest = MessageDigest.getInstance(\"SM3\")\n        val fileInputStream = FileInputStream(appSourceDir)\n        val buffer = ByteArray(8192)\n        var bytesRead: Int\n        while (fileInputStream.read(buffer).also { bytesRead = it } != -1) messageDigest.update(\n            buffer, 0, bytesRead\n        )\n        return messageDigest.digest().joinToString(\"\") { \"%02X\".format(it) }\n    }\n\n    private fun getAppPackageName(applicationInfo: ApplicationInfo): String {\n        return applicationInfo.packageName\n    }\n\n    private fun getAppName(applicationInfo: ApplicationInfo, activity: Activity): String {\n        return applicationInfo.loadLabel(activity.packageManager).toString()\n    }\n\n    private fun getAppIconImage(applicationInfo: ApplicationInfo, activity: Activity): Drawable? {\n        return applicationInfo.loadIcon(activity.packageManager)\n    }\n\n    private fun getTargetSDK(applicationInfo: ApplicationInfo): Int {\n        return applicationInfo.targetSdkVersion\n    }\n\n    private fun getMinSDK(applicationInfo: ApplicationInfo): Int {\n        return applicationInfo.minSdkVersion\n    }\n\n    private fun getCompileSDK(applicationInfo: ApplicationInfo): Int? {\n        return if (SDK_INT >= Build.VERSION_CODES.S) applicationInfo.compileSdkVersion else null\n    }\n\n    private fun getVersionName(packageInfo: PackageInfo): String? {\n        return packageInfo.versionName\n    }\n\n    private fun getRdmUUID(applicationInfo: ApplicationInfo): String? {\n        return applicationInfo.metaData?.getString(\"com.tencent.rdm.uuid\")\n    }\n\n    private fun getVersionCode(packageInfo: PackageInfo): String? {\n        return if (SDK_INT >= Build.VERSION_CODES.P) packageInfo.longVersionCode.toString() else null\n    }\n\n    private fun getAppSettingParams(applicationInfo: ApplicationInfo): String? {\n        return applicationInfo.metaData?.getString(\"AppSetting_params\")\n    }\n\n    private fun getAppSettingParamsPad(applicationInfo: ApplicationInfo): String? {\n        return applicationInfo.metaData?.getString(\"AppSetting_params_pad\")\n    }\n\n    private fun getQua(packageInfo: PackageInfo): String? {\n        val sourceDir = packageInfo.applicationInfo?.sourceDir ?: return null\n        val file = File(sourceDir)\n        if (!file.exists()) return null\n        return runCatching {\n            ZipFileCompat(file).use { zipFile ->\n                val entry = zipFile.getEntry(\"assets/qua.ini\") ?: return@runCatching null\n                zipFile.getInputStream(entry).use { inputStream ->\n                    IOUtils.toString(inputStream, Charset.defaultCharset())\n                }\n            }\n        }.getOrElse { exception -> throw Exception(exception) }\n    }\n\n    private fun <T> checkAndSetProperty(\n        jobs: MutableList<Job>,\n        checkFunction: (T) -> String?,\n        setProperty: (String) -> Unit,\n        param: T\n    ) {\n        jobs.add(viewModelScope.launch(Dispatchers.IO) {\n            val result = checkFunction(param)\n            withContext(Dispatchers.Main) { setProperty(if (result.isNullOrEmpty()) \"\" else result) }\n        })\n    }\n\n    private fun checkLibrary(appPath: String, dexList: Array<String>): String? {\n        dexList.forEach { dex ->\n            val findResult = DexResolver.findPackage(appPath, dex)\n            if (findResult.getOrDefault(false) == true) return dex\n        }\n        return null\n    }\n\n    private fun compareActivities(\n        components1: Array<ActivityInfo>?, components2: Array<ActivityInfo>?\n    ) {\n        val set1 = components1?.map { it.name }?.toSet() ?: emptySet()\n        val set2 = components2?.map { it.name }?.toSet() ?: emptySet()\n\n        val added = set2 - set1\n        val removed = set1 - set2\n\n        val result = StringBuilder()\n\n        if (added.isNotEmpty()) result.append(\"Added activities: \").append(added.joinToString(\", \"))\n            .append(\"\\n\")\n        if (removed.isNotEmpty()) result.append(\"Removed activities: \")\n            .append(removed.joinToString(\", \")).append(\"\\n\")\n\n        setActivityDiff(result.toString())\n    }\n\n    private fun compareServices(\n        components1: Array<ServiceInfo>?, components2: Array<ServiceInfo>?\n    ) {\n        val set1 = components1?.map { it.name }?.toSet() ?: emptySet()\n        val set2 = components2?.map { it.name }?.toSet() ?: emptySet()\n\n        val added = set2 - set1\n        val removed = set1 - set2\n\n        val result = StringBuilder()\n\n        if (added.isNotEmpty()) result.append(\"Added services: \").append(added.joinToString(\", \"))\n            .append(\"\\n\")\n        if (removed.isNotEmpty()) result.append(\"Removed services: \")\n            .append(removed.joinToString(\", \")).append(\"\\n\")\n\n        setServiceDiff(result.toString())\n    }\n\n    private fun compareReceivers(\n        components1: Array<ActivityInfo>?, components2: Array<ActivityInfo>?\n    ) {\n        val set1 = components1?.map { it.name }?.toSet() ?: emptySet()\n        val set2 = components2?.map { it.name }?.toSet() ?: emptySet()\n\n        val added = set2 - set1\n        val removed = set1 - set2\n\n        val result = StringBuilder()\n\n        if (added.isNotEmpty()) result.append(\"Added receivers: \").append(added.joinToString(\", \"))\n            .append(\"\\n\")\n        if (removed.isNotEmpty()) result.append(\"Removed receivers: \")\n            .append(removed.joinToString(\", \")).append(\"\\n\")\n\n        setReceiverDiff(result.toString())\n    }\n\n    private fun compareProviders(\n        components1: Array<ProviderInfo>?, components2: Array<ProviderInfo>?\n    ) {\n        val set1 = components1?.map { it.name }?.toSet() ?: emptySet()\n        val set2 = components2?.map { it.name }?.toSet() ?: emptySet()\n\n        val added = set2 - set1\n        val removed = set1 - set2\n\n        val result = StringBuilder()\n\n        if (added.isNotEmpty()) result.append(\"Added providers: \").append(added.joinToString(\", \"))\n            .append(\"\\n\")\n        if (removed.isNotEmpty()) result.append(\"Removed providers: \")\n            .append(removed.joinToString(\", \")).append(\"\\n\")\n\n        setProviderDiff(result.toString())\n    }\n\n    private fun comparePermissions(\n        permissions1: Array<PermissionInfo>?, permissions2: Array<PermissionInfo>?\n    ) {\n        val set1 = permissions1?.map { it.name }?.toSet() ?: emptySet()\n        val set2 = permissions2?.map { it.name }?.toSet() ?: emptySet()\n\n        val added = set2 - set1\n        val removed = set1 - set2\n\n        val result = StringBuilder()\n\n        if (added.isNotEmpty()) result.append(\"Added permissions: \")\n            .append(added.joinToString(\", \")).append(\"\\n\")\n        if (removed.isNotEmpty()) result.append(\"Removed permissions: \")\n            .append(removed.joinToString(\", \")).append(\"\\n\")\n\n        setPermissionDiff(result.toString())\n    }\n\n    fun cleanCache(activity: Activity) {\n        val cacheDir = File(activity.cacheDir, \"apkAnalysis\")\n        if (cacheDir.exists()) cacheDir.deleteRecursively()\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/ui/LocalQQAdapter.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.ui\n\nimport android.annotation.SuppressLint\nimport android.content.Intent\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.core.view.isVisible\nimport androidx.recyclerview.widget.RecyclerView\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.xiaoniu.qqversionlist.R\nimport com.xiaoniu.qqversionlist.databinding.DialogLocalQqTimInfoBinding\nimport com.xiaoniu.qqversionlist.databinding.LocalQqBinding\nimport com.xiaoniu.qqversionlist.util.ClipboardUtil.copyText\nimport com.xiaoniu.qqversionlist.util.DataStoreUtil\nimport com.xiaoniu.qqversionlist.util.InfoUtil.showToast\n\nclass LocalQQAdapter : RecyclerView.Adapter<LocalQQAdapter.LocalQQViewHolder>() {\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): LocalQQViewHolder {\n        val binding = LocalQqBinding.inflate(LayoutInflater.from(parent.context), parent, false)\n        return LocalQQViewHolder(binding)\n    }\n\n    @SuppressLint(\"SetTextI18n\")\n    override fun onBindViewHolder(holder: LocalQQViewHolder, position: Int) {\n        val QQTargetInstallKV = DataStoreUtil.getStringKV(\"QQTargetInstall\", \"\")\n        val QQMinInstallKV = DataStoreUtil.getStringKV(\"QQMinInstall\", \"\")\n        val QQCompileInstallKV = DataStoreUtil.getStringKV(\"QQCompileInstall\", \"\")\n        val QQVersionInstallKV = DataStoreUtil.getStringKV(\"QQVersionInstall\", \"\")\n        val QQRdmUUIDInstallKV = DataStoreUtil.getStringKV(\"QQRdmUUIDInstall\", \"\")\n        val QQVersionCodeInstallKV = DataStoreUtil.getStringKV(\"QQVersionCodeInstall\", \"\")\n        val QQAppSettingParamsInstallKV = DataStoreUtil.getStringKV(\"QQAppSettingParamsInstall\", \"\")\n        val QQAppSettingParamsPadInstallKV =\n            DataStoreUtil.getStringKV(\"QQAppSettingParamsPadInstall\", \"\")\n        val QQQuaKV = DataStoreUtil.getStringKV(\"QQQua\", \"\")\n        val QQRdmUUIDInstallProcessed =\n            if (QQRdmUUIDInstallKV != \"\") \".${QQRdmUUIDInstallKV.split(\"_\")[0]}\" else \"\"\n        val QQChannelInstallProcessed =\n            if (QQAppSettingParamsInstallKV != \"\") QQAppSettingParamsInstallKV.split(\"#\")[3] else \"\"\n        holder.apply {\n            if (QQVersionInstallKV != \"\") {\n                itemQqInstallText.text =\n                    itemView.context.getString(R.string.localQQVersion) + QQVersionInstallKV + QQRdmUUIDInstallProcessed + (if (QQVersionCodeInstallKV != \"\") \" (${QQVersionCodeInstallKV})\" else \"\") + (if (QQChannelInstallProcessed != \"\") \" - $QQChannelInstallProcessed\" else \"\")\n                itemQqInstallCard.isVisible = true\n\n                // 无障碍标记\n                /*if (DefaultArtifactVersion(QQVersionInstall2) >= DefaultArtifactVersion(\n                        EARLIEST_ACCESSIBILITY_VERSION\n                    )\n                ) itemQqInstallText.setCompoundDrawablesWithIntrinsicBounds(\n                    R.drawable.accessibility_new_24px, 0, 0, 0\n                ) else itemQqInstallText.setCompoundDrawablesWithIntrinsicBounds(\n                    R.drawable.phone_find_line, 0, 0, 0\n                )\n                val oldItemQqInstallCardDescribe =\n                    itemQqInstallText.text.toString()\n                if (DefaultArtifactVersion(QQVersionInstall2) >= DefaultArtifactVersion(\n                        EARLIEST_ACCESSIBILITY_VERSION\n                    )\n                ) itemQqInstallCard.contentDescription =\n                    \"$oldItemQqInstallCardDescribe。\" + String(\n                        Base64.decode(\n                            getString(R.string.accessibilityTag),\n                            Base64.NO_WRAP\n                        ), Charsets.UTF_8\n                    )*/\n                itemQqInstallCard.setOnLongClickListener {\n                    if (DataStoreUtil.getBooleanKV(\"longPressCard\", true)) {\n                        if (DataStoreUtil.getBooleanKV(\"useNewLocalPage\", true)) {\n                            itemView.context.startActivity(Intent(\n                                itemView.context, LocalAppDetailsActivity::class.java\n                            ).apply { putExtra(\"localAppType\", \"QQ\") })\n                        } else {\n                            val localInfoAllText = (if (QQTargetInstallKV != \"\") \"Target SDK${\n                                itemView.context.getString(R.string.colon)\n                            }${QQTargetInstallKV}\" else \"\") + (if (QQMinInstallKV != \"\") \"\\nMin SDK${\n                                itemView.context.getString(R.string.colon)\n                            }${QQMinInstallKV}\" else \"\") + (if (QQCompileInstallKV != \"\") \"\\nCompile SDK${\n                                itemView.context.getString(R.string.colon)\n                            }${\n                                QQCompileInstallKV\n                            }\" else \"\") + \"\\nVersion Name${itemView.context.getString(R.string.colon)}${\n                                QQVersionInstallKV\n                            }\" + (if (QQRdmUUIDInstallKV != \"\") \"\\nRdm UUID${\n                                itemView.context.getString(R.string.colon)\n                            }${\n                                QQRdmUUIDInstallKV\n                            }\" else \"\") + (if (QQVersionCodeInstallKV != \"\") \"\\nVersion Code${\n                                itemView.context.getString(R.string.colon)\n                            }${\n                                QQVersionCodeInstallKV\n                            }\" else \"\") + (if (QQAppSettingParamsInstallKV != \"\") \"\\nAppSetting_params${\n                                itemView.context.getString(R.string.colon)\n                            }${\n                                QQAppSettingParamsInstallKV\n                            }\" else \"\") + (if (QQAppSettingParamsPadInstallKV != \"\") \"\\nAppSetting_params_pad${\n                                itemView.context.getString(R.string.colon)\n                            }${\n                                QQAppSettingParamsPadInstallKV\n                            }\" else \"\") + (if (QQQuaKV != \"\") \"\\nQUA${\n                                itemView.context.getString(R.string.colon)\n                            }${QQQuaKV}\" else \"\")\n\n                            val dialogLocalQqTimInfoBinding = DialogLocalQqTimInfoBinding.inflate(\n                                LayoutInflater.from(itemView.context)\n                            )\n\n                            MaterialAlertDialogBuilder(itemView.context).setView(\n                                dialogLocalQqTimInfoBinding.root\n                            ).setTitle(R.string.localQQVersionDetails)\n                                .setIcon(R.drawable.phone_find_line).apply {\n                                    dialogLocalQqTimInfoBinding.apply {\n                                        val dialogLocalSdkDesc =\n                                            if (QQTargetInstallKV != \"\" && QQMinInstallKV != \"\" && QQChannelInstallProcessed != \"\") \"Target $QQTargetInstallKV | Min $QQMinInstallKV | Compile $QQCompileInstallKV\" else \"Target $QQTargetInstallKV | Min $QQMinInstallKV\"\n\n                                        dialogLocalSdk.apply {\n                                            setCellDescription(dialogLocalSdkDesc)\n                                            this.setOnClickListener {\n                                                context.copyText(\n                                                    \"Android SDK${\n                                                        itemView.context.getString(R.string.colon)\n                                                    }$dialogLocalSdkDesc\"\n                                                )\n                                            }\n                                        }\n                                        dialogLocalVersionName.apply {\n                                            setCellDescription(QQVersionInstallKV)\n                                            this.setOnClickListener {\n                                                context.copyText(\n                                                    \"Version Name${\n                                                        itemView.context.getString(R.string.colon)\n                                                    }$QQVersionInstallKV\"\n                                                )\n                                            }\n                                        }\n                                        dialogLocalRdmUuid.apply {\n                                            if (QQRdmUUIDInstallKV != \"\") {\n                                                setCellDescription(QQRdmUUIDInstallKV)\n                                                this.setOnClickListener {\n                                                    context.copyText(\n                                                        \"Rdm UUID${\n                                                            itemView.context.getString(R.string.colon)\n                                                        }$QQRdmUUIDInstallKV\"\n                                                    )\n                                                }\n                                            } else dialogLocalRdmUuid.isVisible = false\n                                        }\n                                        dialogLocalVersionCode.apply {\n                                            if (QQVersionCodeInstallKV != \"\") {\n                                                setCellDescription(QQVersionCodeInstallKV)\n                                                this.setOnClickListener {\n                                                    context.copyText(\n                                                        \"Version Code${\n                                                            itemView.context.getString(R.string.colon)\n                                                        }$QQVersionCodeInstallKV\"\n                                                    )\n                                                }\n                                            } else dialogLocalVersionCode.isVisible = false\n                                        }\n                                        dialogLocalAppsettingParams.apply {\n                                            if (QQAppSettingParamsInstallKV != \"\") {\n                                                setCellDescription(QQAppSettingParamsInstallKV)\n                                                this.setOnClickListener {\n                                                    context.copyText(\n                                                        \"AppSetting_params${\n                                                            itemView.context.getString(R.string.colon)\n                                                        }$QQAppSettingParamsInstallKV\"\n                                                    )\n                                                }\n                                            } else dialogLocalAppsettingParams.isVisible = false\n                                        }\n                                        dialogLocalAppsettingParamsPad.apply {\n                                            if (QQAppSettingParamsPadInstallKV != \"\") {\n                                                setCellDescription(QQAppSettingParamsPadInstallKV)\n                                                this.setOnClickListener {\n                                                    context.copyText(\n                                                        \"AppSetting_params_pad${\n                                                            itemView.context.getString(R.string.colon)\n                                                        }$QQAppSettingParamsPadInstallKV\"\n                                                    )\n                                                }\n                                            } else dialogLocalAppsettingParamsPad.isVisible = false\n                                        }\n                                        dialogLocalQua.apply {\n                                            if (QQQuaKV != \"\") {\n                                                setCellDescription(QQQuaKV)\n                                                this.setOnClickListener {\n                                                    context.copyText(\n                                                        \"QUA${\n                                                            itemView.context.getString(\n                                                                R.string.colon\n                                                            )\n                                                        }$QQQuaKV\"\n                                                    )\n                                                }\n                                            } else dialogLocalQua.isVisible = false\n                                        }\n                                        dialogLocalCopyAll.setOnClickListener {\n                                            context.copyText(localInfoAllText)\n                                        }\n                                    }\n                                }.show()\n                        }\n                    } else showToast(R.string.longPressToViewSourceDetailsIsDisabled)\n                    true\n                }\n            } else itemQqInstallCard.isVisible = false\n        }\n    }\n\n    override fun getItemCount(): Int = 1\n\n    @SuppressLint(\"NotifyDataSetChanged\")\n    fun refreshData() {\n        notifyDataSetChanged()\n    }\n\n    @SuppressLint(\"SetTextI18n\")\n    inner class LocalQQViewHolder(binding: LocalQqBinding) : RecyclerView.ViewHolder(binding.root) {\n        val itemQqInstallText = binding.itemQqInstallText\n        val itemQqInstallCard = binding.itemQqInstallCard\n    }\n}\n\n"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/ui/LocalTIMAdapter.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.ui\n\nimport android.annotation.SuppressLint\nimport android.content.Intent\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.core.view.isVisible\nimport androidx.recyclerview.widget.RecyclerView\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.xiaoniu.qqversionlist.R\nimport com.xiaoniu.qqversionlist.databinding.DialogLocalQqTimInfoBinding\nimport com.xiaoniu.qqversionlist.databinding.LocalTimBinding\nimport com.xiaoniu.qqversionlist.util.ClipboardUtil.copyText\nimport com.xiaoniu.qqversionlist.util.DataStoreUtil\nimport com.xiaoniu.qqversionlist.util.InfoUtil.showToast\n\nclass LocalTIMAdapter : RecyclerView.Adapter<LocalTIMAdapter.LocalTIMViewHolder>() {\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): LocalTIMViewHolder {\n        val binding = LocalTimBinding.inflate(LayoutInflater.from(parent.context), parent, false)\n        return LocalTIMViewHolder(binding)\n    }\n\n    @SuppressLint(\"SetTextI18n\")\n    override fun onBindViewHolder(holder: LocalTIMViewHolder, position: Int) {\n        val TIMTargetInstallKV = DataStoreUtil.getStringKV(\"TIMTargetInstall\", \"\")\n        val TIMMinInstallKV = DataStoreUtil.getStringKV(\"TIMMinInstall\", \"\")\n        val TIMCompileInstallKV = DataStoreUtil.getStringKV(\"TIMCompileInstall\", \"\")\n        val TIMVersionInstallKV = DataStoreUtil.getStringKV(\"TIMVersionInstall\", \"\")\n        val TIMRdmUUIDInstallKV = DataStoreUtil.getStringKV(\"TIMRdmUUIDInstall\", \"\")\n        val TIMVersionCodeInstallKV = DataStoreUtil.getStringKV(\"TIMVersionCodeInstall\", \"\")\n        val TIMAppSettingParamsInstallKV =\n            DataStoreUtil.getStringKV(\"TIMAppSettingParamsInstall\", \"\")\n        val TIMAppSettingParamsPadInstallKV =\n            DataStoreUtil.getStringKV(\"TIMAppSettingParamsPadInstall\", \"\")\n        val TIMQuaKV = DataStoreUtil.getStringKV(\"TIMQua\", \"\")\n        val TIMRdmUUIDInstallProcessed =\n            if (TIMRdmUUIDInstallKV != \"\") \".${TIMRdmUUIDInstallKV.split(\"_\")[0]}\" else \"\"\n        val TIMChannelInstallProcessed =\n            if (TIMAppSettingParamsInstallKV != \"\") TIMAppSettingParamsInstallKV.split(\"#\")[3] else \"\"\n        val TIMBasedOnQQVer = if (TIMQuaKV != \"\") TIMQuaKV.split(\"_\")[3] else \"\"\n        holder.apply {\n            if (TIMVersionInstallKV != \"\") {\n                itemTimInstallText.text =\n                    itemView.context.getString(R.string.localTIMVersion) + TIMVersionInstallKV + TIMRdmUUIDInstallProcessed + (if (TIMVersionCodeInstallKV != \"\") \" (${TIMVersionCodeInstallKV})\" else \"\") + (if (TIMChannelInstallProcessed != \"\") \" - $TIMChannelInstallProcessed\" else \"\")\n                itemTimInstallCard.isVisible = true\n                itemTimInstallBasedOn.text = if (TIMBasedOnQQVer != \"\") itemView.context.getString(\n                    R.string.basedOnQQVer, TIMBasedOnQQVer\n                ) else \"\"\n                itemTimInstallBasedOn.isVisible = TIMBasedOnQQVer != \"\"\n                itemTimInstallBasedOnCard.isVisible = TIMBasedOnQQVer != \"\"\n                itemTimInstallCard.setOnLongClickListener {\n                    if (DataStoreUtil.getBooleanKV(\"longPressCard\", true)) {\n                        if (DataStoreUtil.getBooleanKV(\"useNewLocalPage\", true)) {\n                            itemView.context.startActivity(Intent(\n                                itemView.context, LocalAppDetailsActivity::class.java\n                            ).apply {\n                                putExtra(\"localAppType\", \"TIM\")\n                            })\n                        } else {\n                            val localInfoAllText = (if (TIMTargetInstallKV != \"\") \"Target SDK${\n                                itemView.context.getString(R.string.colon)\n                            }${\n                                TIMTargetInstallKV\n                            }\" else \"\") + (if (TIMMinInstallKV != \"\") \"\\nMin SDK${\n                                itemView.context.getString(\n                                    R.string.colon\n                                )\n                            }${\n                                TIMMinInstallKV\n                            }\" else \"\") + (if (TIMCompileInstallKV != \"\") \"\\nCompile SDK${\n                                itemView.context.getString(\n                                    R.string.colon\n                                )\n                            }${\n                                TIMCompileInstallKV\n                            }\" else \"\") + \"\\nVersion Name${itemView.context.getString(R.string.colon)}${\n                                TIMVersionInstallKV\n                            }\" + (if (TIMRdmUUIDInstallKV != \"\") \"\\nRdm UUID${\n                                itemView.context.getString(\n                                    R.string.colon\n                                )\n                            }${\n                                TIMRdmUUIDInstallKV\n                            }\" else \"\") + (if (TIMVersionCodeInstallKV != \"\") \"\\nVersion Code${\n                                itemView.context.getString(\n                                    R.string.colon\n                                )\n                            }${\n                                TIMVersionCodeInstallKV\n                            }\" else \"\") + (if (TIMAppSettingParamsInstallKV != \"\") \"\\nAppSetting_params${\n                                itemView.context.getString(\n                                    R.string.colon\n                                )\n                            }${\n                                TIMAppSettingParamsInstallKV\n                            }\" else \"\") + (if (TIMAppSettingParamsPadInstallKV != \"\") \"\\nAppSetting_params_pad${\n                                itemView.context.getString(\n                                    R.string.colon\n                                )\n                            }${\n                                TIMAppSettingParamsPadInstallKV\n                            }\" else \"\") + (if (TIMQuaKV != \"\") \"\\nQUA${itemView.context.getString(R.string.colon)}${\n                                TIMQuaKV\n                            }\" else \"\")\n\n                            val dialogLocalQqTimInfoBinding = DialogLocalQqTimInfoBinding.inflate(\n                                LayoutInflater.from(itemView.context)\n                            )\n\n                            MaterialAlertDialogBuilder(itemView.context).setView(\n                                dialogLocalQqTimInfoBinding.root\n                            ).setTitle(R.string.localTIMVersionDetails)\n                                .setIcon(R.drawable.phone_find_line).apply {\n                                    dialogLocalQqTimInfoBinding.apply {\n                                        val dialogLocalSdkDesc =\n                                            if (TIMTargetInstallKV != \"\" && TIMMinInstallKV != \"\" && TIMChannelInstallProcessed != \"\") \"Target $TIMTargetInstallKV | Min $TIMMinInstallKV | Compile $TIMCompileInstallKV\" else \"Target $TIMTargetInstallKV | Min $TIMMinInstallKV\"\n\n                                        dialogLocalSdk.apply {\n                                            setCellDescription(dialogLocalSdkDesc)\n                                            this.setOnClickListener {\n                                                context.copyText(\n                                                    \"Android SDK${\n                                                        itemView.context.getString(R.string.colon)\n                                                    }$dialogLocalSdkDesc\"\n                                                )\n                                            }\n                                        }\n                                        dialogLocalVersionName.apply {\n                                            setCellDescription(TIMVersionInstallKV)\n                                            this.setOnClickListener {\n                                                context.copyText(\n                                                    \"Version Name${\n                                                        itemView.context.getString(R.string.colon)\n                                                    }$TIMVersionInstallKV\"\n                                                )\n                                            }\n                                        }\n                                        dialogLocalRdmUuid.apply {\n                                            if (TIMRdmUUIDInstallKV != \"\") {\n                                                setCellDescription(TIMRdmUUIDInstallKV)\n                                                this.setOnClickListener {\n                                                    context.copyText(\n                                                        \"Rdm UUID${\n                                                            itemView.context.getString(R.string.colon)\n                                                        }$TIMRdmUUIDInstallKV\"\n                                                    )\n                                                }\n                                            } else dialogLocalRdmUuid.isVisible = false\n                                        }\n                                        dialogLocalVersionCode.apply {\n                                            if (TIMVersionCodeInstallKV != \"\") {\n                                                setCellDescription(TIMVersionCodeInstallKV)\n                                                this.setOnClickListener {\n                                                    context.copyText(\n                                                        \"Version Code${\n                                                            itemView.context.getString(R.string.colon)\n                                                        }$TIMVersionCodeInstallKV\"\n                                                    )\n                                                }\n                                            } else dialogLocalVersionCode.isVisible = false\n                                        }\n                                        dialogLocalAppsettingParams.apply {\n                                            if (TIMAppSettingParamsInstallKV != \"\") {\n                                                setCellDescription(TIMAppSettingParamsInstallKV)\n                                                this.setOnClickListener {\n                                                    context.copyText(\n                                                        \"AppSetting_params${\n                                                            itemView.context.getString(R.string.colon)\n                                                        }$TIMAppSettingParamsInstallKV\"\n                                                    )\n                                                }\n                                            } else dialogLocalAppsettingParams.isVisible = false\n                                        }\n                                        dialogLocalAppsettingParamsPad.apply {\n                                            if (TIMAppSettingParamsPadInstallKV != \"\") {\n                                                setCellDescription(TIMAppSettingParamsPadInstallKV)\n                                                this.setOnClickListener {\n                                                    context.copyText(\n                                                        \"AppSetting_params_pad${\n                                                            itemView.context.getString(R.string.colon)\n                                                        }$TIMAppSettingParamsPadInstallKV\"\n                                                    )\n                                                }\n                                            } else dialogLocalAppsettingParamsPad.isVisible = false\n                                        }\n                                        dialogLocalQua.apply {\n                                            if (TIMQuaKV != \"\") {\n                                                setCellDescription(TIMQuaKV)\n                                                this.setOnClickListener {\n                                                    context.copyText(\n                                                        \"QUA${\n                                                            itemView.context.getString(\n                                                                R.string.colon\n                                                            )\n                                                        }$TIMQuaKV\"\n                                                    )\n                                                }\n                                            } else dialogLocalQua.isVisible = false\n                                        }\n                                        dialogLocalCopyAll.setOnClickListener {\n                                            context.copyText(localInfoAllText)\n                                        }\n                                    }\n                                }.show()\n                        }\n                    } else showToast(R.string.longPressToViewSourceDetailsIsDisabled)\n                    true\n                }\n            } else itemTimInstallCard.isVisible = false\n        }\n    }\n\n    override fun getItemCount(): Int = 1\n\n    @SuppressLint(\"NotifyDataSetChanged\")\n    fun refreshData() {\n        notifyDataSetChanged()\n    }\n\n    @SuppressLint(\"SetTextI18n\")\n    inner class LocalTIMViewHolder(binding: LocalTimBinding) :\n        RecyclerView.ViewHolder(binding.root) {\n        val itemTimInstallCard = binding.itemTimInstallCard\n        val itemTimInstallText = binding.itemTimInstallText\n        val itemTimInstallBasedOn = binding.itemTimInstallBasedOn\n        val itemTimInstallBasedOnCard = binding.itemTimInstallBasedOnCard\n    }\n}\n\n"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/ui/LocalWeixinAdapter.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.ui\n\nimport android.annotation.SuppressLint\nimport android.content.Intent\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.core.view.isVisible\nimport androidx.recyclerview.widget.RecyclerView\nimport com.xiaoniu.qqversionlist.R\nimport com.xiaoniu.qqversionlist.databinding.LocalWeixinBinding\nimport com.xiaoniu.qqversionlist.util.DataStoreUtil\nimport com.xiaoniu.qqversionlist.util.InfoUtil.showToast\n\nclass LocalWeixinAdapter : RecyclerView.Adapter<LocalWeixinAdapter.LocalWeixinViewHolder>() {\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): LocalWeixinViewHolder {\n        val binding = LocalWeixinBinding.inflate(LayoutInflater.from(parent.context), parent, false)\n        return LocalWeixinViewHolder(binding)\n    }\n\n    @SuppressLint(\"SetTextI18n\")\n    override fun onBindViewHolder(holder: LocalWeixinViewHolder, position: Int) {\n        val WeixinVersionInstallKV = DataStoreUtil.getStringKV(\"WeixinVersionInstall\", \"\")\n        val WeixinVersionCodeInstallKV = DataStoreUtil.getStringKV(\"WeixinVersionCodeInstall\", \"\")\n        holder.apply {\n            if (WeixinVersionInstallKV != \"\") {\n                itemWeixinInstallText.text =\n                    itemView.context.getString(R.string.localWeixinVersion) + WeixinVersionInstallKV + (if (WeixinVersionCodeInstallKV != \"\") \" (${WeixinVersionCodeInstallKV})\" else \"\")\n                itemWeixinInstallCard.isVisible = true\n                itemWeixinInstallCard.setOnLongClickListener {\n                    if (DataStoreUtil.getBooleanKV(\"longPressCard\", true)) {\n                        itemView.context.startActivity(Intent(\n                            itemView.context, LocalAppDetailsActivity::class.java\n                        ).apply { putExtra(\"localAppType\", \"Weixin\") })\n                    } else showToast(R.string.longPressToViewSourceDetailsIsDisabled)\n                    true\n                }\n            } else itemWeixinInstallCard.isVisible = false\n        }\n    }\n\n    override fun getItemCount(): Int = 1\n\n    @SuppressLint(\"NotifyDataSetChanged\")\n    fun refreshData() {\n        notifyDataSetChanged()\n    }\n\n    @SuppressLint(\"SetTextI18n\")\n    inner class LocalWeixinViewHolder(binding: LocalWeixinBinding) :\n        RecyclerView.ViewHolder(binding.root) {\n        val itemWeixinInstallText = binding.itemWeixinInstallText\n        val itemWeixinInstallCard = binding.itemWeixinInstallCard\n    }\n}\n\n"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/ui/MainActivity.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\r\n\r\n/*\r\n    Qverbow Util\r\n    Copyright (C) 2023 klxiaoniu\r\n\r\n    This program is free software: you can redistribute it and/or modify\r\n    it under the terms of the GNU Affero General Public License as\r\n    published by the Free Software Foundation, either version 3 of the\r\n    License, or (at your option) any later version.\r\n\r\n    This program is distributed in the hope that it will be useful,\r\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n    GNU Affero General Public License for more details.\r\n\r\n    You should have received a copy of the GNU Affero General Public License\r\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\r\n*/\r\n\r\npackage com.xiaoniu.qqversionlist.ui\r\n\r\nimport android.Manifest\r\nimport android.annotation.SuppressLint\r\nimport android.app.AlertDialog\r\nimport android.app.DownloadManager\r\nimport android.app.NotificationChannel\r\nimport android.app.NotificationManager\r\nimport android.content.Context\r\nimport android.content.Intent\r\nimport android.content.pm.PackageManager\r\nimport android.content.res.Configuration\r\nimport android.content.res.Resources\r\nimport android.net.Uri\r\nimport android.os.Build\r\nimport android.os.Build.VERSION.SDK_INT\r\nimport android.os.Bundle\r\nimport android.os.Environment\r\nimport android.text.Editable\r\nimport android.text.TextWatcher\r\nimport android.util.Base64\r\nimport android.view.GestureDetector\r\nimport android.view.MotionEvent\r\nimport android.view.View\r\nimport android.view.ViewConfiguration\r\nimport android.view.ViewGroup\r\nimport android.view.inputmethod.InputMethodManager\r\nimport androidx.activity.enableEdgeToEdge\r\nimport androidx.activity.result.contract.ActivityResultContracts\r\nimport androidx.appcompat.app.AppCompatActivity\r\nimport androidx.biometric.BiometricManager\r\nimport androidx.biometric.BiometricManager.Authenticators.BIOMETRIC_STRONG\r\nimport androidx.biometric.BiometricManager.Authenticators.DEVICE_CREDENTIAL\r\nimport androidx.biometric.BiometricPrompt\r\nimport androidx.constraintlayout.widget.ConstraintSet\r\nimport androidx.core.app.NotificationManagerCompat\r\nimport androidx.core.content.ContextCompat\r\nimport androidx.core.text.method.LinkMovementMethodCompat\r\nimport androidx.core.view.isVisible\r\nimport androidx.lifecycle.Observer\r\nimport androidx.lifecycle.ViewModelProvider\r\nimport androidx.lifecycle.lifecycleScope\r\nimport androidx.recyclerview.widget.LinearLayoutManager\r\nimport com.airbnb.paris.extensions.style\r\nimport com.google.android.gms.common.ConnectionResult\r\nimport com.google.android.gms.common.GoogleApiAvailability\r\nimport com.google.android.material.button.MaterialButton\r\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\r\nimport com.google.android.material.progressindicator.CircularProgressIndicatorSpec\r\nimport com.google.android.material.progressindicator.IndeterminateDrawable\r\nimport com.google.android.material.progressindicator.LinearProgressIndicator\r\nimport com.google.android.material.sidesheet.SideSheetDialog\r\nimport com.google.android.material.snackbar.Snackbar\r\nimport com.google.android.material.textfield.MaterialAutoCompleteTextView\r\nimport com.google.firebase.Firebase\r\nimport com.google.firebase.analytics.analytics\r\nimport com.google.firebase.messaging.messaging\r\nimport com.google.gson.Gson\r\nimport com.google.gson.GsonBuilder\r\nimport com.google.gson.JsonElement\r\nimport com.google.gson.JsonObject\r\nimport com.google.gson.Strictness\r\nimport com.xiaoniu.qqversionlist.BuildConfig\r\nimport com.xiaoniu.qqversionlist.QverbowApplication.Companion.ANDROID_QIDIAN_PACKAGE_NAME\r\nimport com.xiaoniu.qqversionlist.QverbowApplication.Companion.ANDROID_QQ_PACKAGE_NAME\r\nimport com.xiaoniu.qqversionlist.QverbowApplication.Companion.ANDROID_TIM_PACKAGE_NAME\r\nimport com.xiaoniu.qqversionlist.QverbowApplication.Companion.ANDROID_WECHAT_PACKAGE_NAME\r\nimport com.xiaoniu.qqversionlist.QverbowApplication.Companion.ANDROID_WECOM_PACKAGE_NAME\r\nimport com.xiaoniu.qqversionlist.QverbowApplication.Companion.ANDROID_WETYPE_PACKAGE_NAME\r\nimport com.xiaoniu.qqversionlist.QverbowApplication.Companion.GITHUB_TOKEN\r\nimport com.xiaoniu.qqversionlist.QverbowApplication.Companion.SHIPLY_DEFAULT_APPID\r\nimport com.xiaoniu.qqversionlist.QverbowApplication.Companion.SHIPLY_DEFAULT_SDK_VERSION\r\nimport com.xiaoniu.qqversionlist.QverbowApplication.Companion.ZHIPU_TOKEN\r\nimport com.xiaoniu.qqversionlist.R\r\nimport com.xiaoniu.qqversionlist.data.QQVersionBean\r\nimport com.xiaoniu.qqversionlist.data.TIMVersionBean\r\nimport com.xiaoniu.qqversionlist.data.WeixinVersionBean\r\nimport com.xiaoniu.qqversionlist.databinding.ActivityMainBinding\r\nimport com.xiaoniu.qqversionlist.databinding.ApplicationsConfigBackButtonBinding\r\nimport com.xiaoniu.qqversionlist.databinding.DialogAboutBinding\r\nimport com.xiaoniu.qqversionlist.databinding.DialogExpBackBinding\r\nimport com.xiaoniu.qqversionlist.databinding.DialogExperimentalFeaturesBinding\r\nimport com.xiaoniu.qqversionlist.databinding.DialogFirebaseFirstInfoBinding\r\nimport com.xiaoniu.qqversionlist.databinding.DialogFormatDefineBinding\r\nimport com.xiaoniu.qqversionlist.databinding.DialogGuessBinding\r\nimport com.xiaoniu.qqversionlist.databinding.DialogHashBinding\r\nimport com.xiaoniu.qqversionlist.databinding.DialogLoadingBinding\r\nimport com.xiaoniu.qqversionlist.databinding.DialogPersonalizationBinding\r\nimport com.xiaoniu.qqversionlist.databinding.DialogPrivateTokenSettingBinding\r\nimport com.xiaoniu.qqversionlist.databinding.DialogSettingBinding\r\nimport com.xiaoniu.qqversionlist.databinding.DialogShiplyBinding\r\nimport com.xiaoniu.qqversionlist.databinding.DialogTencentAppStoreBinding\r\nimport com.xiaoniu.qqversionlist.databinding.ExpLinkNextButtonBinding\r\nimport com.xiaoniu.qqversionlist.databinding.SuccessButtonBinding\r\nimport com.xiaoniu.qqversionlist.databinding.UpdateQvtButtonBinding\r\nimport com.xiaoniu.qqversionlist.databinding.UserAgreementBinding\r\nimport com.xiaoniu.qqversionlist.ui.components.cell.CellSingleSwitch\r\nimport com.xiaoniu.qqversionlist.util.ClipboardUtil.copyText\r\nimport com.xiaoniu.qqversionlist.util.DataStoreUtil\r\nimport com.xiaoniu.qqversionlist.util.Extensions.dpToPx\r\nimport com.xiaoniu.qqversionlist.util.FileUtil.downloadFile\r\nimport com.xiaoniu.qqversionlist.util.FileUtil.getFileSize\r\nimport com.xiaoniu.qqversionlist.util.GitHubRestApiUtil.checkGitHubToken\r\nimport com.xiaoniu.qqversionlist.util.GitHubRestApiUtil.getQverbowRelease\r\nimport com.xiaoniu.qqversionlist.util.InfoUtil.dialogError\r\nimport com.xiaoniu.qqversionlist.util.InfoUtil.getQverbowSM3\r\nimport com.xiaoniu.qqversionlist.util.InfoUtil.openUrlWithChromeCustomTab\r\nimport com.xiaoniu.qqversionlist.util.InfoUtil.qverbowAboutText\r\nimport com.xiaoniu.qqversionlist.util.InfoUtil.showToast\r\nimport com.xiaoniu.qqversionlist.util.KeyStoreUtil\r\nimport com.xiaoniu.qqversionlist.util.ShiplyUtil\r\nimport com.xiaoniu.qqversionlist.util.StringUtil.getAllAPKUrl\r\nimport com.xiaoniu.qqversionlist.util.StringUtil.pangu\r\nimport com.xiaoniu.qqversionlist.util.StringUtil.resolveWeixinAlphaConfig\r\nimport com.xiaoniu.qqversionlist.util.StringUtil.toPrettyFormat\r\nimport com.xiaoniu.qqversionlist.util.StringUtil.trimSubstringAtEnd\r\nimport com.xiaoniu.qqversionlist.util.StringUtil.trimSubstringAtStart\r\nimport com.xiaoniu.qqversionlist.util.VersionUtil.resolveLocalQQ\r\nimport com.xiaoniu.qqversionlist.util.VersionUtil.resolveLocalTIM\r\nimport com.xiaoniu.qqversionlist.util.VersionUtil.resolveLocalWeixin\r\nimport com.xiaoniu.qqversionlist.util.VersionUtil.resolveQQRainbow\r\nimport com.xiaoniu.qqversionlist.util.VersionUtil.resolveTIMRainbow\r\nimport com.xiaoniu.qqversionlist.util.VersionUtil.resolveWeixinHTML\r\nimport com.xiaoniu.qqversionlist.util.ZhipuSDKUtil.getZhipuWrite\r\nimport kotlinx.coroutines.CoroutineScope\r\nimport kotlinx.coroutines.Dispatchers\r\nimport kotlinx.coroutines.delay\r\nimport kotlinx.coroutines.joinAll\r\nimport kotlinx.coroutines.launch\r\nimport kotlinx.coroutines.withContext\r\nimport me.zhanghai.android.fastscroll.FastScrollerBuilder\r\nimport okhttp3.MediaType.Companion.toMediaTypeOrNull\r\nimport okhttp3.OkHttpClient\r\nimport okhttp3.Request\r\nimport okhttp3.RequestBody.Companion.toRequestBody\r\nimport org.apache.maven.artifact.versioning.ComparableVersion\r\nimport java.io.BufferedReader\r\nimport java.io.ByteArrayInputStream\r\nimport java.io.InputStreamReader\r\nimport java.lang.Thread.sleep\r\nimport java.util.Locale\r\nimport java.util.zip.GZIPInputStream\r\nimport kotlin.math.abs\r\n\r\nclass MainActivity : AppCompatActivity() {\r\n    lateinit var binding: ActivityMainBinding\r\n    lateinit var qqVersionAdapter: QQVersionAdapter\r\n    lateinit var timVersionAdapter: TIMVersionAdapter\r\n    lateinit var weixinVersionAdapter: WeixinVersionAdapter\r\n    lateinit var localQQAdapter: LocalQQAdapter\r\n    lateinit var localTIMAdapter: LocalTIMAdapter\r\n    lateinit var localWeixinAdapter: LocalWeixinAdapter\r\n    private lateinit var qqVersionListFragment: QQVersionListFragment\r\n    private lateinit var timVersionListFragment: TIMVersionListFragment\r\n    private lateinit var rvPagerAdapter: VersionListPagerAdapter\r\n    private lateinit var viewModel: MainActivityViewModel\r\n    private val isPreviewRelease: Boolean by lazy { BuildConfig.VERSION_NAME.endsWith(\"Preview-Release\") }\r\n    private val isRelease: Boolean by lazy { BuildConfig.VERSION_NAME.endsWith(\"Release\") }\r\n\r\n    override fun onCreate(savedInstanceState: Bundle?) {\r\n        enableEdgeToEdge()\r\n        super.onCreate(savedInstanceState)\r\n\r\n        binding = ActivityMainBinding.inflate(layoutInflater)\r\n        val viewRoot = binding.root\r\n        setContentView(viewRoot)\r\n\r\n        setContext(this)\r\n\r\n        // 不加这段代码的话 Google 可能会在系统栏加遮罩\r\n        if (SDK_INT >= Build.VERSION_CODES.Q) window.isNavigationBarContrastEnforced =\r\n            false\r\n\r\n        qqVersionAdapter = QQVersionAdapter()\r\n        timVersionAdapter = TIMVersionAdapter(this)\r\n        weixinVersionAdapter = WeixinVersionAdapter(this)\r\n        localQQAdapter = LocalQQAdapter()\r\n        localTIMAdapter = LocalTIMAdapter()\r\n        localWeixinAdapter = LocalWeixinAdapter()\r\n        binding.rvPager.adapter = VersionListPagerAdapter(this)\r\n        rvPagerAdapter = binding.rvPager.adapter as VersionListPagerAdapter\r\n        qqVersionListFragment = QQVersionListFragment()\r\n        timVersionListFragment = TIMVersionListFragment()\r\n        if (!isRelease || isPreviewRelease) binding.materialToolbar.setNavigationIcon(\r\n            R.drawable.git_commit_line\r\n        )\r\n\r\n        viewModel = ViewModelProvider(this)[MainActivityViewModel::class.java]\r\n        viewModel.isVersionListLoading.observe(this, Observer { isLoading ->\r\n            if (isLoading) binding.apply {\r\n                progressLine.show()\r\n                btnGet.isEnabled = false\r\n            } else binding.apply {\r\n                progressLine.hide()\r\n                btnGet.isEnabled = true\r\n            }\r\n        })\r\n        viewModel.qqVersion.observe(this, Observer { qqVersion ->\r\n            qqVersionAdapter.submitList(qqVersion.toMutableList())\r\n        })\r\n        viewModel.timVersion.observe(this, Observer { timVersion ->\r\n            timVersionAdapter.submitList(timVersion.toMutableList())\r\n        })\r\n        viewModel.weixinVersion.observe(this, Observer { weixinVersion ->\r\n            weixinVersionAdapter.submitList(weixinVersion.toMutableList())\r\n        })\r\n\r\n        initButtons()\r\n    }\r\n\r\n    /**\r\n     * 用户协议\r\n     * @param agreed 用户先前是否同意过用户协议\r\n     * @param UATarget 用户协议版本\r\n     **/\r\n    private fun showUADialog(agreed: Boolean, UATarget: Int) {\r\n\r\n        // 屏幕高度获取\r\n        val screenHeight = Resources.getSystem().displayMetrics.heightPixels\r\n\r\n        val userAgreementBinding = UserAgreementBinding.inflate(layoutInflater)\r\n\r\n        val dialogUA = MaterialAlertDialogBuilder(this)\r\n            .setTitle(R.string.userAgreement)\r\n            .setIcon(R.drawable.file_text_line)\r\n            .setView(userAgreementBinding.root)\r\n            .setCancelable(false)\r\n            .create()\r\n\r\n        val constraintSet = ConstraintSet()\r\n        constraintSet.clone(userAgreementBinding.userAgreement)\r\n\r\n        // 屏幕方向判断，不同方向分别设置相应的约束布局用户协议子项高度\r\n        val currentConfig = resources.configuration\r\n        if (currentConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) constraintSet.constrainHeight(\r\n            R.id.UA_text, screenHeight / 6\r\n        )\r\n        else if (currentConfig.orientation == Configuration.ORIENTATION_PORTRAIT) constraintSet.constrainHeight(\r\n            R.id.UA_text, screenHeight / 2\r\n        )\r\n\r\n        constraintSet.applyTo(userAgreementBinding.userAgreement)\r\n\r\n        userAgreementBinding.uaButtonAgree.setOnClickListener {\r\n            DataStoreUtil.putIntKVAsync(\"userAgreement\", UATarget)\r\n            dialogUA.dismiss()\r\n            getData()\r\n        }\r\n\r\n        userAgreementBinding.uaButtonDisagree.setOnClickListener {\r\n            DataStoreUtil.putIntKVAsync(\"userAgreement\", 0)\r\n            finish()\r\n        }\r\n        if (agreed) userAgreementBinding.uaButtonDisagree.setText(R.string.withdrawConsentAndExit)\r\n\r\n        FastScrollerBuilder(userAgreementBinding.UAScroll).useMd2Style()\r\n            .setPadding(0, 0, 0, 0).build()\r\n\r\n        dialogUA.show()\r\n    }\r\n\r\n\r\n    @SuppressLint(\"SetTextI18n\")\r\n    private fun initButtons() {\r\n        // 删除 version Shared Preferences\r\n        DataStoreUtil.deleteKVAsync(\"version\")\r\n\r\n        /**\r\n         * 这里的伴生类的 `JUDGE_UA_TARGET` 的值代表着用户协议修订版本，\r\n         * 后续更新协议版本后也需要在下面伴生类中把 `JUDGE_UA_TARGET` + 1，以此类推\r\n         **/\r\n        val judgeUATarget = JUDGE_UA_TARGET\r\n        if (DataStoreUtil.getIntKV(\"userAgreement\", 0) < judgeUATarget) showUADialog(\r\n            false, judgeUATarget\r\n        ) else {\r\n            getData()\r\n            if (this.isRelease && DataStoreUtil.getBooleanKV(\r\n                    \"autoCheckUpdates\", false\r\n                )\r\n            ) checkQverbowUpdates(\r\n                BuildConfig.VERSION_NAME.trimSubstringAtEnd(\"-Preview-Release\")\r\n                    .trimSubstringAtEnd(\"-Release\"), false\r\n            )\r\n        }\r\n\r\n        binding.progressLine.apply {\r\n            showAnimationBehavior = LinearProgressIndicator.SHOW_NONE\r\n            hideAnimationBehavior = LinearProgressIndicator.HIDE_ESCAPE\r\n        }\r\n\r\n        binding.apply {\r\n            btnGet.setOnClickListener {\r\n                getData()\r\n                true\r\n            }\r\n\r\n            btnAbout.setOnClickListener {\r\n                val dialogAboutBinding = DialogAboutBinding.inflate(layoutInflater)\r\n\r\n                dialogAboutBinding.apply {\r\n                    val aboutDialog = MaterialAlertDialogBuilder(this@MainActivity)\r\n                        .setTitle(R.string.about)\r\n                        .setIcon(R.drawable.information_line)\r\n                        .setView(root)\r\n                        .show().apply {\r\n                            if (isRelease) btnAboutUpdate.apply {\r\n                                isEnabled = true\r\n                                setText(R.string.checkUpdateViaGitHubAPI)\r\n                            } else btnAboutUpdate.apply {\r\n                                isEnabled = false\r\n                                setText(R.string.ciVersionNoSupportUpdates)\r\n                            }\r\n\r\n                            aboutText.movementMethod =\r\n                                LinkMovementMethodCompat.getInstance()\r\n\r\n                            aboutText.text = this@MainActivity.qverbowAboutText()\r\n                        }\r\n\r\n                    btnAboutWithdrawConsentUA.setOnClickListener {\r\n                        showUADialog(true, judgeUATarget)\r\n                        aboutDialog.dismiss()\r\n                    }\r\n\r\n                    btnAboutSharedList.setOnClickListener {\r\n                        val url =\r\n                            \"https://raw.githubusercontent.com/klxiaoniu/QQVersionList/refs/heads/master/DataListShared.md\"\r\n                        openUrlWithChromeCustomTab(url)\r\n                    }\r\n\r\n                    btnAboutUpdate.setOnClickListener {\r\n                        val spec = CircularProgressIndicatorSpec(\r\n                            this@MainActivity, null, 0,\r\n                            com.google.android.material.R.style.Widget_Material3_CircularProgressIndicator_ExtraSmall\r\n                        )\r\n                        val progressIndicatorDrawable =\r\n                            IndeterminateDrawable.createCircularDrawable(\r\n                                this@MainActivity, spec\r\n                            )\r\n\r\n                        btnAboutUpdate.apply {\r\n                            isEnabled = false\r\n                            style(com.google.android.material.R.style.Widget_Material3_Button_TonalButton_Icon)\r\n                            icon = progressIndicatorDrawable\r\n                        }\r\n\r\n                        checkQverbowUpdates(\r\n                            BuildConfig.VERSION_NAME.trimSubstringAtEnd(\"-Preview-Release\")\r\n                                .trimSubstringAtEnd(\"-Release\"),\r\n                            true, btnAboutUpdate\r\n                        )\r\n                    }\r\n\r\n                    btnAboutOk.setOnClickListener {\r\n                        aboutDialog.dismiss()\r\n                    }\r\n\r\n                    btnAboutOpenSource.setOnClickListener {\r\n                        startActivity(\r\n                            Intent(\r\n                                this@MainActivity, OSSLicensesMenuActivity::class.java\r\n                            )\r\n                        )\r\n                    }\r\n\r\n                    btnAboutHash.setOnClickListener {\r\n                        val dialogHashBinding = DialogHashBinding.inflate(layoutInflater)\r\n                        val qverbowSM3 = getQverbowSM3()\r\n\r\n                        val hashDialog = MaterialAlertDialogBuilder(this@MainActivity)\r\n                            .setTitle(R.string.qverbowHash)\r\n                            .setIcon(R.drawable.shield_keyhole_line)\r\n                            .setView(dialogHashBinding.root)\r\n                            .show().apply {\r\n                                dialogHashBinding.aboutHashText.text =\r\n                                    \"SM3${getString(R.string.colon)}${qverbowSM3}\"\r\n                                dialogHashBinding.btnAboutGithubHashVerifiy.isVisible =\r\n                                    isRelease && !isPreviewRelease\r\n                            }\r\n\r\n                        dialogHashBinding.apply {\r\n                            btnAboutHashOk.setOnClickListener {\r\n                                hashDialog.dismiss()\r\n                            }\r\n\r\n                            btnAboutHashCopy.setOnClickListener {\r\n                                copyText(qverbowSM3)\r\n                            }\r\n\r\n                            btnAboutGithubHashVerifiy.setOnClickListener {\r\n                                val spec = CircularProgressIndicatorSpec(\r\n                                    this@MainActivity, null, 0,\r\n                                    com.google.android.material.R.style.Widget_Material3_CircularProgressIndicator_ExtraSmall\r\n                                )\r\n                                val progressIndicatorDrawable =\r\n                                    IndeterminateDrawable.createCircularDrawable(\r\n                                        this@MainActivity, spec\r\n                                    )\r\n\r\n                                btnAboutGithubHashVerifiy.apply {\r\n                                    isEnabled = false\r\n                                    style(com.google.android.material.R.style.Widget_Material3_Button_TonalButton_Icon)\r\n                                    icon = progressIndicatorDrawable\r\n                                }\r\n\r\n                                checkQverbowHash(\r\n                                    BuildConfig.VERSION_NAME.trimSubstringAtEnd(\"-Preview-Release\")\r\n                                        .trimSubstringAtEnd(\"-Release\"),\r\n                                    getQverbowSM3(),\r\n                                    btnAboutGithubHashVerifiy\r\n                                )\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                true\r\n            }\r\n\r\n            btnSetting.setOnClickListener {\r\n                val dialogSettingBinding = DialogSettingBinding.inflate(layoutInflater)\r\n\r\n                dialogSettingBinding.apply {\r\n                    longPressCard.switchChecked =\r\n                        DataStoreUtil.getBooleanKV(\"longPressCard\", true)\r\n                    useNewLocalPage.switchChecked =\r\n                        DataStoreUtil.getBooleanKV(\"useNewLocalPage\", true)\r\n                    guessNot5.switchChecked = DataStoreUtil.getBooleanKV(\"guessNot5\", false)\r\n                    switchUpdateLogLlmGen.switchChecked =\r\n                        DataStoreUtil.getBooleanKV(\"updateLogLlmGen\", false)\r\n                    switchLocalInterChangesLlmGen.switchChecked =\r\n                        DataStoreUtil.getBooleanKV(\"localInterChangesLlmGen\", false)\r\n                    switchGuessTestExtend.switchChecked =\r\n                        DataStoreUtil.getBooleanKV(\"guessTestExtend\", false) // 扩展测试版扫版格式\r\n                    downloadOnSystemManager.switchChecked =\r\n                        DataStoreUtil.getBooleanKV(\"downloadOnSystemManager\", false)\r\n                    switchAutoCheckUpdates.switchChecked =\r\n                        DataStoreUtil.getBooleanKV(\"autoCheckUpdates\", false)\r\n                    switchPushNotifViaFcm.isVisible =\r\n                        Firebase.messaging.isAutoInitEnabled && GoogleApiAvailability.getInstance()\r\n                            .isGooglePlayServicesAvailable(this@MainActivity) == ConnectionResult.SUCCESS\r\n                    switchPushNotifViaFcm.switchChecked =\r\n                        DataStoreUtil.getBooleanKV(\"rainbowFCMSubscribed\", false)\r\n                }\r\n\r\n                val dialogSetting = SideSheetDialog(this@MainActivity).apply {\r\n                    setContentView(dialogSettingBinding.root)\r\n                    if (SDK_INT >= Build.VERSION_CODES.Q) window?.isNavigationBarContrastEnforced =\r\n                        false\r\n                    show()\r\n                }\r\n\r\n                dialogSettingBinding.apply {\r\n                    btnSettingOk.setOnClickListener {\r\n                        dialogSetting.dismiss()\r\n                    }\r\n                    longPressCard.setOnCheckedChangeListener { isChecked ->\r\n                        DataStoreUtil.putBooleanKVAsync(\"longPressCard\", isChecked)\r\n                    }\r\n                    useNewLocalPage.setOnCheckedChangeListener { isChecked ->\r\n                        DataStoreUtil.putBooleanKVAsync(\"useNewLocalPage\", isChecked)\r\n                    }\r\n                    guessNot5.setOnCheckedChangeListener { isChecked ->\r\n                        DataStoreUtil.putBooleanKVAsync(\"guessNot5\", isChecked)\r\n                    }\r\n                    switchUpdateLogLlmGen.setOnCheckedChangeListener { isChecked ->\r\n                        DataStoreUtil.putBooleanKVAsync(\"updateLogLlmGen\", isChecked)\r\n                    }\r\n                    switchLocalInterChangesLlmGen.setOnCheckedChangeListener { isChecked ->\r\n                        DataStoreUtil.putBooleanKVAsync(\"localInterChangesLlmGen\", isChecked)\r\n                    }\r\n                    dialogPersonalization.setOnClickListener {\r\n                        val dialogPersonalization =\r\n                            DialogPersonalizationBinding.inflate(layoutInflater).apply {\r\n                                root.parent?.let { parent ->\r\n                                    if (parent is ViewGroup) parent.removeView(root)\r\n                                }\r\n\r\n                                val gestureDetector = GestureDetector(\r\n                                    context,\r\n                                    object : GestureDetector.SimpleOnGestureListener() {\r\n                                        override fun onFling(\r\n                                            e1: MotionEvent?,\r\n                                            e2: MotionEvent,\r\n                                            velocityX: Float,\r\n                                            velocityY: Float\r\n                                        ): Boolean {\r\n                                            if (abs(velocityY) > abs(velocityX)) {\r\n                                                personalizationScroll.fling(-velocityY.toInt())\r\n                                                return true\r\n                                            }\r\n                                            return false\r\n                                        }\r\n\r\n                                        override fun onScroll(\r\n                                            e1: MotionEvent?,\r\n                                            e2: MotionEvent,\r\n                                            distanceX: Float,\r\n                                            distanceY: Float\r\n                                        ): Boolean {\r\n                                            return super.onScroll(e1, e2, distanceX, distanceY)\r\n                                        }\r\n                                    })\r\n\r\n                                versionTcloudThickness.setOnTouchListener { view, event ->\r\n                                    val slop = ViewConfiguration.get(context).scaledTouchSlop\r\n                                    var initialX = 0f\r\n                                    var initialY = 0f\r\n                                    var isHorizontalScroll = false\r\n\r\n                                    gestureDetector.onTouchEvent(event)\r\n\r\n                                    when (event.action) {\r\n                                        MotionEvent.ACTION_DOWN -> {\r\n                                            initialX = event.x\r\n                                            initialY = event.y\r\n                                            view.parent.requestDisallowInterceptTouchEvent(true)\r\n                                            true\r\n                                        }\r\n\r\n                                        MotionEvent.ACTION_MOVE -> {\r\n                                            if (!isHorizontalScroll) {\r\n                                                val dx = event.x - initialX\r\n                                                val dy = event.y - initialY\r\n\r\n                                                if (abs(dx) > slop || abs(dy) > slop) {\r\n                                                    if (abs(dx) > abs(dy)) {\r\n                                                        isHorizontalScroll = true\r\n                                                        view.parent.requestDisallowInterceptTouchEvent(\r\n                                                            true\r\n                                                        )\r\n                                                        false\r\n                                                    } else {\r\n                                                        view.parent.requestDisallowInterceptTouchEvent(\r\n                                                            false\r\n                                                        )\r\n                                                        true\r\n                                                    }\r\n                                                } else true\r\n                                            } else false\r\n                                        }\r\n\r\n                                        MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {\r\n                                            view.performClick()\r\n                                            view.parent.requestDisallowInterceptTouchEvent(false)\r\n                                            isHorizontalScroll = false\r\n                                            false\r\n                                        }\r\n\r\n                                        else -> false\r\n                                    }\r\n                                }\r\n\r\n                                versionTcloudThickness.setEnabled(\r\n                                    DataStoreUtil.getBooleanKV(\"versionTCloud\", true)\r\n                                )\r\n\r\n                                versionTcloudThickness.value = when (DataStoreUtil.getStringKV(\r\n                                    \"versionTCloudThickness\", \"System\"\r\n                                )) {\r\n                                    \"Light\" -> 1.0f\r\n                                    \"Regular\" -> 2.0f\r\n                                    \"Bold\" -> 3.0f\r\n                                    else -> 4.0f\r\n                                }\r\n                            }\r\n\r\n                        val dialogPer = SideSheetDialog(this@MainActivity).apply {\r\n                            setContentView(dialogPersonalization.root)\r\n                            if (SDK_INT >= Build.VERSION_CODES.Q) window?.isNavigationBarContrastEnforced =\r\n                                false\r\n                            show()\r\n                        }\r\n\r\n                        dialogPersonalization.apply {\r\n                            switchDisplayFirst.switchChecked =\r\n                                DataStoreUtil.getBooleanKV(\"displayFirst\", true)\r\n                            switchKuiklyTag.switchChecked =\r\n                                DataStoreUtil.getBooleanKV(\"kuiklyTag\", true)\r\n                            switchUnrealEngineTag.switchChecked =\r\n                                DataStoreUtil.getBooleanKV(\"unrealEngineTag\", false)\r\n                            switchProgressSize.switchChecked =\r\n                                DataStoreUtil.getBooleanKV(\"progressSize\", false)\r\n                            switchProgressSizeText.switchChecked =\r\n                                DataStoreUtil.getBooleanKV(\"progressSizeText\", false)\r\n                            switchVersionTcloud.switchChecked =\r\n                                DataStoreUtil.getBooleanKV(\"versionTCloud\", true)\r\n                            switchOldLoading.switchChecked =\r\n                                DataStoreUtil.getBooleanKV(\"showOldLoading\", false)\r\n\r\n                            switchDisplayFirst.setOnCheckedChangeListener { isChecked ->\r\n                                DataStoreUtil.putBooleanKVAsync(\"displayFirst\", isChecked)\r\n                                viewModel.setQQVersion((viewModel.qqVersion.value as MutableList<QQVersionBean>).mapIndexed { index, qqVersionBean ->\r\n                                    if (index == 0) qqVersionBean.copy(\r\n                                        displayType = if (isChecked) 1 else 0\r\n                                    ) else qqVersionBean\r\n                                })\r\n                                viewModel.setTIMVersion((viewModel.timVersion.value as MutableList<TIMVersionBean>).mapIndexed { index, timVersionBean ->\r\n                                    if (index == 0) timVersionBean.copy(\r\n                                        displayType = if (isChecked) 1 else 0\r\n                                    ) else timVersionBean\r\n                                })\r\n                                viewModel.setWeixinVersion((viewModel.weixinVersion.value as MutableList<WeixinVersionBean>).mapIndexed { index, weixinVersionBean ->\r\n                                    if (index == 0) weixinVersionBean.copy(\r\n                                        displayType = if (isChecked) 1 else 0\r\n                                    ) else weixinVersionBean\r\n                                })\r\n                            }\r\n\r\n                            switchOldLoading.setOnCheckedChangeListener { isChecked ->\r\n                                DataStoreUtil.putBooleanKVAsync(\"showOldLoading\", isChecked)\r\n                            }\r\n\r\n                            // 下五个设置不能异步持久化存储，否则视图更新读不到更新值\r\n                            switchKuiklyTag.setOnCheckedChangeListener { isChecked ->\r\n                                DataStoreUtil.putBooleanKV(\"kuiklyTag\", isChecked)\r\n                                qqVersionAdapter.updateItemProperty(\"isShowKuiklyTag\")\r\n                                timVersionAdapter.updateItemProperty(\"isShowKuiklyTag\")\r\n                            }\r\n                            switchUnrealEngineTag.setOnCheckedChangeListener { isChecked ->\r\n                                DataStoreUtil.putBooleanKV(\"unrealEngineTag\", isChecked)\r\n                                qqVersionAdapter.updateItemProperty(\"isShowUnrealEngineTag\")\r\n                            }\r\n                            switchProgressSize.setOnCheckedChangeListener { isChecked ->\r\n                                DataStoreUtil.putBooleanKV(\"progressSize\", isChecked)\r\n                                qqVersionAdapter.updateItemProperty(\"isShowProgressSize\")\r\n                            }\r\n                            switchProgressSizeText.setOnCheckedChangeListener { isChecked ->\r\n                                DataStoreUtil.putBooleanKV(\"progressSizeText\", isChecked)\r\n                                qqVersionAdapter.updateItemProperty(\"isShowProgressSizeText\")\r\n                            }\r\n                            switchVersionTcloud.setOnCheckedChangeListener { isChecked ->\r\n                                DataStoreUtil.putBooleanKV(\"versionTCloud\", isChecked)\r\n                                dialogPersonalization.versionTcloudThickness.setEnabled(\r\n                                    isChecked\r\n                                )\r\n                                qqVersionAdapter.updateItemProperty(\"isTCloud\")\r\n                                timVersionAdapter.updateItemProperty(\"isTCloud\")\r\n                                weixinVersionAdapter.updateItemProperty(\"isTCloud\")\r\n                            }\r\n\r\n                            btnPersonalizationOk.setOnClickListener {\r\n                                dialogPer.dismiss()\r\n                            }\r\n\r\n                            versionTcloudThickness.setLabelFormatter {\r\n                                return@setLabelFormatter when (it) {\r\n                                    1.0f -> \"Light\"\r\n                                    2.0f -> \"Regular\"\r\n                                    3.0f -> \"Bold\"\r\n                                    else -> getString(R.string.thicknessFollowSystem)\r\n                                }\r\n                            }\r\n\r\n                            versionTcloudThickness.addOnChangeListener { _, value, _ ->\r\n                                when (value) {\r\n                                    1.0f -> DataStoreUtil.putStringKV(\r\n                                        \"versionTCloudThickness\", \"Light\"\r\n                                    )\r\n\r\n                                    2.0f -> DataStoreUtil.putStringKV(\r\n                                        \"versionTCloudThickness\", \"Regular\"\r\n                                    )\r\n\r\n                                    3.0f -> DataStoreUtil.putStringKV(\r\n                                        \"versionTCloudThickness\", \"Bold\"\r\n                                    )\r\n\r\n                                    else -> DataStoreUtil.putStringKV(\r\n                                        \"versionTCloudThickness\", \"System\"\r\n                                    )\r\n                                }\r\n                                qqVersionAdapter.updateItemProperty(\"isTCloud\")\r\n                                timVersionAdapter.updateItemProperty(\"isTCloud\")\r\n                                weixinVersionAdapter.updateItemProperty(\"isTCloud\")\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    dialogPrivateTokenSetting.setOnClickListener {\r\n                        fun showDialogPrivateTokenSetting() {\r\n                            val dialogPrivateTokenSettingBinding =\r\n                                DialogPrivateTokenSettingBinding.inflate(layoutInflater)\r\n\r\n                            dialogPrivateTokenSettingBinding.root.parent?.let { parent ->\r\n                                if (parent is ViewGroup) {\r\n                                    parent.removeView(dialogPrivateTokenSettingBinding.root)\r\n                                }\r\n                            }\r\n\r\n                            val dialogPrivateTokenSetting =\r\n                                MaterialAlertDialogBuilder(this@MainActivity)\r\n                                    .setTitle(R.string.privateTokenSettings)\r\n                                    .setIcon(R.drawable.key_line)\r\n                                    .setView(dialogPrivateTokenSettingBinding.root)\r\n                                    .setCancelable(false)\r\n                                    .show()\r\n\r\n\r\n                            val zhipuToken = KeyStoreUtil.getStringKVwithKeyStore(ZHIPU_TOKEN)\r\n                            val githubToken = KeyStoreUtil.getStringKVwithKeyStore(GITHUB_TOKEN)\r\n                            val securityLevel = KeyStoreUtil.checkHardwareSecurity()\r\n\r\n                            dialogPrivateTokenSettingBinding.apply {\r\n                                viewModel.isTokenTesting.observe(this@MainActivity) {\r\n                                    if (it) progressIndicatorTokenSetting.show() else progressIndicatorTokenSetting.hide()\r\n                                }\r\n\r\n                                progressIndicatorTokenSetting.apply {\r\n                                    showAnimationBehavior = LinearProgressIndicator.SHOW_NONE\r\n                                    hideAnimationBehavior = LinearProgressIndicator.HIDE_ESCAPE\r\n                                }\r\n\r\n                                when (securityLevel) {\r\n                                    0 -> {\r\n                                        securityLevelLayout.isVisible = true\r\n                                        securityLevelText.text =\r\n                                            getString(R.string.SecuritySoftwareSupported)\r\n                                    }\r\n\r\n                                    1 -> {\r\n                                        securityLevelLayout.isVisible = true\r\n                                        securityLevelText.text = getString(R.string.TEESupported)\r\n                                    }\r\n\r\n                                    2 -> {\r\n                                        securityLevelLayout.isVisible = true\r\n                                        securityLevelText.text =\r\n                                            getString(R.string.StrongBoxSupported)\r\n                                    }\r\n\r\n                                    -1 -> {\r\n                                        securityLevelLayout.isVisible = true\r\n                                        securityLevelText.text =\r\n                                            getString(R.string.UnknownSecurityHardwareSupported)\r\n                                    }\r\n\r\n                                    else -> securityLevelLayout.isVisible = false\r\n                                }\r\n\r\n                                zhipuAiToken.editText?.setText(if (zhipuToken == null) \"\" else zhipuToken.toString())\r\n                                githubPersonalAccessToken.editText?.setText(if (githubToken == null) \"\" else githubToken.toString())\r\n\r\n                                btnTokenCancel.setOnClickListener {\r\n                                    dialogPrivateTokenSetting.dismiss()\r\n                                }\r\n\r\n                                btnTokenSave.setOnClickListener {\r\n                                    try {\r\n                                        KeyStoreUtil.apply {\r\n                                            putStringKVwithKeyStoreAsync(\r\n                                                ZHIPU_TOKEN, zhipuAiToken.editText?.text.toString()\r\n                                            )\r\n                                            putStringKVwithKeyStoreAsync(\r\n                                                GITHUB_TOKEN,\r\n                                                githubPersonalAccessToken.editText?.text.toString()\r\n                                            )\r\n                                        }\r\n                                        dialogPrivateTokenSetting.dismiss()\r\n                                    } catch (e: Exception) {\r\n                                        e.printStackTrace()\r\n                                        dialogError(e)\r\n                                    }\r\n                                }\r\n\r\n                                zhipuTokenTest.setOnClickListener {\r\n                                    try {\r\n                                        KeyStoreUtil.putStringKVwithKeyStore(\r\n                                            ZHIPU_TOKEN, zhipuAiToken.editText?.text.toString()\r\n                                        )\r\n                                        if (viewModel.isTokenTesting.value == false) {\r\n                                            viewModel.setTokenTesting(true)\r\n                                            CoroutineScope(Dispatchers.IO).launch {\r\n                                                try {\r\n                                                    val token =\r\n                                                        KeyStoreUtil.getStringKVwithKeyStore(\r\n                                                            ZHIPU_TOKEN\r\n                                                        )\r\n                                                    if (!token.isNullOrEmpty()) {\r\n                                                        val responseData = getZhipuWrite(\r\n                                                            getString(\r\n                                                                R.string.testZhipuTokenPrompt,\r\n                                                                Locale.getDefault().toString()\r\n                                                            ),\r\n                                                            getString(\r\n                                                                R.string.testZhipuTokenPrompt,\r\n                                                                Locale.getDefault().toString()\r\n                                                            ),\r\n                                                            token\r\n                                                        )\r\n                                                        val gson =\r\n                                                            GsonBuilder().setPrettyPrinting()\r\n                                                                .create()\r\n                                                        val responseObject = gson.fromJson(\r\n                                                            responseData, JsonObject::class.java\r\n                                                        )\r\n\r\n                                                        runOnUiThread {\r\n                                                            if (responseObject.getAsJsonPrimitive(\"code\").asInt == 200) {\r\n                                                                val zhipuContent =\r\n                                                                    responseObject.getAsJsonObject(\"data\").asJsonObject.getAsJsonArray(\r\n                                                                        \"choices\"\r\n                                                                    ).asJsonArray.first().asJsonObject.getAsJsonObject(\r\n                                                                        \"message\"\r\n                                                                    ).asJsonObject.getAsJsonPrimitive(\r\n                                                                        \"content\"\r\n                                                                    ).asString\r\n                                                                MaterialAlertDialogBuilder(this@MainActivity)\r\n                                                                    .setIcon(R.drawable.ai_generate_2)\r\n                                                                    .setTitle(R.string.zhipuTokenSuccess)\r\n                                                                    .setMessage(zhipuContent.pangu())\r\n                                                                    .setPositiveButton(R.string.ok) { _, _ -> }\r\n                                                                    .show()\r\n                                                            } else {\r\n                                                                MaterialAlertDialogBuilder(this@MainActivity)\r\n                                                                    .setIcon(R.drawable.alert_line)\r\n                                                                    .setTitle(R.string.backFromZhipuPlatform)\r\n                                                                    .setMessage(\r\n                                                                        responseData?.toPrettyFormat()\r\n                                                                    )\r\n                                                                    .setPositiveButton(R.string.done) { _, _ -> }\r\n                                                                    .setNeutralButton(\r\n                                                                        R.string.copy,\r\n                                                                        null\r\n                                                                    ).create().apply {\r\n                                                                        setOnShowListener {\r\n                                                                            getButton(AlertDialog.BUTTON_NEUTRAL).setOnClickListener {\r\n                                                                                responseData?.toPrettyFormat()\r\n                                                                                    ?.let { it ->\r\n                                                                                        copyText(it)\r\n                                                                                    }\r\n                                                                            }\r\n                                                                        }\r\n                                                                        show()\r\n                                                                    }\r\n                                                            }\r\n                                                        }\r\n                                                    } else runOnUiThread { showToast(R.string.zhipuTokenIsNull) }\r\n                                                } catch (e: RuntimeException) {\r\n                                                    if (e.message?.contains(\"invalid apiSecretKey\") == true) runOnUiThread {\r\n                                                        dialogError(\r\n                                                            Exception(getString(R.string.zhipuTokenIsInvalid)),\r\n                                                            true\r\n                                                        )\r\n                                                    } else {\r\n                                                        e.printStackTrace()\r\n                                                        runOnUiThread { dialogError(e) }\r\n                                                    }\r\n                                                } catch (e: Exception) {\r\n                                                    e.printStackTrace()\r\n                                                    runOnUiThread { dialogError(e) }\r\n                                                } finally {\r\n                                                    runOnUiThread { viewModel.setTokenTesting(false) }\r\n                                                }\r\n                                            }\r\n                                        }\r\n                                    } catch (e: Exception) {\r\n                                        e.printStackTrace()\r\n                                        dialogError(e)\r\n                                    }\r\n                                }\r\n\r\n                                githubPatTest.setOnClickListener {\r\n                                    try {\r\n                                        KeyStoreUtil.putStringKVwithKeyStore(\r\n                                            GITHUB_TOKEN,\r\n                                            githubPersonalAccessToken.editText?.text.toString()\r\n                                        )\r\n                                        if (viewModel.isTokenTesting.value == false) {\r\n                                            viewModel.setTokenTesting(true)\r\n                                            CoroutineScope(Dispatchers.IO).launch {\r\n                                                try {\r\n                                                    val token =\r\n                                                        KeyStoreUtil.getStringKVwithKeyStore(\r\n                                                            GITHUB_TOKEN\r\n                                                        )\r\n                                                    if (!token.isNullOrEmpty()) {\r\n                                                        if (checkGitHubToken()) {\r\n                                                            runOnUiThread { showToast(R.string.githubTokenSuccess) }\r\n                                                        } else {\r\n                                                            runOnUiThread {\r\n                                                                MaterialAlertDialogBuilder(this@MainActivity)\r\n                                                                    .setIcon(R.drawable.alert_line)\r\n                                                                    .setTitle(R.string.githubTokenUnavailableTitle)\r\n                                                                    .setMessage(R.string.githubTokenUnavailable)\r\n                                                                    .setPositiveButton(R.string.done) { _, _ -> }\r\n                                                                    .show()\r\n                                                            }\r\n                                                        }\r\n\r\n                                                    } else runOnUiThread { showToast(R.string.githubTokenIsNull) }\r\n                                                } catch (e: Exception) {\r\n                                                    e.printStackTrace()\r\n                                                    dialogError(e)\r\n                                                } finally {\r\n                                                    runOnUiThread { viewModel.setTokenTesting(false) }\r\n                                                }\r\n                                            }\r\n                                        }\r\n\r\n                                    } catch (e: Exception) {\r\n                                        e.printStackTrace()\r\n                                        dialogError(e)\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        val biometricManager = BiometricManager.from(this@MainActivity)\r\n                        when (biometricManager.canAuthenticate(BIOMETRIC_STRONG or DEVICE_CREDENTIAL)) {\r\n                            BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED -> showDialogPrivateTokenSetting()\r\n                            else -> {\r\n                                val executor = ContextCompat.getMainExecutor(this@MainActivity)\r\n                                val biometricPrompt = BiometricPrompt(this@MainActivity, executor,\r\n                                    object : BiometricPrompt.AuthenticationCallback() {\r\n                                        override fun onAuthenticationError(\r\n                                            errorCode: Int, errString: CharSequence\r\n                                        ) {\r\n                                            super.onAuthenticationError(errorCode, errString)\r\n                                        }\r\n\r\n                                        override fun onAuthenticationSucceeded(\r\n                                            result: BiometricPrompt.AuthenticationResult\r\n                                        ) {\r\n                                            super.onAuthenticationSucceeded(result)\r\n                                            showDialogPrivateTokenSetting()\r\n                                        }\r\n\r\n                                        override fun onAuthenticationFailed() {\r\n                                            super.onAuthenticationFailed()\r\n                                        }\r\n                                    })\r\n                                val promptInfo = BiometricPrompt.PromptInfo.Builder()\r\n                                    .setTitle(getString(R.string.biometricLoginTitle))\r\n                                    .setSubtitle(getString(R.string.biometricLoginSubtitle))\r\n                                    .setAllowedAuthenticators(BIOMETRIC_STRONG or DEVICE_CREDENTIAL)\r\n                                    .setConfirmationRequired(false)\r\n                                    .build()\r\n                                biometricPrompt.authenticate(promptInfo)\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    switchGuessTestExtend.setOnCheckedChangeListener { isChecked ->\r\n                        DataStoreUtil.putBooleanKVAsync(\"guessTestExtend\", isChecked)\r\n                    }\r\n                    switchAutoCheckUpdates.setOnCheckedChangeListener { isChecked ->\r\n                        DataStoreUtil.putBooleanKVAsync(\"autoCheckUpdates\", isChecked)\r\n                    }\r\n                    downloadOnSystemManager.setOnCheckedChangeListener { isChecked ->\r\n                        DataStoreUtil.putBooleanKVAsync(\"downloadOnSystemManager\", isChecked)\r\n                    }\r\n\r\n                    dialogSuffixDefineClick.setOnClickListener {\r\n                        val dialogSuffixDefine =\r\n                            DialogFormatDefineBinding.inflate(layoutInflater)\r\n\r\n                        dialogSuffixDefine.root.parent?.let { parent ->\r\n                            if (parent is ViewGroup) {\r\n                                parent.removeView(dialogSuffixDefine.root)\r\n                            }\r\n                        }\r\n\r\n                        val dialogSuffix = MaterialAlertDialogBuilder(this@MainActivity)\r\n                            .setTitle(R.string.enumerateVersionsFormatSetting)\r\n                            .setIcon(R.drawable.settings_line)\r\n                            .setView(dialogSuffixDefine.root)\r\n                            .setCancelable(false)\r\n                            .create()\r\n\r\n                        dialogSuffixDefine.apply {\r\n                            DataStoreUtil.apply {\r\n                                suffixDefineCheckbox64hb.isChecked =\r\n                                    getBooleanKV(\"suffix64HB\", true)\r\n                                suffixDefineCheckboxHb64.isChecked =\r\n                                    getBooleanKV(\"suffixHB64\", true)\r\n                                suffixDefineCheckbox64hb1.isChecked =\r\n                                    getBooleanKV(\"suffix64HB1\", true)\r\n                                suffixDefineCheckboxHb164.isChecked =\r\n                                    getBooleanKV(\"suffixHB164\", true)\r\n                                suffixDefineCheckbox64hb2.isChecked =\r\n                                    getBooleanKV(\"suffix64HB2\", true)\r\n                                suffixDefineCheckboxHb264.isChecked =\r\n                                    getBooleanKV(\"suffixHB264\", true)\r\n                                suffixDefineCheckbox64hb3.isChecked =\r\n                                    getBooleanKV(\"suffix64HB3\", true)\r\n                                suffixDefineCheckboxHb364.isChecked =\r\n                                    getBooleanKV(\"suffixHB364\", true)\r\n                                suffixDefineCheckbox64hd.isChecked =\r\n                                    getBooleanKV(\"suffix64HD\", true)\r\n                                suffixDefineCheckboxHd64.isChecked =\r\n                                    getBooleanKV(\"suffixHD64\", true)\r\n                                suffixDefineCheckbox64hd1.isChecked =\r\n                                    getBooleanKV(\"suffix64HD1\", true)\r\n                                suffixDefineCheckboxHd164.isChecked =\r\n                                    getBooleanKV(\"suffixHD164\", true)\r\n                                suffixDefineCheckbox64hd2.isChecked =\r\n                                    getBooleanKV(\"suffix64HD2\", true)\r\n                                suffixDefineCheckboxHd264.isChecked =\r\n                                    getBooleanKV(\"suffixHD264\", true)\r\n                                suffixDefineCheckbox64hd3.isChecked =\r\n                                    getBooleanKV(\"suffix64HD3\", true)\r\n                                suffixDefineCheckboxHd364.isChecked =\r\n                                    getBooleanKV(\"suffixHD364\", true)\r\n                                suffixDefineCheckbox64hd1hb.isChecked =\r\n                                    getBooleanKV(\"suffix64HD1HB\", true)\r\n                                suffixDefineCheckboxHd1hb64.isChecked =\r\n                                    getBooleanKV(\"suffixHD1HB64\", true)\r\n                                suffixDefineCheckboxTest.isChecked =\r\n                                    getBooleanKV(\"suffixTest\", true)\r\n                                formatDefineCheckboxQq8958.isChecked =\r\n                                    getBooleanKV(\"useQQ8958TestFormat\", false)\r\n                                formatDefineCheckboxQq900814600.isChecked =\r\n                                    getBooleanKV(\"useQQ900814600TestFormat\", false)\r\n                            }\r\n\r\n                            dialogSuffix.show()\r\n\r\n                            // 异步读取字符串，防止超长字符串造成阻塞\r\n                            settingSuffixDefine.apply {\r\n                                isEnabled = false\r\n                                btnSuffixSave.isEnabled = false\r\n                                lifecycleScope.launch {\r\n                                    val suffixDefine = withContext(Dispatchers.IO) {\r\n                                        DataStoreUtil.getStringKVAsync(\"suffixDefine\", \"\")\r\n                                            .await()\r\n                                    }\r\n                                    editText?.setText(\r\n                                        suffixDefine\r\n                                    )\r\n                                    isEnabled = true\r\n                                    btnSuffixSave.isEnabled = true\r\n                                }\r\n                            }\r\n\r\n                            btnSuffixSave.setOnClickListener {\r\n                                val suffixDefine = settingSuffixDefine.editText?.text.toString()\r\n\r\n                                val suffixDataStoreList = listOf(\r\n                                    mapOf(\r\n                                        \"key\" to \"suffixDefine\",\r\n                                        \"value\" to suffixDefine,\r\n                                        \"type\" to \"String\"\r\n                                    ), mapOf(\r\n                                        \"key\" to \"suffix64HB\",\r\n                                        \"value\" to suffixDefineCheckbox64hb.isChecked,\r\n                                        \"type\" to \"Boolean\"\r\n                                    ), mapOf(\r\n                                        \"key\" to \"suffixHB64\",\r\n                                        \"value\" to suffixDefineCheckboxHb64.isChecked,\r\n                                        \"type\" to \"Boolean\"\r\n                                    ), mapOf(\r\n                                        \"key\" to \"suffix64HB1\",\r\n                                        \"value\" to suffixDefineCheckbox64hb1.isChecked,\r\n                                        \"type\" to \"Boolean\"\r\n                                    ), mapOf(\r\n                                        \"key\" to \"suffixHB164\",\r\n                                        \"value\" to suffixDefineCheckboxHb164.isChecked,\r\n                                        \"type\" to \"Boolean\"\r\n                                    ), mapOf(\r\n                                        \"key\" to \"suffix64HB2\",\r\n                                        \"value\" to suffixDefineCheckbox64hb2.isChecked,\r\n                                        \"type\" to \"Boolean\"\r\n                                    ), mapOf(\r\n                                        \"key\" to \"suffixHB264\",\r\n                                        \"value\" to suffixDefineCheckboxHb264.isChecked,\r\n                                        \"type\" to \"Boolean\"\r\n                                    ), mapOf(\r\n                                        \"key\" to \"suffix64HB3\",\r\n                                        \"value\" to suffixDefineCheckbox64hb3.isChecked,\r\n                                        \"type\" to \"Boolean\"\r\n                                    ), mapOf(\r\n                                        \"key\" to \"suffixHB364\",\r\n                                        \"value\" to suffixDefineCheckboxHb364.isChecked,\r\n                                        \"type\" to \"Boolean\"\r\n                                    ), mapOf(\r\n                                        \"key\" to \"suffix64HD\",\r\n                                        \"value\" to suffixDefineCheckbox64hd.isChecked,\r\n                                        \"type\" to \"Boolean\"\r\n                                    ), mapOf(\r\n                                        \"key\" to \"suffixHD64\",\r\n                                        \"value\" to suffixDefineCheckboxHd64.isChecked,\r\n                                        \"type\" to \"Boolean\"\r\n                                    ), mapOf(\r\n                                        \"key\" to \"suffix64HD1\",\r\n                                        \"value\" to suffixDefineCheckbox64hd1.isChecked,\r\n                                        \"type\" to \"Boolean\"\r\n                                    ), mapOf(\r\n                                        \"key\" to \"suffixHD164\",\r\n                                        \"value\" to suffixDefineCheckboxHd164.isChecked,\r\n                                        \"type\" to \"Boolean\"\r\n                                    ), mapOf(\r\n                                        \"key\" to \"suffix64HD2\",\r\n                                        \"value\" to suffixDefineCheckbox64hd2.isChecked,\r\n                                        \"type\" to \"Boolean\"\r\n                                    ), mapOf(\r\n                                        \"key\" to \"suffixHD264\",\r\n                                        \"value\" to suffixDefineCheckboxHd264.isChecked,\r\n                                        \"type\" to \"Boolean\"\r\n                                    ), mapOf(\r\n                                        \"key\" to \"suffix64HD3\",\r\n                                        \"value\" to suffixDefineCheckbox64hd3.isChecked,\r\n                                        \"type\" to \"Boolean\"\r\n                                    ), mapOf(\r\n                                        \"key\" to \"suffixHD364\",\r\n                                        \"value\" to suffixDefineCheckboxHd364.isChecked,\r\n                                        \"type\" to \"Boolean\"\r\n                                    ), mapOf(\r\n                                        \"key\" to \"suffixHD1HB64\",\r\n                                        \"value\" to suffixDefineCheckboxHd1hb64.isChecked,\r\n                                        \"type\" to \"Boolean\"\r\n                                    ), mapOf(\r\n                                        \"key\" to \"suffix64HD1HB\",\r\n                                        \"value\" to suffixDefineCheckbox64hd1hb.isChecked,\r\n                                        \"type\" to \"Boolean\"\r\n                                    ), mapOf(\r\n                                        \"key\" to \"suffixTest\",\r\n                                        \"value\" to suffixDefineCheckboxTest.isChecked,\r\n                                        \"type\" to \"Boolean\"\r\n                                    ), mapOf(\r\n                                        \"key\" to \"useQQ8958TestFormat\",\r\n                                        \"value\" to formatDefineCheckboxQq8958.isChecked,\r\n                                        \"type\" to \"Boolean\"\r\n                                    ), mapOf(\r\n                                        \"key\" to \"useQQ900814600TestFormat\",\r\n                                        \"value\" to formatDefineCheckboxQq900814600.isChecked,\r\n                                        \"type\" to \"Boolean\"\r\n                                    )\r\n                                )\r\n\r\n                                DataStoreUtil.batchPutKVAsync(suffixDataStoreList)\r\n                                showToast(getString(R.string.saved))\r\n                                dialogSuffix.dismiss()\r\n                            }\r\n\r\n                            btnSuffixCancel.setOnClickListener {\r\n                                dialogSuffix.dismiss()\r\n                            }\r\n                        }\r\n                    }\r\n                    switchPushNotifViaFcm.setOnCheckedChangeListener { isChecked ->\r\n                        if (isChecked != DataStoreUtil.getBooleanKV(\r\n                                \"rainbowFCMSubscribed\",\r\n                                false\r\n                            )\r\n                        ) {\r\n                            if (isChecked) {\r\n                                if (!NotificationManagerCompat.from(this@MainActivity)\r\n                                        .areNotificationsEnabled()\r\n                                ) askNotificationPermission()\r\n                                if (!NotificationManagerCompat.from(this@MainActivity)\r\n                                        .areNotificationsEnabled()\r\n                                ) switchPushNotifViaFcm.switchChecked = false\r\n                                else if (!checkNotificationChannelEnabled(\r\n                                        getString(R.string.rainbow_notification_channel_id)\r\n                                    )\r\n                                ) {\r\n                                    switchPushNotifViaFcm.switchChecked = false\r\n                                    dialogError(\r\n                                        Exception(getString(R.string.cannotEnableFirebaseCloudMessaging)),\r\n                                        true, true\r\n                                    )\r\n                                } else {\r\n                                    switchPushNotifViaFcm.switchEnabled = false\r\n                                    Firebase.analytics.setAnalyticsCollectionEnabled(true)\r\n                                    subscribeWithTimeout(10000L, switchPushNotifViaFcm)\r\n                                }\r\n                            } else {\r\n                                switchPushNotifViaFcm.switchEnabled = false\r\n                                Firebase.analytics.setAnalyticsCollectionEnabled(true)\r\n                                unsubscribeWithTimeout(10000L, switchPushNotifViaFcm)\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                true\r\n            }\r\n\r\n            btnExpFeatures.setOnClickListener {\r\n                val dialogExperimentalFeaturesBinding =\r\n                    DialogExperimentalFeaturesBinding.inflate(layoutInflater)\r\n\r\n                dialogExperimentalFeaturesBinding.dialogFirebase.setCellDescription(\r\n                    if (GoogleApiAvailability.getInstance()\r\n                            .isGooglePlayServicesAvailable(this@MainActivity) == ConnectionResult.SUCCESS && Firebase.messaging.isAutoInitEnabled\r\n                    ) getString(R.string.initializedFirebaseServiceItem) else null\r\n                )\r\n\r\n                val dialogExperimentalFeatures = MaterialAlertDialogBuilder(this@MainActivity)\r\n                    .setTitle(R.string.experimentalFeatures)\r\n                    .setIcon(R.drawable.flask_line)\r\n                    .setView(dialogExperimentalFeaturesBinding.root)\r\n                    .show()\r\n\r\n                dialogExperimentalFeaturesBinding.apply {\r\n                    progressIndicator.apply {\r\n                        hide()\r\n                        showAnimationBehavior = LinearProgressIndicator.SHOW_NONE\r\n                        hideAnimationBehavior = LinearProgressIndicator.HIDE_ESCAPE\r\n                    }\r\n\r\n                    btnExpOk.setOnClickListener {\r\n                        dialogExperimentalFeatures.dismiss()\r\n                    }\r\n\r\n                    dialogGetWeixinAlphaNewest.setOnClickListener {\r\n                        progressIndicator.show()\r\n                        CoroutineScope(Dispatchers.IO).launch {\r\n                            class CustomException(message: String) :\r\n                                Exception(message)\r\n                            try {\r\n                                val okHttpClient = OkHttpClient()\r\n                                val request =\r\n                                    Request.Builder()\r\n                                        .url(\"https://dldir1v6.qq.com/weixin/android/weixin_android_alpha_config.json\")\r\n                                        .build()\r\n                                val response = okHttpClient.newCall(request).execute()\r\n                                if (!response.isSuccessful) throw CustomException(getString(R.string.getWeixinAlphaConfig404))\r\n                                val responseData = response.body?.string()\r\n                                if (responseData == null) throw CustomException(\"Response data is null.\")\r\n                                val start = (responseData.indexOf(\"cb(\")) + 3\r\n                                val end = responseData.indexOf(\")\")\r\n                                val jsonString = responseData.substring(start, end)\r\n                                val map = resolveWeixinAlphaConfig(jsonString)\r\n                                val appSize = getFileSize(map[\"url\"].toString())\r\n                                runOnUiThread {\r\n                                    val applicationsConfigBackButtonBinding =\r\n                                        ApplicationsConfigBackButtonBinding.inflate(\r\n                                            layoutInflater\r\n                                        )\r\n                                    val weixinAlphaConfigBackDialog =\r\n                                        MaterialAlertDialogBuilder(this@MainActivity).setTitle(\r\n                                            if (appSize != null) R.string.successInGetting else R.string.suspectedPackageWithdrawal\r\n                                        ).setIcon(R.drawable.flask_line).setMessage(\r\n                                            \"${getString(R.string.version)}${map[\"versionName\"].toString()}\\n${\r\n                                                getString(\r\n                                                    R.string.downloadLink\r\n                                                )\r\n                                            }${map[\"url\"].toString()}\" + (if (appSize != null) \"\\n\\n${\r\n                                                getString(\r\n                                                    R.string.fileSize\r\n                                                )\r\n                                            }$appSize MB\" else (\"\\n\\n\" + getString(R.string.getWeixinAlphaConfigLink404)))\r\n                                        ).setView(applicationsConfigBackButtonBinding.root)\r\n                                            .show()\r\n\r\n                                    applicationsConfigBackButtonBinding.apply {\r\n                                        applicationsConfigBackBtnCopy.setOnClickListener {\r\n                                            weixinAlphaConfigBackDialog.dismiss()\r\n                                            copyText(map[\"url\"].toString())\r\n                                        }\r\n\r\n                                        applicationsConfigBackBtnDownload.setOnClickListener {\r\n                                            weixinAlphaConfigBackDialog.dismiss()\r\n                                            downloadFile(\r\n                                                this@MainActivity, map[\"url\"].toString()\r\n                                            )\r\n                                        }\r\n\r\n                                        applicationsConfigBackBtnJsonDetails.setOnClickListener {\r\n                                            showExpBackDialog(\r\n                                                Gson().toJson(map),\r\n                                                getString(R.string.jsonDetails)\r\n                                            )\r\n                                        }\r\n\r\n                                        applicationsConfigBackBtnShare.setOnClickListener {\r\n                                            weixinAlphaConfigBackDialog.dismiss()\r\n                                            val shareIntent = Intent(Intent.ACTION_SEND).apply {\r\n                                                type = \"text/plain\"\r\n                                                putExtra(\r\n                                                    Intent.EXTRA_TEXT,\r\n                                                    \"Android 微信测试版 ${map[\"versionName\"].toString()}\" + (if (appSize != null) \"（${\r\n                                                        getString(R.string.fileSize)\r\n                                                    }$appSize MB）\" else \"\") + \"\\n\\n${\r\n                                                        getString(R.string.downloadLink)\r\n                                                    }${map[\"url\"].toString()}\\n\\n鉴于微信测试版可能存在不可预知的稳定性问题，您在下载及使用该测试版本之前，必须明确并确保自身具备足够的风险识别和承受能力。\"\r\n                                                )\r\n                                            }\r\n                                            startActivity(\r\n                                                Intent.createChooser(\r\n                                                    shareIntent, getString(R.string.shareTo)\r\n                                                )\r\n                                            )\r\n                                        }\r\n                                    }\r\n                                }\r\n                            } catch (e: CustomException) {\r\n                                dialogError(e, true)\r\n                            } catch (e: Exception) {\r\n                                e.printStackTrace()\r\n                                dialogError(e)\r\n                            } finally {\r\n                                runOnUiThread { progressIndicator.hide() }\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    dialogGetWetypeLatest.setOnClickListener {\r\n                        progressIndicator.show()\r\n                        CoroutineScope(Dispatchers.IO).launch {\r\n                            class CustomException(message: String) :\r\n                                Exception(message)\r\n                            try {\r\n                                val okHttpClient =\r\n                                    OkHttpClient.Builder().followRedirects(false).build()\r\n                                val request =\r\n                                    Request.Builder()\r\n                                        .url(\"https://z.weixin.qq.com/android/download?channel=latest\")\r\n                                        .build()\r\n                                val response = okHttpClient.newCall(request).execute()\r\n                                if (!response.isSuccessful && !response.isRedirect) throw CustomException(\r\n                                    getString(R.string.getWeTypeLatestChannel404)\r\n                                )\r\n                                val url = response.header(\"Location\")\r\n                                if (url == null) throw CustomException(\"Response data is null.\")\r\n                                val appSize = getFileSize(url.toString())\r\n                                runOnUiThread {\r\n                                    val expLinkNextButtonBinding =\r\n                                        ExpLinkNextButtonBinding.inflate(layoutInflater)\r\n                                    val weTypeLatestChannelBackDialog =\r\n                                        MaterialAlertDialogBuilder(this@MainActivity).setTitle(\r\n                                            if (appSize != null) R.string.successInGetting else R.string.suspectedPackageWithdrawal\r\n                                        ).setIcon(R.drawable.flask_line).setMessage(\r\n                                            \"${\r\n                                                getString(R.string.downloadLink)\r\n                                            }$url\" + (if (appSize != null) \"\\n\\n${\r\n                                                getString(R.string.fileSize)\r\n                                            }$appSize MB\" else \"\")\r\n                                        ).setView(expLinkNextButtonBinding.root)\r\n                                            .show()\r\n\r\n                                    expLinkNextButtonBinding.apply {\r\n                                        expNextBtnCopy.setOnClickListener {\r\n                                            weTypeLatestChannelBackDialog.dismiss()\r\n                                            copyText(url.toString())\r\n                                        }\r\n\r\n                                        expNextBtnDownload.setOnClickListener {\r\n                                            weTypeLatestChannelBackDialog.dismiss()\r\n                                            downloadFile(this@MainActivity, url.toString())\r\n                                        }\r\n\r\n                                        expNextBtnShare.setOnClickListener {\r\n                                            weTypeLatestChannelBackDialog.dismiss()\r\n                                            val shareIntent = Intent(Intent.ACTION_SEND).apply {\r\n                                                type = \"text/plain\"\r\n                                                putExtra(Intent.EXTRA_TEXT, url)\r\n                                            }\r\n                                            startActivity(\r\n                                                Intent.createChooser(\r\n                                                    shareIntent, getString(R.string.shareTo)\r\n                                                )\r\n                                            )\r\n                                        }\r\n                                    }\r\n                                }\r\n                            } catch (e: CustomException) {\r\n                                dialogError(e, true)\r\n                            } catch (e: Exception) {\r\n                                e.printStackTrace()\r\n                                dialogError(e)\r\n                            } finally {\r\n                                runOnUiThread { progressIndicator.hide() }\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    dialogTencentAppStore.setOnClickListener {\r\n                        val dialogTencentAppStoreBinding =\r\n                            DialogTencentAppStoreBinding.inflate(layoutInflater)\r\n\r\n                        val tencentAppStoreDialog =\r\n                            MaterialAlertDialogBuilder(this@MainActivity)\r\n                                .setTitle(R.string.getUpdateFromTencentAppStore)\r\n                                .setIcon(R.drawable.flask_line)\r\n                                .setView(dialogTencentAppStoreBinding.root)\r\n                                .show()\r\n\r\n                        dialogTencentAppStoreBinding.apply {\r\n                            tencentAppStoreBack.setOnClickListener {\r\n                                tencentAppStoreDialog.dismiss()\r\n                            }\r\n\r\n                            getQq.setOnClickListener {\r\n                                tencentAppStoreStart(ANDROID_QQ_PACKAGE_NAME, getQq)\r\n                            }\r\n\r\n                            getTim.setOnClickListener {\r\n                                tencentAppStoreStart(ANDROID_TIM_PACKAGE_NAME, getTim)\r\n                            }\r\n\r\n                            getWeixin.setOnClickListener {\r\n                                tencentAppStoreStart(ANDROID_WECHAT_PACKAGE_NAME, getWeixin)\r\n                            }\r\n\r\n                            getWecom.setOnClickListener {\r\n                                tencentAppStoreStart(ANDROID_WECOM_PACKAGE_NAME, getWecom)\r\n                            }\r\n\r\n                            getWetype.setOnClickListener {\r\n                                tencentAppStoreStart(ANDROID_WETYPE_PACKAGE_NAME, getWetype)\r\n                            }\r\n\r\n                            getQidian.setOnClickListener {\r\n                                tencentAppStoreStart(ANDROID_QIDIAN_PACKAGE_NAME, getQidian)\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    dialogShiply.setOnClickListener {\r\n                        val dialogShiplyBinding = DialogShiplyBinding.inflate(layoutInflater)\r\n\r\n                        val shiplyDialog = MaterialAlertDialogBuilder(this@MainActivity)\r\n                            .setTitle(R.string.getUpdateFromShiplyPlatform)\r\n                            .setIcon(R.drawable.flask_line)\r\n                            .setView(dialogShiplyBinding.root)\r\n                            .setCancelable(false)\r\n                            .show()\r\n\r\n                        dialogShiplyBinding.apply {\r\n                            DataStoreUtil.apply {\r\n                                shiplyUin.editText?.setText(getStringKV(\"shiplyUin\", \"\"))\r\n                                shiplyVersion.editText?.setText(\r\n                                    getStringKV(\"shiplyVersion\", \"\")\r\n                                )\r\n                                switchShiplyAdvancedConfigurations.switchChecked =\r\n                                    getBooleanKV(\"shiplyAdvancedConfigurations\", false)\r\n\r\n                                val shiplyTargetSelect = getStringKV(\"shiplyTargetSelect\", \"\")\r\n                                if (shiplyTargetSelect == getString(R.string.shiplyTargetAppQQ) || shiplyTargetSelect == getString(\r\n                                        R.string.shiplyTargetAppTIM\r\n                                    )\r\n                                ) shiplyTarget.setText(\r\n                                    shiplyTargetSelect, false\r\n                                ) else shiplyTarget.setText(\r\n                                    getString(R.string.shiplyTargetAppQQ), false\r\n                                )\r\n                            }\r\n\r\n                            switchShiplyAdvancedConfigurations.setOnCheckedChangeListener { isChecked ->\r\n                                DataStoreUtil.putBooleanKVAsync(\r\n                                    \"shiplyAdvancedConfigurations\",\r\n                                    isChecked\r\n                                )\r\n                            }\r\n\r\n                            shiplyAdvancedConfigurationsClick.setOnClickListener {\r\n                                ShiplyAdvancedConfigFragment().apply {\r\n                                    isCancelable = false\r\n                                    show(\r\n                                        supportFragmentManager,\r\n                                        ShiplyAdvancedConfigFragment.TAG\r\n                                    )\r\n                                }\r\n                            }\r\n\r\n                            btnShiplyCancel.setOnClickListener {\r\n                                shiplyDialog.dismiss()\r\n                            }\r\n\r\n                            shiplyTarget.addTextChangedListener(object : TextWatcher {\r\n                                override fun afterTextChanged(p0: Editable?) {\r\n                                    val shiplyTargetSelect = shiplyTarget.text.toString()\r\n                                    DataStoreUtil.putStringKVAsync(\r\n                                        \"shiplyTargetSelect\", shiplyTargetSelect\r\n                                    )\r\n                                }\r\n\r\n                                override fun beforeTextChanged(\r\n                                    p0: CharSequence?, p1: Int, p2: Int, p3: Int\r\n                                ) {\r\n                                }\r\n\r\n                                override fun onTextChanged(\r\n                                    p0: CharSequence?, p1: Int, p2: Int, p3: Int\r\n                                ) {\r\n                                }\r\n                            })\r\n\r\n                            btnShiplyStart.setOnClickListener {\r\n                                shiplyUin.clearFocus()\r\n                                shiplyVersion.clearFocus()\r\n\r\n                                val imm =\r\n                                    getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager\r\n                                imm.hideSoftInputFromWindow(shiplyVersion.windowToken, 0)\r\n\r\n                                class MissingParameterException(message: String) :\r\n                                    Exception(message)\r\n\r\n                                try {\r\n                                    val spec = CircularProgressIndicatorSpec(\r\n                                        this@MainActivity, null, 0,\r\n                                        com.google.android.material.R.style.Widget_Material3_CircularProgressIndicator_ExtraSmall\r\n                                    )\r\n                                    val progressIndicatorDrawable =\r\n                                        IndeterminateDrawable.createCircularDrawable(\r\n                                            this@MainActivity, spec\r\n                                        )\r\n\r\n                                    btnShiplyStart.apply {\r\n                                        isEnabled = false\r\n                                        style(com.google.android.material.R.style.Widget_Material3_Button_Icon)\r\n                                        icon = progressIndicatorDrawable\r\n                                    }\r\n\r\n                                    if (shiplyUin.editText?.text.toString()\r\n                                            .isEmpty()\r\n                                    ) throw MissingParameterException(\"uin 信息是用于请求 TDS 腾讯端服务 Shiply 发布平台的对象 QQ 号，缺失 uin 参数将无法获取 Shiply 平台返回数据。\")\r\n                                    if (shiplyVersion.editText?.text.toString()\r\n                                            .isEmpty()\r\n                                    ) throw MissingParameterException(\"请求 TDS 腾讯端服务 Shiply 发布平台需要 QQ 版本号参数，缺失版本号参数将无法获取 Shiply 平台返回数据。\")\r\n\r\n                                    if (!DataStoreUtil.getBooleanKV(\r\n                                            \"shiplyAdvancedConfigurations\", false\r\n                                        )\r\n                                    ) {\r\n                                        DataStoreUtil.apply {\r\n                                            putStringKVAsync(\r\n                                                \"shiplyVersion\",\r\n                                                shiplyVersion.editText?.text.toString()\r\n                                            )\r\n                                            putStringKVAsync(\r\n                                                \"shiplyUin\", shiplyUin.editText?.text.toString()\r\n                                            )\r\n                                        }\r\n                                        tencentShiplyStart(\r\n                                            btnShiplyStart,\r\n                                            shiplyVersion.editText?.text.toString(),\r\n                                            shiplyUin.editText?.text.toString(),\r\n                                            shiplyTarget.text.toString()\r\n                                        )\r\n                                    } else DataStoreUtil.apply {\r\n                                        putStringKVAsync(\r\n                                            \"shiplyVersion\",\r\n                                            shiplyVersion.editText?.text.toString()\r\n                                        )\r\n                                        putStringKVAsync(\r\n                                            \"shiplyUin\", shiplyUin.editText?.text.toString()\r\n                                        )\r\n                                        tencentShiplyStart(btnShiplyStart,\r\n                                            shiplyVersion.editText?.text.toString(),\r\n                                            shiplyUin.editText?.text.toString(),\r\n                                            shiplyTarget.text.toString(),\r\n                                            getStringKV(\r\n                                                \"shiplyAppid\", \"\"\r\n                                            ).ifEmpty { SHIPLY_DEFAULT_APPID },\r\n                                            getStringKV(\r\n                                                \"shiplyOsVersion\", \"\"\r\n                                            ).ifEmpty { SDK_INT.toString() },\r\n                                            getStringKV(\r\n                                                \"shiplyModel\", \"\"\r\n                                            ).ifEmpty { Build.MODEL.toString() },\r\n                                            getStringKV(\r\n                                                \"shiplySdkVersion\", \"\"\r\n                                            ).ifEmpty { SHIPLY_DEFAULT_SDK_VERSION },\r\n                                            getStringKV(\r\n                                                \"shiplyLanguage\", \"\"\r\n                                            ).ifEmpty { Locale.getDefault().language.toString() })\r\n                                    }\r\n                                } catch (e: MissingParameterException) {\r\n                                    dialogError(e, true)\r\n                                } catch (e: Exception) {\r\n                                    e.printStackTrace()\r\n                                    dialogError(e)\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    dialogFirebase.setOnClickListener {\r\n                        // 必须检测 Google Play 服务是否可用，因为 Firebase 服务依赖于 Google Play 服务\r\n                        if (GoogleApiAvailability.getInstance()\r\n                                .isGooglePlayServicesAvailable(this@MainActivity) == ConnectionResult.SUCCESS\r\n                        ) {\r\n                            if (!Firebase.messaging.isAutoInitEnabled) {\r\n                                if (SDK_INT >= Build.VERSION_CODES.O) {\r\n                                    val channelTitle =\r\n                                        getString(R.string.rainbow_notification_channel_title)\r\n                                    val channelDescription =\r\n                                        getString(R.string.rainbow_notification_channel_description)\r\n                                    val channelId =\r\n                                        getString(R.string.rainbow_notification_channel_id)\r\n                                    val channelImportance =\r\n                                        NotificationManager.IMPORTANCE_DEFAULT\r\n                                    val notificationChannel = NotificationChannel(\r\n                                        channelId, channelTitle, channelImportance\r\n                                    )\r\n                                    notificationChannel.description = channelDescription\r\n                                    val notificationManager =\r\n                                        getSystemService(NOTIFICATION_SERVICE) as NotificationManager\r\n                                    notificationManager.createNotificationChannel(\r\n                                        notificationChannel\r\n                                    )\r\n                                }\r\n\r\n                                val dialogFirebaseFirstInfoBinding =\r\n                                    DialogFirebaseFirstInfoBinding.inflate(layoutInflater)\r\n\r\n                                val dialogFirebaseInfo =\r\n                                    MaterialAlertDialogBuilder(this@MainActivity)\r\n                                        .setTitle(R.string.initFirebaseService)\r\n                                        .setIcon(R.drawable.flask_line)\r\n                                        .setView(dialogFirebaseFirstInfoBinding.root)\r\n                                        .show()\r\n\r\n                                dialogFirebaseFirstInfoBinding.firebaseInfoCancel.setOnClickListener {\r\n                                    dialogFirebaseInfo.dismiss()\r\n                                }\r\n\r\n                                dialogFirebaseFirstInfoBinding.firebaseInfoNext.setOnClickListener {\r\n                                    Firebase.messaging.isAutoInitEnabled = true\r\n                                    Firebase.analytics.setAnalyticsCollectionEnabled(true)\r\n                                    dialogFirebaseInfo.dismiss()\r\n                                }\r\n\r\n                            } else {\r\n                                showToast(getString(R.string.initializedFirebaseService))\r\n                                Firebase.analytics.setAnalyticsCollectionEnabled(true)\r\n                            }\r\n                        } else {\r\n                            dialogError(\r\n                                Exception(getString(R.string.cannotFindGooglePlayServices)),\r\n                                true\r\n                            )\r\n                        }\r\n                    }\r\n                }\r\n                true\r\n            }\r\n\r\n        }\r\n\r\n        if (intent.action == \"android.intent.action.VIEW\" && DataStoreUtil.getIntKV(\r\n                \"userAgreement\", 0\r\n            ) >= judgeUATarget\r\n        ) showGuessVersionDialog()\r\n        binding.btnGuess.setOnClickListener {\r\n            showGuessVersionDialog()\r\n        }\r\n    }\r\n\r\n    // 下面三个函数是用于响应扫版对话框 Spinner 所选项的界面变化\r\n    private fun modeTestView(dialogGuessBinding: DialogGuessBinding, mode: String) {\r\n        dialogGuessBinding.apply {\r\n            etVersionSmall.isEnabled = true\r\n            etVersionSmall.isVisible = true\r\n            etVersion16code.isVisible = false\r\n            etVersionTrue.isVisible = false\r\n            if (mode == MODE_TIM) guessDialogWarning.isVisible = false\r\n            else {\r\n                guessDialogWarning.isVisible = true\r\n                tvWarning.setText(R.string.enumQQPreviewWarning)\r\n            }\r\n            etVersionBig.helperText = getString(R.string.enumQQMajorVersionHelpText)\r\n        }\r\n    }\r\n\r\n    private fun modeOfficialView(dialogGuessBinding: DialogGuessBinding) {\r\n        dialogGuessBinding.apply {\r\n            etVersionSmall.isEnabled = false\r\n            etVersionSmall.isVisible = true\r\n            guessDialogWarning.isVisible = false\r\n            etVersion16code.isVisible = false\r\n            etVersionTrue.isVisible = false\r\n            etVersionBig.helperText = getString(R.string.enumQQMajorVersionHelpText)\r\n        }\r\n    }\r\n\r\n    private fun modeWeChatView(dialogGuessBinding: DialogGuessBinding) {\r\n        dialogGuessBinding.apply {\r\n            etVersionSmall.isEnabled = false\r\n            guessDialogWarning.isVisible = false\r\n            etVersionSmall.isVisible = false\r\n            etVersionTrue.isVisible = true\r\n            etVersion16code.isVisible = true\r\n            etVersionBig.helperText = getString(R.string.enumWeixinMajorVersionHelpText)\r\n        }\r\n    }\r\n\r\n    @SuppressLint(\"SetTextI18n\")\r\n    private fun showGuessVersionDialog() {\r\n        val dialogGuessBinding = DialogGuessBinding.inflate(layoutInflater)\r\n        val versionSelect = DataStoreUtil.getStringKV(\"versionSelect\", MODE_OFFICIAL)\r\n        val verBig = if (versionSelect == MODE_TIM) DataStoreUtil.getStringKV(\r\n            \"TIMVersionBig\", \"\"\r\n        ) else if (versionSelect == MODE_WECHAT) DataStoreUtil.getStringKV(\r\n            \"WeixinVersionBig\", \"\"\r\n        ).replace(\".\", \"\") else DataStoreUtil.getStringKV(\"versionBig\", \"\")\r\n        dialogGuessBinding.etVersionBig.editText?.setText(verBig)\r\n        when (val memVersion = DataStoreUtil.getStringKV(\"versionSelect\", MODE_OFFICIAL)) {\r\n            MODE_TEST, MODE_OFFICIAL, MODE_WECHAT, MODE_TIM -> dialogGuessBinding.spinnerVersion.setText(\r\n                memVersion, false\r\n            )\r\n\r\n            MODE_UNOFFICIAL -> if (DataStoreUtil.getBooleanKV(\r\n                    \"useQQ900814600TestFormat\", false\r\n                )\r\n            ) dialogGuessBinding.spinnerVersion.setText(memVersion, false) else {\r\n                dialogGuessBinding.spinnerVersion.setText(MODE_OFFICIAL, false)\r\n                DataStoreUtil.putStringKVAsync(\"versionSelect\", MODE_OFFICIAL)\r\n            }\r\n\r\n            else -> {\r\n                dialogGuessBinding.spinnerVersion.setText(MODE_OFFICIAL, false)\r\n                DataStoreUtil.putStringKVAsync(\"versionSelect\", MODE_OFFICIAL)\r\n            }\r\n        }\r\n\r\n        when (val memVersion = dialogGuessBinding.spinnerVersion.text.toString()) {\r\n            MODE_TEST, MODE_UNOFFICIAL, MODE_TIM -> modeTestView(\r\n                dialogGuessBinding, memVersion\r\n            )\r\n\r\n            MODE_OFFICIAL -> modeOfficialView(dialogGuessBinding)\r\n            MODE_WECHAT -> modeWeChatView(dialogGuessBinding)\r\n        }\r\n\r\n\r\n        dialogGuessBinding.spinnerVersion.addTextChangedListener(object : TextWatcher {\r\n            override fun afterTextChanged(p0: Editable?) {\r\n                val judgeVerSelect = dialogGuessBinding.spinnerVersion.text.toString()\r\n                DataStoreUtil.putStringKVAsync(\"versionSelect\", judgeVerSelect)\r\n                when (judgeVerSelect) {\r\n                    MODE_TEST, MODE_UNOFFICIAL, MODE_TIM -> modeTestView(\r\n                        dialogGuessBinding, judgeVerSelect\r\n                    )\r\n\r\n                    MODE_OFFICIAL -> modeOfficialView(dialogGuessBinding)\r\n                    MODE_WECHAT -> modeWeChatView(dialogGuessBinding)\r\n                }\r\n            }\r\n\r\n            override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {}\r\n\r\n            override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {}\r\n        })\r\n\r\n        if (DataStoreUtil.getBooleanKV(\r\n                \"useQQ900814600TestFormat\", false\r\n            )\r\n        ) (dialogGuessBinding.spinnerLayout.editText as MaterialAutoCompleteTextView).setSimpleItems(\r\n            R.array.version_plus\r\n        ) else (dialogGuessBinding.spinnerLayout.editText as MaterialAutoCompleteTextView).setSimpleItems(\r\n            R.array.version_default\r\n        )\r\n\r\n        val dialogGuess = MaterialAlertDialogBuilder(this)\r\n            .setTitle(R.string.enumerateVersionsDialogTitle)\r\n            .setIcon(R.drawable.scan_line)\r\n            .setView(dialogGuessBinding.root)\r\n            .setCancelable(false)\r\n            .show()\r\n\r\n        class MissingVersionException(message: String) : Exception(message)\r\n        class InvalidMultipleException(message: String) : Exception(message)\r\n\r\n        dialogGuessBinding.btnGuessStart.setOnClickListener {\r\n            dialogGuessBinding.apply {\r\n                etVersionBig.clearFocus()\r\n                spinnerVersion.clearFocus()\r\n                etVersionSmall.clearFocus()\r\n                etVersion16code.clearFocus()\r\n                etVersionTrue.clearFocus()\r\n            }\r\n            val imm = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager\r\n            imm.hideSoftInputFromWindow(dialogGuessBinding.spinnerVersion.windowToken, 0)\r\n\r\n            try {\r\n                if (dialogGuessBinding.etVersionBig.editText?.text.toString()\r\n                        .isEmpty()\r\n                ) throw MissingVersionException(getString(R.string.missingMajorVersionWarning))\r\n                val versionBig = dialogGuessBinding.etVersionBig.editText?.text.toString()\r\n                val mode = dialogGuessBinding.spinnerVersion.text.toString()\r\n                var versionSmall = 0\r\n                var version16code = 0.toString()\r\n                var versionTrue = 0\r\n                when (mode) {\r\n                    MODE_TEST, MODE_UNOFFICIAL, MODE_TIM -> if (dialogGuessBinding.etVersionSmall.editText?.text.isNullOrEmpty()) throw MissingVersionException(\r\n                        getString(R.string.missingMajorVersionWarning)\r\n                    ) else {\r\n                        versionSmall =\r\n                            dialogGuessBinding.etVersionSmall.editText?.text.toString().toInt()\r\n                        if (mode != MODE_TIM && versionSmall % 5 != 0 && !DataStoreUtil.getBooleanKV(\r\n                                \"guessNot5\", false\r\n                            )\r\n                        ) throw InvalidMultipleException(getString(R.string.QQPreviewMinorNot5Warning))\r\n                        if (versionSmall != 0) when (mode) {\r\n                            MODE_TIM -> DataStoreUtil.putIntKVAsync(\r\n                                \"versionTIMSmall\", versionSmall\r\n                            )\r\n\r\n                            else -> DataStoreUtil.putIntKVAsync(\r\n                                \"versionSmall\", versionSmall\r\n                            )\r\n                        }\r\n                    }\r\n\r\n                    MODE_WECHAT -> if (dialogGuessBinding.etVersionTrue.editText?.text.isNullOrEmpty()) throw MissingVersionException(\r\n                        getString(R.string.missingWeixinTrueVersionWarning)\r\n                    ) else if (dialogGuessBinding.etVersion16code.editText?.text.isNullOrEmpty()) throw MissingVersionException(\r\n                        getString(R.string.missingWeixin16CodeWarning)\r\n                    ) else {\r\n                        versionTrue =\r\n                            dialogGuessBinding.etVersionTrue.editText?.text.toString().toInt()\r\n                        version16code =\r\n                            dialogGuessBinding.etVersion16code.editText?.text.toString()\r\n                        if (version16code != 0.toString()) DataStoreUtil.putStringKVAsync(\r\n                            \"version16code\", version16code\r\n                        )\r\n                        if (versionTrue != 0) DataStoreUtil.putIntKVAsync(\r\n                            \"versionTrue\", versionTrue\r\n                        )\r\n                    }\r\n                }\r\n                guessUrl(versionBig, versionSmall, versionTrue, version16code, mode)\r\n            } catch (e: MissingVersionException) {\r\n                dialogError(e, true)\r\n            } catch (e: InvalidMultipleException) {\r\n                dialogError(e, true)\r\n            } catch (e: Exception) {\r\n                e.printStackTrace()\r\n                dialogError(e)\r\n            }\r\n        }\r\n\r\n\r\n\r\n        dialogGuessBinding.btnGuessCancel.setOnClickListener {\r\n            dialogGuess.dismiss()\r\n        }\r\n\r\n        val memVersionSmall = DataStoreUtil.getIntKV(\"versionSmall\", -1)\r\n        val memVersionTIMSmall = DataStoreUtil.getIntKV(\"versionTIMSmall\", -1)\r\n        if (memVersionSmall != -1 && memVersionTIMSmall != -1) when {\r\n            DataStoreUtil.getStringKV(\r\n                \"versionSelect\", MODE_OFFICIAL\r\n            ) == MODE_TIM -> dialogGuessBinding.etVersionSmall.editText?.setText(\r\n                memVersionTIMSmall.toString()\r\n            )\r\n\r\n            else -> dialogGuessBinding.etVersionSmall.editText?.setText(\r\n                memVersionSmall.toString()\r\n            )\r\n        } else if (memVersionTIMSmall == -1 && memVersionSmall != -1) dialogGuessBinding.etVersionSmall.editText?.setText(\r\n            memVersionSmall.toString()\r\n        ) else if (memVersionSmall == -1 && memVersionTIMSmall != -1) dialogGuessBinding.etVersionSmall.editText?.setText(\r\n            memVersionTIMSmall.toString()\r\n        )\r\n        val memVersion16code = DataStoreUtil.getStringKV(\"version16code\", \"-1\")\r\n        if (memVersion16code != \"-1\") dialogGuessBinding.etVersion16code.editText?.setText(\r\n            memVersion16code\r\n        )\r\n        val memVersionTrue = DataStoreUtil.getIntKV(\"versionTrue\", -1)\r\n        if (memVersionTrue != -1) dialogGuessBinding.etVersionTrue.editText?.setText(memVersionTrue.toString())\r\n    }\r\n\r\n\r\n    @SuppressLint(\"SetTextI18n\", \"PrivateResource\")\r\n    private fun getData() {\r\n        viewModel.setVersionListLoading(true)\r\n        CoroutineScope(Dispatchers.IO).launch {\r\n            val resolveLocalQQJob = CoroutineScope(Dispatchers.IO).launch {\r\n                try {\r\n                    resolveLocalQQ()\r\n                } catch (_: Exception) {\r\n                    val localQQEmptyList = listOf(\r\n                        mapOf(\"key\" to \"QQVersionInstall\", \"value\" to \"\", \"type\" to \"String\"),\r\n                        mapOf(\"key\" to \"QQVersionCodeInstall\", \"value\" to \"\", \"type\" to \"String\"),\r\n                        mapOf(\r\n                            \"key\" to \"QQAppSettingParamsInstall\",\r\n                            \"value\" to \"\",\r\n                            \"type\" to \"String\"\r\n                        ),\r\n                        mapOf(\r\n                            \"key\" to \"QQAppSettingParamsPadInstall\",\r\n                            \"value\" to \"\", \"type\" to \"String\"\r\n                        ),\r\n                        mapOf(\"key\" to \"QQRdmUUIDInstall\", \"value\" to \"\", \"type\" to \"String\"),\r\n                        mapOf(\"key\" to \"QQQua\", \"value\" to \"\", \"type\" to \"String\"),\r\n                    )\r\n                    DataStoreUtil.batchPutKVAsync(localQQEmptyList)\r\n                }\r\n            }\r\n            val resolveLocalTIMJob = CoroutineScope(Dispatchers.IO).launch {\r\n                try {\r\n                    resolveLocalTIM()\r\n                } catch (_: Exception) {\r\n                    val localTIMEmptyList = listOf(\r\n                        mapOf(\"key\" to \"TIMVersionInstall\", \"value\" to \"\", \"type\" to \"String\"),\r\n                        mapOf(\"key\" to \"TIMVersionCodeInstall\", \"value\" to \"\", \"type\" to \"String\"),\r\n                        mapOf(\r\n                            \"key\" to \"TIMAppSettingParamsInstall\",\r\n                            \"value\" to \"\", \"type\" to \"String\"\r\n                        ), mapOf(\r\n                            \"key\" to \"TIMAppSettingParamsPadInstall\",\r\n                            \"value\" to \"\", \"type\" to \"String\"\r\n                        ), mapOf(\r\n                            \"key\" to \"TIMRdmUUIDInstall\",\r\n                            \"value\" to \"\", \"type\" to \"String\"\r\n                        ), mapOf(\r\n                            \"key\" to \"TIMQua\",\r\n                            \"value\" to \"\", \"type\" to \"String\"\r\n                        )\r\n                    )\r\n                    DataStoreUtil.batchPutKVAsync(localTIMEmptyList)\r\n                }\r\n            }\r\n            val resolveLocalWeixinJob = CoroutineScope(Dispatchers.IO).launch {\r\n                try {\r\n                    resolveLocalWeixin()\r\n                } catch (_: Exception) {\r\n                    val localWeixinEmptyList = listOf(\r\n                        mapOf(\r\n                            \"key\" to \"WeixinVersionInstall\",\r\n                            \"value\" to \"\", \"type\" to \"String\"\r\n                        ), mapOf(\r\n                            \"key\" to \"WeixinVersionCodeInstall\",\r\n                            \"value\" to \"\", \"type\" to \"String\"\r\n                        )\r\n                    )\r\n                    DataStoreUtil.batchPutKVAsync(localWeixinEmptyList)\r\n                }\r\n            }\r\n            joinAll(resolveLocalQQJob, resolveLocalTIMJob, resolveLocalWeixinJob)\r\n            withContext(Dispatchers.Main) {\r\n                localQQAdapter.refreshData()\r\n                localTIMAdapter.refreshData()\r\n                localWeixinAdapter.refreshData()\r\n            }\r\n            val fetchQQVersionJob = CoroutineScope(Dispatchers.IO).launch {\r\n                try {\r\n                    val okHttpClient = OkHttpClient()\r\n                    val request = Request.Builder()\r\n                        .url(\"https://im.qq.com/rainbow/androidQQVersionList\")\r\n                        .build()\r\n                    val response = okHttpClient.newCall(request).execute()\r\n                    val responseData = response.body?.string()\r\n                    if (responseData != null) {\r\n                        withContext(Dispatchers.Main) {\r\n                            resolveQQRainbow(viewModel, responseData)\r\n                        }\r\n                    }\r\n                } catch (e: Exception) {\r\n                    e.printStackTrace()\r\n                    dialogError(e)\r\n                }\r\n            }\r\n            val fetchTIMVersionJob = CoroutineScope(Dispatchers.IO).launch {\r\n                try {\r\n                    // https://im.qq.com/rainbow/TIMDownload/ 已弃用\r\n                    val okHttpClient = OkHttpClient()\r\n                    val preRequest = Request.Builder()\r\n                        .url(\"https://tim.qq.com/support.html\")\r\n                        .build()\r\n                    val preResponse = okHttpClient.newCall(preRequest).execute()\r\n                    val htmlData = preResponse.body?.string()\r\n                    val regex =\r\n                        \"\"\"jQuery\\.ajax\\(\\{\\s*url:\\s*'([^']+)'\\s*\\}\\)\\.done\\(function \\(versionData\\)\"\"\".toRegex()\r\n                    val matchResult = regex.find(htmlData!!)\r\n                    val match = matchResult?.groupValues?.getOrNull(1)\r\n                    if (match != null && (match.startsWith(\"https://\") || match.startsWith(\"http://\"))) {\r\n                        val request = Request.Builder()\r\n                            .url(match.replace(\"http://\", \"https://\"))\r\n                            .build()\r\n                        val response = okHttpClient.newCall(request).execute()\r\n                        val responseData = response.body?.string()\r\n                        if (responseData != null) {\r\n                            withContext(Dispatchers.Main) {\r\n                                resolveTIMRainbow(viewModel, responseData)\r\n                                if (!DataStoreUtil.getBooleanKV(\"closeSwipeLeftForTIM\", false)) {\r\n                                    class TipTIMSnackbarActionListener : View.OnClickListener {\r\n                                        override fun onClick(v: View?) {\r\n                                            DataStoreUtil.putBooleanKV(\r\n                                                \"closeSwipeLeftForTIM\", true\r\n                                            )\r\n                                        }\r\n                                    }\r\n\r\n                                    val isDarkTheme: Boolean =\r\n                                        when (resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) {\r\n                                            Configuration.UI_MODE_NIGHT_YES -> true\r\n                                            else -> false\r\n                                        }\r\n\r\n                                    Snackbar.make(\r\n                                        binding.root, R.string.swipeLeftToSeeMore,\r\n                                        Snackbar.LENGTH_INDEFINITE\r\n                                    ).setAction(R.string.ok, TipTIMSnackbarActionListener())\r\n                                        .setAnchorView(binding.btnGuess)\r\n                                        .apply {\r\n                                            if (SDK_INT >= Build.VERSION_CODES.S) if (isDarkTheme) setBackgroundTint(\r\n                                                getColor(com.google.android.material.R.color.m3_sys_color_dynamic_dark_secondary)\r\n                                            ) else setBackgroundTint(getColor(com.google.android.material.R.color.m3_sys_color_dynamic_light_secondary))\r\n                                        }.show()\r\n                                }\r\n                            }\r\n                        }\r\n                    } else throw Exception(\"Can not get TIM version data.\")\r\n                } catch (e: Exception) {\r\n                    e.printStackTrace()\r\n                    dialogError(e)\r\n                }\r\n            }\r\n            val fetchWeixinVersionJob = CoroutineScope(Dispatchers.IO).launch {\r\n                try {\r\n                    val okHttpClient = OkHttpClient()\r\n                    val request = Request.Builder()\r\n                        .url(\"https://weixin.qq.com/updates\")\r\n                        .build()\r\n                    val response = okHttpClient.newCall(request).execute()\r\n                    val responseData = response.body?.string()\r\n                    val okHttpClient2 = OkHttpClient()\r\n                    val request2 = Request.Builder()\r\n                        .url(\"https://support.weixin.qq.com/update/\")\r\n                        .build()\r\n                    val response2 = okHttpClient2.newCall(request2).execute()\r\n                    val responseData2 = response2.body?.string()\r\n                    if (responseData != null) withContext(Dispatchers.Main) {\r\n                        resolveWeixinHTML(viewModel, responseData, responseData2)\r\n                    }\r\n                } catch (e: Exception) {\r\n                    e.printStackTrace()\r\n                    dialogError(e)\r\n                }\r\n            }\r\n            joinAll(fetchQQVersionJob, fetchTIMVersionJob, fetchWeixinVersionJob)\r\n            withContext(Dispatchers.Main) {\r\n                viewModel.setVersionListLoading(false)\r\n            }\r\n        }\r\n    }\r\n\r\n    // https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_8.9.75.XXXXX_64.apk\r\n    private fun guessUrl(\r\n        versionBig: String,\r\n        versionSmall: Int,\r\n        versionTrue: Int,\r\n        version16codeStr: String,\r\n        mode: String\r\n    ) {\r\n        // 绑定 AlertDialog 加载对话框布局\r\n        val dialogLoadingBinding = DialogLoadingBinding.inflate(layoutInflater)\r\n        val successButtonBinding = SuccessButtonBinding.inflate(layoutInflater)\r\n\r\n        var status = STATUS_ONGOING\r\n\r\n        val progressDialog = MaterialAlertDialogBuilder(this)\r\n            .setView(dialogLoadingBinding.root)\r\n            .setCancelable(false)\r\n            .apply {\r\n                dialogLoadingBinding.apply {\r\n                    val oldLoadingIsVisible = DataStoreUtil.getBooleanKV(\"showOldLoading\", false)\r\n                    progressIndicator.isVisible = oldLoadingIsVisible\r\n                    loadingIndicator.isVisible = !oldLoadingIsVisible\r\n                }\r\n            }.create()\r\n\r\n        fun updateProgressDialogMessage(newMessage: String) {\r\n            dialogLoadingBinding.loadingMessage.text = newMessage\r\n            if (!progressDialog.isShowing) progressDialog.show() // 更新文本后才显示对话框\r\n        }\r\n\r\n        var link = \"\"\r\n        val thread = Thread {\r\n            var vSmall = versionSmall\r\n            var v16codeStr = version16codeStr\r\n            val guessNot5 = DataStoreUtil.getBooleanKV(\"guessNot5\", false)\r\n            val guessTestExtend = DataStoreUtil.getBooleanKV(\"guessTestExtend\", false)\r\n            val downloadOnSystemManager =\r\n                DataStoreUtil.getBooleanKV(\"downloadOnSystemManager\", false)\r\n            val defineSufList = DataStoreUtil.getStringKV(\"suffixDefine\", \"\").split(\", \")\r\n            val useQQ8958TestFormat = DataStoreUtil.getBooleanKV(\"useQQ8958TestFormat\", false)\r\n            val suf64hb =\r\n                if (DataStoreUtil.getBooleanKV(\r\n                        \"suffix64HB\", true\r\n                    )\r\n                ) listOf(\"_64_HB\") else emptyList()\r\n            val sufHb64 =\r\n                if (DataStoreUtil.getBooleanKV(\r\n                        \"suffixHB64\", true\r\n                    )\r\n                ) listOf(\"_HB_64\") else emptyList()\r\n            val suf64hb1 = if (DataStoreUtil.getBooleanKV(\r\n                    \"suffix64HB1\", true\r\n                )\r\n            ) listOf(\"_64_HB1\") else emptyList()\r\n            val sufHb164 = if (DataStoreUtil.getBooleanKV(\r\n                    \"suffixHB164\", true\r\n                )\r\n            ) listOf(\"_HB1_64\") else emptyList()\r\n            val suf64hb2 = if (DataStoreUtil.getBooleanKV(\r\n                    \"suffix64HB2\", true\r\n                )\r\n            ) listOf(\"_64_HB2\") else emptyList()\r\n            val sufHb264 = if (DataStoreUtil.getBooleanKV(\r\n                    \"suffixHB264\", true\r\n                )\r\n            ) listOf(\"_HB2_64\") else emptyList()\r\n            val suf64hb3 = if (DataStoreUtil.getBooleanKV(\r\n                    \"suffix64HB3\", true\r\n                )\r\n            ) listOf(\"_64_HB3\") else emptyList()\r\n            val sufHb364 = if (DataStoreUtil.getBooleanKV(\r\n                    \"suffixHB364\", true\r\n                )\r\n            ) listOf(\"_HB3_64\") else emptyList()\r\n            val suf64hd =\r\n                if (DataStoreUtil.getBooleanKV(\r\n                        \"suffix64HD\", true\r\n                    )\r\n                ) listOf(\"_64_HD\") else emptyList()\r\n            val sufHd64 =\r\n                if (DataStoreUtil.getBooleanKV(\r\n                        \"suffixHD64\", true\r\n                    )\r\n                ) listOf(\"_HD_64\") else emptyList()\r\n            val suf64hd1 = if (DataStoreUtil.getBooleanKV(\r\n                    \"suffix64HD1\", true\r\n                )\r\n            ) listOf(\"_64_HD1\") else emptyList()\r\n            val sufHd164 = if (DataStoreUtil.getBooleanKV(\r\n                    \"suffixHD164\", true\r\n                )\r\n            ) listOf(\"_HD1_64\") else emptyList()\r\n            val suf64hd2 = if (DataStoreUtil.getBooleanKV(\r\n                    \"suffix64HD2\", true\r\n                )\r\n            ) listOf(\"_64_HD2\") else emptyList()\r\n            val sufHd264 = if (DataStoreUtil.getBooleanKV(\r\n                    \"suffixHD264\", true\r\n                )\r\n            ) listOf(\"_HD2_64\") else emptyList()\r\n            val suf64hd3 = if (DataStoreUtil.getBooleanKV(\r\n                    \"suffix64HD3\", true\r\n                )\r\n            ) listOf(\"_64_HD3\") else emptyList()\r\n            val sufHd364 = if (DataStoreUtil.getBooleanKV(\r\n                    \"suffixHD364\", true\r\n                )\r\n            ) listOf(\"_HD3_64\") else emptyList()\r\n            val suf64hd1hb = if (DataStoreUtil.getBooleanKV(\r\n                    \"suffix64HD1HB\", true\r\n                )\r\n            ) listOf(\"_64_HD1HB\") else emptyList()\r\n            val sufHd1hb64 = if (DataStoreUtil.getBooleanKV(\r\n                    \"suffixHD1HB64\", true\r\n                )\r\n            ) listOf(\"_HD1HB_64\") else emptyList()\r\n            val sufTest =\r\n                if (DataStoreUtil.getBooleanKV(\"suffixTest\", true)) listOf(\"_test\") else emptyList()\r\n\r\n            val stListPre = listOf(\"_64\") + arrayListOf(\r\n                suf64hb, suf64hb1, suf64hb2, suf64hb3, suf64hd, suf64hd1, suf64hd2, suf64hd3,\r\n                suf64hd1hb, sufHb64, sufHb164, sufHb264, sufHb364, sufHd64, sufHd164, sufHd264,\r\n                sufHd364, sufHd1hb64, sufTest\r\n            ).flatten()\r\n\r\n            // [\"_64\", \"_64_HB\", \"_64_HB1\", \"_64_HB2\", \"_64_HB3\", \"_64_HD\", \"_64_HD1\", \"_64_HD2\", \"_64_HD3\", \"_64_HD1HB\", \"_HB_64\", \"_HB1_64\", \"_HB2_64\", \"_HB3_64\", \"_HD_64\", \"_HD1_64\", \"_HD2_64\", \"_HD3_64\", \"_HD1HB_64\", \"_test\"]\r\n\r\n            val stList = if (defineSufList != listOf(\"\")) stListPre + defineSufList else stListPre\r\n            val wxSoListPre = listOf(\"\", \"_1\")\r\n            val wxSoList =\r\n                if (defineSufList != listOf(\"\")) wxSoListPre + defineSufList else wxSoListPre\r\n            try {\r\n                var sIndex = 0\r\n                while (true) when (status) {\r\n                    STATUS_ONGOING -> {\r\n                        when (mode) {\r\n                            MODE_TEST -> if (link == \"\" || !guessTestExtend) {\r\n                                link =\r\n                                    if (useQQ8958TestFormat) \"https://downv6.qq.com/qqweb/QQ_1/android_apk/qq_$versionBig.${vSmall}${stList[sIndex]}.apk\" else \"https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_$versionBig.${vSmall}${stList[sIndex]}.apk\"\r\n                                if (guessTestExtend) sIndex += 1\r\n                            } else {\r\n                                link =\r\n                                    if (useQQ8958TestFormat) \"https://downv6.qq.com/qqweb/QQ_1/android_apk/qq_$versionBig.${vSmall}${stList[sIndex]}.apk\" else \"https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_$versionBig.${vSmall}${stList[sIndex]}.apk\"\r\n                                sIndex += 1\r\n                            }\r\n\r\n                            MODE_TIM -> if (link == \"\" || !guessTestExtend) {\r\n                                link =\r\n                                    \"https://downv6.qq.com/qqweb/QQ_1/android_apk/TIM_$versionBig.${vSmall}${stList[sIndex]}.apk\"\r\n                                if (guessTestExtend) sIndex += 1\r\n                            } else {\r\n                                link =\r\n                                    \"https://downv6.qq.com/qqweb/QQ_1/android_apk/TIM_$versionBig.${vSmall}${stList[sIndex]}.apk\"\r\n                                sIndex += 1\r\n                            }\r\n\r\n                            MODE_UNOFFICIAL -> link =\r\n                                \"https://downv6.qq.com/qqweb/QQ_1/android_apk/Android%20$versionBig.${vSmall}%2064.apk\"\r\n\r\n                            MODE_OFFICIAL -> {\r\n                                val soListPre = listOf(\r\n                                    \"_64\", \"_64_HB\", \"_64_HB1\", \"_64_HB2\", \"_64_HB3\", \"_HB_64\",\r\n                                    \"_HB1_64\", \"_HB2_64\", \"_HB3_64\", \"_64_BBPJ\", \"_BBPJ_64\",\r\n                                    \"_64_HD\", \"_64_HD1\", \"_64_HD2\", \"_64_HD3\", \"_HD_64\",\r\n                                    \"_HD1_64\", \"_HD2_64\", \"_HD3_64\"\r\n                                )\r\n                                val soList =\r\n                                    if (defineSufList != listOf(\"\")) soListPre + defineSufList else soListPre\r\n                                if (sIndex == (soList.size)) {\r\n                                    status = STATUS_END\r\n                                    showToast(\"未扫描到包\")\r\n                                    continue\r\n                                } else {\r\n                                    link =\r\n                                        if (useQQ8958TestFormat) \"https://downv6.qq.com/qqweb/QQ_1/android_apk/qq_${versionBig}${soList[sIndex]}.apk\" else \"https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_${versionBig}${soList[sIndex]}.apk\"\r\n                                    sIndex += 1\r\n                                }\r\n\r\n                            }\r\n\r\n                            MODE_WECHAT -> {\r\n                                // https://dldir1.qq.com/weixin/android/weixin8049android2600_0x2800318a_arm64.apk\r\n                                // https://dldir1.qq.com/weixin/android/weixin8054android2740_0x28003630_arm64_1.apk\r\n                                link =\r\n                                    \"https://dldir1v6.qq.com/weixin/android/weixin${\r\n                                        versionBig.replace(\".\", \"\")\r\n                                    }android${versionTrue}_0x${v16codeStr}_arm64${wxSoList[sIndex]}.apk\"\r\n                                sIndex += 1\r\n                            }\r\n                        }\r\n                        runOnUiThread {\r\n                            updateProgressDialogMessage(\"${getString(R.string.enumeratingDownloadLink)}$link\")\r\n                        }\r\n                        val okHttpClient = OkHttpClient()\r\n                        val request = Request.Builder().url(link).head().build()\r\n                        val response = okHttpClient.newCall(request).execute()\r\n                        val responseContentType = response.header(\"Content-Type\").toString()\r\n                        if (response.isSuccessful && responseContentType.startsWith(\"application/\")) {\r\n                            val appSize = \"%.2f\".format(\r\n                                response.header(\"Content-Length\")!!.toDouble().div(1024 * 1024)\r\n                            )\r\n                            status = STATUS_PAUSE\r\n                            runOnUiThread {\r\n                                successButtonBinding.root.parent?.let { parent ->\r\n                                    if (parent is ViewGroup) parent.removeView(\r\n                                        successButtonBinding.root\r\n                                    )\r\n                                }\r\n\r\n                                val successMaterialDialog = MaterialAlertDialogBuilder(this)\r\n                                    .setTitle(R.string.acceptedEnumerateVersion)\r\n                                    .setIcon(R.drawable.check_circle)\r\n                                    .setView(successButtonBinding.root)\r\n                                    .setCancelable(false)\r\n                                    .setMessage(\r\n                                        \"${getString(R.string.downloadLink)}$link\\n\\n${\r\n                                            getString(\r\n                                                R.string.fileSize\r\n                                            )\r\n                                        }$appSize MB\"\r\n                                    ).show()\r\n\r\n\r\n                                // 复制并停止按钮点击事件\r\n                                successButtonBinding.btnCopy.setOnClickListener {\r\n                                    copyText(link)\r\n                                    successMaterialDialog.dismiss()\r\n                                    status = STATUS_END\r\n                                }\r\n\r\n                                // 继续按钮点击事件\r\n                                successButtonBinding.btnContinue.setOnClickListener {\r\n                                    // 测试版情况下，未打开扩展扫版或扩展扫版到最后一步时执行小版本号的递增\r\n                                    when {\r\n                                        mode == MODE_TEST && (!guessTestExtend || sIndex >= (stList.size)) -> {\r\n                                            vSmall += if (!guessNot5) 5 else 1\r\n                                            sIndex = 0\r\n                                        }\r\n\r\n                                        mode == MODE_TIM && (!guessTestExtend || sIndex >= (stList.size)) -> {\r\n                                            vSmall += 1\r\n                                            sIndex = 0\r\n                                        }\r\n\r\n                                        mode == MODE_UNOFFICIAL -> vSmall += if (!guessNot5) 5 else 1\r\n                                        mode == MODE_WECHAT -> {\r\n                                            if (sIndex >= wxSoList.size && guessTestExtend) {\r\n                                                val version16code = v16codeStr.toInt(16) + 1\r\n                                                v16codeStr = version16code.toString(16)\r\n                                                sIndex = 0\r\n                                            } else if (sIndex >= wxSoListPre.size && !guessTestExtend) {\r\n                                                val version16code = v16codeStr.toInt(16) + 1\r\n                                                v16codeStr = version16code.toString(16)\r\n                                                sIndex = 0\r\n                                            }\r\n                                        }\r\n                                    }\r\n                                    successMaterialDialog.dismiss()\r\n                                    status = STATUS_ONGOING\r\n                                }\r\n\r\n                                // 停止按钮点击事件\r\n                                successButtonBinding.btnStop.setOnClickListener {\r\n                                    successMaterialDialog.dismiss()\r\n                                    status = STATUS_END\r\n                                }\r\n\r\n                                // 分享按钮点击事件\r\n                                successButtonBinding.btnShare.setOnClickListener {\r\n                                    successMaterialDialog.dismiss()\r\n                                    val shareIntent = Intent(Intent.ACTION_SEND).apply {\r\n                                        type = \"text/plain\"\r\n                                        putExtra(\r\n                                            Intent.EXTRA_TEXT, when (mode) {\r\n                                                MODE_OFFICIAL -> {\r\n                                                    val hdVersions = setOf(\r\n                                                        \"_64_HD\", \"_64_HD1\", \"_64_HD2\", \"_64_HD3\",\r\n                                                        \"_HD_64\", \"_HD1_64\", \"_HD2_64\", \"_HD3_64\"\r\n                                                    )\r\n                                                    val isHDVersion =\r\n                                                        hdVersions.any { link.contains(it) }\r\n                                                    if (isHDVersion) \"Android QQ $versionBig ${\r\n                                                        getString(R.string.previewVersion)\r\n                                                    }（${getString(R.string.fileSize)}$appSize MB）\\n\\n${\r\n                                                        getString(R.string.downloadLink)\r\n                                                    }$link\\n\\n鉴于 QQ 测试版可能存在不可预知的稳定性问题，您在下载及使用该测试版本之前，必须明确并确保自身具备足够的风险识别和承受能力。\" else \"Android QQ $versionBig ${\r\n                                                        getString(R.string.stableVersion)\r\n                                                    }（${getString(R.string.fileSize)}$appSize MB）\\n\\n${\r\n                                                        getString(R.string.downloadLink)\r\n                                                    }$link\"\r\n                                                }\r\n\r\n                                                MODE_WECHAT -> \"Android 微信 $versionBig（$versionTrue）（${\r\n                                                    getString(R.string.fileSize)\r\n                                                }$appSize MB）\\n\\n${getString(R.string.downloadLink)}$link\"\r\n\r\n                                                MODE_TIM -> \"Android TIM $versionBig.$vSmall（${\r\n                                                    getString(R.string.fileSize)\r\n                                                }$appSize MB）\\n\\n${getString(R.string.downloadLink)}$link\"\r\n\r\n                                                else -> \"Android QQ $versionBig.$vSmall ${\r\n                                                    getString(R.string.previewVersion)\r\n                                                }（${getString(R.string.fileSize)}$appSize MB）\\n\\n${\r\n                                                    getString(R.string.downloadLink)\r\n                                                }$link\\n\\n鉴于 QQ 测试版可能存在不可预知的稳定性问题，您在下载及使用该测试版本之前，必须明确并确保自身具备足够的风险识别和承受能力。\"\r\n                                            }\r\n                                        )\r\n                                    }\r\n                                    startActivity(\r\n                                        Intent.createChooser(\r\n                                            shareIntent, getString(R.string.shareTo)\r\n                                        )\r\n                                    )\r\n                                    status = STATUS_END\r\n                                }\r\n\r\n                                // 下载按钮点击事件\r\n                                successButtonBinding.btnDownload.setOnClickListener {\r\n                                    successMaterialDialog.dismiss()\r\n                                    status = STATUS_END\r\n                                    if (downloadOnSystemManager) {\r\n                                        val requestDownload =\r\n                                            DownloadManager.Request(Uri.parse(link))\r\n                                        requestDownload.apply {\r\n                                            when (mode) {\r\n                                                MODE_TEST, MODE_UNOFFICIAL -> setDestinationInExternalPublicDir(\r\n                                                    Environment.DIRECTORY_DOWNLOADS,\r\n                                                    \"Android_QQ_${versionBig}.${vSmall}_64.apk\"\r\n                                                )\r\n\r\n                                                MODE_TIM -> setDestinationInExternalPublicDir(\r\n                                                    Environment.DIRECTORY_DOWNLOADS,\r\n                                                    \"Android_TIM_${versionBig}.${vSmall}_64.apk\"\r\n                                                )\r\n\r\n                                                MODE_OFFICIAL -> setDestinationInExternalPublicDir(\r\n                                                    Environment.DIRECTORY_DOWNLOADS,\r\n                                                    \"Android_QQ_${versionBig}_64.apk\"\r\n                                                )\r\n\r\n                                                MODE_WECHAT -> setDestinationInExternalPublicDir(\r\n                                                    Environment.DIRECTORY_DOWNLOADS,\r\n                                                    \"Android_微信_${versionBig}.${versionTrue}.apk\"\r\n                                                )\r\n                                            }\r\n                                        }\r\n                                        val downloadManager =\r\n                                            getSystemService(DOWNLOAD_SERVICE) as DownloadManager\r\n                                        downloadManager.enqueue(requestDownload)\r\n                                    } else {\r\n                                        // 这里不用 Chrome Custom Tab 的原因是 Chrome 不知道咋回事有概率卡在“等待下载”状态\r\n                                        val browserIntent =\r\n                                            Intent(Intent.ACTION_VIEW, Uri.parse(link))\r\n                                        browserIntent.apply {\r\n                                            addCategory(Intent.CATEGORY_BROWSABLE)\r\n                                            flags = Intent.FLAG_ACTIVITY_NEW_TASK\r\n                                        }\r\n                                        startActivity(browserIntent)\r\n                                    }\r\n                                }\r\n                            }\r\n\r\n                        } else {\r\n                            when {\r\n                                mode == MODE_TEST && (!guessTestExtend || sIndex == (stList.size)) -> { // 测试版情况下，未打开扩展扫版或扩展扫版到最后一步时执行小版本号的递增\r\n                                    vSmall += if (!guessNot5) 5 else 1\r\n                                    sIndex = 0\r\n                                }\r\n\r\n                                mode == MODE_TIM && (!guessTestExtend || sIndex == (stList.size)) -> {\r\n                                    vSmall += 1\r\n                                    sIndex = 0\r\n                                }\r\n\r\n                                mode == MODE_UNOFFICIAL -> vSmall += if (!guessNot5) 5 else 1\r\n                                mode == MODE_WECHAT -> {\r\n                                    if (sIndex >= wxSoList.size && guessTestExtend) {\r\n                                        val version16code = v16codeStr.toInt(16) + 1\r\n                                        v16codeStr = version16code.toString(16)\r\n                                        sIndex = 0\r\n                                    } else if (sIndex >= wxSoListPre.size && !guessTestExtend) {\r\n                                        val version16code = v16codeStr.toInt(16) + 1\r\n                                        v16codeStr = version16code.toString(16)\r\n                                        sIndex = 0\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    STATUS_PAUSE -> sleep(500)\r\n\r\n                    STATUS_END -> {\r\n                        if (mode != MODE_OFFICIAL) showToast(getString(R.string.enumHasBeenStopped))\r\n                        sIndex = 0\r\n                        progressDialog.dismiss()\r\n                        break\r\n                    }\r\n                }\r\n            } catch (e: Exception) {\r\n                e.printStackTrace()\r\n                dialogError(e)\r\n                showToast(getString(R.string.enumHasBeenStopped))\r\n                progressDialog.dismiss()\r\n            }\r\n        }\r\n\r\n        dialogLoadingBinding.btnCancel.setOnClickListener {\r\n            status = STATUS_END\r\n            progressDialog.dismiss()\r\n        }\r\n\r\n        thread.start()\r\n    }\r\n\r\n    private fun showExpBackDialog(sourceDataJson: String, dialogTitle: String) {\r\n        val dialogExpBackBinding =\r\n            DialogExpBackBinding.inflate(layoutInflater)\r\n\r\n        dialogExpBackBinding.root.parent?.let { parent ->\r\n            if (parent is ViewGroup) parent.removeView(dialogExpBackBinding.root)\r\n        }\r\n\r\n        val shiplyApkUrl = sourceDataJson.toPrettyFormat().getAllAPKUrl()\r\n\r\n        dialogExpBackBinding.apply {\r\n            MaterialAlertDialogBuilder(this@MainActivity)\r\n                .setView(dialogExpBackBinding.root)\r\n                .setTitle(dialogTitle)\r\n                .setIcon(R.drawable.flask_line)\r\n                .show().apply {\r\n                    expUrlRecyclerView.layoutManager =\r\n                        LinearLayoutManager(this@MainActivity)\r\n                    when {\r\n                        shiplyApkUrl != null -> {\r\n                            expUrlBackTitle.isVisible = true\r\n                            expUrlRecyclerView.isVisible = true\r\n                            expUrlRecyclerView.adapter =\r\n                                ExpUrlListAdapter(shiplyApkUrl)\r\n                        }\r\n\r\n                        else -> {\r\n                            expUrlBackTitle.isVisible = false\r\n                            expUrlRecyclerView.isVisible = false\r\n                        }\r\n                    }\r\n                    expBackText.text =\r\n                        sourceDataJson.toPrettyFormat()\r\n                    FastScrollerBuilder(dialogExpBackBinding.expBackTextScroll).useMd2Style()\r\n                        .setPadding(0, 0, 0, 32.dpToPx).build()\r\n                }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * @param btn `MaterialButton` 实例，此函数将控制传入按钮的加载态\r\n     * @param shiplyVersion Android QQ 版本号，如 9.1.30#8538\r\n     * @param shiplyUin QQ 号\r\n     * @param shiplyAppid Android QQ 版本 Channel ID，如 `537230561`\r\n     * @param shiplyOsVersion 系统 Android 版本（整数表示）\r\n     * @param shiplyModel 设备型号\r\n     * @param shiplySdkVersion Shiply SDK 版本\r\n     * @param shiplyLanguage 系统语言\r\n     **/\r\n    private fun tencentShiplyStart(\r\n        btn: MaterialButton,\r\n        shiplyVersion: String,\r\n        shiplyUin: String,\r\n        targetApp: String = \"QQ\",\r\n        shiplyAppid: String = SHIPLY_DEFAULT_APPID,\r\n        shiplyOsVersion: String = SDK_INT.toString(),\r\n        shiplyModel: String = Build.MODEL.toString(),\r\n        shiplySdkVersion: String = SHIPLY_DEFAULT_SDK_VERSION,\r\n        shiplyLanguage: String = Locale.getDefault().language.toString()\r\n    ) {\r\n        CoroutineScope(Dispatchers.IO).launch {\r\n            class MissingCipherTextException(message: String) : Exception(message)\r\n            try {\r\n                // 参考：https://github.com/callng/GQUL\r\n                val shiplyKey = ShiplyUtil.generateAESKey()\r\n                val shiplyData = ShiplyUtil.generateJsonString(\r\n                    shiplyVersion,\r\n                    shiplyUin,\r\n                    shiplyAppid,\r\n                    shiplyOsVersion,\r\n                    shiplyModel,\r\n                    shiplySdkVersion,\r\n                    shiplyLanguage,\r\n                    targetApp\r\n                )\r\n                val shiplyEncode = ShiplyUtil.aesEncrypt(shiplyData, shiplyKey)\r\n                val shiplyRsaPublicKey =\r\n                    ShiplyUtil.base64ToRsaPublicKey(\"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC/rT6ULqXC32dgz4t/Vv4WS9pTks5Z2fPmbTHIXEVeiOEnjOpPBHOi1AUz+Ykqjk11ZyjidUwDyIaC/VtaC5Z7Bt/W+CFluDer7LiiDa6j77if5dbcvWUrJbgvhKqaEhWnMDXT1pAG2KxL/pNFAYguSLpOh9pK97G8umUMkkwWkwIDAQAB\")\r\n                if (shiplyRsaPublicKey == null) runOnUiThread { showToast(\"生成 RSA 公钥失败\") } // 应该不会失败吧\r\n                else {\r\n                    val shiplyEncode2 = ShiplyUtil.rsaEncrypt(\r\n                        shiplyKey, shiplyRsaPublicKey\r\n                    )\r\n                    val shiplyPost = mapOf(\r\n                        \"req_list\" to listOf(\r\n                            mapOf(\r\n                                \"cipher_text\" to Base64.encodeToString(\r\n                                    shiplyEncode, Base64.NO_WRAP\r\n                                ), \"public_key_version\" to 1, \"pull_key\" to Base64.encodeToString(\r\n                                    shiplyEncode2, Base64.NO_WRAP\r\n                                )\r\n                            )\r\n                        )\r\n                    )\r\n                    val shiplyResult = ShiplyUtil.postJsonWithOkHttp(\r\n                        \"https://rdelivery.qq.com/v3/config/batchpull\", shiplyPost\r\n                    )\r\n                    val shiplyText = ShiplyUtil.getCipherText(shiplyResult)\r\n                    if (!shiplyText.isNullOrEmpty()) {\r\n                        val shiplyDecode = ShiplyUtil.aesDecrypt(\r\n                            Base64.decode(shiplyText, Base64.NO_WRAP), shiplyKey\r\n                        )\r\n                        val gzipInputStream = GZIPInputStream(\r\n                            ByteArrayInputStream(shiplyDecode)\r\n                        )\r\n                        val bufferedReader = BufferedReader(\r\n                            InputStreamReader(gzipInputStream)\r\n                        )\r\n                        val decompressedStringBuilder = StringBuilder()\r\n\r\n                        bufferedReader.lineSequence().forEach { line ->\r\n                            decompressedStringBuilder.append(line)\r\n                        }\r\n\r\n                        val shiplyDecodeString = decompressedStringBuilder.toString()\r\n                        val gson = GsonBuilder().setPrettyPrinting().create()\r\n                        val shiplyDecodeStringJson =\r\n                            gson.toJson(gson.fromJson(shiplyDecodeString, JsonElement::class.java))\r\n                        runOnUiThread {\r\n                            showExpBackDialog(\r\n                                shiplyDecodeStringJson,\r\n                                getString(R.string.contentReturnedByShiplyPlatform)\r\n                            )\r\n                        }\r\n                    } else throw MissingCipherTextException(getString(R.string.missingCipherWarning))\r\n                }\r\n            } catch (e: MissingCipherTextException) {\r\n                e.printStackTrace()\r\n                dialogError(e, true)\r\n            } catch (e: Exception) {\r\n                e.printStackTrace()\r\n                dialogError(e)\r\n            } finally {\r\n                runOnUiThread {\r\n                    btn.apply {\r\n                        style(com.google.android.material.R.style.Widget_Material3_Button)\r\n                        icon = null\r\n                        isEnabled = true\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    private fun tencentAppStoreStart(\r\n        getType: String, btn: MaterialButton\r\n    ) {\r\n        val spec = CircularProgressIndicatorSpec(\r\n            this@MainActivity, null, 0,\r\n            com.google.android.material.R.style.Widget_Material3_CircularProgressIndicator_ExtraSmall\r\n        )\r\n        val progressIndicatorDrawable =\r\n            IndeterminateDrawable.createCircularDrawable(\r\n                this@MainActivity, spec\r\n            )\r\n        btn.apply {\r\n            isEnabled = false\r\n            style(com.google.android.material.R.style.Widget_Material3_Button_TonalButton_Icon)\r\n            icon = progressIndicatorDrawable\r\n        }\r\n        CoroutineScope(Dispatchers.IO).launch {\r\n            try {\r\n                val okHttpClient = OkHttpClient.Builder().build()\r\n                val mediaType = \"application/json; charset=utf-8\".toMediaTypeOrNull()\r\n                val getTypePost = mapOf(\"packagename\" to getType)\r\n                val body =\r\n                    GsonBuilder().setStrictness(Strictness.LENIENT).create().toJson(getTypePost)\r\n                val request = Request.Builder().url(\"https://upage.html5.qq.com/wechat-apkinfo\")\r\n                    .post(body.toRequestBody(mediaType!!))\r\n                    .addHeader(\"Content-Type\", \"application/json\")\r\n                    .build()\r\n\r\n                val response = okHttpClient.newCall(request).execute()\r\n                val responseData = response.body?.string()\r\n                if (response.isSuccessful && !responseData.isNullOrEmpty()) {\r\n                    val gson = GsonBuilder().setPrettyPrinting().create()\r\n                    val tencentAppStoreResult = gson.fromJson(responseData, JsonObject::class.java)\r\n                    val tencentAppStoreResultJson = gson.toJson(tencentAppStoreResult)\r\n                    val appAllData = tencentAppStoreResult.getAsJsonObject(\"app_detail_records\")\r\n                        .getAsJsonObject(getType).getAsJsonObject(\"apk_all_data\")\r\n                    val appName = appAllData.getAsJsonPrimitive(\"name\").asString\r\n                    val appVersionName = appAllData.getAsJsonPrimitive(\"version_name\").asString\r\n                    val appUrl = appAllData.getAsJsonPrimitive(\"url\").asString\r\n                    val appSize =\r\n                        \"%.2f\".format(appAllData.getAsJsonPrimitive(\"size_byte\").asDouble.div(1024 * 1024))\r\n\r\n                    runOnUiThread {\r\n                        val applicationsConfigBackButtonBinding =\r\n                            ApplicationsConfigBackButtonBinding.inflate(\r\n                                layoutInflater\r\n                            )\r\n                        val tencentAppStoreConfigBackDialog =\r\n                            MaterialAlertDialogBuilder(this@MainActivity).setTitle(R.string.contentReturnedByTencentAppStore)\r\n                                .setIcon(R.drawable.flask_line).setMessage(\r\n                                    \"$appName $appVersionName\\n${getString(R.string.downloadLink)}$appUrl\" + \"\\n\\n${\r\n                                        getString(\r\n                                            R.string.fileSize\r\n                                        )\r\n                                    }$appSize MB\"\r\n                                ).setView(applicationsConfigBackButtonBinding.root).show()\r\n\r\n                        applicationsConfigBackButtonBinding.apply {\r\n                            applicationsConfigBackBtnCopy.setOnClickListener {\r\n                                tencentAppStoreConfigBackDialog.dismiss()\r\n                                copyText(appUrl)\r\n                            }\r\n\r\n                            applicationsConfigBackBtnDownload.setOnClickListener {\r\n                                tencentAppStoreConfigBackDialog.dismiss()\r\n                                downloadFile(\r\n                                    this@MainActivity, appUrl\r\n                                )\r\n                            }\r\n\r\n                            applicationsConfigBackBtnJsonDetails.setOnClickListener {\r\n                                showExpBackDialog(\r\n                                    tencentAppStoreResultJson,\r\n                                    getString(R.string.jsonDetails)\r\n                                )\r\n                            }\r\n\r\n                            applicationsConfigBackBtnShare.setOnClickListener {\r\n                                tencentAppStoreConfigBackDialog.dismiss()\r\n                                val shareIntent = Intent(Intent.ACTION_SEND).apply {\r\n                                    type = \"text/plain\"\r\n                                    putExtra(\r\n                                        Intent.EXTRA_TEXT,\r\n                                        \"Android $appName $appVersionName\" + \"（${getString(R.string.fileSize)}$appSize MB）\" + \"\\n\\n${\r\n                                            getString(R.string.downloadLink)\r\n                                        }$appUrl\\n\\n来自腾讯应用宝\"\r\n                                    )\r\n                                }\r\n                                startActivity(\r\n                                    Intent.createChooser(\r\n                                        shareIntent, getString(R.string.shareTo)\r\n                                    )\r\n                                )\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            } catch (e: Exception) {\r\n                e.printStackTrace()\r\n                runOnUiThread { dialogError(e) }\r\n            } finally {\r\n                runOnUiThread {\r\n                    btn.apply {\r\n                        style(com.google.android.material.R.style.Widget_Material3_Button)\r\n                        icon = null\r\n                        isEnabled = true\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    private fun checkQverbowUpdates(\r\n        selfVersion: String,\r\n        isManual: Boolean,\r\n        btn: MaterialButton? = null\r\n    ) {\r\n        CoroutineScope(Dispatchers.IO).launch {\r\n            try {\r\n                val responseData = getQverbowRelease()\r\n                val latestQverbowVersion = responseData.tagName.toString().trimSubstringAtStart(\"v\")\r\n                if ((!isPreviewRelease && ComparableVersion(latestQverbowVersion) > ComparableVersion(\r\n                        selfVersion\r\n                    )) || (isPreviewRelease && ComparableVersion(latestQverbowVersion) >= ComparableVersion(\r\n                        selfVersion\r\n                    ))\r\n                ) {\r\n                    val latestQverbowBody = responseData.body.toString()\r\n                    val latestQverbowAssets = responseData.assets\r\n                    var latestQverbowDownloadUrl: String? = null\r\n                    var latestQverbowFileName: String? = null\r\n                    var latestQverbowFileSize: String? = null\r\n                    if (latestQverbowAssets != null) for (asset in latestQverbowAssets) if (asset.contentType == \"application/vnd.android.package-archive\") {\r\n                        latestQverbowDownloadUrl = asset.browserDownloadUrl\r\n                        latestQverbowFileName = asset.name\r\n                        latestQverbowFileSize = \"%.2f\".format(\r\n                            asset.size.toDouble().div(1024 * 1024)\r\n                        )\r\n                        break\r\n                    }\r\n                    if (latestQverbowDownloadUrl != null) {\r\n                        if (DataStoreUtil.getBooleanKV(\"updateLogLlmGen\", false)) CoroutineScope(\r\n                            Dispatchers.IO\r\n                        ).launch {\r\n                            val token = KeyStoreUtil.getStringKVwithKeyStore(ZHIPU_TOKEN)\r\n                            val tokenIsNullOrEmpty = token.isNullOrEmpty()\r\n                            if (!tokenIsNullOrEmpty) {\r\n                                runOnUiThread { viewModel.setUpdateBackLLMWorking(true) }\r\n                                val qverbowResponse = getZhipuWrite(\r\n                                    getString(\r\n                                        R.string.updateLogPrompt,\r\n                                        Locale.getDefault().toString()\r\n                                    ),\r\n                                    latestQverbowBody,\r\n                                    token\r\n                                )\r\n                                val gson =\r\n                                    GsonBuilder().setPrettyPrinting()\r\n                                        .create()\r\n                                val responseObject = gson.fromJson(\r\n                                    qverbowResponse, JsonObject::class.java\r\n                                )\r\n\r\n                                runOnUiThread {\r\n                                    if (responseObject.getAsJsonPrimitive(\"code\").asInt == 200) {\r\n                                        val zhipuContent =\r\n                                            responseObject.getAsJsonObject(\"data\").asJsonObject.getAsJsonArray(\r\n                                                \"choices\"\r\n                                            ).asJsonArray.first().asJsonObject.getAsJsonObject(\r\n                                                \"message\"\r\n                                            ).asJsonObject.getAsJsonPrimitive(\r\n                                                \"content\"\r\n                                            ).asString\r\n                                        viewModel.setUpdateBackLLMGenText(zhipuContent.pangu())\r\n                                    } else {\r\n                                        val zhipuContent =\r\n                                            responseObject.getAsJsonPrimitive(\"msg\").asString + getString(\r\n                                                R.string.colon\r\n                                            ) + responseObject.getAsJsonObject(\"error\").asJsonObject.getAsJsonPrimitive(\r\n                                                \"message\"\r\n                                            ).asString\r\n                                        viewModel.setUpdateBackLLMGenText(zhipuContent)\r\n                                    }\r\n                                    viewModel.setUpdateBackLLMWorking(false)\r\n                                }\r\n                            } else runOnUiThread {\r\n                                viewModel.setUpdateBackLLMWorking(false)\r\n                                viewModel.setUpdateBackLLMGenText(getString(R.string.zhipuTokenIsNull))\r\n                            }\r\n                        }\r\n\r\n                        withContext(Dispatchers.Main) {\r\n                            val updateQvtButtonBinding =\r\n                                UpdateQvtButtonBinding.inflate(layoutInflater)\r\n\r\n                            val updateQvtMaterialDialog =\r\n                                MaterialAlertDialogBuilder(this@MainActivity)\r\n                                    .setTitle(R.string.updateQverbowAvailable)\r\n                                    .setIcon(R.drawable.check_circle)\r\n                                    .setView(updateQvtButtonBinding.root)\r\n                                    .setMessage(\r\n                                        \"${getString(R.string.version)}$latestQverbowVersion\\n${\r\n                                            getString(\r\n                                                R.string.downloadLink\r\n                                            )\r\n                                        }$latestQverbowDownloadUrl\\n${\r\n                                            getString(\r\n                                                R.string.fileSize\r\n                                            )\r\n                                        }$latestQverbowFileSize MB\"\r\n                                    ).show()\r\n\r\n                            updateQvtButtonBinding.progressIndicator.apply {\r\n                                hide()\r\n                                showAnimationBehavior = LinearProgressIndicator.SHOW_NONE\r\n                                hideAnimationBehavior = LinearProgressIndicator.HIDE_ESCAPE\r\n                            }\r\n\r\n                            viewModel.isUpdateBackLLMWorking.observe(\r\n                                this@MainActivity, Observer { isWorking ->\r\n                                    if (DataStoreUtil.getBooleanKV(\"updateLogLlmGen\", false)) {\r\n                                        updateQvtButtonBinding.llmGenCard.isVisible =\r\n                                            !isWorking && viewModel.updateBackLLMGenText.value.toString()\r\n                                                .isNotEmpty()\r\n                                        updateQvtButtonBinding.progressIndicator.isVisible =\r\n                                            isWorking\r\n                                    } else {\r\n                                        updateQvtButtonBinding.llmGenCard.isVisible = false\r\n                                        updateQvtButtonBinding.progressIndicator.isVisible = false\r\n                                    }\r\n                                })\r\n                            viewModel.updateBackLLMGenText.observe(\r\n                                this@MainActivity,\r\n                                Observer { text ->\r\n                                    updateQvtButtonBinding.llmGenText.text = text\r\n                                })\r\n\r\n                            updateQvtButtonBinding.updateQvtCopy.setOnClickListener {\r\n                                copyText(latestQverbowDownloadUrl)\r\n                                updateQvtMaterialDialog.dismiss()\r\n                            }\r\n\r\n                            updateQvtButtonBinding.updateQvtDownload.setOnClickListener {\r\n                                updateQvtMaterialDialog.dismiss()\r\n                                downloadFile(\r\n                                    this@MainActivity,\r\n                                    latestQverbowDownloadUrl,\r\n                                    latestQverbowFileName\r\n                                )\r\n                            }\r\n                        }\r\n                    } else showToast(getString(R.string.noAssetsDetected))\r\n                } else showToast(getString(R.string.noUpdatesDetected))\r\n            } catch (e: Exception) {\r\n                withContext(Dispatchers.Main) {\r\n                    if (isManual) dialogError(\r\n                        RuntimeException(getString(R.string.cannotGetGitHub), e), true\r\n                    ) else showToast(getString(R.string.cannotGetGitHub))\r\n                }\r\n            } finally {\r\n                withContext(Dispatchers.Main) {\r\n                    btn?.apply {\r\n                        style(com.google.android.material.R.style.Widget_Material3_Button_TonalButton)\r\n                        icon = null\r\n                        isEnabled = true\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    private fun checkQverbowHash(\r\n        selfVersion: String,\r\n        sm3: String,\r\n        btn: MaterialButton? = null\r\n    ) {\r\n        class HashIsFalseException(message: String) : Exception(message)\r\n        CoroutineScope(Dispatchers.IO).launch {\r\n            try {\r\n                val responseData = getQverbowRelease(\"v$selfVersion\")\r\n                val githubBody = responseData.body.toString()\r\n                withContext(Dispatchers.Main) {\r\n                    if (githubBody.contains(sm3))\r\n                        showToast(R.string.hashIsTrue) else throw HashIsFalseException(\r\n                        getString(R.string.hashIsFalse)\r\n                    )\r\n                }\r\n            } catch (e: HashIsFalseException) {\r\n                withContext(Dispatchers.Main) {\r\n                    dialogError(\r\n                        RuntimeException(getString(R.string.hashIsFalse), e), true, false, true\r\n                    )\r\n                }\r\n            } catch (e: Exception) {\r\n                withContext(Dispatchers.Main) {\r\n                    dialogError(\r\n                        RuntimeException(getString(R.string.cannotGetGitHub), e), true\r\n                    )\r\n                }\r\n            } finally {\r\n                withContext(Dispatchers.Main) {\r\n                    btn?.apply {\r\n                        style(com.google.android.material.R.style.Widget_Material3_Button_TonalButton)\r\n                        icon = null\r\n                        isEnabled = true\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    // 检查特定通知渠道是否被用户关闭\r\n    private fun checkNotificationChannelEnabled(channelId: String): Boolean {\r\n        val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager\r\n        if (SDK_INT >= Build.VERSION_CODES.O) {\r\n            val channel = notificationManager.getNotificationChannel(channelId)\r\n            return channel?.importance != NotificationManager.IMPORTANCE_NONE\r\n        } else {\r\n            // 对于 API 级别 < 26 的设备，默认返回 true\r\n            return true\r\n        }\r\n    }\r\n\r\n\r\n    // Declare the launcher at the top of your Activity/Fragment:\r\n    private val requestPermissionLauncher = registerForActivityResult(\r\n        ActivityResultContracts.RequestPermission(),\r\n    ) { isGranted: Boolean ->\r\n        if (isGranted) {\r\n            // FCM SDK (and your app) can post notifications.\r\n        } else {\r\n            dialogError(\r\n                Exception(getString(R.string.cannotEnableFirebaseCloudMessaging)), true, true\r\n            )\r\n        }\r\n    }\r\n\r\n    private fun askNotificationPermission() {\r\n        // This is only necessary for API level >= 33 (TIRAMISU)\r\n        if (SDK_INT >= Build.VERSION_CODES.TIRAMISU) {\r\n            if (ContextCompat.checkSelfPermission(\r\n                    this, Manifest.permission.POST_NOTIFICATIONS\r\n                ) == PackageManager.PERMISSION_GRANTED\r\n            ) {\r\n                // FCM SDK (and your app) can post notifications.\r\n            } else if (shouldShowRequestPermissionRationale(Manifest.permission.POST_NOTIFICATIONS)) {\r\n                dialogError(\r\n                    Exception(getString(R.string.cannotEnableFirebaseCloudMessaging)), true, true\r\n                )\r\n            } else {\r\n                // Directly ask for the permission\r\n                requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)\r\n            }\r\n        } else {\r\n            if (checkNotificationChannelEnabled(getString(R.string.rainbow_notification_channel_id))) {\r\n                // FCM SDK (and your app) can post notifications.\r\n            } else {\r\n                dialogError(\r\n                    Exception(getString(R.string.cannotEnableFirebaseCloudMessaging)), true, true\r\n                )\r\n            }\r\n        }\r\n    }\r\n\r\n    // Firebase 云消息传递订阅和退订 API 有问题，会在无法连接 Google 服务器时无限重试，还无法通过生命周期等线程进行管理和关闭甚至杀死相关进程\r\n    // 下面两个方法实现不对，给 Firebase 提了 Issue，接下来等 Firebase 更改相关 API 或者进一步回复再改\r\n    // 下面的是临时策略，请勿为了缩减 MainActivity 而将其单独分离出去，等 Google 解决后应该可以只用一条语句替代下面的整个函数\r\n    private fun subscribeWithTimeout(\r\n        timeoutMillis: Long, switchPushNotifViaFcm: CellSingleSwitch\r\n    ) {\r\n        var status = false\r\n        val job = lifecycleScope.launch {\r\n            Firebase.messaging.subscribeToTopic(\"rainbowUpdates\").addOnCanceledListener {\r\n                status = true\r\n                showToast(getString(R.string.subscribeFailed))\r\n                switchPushNotifViaFcm.switchEnabled = true\r\n                switchPushNotifViaFcm.switchChecked = false\r\n                DataStoreUtil.putBooleanKV(\r\n                    \"rainbowFCMSubscribed\", false\r\n                )\r\n            }.addOnSuccessListener {\r\n                status = true\r\n                showToast(getString(R.string.subscribeSuccess))\r\n                switchPushNotifViaFcm.switchEnabled = true\r\n                switchPushNotifViaFcm.switchChecked = true\r\n                DataStoreUtil.putBooleanKV(\r\n                    \"rainbowFCMSubscribed\", true\r\n                )\r\n            }.addOnFailureListener {\r\n                status = true\r\n                showToast(getString(R.string.subscribeFailed))\r\n                switchPushNotifViaFcm.switchEnabled = true\r\n                switchPushNotifViaFcm.switchChecked = false\r\n                DataStoreUtil.putBooleanKV(\r\n                    \"rainbowFCMSubscribed\", false\r\n                )\r\n            }\r\n        }\r\n        lifecycleScope.launch {\r\n            for (i in 1..100) if (status) break else delay(timeoutMillis / 100)\r\n            if (!status) {\r\n                job.cancel()\r\n                showToast(getString(R.string.subscribeTimeout))\r\n                switchPushNotifViaFcm.switchEnabled = true\r\n                switchPushNotifViaFcm.switchChecked = false\r\n                DataStoreUtil.putBooleanKV(\r\n                    \"rainbowFCMSubscribed\", false\r\n                )\r\n            }\r\n        }\r\n    }\r\n\r\n    private fun unsubscribeWithTimeout(\r\n        timeoutMillis: Long, switchPushNotifViaFcm: CellSingleSwitch\r\n    ) {\r\n        var status = false\r\n        val job = lifecycleScope.launch {\r\n            Firebase.messaging.unsubscribeFromTopic(\"rainbowUpdates\").addOnCanceledListener {\r\n                status = true\r\n                showToast(getString(R.string.unsubscribeFailed))\r\n                switchPushNotifViaFcm.switchEnabled = true\r\n                switchPushNotifViaFcm.switchChecked = true\r\n                DataStoreUtil.putBooleanKV(\r\n                    \"rainbowFCMSubscribed\", true\r\n                )\r\n            }.addOnSuccessListener {\r\n                status = true\r\n                showToast(getString(R.string.unsubscribeSuccess))\r\n                switchPushNotifViaFcm.switchEnabled = true\r\n                switchPushNotifViaFcm.switchChecked = false\r\n                DataStoreUtil.putBooleanKV(\r\n                    \"rainbowFCMSubscribed\", false\r\n                )\r\n            }.addOnFailureListener {\r\n                status = true\r\n                showToast(getString(R.string.unsubscribeFailed))\r\n                switchPushNotifViaFcm.switchEnabled = true\r\n                switchPushNotifViaFcm.switchChecked = true\r\n                DataStoreUtil.putBooleanKV(\r\n                    \"rainbowFCMSubscribed\", true\r\n                )\r\n            }\r\n        }\r\n        lifecycleScope.launch {\r\n            for (i in 1..100) if (status) break else delay(timeoutMillis / 100)\r\n            if (!status) {\r\n                job.cancel()\r\n                showToast(getString(R.string.unsubscribeTimeout))\r\n                switchPushNotifViaFcm.switchEnabled = true\r\n                switchPushNotifViaFcm.switchChecked = true\r\n                DataStoreUtil.putBooleanKV(\r\n                    \"rainbowFCMSubscribed\", true\r\n                )\r\n            }\r\n        }\r\n    }\r\n\r\n\r\n    companion object {\r\n        @SuppressLint(\"StaticFieldLeak\")\r\n        private lateinit var context: Context\r\n\r\n        fun setContext(newContext: Context) {\r\n            this.context = newContext\r\n        }\r\n\r\n        const val STATUS_ONGOING = 0\r\n        const val STATUS_PAUSE = 1\r\n        const val STATUS_END = 2\r\n        const val JUDGE_UA_TARGET = 5 // 2024.10.28 第五版\r\n\r\n        val MODE_TEST: String by lazy { context.getString(R.string.previewVersion) }\r\n        val MODE_OFFICIAL: String by lazy { context.getString(R.string.stableVersion) }\r\n        val MODE_UNOFFICIAL: String by lazy { context.getString(R.string.spaceEnumerateVersion) }\r\n        val MODE_WECHAT: String by lazy { context.getString(R.string.weixinEnumerateVersion) }\r\n        val MODE_TIM: String by lazy { context.getString(R.string.timVersion) }\r\n    }\r\n}\r\n"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/ui/MainActivityViewModel.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.ui\n\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.MutableLiveData\nimport androidx.lifecycle.ViewModel\nimport com.xiaoniu.qqversionlist.data.QQVersionBean\nimport com.xiaoniu.qqversionlist.data.TIMVersionBean\nimport com.xiaoniu.qqversionlist.data.WeixinVersionBean\n\nclass MainActivityViewModel : ViewModel() {\n    private val _isVersionListLoading = MutableLiveData<Boolean>().apply { value = false }\n    val isVersionListLoading: LiveData<Boolean> get() = _isVersionListLoading\n\n    private val _isTokenTesting = MutableLiveData<Boolean>().apply { value = false }\n    val isTokenTesting: LiveData<Boolean> get() = _isTokenTesting\n\n    private val _isUpdateBackLLMWorking = MutableLiveData<Boolean>().apply { value = false }\n    val isUpdateBackLLMWorking: LiveData<Boolean> get() = _isUpdateBackLLMWorking\n\n    private val _updateBackLLMGenText = MutableLiveData<String>().apply { value = \"\" }\n    val updateBackLLMGenText: LiveData<String> get() = _updateBackLLMGenText\n\n    private val _qqVersion = MutableLiveData<List<QQVersionBean>>().apply { value = emptyList() }\n    val qqVersion: LiveData<List<QQVersionBean>> get() = _qqVersion\n\n    private val _timVersion = MutableLiveData<List<TIMVersionBean>>().apply { value = emptyList() }\n    val timVersion: LiveData<List<TIMVersionBean>> get() = _timVersion\n\n    private val _weixinVersion = MutableLiveData<List<WeixinVersionBean>>().apply { value = emptyList() }\n    val weixinVersion: LiveData<List<WeixinVersionBean>> get() = _weixinVersion\n\n    fun setVersionListLoading(isLoading: Boolean) {\n        _isVersionListLoading.value = isLoading\n    }\n\n    fun setTokenTesting(isTesting: Boolean) {\n        _isTokenTesting.value = isTesting\n    }\n\n    fun setUpdateBackLLMWorking(isWorking: Boolean) {\n        _isUpdateBackLLMWorking.value = isWorking\n    }\n\n    fun setUpdateBackLLMGenText(text: String) {\n        _updateBackLLMGenText.value = text\n    }\n\n    fun setQQVersion(qqVersion: List<QQVersionBean>) {\n        _qqVersion.value = qqVersion\n    }\n\n    fun setTIMVersion(timVersion: List<TIMVersionBean>) {\n        _timVersion.value = timVersion\n    }\n\n    fun setWeixinVersion(weixinVersion: List<WeixinVersionBean>) {\n        _weixinVersion.value = weixinVersion\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/ui/OSSLicensesActivity.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.ui\n\nimport android.os.Build\nimport android.os.Build.VERSION.SDK_INT\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.activity.enableEdgeToEdge\nimport androidx.compose.foundation.BorderStroke\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.PaddingValues\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.calculateEndPadding\nimport androidx.compose.foundation.layout.calculateStartPadding\nimport androidx.compose.foundation.layout.consumeWindowInsets\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.wrapContentHeight\nimport androidx.compose.foundation.rememberScrollState\nimport androidx.compose.foundation.text.selection.SelectionContainer\nimport androidx.compose.foundation.verticalScroll\nimport androidx.compose.material3.Card\nimport androidx.compose.material3.CardDefaults\nimport androidx.compose.material3.ExperimentalMaterial3Api\nimport androidx.compose.material3.Icon\nimport androidx.compose.material3.IconButton\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.MaterialTheme.typography\nimport androidx.compose.material3.Scaffold\nimport androidx.compose.material3.Text\nimport androidx.compose.material3.TopAppBar\nimport androidx.compose.material3.TopAppBarDefaults\nimport androidx.compose.material3.rememberTopAppBarState\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.painter.Painter\nimport androidx.compose.ui.input.nestedscroll.nestedScroll\nimport androidx.compose.ui.platform.LocalLayoutDirection\nimport androidx.compose.ui.res.painterResource\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.text.TextStyle\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport com.mikepenz.aboutlibraries.entity.Library\nimport com.xiaoniu.qqversionlist.R\nimport com.xiaoniu.qqversionlist.ui.theme.QQVersionListTheme\nimport com.xiaoniu.qqversionlist.util.InfoUtil.openUrlWithChromeCustomTab\nimport com.xiaoniu.qqversionlist.util.OSSLicensesObject\nimport java.net.URL\n\nclass OSSLicensesActivity : ComponentActivity() {\n    private var uniqueIdExtra: String? = null\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        enableEdgeToEdge()\n\n        // 不加这段代码的话 Google 可能会在系统栏加遮罩\n        if (SDK_INT >= Build.VERSION_CODES.Q) window.isNavigationBarContrastEnforced = false\n\n        uniqueIdExtra = intent.getStringExtra(\"library\")\n\n        setContent { QQVersionListTheme { OSSLicenses() } }\n    }\n\n    @OptIn(ExperimentalMaterial3Api::class)\n    @Composable\n    private fun OSSLicenses() {\n        val libs = OSSLicensesObject.libs\n        val lib: Library? =\n            if (uniqueIdExtra != null) libs?.libraries?.find { it.uniqueId == uniqueIdExtra } else null\n\n        val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())\n        Scaffold(\n            topBar = {\n                TopAppBar(title = {\n                    Text(\n                        if (lib != null) lib.name.toString() else stringResource(id = R.string.openSourceLicenseTitle)\n                    )\n                }, navigationIcon = {\n                    IconButton(onClick = { finish() }) {\n                        Icon(\n                            painter = painterResource(id = R.drawable.arrow_left_line),\n                            contentDescription = stringResource(id = R.string.back)\n                        )\n                    }\n                }, scrollBehavior = scrollBehavior\n                )\n            },\n        ) { innerPadding ->\n            Box(\n                modifier = Modifier\n                    .fillMaxSize()\n                    .nestedScroll(scrollBehavior.nestedScrollConnection)\n                    .consumeWindowInsets(innerPadding)\n                    .padding(\n                        top = innerPadding.calculateTopPadding(),\n                        start = innerPadding.calculateStartPadding(LocalLayoutDirection.current),\n                        end = innerPadding.calculateEndPadding(LocalLayoutDirection.current)\n                    )\n            ) {\n                if (lib != null) LibraryDetails(lib, innerPadding)\n            }\n        }\n    }\n\n    @Composable\n    private fun LibraryDetails(lib: Library, innerPadding: PaddingValues) {\n        Column(\n            modifier = Modifier\n                .fillMaxSize()\n                .verticalScroll(rememberScrollState())\n                .padding(11.dp, 7.dp, 11.dp, 11.dp)\n        ) {\n            LibraryWebsite(lib)\n            LibraryLicenses(lib)\n            Spacer(modifier = Modifier.height(innerPadding.calculateBottomPadding()))\n        }\n    }\n\n    @Composable\n    private fun LibraryWebsite(lib: Library) {\n        val url = if (lib.website != null) lib.website.toString() else \"\"\n        val repoUrl = if (url.isNotEmpty()) URL(url) else null\n        val isGitHub = if (repoUrl != null) repoUrl.host == \"github.com\" else false\n        val isGitLab = if (repoUrl != null) repoUrl.host == \"gitlab.com\" else false\n        if (url.isNotEmpty()) Card(modifier = Modifier\n            .fillMaxWidth()\n            .wrapContentHeight()\n            .padding(5.dp),\n            colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.secondaryContainer),\n            border = BorderStroke(0.dp, MaterialTheme.colorScheme.secondaryContainer),\n            onClick = {\n                if (url.isNotEmpty()) openUrlWithChromeCustomTab(url)\n            }) {\n            Row(\n                modifier = Modifier\n                    .fillMaxWidth()\n                    .padding(10.dp),\n                verticalAlignment = Alignment.CenterVertically\n            ) {\n                Icon(\n                    painter = when {\n                        isGitHub -> painterResource(id = R.drawable.github_line)\n                        isGitLab -> painterResource(id = R.drawable.gitlab_line)\n                        else -> painterResource(id = R.drawable.git_repository_line)\n                    },\n                    contentDescription = stringResource(id = R.string.aboutOpenSourceRepo),\n                    tint = MaterialTheme.colorScheme.onSecondaryContainer,\n                    modifier = Modifier.padding(end = 6.dp)\n                )\n                Text(\n                    text = url, style = TextStyle(\n                        color = MaterialTheme.colorScheme.onSecondaryContainer, fontSize = 13.55.sp\n                    )\n                )\n            }\n        }\n\n    }\n\n    @Composable\n    private fun LibraryLicenses(lib: Library) {\n        val libs = OSSLicensesObject.libs\n        if (!lib.licenses.isEmpty()) libs?.licenses?.forEach { allLicense ->\n            lib.licenses.forEach { libLicense ->\n                if (allLicense.hash == libLicense.hash) {\n                    val licenseContent = allLicense.licenseContent\n                    val licenseUrl = allLicense.url\n                    if (!licenseContent.isNullOrEmpty()) SelectionContainer {\n                        Text(\n                            modifier = Modifier.padding(5.dp, 8.dp),\n                            text = licenseContent.toString(),\n                            style = typography.bodyMedium\n                        )\n                    } else if (!licenseUrl.isNullOrEmpty()) ClickableCard(url = licenseUrl.toString(),\n                        icon = painterResource(id = R.drawable.info_card_line),\n                        contentDescription = stringResource(id = R.string.openSourceLicenseTitle),\n                        onClick = { openUrlWithChromeCustomTab(licenseUrl.toString()) })\n                }\n            }\n        }\n    }\n\n    @Composable\n    private fun ClickableCard(\n        url: String, icon: Painter, contentDescription: String, onClick: () -> Unit\n    ) {\n        Card(\n            modifier = Modifier\n                .fillMaxWidth()\n                .wrapContentHeight()\n                .padding(5.dp),\n            colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.secondaryContainer),\n            border = BorderStroke(0.dp, MaterialTheme.colorScheme.secondaryContainer),\n            onClick = onClick\n        ) {\n            Row(\n                modifier = Modifier\n                    .fillMaxWidth()\n                    .padding(10.dp),\n                verticalAlignment = Alignment.CenterVertically\n            ) {\n                Icon(\n                    painter = icon,\n                    contentDescription = contentDescription,\n                    tint = MaterialTheme.colorScheme.onSecondaryContainer,\n                    modifier = Modifier.padding(end = 6.dp)\n                )\n                Text(\n                    text = url, style = TextStyle(\n                        color = MaterialTheme.colorScheme.onSecondaryContainer, fontSize = 13.55.sp\n                    )\n                )\n            }\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/ui/OSSLicensesMenuActivity.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.ui\n\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Build\nimport android.os.Build.VERSION.SDK_INT\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.activity.enableEdgeToEdge\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.interaction.MutableInteractionSource\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.ExperimentalLayoutApi\nimport androidx.compose.foundation.layout.FlowRow\nimport androidx.compose.foundation.layout.consumeWindowInsets\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.lazy.LazyColumn\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material3.Card\nimport androidx.compose.material3.CardDefaults\nimport androidx.compose.material3.ExperimentalMaterial3Api\nimport androidx.compose.material3.HorizontalDivider\nimport androidx.compose.material3.Icon\nimport androidx.compose.material3.IconButton\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.MaterialTheme.typography\nimport androidx.compose.material3.Scaffold\nimport androidx.compose.material3.Text\nimport androidx.compose.material3.TopAppBar\nimport androidx.compose.material3.TopAppBarDefaults\nimport androidx.compose.material3.rememberTopAppBarState\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.input.nestedscroll.nestedScroll\nimport androidx.compose.ui.res.painterResource\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.text.style.TextAlign\nimport androidx.compose.ui.text.style.TextDecoration\nimport androidx.compose.ui.unit.dp\nimport com.mikepenz.aboutlibraries.Libs\nimport com.mikepenz.aboutlibraries.entity.Developer\nimport com.mikepenz.aboutlibraries.entity.Library\nimport com.xiaoniu.qqversionlist.R\nimport com.xiaoniu.qqversionlist.ui.theme.QQVersionListTheme\nimport com.xiaoniu.qqversionlist.util.InfoUtil.openUrlWithChromeCustomTab\nimport com.xiaoniu.qqversionlist.util.OSSLicensesObject\nimport org.apache.commons.io.IOUtils\nimport java.nio.charset.StandardCharsets\n\nclass OSSLicensesMenuActivity : ComponentActivity() {\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        enableEdgeToEdge()\n\n        // 不加这段代码的话 Google 可能会在系统栏加遮罩\n        if (SDK_INT >= Build.VERSION_CODES.Q) window.isNavigationBarContrastEnforced = false\n\n        setContent { QQVersionListTheme { OSSLicensesMenu() } }\n    }\n\n    private fun readRawResource(context: Context, resourceId: Int): String {\n        context.resources.openRawResource(resourceId).use { inputStream ->\n            return IOUtils.toString(inputStream, StandardCharsets.UTF_8)\n        }\n    }\n\n    @OptIn(ExperimentalMaterial3Api::class, ExperimentalLayoutApi::class)\n    @Composable\n    private fun OSSLicensesMenu(lib: Libs? = null) {\n        var libs = lib\n        if (libs == null) libs =\n            Libs.Builder().withJson(readRawResource(this, R.raw.aboutlibraries)).build() else lib\n        OSSLicensesObject.libs = libs\n        val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())\n        Scaffold(\n            topBar = {\n                TopAppBar(\n                    title = {\n                        Text(stringResource(id = R.string.openSourceLicenseTitle))\n                    }, navigationIcon = {\n                        IconButton(onClick = { finish() }) {\n                            Icon(\n                                painter = painterResource(id = R.drawable.arrow_left_line),\n                                contentDescription = stringResource(id = R.string.back)\n                            )\n                        }\n                    }, scrollBehavior = scrollBehavior\n                )\n            },\n        ) { innerPadding ->\n            LazyColumn(\n                modifier = Modifier\n                    .fillMaxSize()\n                    .nestedScroll(scrollBehavior.nestedScrollConnection)\n                    .consumeWindowInsets(innerPadding), contentPadding = innerPadding\n            ) {\n                libs.libraries.forEach { library ->\n                    item {\n                        LibraryItem(library = library)\n                        HorizontalDivider(thickness = 1.dp)\n                    }\n                }\n            }\n        }\n    }\n\n    @OptIn(ExperimentalLayoutApi::class)\n    @Composable\n    private fun LibraryItem(library: Library) {\n        val version = library.artifactVersion\n        Box(\n            modifier = Modifier.clickable(onClick = {\n                if (library.licenses.isNotEmpty() || library.website != null) {\n                    val intent = Intent(\n                        this@OSSLicensesMenuActivity, OSSLicensesActivity::class.java\n                    )\n                    intent.putExtra(\"library\", library.uniqueId)\n                    startActivity(intent)\n                }\n            })\n        ) {\n            Box(modifier = Modifier.padding(16.dp, 12.dp, 16.dp, 16.dp)) {\n                Column {\n                    RenderName(library.name)\n                    RenderUniqueID(library.uniqueId)\n                    RenderDevelopers(library.developers)\n                    RenderDescription(library.description)\n                    RenderVersionAndLicenses(library, version)\n                }\n            }\n        }\n    }\n\n    @Composable\n    private fun RenderName(name: String) {\n        return Text(\n            modifier = Modifier.padding(0.dp, 2.dp, 0.dp, 0.dp),\n            text = name, style = typography.titleMedium\n        )\n    }\n\n    @Composable\n    private fun RenderUniqueID(uniqueID: String) {\n        return Text(\n            modifier = Modifier.padding(0.dp, 0.dp, 0.dp, 2.dp),\n            text = uniqueID, style = typography.labelSmall\n        )\n    }\n\n    @OptIn(ExperimentalLayoutApi::class)\n    @Composable\n    private fun RenderDevelopers(developers: List<Developer>) {\n        if (!developers.isEmpty()) {\n            FlowRow(\n                modifier = Modifier\n                    .padding(0.dp, 2.dp, 0.dp, 2.dp)\n                    .fillMaxWidth(),\n                horizontalArrangement = Arrangement.spacedBy(0.dp),\n                verticalArrangement = Arrangement.spacedBy(0.dp),\n            ) {\n                val colorScheme = MaterialTheme.colorScheme\n                developers.withIndex().forEach { (index, developer) ->\n                    if (!developer.organisationUrl.isNullOrEmpty()) Text(\n                        text = developer.name.toString(),\n                        style = typography.bodyMedium.copy(\n                            textDecoration = TextDecoration.Underline\n                        ),\n                        modifier = Modifier.clickable(\n                            indication = null,\n                            interactionSource = remember { MutableInteractionSource() },\n                            onClick = { openUrlWithChromeCustomTab(developer.organisationUrl.toString()) }),\n                        color = colorScheme.primary\n                    ) else Text(\n                        text = developer.name.toString(),\n                        style = typography.bodyMedium,\n                    )\n                    if (index < developers.size - 1) Text(\n                        text = \", \", style = typography.bodyMedium\n                    )\n                }\n            }\n        }\n    }\n\n    @Composable\n    private fun RenderDescription(description: String?) {\n        if (!description.isNullOrBlank()) Text(\n            text = description,\n            style = typography.bodySmall,\n            modifier = Modifier.padding(0.dp, 2.dp, 0.dp, 2.dp)\n        )\n    }\n\n    @OptIn(ExperimentalLayoutApi::class)\n    @Composable\n    private fun RenderVersionAndLicenses(library: Library, version: String?) {\n        FlowRow(\n            modifier = Modifier\n                .fillMaxWidth()\n                .padding(top = 4.dp),\n            horizontalArrangement = Arrangement.spacedBy(8.dp),\n            verticalArrangement = Arrangement.spacedBy(7.dp),\n        ) {\n            Card(\n                colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surfaceContainerHigh),\n                shape = RoundedCornerShape(4.dp)\n            ) {\n                Text(\n                    text = if (version.toString().first()\n                            .isDigit()\n                    ) \"v${version.toString()}\" else version.toString(),\n                    modifier = Modifier.padding(8.dp, 3.dp, 8.dp, 3.dp),\n                    style = typography.labelSmall,\n                    color = MaterialTheme.colorScheme.onSurface,\n                    textAlign = TextAlign.Center\n                )\n            }\n            if (library.licenses.isNotEmpty()) library.licenses.forEach {\n                Card(\n                    colors = CardDefaults.cardColors(\n                        contentColor = MaterialTheme.colorScheme.onSecondaryContainer,\n                        containerColor = MaterialTheme.colorScheme.secondaryContainer\n                    ), shape = RoundedCornerShape(4.dp)\n                ) {\n                    Text(\n                        modifier = Modifier.padding(8.dp, 3.dp, 8.dp, 3.dp),\n                        text = it.name,\n                        style = typography.labelSmall\n                    )\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/ui/QQVersionAdapter.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.ui\n\nimport android.annotation.SuppressLint\nimport android.content.Context\nimport android.graphics.Typeface\nimport android.util.Base64\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.ImageView\nimport android.widget.LinearLayout\nimport android.widget.TextView\nimport androidx.core.content.res.ResourcesCompat\nimport androidx.core.view.isVisible\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.ListAdapter\nimport androidx.recyclerview.widget.RecyclerView\nimport coil3.load\nimport coil3.request.crossfade\nimport coil3.request.transformations\nimport coil3.transform.RoundedCornersTransformation\nimport com.google.android.material.card.MaterialCardView\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.google.android.material.progressindicator.LinearProgressIndicator\nimport com.xiaoniu.qqversionlist.R\nimport com.xiaoniu.qqversionlist.data.QQVersionBean\nimport com.xiaoniu.qqversionlist.databinding.ItemQqVersionBinding\nimport com.xiaoniu.qqversionlist.databinding.ItemQqVersionDetailBinding\nimport com.xiaoniu.qqversionlist.util.DataStoreUtil\nimport com.xiaoniu.qqversionlist.util.Extensions.dpToPx\nimport com.xiaoniu.qqversionlist.util.InfoUtil.showToast\nimport com.xiaoniu.qqversionlist.util.StringUtil.toPrettyFormat\n\nclass QQVersionAdapter :\n    ListAdapter<QQVersionBean, RecyclerView.ViewHolder>(QQVersionDiffCallback()) {\n    private var getProgressSize = DataStoreUtil.getBooleanKV(\"progressSize\", false)\n    private var getProgressSizeText = DataStoreUtil.getBooleanKV(\"progressSizeText\", false)\n    private var getVersionTCloud = DataStoreUtil.getBooleanKV(\"versionTCloud\", true)\n    private var getVersionTCloudThickness =\n        DataStoreUtil.getStringKV(\"versionTCloudThickness\", \"System\")\n    private var getShowUnrealEngineTag = DataStoreUtil.getBooleanKV(\"unrealEngineTag\", false)\n    private var getShowKuiklyTag = DataStoreUtil.getBooleanKV(\"kuiklyTag\", true)\n\n    class ViewHolder(val binding: ItemQqVersionBinding, val context: Context) :\n        RecyclerView.ViewHolder(binding.root)\n\n    class ViewHolderDetail(val binding: ItemQqVersionDetailBinding, val context: Context) :\n        RecyclerView.ViewHolder(binding.root)\n\n    override fun getItemViewType(position: Int): Int {\n        return currentList[position].displayType\n    }\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {\n        return when (viewType) {\n            0 -> { // 卡片收起态\n                ViewHolder(\n                    ItemQqVersionBinding.inflate(\n                        LayoutInflater.from(parent.context), parent, false\n                    ), parent.context\n                ).apply {\n                    binding.ibExpand.setOnClickListener {\n                        currentList[bindingAdapterPosition].displayType = 1\n                        notifyItemChanged(bindingAdapterPosition)\n                    }\n                    binding.cardAll.setOnLongClickListener {\n                        longPressCard(bindingAdapterPosition, it)\n                        true\n                    }\n                }\n            }\n\n            else -> {\n                ViewHolderDetail(\n                    ItemQqVersionDetailBinding.inflate(\n                        LayoutInflater.from(parent.context), parent, false\n                    ), parent.context\n                ).apply {\n                    binding.ibCollapse.setOnClickListener {\n                        currentList[bindingAdapterPosition].displayType = 0\n                        notifyItemChanged(bindingAdapterPosition)\n                    }\n                    binding.cardAllDetail.setOnLongClickListener {\n                        longPressCard(bindingAdapterPosition, it)\n                        true\n                    }\n                }\n            }\n        }\n    }\n\n    @SuppressLint(\"SetTextI18n\")\n    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {\n        val bean = currentList[position]\n        when (holder) {\n            is ViewHolder -> {\n                holder.binding.apply {\n                    tvVersion.text = bean.versionNumber\n                    tvSize.text = bean.size + \" MB\"\n                    bindProgress(\n                        listProgressLine, null, tvPerSizeText, tvPerSizeCard, tvSizeCard, bean\n                    )\n                    bindDisplayInstall(tvInstall, tvInstallCard, bean)\n                    bindVersionTCloud(tvVersion, holder.context)\n                    bindAccessibilityTag(accessibilityTag, holder.context, bean)\n                    bindQQNTTag(qqntTag, bean)\n                    bindUnrealEngineTag(ueTag, bean)\n                    bindKuiklyTag(kuiklyTag, bean)\n                }\n            }\n\n            is ViewHolderDetail -> {\n                holder.binding.apply {\n                    linearImages.removeAllViews()\n                    bean.imgs.forEachIndexed { index, s ->\n                        val iv = ImageView(holder.itemView.context).apply {\n                            setPadding(0, 0, if (index == bean.imgs.size - 1) 0 else 4.dpToPx, 0)\n                            layoutParams = LinearLayout.LayoutParams(\n                                LinearLayout.LayoutParams.WRAP_CONTENT, 150.dpToPx\n                            )\n                        }\n                        linearImages.addView(iv)\n                        iv.load(s) {\n                            crossfade(true)\n                            transformations(RoundedCornersTransformation(2.dpToPx.toFloat()))\n                        }\n                    }\n                    tvOldVersion.text = bean.versionNumber\n                    tvOldSize.text = bean.size + \" MB\"\n                    tvDetailVersion.text =\n                        holder.itemView.context.getString(R.string.version) + bean.versionNumber\n                    tvDetailSize.text =\n                        holder.itemView.context.getString(R.string.reatedFileSize) + bean.size + \" MB\"\n                    tvTitle.text = bean.featureTitle\n                    tvDesc.text = bean.summary.joinToString(separator = \"\\n- \", prefix = \"- \")\n\n                    tvTitle.isVisible = tvTitle.text != \"\"\n\n                    bindDisplayInstall(tvOldInstall, tvOldInstallCard, bean)\n                    bindVersionTCloud(tvOldVersion, holder.context)\n                    bindAccessibilityTag(accessibilityOldTag, holder.context, bean)\n                    bindQQNTTag(qqntOldTag, bean)\n                    bindUnrealEngineTag(ueOldTag, bean)\n                    bindKuiklyTag(kuiklyOldTag, bean)\n\n                    bindProgress(\n                        listDetailProgressLine,\n                        tvPerSize,\n                        tvOldPerSizeText,\n                        tvOldPerSizeCard,\n                        tvOldSizeCard,\n                        bean\n                    )\n                }\n            }\n        }\n    }\n\n    private fun longPressCard(bindingAdapterPosition: Int, it: View) {\n        if (DataStoreUtil.getBooleanKV(\"longPressCard\", true)) showDialog(\n            it.context, currentList[bindingAdapterPosition].jsonString.toPrettyFormat()\n        ) else showToast(R.string.longPressToViewSourceDetailsIsDisabled)\n    }\n\n    @SuppressLint(\"SetTextI18n\")\n    private fun bindProgress(\n        listProgressLine: LinearProgressIndicator,\n        tvPerSize: TextView?,\n        tvPerSizeText: TextView,\n        tvPerSizeCard: MaterialCardView,\n        tvSizeCard: MaterialCardView,\n        bean: QQVersionBean,\n    ) {\n        tvPerSize?.isVisible = (getProgressSize || getProgressSizeText)\n        listProgressLine.isVisible = getProgressSize\n        tvPerSizeCard.isVisible = getProgressSizeText\n\n        val layoutParams = tvSizeCard.layoutParams as? ViewGroup.MarginLayoutParams ?: return\n        layoutParams.marginEnd = if (getProgressSizeText) 6.dpToPx else 0\n        tvSizeCard.layoutParams = layoutParams\n\n        if (getProgressSize || getProgressSizeText) {\n            val listMaxSize = currentList.maxByOrNull { it.size.toFloat() }?.size?.toFloat() ?: 0f\n\n            tvPerSize?.text = \"${\n                tvPerSizeCard.context.getString(\n                    R.string.currentSizeVsLargestHistoricalPackage, \"$listMaxSize MB\"\n                )\n            }${\n                (\"%.2f\".format(bean.size.toFloat() / listMaxSize * 100)).replace(\n                    \"100.00\", \"100\"\n                )\n            }%\"\n            tvPerSizeText.text = \"${\n                (\"%.2f\".format(bean.size.toFloat() / listMaxSize * 100)).replace(\n                    \"100.00\", \"100\"\n                )\n            }%\"\n\n            // 进度条这里不能直接用 listMaxSize\n            // 因为鬼知道 Material 上游的什么 Bug，导致这里要故意拖点时间让 Material 进度指示条视图加载完毕才能正确显示进度更新，否则会显示异常\n            listProgressLine.apply {\n                max = ((currentList.maxByOrNull { it.size.toFloat() }?.size?.toFloat()\n                    ?: 0f) * 100).toInt()\n                progress = (bean.size.toFloat() * 100).toInt()\n            }\n        }\n\n    }\n\n    private fun bindDisplayInstall(\n        tvInstall: TextView, tvInstallCard: MaterialCardView, bean: QQVersionBean\n    ) {\n        if (bean.displayInstall) {\n            tvInstallCard.isVisible = true\n            tvInstall.text = tvInstall.context.getString(R.string.installed)\n            val marginLayoutParams = tvInstallCard.layoutParams as ViewGroup.MarginLayoutParams\n            marginLayoutParams.marginStart =\n                if (bean.isAccessibility || bean.isQQNTFramework || (getShowKuiklyTag && bean.isKuiklyInside)) 3.dpToPx else 6.dpToPx\n            tvInstallCard.layoutParams = marginLayoutParams\n        } else tvInstallCard.isVisible = false\n    }\n\n    private fun bindAccessibilityTag(\n        accessibilityTag: ImageView, context: Context, bean: QQVersionBean\n    ) {\n        if (bean.isAccessibility) {\n            accessibilityTag.contentDescription = String(\n                Base64.decode(\n                    context.getString(R.string.accessibilityTag), Base64.NO_WRAP\n                ), Charsets.UTF_8\n            )\n            accessibilityTag.isVisible = true\n        } else accessibilityTag.isVisible = false\n    }\n\n    private fun bindQQNTTag(qqntTag: ImageView, bean: QQVersionBean) {\n        qqntTag.isVisible = bean.isQQNTFramework\n    }\n\n    private fun bindUnrealEngineTag(ueTag: ImageView, bean: QQVersionBean) {\n        ueTag.isVisible = (getShowUnrealEngineTag && bean.isUnrealEngine)\n    }\n\n    private fun bindKuiklyTag(kuikly: ImageView, bean: QQVersionBean) {\n        kuikly.isVisible = (getShowKuiklyTag && bean.isKuiklyInside)\n    }\n\n    private fun bindVersionTCloud(tvVersion: TextView, context: Context) {\n        if (getVersionTCloud) {\n            val TCloudFont: Typeface = when (getVersionTCloudThickness) {\n                \"Light\" -> ResourcesCompat.getFont(context, R.font.tcloud_number_light)!!\n                \"Regular\" -> ResourcesCompat.getFont(context, R.font.tcloud_number_regular)!!\n                \"Bold\" -> ResourcesCompat.getFont(context, R.font.tcloud_number_bold)!!\n                else -> ResourcesCompat.getFont(context, R.font.tcloud_number_vf)!!\n            }\n            tvVersion.typeface = TCloudFont\n        } else tvVersion.setTypeface(null, Typeface.NORMAL)\n    }\n\n    private fun showDialog(context: Context, s: String) {\n        val tv = TextView(context).apply {\n            text = s\n            setTextIsSelectable(true)\n            setPadding(96, 48, 96, 96)\n        }\n        MaterialAlertDialogBuilder(context).setView(tv).setTitle(R.string.jsonDetails)\n            .setIcon(R.drawable.braces_line).show()\n    }\n\n    override fun onBindViewHolder(\n        holder: RecyclerView.ViewHolder, position: Int, payloads: MutableList<Any>\n    ) {\n        if (payloads.isEmpty()) onBindViewHolder(holder, position)\n        else {\n            val bean = currentList[position]\n            when (payloads[0]) {\n                \"displayType\" -> onBindViewHolder(holder, position)\n\n                \"displayInstall\" -> if (holder is ViewHolder) bindDisplayInstall(\n                    holder.binding.tvInstall, holder.binding.tvInstallCard, bean\n                ) else if (holder is ViewHolderDetail) bindDisplayInstall(\n                    holder.binding.tvOldInstall, holder.binding.tvOldInstallCard, bean\n                )\n\n                \"isShowProgressSize\", \"isShowProgressSizeText\" -> if (holder is ViewHolder) bindProgress(\n                    holder.binding.listProgressLine,\n                    null,\n                    holder.binding.tvPerSizeText,\n                    holder.binding.tvPerSizeCard,\n                    holder.binding.tvSizeCard,\n                    bean\n                ) else if (holder is ViewHolderDetail) bindProgress(\n                    holder.binding.listDetailProgressLine,\n                    holder.binding.tvPerSize,\n                    holder.binding.tvOldPerSizeText,\n                    holder.binding.tvOldPerSizeCard,\n                    holder.binding.tvOldSizeCard,\n                    bean\n                )\n\n                \"isTCloud\" -> if (holder is ViewHolder) bindVersionTCloud(\n                    holder.binding.tvVersion, holder.context\n                ) else if (holder is ViewHolderDetail) bindVersionTCloud(\n                    holder.binding.tvOldVersion, holder.context\n                )\n\n                \"isShowUnrealEngineTag\" -> if (holder is ViewHolder) {\n                    bindUnrealEngineTag(holder.binding.ueTag, bean)\n                    bindDisplayInstall(holder.binding.tvInstall, holder.binding.tvInstallCard, bean)\n                } else if (holder is ViewHolderDetail) {\n                    bindUnrealEngineTag(holder.binding.ueOldTag, bean)\n                    bindDisplayInstall(\n                        holder.binding.tvOldInstall, holder.binding.tvOldInstallCard, bean\n                    )\n                }\n\n                \"isShowKuiklyTag\" -> if (holder is ViewHolder) {\n                    bindKuiklyTag(holder.binding.kuiklyTag, bean)\n                    bindDisplayInstall(holder.binding.tvInstall, holder.binding.tvInstallCard, bean)\n                } else if (holder is ViewHolderDetail) {\n                    bindKuiklyTag(holder.binding.kuiklyOldTag, bean)\n                    bindDisplayInstall(\n                        holder.binding.tvOldInstall, holder.binding.tvOldInstallCard, bean\n                    )\n                }\n            }\n        }\n    }\n\n    fun updateItemProperty(payloads: Any?) {\n        when (payloads) {\n            \"isShowProgressSize\" -> {\n                getProgressSize = DataStoreUtil.getBooleanKV(\"progressSize\", false)\n                notifyItemRangeChanged(0, currentList.size, \"isShowProgressSize\")\n            }\n\n            \"isShowProgressSizeText\" -> {\n                getProgressSizeText = DataStoreUtil.getBooleanKV(\"progressSizeText\", false)\n                notifyItemRangeChanged(0, currentList.size, \"isShowProgressSizeText\")\n            }\n\n            \"isTCloud\" -> {\n                getVersionTCloud = DataStoreUtil.getBooleanKV(\"versionTCloud\", true)\n                getVersionTCloudThickness =\n                    DataStoreUtil.getStringKV(\"versionTCloudThickness\", \"System\")\n                notifyItemRangeChanged(0, currentList.size, \"isTCloud\")\n            }\n\n            \"isShowUnrealEngineTag\" -> {\n                getShowUnrealEngineTag = DataStoreUtil.getBooleanKV(\"unrealEngineTag\", false)\n                notifyItemRangeChanged(0, currentList.size, \"isShowUnrealEngineTag\")\n            }\n\n            \"isShowKuiklyTag\" -> {\n                getShowKuiklyTag = DataStoreUtil.getBooleanKV(\"kuiklyTag\", true)\n                notifyItemRangeChanged(0, currentList.size, \"isShowKuiklyTag\")\n            }\n        }\n    }\n\n    class QQVersionDiffCallback : DiffUtil.ItemCallback<QQVersionBean>() {\n        override fun areItemsTheSame(\n            oldItem: QQVersionBean, newItem: QQVersionBean\n        ): Boolean {\n            return oldItem.jsonString == newItem.jsonString\n        }\n\n        override fun areContentsTheSame(\n            oldItem: QQVersionBean, newItem: QQVersionBean\n        ): Boolean {\n            return oldItem.displayType == newItem.displayType && oldItem.displayInstall == newItem.displayInstall\n        }\n\n        override fun getChangePayload(\n            oldItem: QQVersionBean, newItem: QQVersionBean\n        ): Any? {\n            return when {\n                oldItem.displayType != newItem.displayType -> \"displayType\"\n                oldItem.displayInstall != newItem.displayInstall -> \"displayInstall\"\n                else -> null\n            }\n        }\n    }\n}\n\n"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/ui/QQVersionListFragment.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.ui\n\nimport android.annotation.SuppressLint\nimport android.content.res.Configuration\nimport android.content.res.Resources\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.fragment.app.Fragment\nimport androidx.recyclerview.widget.ConcatAdapter\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport androidx.recyclerview.widget.StaggeredGridLayoutManager\nimport com.xiaoniu.qqversionlist.databinding.RecycleQqVersionBinding\nimport com.xiaoniu.qqversionlist.util.Extensions.pxToDp\n\nclass QQVersionListFragment : Fragment() {\n    private var _fragmentBinding: RecycleQqVersionBinding? = null\n    private val fragmentBinding get() = _fragmentBinding!!\n\n    override fun onCreateView(\n        inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?\n    ): View {\n        _fragmentBinding = RecycleQqVersionBinding.inflate(inflater, container, false)\n        val view = fragmentBinding.root\n        return view\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        versionListStaggeredGridLayout(requireActivity() as MainActivity)\n        fragmentBinding.rvContent.addOnScrollListener(object : RecyclerView.OnScrollListener() {\n            override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {\n                super.onScrolled(recyclerView, dx, dy)\n            }\n        })\n    }\n\n    override fun onConfigurationChanged(newConfig: Configuration) {\n        super.onConfigurationChanged(newConfig)\n        versionListStaggeredGridLayout(this.activity as MainActivity)\n    }\n\n    override fun onMultiWindowModeChanged(isInMultiWindowMode: Boolean) {\n        super.onMultiWindowModeChanged(isInMultiWindowMode)\n        versionListStaggeredGridLayout(this.activity as MainActivity)\n    }\n\n    override fun onResume() {\n        super.onResume()\n        versionListStaggeredGridLayout(this.activity as MainActivity)\n    }\n\n    override fun onStart() {\n        super.onStart()\n        versionListStaggeredGridLayout(this.activity as MainActivity)\n    }\n\n    // RecyclerView 在某些机型上不会根据视图更新列表高度，所以需要通知列表重绘\n    @SuppressLint(\"NotifyDataSetChanged\")\n    private fun versionListStaggeredGridLayout(thisActivity: MainActivity) {\n        val concatenated = ConcatAdapter(thisActivity.localQQAdapter, thisActivity.qqVersionAdapter)\n        val screenWidthDp = (Resources.getSystem().displayMetrics.widthPixels).pxToDp\n        val screenHeightDp = (Resources.getSystem().displayMetrics.heightPixels).pxToDp\n        fragmentBinding.rvContent.apply {\n            // 当横纵逻辑像素都大于 600 时，根据横向逻辑像素的不同区间显示不同的瀑布流布局\n            // 小于 600 时显示线性布局\n            if (screenHeightDp >= 600) when {\n                screenWidthDp in 600..840 -> {\n                    adapter = concatenated\n                    layoutManager = StaggeredGridLayoutManager(\n                        2, StaggeredGridLayoutManager.VERTICAL\n                    )\n                }\n\n                screenWidthDp > 840 -> {\n                    adapter = concatenated\n                    layoutManager = StaggeredGridLayoutManager(\n                        3, StaggeredGridLayoutManager.VERTICAL\n                    )\n                }\n\n                else -> if (layoutManager is LinearLayoutManager) adapter?.notifyDataSetChanged() else {\n                    adapter = concatenated\n                    layoutManager = LinearLayoutManager(thisActivity)\n                }\n            } else if (layoutManager is LinearLayoutManager) adapter?.notifyDataSetChanged() else {\n                adapter = concatenated\n                layoutManager = LinearLayoutManager(thisActivity)\n            }\n        }\n    }\n\n    override fun onDestroyView() {\n        super.onDestroyView()\n        _fragmentBinding = null\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/ui/ShiplyAdvancedConfigFragment.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.ui\n\nimport android.os.Build\nimport android.os.Build.VERSION.SDK_INT\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.view.inputmethod.InputMethodManager\nimport androidx.appcompat.app.AppCompatActivity.INPUT_METHOD_SERVICE\nimport com.google.android.material.bottomsheet.BottomSheetBehavior\nimport com.google.android.material.bottomsheet.BottomSheetDialog\nimport com.google.android.material.bottomsheet.BottomSheetDialogFragment\nimport com.xiaoniu.qqversionlist.QverbowApplication.Companion.SHIPLY_DEFAULT_APPID\nimport com.xiaoniu.qqversionlist.QverbowApplication.Companion.SHIPLY_DEFAULT_SDK_VERSION\nimport com.xiaoniu.qqversionlist.R\nimport com.xiaoniu.qqversionlist.databinding.BottomsheetShiplyAdvancedConfigBinding\nimport com.xiaoniu.qqversionlist.util.DataStoreUtil\nimport com.xiaoniu.qqversionlist.util.InfoUtil.showToast\nimport java.util.Locale\n\nclass ShiplyAdvancedConfigFragment : BottomSheetDialogFragment() {\n    private lateinit var shiplyAdvancedConfigSheetBinding: BottomsheetShiplyAdvancedConfigBinding\n\n    override fun onCreateView(\n        inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?\n    ): View = inflater.inflate(R.layout.bottomsheet_shiply_advanced_config, container, false)\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        if (SDK_INT >= Build.VERSION_CODES.Q) dialog?.window?.isNavigationBarContrastEnforced =\n            false\n        dialog?.setCanceledOnTouchOutside(false)\n        shiplyAdvancedConfigSheetBinding = BottomsheetShiplyAdvancedConfigBinding.bind(view)\n        val shiplyAdvancedConfigSheetBehavior = (this.dialog as BottomSheetDialog).behavior\n        shiplyAdvancedConfigSheetBehavior.isDraggable = false\n        this@ShiplyAdvancedConfigFragment.isCancelable = true\n        shiplyAdvancedConfigSheetBehavior.state = BottomSheetBehavior.STATE_EXPANDED\n        this@ShiplyAdvancedConfigFragment.isCancelable = false\n        shiplyAdvancedConfigSheetBinding.apply {\n            shiplyAppid.helperText =\n                getString(R.string.shiplyGeneralOptionalHelpText) + SHIPLY_DEFAULT_APPID\n            shiplyModel.helperText =\n                getString(R.string.shiplyGeneralOptionalHelpText) + Build.MODEL.toString()\n            shiplyOsVersion.helperText =\n                getString(R.string.shiplyGeneralOptionalHelpText) + SDK_INT.toString()\n            shiplySdkVersion.helperText =\n                getString(R.string.shiplyGeneralOptionalHelpText) + SHIPLY_DEFAULT_SDK_VERSION\n            shiplyLanguage.helperText =\n                getString(R.string.shiplyGeneralOptionalHelpText) + Locale.getDefault().language.toString()\n\n            DataStoreUtil.apply {\n                shiplyAppid.editText?.setText(getStringKV(\"shiplyAppid\", \"\"))\n                shiplyOsVersion.editText?.setText(\n                    getStringKV(\"shiplyOsVersion\", \"\")\n                )\n                shiplyModel.editText?.setText(getStringKV(\"shiplyModel\", \"\"))\n                shiplySdkVersion.editText?.setText(\n                    getStringKV(\"shiplySdkVersion\", \"\")\n                )\n                shiplyLanguage.editText?.setText(\n                    getStringKV(\"shiplyLanguage\", \"\")\n                )\n\n                btnShiplyConfigSave.setOnClickListener {\n                    shiplyAppid.clearFocus()\n                    shiplyOsVersion.clearFocus()\n                    shiplyModel.clearFocus()\n                    shiplySdkVersion.clearFocus()\n                    shiplyLanguage.clearFocus()\n                    val imm =\n                        requireContext().getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager\n                    imm.hideSoftInputFromWindow(shiplyLanguage.windowToken, 0)\n                    val shiplyConfigList = listOf(\n                        mapOf(\n                            \"key\" to \"shiplyAppid\",\n                            \"value\" to shiplyAppid.editText?.text.toString(),\n                            \"type\" to \"String\"\n                        ), mapOf(\n                            \"key\" to \"shiplyOsVersion\",\n                            \"value\" to shiplyOsVersion.editText?.text.toString(),\n                            \"type\" to \"String\"\n                        ), mapOf(\n                            \"key\" to \"shiplyModel\",\n                            \"value\" to shiplyModel.editText?.text.toString(),\n                            \"type\" to \"String\"\n                        ), mapOf(\n                            \"key\" to \"shiplySdkVersion\",\n                            \"value\" to shiplySdkVersion.editText?.text.toString(),\n                            \"type\" to \"String\"\n                        ), mapOf(\n                            \"key\" to \"shiplyLanguage\",\n                            \"value\" to shiplyLanguage.editText?.text.toString(),\n                            \"type\" to \"String\"\n                        )\n                    )\n                    batchPutKVAsync(shiplyConfigList)\n                    showToast(R.string.saved)\n                    this@ShiplyAdvancedConfigFragment.isCancelable = true\n                    shiplyAdvancedConfigSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN\n                }\n            }\n\n            btnShiplyConfigBack.setOnClickListener {\n                val imm =\n                    requireContext().getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager\n                imm.hideSoftInputFromWindow(shiplyLanguage.windowToken, 0)\n                this@ShiplyAdvancedConfigFragment.isCancelable = true\n                shiplyAdvancedConfigSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN\n            }\n\n            dragHandleView.setOnClickListener {\n                val imm =\n                    requireContext().getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager\n                imm.hideSoftInputFromWindow(shiplyLanguage.windowToken, 0)\n                this@ShiplyAdvancedConfigFragment.isCancelable = true\n                shiplyAdvancedConfigSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN\n            }\n        }\n    }\n\n    companion object {\n        const val TAG = \"ShiplyAdvancedConfigSheet\"\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/ui/TIMVersionAdapter.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.ui\n\nimport android.annotation.SuppressLint\nimport android.content.Context\nimport android.content.Intent\nimport android.graphics.Typeface\nimport android.util.Base64\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.ImageView\nimport android.widget.TextView\nimport androidx.core.content.res.ResourcesCompat\nimport androidx.core.view.isVisible\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.lifecycle.lifecycleScope\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.ListAdapter\nimport androidx.recyclerview.widget.RecyclerView\nimport com.google.android.material.button.MaterialButton\nimport com.google.android.material.card.MaterialCardView\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.xiaoniu.qqversionlist.R\nimport com.xiaoniu.qqversionlist.data.TIMVersionBean\nimport com.xiaoniu.qqversionlist.databinding.ExpLinkNextButtonBinding\nimport com.xiaoniu.qqversionlist.databinding.ItemTimVersionBinding\nimport com.xiaoniu.qqversionlist.databinding.ItemTimVersionDetailBinding\nimport com.xiaoniu.qqversionlist.util.ClipboardUtil.copyText\nimport com.xiaoniu.qqversionlist.util.DataStoreUtil\nimport com.xiaoniu.qqversionlist.util.Extensions.dpToPx\nimport com.xiaoniu.qqversionlist.util.FileUtil.downloadFile\nimport com.xiaoniu.qqversionlist.util.FileUtil.getFileSize\nimport com.xiaoniu.qqversionlist.util.InfoUtil.showToast\nimport com.xiaoniu.qqversionlist.util.StringUtil.toPrettyFormat\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\n\nclass TIMVersionAdapter(private val lifecycleOwner: LifecycleOwner):\n    ListAdapter<TIMVersionBean, RecyclerView.ViewHolder>(TIMVersionDiffCallback()) {\n    private var getVersionTCloud = DataStoreUtil.getBooleanKV(\"versionTCloud\", true)\n    private var getVersionTCloudThickness =\n        DataStoreUtil.getStringKV(\"versionTCloudThickness\", \"System\")\n    private var getShowKuiklyTag = DataStoreUtil.getBooleanKV(\"kuiklyTag\", true)\n\n    class ViewHolder(val binding: ItemTimVersionBinding, val context: Context) :\n        RecyclerView.ViewHolder(binding.root)\n\n    class ViewHolderDetail(val binding: ItemTimVersionDetailBinding, val context: Context) :\n        RecyclerView.ViewHolder(binding.root)\n\n    override fun getItemViewType(position: Int): Int {\n        return currentList[position].displayType\n    }\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {\n        return when (viewType) {\n            0 -> { // 卡片收起态\n                ViewHolder(\n                    ItemTimVersionBinding.inflate(\n                        LayoutInflater.from(parent.context), parent, false\n                    ), parent.context\n                ).apply {\n                    binding.ibTimExpand.setOnClickListener {\n                        currentList[bindingAdapterPosition].displayType = 1\n                        notifyItemChanged(bindingAdapterPosition)\n                    }\n                    binding.cardTimAll.setOnLongClickListener {\n                        longPressCard(bindingAdapterPosition, it)\n                        true\n                    }\n                }\n            }\n\n            else -> {\n                ViewHolderDetail(\n                    ItemTimVersionDetailBinding.inflate(\n                        LayoutInflater.from(parent.context), parent, false\n                    ), parent.context\n                ).apply {\n                    binding.ibTimCollapse.setOnClickListener {\n                        currentList[bindingAdapterPosition].displayType = 0\n                        notifyItemChanged(bindingAdapterPosition)\n                    }\n                    binding.cardAllDetail.setOnLongClickListener {\n                        longPressCard(bindingAdapterPosition, it)\n                        true\n                    }\n                }\n            }\n        }\n    }\n\n    @SuppressLint(\"SetTextI18n\")\n    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {\n        val bean = currentList[position]\n        when (holder) {\n            is ViewHolder -> {\n                holder.binding.apply {\n                    tvTimVersion.text = bean.version\n                    bindDisplayInstall(tvTimInstall, tvTimInstallCard, bean)\n                    bindVersionTCloud(tvTimVersion, holder.context)\n                    bindAccessibilityTag(accessibilityTimTag, holder.context, bean)\n                    bindQQNTTag(qqntTimTag, bean)\n                    bindKuiklyTag(kuiklyTimTag, bean)\n                    bindNewestDownloadLink(ibTimLink, bean)\n                }\n            }\n\n            is ViewHolderDetail -> {\n                holder.binding.apply {\n                    val fix = bean.fix\n                    val new = bean.feature\n                    tvTimOldVersion.text = bean.version\n                    tvTimDetailVersion.text =\n                        holder.itemView.context.getString(R.string.version) + bean.version\n                    tvTimDetailDate.text =\n                        holder.itemView.context.getString(R.string.releaseDateTIM) + bean.datetime\n                    if (fix.isEmpty() && new.isEmpty()) tvTimDesc.isVisible = false\n                    else tvTimDesc.text = (if (new.isEmpty()) \"\" else new.joinToString(\n                        separator = \"\\n- \", prefix = \"- \"\n                    )) + (if (new.isEmpty()) \"\" else \"\\n\") + fix.joinToString(\n                        separator = \"\\n- \", prefix = \"- \"\n                    )\n                    bindDisplayInstall(tvTimOldInstall, tvTimOldInstallCard, bean)\n                    bindVersionTCloud(tvTimOldVersion, holder.context)\n                    bindAccessibilityTag(accessibilityTimOldTag, holder.context, bean)\n                    bindQQNTTag(qqntTimOldTag, bean)\n                    bindKuiklyTag(kuiklyTimOldTag, bean)\n                    bindNewestDownloadLink(ibTimOldLink, bean)\n                }\n            }\n        }\n    }\n\n    private fun longPressCard(bindingAdapterPosition: Int, it: View) {\n        if (DataStoreUtil.getBooleanKV(\"longPressCard\", true)) showDialog(\n            it.context, currentList[bindingAdapterPosition].jsonString.toPrettyFormat()\n        ) else showToast(R.string.longPressToViewSourceDetailsIsDisabled)\n    }\n\n    private fun bindDisplayInstall(\n        tvInstall: TextView, tvInstallCard: MaterialCardView, bean: TIMVersionBean\n    ) {\n        if (bean.displayInstall) {\n            tvInstallCard.isVisible = true\n            tvInstall.text = tvInstall.context.getString(R.string.installed)\n            if (bean.isAccessibility || bean.isQQNTFramework || (getShowKuiklyTag && bean.isKuiklyInside)) {\n                val marginLayoutParams = tvInstallCard.layoutParams as ViewGroup.MarginLayoutParams\n                marginLayoutParams.marginStart = 3.dpToPx\n                tvInstallCard.layoutParams = marginLayoutParams\n            } else {\n                val marginLayoutParams = tvInstallCard.layoutParams as ViewGroup.MarginLayoutParams\n                marginLayoutParams.marginStart = 6.dpToPx\n                tvInstallCard.layoutParams = marginLayoutParams\n            }\n        } else tvInstallCard.isVisible = false\n    }\n\n    private fun bindAccessibilityTag(\n        accessibilityTag: ImageView, context: Context, bean: TIMVersionBean\n    ) {\n        if (bean.isAccessibility) {\n            accessibilityTag.contentDescription = String(\n                Base64.decode(\n                    context.getString(R.string.accessibilityTag), Base64.NO_WRAP\n                ), Charsets.UTF_8\n            )\n            accessibilityTag.isVisible = true\n        } else accessibilityTag.isVisible = false\n    }\n\n    private fun bindQQNTTag(qqntTag: ImageView, bean: TIMVersionBean) {\n        qqntTag.isVisible = bean.isQQNTFramework\n    }\n\n    private fun bindKuiklyTag(kuiklyTag: ImageView, bean: TIMVersionBean) {\n        kuiklyTag.isVisible = (getShowKuiklyTag && bean.isKuiklyInside)\n    }\n\n    private fun bindVersionTCloud(tvVersion: TextView, context: Context) {\n        if (getVersionTCloud) {\n            val TCloudFont: Typeface = when (getVersionTCloudThickness) {\n                \"Light\" -> ResourcesCompat.getFont(context, R.font.tcloud_number_light)!!\n                \"Regular\" -> ResourcesCompat.getFont(context, R.font.tcloud_number_regular)!!\n                \"Bold\" -> ResourcesCompat.getFont(context, R.font.tcloud_number_bold)!!\n                else -> ResourcesCompat.getFont(context, R.font.tcloud_number_vf)!!\n            }\n            tvVersion.typeface = TCloudFont\n        } else tvVersion.setTypeface(null, Typeface.NORMAL)\n    }\n\n    private fun bindNewestDownloadLink(button: MaterialButton, bean: TIMVersionBean) {\n        if (bean.link != \"\") {\n            button.isVisible = true\n            button.setOnClickListener {\n                button.isEnabled = false\n                lifecycleOwner.lifecycleScope.launch {\n                    var appSize: String? = null\n                    try {\n                        appSize = getFileSize(bean.link)\n                    } catch (_: Exception) {\n                    } finally {\n                        withContext(Dispatchers.Main) {\n                            button.isEnabled = true\n                            val expLinkNextButtonBinding = ExpLinkNextButtonBinding.inflate(\n                                LayoutInflater.from(button.context), null, false\n                            )\n                            val TIMLinkDialog = MaterialAlertDialogBuilder(button.context)\n                                .setTitle(\"TIM ${bean.version}\")\n                                .setIcon(R.drawable.link)\n                                .setMessage(\n                                    \"${button.context.getString(R.string.downloadLink)}${bean.link}\" + (if (appSize != null) \"\\n\\n${\n                                        button.context.getString(R.string.fileSize)\n                                    }$appSize MB\" else \"\")\n                                )\n                                .setView(expLinkNextButtonBinding.root)\n                                .show()\n\n                            expLinkNextButtonBinding.apply {\n                                expNextBtnCopy.setOnClickListener {\n                                    button.context.copyText(bean.link)\n                                    TIMLinkDialog.dismiss()\n                                }\n\n                                expNextBtnDownload.setOnClickListener {\n                                    TIMLinkDialog.dismiss()\n                                    downloadFile(button.context, bean.link)\n                                }\n\n                                expNextBtnShare.setOnClickListener {\n                                    TIMLinkDialog.dismiss()\n                                    val shareIntent = Intent(Intent.ACTION_SEND).apply {\n                                        type = \"text/plain\"\n                                        putExtra(\n                                            Intent.EXTRA_TEXT,\n                                            \"Android TIM ${bean.version} ${\n                                                button.context.getString(\n                                                    R.string.stableVersion\n                                                )\n                                            }\" + (if (appSize != null) \"（${\n                                                button.context.getString(R.string.fileSize)\n                                            }$appSize MB）\" else \"\") + \"\\n\\n${\n                                                button.context.getString(\n                                                    R.string.downloadLink\n                                                )\n                                            }${bean.link}\"\n                                        )\n                                    }\n                                    button.context.startActivity(\n                                        Intent.createChooser(\n                                            shareIntent,\n                                            button.context.getString(R.string.shareTo)\n                                        )\n                                    )\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        } else button.isVisible = false\n    }\n\n    private fun showDialog(context: Context, s: String) {\n        val tv = TextView(context).apply {\n            text = s\n            setTextIsSelectable(true)\n            setPadding(96, 48, 96, 96)\n        }\n        MaterialAlertDialogBuilder(context).setView(tv).setTitle(R.string.jsonDetails)\n            .setIcon(R.drawable.braces_line).show()\n    }\n\n    override fun onBindViewHolder(\n        holder: RecyclerView.ViewHolder, position: Int, payloads: MutableList<Any>\n    ) {\n        if (payloads.isEmpty()) onBindViewHolder(holder, position)\n        else {\n            val bean = currentList[position]\n            when (payloads[0]) {\n                \"displayType\" -> onBindViewHolder(holder, position)\n\n                \"displayInstall\" -> if (holder is ViewHolder) bindDisplayInstall(\n                    holder.binding.tvTimInstall, holder.binding.tvTimInstallCard, bean\n                ) else if (holder is ViewHolderDetail) bindDisplayInstall(\n                    holder.binding.tvTimOldInstall, holder.binding.tvTimOldInstallCard, bean\n                )\n\n                \"isTCloud\" -> if (holder is ViewHolder) bindVersionTCloud(\n                    holder.binding.tvTimVersion, holder.context\n                ) else if (holder is ViewHolderDetail) bindVersionTCloud(\n                    holder.binding.tvTimOldVersion, holder.context\n                )\n\n                \"isShowKuiklyTag\" -> if (holder is ViewHolder) {\n                    bindKuiklyTag(holder.binding.kuiklyTimTag, bean)\n                    bindDisplayInstall(\n                        holder.binding.tvTimInstall,\n                        holder.binding.tvTimInstallCard,\n                        bean\n                    )\n                } else if (holder is ViewHolderDetail) {\n                    bindKuiklyTag(holder.binding.kuiklyTimOldTag, bean)\n                    bindDisplayInstall(\n                        holder.binding.tvTimOldInstall,\n                        holder.binding.tvTimOldInstallCard,\n                        bean\n                    )\n                }\n            }\n        }\n    }\n\n    fun updateItemProperty(payloads: Any?) {\n        when (payloads) {\n            \"isTCloud\" -> {\n                getVersionTCloud = DataStoreUtil.getBooleanKV(\"versionTCloud\", true)\n                getVersionTCloudThickness =\n                    DataStoreUtil.getStringKV(\"versionTCloudThickness\", \"System\")\n                notifyItemRangeChanged(0, currentList.size, \"isTCloud\")\n            }\n\n            \"isShowKuiklyTag\" -> {\n                getShowKuiklyTag = DataStoreUtil.getBooleanKV(\"kuiklyTag\", true)\n                notifyItemRangeChanged(0, currentList.size, \"isShowKuiklyTag\")\n            }\n        }\n    }\n\n    class TIMVersionDiffCallback : DiffUtil.ItemCallback<TIMVersionBean>() {\n        override fun areItemsTheSame(\n            oldItem: TIMVersionBean, newItem: TIMVersionBean\n        ): Boolean {\n            return oldItem.jsonString == newItem.jsonString\n        }\n\n        override fun areContentsTheSame(\n            oldItem: TIMVersionBean, newItem: TIMVersionBean\n        ): Boolean {\n            return oldItem.displayType == newItem.displayType && oldItem.displayInstall == newItem.displayInstall\n        }\n\n        override fun getChangePayload(\n            oldItem: TIMVersionBean, newItem: TIMVersionBean\n        ): Any? {\n            return when {\n                oldItem.displayType != newItem.displayType -> \"displayType\"\n                oldItem.displayInstall != newItem.displayInstall -> \"displayInstall\"\n                else -> null\n            }\n        }\n    }\n}\n\n"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/ui/TIMVersionListFragment.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.ui\n\nimport android.annotation.SuppressLint\nimport android.content.res.Configuration\nimport android.content.res.Resources\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.fragment.app.Fragment\nimport androidx.recyclerview.widget.ConcatAdapter\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport androidx.recyclerview.widget.StaggeredGridLayoutManager\nimport com.xiaoniu.qqversionlist.databinding.RecycleTimVersionBinding\nimport com.xiaoniu.qqversionlist.util.Extensions.pxToDp\n\nclass TIMVersionListFragment : Fragment() {\n    private var _fragmentBinding: RecycleTimVersionBinding? = null\n    private val fragmentBinding get() = _fragmentBinding!!\n\n    override fun onCreateView(\n        inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?\n    ): View {\n        _fragmentBinding = RecycleTimVersionBinding.inflate(inflater, container, false)\n        val view = fragmentBinding.root\n        return view\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        versionListStaggeredGridLayout(requireActivity() as MainActivity)\n        fragmentBinding.rvTimContent.addOnScrollListener(object : RecyclerView.OnScrollListener() {\n            override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {\n                super.onScrolled(recyclerView, dx, dy)\n            }\n        })\n    }\n\n    override fun onConfigurationChanged(newConfig: Configuration) {\n        super.onConfigurationChanged(newConfig)\n        versionListStaggeredGridLayout(this.activity as MainActivity)\n    }\n\n    override fun onMultiWindowModeChanged(isInMultiWindowMode: Boolean) {\n        super.onMultiWindowModeChanged(isInMultiWindowMode)\n        versionListStaggeredGridLayout(this.activity as MainActivity)\n    }\n\n    override fun onResume() {\n        super.onResume()\n        versionListStaggeredGridLayout(this.activity as MainActivity)\n    }\n\n    override fun onStart() {\n        super.onStart()\n        versionListStaggeredGridLayout(this.activity as MainActivity)\n    }\n\n    // RecyclerView 在某些机型上不会根据视图更新列表高度，所以需要通知列表重绘\n    @SuppressLint(\"NotifyDataSetChanged\")\n    private fun versionListStaggeredGridLayout(thisActivity: MainActivity) {\n        val concatenated =\n            ConcatAdapter(thisActivity.localTIMAdapter, thisActivity.timVersionAdapter)\n        val screenWidthDp = (Resources.getSystem().displayMetrics.widthPixels).pxToDp\n        val screenHeightDp = (Resources.getSystem().displayMetrics.heightPixels).pxToDp\n        fragmentBinding.rvTimContent.apply {\n            // 当横纵逻辑像素都大于 600 时，根据横向逻辑像素的不同区间显示不同的瀑布流布局\n            // 小于 600 时显示线性布局\n            if (screenHeightDp >= 600) when {\n                screenWidthDp in 600..840 -> {\n                    adapter = concatenated\n                    layoutManager = StaggeredGridLayoutManager(\n                        2, StaggeredGridLayoutManager.VERTICAL\n                    )\n                }\n\n                screenWidthDp > 840 -> {\n                    adapter = concatenated\n                    layoutManager = StaggeredGridLayoutManager(\n                        3, StaggeredGridLayoutManager.VERTICAL\n                    )\n                }\n\n                else -> if (layoutManager is LinearLayoutManager) adapter?.notifyDataSetChanged() else {\n                    adapter = concatenated\n                    layoutManager = LinearLayoutManager(thisActivity)\n                }\n            } else if (layoutManager is LinearLayoutManager) adapter?.notifyDataSetChanged() else {\n                adapter = concatenated\n                layoutManager = LinearLayoutManager(thisActivity)\n            }\n        }\n    }\n\n    override fun onDestroyView() {\n        super.onDestroyView()\n        _fragmentBinding = null\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/ui/VersionListPagerAdapter.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.ui\n\nimport android.content.Context\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.FragmentActivity\nimport androidx.viewpager2.adapter.FragmentStateAdapter\n\nclass VersionListPagerAdapter(context: Context) :\n    FragmentStateAdapter(context as FragmentActivity) {\n\n    override fun getItemCount(): Int = 3\n\n    override fun createFragment(position: Int): Fragment {\n        return when (position) {\n            0 -> QQVersionListFragment()\n            1 -> TIMVersionListFragment()\n            2 -> WeixinVersionListFragment()\n            else -> throw IllegalArgumentException(position.toString())\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/ui/WeixinVersionAdapter.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.ui\n\nimport android.annotation.SuppressLint\nimport android.content.Context\nimport android.content.Intent\nimport android.graphics.Typeface\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.TextView\nimport androidx.core.content.res.ResourcesCompat\nimport androidx.core.view.isVisible\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.lifecycle.lifecycleScope\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.ListAdapter\nimport androidx.recyclerview.widget.RecyclerView\nimport com.google.android.material.button.MaterialButton\nimport com.google.android.material.card.MaterialCardView\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.xiaoniu.qqversionlist.R\nimport com.xiaoniu.qqversionlist.data.WeixinVersionBean\nimport com.xiaoniu.qqversionlist.databinding.ExpLinkNextButtonBinding\nimport com.xiaoniu.qqversionlist.databinding.ItemWeixinVersionBinding\nimport com.xiaoniu.qqversionlist.databinding.ItemWeixinVersionDetailBinding\nimport com.xiaoniu.qqversionlist.util.ClipboardUtil.copyText\nimport com.xiaoniu.qqversionlist.util.DataStoreUtil\nimport com.xiaoniu.qqversionlist.util.Extensions.dpToPx\nimport com.xiaoniu.qqversionlist.util.FileUtil.downloadFile\nimport com.xiaoniu.qqversionlist.util.FileUtil.getFileSize\nimport com.xiaoniu.qqversionlist.util.InfoUtil.openUrlWithChromeCustomTab\nimport com.xiaoniu.qqversionlist.util.InfoUtil.showToast\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\n\nclass WeixinVersionAdapter(private val lifecycleOwner: LifecycleOwner) :\n    ListAdapter<WeixinVersionBean, RecyclerView.ViewHolder>(WeixinVersionDiffCallback()) {\n    private var getVersionTCloud = DataStoreUtil.getBooleanKV(\"versionTCloud\", true)\n    private var getVersionTCloudThickness =\n        DataStoreUtil.getStringKV(\"versionTCloudThickness\", \"System\")\n\n    class ViewHolder(val binding: ItemWeixinVersionBinding, val context: Context) :\n        RecyclerView.ViewHolder(binding.root)\n\n    class ViewHolderDetail(val binding: ItemWeixinVersionDetailBinding, val context: Context) :\n        RecyclerView.ViewHolder(binding.root)\n\n    override fun getItemViewType(position: Int): Int {\n        return currentList[position].displayType\n    }\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {\n        return when (viewType) {\n            0 -> { // 卡片收起态\n                ViewHolder(\n                    ItemWeixinVersionBinding.inflate(\n                        LayoutInflater.from(parent.context), parent, false\n                    ), parent.context\n                ).apply {\n                    binding.ibWeixinExpand.setOnClickListener {\n                        currentList[bindingAdapterPosition].displayType = 1\n                        notifyItemChanged(bindingAdapterPosition)\n                    }\n                    binding.cardWeixinAll.setOnLongClickListener {\n                        longPressCard(bindingAdapterPosition, it)\n                        true\n                    }\n                }\n            }\n\n            else -> {\n                ViewHolderDetail(\n                    ItemWeixinVersionDetailBinding.inflate(\n                        LayoutInflater.from(parent.context), parent, false\n                    ), parent.context\n                ).apply {\n                    binding.ibWeixinCollapse.setOnClickListener {\n                        currentList[bindingAdapterPosition].displayType = 0\n                        notifyItemChanged(bindingAdapterPosition)\n                    }\n                    binding.cardAllDetail.setOnLongClickListener {\n                        longPressCard(bindingAdapterPosition, it)\n                        true\n                    }\n                }\n            }\n        }\n    }\n\n    @SuppressLint(\"SetTextI18n\")\n    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {\n        val bean = currentList[position]\n        when (holder) {\n            is ViewHolder -> {\n                holder.binding.apply {\n                    tvWeixinVersion.text = bean.version\n                    bindDisplayInstall(tvWeixinInstall, tvWeixinInstallCard, bean)\n                    bindVersionTCloud(tvWeixinVersion, holder.context)\n                    bindNewestDownloadLink(ibWeixinLink, bean)\n                }\n            }\n\n            is ViewHolderDetail -> {\n                holder.binding.apply {\n                    tvWeixinOldVersion.text = bean.version\n                    tvWeixinDetailVersion.text =\n                        holder.itemView.context.getString(R.string.version) + bean.version\n                    tvWeixinDetailDate.text =\n                        holder.itemView.context.getString(R.string.releaseDateTIM) + bean.datetime\n                    bindDisplayInstall(tvWeixinOldInstall, tvWeixinOldInstallCard, bean)\n                    bindVersionTCloud(tvWeixinOldVersion, holder.context)\n                    bindNewestDownloadLink(ibWeixinOldLink, bean)\n                    tvWeixinCatalogLink.setOnClickListener {\n                        val url =\n                            \"https://weixin.qq.com/updates?platform=android&version=${bean.version}\"\n                        it.context.openUrlWithChromeCustomTab(url)\n                    }\n                }\n            }\n        }\n    }\n\n    private fun longPressCard(bindingAdapterPosition: Int, it: View) {\n        if (DataStoreUtil.getBooleanKV(\"longPressCard\", true)) {\n            val url =\n                \"https://weixin.qq.com/updates?platform=android&version=${currentList[bindingAdapterPosition].version}\"\n            it.context.openUrlWithChromeCustomTab(url)\n        } else showToast(R.string.longPressToViewSourceDetailsIsDisabled)\n    }\n\n    private fun bindDisplayInstall(\n        tvInstall: TextView, tvInstallCard: MaterialCardView, bean: WeixinVersionBean\n    ) {\n        if (bean.displayInstall) {\n            tvInstallCard.isVisible = true\n            tvInstall.text = tvInstall.context.getString(R.string.installed)\n            val marginLayoutParams = tvInstallCard.layoutParams as ViewGroup.MarginLayoutParams\n            marginLayoutParams.marginStart = 6.dpToPx\n            tvInstallCard.layoutParams = marginLayoutParams\n        } else tvInstallCard.isVisible = false\n    }\n\n    private fun bindVersionTCloud(tvVersion: TextView, context: Context) {\n        if (getVersionTCloud) {\n            val TCloudFont: Typeface = when (getVersionTCloudThickness) {\n                \"Light\" -> ResourcesCompat.getFont(context, R.font.tcloud_number_light)!!\n                \"Regular\" -> ResourcesCompat.getFont(context, R.font.tcloud_number_regular)!!\n                \"Bold\" -> ResourcesCompat.getFont(context, R.font.tcloud_number_bold)!!\n                else -> ResourcesCompat.getFont(context, R.font.tcloud_number_vf)!!\n            }\n            tvVersion.typeface = TCloudFont\n        } else tvVersion.setTypeface(null, Typeface.NORMAL)\n    }\n\n    private fun bindNewestDownloadLink(button: MaterialButton, bean: WeixinVersionBean) {\n        if (bean.link != \"\") {\n            button.isVisible = true\n            button.setOnClickListener {\n                button.isEnabled = false\n                lifecycleOwner.lifecycleScope.launch {\n                    var appSize: String? = null\n                    try {\n                        appSize = getFileSize(bean.link)\n                    } catch (_: Exception) {\n                    } finally {\n                        withContext(Dispatchers.Main) {\n                            button.isEnabled = true\n                            val expLinkNextButtonBinding = ExpLinkNextButtonBinding.inflate(\n                                LayoutInflater.from(button.context), null, false\n                            )\n                            val weixinLinkDialog =\n                                MaterialAlertDialogBuilder(button.context).setTitle(\n                                    \"${\n                                        button.context.getString(R.string.weixin)\n                                    } ${bean.version}\"\n                                ).setIcon(R.drawable.link).setMessage(\n                                    \"${button.context.getString(R.string.downloadLink)}${bean.link}\" + (if (appSize != null) \"\\n\\n${\n                                        button.context.getString(R.string.fileSize)\n                                    }$appSize MB\" else \"\")\n                                ).setView(expLinkNextButtonBinding.root).show()\n\n                            expLinkNextButtonBinding.apply {\n                                expNextBtnCopy.setOnClickListener {\n                                    button.context.copyText(bean.link)\n                                    weixinLinkDialog.dismiss()\n                                }\n\n                                expNextBtnDownload.setOnClickListener {\n                                    weixinLinkDialog.dismiss()\n                                    downloadFile(button.context, bean.link)\n                                }\n\n                                expNextBtnShare.setOnClickListener {\n                                    weixinLinkDialog.dismiss()\n                                    val shareIntent = Intent(Intent.ACTION_SEND).apply {\n                                        type = \"text/plain\"\n                                        putExtra(\n                                            Intent.EXTRA_TEXT,\n                                            \"Android ${button.context.getString(R.string.weixin)} ${bean.version} ${\n                                                button.context.getString(\n                                                    R.string.stableVersion\n                                                )\n                                            }\" + (if (appSize != null) \"（${\n                                                button.context.getString(R.string.fileSize)\n                                            }$appSize MB）\" else \"\") + \"\\n\\n${\n                                                button.context.getString(\n                                                    R.string.downloadLink\n                                                )\n                                            }${bean.link}\"\n                                        )\n                                    }\n                                    button.context.startActivity(\n                                        Intent.createChooser(\n                                            shareIntent, button.context.getString(R.string.shareTo)\n                                        )\n                                    )\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        } else button.isVisible = false\n    }\n\n    override fun onBindViewHolder(\n        holder: RecyclerView.ViewHolder, position: Int, payloads: MutableList<Any>\n    ) {\n        if (payloads.isEmpty()) onBindViewHolder(holder, position)\n        else {\n            val bean = currentList[position]\n            when (payloads[0]) {\n                \"displayType\" -> onBindViewHolder(holder, position)\n\n                \"displayInstall\" -> if (holder is ViewHolder) bindDisplayInstall(\n                    holder.binding.tvWeixinInstall, holder.binding.tvWeixinInstallCard, bean\n                ) else if (holder is ViewHolderDetail) bindDisplayInstall(\n                    holder.binding.tvWeixinOldInstall, holder.binding.tvWeixinOldInstallCard, bean\n                )\n\n                \"downloadUrl\" -> if (holder is ViewHolder) bindNewestDownloadLink(\n                    holder.binding.ibWeixinLink, bean\n                ) else if (holder is ViewHolderDetail) bindNewestDownloadLink(\n                    holder.binding.ibWeixinOldLink, bean\n                )\n\n                \"isTCloud\" -> if (holder is ViewHolder) bindVersionTCloud(\n                    holder.binding.tvWeixinVersion, holder.context\n                ) else if (holder is ViewHolderDetail) bindVersionTCloud(\n                    holder.binding.tvWeixinOldVersion, holder.context\n                )\n            }\n        }\n    }\n\n    fun updateItemProperty(payloads: Any?) {\n        when (payloads) {\n            \"isTCloud\" -> {\n                getVersionTCloud = DataStoreUtil.getBooleanKV(\"versionTCloud\", true)\n                getVersionTCloudThickness =\n                    DataStoreUtil.getStringKV(\"versionTCloudThickness\", \"System\")\n                notifyItemRangeChanged(0, currentList.size, \"isTCloud\")\n            }\n        }\n    }\n\n    class WeixinVersionDiffCallback : DiffUtil.ItemCallback<WeixinVersionBean>() {\n        override fun areItemsTheSame(\n            old: WeixinVersionBean, new: WeixinVersionBean\n        ): Boolean {\n            return old == new\n        }\n\n        override fun areContentsTheSame(\n            oldItem: WeixinVersionBean, newItem: WeixinVersionBean\n        ): Boolean {\n            return oldItem.displayType == newItem.displayType && oldItem.displayInstall == newItem.displayInstall && oldItem.link == newItem.link\n        }\n\n        override fun getChangePayload(\n            oldItem: WeixinVersionBean, newItem: WeixinVersionBean\n        ): Any? {\n            return when {\n                oldItem.displayType != newItem.displayType -> \"displayType\"\n                oldItem.displayInstall != newItem.displayInstall -> \"displayInstall\"\n                oldItem.link != newItem.link -> \"downloadUrl\"\n                else -> null\n            }\n        }\n    }\n}\n\n"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/ui/WeixinVersionListFragment.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.ui\n\nimport android.annotation.SuppressLint\nimport android.content.res.Configuration\nimport android.content.res.Resources\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.fragment.app.Fragment\nimport androidx.recyclerview.widget.ConcatAdapter\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport androidx.recyclerview.widget.StaggeredGridLayoutManager\nimport com.xiaoniu.qqversionlist.databinding.RecycleTimVersionBinding\nimport com.xiaoniu.qqversionlist.util.Extensions.pxToDp\n\nclass WeixinVersionListFragment : Fragment() {\n    private var _fragmentBinding: RecycleTimVersionBinding? = null\n    private val fragmentBinding get() = _fragmentBinding!!\n\n    override fun onCreateView(\n        inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?\n    ): View {\n        _fragmentBinding = RecycleTimVersionBinding.inflate(inflater, container, false)\n        val view = fragmentBinding.root\n        return view\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        versionListStaggeredGridLayout(requireActivity() as MainActivity)\n        fragmentBinding.rvTimContent.addOnScrollListener(object : RecyclerView.OnScrollListener() {\n            override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {\n                super.onScrolled(recyclerView, dx, dy)\n            }\n        })\n    }\n\n    override fun onConfigurationChanged(newConfig: Configuration) {\n        super.onConfigurationChanged(newConfig)\n        versionListStaggeredGridLayout(this.activity as MainActivity)\n    }\n\n    override fun onMultiWindowModeChanged(isInMultiWindowMode: Boolean) {\n        super.onMultiWindowModeChanged(isInMultiWindowMode)\n        versionListStaggeredGridLayout(this.activity as MainActivity)\n    }\n\n    override fun onResume() {\n        super.onResume()\n        versionListStaggeredGridLayout(this.activity as MainActivity)\n    }\n\n    override fun onStart() {\n        super.onStart()\n        versionListStaggeredGridLayout(this.activity as MainActivity)\n    }\n\n    // RecyclerView 在某些机型上不会根据视图更新列表高度，所以需要通知列表重绘\n    @SuppressLint(\"NotifyDataSetChanged\")\n    private fun versionListStaggeredGridLayout(thisActivity: MainActivity) {\n        val concatenated =\n            ConcatAdapter(thisActivity.localWeixinAdapter, thisActivity.weixinVersionAdapter)\n        val screenWidthDp = (Resources.getSystem().displayMetrics.widthPixels).pxToDp\n        val screenHeightDp = (Resources.getSystem().displayMetrics.heightPixels).pxToDp\n        fragmentBinding.rvTimContent.apply {\n            // 当横纵逻辑像素都大于 600 时，根据横向逻辑像素的不同区间显示不同的瀑布流布局\n            // 小于 600 时显示线性布局\n            if (screenHeightDp >= 600) when {\n                screenWidthDp in 600..840 -> {\n                    adapter = concatenated\n                    layoutManager = StaggeredGridLayoutManager(\n                        2, StaggeredGridLayoutManager.VERTICAL\n                    )\n                }\n\n                screenWidthDp > 840 -> {\n                    adapter = concatenated\n                    layoutManager = StaggeredGridLayoutManager(\n                        3, StaggeredGridLayoutManager.VERTICAL\n                    )\n                }\n\n                else -> if (layoutManager is LinearLayoutManager) adapter?.notifyDataSetChanged() else {\n                    adapter = concatenated\n                    layoutManager = LinearLayoutManager(thisActivity)\n                }\n            } else if (layoutManager is LinearLayoutManager) adapter?.notifyDataSetChanged() else {\n                adapter = concatenated\n                layoutManager = LinearLayoutManager(thisActivity)\n            }\n        }\n    }\n\n    override fun onDestroyView() {\n        super.onDestroyView()\n        _fragmentBinding = null\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/ui/components/cell/CellBottomClick.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.ui.components.cell\n\nimport android.annotation.SuppressLint\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.widget.LinearLayout\nimport androidx.core.view.isVisible\nimport com.xiaoniu.qqversionlist.R\nimport com.xiaoniu.qqversionlist.databinding.CellBottomClickBinding\n\n@SuppressLint(\"CustomViewStyleable\")\nclass CellBottomClick @JvmOverloads constructor(\n    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0\n) : LinearLayout(context, attrs, defStyleAttr) {\n    private val binding: CellBottomClickBinding =\n        CellBottomClickBinding.inflate(LayoutInflater.from(context), this, true)\n\n    init {\n        val a = context.obtainStyledAttributes(attrs, R.styleable.Cell, defStyleAttr, 0)\n        val title = a.getString(R.styleable.Cell_cellTitle)\n        val iconResId = a.getResourceId(R.styleable.Cell_cellIcon, 0)\n        val description = a.getString(R.styleable.Cell_cellDescription)\n        a.recycle()\n        if (title == null) throw IllegalArgumentException(\"Title and type are required attributes for CellSwitch.\")\n\n        binding.title.text = title\n\n        if (iconResId != 0) binding.icon.apply {\n            setImageResource(iconResId)\n            isVisible = true\n        } else binding.icon.isVisible = false\n\n        if (description != null) binding.description.apply {\n            text = description\n            isVisible = true\n        } else binding.description.isVisible = false\n\n        setOnClickListener { v ->\n            onClick?.invoke(v)\n        }\n    }\n\n    var onClick: ((View) -> Unit)? = null\n\n    fun setCellTitle(title: String) {\n        binding.title.text = title\n    }\n\n    fun setCellDescription(description: String?) {\n        if (description == null) binding.description.isVisible = false\n        else binding.description.apply {\n            isVisible = true\n            text = description\n        }\n\n    }\n\n    fun setCellIcon(iconResId: Int?) {\n        if (iconResId == null)\n            binding.icon.isVisible = false\n        else binding.icon.apply {\n            isVisible = true\n            setImageResource(iconResId)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/ui/components/cell/CellBottomSwitch.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.ui.components.cell\n\nimport android.annotation.SuppressLint\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.widget.LinearLayout\nimport androidx.core.view.isVisible\nimport com.xiaoniu.qqversionlist.R\nimport com.xiaoniu.qqversionlist.databinding.CellBottomSwitchBinding\n\n@SuppressLint(\"CustomViewStyleable\")\nclass CellBottomSwitch @JvmOverloads constructor(\n    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0\n) : LinearLayout(context, attrs, defStyleAttr) {\n    private val binding: CellBottomSwitchBinding =\n        CellBottomSwitchBinding.inflate(LayoutInflater.from(context), this, true)\n    private var onCheckedChangeListener: ((Boolean) -> Unit)? = null\n\n    init {\n        val a = context.obtainStyledAttributes(attrs, R.styleable.Cell, defStyleAttr, 0)\n        val title = a.getString(R.styleable.Cell_cellTitle)\n        val iconResId = a.getResourceId(R.styleable.Cell_cellIcon, 0)\n        val description = a.getString(R.styleable.Cell_cellDescription)\n        a.recycle()\n        if (title == null) throw IllegalArgumentException(\"Title and type are required attributes for CellSwitch.\")\n\n        binding.title.text = title\n\n        if (iconResId != 0) binding.icon.apply {\n            setImageResource(iconResId)\n            isVisible = true\n        } else binding.icon.isVisible = false\n\n        if (description != null) binding.description.apply {\n            text = description\n            isVisible = true\n        } else binding.description.isVisible = false\n\n        setOnClickListener { v ->\n            toggleSwitch()\n            onClick?.invoke(v)\n        }\n    }\n\n    var onClick: ((View) -> Unit)? = null\n\n    fun setCellTitle(title: String) {\n        binding.title.text = title\n    }\n\n    fun setCellDescription(description: String?) {\n        if (description == null) binding.description.isVisible = false\n        else binding.description.apply {\n            isVisible = true\n            text = description\n        }\n\n    }\n\n    fun setCellIcon(iconResId: Int?) {\n        if (iconResId == null)\n            binding.icon.isVisible = false\n        else binding.icon.apply {\n            isVisible = true\n            setImageResource(iconResId)\n        }\n    }\n\n    var switchChecked: Boolean\n        get() = binding.switchCompat.isChecked\n        set(value) {\n            binding.switchCompat.isChecked = value\n        }\n\n    var switchEnabled: Boolean\n        get() = binding.switchCompat.isEnabled\n        set(value) {\n            binding.switchCompat.isEnabled = value\n        }\n\n    fun setOnCheckedChangeListener(listener: (Boolean) -> Unit) {\n        onCheckedChangeListener = listener\n    }\n\n    private fun toggleSwitch() {\n        val isChecked = !binding.switchCompat.isChecked\n        val isEnabled = binding.switchCompat.isEnabled\n        if (isEnabled) {\n            binding.switchCompat.isChecked = isChecked\n            onCheckedChangeListener?.invoke(isChecked)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/ui/components/cell/CellMiddleClick.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.ui.components.cell\n\nimport android.annotation.SuppressLint\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.widget.LinearLayout\nimport androidx.core.view.isVisible\nimport com.xiaoniu.qqversionlist.R\nimport com.xiaoniu.qqversionlist.databinding.CellMiddleClickBinding\n\n@SuppressLint(\"CustomViewStyleable\")\nclass CellMiddleClick @JvmOverloads constructor(\n    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0\n) : LinearLayout(context, attrs, defStyleAttr) {\n    private val binding: CellMiddleClickBinding =\n        CellMiddleClickBinding.inflate(LayoutInflater.from(context), this, true)\n\n    init {\n        val a = context.obtainStyledAttributes(attrs, R.styleable.Cell, defStyleAttr, 0)\n        val title = a.getString(R.styleable.Cell_cellTitle)\n        val iconResId = a.getResourceId(R.styleable.Cell_cellIcon, 0)\n        val description = a.getString(R.styleable.Cell_cellDescription)\n        a.recycle()\n        if (title == null) throw IllegalArgumentException(\"Title and type are required attributes for CellSwitch.\")\n\n        binding.title.text = title\n\n        if (iconResId != 0) binding.icon.apply {\n            setImageResource(iconResId)\n            isVisible = true\n        } else binding.icon.isVisible = false\n\n        if (description != null) binding.description.apply {\n            text = description\n            isVisible = true\n        } else binding.description.isVisible = false\n\n        setOnClickListener { v ->\n            onClick?.invoke(v)\n        }\n    }\n\n    var onClick: ((View) -> Unit)? = null\n\n    fun setCellTitle(title: String) {\n        binding.title.text = title\n    }\n\n    fun setCellDescription(description: String?) {\n        if (description == null) binding.description.isVisible = false\n        else binding.description.apply {\n            isVisible = true\n            text = description\n        }\n\n    }\n\n    fun setCellIcon(iconResId: Int?) {\n        if (iconResId == null)\n            binding.icon.isVisible = false\n        else binding.icon.apply {\n            isVisible = true\n            setImageResource(iconResId)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/ui/components/cell/CellMiddleSwitch.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.ui.components.cell\n\nimport android.annotation.SuppressLint\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.widget.LinearLayout\nimport androidx.core.view.isVisible\nimport com.xiaoniu.qqversionlist.R\nimport com.xiaoniu.qqversionlist.databinding.CellMiddleSwitchBinding\n\n@SuppressLint(\"CustomViewStyleable\")\nclass CellMiddleSwitch @JvmOverloads constructor(\n    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0\n) : LinearLayout(context, attrs, defStyleAttr) {\n    private val binding: CellMiddleSwitchBinding =\n        CellMiddleSwitchBinding.inflate(LayoutInflater.from(context), this, true)\n    private var onCheckedChangeListener: ((Boolean) -> Unit)? = null\n\n    init {\n        val a = context.obtainStyledAttributes(attrs, R.styleable.Cell, defStyleAttr, 0)\n        val title = a.getString(R.styleable.Cell_cellTitle)\n        val iconResId = a.getResourceId(R.styleable.Cell_cellIcon, 0)\n        val description = a.getString(R.styleable.Cell_cellDescription)\n        a.recycle()\n        if (title == null) throw IllegalArgumentException(\"Title and type are required attributes for CellSwitch.\")\n\n        binding.title.text = title\n\n        if (iconResId != 0) binding.icon.apply {\n            setImageResource(iconResId)\n            isVisible = true\n        } else binding.icon.isVisible = false\n\n        if (description != null) binding.description.apply {\n            text = description\n            isVisible = true\n        } else binding.description.isVisible = false\n\n        setOnClickListener { v ->\n            toggleSwitch()\n            onClick?.invoke(v)\n        }\n    }\n\n    var onClick: ((View) -> Unit)? = null\n\n    fun setCellTitle(title: String) {\n        binding.title.text = title\n    }\n\n    fun setCellDescription(description: String?) {\n        if (description == null) binding.description.isVisible = false\n        else binding.description.apply {\n            isVisible = true\n            text = description\n        }\n\n    }\n\n    fun setCellIcon(iconResId: Int?) {\n        if (iconResId == null)\n            binding.icon.isVisible = false\n        else binding.icon.apply {\n            isVisible = true\n            setImageResource(iconResId)\n        }\n    }\n\n    var switchChecked: Boolean\n        get() = binding.switchCompat.isChecked\n        set(value) {\n            binding.switchCompat.isChecked = value\n        }\n\n    var switchEnabled: Boolean\n        get() = binding.switchCompat.isEnabled\n        set(value) {\n            binding.switchCompat.isEnabled = value\n        }\n\n    fun setOnCheckedChangeListener(listener: (Boolean) -> Unit) {\n        onCheckedChangeListener = listener\n    }\n\n    private fun toggleSwitch() {\n        val isChecked = !binding.switchCompat.isChecked\n        val isEnabled = binding.switchCompat.isEnabled\n        if (isEnabled) {\n            binding.switchCompat.isChecked = isChecked\n            onCheckedChangeListener?.invoke(isChecked)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/ui/components/cell/CellSingleClick.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.ui.components.cell\n\nimport android.annotation.SuppressLint\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.widget.LinearLayout\nimport androidx.core.view.isVisible\nimport com.xiaoniu.qqversionlist.R\nimport com.xiaoniu.qqversionlist.databinding.CellSingleClickBinding\n\n@SuppressLint(\"CustomViewStyleable\")\nclass CellSingleClick @JvmOverloads constructor(\n    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0\n) : LinearLayout(context, attrs, defStyleAttr) {\n    private val binding: CellSingleClickBinding =\n        CellSingleClickBinding.inflate(LayoutInflater.from(context), this, true)\n\n    init {\n        val a = context.obtainStyledAttributes(attrs, R.styleable.Cell, defStyleAttr, 0)\n        val title = a.getString(R.styleable.Cell_cellTitle)\n        val iconResId = a.getResourceId(R.styleable.Cell_cellIcon, 0)\n        val description = a.getString(R.styleable.Cell_cellDescription)\n        a.recycle()\n        if (title == null) throw IllegalArgumentException(\"Title and type are required attributes for CellSwitch.\")\n\n        binding.title.text = title\n\n        if (iconResId != 0) binding.icon.apply {\n            setImageResource(iconResId)\n            isVisible = true\n        } else binding.icon.isVisible = false\n\n        if (description != null) binding.description.apply {\n            text = description\n            isVisible = true\n        } else binding.description.isVisible = false\n\n        setOnClickListener { v ->\n            onClick?.invoke(v)\n        }\n    }\n\n    var onClick: ((View) -> Unit)? = null\n\n    fun setCellTitle(title: String) {\n        binding.title.text = title\n    }\n\n    fun setCellDescription(description: String?) {\n        if (description == null) binding.description.isVisible = false\n        else binding.description.apply {\n            isVisible = true\n            text = description\n        }\n\n    }\n\n    fun setCellIcon(iconResId: Int?) {\n        if (iconResId == null)\n            binding.icon.isVisible = false\n        else binding.icon.apply {\n            isVisible = true\n            setImageResource(iconResId)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/ui/components/cell/CellSingleSwitch.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.ui.components.cell\n\nimport android.annotation.SuppressLint\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.widget.LinearLayout\nimport androidx.core.view.isVisible\nimport com.xiaoniu.qqversionlist.R\nimport com.xiaoniu.qqversionlist.databinding.CellSingleSwitchBinding\n\n@SuppressLint(\"CustomViewStyleable\")\nclass CellSingleSwitch @JvmOverloads constructor(\n    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0\n) : LinearLayout(context, attrs, defStyleAttr) {\n    private val binding: CellSingleSwitchBinding =\n        CellSingleSwitchBinding.inflate(LayoutInflater.from(context), this, true)\n    private var onCheckedChangeListener: ((Boolean) -> Unit)? = null\n\n    init {\n        val a = context.obtainStyledAttributes(attrs, R.styleable.Cell, defStyleAttr, 0)\n        val title = a.getString(R.styleable.Cell_cellTitle)\n        val iconResId = a.getResourceId(R.styleable.Cell_cellIcon, 0)\n        val description = a.getString(R.styleable.Cell_cellDescription)\n        a.recycle()\n        if (title == null) throw IllegalArgumentException(\"Title and type are required attributes for CellSwitch.\")\n\n        binding.title.text = title\n\n        if (iconResId != 0) binding.icon.apply {\n            setImageResource(iconResId)\n            isVisible = true\n        } else binding.icon.isVisible = false\n\n        if (description != null) binding.description.apply {\n            text = description\n            isVisible = true\n        } else binding.description.isVisible = false\n\n        setOnClickListener { v ->\n            toggleSwitch()\n            onClick?.invoke(v)\n        }\n    }\n\n    var onClick: ((View) -> Unit)? = null\n\n    fun setCellTitle(title: String) {\n        binding.title.text = title\n    }\n\n    fun setCellDescription(description: String?) {\n        if (description == null) binding.description.isVisible = false\n        else binding.description.apply {\n            isVisible = true\n            text = description\n        }\n\n    }\n\n    fun setCellIcon(iconResId: Int?) {\n        if (iconResId == null)\n            binding.icon.isVisible = false\n        else binding.icon.apply {\n            isVisible = true\n            setImageResource(iconResId)\n        }\n    }\n\n    var switchChecked: Boolean\n        get() = binding.switchCompat.isChecked\n        set(value) {\n            binding.switchCompat.isChecked = value\n        }\n\n    var switchEnabled: Boolean\n        get() = binding.switchCompat.isEnabled\n        set(value) {\n            binding.switchCompat.isEnabled = value\n        }\n\n    fun setOnCheckedChangeListener(listener: (Boolean) -> Unit) {\n        onCheckedChangeListener = listener\n    }\n\n    private fun toggleSwitch() {\n        val isChecked = !binding.switchCompat.isChecked\n        val isEnabled = binding.switchCompat.isEnabled\n        if (isEnabled) {\n            binding.switchCompat.isChecked = isChecked\n            onCheckedChangeListener?.invoke(isChecked)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/ui/components/cell/CellTopClick.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.ui.components.cell\n\nimport android.annotation.SuppressLint\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.widget.LinearLayout\nimport androidx.core.view.isVisible\nimport com.xiaoniu.qqversionlist.R\nimport com.xiaoniu.qqversionlist.databinding.CellTopClickBinding\n\n@SuppressLint(\"CustomViewStyleable\")\nclass CellTopClick @JvmOverloads constructor(\n    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0\n) : LinearLayout(context, attrs, defStyleAttr) {\n    private val binding: CellTopClickBinding =\n        CellTopClickBinding.inflate(LayoutInflater.from(context), this, true)\n\n    init {\n        val a = context.obtainStyledAttributes(attrs, R.styleable.Cell, defStyleAttr, 0)\n        val title = a.getString(R.styleable.Cell_cellTitle)\n        val iconResId = a.getResourceId(R.styleable.Cell_cellIcon, 0)\n        val description = a.getString(R.styleable.Cell_cellDescription)\n        a.recycle()\n        if (title == null) throw IllegalArgumentException(\"Title and type are required attributes for CellSwitch.\")\n\n        binding.title.text = title\n\n        if (iconResId != 0) binding.icon.apply {\n            setImageResource(iconResId)\n            isVisible = true\n        } else binding.icon.isVisible = false\n\n        if (description != null) binding.description.apply {\n            text = description\n            isVisible = true\n        } else binding.description.isVisible = false\n\n        setOnClickListener { v ->\n            onClick?.invoke(v)\n        }\n    }\n\n    var onClick: ((View) -> Unit)? = null\n\n    fun setCellTitle(title: String) {\n        binding.title.text = title\n    }\n\n    fun setCellDescription(description: String?) {\n        if (description == null) binding.description.isVisible = false\n        else binding.description.apply {\n            isVisible = true\n            text = description\n        }\n\n    }\n\n    fun setCellIcon(iconResId: Int?) {\n        if (iconResId == null)\n            binding.icon.isVisible = false\n        else binding.icon.apply {\n            isVisible = true\n            setImageResource(iconResId)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/ui/components/cell/CellTopSwitch.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.ui.components.cell\n\nimport android.annotation.SuppressLint\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.widget.LinearLayout\nimport androidx.core.view.isVisible\nimport com.xiaoniu.qqversionlist.R\nimport com.xiaoniu.qqversionlist.databinding.CellTopSwitchBinding\n\n@SuppressLint(\"CustomViewStyleable\")\nclass CellTopSwitch @JvmOverloads constructor(\n    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0\n) : LinearLayout(context, attrs, defStyleAttr) {\n    private val binding: CellTopSwitchBinding =\n        CellTopSwitchBinding.inflate(LayoutInflater.from(context), this, true)\n    private var onCheckedChangeListener: ((Boolean) -> Unit)? = null\n\n    init {\n        val a = context.obtainStyledAttributes(attrs, R.styleable.Cell, defStyleAttr, 0)\n        val title = a.getString(R.styleable.Cell_cellTitle)\n        val iconResId = a.getResourceId(R.styleable.Cell_cellIcon, 0)\n        val description = a.getString(R.styleable.Cell_cellDescription)\n        a.recycle()\n        if (title == null) throw IllegalArgumentException(\"Title and type are required attributes for CellSwitch.\")\n\n        binding.title.text = title\n\n        if (iconResId != 0) binding.icon.apply {\n            setImageResource(iconResId)\n            isVisible = true\n        } else binding.icon.isVisible = false\n\n        if (description != null) binding.description.apply {\n            text = description\n            isVisible = true\n        } else binding.description.isVisible = false\n\n        setOnClickListener { v ->\n            toggleSwitch()\n            onClick?.invoke(v)\n        }\n    }\n\n    var onClick: ((View) -> Unit)? = null\n\n    fun setCellTitle(title: String) {\n        binding.title.text = title\n    }\n\n    fun setCellDescription(description: String?) {\n        if (description == null) binding.description.isVisible = false\n        else binding.description.apply {\n            isVisible = true\n            text = description\n        }\n\n    }\n\n    fun setCellIcon(iconResId: Int?) {\n        if (iconResId == null)\n            binding.icon.isVisible = false\n        else binding.icon.apply {\n            isVisible = true\n            setImageResource(iconResId)\n        }\n    }\n\n    var switchChecked: Boolean\n        get() = binding.switchCompat.isChecked\n        set(value) {\n            binding.switchCompat.isChecked = value\n        }\n\n    var switchEnabled: Boolean\n        get() = binding.switchCompat.isEnabled\n        set(value) {\n            binding.switchCompat.isEnabled = value\n        }\n\n    fun setOnCheckedChangeListener(listener: (Boolean) -> Unit) {\n        onCheckedChangeListener = listener\n    }\n\n    private fun toggleSwitch() {\n        val isChecked = !binding.switchCompat.isChecked\n        val isEnabled = binding.switchCompat.isEnabled\n        if (isEnabled) {\n            binding.switchCompat.isChecked = isChecked\n            onCheckedChangeListener?.invoke(isChecked)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/ui/theme/Color.kt",
    "content": "package com.xiaoniu.qqversionlist.ui.theme\n\nimport androidx.compose.ui.graphics.Color\n\nval Purple80 = Color(0xFFD0BCFF)\nval PurpleGrey80 = Color(0xFFCCC2DC)\nval Pink80 = Color(0xFFEFB8C8)\n\nval Purple40 = Color(0xFF6650a4)\nval PurpleGrey40 = Color(0xFF625b71)\nval Pink40 = Color(0xFF7D5260)"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/ui/theme/Theme.kt",
    "content": "package com.xiaoniu.qqversionlist.ui.theme\n\nimport android.os.Build\nimport androidx.compose.foundation.isSystemInDarkTheme\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.darkColorScheme\nimport androidx.compose.material3.dynamicDarkColorScheme\nimport androidx.compose.material3.dynamicLightColorScheme\nimport androidx.compose.material3.lightColorScheme\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.platform.LocalContext\n\nprivate val DarkColorScheme = darkColorScheme(\n    primary = Purple80,\n    secondary = PurpleGrey80,\n    tertiary = Pink80\n)\n\nprivate val LightColorScheme = lightColorScheme(\n    primary = Purple40,\n    secondary = PurpleGrey40,\n    tertiary = Pink40\n\n    /* Other default colors to override\n    background = Color(0xFFFFFBFE),\n    surface = Color(0xFFFFFBFE),\n    onPrimary = Color.White,\n    onSecondary = Color.White,\n    onTertiary = Color.White,\n    onBackground = Color(0xFF1C1B1F),\n    onSurface = Color(0xFF1C1B1F),\n    */\n)\n\n@Composable\nfun QQVersionListTheme(\n    darkTheme: Boolean = isSystemInDarkTheme(),\n    // Dynamic color is available on Android 12+\n    dynamicColor: Boolean = true,\n    content: @Composable () -> Unit\n) {\n    val colorScheme = when {\n        dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {\n            val context = LocalContext.current\n            if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context)\n        }\n\n        darkTheme -> DarkColorScheme\n        else -> LightColorScheme\n    }\n\n    MaterialTheme(\n        colorScheme = colorScheme,\n        typography = Typography,\n        content = content\n    )\n}"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/ui/theme/Type.kt",
    "content": "package com.xiaoniu.qqversionlist.ui.theme\n\nimport androidx.compose.material3.Typography\nimport androidx.compose.ui.text.TextStyle\nimport androidx.compose.ui.text.font.FontFamily\nimport androidx.compose.ui.text.font.FontWeight\nimport androidx.compose.ui.unit.sp\n\n// Set of Material typography styles to start with\nval Typography = Typography(\n    bodyLarge = TextStyle(\n        fontFamily = FontFamily.Default,\n        fontWeight = FontWeight.Normal,\n        fontSize = 16.sp,\n        lineHeight = 24.sp,\n        letterSpacing = 0.5.sp\n    )\n    /* Other default text styles to override\n    titleLarge = TextStyle(\n        fontFamily = FontFamily.Default,\n        fontWeight = FontWeight.Normal,\n        fontSize = 22.sp,\n        lineHeight = 28.sp,\n        letterSpacing = 0.sp\n    ),\n    labelSmall = TextStyle(\n        fontFamily = FontFamily.Default,\n        fontWeight = FontWeight.Medium,\n        fontSize = 11.sp,\n        lineHeight = 16.sp,\n        letterSpacing = 0.5.sp\n    )\n    */\n)"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/util/ClipboardUtil.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\r\n\r\n/*\r\n    Qverbow Util\r\n    Copyright (C) 2023 klxiaoniu\r\n\r\n    This program is free software: you can redistribute it and/or modify\r\n    it under the terms of the GNU Affero General Public License as\r\n    published by the Free Software Foundation, either version 3 of the\r\n    License, or (at your option) any later version.\r\n\r\n    This program is distributed in the hope that it will be useful,\r\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n    GNU Affero General Public License for more details.\r\n\r\n    You should have received a copy of the GNU Affero General Public License\r\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\r\n*/\r\n\r\npackage com.xiaoniu.qqversionlist.util\r\n\r\nimport android.content.ClipData\r\nimport android.content.ClipboardManager\r\nimport android.content.Context\r\nimport com.xiaoniu.qqversionlist.R\r\nimport com.xiaoniu.qqversionlist.util.InfoUtil.showToast\r\n\r\nobject ClipboardUtil {\r\n    fun Context.copyText(text: String) {\r\n        val clipboardManager = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager\r\n        clipboardManager.setPrimaryClip(ClipData.newPlainText(\"\", text))\r\n        showToast(\"${getString(R.string.copied)}$text\")\r\n    }\r\n}"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/util/DataStoreUtil.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.util\n\nimport android.content.Context\nimport androidx.datastore.core.DataStore\nimport androidx.datastore.preferences.SharedPreferencesMigration\nimport androidx.datastore.preferences.core.Preferences\nimport androidx.datastore.preferences.core.booleanPreferencesKey\nimport androidx.datastore.preferences.core.doublePreferencesKey\nimport androidx.datastore.preferences.core.edit\nimport androidx.datastore.preferences.core.floatPreferencesKey\nimport androidx.datastore.preferences.core.intPreferencesKey\nimport androidx.datastore.preferences.core.longPreferencesKey\nimport androidx.datastore.preferences.core.stringPreferencesKey\nimport androidx.datastore.preferences.preferencesDataStore\nimport com.xiaoniu.qqversionlist.QverbowApplication\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Deferred\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.flow.firstOrNull\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.runBlocking\n\nobject DataStoreUtil {\n    private val Context.dataStore: DataStore<Preferences> by preferencesDataStore(\n        name = \"data\",\n        produceMigrations = { context ->\n            listOf(\n                SharedPreferencesMigration(context, \"data\")\n            )\n        })\n\n    private val dataStore: DataStore<Preferences> by lazy {\n        QverbowApplication.instance.dataStore\n    }\n\n    fun getIntKV(key: String, defValue: Int): Int {\n        return runBlocking {\n            dataStore.data.firstOrNull()?.let { preferences ->\n                preferences[intPreferencesKey(key)] ?: defValue\n            } ?: defValue\n        }\n    }\n\n    fun putIntKV(key: String, value: Int) {\n        runBlocking {\n            dataStore.edit { preferences ->\n                preferences[intPreferencesKey(key)] = value\n            }\n        }\n    }\n\n    fun getStringKV(key: String, defValue: String): String {\n        return runBlocking {\n            dataStore.data.firstOrNull()?.let { preferences ->\n                preferences[stringPreferencesKey(key)] ?: defValue\n            } ?: defValue\n        }\n    }\n\n    fun putStringKV(key: String, value: String) {\n        runBlocking {\n            dataStore.edit { preferences ->\n                preferences[stringPreferencesKey(key)] = value\n            }\n        }\n    }\n\n    fun getBooleanKV(key: String, defValue: Boolean): Boolean {\n        return runBlocking {\n            dataStore.data.firstOrNull()?.let { preferences ->\n                preferences[booleanPreferencesKey(key)] ?: defValue\n            } ?: defValue\n        }\n    }\n\n    fun putBooleanKV(key: String, value: Boolean) {\n        runBlocking {\n            dataStore.edit { preferences ->\n                preferences[booleanPreferencesKey(key)] = value\n            }\n        }\n    }\n\n    fun deleteKV(key: String) {\n        runBlocking {\n            dataStore.edit { preferences ->\n                preferences.remove(stringPreferencesKey(key))\n                preferences.remove(intPreferencesKey(key))\n                preferences.remove(booleanPreferencesKey(key))\n                preferences.remove(floatPreferencesKey(key))\n                preferences.remove(longPreferencesKey(key))\n                preferences.remove(doublePreferencesKey(key))\n            }\n        }\n    }\n\n    /**\n     * 批量写入 DataStore 持久化存储数据\n     * @param dataStoreList List<Map<String, Any>>\n     *\n     *  key: String\n     *\n     *  value: Any\n     *\n     *  type: String\n     */\n    fun batchPutKV(dataStoreList: List<Map<String, Any>>) {\n        runBlocking {\n            dataStore.edit { preferences ->\n                dataStoreList.forEach { dataMap ->\n                    val key = dataMap[\"key\"] as? String ?: return@forEach\n                    val value = dataMap[\"value\"]\n                    val type = dataMap[\"type\"] as? String\n                    when (type) {\n                        \"Int\", \"int\" -> preferences[intPreferencesKey(key)] =\n                            value as? Int ?: return@forEach\n\n                        \"Long\", \"long\" -> preferences[longPreferencesKey(key)] =\n                            value as? Long ?: return@forEach\n\n                        \"Float\", \"float\" -> preferences[floatPreferencesKey(key)] =\n                            value as? Float ?: return@forEach\n\n                        \"Double\", \"double\" -> preferences[doublePreferencesKey(key)] =\n                            value as? Double ?: return@forEach\n\n                        \"String\", \"string\" -> preferences[stringPreferencesKey(key)] =\n                            value as? String ?: return@forEach\n\n                        \"Boolean\", \"boolean\" -> preferences[booleanPreferencesKey(key)] =\n                            value as? Boolean ?: return@forEach\n\n                        else -> throw IllegalArgumentException(\"DataStore 不支持的类型: $type\")\n                    }\n                }\n            }\n        }\n    }\n\n    fun getIntKVAsync(key: String, defValue: Int): Deferred<Int> {\n        return CoroutineScope(Dispatchers.IO).async {\n            dataStore.data.firstOrNull()?.let { preferences ->\n                preferences[intPreferencesKey(key)] ?: defValue\n            } ?: defValue\n        }\n    }\n\n    fun putIntKVAsync(key: String, value: Int) {\n        CoroutineScope(Dispatchers.IO).launch {\n            dataStore.edit { preferences ->\n                preferences[intPreferencesKey(key)] = value\n            }\n        }\n    }\n\n    fun getStringKVAsync(key: String, defValue: String): Deferred<String> {\n        return CoroutineScope(Dispatchers.IO).async {\n            dataStore.data.firstOrNull()?.let { preferences ->\n                preferences[stringPreferencesKey(key)] ?: defValue\n            } ?: defValue\n        }\n    }\n\n    fun putStringKVAsync(key: String, value: String) {\n        CoroutineScope(Dispatchers.IO).launch {\n            dataStore.edit { preferences ->\n                preferences[stringPreferencesKey(key)] = value\n            }\n        }\n    }\n\n    fun getBooleanKVAsync(key: String, defValue: Boolean): Deferred<Boolean> {\n        return CoroutineScope(Dispatchers.IO).async {\n            dataStore.data.firstOrNull()?.let { preferences ->\n                preferences[booleanPreferencesKey(key)] ?: defValue\n            } ?: defValue\n        }\n    }\n\n    fun putBooleanKVAsync(key: String, value: Boolean) {\n        CoroutineScope(Dispatchers.IO).launch {\n            dataStore.edit { preferences ->\n                preferences[booleanPreferencesKey(key)] = value\n            }\n        }\n    }\n\n    fun deleteKVAsync(key: String) {\n        CoroutineScope(Dispatchers.IO).launch {\n            dataStore.edit { preferences ->\n                preferences.remove(stringPreferencesKey(key))\n                preferences.remove(intPreferencesKey(key))\n                preferences.remove(booleanPreferencesKey(key))\n                preferences.remove(floatPreferencesKey(key))\n                preferences.remove(longPreferencesKey(key))\n                preferences.remove(doublePreferencesKey(key))\n            }\n        }\n    }\n\n    /**\n     * 异步批量写入 DataStore 持久化存储数据\n     * @param dataStoreList List<Map<String, Any>>\n     *\n     *  key: String\n     *\n     *  value: Any\n     *\n     *  type: String\n     */\n    fun batchPutKVAsync(dataStoreList: List<Map<String, Any>>) {\n        CoroutineScope(Dispatchers.IO).launch {\n            dataStore.edit { preferences ->\n                dataStoreList.forEach { dataMap ->\n                    val key = dataMap[\"key\"] as? String ?: return@forEach\n                    val value = dataMap[\"value\"]\n                    val type = dataMap[\"type\"] as? String\n                    when (type) {\n                        \"Int\", \"int\" -> preferences[intPreferencesKey(key)] =\n                            value as? Int ?: return@forEach\n\n                        \"Long\", \"long\" -> preferences[longPreferencesKey(key)] =\n                            value as? Long ?: return@forEach\n\n                        \"Float\", \"float\" -> preferences[floatPreferencesKey(key)] =\n                            value as? Float ?: return@forEach\n\n                        \"Double\", \"double\" -> preferences[doublePreferencesKey(key)] =\n                            value as? Double ?: return@forEach\n\n                        \"String\", \"string\" -> preferences[stringPreferencesKey(key)] =\n                            value as? String ?: return@forEach\n\n                        \"Boolean\", \"boolean\" -> preferences[booleanPreferencesKey(key)] =\n                            value as? Boolean ?: return@forEach\n\n                        else -> throw IllegalArgumentException(\"DataStore 不支持的类型: $type\")\n                    }\n                }\n            }\n        }\n    }\n}\n\n"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/util/DexResolver.kt",
    "content": "// https://github.com/cliuff/boundo/blob/main/api_viewing/src/main/kotlin/com/madness/collision/unit/api_viewing/info/DexResolver.kt\n\n/*\n * Copyright 2023 Clifford Liu\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.xiaoniu.qqversionlist.util\n\nimport com.android.tools.smali.dexlib2.DexFileFactory\nimport com.android.tools.smali.dexlib2.Opcodes\nimport com.android.tools.smali.dexlib2.dexbacked.ZipDexContainer\nimport java.io.File\nimport java.util.LinkedList\nimport java.util.TreeSet\nimport java.util.zip.ZipEntry\nimport java.util.zip.ZipFile\n\n/**\n * Check file extension first to avoid reading every entry's stream,\n * which takes an insanely significant amount of time.\n * The only exception found is assets/mini.db from the base.apk of\n * MX Player Pro (com.mxtech.videoplayer.pro) 1.68.4/2001002074,\n * which contains a single class [Help_a] with an empty static method [h].\n *\n * microbenchmark results, ExtensionDexContainer vs. ZipDexContainer:\n *   reduction in execution time: over 50% on Pixel 4, over 70% on Pixel 3;\n *   reduction in allocations   : over 70% on Pixel 4, over 85% on Pixel 3;\n */\nopen class ExtensionDexContainer(file: File, opcodes: Opcodes) : ZipDexContainer(file, opcodes) {\n    override fun isDex(zipFile: ZipFile, zipEntry: ZipEntry): Boolean {\n        return zipEntry.name.endsWith(\".dex\") && super.isDex(zipFile, zipEntry)\n    }\n}\n\n/** see [DexFileFactory.loadDexContainer] */\nobject DexContainerFactory {\n    /**\n     * Opcodes are the instruction set of Dalvik/ART virtual machine,\n     * Dalvik executable (DEX) is compiled by D8 dexer,\n     * and its version is determined by min SDK.\n     */\n    fun load(apkPath: String, minSdk: Int = -1): EnumDexContainer {\n        val file = File(apkPath)\n        if (file.exists().not()) throw RuntimeException(\"file does not exist\")\n        val opcodes = if (minSdk >= 0) Opcodes.forApi(minSdk) else Opcodes.getDefault()\n        return EnumDexContainer(file, opcodes).takeIf { it.isZipFile }\n            ?: throw RuntimeException(\"not a zip file\")\n    }\n}\n\nobject DexResolver {\n    // microbenchmark results, smali-dexlib2 vs. apk-parser:\n    //   reduction in execution time: over 20% on Pixel 4, Pixel 3\n    //   reduction in allocations   : over 55% on Pixel 4, Pixel 3\n    fun loadDexLib(apkPath: String) = runCatching {\n        val pkgSet = TreeSet<String>()\n        DexContainerFactory.load(apkPath).dexEntrySeq.forEach { entry ->\n            entry.dexFile.classes.mapNotNullTo(pkgSet) { mapToPackage(it.type) }\n        }\n        pkgSet.toList()\n    }\n\n    fun loadDexLib(apkPath: String, convert: (String) -> String?) = runCatching {\n        // many class types will share the same package name,\n        // use a tree set to eliminate duplicates and sort them\n        val pkgSet = TreeSet<String>()\n        DexContainerFactory.load(apkPath).dexEntrySeq.forEach { entry ->\n            entry.dexFile.classes.mapNotNullTo(pkgSet) { mapToPackage(it.type) }\n        }\n        // apply data conversion on the distinct set to avoid duplicated operations,\n        // use the tree set again to get distinct and sorted data set after conversion\n        val convPkgs = LinkedList<String>()\n        val iterator = pkgSet.iterator()\n        while (iterator.hasNext()) {\n            val pkg = iterator.next()\n            when (val conv = convert(pkg)) {\n                pkg -> Unit\n                null -> iterator.remove()\n                else -> { iterator.remove(); convPkgs.add(conv) }\n            }\n        }\n        pkgSet.addAll(convPkgs)\n        pkgSet.toList()\n    }\n\n    fun findPackage(apkPath: String, targetPkg: String) = runCatching {\n        DexContainerFactory.load(apkPath).dexEntrySeq.forEach { entry ->\n            for (classDef in entry.dexFile.classes) {\n                val pkg = mapToPackage(classDef.type) ?: continue\n                if (pkg.startsWith(targetPkg)) return@runCatching true\n            }\n        }\n        false\n    }\n\n    // Landroid/app/AppComponentFactory; -> android.app\n    private fun mapToPackage(type: String): String? {\n        val pkg = run {\n            if (type.startsWith('L') && type.endsWith(';')) {\n                val endIndex = type.lastIndexOf('/')\n                if (endIndex > 1) {\n                    type.substring(1, endIndex).replace('/', '.')\n                } else {\n                    type.substring(1, type.length - 1)\n                }\n            } else {\n                type\n            }\n        }\n        return pkg.takeUnless { it.isBlank() }\n    }\n}\n\nclass ThirdPartyPkgFilter(private val ownPkg: String, private val removeInternals: Boolean) {\n    private val regexOwnPkg = \"\"\"$ownPkg\\..+\"\"\".toRegex()\n    // more than one section: end with one character or plus a digit\n    private val regexObfuscatedEnding = \"\"\".*\\.\\w\\d?\"\"\".toRegex()\n    // only one section: no more than two characters, or one character plus a digit\n//        private val regexObfuscated1 = \"\"\"\\w[\\w\\d]?\"\"\".toRegex()\n    // only one section: without any dot\n    private val regexObfuscatedSingleSection = \"\"\"[^.]+\"\"\".toRegex()\n    private val pKReflect = \"kotlin.reflect.jvm.internal\"\n    private val obfuscatedExceptions = hashSetOf(\n        \"androidx.legacy.v4\",\n        \"java.com.android.tools.r8\",\n        \"kotlin\",\n        \"okhttp3\",\n        \"okio\",\n        \"retrofit2\",\n    )\n\n    fun map(target: String): String? {\n        val mapOwn = mapOwnPkg(target)\n        if (mapOwn != target) return mapOwn\n        val mapObfuscated = mapObfuscated(target)\n        if (mapObfuscated != target) return mapObfuscated\n        return target\n    }\n\n    fun mapOwnPkg(target: String): String? {\n        if (target == ownPkg) return null // packages of its own\n        if (target.matches(regexOwnPkg)) return null // packages of its own\n        return target\n    }\n\n    fun mapObfuscated(target: String): String? {\n        if (target in obfuscatedExceptions) return target\n        if (target.matches(regexObfuscatedSingleSection)) return null // the obfuscated\n//            if (target.matches(regexObfuscated1)) return null // the obfuscated\n        if (target.matches(regexObfuscatedEnding)) return null // the obfuscated\n        if (removeInternals && target.startsWith(pKReflect)) return pKReflect\n        return target\n    }\n}\n\nclass R8RewriteReverser {\n    private val regexR8Rewrite = \"\"\"(j\\$)((?:\\..+)*)\"\"\".toRegex()\n\n    fun map(target: String): String {\n        // return self if starts with j\n        if (target.firstOrNull() != 'j') return target\n        // convert R8 prefix rewrite of Java 8 APIs\n        return target.replace(regexR8Rewrite) { s -> \"java\" + s.groupValues[2] }\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/util/EnumDexContainer.kt",
    "content": "// https://github.com/cliuff/boundo/blob/main/api_viewing/src/main/kotlin/com/madness/collision/unit/api_viewing/info/EnumDexContainer.kt\n\n/*\n * Copyright 2023 Clifford Liu\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.xiaoniu.qqversionlist.util\n\nimport com.android.tools.smali.dexlib2.Opcodes\nimport com.android.tools.smali.dexlib2.dexbacked.ZipDexContainer\nimport com.android.tools.smali.dexlib2.iface.DexFile\nimport com.android.tools.smali.dexlib2.iface.MultiDexContainer.DexEntry\nimport java.io.Closeable\nimport java.io.File\nimport java.util.Enumeration\nimport java.util.zip.ZipEntry\nimport java.util.zip.ZipFile\n\n/**\n * Enumerate DEX entries one by one.\n * For smali-dexlib2 3.0.4+, DEX entries are processed all at once.\n * Loading all DEX entries' bytes causes significant memory consumption, even OOM (e.g. QQ app).\n */\nclass EnumDexContainer(private val file: File, opcodes: Opcodes) : EnumNodeDexContainer(file, opcodes) {\n    private var nodeDexCounter: DexCounter = dexCounter\n\n    /** Lazily enumerated DEX entries. */\n    val dexEntrySeq: Sequence<DexEntry<out DexFile>> = sequence {\n        val zipFile = zipFile\n        zipFile.asCloseable().use { _ ->\n            // enumerate dex entries on enum nodes\n            val entryEnum = zipFile.entries()\n            while (entryEnum.hasMoreElements()) {\n                try {\n                    // entries are cached once generated, use a new object to get more\n                    val enumNode = EnumNodeDexContainer(file, opcodes, zipFile)\n                    nodeDexCounter = enumNode.dexCounter\n                    val ret = enumNode.dexEntryNames\n                    dexCounter += enumNode.dexCounter\n                    // getEntry on node instead of EnumDexContainer, who does not have entry cache\n                    yieldAll(ret.mapNotNull(enumNode::getEntry))\n                } catch (e: OutOfMemoryError) {\n                    val msg = \"Enumerated ${dexCounter.dexSize} bytes of ${dexCounter.dexCount} DEX\"\n                    OutOfMemoryError(msg).printStackTrace()\n                    throw e\n                }\n            }\n        }\n    }\n\n    override fun getEnumZipFile(): EnumZipFile {\n        return EnumZipFile(file) hasNext@{\n            if (!nodeDexCounter.isLoadingEntries) return@hasNext true\n            // one dex entry at a time\n            nodeDexCounter.dexCount <= 0\n        }\n    }\n}\n\nopen class EnumNodeDexContainer(\n    private val file: File,\n    opcodes: Opcodes,\n    private var enumZipFile: EnumZipFile? = null,\n    val dexCounter: DexCounter = DexCounter(),\n) : ExtensionDexContainer(file, opcodes) {\n\n    override fun getDexEntryNames(): MutableList<String> {\n        return dexCounter.use { super.getDexEntryNames() }\n    }\n\n    override fun isDex(zipFile: ZipFile, zipEntry: ZipEntry): Boolean {\n        return super.isDex(zipFile, zipEntry).also { isDex ->\n            if (isDex) dexCounter.increment(zipEntry.size)\n        }\n    }\n\n    override fun getZipFile(): EnumZipFile {\n        return enumZipFile ?: getEnumZipFile().also { enumZipFile = it }\n    }\n\n    /** Create new [EnumZipFile] instance for use in [getZipFile]. */\n    protected open fun getEnumZipFile(): EnumZipFile {\n        return EnumZipFile(file) { true }\n    }\n}\n\nclass EnumZipFile(file: File, private val hasNextEntry: () -> Boolean) : ZipFile(file) {\n    private var entryEnum: Enumeration<ZipEntry>? = null\n\n    /** Cached value is returned to be used across [EnumDexContainer]s. */\n    override fun entries(): Enumeration<out ZipEntry> {\n        entryEnum?.let { return it }\n        val enum = super.entries()\n        return object : Enumeration<ZipEntry> {\n            override fun hasMoreElements() = enum.hasMoreElements() && hasNextEntry()\n            override fun nextElement() = enum.nextElement()\n        }.also { entryEnum = it }\n    }\n\n    /** Cleared to prevent early close in [ZipDexContainer.getDexEntryNames] by super class. */\n    override fun close() {\n    }\n\n    fun asCloseable(): Closeable = Closeable { super.close() }\n}\n\nclass DexCounter {\n    private var entLoad: Int = 0\n    val isLoadingEntries: Boolean get() = entLoad > 0\n    var dexCount: Int = 0; private set\n    var dexSize: Long = 0L; private set\n\n    fun <T> use(block: () -> T): T {\n        dexCount = 0\n        dexSize = 0\n        entLoad++\n        val ret = block()\n        entLoad = 0\n        return ret\n    }\n\n    fun increment(dexSize: Long) {\n        if (isLoadingEntries) {\n            dexCount++\n            this.dexSize += dexSize\n        }\n    }\n\n    operator fun plusAssign(counter: DexCounter) {\n        dexCount += counter.dexCount\n        dexSize += counter.dexSize\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/util/Extensions.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.util\n\nimport android.content.res.Resources\n\nobject Extensions {\n    val Number.dpToPx get() = (toFloat() * Resources.getSystem().displayMetrics.density).toInt()\n    val Number.pxToDp get() = (toFloat() / Resources.getSystem().displayMetrics.density).toInt()\n}\n"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/util/FileUtil.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.util\n\nimport android.app.DownloadManager\nimport android.content.Context\nimport android.content.Intent\nimport android.net.Uri\nimport android.os.Environment\nimport okhttp3.OkHttpClient\nimport okhttp3.Request\nimport org.apache.commons.compress.archivers.zip.ZipArchiveEntry\nimport java.io.File\nimport java.io.InputStream\nimport java.util.zip.ZipEntry\nimport java.util.zip.ZipFile\nimport org.apache.commons.compress.archivers.zip.ZipFile as ApacheZipFile\n\nobject FileUtil {\n    class ZipFileCompat(file: File) : AutoCloseable {\n        private var javaZipFile: ZipFile? = null\n        private var apacheCommonsZipFile: ApacheZipFile? = null\n\n        init {\n            runCatching {\n                javaZipFile = ZipFile(file)\n            }.onFailure {\n                apacheCommonsZipFile = ApacheZipFile.Builder().setFile(file).get()\n            }\n        }\n\n        fun getEntry(name: String): ZipEntry? {\n            return javaZipFile?.getEntry(name) ?: apacheCommonsZipFile?.getEntry(name)\n        }\n\n        fun getInputStream(entry: ZipEntry): InputStream {\n            return javaZipFile?.getInputStream(entry) ?: run {\n                if (entry is ZipArchiveEntry) {\n                    apacheCommonsZipFile?.getInputStream(entry)\n                        ?: throw Exception(\"未找到 InputStream。\")\n                } else {\n                    val archiveEntry = apacheCommonsZipFile?.getEntry(entry.name)\n                    archiveEntry?.let { apacheCommonsZipFile?.getInputStream(it) }\n                        ?: throw Exception(\"未找到 InputStream。\")\n                }\n            }\n        }\n\n        override fun close() {\n            javaZipFile?.close()\n            apacheCommonsZipFile?.close()\n        }\n    }\n\n    fun downloadFile(context: Context, url: String, fileName: String? = null) {\n        if (DataStoreUtil.getBooleanKV(\n                \"downloadOnSystemManager\", false\n            )\n        ) {\n            val requestDownload =\n                DownloadManager.Request(Uri.parse(url))\n            requestDownload.setDestinationInExternalPublicDir(\n                Environment.DIRECTORY_DOWNLOADS,\n                if (fileName != null) fileName else url.substringAfterLast('/')\n            )\n            val downloadManager =\n                context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager\n            downloadManager.enqueue(requestDownload)\n        } else {\n            // 这里不用 Chrome Custom Tab 的原因是 Chrome 不知道咋回事有概率卡在“等待下载”状态\n            val browserIntent =\n                Intent(Intent.ACTION_VIEW, Uri.parse(url))\n            browserIntent.apply {\n                addCategory(Intent.CATEGORY_BROWSABLE)\n                flags = Intent.FLAG_ACTIVITY_NEW_TASK\n            }\n            context.startActivity(browserIntent)\n        }\n    }\n\n    /**\n     * 获取文件大小\n     *\n     * **需在后台线程调用**\n     *\n     * @param url 文件下载地址\n     * @return 单位为 MB\n     */\n    fun getFileSize(url: String): String? {\n        val okHttpClient = OkHttpClient()\n        val request = Request.Builder().url(url).head().build()\n        val response = okHttpClient.newCall(request).execute()\n        return if (!response.isSuccessful) null else \"%.2f\".format(\n            response.header(\"Content-Length\")?.toDoubleOrNull()\n                ?.div(1024 * 1024)\n        )\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/util/GitHubRestApiUtil.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.util\n\nimport com.xiaoniu.qqversionlist.QverbowApplication.Companion.GITHUB_TOKEN\nimport com.xiaoniu.qqversionlist.data.QverbowRelease\nimport com.xiaoniu.qqversionlist.data.QverbowReleaseAssets\nimport org.kohsuke.github.GitHub\n\nobject GitHubRestApiUtil {\n    /**\n     * 获取 Qverbow 的发布版本信息\n     * 如果提供了特定的版本号，则获取该版本的发布信息；否则获取最新发布版本的信息\n     * 使用 GitHub 的 OAuth 令牌连接到 GitHub，如果令牌无效，则匿名连接\n     *\n     * @param version 可选参数，指定需要查询的版本号如果未提供，则获取最新版本信息\n     * @return 返回一个包含发布信息的 QverbowRelease 对象\n     */\n    fun getQverbowRelease(version: String? = null): QverbowRelease {\n        val token = getGitHubToken()\n        val github =\n            if (checkGitHubToken()) GitHub.connectUsingOAuth(token) else GitHub.connectAnonymously()\n        val repository = github.getRepository(\"klxiaoniu/QQVersionList\")\n        val release =\n            if (version != null) repository.getReleaseByTagName(version) else repository.latestRelease\n\n        return QverbowRelease(tagName = release.tagName,\n            name = release.name,\n            body = release.body,\n            createdAt = release.createdAt,\n            htmlUrl = release.htmlUrl.toString(),\n            zipballUrl = release.zipballUrl.toString(),\n            tarballUrl = release.tarballUrl.toString(),\n            isDraft = release.isDraft,\n            isPrerelease = release.isPrerelease,\n            assets = release.listAssets().map { asset ->\n                QverbowReleaseAssets(\n                    name = asset.name,\n                    browserDownloadUrl = asset.browserDownloadUrl.toString(),\n                    contentType = asset.contentType,\n                    size = asset.size\n                )\n            })\n    }\n\n\n    fun checkGitHubToken(): Boolean {\n        val token = getGitHubToken()\n        return if (token != null) try {\n            val github = GitHub.connectUsingOAuth(token)\n            !github.myself.name.isNullOrEmpty()\n        } catch (_: Exception) {\n            false\n        } else false\n    }\n\n    private fun getGitHubToken(): String? {\n        return KeyStoreUtil.getStringKVwithKeyStore(GITHUB_TOKEN)\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/util/InfoUtil.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\r\n\r\n/*\r\n    Qverbow Util\r\n    Copyright (C) 2023 klxiaoniu\r\n\r\n    This program is free software: you can redistribute it and/or modify\r\n    it under the terms of the GNU Affero General Public License as\r\n    published by the Free Software Foundation, either version 3 of the\r\n    License, or (at your option) any later version.\r\n\r\n    This program is distributed in the hope that it will be useful,\r\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n    GNU Affero General Public License for more details.\r\n\r\n    You should have received a copy of the GNU Affero General Public License\r\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\r\n*/\r\n\r\npackage com.xiaoniu.qqversionlist.util\r\n\r\nimport android.app.Activity\r\nimport android.app.AlertDialog\r\nimport android.content.Context\r\nimport android.content.ContextWrapper\r\nimport android.content.Intent\r\nimport android.net.Uri\r\nimport android.os.Build\r\nimport android.provider.Settings\r\nimport android.text.SpannableString\r\nimport android.text.style.URLSpan\r\nimport android.widget.Toast\r\nimport androidx.annotation.StringRes\r\nimport androidx.browser.customtabs.CustomTabsIntent\r\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\r\nimport com.xiaoniu.qqversionlist.BuildConfig\r\nimport com.xiaoniu.qqversionlist.QverbowApplication\r\nimport com.xiaoniu.qqversionlist.R\r\nimport com.xiaoniu.qqversionlist.util.ClipboardUtil.copyText\r\nimport kotlinx.coroutines.CoroutineScope\r\nimport kotlinx.coroutines.Dispatchers\r\nimport kotlinx.coroutines.launch\r\nimport java.io.FileInputStream\r\nimport java.security.MessageDigest\r\n\r\nobject InfoUtil {\r\n    fun showToast(text: String) {\r\n        CoroutineScope(Dispatchers.Main).launch {\r\n            Toast.makeText(QverbowApplication.instance, text, Toast.LENGTH_SHORT).show()\r\n        }\r\n    }\r\n\r\n    fun showToast(@StringRes textResId: Int) {\r\n        CoroutineScope(Dispatchers.Main).launch {\r\n            Toast.makeText(QverbowApplication.instance, textResId, Toast.LENGTH_SHORT).show()\r\n        }\r\n    }\r\n\r\n    /**\r\n     * 在 Activity 中显示错误对话框\r\n     *\r\n     * 此函数用于在应用程序中向用户显示错误信息对话框它可以在对话框中显示自定义的错误消息，\r\n     * 或者显示从异常对象中获取的堆栈跟踪信息对话框包含一个“完成”按钮和一个“复制”按钮，\r\n     * 用户可以通过“复制”按钮来复制错误信息\r\n     *\r\n     * 如何使用：\r\n     * 1. 将此函数作为 Activity 的一部分进行调用。\r\n     * 2. 传入一个 Exception 实例，通常是在捕获异常时传递。\r\n     * 3. 可选地，设置 `isCustomMessage` 为 `true` 以将其作为自定义错误消息而不显示跟踪堆栈。\r\n     *\r\n     * @param e 异常对象，包含了错误的信息和堆栈跟踪\r\n     * @param isCustomMessage 布尔值，表示是否使用自定义的错误消息（不在前台显示跟踪堆栈），默认为 false\r\n     * @param isShowSystemNotifSetting 布尔值，表示是否显示前往系统通知设置按钮，默认为 false\r\n     */\r\n    fun Context.dialogError(\r\n        e: Exception,\r\n        isCustomMessage: Boolean = false,\r\n        isShowSystemNotifSetting: Boolean = false,\r\n        isShowOfficialRepo: Boolean = false\r\n    ) {\r\n        val activity = findActivity()\r\n        activity?.runOnUiThread {\r\n            val message = if (isCustomMessage) e.message else buildString {\r\n                appendLine(\"如需反馈，请前往 GitHub 仓库报告 Issue(s) 并随附以下信息：\\n\")\r\n                appendLine(e.stackTraceToString())\r\n            }\r\n\r\n            MaterialAlertDialogBuilder(this)\r\n                .setTitle(R.string.applicationError)\r\n                .setIcon(R.drawable.alert_line)\r\n                .setCancelable(false)\r\n                .setNeutralButton(R.string.copy, null)\r\n                .setMessage(message)\r\n                .apply {\r\n                    if (isShowSystemNotifSetting && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\r\n                        setNegativeButton(R.string.done, null)\r\n                        setPositiveButton(R.string.toSystemSetting) { _, _ ->\r\n                            val intent = Intent()\r\n                            intent.action = Settings.ACTION_APP_NOTIFICATION_SETTINGS\r\n                            intent.putExtra(Settings.EXTRA_APP_PACKAGE, packageName)\r\n                            startActivity(intent)\r\n                        }\r\n                    } else if (isShowOfficialRepo) {\r\n                        setNegativeButton(R.string.done, null)\r\n                        setPositiveButton(R.string.toGitHubRelease) { _, _ ->\r\n                            val browserIntent =\r\n                                Intent(\r\n                                    Intent.ACTION_VIEW,\r\n                                    Uri.parse(\"https://github.com/klxiaoniu/QQVersionList/releases\")\r\n                                )\r\n                            browserIntent.apply {\r\n                                addCategory(Intent.CATEGORY_BROWSABLE)\r\n                                flags = Intent.FLAG_ACTIVITY_NEW_TASK\r\n                            }\r\n                            context.startActivity(browserIntent)\r\n                        }\r\n                    } else setPositiveButton(R.string.done, null)\r\n                }\r\n                .create()\r\n                .apply {\r\n                    setOnShowListener {\r\n                        getButton(AlertDialog.BUTTON_NEUTRAL).setOnClickListener {\r\n                            if (isCustomMessage) e.message?.let { it1 -> copyText(it1) }\r\n                            else copyText(e.stackTraceToString())\r\n                        }\r\n                    }\r\n                    show()\r\n                }\r\n        }\r\n    }\r\n\r\n    fun Context.qverbowAboutText(): SpannableString {\r\n        return SpannableString(\r\n            \"${getString(R.string.aboutAppName)}\\n\\n\" +\r\n                    \"${getString(R.string.version)}${BuildConfig.VERSION_NAME} (${BuildConfig.VERSION_CODE})\\n\" +\r\n                    \"${getString(R.string.aboutAuthor)}快乐小牛、有鲫雪狐\\n\" +\r\n                    \"${getString(R.string.aboutContributor)}Col_or、bggRGjQaUbCoE、MinaGe、zwJimRaynor\\n\" +\r\n                    \"${getString(R.string.aboutSpecialThanksTo)}owo233、钟路帆\\n\" +\r\n                    \"${getString(R.string.aboutOpenSourceRepo)}GitHub\\n\" +\r\n                    \"${getString(R.string.aboutGetUpdate)}GitHub Releases、Obtainium\\n\" +\r\n                    \"${getString(R.string.facilitateI18n)}Crowdin\\n\\n\" +\r\n                    \"Since 2023.8.9\"\r\n        ).apply {\r\n            listOf(\r\n                \"https://github.com/klxiaoniu\" to \"快乐小牛\",\r\n                \"https://github.com/ArcticFoxPro\" to \"有鲫雪狐\",\r\n                \"https://github.com/color597\" to \"Col_or\",\r\n                \"https://github.com/bggRGjQaUbCoE\" to \"bggRGjQaUbCoE\",\r\n                \"https://github.com/citmina\" to \"MinaGe\",\r\n                \"https://github.com/zwJimRaynor\" to \"zwJimRaynor\",\r\n                \"https://github.com/callng\" to \"owo233\",\r\n                \"https://github.com/Hill-98\" to \"钟路帆\",\r\n                \"https://github.com/klxiaoniu/QQVersionList\" to \"GitHub\",\r\n                \"https://github.com/klxiaoniu/QQVersionList/releases\" to \"GitHub Releases\",\r\n                \"https://github.com/klxiaoniu/QQVersionList/blob/master/ReadmeAssets/Get-it-on-Obtainium.md\" to \"Obtainium\",\r\n                \"https://crowdin.com/project/qqversionstool\" to \"Crowdin\"\r\n            ).forEach { (url, text) ->\r\n                val start = indexOf(text)\r\n                val end = start + text.length\r\n                setSpan(URLSpan(url), start, end, SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE)\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * 在 `Context` 中查找 `Activity`。\r\n     *\r\n     * 该函数通过不断地获取 `baseContext` 来遍历 `ContextWrapper` 链，直到找到一个 `Activity` 或无法继续遍历。\r\n     * 这种方法用于获取当前上下文相关的 `Activity` 实例，以便执行某些操作。\r\n     *\r\n     * @return 如果找到 `Activity` 则返回该 `Activity` 实例，否则返回null。\r\n     */\r\n    fun Context.findActivity(): Activity? {\r\n        var context = this\r\n        while (context is ContextWrapper) {\r\n            if (context is Activity) return context\r\n            context = context.baseContext\r\n        }\r\n        return null\r\n    }\r\n\r\n    /**\r\n     * 获取 Qverbow 的 SM3 哈希值\r\n     * SM3 是中国国家密码管理局发布的密码杂凑算法，用于生成消息的杂凑值\r\n     * 此函数读取应用程序的源目录，并计算该目录下 APK 文件的 SM3 杂凑值\r\n     *\r\n     * @return 应用程序 APK 文件的 SM3 杂凑值的十六进制字符串表示\r\n     */\r\n    fun Context.getQverbowSM3(): String {\r\n        val appSourceDir = packageManager.getApplicationInfo(packageName, 0).sourceDir\r\n        val messageDigest = MessageDigest.getInstance(\"SM3\")\r\n        val fileInputStream = FileInputStream(appSourceDir)\r\n        val buffer = ByteArray(8192)\r\n        var bytesRead: Int\r\n        while (fileInputStream.read(buffer).also { bytesRead = it } != -1) messageDigest.update(\r\n            buffer, 0, bytesRead\r\n        )\r\n        return messageDigest.digest().joinToString(\"\") { \"%02X\".format(it) }\r\n    }\r\n\r\n    /**\r\n     * 使用 Chrome 自定义标签页打开URL\r\n     *\r\n     * 此函数构建一个 Chrome 自定义标签页的意图，并使用它来打开给定的URL\r\n     * 它利用 Android 的 CustomTabsIntent 功能来实现这一点\r\n     *\r\n     * @param url 要打开的 URL 字符串\r\n     */\r\n    fun Context.openUrlWithChromeCustomTab(url: String){\r\n        val intent = CustomTabsIntent.Builder().build()\r\n        intent.launchUrl(this, Uri.parse(url))\r\n    }\r\n}"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/util/KeyStoreUtil.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.util\n\nimport android.os.Build\nimport android.os.Build.VERSION.SDK_INT\nimport android.security.keystore.KeyGenParameterSpec\nimport android.security.keystore.KeyInfo\nimport android.security.keystore.KeyProperties\nimport android.util.Base64\nimport com.xiaoniu.qqversionlist.util.DataStoreUtil.getStringKV\nimport com.xiaoniu.qqversionlist.util.DataStoreUtil.putStringKVAsync\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Deferred\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.async\nimport java.security.KeyStore\nimport javax.crypto.Cipher\nimport javax.crypto.SecretKeyFactory\nimport javax.crypto.spec.GCMParameterSpec\n\nobject KeyStoreUtil {\n    private const val KEY_ALIAS_USERS_TOKEN = \"Qverbow_Users_Token\"\n    private const val AES_MODE = \"AES/GCM/NoPadding\"\n    private const val KEY_ALGORITHM = \"AES\"\n    private const val GCM_TAG_LENGTH = 128\n    private const val ANDROID_KEY_STORE_PROVIDER = \"AndroidKeyStore\"\n\n    /**\n     * 使用密钥存储加密数据到键值存储中\n     * 当数据为空字符串时，会删除之前存储的加密信息\n     *\n     * @param key 用于存储的键名前缀\n     * @param data 要存储的字符串数据\n     */\n    fun putStringKVwithKeyStore(key: String, data: String) {\n        if (data == \"\") {\n            DataStoreUtil.apply {\n                deleteKV(\"${key}_iv\")\n                deleteKV(\"${key}_cipher\")\n            }\n            return\n        }\n\n        val encryptedData = encryptData(data) ?: return\n        val iv = encryptedData.first\n        val cipherText = encryptedData.second\n\n        putByteArrayKV(\"${key}_iv\", iv)\n        putByteArrayKV(\"${key}_cipher\", cipherText)\n    }\n\n    /**\n     * 异步使用密钥存储加密数据到键值存储中\n     * 当数据为空字符串时，会删除之前存储的加密信息\n     *\n     * @param key 用于存储的键名前缀\n     * @param data 要存储的字符串数据\n     */\n    fun putStringKVwithKeyStoreAsync(key: String, data: String) {\n        if (data == \"\") {\n            DataStoreUtil.apply {\n                deleteKVAsync(\"${key}_iv\")\n                deleteKVAsync(\"${key}_cipher\")\n            }\n            return\n        }\n\n        val encryptedData = encryptData(data) ?: return\n        val iv = encryptedData.first\n        val cipherText = encryptedData.second\n\n        putByteArrayKVAsync(\"${key}_iv\", iv)\n        putByteArrayKVAsync(\"${key}_cipher\", cipherText)\n    }\n\n    /**\n     * 从键值存储中获取使用密钥存储加密的字符串数据\n     * 如果找不到对应的加密信息，则返回 null\n     *\n     * @param key 用于存储的键名前缀\n     * @return 解密后的字符串数据，或者 null\n     */\n    fun getStringKVwithKeyStore(key: String): String? {\n        val iv = getByteArrayKV(\"${key}_iv\", ByteArray(0))\n        val cipherText = getByteArrayKV(\"${key}_cipher\", ByteArray(0))\n\n        return if (iv.isEmpty() || cipherText.isEmpty()) null else decryptData(iv, cipherText)\n    }\n\n    /**\n     * 异步从键值存储中获取使用密钥存储加密的字符串数据\n     * 如果找不到对应的加密信息，则返回 null\n     *\n     * @param key 用于存储的键名前缀\n     * @return 解密后的字符串数据的 Deferred 对象，或者 null\n     */\n    fun getStringKVwithKeyStoreAsync(key: String): Deferred<String?> {\n        val iv = getByteArrayKVAsync(\"${key}_iv\", ByteArray(0))\n        val cipherText = getByteArrayKVAsync(\"${key}_cipher\", ByteArray(0))\n\n        return CoroutineScope(Dispatchers.IO).async {\n            val iv = iv.await()\n            val cipherText = cipherText.await()\n            if (iv.isEmpty() || cipherText.isEmpty()) return@async null else decryptData(\n                iv, cipherText\n            )\n        }\n    }\n\n    private fun generateKey(keyStore: KeyStore) {\n        if (!keyStore.containsAlias(KEY_ALIAS_USERS_TOKEN)) {\n            val keyGenerator =\n                javax.crypto.KeyGenerator.getInstance(KEY_ALGORITHM, ANDROID_KEY_STORE_PROVIDER)\n            val builder = KeyGenParameterSpec.Builder(\n                KEY_ALIAS_USERS_TOKEN,\n                KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT\n            ).setBlockModes(KeyProperties.BLOCK_MODE_GCM)\n                .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)\n                .setUserAuthenticationRequired(false)\n                .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)\n\n            keyGenerator.init(builder.build())\n            keyGenerator.generateKey()\n        }\n    }\n\n    /**\n     * 使用 Android Keystore 的 AES 加密对提供的字符串数据进行加密。\n     *\n     * @param data 要加密的字符串\n     * @return 包含加密数据和初始化向量（IV）的 Pair，如果加密失败则返回 null\n     *\n     * 在以下情况下，此方法可能返回 null：\n     * - KeyStore 初始化失败（KeyStoreException）\n     * - 密钥生成失败（KeyPermanentlyInvalidatedException，InvalidAlgorithmParameterException）\n     * - Cipher 初始化失败（InvalidKeyException，NoSuchAlgorithmException）\n     * - 加密操作失败（BadPaddingException，IllegalBlockSizeException）\n     */\n    private fun encryptData(data: String): Pair<ByteArray, ByteArray>? {\n        val keyStore = KeyStore.getInstance(ANDROID_KEY_STORE_PROVIDER)\n        keyStore.load(null)\n        generateKey(keyStore)\n        val secretKeyEntry =\n            keyStore.getEntry(KEY_ALIAS_USERS_TOKEN, null) as KeyStore.SecretKeyEntry\n        val secretKey = secretKeyEntry.secretKey\n\n        val cipher = Cipher.getInstance(AES_MODE)\n        cipher.init(Cipher.ENCRYPT_MODE, secretKey)\n        val encryptedData = cipher.doFinal(data.toByteArray(Charsets.UTF_8))\n        val iv = cipher.iv\n\n        return Pair(iv, encryptedData)\n    }\n\n\n    private fun decryptData(iv: ByteArray, encryptedData: ByteArray): String? {\n        val keyStore = KeyStore.getInstance(ANDROID_KEY_STORE_PROVIDER)\n        keyStore.load(null)\n        val secretKeyEntry =\n            keyStore.getEntry(KEY_ALIAS_USERS_TOKEN, null) as KeyStore.SecretKeyEntry\n        val secretKey = secretKeyEntry.secretKey\n\n        val cipher = Cipher.getInstance(AES_MODE)\n        val gcmParameterSpec = GCMParameterSpec(GCM_TAG_LENGTH, iv)\n        cipher.init(Cipher.DECRYPT_MODE, secretKey, gcmParameterSpec)\n        return String(cipher.doFinal(encryptedData), Charsets.UTF_8)\n    }\n\n\n    private fun putByteArrayKV(key: String, value: ByteArray) {\n        val base64Encoded = Base64.encodeToString(value, Base64.DEFAULT)\n        DataStoreUtil.putStringKV(key, base64Encoded)\n    }\n\n    private fun getByteArrayKV(key: String, defValue: ByteArray): ByteArray {\n        val base64Encoded = getStringKV(key, \"\")\n        return if (base64Encoded.isEmpty()) defValue else Base64.decode(\n            base64Encoded, Base64.DEFAULT\n        )\n    }\n\n    private fun putByteArrayKVAsync(key: String, value: ByteArray) {\n        val base64Encoded = Base64.encodeToString(value, Base64.DEFAULT)\n        putStringKVAsync(key, base64Encoded)\n    }\n\n    private fun getByteArrayKVAsync(key: String, defValue: ByteArray): Deferred<ByteArray> {\n        return CoroutineScope(Dispatchers.IO).async {\n            val base64Encoded = getStringKV(key, \"\")\n            if (base64Encoded.isEmpty()) defValue else Base64.decode(base64Encoded, Base64.DEFAULT)\n        }\n    }\n\n    /**\n     * 检查硬件安全级别。\n     * 此函数通过与 Android Keystore 系统的交互，评估当前设备上的密钥是否存储在安全的硬件环境中。\n     *\n     * @return Int 返回一个整数，表示硬件的安全级别：\n     *          2：表示密钥存储在 StrongBox 安全元件中\n     *          1：表示密钥存储在可信执行环境（TEE）中\n     *          -1：表示密钥存储在未知的安全硬件中\n     *          0：表示密钥存储仅通过软件实现\n     *          其他值：表示未知或不支持的环境\n     */\n    fun checkHardwareSecurity(): Int {\n        val keyStore = KeyStore.getInstance(ANDROID_KEY_STORE_PROVIDER)\n        keyStore.load(null)\n        generateKey(keyStore)\n        val secretKeyEntry =\n            keyStore.getEntry(KEY_ALIAS_USERS_TOKEN, null) as KeyStore.SecretKeyEntry\n        val secretKey = secretKeyEntry.secretKey\n        val factory = SecretKeyFactory.getInstance(secretKey.algorithm, ANDROID_KEY_STORE_PROVIDER)\n        var keyInfo = factory.getKeySpec(secretKey, KeyInfo::class.java) as KeyInfo\n        return if (SDK_INT >= Build.VERSION_CODES.S) keyInfo.securityLevel else (if (keyInfo.isInsideSecureHardware == true) -1 else 0)\n    }\n}\n\n"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/util/LogUtil.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\r\n\r\n/*\r\n    Qverbow Util\r\n    Copyright (C) 2023 klxiaoniu\r\n\r\n    This program is free software: you can redistribute it and/or modify\r\n    it under the terms of the GNU Affero General Public License as\r\n    published by the Free Software Foundation, either version 3 of the\r\n    License, or (at your option) any later version.\r\n\r\n    This program is distributed in the hope that it will be useful,\r\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n    GNU Affero General Public License for more details.\r\n\r\n    You should have received a copy of the GNU Affero General Public License\r\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\r\n*/\r\n\r\npackage com.xiaoniu.qqversionlist.util\r\n\r\nimport android.util.Log\r\n\r\nobject LogUtil {\r\n    /**\r\n     * 打印对象的日志信息\r\n     *\r\n     * @return 返回调用此函数的对象实例，以便支持链式调用\r\n     */\r\n    fun Any.log(): Any {\r\n        Log.i(\"QQVersionList\", this.toString())\r\n        return this\r\n    }\r\n}"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/util/OSSLicensesObject.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.util\n\nimport com.mikepenz.aboutlibraries.Libs\n\nobject OSSLicensesObject {\n    @Volatile\n    private var _libs: Libs? = null\n\n    var libs: Libs?\n        get() = _libs\n        set(value) {\n            _libs = value\n        }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/util/ShiplyUtil.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.util\n\nimport android.util.Base64\nimport com.google.gson.GsonBuilder\nimport com.google.gson.JsonParser\nimport com.google.gson.Strictness\nimport com.xiaoniu.qqversionlist.QverbowApplication.Companion.ANDROID_QQ_PACKAGE_NAME\nimport com.xiaoniu.qqversionlist.QverbowApplication.Companion.ANDROID_TIM_PACKAGE_NAME\nimport com.xiaoniu.qqversionlist.QverbowApplication.Companion.SHIPLY_APPID_QQ\nimport com.xiaoniu.qqversionlist.QverbowApplication.Companion.SHIPLY_APPID_TIM\nimport com.xiaoniu.qqversionlist.QverbowApplication.Companion.SHIPLY_SIGN_ID_QQ\nimport com.xiaoniu.qqversionlist.QverbowApplication.Companion.SHIPLY_SIGN_ID_TIM\nimport okhttp3.MediaType.Companion.toMediaTypeOrNull\nimport okhttp3.OkHttpClient\nimport okhttp3.Request\nimport okhttp3.RequestBody.Companion.toRequestBody\nimport java.io.IOException\nimport java.io.InputStream\nimport java.io.InputStreamReader\nimport java.math.BigInteger\nimport java.nio.charset.StandardCharsets\nimport java.security.KeyFactory\nimport java.security.MessageDigest\nimport java.security.PublicKey\nimport java.security.SecureRandom\nimport java.security.spec.X509EncodedKeySpec\nimport java.util.UUID\nimport java.util.zip.GZIPInputStream\nimport javax.crypto.Cipher\nimport javax.crypto.spec.IvParameterSpec\nimport javax.crypto.spec.SecretKeySpec\n\nobject ShiplyUtil {\n\n    /**\n     * @param appVersion Android QQ 版本号，如 9.1.30#8538\n     * @param uin QQ 号\n     * @param appid Android QQ 版本 Channel ID，如 `537230561`\n     * @param osVersion 系统 Android 版本（整数表示）\n     * @param model 设备型号\n     * @param sdkVersion Shiply SDK 版本\n     * @param language 系统语言\n     * @param targetApp 目标应用，默认为“QQ”，可选“TIM”\n     * @return 生成的 JSON 字符串\n     **/\n    fun generateJsonString(\n        appVersion: String,\n        uin: String,\n        appid: String,\n        osVersion: String,\n        model: String,\n        sdkVersion: String,\n        language: String,\n        targetApp: String = \"QQ\"\n    ): String {\n        val timestamp = System.currentTimeMillis() / 1000L\n        val appID = if (targetApp == \"QQ\") SHIPLY_APPID_QQ else SHIPLY_APPID_TIM\n        val signID =\n            if (targetApp == \"QQ\") SHIPLY_SIGN_ID_QQ else SHIPLY_SIGN_ID_TIM\n        val bundleId = if (targetApp == \"QQ\") ANDROID_QQ_PACKAGE_NAME else ANDROID_TIM_PACKAGE_NAME\n        val data = mapOf(\n            \"systemID\" to \"10016\",\n            \"appID\" to appID,\n            \"sign\" to BigInteger(\n                1,\n                MessageDigest.getInstance(\"MD5\")\n                    .digest(\"10016$$appID$4$$$timestamp$$uin${\"$\"}rdelivery$signID\".toByteArray())\n            ).toString(16).padStart(32, '0'),\n            \"timestamp\" to timestamp,\n            \"pullType\" to 4,\n            \"target\" to 1,\n            \"pullParams\" to mapOf(\n                \"properties\" to mapOf(\n                    \"platform\" to 2,\n                    \"language\" to language, // Locale.getDefault().language.toString()\n                    \"sdkVersion\" to sdkVersion, // \"1.3.36-RC01\"\n                    \"guid\" to uin,\n                    \"appVersion\" to appVersion,\n                    \"osVersion\" to osVersion, // Build.VERSION.SDK_INT.toString()\n                    \"is64Bit\" to true,\n                    \"bundleId\" to bundleId,\n                    \"uniqueId\" to UUID.randomUUID().toString(),\n                    \"model\" to model // Build.MODEL.toString()\n                ),\n                \"isDebugPackage\" to false,\n                \"customProperties\" to mapOf(\"appid\" to appid) // \"537230561\"\n            ),\n            \"taskChecksum\" to \"0\",\n            \"context\" to \"H4sIAAAAAAAA/+Li5ni5T1WIVaBT1INRS8HS0MwyMdnCwMzQMCklxdQ81cTC1MzIIDnV0DIxydLYGAAAAP//AQAA//+OoFcLLwAAAA==\"\n        )\n        return GsonBuilder().setStrictness(Strictness.LENIENT).create().toJson(data)\n    }\n\n    /**\n     * 从给定的 JSON 字符串中提取加密文本。\n     *\n     * 该函数旨在处理一个特定格式的 JSON 字符串，该字符串预期包含嵌套结构，\n     * 最终目标是提取出“cipher_text”字段的值。如果输入字符串不符合预期格式，\n     * 或者“cipher_text”字段不存在，或者它不是一个原始的 JSON 类型，则函数返回 null。\n     *\n     * @param jsonString 期望格式化的 JSON 字符串。\n     * @return 提取的加密文本字符串，如果提取失败则返回 null。\n     */\n    fun getCipherText(jsonString: String): String? {\n        val json = JsonParser.parseString(jsonString)\n        if (!json.isJsonObject) return null\n\n        val jsonObject = json.asJsonObject\n        val rspList = jsonObject.get(\"rsp_list\")\n        if (rspList == null || !rspList.isJsonObject) return null\n\n        val rspListObj = rspList.asJsonObject\n        val firstEntry = rspListObj.entrySet().firstOrNull()\n        if (firstEntry != null) {\n            val response = firstEntry.value.asJsonObject\n            val cipherText = response.get(\"cipher_text\")\n            if (cipherText != null && cipherText.isJsonPrimitive) return cipherText.asString\n        }\n        return null\n    }\n\n    fun generateAESKey(): ByteArray {\n        val secureRandom = SecureRandom()\n        val key = ByteArray(16)\n        secureRandom.nextBytes(key)\n        return key\n    }\n\n    fun aesEncrypt(data: String, key: ByteArray): ByteArray? {\n        val method = \"AES/CTR/NoPadding\"\n        val iv = ByteArray(16) { 0 }\n        val secretKey = SecretKeySpec(key, \"AES\")\n        val ivParameterSpec = IvParameterSpec(iv)\n\n        try {\n            val dataByteArray = data.toByteArray(StandardCharsets.UTF_8)\n            val cipher = Cipher.getInstance(method)\n            cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec)\n            return cipher.doFinal(dataByteArray)\n        } catch (_: Exception) {\n            return null\n        }\n    }\n\n    fun aesDecrypt(data: ByteArray, key: ByteArray): ByteArray? {\n        val method = \"AES/CTR/NoPadding\"\n        val iv = ByteArray(16) { 0 }\n        val secretKey = SecretKeySpec(key, \"AES\")\n        val ivParameterSpec = IvParameterSpec(iv)\n\n        try {\n            val cipher = Cipher.getInstance(method)\n            cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec)\n            val decryptedData = cipher.doFinal(data)\n            return decryptedData\n        } catch (_: Exception) {\n            return null\n        }\n    }\n\n    fun base64ToRsaPublicKey(base64String: String): PublicKey? {\n        val decodedBytes = Base64.decode(base64String, Base64.NO_WRAP)\n        val spec = X509EncodedKeySpec(decodedBytes)\n        val kf = KeyFactory.getInstance(\"RSA\")\n        return kf.generatePublic(spec)\n    }\n\n    fun rsaEncrypt(data: ByteArray, publicKey: PublicKey): ByteArray? {\n        val cipher = Cipher.getInstance(\"RSA/ECB/PKCS1Padding\")\n        cipher.init(Cipher.ENCRYPT_MODE, publicKey)\n        return cipher.doFinal(data)\n    }\n\n    /**\n     * @param url 请求的 URL 地址\n     * @param data 请求体中的 JSON 数据\n     * @return 服务器的响应内容\n     * @throws IOException 如果网络请求失败或响应体为空时抛出\n     */\n    fun postJsonWithOkHttp(url: String, data: Any): String {\n        val client = OkHttpClient.Builder().build()\n\n        val mediaType = \"application/json; charset=utf-8\".toMediaTypeOrNull()\n        val body = GsonBuilder().setStrictness(Strictness.LENIENT).create().toJson(data)\n        val request = Request.Builder().url(url).post(body.toRequestBody(mediaType!!))\n            .addHeader(\"Content-Type\", \"application/json\").addHeader(\"Accept-Encoding\", \"gzip\")\n            .build()\n\n        return client.newCall(request).execute().use { response ->\n            if (!response.isSuccessful) throw IOException(\"Unexpected code ${response.code} for url: $url\")\n\n            response.body?.let { responseBody ->\n                val input: InputStream = when (response.header(\"Content-Encoding\")) {\n                    \"gzip\" -> GZIPInputStream(responseBody.byteStream())\n                    else -> responseBody.byteStream()\n                }\n\n                InputStreamReader(input, StandardCharsets.UTF_8).use { reader ->\n                    reader.readText()\n                }\n            } ?: throw IOException(\"Response body is null\")\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/util/StringUtil.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\r\n\r\n/*\r\n    Qverbow Util\r\n    Copyright (C) 2023 klxiaoniu\r\n\r\n    This program is free software: you can redistribute it and/or modify\r\n    it under the terms of the GNU Affero General Public License as\r\n    published by the Free Software Foundation, either version 3 of the\r\n    License, or (at your option) any later version.\r\n\r\n    This program is distributed in the hope that it will be useful,\r\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n    GNU Affero General Public License for more details.\r\n\r\n    You should have received a copy of the GNU Affero General Public License\r\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\r\n*/\r\n\r\npackage com.xiaoniu.qqversionlist.util\r\n\r\nimport android.content.Context\r\nimport android.content.pm.PackageInfo\r\nimport com.google.gson.Gson\r\nimport com.google.gson.reflect.TypeToken\r\nimport com.xiaoniu.qqversionlist.util.FileUtil.ZipFileCompat\r\nimport com.xiaoniu.qqversionlist.util.InfoUtil.dialogError\r\nimport kotlinx.serialization.ExperimentalSerializationApi\r\nimport kotlinx.serialization.json.Json\r\nimport kotlinx.serialization.json.JsonArray\r\nimport kotlinx.serialization.json.JsonElement\r\nimport kotlinx.serialization.json.JsonObject\r\nimport kotlinx.serialization.json.JsonPrimitive\r\nimport org.apache.commons.io.IOUtils\r\nimport ws.vinta.pangu.Pangu\r\nimport java.io.File\r\nimport java.nio.charset.Charset\r\n\r\nobject StringUtil {\r\n    @OptIn(ExperimentalSerializationApi::class)\r\n    private val json = Json { isLenient = true; prettyPrint = true; prettyPrintIndent = \"  \" }\r\n\r\n    /**\r\n     * 将当前字符串转换为格式化的 JSON 字符串。\r\n     *\r\n     * 此函数尝试将当前字符串解析为 JSON 元素，并将其格式化为更易读的格式。\r\n     * 如果解析或格式化过程中发生异常，则返回原始字符串。\r\n     *\r\n     * @return 格式化后的 JSON 字符串，如果解析失败则返回原始字符串。\r\n     */\r\n    fun String.toPrettyFormat(): String {\r\n        return try {\r\n            val parsedElement = Json.parseToJsonElement(this)\r\n            val prettyJson = formatJsonElement(parsedElement)\r\n            json.encodeToString(prettyJson)\r\n        } catch (e: Exception) {\r\n            e.printStackTrace()\r\n            this\r\n        }\r\n    }\r\n\r\n    /**\r\n     * 从字符串中提取所有以 `.apk` 结尾的 URL 链接\r\n     *\r\n     * @return 返回一个包含所有提取到的 `.apk` 文件 URL 链接的列表如果未找到任何 `.apk` 链接，则返回 null\r\n     */\r\n    fun String.getAllAPKUrl(): List<String>? {\r\n        val urlPattern =\r\n            \"\"\"(?i)\\b((?:https?://|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:'\".,<>?«»“”‘’]))\"\"\".toRegex()\r\n        val urls = urlPattern.findAll(this).map { it.value }.toList()\r\n        val apkUrls = urls.filter { it.endsWith(\".apk\", ignoreCase = true) }.toSet().toList()\r\n        return if (apkUrls.isEmpty()) null else apkUrls\r\n    }\r\n\r\n    /**\r\n     * 格式化 Json 元素的私有方法\r\n     * 此方法用于递归地格式化 Json 对象、数组和原始类型的元素\r\n     * 对于字符串类型的 Json 原始元素，如果其内容本身就是有效的 Json，也会进行格式化\r\n     *\r\n     * @param element 要格式化的 Json 元素\r\n     * @return 格式化后的 Json 元素\r\n     */\r\n    private fun formatJsonElement(element: JsonElement): JsonElement {\r\n        return when (element) {\r\n            is JsonObject -> JsonObject(element.entries.associate { (key, value) ->\r\n                key to formatJsonElement(value)\r\n            })\r\n\r\n            is JsonArray -> JsonArray(element.map { formatJsonElement(it) })\r\n            is JsonPrimitive -> if (element.isString && element.content.isJson()) formatJsonElement(\r\n                Json.parseToJsonElement(element.content)\r\n            ) else element\r\n        }\r\n    }\r\n\r\n    /**\r\n     * 判断字符串是否为 JSON 格式\r\n     *\r\n     * JSON(JavaScript Object Notation)是一种轻量级的数据交换格式，常见于 Web 服务和客户端之间的数据传输\r\n     * 本函数通过检查字符串是否以左大括号'{'或左方括号'['开始，并以相应的右括号'}'或']'结束，\r\n     * 来简单判断字符串是否为 JSON 格式。这种方法仅适用于格式非常标准且结构简单的JSON字符串的初步判断，\r\n     * **对于复杂的 JSON 结构或包含转义字符的情况则不适用**。\r\n     *\r\n     * @return 如果字符串为 JSON 格式，则返回 true；否则返回 false\r\n     */\r\n    private fun String.isJson(): Boolean {\r\n        return this.startsWith(\"{\") && this.endsWith(\"}\") || this.startsWith(\"[\") && this.endsWith(\"]\")\r\n    }\r\n\r\n    /**\r\n     * 修剪字符串末尾的指定后缀。\r\n     *\r\n     * 该函数接受两个参数：一个原始字符串`str`和一个需要修剪的后缀字符串`suffix`。\r\n     * 如果原始字符串`str`的末尾包含了后缀字符串`suffix`，则将这部分后缀字符串修剪掉；\r\n     * 否则，返回原始字符串`str`。\r\n     *\r\n     * @param str 原始字符串。\r\n     * @param suffix 需要修剪的后缀字符串。\r\n     * @return 修剪掉末尾后缀后的字符串，如果原始字符串没有以该后缀结束，则返回原始字符串。\r\n     */\r\n    fun String.trimSubstringAtEnd(suffix: String): String {\r\n        return if (this.endsWith(suffix)) this.substring(0, this.length - suffix.length) else this\r\n    }\r\n\r\n    /**\r\n     * 修剪字符串开头的指定前缀。\r\n     *\r\n     * 该函数接受两个参数：一个原始字符串 `str` 和一个需要修剪的前缀字符串 `prefix`。\r\n     * 如果原始字符串 `str` 的开头包含了前缀字符串 `prefix` ，则将这部分前缀字符串修剪掉；\r\n     * 否则，返回原始字符串 `str`。\r\n     *\r\n     * @param prefix 需要修剪的前缀字符串。\r\n     * @return 修剪掉开头前缀后的字符串，如果原始字符串没有以该前缀开始，则返回原始字符串。\r\n     */\r\n    fun String.trimSubstringAtStart(prefix: String): String {\r\n        return if (this.startsWith(prefix)) this.substring(prefix.length) else this\r\n    }\r\n\r\n    /**\r\n     * 从给定的 `PackageInfo` 对象中获取 `qua.ini` 文件的内容\r\n     *\r\n     * @param packageInfo 包含应用信息的 `PackageInfo` 对象，用于访问应用的资源\r\n     * @param Context 用于显示错误对话框的 `Context` 对象\r\n     * @return 返回 `qua.ini` 文件的内容作为字符串，如果发生任何错误或文件不存在则返回 null\r\n     */\r\n    fun Context.getQua(packageInfo: PackageInfo): String? {\r\n        val sourceDir = packageInfo.applicationInfo?.sourceDir ?: return null\r\n        val file = File(sourceDir)\r\n        if (!file.exists()) return null\r\n        return runCatching {\r\n            ZipFileCompat(file).use { zipFile ->\r\n                val entry = zipFile.getEntry(\"assets/qua.ini\") ?: return null\r\n                zipFile.getInputStream(entry).use { inputStream ->\r\n                    return IOUtils.toString(inputStream, Charset.defaultCharset())\r\n                }\r\n            }\r\n        }.onFailure { dialogError(Exception(it)) }.getOrElse { null }\r\n    }\r\n\r\n    /**\r\n     * 解析微信测试版配置信息\r\n     * 该函数从给定的响应字符串中提取配置信息，并将其解析为一个包含配置数据的Map\r\n     * 主要处理的是 JSON5 格式的数据，使用 Gson 库进行解析\r\n     *\r\n     * @param jsonString 包含配置信息的响应字符串\r\n     * @return 包含解析后的配置信息的 Map，包括 URL、MD5、版本名称、版本号以及文本列表和最近列表\r\n     */\r\n    fun resolveWeixinAlphaConfig(jsonString: String): Map<String, Any?> {\r\n        val gson = Gson()\r\n        val jsonData = gson.fromJson(jsonString, com.google.gson.JsonObject::class.java)\r\n        val url = jsonData.getAsJsonObject(\"arm64\").getAsJsonPrimitive(\"url\").asString\r\n        val md5 = jsonData.getAsJsonObject(\"arm64\").getAsJsonPrimitive(\"md5\").asString\r\n        val versionName =\r\n            jsonData.getAsJsonObject(\"arm64\").getAsJsonPrimitive(\"versionName\").asString\r\n        val version = jsonData.getAsJsonObject(\"arm64\").getAsJsonPrimitive(\"version\").asString\r\n        val direct = jsonData.getAsJsonObject(\"arm64\").getAsJsonPrimitive(\"direct\").asString\r\n        val textList = jsonData.getAsJsonObject(\"arm64\").getAsJsonArray(\"textList\").asJsonArray\r\n        val recentList = jsonData.getAsJsonObject(\"arm64\").getAsJsonArray(\"recentList\").asJsonArray\r\n        return mapOf(\r\n            \"url\" to url,\r\n            \"md5\" to md5,\r\n            \"versionName\" to versionName,\r\n            \"version\" to version,\r\n            \"direct\" to direct,\r\n            \"textList\" to textList.map { it.asString },\r\n            \"recentList\" to recentList.map { it.asString })\r\n    }\r\n\r\n    /**\r\n     * 将 JsonArray 对象转换为 List<String> 类型列表\r\n     *\r\n     * @param jsonArray 一个包含字符串的 JsonArray 对象\r\n     * @return 返回一个字符串列表，列表中的字符串是从 JsonArray 中解析出来的\r\n     */\r\n    fun jsonArrayToList(jsonArray: com.google.gson.JsonArray): List<String> {\r\n        val gson = Gson()\r\n        val listType = object : TypeToken<List<String>>() {}.type\r\n        return gson.fromJson(jsonArray.toString(), listType)\r\n    }\r\n\r\n    /**\r\n     * 使用 Pangu 库对字符串进行格式化，以在中文和英文字符之间添加空格\r\n     * 这是通过扩展 String 类来实现的，使得任何字符串都可以轻松地应用 Pangu 格式化\r\n     *\r\n     * @return 格式化后的字符串，其中中文和英文字符之间添加了空格\r\n     */\r\n    fun String.pangu(): String {\r\n        return Pangu().spacingText(this)\r\n    }\r\n}\r\n"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/util/VersionUtil.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.util\n\nimport android.content.Context\nimport android.content.pm.PackageManager\nimport android.os.Build\nimport com.google.gson.Gson\nimport com.google.gson.JsonObject\nimport com.xiaoniu.qqversionlist.QverbowApplication.Companion.ANDROID_QQ_PACKAGE_NAME\nimport com.xiaoniu.qqversionlist.QverbowApplication.Companion.ANDROID_TIM_PACKAGE_NAME\nimport com.xiaoniu.qqversionlist.QverbowApplication.Companion.ANDROID_WECHAT_PACKAGE_NAME\nimport com.xiaoniu.qqversionlist.QverbowApplication.Companion.EARLIEST_KUIKLY_FRAMEWORK_QQ_VERSION_STABLE\nimport com.xiaoniu.qqversionlist.QverbowApplication.Companion.EARLIEST_KUIKLY_FRAMEWORK_TIM_VERSION_STABLE\nimport com.xiaoniu.qqversionlist.QverbowApplication.Companion.EARLIEST_QQNT_FRAMEWORK_QQ_VERSION_STABLE\nimport com.xiaoniu.qqversionlist.QverbowApplication.Companion.EARLIEST_QQNT_FRAMEWORK_TIM_VERSION_STABLE\nimport com.xiaoniu.qqversionlist.QverbowApplication.Companion.EARLIEST_UNREAL_ENGINE_QQ_VERSION_STABLE\nimport com.xiaoniu.qqversionlist.data.QQVersionBean\nimport com.xiaoniu.qqversionlist.data.TIMVersionBean\nimport com.xiaoniu.qqversionlist.data.WeixinVersionBean\nimport com.xiaoniu.qqversionlist.ui.MainActivityViewModel\nimport com.xiaoniu.qqversionlist.util.StringUtil.getQua\nimport com.xiaoniu.qqversionlist.util.StringUtil.jsonArrayToList\nimport kotlinx.serialization.json.jsonObject\nimport kotlinx.serialization.json.jsonPrimitive\nimport org.apache.maven.artifact.versioning.ComparableVersion\nimport org.jsoup.Jsoup\nimport kotlinx.serialization.json.Json as KotlinJson\nimport kotlinx.serialization.json.JsonElement as KotlinJsonElement\n\nobject VersionUtil {\n    fun resolveQQRainbow(viewModel: MainActivityViewModel, responseData: String) {\n        val start = (responseData.indexOf(\"versions64\\\":[\")) + 12\n        val end = (responseData.indexOf(\";\\n\" + \"      typeof\"))\n        val totalJson = responseData.substring(start, end)\n        var qqVersion: List<QQVersionBean> = mutableListOf<QQVersionBean>()\n        qqVersion = totalJson.split(\"},{\").reversed().map {\n            val pstart = it.indexOf(\"{\\\"versions\")\n            val pend = it.indexOf(\",\\\"length\")\n            val json = it.substring(pstart, pend)\n            val qqVersionInstall = DataStoreUtil.getStringKV(\"QQVersionInstall\", \"\")\n            KotlinJson.decodeFromString<QQVersionBean>(json).apply {\n                jsonString = json\n                // 标记本机 Android QQ 版本\n                this.apply {\n                    displayInstall =\n                        ComparableVersion(qqVersionInstall) == ComparableVersion(versionNumber)\n                    isAccessibility = false\n                    // 无障碍标记\n                    /*ComparableVersion(versionNumber) >= ComparableVersion(\n                        EARLIEST_ACCESSIBILITY_QQ_VERSION\n                    )*/\n\n                    isQQNTFramework = ComparableVersion(versionNumber) >= ComparableVersion(\n                        EARLIEST_QQNT_FRAMEWORK_QQ_VERSION_STABLE\n                    )\n                    isUnrealEngine = ComparableVersion(versionNumber) >= ComparableVersion(\n                        EARLIEST_UNREAL_ENGINE_QQ_VERSION_STABLE\n                    )\n                    isKuiklyInside = ComparableVersion(versionNumber) >= ComparableVersion(\n                        EARLIEST_KUIKLY_FRAMEWORK_QQ_VERSION_STABLE\n                    )\n                }\n            }\n        }\n        if (DataStoreUtil.getBooleanKV(\"displayFirst\", true)) qqVersion[0].displayType = 1\n        // 舍弃 currentQQVersion = qqVersion.first().versionNumber\n        // 大版本号也放持久化存储了，否则扫版 Shortcut 因为加载过快而获取不到东西\n        DataStoreUtil.putStringKVAsync(\"versionBig\", qqVersion.first().versionNumber)\n        viewModel.setQQVersion(qqVersion)\n    }\n\n    fun resolveTIMRainbow(viewModel: MainActivityViewModel, responseData: String) {\n        val gson = Gson()\n        val jsonData = gson.fromJson(responseData, JsonObject::class.java)\n\n        var timVersion: List<TIMVersionBean> = mutableListOf<TIMVersionBean>()\n\n        val androidLink = jsonData.get(\"download_link\").asJsonObject.get(\"android\").asString\n\n        // 从 `version_history` 项中获取 Android 版本\n        val history = jsonData.getAsJsonArray(\"version_history\")\n        history.forEach { versionItem ->\n            val version = versionItem.asJsonObject.get(\"version_code\").asString\n            val logs = versionItem.asJsonObject.getAsJsonArray(\"logs\")\n            val timVersionInstall = DataStoreUtil.getStringKV(\"TIMVersionInstall\", \"\")\n            logs.forEach { logItem ->\n                val platform = logItem.asJsonObject.get(\"platform\").asString\n                if (platform == \"android\") {\n                    val datetime = logItem.asJsonObject.get(\"datetime\").asString\n                    val fix = logItem.asJsonObject.get(\"fix\").asJsonArray\n                    val feature = logItem.asJsonObject.get(\"feature\").asJsonArray\n\n                    (timVersion as MutableList<TIMVersionBean>).add(\n                        TIMVersionBean(\n                            version = version,\n                            datetime = datetime,\n                            fix = jsonArrayToList(fix),\n                            feature = jsonArrayToList(feature),\n                            jsonString = gson.toJson(JsonObject().apply {\n                                addProperty(\"version_code\", version)\n                                addProperty(\"datetime\", datetime)\n                                addProperty(\"fix\", fix.toString())\n                                addProperty(\"feature\", feature.toString())\n                            }).toString(),\n                            displayInstall = ComparableVersion(timVersionInstall) == ComparableVersion(\n                                version\n                            ),\n                            isQQNTFramework = ComparableVersion(version) >= ComparableVersion(\n                                EARLIEST_QQNT_FRAMEWORK_TIM_VERSION_STABLE\n                            ),\n                            isKuiklyInside = ComparableVersion(version) >= ComparableVersion(\n                                EARLIEST_KUIKLY_FRAMEWORK_TIM_VERSION_STABLE\n                            )\n                        )\n                    )\n                }\n            }\n        }\n\n        timVersion[0].link = androidLink\n        timVersion[0].jsonString = gson.toJson(JsonObject().apply {\n            addProperty(\"version_code\", timVersion[0].version)\n            addProperty(\"datetime\", timVersion[0].datetime)\n            addProperty(\"fix\", timVersion[0].fix.toString())\n            addProperty(\"feature\", timVersion[0].feature.toString())\n            addProperty(\"link\", androidLink)\n        }).toString()\n\n        if (DataStoreUtil.getBooleanKV(\"displayFirst\", true)) timVersion[0].displayType = 1\n        DataStoreUtil.putStringKVAsync(\"TIMVersionBig\", timVersion.first().version)\n        viewModel.setTIMVersion(timVersion)\n    }\n\n    fun resolveWeixinHTML(\n        viewModel: MainActivityViewModel, responseData: String, responseData2: String? = null\n    ) {\n        val document = Jsoup.parse(responseData)\n        val androidSection = document.selectFirst(\"section#android\")\n        val weixinVersion = mutableListOf<WeixinVersionBean>()\n        val weixinVersionInstall = DataStoreUtil.getStringKV(\"WeixinVersionInstall\", \"\")\n        if (androidSection != null) {\n            val versionItems = androidSection.select(\"li.faq_section_sublist_item\")\n\n            for (item in versionItems) {\n                val versionElement = item.selectFirst(\"span.version\")\n                val dateElement = item.selectFirst(\"span:not(.version)\")\n\n                if (versionElement != null && dateElement != null) {\n                    val version = versionElement.text().trim()\n                    val publishDate = dateElement.text().trim().replace(\"(\", \"\").replace(\")\", \"\")\n                    weixinVersion.add(\n                        WeixinVersionBean(\n                            version,\n                            publishDate,\n                            false,\n                            ComparableVersion(weixinVersionInstall) == ComparableVersion(version)\n                        )\n                    )\n                }\n            }\n        }\n\n        if (DataStoreUtil.getBooleanKV(\n                \"displayFirst\", true\n            )\n        ) weixinVersion.first().displayType = 1\n        DataStoreUtil.putStringKVAsync(\"WeixinVersionBig\", weixinVersion.first().version)\n\n        if (responseData2 != null) {\n            val startString = \"var cgiData= {\\\"errCode\\\":0,\\\"errMsg\\\":\\\"ok\\\",\\\"data\\\":\"\n            val startIndex = (responseData2.indexOf(startString))\n            val end = (responseData2.indexOf(\",\\\"isMobile\\\":\"))\n            if (startIndex != -1 && end != -1 && (startIndex + startString.length) < end) {\n                val json = KotlinJson { ignoreUnknownKeys = true }\n                val jsonData: Map<String, KotlinJsonElement> = json.decodeFromString(\n                    responseData2.substring(startIndex + startString.length, end)\n                )\n                weixinVersion.forEach({ versionItem ->\n                    val prodItems = jsonData[\"prodItems\"]?.jsonObject\n                    val andrVersion = prodItems?.get(\"andrVersion\")?.jsonPrimitive?.content\n                    if (andrVersion != null && ComparableVersion(versionItem.version) == ComparableVersion(\n                            andrVersion\n                        )\n                    ) {\n                        val bit64 =\n                            prodItems[\"taskUrl\"]?.jsonObject?.get(\"bit64\")?.jsonPrimitive?.content\n                        if (bit64 != null) versionItem.link = bit64\n                    }\n                })\n            }\n        }\n\n        viewModel.setWeixinVersion(weixinVersion)\n    }\n\n    fun Context.resolveLocalQQ() {\n        // 识别本机 Android QQ 版本并放进持久化存储\n        val QQPackageInfo = packageManager.getPackageInfo(ANDROID_QQ_PACKAGE_NAME, 0)\n        val QQVersionInstall = QQPackageInfo.versionName.toString()\n        val QQVersionCodeInstall =\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) QQPackageInfo.longVersionCode.toString() else \"\"\n        val QQMetaDataInstall = packageManager.getPackageInfo(\n            ANDROID_QQ_PACKAGE_NAME, PackageManager.GET_META_DATA\n        )\n        val QQAppSettingParamsInstall =\n            QQMetaDataInstall.applicationInfo?.metaData?.getString(\"AppSetting_params\")\n        val QQAppSettingParamsPadInstall =\n            QQMetaDataInstall.applicationInfo?.metaData?.getString(\"AppSetting_params_pad\")\n        val QQRdmUUIDInstall =\n            QQMetaDataInstall.applicationInfo?.metaData?.getString(\"com.tencent.rdm.uuid\")\n        val QQTargetInstall = QQMetaDataInstall.applicationInfo?.targetSdkVersion.toString()\n        val QQMinInstall = QQMetaDataInstall.applicationInfo?.minSdkVersion.toString()\n        val QQCompileInstall =\n            (if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) QQMetaDataInstall.applicationInfo?.compileSdkVersion.toString() else \"\")\n        val QQQua = getQua(QQPackageInfo)\n        if (QQVersionInstall != DataStoreUtil.getStringKV(\n                \"QQVersionInstall\", \"\"\n            )\n        ) DataStoreUtil.putStringKV(\"QQVersionInstall\", QQVersionInstall)\n        if (QQVersionCodeInstall != DataStoreUtil.getStringKV(\n                \"QQVersionCodeInstall\", \"\"\n            )\n        ) DataStoreUtil.putStringKV(\"QQVersionCodeInstall\", QQVersionCodeInstall)\n        if (QQAppSettingParamsInstall != null && QQAppSettingParamsInstall != DataStoreUtil.getStringKV(\n                \"QQAppSettingParamsInstall\", \"\"\n            )\n        ) DataStoreUtil.putStringKV(\"QQAppSettingParamsInstall\", QQAppSettingParamsInstall)\n        if (QQAppSettingParamsPadInstall != null && QQAppSettingParamsPadInstall != DataStoreUtil.getStringKV(\n                \"QQAppSettingParamsPadInstall\", \"\"\n            )\n        ) DataStoreUtil.putStringKV(\n            \"QQAppSettingParamsPadInstall\", QQAppSettingParamsPadInstall\n        )\n        if (QQRdmUUIDInstall != null && QQRdmUUIDInstall != DataStoreUtil.getStringKV(\n                \"QQRdmUUIDInstall\", \"\"\n            )\n        ) DataStoreUtil.putStringKV(\"QQRdmUUIDInstall\", QQRdmUUIDInstall)\n        if (QQTargetInstall.isNotEmpty() && QQTargetInstall != DataStoreUtil.getStringKV(\n                \"QQTargetInstall\", \"\"\n            )\n        ) DataStoreUtil.putStringKV(\"QQTargetInstall\", QQTargetInstall)\n        if (QQMinInstall.isNotEmpty() && QQMinInstall != DataStoreUtil.getStringKV(\n                \"QQMinInstall\", \"\"\n            )\n        ) DataStoreUtil.putStringKV(\"QQMinInstall\", QQMinInstall)\n        if (QQCompileInstall.isNotEmpty() && QQCompileInstall != DataStoreUtil.getStringKV(\n                \"QQCompileInstall\", \"\"\n            )\n        ) DataStoreUtil.putStringKV(\"QQCompileInstall\", QQCompileInstall)\n        if (QQQua != null && QQQua.replace(\"\\n\", \"\") != DataStoreUtil.getStringKV(\n                \"QQQua\", \"\"\n            )\n        ) DataStoreUtil.putStringKV(\"QQQua\", QQQua.replace(\"\\n\", \"\"))\n    }\n\n    fun Context.resolveLocalTIM() {\n        // 识别本机 Android TIM 版本并放进持久化存储\n        val TIMPackageInfo = packageManager.getPackageInfo(ANDROID_TIM_PACKAGE_NAME, 0)\n        val TIMVersionInstall = TIMPackageInfo.versionName.toString()\n        val TIMVersionCodeInstall =\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) TIMPackageInfo.longVersionCode.toString() else \"\"\n        val TIMMetaDataInstall = packageManager.getPackageInfo(\n            ANDROID_TIM_PACKAGE_NAME, PackageManager.GET_META_DATA\n        )\n        val TIMAppSettingParamsInstall =\n            TIMMetaDataInstall.applicationInfo?.metaData?.getString(\"AppSetting_params\")\n        val TIMAppSettingParamsPadInstall =\n            TIMMetaDataInstall.applicationInfo?.metaData?.getString(\"AppSetting_params_pad\")\n        val TIMRdmUUIDInstall =\n            TIMMetaDataInstall.applicationInfo?.metaData?.getString(\"com.tencent.rdm.uuid\")\n        val TIMTargetInstall = TIMMetaDataInstall.applicationInfo?.targetSdkVersion.toString()\n        val TIMMinInstall = TIMMetaDataInstall.applicationInfo?.minSdkVersion.toString()\n        val TIMCompileInstall =\n            (if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) TIMMetaDataInstall.applicationInfo?.compileSdkVersion.toString() else \"\")\n        val TIMQua = getQua(TIMPackageInfo)\n        if (TIMTargetInstall.isNotEmpty() && TIMTargetInstall != DataStoreUtil.getStringKV(\n                \"TIMTargetInstall\", \"\"\n            )\n        ) DataStoreUtil.putStringKV(\"TIMTargetInstall\", TIMTargetInstall)\n        if (TIMMinInstall.isNotEmpty() && TIMMinInstall != DataStoreUtil.getStringKV(\n                \"TIMMinInstall\", \"\"\n            )\n        ) DataStoreUtil.putStringKV(\"TIMMinInstall\", TIMMinInstall)\n        if (TIMCompileInstall.isNotEmpty() && TIMCompileInstall != DataStoreUtil.getStringKV(\n                \"TIMCompileInstall\", \"\"\n            )\n        ) DataStoreUtil.putStringKV(\"TIMCompileInstall\", TIMCompileInstall)\n        if (TIMVersionInstall != DataStoreUtil.getStringKV(\n                \"TIMVersionInstall\", \"\"\n            )\n        ) DataStoreUtil.putStringKV(\"TIMVersionInstall\", TIMVersionInstall)\n        if (TIMVersionCodeInstall != DataStoreUtil.getStringKV(\n                \"TIMVersionCodeInstall\", \"\"\n            )\n        ) DataStoreUtil.putStringKV(\"TIMVersionCodeInstall\", TIMVersionCodeInstall)\n        if (TIMAppSettingParamsInstall != null && TIMAppSettingParamsInstall != DataStoreUtil.getStringKV(\n                \"TIMAppSettingParamsInstall\", \"\"\n            )\n        ) DataStoreUtil.putStringKV(\n            \"TIMAppSettingParamsInstall\", TIMAppSettingParamsInstall\n        )\n        if (TIMAppSettingParamsPadInstall != null && TIMAppSettingParamsPadInstall != DataStoreUtil.getStringKV(\n                \"TIMAppSettingParamsPadInstall\", \"\"\n            )\n        ) DataStoreUtil.putStringKV(\n            \"TIMAppSettingParamsPadInstall\", TIMAppSettingParamsPadInstall\n        )\n        if (TIMRdmUUIDInstall != null && TIMRdmUUIDInstall != DataStoreUtil.getStringKV(\n                \"TIMRdmUUIDInstall\", \"\"\n            )\n        ) DataStoreUtil.putStringKV(\"TIMRdmUUIDInstall\", TIMRdmUUIDInstall)\n        if (TIMQua != null && TIMQua.replace(\"\\n\", \"\") != DataStoreUtil.getStringKV(\n                \"TIMQua\", \"\"\n            )\n        ) DataStoreUtil.putStringKV(\"TIMQua\", TIMQua.replace(\"\\n\", \"\"))\n    }\n\n    fun Context.resolveLocalWeixin() {\n        // 识别本机 Android 微信版本并放进持久化存储\n        val weixinPackageInfo = packageManager.getPackageInfo(ANDROID_WECHAT_PACKAGE_NAME, 0)\n        val weixinVersionInstall = weixinPackageInfo.versionName.toString()\n        val weixinVersionCodeInstall =\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) weixinPackageInfo.longVersionCode.toString() else \"\"\n        if (weixinVersionInstall != DataStoreUtil.getStringKV(\n                \"WeixinVersionInstall\", \"\"\n            )\n        ) DataStoreUtil.putStringKV(\"WeixinVersionInstall\", weixinVersionInstall)\n        if (weixinVersionCodeInstall != DataStoreUtil.getStringKV(\n                \"WeixinVersionCodeInstall\", \"\"\n            )\n        ) DataStoreUtil.putStringKV(\"WeixinVersionCodeInstall\", weixinVersionCodeInstall)\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/util/ZhipuSDKUtil.kt",
    "content": "// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/*\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npackage com.xiaoniu.qqversionlist.util\n\nimport com.fasterxml.jackson.databind.ObjectMapper\nimport com.zhipu.oapi.ClientV4\nimport com.zhipu.oapi.Constants\nimport com.zhipu.oapi.service.v4.model.ChatCompletionRequest\nimport com.zhipu.oapi.service.v4.model.ChatMessage\nimport com.zhipu.oapi.service.v4.model.ChatMessageRole\nimport okhttp3.ConnectionPool\nimport java.util.concurrent.TimeUnit\n\nobject ZhipuSDKUtil {\n    const val REQUEST_ID_TEMPLATE = \"request_id_%s\"\n    const val TEMPERATURE = \"temperature\"\n    const val MAX_TOKENS = \"max_tokens\"\n\n    /**\n     * 使用指定的系统提示和问题，通过 Zhipu API 获取回答\n     *\n     * @param systemPrompt 系统提示文本，用于设置对话的背景或规则\n     * @param question 用户提出的问题文本\n     * @param token 访问 Zhipu API 所需的认证令牌\n     * @return Zhipu API 返回的回答内容的字符串表示，如果请求失败则可能返回 null\n     */\n    fun getZhipuWrite(systemPrompt: String, question: String, token: String): String? {\n        val client = ClientV4.Builder(token).networkConfig(300, 100, 100, 100, TimeUnit.SECONDS)\n            .connectionPool(ConnectionPool(8, 1, TimeUnit.SECONDS)).build()\n\n        val messages = ArrayList<ChatMessage>()\n        val systemMessage = ChatMessage(ChatMessageRole.SYSTEM.value(), systemPrompt)\n        val chatMessage = ChatMessage(ChatMessageRole.USER.value(), question)\n        messages.add(systemMessage)\n        messages.add(chatMessage)\n        val requestId = String.format(REQUEST_ID_TEMPLATE, System.currentTimeMillis())\n\n        val extraJson = hashMapOf<String, Any>()\n        extraJson[TEMPERATURE] = 0\n        extraJson[MAX_TOKENS] = 1024\n\n        val chatCompletionRequest =\n            ChatCompletionRequest.builder().model(Constants.ModelChatGLM4Flash).stream(false)\n                .invokeMethod(Constants.invokeMethod).messages(messages).requestId(requestId)\n                .extraJson(extraJson).build()\n\n        val invokeModelApiResp = client.invokeModelApi(chatCompletionRequest)\n        return ObjectMapper().writeValueAsString(invokeModelApiResp)\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/xiaoniu/qqversionlist/util/boundo_LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "app/src/main/res/drawable/accessibility_new_20px.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"20dp\"\n    android:height=\"20dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M479.75,264Q445,264 420.5,239.25Q396,214.5 396,179.75Q396,145 420.75,120.5Q445.5,96 480.25,96Q515,96 539.5,120.75Q564,145.5 564,180.25Q564,215 539.25,239.5Q514.5,264 479.75,264ZM360,852L360,389Q305,385 251.5,373Q198,361 144,347L162,280Q240,301 319.5,312.5Q399,324 480,324Q561,324 640.5,312.5Q720,301 798,280L816,347Q762,361 708.5,373Q655,385 600,389.45L600,852L528,852L519,630L442,630L432,852L360,852Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/accessibility_new_24px.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M480,240Q447,240 423.5,216.5Q400,193 400,160Q400,127 423.5,103.5Q447,80 480,80Q513,80 536.5,103.5Q560,127 560,160Q560,193 536.5,216.5Q513,240 480,240ZM360,880L360,360Q300,355 238,345Q176,335 120,320L140,240Q218,261 306,270.5Q394,280 480,280Q566,280 654,270.5Q742,261 820,240L840,320Q784,335 722,345Q660,355 600,360L600,880L520,880L520,640L440,640L440,880L360,880Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ai_generate_2.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"?attr/colorControlNormal\"\n        android:pathData=\"M20.467,8.694L20.713,8.128C21.153,7.119 21.944,6.316 22.932,5.877L23.692,5.539C24.103,5.357 24.103,4.759 23.692,4.576L22.975,4.257C21.962,3.807 21.156,2.974 20.724,1.931L20.471,1.32C20.294,0.893 19.706,0.893 19.529,1.32L19.276,1.931C18.844,2.974 18.038,3.807 17.025,4.257L16.308,4.576C15.897,4.759 15.897,5.357 16.308,5.539L17.068,5.877C18.056,6.316 18.847,7.119 19.287,8.128L19.533,8.694C19.714,9.108 20.286,9.108 20.467,8.694ZM5.8,16H7.954L8.554,14.5H11.446L12.046,16H14.2L11,8H9L5.8,16ZM10,10.885L10.646,12.5H9.354L10,10.885ZM15,16V8H17V16H15ZM3,3C2.448,3 2,3.448 2,4V20C2,20.552 2.448,21 3,21H21C21.552,21 22,20.552 22,20V11H20V19H4V5H14V3H3Z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/alert_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"?attr/colorControlNormal\"\n        android:pathData=\"M12.8659 3.00017L22.3922 19.5002C22.6684 19.9785 22.5045 20.5901 22.0262 20.8662C21.8742 20.954 21.7017 21.0002 21.5262 21.0002H2.47363C1.92135 21.0002 1.47363 20.5525 1.47363 20.0002C1.47363 19.8246 1.51984 19.6522 1.60761 19.5002L11.1339 3.00017C11.41 2.52187 12.0216 2.358 12.4999 2.63414C12.6519 2.72191 12.7782 2.84815 12.8659 3.00017ZM4.20568 19.0002H19.7941L11.9999 5.50017L4.20568 19.0002ZM10.9999 16.0002H12.9999V18.0002H10.9999V16.0002ZM10.9999 9.00017H12.9999V14.0002H10.9999V9.00017Z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/apps_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:pathData=\"M6.75,2.5C9.097,2.5 11,4.403 11,6.75V11H6.75C4.403,11 2.5,9.097 2.5,6.75C2.5,4.403 4.403,2.5 6.75,2.5ZM9,9V6.75C9,5.507 7.993,4.5 6.75,4.5C5.507,4.5 4.5,5.507 4.5,6.75C4.5,7.993 5.507,9 6.75,9H9ZM6.75,13H11V17.25C11,19.597 9.097,21.5 6.75,21.5C4.403,21.5 2.5,19.597 2.5,17.25C2.5,14.903 4.403,13 6.75,13ZM6.75,15C5.507,15 4.5,16.007 4.5,17.25C4.5,18.493 5.507,19.5 6.75,19.5C7.993,19.5 9,18.493 9,17.25V15H6.75ZM17.25,2.5C19.597,2.5 21.5,4.403 21.5,6.75C21.5,9.097 19.597,11 17.25,11H13V6.75C13,4.403 14.903,2.5 17.25,2.5ZM17.25,9C18.493,9 19.5,7.993 19.5,6.75C19.5,5.507 18.493,4.5 17.25,4.5C16.007,4.5 15,5.507 15,6.75V9H17.25ZM13,13H17.25C19.597,13 21.5,14.903 21.5,17.25C21.5,19.597 19.597,21.5 17.25,21.5C14.903,21.5 13,19.597 13,17.25V13ZM15,15V17.25C15,18.493 16.007,19.5 17.25,19.5C18.493,19.5 19.5,18.493 19.5,17.25C19.5,16.007 18.493,15 17.25,15H15Z\"\n      android:fillColor=\"?attr/colorOnSecondaryContainer\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/arrow_down_s_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n\n    <path\n        android:fillColor=\"?attr/colorControlNormal\"\n        android:pathData=\"M11.9999 13.1714L16.9497 8.22168L18.3639 9.63589L11.9999 15.9999L5.63599 9.63589L7.0502 8.22168L11.9999 13.1714Z\" />\n\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/arrow_left_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"?attr/colorControlNormal\"\n        android:pathData=\"M7.828,11H20V13H7.828L13.192,18.364L11.778,19.778L4,12L11.778,4.222L13.192,5.636L7.828,11Z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/arrow_right_s_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:pathData=\"M13.172,12.001L8.222,7.051L9.636,5.637L16,12.001L9.636,18.365L8.222,16.95L13.172,12.001Z\"\n      android:fillColor=\"?attr/colorControlNormal\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/arrow_up_s_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n\n    <path\n        android:fillColor=\"?attr/colorControlNormal\"\n        android:pathData=\"M11.9999 10.8284L7.0502 15.7782L5.63599 14.364L11.9999 8L18.3639 14.364L16.9497 15.7782L11.9999 10.8284Z\" />\n\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/beacon_official.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    ** 专有代码声明 **\n\n    此矢量图片文件来自腾讯灯塔官方标识矢量图，\n    腾讯灯塔标识商标（如有）和原创权利人为深圳市腾讯计算机系统有限公司和/或其关联公司。\n\n    QQ 版本列表实用工具承诺不将此文件用于或授权任何非权利人用于任何形式的商业用途。\n\n    此矢量图片文件及其代码不受本项目 GNU Affero General Public License Version 3 开源许可约束，\n    未经许可，不得用于任何形式的商业用途或其他未经授权的用途。\n\n    本项目对“QQ”、腾讯灯塔标识、“腾讯灯塔”的使用旨在注明和指向对应主体，\n    并非表示对“QQ”、腾讯灯塔标识、“腾讯灯塔”商标（如有）的注册和拥有。\n\n    此文本如有任何中英文版本之间的差异，以中文版本为准。\n\n    ** Proprietary Code Statement **\n\n    This vector image file was recreated by the Tencent Beacon official logo.\n    Any trademarks of Tencent Beacon logos contained in this file and their original rights belong to 深圳市腾讯计算机系统有限公司 and/or its affiliates.\n\n    The Qverbow Util commits to not using this file for or authorizing any non-right holders to use it for any commercial purposes.\n\n    This vector image file and its code are not subject to the open-source license of this project, the GNU Affero General Public License Version 3.\n    Without permission, it shall not be used for any commercial purposes or other unauthorized uses.\n\n    The use of \"QQ\", the Tencent Beacon logo, and \"Tencent Beacon\" by this project is intended only to refer to the corresponding entities,\n    and does not imply registration or ownership of the trademarks \"QQ\", the Tencent Beacon logo, and \"Tencent Beacon\" (if any).\n\n    In case of any discrepancies between the Chinese and English versions of this text, the Chinese version shall prevail.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"666dp\"\n    android:height=\"634dp\"\n    android:viewportWidth=\"666\"\n    android:viewportHeight=\"634\">\n    <path\n        android:fillColor=\"?attr/colorControlNormal\"\n        android:pathData=\"M0,336.19C0,290.79 8.67,247.24 26.02,205.55C42.95,165.1 66.81,129.4 97.58,98.44C128.35,67.49 163.56,43.55 203.21,26.62C244.51,8.87 287.77,0 333,0C378.23,0 421.28,8.87 462.17,26.62C502.24,43.55 537.65,67.49 568.42,98.44C599.19,129.4 622.84,165.1 639.36,205.55C657.12,247.24 666,290.79 666,336.19L665.38,351.67L664.14,366.53L662.9,380.77L660.42,395.01L657.95,409.87L654.23,424.73L648.65,442.07C644.94,454.04 640.39,465.8 635.02,477.36L630.69,486.64L618.91,508.31L610.86,521.32L601.57,534.32L591.66,547.32L581.12,560.32L568.11,573.94L408.27,516.36L405.18,463.12L97.89,573.94L87.35,563.42L77.44,551.65L66.29,537.41L57.62,525.65L49.56,513.27L41.51,499.03L32.22,481.07L25.4,466.21L19.83,450.11L14.25,433.4C7.64,411.52 3.3,389.23 1.24,366.53L0,351.67L0,336.19ZM275.07,341.15L408.89,291L408.89,263.75L394.02,263.75L387.83,169.65L358.09,141.16L343.22,81.73L330.21,81.11L315.96,141.16L285.61,169.65L280.03,263.75L264.54,263.75L264.54,291L278.17,295.95L275.07,341.15ZM494.39,398.11C512.56,368.39 521.65,335.88 521.65,300.59C521.65,265.3 512.56,232.8 494.39,203.08L473.33,217.32C488.61,242.91 496.25,270.77 496.25,300.9C496.25,331.03 488.61,358.89 473.33,384.49L494.39,398.11ZM265.16,463.12L264.54,471.17L400.84,421.64L395.88,341.15L270.12,386.96L265.16,463.12ZM177.19,300.9C177.19,270.77 185.03,242.91 200.73,217.32L179.05,203.08C161.29,232.8 152.41,265.3 152.41,300.59C152.41,335.88 161.29,368.39 179.05,398.11L200.73,384.49C185.03,358.89 177.19,331.03 177.19,300.9L177.19,300.9ZM117.71,593.14C117.71,593.14 117.92,593.14 118.33,593.14L129.48,602.42L143.11,612.33L156.12,621.62L177.81,634L182.14,632.76C231.29,620.79 281.48,614.81 332.69,614.81C383.9,614.81 434.29,620.79 483.86,632.76L487.57,634L508.64,622.24L521.65,612.95L534.66,603.66L547.67,593.14C478.28,570.43 406.73,559.08 333,559.08C259.27,559.08 187.51,570.43 117.71,593.14L117.71,593.14ZM116.54,588.18L112.14,588.18L116.54,588.18Z\"\n        android:strokeColor=\"#00000000\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/bottom_sheet_drag_handle.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2023 The Android Open Source Project\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~      http://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:shape=\"rectangle\">\n  <size android:height=\"4dp\" android:width=\"32dp\" />\n  <corners android:radius=\"2dp\" />\n  <solid android:color=\"?attr/colorOnSurfaceVariant\" />\n</shape>\n"
  },
  {
    "path": "app/src/main/res/drawable/braces_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:pathData=\"M4,18V14.3C4,13.472 3.328,12.8 2.5,12.8H2V11.2H2.5C3.328,11.2 4,10.528 4,9.7V6C4,4.343 5.343,3 7,3H8V5H7C6.448,5 6,5.448 6,6V10.1C6,10.986 5.424,11.737 4.626,12C5.424,12.263 6,13.014 6,13.9V18C6,18.552 6.448,19 7,19H8V21H7C5.343,21 4,19.657 4,18ZM20,14.3V18C20,19.657 18.657,21 17,21H16V19H17C17.552,19 18,18.552 18,18V13.9C18,13.014 18.576,12.263 19.374,12C18.576,11.737 18,10.986 18,10.1V6C18,5.448 17.552,5 17,5H16V3H17C18.657,3 20,4.343 20,6V9.7C20,10.528 20.672,11.2 21.5,11.2H22V12.8H21.5C20.672,12.8 20,13.472 20,14.3Z\"\n      android:fillColor=\"?attr/colorControlNormal\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/bubble_chart_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"?attr/colorControlNormal\"\n        android:pathData=\"M16,16C17.657,16 19,17.343 19,19C19,20.657 17.657,22 16,22C14.343,22 13,20.657 13,19C13,17.343 14.343,16 16,16ZM6,12C8.209,12 10,13.791 10,16C10,18.209 8.209,20 6,20C3.791,20 2,18.209 2,16C2,13.791 3.791,12 6,12ZM16,18C15.448,18 15,18.448 15,19C15,19.552 15.448,20 16,20C16.552,20 17,19.552 17,19C17,18.448 16.552,18 16,18ZM6,14C4.895,14 4,14.895 4,16C4,17.105 4.895,18 6,18C7.105,18 8,17.105 8,16C8,14.895 7.105,14 6,14ZM14.5,2C17.538,2 20,4.462 20,7.5C20,10.538 17.538,13 14.5,13C11.462,13 9,10.538 9,7.5C9,4.462 11.462,2 14.5,2ZM14.5,4C12.567,4 11,5.567 11,7.5C11,9.433 12.567,11 14.5,11C16.433,11 18,9.433 18,7.5C18,5.567 16.433,4 14.5,4Z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/bugly_official.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    ** 专有代码声明 **\n\n    此矢量图片文件来自 Bugly 官方标识矢量图，\n    Bugly 标识商标（如有）和原创权利人为深圳市腾讯计算机系统有限公司和/或其关联公司。\n\n    QQ 版本列表实用工具承诺不将此文件用于或授权任何非权利人用于任何形式的商业用途。\n\n    此矢量图片文件及其代码不受本项目 GNU Affero General Public License Version 3 开源许可约束，\n    未经许可，不得用于任何形式的商业用途或其他未经授权的用途。\n\n    本项目对“QQ”、Bugly 标识、“Bugly”的使用旨在注明和指向对应主体，\n    并非表示对“QQ”、Bugly 标识、“Bugly”商标（如有）的注册和拥有。\n\n    此文本如有任何中英文版本之间的差异，以中文版本为准。\n\n    ** Proprietary Code Statement **\n\n    This vector image file was recreated by the Bugly official logo.\n    Any trademarks of Bugly logos contained in this file and their original rights belong to 深圳市腾讯计算机系统有限公司 and/or its affiliates.\n\n    The Qverbow Util commits to not using this file for or authorizing any non-right holders to use it for any commercial purposes.\n\n    This vector image file and its code are not subject to the open-source license of this project, the GNU Affero General Public License Version 3.\n    Without permission, it shall not be used for any commercial purposes or other unauthorized uses.\n\n    The use of \"QQ\", the Bugly logo, and \"Bugly\" by this project is intended only to refer to the corresponding entities,\n    and does not imply registration or ownership of the trademarks \"QQ\", the Bugly logo, and \"Bugly\" (if any).\n\n    In case of any discrepancies between the Chinese and English versions of this text, the Chinese version shall prevail.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"60\"\n    android:viewportHeight=\"60\">\n    <path\n        android:fillColor=\"?attr/colorControlNormal\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M20,0C8.954,0 0,8.954 0,20C0,20 0,40 0,40C0,51.045 8.954,60 20,60C20,60 40,60 40,60C51.046,60 60,51.045 60,40C60,40 60,20 60,20C60,8.954 51.046,0 40,0C40,0 20,0 20,0ZM37.348,39.07L34.678,42.39C34.678,42.39 34.242,42.18 34.242,42.18C34.475,40.965 34.708,39.75 34.942,38.535C35.412,36.105 35.881,33.675 36.332,31.248C36.567,30.187 36.674,29.125 36.65,28.085C36.434,25.075 34.963,22.825 32.5,21.257C33.613,20.233 34.689,19.974 35.944,20.164C37.443,20.41 38.965,20.578 40.489,20.747C40.489,20.747 40.498,20.747 40.498,20.747C41.101,20.814 41.703,20.882 42.305,20.952C41.111,19.702 39.819,18.632 38.529,17.562C38.529,17.562 38.528,17.562 38.528,17.562C38.164,17.262 37.801,16.96 37.44,16.655C37.031,16.301 36.777,15.801 36.732,15.262C36.641,12.512 35.13,10.862 32.496,10.518C30.063,10.208 27.571,10.1 25.126,9.994C25.126,9.994 25.12,9.994 25.12,9.994C24.104,9.953 23.088,9.904 22.073,9.847C22.073,9.847 22.94,11.368 22.94,11.368C24.645,12.224 24.85,12.814 24.022,15.097C23.712,15.938 23.538,16.822 23.507,17.717C23.462,19.939 24.542,20.925 26.794,20.959C30.253,21.001 32.355,23.969 31.148,27.282C30.659,28.622 30.068,29.945 29.476,31.266C29.165,31.96 28.854,32.654 28.559,33.35C28.294,33.974 27.967,34.607 27.64,35.24C26.908,36.654 26.177,38.069 26.142,39.388C26.107,40.735 26.762,41.983 27.419,43.234C27.693,43.754 27.966,44.276 28.19,44.804C28.977,46.656 29.776,48.492 30.576,50.328C30.576,50.328 30.612,50.412 30.612,50.412C31.003,51.307 31.393,52.204 31.782,53.102C31.782,53.102 32.209,52.99 32.209,52.99L34.049,43.367L34.537,43.173L35.938,46.514C35.938,46.514 36.307,46.366 36.307,46.366C35.782,44.058 36.275,41.481 37.68,39.183C37.68,39.183 37.348,39.07 37.348,39.07ZM32.267,17.053C32.167,16.956 32.061,16.865 31.951,16.78C31.685,16.566 31.419,16.352 31.379,16.073C31.356,15.903 31.615,15.649 31.961,15.312C32.144,15.134 32.351,14.932 32.552,14.707C32.677,14.913 32.808,15.09 32.925,15.247C32.925,15.247 32.925,15.248 32.925,15.248C33.155,15.558 33.329,15.79 33.277,16.011C33.223,16.245 32.923,16.493 32.626,16.741C32.499,16.845 32.373,16.95 32.266,17.053C32.266,17.053 32.267,17.053 32.267,17.053ZM21.766,46.563C21.766,46.563 21.624,44.151 21.624,44.151C21.472,41.562 21.326,39.09 21.184,36.617C21.184,36.617 21.074,34.714 21.074,34.714C21.074,34.714 21.069,34.636 21.069,34.636C20.932,32.286 20.795,29.936 20.685,27.58C20.579,25.444 21.685,23.752 23.705,22.512C24.595,21.995 25.58,21.715 26.538,21.709C27.495,21.702 28.383,21.969 29.09,22.476C29.854,22.985 30.393,23.769 30.595,24.664C30.807,25.573 30.692,26.576 30.267,27.527C28.287,32.1 26.264,36.674 24.241,41.247C24.241,41.247 23.99,41.815 23.99,41.815C23.399,43.15 22.809,44.485 22.22,45.821C22.081,46.074 21.93,46.321 21.766,46.563C21.766,46.563 21.766,46.563 21.766,46.563Z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/built_with_material_licensed_under_agpl_v3.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"244.03dp\"\n    android:height=\"39.91dp\"\n    android:viewportWidth=\"244.03\"\n    android:viewportHeight=\"39.91\">\n  <path\n      android:pathData=\"M30.97,33.95L28.76,33.95L28.76,16.77L30.97,16.77L36.94,27.23L37.04,27.23L43.01,16.77L45.22,16.77L45.22,33.95L43.01,33.95L43.01,23.75L43.11,20.87L43.01,20.87L37.64,30.3L36.34,30.3L30.97,20.87L30.87,20.87L30.97,23.75L30.97,33.95ZM49.54,30.35C49.54,30.93 49.79,31.41 50.27,31.79C50.76,32.17 51.33,32.37 51.99,32.37C52.92,32.37 53.75,32.02 54.47,31.33C55.2,30.65 55.57,29.84 55.57,28.91C54.88,28.37 53.92,28.09 52.69,28.09C51.79,28.09 51.04,28.31 50.44,28.74C49.84,29.17 49.54,29.71 49.54,30.35L49.54,30.35ZM52.4,21.81C54.03,21.81 55.32,22.24 56.26,23.11C57.21,23.99 57.68,25.18 57.68,26.7L57.68,33.95L55.57,33.95L55.57,32.32L55.47,32.32C54.56,33.66 53.34,34.33 51.82,34.33C50.53,34.33 49.44,33.95 48.57,33.18C47.7,32.41 47.26,31.45 47.26,30.3C47.26,29.09 47.72,28.12 48.64,27.4C49.56,26.68 50.79,26.32 52.33,26.32C53.64,26.32 54.72,26.56 55.57,27.04L55.57,26.53C55.57,25.77 55.26,25.11 54.65,24.58C54.05,24.04 53.33,23.77 52.52,23.77C51.29,23.77 50.31,24.29 49.59,25.33L47.65,24.11C48.72,22.57 50.3,21.81 52.4,21.81L52.4,21.81ZM64.59,34.14C63.63,34.14 62.83,33.85 62.2,33.25C61.57,32.66 61.25,31.84 61.23,30.78L61.23,24.21L59.17,24.21L59.17,22.19L61.23,22.19L61.23,18.59L63.44,18.59L63.44,22.19L66.32,22.19L66.32,24.21L63.44,24.21L63.44,30.06C63.44,30.85 63.59,31.38 63.89,31.66C64.2,31.94 64.54,32.08 64.93,32.08C65.1,32.08 65.27,32.06 65.44,32.02C65.61,31.98 65.77,31.93 65.91,31.86L66.61,33.83C66.03,34.04 65.36,34.14 64.59,34.14L64.59,34.14ZM73.59,34.33C71.86,34.33 70.44,33.74 69.32,32.56C68.2,31.37 67.64,29.88 67.64,28.07C67.64,26.28 68.18,24.79 69.27,23.59C70.36,22.4 71.75,21.81 73.45,21.81C75.19,21.81 76.58,22.37 77.61,23.5C78.64,24.63 79.16,26.21 79.16,28.24L79.13,28.48L69.89,28.48C69.93,29.63 70.31,30.56 71.05,31.26C71.78,31.97 72.66,32.32 73.69,32.32C75.09,32.32 76.2,31.61 77,30.21L78.97,31.17C78.44,32.16 77.71,32.93 76.77,33.49C75.83,34.05 74.77,34.33 73.59,34.33L73.59,34.33ZM70.06,26.65L76.81,26.65C76.74,25.84 76.41,25.16 75.81,24.63C75.21,24.09 74.41,23.82 73.4,23.82C72.57,23.82 71.85,24.08 71.25,24.59C70.65,25.1 70.25,25.79 70.06,26.65L70.06,26.65ZM83.38,33.95L81.17,33.95L81.17,22.19L83.29,22.19L83.29,24.11L83.38,24.11C83.61,23.49 84.07,22.95 84.76,22.51C85.46,22.07 86.14,21.85 86.81,21.85C87.45,21.85 88,21.95 88.45,22.14L87.77,24.28C87.5,24.17 87.07,24.11 86.48,24.11C85.65,24.11 84.92,24.45 84.31,25.12C83.69,25.79 83.38,26.57 83.38,27.47L83.38,33.95ZM92.74,18.13C92.74,18.57 92.59,18.93 92.29,19.24C91.98,19.54 91.61,19.69 91.18,19.69C90.75,19.69 90.38,19.54 90.08,19.24C89.77,18.93 89.62,18.57 89.62,18.13C89.62,17.7 89.77,17.33 90.08,17.03C90.38,16.73 90.75,16.57 91.18,16.57C91.61,16.57 91.98,16.73 92.29,17.03C92.59,17.33 92.74,17.7 92.74,18.13L92.74,18.13ZM92.29,22.19L92.29,33.95L90.08,33.95L90.08,22.19L92.29,22.19ZM96.65,30.35C96.65,30.93 96.9,31.41 97.39,31.79C97.87,32.17 98.45,32.37 99.1,32.37C100.03,32.37 100.86,32.02 101.59,31.33C102.31,30.65 102.68,29.84 102.68,28.91C101.99,28.37 101.03,28.09 99.8,28.09C98.9,28.09 98.15,28.31 97.55,28.74C96.95,29.17 96.65,29.71 96.65,30.35L96.65,30.35ZM99.51,21.81C101.14,21.81 102.43,22.24 103.37,23.11C104.32,23.99 104.79,25.18 104.79,26.7L104.79,33.95L102.68,33.95L102.68,32.32L102.58,32.32C101.67,33.66 100.45,34.33 98.93,34.33C97.64,34.33 96.55,33.95 95.68,33.18C94.81,32.41 94.37,31.45 94.37,30.3C94.37,29.09 94.83,28.12 95.75,27.4C96.67,26.68 97.9,26.32 99.44,26.32C100.75,26.32 101.83,26.56 102.68,27.04L102.68,26.53C102.68,25.77 102.37,25.11 101.77,24.58C101.16,24.04 100.45,23.77 99.63,23.77C98.4,23.77 97.42,24.29 96.7,25.33L94.76,24.11C95.83,22.57 97.41,21.81 99.51,21.81L99.51,21.81ZM109.49,16.77L109.49,33.95L107.29,33.95L107.29,16.77L109.49,16.77Z\"\n      android:fillColor=\"?attr/colorPrimary\"\n      android:strokeColor=\"#00000000\"/>\n  <path\n      android:pathData=\"M2.04,0.46C2.93,0.46 3.61,0.59 4.07,0.86C4.52,1.12 4.75,1.58 4.75,2.23C4.75,2.51 4.7,2.76 4.59,2.97C4.49,3.19 4.34,3.37 4.14,3.52C3.93,3.66 3.68,3.76 3.39,3.81L3.39,3.86C3.69,3.91 3.96,3.99 4.2,4.12C4.45,4.25 4.64,4.43 4.78,4.66C4.92,4.89 4.99,5.2 4.99,5.57C4.99,6 4.89,6.37 4.69,6.68C4.49,6.98 4.2,7.21 3.84,7.36C3.46,7.52 3.02,7.6 2.51,7.6L0,7.6L0,0.46L2.04,0.46ZM2.22,3.5C2.83,3.5 3.25,3.4 3.48,3.2C3.71,3.01 3.82,2.72 3.82,2.33C3.82,1.94 3.68,1.65 3.4,1.49C3.13,1.32 2.69,1.23 2.08,1.23L0.9,1.23L0.9,3.5L2.22,3.5ZM0.9,4.25L0.9,6.84L2.34,6.84C2.97,6.84 3.41,6.72 3.66,6.47C3.91,6.22 4.03,5.9 4.03,5.5C4.03,5.25 3.97,5.03 3.87,4.84C3.76,4.65 3.57,4.51 3.32,4.41C3.06,4.3 2.71,4.25 2.27,4.25L0.9,4.25ZM10.86,2.24L10.86,7.6L10.14,7.6L10.01,6.89L9.97,6.89C9.86,7.08 9.71,7.23 9.53,7.35C9.35,7.47 9.15,7.56 8.94,7.61C8.73,7.67 8.5,7.7 8.27,7.7C7.84,7.7 7.49,7.63 7.2,7.49C6.91,7.36 6.69,7.15 6.54,6.86C6.39,6.57 6.32,6.2 6.32,5.75L6.32,2.24L7.21,2.24L7.21,5.69C7.21,6.12 7.31,6.44 7.5,6.65C7.69,6.86 7.99,6.97 8.4,6.97C8.8,6.97 9.11,6.89 9.35,6.74C9.57,6.59 9.74,6.38 9.84,6.09C9.93,5.8 9.98,5.44 9.98,5.03L9.98,2.24L10.86,2.24ZM13.56,2.24L13.56,7.6L12.56,7.6L12.56,2.24L13.56,2.24ZM13.01,0.23C13.14,0.23 13.26,0.28 13.36,0.37C13.47,0.46 13.52,0.6 13.52,0.79C13.52,0.98 13.47,1.12 13.36,1.21C13.26,1.3 13.14,1.35 13.01,1.35C12.86,1.35 12.74,1.3 12.64,1.21C12.54,1.12 12.49,0.98 12.49,0.79C12.49,0.6 12.54,0.46 12.64,0.37C12.74,0.28 12.86,0.23 13.01,0.23L13.01,0.23ZM16.14,7.6L15.14,7.6L15.14,0L16.14,0L16.14,7.6ZM19.51,6.98C19.64,6.98 19.78,6.97 19.92,6.95C20.06,6.92 20.17,6.9 20.26,6.87L20.26,7.54C20.17,7.59 20.03,7.63 19.86,7.66C19.69,7.68 19.52,7.7 19.36,7.7C19.08,7.7 18.82,7.65 18.58,7.55C18.35,7.46 18.16,7.29 18.01,7.05C17.86,6.81 17.79,6.47 17.79,6.04L17.79,2.92L17.03,2.92L17.03,2.5L17.8,2.15L18.15,1.01L18.67,1.01L18.67,2.24L20.22,2.24L20.22,2.92L18.67,2.92L18.67,6.02C18.67,6.35 18.75,6.59 18.91,6.74C19.06,6.9 19.26,6.98 19.51,6.98L19.51,6.98ZM27.39,4.57C27.35,4.43 27.31,4.29 27.27,4.16C27.23,4.02 27.19,3.89 27.17,3.77C27.14,3.64 27.11,3.53 27.08,3.42C27.05,3.31 27.03,3.22 27.02,3.15L26.98,3.15C26.97,3.22 26.95,3.31 26.92,3.42C26.9,3.53 26.88,3.64 26.84,3.77C26.82,3.9 26.78,4.03 26.75,4.16C26.71,4.3 26.67,4.44 26.62,4.58L25.66,7.59L24.66,7.59L23.19,2.23L24.1,2.23L24.84,5.09C24.89,5.28 24.94,5.48 24.99,5.68C25.04,5.87 25.08,6.06 25.11,6.24C25.15,6.41 25.18,6.56 25.19,6.69L25.23,6.69C25.25,6.61 25.27,6.51 25.3,6.39C25.33,6.27 25.35,6.14 25.39,6.01C25.42,5.88 25.45,5.74 25.49,5.61C25.52,5.48 25.56,5.36 25.59,5.25L26.54,2.23L27.5,2.23L28.42,5.25C28.47,5.4 28.51,5.57 28.57,5.74C28.61,5.91 28.66,6.08 28.7,6.24C28.74,6.41 28.77,6.55 28.78,6.68L28.82,6.68C28.83,6.57 28.86,6.43 28.9,6.26C28.93,6.09 28.98,5.9 29.02,5.7C29.08,5.49 29.13,5.29 29.18,5.09L29.93,2.23L30.83,2.23L29.34,7.59L28.31,7.59L27.39,4.57ZM32.79,2.24L32.79,7.6L31.79,7.6L31.79,2.24L32.79,2.24ZM32.24,0.23C32.37,0.23 32.49,0.28 32.6,0.37C32.7,0.46 32.75,0.6 32.75,0.79C32.75,0.98 32.7,1.12 32.6,1.21C32.49,1.3 32.37,1.35 32.24,1.35C32.09,1.35 31.97,1.3 31.87,1.21C31.77,1.12 31.72,0.98 31.72,0.79C31.72,0.6 31.77,0.46 31.87,0.37C31.97,0.28 32.09,0.23 32.24,0.23L32.24,0.23ZM36.16,6.98C36.29,6.98 36.43,6.97 36.57,6.95C36.71,6.92 36.82,6.9 36.91,6.87L36.91,7.54C36.82,7.59 36.68,7.63 36.51,7.66C36.34,7.68 36.17,7.7 36.01,7.7C35.73,7.7 35.47,7.65 35.24,7.55C35,7.46 34.81,7.29 34.66,7.05C34.51,6.81 34.44,6.47 34.44,6.04L34.44,2.92L33.68,2.92L33.68,2.5L34.45,2.15L34.8,1.01L35.32,1.01L35.32,2.24L36.87,2.24L36.87,2.92L35.32,2.92L35.32,6.02C35.32,6.35 35.4,6.59 35.56,6.74C35.71,6.9 35.91,6.98 36.16,6.98L36.16,6.98ZM38.86,2.23C38.86,2.36 38.85,2.49 38.85,2.62C38.83,2.75 38.82,2.87 38.81,2.98L38.87,2.98C38.98,2.79 39.13,2.64 39.3,2.52C39.47,2.4 39.67,2.31 39.88,2.24C40.09,2.18 40.31,2.15 40.54,2.15C40.97,2.15 41.33,2.22 41.63,2.36C41.92,2.49 42.13,2.7 42.28,2.99C42.43,3.28 42.5,3.65 42.5,4.11L42.5,7.6L41.63,7.6L41.63,4.17C41.63,3.74 41.53,3.41 41.34,3.2C41.15,2.99 40.84,2.88 40.43,2.88C40.03,2.88 39.72,2.95 39.49,3.11C39.26,3.26 39.1,3.47 39.01,3.77C38.91,4.05 38.86,4.41 38.86,4.83L38.86,7.6L37.98,7.6L37.98,0L38.86,0L38.86,2.23Z\"\n      android:fillColor=\"?attr/colorOnSurfaceVariant\"\n      android:strokeColor=\"#00000000\"/>\n  <path\n      android:pathData=\"M11.03,36.31C9.51,36.31 8.08,36.02 6.74,35.45C5.4,34.87 4.23,34.09 3.24,33.1C2.25,32.11 1.47,30.94 0.89,29.6C0.32,28.26 0.03,26.83 0.03,25.31C0.03,23.79 0.32,22.37 0.89,21.03C1.47,19.7 2.25,18.53 3.24,17.53C4.23,16.53 5.4,15.75 6.74,15.17C8.08,14.6 9.51,14.31 11.03,14.31C12.55,14.31 13.97,14.6 15.31,15.17C16.64,15.75 17.81,16.53 18.81,17.53C19.81,18.53 20.59,19.7 21.17,21.03C21.74,22.37 22.03,23.79 22.03,25.31C22.03,26.83 21.74,28.26 21.17,29.6C20.59,30.94 19.81,32.11 18.81,33.1C17.81,34.09 16.64,34.87 15.31,35.45C13.97,36.02 12.55,36.31 11.03,36.31L11.03,36.31ZM4.03,30.96L4.03,19.66C3.4,20.44 2.9,21.31 2.56,22.27C2.2,23.23 2.03,24.24 2.03,25.31C2.03,26.39 2.2,27.41 2.56,28.36C2.9,29.31 3.4,30.18 4.03,30.96L4.03,30.96ZM11.03,34.31C12.1,34.31 13.1,34.13 14.06,33.78C15.01,33.44 15.87,32.95 16.66,32.33L5.38,32.31C6.16,32.94 7.03,33.44 7.98,33.78C8.93,34.13 9.95,34.31 11.03,34.31L11.03,34.31ZM5.36,18.33L16.7,18.33C15.92,17.7 15.05,17.21 14.09,16.85C13.13,16.49 12.11,16.31 11.03,16.31C9.95,16.31 8.93,16.49 7.97,16.85C7.01,17.21 6.14,17.7 5.36,18.33L5.36,18.33ZM6.03,30.31L10.03,30.31L6.03,22.33L6.03,30.31ZM11.06,27.83L14.81,20.31L7.28,20.31L11.06,27.83ZM12.01,30.31L16.03,30.31L16.03,22.28L12.01,30.31ZM18,30.99C18.64,30.2 19.13,29.33 19.49,28.37C19.85,27.41 20.03,26.39 20.03,25.31C20.03,24.24 19.85,23.23 19.5,22.27C19.16,21.31 18.66,20.44 18.03,19.66L18,30.99Z\"\n      android:fillColor=\"?attr/colorPrimary\"\n      android:strokeColor=\"#00000000\"/>\n  <path\n      android:pathData=\"M163.18,28.3C164.01,28.32 164.83,28.06 165.49,27.54C166.11,27.12 166.49,26.41 166.5,25.66L166.5,21.69L158.38,21.69L158.38,23.32L164.88,23.32L164.88,25.65C164.86,25.99 164.63,26.29 164.29,26.4C163.95,26.58 163.57,26.67 163.18,26.67L155.15,26.67C154.73,26.68 154.31,26.57 153.95,26.34L153.96,26.35C153.7,26.21 153.54,25.95 153.52,25.66L153.52,19.34C153.54,19.05 153.7,18.8 153.96,18.67C154.32,18.44 154.75,18.33 155.18,18.34L163.2,18.34C163.57,18.33 163.93,18.41 164.25,18.59C164.6,18.83 164.84,19.2 164.91,19.61L166.54,19.61C166.44,18.75 166.02,17.96 165.36,17.4C164.75,16.92 163.99,16.67 163.22,16.7L155.18,16.7C154.35,16.67 153.53,16.94 152.87,17.45C152.26,17.89 151.89,18.59 151.89,19.34L151.89,25.66C151.89,26.41 152.25,27.12 152.87,27.56C153.52,28.07 154.33,28.33 155.16,28.3L163.18,28.3ZM147.24,25.92L148.73,28.3L150.62,28.3L143.65,17.15C143.52,16.86 143.23,16.69 142.92,16.7C142.6,16.67 142.3,16.86 142.18,17.15Q141.43,18.33 140.6,19.67C140.04,20.57 139.46,21.49 138.87,22.45C138.28,23.4 137.67,24.38 137.06,25.37C136.44,26.36 135.84,27.34 135.24,28.3L137.13,28.3L138.64,25.92L147.24,25.92ZM180.34,23.31C181.17,23.34 181.99,23.07 182.64,22.56L182.64,22.56C183.26,22.13 183.62,21.42 183.62,20.67L183.62,19.34C183.62,18.59 183.24,17.88 182.63,17.45C181.98,16.94 181.17,16.67 180.34,16.7L172.32,16.7C171.48,16.67 170.67,16.94 170.01,17.45C169.4,17.89 169.03,18.59 169.02,19.34L169.02,28.3L170.66,28.3L170.66,23.31L180.34,23.31ZM199.63,27.61C200.23,27.15 200.63,26.46 200.75,25.71L200.48,25.41L199.18,25.41C199.11,25.81 198.87,26.17 198.53,26.4L198.54,26.4C198.22,26.58 197.85,26.68 197.48,26.67L189.44,26.67C189.01,26.68 188.59,26.57 188.23,26.34L188.25,26.35C187.99,26.21 187.82,25.95 187.81,25.66L187.81,16.71L186.15,16.71L186.15,25.66C186.15,26.42 186.52,27.12 187.14,27.56C187.8,28.06 188.61,28.32 189.44,28.3L197.48,28.3C198.25,28.32 199.01,28.08 199.63,27.61ZM181.55,18.67C181.81,18.8 181.98,19.05 182,19.34L182,20.66C181.99,20.96 181.81,21.22 181.55,21.35C181.19,21.57 180.77,21.68 180.34,21.67L170.66,21.67L170.66,19.33C170.67,19 170.88,18.7 171.2,18.59C171.55,18.42 171.92,18.33 172.31,18.34L180.34,18.34C180.77,18.33 181.19,18.44 181.55,18.67ZM146.19,24.28L139.67,24.28L142.67,19.48C142.76,19.33 142.85,19.25 142.93,19.25C143.01,19.25 143.1,19.33 143.2,19.48L146.19,24.28Z\"\n      android:fillColor=\"?attr/colorOnBackground\"\n      android:fillType=\"evenOdd\"\n      android:strokeColor=\"#00000000\"/>\n  <path\n      android:pathData=\"M226.93,1.91L236.69,1.91L221.66,27.21C220.98,28.4 220.13,29.5 219.15,30.47C218.48,31.12 217.72,31.68 216.89,32.13C216.33,32.43 215.73,32.63 215.11,32.73C214.61,32.78 214.26,32.81 214.07,32.81L205.1,32.81L205.1,10.95L213.49,10.95L213.53,25.97L226.93,1.91Z\"\n      android:fillColor=\"#742E68\"\n      android:fillType=\"evenOdd\"\n      android:strokeColor=\"#00000000\"/>\n  <path\n      android:pathData=\"M131.03,32.81L205.1,32.81L205.1,39.91L131.03,39.91L131.03,32.81Z\"\n      android:fillColor=\"#742E68\"\n      android:fillType=\"evenOdd\"\n      android:strokeColor=\"#00000000\"/>\n  <path\n      android:pathData=\"M167.9,37.61C167.7,37.74 167.47,37.81 167.24,37.81L165.18,37.81C164.99,37.83 164.79,37.76 164.67,37.6C164.55,37.45 164.52,37.24 164.6,37.06L165.02,37.06C164.99,37.15 165.02,37.25 165.09,37.32L165.08,37.32C165.16,37.37 165.25,37.39 165.33,37.39L167.4,37.39C167.51,37.39 167.63,37.36 167.73,37.3C167.81,37.27 167.88,37.21 167.91,37.13L168.04,36.79C168.06,36.72 168.04,36.65 167.99,36.61C167.91,36.55 167.81,36.52 167.71,36.53L165.65,36.53C165.46,36.54 165.27,36.47 165.13,36.34C165.01,36.21 164.98,36.01 165.05,35.85L165.18,35.51C165.26,35.3 165.41,35.13 165.61,35.02C165.8,34.9 166.03,34.83 166.27,34.83L168.33,34.83C168.51,34.82 168.69,34.88 168.81,35.01C168.94,35.17 168.98,35.38 168.91,35.57L168.49,35.57C168.51,35.48 168.49,35.38 168.42,35.32L168.43,35.32C168.35,35.27 168.26,35.25 168.18,35.25L166.12,35.25C166,35.25 165.88,35.28 165.77,35.34C165.69,35.37 165.63,35.43 165.6,35.51L165.47,35.85C165.45,35.91 165.47,35.98 165.52,36.02C165.6,36.09 165.7,36.12 165.81,36.11L167.87,36.11C168.06,36.09 168.25,36.16 168.38,36.3C168.5,36.43 168.53,36.62 168.46,36.79L168.34,37.13C168.25,37.34 168.1,37.51 167.9,37.61ZM174.39,37.81L175.02,36.09L175.44,36.09L175.59,35.67L175.17,35.67L175.47,34.83L175.05,34.83L174.74,35.67L174.32,35.67L174.17,36.09L174.59,36.09L173.97,37.81L174.39,37.81ZM151.33,35.32C151.4,35.38 151.42,35.48 151.39,35.58L151.82,35.58C151.88,35.38 151.85,35.17 151.72,35.01C151.59,34.88 151.41,34.82 151.23,34.83L149.18,34.83C148.94,34.83 148.71,34.9 148.51,35.03C148.32,35.13 148.17,35.3 148.09,35.51L147.25,37.81L147.67,37.81L148.14,36.53L149.65,36.53L149.81,36.11L148.29,36.11L148.51,35.51C148.54,35.43 148.61,35.37 148.68,35.34C148.79,35.28 148.91,35.25 149.02,35.25L151.08,35.25C151.17,35.25 151.26,35.27 151.33,35.32L151.33,35.32ZM173.1,36.09L172.48,37.81L172.06,37.81L172.91,35.47C172.98,35.27 173.13,35.1 173.32,34.99C173.52,34.88 173.75,34.82 173.98,34.83L173.83,35.25C173.7,35.26 173.58,35.29 173.47,35.34C173.41,35.36 173.36,35.41 173.33,35.47L173.25,35.67L173.68,35.67L173.53,36.09L173.1,36.09ZM170.57,37.81C170.78,37.8 170.99,37.75 171.17,37.65C171.39,37.55 171.55,37.38 171.64,37.16L171.96,36.3C172.04,36.13 171.98,35.92 171.83,35.81C171.69,35.71 171.52,35.66 171.35,35.66L170.36,35.66C170.14,35.67 169.93,35.72 169.75,35.82C169.53,35.92 169.37,36.09 169.28,36.31L168.97,37.16C168.88,37.33 168.93,37.54 169.08,37.65C169.23,37.76 169.4,37.81 169.58,37.81L170.57,37.81ZM185.08,36.38C185.1,36.28 185.06,36.19 184.98,36.14C184.95,36.12 184.91,36.11 184.88,36.1C184.84,36.09 184.8,36.09 184.76,36.09L183.77,36.09C183.67,36.09 183.57,36.11 183.47,36.15C183.38,36.17 183.31,36.23 183.27,36.31L182.72,37.81L182.3,37.81L183.08,35.67L183.5,35.67L183.47,35.76C183.54,35.73 183.62,35.71 183.7,35.69C183.77,35.68 183.85,35.67 183.92,35.67L184.92,35.67C185.08,35.66 185.24,35.71 185.38,35.81C185.53,35.96 185.58,36.18 185.51,36.38L185.09,36.38L185.08,36.38ZM180.81,37.81C181.02,37.8 181.24,37.75 181.43,37.65C181.64,37.55 181.8,37.38 181.88,37.16L182.2,36.31C182.28,36.14 182.23,35.93 182.07,35.82C181.93,35.71 181.76,35.66 181.59,35.67L180.59,35.67C180.39,35.67 180.2,35.72 180.02,35.82C179.79,35.94 179.6,36.14 179.49,36.38L179.91,36.38C180,36.23 180.15,36.13 180.32,36.1C180.36,36.09 180.4,36.09 180.44,36.09L181.44,36.09C181.52,36.09 181.6,36.11 181.67,36.16C181.75,36.21 181.78,36.26 181.77,36.32L181.66,36.61C181.6,36.58 181.53,36.56 181.46,36.55C181.4,36.53 181.34,36.53 181.28,36.53L180.28,36.53C180.07,36.53 179.86,36.58 179.68,36.68C179.46,36.78 179.29,36.95 179.21,37.17C179.12,37.34 179.17,37.54 179.32,37.66C179.46,37.76 179.64,37.82 179.82,37.81L180.81,37.81ZM154.32,36.14C154.4,36.19 154.44,36.28 154.43,36.38L154.43,36.38L154.43,36.38L154.43,36.38L154.84,36.38C154.92,36.18 154.87,35.96 154.72,35.81C154.58,35.71 154.42,35.66 154.25,35.67L153.26,35.67C153.19,35.67 153.11,35.68 153.04,35.69C152.96,35.71 152.88,35.73 152.81,35.76L152.84,35.67L152.42,35.67L151.64,37.81L152.06,37.81L152.61,36.31C152.65,36.23 152.72,36.17 152.81,36.15C152.91,36.11 153.01,36.09 153.11,36.09L154.1,36.09C154.14,36.09 154.18,36.09 154.22,36.1C154.25,36.11 154.29,36.12 154.32,36.14ZM158.19,36.3C158.1,36.52 157.93,36.69 157.72,36.79C157.53,36.89 157.32,36.95 157.11,36.95L156.12,36.95C156.06,36.95 156,36.94 155.93,36.93C155.86,36.92 155.79,36.89 155.73,36.87L155.62,37.15L155.62,37.16C155.6,37.22 155.64,37.27 155.73,37.32C155.76,37.34 155.8,37.36 155.84,37.37C155.88,37.38 155.92,37.39 155.96,37.39L156.95,37.39C156.99,37.39 157.03,37.38 157.08,37.38C157.12,37.37 157.16,37.36 157.2,37.34C157.32,37.29 157.42,37.21 157.49,37.1L157.9,37.1C157.7,37.52 157.27,37.8 156.8,37.81L155.81,37.81C155.63,37.81 155.47,37.76 155.33,37.66C155.17,37.54 155.11,37.34 155.2,37.16L155.51,36.31C155.59,36.09 155.76,35.92 155.97,35.82C156.16,35.72 156.37,35.67 156.58,35.67L157.58,35.67C157.75,35.66 157.93,35.71 158.07,35.82C158.22,35.93 158.27,36.14 158.19,36.3ZM161.04,36.79C161.25,36.69 161.42,36.52 161.51,36.3L161.51,36.3C161.6,36.14 161.55,35.93 161.4,35.82C161.26,35.71 161.08,35.66 160.9,35.67L159.91,35.67C159.7,35.67 159.48,35.72 159.29,35.82C159.08,35.92 158.92,36.09 158.83,36.31L158.52,37.16C158.44,37.34 158.5,37.54 158.65,37.66C158.79,37.76 158.96,37.81 159.13,37.81L160.13,37.81C160.6,37.8 161.03,37.52 161.23,37.1L160.81,37.1C160.72,37.25 160.57,37.35 160.4,37.38C160.36,37.38 160.32,37.39 160.28,37.39L159.29,37.39C159.25,37.39 159.21,37.38 159.17,37.37C159.13,37.36 159.09,37.34 159.05,37.32C158.97,37.27 158.93,37.22 158.95,37.16L158.95,37.15L159.05,36.87C159.12,36.89 159.19,36.92 159.26,36.93C159.32,36.94 159.38,36.95 159.44,36.95L160.44,36.95C160.65,36.95 160.86,36.89 161.04,36.79ZM188.37,36.79C188.59,36.69 188.76,36.52 188.84,36.3C188.93,36.14 188.88,35.93 188.73,35.82C188.59,35.71 188.41,35.66 188.24,35.67L187.24,35.67C187.03,35.67 186.82,35.72 186.63,35.82C186.42,35.92 186.25,36.09 186.17,36.31L185.86,37.16C185.77,37.34 185.83,37.54 185.99,37.66C186.13,37.76 186.3,37.81 186.47,37.81L187.46,37.81C187.93,37.8 188.36,37.52 188.56,37.1L188.14,37.1C188.05,37.25 187.9,37.35 187.73,37.38C187.69,37.38 187.65,37.39 187.61,37.39L186.62,37.39C186.58,37.39 186.54,37.38 186.5,37.37C186.46,37.36 186.42,37.34 186.38,37.32C186.3,37.27 186.26,37.22 186.28,37.16L186.28,37.15L186.39,36.87C186.45,36.89 186.52,36.92 186.59,36.93C186.65,36.94 186.72,36.95 186.78,36.95L187.77,36.95C187.98,36.95 188.19,36.89 188.37,36.79ZM178.24,37.64C178.06,37.75 177.85,37.81 177.64,37.8C177.52,37.8 177.41,37.79 177.29,37.75C177.19,37.72 177.1,37.67 177.03,37.59C176.9,37.66 176.77,37.72 176.63,37.75C176.51,37.79 176.38,37.81 176.25,37.81C176.07,37.82 175.9,37.76 175.76,37.65C175.64,37.52 175.61,37.32 175.7,37.16L176.24,35.67L176.66,35.67L176.12,37.17C176.09,37.23 176.12,37.3 176.18,37.32C176.26,37.37 176.36,37.39 176.46,37.39C176.58,37.39 176.69,37.37 176.79,37.32C176.87,37.3 176.94,37.24 176.97,37.16L177.31,36.24L177.73,36.24L177.39,37.17C177.38,37.2 177.38,37.23 177.39,37.26C177.4,37.29 177.42,37.31 177.45,37.32C177.54,37.37 177.63,37.39 177.73,37.39C177.85,37.39 177.96,37.37 178.07,37.32C178.14,37.3 178.21,37.24 178.24,37.17L178.78,35.67L179.21,35.67L178.67,37.16C178.59,37.37 178.44,37.54 178.24,37.64ZM171.44,36.14C171.53,36.19 171.56,36.24 171.53,36.3L171.22,37.16C171.18,37.24 171.1,37.3 171.01,37.33C170.92,37.37 170.82,37.39 170.72,37.39L169.73,37.39C169.64,37.39 169.55,37.37 169.48,37.32C169.39,37.28 169.36,37.23 169.39,37.17L169.7,36.3C169.75,36.22 169.82,36.16 169.91,36.14C170,36.1 170.1,36.09 170.2,36.09L171.19,36.09C171.28,36.08 171.37,36.1 171.44,36.14ZM161.03,36.17C161.08,36.19 161.11,36.25 161.09,36.31C161.05,36.38 160.99,36.43 160.92,36.45C160.82,36.5 160.7,36.53 160.59,36.53L159.6,36.53C159.51,36.53 159.42,36.51 159.34,36.47C159.26,36.42 159.23,36.37 159.25,36.31C159.3,36.23 159.37,36.17 159.46,36.15C159.56,36.11 159.66,36.09 159.76,36.09L160.74,36.09C160.84,36.08 160.94,36.11 161.03,36.17ZM157.76,36.31C157.78,36.26 157.75,36.19 157.7,36.17C157.62,36.11 157.52,36.08 157.42,36.09L156.43,36.09C156.33,36.09 156.23,36.11 156.14,36.15C156.05,36.17 155.97,36.23 155.93,36.31C155.91,36.37 155.94,36.42 156.02,36.47C156.1,36.51 156.18,36.53 156.27,36.53L157.26,36.53C157.38,36.53 157.49,36.5 157.6,36.45C157.67,36.43 157.73,36.38 157.76,36.31ZM188.36,36.17C188.41,36.19 188.44,36.25 188.42,36.31C188.39,36.38 188.33,36.43 188.26,36.45C188.15,36.5 188.04,36.53 187.92,36.53L186.93,36.53C186.84,36.53 186.75,36.51 186.68,36.47C186.6,36.42 186.57,36.37 186.59,36.31C186.63,36.23 186.71,36.17 186.8,36.15C186.89,36.11 186.99,36.09 187.09,36.09L188.08,36.09C188.18,36.08 188.28,36.11 188.36,36.17ZM181.37,37.01C181.46,37.05 181.49,37.11 181.46,37.17C181.42,37.25 181.34,37.31 181.25,37.33C181.16,37.37 181.06,37.39 180.96,37.39L179.97,37.39C179.87,37.39 179.77,37.37 179.68,37.31C179.63,37.28 179.61,37.22 179.63,37.17C179.66,37.1 179.72,37.05 179.79,37.02C179.9,36.97 180.01,36.95 180.13,36.95L181.12,36.95C181.21,36.95 181.3,36.97 181.37,37.01Z\"\n      android:fillColor=\"#FFFFFF\"\n      android:fillType=\"evenOdd\"\n      android:strokeColor=\"#00000000\"/>\n  <path\n      android:pathData=\"M244.03,25.65C244.03,26.41 243.65,27.12 243.03,27.55C242.38,28.06 241.57,28.32 240.74,28.29L232.69,28.29C230.97,28.39 229.49,27.1 229.35,25.38L230.98,25.38C231.06,25.79 231.29,26.15 231.62,26.39L231.61,26.39C231.94,26.58 232.31,26.67 232.69,26.66L240.74,26.66C241.16,26.67 241.58,26.56 241.94,26.34C242.2,26.2 242.37,25.94 242.39,25.65L242.39,24.32C242.37,24.03 242.2,23.78 241.94,23.65C241.58,23.42 241.16,23.3 240.73,23.3L236.44,23.3L236.44,21.67L240.74,21.67C241.17,21.68 241.58,21.57 241.94,21.34C242.2,21.2 242.37,20.95 242.39,20.66L242.39,19.33C242.37,19.04 242.2,18.79 241.94,18.66C241.58,18.43 241.16,18.31 240.73,18.32L232.69,18.32C232.32,18.31 231.95,18.4 231.62,18.58L231.64,18.58C231.29,18.81 231.05,19.18 230.98,19.59L229.35,19.59C229.42,18.73 229.85,17.93 230.52,17.38C231.14,16.9 231.9,16.65 232.69,16.68L240.74,16.68C241.57,16.66 242.38,16.92 243.03,17.42C243.65,17.86 244.02,18.57 244.03,19.33C244.03,19.97 244,20.56 243.95,21.1C243.93,21.36 243.84,21.62 243.68,21.83C243.61,21.93 243.53,22.03 243.44,22.14C243.33,22.26 243.22,22.37 243.1,22.48C243.32,22.68 243.52,22.9 243.68,23.15C243.82,23.36 243.92,23.61 243.95,23.86C244.01,24.46 244.03,25.05 244.03,25.65L244.03,25.65Z\"\n      android:fillColor=\"?attr/colorOnBackground\"\n      android:fillType=\"evenOdd\"\n      android:strokeColor=\"#00000000\"/>\n  <path\n      android:pathData=\"M132,7.6L132,0.46L132.9,0.46L132.9,6.8L136.02,6.8L136.02,7.6L132,7.6ZM138.12,2.24L138.12,7.6L137.12,7.6L137.12,2.24L138.12,2.24ZM137.57,0.23C137.7,0.23 137.82,0.28 137.93,0.37C138.03,0.46 138.08,0.6 138.08,0.79C138.08,0.98 138.03,1.12 137.93,1.21C137.82,1.3 137.7,1.35 137.57,1.35C137.42,1.35 137.3,1.3 137.2,1.21C137.1,1.12 137.05,0.98 137.05,0.79C137.05,0.6 137.1,0.46 137.2,0.37C137.3,0.28 137.42,0.23 137.57,0.23L137.57,0.23ZM141.85,7.7C141.38,7.7 140.96,7.6 140.58,7.41C140.21,7.22 139.93,6.92 139.71,6.51C139.51,6.1 139.4,5.58 139.4,4.95C139.4,4.29 139.51,3.75 139.73,3.34C139.95,2.93 140.25,2.62 140.63,2.43C141,2.24 141.43,2.14 141.91,2.14C142.18,2.14 142.45,2.17 142.7,2.22C142.95,2.28 143.16,2.35 143.32,2.43L143.05,3.16C142.89,3.1 142.7,3.04 142.49,2.99C142.28,2.94 142.08,2.91 141.89,2.91C141.53,2.91 141.23,2.99 141,3.14C140.77,3.29 140.59,3.52 140.48,3.82C140.37,4.12 140.31,4.49 140.31,4.94C140.31,5.37 140.37,5.73 140.48,6.03C140.59,6.33 140.76,6.56 140.99,6.71C141.22,6.86 141.5,6.94 141.84,6.94C142.13,6.94 142.39,6.91 142.62,6.85C142.84,6.79 143.04,6.72 143.23,6.63L143.23,7.41C143.05,7.5 142.85,7.57 142.63,7.63C142.42,7.68 142.16,7.7 141.85,7.7L141.85,7.7ZM146.57,2.14C147.03,2.14 147.43,2.24 147.76,2.44C148.08,2.64 148.34,2.92 148.51,3.29C148.69,3.65 148.78,4.07 148.78,4.56L148.78,5.09L145.11,5.09C145.12,5.7 145.28,6.16 145.57,6.47C145.87,6.79 146.29,6.95 146.82,6.95C147.16,6.95 147.46,6.92 147.73,6.86C147.99,6.79 148.26,6.7 148.54,6.58L148.54,7.35C148.27,7.47 148,7.56 147.73,7.61C147.46,7.67 147.15,7.7 146.78,7.7C146.27,7.7 145.82,7.6 145.43,7.39C145.04,7.18 144.74,6.88 144.52,6.47C144.31,6.05 144.2,5.55 144.2,4.96C144.2,4.37 144.3,3.87 144.49,3.45C144.69,3.03 144.97,2.71 145.32,2.48C145.68,2.25 146.1,2.14 146.57,2.14L146.57,2.14ZM146.56,2.86C146.14,2.86 145.81,2.99 145.57,3.27C145.32,3.54 145.18,3.91 145.13,4.39L147.86,4.39C147.86,4.08 147.81,3.82 147.72,3.59C147.63,3.36 147.49,3.18 147.29,3.06C147.1,2.92 146.86,2.86 146.56,2.86L146.56,2.86ZM152.72,2.14C153.36,2.14 153.84,2.3 154.17,2.61C154.5,2.91 154.66,3.42 154.66,4.11L154.66,7.6L153.79,7.6L153.79,4.17C153.79,3.74 153.69,3.41 153.5,3.2C153.31,2.99 153,2.88 152.59,2.88C152,2.88 151.59,3.05 151.36,3.38C151.13,3.71 151.02,4.19 151.02,4.82L151.02,7.6L150.14,7.6L150.14,2.24L150.85,2.24L150.98,2.97L151.03,2.97C151.15,2.78 151.3,2.63 151.48,2.51C151.65,2.38 151.85,2.29 152.06,2.23C152.27,2.17 152.49,2.14 152.72,2.14L152.72,2.14ZM159.81,6.12C159.81,6.47 159.72,6.76 159.55,6.99C159.38,7.22 159.13,7.4 158.81,7.52C158.49,7.64 158.11,7.7 157.67,7.7C157.3,7.7 156.98,7.67 156.71,7.61C156.43,7.55 156.2,7.47 155.99,7.36L155.99,6.56C156.2,6.67 156.46,6.76 156.76,6.86C157.07,6.95 157.38,6.99 157.69,6.99C158.14,6.99 158.46,6.92 158.66,6.78C158.86,6.63 158.96,6.44 158.96,6.2C158.96,6.07 158.92,5.95 158.85,5.84C158.78,5.73 158.65,5.63 158.46,5.52C158.26,5.41 157.99,5.29 157.64,5.16C157.29,5.03 157,4.89 156.75,4.76C156.5,4.63 156.31,4.47 156.18,4.28C156.05,4.09 155.98,3.85 155.98,3.56C155.98,3.11 156.16,2.76 156.54,2.51C156.9,2.26 157.39,2.14 157.99,2.14C158.32,2.14 158.62,2.17 158.9,2.23C159.19,2.3 159.45,2.39 159.7,2.5L159.4,3.2C159.17,3.11 158.94,3.03 158.69,2.96C158.44,2.89 158.19,2.86 157.93,2.86C157.57,2.86 157.29,2.92 157.1,3.04C156.91,3.15 156.82,3.31 156.82,3.51C156.82,3.66 156.86,3.78 156.95,3.88C157.04,3.99 157.18,4.09 157.38,4.18C157.59,4.28 157.86,4.4 158.2,4.53C158.54,4.66 158.83,4.79 159.07,4.92C159.31,5.05 159.49,5.22 159.62,5.41C159.75,5.59 159.81,5.83 159.81,6.12L159.81,6.12ZM163.18,2.14C163.64,2.14 164.04,2.24 164.36,2.44C164.7,2.64 164.95,2.92 165.13,3.29C165.3,3.65 165.39,4.07 165.39,4.56L165.39,5.09L161.72,5.09C161.73,5.7 161.89,6.16 162.18,6.47C162.48,6.79 162.9,6.95 163.43,6.95C163.77,6.95 164.07,6.92 164.33,6.86C164.6,6.79 164.87,6.7 165.15,6.58L165.15,7.35C164.88,7.47 164.61,7.56 164.34,7.61C164.07,7.67 163.76,7.7 163.39,7.7C162.88,7.7 162.43,7.6 162.04,7.39C161.65,7.18 161.35,6.88 161.13,6.47C160.92,6.05 160.81,5.55 160.81,4.96C160.81,4.37 160.91,3.87 161.1,3.45C161.3,3.03 161.58,2.71 161.93,2.48C162.29,2.25 162.71,2.14 163.18,2.14L163.18,2.14ZM163.17,2.86C162.75,2.86 162.42,2.99 162.18,3.27C161.93,3.54 161.79,3.91 161.74,4.39L164.47,4.39C164.47,4.08 164.42,3.82 164.33,3.59C164.24,3.36 164.1,3.18 163.9,3.06C163.71,2.92 163.47,2.86 163.17,2.86L163.17,2.86ZM168.65,7.7C167.98,7.7 167.45,7.47 167.05,7.01C166.65,6.54 166.45,5.85 166.45,4.93C166.45,4.01 166.65,3.32 167.05,2.85C167.46,2.38 167.99,2.14 168.66,2.14C168.94,2.14 169.18,2.17 169.39,2.24C169.6,2.32 169.78,2.41 169.93,2.53C170.08,2.65 170.21,2.78 170.32,2.93L170.38,2.93C170.37,2.84 170.36,2.71 170.35,2.55C170.33,2.38 170.32,2.24 170.32,2.14L170.32,0L171.2,0L171.2,7.6L170.49,7.6L170.36,6.88L170.32,6.88C170.21,7.03 170.08,7.17 169.93,7.3C169.78,7.42 169.6,7.52 169.38,7.59C169.18,7.66 168.93,7.7 168.65,7.7L168.65,7.7ZM168.79,6.97C169.36,6.97 169.76,6.82 169.99,6.51C170.21,6.2 170.33,5.73 170.33,5.1L170.33,4.94C170.33,4.27 170.22,3.76 170,3.4C169.78,3.05 169.37,2.87 168.78,2.87C168.31,2.87 167.95,3.06 167.71,3.43C167.48,3.81 167.36,4.32 167.36,4.95C167.36,5.59 167.48,6.09 167.71,6.44C167.95,6.79 168.31,6.97 168.79,6.97L168.79,6.97ZM179.98,2.24L179.98,7.6L179.26,7.6L179.13,6.89L179.09,6.89C178.98,7.08 178.83,7.23 178.65,7.35C178.47,7.47 178.27,7.56 178.06,7.61C177.85,7.67 177.62,7.7 177.39,7.7C176.96,7.7 176.6,7.63 176.32,7.49C176.02,7.36 175.81,7.15 175.66,6.86C175.51,6.57 175.44,6.2 175.44,5.75L175.44,2.24L176.33,2.24L176.33,5.69C176.33,6.12 176.43,6.44 176.62,6.65C176.81,6.86 177.11,6.97 177.52,6.97C177.92,6.97 178.24,6.89 178.46,6.74C178.7,6.59 178.86,6.38 178.96,6.09C179.05,5.8 179.1,5.44 179.1,5.03L179.1,2.24L179.98,2.24ZM184.26,2.14C184.9,2.14 185.38,2.3 185.71,2.61C186.04,2.91 186.2,3.42 186.2,4.11L186.2,7.6L185.33,7.6L185.33,4.17C185.33,3.74 185.23,3.41 185.04,3.2C184.85,2.99 184.54,2.88 184.13,2.88C183.54,2.88 183.13,3.05 182.9,3.38C182.67,3.71 182.56,4.19 182.56,4.82L182.56,7.6L181.68,7.6L181.68,2.24L182.39,2.24L182.52,2.97L182.57,2.97C182.69,2.78 182.84,2.63 183.01,2.51C183.19,2.38 183.39,2.29 183.6,2.23C183.81,2.17 184.03,2.14 184.26,2.14L184.26,2.14ZM189.76,7.7C189.09,7.7 188.56,7.47 188.16,7.01C187.76,6.54 187.56,5.85 187.56,4.93C187.56,4.01 187.76,3.32 188.16,2.85C188.57,2.38 189.1,2.14 189.77,2.14C190.05,2.14 190.29,2.17 190.5,2.24C190.71,2.32 190.89,2.41 191.04,2.53C191.19,2.65 191.32,2.78 191.43,2.93L191.49,2.93C191.48,2.84 191.47,2.71 191.46,2.55C191.44,2.38 191.43,2.24 191.43,2.14L191.43,0L192.31,0L192.31,7.6L191.6,7.6L191.47,6.88L191.43,6.88C191.32,7.03 191.19,7.17 191.04,7.3C190.89,7.42 190.71,7.52 190.49,7.59C190.29,7.66 190.04,7.7 189.76,7.7L189.76,7.7ZM189.9,6.97C190.47,6.97 190.86,6.82 191.1,6.51C191.32,6.2 191.44,5.73 191.44,5.1L191.44,4.94C191.44,4.27 191.33,3.76 191.11,3.4C190.89,3.05 190.48,2.87 189.89,2.87C189.42,2.87 189.06,3.06 188.82,3.43C188.59,3.81 188.47,4.32 188.47,4.95C188.47,5.59 188.59,6.09 188.82,6.44C189.06,6.79 189.42,6.97 189.9,6.97L189.9,6.97ZM196.08,2.14C196.54,2.14 196.93,2.24 197.26,2.44C197.6,2.64 197.85,2.92 198.02,3.29C198.2,3.65 198.29,4.07 198.29,4.56L198.29,5.09L194.62,5.09C194.63,5.7 194.79,6.16 195.08,6.47C195.38,6.79 195.8,6.95 196.33,6.95C196.67,6.95 196.97,6.92 197.24,6.86C197.5,6.79 197.77,6.7 198.05,6.58L198.05,7.35C197.78,7.47 197.51,7.56 197.24,7.61C196.97,7.67 196.66,7.7 196.29,7.7C195.78,7.7 195.33,7.6 194.95,7.39C194.55,7.18 194.25,6.88 194.04,6.47C193.82,6.05 193.71,5.55 193.71,4.96C193.71,4.37 193.81,3.87 194.01,3.45C194.2,3.03 194.48,2.71 194.83,2.48C195.19,2.25 195.61,2.14 196.08,2.14L196.08,2.14ZM196.07,2.86C195.65,2.86 195.32,2.99 195.07,3.27C194.83,3.54 194.69,3.91 194.64,4.39L197.37,4.39C197.37,4.08 197.32,3.82 197.23,3.59C197.14,3.36 196.99,3.18 196.8,3.06C196.61,2.92 196.37,2.86 196.07,2.86L196.07,2.86ZM202.15,2.14C202.25,2.14 202.36,2.14 202.48,2.15C202.59,2.16 202.69,2.18 202.78,2.2L202.67,3.01C202.58,2.99 202.49,2.97 202.39,2.96C202.28,2.95 202.18,2.94 202.09,2.94C201.88,2.94 201.69,2.98 201.5,3.07C201.31,3.16 201.15,3.28 201,3.43C200.85,3.59 200.74,3.78 200.65,4C200.57,4.22 200.53,4.47 200.53,4.74L200.53,7.6L199.65,7.6L199.65,2.24L200.37,2.24L200.47,3.22L200.51,3.22C200.62,3.02 200.76,2.84 200.92,2.67C201.08,2.51 201.26,2.38 201.47,2.29C201.68,2.19 201.9,2.14 202.15,2.14L202.15,2.14Z\"\n      android:fillColor=\"?attr/colorOnSurfaceVariant\"\n      android:strokeColor=\"#00000000\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/check_circle.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\r\n   Copyright 2018 Remix-Design\r\n\r\n   Licensed under the Apache License, Version 2.0 (the \"License\");\r\n   you may not use this file except in compliance with the License.\r\n   You may obtain a copy of the License at\r\n\r\n       http://www.apache.org/licenses/LICENSE-2.0\r\n\r\n   Unless required by applicable law or agreed to in writing, software\r\n   distributed under the License is distributed on an \"AS IS\" BASIS,\r\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n   See the License for the specific language governing permissions and\r\n   limitations under the License.\r\n-->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n    android:width=\"24dp\"\r\n    android:height=\"24dp\"\r\n    android:viewportWidth=\"24\"\r\n    android:viewportHeight=\"24\">\r\n  <path\r\n      android:pathData=\"M12,21C16.971,21 21,16.971 21,12C21,7.029 16.971,3 12,3C7.029,3 3,7.029 3,12C3,16.971 7.029,21 12,21ZM23,12C23,18.075 18.075,23 12,23C5.925,23 1,18.075 1,12C1,5.925 5.925,1 12,1C18.075,1 23,5.925 23,12ZM10.5,16.414L6.086,12L7.5,10.586L10.5,13.586L16.5,7.586L17.914,9L10.5,16.414Z\"\r\n      android:fillColor=\"?attr/colorControlNormal\"/>\r\n</vector>\r\n"
  },
  {
    "path": "app/src/main/res/drawable/clipboard_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:pathData=\"M7,4V2H17V4H20.007C20.555,4 21,4.445 21,4.993V21.007C21,21.555 20.555,22 20.007,22H3.993C3.445,22 3,21.555 3,21.007V4.993C3,4.445 3.445,4 3.993,4H7ZM7,6H5V20H19V6H17V8H7V6ZM9,4V6H15V4H9Z\"\n      android:fillColor=\"?attr/colorControlNormal\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/compose.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   https://www.jetbrains.com/compose-multiplatform/\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"55dp\"\n    android:height=\"60dp\"\n    android:viewportWidth=\"55\"\n    android:viewportHeight=\"60\">\n    <path\n        android:fillColor=\"?attr/colorControlNormal\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M29.188,2.16a4.062,4.062 0,0 0,-4.052 0L3.649,14.527a4.047,4.047 0,0 0,-0.97 0.78l9.006,5.162c0.217,-0.235 0.47,-0.438 0.754,-0.604l13.1,-7.574a3.243,3.243 0,0 1,1.623 -0.436c0.57,0 1.13,0.15 1.623,0.436l13.1,7.574c0.284,0.165 0.537,0.37 0.755,0.604l9.006,-5.162a4.046,4.046 0,0 0,-0.971 -0.78L29.188,2.16ZM52.478,16.7 L43.41,21.896c0.062,0.251 0.094,0.512 0.094,0.777v14.428a3.244,3.244 0,0 1,-0.425 1.605,3.236 3.236,0 0,1 -1.163,1.184l-13.163,7.815a3.241,3.241 0,0 1,-0.78 0.334v10.24a4.056,4.056 0,0 0,1.158 -0.461l21.584,-12.754a4.043,4.043 0,0 0,1.456 -1.477,4.05 4.05,0 0,0 0.532,-2.005L52.703,18.031c0,-0.46 -0.079,-0.91 -0.226,-1.331ZM1.621,18.03c0,-0.46 0.078,-0.908 0.225,-1.33l9.067,5.196a3.267,3.267 0,0 0,-0.094 0.777v15.108a3.243,3.243 0,0 0,1.687 2.845l13.033,7.135c0.26,0.141 0.532,0.245 0.811,0.312L26.35,58.32a4.06,4.06 0,0 1,-1.23 -0.432L3.732,46.233a4.043,4.043 0,0 1,-1.542 -1.485,4.044 4.044,0 0,1 -0.568,-2.065L1.622,18.031ZM24.326,0.76a5.687,5.687 0,0 1,5.672 0l21.487,12.367a5.66,5.66 0,0 1,2.84 4.905v23.552a5.66,5.66 0,0 1,-0.746 2.805,5.66 5.66,0 0,1 -2.038,2.067L29.957,59.21a5.686,5.686 0,0 1,-2.794 0.79,5.687 5.687,0 0,1 -2.82,-0.693L2.956,47.653a5.66,5.66 0,0 1,-2.16 -2.08A5.66,5.66 0,0 1,0 42.683L0,18.03a5.66,5.66 0,0 1,2.84 -4.905L24.325,0.759ZM17.35,23.1l8.58,-4.955a2.469,2.469 0,0 1,2.465 0l8.58,4.954a2.43,2.43 0,0 1,1.218 2.103v9.448A2.43,2.43 0,0 1,37 36.738l-8.63,5.114a2.468,2.468 0,0 1,-1.214 0.344,2.468 2.468,0 0,1 -1.225,-0.302l-8.53,-4.662a2.43,2.43 0,0 1,-0.927 -0.89,2.43 2.43,0 0,1 -0.342,-1.24v-9.901a2.43,2.43 0,0 1,1.219 -2.103Z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/download_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:pathData=\"M3 19H21V21H3V19ZM13 13.1716L19.0711 7.1005L20.4853 8.51472L12 17L3.51472 8.51472L4.92893 7.1005L11 13.1716V2H13V13.1716Z\"\n      android:fillColor=\"?attr/colorControlNormal\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/error_warning_fill.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"?attr/colorPrimary\"\n        android:pathData=\"M12,22C6.477,22 2,17.523 2,12C2,6.477 6.477,2 12,2C17.523,2 22,6.477 22,12C22,17.523 17.523,22 12,22ZM11,15V17H13V15H11ZM11,7V13H13V7H11Z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/file_copy_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:pathData=\"M7,6V3C7,2.448 7.448,2 8,2H20C20.552,2 21,2.448 21,3V17C21,17.552 20.552,18 20,18H17V20.999C17,21.552 16.55,22 15.993,22H4.007C3.451,22 3,21.555 3,20.999L3.003,7.001C3.003,6.448 3.453,6 4.009,6H7ZM5.002,8L5,20H15V8H5.002ZM9,6H17V16H19V4H9V6ZM7,11H13V13H7V11ZM7,15H13V17H7V15Z\"\n      android:fillColor=\"?attr/colorControlNormal\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/file_text_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:pathData=\"M21 8V20.9932C21 21.5501 20.5552 22 20.0066 22H3.9934C3.44495 22 3 21.556 3 21.0082V2.9918C3 2.45531 3.4487 2 4.00221 2H14.9968L21 8ZM19 9H14V4H5V20H19V9ZM8 7H11V9H8V7ZM8 11H16V13H8V11ZM8 15H16V17H8V15Z\"\n      android:fillColor=\"?attr/colorControlNormal\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/flashlight_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"?attr/colorControlNormal\"\n        android:pathData=\"M13,9H21L11,24V15H4L13,0V9ZM11,11V7.221L7.532,13H13V17.394L17.263,11H11Z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/flask_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:pathData=\"M15.999,2V4H14.999V7.243C14.999,8.401 15.251,9.544 15.736,10.595L20.017,19.871C20.364,20.624 20.036,21.515 19.284,21.862C19.087,21.953 18.872,22 18.655,22H5.344C4.515,22 3.844,21.328 3.844,20.5C3.844,20.283 3.891,20.069 3.982,19.871L8.263,10.595C8.748,9.544 8.999,8.401 8.999,7.243V4H7.999V2H15.999ZM13.387,10.001H10.611C10.507,10.364 10.382,10.722 10.237,11.072L10.079,11.434L6.124,20H17.873L13.92,11.434C13.705,10.969 13.528,10.49 13.387,10.001ZM10.999,7.243C10.999,7.496 10.99,7.749 10.971,8.001H13.028C13.019,7.88 13.012,7.759 13.007,7.637L12.999,7.243V4H10.999V7.243Z\"\n      android:fillColor=\"?attr/colorControlNormal\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/flutter_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:pathData=\"M14.598,10.684H17.426L11.769,16.342L17.426,21.998H14.598L8.941,16.341L14.598,10.684ZM14.404,2.004H17.233L5.919,13.318L4.505,11.904L14.404,2.004Z\"\n      android:fillColor=\"?attr/colorControlNormal\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/git_commit_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:pathData=\"M15.874,13C15.43,14.725 13.864,16 12,16C10.136,16 8.57,14.725 8.126,13H3V11H8.126C8.57,9.275 10.136,8 12,8C13.864,8 15.43,9.275 15.874,11H21V13H15.874ZM12,14C13.105,14 14,13.105 14,12C14,10.895 13.105,10 12,10C10.895,10 10,10.895 10,12C10,13.105 10.895,14 12,14Z\"\n      android:fillColor=\"?attr/colorOnSurface\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/git_repository_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"?attr/colorControlNormal\"\n        android:pathData=\"M13,21V23.5L10,21.5L7,23.5V21H6.5C4.567,21 3,19.433 3,17.5V5C3,3.343 4.343,2 6,2H20C20.552,2 21,2.448 21,3V20C21,20.552 20.552,21 20,21H13ZM13,19H19V16H6.5C5.672,16 5,16.672 5,17.5C5,18.328 5.672,19 6.5,19H7V17H13V19ZM19,14V4H6V14.035C6.163,14.012 6.33,14 6.5,14H19ZM7,5H9V7H7V5ZM7,8H9V10H7V8ZM7,11H9V13H7V11Z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/github_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"?attr/colorControlNormal\"\n        android:pathData=\"M5.884,18.653C5.584,18.453 5.326,18.198 5.024,17.837C4.915,17.706 4.473,17.152 4.558,17.258C4.095,16.683 3.803,16.417 3.502,16.309C2.982,16.122 2.711,15.55 2.898,15.03C3.084,14.51 3.657,14.24 4.177,14.426C4.929,14.696 5.438,15.161 6.124,16.014C6.03,15.897 6.464,16.441 6.557,16.553C6.748,16.78 6.887,16.918 6.996,16.991C7.201,17.128 7.585,17.187 8.147,17.131C8.171,16.749 8.241,16.378 8.349,16.036C5.381,15.31 3.701,13.395 3.701,9.64C3.701,8.401 4.07,7.284 4.759,6.348C4.542,5.454 4.574,4.373 5.061,3.156C5.173,2.877 5.404,2.663 5.69,2.574C5.772,2.55 5.818,2.539 5.899,2.527C6.702,2.403 7.836,2.697 9.314,3.623C10.181,3.419 11.089,3.315 12.001,3.315C12.913,3.315 13.82,3.419 14.685,3.623C16.162,2.69 17.299,2.396 18.107,2.527C18.192,2.54 18.264,2.558 18.325,2.578C18.606,2.67 18.832,2.882 18.941,3.156C19.428,4.373 19.461,5.453 19.243,6.347C19.934,7.283 20.301,8.392 20.301,9.64C20.301,13.397 18.627,15.305 15.659,16.032C15.784,16.447 15.85,16.91 15.85,17.412C15.85,18.076 15.847,18.711 15.842,19.423C15.841,19.613 15.84,19.816 15.837,20.128C16.213,20.211 16.523,20.508 16.603,20.909C16.711,21.45 16.36,21.977 15.819,22.086C14.679,22.313 13.835,21.554 13.835,20.561C13.835,20.471 13.836,20.342 13.837,20.115C13.84,19.802 13.841,19.599 13.842,19.409C13.847,18.702 13.85,18.072 13.85,17.412C13.85,16.715 13.666,16.26 13.424,16.051C12.763,15.481 13.098,14.397 13.965,14.3C16.931,13.967 18.301,12.818 18.301,9.64C18.301,8.685 17.989,7.896 17.388,7.236C17.13,6.952 17.057,6.547 17.199,6.191C17.365,5.777 17.435,5.234 17.294,4.577L17.285,4.58C16.793,4.719 16.174,5.02 15.426,5.529C15.182,5.694 14.877,5.744 14.593,5.664C13.773,5.433 12.891,5.315 12.001,5.315C11.111,5.315 10.229,5.433 9.409,5.664C9.127,5.744 8.823,5.695 8.58,5.531C7.827,5.024 7.206,4.724 6.711,4.584C6.567,5.237 6.638,5.778 6.803,6.191C6.946,6.547 6.872,6.952 6.614,7.236C6.017,7.891 5.701,8.694 5.701,9.64C5.701,12.812 7.072,13.968 10.023,14.3C10.888,14.397 11.225,15.477 10.568,16.048C10.375,16.216 10.138,16.78 10.138,17.412V20.561C10.138,21.547 9.304,22.287 8.179,22.09C7.635,21.995 7.271,21.477 7.366,20.933C7.438,20.52 7.753,20.212 8.138,20.128V19.138C7.228,19.199 6.477,19.05 5.884,18.653Z\"\n        tools:ignore=\"VectorPath\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/gitlab_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"?attr/colorControlNormal\"\n        android:pathData=\"M5.544,2.673C5.816,2.5 6.136,2.416 6.458,2.433C6.781,2.451 7.091,2.568 7.343,2.77L7.344,2.771C7.59,2.969 7.77,3.237 7.859,3.54L9.305,7.968H14.694L16.141,3.54C16.23,3.237 16.409,2.969 16.656,2.771L16.66,2.767C16.913,2.568 17.221,2.451 17.542,2.434C17.864,2.417 18.183,2.5 18.455,2.672L18.457,2.673C18.731,2.847 18.943,3.103 19.062,3.405L19.066,3.415L21.539,9.866C21.962,10.971 22.014,12.184 21.687,13.321C21.359,14.457 20.671,15.457 19.726,16.169L12.995,21.233L12.995,21.234C12.707,21.451 12.355,21.569 11.994,21.569C11.633,21.569 11.282,21.451 10.994,21.234L4.263,16.168C3.321,15.456 2.635,14.457 2.31,13.322C1.984,12.187 2.036,10.977 2.457,9.874L4.937,3.405C5.057,3.103 5.27,2.847 5.544,2.673ZM6.355,4.736L4.16,10.464C3.88,11.201 3.823,12.068 4.04,12.826C4.257,13.581 4.711,14.246 5.335,14.722L11.994,19.733L18.648,14.726C19.279,14.25 19.738,13.582 19.956,12.823C20.175,12.062 20.115,11.185 19.833,10.446L17.644,4.736L16,9.768H8L6.355,4.736Z\"\n        tools:ignore=\"VectorPath\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/hippy_official.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    ** 专有代码声明 **\n\n    此矢量图片文件来自 Hippy 官方标识矢量图，\n    Hippy 标识商标（如有）和原创权利人为深圳市腾讯计算机系统有限公司和/或其关联公司。\n\n    QQ 版本列表实用工具承诺不将此文件用于或授权任何非权利人用于任何形式的商业用途。\n\n    此矢量图片文件及其代码不受本项目 GNU Affero General Public License Version 3 开源许可约束，\n    未经许可，不得用于任何形式的商业用途或其他未经授权的用途。\n\n    本项目对“QQ”、Hippy 标识、“Hippy”的使用旨在注明和指向对应主体，\n    并非表示对“QQ”、Hippy 标识、“Hippy”商标（如有）的注册和拥有。\n\n    此文本如有任何中英文版本之间的差异，以中文版本为准。\n\n    ** Proprietary Code Statement **\n\n    This vector image file was recreated by the Hippy official logo.\n    Any trademarks of Hippy logos contained in this file and their original rights belong to 深圳市腾讯计算机系统有限公司 and/or its affiliates.\n\n    The Qverbow Util commits to not using this file for or authorizing any non-right holders to use it for any commercial purposes.\n\n    This vector image file and its code are not subject to the open-source license of this project, the GNU Affero General Public License Version 3.\n    Without permission, it shall not be used for any commercial purposes or other unauthorized uses.\n\n    The use of \"QQ\", the Hippy logo, and \"Hippy\" by this project is intended only to refer to the corresponding entities,\n    and does not imply registration or ownership of the trademarks \"QQ\", the Hippy logo, and \"Hippy\" (if any).\n\n    In case of any discrepancies between the Chinese and English versions of this text, the Chinese version shall prevail.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"60.001\"\n    android:viewportHeight=\"59.861\">\n    <path\n        android:fillColor=\"?attr/colorControlNormal\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M24.016,42.532C24.315,52.113 32.291,59.859 42.002,59.859C51.902,59.859 60.001,51.813 60.001,41.976L60.001,17.884C60.001,8.048 51.902,0 42.002,0C37.43,0 33.245,1.717 30.063,4.534C33.671,7.788 35.967,12.46 36.001,17.646C36.134,14.517 38.826,11.918 42.002,11.918C45.257,11.918 48.009,14.65 48.009,17.887L48.009,41.978C48.009,45.212 45.259,47.946 42.002,47.946C38.745,47.946 35.995,45.214 35.995,41.978L35.988,41.712C35.914,38.485 33.26,35.892 29.997,35.892C26.685,35.892 24,38.561 24,41.85C24,41.956 24.002,42.064 24.009,42.169C24.009,42.182 24.009,42.194 24.009,42.207L24,42.207C23.872,45.34 21.178,47.941 18,47.941C14.745,47.941 11.993,45.21 11.993,41.974L11.993,17.884C11.993,14.648 14.743,11.916 18,11.916C21.257,11.916 24.007,14.648 24.007,17.884L24.007,18.15C24.082,21.376 26.742,23.97 30.007,23.97C33.318,23.97 36.004,21.302 36.004,18.012C36.004,17.905 36.001,17.797 35.995,17.692C35.888,7.943 27.834,0 18,0C8.099,0 0,8.048 0,17.884L0,41.978C0,51.814 8.099,59.861 18,59.861C22.572,59.861 26.757,58.145 29.939,55.327C26.406,52.14 24.142,47.588 24.016,42.532Z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n    <path\n        android:fillColor=\"#A0F2DF\"\n        android:pathData=\"M0,0h108v108h-108z\" />\n\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_launcher_foreground.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    ** 专有代码声明 **\n    此矢量图片文件由 QQ 版本列表实用工具原创绘制。\n    此矢量图片文件及其代码不受本项目 GNU Affero General Public License Version 3 开源许可约束，\n    未经许可，不得用于任何形式的商业与非商业用途或其他未经授权的用途。\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"326\"\n    android:viewportHeight=\"204\">\n    <group\n        android:scaleX=\"0.45\"\n        android:scaleY=\"0.28159508\"\n        android:translateX=\"89.65\"\n        android:translateY=\"73.2773\">\n        <group>\n            <clip-path android:pathData=\"M0,0h326v204h-326z\" />\n            <path\n                android:fillColor=\"#00201B\"\n                android:fillType=\"evenOdd\"\n                android:pathData=\"M177.88,30.37L273.33,30.37L208.05,143.27L164.4,67.77L164.39,67.78L125.21,0L107.48,0C94.88,0.31 82.72,2.89 71.02,7.73C58.51,12.9 47.47,20.27 37.9,29.83C28.33,39.39 20.95,50.41 15.77,62.9C10.59,75.39 8,88.39 8,101.91C8,115.43 10.59,128.44 15.77,140.93C20.95,153.42 28.33,164.44 37.9,174C47.47,183.56 58.51,190.93 71.02,196.1C83.53,201.27 96.55,203.86 110.09,203.86L172.85,203.86L155.29,173.49L110.09,173.49C100.58,173.49 91.44,171.68 82.66,168.04C73.88,164.41 66.13,159.24 59.4,152.53C52.68,145.82 47.5,138.07 43.87,129.31C40.23,120.54 38.41,111.41 38.41,101.91C38.41,92.42 40.23,83.29 43.87,74.52C47.5,65.75 52.68,58.01 59.4,51.3C66.13,44.59 73.88,39.42 82.66,35.78C90.69,32.46 99.03,30.66 107.67,30.37L190.41,173.49L190.41,173.49L207.96,203.86L207.97,203.86L208.05,204L326,0L160.32,0L177.88,30.37L177.88,30.37Z\"\n                android:strokeColor=\"#00000000\" />\n        </group>\n    </group>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_launcher_foreground_splash.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    ** 专有代码声明 **\n    此矢量图片文件由 QQ 版本列表实用工具原创绘制。\n    此矢量图片文件及其代码不受本项目 GNU Affero General Public License Version 3 开源许可约束，\n    未经许可，不得用于任何形式的商业与非商业用途或其他未经授权的用途。\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"326\"\n    android:viewportHeight=\"204\">\n    <group\n        android:scaleX=\"0.45\"\n        android:scaleY=\"0.28159508\"\n        android:translateX=\"89.65\"\n        android:translateY=\"73.2773\">\n        <group>\n            <clip-path android:pathData=\"M0,0h326v204h-326z\" />\n            <path\n                android:fillColor=\"?attr/colorOnPrimaryContainer\"\n                android:fillType=\"evenOdd\"\n                android:pathData=\"M177.88,30.37L273.33,30.37L208.05,143.27L164.4,67.77L164.39,67.78L125.21,0L107.48,0C94.88,0.31 82.72,2.89 71.02,7.73C58.51,12.9 47.47,20.27 37.9,29.83C28.33,39.39 20.95,50.41 15.77,62.9C10.59,75.39 8,88.39 8,101.91C8,115.43 10.59,128.44 15.77,140.93C20.95,153.42 28.33,164.44 37.9,174C47.47,183.56 58.51,190.93 71.02,196.1C83.53,201.27 96.55,203.86 110.09,203.86L172.85,203.86L155.29,173.49L110.09,173.49C100.58,173.49 91.44,171.68 82.66,168.04C73.88,164.41 66.13,159.24 59.4,152.53C52.68,145.82 47.5,138.07 43.87,129.31C40.23,120.54 38.41,111.41 38.41,101.91C38.41,92.42 40.23,83.29 43.87,74.52C47.5,65.75 52.68,58.01 59.4,51.3C66.13,44.59 73.88,39.42 82.66,35.78C90.69,32.46 99.03,30.66 107.67,30.37L190.41,173.49L190.41,173.49L207.96,203.86L207.97,203.86L208.05,204L326,0L160.32,0L177.88,30.37L177.88,30.37Z\"\n                android:strokeColor=\"#00000000\" />\n        </group>\n    </group>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_launcher_special_foreground.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"326\"\n    android:viewportHeight=\"204\">\n  <group android:scaleX=\"0.45\"\n      android:scaleY=\"0.28159508\"\n      android:translateX=\"89.65\"\n      android:translateY=\"73.2773\">\n    <path\n        android:pathData=\"M0,0h326v204h-326z\"\n        android:fillColor=\"#FFFFFF\"\n        android:fillAlpha=\"0\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M177.88,30.37L273.33,30.37L208.05,143.27L164.4,67.77L164.39,67.78L125.21,0L107.48,0C94.88,0.31 82.72,2.89 71.02,7.73C58.51,12.9 47.47,20.27 37.9,29.83C28.33,39.39 20.95,50.41 15.77,62.9C10.59,75.39 8,88.39 8,101.91C8,115.43 10.59,128.44 15.77,140.93C20.95,153.42 28.33,164.44 37.9,174C47.47,183.56 58.51,190.93 71.02,196.1C83.53,201.27 96.55,203.86 110.09,203.86L172.85,203.86L155.29,173.49L110.09,173.49C100.58,173.49 91.44,171.68 82.66,168.04C73.88,164.41 66.13,159.24 59.4,152.53C52.68,145.82 47.5,138.07 43.87,129.31C40.23,120.54 38.41,111.41 38.41,101.91C38.41,92.42 40.23,83.29 43.87,74.52C47.5,65.75 52.68,58.01 59.4,51.3C66.13,44.59 73.88,39.42 82.66,35.78C90.69,32.46 99.03,30.66 107.67,30.37L190.41,173.49L190.41,173.49L207.96,203.86L207.97,203.86L208.05,204L326,0L160.32,0L177.88,30.37L177.88,30.37Z\"\n        android:fillColor=\"#F2F3FF\"\n        android:fillAlpha=\"0.749\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M208.63,203L325.42,1L326,0L160.32,0L160.9,1L177.88,30.37L273.33,30.37L272.75,31.37L208.63,142.27L208.05,143.27L207.48,142.27L164.9,68.64L164.4,67.77L164.39,67.78L163.89,66.91L125.21,0L107.48,0C94.88,0.31 82.72,2.89 71.02,7.73Q52.26,15.49 37.9,29.83Q23.54,44.17 15.77,62.9C10.59,75.39 8,88.39 8,101.91C8,115.43 10.59,128.44 15.77,140.93Q23.54,159.66 37.9,174C47.47,183.56 58.51,190.93 71.02,196.1C83.53,201.27 96.55,203.86 110.09,203.86L172.85,203.86L172.27,202.86L155.29,173.49L110.09,173.49C100.58,173.49 91.44,171.68 82.66,168.04C73.88,164.41 66.13,159.24 59.4,152.53C52.68,145.82 47.5,138.07 43.87,129.31C40.23,120.54 38.41,111.41 38.41,101.91C38.41,92.42 40.23,83.29 43.87,74.52C47.5,65.75 52.68,58.01 59.4,51.3C66.13,44.59 73.88,39.42 82.66,35.78C90.69,32.46 99.03,30.66 107.67,30.37L189.84,172.49L190.41,173.49L190.41,173.49L190.41,173.49L190.41,173.5L190.99,174.49L207.47,203.01L207.96,203.86L207.97,203.86L208.05,204L208.22,203.71L208.63,203.01L208.63,203ZM208.05,202.01L324.27,1L162.06,1L178.46,29.37L275.06,29.37L208.05,145.26L164.04,69.14L164.03,69.14L124.63,1L107.5,1Q88.78,1.46 71.4,8.65Q52.83,16.34 38.61,30.53Q24.39,44.73 16.69,63.28Q9,81.83 9,101.91Q9,121.99 16.69,140.54Q24.39,159.09 38.61,173.29Q52.83,187.49 71.4,195.18Q89.98,202.86 110.09,202.86L171.12,202.86L154.72,174.49L110.09,174.49Q95.63,174.49 82.28,168.97Q68.92,163.44 58.7,153.24Q48.48,143.03 42.94,129.69Q37.41,116.35 37.41,101.91Q37.41,87.48 42.94,74.14Q48.47,60.8 58.7,50.59Q68.92,40.38 82.28,34.86Q94.49,29.81 107.64,29.37L108.23,29.35L192.15,174.49L192.14,174.49L208.05,202.01Z\"\n        android:fillColor=\"#F2F3FF\"\n        android:fillType=\"evenOdd\"\n        android:fillAlpha=\"0.749\"/>\n  </group>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/info_card_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"?attr/colorControlNormal\"\n        android:pathData=\"M3,6H21V18H3V6ZM2,4C1.448,4 1,4.448 1,5V19C1,19.552 1.448,20 2,20H22C22.552,20 23,19.552 23,19V5C23,4.448 22.552,4 22,4H2ZM13,9H19V11H13V9ZM18,13H13V15H18V13ZM6,13H7V16H9V11H6V13ZM9,8H7V10H9V8Z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/information_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\r\n   Copyright 2018 Remix-Design\r\n\r\n   Licensed under the Apache License, Version 2.0 (the \"License\");\r\n   you may not use this file except in compliance with the License.\r\n   You may obtain a copy of the License at\r\n\r\n       http://www.apache.org/licenses/LICENSE-2.0\r\n\r\n   Unless required by applicable law or agreed to in writing, software\r\n   distributed under the License is distributed on an \"AS IS\" BASIS,\r\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n   See the License for the specific language governing permissions and\r\n   limitations under the License.\r\n-->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n    android:width=\"24dp\"\r\n    android:height=\"24dp\"\r\n    android:viewportWidth=\"24\"\r\n    android:viewportHeight=\"24\">\r\n    <path\r\n        android:fillColor=\"?attr/colorControlNormal\"\r\n        android:pathData=\"M12,22C6.477,22 2,17.523 2,12C2,6.477 6.477,2 12,2C17.523,2 22,6.477 22,12C22,17.523 17.523,22 12,22ZM12,20C16.418,20 20,16.418 20,12C20,7.582 16.418,4 12,4C7.582,4 4,7.582 4,12C4,16.418 7.582,20 12,20ZM11,7H13V9H11V7ZM11,11H13V17H11V11Z\" />\r\n</vector>\r\n"
  },
  {
    "path": "app/src/main/res/drawable/key_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"?attr/colorControlNormal\"\n        android:pathData=\"M12.917,13C12.441,15.838 9.973,18 7,18C3.686,18 1,15.314 1,12C1,8.686 3.686,6 7,6C9.973,6 12.441,8.162 12.917,11H23V13H21V17H19V13H17V17H15V13H12.917ZM7,16C9.209,16 11,14.209 11,12C11,9.791 9.209,8 7,8C4.791,8 3,9.791 3,12C3,14.209 4.791,16 7,16Z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/kuikly_official.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    ** 专有代码声明 **\n\n    此矢量图片文件来自 Kuikly 官方标识矢量图，\n    Kuikly 标识商标（如有）和原创权利人为深圳市腾讯计算机系统有限公司和/或其关联公司。\n\n    QQ 版本列表实用工具承诺不将此文件用于或授权任何非权利人用于任何形式的商业用途。\n\n    此矢量图片文件及其代码不受本项目 GNU Affero General Public License Version 3 开源许可约束，\n    未经许可，不得用于任何形式的商业用途或其他未经授权的用途。\n\n    本项目对“QQ”、Kuikly 标识、“Kuikly”的使用旨在注明和指向对应主体，\n    并非表示对“QQ”、Kuikly 标识、“Kuikly”商标（如有）的注册和拥有。\n\n    此文本如有任何中英文版本之间的差异，以中文版本为准。\n\n    ** Proprietary Code Statement **\n\n    This vector image file was recreated by the Kuikly official logo.\n    Any trademarks of Kuikly logos contained in this file and their original rights belong to 深圳市腾讯计算机系统有限公司 and/or its affiliates.\n\n    The Qverbow Util commits to not using this file for or authorizing any non-right holders to use it for any commercial purposes.\n\n    This vector image file and its code are not subject to the open-source license of this project, the GNU Affero General Public License Version 3.\n    Without permission, it shall not be used for any commercial purposes or other unauthorized uses.\n\n    The use of \"QQ\", the Kuikly logo, and \"Kuikly\" by this project is intended only to refer to the corresponding entities,\n    and does not imply registration or ownership of the trademarks \"QQ\", the Kuikly logo, and \"Kuikly\" (if any).\n\n    In case of any discrepancies between the Chinese and English versions of this text, the Chinese version shall prevail.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"15dp\"\n    android:height=\"15dp\"\n    android:viewportWidth=\"38\"\n    android:viewportHeight=\"38\">\n\n    <path\n        android:fillColor=\"?attr/colorControlNormal\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M2.423,13.148C-0.808,16.381 -0.808,21.619 2.423,24.852C2.423,24.852 13.149,35.576 13.149,35.576C16.38,38.809 21.62,38.809 24.851,35.576C24.851,35.576 35.577,24.852 35.577,24.852C38.808,21.619 38.808,16.381 35.577,13.148C35.577,13.148 24.851,2.424 24.851,2.424C21.62,-0.809 16.38,-0.809 13.149,2.424C13.149,2.424 2.423,13.148 2.423,13.148ZM12.404,10.451C11.327,10.451 10.454,11.324 10.454,12.4C10.454,12.4 10.454,25.078 10.454,25.078C10.454,26.154 11.327,27.027 12.404,27.027C12.861,27.027 13.282,26.871 13.614,26.607C13.675,26.56 13.733,26.508 13.788,26.453C13.788,26.453 26.456,13.785 26.456,13.785C27.217,13.023 27.217,11.789 26.456,11.027C25.694,10.266 24.459,10.266 23.697,11.027C23.697,11.027 15.141,19.584 15.141,19.584C14.85,19.875 14.354,19.67 14.354,19.26C14.354,19.26 14.354,12.4 14.354,12.4C14.354,11.324 13.481,10.451 12.404,10.451ZM19.742,22.498C19.551,22.307 19.551,21.998 19.742,21.807C19.742,21.807 21.81,19.738 21.81,19.738C22.001,19.549 22.31,19.549 22.5,19.738C22.5,19.738 26.982,24.221 26.982,24.221C27.744,24.982 27.744,26.217 26.982,26.979C26.22,27.74 24.985,27.74 24.224,26.979C24.224,26.979 19.742,22.498 19.742,22.498Z\"/>\n\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/lightbulb_fill.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"?attr/colorPrimary\"\n        android:pathData=\"M11,18H7.941C7.644,16.727 6.304,15.686 5.754,14.999C4.656,13.63 4,11.892 4,10C4,5.582 7.582,2 12,2C16.418,2 20,5.582 20,10C20,11.892 19.343,13.632 18.244,15.001C17.694,15.687 16.356,16.728 16.059,18H13V13H11V18ZM16,20V21C16,22.105 15.105,23 14,23H10C8.895,23 8,22.105 8,21V20H16Z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/link.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"?attr/colorControlNormal\"\n        android:pathData=\"M18.364,15.535L16.95,14.121L18.364,12.707C20.316,10.755 20.316,7.589 18.364,5.636C16.411,3.683 13.245,3.683 11.293,5.636L9.878,7.05L8.464,5.636L9.878,4.222C12.612,1.488 17.044,1.488 19.778,4.222C22.512,6.955 22.512,11.388 19.778,14.121L18.364,15.535ZM15.535,18.364L14.121,19.778C11.387,22.512 6.955,22.512 4.222,19.778C1.488,17.045 1.488,12.612 4.222,9.879L5.636,8.464L7.05,9.879L5.636,11.293C3.683,13.245 3.683,16.411 5.636,18.364C7.588,20.317 10.754,20.317 12.707,18.364L14.121,16.95L15.535,18.364ZM14.828,7.757L16.243,9.172L9.171,16.243L7.757,14.828L14.828,7.757Z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/mini_program_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"?attr/colorControlNormal\"\n        android:pathData=\"M12.001,22C6.478,22 2.001,17.523 2.001,12C2.001,6.477 6.478,2 12.001,2C17.524,2 22.001,6.477 22.001,12C22.001,17.523 17.524,22 12.001,22ZM12.001,20C16.419,20 20.001,16.418 20.001,12C20.001,7.582 16.419,4 12.001,4C7.583,4 4.001,7.582 4.001,12C4.001,16.418 7.583,20 12.001,20ZM13.001,14C13.001,15.933 11.434,17.5 9.501,17.5C7.568,17.5 6.001,15.933 6.001,14C6.001,12.626 6.8,11.396 8.024,10.826C8.525,10.593 9.12,10.81 9.353,11.311C9.586,11.811 9.369,12.406 8.869,12.639C8.344,12.884 8.001,13.411 8.001,14C8.001,14.829 8.673,15.5 9.501,15.5C10.329,15.5 11.001,14.829 11.001,14V10C11.001,8.067 12.568,6.5 14.501,6.5C16.434,6.5 18.001,8.067 18.001,10C18.001,11.374 17.201,12.604 15.978,13.174C15.477,13.407 14.882,13.19 14.649,12.69C14.416,12.189 14.633,11.594 15.133,11.361C15.658,11.116 16.001,10.589 16.001,10C16.001,9.172 15.329,8.5 14.501,8.5C13.672,8.5 13.001,9.172 13.001,10V14Z\"\n        tools:ignore=\"VectorPath\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/open_source_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"?attr/colorControlNormal\"\n        android:pathData=\"M12.001,2C17.524,2 22.001,6.477 22.001,12C22.001,16.4 19.16,20.135 15.212,21.473L14.986,21.547L12.082,13.997C13.151,13.95 14.001,13.054 14.001,12C14.001,10.895 13.106,10 12.001,10C10.896,10 10.001,10.895 10.001,12C10.001,13.077 10.852,13.955 11.918,13.998L9.015,21.547L8.79,21.473C4.842,20.135 2.001,16.4 2.001,12C2.001,6.477 6.478,2 12.001,2ZM12.001,4C7.583,4 4.001,7.582 4.001,12C4.001,14.92 5.565,17.475 7.902,18.872L9.381,15.023C8.536,14.29 8.001,13.207 8.001,12C8.001,9.791 9.792,8 12.001,8C14.21,8 16.001,9.791 16.001,12C16.001,13.208 15.466,14.29 14.62,15.023C15.186,16.497 15.68,17.78 16.1,18.873C18.436,17.475 20.001,14.92 20.001,12C20.001,7.582 16.419,4 12.001,4Z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/oteam_official.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:width=\"102dp\"\n    android:height=\"102dp\"\n    android:viewportWidth=\"102\"\n    android:viewportHeight=\"102\">\n    <path\n        android:fillAlpha=\"0\"\n        android:fillColor=\"#FFFFFF\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M0,0h102v102h-102z\" />\n    <path\n        android:fillColor=\"?attr/colorControlNormal\"\n        android:pathData=\"M81.04,49C80.79,45.12 79.83,41.44 78.16,37.94L67.72,43.06C68.64,45.02 69.2,47.06 69.41,49.19C69.62,51.31 69.46,53.41 68.94,55.47C68.42,57.53 67.57,59.46 66.38,61.25C65.19,63.04 63.75,64.57 62.04,65.84C60.33,67.11 58.45,68.06 56.41,68.69C54.37,69.31 52.28,69.57 50.13,69.47C47.98,69.36 45.92,68.91 43.94,68.09C41.96,67.28 40.18,66.17 38.6,64.75C37.02,63.33 35.71,61.68 34.69,59.78C33.67,57.89 33.01,55.89 32.69,53.78C32.38,51.68 32.42,49.57 32.82,47.47C33.21,45.36 33.95,43.4 35.04,41.56C36.12,39.73 37.48,38.12 39.13,36.75C40.78,35.37 42.6,34.32 44.6,33.59C46.6,32.86 48.67,32.49 50.82,32.47C52.96,32.45 55.04,32.77 57.04,33.44L62.22,23C59.22,21.79 56.1,21.09 52.85,20.91C49.6,20.72 46.4,21.04 43.26,21.87C40.11,22.71 37.17,24.03 34.44,25.84C31.71,27.66 29.35,29.84 27.35,32.41C25.35,34.97 23.81,37.79 22.72,40.87C21.64,43.96 21.07,47.12 21.01,50.37C20.94,53.62 21.39,56.8 22.35,59.91C23.31,63.01 24.75,65.89 26.66,68.53C28.58,71.18 30.86,73.45 33.51,75.34C36.15,77.24 39.04,78.67 42.16,79.62C45.29,80.58 48.47,81.03 51.72,80.97C54.97,80.91 58.13,80.32 61.19,79.22C64.26,78.11 67.07,76.55 69.63,74.53C72.19,72.51 74.37,70.14 76.16,67.41C77.95,64.68 79.27,61.74 80.1,58.59C80.93,55.45 81.25,52.25 81.04,49L81.04,49ZM71.16,36.63C72.41,36.63 73.58,36.31 74.66,35.69C75.75,35.06 76.6,34.22 77.22,33.16C77.85,32.09 78.16,30.93 78.16,29.66C78.16,28.39 77.85,27.21 77.22,26.13C76.6,25.04 75.75,24.19 74.66,23.56C73.58,22.94 72.41,22.63 71.16,22.63C69.91,22.63 68.75,22.94 67.66,23.56C66.58,24.19 65.72,25.04 65.1,26.13C64.47,27.21 64.16,28.39 64.16,29.66C64.16,30.93 64.47,32.09 65.1,33.16C65.72,34.22 66.58,35.06 67.66,35.69C68.75,36.31 69.91,36.63 71.16,36.63L71.16,36.63ZM85.47,36.63C86.68,36.63 87.7,36.2 88.54,35.34C89.37,34.49 89.79,33.47 89.79,32.28C89.79,31.09 89.37,30.07 88.54,29.22C87.7,28.36 86.68,27.94 85.47,27.94C84.27,27.94 83.24,28.36 82.38,29.22C81.53,30.07 81.1,31.09 81.1,32.28C81.1,33.47 81.53,34.49 82.38,35.34C83.24,36.2 84.27,36.63 85.47,36.63L85.47,36.63ZM64.85,20.31C65.31,20.31 65.7,20.16 66.04,19.84C66.37,19.53 66.54,19.15 66.54,18.69C66.54,18.23 66.37,17.83 66.04,17.5C65.7,17.17 65.31,17 64.85,17C64.39,17 64.01,17.17 63.69,17.5C63.38,17.83 63.22,18.23 63.22,18.69C63.22,19.15 63.38,19.53 63.69,19.84C64.01,20.16 64.39,20.31 64.85,20.31L64.85,20.31ZM99.72,36.63C100.18,36.63 100.57,36.47 100.88,36.16C101.19,35.84 101.35,35.45 101.35,34.97C101.35,34.49 101.19,34.09 100.88,33.78C100.57,33.47 100.18,33.31 99.72,33.31C99.27,33.31 98.87,33.47 98.54,33.78C98.2,34.09 98.04,34.49 98.04,34.97C98.04,35.45 98.2,35.84 98.54,36.16C98.87,36.47 99.27,36.63 99.72,36.63L99.72,36.63ZM93.91,27.94C94.66,27.94 95.29,27.68 95.79,27.16C96.29,26.64 96.54,26.01 96.54,25.28C96.54,24.55 96.29,23.93 95.79,23.41C95.29,22.89 94.67,22.63 93.94,22.63C93.21,22.63 92.59,22.89 92.07,23.41C91.55,23.93 91.29,24.55 91.29,25.28C91.29,26.01 91.55,26.64 92.07,27.16C92.59,27.68 93.2,27.94 93.91,27.94L93.91,27.94Z\"\n        tools:ignore=\"VectorPath\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/palette_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"?attr/colorControlNormal\"\n        android:pathData=\"M12,2C17.522,2 22,5.978 22,10.889C22,13.956 19.511,16.444 16.444,16.444H14.478C13.556,16.444 12.811,17.189 12.811,18.111C12.811,18.533 12.978,18.922 13.233,19.211C13.5,19.511 13.667,19.9 13.667,20.333C13.667,21.256 12.9,22 12,22C6.478,22 2,17.522 2,12C2,6.478 6.478,2 12,2ZM10.811,18.111C10.811,16.084 12.451,14.444 14.478,14.444H16.444C18.406,14.444 20,12.851 20,10.889C20,7.139 16.468,4 12,4C7.582,4 4,7.582 4,12C4,16.19 7.223,19.628 11.324,19.972C10.995,19.417 10.811,18.776 10.811,18.111ZM7.5,12C6.672,12 6,11.328 6,10.5C6,9.672 6.672,9 7.5,9C8.328,9 9,9.672 9,10.5C9,11.328 8.328,12 7.5,12ZM16.5,12C15.672,12 15,11.328 15,10.5C15,9.672 15.672,9 16.5,9C17.328,9 18,9.672 18,10.5C18,11.328 17.328,12 16.5,12ZM12,9C11.172,9 10.5,8.328 10.5,7.5C10.5,6.672 11.172,6 12,6C12.828,6 13.5,6.672 13.5,7.5C13.5,8.328 12.828,9 12,9Z\"\n        tools:ignore=\"VectorPath\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/phone_find_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"?attr/colorControlNormal\"\n        android:pathData=\"M18,2C18.552,2 19,2.448 19,3V11H17V4H7V20H11V22H6C5.448,22 5,21.552 5,21V3C5,2.448 5.448,2 6,2H18ZM15,12C17.209,12 19,13.791 19,16C19,16.742 18.798,17.437 18.446,18.032L20.657,20.243L19.243,21.657L17.031,19.447C16.436,19.798 15.741,20 15,20C12.791,20 11,18.209 11,16C11,13.791 12.791,12 15,12ZM15,14C13.895,14 13,14.895 13,16C13,17.105 13.895,18 15,18C16.105,18 17,17.105 17,16C17,14.895 16.105,14 15,14Z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/qqnt_logo_unofficial.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    ** 专有代码声明 **\n\n    此矢量图片文件由 QQ 版本列表实用工具（以下简称“本项目”）根据 QQNT 标识临摹绘制，\n    文件所包含的 QQNT 标识商标（如有）和原创权利人为深圳市腾讯计算机系统有限公司和/或其关联公司。\n\n    QQ 版本列表实用工具承诺不将此文件用于或授权任何非权利人用于任何形式的商业用途。\n\n    此矢量图片文件及其代码不受本项目 GNU Affero General Public License Version 3 开源许可约束，\n    未经许可，不得用于任何形式的商业用途或其他未经授权的用途。\n\n    本项目对“QQ”、QQNT 标识、“QQNT”的使用旨在注明和指向对应主体，\n    并非表示对“QQ”、QQNT 标识、“QQNT”商标（如有）的注册和拥有。\n\n    此文本如有任何中英文版本之间的差异，以中文版本为准。\n\n    ** Proprietary Code Statement **\n\n    This vector image file was recreated by the Qverbow Util (hereinafter referred to as \"this project\") based on the QQNT logo.\n    Any trademarks of QQNT logos contained in this file and their original rights belong to 深圳市腾讯计算机系统有限公司 and/or its affiliates.\n\n    The Qverbow Util commits to not using this file for or authorizing any non-right holders to use it for any commercial purposes.\n\n    This vector image file and its code are not subject to the open-source license of this project, the GNU Affero General Public License Version 3.\n    Without permission, it shall not be used for any commercial purposes or other unauthorized uses.\n\n    The use of \"QQ\", the QQNT logo, and \"QQNT\" by this project is intended only to refer to the corresponding entities,\n    and does not imply registration or ownership of the trademarks \"QQ\", the QQNT logo, and \"QQNT\" (if any).\n\n    In case of any discrepancies between the Chinese and English versions of this text, the Chinese version shall prevail.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"20dp\"\n    android:height=\"20dp\"\n    android:viewportWidth=\"888\"\n    android:viewportHeight=\"888\">\n    <group>\n        <clip-path android:pathData=\"M0,0h888v888h-888z\" />\n        <path\n            android:fillColor=\"?attr/colorControlNormal\"\n            android:fillType=\"evenOdd\"\n            android:pathData=\"M733.93,563.48L443.92,791.39L443.72,791.23L443.13,791.69L143,555.88L143,331.18L153.13,323.22L443.13,95.3L443.34,95.46L443.92,95L744.06,330.81L744.06,555.52L733.93,563.48L733.93,563.48ZM443.21,525.61L406.7,498.93L415.09,437.39L326.56,505.69L355.48,526.98L355.4,527.09L383.06,547.3L385.66,549.2L398.56,558.69L398.57,558.63L417.36,572.36L417.36,703.15L212.88,542.61L443.85,361.08L480.36,387.76L471.97,449.31L560.5,381L531.58,359.71L531.66,359.6L504,339.39L501.4,337.49L488.5,328L488.49,328.06L469.7,314.33L469.7,183.54L674.18,344.08L443.21,525.61L443.21,525.61ZM416.7,315.01L196.5,488.07L196.5,356.58L416.7,183.74L416.7,315.01L416.7,315.01ZM690.56,530.11L690.56,398.62L470.36,571.68L470.36,702.95L690.56,530.11L690.56,530.11Z\"\n            android:strokeColor=\"#00000000\" />\n    </group>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/qqnt_logo_unofficial_fix.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    ** 专有代码声明 **\n\n    此矢量图片文件由 QQ 版本列表实用工具（以下简称“本项目”）根据 QQNT 标识临摹绘制，\n    文件所包含的 QQNT 标识商标（如有）和原创权利人为深圳市腾讯计算机系统有限公司和/或其关联公司。\n\n    QQ 版本列表实用工具承诺不将此文件用于或授权任何非权利人用于任何形式的商业用途。\n\n    此矢量图片文件及其代码不受本项目 GNU Affero General Public License Version 3 开源许可约束，\n    未经许可，不得用于任何形式的商业用途或其他未经授权的用途。\n\n    本项目对“QQ”、QQNT 标识、“QQNT”的使用旨在注明和指向对应主体，\n    并非表示对“QQ”、QQNT 标识、“QQNT”商标（如有）的注册和拥有。\n\n    此文本如有任何中英文版本之间的差异，以中文版本为准。\n\n    ** Proprietary Code Statement **\n\n    This vector image file was recreated by the Qverbow Util (hereinafter referred to as \"this project\") based on the QQNT logo.\n    Any trademarks of QQNT logos contained in this file and their original rights belong to 深圳市腾讯计算机系统有限公司 and/or its affiliates.\n\n    The Qverbow Util commits to not using this file for or authorizing any non-right holders to use it for any commercial purposes.\n\n    This vector image file and its code are not subject to the open-source license of this project, the GNU Affero General Public License Version 3.\n    Without permission, it shall not be used for any commercial purposes or other unauthorized uses.\n\n    The use of \"QQ\", the QQNT logo, and \"QQNT\" by this project is intended only to refer to the corresponding entities,\n    and does not imply registration or ownership of the trademarks \"QQ\", the QQNT logo, and \"QQNT\" (if any).\n\n    In case of any discrepancies between the Chinese and English versions of this text, the Chinese version shall prevail.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"700\"\n    android:viewportHeight=\"700\">\n  <path\n      android:pathData=\"M0,0h700v700h-700z\"\n      android:fillColor=\"?attr/colorControlNormal\"\n      android:fillAlpha=\"0\"\n      android:fillType=\"evenOdd\"/>\n  <path\n      android:pathData=\"M640.93,470.48L350.92,698.39L350.72,698.23L350.13,698.69L50,462.88L50,238.18L60.13,230.22L350.13,2.3L350.34,2.46L350.92,2L651.06,237.81L651.06,462.52L640.93,470.48L640.93,470.48ZM350.21,432.61L313.7,405.93L322.09,344.39L233.56,412.69L262.48,433.98L262.4,434.09L290.06,454.3L292.66,456.2L305.56,465.69L305.57,465.63L324.36,479.36L324.36,610.15L119.88,449.61L350.85,268.08L387.36,294.76L378.97,356.31L467.5,288L438.58,266.71L438.65,266.6L411,246.39L408.4,244.49L395.5,235L395.49,235.06L376.7,221.33L376.7,90.54L581.18,251.08L350.21,432.61L350.21,432.61ZM323.7,222.01L103.5,395.07L103.5,263.58L323.7,90.74L323.7,222.01L323.7,222.01ZM597.56,437.11L597.56,305.62L377.36,478.68L377.36,609.95L597.56,437.11L597.56,437.11Z\"\n      android:fillColor=\"?attr/colorControlNormal\"\n      android:fillType=\"evenOdd\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/question_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\r\n   Copyright 2018 Remix-Design\r\n\r\n   Licensed under the Apache License, Version 2.0 (the \"License\");\r\n   you may not use this file except in compliance with the License.\r\n   You may obtain a copy of the License at\r\n\r\n       http://www.apache.org/licenses/LICENSE-2.0\r\n\r\n   Unless required by applicable law or agreed to in writing, software\r\n   distributed under the License is distributed on an \"AS IS\" BASIS,\r\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n   See the License for the specific language governing permissions and\r\n   limitations under the License.\r\n-->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n    android:width=\"24dp\"\r\n    android:height=\"24dp\"\r\n    android:viewportWidth=\"24\"\r\n    android:viewportHeight=\"24\">\r\n    <path\r\n        android:fillColor=\"?attr/colorControlNormal\"\r\n        android:pathData=\"M12,22C6.477,22 2,17.523 2,12C2,6.477 6.477,2 12,2C17.523,2 22,6.477 22,12C22,17.523 17.523,22 12,22ZM12,20C16.418,20 20,16.418 20,12C20,7.582 16.418,4 12,4C7.582,4 4,7.582 4,12C4,16.418 7.582,20 12,20ZM11,15H13V17H11V15ZM13,13.355V14H11V12.5C11,11.948 11.448,11.5 12,11.5C12.828,11.5 13.5,10.828 13.5,10C13.5,9.172 12.828,8.5 12,8.5C11.272,8.5 10.666,9.018 10.529,9.706L8.567,9.313C8.886,7.709 10.302,6.5 12,6.5C13.933,6.5 15.5,8.067 15.5,10C15.5,11.585 14.446,12.925 13,13.355Z\" />\r\n</vector>\r\n"
  },
  {
    "path": "app/src/main/res/drawable/qv_logo_notification.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    ** 专有代码声明 **\n    此矢量图片文件由 QQ 版本列表实用工具原创绘制。\n    此矢量图片文件及其代码不受本项目 GNU Affero General Public License Version 3 开源许可约束，\n    未经许可，不得用于任何形式的商业与非商业用途或其他未经授权的用途。\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:width=\"326dp\"\n    android:height=\"326dp\"\n    android:viewportWidth=\"326\"\n    android:viewportHeight=\"326\"\n    tools:ignore=\"VectorRaster\">\n    <group>\n        <clip-path android:pathData=\"M0,0h326v326h-326z\" />\n        <path\n            android:fillColor=\"#00201B\"\n            android:fillType=\"evenOdd\"\n            android:pathData=\"M177.88,91.37L273.33,91.37L208.05,204.27L164.4,128.77L164.39,128.78L125.21,61L107.48,61C94.88,61.31 82.72,63.89 71.02,68.73C58.51,73.9 47.47,81.27 37.9,90.83C28.33,100.39 20.95,111.41 15.77,123.9C10.59,136.39 8,149.39 8,162.91C8,176.43 10.59,189.44 15.77,201.93C20.95,214.42 28.33,225.44 37.9,235C47.47,244.56 58.51,251.93 71.02,257.1C83.53,262.27 96.55,264.86 110.09,264.86L172.85,264.86L155.29,234.49L110.09,234.49C100.58,234.49 91.44,232.68 82.66,229.04C73.88,225.41 66.13,220.24 59.4,213.53C52.68,206.82 47.5,199.07 43.87,190.31C40.23,181.54 38.41,172.41 38.41,162.91C38.41,153.42 40.23,144.29 43.87,135.52C47.5,126.75 52.68,119.01 59.4,112.3C66.13,105.59 73.88,100.42 82.66,96.78C90.69,93.46 99.03,91.66 107.67,91.37L190.41,234.49L190.41,234.49L207.96,264.86L207.97,264.86L208.05,265L326,61L160.32,61L177.88,91.37L177.88,91.37Z\"\n            android:strokeColor=\"#00000000\"\n            tools:ignore=\"VectorPath\" />\n    </group>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/reactjs_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"?attr/colorControlNormal\"\n        android:pathData=\"M12.001,13.5C11.172,13.5 10.501,12.828 10.501,12C10.501,11.172 11.172,10.5 12.001,10.5C12.829,10.5 13.501,11.172 13.501,12C13.501,12.828 12.829,13.5 12.001,13.5ZM11.473,16.494C11.648,16.705 11.824,16.908 12.001,17.103C12.178,16.908 12.354,16.705 12.529,16.494C12.354,16.498 12.178,16.5 12.001,16.5C11.824,16.5 11.648,16.498 11.473,16.494ZM9.478,16.369C8.676,16.285 7.91,16.16 7.193,16.002C7.118,16.351 7.061,16.69 7.022,17.017C6.834,18.6 7.098,19.562 7.501,19.794C7.904,20.027 8.869,19.775 10.146,18.82C10.409,18.623 10.674,18.404 10.94,18.165C10.443,17.623 9.953,17.022 9.478,16.369ZM16.809,16.002C16.092,16.16 15.326,16.285 14.524,16.369C14.049,17.022 13.559,17.623 13.062,18.165C13.328,18.404 13.593,18.623 13.856,18.82C15.133,19.775 16.098,20.027 16.501,19.794C16.904,19.562 17.168,18.6 16.979,17.017C16.941,16.69 16.884,16.351 16.809,16.002ZM18.26,15.614C18.836,18.253 18.533,20.353 17.251,21.093C15.969,21.833 13.998,21.046 12.001,19.227C10.004,21.046 8.033,21.833 6.751,21.093C5.469,20.353 5.166,18.253 5.742,15.614C3.168,14.793 1.501,13.48 1.501,12C1.501,10.52 3.168,9.207 5.742,8.387C5.166,5.748 5.469,3.647 6.751,2.907C8.033,2.167 10.004,2.954 12.001,4.773C13.998,2.954 15.969,2.167 17.251,2.907C18.533,3.647 18.836,5.748 18.26,8.387C20.833,9.207 22.501,10.52 22.501,12C22.501,13.48 20.833,14.793 18.26,15.614ZM10.94,5.835C10.674,5.596 10.409,5.377 10.146,5.18C8.869,4.225 7.904,3.973 7.501,4.206C7.098,4.438 6.834,5.4 7.022,6.984C7.061,7.31 7.118,7.649 7.193,7.999C7.91,7.84 8.676,7.716 9.478,7.631C9.953,6.978 10.443,6.377 10.94,5.835ZM14.524,7.631C15.326,7.716 16.092,7.84 16.809,7.999C16.884,7.649 16.941,7.31 16.979,6.984C17.168,5.4 16.904,4.438 16.501,4.206C16.098,3.973 15.133,4.225 13.856,5.18C13.593,5.377 13.328,5.596 13.062,5.835C13.559,6.377 14.049,6.978 14.524,7.631ZM12.529,7.506C12.354,7.295 12.178,7.092 12.001,6.897C11.824,7.092 11.648,7.295 11.473,7.506C11.648,7.502 11.824,7.5 12.001,7.5C12.178,7.5 12.354,7.502 12.529,7.506ZM8.373,14.704C8.282,14.555 8.192,14.403 8.104,14.25C8.015,14.097 7.929,13.943 7.845,13.79C7.75,14.047 7.662,14.301 7.582,14.552C7.839,14.607 8.103,14.658 8.373,14.704ZM10.305,14.938C10.858,14.979 11.425,15 12.001,15C12.577,15 13.144,14.979 13.697,14.938C14.009,14.479 14.311,13.999 14.599,13.5C14.887,13.001 15.152,12.5 15.393,12C15.152,11.501 14.887,10.999 14.599,10.5C14.311,10.001 14.009,9.521 13.697,9.062C13.144,9.021 12.577,9 12.001,9C11.425,9 10.858,9.021 10.305,9.062C9.993,9.521 9.691,10.001 9.403,10.5C9.115,10.999 8.85,11.501 8.609,12C8.85,12.5 9.115,13.001 9.403,13.5C9.691,13.999 9.993,14.479 10.305,14.938ZM16.157,10.21C16.252,9.953 16.34,9.699 16.42,9.449C16.163,9.393 15.899,9.342 15.629,9.296C15.72,9.445 15.81,9.597 15.898,9.75C15.987,9.903 16.073,10.057 16.157,10.21ZM6.131,9.837C5.791,9.947 5.469,10.067 5.167,10.197C3.702,10.825 3.001,11.535 3.001,12C3.001,12.465 3.702,13.175 5.167,13.803C5.469,13.933 5.791,14.053 6.131,14.163C6.353,13.462 6.628,12.737 6.956,12C6.628,11.263 6.353,10.538 6.131,9.837ZM7.582,9.449C7.662,9.699 7.75,9.953 7.845,10.21C7.929,10.057 8.015,9.903 8.104,9.75C8.192,9.597 8.282,9.445 8.373,9.296C8.103,9.342 7.839,9.393 7.582,9.449ZM17.871,14.163C18.211,14.053 18.533,13.933 18.835,13.803C20.3,13.175 21.001,12.465 21.001,12C21.001,11.535 20.3,10.825 18.835,10.197C18.533,10.067 18.211,9.947 17.871,9.837C17.649,10.538 17.374,11.263 17.046,12C17.374,12.737 17.649,13.462 17.871,14.163ZM16.42,14.552C16.34,14.301 16.252,14.047 16.157,13.79C16.073,13.943 15.987,14.097 15.898,14.25C15.81,14.403 15.72,14.555 15.629,14.704C15.899,14.658 16.163,14.607 16.42,14.552Z\"\n        tools:ignore=\"VectorPath\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/refresh_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\r\n   Copyright 2018 Remix-Design\r\n\r\n   Licensed under the Apache License, Version 2.0 (the \"License\");\r\n   you may not use this file except in compliance with the License.\r\n   You may obtain a copy of the License at\r\n\r\n       http://www.apache.org/licenses/LICENSE-2.0\r\n\r\n   Unless required by applicable law or agreed to in writing, software\r\n   distributed under the License is distributed on an \"AS IS\" BASIS,\r\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n   See the License for the specific language governing permissions and\r\n   limitations under the License.\r\n-->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n    android:width=\"24dp\"\r\n    android:height=\"24dp\"\r\n    android:viewportWidth=\"24\"\r\n    android:viewportHeight=\"24\">\r\n  <path\r\n      android:pathData=\"M5.463,4.433C7.216,2.917 9.501,2 12,2C17.523,2 22,6.477 22,12C22,14.136 21.33,16.116 20.189,17.741L17,12H20C20,7.582 16.418,4 12,4C9.85,4 7.898,4.848 6.46,6.228L5.463,4.433ZM18.537,19.567C16.784,21.083 14.499,22 12,22C6.477,22 2,17.523 2,12C2,9.864 2.67,7.884 3.811,6.259L7,12H4C4,16.418 7.582,20 12,20C14.15,20 16.102,19.152 17.54,17.772L18.537,19.567Z\"\r\n      android:fillColor=\"?attr/colorControlNormal\"/>\r\n</vector>\r\n"
  },
  {
    "path": "app/src/main/res/drawable/rightly_official.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    ** 专有代码声明 **\n\n    此矢量图片文件来自 Rightly 官方标识矢量图，\n    Rightly 标识商标（如有）和原创权利人为深圳市腾讯计算机系统有限公司和/或其关联公司。\n\n    QQ 版本列表实用工具承诺不将此文件用于或授权任何非权利人用于任何形式的商业用途。\n\n    此矢量图片文件及其代码不受本项目 GNU Affero General Public License Version 3 开源许可约束，\n    未经许可，不得用于任何形式的商业用途或其他未经授权的用途。\n\n    本项目对“QQ”、Rightly 标识、“Rightly”的使用旨在注明和指向对应主体，\n    并非表示对“QQ”、Rightly 标识、“Rightly”商标（如有）的注册和拥有。\n\n    此文本如有任何中英文版本之间的差异，以中文版本为准。\n\n    ** Proprietary Code Statement **\n\n    This vector image file was recreated by the Rightly official logo.\n    Any trademarks of Rightly logos contained in this file and their original rights belong to 深圳市腾讯计算机系统有限公司 and/or its affiliates.\n\n    The Qverbow Util commits to not using this file for or authorizing any non-right holders to use it for any commercial purposes.\n\n    This vector image file and its code are not subject to the open-source license of this project, the GNU Affero General Public License Version 3.\n    Without permission, it shall not be used for any commercial purposes or other unauthorized uses.\n\n    The use of \"QQ\", the Rightly logo, and \"Rightly\" by this project is intended only to refer to the corresponding entities,\n    and does not imply registration or ownership of the trademarks \"QQ\", the Rightly logo, and \"Rightly\" (if any).\n\n    In case of any discrepancies between the Chinese and English versions of this text, the Chinese version shall prevail.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    android:width=\"52dp\"\n    android:height=\"59.565dp\"\n    android:viewportWidth=\"52\"\n    android:viewportHeight=\"59.565\">\n    <group>\n        <path\n            android:fillColor=\"?attr/colorControlNormal\"\n            android:fillType=\"evenOdd\"\n            android:pathData=\"M19.242,24.453C19.138,24.023 18.878,23.704 18.232,23.422C14.178,21.651 5.758,30.579 2.149,36.662C2.993,39.863 4.153,42.756 5.74,45.2C13.314,56.858 25.18,59.411 25.982,59.411C26.754,59.411 41.65,55.434 47.674,42.548C35.639,46.315 27.534,41.424 24.363,38.173C23.77,37.829 23.264,37.353 22.887,36.78C22.887,36.78 15.924,26.278 15.924,26.278C15.424,25.524 15.583,24.513 16.29,23.948C16.97,23.415 17.927,23.416 18.606,23.951C18.606,23.951 19.242,24.453 19.242,24.453C19.242,24.453 19.242,24.453 19.242,24.453Z\" />\n        <path\n            android:fillColor=\"?attr/colorControlNormal\"\n            android:fillType=\"evenOdd\"\n            android:pathData=\"M18.547,23.955C18.545,23.953 18.549,23.956 18.547,23.955C18.547,23.955 24.005,28.181 24.005,28.181C25.187,29.112 26.856,29.102 28.025,28.155C28.025,28.155 50.688,9.78 50.688,9.78C50.147,9.211 49.464,8.798 48.709,8.583C45.3,7.601 39.806,5.989 38.066,5.302C36.15,4.545 30.444,1.666 27.617,0.226C26.595,-0.294 25.387,-0.298 24.362,0.216C21.538,1.627 15.818,4.449 13.542,5.303C11.527,6.06 6.467,7.579 3.218,8.536C1.46,9.054 0.193,10.582 0.11,12.408C-0.119,17.448 -0.217,27.889 2.145,36.686C8.523,26.143 16.14,22.312 18.146,23.688C18.279,23.778 18.468,23.871 18.546,23.955C18.546,23.955 18.547,23.955 18.547,23.955Z\" />\n        <path\n            android:fillColor=\"?attr/colorControlNormal\"\n            android:fillType=\"evenOdd\"\n            android:pathData=\"M29.908,37.321C29.908,37.321 51.874,13.156 51.874,13.156C52.221,19.021 52.277,30.825 48.344,40.984C48.12,41.562 47.876,42.131 47.611,42.691C35.074,46.516 26.114,41.221 23.619,37.644C25.389,39.236 28.215,39.184 29.908,37.321C29.908,37.321 29.908,37.321 29.908,37.321Z\" />\n        <path\n            android:fillType=\"evenOdd\"\n            android:pathData=\"M22.948,37.094C23.071,37.013 23.236,37.047 23.318,37.169C26.977,42.677 36.641,46.055 48.209,42.524C48.35,42.481 48.5,42.56 48.543,42.701C48.586,42.841 48.507,42.991 48.366,43.034C36.659,46.607 26.705,43.234 22.872,37.463C22.832,37.404 22.818,37.332 22.832,37.262C22.847,37.193 22.888,37.132 22.948,37.093C22.948,37.093 22.948,37.094 22.948,37.094Z\">\n            <aapt:attr name=\"android:fillColor\">\n                <gradient\n                    android:endX=\"31.985\"\n                    android:endY=\"48.872\"\n                    android:startX=\"45.746\"\n                    android:startY=\"38.204\"\n                    android:type=\"linear\">\n                    <item\n                        android:color=\"#00FFFFFF\"\n                        android:offset=\"0.111\" />\n                    <item\n                        android:color=\"#FFFFFFFF\"\n                        android:offset=\"0.457\" />\n                    <item\n                        android:color=\"#00FFFFFF\"\n                        android:offset=\"1\" />\n                </gradient>\n            </aapt:attr>\n        </path>\n        <path\n            android:fillColor=\"#00000000\"\n            android:pathData=\"M18.24,23.459C15.253,21.86 7.45,27.367 1.921,36.561\"\n            android:strokeWidth=\"0.533\"\n            android:strokeAlpha=\"0\"\n            android:strokeLineCap=\"round\">\n            <aapt:attr name=\"android:strokeColor\">\n                <gradient\n                    android:endX=\"1.746\"\n                    android:endY=\"23.145\"\n                    android:startX=\"1.743\"\n                    android:startY=\"37.893\"\n                    android:type=\"linear\">\n                    <item\n                        android:color=\"#00FFFFFF\"\n                        android:offset=\"0\" />\n                    <item\n                        android:color=\"#FFFFFFFF\"\n                        android:offset=\"0.562\" />\n                    <item\n                        android:color=\"#00FFFFFF\"\n                        android:offset=\"1\" />\n                </gradient>\n            </aapt:attr>\n        </path>\n    </group>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/save_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:pathData=\"M7,19V13H17V19H19V7.828L16.172,5H5V19H7ZM4,3H17L21,7V20C21,20.552 20.552,21 20,21H4C3.448,21 3,20.552 3,20V4C3,3.448 3.448,3 4,3ZM9,15V19H15V15H9Z\"\n      android:fillColor=\"?attr/colorControlNormal\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/scan_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:pathData=\"M5.671,4.257L13.414,12L12,13.414L5.68,7.094C4.627,8.449 4,10.151 4,12C4,16.418 7.582,20 12,20C16.418,20 20,16.418 20,12C20,7.582 16.418,4 12,4C11.085,4 10.205,4.154 9.386,4.437L7.849,2.899C9.114,2.322 10.519,2 12,2C17.523,2 22,6.477 22,12C22,17.523 17.523,22 12,22C6.477,22 2,17.523 2,12C2,8.878 3.43,6.091 5.671,4.257Z\"\n      android:fillColor=\"?attr/colorControlNormal\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/scan_shortcut_icon_foreground.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <group android:scaleX=\"0.792\"\n      android:scaleY=\"0.792\"\n      android:translateX=\"2.496\"\n      android:translateY=\"2.496\">\n    <group android:scaleX=\"0.9339623\"\n        android:scaleY=\"0.9339623\"\n        android:translateX=\"0.8962264\"\n        android:translateY=\"0.8962264\">\n      <group android:scaleX=\"0.8123077\"\n          android:scaleY=\"0.8123077\"\n          android:translateX=\"2.1620512\"\n          android:translateY=\"2.1620512\">\n        <group android:scaleX=\"2\"\n            android:scaleY=\"2\"\n            android:translateX=\"-11.777778\"\n            android:translateY=\"-11.777778\">\n          <group android:scaleX=\"0.35869566\"\n              android:scaleY=\"0.35869566\"\n              android:translateX=\"7.615942\"\n              android:translateY=\"7.615942\">\n            <path\n                android:pathData=\"M5.671,4.257L13.414,12L12,13.414L5.68,7.094C4.627,8.449 4,10.151 4,12C4,16.418 7.582,20 12,20C16.418,20 20,16.418 20,12C20,7.582 16.418,4 12,4C11.085,4 10.205,4.154 9.386,4.437L7.849,2.899C9.114,2.322 10.519,2 12,2C17.523,2 22,6.477 22,12C22,17.523 17.523,22 12,22C6.477,22 2,17.523 2,12C2,8.878 3.43,6.091 5.671,4.257Z\"\n                android:fillColor=\"#00201B\"/>\n          </group>\n        </group>\n      </group>\n    </group>\n  </group>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/search_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\r\n   Copyright 2018 Remix-Design\r\n\r\n   Licensed under the Apache License, Version 2.0 (the \"License\");\r\n   you may not use this file except in compliance with the License.\r\n   You may obtain a copy of the License at\r\n\r\n       http://www.apache.org/licenses/LICENSE-2.0\r\n\r\n   Unless required by applicable law or agreed to in writing, software\r\n   distributed under the License is distributed on an \"AS IS\" BASIS,\r\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n   See the License for the specific language governing permissions and\r\n   limitations under the License.\r\n-->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n    android:width=\"24dp\"\r\n    android:height=\"24dp\"\r\n    android:viewportWidth=\"24\"\r\n    android:viewportHeight=\"24\">\r\n  <path\r\n      android:pathData=\"M18.031,16.617L22.314,20.899L20.899,22.314L16.617,18.031C15.077,19.263 13.124,20 11,20C6.032,20 2,15.968 2,11C2,6.032 6.032,2 11,2C15.968,2 20,6.032 20,11C20,13.124 19.263,15.077 18.031,16.617ZM16.025,15.875C17.247,14.615 18,12.896 18,11C18,7.133 14.868,4 11,4C7.133,4 4,7.133 4,11C4,14.868 7.133,18 11,18C12.896,18 14.615,17.247 15.875,16.025L16.025,15.875Z\"\r\n      android:fillColor=\"?attr/colorControlNormal\"/>\r\n</vector>\r\n"
  },
  {
    "path": "app/src/main/res/drawable/settings_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:pathData=\"M17.5 2.47363L23 11.9999L17.5 21.5262H6.5L1 11.9999L6.5 2.47363H17.5ZM16.3453 4.47363H7.6547L3.3094 11.9999L7.6547 19.5262H16.3453L20.6906 11.9999L16.3453 4.47363ZM8.63398 8.16979L10.366 7.16979L15.366 15.83L13.634 16.83L8.63398 8.16979Z\"\n      android:fillColor=\"?attr/colorControlNormal\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/shape_cell_bottom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<ripple xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:color=\"?colorControlHighlight\">\n    <item>\n        <shape>\n            <corners\n                android:bottomLeftRadius=\"12dp\"\n                android:bottomRightRadius=\"12dp\"\n                android:topLeftRadius=\"6dp\"\n                android:topRightRadius=\"6dp\" />\n            <solid android:color=\"?attr/colorSurfaceBright\" />\n        </shape>\n    </item>\n</ripple>"
  },
  {
    "path": "app/src/main/res/drawable/shape_cell_middle.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<ripple xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:color=\"?colorControlHighlight\">\n    <item>\n        <shape>\n            <corners android:radius=\"6dp\" />\n            <solid android:color=\"?attr/colorSurfaceBright\" />\n        </shape>\n    </item>\n</ripple>"
  },
  {
    "path": "app/src/main/res/drawable/shape_cell_single.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<ripple xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:color=\"?colorControlHighlight\">\n    <item>\n        <shape>\n            <corners android:radius=\"12dp\" />\n            <solid android:color=\"?attr/colorSurfaceBright\" />\n        </shape>\n    </item>\n</ripple>"
  },
  {
    "path": "app/src/main/res/drawable/shape_cell_top.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<ripple xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:color=\"?colorControlHighlight\">\n    <item>\n        <shape>\n            <corners\n                android:bottomLeftRadius=\"6dp\"\n                android:bottomRightRadius=\"6dp\"\n                android:topLeftRadius=\"12dp\"\n                android:topRightRadius=\"12dp\" />\n            <solid android:color=\"?attr/colorSurfaceBright\" />\n        </shape>\n    </item>\n</ripple>"
  },
  {
    "path": "app/src/main/res/drawable/share_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:pathData=\"M13.12,17.023L8.921,14.732C8.191,15.512 7.153,16 6,16C3.791,16 2,14.209 2,12C2,9.791 3.791,8 6,8C7.153,8 8.191,8.487 8.921,9.267L13.12,6.977C13.042,6.664 13,6.337 13,6C13,3.791 14.791,2 17,2C19.209,2 21,3.791 21,6C21,8.209 19.209,10 17,10C15.847,10 14.809,9.513 14.079,8.732L9.88,11.023C9.958,11.335 10,11.663 10,12C10,12.337 9.958,12.664 9.88,12.977L14.079,15.267C14.809,14.488 15.847,14 17,14C19.209,14 21,15.791 21,18C21,20.209 19.209,22 17,22C14.791,22 13,20.209 13,18C13,17.663 13.042,17.336 13.12,17.023ZM6,14C7.105,14 8,13.105 8,12C8,10.895 7.105,10 6,10C4.895,10 4,10.895 4,12C4,13.105 4.895,14 6,14ZM17,8C18.105,8 19,7.105 19,6C19,4.895 18.105,4 17,4C15.895,4 15,4.895 15,6C15,7.105 15.895,8 17,8ZM17,20C18.105,20 19,19.105 19,18C19,16.895 18.105,16 17,16C15.895,16 15,16.895 15,18C15,19.105 15.895,20 17,20Z\"\n      android:fillColor=\"?attr/colorControlNormal\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/shield_keyhole_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:pathData=\"M12,1L20.217,2.826C20.674,2.928 21,3.333 21,3.802V13.789C21,15.795 19.997,17.668 18.328,18.781L12,23L5.672,18.781C4.003,17.668 3,15.795 3,13.789V3.802C3,3.333 3.326,2.928 3.783,2.826L12,1ZM12,3.049L5,4.604V13.789C5,15.126 5.668,16.375 6.781,17.117L12,20.596L17.219,17.117C18.332,16.375 19,15.126 19,13.789V4.604L12,3.049ZM12,7C13.105,7 14,7.895 14,9C14,9.74 13.598,10.386 13.001,10.732L13,15H11L11,10.732C10.402,10.387 10,9.74 10,9C10,7.895 10.895,7 12,7Z\"\n      android:fillColor=\"?attr/colorControlNormal\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/shiply_official.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    ** 专有代码声明 **\n\n    此矢量图片文件来自 Shiply 官方标识矢量图，\n    Shiply 标识商标（如有）和原创权利人为深圳市腾讯计算机系统有限公司和/或其关联公司。\n\n    QQ 版本列表实用工具承诺不将此文件用于或授权任何非权利人用于任何形式的商业用途。\n\n    此矢量图片文件及其代码不受本项目 GNU Affero General Public License Version 3 开源许可约束，\n    未经许可，不得用于任何形式的商业用途或其他未经授权的用途。\n\n    本项目对“QQ”、Shiply 标识、“Shiply”的使用旨在注明和指向对应主体，\n    并非表示对“QQ”、Shiply 标识、“Shiply”商标（如有）的注册和拥有。\n\n    此文本如有任何中英文版本之间的差异，以中文版本为准。\n\n    ** Proprietary Code Statement **\n\n    This vector image file was recreated by the Shiply official logo.\n    Any trademarks of Shiply logos contained in this file and their original rights belong to 深圳市腾讯计算机系统有限公司 and/or its affiliates.\n\n    The Qverbow Util commits to not using this file for or authorizing any non-right holders to use it for any commercial purposes.\n\n    This vector image file and its code are not subject to the open-source license of this project, the GNU Affero General Public License Version 3.\n    Without permission, it shall not be used for any commercial purposes or other unauthorized uses.\n\n    The use of \"QQ\", the Shiply logo, and \"Shiply\" by this project is intended only to refer to the corresponding entities,\n    and does not imply registration or ownership of the trademarks \"QQ\", the Shiply logo, and \"Shiply\" (if any).\n\n    In case of any discrepancies between the Chinese and English versions of this text, the Chinese version shall prevail.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"166.25dp\"\n    android:height=\"175dp\"\n    android:viewportWidth=\"166.25\"\n    android:viewportHeight=\"175\">\n    <path\n        android:fillColor=\"?attr/colorControlNormal\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M83.13,8.75C92.63,8.75 101.76,10.34 110.27,13.28C114.63,8.76 119.44,4.32 124.74,0C122.77,2.81 119.77,8.31 116.66,15.79C145.87,28.68 166.25,57.9 166.25,91.87C166.25,137.78 129.04,175 83.13,175C37.22,175 0,137.78 0,91.87C0,45.97 37.22,8.75 83.13,8.75ZM119,134C94.67,90.05 106.22,40.81 116.39,15.46C114.5,14.56 112.57,13.74 110.6,13C67.87,58.88 69.63,113.68 74.38,134C84.01,126.3 108.14,130.79 119,134ZM67.03,126.98C56.25,89.86 75.51,52.14 86.49,37.92C45.32,70.85 41.58,105.77 40.83,120.99C51.61,118.6 62.79,123.98 67.03,126.98ZM127.62,151.51L44.17,151.51C43.82,151.51 43.48,151.37 43.24,151.11L23.69,130.51C22.83,129.6 23.65,128.11 24.88,128.36L127.87,148.96C129.4,149.26 129.18,151.51 127.62,151.51Z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/skip_forward_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:pathData=\"M16 12.6667L5.77735 19.4818C5.54759 19.6349 5.23715 19.5729 5.08397 19.3431C5.02922 19.261 5 19.1645 5 19.0657V4.93426C5 4.65812 5.22386 4.43426 5.5 4.43426C5.59871 4.43426 5.69522 4.46348 5.77735 4.51823L16 11.3333V5C16 4.44772 16.4477 4 17 4C17.5523 4 18 4.44772 18 5V19C18 19.5523 17.5523 20 17 20C16.4477 20 16 19.5523 16 19V12.6667ZM7 7.73703V16.263L13.3944 12L7 7.73703Z\"\n      android:fillColor=\"?attr/colorControlNormal\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/sparkling_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:pathData=\"M14,4.438C15.346,4.438 16.438,3.346 16.438,2H17.563C17.563,3.346 18.654,4.438 20,4.438V5.563C18.654,5.563 17.563,6.654 17.563,8H16.438C16.438,6.654 15.346,5.563 14,5.563V4.438ZM1,11C4.314,11 7,8.314 7,5H9C9,8.314 11.686,11 15,11V13C11.686,13 9,15.686 9,19H7C7,15.686 4.314,13 1,13V11ZM4.876,12C6.187,12.728 7.272,13.813 8,15.124 8.728,13.813 9.813,12.728 11.124,12 9.813,11.272 8.728,10.187 8,8.876 7.272,10.187 6.187,11.272 4.876,12ZM17.25,14C17.25,15.795 15.795,17.25 14,17.25V18.75C15.795,18.75 17.25,20.205 17.25,22H18.75C18.75,20.205 20.205,18.75 22,18.75V17.25C20.205,17.25 18.75,15.795 18.75,14H17.25Z\"\n      android:fillColor=\"?attr/colorOnSecondaryContainer\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/stack_line.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"16dp\"\n    android:height=\"16dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:pathData=\"M20.083,15.2L21.285,15.921C21.522,16.063 21.599,16.37 21.457,16.607C21.415,16.678 21.356,16.736 21.285,16.779L12.514,22.041C12.198,22.231 11.802,22.231 11.485,22.041L2.715,16.779C2.478,16.637 2.401,16.33 2.543,16.093C2.585,16.022 2.644,15.963 2.715,15.921L3.917,15.2L12,20.05L20.083,15.2ZM20.083,10.5L21.285,11.221C21.522,11.363 21.599,11.67 21.457,11.907C21.415,11.978 21.356,12.036 21.285,12.079L12,17.65L2.715,12.079C2.478,11.937 2.401,11.63 2.543,11.393C2.585,11.322 2.644,11.263 2.715,11.221L3.917,10.5L12,15.35L20.083,10.5ZM12.514,1.309L21.285,6.571C21.522,6.713 21.599,7.02 21.457,7.257C21.415,7.328 21.356,7.386 21.285,7.429L12,13L2.715,7.429C2.478,7.287 2.401,6.979 2.543,6.743C2.585,6.672 2.644,6.613 2.715,6.571L11.485,1.309C11.802,1.119 12.198,1.119 12.514,1.309ZM12,3.332L5.887,7L12,10.668L18.113,7L12,3.332Z\"\n      android:fillColor=\"?attr/colorControlNormal\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/stop_fill.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\r\n   Copyright 2018 Remix-Design\r\n\r\n   Licensed under the Apache License, Version 2.0 (the \"License\");\r\n   you may not use this file except in compliance with the License.\r\n   You may obtain a copy of the License at\r\n\r\n       http://www.apache.org/licenses/LICENSE-2.0\r\n\r\n   Unless required by applicable law or agreed to in writing, software\r\n   distributed under the License is distributed on an \"AS IS\" BASIS,\r\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n   See the License for the specific language governing permissions and\r\n   limitations under the License.\r\n-->\r\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n    android:width=\"24dp\"\r\n    android:height=\"24dp\"\r\n    android:viewportWidth=\"24\"\r\n    android:viewportHeight=\"24\">\r\n  <path\r\n      android:pathData=\"M6 5H18C18.5523 5 19 5.44772 19 6V18C19 18.5523 18.5523 19 18 19H6C5.44772 19 5 18.5523 5 18V6C5 5.44772 5.44772 5 6 5Z\"\r\n      android:fillColor=\"?attr/colorControlNormal\"/>\r\n</vector>\r\n"
  },
  {
    "path": "app/src/main/res/drawable/stop_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:pathData=\"M7,7V17H17V7H7ZM6,5H18C18.552,5 19,5.448 19,6V18C19,18.552 18.552,19 18,19H6C5.448,19 5,18.552 5,18V6C5,5.448 5.448,5 6,5Z\"\n      android:fillColor=\"?attr/colorControlNormal\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/tencent_logo.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    https://www.iconfont.cn/\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"200dp\"\n    android:height=\"200dp\"\n    android:viewportWidth=\"1024\"\n    android:viewportHeight=\"1024\">\n    <path\n        android:fillColor=\"?attr/colorControlNormal\"\n        android:pathData=\"M234.1,1024l153.6,-672.9H117L58.5,197.5h358.4L468.1,0l497.4,351.1H570.5L416.9,1024z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/tools_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Copyright 2018 Remix-Design\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"?attr/colorControlNormal\"\n        android:pathData=\"M5.329,3.272C6.563,2.833 7.992,3.107 8.979,4.094C10.1,5.215 10.302,6.907 9.584,8.234L20.293,18.944L18.879,20.358L8.17,9.649C6.843,10.367 5.151,10.165 4.03,9.044C3.042,8.057 2.768,6.627 3.207,5.393L5.444,7.63C6.03,8.216 6.979,8.216 7.565,7.63C8.151,7.044 8.151,6.094 7.565,5.509L5.329,3.272ZM15.697,5.155L18.879,3.387L20.293,4.802L18.525,7.984L16.757,8.337L14.636,10.458L13.222,9.044L15.343,6.923L15.697,5.155ZM8.979,13.287L10.394,14.701L5.09,20.004C4.7,20.395 4.066,20.395 3.676,20.004C3.313,19.642 3.287,19.07 3.598,18.677L3.676,18.59L8.979,13.287Z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ue_icon_2023_black.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n\n  https://www.unrealengine.com/branding\n  Unreal® 及其徽标是 Epic Games, Inc. 在美国及其他国家或地区的商标或注册商标。\n  Unreal® and its logo are trademarks or registered trademarks of Epic Games, Inc. in the United States and elsewhere.\n\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"16dp\"\n    android:height=\"16dp\"\n    android:viewportWidth=\"1280\"\n    android:viewportHeight=\"1280\">\n\n    <path\n        android:fillColor=\"?attr/colorControlNormal\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M640,1280c353.5,0 640,-286.5 640,-640S993.5,0 640,0S0,286.5 0,640S286.5,1280 640,1280zM803.7,995.8c156.5,-73.9 205.6,-210.4 216.6,-263.6c-57.2,58.6 -120.5,118 -163.1,76.9c0,0 -2.3,-219.4 -2.3,-309.4c0,-121 114.8,-211.2 114.8,-211.2c-63.1,11.2 -138.9,33.7 -219.3,112.7c-7.3,7.2 -14.1,14.8 -20.6,22.7c-34.5,-26.4 -79.1,-18.5 -79.1,-18.5c24.1,13.3 48.2,51.9 48.2,83.8v314.3c0,0 -52.6,46.3 -93.2,46.3c-9.1,0.1 -18.2,-2 -26.3,-6.2c-8.2,-4.1 -15.2,-10.1 -20.6,-17.6c-3.2,-4.2 -5.9,-8.8 -7.9,-13.6V424.1c-12,9.9 -52.5,18 -52.5,-49.2c0,-41.8 30.1,-91.6 83.7,-122.2c-73.6,11.2 -142.6,43 -198.9,91.8c-42.8,37 -77,82.8 -100.3,134.4c-23.3,51.5 -35.1,107.6 -34.5,164.1c0,0 39.2,-122.5 88.3,-133.8c7.2,-1.9 14.6,-2.1 21.9,-0.5c7.2,1.5 14,4.7 19.8,9.3c5.8,4.6 10.4,10.5 13.5,17.2c3.1,6.7 4.6,14.1 4.3,21.5V844.3c0,29.2 -18.8,35.5 -36.2,35.2c-11.8,-0.8 -23.4,-3 -34.7,-6.5c35.9,48.5 82.5,88.1 136.1,115.7c53.7,27.5 113,42.3 173.4,43.1l106.1,-106.6L803.7,995.8z\" />\n\n</vector>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_local_app_details.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/main\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:fitsSystemWindows=\"true\"\n    tools:context=\".ui.LocalAppDetailsActivity\">\n\n    <com.google.android.material.appbar.AppBarLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:fitsSystemWindows=\"true\">\n\n        <com.google.android.material.appbar.MaterialToolbar\n            android:id=\"@+id/topAppBar\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:minHeight=\"?attr/actionBarSize\"\n            app:navigationIcon=\"@drawable/arrow_left_line\"\n            app:subtitle=\"@string/app_name\" />\n\n    </com.google.android.material.appbar.AppBarLayout>\n\n    <androidx.core.widget.NestedScrollView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"11dp\"\n            android:layout_marginTop=\"11dp\"\n            android:layout_marginEnd=\"11dp\"\n            android:layout_marginBottom=\"120dp\"\n            android:orientation=\"vertical\">\n\n            <com.google.android.material.card.MaterialCardView\n                style=\"?attr/materialCardViewFilledStyle\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_margin=\"5dp\"\n                app:cardBackgroundColor=\"?attr/colorSurfaceContainerLow\">\n\n                <LinearLayout\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:gravity=\"center_horizontal\"\n                    android:orientation=\"vertical\"\n                    android:padding=\"12dp\">\n\n                    <ImageView\n                        android:id=\"@+id/local_icon\"\n                        android:layout_width=\"80dp\"\n                        android:layout_height=\"80dp\" />\n\n                    <TextView\n                        android:id=\"@+id/local_name\"\n                        style=\"?attr/textAppearanceHeadlineLarge\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginBottom=\"3dp\"\n                        android:gravity=\"center_horizontal\"\n                        android:text=\"QQ\"\n                        android:textColor=\"?attr/colorOnBackground\"\n                        tools:ignore=\"PrivateResource\" />\n\n                    <LinearLayout\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginBottom=\"3dp\"\n                        android:gravity=\"center_vertical\"\n                        android:orientation=\"horizontal\">\n\n                        <TextView\n                            android:id=\"@+id/local_version\"\n                            style=\"?attr/textAppearanceTitleMedium\"\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\"\n                            android:text=\"9.1.35.22760 (8708)\"\n                            android:textSize=\"18sp\" />\n\n                        <com.google.android.material.card.MaterialCardView\n                            android:id=\"@+id/local_channel_card\"\n                            style=\"?attr/materialCardViewFilledStyle\"\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\"\n                            android:layout_marginStart=\"6dp\"\n                            android:backgroundTint=\"?attr/colorSecondaryContainer\"\n                            app:layout_constraintBottom_toBottomOf=\"parent\"\n                            app:layout_constraintStart_toEndOf=\"@id/accessibility_tim_old_tag\"\n                            app:layout_constraintTop_toTopOf=\"parent\"\n                            app:shapeAppearance=\"?attr/shapeAppearanceCornerExtraSmall\">\n\n                            <TextView\n                                android:id=\"@+id/local_channel_text\"\n                                style=\"?attr/textAppearanceLabelSmall\"\n                                android:layout_width=\"wrap_content\"\n                                android:layout_height=\"wrap_content\"\n                                android:layout_marginStart=\"2dp\"\n                                android:layout_marginEnd=\"2dp\"\n                                android:letterSpacing=\"0\"\n                                android:padding=\"4dp\"\n                                android:textColor=\"?attr/colorOnSecondaryContainer\"\n                                android:textSize=\"10sp\"\n                                app:layout_constraintBottom_toBottomOf=\"@id/tv_tim_old_version\"\n                                app:layout_constraintEnd_toEndOf=\"parent\"\n                                app:layout_constraintTop_toTopOf=\"@id/tv_tim_old_version\"\n                                tools:text=\"GuanWang\" />\n\n                        </com.google.android.material.card.MaterialCardView>\n                    </LinearLayout>\n\n                    <TextView\n                        android:id=\"@+id/local_tim_base\"\n                        style=\"?attr/textAppearanceLabelSmall\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginBottom=\"3dp\"\n                        android:text=\"基于 Android QQ 9.0.95 二次开发\" />\n\n                    <TextView\n                        android:id=\"@+id/local_sdk\"\n                        style=\"?attr/textAppearanceBodyMedium\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginTop=\"3dp\"\n                        android:layout_marginBottom=\"3dp\"\n                        android:text=\"Target 31 | Min 23 | Compile 31\" />\n                </LinearLayout>\n\n            </com.google.android.material.card.MaterialCardView>\n\n            <com.google.android.material.card.MaterialCardView\n                android:id=\"@+id/detail_info\"\n                style=\"?attr/materialCardViewFilledStyle\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_margin=\"5dp\"\n                app:cardBackgroundColor=\"?attr/colorSurfaceContainerLow\">\n\n                <LinearLayout\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:gravity=\"center_vertical\"\n                    android:orientation=\"horizontal\"\n                    android:padding=\"12dp\">\n\n                    <LinearLayout\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginStart=\"6dp\"\n                        android:layout_marginEnd=\"6dp\"\n                        android:layout_weight=\"1\"\n                        android:orientation=\"vertical\">\n\n                        <TextView\n                            style=\"?attr/textAppearanceTitleSmall\"\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\"\n                            android:text=\"@string/localDetailsMsg\"\n                            android:textColor=\"?attr/colorOnSurface\" />\n                    </LinearLayout>\n\n                    <ImageView\n                        android:layout_width=\"24dp\"\n                        android:layout_height=\"24dp\"\n                        android:checked=\"false\"\n                        android:src=\"@drawable/arrow_right_s_line\" />\n                </LinearLayout>\n\n            </com.google.android.material.card.MaterialCardView>\n\n            <TextView\n                android:id=\"@+id/stack_info\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:paddingStart=\"16dp\"\n                android:paddingTop=\"8dp\"\n                android:paddingEnd=\"16dp\"\n                android:text=\"@string/stackInfo\"\n                android:textColor=\"?attr/colorPrimary\"\n                android:textSize=\"11sp\"\n                android:textStyle=\"bold\" />\n\n            <androidx.compose.ui.platform.ComposeView\n                android:id=\"@+id/stack_info_list\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\" />\n        </LinearLayout>\n    </androidx.core.widget.NestedScrollView>\n\n    <com.google.android.material.progressindicator.LinearProgressIndicator\n        android:id=\"@+id/progress_line\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"6dp\"\n        android:layout_marginEnd=\"6dp\"\n        android:elevation=\"10dp\"\n        android:indeterminate=\"true\"\n        app:layout_anchor=\"@id/topAppBar\"\n        app:layout_anchorGravity=\"bottom\" />\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/floating_action_button_llm\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"bottom|end\"\n        android:layout_margin=\"16dp\"\n        android:contentDescription=\"@string/llmInferenceLocalChanges\"\n        app:srcCompat=\"@drawable/ai_generate_2\"/>\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\r\n    Qverbow Util\r\n    Copyright (C) 2023 klxiaoniu\r\n\r\n    This program is free software: you can redistribute it and/or modify\r\n    it under the terms of the GNU Affero General Public License as\r\n    published by the Free Software Foundation, either version 3 of the\r\n    License, or (at your option) any later version.\r\n\r\n    This program is distributed in the hope that it will be useful,\r\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n    GNU Affero General Public License for more details.\r\n\r\n    You should have received a copy of the GNU Affero General Public License\r\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\r\n-->\r\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\r\n    xmlns:tools=\"http://schemas.android.com/tools\"\r\n    android:id=\"@+id/coordinatorLayout\"\r\n    android:layout_width=\"match_parent\"\r\n    android:layout_height=\"match_parent\"\r\n    android:fitsSystemWindows=\"true\"\r\n    tools:context=\".ui.MainActivity\">\r\n\r\n    <androidx.viewpager2.widget.ViewPager2\r\n        android:id=\"@+id/rv_pager\"\r\n        android:layout_width=\"match_parent\"\r\n        android:layout_height=\"wrap_content\"\r\n        android:clipToPadding=\"false\"\r\n        android:fillViewport=\"true\"\r\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\"\r\n        app:layout_constrainedHeight=\"true\" />\r\n\r\n    <com.google.android.material.appbar.AppBarLayout\r\n        android:id=\"@+id/topAppBar\"\r\n        android:layout_width=\"match_parent\"\r\n        android:layout_height=\"wrap_content\"\r\n        android:fitsSystemWindows=\"true\"\r\n        app:layout_constraintTop_toTopOf=\"parent\">\r\n\r\n        <com.google.android.material.appbar.CollapsingToolbarLayout\r\n            style=\"?attr/collapsingToolbarLayoutLargeStyle\"\r\n            android:layout_width=\"match_parent\"\r\n            android:layout_height=\"?attr/collapsingToolbarLayoutLargeSize\"\r\n            app:layout_scrollFlags=\"scroll|exitUntilCollapsed|snap\">\r\n\r\n            <com.google.android.material.appbar.MaterialToolbar\r\n                android:id=\"@+id/material_toolbar\"\r\n                android:layout_width=\"match_parent\"\r\n                android:layout_height=\"?attr/actionBarSize\"\r\n                android:elevation=\"0dp\"\r\n                app:layout_collapseMode=\"pin\"\r\n                app:title=\"@string/appTitle\" />\r\n        </com.google.android.material.appbar.CollapsingToolbarLayout>\r\n\r\n    </com.google.android.material.appbar.AppBarLayout>\r\n\r\n    <com.google.android.material.floatingtoolbar.FloatingToolbarLayout\r\n        android:id=\"@+id/floating_toolbar\"\r\n        style=\"?attr/floatingToolbarStyle\"\r\n        android:layout_width=\"wrap_content\"\r\n        android:layout_height=\"wrap_content\"\r\n        android:layout_gravity=\"bottom|end\"\r\n        android:layout_margin=\"16dp\"\r\n        android:elevation=\"6dp\"\r\n        android:fitsSystemWindows=\"true\"\r\n        app:layout_behavior=\"com.google.android.material.behavior.HideViewOnScrollBehavior\">\r\n\r\n        <LinearLayout\r\n            android:id=\"@+id/floating_toolbar_child\"\r\n            android:layout_width=\"wrap_content\"\r\n            android:layout_height=\"wrap_content\"\r\n            android:layout_gravity=\"center\"\r\n            android:orientation=\"horizontal\">\r\n\r\n            <com.google.android.material.button.MaterialButton\r\n                android:id=\"@+id/btn_about\"\r\n                style=\"?attr/materialIconButtonFilledTonalStyle\"\r\n                android:layout_width=\"wrap_content\"\r\n                android:layout_height=\"wrap_content\"\r\n                android:contentDescription=\"@string/about\"\r\n                app:icon=\"@drawable/information_line\" />\r\n\r\n            <com.google.android.material.button.MaterialButton\r\n                android:id=\"@+id/btn_setting\"\r\n                style=\"?attr/materialIconButtonFilledTonalStyle\"\r\n                android:layout_width=\"wrap_content\"\r\n                android:layout_height=\"wrap_content\"\r\n                android:contentDescription=\"@string/setting\"\r\n                app:icon=\"@drawable/settings_line\" />\r\n\r\n            <com.google.android.material.button.MaterialButton\r\n                android:id=\"@+id/btn_exp_features\"\r\n                style=\"?attr/materialIconButtonFilledTonalStyle\"\r\n                android:layout_width=\"wrap_content\"\r\n                android:layout_height=\"wrap_content\"\r\n                android:contentDescription=\"@string/experimentalFeatures\"\r\n                app:icon=\"@drawable/flask_line\" />\r\n\r\n            <com.google.android.material.button.MaterialButton\r\n                android:id=\"@+id/btn_guess\"\r\n                style=\"?attr/materialIconButtonFilledTonalStyle\"\r\n                android:layout_width=\"wrap_content\"\r\n                android:layout_height=\"wrap_content\"\r\n                android:contentDescription=\"@string/enumerateVersionsFAB\"\r\n                app:icon=\"@drawable/scan_line\" />\r\n\r\n            <com.google.android.material.button.MaterialButton\r\n                android:id=\"@+id/btn_get\"\r\n                style=\"?attr/materialIconButtonFilledTonalStyle\"\r\n                android:layout_width=\"wrap_content\"\r\n                android:layout_height=\"wrap_content\"\r\n                android:contentDescription=\"@string/refresh\"\r\n                app:icon=\"@drawable/refresh_line\" />\r\n        </LinearLayout>\r\n\r\n    </com.google.android.material.floatingtoolbar.FloatingToolbarLayout>\r\n\r\n    <com.google.android.material.progressindicator.LinearProgressIndicator\r\n        android:id=\"@+id/progress_line\"\r\n        android:layout_width=\"match_parent\"\r\n        android:layout_height=\"wrap_content\"\r\n        android:layout_marginStart=\"6dp\"\r\n        android:layout_marginEnd=\"6dp\"\r\n        android:elevation=\"10dp\"\r\n        android:indeterminate=\"true\"\r\n        app:layout_anchor=\"@id/topAppBar\"\r\n        app:layout_anchorGravity=\"bottom\" />\r\n\r\n</androidx.coordinatorlayout.widget.CoordinatorLayout>"
  },
  {
    "path": "app/src/main/res/layout/applications_config_back_button.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/applications_config_back_button_constraint_layout\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"horizontal\"\n    android:paddingStart=\"20dp\"\n    android:paddingEnd=\"20dp\"\n    android:paddingBottom=\"20dp\">\n\n    <HorizontalScrollView\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_weight=\"1\"\n        android:scrollbars=\"none\">\n\n        <com.google.android.material.button.MaterialButtonGroup\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:spacing=\"0dp\">\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/applications_config_back_btn_json_details\"\n                style=\"?attr/materialIconButtonFilledTonalStyle\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:contentDescription=\"@string/jsonDetails\"\n                app:icon=\"@drawable/braces_line\" />\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/applications_config_back_btn_share\"\n                style=\"?attr/materialIconButtonFilledTonalStyle\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:contentDescription=\"@string/share\"\n                app:icon=\"@drawable/share_line\" />\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/applications_config_back_btn_download\"\n                style=\"?attr/materialIconButtonFilledTonalStyle\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:contentDescription=\"@string/download\"\n                app:icon=\"@drawable/download_line\" />\n\n        </com.google.android.material.button.MaterialButtonGroup>\n\n    </HorizontalScrollView>\n\n    <com.google.android.material.button.MaterialButton\n        android:id=\"@+id/applications_config_back_btn_copy\"\n        style=\"@style/Widget.Material3.Button.Icon\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"@string/copy\"\n        app:icon=\"@drawable/file_copy_line\" />\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/bottomsheet_shiply_advanced_config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/ll_tencent_shiply\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:gravity=\"center_horizontal\"\n    android:orientation=\"vertical\"\n    android:paddingStart=\"32dp\"\n    android:paddingEnd=\"32dp\">\n\n    <ImageView\n        android:id=\"@+id/drag_handle_view\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:contentDescription=\"@string/back\"\n        android:minWidth=\"48dp\"\n        android:minHeight=\"48dp\"\n        android:paddingBottom=\"20dp\"\n        android:scaleType=\"center\"\n        android:src=\"@drawable/bottom_sheet_drag_handle\" />\n\n    <ScrollView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:scrollbars=\"none\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\">\n\n            <com.google.android.material.textfield.TextInputLayout\n                android:id=\"@+id/shiply_appid\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginBottom=\"8dp\"\n                android:hint=\"@string/appidOptional\"\n                app:helperText=\"@string/shiplyGeneralOptionalHelpText\"\n                app:helperTextEnabled=\"true\">\n\n                <com.google.android.material.textfield.TextInputEditText\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:imeOptions=\"actionNext\"\n                    android:singleLine=\"true\" />\n\n            </com.google.android.material.textfield.TextInputLayout>\n\n            <com.google.android.material.textfield.TextInputLayout\n                android:id=\"@+id/shiply_os_version\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginBottom=\"8dp\"\n                android:hint=\"@string/shiplyOsVersionOptional\"\n                app:helperText=\"@string/shiplyGeneralOptionalHelpText\"\n                app:helperTextEnabled=\"true\">\n\n                <com.google.android.material.textfield.TextInputEditText\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:imeOptions=\"actionNext\"\n                    android:singleLine=\"true\" />\n\n            </com.google.android.material.textfield.TextInputLayout>\n\n            <com.google.android.material.textfield.TextInputLayout\n                android:id=\"@+id/shiply_model\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginBottom=\"8dp\"\n                android:hint=\"@string/shiplyModelOptional\"\n                app:helperText=\"@string/shiplyGeneralOptionalHelpText\"\n                app:helperTextEnabled=\"true\">\n\n                <com.google.android.material.textfield.TextInputEditText\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:imeOptions=\"actionNext\"\n                    android:singleLine=\"true\" />\n\n            </com.google.android.material.textfield.TextInputLayout>\n\n            <com.google.android.material.textfield.TextInputLayout\n                android:id=\"@+id/shiply_sdk_version\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginBottom=\"8dp\"\n                android:hint=\"@string/shiplySdkVersionOptional\"\n                app:helperText=\"@string/shiplyGeneralOptionalHelpText\"\n                app:helperTextEnabled=\"true\">\n\n                <com.google.android.material.textfield.TextInputEditText\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:imeOptions=\"actionNext\"\n                    android:singleLine=\"true\" />\n\n            </com.google.android.material.textfield.TextInputLayout>\n\n            <com.google.android.material.textfield.TextInputLayout\n                android:id=\"@+id/shiply_language\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginBottom=\"6dp\"\n                android:hint=\"@string/shiplyLanguageOptional\"\n                app:helperText=\"@string/shiplyGeneralOptionalHelpText\"\n                app:helperTextEnabled=\"true\">\n\n                <com.google.android.material.textfield.TextInputEditText\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:imeOptions=\"actionDone\"\n                    android:singleLine=\"true\" />\n\n            </com.google.android.material.textfield.TextInputLayout>\n\n\n            <com.google.android.material.button.MaterialButtonGroup\n                style=\"?android:attr/buttonBarStyle\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"8dp\"\n                android:paddingBottom=\"32dp\">\n\n                <com.google.android.material.button.MaterialButton\n                    android:id=\"@+id/btn_shiply_config_back\"\n                    style=\"@style/Widget.Material3.Button.TonalButton\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginEnd=\"8dp\"\n                    android:layout_weight=\"1\"\n                    android:text=\"@string/back\" />\n\n                <com.google.android.material.button.MaterialButton\n                    android:id=\"@+id/btn_shiply_config_save\"\n                    style=\"@style/Widget.Material3.Button\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"8dp\"\n                    android:layout_weight=\"1\"\n                    android:text=\"@string/save\" />\n\n            </com.google.android.material.button.MaterialButtonGroup>\n        </LinearLayout>\n    </ScrollView>\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/cell_bottom_click.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_marginTop=\"2dp\"\n    android:background=\"@drawable/shape_cell_bottom\"\n    android:gravity=\"center_vertical\"\n    android:orientation=\"horizontal\"\n    android:paddingStart=\"12dp\"\n    android:paddingTop=\"10dp\"\n    android:paddingEnd=\"12dp\"\n    android:paddingBottom=\"12dp\">\n\n    <ImageView\n        android:id=\"@+id/icon\"\n        android:layout_width=\"24dp\"\n        android:layout_height=\"24dp\"\n        android:src=\"@drawable/apps_line\"\n        app:tint=\"?attr/colorPrimary\" />\n\n    <LinearLayout\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"6dp\"\n        android:layout_marginEnd=\"6dp\"\n        android:layout_weight=\"1\"\n        android:orientation=\"vertical\">\n\n        <TextView\n            android:id=\"@+id/title\"\n            style=\"?attr/textAppearanceTitleSmall\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"我是标题\"\n            android:textColor=\"?attr/colorOnSurface\" />\n\n        <TextView\n            android:id=\"@+id/description\"\n            style=\"?attr/textAppearanceBodySmall\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"4dp\"\n            android:text=\"我是长文本描述占位符我是长文本描述占位符我是长文本描述占位符我是长文本描述占位符我是长文本描述占位符\"\n            android:textColor=\"?attr/colorOnSurfaceVariant\" />\n    </LinearLayout>\n\n    <ImageView\n        android:id=\"@+id/endImage\"\n        android:layout_width=\"24dp\"\n        android:layout_height=\"24dp\"\n        android:checked=\"false\"\n        android:src=\"@drawable/arrow_right_s_line\" />\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/cell_bottom_switch.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_marginTop=\"2dp\"\n    android:background=\"@drawable/shape_cell_bottom\"\n    android:gravity=\"center_vertical\"\n    android:orientation=\"horizontal\"\n    android:paddingStart=\"12dp\"\n    android:paddingTop=\"4dp\"\n    android:paddingEnd=\"12dp\"\n    android:paddingBottom=\"6dp\">\n\n    <ImageView\n        android:id=\"@+id/icon\"\n        android:layout_width=\"24dp\"\n        android:layout_height=\"24dp\"\n        android:layout_marginTop=\"6dp\"\n        android:layout_marginBottom=\"6dp\"\n        android:src=\"@drawable/apps_line\"\n        app:tint=\"?attr/colorPrimary\" />\n\n    <LinearLayout\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"6dp\"\n        android:layout_weight=\"1\"\n        android:orientation=\"vertical\">\n\n        <TextView\n            android:id=\"@+id/title\"\n            style=\"?attr/textAppearanceTitleSmall\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"我是标题\"\n            android:textColor=\"?attr/colorOnSurface\" />\n\n        <TextView\n            android:id=\"@+id/description\"\n            style=\"?attr/textAppearanceBodySmall\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"4dp\"\n            android:text=\"我是长文本描述占位符我是长文本描述占位符我是长文本描述占位符我是长文本描述占位符我是长文本描述占位符\"\n            android:textColor=\"?attr/colorOnSurfaceVariant\" />\n    </LinearLayout>\n\n    <com.google.android.material.materialswitch.MaterialSwitch\n        android:id=\"@+id/switchCompat\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:checked=\"false\"\n        android:clickable=\"false\"\n        android:focusable=\"false\" />\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/cell_middle_click.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_marginTop=\"2dp\"\n    android:layout_marginBottom=\"2dp\"\n    android:background=\"@drawable/shape_cell_middle\"\n    android:gravity=\"center_vertical\"\n    android:orientation=\"horizontal\"\n    android:paddingStart=\"12dp\"\n    android:paddingTop=\"10dp\"\n    android:paddingEnd=\"12dp\"\n    android:paddingBottom=\"10dp\">\n\n    <ImageView\n        android:id=\"@+id/icon\"\n        android:layout_width=\"24dp\"\n        android:layout_height=\"24dp\"\n        android:src=\"@drawable/apps_line\"\n        app:tint=\"?attr/colorPrimary\" />\n\n    <LinearLayout\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"6dp\"\n        android:layout_marginEnd=\"6dp\"\n        android:layout_weight=\"1\"\n        android:orientation=\"vertical\">\n\n        <TextView\n            android:id=\"@+id/title\"\n            style=\"?attr/textAppearanceTitleSmall\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"我是标题\"\n            android:textColor=\"?attr/colorOnSurface\" />\n\n        <TextView\n            android:id=\"@+id/description\"\n            style=\"?attr/textAppearanceBodySmall\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"4dp\"\n            android:text=\"我是长文本描述占位符我是长文本描述占位符我是长文本描述占位符我是长文本描述占位符我是长文本描述占位符\"\n            android:textColor=\"?attr/colorOnSurfaceVariant\" />\n    </LinearLayout>\n\n    <ImageView\n        android:id=\"@+id/endImage\"\n        android:layout_width=\"24dp\"\n        android:layout_height=\"24dp\"\n        android:checked=\"false\"\n        android:src=\"@drawable/arrow_right_s_line\" />\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/cell_middle_switch.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_marginTop=\"2dp\"\n    android:layout_marginBottom=\"2dp\"\n    android:background=\"@drawable/shape_cell_middle\"\n    android:gravity=\"center_vertical\"\n    android:orientation=\"horizontal\"\n    android:paddingStart=\"12dp\"\n    android:paddingTop=\"4dp\"\n    android:paddingEnd=\"12dp\"\n    android:paddingBottom=\"4dp\">\n\n    <ImageView\n        android:id=\"@+id/icon\"\n        android:layout_width=\"24dp\"\n        android:layout_height=\"24dp\"\n        android:layout_marginTop=\"6dp\"\n        android:layout_marginBottom=\"6dp\"\n        android:src=\"@drawable/apps_line\"\n        app:tint=\"?attr/colorPrimary\" />\n\n    <LinearLayout\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"6dp\"\n        android:layout_weight=\"1\"\n        android:orientation=\"vertical\">\n\n        <TextView\n            android:id=\"@+id/title\"\n            style=\"?attr/textAppearanceTitleSmall\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"我是标题\"\n            android:textColor=\"?attr/colorOnSurface\" />\n\n        <TextView\n            android:id=\"@+id/description\"\n            style=\"?attr/textAppearanceBodySmall\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"4dp\"\n            android:text=\"我是长文本描述占位符我是长文本描述占位符我是长文本描述占位符我是长文本描述占位符我是长文本描述占位符\"\n            android:textColor=\"?attr/colorOnSurfaceVariant\" />\n    </LinearLayout>\n\n    <com.google.android.material.materialswitch.MaterialSwitch\n        android:id=\"@+id/switchCompat\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:checked=\"false\"\n        android:clickable=\"false\"\n        android:focusable=\"false\" />\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/cell_single_click.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"@drawable/shape_cell_single\"\n    android:gravity=\"center_vertical\"\n    android:orientation=\"horizontal\"\n    android:padding=\"12dp\">\n\n    <ImageView\n        android:id=\"@+id/icon\"\n        android:layout_width=\"24dp\"\n        android:layout_height=\"24dp\"\n        android:src=\"@drawable/apps_line\"\n        app:tint=\"?attr/colorPrimary\" />\n\n    <LinearLayout\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"6dp\"\n        android:layout_marginEnd=\"6dp\"\n        android:layout_weight=\"1\"\n        android:orientation=\"vertical\">\n\n        <TextView\n            android:id=\"@+id/title\"\n            style=\"?attr/textAppearanceTitleSmall\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"我是标题\"\n            android:textColor=\"?attr/colorOnSurface\" />\n\n        <TextView\n            android:id=\"@+id/description\"\n            style=\"?attr/textAppearanceBodySmall\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"4dp\"\n            android:text=\"我是长文本描述占位符我是长文本描述占位符我是长文本描述占位符我是长文本描述占位符我是长文本描述占位符\"\n            android:textColor=\"?attr/colorOnSurfaceVariant\" />\n    </LinearLayout>\n\n    <ImageView\n        android:id=\"@+id/endImage\"\n        android:layout_width=\"24dp\"\n        android:layout_height=\"24dp\"\n        android:checked=\"false\"\n        android:src=\"@drawable/arrow_right_s_line\" />\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/cell_single_switch.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"@drawable/shape_cell_single\"\n    android:gravity=\"center_vertical\"\n    android:orientation=\"horizontal\"\n    android:paddingStart=\"12dp\"\n    android:paddingTop=\"6dp\"\n    android:paddingEnd=\"12dp\"\n    android:paddingBottom=\"6dp\">\n\n    <ImageView\n        android:id=\"@+id/icon\"\n        android:layout_width=\"24dp\"\n        android:layout_height=\"24dp\"\n        android:layout_marginTop=\"6dp\"\n        android:layout_marginBottom=\"6dp\"\n        android:src=\"@drawable/apps_line\"\n        app:tint=\"?attr/colorPrimary\" />\n\n    <LinearLayout\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"6dp\"\n        android:layout_weight=\"1\"\n        android:orientation=\"vertical\">\n\n        <TextView\n            android:id=\"@+id/title\"\n            style=\"?attr/textAppearanceTitleSmall\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"我是标题\"\n            android:textColor=\"?attr/colorOnSurface\" />\n\n        <TextView\n            android:id=\"@+id/description\"\n            style=\"?attr/textAppearanceBodySmall\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"4dp\"\n            android:text=\"我是长文本描述占位符我是长文本描述占位符我是长文本描述占位符我是长文本描述占位符我是长文本描述占位符\"\n            android:textColor=\"?attr/colorOnSurfaceVariant\" />\n    </LinearLayout>\n\n    <com.google.android.material.materialswitch.MaterialSwitch\n        android:id=\"@+id/switchCompat\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:checked=\"false\"\n        android:clickable=\"false\"\n        android:focusable=\"false\" />\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/cell_top_click.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_marginBottom=\"2dp\"\n    android:background=\"@drawable/shape_cell_top\"\n    android:gravity=\"center_vertical\"\n    android:orientation=\"horizontal\"\n    android:paddingStart=\"12dp\"\n    android:paddingTop=\"12dp\"\n    android:paddingEnd=\"12dp\"\n    android:paddingBottom=\"10dp\">\n\n    <ImageView\n        android:id=\"@+id/icon\"\n        android:layout_width=\"24dp\"\n        android:layout_height=\"24dp\"\n        android:src=\"@drawable/apps_line\"\n        app:tint=\"?attr/colorPrimary\" />\n\n    <LinearLayout\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"6dp\"\n        android:layout_marginEnd=\"6dp\"\n        android:layout_weight=\"1\"\n        android:orientation=\"vertical\">\n\n        <TextView\n            android:id=\"@+id/title\"\n            style=\"?attr/textAppearanceTitleSmall\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"我是标题\"\n            android:textColor=\"?attr/colorOnSurface\" />\n\n        <TextView\n            android:id=\"@+id/description\"\n            style=\"?attr/textAppearanceBodySmall\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"4dp\"\n            android:text=\"我是长文本描述占位符我是长文本描述占位符我是长文本描述占位符我是长文本描述占位符我是长文本描述占位符\"\n            android:textColor=\"?attr/colorOnSurfaceVariant\" />\n    </LinearLayout>\n\n    <ImageView\n        android:id=\"@+id/endImage\"\n        android:layout_width=\"24dp\"\n        android:layout_height=\"24dp\"\n        android:checked=\"false\"\n        android:src=\"@drawable/arrow_right_s_line\" />\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/cell_top_switch.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_marginBottom=\"2dp\"\n    android:background=\"@drawable/shape_cell_top\"\n    android:gravity=\"center_vertical\"\n    android:orientation=\"horizontal\"\n    android:paddingStart=\"12dp\"\n    android:paddingTop=\"6dp\"\n    android:paddingEnd=\"12dp\"\n    android:paddingBottom=\"4dp\">\n\n    <ImageView\n        android:id=\"@+id/icon\"\n        android:layout_width=\"24dp\"\n        android:layout_height=\"24dp\"\n        android:layout_marginTop=\"6dp\"\n        android:layout_marginBottom=\"6dp\"\n        android:src=\"@drawable/apps_line\"\n        app:tint=\"?attr/colorPrimary\" />\n\n    <LinearLayout\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"6dp\"\n        android:layout_weight=\"1\"\n        android:orientation=\"vertical\">\n\n        <TextView\n            android:id=\"@+id/title\"\n            style=\"?attr/textAppearanceTitleSmall\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"我是标题\"\n            android:textColor=\"?attr/colorOnSurface\" />\n\n        <TextView\n            android:id=\"@+id/description\"\n            style=\"?attr/textAppearanceBodySmall\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"4dp\"\n            android:text=\"我是长文本描述占位符我是长文本描述占位符我是长文本描述占位符我是长文本描述占位符我是长文本描述占位符\"\n            android:textColor=\"?attr/colorOnSurfaceVariant\" />\n    </LinearLayout>\n\n    <com.google.android.material.materialswitch.MaterialSwitch\n        android:id=\"@+id/switchCompat\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:checked=\"false\"\n        android:clickable=\"false\"\n        android:focusable=\"false\" />\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/dialog_about.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\"\n    android:paddingStart=\"20dp\"\n    android:paddingTop=\"8dp\"\n    android:paddingEnd=\"20dp\">\n\n    <ScrollView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:scrollbars=\"none\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            android:paddingBottom=\"20dp\">\n\n            <TextView\n                android:id=\"@+id/about_text\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:padding=\"4dp\" />\n\n            <ImageView\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:contentDescription=\"Built with Material 3, Licensed under GNU Affero General Public License Version 3.\"\n                android:paddingTop=\"8dp\"\n                android:paddingBottom=\"4dp\"\n                android:src=\"@drawable/built_with_material_licensed_under_agpl_v3\"\n                tools:ignore=\"HardcodedText\" />\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/btn_about_ok\"\n                style=\"@style/Widget.Material3.Button.TonalButton\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"8dp\"\n                android:text=\"@string/done\" />\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/btn_about_update\"\n                style=\"@style/Widget.Material3.Button.TonalButton\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/checkUpdateViaGitHubAPI\" />\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/btn_about_withdrawConsentUA\"\n                style=\"@style/Widget.Material3.Button.TonalButton\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/withdrawConsentUA\"\n                android:textColor=\"?attr/colorOnErrorContainer\"\n                app:backgroundTint=\"?attr/colorErrorContainer\"\n                app:iconTint=\"?attr/colorOnErrorContainer\" />\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/btn_about_shared_list\"\n                style=\"@style/Widget.Material3.Button.TextButton\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/threePartySharedList\" />\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/btn_about_open_source\"\n                style=\"@style/Widget.Material3.Button.TextButton\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/openSourceLicenseTitle\" />\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/btn_about_hash\"\n                style=\"@style/Widget.Material3.Button.TextButton\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/qverbowHash\" />\n        </LinearLayout>\n    </ScrollView>\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/dialog_changes_llm_inference.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\"\n    android:paddingStart=\"20dp\"\n    android:paddingTop=\"12dp\"\n    android:paddingEnd=\"20dp\">\n\n    <ScrollView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:scrollbars=\"none\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:paddingBottom=\"20dp\"\n            android:orientation=\"vertical\">\n\n            <TextView\n                android:id=\"@+id/version_change_info\"\n                style=\"?attr/textAppearanceLabelSmall\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginBottom=\"12dp\"\n                android:paddingStart=\"8dp\"\n                android:paddingEnd=\"8dp\"\n                android:text=\"版本信息占位符\"\n                android:textColor=\"?attr/colorOnSurface\" />\n\n            <com.google.android.material.progressindicator.LinearProgressIndicator\n                android:id=\"@+id/progress_indicator\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginBottom=\"12dp\"\n                android:elevation=\"10dp\"\n                android:indeterminate=\"true\" />\n\n            <com.google.android.material.card.MaterialCardView\n                android:id=\"@+id/llm_gen_card\"\n                style=\"?attr/materialCardViewOutlinedStyle\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginBottom=\"12dp\"\n                android:backgroundTint=\"?attr/colorSecondaryContainer\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:strokeColor=\"?attr/colorSecondaryContainer\"\n                app:strokeWidth=\"0dp\">\n\n                <LinearLayout\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:orientation=\"vertical\"\n                    android:padding=\"10dp\">\n\n                    <TextView\n                        android:id=\"@+id/llm_gen_text\"\n                        style=\"?attr/textAppearanceBodySmall\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:gravity=\"center_vertical\"\n                        android:paddingStart=\"1dp\"\n                        android:paddingEnd=\"1dp\"\n                        android:text=\"AI LLM 生成内容占位符\"\n                        android:textColor=\"?attr/colorOnSecondaryContainer\" />\n\n                </LinearLayout>\n            </com.google.android.material.card.MaterialCardView>\n\n            <LinearLayout\n                android:id=\"@+id/ai_gen_tips\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"8dp\"\n                android:layout_marginBottom=\"4dp\"\n                android:orientation=\"horizontal\"\n                tools:ignore=\"UseCompoundDrawables\">\n\n                <ImageView\n                    android:layout_width=\"16dp\"\n                    android:layout_height=\"16dp\"\n                    android:src=\"@drawable/information_line\" />\n\n                <TextView\n                    android:id=\"@+id/ai_gen_tips_text\"\n                    style=\"?attr/textAppearanceLabelSmall\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginBottom=\"8dp\"\n                    android:drawablePadding=\"8dp\"\n                    android:gravity=\"center_vertical\"\n                    android:paddingStart=\"6dp\"\n                    android:paddingEnd=\"0dp\"\n                    android:text=\"@string/genByAITips\"\n                    android:textColor=\"?attr/colorOnSurface\" />\n            </LinearLayout>\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/btn_copy\"\n                style=\"@style/Widget.Material3.Button.TonalButton\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_weight=\"1\"\n                android:text=\"@string/copy\" />\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/btn_ok\"\n                style=\"@style/Widget.Material3.Button.TonalButton\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_weight=\"1\"\n                android:text=\"@string/done\" />\n        </LinearLayout>\n    </ScrollView>\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/dialog_exp_back.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:paddingStart=\"4dp\"\n    android:paddingTop=\"8dp\"\n    android:paddingEnd=\"4dp\">\n\n    <me.zhanghai.android.fastscroll.FastScrollNestedScrollView\n        android:id=\"@+id/exp_back_text_scroll\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:paddingStart=\"12dp\"\n        android:paddingEnd=\"12dp\"\n        android:scrollbars=\"none\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\">\n\n            <TextView\n                android:id=\"@+id/exp_url_back_title\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:paddingStart=\"10dp\"\n                android:paddingEnd=\"10dp\"\n                android:paddingBottom=\"6dp\"\n                android:text=\"@string/recommendations\"\n                android:textColor=\"?attr/colorPrimary\"\n                android:textSize=\"11sp\"\n                android:textStyle=\"bold\" />\n\n            <androidx.recyclerview.widget.RecyclerView\n                android:id=\"@+id/exp_url_recycler_view\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:nestedScrollingEnabled=\"false\"\n                app:layout_constraintTop_toTopOf=\"parent\" />\n\n            <TextView\n                android:id=\"@+id/exp_back_title\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:paddingStart=\"10dp\"\n                android:paddingEnd=\"10dp\"\n                android:paddingBottom=\"4dp\"\n                android:text=\"@string/sourceJSON\"\n                android:textColor=\"?attr/colorPrimary\"\n                android:textSize=\"11sp\"\n                android:textStyle=\"bold\" />\n\n            <TextView\n                android:id=\"@+id/exp_back_text\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:paddingStart=\"4dp\"\n                android:paddingEnd=\"4dp\"\n                android:paddingBottom=\"20dp\"\n                android:text=\"我是一段测试文本\\n我也是一段测试文本\\n兄弟，我还是\\n兄弟，我没了\"\n                android:textIsSelectable=\"true\" />\n\n        </LinearLayout>\n    </me.zhanghai.android.fastscroll.FastScrollNestedScrollView>\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/dialog_experimental_features.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/experimental_features\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\"\n    android:paddingStart=\"20dp\"\n    android:paddingTop=\"2dp\"\n    android:paddingEnd=\"20dp\">\n\n    <com.google.android.material.progressindicator.LinearProgressIndicator\n        android:id=\"@+id/progress_indicator\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:elevation=\"10dp\"\n        android:indeterminate=\"true\" />\n\n    <ScrollView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:scrollbars=\"none\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            android:paddingBottom=\"20dp\">\n\n            <com.xiaoniu.qqversionlist.ui.components.cell.CellTopClick\n                android:layout_marginTop=\"8dp\"\n                android:id=\"@+id/dialog_get_weixin_alpha_newest\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:cellDescription=\"@string/getWeixinAlphaLinkFromWeixinConfigDesc\"\n                app:cellTitle=\"@string/getWeixinAlphaLinkFromWeixinConfig\" />\n\n            <com.xiaoniu.qqversionlist.ui.components.cell.CellBottomClick\n                android:id=\"@+id/dialog_get_wetype_latest\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:cellDescription=\"@string/getWeTypeTestLinkFromWeTypeLatestChannelDesc\"\n                app:cellTitle=\"@string/getWeTypeTestLinkFromWeTypeLatestChannel\" />\n\n            <com.xiaoniu.qqversionlist.ui.components.cell.CellTopClick\n                android:layout_marginTop=\"16dp\"\n                android:id=\"@+id/dialog_tencent_app_store\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:cellTitle=\"@string/getUpdateFromTencentAppStore\" />\n\n            <com.xiaoniu.qqversionlist.ui.components.cell.CellBottomClick\n                android:id=\"@+id/dialog_shiply\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:cellTitle=\"@string/getUpdateFromTDSShiplyDistributionPlatform\" />\n\n            <com.xiaoniu.qqversionlist.ui.components.cell.CellSingleClick\n                android:layout_marginTop=\"16dp\"\n                android:layout_marginBottom=\"14dp\"\n                android:id=\"@+id/dialog_firebase\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:cellTitle=\"@string/initFirebaseService\" />\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/btn_exp_ok\"\n                style=\"@style/Widget.Material3.Button.TonalButton\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/back\" />\n        </LinearLayout>\n    </ScrollView>\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/dialog_firebase_first_info.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\"\n    android:paddingStart=\"20dp\"\n    android:paddingTop=\"6dp\"\n    android:paddingEnd=\"20dp\">\n\n    <ScrollView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:scrollbars=\"none\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            android:paddingTop=\"8dp\"\n            android:paddingBottom=\"20dp\">\n\n            <com.google.android.material.card.MaterialCardView\n                android:id=\"@+id/firebase_info_insights\"\n                style=\"?attr/materialCardViewOutlinedStyle\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginBottom=\"3dp\"\n                android:backgroundTint=\"?android:colorBackground\">\n\n                <TextView\n                    android:id=\"@+id/firebase_info_insights_text\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_margin=\"4dp\"\n                    android:drawablePadding=\"4dp\"\n                    android:paddingStart=\"3dp\"\n                    android:paddingEnd=\"0dp\"\n                    android:text=\"@string/enablingFirebaseServiceInsights\"\n                    android:textColor=\"?attr/colorPrimary\"\n                    android:textSize=\"10sp\"\n                    app:drawableStartCompat=\"@drawable/lightbulb_fill\" />\n            </com.google.android.material.card.MaterialCardView>\n\n            <com.google.android.material.card.MaterialCardView\n                android:id=\"@+id/firebase_info_warning2\"\n                style=\"?attr/materialCardViewOutlinedStyle\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"3dp\"\n                android:layout_marginBottom=\"3dp\"\n                android:backgroundTint=\"?android:colorBackground\">\n\n                <TextView\n                    android:id=\"@+id/firebase_info_warning2_text\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_margin=\"4dp\"\n                    android:drawablePadding=\"4dp\"\n                    android:paddingStart=\"3dp\"\n                    android:paddingEnd=\"0dp\"\n                    android:text=\"@string/enablingFirebaseServiceWarning2\"\n                    android:textColor=\"?attr/colorPrimary\"\n                    android:textSize=\"10sp\"\n                    app:drawableStartCompat=\"@drawable/error_warning_fill\" />\n            </com.google.android.material.card.MaterialCardView>\n\n            <com.google.android.material.card.MaterialCardView\n                android:id=\"@+id/firebase_info_warning\"\n                style=\"?attr/materialCardViewOutlinedStyle\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"3dp\"\n                android:backgroundTint=\"?android:colorBackground\">\n\n                <TextView\n                    android:id=\"@+id/firebase_info_warning_text\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_margin=\"4dp\"\n                    android:drawablePadding=\"4dp\"\n                    android:paddingStart=\"3dp\"\n                    android:paddingEnd=\"0dp\"\n                    android:text=\"@string/enablingFirebaseServiceWarning\"\n                    android:textColor=\"?attr/colorPrimary\"\n                    android:textSize=\"10sp\"\n                    app:drawableStartCompat=\"@drawable/error_warning_fill\" />\n            </com.google.android.material.card.MaterialCardView>\n\n            <com.google.android.material.button.MaterialButtonGroup\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"8dp\">\n\n                <com.google.android.material.button.MaterialButton\n                    android:id=\"@+id/firebase_info_cancel\"\n                    style=\"@style/Widget.Material3.Button.TonalButton\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginEnd=\"8dp\"\n                    android:layout_weight=\"1\"\n                    android:text=\"@string/cancel\" />\n\n                <com.google.android.material.button.MaterialButton\n                    android:id=\"@+id/firebase_info_next\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"8dp\"\n                    android:layout_weight=\"1\"\n                    android:text=\"@string/continueKey\" />\n\n            </com.google.android.material.button.MaterialButtonGroup>\n        </LinearLayout>\n    </ScrollView>\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/dialog_format_define.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\">\n\n    <ScrollView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:scrollbars=\"none\">\n\n        <androidx.constraintlayout.widget.ConstraintLayout\n            android:id=\"@+id/dialog_suffix_define_container\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:paddingStart=\"14dp\"\n            android:paddingTop=\"12dp\"\n            android:paddingEnd=\"14dp\"\n            android:paddingBottom=\"20dp\">\n\n            <com.google.android.material.textfield.TextInputLayout\n                android:id=\"@+id/setting_suffix_define\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_alignParentStart=\"true\"\n                android:hint=\"@string/customVersionEnumSuffix\"\n                android:paddingStart=\"6dp\"\n                android:paddingEnd=\"6dp\"\n                app:helperText=\"@string/customVersionEnumSuffixHelpText\"\n                app:helperTextEnabled=\"true\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\">\n\n                <com.google.android.material.textfield.TextInputEditText\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:singleLine=\"true\" />\n            </com.google.android.material.textfield.TextInputLayout>\n\n            <LinearLayout\n                android:id=\"@+id/suffix_define_check_group_all\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"vertical\"\n                app:layout_constraintBottom_toTopOf=\"@id/suffix_define_button_group\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toBottomOf=\"@id/setting_suffix_define\">\n\n                <TextView\n                    android:id=\"@+id/suffix_check_group_title\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:paddingStart=\"8dp\"\n                    android:paddingTop=\"8dp\"\n                    android:paddingEnd=\"8dp\"\n                    android:text=\"@string/suffixSetting\"\n                    android:textColor=\"?attr/colorPrimary\"\n                    android:textSize=\"11sp\"\n                    android:textStyle=\"bold\" />\n\n                <LinearLayout\n                    android:id=\"@+id/suffix_define_checkbox_group1\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:gravity=\"center_vertical\"\n                    android:orientation=\"horizontal\"\n                    android:weightSum=\"3\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintTop_toBottomOf=\"@id/setting_suffix_define\">\n\n                    <CheckBox\n                        android:id=\"@+id/suffix_define_checkbox_64hb\"\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_weight=\"1\"\n                        android:text=\"_64_HB\" />\n\n                    <CheckBox\n                        android:id=\"@+id/suffix_define_checkbox_hb64\"\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_weight=\"1\"\n                        android:text=\"_HB_64\" />\n\n                    <CheckBox\n                        android:id=\"@+id/suffix_define_checkbox_64hb1\"\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_weight=\"1\"\n                        android:text=\"_64_HB1\" />\n\n                </LinearLayout>\n\n                <LinearLayout\n                    android:id=\"@+id/suffix_define_checkbox_group2\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:gravity=\"center_vertical\"\n                    android:orientation=\"horizontal\"\n                    android:weightSum=\"3\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintTop_toBottomOf=\"@id/suffix_define_checkbox_group1\">\n\n                    <CheckBox\n                        android:id=\"@+id/suffix_define_checkbox_hb164\"\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_weight=\"1\"\n                        android:text=\"_HB1_64\" />\n\n                    <CheckBox\n                        android:id=\"@+id/suffix_define_checkbox_64hb2\"\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_weight=\"1\"\n                        android:text=\"_64_HB2\" />\n\n                    <CheckBox\n                        android:id=\"@+id/suffix_define_checkbox_hb264\"\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_weight=\"1\"\n                        android:text=\"_HB2_64\" />\n\n                </LinearLayout>\n\n                <LinearLayout\n                    android:id=\"@+id/suffix_define_checkbox_group3\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:gravity=\"center_vertical\"\n                    android:orientation=\"horizontal\"\n                    android:weightSum=\"3\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintTop_toBottomOf=\"@id/suffix_define_checkbox_group2\">\n\n                    <CheckBox\n                        android:id=\"@+id/suffix_define_checkbox_64hb3\"\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_weight=\"1\"\n                        android:text=\"_64_HB3\" />\n\n                    <CheckBox\n                        android:id=\"@+id/suffix_define_checkbox_hb364\"\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_weight=\"1\"\n                        android:text=\"_HB3_64\" />\n\n                    <CheckBox\n                        android:id=\"@+id/suffix_define_checkbox_64hd\"\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_weight=\"1\"\n                        android:text=\"_64_HD\" />\n\n                </LinearLayout>\n\n                <LinearLayout\n                    android:id=\"@+id/suffix_define_checkbox_group4\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:gravity=\"center_vertical\"\n                    android:orientation=\"horizontal\"\n                    android:weightSum=\"3\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintTop_toBottomOf=\"@id/suffix_define_checkbox_group3\">\n\n                    <CheckBox\n                        android:id=\"@+id/suffix_define_checkbox_hd64\"\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_weight=\"1\"\n                        android:text=\"_HD_64\" />\n\n                    <CheckBox\n                        android:id=\"@+id/suffix_define_checkbox_64hd1\"\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_weight=\"1\"\n                        android:text=\"_64_HD1\" />\n\n                    <CheckBox\n                        android:id=\"@+id/suffix_define_checkbox_hd164\"\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_weight=\"1\"\n                        android:text=\"_HD1_64\" />\n\n                </LinearLayout>\n\n                <LinearLayout\n                    android:id=\"@+id/suffix_define_checkbox_group5\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:gravity=\"center_vertical\"\n                    android:orientation=\"horizontal\"\n                    android:weightSum=\"3\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintTop_toBottomOf=\"@id/suffix_define_checkbox_group4\">\n\n                    <CheckBox\n                        android:id=\"@+id/suffix_define_checkbox_64hd2\"\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_weight=\"1\"\n                        android:text=\"_64_HD2\" />\n\n                    <CheckBox\n                        android:id=\"@+id/suffix_define_checkbox_hd264\"\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_weight=\"1\"\n                        android:text=\"_HD2_64\" />\n\n                    <CheckBox\n                        android:id=\"@+id/suffix_define_checkbox_64hd3\"\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_weight=\"1\"\n                        android:text=\"_64_HD3\" />\n\n                </LinearLayout>\n\n                <LinearLayout\n                    android:id=\"@+id/suffix_define_checkbox_group6\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:gravity=\"center_vertical\"\n                    android:orientation=\"horizontal\"\n                    android:weightSum=\"2\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintTop_toBottomOf=\"@id/suffix_define_checkbox_group5\">\n\n                    <CheckBox\n                        android:id=\"@+id/suffix_define_checkbox_hd364\"\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_weight=\"1\"\n                        android:text=\"_HD3_64\" />\n\n                    <CheckBox\n                        android:id=\"@+id/suffix_define_checkbox_64hd1hb\"\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_weight=\"1\"\n                        android:text=\"_64_HD1HB\" />\n\n                </LinearLayout>\n\n                <LinearLayout\n                    android:id=\"@+id/suffix_define_checkbox_group7\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:gravity=\"center_vertical\"\n                    android:orientation=\"horizontal\"\n                    android:weightSum=\"2\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintTop_toBottomOf=\"@id/suffix_define_checkbox_group6\">\n\n                    <CheckBox\n                        android:id=\"@+id/suffix_define_checkbox_hd1hb64\"\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_weight=\"1\"\n                        android:text=\"_HD1HB_64\" />\n\n                    <CheckBox\n                        android:id=\"@+id/suffix_define_checkbox_test\"\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_weight=\"1\"\n                        android:text=\"_test\" />\n\n                </LinearLayout>\n\n                <TextView\n                    android:id=\"@+id/format_check_group_title_others\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:paddingStart=\"8dp\"\n                    android:paddingTop=\"4dp\"\n                    android:paddingEnd=\"8dp\"\n                    android:text=\"@string/others\"\n                    android:textColor=\"?attr/colorPrimary\"\n                    android:textSize=\"11sp\"\n                    android:textStyle=\"bold\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintTop_toBottomOf=\"@id/setting_suffix_define\" />\n\n                <LinearLayout\n                    android:id=\"@+id/suffix_define_checkbox_group8\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:gravity=\"center_vertical\"\n                    android:orientation=\"horizontal\"\n                    android:weightSum=\"1\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintTop_toBottomOf=\"@id/suffix_define_checkbox_group6\">\n\n                    <CheckBox\n                        android:id=\"@+id/format_define_checkbox_qq_8958\"\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_weight=\"1\"\n                        android:text=\"@string/useQQ8958Test\" />\n\n                </LinearLayout>\n\n                <LinearLayout\n                    android:id=\"@+id/suffix_define_checkbox_group9\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:gravity=\"center_vertical\"\n                    android:orientation=\"horizontal\"\n                    android:weightSum=\"1\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintTop_toBottomOf=\"@id/suffix_define_checkbox_group6\">\n\n                    <CheckBox\n                        android:id=\"@+id/format_define_checkbox_qq_9008_14600\"\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_weight=\"1\"\n                        android:text=\"@string/useQQ9008_14600Test\" />\n\n                </LinearLayout>\n            </LinearLayout>\n\n            <com.google.android.material.button.MaterialButtonGroup\n                android:id=\"@+id/suffix_define_button_group\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"8dp\"\n                android:paddingStart=\"6dp\"\n                android:paddingEnd=\"6dp\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toBottomOf=\"@id/suffix_define_check_group_all\">\n\n                <com.google.android.material.button.MaterialButton\n                    android:id=\"@+id/btn_suffix_cancel\"\n                    style=\"@style/Widget.Material3.Button.TonalButton\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginEnd=\"8dp\"\n                    android:layout_weight=\"1\"\n                    android:text=\"@string/cancel\" />\n\n                <com.google.android.material.button.MaterialButton\n                    android:id=\"@+id/btn_suffix_save\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"8dp\"\n                    android:layout_weight=\"1\"\n                    android:text=\"@string/save\" />\n\n            </com.google.android.material.button.MaterialButtonGroup>\n        </androidx.constraintlayout.widget.ConstraintLayout>\n    </ScrollView>\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/dialog_guess.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/ll_guess\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\"\n    android:paddingStart=\"20dp\"\n    android:paddingTop=\"6dp\"\n    android:paddingEnd=\"20dp\">\n\n    <ScrollView\n        android:id=\"@+id/exp_back_text_scroll\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:scrollbars=\"none\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            android:paddingTop=\"8dp\"\n            android:paddingBottom=\"20dp\">\n\n            <com.google.android.material.card.MaterialCardView\n                android:id=\"@+id/maintenance_mode_guess_dialog_warning\"\n                style=\"?attr/materialCardViewOutlinedStyle\"\n                android:layout_marginBottom=\"12dp\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:backgroundTint=\"?android:colorBackground\">\n\n                <TextView\n                    android:id=\"@+id/maintenance_mode_warning\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_margin=\"4dp\"\n                    android:drawablePadding=\"4dp\"\n                    android:paddingStart=\"3dp\"\n                    android:paddingEnd=\"0dp\"\n                    android:text=\"@string/enumVerMaintenanceModeWarning\"\n                    android:textColor=\"?attr/colorPrimary\"\n                    android:textSize=\"10sp\"\n                    app:drawableStartCompat=\"@drawable/error_warning_fill\" />\n            </com.google.android.material.card.MaterialCardView>\n\n            <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginBottom=\"8dp\"\n                android:baselineAligned=\"false\"\n                android:orientation=\"horizontal\">\n\n                <com.google.android.material.textfield.TextInputLayout\n                    android:id=\"@+id/et_version_big\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginEnd=\"8dp\"\n                    android:layout_weight=\"1\"\n                    android:hint=\"@string/majorVersion\"\n                    app:helperText=\"@string/enumQQMajorVersionHelpText\"\n                    app:helperTextEnabled=\"true\">\n\n                    <com.google.android.material.textfield.TextInputEditText\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:imeOptions=\"actionNext\"\n                        android:singleLine=\"true\" />\n                </com.google.android.material.textfield.TextInputLayout>\n\n                <com.google.android.material.textfield.TextInputLayout\n                    android:id=\"@+id/spinner_layout\"\n                    style=\"@style/Widget.Material3.TextInputLayout.OutlinedBox.ExposedDropdownMenu\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"8dp\"\n                    android:layout_weight=\"1\"\n                    android:hint=\"@string/enumType\"\n                    app:helperText=\"@string/enumTypeHelpText\"\n                    app:helperTextEnabled=\"true\">\n\n                    <AutoCompleteTextView\n                        android:id=\"@+id/spinner_version\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:imeOptions=\"actionNext\"\n                        android:inputType=\"none\"\n                        android:singleLine=\"true\" />\n\n                </com.google.android.material.textfield.TextInputLayout>\n            </LinearLayout>\n\n            <com.google.android.material.textfield.TextInputLayout\n                android:id=\"@+id/et_version_small\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginBottom=\"10dp\"\n                android:hint=\"@string/initialMinorVersion\"\n                app:helperText=\"@string/initialMinorVersionHelpText\"\n                app:helperTextEnabled=\"true\">\n\n                <com.google.android.material.textfield.TextInputEditText\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:imeOptions=\"actionDone\"\n                    android:inputType=\"number\"\n                    android:singleLine=\"true\" />\n\n\n            </com.google.android.material.textfield.TextInputLayout>\n\n            <com.google.android.material.textfield.TextInputLayout\n                android:id=\"@+id/et_version_true\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginBottom=\"8dp\"\n                android:hint=\"@string/trueVersion\"\n                app:helperText=\"@string/trueVersionHelpText\"\n                app:helperTextEnabled=\"true\">\n\n                <com.google.android.material.textfield.TextInputEditText\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:imeOptions=\"actionNext\"\n                    android:inputType=\"number\"\n                    android:singleLine=\"true\" />\n\n\n            </com.google.android.material.textfield.TextInputLayout>\n\n            <com.google.android.material.textfield.TextInputLayout\n                android:id=\"@+id/et_version_16code\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginBottom=\"10dp\"\n                android:hint=\"@string/hexadecimalCode\"\n                app:helperText=\"@string/hexadecimalCodeHelpText\"\n                app:helperTextEnabled=\"true\"\n                app:prefixText=\"0x\">\n\n                <com.google.android.material.textfield.TextInputEditText\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:imeOptions=\"actionDone\"\n                    android:singleLine=\"true\" />\n\n\n            </com.google.android.material.textfield.TextInputLayout>\n\n            <com.google.android.material.card.MaterialCardView\n                android:id=\"@+id/guess_dialog_warning\"\n                style=\"?attr/materialCardViewOutlinedStyle\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:backgroundTint=\"?android:colorBackground\">\n\n                <TextView\n                    android:id=\"@+id/tv_warning\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_margin=\"4dp\"\n                    android:drawablePadding=\"4dp\"\n                    android:paddingStart=\"3dp\"\n                    android:paddingEnd=\"0dp\"\n                    android:text=\"@string/enumQQPreviewWarning\"\n                    android:textColor=\"?attr/colorPrimary\"\n                    android:textSize=\"10sp\"\n                    app:drawableStartCompat=\"@drawable/error_warning_fill\" />\n            </com.google.android.material.card.MaterialCardView>\n\n            <com.google.android.material.button.MaterialButtonGroup\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"8dp\">\n\n                <com.google.android.material.button.MaterialButton\n                    android:id=\"@+id/btn_guess_cancel\"\n                    style=\"@style/Widget.Material3.Button.TonalButton\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginEnd=\"8dp\"\n                    android:layout_weight=\"1\"\n                    android:text=\"@string/cancel\" />\n\n                <com.google.android.material.button.MaterialButton\n                    android:id=\"@+id/btn_guess_start\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"8dp\"\n                    android:layout_weight=\"1\"\n                    android:text=\"@string/start\" />\n\n            </com.google.android.material.button.MaterialButtonGroup>\n        </LinearLayout>\n    </ScrollView>\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/dialog_hash.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\"\n    android:paddingStart=\"20dp\"\n    android:paddingTop=\"8dp\"\n    android:paddingEnd=\"20dp\">\n\n    <ScrollView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:scrollbars=\"none\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            android:paddingBottom=\"20dp\">\n\n            <TextView\n                android:id=\"@+id/about_hash_text\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:padding=\"4dp\" />\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/btn_about_hash_ok\"\n                style=\"@style/Widget.Material3.Button.TonalButton\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"8dp\"\n                android:text=\"@string/done\" />\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/btn_about_hash_copy\"\n                style=\"@style/Widget.Material3.Button.TonalButton\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/copy\" />\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/btn_about_github_hash_verifiy\"\n                style=\"@style/Widget.Material3.Button.TonalButton\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/verifyHashValueViaGitHubAPI\" />\n        </LinearLayout>\n    </ScrollView>\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/dialog_loading.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\r\n    Qverbow Util\r\n    Copyright (C) 2023 klxiaoniu\r\n\r\n    This program is free software: you can redistribute it and/or modify\r\n    it under the terms of the GNU Affero General Public License as\r\n    published by the Free Software Foundation, either version 3 of the\r\n    License, or (at your option) any later version.\r\n\r\n    This program is distributed in the hope that it will be useful,\r\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n    GNU Affero General Public License for more details.\r\n\r\n    You should have received a copy of the GNU Affero General Public License\r\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\r\n-->\r\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\r\n    android:layout_width=\"match_parent\"\r\n    android:layout_height=\"wrap_content\"\r\n    android:gravity=\"center_vertical\"\r\n    android:orientation=\"horizontal\"\r\n    android:padding=\"16dp\">\r\n\r\n    <com.google.android.material.loadingindicator.LoadingIndicator\r\n        android:id=\"@+id/loading_indicator\"\r\n        android:layout_width=\"wrap_content\"\r\n        android:layout_height=\"wrap_content\"\r\n        android:indeterminate=\"true\" />\r\n\r\n    <com.google.android.material.progressindicator.CircularProgressIndicator\r\n        android:id=\"@+id/progress_indicator\"\r\n        android:layout_width=\"wrap_content\"\r\n        android:layout_height=\"wrap_content\"\r\n        android:indeterminate=\"true\" />\r\n\r\n    <TextView\r\n        android:id=\"@+id/loading_message\"\r\n        android:layout_width=\"0dp\"\r\n        android:layout_height=\"wrap_content\"\r\n        android:layout_marginStart=\"8dp\"\r\n        android:layout_marginEnd=\"2dp\"\r\n        android:layout_weight=\"3\"\r\n        android:text=\"@string/enumeratingDownloadLink\"\r\n        android:textAlignment=\"viewStart\"\r\n        android:textSize=\"13sp\" />\r\n\r\n    <com.google.android.material.button.MaterialButton\r\n        android:id=\"@+id/btn_cancel\"\r\n        style=\"?attr/materialIconButtonFilledTonalStyle\"\r\n        android:layout_width=\"wrap_content\"\r\n        android:layout_height=\"wrap_content\"\r\n        android:textSize=\"13sp\"\r\n        app:icon=\"@drawable/stop_line\" />\r\n\r\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/dialog_local_qq_tim_info.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/experimental_features\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\"\n    android:paddingStart=\"20dp\"\n    android:paddingTop=\"6dp\"\n    android:paddingEnd=\"20dp\">\n\n    <ScrollView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:scrollbars=\"none\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            android:paddingBottom=\"20dp\">\n\n            <com.xiaoniu.qqversionlist.ui.components.cell.CellTopClick\n                android:layout_marginTop=\"8dp\"\n                android:id=\"@+id/dialog_local_sdk\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:cellDescription=\"Target 31 | Min 23 | Compile 31\"\n                app:cellTitle=\"Android SDK\" />\n\n            <com.xiaoniu.qqversionlist.ui.components.cell.CellMiddleClick\n                android:id=\"@+id/dialog_local_version_name\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:cellDescription=\"9.1.33\"\n                app:cellTitle=\"Version Name\" />\n\n            <com.xiaoniu.qqversionlist.ui.components.cell.CellMiddleClick\n                android:id=\"@+id/dialog_local_rdm_uuid\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:cellDescription=\"22305_7\"\n                app:cellTitle=\"Rdm UUID\" />\n\n            <com.xiaoniu.qqversionlist.ui.components.cell.CellMiddleClick\n                android:id=\"@+id/dialog_local_version_code\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:cellDescription=\"8568\"\n                app:cellTitle=\"Version Code\" />\n\n            <com.xiaoniu.qqversionlist.ui.components.cell.CellMiddleClick\n                android:id=\"@+id/dialog_local_appsetting_params\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:cellDescription=\"537262981#7631A8B2D35EEDD4#0#LiteGray#ffffffffffffffffffffffffffffffff\"\n                app:cellTitle=\"AppSetting_params\" />\n\n            <com.xiaoniu.qqversionlist.ui.components.cell.CellMiddleClick\n                android:id=\"@+id/dialog_local_appsetting_params_pad\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:cellDescription=\"537262992#EEDDC09F5EF18F5D#0#LiteGray#ffffffffffffffffffffffffffffffff\"\n                app:cellTitle=\"AppSetting_params_pad\" />\n\n            <com.xiaoniu.qqversionlist.ui.components.cell.CellMiddleClick\n                android:id=\"@+id/dialog_local_qua\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:cellDescription=\"V1_AND_SQ_9.1.33_8568_HDBM_T\"\n                app:cellTitle=\"QUA\" />\n\n            <com.xiaoniu.qqversionlist.ui.components.cell.CellBottomClick\n                android:id=\"@+id/dialog_local_copy_all\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:cellIcon=\"@drawable/file_copy_line\"\n                app:cellTitle=\"@string/copyAll\" />\n        </LinearLayout>\n    </ScrollView>\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/dialog_personalization.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/ll_setting\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    android:paddingStart=\"16dp\"\n    android:paddingEnd=\"16dp\">\n\n    <TextView\n        android:id=\"@+id/title\"\n        style=\"?attr/textAppearanceTitleLarge\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"12dp\"\n        android:drawablePadding=\"12dp\"\n        android:gravity=\"center_vertical\"\n        android:text=\"@string/personalization\"\n        app:drawableStartCompat=\"@drawable/palette_line\"\n        app:drawableTint=\"?attr/colorPrimary\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <ScrollView\n        android:id=\"@+id/personalization_scroll\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:layout_marginTop=\"12dp\"\n        android:layout_marginBottom=\"12dp\"\n        android:scrollbars=\"none\"\n        app:layout_constraintBottom_toTopOf=\"@id/btn_personalization_ok\"\n        app:layout_constraintTop_toBottomOf=\"@id/title\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            android:paddingBottom=\"20dp\">\n\n            <TextView\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:paddingStart=\"12dp\"\n                android:paddingTop=\"12dp\"\n                android:paddingEnd=\"12dp\"\n                android:paddingBottom=\"6dp\"\n                android:text=\"@string/aboutVersionCards\"\n                android:textColor=\"?attr/colorPrimary\"\n                android:textSize=\"11sp\"\n                android:textStyle=\"bold\" />\n\n            <com.xiaoniu.qqversionlist.ui.components.cell.CellTopSwitch\n                android:id=\"@+id/switch_display_first\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:cellTitle=\"@string/defaultDisplayOfFirstListItemDetails\" />\n\n            <com.xiaoniu.qqversionlist.ui.components.cell.CellMiddleSwitch\n                android:id=\"@+id/switch_kuikly_tag\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:cellDescription=\"@string/showKuiklyTagDesc\"\n                app:cellTitle=\"@string/showKuiklyTag\" />\n\n            <com.xiaoniu.qqversionlist.ui.components.cell.CellMiddleSwitch\n                android:id=\"@+id/switch_unreal_engine_tag\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:cellDescription=\"@string/showUnrealEngineTagDesc\"\n                app:cellTitle=\"@string/showUnrealEngineTag\" />\n\n            <com.xiaoniu.qqversionlist.ui.components.cell.CellMiddleSwitch\n                android:id=\"@+id/switch_progress_size\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:cellDescription=\"@string/versionCardsDisplaysPackageSizeDesc\"\n                app:cellTitle=\"@string/versionCardsDisplaysPackageSizeIndicator\" />\n\n            <com.xiaoniu.qqversionlist.ui.components.cell.CellMiddleSwitch\n                android:id=\"@+id/switch_progress_size_text\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:cellDescription=\"@string/versionCardsDisplaysPackageSizeDesc\"\n                app:cellTitle=\"@string/versionCardsDisplaysPackageSizeText\" />\n\n            <com.xiaoniu.qqversionlist.ui.components.cell.CellMiddleSwitch\n                android:id=\"@+id/switch_version_tcloud\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:cellDescription=\"@string/versionNumberFontUseTCloudNumberDesc\"\n                app:cellTitle=\"@string/versionNumberFontUseTCloudNumber\" />\n\n            <com.google.android.material.slider.Slider\n                android:id=\"@+id/version_tcloud_thickness\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"2dp\"\n                android:background=\"@drawable/shape_cell_bottom\"\n                android:paddingStart=\"12dp\"\n                android:paddingTop=\"10dp\"\n                android:paddingEnd=\"12dp\"\n                android:paddingBottom=\"12dp\"\n                android:stepSize=\"1.0\"\n                android:valueFrom=\"1.0\"\n                android:valueTo=\"4.0\" />\n\n            <com.xiaoniu.qqversionlist.ui.components.cell.CellSingleSwitch\n                android:id=\"@+id/switch_old_loading\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"16dp\"\n                app:cellTitle=\"@string/showOldLoading\" />\n        </LinearLayout>\n    </ScrollView>\n\n    <com.google.android.material.button.MaterialButton\n        android:id=\"@+id/btn_personalization_ok\"\n        style=\"@style/Widget.Material3.Button.TonalButton\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"20dp\"\n        android:text=\"@string/done\"\n        app:layout_constraintBottom_toBottomOf=\"parent\" />\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/dialog_private_token_setting.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\"\n    android:paddingStart=\"20dp\"\n    android:paddingTop=\"2dp\"\n    android:paddingEnd=\"20dp\">\n\n    <com.google.android.material.progressindicator.LinearProgressIndicator\n        android:id=\"@+id/progress_indicator_token_setting\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:elevation=\"10dp\"\n        android:indeterminate=\"true\" />\n\n    <ScrollView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:scrollbars=\"none\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            android:paddingTop=\"12dp\">\n\n            <com.google.android.material.textfield.TextInputLayout\n                android:id=\"@+id/github_personal_access_token\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginBottom=\"6dp\"\n                android:hint=\"@string/githubPersonalAccessToken\"\n                app:endIconMode=\"password_toggle\"\n                app:helperText=\"@string/githubTokenHelperText\"\n                app:helperTextEnabled=\"true\">\n\n                <com.google.android.material.textfield.TextInputEditText\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:imeOptions=\"actionDone\"\n                    android:inputType=\"textPassword\"\n                    android:singleLine=\"true\" />\n\n            </com.google.android.material.textfield.TextInputLayout>\n\n            <com.xiaoniu.qqversionlist.ui.components.cell.CellSingleClick\n                android:id=\"@+id/github_pat_test\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"4dp\"\n                android:layout_marginBottom=\"10dp\"\n                app:cellDescription=\"@string/testGitHubToken\"\n                app:cellIcon=\"@drawable/flashlight_line\"\n                app:cellTitle=\"@string/testToken\" />\n\n            <com.google.android.material.textfield.TextInputLayout\n                android:id=\"@+id/zhipu_ai_token\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginBottom=\"6dp\"\n                android:hint=\"@string/zhipuAIMaaSPlatformToken\"\n                app:endIconMode=\"password_toggle\"\n                app:helperText=\"@string/zhipuTokenHelperText\"\n                app:helperTextEnabled=\"true\">\n\n                <com.google.android.material.textfield.TextInputEditText\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:imeOptions=\"actionNext\"\n                    android:inputType=\"textPassword\"\n                    android:singleLine=\"true\" />\n\n            </com.google.android.material.textfield.TextInputLayout>\n\n            <com.xiaoniu.qqversionlist.ui.components.cell.CellSingleClick\n                android:id=\"@+id/zhipu_token_test\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"4dp\"\n                android:layout_marginBottom=\"10dp\"\n                app:cellDescription=\"@string/testZhipuToken\"\n                app:cellIcon=\"@drawable/flashlight_line\"\n                app:cellTitle=\"@string/testToken\" />\n\n            <LinearLayout\n                android:id=\"@+id/security_level_layout\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"8dp\"\n                android:layout_marginBottom=\"4dp\"\n                android:orientation=\"horizontal\"\n                tools:ignore=\"UseCompoundDrawables\">\n\n                <ImageView\n                    android:layout_width=\"16dp\"\n                    android:layout_height=\"16dp\"\n                    android:src=\"@drawable/shield_keyhole_line\" />\n\n                <TextView\n                    android:id=\"@+id/security_level_text\"\n                    style=\"?attr/textAppearanceLabelSmall\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:drawablePadding=\"8dp\"\n                    android:gravity=\"center_vertical\"\n                    android:paddingStart=\"6dp\"\n                    android:paddingEnd=\"0dp\"\n                    android:text=\"密钥安全等级，这段文本是占位符\"\n                    android:textColor=\"?attr/colorOnSurface\"\n                    tools:ignore=\"HardcodedText\" />\n            </LinearLayout>\n\n            <com.google.android.material.button.MaterialButtonGroup\n                style=\"?android:attr/buttonBarStyle\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"8dp\">\n\n                <com.google.android.material.button.MaterialButton\n                    android:id=\"@+id/btn_token_cancel\"\n                    style=\"@style/Widget.Material3.Button.TonalButton\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginEnd=\"8dp\"\n                    android:layout_marginBottom=\"20dp\"\n                    android:layout_weight=\"1\"\n                    android:text=\"@string/cancel\" />\n\n                <com.google.android.material.button.MaterialButton\n                    android:id=\"@+id/btn_token_save\"\n                    style=\"@style/Widget.Material3.Button\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"8dp\"\n                    android:layout_weight=\"1\"\n                    android:text=\"@string/save\" />\n\n            </com.google.android.material.button.MaterialButtonGroup>\n        </LinearLayout>\n    </ScrollView>\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/dialog_setting.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/ll_setting\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    android:paddingStart=\"16dp\"\n    android:paddingEnd=\"16dp\">\n\n    <TextView\n        android:id=\"@+id/title\"\n        style=\"?attr/textAppearanceTitleLarge\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"12dp\"\n        android:drawablePadding=\"12dp\"\n        android:gravity=\"center_vertical\"\n        android:text=\"@string/setting\"\n        app:drawableStartCompat=\"@drawable/settings_line\"\n        app:drawableTint=\"?attr/colorPrimary\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <ScrollView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:layout_marginTop=\"12dp\"\n        android:layout_marginBottom=\"12dp\"\n        android:scrollbars=\"none\"\n        app:layout_constraintBottom_toTopOf=\"@id/btn_setting_ok\"\n        app:layout_constraintTop_toBottomOf=\"@id/title\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\">\n\n            <TextView\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:paddingStart=\"12dp\"\n                android:paddingTop=\"12dp\"\n                android:paddingEnd=\"12dp\"\n                android:paddingBottom=\"6dp\"\n                android:text=\"@string/general\"\n                android:textColor=\"?attr/colorPrimary\"\n                android:textSize=\"11sp\"\n                android:textStyle=\"bold\" />\n\n            <com.xiaoniu.qqversionlist.ui.components.cell.CellTopSwitch\n                android:id=\"@+id/long_press_card\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:cellIcon=\"@drawable/braces_line\"\n                app:cellTitle=\"@string/longPressTheVersionCardToViewSourceDetails\" />\n\n            <com.xiaoniu.qqversionlist.ui.components.cell.CellMiddleSwitch\n                android:id=\"@+id/use_new_local_page\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:cellIcon=\"@drawable/bubble_chart_line\"\n                app:cellTitle=\"@string/useNewLocalDetailsPage\" />\n\n            <com.xiaoniu.qqversionlist.ui.components.cell.CellMiddleSwitch\n                android:id=\"@+id/download_on_system_manager\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:cellDescription=\"@string/useTheSystemDownloadManagerToTakeOverTheDownloadIntentDesc\"\n                app:cellIcon=\"@drawable/download_line\"\n                app:cellTitle=\"@string/useTheSystemDownloadManagerToTakeOverTheDownloadIntent\" />\n\n            <com.xiaoniu.qqversionlist.ui.components.cell.CellBottomClick\n                android:id=\"@+id/dialog_personalization\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:cellIcon=\"@drawable/palette_line\"\n                app:cellTitle=\"@string/personalization\" />\n\n            <TextView\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:paddingStart=\"12dp\"\n                android:paddingTop=\"12dp\"\n                android:paddingEnd=\"12dp\"\n                android:paddingBottom=\"6dp\"\n                android:text=\"@string/aiLLMInference\"\n                android:textColor=\"?attr/colorPrimary\"\n                android:textSize=\"11sp\"\n                android:textStyle=\"bold\" />\n\n            <com.xiaoniu.qqversionlist.ui.components.cell.CellTopSwitch\n                android:id=\"@+id/switch_update_log_llm_gen\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:cellDescription=\"@string/qverbowUpdateLogLLMIntelligentDesc\"\n                app:cellTitle=\"@string/qverbowUpdateLogLLMIntelligent\" />\n\n            <com.xiaoniu.qqversionlist.ui.components.cell.CellBottomSwitch\n                android:id=\"@+id/switch_local_inter_changes_llm_gen\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:cellDescription=\"@string/llmInferenceLocalChangesDesc\"\n                app:cellTitle=\"@string/llmInferenceLocalChanges\" />\n\n            <TextView\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:paddingStart=\"12dp\"\n                android:paddingTop=\"12dp\"\n                android:paddingEnd=\"12dp\"\n                android:paddingBottom=\"6dp\"\n                android:text=\"@string/security\"\n                android:textColor=\"?attr/colorPrimary\"\n                android:textSize=\"11sp\"\n                android:textStyle=\"bold\" />\n\n            <com.xiaoniu.qqversionlist.ui.components.cell.CellSingleClick\n                android:id=\"@+id/dialog_private_token_setting\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:cellDescription=\"@string/privateTokenSettingsDesc\"\n                app:cellIcon=\"@drawable/key_line\"\n                app:cellTitle=\"@string/privateTokenSettings\" />\n\n            <TextView\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:paddingStart=\"12dp\"\n                android:paddingTop=\"12dp\"\n                android:paddingEnd=\"12dp\"\n                android:paddingBottom=\"6dp\"\n                android:text=\"@string/enumerateVersionsFAB\"\n                android:textColor=\"?attr/colorPrimary\"\n                android:textSize=\"11sp\"\n                android:textStyle=\"bold\" />\n\n            <com.xiaoniu.qqversionlist.ui.components.cell.CellTopSwitch\n                android:id=\"@+id/switch_guess_test_extend\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:cellTitle=\"@string/extendTheSuffixForDirectDownloadLinksOfEnumeratedPreviewVersions\" />\n\n            <com.xiaoniu.qqversionlist.ui.components.cell.CellBottomClick\n                android:id=\"@+id/dialog_suffix_define_click\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:cellTitle=\"@string/enumerateVersionsFormatSetting\" />\n\n            <com.xiaoniu.qqversionlist.ui.components.cell.CellSingleSwitch\n                android:id=\"@+id/switch_auto_check_updates\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"16dp\"\n                app:cellDescription=\"@string/autoCheckForUpdatesDesc\"\n                app:cellTitle=\"@string/autoCheckForUpdates\" />\n\n            <com.xiaoniu.qqversionlist.ui.components.cell.CellSingleSwitch\n                android:id=\"@+id/switch_push_notif_via_fcm\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"16dp\"\n                app:cellDescription=\"@string/rainbow_notification_channel_description\"\n                app:cellTitle=\"@string/pushSystemNotificationsWhenVersionListUpdates\" />\n\n            <com.xiaoniu.qqversionlist.ui.components.cell.CellSingleSwitch\n                android:id=\"@+id/guess_not_5\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"16dp\"\n                app:cellTitle=\"@string/removeMultiplesOf5ForQQPreviewVersions\" />\n        </LinearLayout>\n    </ScrollView>\n\n    <com.google.android.material.button.MaterialButton\n        android:id=\"@+id/btn_setting_ok\"\n        style=\"@style/Widget.Material3.Button.TonalButton\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"20dp\"\n        android:text=\"@string/done\"\n        app:layout_constraintBottom_toBottomOf=\"parent\" />\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/dialog_shiply.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/ll_tencent_shiply\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\"\n    android:paddingStart=\"20dp\"\n    android:paddingTop=\"6dp\"\n    android:paddingEnd=\"20dp\">\n\n    <ScrollView\n        android:id=\"@+id/exp_back_text_scroll\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:scrollbars=\"none\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            android:paddingTop=\"12dp\">\n\n            <com.google.android.material.textfield.TextInputLayout\n                android:id=\"@+id/shiply_uin\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginBottom=\"8dp\"\n                android:hint=\"uin\"\n                app:helperText=\"@string/uinHelpText\"\n                app:helperTextEnabled=\"true\">\n\n                <com.google.android.material.textfield.TextInputEditText\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:imeOptions=\"actionNext\"\n                    android:inputType=\"number\"\n                    android:singleLine=\"true\" />\n\n            </com.google.android.material.textfield.TextInputLayout>\n\n            <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:baselineAligned=\"false\"\n                android:orientation=\"horizontal\">\n\n                <com.google.android.material.textfield.TextInputLayout\n                    android:id=\"@+id/shiply_version\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginEnd=\"8dp\"\n                    android:layout_weight=\"1\"\n                    android:hint=\"@string/shiplyVersion\"\n                    app:helperText=\"@string/shiplyVersionHelpText\"\n                    app:helperTextEnabled=\"true\">\n\n                    <com.google.android.material.textfield.TextInputEditText\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:imeOptions=\"actionNext\"\n                        android:singleLine=\"true\" />\n\n                </com.google.android.material.textfield.TextInputLayout>\n\n                <com.google.android.material.textfield.TextInputLayout\n                    android:id=\"@+id/shiply_target_layout\"\n                    style=\"@style/Widget.Material3.TextInputLayout.OutlinedBox.ExposedDropdownMenu\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"8dp\"\n                    android:layout_weight=\"1\"\n                    android:hint=\"@string/shiplyTargetApp\"\n                    app:helperText=\"@string/shiplyTargetHelper\"\n                    app:helperTextEnabled=\"true\">\n\n                    <AutoCompleteTextView\n                        android:id=\"@+id/shiply_target\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:imeOptions=\"actionDone\"\n                        android:inputType=\"none\"\n                        android:singleLine=\"true\"\n                        app:simpleItems=\"@array/shiply_target\" />\n\n                </com.google.android.material.textfield.TextInputLayout>\n\n            </LinearLayout>\n\n            <com.xiaoniu.qqversionlist.ui.components.cell.CellTopSwitch\n                android:id=\"@+id/switch_shiply_advanced_configurations\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"8dp\"\n                app:cellTitle=\"@string/shiplyUseAdvancedConfigurations\" />\n\n            <com.xiaoniu.qqversionlist.ui.components.cell.CellBottomClick\n                android:id=\"@+id/shiply_advanced_configurations_click\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginBottom=\"8dp\"\n                app:cellTitle=\"@string/shiplyAdvancedConfigurations\" />\n\n            <com.google.android.material.card.MaterialCardView\n                android:id=\"@+id/shiply_warning_card\"\n                style=\"?attr/materialCardViewOutlinedStyle\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"4dp\"\n                android:backgroundTint=\"?android:colorBackground\">\n\n                <TextView\n                    android:id=\"@+id/shiply_warning_text\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_margin=\"4dp\"\n                    android:drawablePadding=\"4dp\"\n                    android:paddingStart=\"3dp\"\n                    android:paddingEnd=\"0dp\"\n                    android:text=\"@string/shiplyWarning\"\n                    android:textColor=\"?attr/colorPrimary\"\n                    android:textSize=\"10sp\"\n                    app:drawableStartCompat=\"@drawable/error_warning_fill\" />\n            </com.google.android.material.card.MaterialCardView>\n\n            <com.google.android.material.button.MaterialButtonGroup\n                style=\"?android:attr/buttonBarStyle\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"8dp\">\n\n                <com.google.android.material.button.MaterialButton\n                    android:id=\"@+id/btn_shiply_cancel\"\n                    style=\"@style/Widget.Material3.Button.TonalButton\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginEnd=\"8dp\"\n                    android:layout_marginBottom=\"20dp\"\n                    android:layout_weight=\"1\"\n                    android:text=\"@string/cancel\" />\n\n                <com.google.android.material.button.MaterialButton\n                    android:id=\"@+id/btn_shiply_start\"\n                    style=\"@style/Widget.Material3.Button\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"8dp\"\n                    android:layout_weight=\"1\"\n                    android:text=\"@string/start\" />\n\n            </com.google.android.material.button.MaterialButtonGroup>\n        </LinearLayout>\n    </ScrollView>\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/dialog_tencent_app_store.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\"\n    android:paddingStart=\"20dp\"\n    android:paddingTop=\"8dp\"\n    android:paddingEnd=\"20dp\">\n\n    <ScrollView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:scrollbars=\"none\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            android:paddingBottom=\"20dp\">\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/get_qq\"\n                style=\"@style/Widget.Material3.Button.TonalButton\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/getQQLinkFromTencentAppStore\" />\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/get_tim\"\n                style=\"@style/Widget.Material3.Button.TonalButton\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/getTIMLinkFromTencentAppStore\" />\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/get_weixin\"\n                style=\"@style/Widget.Material3.Button.TonalButton\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/getWeixinLinkFromTencentAppStore\" />\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/get_wecom\"\n                style=\"@style/Widget.Material3.Button.TonalButton\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/getWeComLinkFromTencentAppStore\" />\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/get_wetype\"\n                style=\"@style/Widget.Material3.Button.TonalButton\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/getWeTypeLinkFromTencentAppStore\" />\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/get_qidian\"\n                style=\"@style/Widget.Material3.Button.TonalButton\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/getQidianLinkFromTencentAppStore\" />\n\n            <com.google.android.material.card.MaterialCardView\n                android:id=\"@+id/guess_dialog_warning\"\n                style=\"?attr/materialCardViewOutlinedStyle\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"4dp\"\n                android:layout_marginBottom=\"4dp\"\n                android:backgroundTint=\"?android:colorBackground\">\n\n                <TextView\n                    android:id=\"@+id/tencent_app_store_warning\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_margin=\"4dp\"\n                    android:drawablePadding=\"4dp\"\n                    android:paddingStart=\"3dp\"\n                    android:paddingEnd=\"0dp\"\n                    android:text=\"@string/tencentAppStoreWarning\"\n                    android:textColor=\"?attr/colorPrimary\"\n                    android:textSize=\"10sp\"\n                    app:drawableStartCompat=\"@drawable/error_warning_fill\" />\n            </com.google.android.material.card.MaterialCardView>\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/tencent_app_store_back\"\n                style=\"@style/Widget.Material3.Button.TonalButton\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/back\" />\n        </LinearLayout>\n    </ScrollView>\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/exp_link_next_button.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/exp_link_next_button_constraint_layout\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"horizontal\"\n    android:paddingStart=\"20dp\"\n    android:paddingEnd=\"20dp\"\n    android:paddingBottom=\"20dp\">\n\n    <HorizontalScrollView\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_weight=\"1\"\n        android:scrollbars=\"none\">\n\n        <com.google.android.material.button.MaterialButtonGroup\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:spacing=\"0dp\">\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/exp_next_btn_share\"\n                style=\"?attr/materialIconButtonFilledTonalStyle\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:contentDescription=\"@string/share\"\n                app:icon=\"@drawable/share_line\" />\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/exp_next_btn_download\"\n                style=\"?attr/materialIconButtonFilledTonalStyle\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:contentDescription=\"@string/download\"\n                app:icon=\"@drawable/download_line\" />\n\n        </com.google.android.material.button.MaterialButtonGroup>\n\n    </HorizontalScrollView>\n\n    <com.google.android.material.button.MaterialButton\n        android:id=\"@+id/exp_next_btn_copy\"\n        style=\"@style/Widget.Material3.Button.Icon\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"@string/copy\"\n        app:icon=\"@drawable/file_copy_line\" />\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/item_exp_back_url_card.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<com.google.android.material.card.MaterialCardView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/exp_url_card\"\n    style=\"?attr/materialCardViewOutlinedStyle\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_marginBottom=\"8dp\"\n    android:backgroundTint=\"?attr/colorSecondaryContainer\"\n    android:clickable=\"true\"\n    android:focusable=\"true\"\n    app:layout_constraintTop_toTopOf=\"parent\"\n    app:strokeColor=\"?attr/colorSecondaryContainer\"\n    app:strokeWidth=\"0dp\">\n\n    <TextView\n        android:id=\"@+id/exp_url_text\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"4dp\"\n        android:drawablePadding=\"4dp\"\n        android:gravity=\"center_vertical\"\n        android:paddingStart=\"3dp\"\n        android:paddingEnd=\"0dp\"\n        android:text=\"https://im.qq.com/\"\n        android:textColor=\"?attr/colorOnSecondaryContainer\"\n        app:drawableStartCompat=\"@drawable/sparkling_line\" />\n</com.google.android.material.card.MaterialCardView>\n"
  },
  {
    "path": "app/src/main/res/layout/item_qq_version.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<com.google.android.material.card.MaterialCardView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/card_all\"\n    style=\"?attr/materialCardViewElevatedStyle\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_margin=\"5dp\"\n    android:clickable=\"true\"\n    android:focusable=\"true\">\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:id=\"@+id/item_all\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:padding=\"10dp\">\n\n        <androidx.constraintlayout.widget.ConstraintLayout\n            android:id=\"@+id/list_con\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:layout_constraintTop_toTopOf=\"parent\">\n\n            <androidx.constraintlayout.widget.ConstraintLayout\n                android:id=\"@+id/tv_content\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintEnd_toStartOf=\"@id/ib_expand\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintVertical_bias=\"0.5\"\n                app:layout_constraintVertical_chainStyle=\"packed\">\n\n                <TextView\n                    android:id=\"@+id/tv_version\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"6dp\"\n                    android:layout_marginEnd=\"6dp\"\n                    android:text=\"9.0.25\"\n                    android:textColor=\"?attr/colorPrimary\"\n                    android:textSize=\"28sp\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"parent\" />\n\n                <ImageView\n                    android:id=\"@+id/ue_tag\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"3dp\"\n                    android:layout_marginEnd=\"0dp\"\n                    android:contentDescription=\"@string/unrealEngineTag\"\n                    android:padding=\"2dp\"\n                    android:src=\"@drawable/ue_icon_2023_black\"\n                    app:layout_constraintBottom_toBottomOf=\"parent\"\n                    app:layout_constraintStart_toEndOf=\"@id/tv_version\"\n                    app:layout_constraintTop_toTopOf=\"parent\"\n                    app:tint=\"?attr/colorPrimary\" />\n\n                <ImageView\n                    android:id=\"@+id/kuikly_tag\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"1dp\"\n                    android:layout_marginEnd=\"0dp\"\n                    android:contentDescription=\"@string/kuiklyTag\"\n                    android:paddingStart=\"3dp\"\n                    android:paddingTop=\"2.5dp\"\n                    android:paddingEnd=\"2dp\"\n                    android:paddingBottom=\"2.5dp\"\n                    android:src=\"@drawable/kuikly_official\"\n                    app:layout_constraintBottom_toBottomOf=\"parent\"\n                    app:layout_constraintStart_toEndOf=\"@id/ue_tag\"\n                    app:layout_constraintTop_toTopOf=\"parent\"\n                    app:tint=\"?attr/colorPrimary\" />\n\n                <ImageView\n                    android:id=\"@+id/qqnt_tag\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"1dp\"\n                    android:layout_marginEnd=\"0dp\"\n                    android:contentDescription=\"@string/qqntTag\"\n                    android:src=\"@drawable/qqnt_logo_unofficial\"\n                    app:layout_constraintBottom_toBottomOf=\"parent\"\n                    app:layout_constraintStart_toEndOf=\"@id/kuikly_tag\"\n                    app:layout_constraintTop_toTopOf=\"parent\"\n                    app:tint=\"?attr/colorPrimary\" />\n\n                <ImageView\n                    android:id=\"@+id/accessibility_tag\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"3dp\"\n                    android:layout_marginEnd=\"0dp\"\n                    android:contentDescription=\"@string/accessibilityTag\"\n                    android:focusable=\"true\"\n                    android:src=\"@drawable/accessibility_new_20px\"\n                    app:layout_constraintBottom_toBottomOf=\"parent\"\n                    app:layout_constraintStart_toEndOf=\"@id/qqnt_tag\"\n                    app:layout_constraintTop_toTopOf=\"parent\"\n                    app:tint=\"?attr/colorPrimary\" />\n\n                <com.google.android.material.card.MaterialCardView\n                    android:id=\"@+id/tv_install_card\"\n                    style=\"?attr/materialCardViewFilledStyle\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"6dp\"\n                    android:layout_marginEnd=\"0dp\"\n                    android:backgroundTint=\"?attr/colorSecondaryContainer\"\n                    app:layout_constraintBottom_toBottomOf=\"@id/tv_version\"\n                    app:layout_constraintStart_toEndOf=\"@id/accessibility_tag\"\n                    app:layout_constraintTop_toTopOf=\"@id/tv_version\"\n                    app:shapeAppearance=\"?attr/shapeAppearanceCornerExtraSmall\">\n\n                    <TextView\n                        android:id=\"@+id/tv_install\"\n                        style=\"?attr/textAppearanceLabelSmall\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginStart=\"2dp\"\n                        android:layout_marginEnd=\"2dp\"\n                        android:letterSpacing=\"0\"\n                        android:padding=\"4dp\"\n                        android:text=\"@string/installed\"\n                        android:textColor=\"?attr/colorOnSecondaryContainer\"\n                        android:textSize=\"10sp\"\n                        app:layout_constraintBottom_toBottomOf=\"@id/tv_version\"\n                        app:layout_constraintEnd_toEndOf=\"parent\"\n                        app:layout_constraintTop_toTopOf=\"@id/tv_version\" />\n\n                </com.google.android.material.card.MaterialCardView>\n\n                <com.google.android.material.card.MaterialCardView\n                    android:id=\"@+id/tv_per_size_card\"\n                    style=\"?attr/materialCardViewFilledStyle\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:backgroundTint=\"?attr/colorSecondaryContainer\"\n                    app:layout_constraintBottom_toBottomOf=\"@id/tv_version\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"@id/tv_version\"\n                    app:shapeAppearance=\"?attr/shapeAppearanceCornerExtraSmall\">\n\n                    <TextView\n                        android:id=\"@+id/tv_per_size_text\"\n                        style=\"?attr/textAppearanceLabelSmall\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginStart=\"2dp\"\n                        android:layout_marginEnd=\"2dp\"\n                        android:letterSpacing=\"0\"\n                        android:padding=\"4dp\"\n                        android:text=\"75.47%\"\n                        android:textColor=\"?attr/colorOnSecondaryContainer\"\n                        android:textSize=\"10sp\"\n                        app:layout_constraintBottom_toBottomOf=\"@id/tv_version\"\n                        app:layout_constraintEnd_toEndOf=\"parent\"\n                        app:layout_constraintTop_toTopOf=\"@id/tv_version\" />\n\n                </com.google.android.material.card.MaterialCardView>\n\n                <com.google.android.material.card.MaterialCardView\n                    android:id=\"@+id/tv_size_card\"\n                    style=\"?attr/materialCardViewFilledStyle\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginEnd=\"6dp\"\n                    android:backgroundTint=\"?attr/colorSecondaryContainer\"\n                    app:layout_constraintBottom_toBottomOf=\"@id/tv_version\"\n                    app:layout_constraintEnd_toStartOf=\"@id/tv_per_size_card\"\n                    app:layout_constraintTop_toTopOf=\"@id/tv_version\"\n                    app:shapeAppearance=\"?attr/shapeAppearanceCornerExtraSmall\">\n\n                    <TextView\n                        android:id=\"@+id/tv_size\"\n                        style=\"?attr/textAppearanceLabelSmall\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginStart=\"2dp\"\n                        android:layout_marginEnd=\"2dp\"\n                        android:letterSpacing=\"0\"\n                        android:padding=\"4dp\"\n                        android:text=\"307 MB\"\n                        android:textColor=\"?attr/colorOnSecondaryContainer\"\n                        android:textSize=\"10sp\"\n                        app:layout_constraintBottom_toBottomOf=\"@id/tv_version\"\n                        app:layout_constraintEnd_toEndOf=\"parent\"\n                        app:layout_constraintTop_toTopOf=\"@id/tv_version\" />\n\n                </com.google.android.material.card.MaterialCardView>\n\n\n            </androidx.constraintlayout.widget.ConstraintLayout>\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/ib_expand\"\n                style=\"?attr/materialIconButtonStyle\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:contentDescription=\"@string/versionCardExpandButtonContentDescription\"\n                app:icon=\"@drawable/arrow_down_s_line\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\" />\n\n        </androidx.constraintlayout.widget.ConstraintLayout>\n\n        <com.google.android.material.progressindicator.LinearProgressIndicator\n            android:id=\"@+id/list_progress_line\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:elevation=\"10dp\"\n            app:layout_anchorGravity=\"bottom\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/list_con\" />\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n\n\n</com.google.android.material.card.MaterialCardView>"
  },
  {
    "path": "app/src/main/res/layout/item_qq_version_detail.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<com.google.android.material.card.MaterialCardView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/card_all_detail\"\n    style=\"?attr/materialCardViewElevatedStyle\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_margin=\"5dp\"\n    android:backgroundTint=\"?android:colorBackground\"\n    android:clickable=\"true\"\n    android:focusable=\"true\">\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:id=\"@+id/item_all_detail\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\"\n        android:padding=\"10dp\">\n\n        <androidx.constraintlayout.widget.ConstraintLayout\n            android:id=\"@+id/tv_content_detail\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            app:layout_constraintBottom_toBottomOf=\"@id/ib_collapse\"\n            app:layout_constraintEnd_toStartOf=\"@id/ib_collapse\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"@id/ib_collapse\">\n\n            <TextView\n                android:id=\"@+id/tv_old_version\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"6dp\"\n                android:layout_marginEnd=\"6dp\"\n                android:text=\"9.0.25\"\n                android:textColor=\"?attr/colorPrimary\"\n                android:textSize=\"28sp\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\" />\n\n            <ImageView\n                android:id=\"@+id/ue_old_tag\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"3dp\"\n                android:layout_marginEnd=\"0dp\"\n                android:contentDescription=\"@string/unrealEngineTag\"\n                android:padding=\"2dp\"\n                android:src=\"@drawable/ue_icon_2023_black\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintStart_toEndOf=\"@id/tv_old_version\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:tint=\"?attr/colorPrimary\" />\n\n            <ImageView\n                android:id=\"@+id/kuikly_old_tag\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"1dp\"\n                android:layout_marginEnd=\"0dp\"\n                android:contentDescription=\"@string/kuiklyTag\"\n                android:paddingStart=\"3dp\"\n                android:paddingTop=\"2.5dp\"\n                android:paddingEnd=\"2dp\"\n                android:paddingBottom=\"2.5dp\"\n                android:src=\"@drawable/kuikly_official\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintStart_toEndOf=\"@id/ue_old_tag\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:tint=\"?attr/colorPrimary\" />\n\n            <ImageView\n                android:id=\"@+id/qqnt_old_tag\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"1dp\"\n                android:layout_marginEnd=\"0dp\"\n                android:contentDescription=\"@string/qqntTag\"\n                android:src=\"@drawable/qqnt_logo_unofficial\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintStart_toEndOf=\"@id/kuikly_old_tag\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:tint=\"?attr/colorPrimary\" />\n\n            <ImageView\n                android:id=\"@+id/accessibility_old_tag\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:contentDescription=\"@string/accessibilityTag\"\n                android:focusable=\"true\"\n                android:src=\"@drawable/accessibility_new_20px\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintStart_toEndOf=\"@id/qqnt_old_tag\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:tint=\"?attr/colorPrimary\" />\n\n            <com.google.android.material.card.MaterialCardView\n                android:id=\"@+id/tv_old_install_card\"\n                style=\"?attr/materialCardViewFilledStyle\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"6dp\"\n                android:backgroundTint=\"?attr/colorSecondaryContainer\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintStart_toEndOf=\"@id/accessibility_old_tag\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:shapeAppearance=\"?attr/shapeAppearanceCornerExtraSmall\">\n\n                <TextView\n                    android:id=\"@+id/tv_old_install\"\n                    style=\"?attr/textAppearanceLabelSmall\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"2dp\"\n                    android:layout_marginEnd=\"2dp\"\n                    android:letterSpacing=\"0\"\n                    android:padding=\"4dp\"\n                    android:text=\"@string/installed\"\n                    android:textColor=\"?attr/colorOnSecondaryContainer\"\n                    android:textSize=\"10sp\"\n                    app:layout_constraintBottom_toBottomOf=\"@id/tv_old_version\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"@id/tv_old_version\" />\n\n            </com.google.android.material.card.MaterialCardView>\n\n            <com.google.android.material.card.MaterialCardView\n                android:id=\"@+id/tv_old_per_size_card\"\n                style=\"?attr/materialCardViewFilledStyle\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:backgroundTint=\"?attr/colorSecondaryContainer\"\n                app:layout_constraintBottom_toBottomOf=\"@id/tv_old_version\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"@id/tv_old_version\"\n                app:shapeAppearance=\"?attr/shapeAppearanceCornerExtraSmall\">\n\n                <TextView\n                    android:id=\"@+id/tv_old_per_size_text\"\n                    style=\"?attr/textAppearanceLabelSmall\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"2dp\"\n                    android:layout_marginEnd=\"2dp\"\n                    android:letterSpacing=\"0\"\n                    android:padding=\"4dp\"\n                    android:text=\"75.47%\"\n                    android:textColor=\"?attr/colorOnSecondaryContainer\"\n                    android:textSize=\"10sp\"\n                    app:layout_constraintBottom_toBottomOf=\"@id/tv_old_version\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"@id/tv_old_version\" />\n\n            </com.google.android.material.card.MaterialCardView>\n\n            <com.google.android.material.card.MaterialCardView\n                android:id=\"@+id/tv_old_size_card\"\n                style=\"?attr/materialCardViewFilledStyle\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginEnd=\"6dp\"\n                android:backgroundTint=\"?attr/colorSecondaryContainer\"\n                app:layout_constraintBottom_toBottomOf=\"@id/tv_old_version\"\n                app:layout_constraintEnd_toStartOf=\"@id/tv_old_per_size_card\"\n                app:layout_constraintTop_toTopOf=\"@id/tv_old_version\"\n                app:shapeAppearance=\"?attr/shapeAppearanceCornerExtraSmall\">\n\n                <TextView\n                    android:id=\"@+id/tv_old_size\"\n                    style=\"?attr/textAppearanceLabelSmall\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"2dp\"\n                    android:layout_marginEnd=\"2dp\"\n                    android:letterSpacing=\"0\"\n                    android:padding=\"4dp\"\n                    android:text=\"307 MB\"\n                    android:textColor=\"?attr/colorOnSecondaryContainer\"\n                    android:textSize=\"10sp\"\n                    app:layout_constraintBottom_toBottomOf=\"@id/tv_old_version\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"@id/tv_old_version\" />\n\n            </com.google.android.material.card.MaterialCardView>\n\n\n        </androidx.constraintlayout.widget.ConstraintLayout>\n\n        <TextView\n            android:id=\"@+id/tv_detail_version\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"版本：9.0.25\"\n            android:textColor=\"?attr/colorSecondary\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/ib_collapse\" />\n\n        <TextView\n            android:id=\"@+id/tv_detail_size\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"额定大小：307 MB\"\n            android:textColor=\"?attr/colorSecondary\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/tv_detail_version\" />\n\n        <TextView\n            android:id=\"@+id/tv_per_size\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"match_parent\"\n            android:text=\"占比历史额定最大包（）：\"\n            android:textColor=\"?attr/colorSecondary\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/tv_detail_size\" />\n\n        <com.google.android.material.progressindicator.LinearProgressIndicator\n            android:id=\"@+id/list_detail_progress_line\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:elevation=\"10dp\"\n            android:paddingTop=\"3dp\"\n            android:paddingBottom=\"6dp\"\n            app:layout_anchorGravity=\"bottom\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/tv_per_size\" />\n\n        <TextView\n            android:id=\"@+id/tv_title\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"match_parent\"\n            android:text=\"版本特性：\"\n            android:textColor=\"?attr/colorSecondary\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/list_detail_progress_line\" />\n\n        <TextView\n            android:id=\"@+id/tv_desc\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:paddingBottom=\"6dp\"\n            android:text=\"- 新年新“状态”\\n- 文本文本文本\"\n            android:textColor=\"?attr/colorSecondary\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/tv_title\" />\n\n        <HorizontalScrollView\n            android:id=\"@+id/scroll\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:scrollbars=\"none\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/tv_desc\">\n\n            <LinearLayout\n                android:id=\"@+id/linear_images\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:contentDescription=\"@string/imageGallery\"\n                android:orientation=\"horizontal\" />\n\n        </HorizontalScrollView>\n\n        <com.google.android.material.button.MaterialButton\n            android:id=\"@+id/ib_collapse\"\n            style=\"?attr/materialIconButtonStyle\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:contentDescription=\"@string/versionCardCollapseButtonContentDescription\"\n            app:icon=\"@drawable/arrow_up_s_line\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\" />\n\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</com.google.android.material.card.MaterialCardView>"
  },
  {
    "path": "app/src/main/res/layout/item_tim_version.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<com.google.android.material.card.MaterialCardView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/card_tim_all\"\n    style=\"?attr/materialCardViewElevatedStyle\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_margin=\"5dp\"\n    android:clickable=\"true\"\n    android:focusable=\"true\">\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:id=\"@+id/item_tim_all\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:padding=\"10dp\">\n\n        <androidx.constraintlayout.widget.ConstraintLayout\n            android:id=\"@+id/list_tim_con\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:layout_constraintTop_toTopOf=\"parent\">\n\n            <androidx.constraintlayout.widget.ConstraintLayout\n                android:id=\"@+id/tv_tim_content\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintEnd_toStartOf=\"@id/ib_tim_link\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintVertical_bias=\"0.5\"\n                app:layout_constraintVertical_chainStyle=\"packed\">\n\n                <TextView\n                    android:id=\"@+id/tv_tim_version\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"6dp\"\n                    android:layout_marginEnd=\"6dp\"\n                    android:text=\"9.0.25\"\n                    android:textColor=\"?attr/colorPrimary\"\n                    android:textSize=\"28sp\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"parent\" />\n\n                <ImageView\n                    android:id=\"@+id/kuikly_tim_tag\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"1dp\"\n                    android:layout_marginEnd=\"0dp\"\n                    android:contentDescription=\"@string/kuiklyTag\"\n                    android:paddingStart=\"3dp\"\n                    android:paddingTop=\"2.5dp\"\n                    android:paddingEnd=\"2dp\"\n                    android:paddingBottom=\"2.5dp\"\n                    android:src=\"@drawable/kuikly_official\"\n                    app:layout_constraintBottom_toBottomOf=\"parent\"\n                    app:layout_constraintStart_toEndOf=\"@id/tv_tim_version\"\n                    app:layout_constraintTop_toTopOf=\"parent\"\n                    app:tint=\"?attr/colorPrimary\" />\n\n                <ImageView\n                    android:id=\"@+id/qqnt_tim_tag\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"1dp\"\n                    android:layout_marginEnd=\"0dp\"\n                    android:contentDescription=\"@string/qqntTag\"\n                    android:src=\"@drawable/qqnt_logo_unofficial\"\n                    app:layout_constraintBottom_toBottomOf=\"parent\"\n                    app:layout_constraintStart_toEndOf=\"@id/kuikly_tim_tag\"\n                    app:layout_constraintTop_toTopOf=\"parent\"\n                    app:tint=\"?attr/colorPrimary\" />\n\n                <ImageView\n                    android:id=\"@+id/accessibility_tim_tag\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"3dp\"\n                    android:layout_marginEnd=\"0dp\"\n                    android:contentDescription=\"@string/accessibilityTag\"\n                    android:focusable=\"true\"\n                    android:src=\"@drawable/accessibility_new_20px\"\n                    app:layout_constraintBottom_toBottomOf=\"parent\"\n                    app:layout_constraintStart_toEndOf=\"@id/qqnt_tim_tag\"\n                    app:layout_constraintTop_toTopOf=\"parent\"\n                    app:tint=\"?attr/colorPrimary\" />\n\n                <com.google.android.material.card.MaterialCardView\n                    android:id=\"@+id/tv_tim_install_card\"\n                    style=\"?attr/materialCardViewFilledStyle\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"6dp\"\n                    android:layout_marginEnd=\"0dp\"\n                    android:backgroundTint=\"?attr/colorSecondaryContainer\"\n                    app:layout_constraintBottom_toBottomOf=\"@id/tv_tim_version\"\n                    app:layout_constraintStart_toEndOf=\"@id/accessibility_tim_tag\"\n                    app:layout_constraintTop_toTopOf=\"@id/tv_tim_version\"\n                    app:shapeAppearance=\"?attr/shapeAppearanceCornerExtraSmall\">\n\n                    <TextView\n                        android:id=\"@+id/tv_tim_install\"\n                        style=\"?attr/textAppearanceLabelSmall\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginStart=\"2dp\"\n                        android:layout_marginEnd=\"2dp\"\n                        android:letterSpacing=\"0\"\n                        android:padding=\"4dp\"\n                        android:text=\"@string/installed\"\n                        android:textColor=\"?attr/colorOnSecondaryContainer\"\n                        android:textSize=\"10sp\"\n                        app:layout_constraintBottom_toBottomOf=\"@id/tv_tim_version\"\n                        app:layout_constraintEnd_toEndOf=\"parent\"\n                        app:layout_constraintTop_toTopOf=\"@id/tv_tim_version\" />\n\n                </com.google.android.material.card.MaterialCardView>\n\n            </androidx.constraintlayout.widget.ConstraintLayout>\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/ib_tim_link\"\n                style=\"?attr/materialIconButtonFilledTonalStyle\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:contentDescription=\"@string/download\"\n                app:icon=\"@drawable/link\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintEnd_toStartOf=\"@id/ib_tim_expand\"\n                app:layout_constraintTop_toTopOf=\"parent\" />\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/ib_tim_expand\"\n                style=\"?attr/materialIconButtonStyle\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:contentDescription=\"@string/versionCardExpandButtonContentDescription\"\n                app:icon=\"@drawable/arrow_down_s_line\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\" />\n\n        </androidx.constraintlayout.widget.ConstraintLayout>\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</com.google.android.material.card.MaterialCardView>"
  },
  {
    "path": "app/src/main/res/layout/item_tim_version_detail.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<com.google.android.material.card.MaterialCardView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/card_all_detail\"\n    style=\"?attr/materialCardViewElevatedStyle\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_margin=\"5dp\"\n    android:backgroundTint=\"?android:colorBackground\"\n    android:clickable=\"true\"\n    android:focusable=\"true\">\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:id=\"@+id/item_tim_all_detail\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\"\n        android:padding=\"10dp\">\n\n        <androidx.constraintlayout.widget.ConstraintLayout\n            android:id=\"@+id/tv_tim_content_detail\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            app:layout_constraintBottom_toBottomOf=\"@id/ib_tim_collapse\"\n            app:layout_constraintEnd_toStartOf=\"@id/ib_tim_old_link\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"@id/ib_tim_collapse\">\n\n            <TextView\n                android:id=\"@+id/tv_tim_old_version\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"6dp\"\n                android:layout_marginEnd=\"6dp\"\n                android:text=\"9.0.25\"\n                android:textColor=\"?attr/colorPrimary\"\n                android:textSize=\"28sp\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\" />\n\n            <ImageView\n                android:id=\"@+id/kuikly_tim_old_tag\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"1dp\"\n                android:layout_marginEnd=\"0dp\"\n                android:contentDescription=\"@string/kuiklyTag\"\n                android:paddingStart=\"3dp\"\n                android:paddingTop=\"2.5dp\"\n                android:paddingEnd=\"2dp\"\n                android:paddingBottom=\"2.5dp\"\n                android:src=\"@drawable/kuikly_official\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintStart_toEndOf=\"@id/tv_tim_old_version\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:tint=\"?attr/colorPrimary\" />\n\n            <ImageView\n                android:id=\"@+id/qqnt_tim_old_tag\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"1dp\"\n                android:layout_marginEnd=\"0dp\"\n                android:contentDescription=\"@string/qqntTag\"\n                android:src=\"@drawable/qqnt_logo_unofficial\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintStart_toEndOf=\"@id/kuikly_tim_old_tag\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:tint=\"?attr/colorPrimary\" />\n\n            <ImageView\n                android:id=\"@+id/accessibility_tim_old_tag\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"3dp\"\n                android:layout_marginEnd=\"0dp\"\n                android:contentDescription=\"@string/accessibilityTag\"\n                android:focusable=\"true\"\n                android:src=\"@drawable/accessibility_new_20px\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintStart_toEndOf=\"@id/qqnt_tim_old_tag\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:tint=\"?attr/colorPrimary\" />\n\n            <com.google.android.material.card.MaterialCardView\n                android:id=\"@+id/tv_tim_old_install_card\"\n                style=\"?attr/materialCardViewFilledStyle\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"6dp\"\n                android:backgroundTint=\"?attr/colorSecondaryContainer\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintStart_toEndOf=\"@id/accessibility_tim_old_tag\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:shapeAppearance=\"?attr/shapeAppearanceCornerExtraSmall\">\n\n                <TextView\n                    android:id=\"@+id/tv_tim_old_install\"\n                    style=\"?attr/textAppearanceLabelSmall\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"2dp\"\n                    android:layout_marginEnd=\"2dp\"\n                    android:letterSpacing=\"0\"\n                    android:padding=\"4dp\"\n                    android:text=\"@string/installed\"\n                    android:textColor=\"?attr/colorOnSecondaryContainer\"\n                    android:textSize=\"10sp\"\n                    app:layout_constraintBottom_toBottomOf=\"@id/tv_tim_old_version\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"@id/tv_tim_old_version\" />\n\n            </com.google.android.material.card.MaterialCardView>\n        </androidx.constraintlayout.widget.ConstraintLayout>\n\n        <TextView\n            android:id=\"@+id/tv_tim_detail_version\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"版本：9.0.25\"\n            android:textColor=\"?attr/colorSecondary\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/ib_tim_collapse\" />\n\n        <TextView\n            android:id=\"@+id/tv_tim_detail_date\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"发布日期：1919-08-10\"\n            android:textColor=\"?attr/colorSecondary\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/tv_tim_detail_version\" />\n\n        <TextView\n            android:id=\"@+id/tv_tim_desc\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"- 优化性能和体验问题，给你更好的使用体验。\"\n            android:textColor=\"?attr/colorSecondary\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/tv_tim_detail_date\" />\n\n        <com.google.android.material.button.MaterialButton\n            android:id=\"@+id/ib_tim_old_link\"\n            style=\"?attr/materialIconButtonFilledTonalStyle\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:contentDescription=\"@string/download\"\n            app:icon=\"@drawable/link\"\n            app:layout_constraintBottom_toBottomOf=\"@id/ib_tim_collapse\"\n            app:layout_constraintEnd_toStartOf=\"@id/ib_tim_collapse\"\n            app:layout_constraintTop_toTopOf=\"@id/ib_tim_collapse\" />\n\n        <com.google.android.material.button.MaterialButton\n            android:id=\"@+id/ib_tim_collapse\"\n            style=\"?attr/materialIconButtonStyle\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:contentDescription=\"@string/versionCardCollapseButtonContentDescription\"\n            app:icon=\"@drawable/arrow_up_s_line\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\" />\n\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</com.google.android.material.card.MaterialCardView>"
  },
  {
    "path": "app/src/main/res/layout/item_weixin_version.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<com.google.android.material.card.MaterialCardView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/card_weixin_all\"\n    style=\"?attr/materialCardViewElevatedStyle\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_margin=\"5dp\"\n    android:clickable=\"true\"\n    android:focusable=\"true\">\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:id=\"@+id/item_weixin_all\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:padding=\"10dp\">\n\n        <androidx.constraintlayout.widget.ConstraintLayout\n            android:id=\"@+id/list_weixin_con\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:layout_constraintTop_toTopOf=\"parent\">\n\n            <androidx.constraintlayout.widget.ConstraintLayout\n                android:id=\"@+id/tv_weixin_content\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintEnd_toStartOf=\"@id/ib_weixin_link\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintVertical_bias=\"0.5\"\n                app:layout_constraintVertical_chainStyle=\"packed\">\n\n                <TextView\n                    android:id=\"@+id/tv_weixin_version\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"6dp\"\n                    android:layout_marginEnd=\"6dp\"\n                    android:textColor=\"?attr/colorPrimary\"\n                    android:textSize=\"28sp\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"parent\"\n                    tools:text=\"8.0.56\" />\n\n                <com.google.android.material.card.MaterialCardView\n                    android:id=\"@+id/tv_weixin_install_card\"\n                    style=\"?attr/materialCardViewFilledStyle\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"6dp\"\n                    android:layout_marginEnd=\"0dp\"\n                    android:backgroundTint=\"?attr/colorSecondaryContainer\"\n                    app:layout_constraintBottom_toBottomOf=\"@id/tv_weixin_version\"\n                    app:layout_constraintStart_toEndOf=\"@id/tv_weixin_version\"\n                    app:layout_constraintTop_toTopOf=\"@id/tv_weixin_version\"\n                    app:shapeAppearance=\"?attr/shapeAppearanceCornerExtraSmall\">\n\n                    <TextView\n                        android:id=\"@+id/tv_weixin_install\"\n                        style=\"?attr/textAppearanceLabelSmall\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginStart=\"2dp\"\n                        android:layout_marginEnd=\"2dp\"\n                        android:letterSpacing=\"0\"\n                        android:padding=\"4dp\"\n                        android:text=\"@string/installed\"\n                        android:textColor=\"?attr/colorOnSecondaryContainer\"\n                        android:textSize=\"10sp\"\n                        app:layout_constraintBottom_toBottomOf=\"@id/tv_weixin_version\"\n                        app:layout_constraintEnd_toEndOf=\"parent\"\n                        app:layout_constraintTop_toTopOf=\"@id/tv_weixin_version\" />\n\n                </com.google.android.material.card.MaterialCardView>\n\n            </androidx.constraintlayout.widget.ConstraintLayout>\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/ib_weixin_link\"\n                style=\"?attr/materialIconButtonFilledTonalStyle\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:contentDescription=\"@string/download\"\n                app:icon=\"@drawable/link\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintEnd_toStartOf=\"@id/ib_weixin_expand\"\n                app:layout_constraintTop_toTopOf=\"parent\" />\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/ib_weixin_expand\"\n                style=\"?attr/materialIconButtonStyle\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:contentDescription=\"@string/versionCardExpandButtonContentDescription\"\n                app:icon=\"@drawable/arrow_down_s_line\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\" />\n\n        </androidx.constraintlayout.widget.ConstraintLayout>\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</com.google.android.material.card.MaterialCardView>"
  },
  {
    "path": "app/src/main/res/layout/item_weixin_version_detail.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<com.google.android.material.card.MaterialCardView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/card_all_detail\"\n    style=\"?attr/materialCardViewElevatedStyle\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_margin=\"5dp\"\n    android:backgroundTint=\"?android:colorBackground\"\n    android:clickable=\"true\"\n    android:focusable=\"true\">\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:id=\"@+id/item_weixin_all_detail\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\"\n        android:padding=\"10dp\">\n\n        <androidx.constraintlayout.widget.ConstraintLayout\n            android:id=\"@+id/tv_weixin_content_detail\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            app:layout_constraintBottom_toBottomOf=\"@id/ib_weixin_collapse\"\n            app:layout_constraintEnd_toStartOf=\"@id/ib_weixin_old_link\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"@id/ib_weixin_collapse\">\n\n            <TextView\n                android:id=\"@+id/tv_weixin_old_version\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"6dp\"\n                android:layout_marginEnd=\"6dp\"\n                android:text=\"8.0.56\"\n                android:textColor=\"?attr/colorPrimary\"\n                android:textSize=\"28sp\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\" />\n\n            <com.google.android.material.card.MaterialCardView\n                android:id=\"@+id/tv_weixin_old_install_card\"\n                style=\"?attr/materialCardViewFilledStyle\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"6dp\"\n                android:backgroundTint=\"?attr/colorSecondaryContainer\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintStart_toEndOf=\"@id/tv_weixin_old_version\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:shapeAppearance=\"?attr/shapeAppearanceCornerExtraSmall\">\n\n                <TextView\n                    android:id=\"@+id/tv_weixin_old_install\"\n                    style=\"?attr/textAppearanceLabelSmall\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"2dp\"\n                    android:layout_marginEnd=\"2dp\"\n                    android:letterSpacing=\"0\"\n                    android:padding=\"4dp\"\n                    android:text=\"@string/installed\"\n                    android:textColor=\"?attr/colorOnSecondaryContainer\"\n                    android:textSize=\"10sp\"\n                    app:layout_constraintBottom_toBottomOf=\"@id/tv_weixin_old_version\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"@id/tv_weixin_old_version\" />\n\n            </com.google.android.material.card.MaterialCardView>\n        </androidx.constraintlayout.widget.ConstraintLayout>\n\n        <TextView\n            android:id=\"@+id/tv_weixin_detail_version\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"版本：8.0.56\"\n            android:textColor=\"?attr/colorSecondary\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/ib_weixin_collapse\" />\n\n        <TextView\n            android:id=\"@+id/tv_weixin_detail_date\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"发布日期：1919-08-10\"\n            android:textColor=\"?attr/colorSecondary\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/tv_weixin_detail_version\" />\n\n        <TextView\n            android:id=\"@+id/tv_weixin_catalog_link\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/clickHereToViewTheChangelog\"\n            android:textColor=\"?attr/colorPrimary\"\n            android:textStyle=\"bold\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/tv_weixin_detail_date\" />\n\n        <com.google.android.material.button.MaterialButton\n            android:id=\"@+id/ib_weixin_old_link\"\n            style=\"?attr/materialIconButtonFilledTonalStyle\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:contentDescription=\"@string/download\"\n            app:icon=\"@drawable/link\"\n            app:layout_constraintBottom_toBottomOf=\"@id/ib_weixin_collapse\"\n            app:layout_constraintEnd_toStartOf=\"@id/ib_weixin_collapse\"\n            app:layout_constraintTop_toTopOf=\"@id/ib_weixin_collapse\" />\n\n        <com.google.android.material.button.MaterialButton\n            android:id=\"@+id/ib_weixin_collapse\"\n            style=\"?attr/materialIconButtonStyle\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:contentDescription=\"@string/versionCardCollapseButtonContentDescription\"\n            app:icon=\"@drawable/arrow_up_s_line\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\" />\n\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</com.google.android.material.card.MaterialCardView>"
  },
  {
    "path": "app/src/main/res/layout/local_qq.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\">\n\n    <com.google.android.material.card.MaterialCardView\n        android:id=\"@+id/item_qq_install_card\"\n        style=\"?attr/materialCardViewElevatedStyle\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"5dp\"\n        android:backgroundTint=\"?attr/colorSecondaryContainer\"\n        android:clickable=\"true\"\n        android:focusable=\"true\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:strokeColor=\"?attr/colorSecondaryContainer\"\n        app:strokeWidth=\"0dp\">\n\n        <TextView\n            android:id=\"@+id/item_qq_install_text\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_margin=\"10dp\"\n            android:drawablePadding=\"6dp\"\n            android:gravity=\"center_vertical\"\n            android:text=\"@string/localQQVersion\"\n            android:textColor=\"?attr/colorOnSecondaryContainer\"\n            android:textSize=\"13.55sp\"\n            app:drawableStartCompat=\"@drawable/phone_find_line\"\n            app:drawableTint=\"?attr/colorOnSecondaryContainer\" />\n    </com.google.android.material.card.MaterialCardView>\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/local_tim.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\">\n\n    <com.google.android.material.card.MaterialCardView\n        android:id=\"@+id/item_tim_install_card\"\n        style=\"?attr/materialCardViewElevatedStyle\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"5dp\"\n        android:backgroundTint=\"?attr/colorSecondaryContainer\"\n        android:clickable=\"true\"\n        android:focusable=\"true\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:strokeColor=\"?attr/colorSecondaryContainer\"\n        app:strokeWidth=\"0dp\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\">\n\n            <TextView\n                android:id=\"@+id/item_tim_install_text\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"10dp\"\n                android:layout_marginTop=\"10dp\"\n                android:layout_marginEnd=\"10dp\"\n                android:drawablePadding=\"6dp\"\n                android:gravity=\"center_vertical\"\n                android:text=\"@string/localTIMVersion\"\n                android:textColor=\"?attr/colorOnSecondaryContainer\"\n                android:textSize=\"13.55sp\"\n                app:drawableStartCompat=\"@drawable/phone_find_line\"\n                app:drawableTint=\"?attr/colorOnSecondaryContainer\" />\n\n            <com.google.android.material.card.MaterialCardView\n                android:id=\"@+id/item_tim_install_based_on_card\"\n                style=\"?attr/materialCardViewFilledStyle\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"8dp\"\n                android:layout_marginTop=\"4dp\"\n                android:layout_marginEnd=\"8dp\"\n                android:layout_marginBottom=\"8dp\"\n                android:backgroundTint=\"?android:colorBackground\"\n                app:layout_constraintBottom_toBottomOf=\"@id/tv_tim_version\"\n                app:layout_constraintStart_toEndOf=\"@id/accessibility_tim_tag\"\n                app:layout_constraintTop_toTopOf=\"@id/tv_tim_version\"\n                app:shapeAppearance=\"?attr/shapeAppearanceCornerExtraSmall\">\n\n                <TextView\n                    android:id=\"@+id/item_tim_install_based_on\"\n                    style=\"?attr/textAppearanceLabelSmall\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:drawablePadding=\"4dp\"\n                    android:gravity=\"center_vertical\"\n                    android:paddingStart=\"6dp\"\n                    android:paddingTop=\"4dp\"\n                    android:paddingEnd=\"6dp\"\n                    android:paddingBottom=\"4dp\"\n                    android:text=\"@string/basedOnQQVer\"\n                    android:textColor=\"?attr/colorSecondary\"\n                    android:textSize=\"10sp\"\n                    app:drawableStartCompat=\"@drawable/stack_line\"\n                    app:drawableTint=\"?attr/colorSecondary\" />\n\n            </com.google.android.material.card.MaterialCardView>\n        </LinearLayout>\n    </com.google.android.material.card.MaterialCardView>\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/local_weixin.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\">\n\n    <com.google.android.material.card.MaterialCardView\n        android:id=\"@+id/item_weixin_install_card\"\n        style=\"?attr/materialCardViewElevatedStyle\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"5dp\"\n        android:backgroundTint=\"?attr/colorSecondaryContainer\"\n        android:clickable=\"true\"\n        android:focusable=\"true\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:strokeColor=\"?attr/colorSecondaryContainer\"\n        app:strokeWidth=\"0dp\">\n\n        <TextView\n            android:id=\"@+id/item_weixin_install_text\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_margin=\"10dp\"\n            android:drawablePadding=\"6dp\"\n            android:gravity=\"center_vertical\"\n            android:text=\"@string/localWeixinVersion\"\n            android:textColor=\"?attr/colorOnSecondaryContainer\"\n            android:textSize=\"13.55sp\"\n            app:drawableStartCompat=\"@drawable/phone_find_line\"\n            app:drawableTint=\"?attr/colorOnSecondaryContainer\" />\n    </com.google.android.material.card.MaterialCardView>\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/recycle_qq_version.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<androidx.recyclerview.widget.RecyclerView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/rv_content\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:clipToPadding=\"false\"\n    android:fillViewport=\"true\"\n    android:paddingStart=\"11dp\"\n    android:paddingTop=\"11dp\"\n    android:paddingEnd=\"11dp\"\n    android:paddingBottom=\"120dp\"\n    app:layout_behavior=\"@string/appbar_scrolling_view_behavior\"\n    app:layout_constrainedHeight=\"true\" />"
  },
  {
    "path": "app/src/main/res/layout/recycle_tim_version.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<androidx.recyclerview.widget.RecyclerView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/rv_tim_content\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:clipToPadding=\"false\"\n    android:fillViewport=\"true\"\n    android:paddingStart=\"11dp\"\n    android:paddingTop=\"11dp\"\n    android:paddingEnd=\"11dp\"\n    android:paddingBottom=\"120dp\"\n    app:layout_behavior=\"@string/appbar_scrolling_view_behavior\"\n    app:layout_constrainedHeight=\"true\" />"
  },
  {
    "path": "app/src/main/res/layout/success_button.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/success_button_constraint_layout\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"horizontal\"\n    android:paddingStart=\"20dp\"\n    android:paddingEnd=\"20dp\"\n    android:paddingBottom=\"20dp\">\n\n    <HorizontalScrollView\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_weight=\"1\"\n        android:scrollbars=\"none\">\n\n        <com.google.android.material.button.MaterialButtonGroup\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:spacing=\"0dp\">\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/btn_share\"\n                style=\"?attr/materialIconButtonFilledTonalStyle\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:contentDescription=\"@string/share\"\n                app:icon=\"@drawable/share_line\" />\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/btn_download\"\n                style=\"?attr/materialIconButtonFilledTonalStyle\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:contentDescription=\"@string/download\"\n                app:icon=\"@drawable/download_line\" />\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/btn_stop\"\n                style=\"?attr/materialIconButtonFilledTonalStyle\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:contentDescription=\"@string/stop\"\n                app:icon=\"@drawable/stop_line\" />\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/btn_continue\"\n                style=\"?attr/materialIconButtonFilledTonalStyle\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:contentDescription=\"@string/skip\"\n                app:icon=\"@drawable/skip_forward_line\" />\n\n        </com.google.android.material.button.MaterialButtonGroup>\n\n    </HorizontalScrollView>\n\n    <com.google.android.material.button.MaterialButton\n        android:id=\"@+id/btn_copy\"\n        style=\"@style/Widget.Material3.Button.Icon\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"@string/copy\"\n        app:icon=\"@drawable/file_copy_line\" />\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/update_qvt_button.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\"\n    android:paddingStart=\"20dp\"\n    android:paddingEnd=\"20dp\"\n    android:paddingBottom=\"20dp\">\n\n    <com.google.android.material.progressindicator.LinearProgressIndicator\n        android:id=\"@+id/progress_indicator\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"12dp\"\n        android:elevation=\"10dp\"\n        android:indeterminate=\"true\" />\n\n    <com.google.android.material.card.MaterialCardView\n        android:id=\"@+id/llm_gen_card\"\n        style=\"?attr/materialCardViewOutlinedStyle\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"12dp\"\n        android:backgroundTint=\"?attr/colorSecondaryContainer\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:strokeColor=\"?attr/colorSecondaryContainer\"\n        app:strokeWidth=\"0dp\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            android:padding=\"10dp\">\n\n            <TextView\n                style=\"?attr/textAppearanceTitleSmall\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:drawablePadding=\"4dp\"\n                android:gravity=\"center_vertical\"\n                android:paddingStart=\"1dp\"\n                android:paddingEnd=\"1dp\"\n                android:paddingBottom=\"3dp\"\n                android:text=\"@string/llmIntelligent\"\n                android:textColor=\"?attr/colorOnSecondaryContainer\"\n                app:drawableStartCompat=\"@drawable/ai_generate_2\"\n                app:drawableTint=\"?attr/colorOnSecondaryContainer\" />\n\n            <TextView\n                android:id=\"@+id/llm_gen_text\"\n                style=\"?attr/textAppearanceBodySmall\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:gravity=\"center_vertical\"\n                android:paddingStart=\"1dp\"\n                android:paddingEnd=\"1dp\"\n                android:text=\"AI LLM 生成内容占位符\"\n                android:textColor=\"?attr/colorOnSecondaryContainer\" />\n\n        </LinearLayout>\n    </com.google.android.material.card.MaterialCardView>\n\n    <com.google.android.material.button.MaterialButtonGroup\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\">\n\n        <com.google.android.material.button.MaterialButton\n            android:id=\"@+id/update_qvt_copy\"\n            style=\"@style/Widget.Material3.Button.TonalButton.Icon\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginEnd=\"8dp\"\n            android:layout_weight=\"1\"\n            android:text=\"@string/copy\"\n            app:icon=\"@drawable/file_copy_line\" />\n\n        <com.google.android.material.button.MaterialButton\n            android:id=\"@+id/update_qvt_download\"\n            style=\"@style/Widget.Material3.Button.Icon\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"8dp\"\n            android:layout_weight=\"1\"\n            android:text=\"@string/download\"\n            app:icon=\"@drawable/download_line\" />\n    </com.google.android.material.button.MaterialButtonGroup>\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/user_agreement.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/user_agreement\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <LinearLayout\n        android:id=\"@+id/UA_text\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:layout_marginStart=\"12dp\"\n        android:layout_marginTop=\"12dp\"\n        android:layout_marginEnd=\"12dp\"\n        app:layout_constraintBottom_toTopOf=\"@id/UA_button_group\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\">\n\n        <me.zhanghai.android.fastscroll.FastScrollScrollView\n            android:id=\"@+id/UA_scroll\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:scrollbars=\"none\">\n\n            <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"vertical\">\n\n                <TextView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"8dp\"\n                    android:layout_marginEnd=\"8dp\"\n                    android:layout_marginBottom=\"8dp\"\n                    android:text=\"此用户协议于 2024 年 10 月 28 日修订，并于 2024 年 10 月 29 日实施。\"\n                    tools:ignore=\"HardcodedText\" />\n\n                <TextView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_margin=\"8dp\"\n                    android:text=\"导言\"\n                    android:textSize=\"18sp\"\n                    android:textStyle=\"bold\"\n                    tools:ignore=\"HardcodedText\" />\n\n                <TextView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_margin=\"8dp\"\n                    android:text=\"欢迎您使用 QQ 版本列表实用工具。\\n\\n为使用 QQ 版本列表实用工具及服务，您应当阅读并遵守《QQ 版本列表实用工具用户协议》（以下简称“本协议”）。请您务必审慎阅读，充分理解各条款内容，特别是免除或者限制责任的条款，以及开通或使用某项服务的单独协议，并选择接受或不接受。限制、免责条款可能以加粗形式提示您注意。\\n\\n除非您已阅读并接受本协议所有条款，否则您无权获取和使用 QQ 版本列表实用工具及相关服务。您的任何使用本应用行为即视为您已阅读并同意上述协议的约束。如果您未满 18 周岁，请在法定监护人的陪同下阅读本协议及其它上述协议，并特别注意未成年人使用条款。\"\n                    tools:ignore=\"HardcodedText\" />\n\n                <TextView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_margin=\"8dp\"\n                    android:text=\"一、协议的范围\"\n                    android:textSize=\"18sp\"\n                    android:textStyle=\"bold\"\n                    tools:ignore=\"HardcodedText\" />\n\n                <TextView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_margin=\"8dp\"\n                    android:text=\"本协议是您与 QQ 版本列表实用工具之间关于您下载，安装，使用，复制 QQ 版本列表实用工具，以及使用 QQ 版本列表实用工具相关服务所订立的协议。\"\n                    tools:ignore=\"HardcodedText\" />\n\n                <TextView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_margin=\"8dp\"\n                    android:text=\"二、关于 QQ 版本列表实用工具提供的服务\"\n                    android:textSize=\"18sp\"\n                    android:textStyle=\"bold\"\n                    tools:ignore=\"HardcodedText\" />\n\n                <TextView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_margin=\"8dp\"\n                    android:text=\"QQ 版本列表实用工具提供的服务是指提供 Android QQ 和 Android TIM 版本列表的查看和对腾讯服务器提供的 Android QQ 及其它可能存在的腾讯软件产品的下载链接的枚举法扫描。QQ 版本列表实用工具用户可以通过本应用及时获取到 Android QQ 及其它可能存在的腾讯软件产品的版本更新的最新信息。\\n\\nQQ 版本列表实用工具不面向中国大陆境内公众用户提供服务。请确认您并非中国大陆公民。\\n\\n此外，QQ 版本列表实用工具可能以软件实验形式提供一些尚不稳定的服务，您在使用此类服务时，必须明确并确保自身具备足够的风险识别和承受能力。\"\n                    tools:ignore=\"HardcodedText\" />\n\n                <TextView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_margin=\"8dp\"\n                    android:text=\"三、软件的获取\"\n                    android:textSize=\"18sp\"\n                    android:textStyle=\"bold\"\n                    tools:ignore=\"HardcodedText\" />\n\n                <TextView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_margin=\"8dp\"\n                    android:text=\"您可以直接从 GitHub 平台获取 QQ 版本列表实用工具本体及其附带开源许可和知识产权相关文本的源代码。 获取应用后，您需要按照该应用提示的步骤正确使用。\\n\\n如果您从未经 GitHub 或相关官方平台获取本应用，QQ 版本列表实用工具无法保证该应用能够正常使用，并对因此给您造成的损失不予负责。\\n\\n如果您不再需要使用 QQ 版本列表实用工具，可以不再打开应用使用或卸载应用。\"\n                    tools:ignore=\"HardcodedText\" />\n\n                <TextView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_margin=\"8dp\"\n                    android:text=\"四、软件的更新\"\n                    android:textSize=\"18sp\"\n                    android:textStyle=\"bold\"\n                    tools:ignore=\"HardcodedText\" />\n\n                <TextView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_margin=\"8dp\"\n                    android:text=\"为了改善用户体验，完善服务内容，QQ 版本列表实用工具将不断努力开发新的服务，并为您不时提供软件更新（这些更新可能会采取软件替换，修改，功能强化，版本升级等形式）。\\n\\n为了保证 QQ 版本列表实用工具及服务的安全性和功能的一致性，QQ 版本列表实用工具有权不向您特别通知而对软件进行更新，或者对软件的部分功能效果进行改变或限制。\\n\\nQQ 版本列表实用工具新版本发布后，旧版本的软件可能无法使用，QQ 版本列表实用工具不保证旧版 QQ 版本列表实用工具及相应的服务继续可用，请您随时核对并获取最新版本。\"\n                    tools:ignore=\"HardcodedText\" />\n\n                <TextView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_margin=\"8dp\"\n                    android:text=\"五、用户个人信息保护\"\n                    android:textSize=\"18sp\"\n                    android:textStyle=\"bold\"\n                    tools:ignore=\"HardcodedText\" />\n\n                <TextView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_margin=\"8dp\"\n                    android:text=\"保护用户个人信息是 QQ 版本列表实用工具的一项基本原则，QQ 版本列表实用工具本身不会主动获取和存储您的个人信息。\\n\\n但在您使用过程中，可能会因网络通信的必要性而被软件本体或腾讯服务器自动获取您的 IP 地址等网络相关信息，我们将严格遵守法律法规的规定，并采取适当措施保护您的网络信息安全。\\n\\n若您启用 QQ 版本列表实用工具中的 Firebase 服务时，Firebase SDK 将立即在本地生成注册令牌，并上传您的移动设备标识符、基于网络地址的地理位置信息、Firebase 安装 ID。此操作一经启用即无法撤销。\\n\\nQQ 版本列表实用工具可能以软件实验形式提供一些尚不稳定的服务，用户在使用此类实验性服务时可能需要用户手动填写个人信息。QQ 版本列表实用工具承诺不会获取和存储您填写的任何个人信息。\\n\\nQQ 版本列表实用工具非常重视对未成年人个人信息的保护。若您是 18 周岁（不含）以下的未成年人，在使用 QQ 版本列表实用工具的服务前，应事先取得您的法定监护人的书面同意。\"\n                    tools:ignore=\"HardcodedText\" />\n\n                <TextView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_margin=\"8dp\"\n                    android:text=\"六、主权力义务条款\"\n                    android:textSize=\"18sp\"\n                    android:textStyle=\"bold\"\n                    tools:ignore=\"HardcodedText\" />\n\n                <TextView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_margin=\"8dp\"\n                    android:text=\"您理解并同意，为了向您提供有效的服务，您在此许可 QQ 版本列表实用工具利用您移动通讯终端设备的处理器和宽带等资源。QQ 版本列表实用工具使用过程中可能产生的数据流量的费用，您需自行向运营商了解相关资费信息。\\n\\nQQ 版本列表实用工具可能以软件实验形式提供一些尚不稳定的服务，此类服务会明确标注“实验性”（或其的其它语言形式）。您使用此类服务即代表您已明确并确保自身具备足够的风险识别和承受能力。\"\n                    tools:ignore=\"HardcodedText\" />\n\n                <TextView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_margin=\"8dp\"\n                    android:text=\"七、用户行为规范\"\n                    android:textSize=\"18sp\"\n                    android:textStyle=\"bold\"\n                    tools:ignore=\"HardcodedText\" />\n\n                <TextView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_margin=\"8dp\"\n                    android:text=\"您充分了解并同意使用本应用服务时须遵守法律法规，不得利用 QQ 版本列表实用工具从事违法违规行为，包括但不限于：\\n\\n1. 发布、传送、传播、储存危害国家安全统一、破坏社会稳定、违反公序良俗、侮辱、诽谤、淫秽、暴力以及任何违反国家法律法规的内容；\\n2. 发布、传送、传播、储存侵害他人知识产权、商业秘密等合法权利的内容；\\n3. 恶意虚构事实、隐瞒真相以误导、欺骗他人；\\n4. 发布、传送、传播广告信息及垃圾信息；\\n5. 将 QQ 版本列表实用工具用于任何未经许可的商业目的，包括但不限于以营利为目的推广、销售产品或服务；\\n6. 其他法律法规禁止的行为。\\n\\n如果用户违反了本条约定，相关国家机关、机构、公司或个人等实体可能会对用户提起诉讼、罚款或采取其它制裁措施，并要求 QQ 版本列表实用工具给予协助。造成损害的，用户应依法予以赔偿，QQ 版本列表实用工具不承担任何责任。\\n\\n如果 QQ 版本列表实用工具发现或收到他人举报您发布的信息违反本条约定，QQ 版本列表实用工具有权进行独立判断并采取技术手段予以删除、屏蔽或断开链接。同时，QQ 版本列表实用工具有权视用户行为性质采取包括但不限于暂停或终止服务，限制、冻结或终止 QQ 版本列表实用工具使用，追究法律责任等措施。\\n\\n用户违反本条约定，导致任何第三方损害的，用户应当独立承担责任；QQ 版本列表实用工具因此遭受损失的，用户也应当一并赔偿。\"\n                    tools:ignore=\"HardcodedText\" />\n\n                <TextView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_margin=\"8dp\"\n                    android:text=\"八、软件使用规范\"\n                    android:textSize=\"18sp\"\n                    android:textStyle=\"bold\"\n                    tools:ignore=\"HardcodedText\" />\n\n                <TextView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_margin=\"8dp\"\n                    android:text=\"除非法律允许或 QQ 版本列表实用工具的书面许可，您使用 QQ 版本列表实用工具过程中不得删除 QQ 版本列表实用工具及其副本上关于知识产权和开放源代码许可的信息。\"\n                    tools:ignore=\"HardcodedText\" />\n\n                <TextView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_margin=\"8dp\"\n                    android:text=\"九、免责条款\"\n                    android:textSize=\"18sp\"\n                    android:textStyle=\"bold\"\n                    tools:ignore=\"HardcodedText\" />\n\n                <TextView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_margin=\"8dp\"\n                    android:text=\"您充分了解并同意：\\n\\nQQ 版本列表实用工具仅为用户提供 Android QQ 和 Android TIM 版本信息展示和上述产品及其它可能存在的腾讯软件产品的官方版本获取服务，所有下载链接均来源于腾讯官方服务器。对于链接的有效性、可用性以及任何由腾讯官方服务器产生或导致的任何问题，QQ 版本列表实用工具不承担责任。\\n\\n鉴于 QQ、TIM 和其它任意腾讯软件产品的测试版本可能存在不可预知的稳定性问题，您在下载及使用任何腾讯软件产品的任何测试版本即代表您已明确并确保自身具备足够的风险识别和承受能力。您明确并同意其使用任何腾讯软件产品的任何测试版本所存在的风险将完全由其本人和/或其法定责任主体承担，QQ 版本列表实用工具对此不承担任何责任。\\n\\nQQ 版本列表实用工具可能以软件实验形式提供一些尚不稳定的服务，此类服务会明确标注“实验性”（或其的其它语言形式）。您使用此类服务即代表您已明确并确保自身具备足够的风险识别和承受能力。因使用此类实验性服务而可能产生的任何直接或间接损失、损害以及其它不利后果，QQ 版本列表实用工具不承担责任。\\n\\n除 QQ 版本列表实用工具注明之用户协议外，其它因不当使用本应用而导致的任何意外、疏忽、合约毁坏、诽谤、版权或其它知识产权侵犯及其所造成的任何损失，QQ 版本列表实用工具概不负责，亦不承担任何法律责任。\\n\\n对于因不可抗力或因黑客攻击、通讯线路中断等 QQ 版本列表实用工具不能控制的原因造成的网络服务中断或其它缺陷，导致用户不能正常使用本应用，QQ 版本列表实用工具不承担任何责任，但将尽力减少因此给用户造成的损失或影响。\\n\\n本协议未涉及的问题请参见中华人民共和国相关法律法规，当本协议与中华人民共和国相关适用法律法规冲突时，以中华人民共和国相关适用法律法规为准。本条所述之免责条款并不影响用户根据适用法律享有的法定权利。\"\n                    tools:ignore=\"HardcodedText\" />\n\n                <TextView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_margin=\"8dp\"\n                    android:text=\"十、其他\"\n                    android:textSize=\"18sp\"\n                    android:textStyle=\"bold\"\n                    tools:ignore=\"HardcodedText\" />\n\n                <TextView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_margin=\"8dp\"\n                    android:text=\"您使用 QQ 版本列表实用工具即视为您已阅读并同意接受 QQ 版本列表实用工具协议的约束。QQ 版本列表实用工具有权在必要时修改本协议条款。如果您不接受修改后的条款，应当停止使用 QQ 版本列表实用工具。\\n\\nQQ 版本列表实用工具有权随时修改本协议，并将在应用内显著位置弹窗通知用户。修订后的协议自公布之日起在一定期限后生效，请用户定期查看相关公告，继续使用本应用即视为同意接受修订后的协议。\\n\\nQQ 版本列表实用工具基于 GNU Affero General Public License Version 3 许可开放源代码。\\n\\n本应用与深圳市腾讯计算机系统有限公司和/或其关联公司无关。\\n\\n“腾讯”“QQ”“腾讯 QQ”“腾讯 TIM”“微信”“WeChat”“Weixin”“腾讯微信”“企业微信”“WeCom”“微信输入法”“WeType”“应用宝”“腾讯应用宝”等是深圳市腾讯计算机系统有限公司和/或其关联公司的商标。本项目对“腾讯”“QQ”“腾讯 QQ”“腾讯 TIM”“微信”“WeChat”“Weixin”“腾讯微信”“企业微信”“WeCom”“微信输入法”“WeType”“应用宝”“腾讯应用宝”等的使用旨在注明和指向对应主体，并非表示对“腾讯”“QQ”“腾讯 QQ”“腾讯 TIM”“微信”“WeChat”“Weixin”“腾讯微信”“企业微信”“WeCom”“微信输入法”“WeType”“应用宝”“腾讯应用宝”等商标的注册和拥有。\\n\\nAndroid™ 是 Google LLC 的商标。\\n\\nGITHUB® 是 GitHub, Inc. 在美国和其他国家或地区的商标或注册商标。\\n\\nUnreal® 及其徽标是 Epic Games, Inc. 在美国及其它国家或地区的商标或注册商标。\\n\\n本协议的签订地是中华人民共和国福建省福州市。\\n\\n本协议适用中华人民共和国相关法律法规。如果双方发生纠纷，应友好协商解决；如协商不成，您同意将纠纷提交给签订地具有管辖权的法院提起诉讼。\\n\\n本协议中的某些条款因故无法适用，则本协议的其它条款继续适用且无法适用的条款将会被修改，以便其能够依法适用。\\n\\n本协议是您和 QQ 版本列表实用工具之间关于本产品相关事项的最终的、完整的、排他的协议，且取代和合并之前当事人关于此类事项（包括任何形式的最终用户许可、开放源代码许可、服务条款和隐私政策）的讨论和协议。\\n\\n每部分的标题只为阅读之便而无任何法律或合同义务。\\n\\n本协议可能存在多种语言版本。各语言版本之间如有不一致之处，以中文版本为准。\\n\\n除非我们书面同意，您不得转让本协议所规定的权利义务。任何违反上述规定企图转让的行为均无效。在法律许可的范围内，QQ 版本列表实用工具对本协议享有最终解释权。\\n\\nQQ 版本列表实用工具\\n\\n2024 年 10 月 28 日\"\n                    tools:ignore=\"HardcodedText\" />\n\n            </LinearLayout>\n        </me.zhanghai.android.fastscroll.FastScrollScrollView>\n    </LinearLayout>\n\n    <LinearLayout\n        android:id=\"@+id/UA_button_group\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"20dp\"\n        android:layout_marginEnd=\"20dp\"\n        android:layout_marginBottom=\"20dp\"\n        android:orientation=\"vertical\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\">\n\n        <com.google.android.material.button.MaterialButton\n            android:id=\"@+id/ua_button_agree\"\n            style=\"@style/Widget.Material3.Button.TonalButton\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"8dp\"\n            android:text=\"@string/agree\" />\n\n        <com.google.android.material.button.MaterialButton\n            android:id=\"@+id/ua_button_disagree\"\n            style=\"@style/Widget.Material3.Button.TonalButton\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/disagreeAndExit\"\n            android:textColor=\"?attr/colorOnErrorContainer\"\n            app:backgroundTint=\"?attr/colorErrorContainer\"\n            app:iconTint=\"?attr/colorOnErrorContainer\" />\n\n    </LinearLayout>\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout-v26/dialog_changes_llm_inference.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\"\n    android:paddingStart=\"20dp\"\n    android:paddingTop=\"12dp\"\n    android:paddingEnd=\"20dp\">\n\n    <ScrollView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:scrollbars=\"none\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:paddingBottom=\"20dp\"\n            android:orientation=\"vertical\">\n\n            <TextView\n                android:id=\"@+id/version_change_info\"\n                style=\"?attr/textAppearanceLabelSmall\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginBottom=\"12dp\"\n                android:paddingStart=\"8dp\"\n                android:paddingEnd=\"8dp\"\n                android:text=\"版本信息占位符\"\n                android:textColor=\"?attr/colorOnSurface\" />\n\n            <com.google.android.material.progressindicator.LinearProgressIndicator\n                android:id=\"@+id/progress_indicator\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginBottom=\"12dp\"\n                android:elevation=\"10dp\"\n                android:indeterminate=\"true\" />\n\n            <com.google.android.material.card.MaterialCardView\n                android:id=\"@+id/llm_gen_card\"\n                style=\"?attr/materialCardViewOutlinedStyle\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginBottom=\"12dp\"\n                android:backgroundTint=\"?attr/colorSecondaryContainer\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:strokeColor=\"?attr/colorSecondaryContainer\"\n                app:strokeWidth=\"0dp\">\n\n                <LinearLayout\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:orientation=\"vertical\"\n                    android:padding=\"10dp\">\n\n                    <TextView\n                        android:id=\"@+id/llm_gen_text\"\n                        style=\"?attr/textAppearanceBodySmall\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:gravity=\"center_vertical\"\n                        android:justificationMode=\"inter_character\"\n                        android:paddingStart=\"1dp\"\n                        android:paddingEnd=\"1dp\"\n                        android:text=\"AI LLM 生成内容占位符\"\n                        android:textColor=\"?attr/colorOnSecondaryContainer\" />\n\n                </LinearLayout>\n            </com.google.android.material.card.MaterialCardView>\n\n            <LinearLayout\n                android:id=\"@+id/ai_gen_tips\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"8dp\"\n                android:layout_marginBottom=\"4dp\"\n                android:orientation=\"horizontal\"\n                tools:ignore=\"UseCompoundDrawables\">\n\n                <ImageView\n                    android:layout_width=\"16dp\"\n                    android:layout_height=\"16dp\"\n                    android:src=\"@drawable/information_line\" />\n\n                <TextView\n                    android:id=\"@+id/ai_gen_tips_text\"\n                    style=\"?attr/textAppearanceLabelSmall\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginBottom=\"8dp\"\n                    android:drawablePadding=\"8dp\"\n                    android:gravity=\"center_vertical\"\n                    android:paddingStart=\"6dp\"\n                    android:paddingEnd=\"0dp\"\n                    android:text=\"@string/genByAITips\"\n                    android:textColor=\"?attr/colorOnSurface\" />\n            </LinearLayout>\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/btn_copy\"\n                style=\"@style/Widget.Material3.Button.TonalButton\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_weight=\"1\"\n                android:text=\"@string/copy\" />\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/btn_ok\"\n                style=\"@style/Widget.Material3.Button.TonalButton\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_weight=\"1\"\n                android:text=\"@string/done\" />\n        </LinearLayout>\n    </ScrollView>\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout-v26/update_qvt_button.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\"\n    android:paddingStart=\"20dp\"\n    android:paddingEnd=\"20dp\"\n    android:paddingBottom=\"20dp\">\n\n    <com.google.android.material.progressindicator.LinearProgressIndicator\n        android:id=\"@+id/progress_indicator\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"12dp\"\n        android:elevation=\"10dp\"\n        android:indeterminate=\"true\" />\n\n    <com.google.android.material.card.MaterialCardView\n        android:id=\"@+id/llm_gen_card\"\n        style=\"?attr/materialCardViewOutlinedStyle\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"12dp\"\n        android:backgroundTint=\"?attr/colorSecondaryContainer\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:strokeColor=\"?attr/colorSecondaryContainer\"\n        app:strokeWidth=\"0dp\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            android:padding=\"10dp\">\n\n            <TextView\n                style=\"?attr/textAppearanceTitleSmall\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:drawablePadding=\"4dp\"\n                android:gravity=\"center_vertical\"\n                android:paddingStart=\"1dp\"\n                android:paddingEnd=\"1dp\"\n                android:paddingBottom=\"3dp\"\n                android:text=\"@string/llmIntelligent\"\n                android:textColor=\"?attr/colorOnSecondaryContainer\"\n                app:drawableStartCompat=\"@drawable/ai_generate_2\"\n                app:drawableTint=\"?attr/colorOnSecondaryContainer\" />\n\n            <TextView\n                android:id=\"@+id/llm_gen_text\"\n                style=\"?attr/textAppearanceBodySmall\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:gravity=\"center_vertical\"\n                android:justificationMode=\"inter_character\"\n                android:paddingStart=\"1dp\"\n                android:paddingEnd=\"1dp\"\n                android:text=\"AI LLM 生成内容占位符\"\n                android:textColor=\"?attr/colorOnSecondaryContainer\" />\n\n        </LinearLayout>\n    </com.google.android.material.card.MaterialCardView>\n\n    <com.google.android.material.button.MaterialButtonGroup\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\">\n\n        <com.google.android.material.button.MaterialButton\n            android:id=\"@+id/update_qvt_copy\"\n            style=\"@style/Widget.Material3.Button.TonalButton.Icon\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginEnd=\"8dp\"\n            android:layout_weight=\"1\"\n            android:text=\"@string/copy\"\n            app:icon=\"@drawable/file_copy_line\" />\n\n        <com.google.android.material.button.MaterialButton\n            android:id=\"@+id/update_qvt_download\"\n            style=\"@style/Widget.Material3.Button.Icon\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"8dp\"\n            android:layout_weight=\"1\"\n            android:text=\"@string/download\"\n            app:icon=\"@drawable/download_line\" />\n    </com.google.android.material.button.MaterialButtonGroup>\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@mipmap/ic_launcher_background\" />\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\" />\n    <monochrome android:drawable=\"@drawable/ic_launcher_foreground\" />\n</adaptive-icon>"
  },
  {
    "path": "app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@mipmap/ic_launcher_background\" />\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\" />\n    <monochrome android:drawable=\"@drawable/ic_launcher_foreground\" />\n</adaptive-icon>"
  },
  {
    "path": "app/src/main/res/mipmap-anydpi-v26/scan_shortcut_icon.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@color/scan_shortcut_icon_background\" />\n    <foreground android:drawable=\"@drawable/scan_shortcut_icon_foreground\" />\n    <monochrome android:drawable=\"@drawable/scan_shortcut_icon_foreground\" />\n</adaptive-icon>"
  },
  {
    "path": "app/src/main/res/mipmap-anydpi-v26/scan_shortcut_icon_round.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@color/scan_shortcut_icon_background\"/>\n    <foreground android:drawable=\"@drawable/scan_shortcut_icon_foreground\"/>\n    <monochrome android:drawable=\"@drawable/scan_shortcut_icon_foreground\"/>\n</adaptive-icon>"
  },
  {
    "path": "app/src/main/res/values/arrays.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\r\n    Qverbow Util\r\n    Copyright (C) 2023 klxiaoniu\r\n\r\n    This program is free software: you can redistribute it and/or modify\r\n    it under the terms of the GNU Affero General Public License as\r\n    published by the Free Software Foundation, either version 3 of the\r\n    License, or (at your option) any later version.\r\n\r\n    This program is distributed in the hope that it will be useful,\r\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n    GNU Affero General Public License for more details.\r\n\r\n    You should have received a copy of the GNU Affero General Public License\r\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\r\n-->\r\n<resources>\r\n    <string-array name=\"version_default\">\r\n        <item>@string/stableVersion</item>\r\n        <item>@string/previewVersion</item>\r\n        <item>@string/timVersion</item>\r\n        <item>@string/weixinEnumerateVersion</item>\r\n    </string-array>\r\n\r\n    <string-array name=\"version_plus\">\r\n        <item>@string/stableVersion</item>\r\n        <item>@string/previewVersion</item>\r\n        <item>@string/spaceEnumerateVersion</item>\r\n        <item>@string/timVersion</item>\r\n        <item>@string/weixinEnumerateVersion</item>\r\n    </string-array>\r\n\r\n    <string-array name=\"shiply_target\">\r\n        <item>@string/shiplyTargetAppQQ</item>\r\n        <item>@string/shiplyTargetAppTIM</item>\r\n    </string-array>\r\n</resources>"
  },
  {
    "path": "app/src/main/res/values/attrs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<resources>\n    <declare-styleable name=\"Cell\">\n        <attr name=\"cellIcon\" format=\"reference\" />\n        <attr name=\"cellTitle\" format=\"string\" />\n        <attr name=\"cellDescription\" format=\"string\" />\n    </declare-styleable>\n</resources>"
  },
  {
    "path": "app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\r\n    Qverbow Util\r\n    Copyright (C) 2023 klxiaoniu\r\n\r\n    This program is free software: you can redistribute it and/or modify\r\n    it under the terms of the GNU Affero General Public License as\r\n    published by the Free Software Foundation, either version 3 of the\r\n    License, or (at your option) any later version.\r\n\r\n    This program is distributed in the hope that it will be useful,\r\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n    GNU Affero General Public License for more details.\r\n\r\n    You should have received a copy of the GNU Affero General Public License\r\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\r\n-->\r\n<resources>\r\n    <color name=\"black\">#FF000000</color>\r\n    <color name=\"white\">#FFFFFFFF</color>\r\n    <color name=\"theme_color\">#A0F2DF</color>\r\n    <color name=\"theme_color_dark\">#00201B</color>\r\n</resources>"
  },
  {
    "path": "app/src/main/res/values/ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<resources>\n    <color name=\"ic_launcher_background\">#A0F2DF</color>\n</resources>"
  },
  {
    "path": "app/src/main/res/values/scan_shortcut_icon_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<resources>\n    <color name=\"scan_shortcut_icon_background\">#A0F2DF</color>\n</resources>"
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "content": "<!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<resources>\n    <string name=\"app_name\">QQ 版本列表实用工具</string>\n    <string name=\"appTitle\">QQ 版本列表实用工具</string>\n    <string name=\"shortcutLongLabel\">扫版（维护模式）</string>\n    <string name=\"shortcutShortLabel\">扫版（维护）</string>\n    <string name=\"start\">开始</string>\n    <string name=\"cancel\">取消</string>\n    <string name=\"done\">确定</string>\n    <string name=\"save\">保存</string>\n    <string name=\"installed\">已安装</string>\n    <string name=\"copy\">复制</string>\n    <string name=\"refresh\">刷新</string>\n    <string name=\"agree\">同意</string>\n    <string name=\"disagreeAndExit\">不同意并退出</string>\n    <string name=\"withdrawConsentUA\">撤回同意用户协议</string>\n    <string name=\"withdrawConsentAndExit\">撤回同意并退出</string>\n    <string name=\"userAgreement\">用户协议</string>\n    <string name=\"enumerateVersionsFAB\">扫版（维护模式）</string>\n    <string name=\"enumerateVersionsDialogTitle\">扫版（维护模式）</string>\n    <string name=\"setting\">设置</string>\n    <string name=\"personalization\">个性化</string>\n    <string name=\"about\">关于</string>\n    <string name=\"enumerateVersionsFormatSetting\">扫版直链格式设置</string>\n    <string name=\"getUpdateFromTDSShiplyDistributionPlatform\">TDS 腾讯端服务 Shiply 容器与发布平台更新获取（实验性）</string>\n    <string name=\"getUpdateFromShiplyPlatform\">Shiply 平台更新获取（实验性）</string>\n    <string name=\"acceptedEnumerateVersion\">扫版成功</string>\n    <string name=\"contentReturnedByShiplyPlatform\">Shiply 平台返回内容</string>\n    <string name=\"applicationError\">程序出错</string>\n    <string name=\"additionalActions\">进一步操作</string>\n    <string name=\"shareTo\">分享到</string>\n    <string name=\"jsonDetails\">JSON 详情</string>\n    <string name=\"stableVersion\">正式版</string>\n    <string name=\"previewVersion\">测试版</string>\n    <string name=\"spaceEnumerateVersion\">空格扫版</string>\n    <string name=\"weixinEnumerateVersion\">微信扫版</string>\n    <string name=\"aboutAppName\">QQ 版本列表实用工具 for Android™</string>\n    <string name=\"aboutAuthor\">作者：</string>\n    <string name=\"aboutContributor\">贡献者：</string>\n    <string name=\"version\">版本：</string>\n    <string name=\"aboutSpecialThanksTo\">特别感谢：</string>\n    <string name=\"aboutOpenSourceRepo\">开源仓库：</string>\n    <string name=\"aboutGetUpdate\">获取更新：</string>\n    <string name=\"aboutDescription\">提供 Android QQ 版本列表的查看和对 Android QQ 下载链接的枚举法扫描。</string>\n    <string name=\"copied\">已复制：</string>\n    <string name=\"reatedFileSize\">额定大小：</string>\n    <string name=\"sourceJSON\">源 JSON</string>\n    <string name=\"recommendations\">建议的内容</string>\n    <string name=\"longPressTheVersionCardToViewSourceDetails\">长按版本卡片查看源详情</string>\n    <string name=\"useTheSystemDownloadManagerToTakeOverTheDownloadIntent\">使用系统下载管理器</string>\n    <string name=\"removeMultiplesOf5ForQQPreviewVersions\">解除 QQ 测试版扫版小版本号遵循 5 的倍数限制</string>\n    <string name=\"longPressToViewSourceDetailsIsDisabled\">未开启长按查看源详情功能，请前往设置开启</string>\n    <string name=\"currentSizeVsLargestHistoricalPackage\">占比历史最大包（%s）：</string>\n    <string name=\"extendTheSuffixForDirectDownloadLinksOfEnumeratedPreviewVersions\">扩展测试版扫版直链后缀</string>\n    <string name=\"fileSize\">大小：</string>\n    <string name=\"downloadLink\">下载地址：</string>\n    <string name=\"saved\">已保存</string>\n    <string name=\"enumQQPreviewWarning\">鉴于 QQ 测试版可能存在不可预知的稳定性问题，您在下载及使用该测试版本之前，必须明确并确保自身具备足够的风险识别和承受能力。根据相关条款，您使用本软件时应当已了解并同意，因下载或使用 QQ 测试版而可能产生的任何直接或间接损失、损害以及其他不利后果，均由您自行承担全部责任。</string>\n    <string name=\"enumQQMajorVersionHelpText\">填写格式为 x.y.z</string>\n    <string name=\"enumWeixinMajorVersionHelpText\">无需填写小数点</string>\n    <string name=\"enumWeixinWarning\">微信扫版功能为 QQ 版本列表实用工具附带的实验性功能，可能存在不可预知的稳定性问题。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"enumHasBeenStopped\">已停止扫描</string>\n    <string name=\"missingCipherWarning\">TDS 腾讯端服务 Shiply 容器与发布平台返回 JSON 内容中未包含“cipher_text”键值对。</string>\n    <string name=\"missingMajorVersionWarning\">扫版需要填写主版本号，否则无法执行扫版。</string>\n    <string name=\"missingQQPreviewMinorVersionWarning\">测试版扫版（含空格扫版）需要填写小版本号，否则无法扫描测试版。</string>\n    <string name=\"QQPreviewMinorNot5Warning\">小版本号需填写 5 的倍数。如需解除此限制，请前往设置进行解除。</string>\n    <string name=\"missingWeixinTrueVersionWarning\">微信扫版需要填写真实版本号，否则无法扫描微信版本。</string>\n    <string name=\"missingWeixin16CodeWarning\">微信扫版需要填写十六进制代码，否则无法扫描微信版本。</string>\n    <string name=\"enumeratingDownloadLink\">正在扫描下载地址：</string>\n    <string name=\"majorVersion\">主版本号</string>\n    <string name=\"initialMinorVersion\">起始小版本号</string>\n    <string name=\"hexadecimalCode\">十六进制代码</string>\n    <string name=\"initialMinorVersionHelpText\">填写起始扫描小版本号，扫正式版时无需填写</string>\n    <string name=\"hexadecimalCodeHelpText\">填写十六进制代码，仅微信扫版使用</string>\n    <string name=\"enumType\">扫版类型</string>\n    <string name=\"enumTypeHelpText\">指定扫版目标类型</string>\n    <string name=\"trueVersion\">真实版本号</string>\n    <string name=\"trueVersionHelpText\">填写真实版本号（版本码），仅微信扫版使用</string>\n    <string name=\"appidOptional\">appid（非必填）</string>\n    <string name=\"shiplyGeneralOptionalHelpText\">默认值：</string>\n    <string name=\"shiplyVersion\">版本</string>\n    <string name=\"shiplyVersionHelpText\">填写用于请求 Shiply 平台的 Android QQ/TIM 版本号</string>\n    <string name=\"uinHelpText\">填写用于请求 Shiply 平台的对象 QQ 号</string>\n    <string name=\"shiplyWarning\">腾讯 QQ/TIM 使用 TDS 腾讯端服务 Shiply 容器与发布平台，根据 QQ 号（uin）及其终端信息分发小范围灰度测试安装包。此功能并非每次请求都能成功获取到更新数据，无法获取更新数据则表示填写的参数不在 Shiply 平台认可与分发范围内。QQ 版本列表实用工具不对此功能及其任何后果作出任何可靠性保证。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"defaultDisplayOfFirstListItemDetails\">首项卡片默认显示详情</string>\n    <string name=\"versionNumberFontUseTCloudNumber\">使用腾讯云数字字体</string>\n    <string name=\"versionCardsDisplaysPackageSizeIndicator\">显示额定包大小占比历史最大包指示条</string>\n    <string name=\"customVersionEnumSuffix\">自定义扫版后缀</string>\n    <string name=\"customVersionEnumSuffixHelpText\">请使用“, ”（西文逗号+空格）分割</string>\n    <string name=\"facilitateI18n\">协助翻译：</string>\n    <string name=\"versionCardExpandButtonContentDescription\">展开详情</string>\n    <string name=\"versionCardCollapseButtonContentDescription\">收起详情</string>\n    <string name=\"shiplyAdvancedConfigurations\">进阶配置</string>\n    <string name=\"shiplyOsVersionOptional\">osVersion（非必填）</string>\n    <string name=\"shiplySdkVersionOptional\">sdkVersion（非必填）</string>\n    <string name=\"shiplyModelOptional\">model（非必填）</string>\n    <string name=\"shiplyLanguageOptional\">language（非必填）</string>\n    <string name=\"thicknessFollowSystem\">跟随系统</string>\n    <string name=\"back\">返回</string>\n    <string name=\"shiplyUseAdvancedConfigurations\">使用进阶配置</string>\n    <string name=\"localQQVersion\">本机 QQ：</string>\n    <string name=\"bracket\">（%s）</string>\n    <string name=\"localTIMVersion\">本机 TIM：</string>\n    <string name=\"localQQVersionDetails\">本机 QQ 版本详情</string>\n    <string name=\"localTIMVersionDetails\">本机 TIM 版本详情</string>\n    <string name=\"accessibilityTag\">6IW+6K6vIFFRIOW3suS4iue6v+S4gOmhueaXoOmanOeijeeUqOaIt+S4k+WxnuS8mOWMluaOquaWveabtOaWsOOAguenu+WKqOe7iOerr+iuvuWkh+W8gOWQr+ezu+e7n+aXoOmanOeijeivu+Wxj+acjeWKoe+8iOWmgiBBbmRyb2lkIFRhbGtiYWNr44CBaU9TIFZvaWNlT3Zlcu+8ie+8jOW5tuWQjOaXtuS9v+eUqOiFvuiuryBRUSDnp7vliqjlrqLmiLfnq68gOS4wLjg1IOWPiuS7peS4iueJiOacrOaXtu+8jOiFvuiuryBRUSDlsIblh4/lsJHmiJblgZzmraLlkJHmraTnsbsgUVEg5a6i5oi356uv5LiL5Y+R5bm/5ZGK44CC</string>\n    <string name=\"imageGallery\">应用宣传图</string>\n    <string name=\"share\">分享</string>\n    <string name=\"download\">下载</string>\n    <string name=\"stop\">停止</string>\n    <string name=\"skip\">跳过</string>\n    <string name=\"qqntTag\">基于 QQNT 技术架构</string>\n    <string name=\"releaseDateTIM\">发布日期：</string>\n    <string name=\"checkUpdateViaGitHubAPI\">使用 GitHub REST API 检查更新</string>\n    <string name=\"noUpdatesDetected\">未检测到更新</string>\n    <string name=\"noAssetsDetected\">未检测到资产文件</string>\n    <string name=\"cannotGetGitHub\">无法连接到 GitHub，请确保您所在网络环境可以访问 GitHub。</string>\n    <string name=\"updateQverbowAvailable\">更新可用</string>\n    <string name=\"copyLink\">复制链接</string>\n    <string name=\"unrealEngineTag\">内置虚幻引擎</string>\n    <string name=\"autoCheckForUpdates\">启动时检查更新</string>\n    <string name=\"useQQ8958Test\">使用 QQ 8.9.58 测试版直链格式</string>\n    <string name=\"ciVersionNoSupportUpdates\">CI 构建版本不支持检查更新</string>\n    <string name=\"showUnrealEngineTag\">显示虚幻引擎标识</string>\n    <string name=\"suffixSetting\">后缀设置</string>\n    <string name=\"others\">其它</string>\n    <string name=\"ok\">好</string>\n    <string name=\"swipeLeftToSeeMore\">向左滑动查看更多</string>\n    <string name=\"getUpdateFromTencentAppStore\">腾讯应用宝更新获取（实验性）</string>\n    <string name=\"experimentalFeatures\">实验性功能</string>\n    <string name=\"getQQLinkFromTencentAppStore\">获取 QQ 下载直链</string>\n    <string name=\"getTIMLinkFromTencentAppStore\">获取 TIM 下载直链</string>\n    <string name=\"getWeixinLinkFromTencentAppStore\">获取微信下载直链</string>\n    <string name=\"getWeComLinkFromTencentAppStore\">获取企业微信下载直链</string>\n    <string name=\"contentReturnedByTencentAppStore\">腾讯应用宝返回内容</string>\n    <string name=\"getWeTypeLinkFromTencentAppStore\">获取微信输入法下载直链</string>\n    <string name=\"tencentAppStoreWarning\">腾讯应用宝更新获取功能为 QQ 版本列表实用工具附带的实验性功能，可能存在不可预知的稳定性问题。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"showOldLoading\">扫版对话框使用旧版加载动画</string>\n    <string name=\"versionCardsDisplaysPackageSizeText\">显示额定包大小占比历史最大包百分比</string>\n    <string name=\"timVersion\">TIM 扫版</string>\n    <string name=\"enumTIMWarning\">TIM 扫版功能为 QQ 版本列表实用工具附带的实验性功能，可能存在不可预知的稳定性问题。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"useQQ9008_14600Test\">扫版类型添加 QQ 9.0.8.14600 空格直链格式</string>\n    <string name=\"initFirebaseService\">初始化 Firebase 服务</string>\n    <string name=\"enablingFirebaseServiceWarning\">初始化 Firebase 服务后，将立即在本地由 Firebase SDK 生成注册令牌，并将标识符和配置数据上传到 Firebase 服务器。此操作一经启用即无法撤销，是否继续？</string>\n    <string name=\"rainbow_notification_channel_id\">rainbow_notification_channel_id</string>\n    <string name=\"cannotFindGooglePlayServices\">未在当前设备检测到 Google Play 服务，因此无法在当前设备中使用由 Firebase 提供的服务。</string>\n    <string name=\"rainbow_notification_channel_title\">版本列表更新</string>\n    <string name=\"rainbow_notification_channel_description\">通过 Firebase 云消息传递</string>\n    <string name=\"enablingFirebaseServiceInsights\">启用 Firebase 服务可使用以下功能：\\n- 通过 Firebase 云消息传递的版本列表更新提醒</string>\n    <string name=\"enablingFirebaseServiceWarning2\">Firebase 云消息传递绑定了 Google Analytics 分析服务，使用 Firebase 云消息传递将不可避免地上传您在此软件的活跃信息。</string>\n    <string name=\"continueKey\">继续</string>\n    <string name=\"initializedFirebaseService\">Firebase 服务已初始化，无法撤销</string>\n    <string name=\"cannotEnableFirebaseCloudMessaging\">接收版本列表更新通知提醒必须打开系统通知权限，否则无法接收版本列表更新提醒。</string>\n    <string name=\"pushSystemNotificationsWhenVersionListUpdates\">版本列表更新时推送系统通知</string>\n    <string name=\"unsubscribeTimeout\">取消订阅超时</string>\n    <string name=\"unsubscribeSuccess\">取消订阅成功</string>\n    <string name=\"unsubscribeFailed\">取消订阅失败</string>\n    <string name=\"subscribeTimeout\">订阅超时</string>\n    <string name=\"subscribeSuccess\">订阅成功</string>\n    <string name=\"subscribeFailed\">订阅失败</string>\n    <string name=\"initializedFirebaseServiceItem\">Firebase 服务已初始化</string>\n    <string name=\"toSystemSetting\">前往系统设置</string>\n    <string name=\"threePartySharedList\">个人信息第三方共享清单</string>\n    <string name=\"shiplyTargetApp\">目标应用</string>\n    <string name=\"shiplyTargetAppQQ\">QQ</string>\n    <string name=\"shiplyTargetAppTIM\">TIM</string>\n    <string name=\"shiplyTargetHelper\">指定请求 Shiply 平台的目标应用</string>\n    <string name=\"openSourceLicenseTitle\">开放源代码许可</string>\n    <string name=\"basedOnQQVer\">基于 Android QQ %s 二次开发</string>\n    <string name=\"getQidianLinkFromTencentAppStore\">获取腾讯企点下载直链</string>\n    <string name=\"getWeixinAlphaLinkFromWeixinConfigDesc\">从腾讯服务器配置拉取微信最新测试版下载直链</string>\n    <string name=\"successInGetting\">获取成功</string>\n    <string name=\"getWeixinAlphaConfig404\">似乎未成功访问腾讯服务器配置文件，可能是微信当前没有测试版或测试版已撤包。</string>\n    <string name=\"getWeixinAlphaConfigLink404\">似乎未成功访问此下载地址，可能是微信当前测试版已撤包。</string>\n    <string name=\"suspectedPackageWithdrawal\">疑似撤包</string>\n    <string name=\"colon\">：</string>\n    <string name=\"qverbowHash\">杂凑值校验</string>\n    <string name=\"verifyHashValueViaGitHubAPI\">通过 GitHub REST API 校验杂凑值</string>\n    <string name=\"hashIsTrue\">杂凑值与 GitHub Releases 一致</string>\n    <string name=\"hashIsFalse\">您所使用的版本与 GitHub Releases 杂凑值不一致，为了您的安全，请尽快卸载当前版本应用并前往官方 GitHub Releases 下载此软件。</string>\n    <string name=\"toGitHubRelease\">前往下载</string>\n    <string name=\"getWeTypeTestLinkFromWeTypeLatestChannelDesc\">从微信输入法测试通道获取微信输入法最新下载直链</string>\n    <string name=\"getWeTypeLatestChannel404\">未成功访问微信输入法服务器，请检查您的网络连接。</string>\n    <string name=\"kuiklyTag\">存在 TDS 腾讯端服务 Kuikly 开发框架</string>\n    <string name=\"showKuiklyTag\">显示 Kuikly 开发框架标识</string>\n    <string name=\"getWeTypeTestLinkFromWeTypeLatestChannel\">获取微信输入法测试版</string>\n    <string name=\"getWeixinAlphaLinkFromWeixinConfig\">获取微信测试版</string>\n    <string name=\"autoCheckForUpdatesDesc\">每次启动时将通过 GitHub REST API 检查一次更新</string>\n    <string name=\"useTheSystemDownloadManagerToTakeOverTheDownloadIntentDesc\">开启后，软件全局触发下载意图时将不再打开浏览器</string>\n    <string name=\"showKuiklyTagDesc\">Kuikly 内置情况以 QQ 正式版为判断来源</string>\n    <string name=\"versionCardsDisplaysPackageSizeDesc\">仅对 QQ 版本卡片生效</string>\n    <string name=\"aboutVersionCards\">版本列表与卡片</string>\n    <string name=\"showUnrealEngineTagDesc\">虚幻引擎内置情况以 QQ 正式版为判断来源</string>\n    <string name=\"general\">通用</string>\n    <string name=\"copyAll\">复制全部</string>\n    <string name=\"enumVerMaintenanceModeWarning\">扫版功能已进入维护模式。您仍可以继续使用现有扫版功能，但 QQ 版本列表实用工具不再对相关功能及其任何后果作出任何可靠性保证，不再对相关功能进行积极开发，也不再接受相关新功能请求。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"localDetailsQQNT\">QQNT 技术架构</string>\n    <string name=\"localDetailsBugly\">Bugly 端质量监控平台</string>\n    <string name=\"localDetailsShiply\">Shiply 容器与发布平台</string>\n    <string name=\"localDetailsHippy\">Hippy 跨端开发框架</string>\n    <string name=\"localDetailsKuikly\">Kuikly 跨端开发框架</string>\n    <string name=\"localDetailsRightly\">Rightly 应用合规解决方案</string>\n    <string name=\"localDetailsUELibrary\">Unreal Engine as a Library</string>\n    <string name=\"localDetailsUELibraryDesc\">Unreal Engine as a Library 会将虚幻引擎的功能重新打包成一个库，以便其他应用程序生成和控制它们自己的 UE 实例。UELibrary 提供了一种简单、不依赖于平台的 API 来驱动 UE。</string>\n    <string name=\"localDetailsBuglyDesc\">Bugly 是 TDS 腾讯端服务（Tencent Device-oriented Service）旗下的端质量监控平台，通过采集、监控、定位、告警等核心能力，提供专业的质量监控服务，帮助开发者及时发现并解决质量问题，打造高质量应用。</string>\n    <string name=\"localDetailsShiplyDesc\">Shiply，全称 TDS 腾讯端服务 Shiply 容器与发布，属于 TDS 腾讯端服务系列产品的子产品之一，是源于腾讯内部 App 的一站式容器与发布解决方案。Shiply 提供了一套规则灵活、发布安全、高效分发的终端基础通用发布系统，功能包括：配置与开关、资源发布、应用升级，移动端热修复、Flutter 动态化、跨端开发框架等相关能力和分发支持，帮助产品和技术团队提高研效能力和决策力。</string>\n    <string name=\"localDetailsHippyDesc\">Hippy 是 TDF 腾讯端框架（Tencent Device-oriented Framework）下的开源跨平台应用开发解决方案。Hippy 从底层做了大量工作，抹平了 iOS、Android、OpenHarmony 三端差异，提供了接近 Web 的开发体验，目前上层支持了 React 和 Vue 两套界面框架，前端开发人员可以通过它，将前端代码转换为终端的原生指令，进行原生终端 APP 的开发。同时，Hippy 从底层进行了大量优化，在启动速度、渲染性能、动画速度、内存占用、包体积等方面都提供了业内顶尖的性能表现。</string>\n    <string name=\"localDetailsRightlyDesc\">Rightly 是面向移动端的全流程合规解决方案，集「合规管控」和「合规测评」为一体，为 APP 提供运行全周期数据安全与合规保护解决方案，也为 APP 提供个人信息风险审查与合规性检测服务，覆盖多项隐私安全指标。Rightly 能够助力业务提高合规效率，降低违规风险。</string>\n    <string name=\"localDetailsKuiklyDesc\">Kuikly（Kotlin UI Kit）跨端开发框架，是 TDF 腾讯端框架（Tencent Device-oriented Framework）的一部分。Kuikly 通过自研 Kotlin Multiplatform 逻辑与终端界面原生控件渲染映射协议层，并采用声明式与响应式设计，使采用 Kuikly 的 Kotlin 开发者能拥有原生高效的 Android 开发体验并构建具有原生性能的跨平台应用。Kuikly 更可依托于 TDS 腾讯端服务 Shiply 容器与发布平台，实现按页颗粒度的完备客户端界面动态化能力。</string>\n    <string name=\"localDetailsQQNTDesc\">QQNT 技术架构是腾讯 QQ 客户端全新的跨平台技术架构体系。QQNT 技术架构将 QQ 客户端核心功能——如核心登录、消息系统、关系链、富媒体、长连接、数据库等——下沉至 QQNT 内核层，使用 C++ 抽象逻辑封装为原生库并提供多平台多语言一致性接口，以实现 QQ 客户端核心逻辑代码跨平台与程序高性能运作。</string>\n    <string name=\"localDetailsMsg\">详细信息</string>\n    <string name=\"stackInfo\">技术栈信息</string>\n    <string name=\"details\">详情</string>\n    <string name=\"thisVerContains\">此版本包含 %s</string>\n    <string name=\"packageNameIsErr\">应用包名与预设不匹配</string>\n    <string name=\"useNewLocalDetailsPage\">使用新版本机应用详情页</string>\n    <string name=\"fileErr\">文件类型错误</string>\n    <string name=\"apkAnalyze\">应用包分析</string>\n    <string name=\"unknownErr\">未知错误</string>\n    <string name=\"notEnoughSpaceOnTheDevice\">设备剩余空间不足</string>\n    <string name=\"localDetailsTencentBeacon\">腾讯灯塔</string>\n    <string name=\"localDetailsTencentBeaconDesc\">腾讯灯塔全场景大数据分析套件，是腾讯 50+ 业务自 2018 年以来使用数据中台演化而成，支持每日数十亿条数据资产的全面管理，数千业务员工深度依赖的整体化工具套件。</string>\n    <string name=\"haveNotAgreeUA\">未同意用户协议，无法使用本软件</string>\n    <string name=\"localDetailsFlutter\">Flutter</string>\n    <string name=\"localDetailsFlutterDesc\">Flutter 是 Google 的便携式 UI 工具包，帮助你在移动、web、桌面端创造高质量的绝妙原生体验的应用。 Flutter 可以和世界上的开发人员和开发组织广泛使用的那些现存代码一起使用，并且是开源的、免费的。</string>\n    <string name=\"localDetailsJetpackCompose\">Jetpack Compose</string>\n    <string name=\"localDetailsJetpackComposeDesc\">Jetpack Compose 是用于构建原生 Android 界面的新工具包。它使用更少的代码、强大的工具和直观的 Kotlin API，可以帮助您简化并加快 Android 界面开发。 </string>\n    <string name=\"localDetailsComposeMultiplatform\">Compose Multiplatform</string>\n    <string name=\"localDetailsComposeMultiplatformDesc\">Compose Multiplatform 是一个由 JetBrains 开发的现代化声明式和响应式 UI 框架，它提供了一种只需少量 Kotlin 代码即可构建用户界面的简单方法。它还允许您只需编写一次用户界面，即可在任何支持的平台——iOS、Android、桌面（Windows、macOS、Linux）和 Web——上运行。</string>\n    <string name=\"security\">安全</string>\n    <string name=\"privateTokenSettings\">私有 Token 管理</string>\n    <string name=\"privateTokenSettingsDesc\">此处内填入的 Token 将由 Android 密钥库系统安全加密后存储</string>\n    <string name=\"zhipuAIMaaSPlatformToken\">智谱 AI 开放平台 Token</string>\n    <string name=\"updateLogPrompt\">请根据用户传入的更新日志文本，以清晰简洁的 %s 语言对更新日志文本进行专业总结，要求：1) 提取核心功能优化和关键问题修复，忽略技术细节 2) 采用 Pangu 格式化文本，确保中英文/数字间自动空格 3) 完全避免产品名称及主观评价 4) 用连贯段落呈现，严格控制在 150 字内。输出需突出用户感知明显的改进点，使用规范化表述，禁止列表格式且不使用 Markdown。</string>\n    <string name=\"githubPersonalAccessToken\">GitHub 个人访问令牌</string>\n    <string name=\"TEESupported\">密钥由设备可信执行环境（TEE）安全硬件提供保护</string>\n    <string name=\"StrongBoxSupported\">密钥由设备 StrongBox 安全元件提供保护</string>\n    <string name=\"UnknownSecurityHardwareSupported\">密钥由设备安全硬件提供保护</string>\n    <string name=\"SecuritySoftwareSupported\">密钥由 Android 密钥库提供保护</string>\n    <string name=\"testGitHubToken\">保存并联网测试 GitHub 个人访问令牌可用性</string>\n    <string name=\"testZhipuToken\">保存并联网测试智谱 AI 开放平台 Token 可用性</string>\n    <string name=\"testZhipuTokenPrompt\">用户正在测试与您的连通性。如果您收到了这句话，请使用 %s 语言热情地与用户打招呼并用一段话详细介绍自己的模型名称。</string>\n    <string name=\"backFromZhipuPlatform\">智谱 AI 开放平台返回内容</string>\n    <string name=\"zhipuTokenSuccess\">智谱 Token 可用</string>\n    <string name=\"zhipuTokenIsNull\">智谱 Token 为空</string>\n    <string name=\"githubTokenIsNull\">GitHub 个人访问令牌为空</string>\n    <string name=\"githubTokenSuccess\">GitHub 个人访问令牌可用</string>\n    <string name=\"githubTokenUnavailable\">GitHub 个人访问令牌不可用，请检查您的 GitHub 个人访问令牌有效性。</string>\n    <string name=\"githubTokenUnavailableTitle\">GitHub 个人访问令牌不可用</string>\n    <string name=\"testToken\">测试 Token 可用性</string>\n    <string name=\"llmIntelligent\">LLM 智能摘要</string>\n    <string name=\"aiLLMInference\">LLM 推理</string>\n    <string name=\"qverbowUpdateLogLLMIntelligentDesc\">检查到更新时将使用 LLM 智能摘要更新日志，需要在“私有 Token 管理”填入智谱 Token</string>\n    <string name=\"qverbowUpdateLogLLMIntelligent\">更新日志智能摘要</string>\n    <string name=\"githubTokenHelperText\">GitHub 个人访问令牌将用于解除 GitHub REST API 访问速率限制，填入并保存即生效</string>\n    <string name=\"zhipuTokenHelperText\">默认仅请求智谱免费模型 GLM-4-Flash</string>\n    <string name=\"zhipuTokenIsInvalid\">填入的 Token 被智谱 AI 开放平台大模型接口 Java SDK 判定无效。</string>\n    <string name=\"clickHereToViewTheChangelog\">点击此处查看更新日志</string>\n    <string name=\"localWeixinVersion\">本机微信：</string>\n    <string name=\"weixin\">微信</string>\n    <string name=\"localDetailsMMKV\">MMKV</string>\n    <string name=\"localDetailsMMKVDesc\">MMKV 是微信中的一个高效、小巧、易用的移动的键值对存储框架，可在 Android、iOS/macOS、Windows、POSIX 和 HarmonyOS NEXT 上使用。</string>\n    <string name=\"localDetailsWCDB\">WCDB</string>\n    <string name=\"localDetailsWCDBDesc\">WCDB 是一个易用、高效、完整的移动数据库框架，它基于 SQLite 和 SQLCipher 开发，在微信中应用广泛，且支持在 C++、Java、Kotlin、Swift、Objc 五种语言环境中使用。</string>\n    <string name=\"localDetailsTinker\">Tinker</string>\n    <string name=\"localDetailsTinkerDesc\">Tinker 是微信官方的 Android 热补丁解决方案，它支持动态下发代码、So 库以及资源，让应用能够在不需要重新安装的情况下实现更新。</string>\n    <string name=\"localDetailsMars\">Mars</string>\n    <string name=\"localDetailsMarsDesc\">Mars 是微信官方的跨平台跨业务的终端基础组件。</string>\n    <string name=\"localDetailsMatrix\">Matrix</string>\n    <string name=\"localDetailsMatrixDesc\">Matrix 是一款微信研发并日常使用的应用性能接入框架，支持 iOS, macOS 和 Android。 Matrix 通过接入各种性能监控方案，对性能监控项的异常数据进行采集和分析，输出相应的问题分析、定位与优化建议，从而帮助开发者开发出更高质量的应用。</string>\n    <string name=\"localWeixinVersionDetails\">本机微信版本详情</string>\n    <string name=\"localDetailsReactNativeDesc\">React Native 将 React 的声明式 UI 框架引入 iOS 和 Android。使用 React Native，您可以直接使用原生 UI 控件，并拥有对原生平台的完整访问权限。</string>\n    <string name=\"localDetailsReactNative\">React Native</string>\n    <string name=\"localDetailsTBSDesc\">腾讯浏览服务（Tencent Browsing Service，简称 TBS）属于 PCG 事业群，QQ 浏览器团队。QQ 浏览器作为一个平台化的产品，不论是网页的打开还是文档能力的打开，都需要一个强大的自研引擎做支撑，而引擎研发团队，一直深耕引擎底层技术 10 余年，积累了丰富的业务经验，将引擎技术从产品独立出来为 SDK，并不断演进成一个平台化的引擎产品，成立腾讯浏览服务，为腾讯公司内外产品提供强大的引擎技术支持和技术服务支持，覆盖了近十万家产品接入，并支持数亿级的网页浏览体验。</string>\n    <string name=\"localDetailsTBS\">腾讯浏览服务</string>\n    <string name=\"biometricLoginTitle\">验证您的身份</string>\n    <string name=\"biometricLoginSubtitle\">验证您的身份以进一步操作</string>\n    <string name=\"llmInferenceLocalChanges\">应用更改推测</string>\n    <string name=\"genByAITips\">内容由 AI 生成，可能存在不准确的信息。</string>\n    <string name=\"llmInferenceLocalChangesDesc\">应用包分析外部应用时可以使用 LLM 推测外部应用与本机应用的功能变更，需要在“私有 Token 管理”填入智谱 Token</string>\n    <string name=\"llmInferenceLocalChangesPrompt\">用户本地已经安装了 %1$s %2$s，今天用户收到了一个 %1$s %3$s 安装包，用户已经得出收到的 %1$s %3$s 安装包的四大组件（activity、service、content provider、broadcast receiver）与权限和用户本地已安装的 %1$s %2$s 之间的差异。请根据用户传入的上述差异的文本，以清晰简洁的 %4$s 语言分析推测该差异可能存在的应用变更，要求：1) 提取核心功能优化和关键问题修复，忽略技术细节 2) 采用 Pangu 格式化文本，确保中英文/数字间自动空格 3) 用连贯段落呈现，严格控制在 300 字内。输出需突出用户感知明显的改进点，使用规范化表述，禁止列表格式且不使用 Markdown。</string>\n    <string name=\"timeout\">连接超时</string>\n    <string name=\"localDetailsSkylineRenderingEngine\">Skyline 渲染引擎</string>\n    <string name=\"localDetailsSkylineRenderingEngineDesc\">为了进一步优化小程序性能，提供更为接近原生的用户体验，微信团队在 WebView 渲染之外新增了一个渲染引擎 Skyline，其使用更精简高效的渲染管线，并带来诸多增强特性，让 Skyline 拥有更接近原生渲染的性能体验。</string>\n    <string name=\"versionNumberFontUseTCloudNumberDesc\">可在下方调整腾讯云数字字体字重</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values/themes.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>\n-->\n<resources xmlns:tools=\"http://schemas.android.com/tools\">\n    <!-- Base application theme. -->\n    <style name=\"Base.Theme.QQVersionList\" parent=\"Theme.Material3.DynamicColors.DayNight.NoActionBar\">\n        <item name=\"android:windowLightStatusBar\">true</item>\n        <item name=\"android:windowSplashScreenBackground\" tools:targetApi=\"31\">\n            ?attr/colorPrimaryContainer\n        </item>\n        <item name=\"android:windowSplashScreenAnimatedIcon\" tools:targetApi=\"31\">\n            @drawable/ic_launcher_foreground_splash\n        </item>\n        <item name=\"android:windowDrawsSystemBarBackgrounds\">true</item>\n        <item name=\"android:windowLayoutInDisplayCutoutMode\" tools:targetApi=\"27\">shortEdges</item>\n        <item name=\"android:windowSplashScreenIconBackgroundColor\" tools:targetApi=\"31\">\n            ?attr/colorPrimaryContainer\n        </item>\n        <item name=\"bottomSheetDialogTheme\">@style/ThemeOverlay.App.BottomSheetDialog</item>\n        <item name=\"android:navigationBarColor\">@android:color/transparent</item>\n        <item name=\"android:statusBarColor\">@android:color/transparent</item>\n    </style>\n\n    <style name=\"ThemeOverlay.App.BottomSheetDialog\" parent=\"ThemeOverlay.Material3.BottomSheetDialog\">\n        <item name=\"android:navigationBarColor\">@android:color/transparent\n        </item>\n    </style>\n\n    <style name=\"Theme.QQVersionList\" parent=\"Base.Theme.QQVersionList\" />\n</resources>"
  },
  {
    "path": "app/src/main/res/values-ar-rSA/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<resources>\n    <string name=\"app_name\">QQ 版本列表实用工具</string>\n    <string name=\"appTitle\">QQ 版本列表实用工具</string>\n    <string name=\"shortcutLongLabel\">扫版（维护模式）</string>\n    <string name=\"shortcutShortLabel\">扫版（维护）</string>\n    <string name=\"start\">开始</string>\n    <string name=\"cancel\">取消</string>\n    <string name=\"done\">确定</string>\n    <string name=\"save\">保存</string>\n    <string name=\"installed\">已安装</string>\n    <string name=\"copy\">复制</string>\n    <string name=\"refresh\">刷新</string>\n    <string name=\"agree\">同意</string>\n    <string name=\"disagreeAndExit\">不同意并退出</string>\n    <string name=\"withdrawConsentUA\">撤回同意用户协议</string>\n    <string name=\"withdrawConsentAndExit\">撤回同意并退出</string>\n    <string name=\"userAgreement\">用户协议</string>\n    <string name=\"enumerateVersionsFAB\">扫版（维护模式）</string>\n    <string name=\"enumerateVersionsDialogTitle\">扫版（维护模式）</string>\n    <string name=\"setting\">设置</string>\n    <string name=\"personalization\">个性化</string>\n    <string name=\"about\">关于</string>\n    <string name=\"enumerateVersionsFormatSetting\">扫版直链格式设置</string>\n    <string name=\"getUpdateFromTDSShiplyDistributionPlatform\">TDS 腾讯端服务 Shiply 容器与发布平台更新获取（实验性）</string>\n    <string name=\"getUpdateFromShiplyPlatform\">Shiply 平台更新获取（实验性）</string>\n    <string name=\"acceptedEnumerateVersion\">扫版成功</string>\n    <string name=\"contentReturnedByShiplyPlatform\">Shiply 平台返回内容</string>\n    <string name=\"applicationError\">程序出错</string>\n    <string name=\"additionalActions\">进一步操作</string>\n    <string name=\"shareTo\">分享到</string>\n    <string name=\"jsonDetails\">JSON 详情</string>\n    <string name=\"stableVersion\">正式版</string>\n    <string name=\"previewVersion\">测试版</string>\n    <string name=\"spaceEnumerateVersion\">空格扫版</string>\n    <string name=\"weixinEnumerateVersion\">微信扫版</string>\n    <string name=\"aboutAppName\">QQ 版本列表实用工具 for Android™</string>\n    <string name=\"aboutAuthor\">作者：</string>\n    <string name=\"aboutContributor\">贡献者：</string>\n    <string name=\"version\">版本：</string>\n    <string name=\"aboutSpecialThanksTo\">特别感谢：</string>\n    <string name=\"aboutOpenSourceRepo\">开源仓库：</string>\n    <string name=\"aboutGetUpdate\">获取更新：</string>\n    <string name=\"aboutDescription\">提供 Android QQ 版本列表的查看和对 Android QQ 下载链接的枚举法扫描。</string>\n    <string name=\"copied\">已复制：</string>\n    <string name=\"reatedFileSize\">额定大小：</string>\n    <string name=\"sourceJSON\">源 JSON</string>\n    <string name=\"recommendations\">建议的内容</string>\n    <string name=\"longPressTheVersionCardToViewSourceDetails\">长按版本卡片查看源详情</string>\n    <string name=\"useTheSystemDownloadManagerToTakeOverTheDownloadIntent\">使用系统下载管理器</string>\n    <string name=\"removeMultiplesOf5ForQQPreviewVersions\">解除 QQ 测试版扫版小版本号遵循 5 的倍数限制</string>\n    <string name=\"longPressToViewSourceDetailsIsDisabled\">未开启长按查看源详情功能，请前往设置开启</string>\n    <string name=\"currentSizeVsLargestHistoricalPackage\">占比历史最大包（%s）：</string>\n    <string name=\"extendTheSuffixForDirectDownloadLinksOfEnumeratedPreviewVersions\">扩展测试版扫版直链后缀</string>\n    <string name=\"fileSize\">大小：</string>\n    <string name=\"downloadLink\">下载地址：</string>\n    <string name=\"saved\">已保存</string>\n    <string name=\"enumQQPreviewWarning\">鉴于 QQ 测试版可能存在不可预知的稳定性问题，您在下载及使用该测试版本之前，必须明确并确保自身具备足够的风险识别和承受能力。根据相关条款，您使用本软件时应当已了解并同意，因下载或使用 QQ 测试版而可能产生的任何直接或间接损失、损害以及其他不利后果，均由您自行承担全部责任。</string>\n    <string name=\"enumQQMajorVersionHelpText\">填写格式为 x.y.z</string>\n    <string name=\"enumWeixinMajorVersionHelpText\">无需填写小数点</string>\n    <string name=\"enumWeixinWarning\">微信扫版功能为 QQ 版本列表实用工具附带的实验性功能，可能存在不可预知的稳定性问题。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"enumHasBeenStopped\">已停止扫描</string>\n    <string name=\"missingCipherWarning\">TDS 腾讯端服务 Shiply 容器与发布平台返回 JSON 内容中未包含“cipher_text”键值对。</string>\n    <string name=\"missingMajorVersionWarning\">扫版需要填写主版本号，否则无法执行扫版。</string>\n    <string name=\"missingQQPreviewMinorVersionWarning\">测试版扫版（含空格扫版）需要填写小版本号，否则无法扫描测试版。</string>\n    <string name=\"QQPreviewMinorNot5Warning\">小版本号需填写 5 的倍数。如需解除此限制，请前往设置进行解除。</string>\n    <string name=\"missingWeixinTrueVersionWarning\">微信扫版需要填写真实版本号，否则无法扫描微信版本。</string>\n    <string name=\"missingWeixin16CodeWarning\">微信扫版需要填写十六进制代码，否则无法扫描微信版本。</string>\n    <string name=\"enumeratingDownloadLink\">正在扫描下载地址：</string>\n    <string name=\"majorVersion\">主版本号</string>\n    <string name=\"initialMinorVersion\">起始小版本号</string>\n    <string name=\"hexadecimalCode\">十六进制代码</string>\n    <string name=\"initialMinorVersionHelpText\">填写起始扫描小版本号，扫正式版时无需填写</string>\n    <string name=\"hexadecimalCodeHelpText\">填写十六进制代码，仅微信扫版使用</string>\n    <string name=\"enumType\">扫版类型</string>\n    <string name=\"enumTypeHelpText\">指定扫版目标类型</string>\n    <string name=\"trueVersion\">真实版本号</string>\n    <string name=\"trueVersionHelpText\">填写真实版本号（版本码），仅微信扫版使用</string>\n    <string name=\"appidOptional\">appid（非必填）</string>\n    <string name=\"shiplyGeneralOptionalHelpText\">默认值：</string>\n    <string name=\"shiplyVersion\">版本</string>\n    <string name=\"shiplyVersionHelpText\">填写用于请求 Shiply 平台的 Android QQ/TIM 版本号</string>\n    <string name=\"uinHelpText\">填写用于请求 Shiply 平台的对象 QQ 号</string>\n    <string name=\"shiplyWarning\">腾讯 QQ/TIM 使用 TDS 腾讯端服务 Shiply 容器与发布平台，根据 QQ 号（uin）及其终端信息分发小范围灰度测试安装包。此功能并非每次请求都能成功获取到更新数据，无法获取更新数据则表示填写的参数不在 Shiply 平台认可与分发范围内。QQ 版本列表实用工具不对此功能及其任何后果作出任何可靠性保证。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"defaultDisplayOfFirstListItemDetails\">首项卡片默认显示详情</string>\n    <string name=\"versionNumberFontUseTCloudNumber\">使用腾讯云数字字体</string>\n    <string name=\"versionCardsDisplaysPackageSizeIndicator\">显示额定包大小占比历史最大包指示条</string>\n    <string name=\"customVersionEnumSuffix\">自定义扫版后缀</string>\n    <string name=\"customVersionEnumSuffixHelpText\">请使用“, ”（西文逗号+空格）分割</string>\n    <string name=\"facilitateI18n\">协助翻译：</string>\n    <string name=\"versionCardExpandButtonContentDescription\">展开详情</string>\n    <string name=\"versionCardCollapseButtonContentDescription\">收起详情</string>\n    <string name=\"shiplyAdvancedConfigurations\">进阶配置</string>\n    <string name=\"shiplyOsVersionOptional\">osVersion（非必填）</string>\n    <string name=\"shiplySdkVersionOptional\">sdkVersion（非必填）</string>\n    <string name=\"shiplyModelOptional\">model（非必填）</string>\n    <string name=\"shiplyLanguageOptional\">language（非必填）</string>\n    <string name=\"thicknessFollowSystem\">跟随系统</string>\n    <string name=\"back\">返回</string>\n    <string name=\"shiplyUseAdvancedConfigurations\">使用进阶配置</string>\n    <string name=\"localQQVersion\">本机 QQ：</string>\n    <string name=\"bracket\">（%s）</string>\n    <string name=\"localTIMVersion\">本机 TIM：</string>\n    <string name=\"localQQVersionDetails\">本机 QQ 版本详情</string>\n    <string name=\"localTIMVersionDetails\">本机 TIM 版本详情</string>\n    <string name=\"accessibilityTag\">6IW+6K6vIFFRIOW3suS4iue6v+S4gOmhueaXoOmanOeijeeUqOaIt+S4k+WxnuS8mOWMluaOquaWveabtOaWsOOAguenu+WKqOe7iOerr+iuvuWkh+W8gOWQr+ezu+e7n+aXoOmanOeijeivu+Wxj+acjeWKoe+8iOWmgiBBbmRyb2lkIFRhbGtiYWNr44CBaU9TIFZvaWNlT3Zlcu+8ie+8jOW5tuWQjOaXtuS9v+eUqOiFvuiuryBRUSDnp7vliqjlrqLmiLfnq68gOS4wLjg1IOWPiuS7peS4iueJiOacrOaXtu+8jOiFvuiuryBRUSDlsIblh4/lsJHmiJblgZzmraLlkJHmraTnsbsgUVEg5a6i5oi356uv5LiL5Y+R5bm/5ZGK44CC</string>\n    <string name=\"imageGallery\">应用宣传图</string>\n    <string name=\"share\">分享</string>\n    <string name=\"download\">下载</string>\n    <string name=\"stop\">停止</string>\n    <string name=\"skip\">跳过</string>\n    <string name=\"qqntTag\">基于 QQNT 技术架构</string>\n    <string name=\"releaseDateTIM\">发布日期：</string>\n    <string name=\"checkUpdateViaGitHubAPI\">使用 GitHub REST API 检查更新</string>\n    <string name=\"noUpdatesDetected\">未检测到更新</string>\n    <string name=\"noAssetsDetected\">未检测到资产文件</string>\n    <string name=\"cannotGetGitHub\">无法连接到 GitHub，请确保您所在网络环境可以访问 GitHub。</string>\n    <string name=\"updateQverbowAvailable\">更新可用</string>\n    <string name=\"copyLink\">复制链接</string>\n    <string name=\"unrealEngineTag\">内置虚幻引擎</string>\n    <string name=\"autoCheckForUpdates\">启动时检查更新</string>\n    <string name=\"useQQ8958Test\">使用 QQ 8.9.58 测试版直链格式</string>\n    <string name=\"ciVersionNoSupportUpdates\">CI 构建版本不支持检查更新</string>\n    <string name=\"showUnrealEngineTag\">显示虚幻引擎标识</string>\n    <string name=\"suffixSetting\">后缀设置</string>\n    <string name=\"others\">其它</string>\n    <string name=\"ok\">好</string>\n    <string name=\"swipeLeftToSeeMore\">向左滑动查看更多</string>\n    <string name=\"getUpdateFromTencentAppStore\">腾讯应用宝更新获取（实验性）</string>\n    <string name=\"experimentalFeatures\">实验性功能</string>\n    <string name=\"getQQLinkFromTencentAppStore\">获取 QQ 下载直链</string>\n    <string name=\"getTIMLinkFromTencentAppStore\">获取 TIM 下载直链</string>\n    <string name=\"getWeixinLinkFromTencentAppStore\">获取微信下载直链</string>\n    <string name=\"getWeComLinkFromTencentAppStore\">获取企业微信下载直链</string>\n    <string name=\"contentReturnedByTencentAppStore\">腾讯应用宝返回内容</string>\n    <string name=\"getWeTypeLinkFromTencentAppStore\">获取微信输入法下载直链</string>\n    <string name=\"tencentAppStoreWarning\">腾讯应用宝更新获取功能为 QQ 版本列表实用工具附带的实验性功能，可能存在不可预知的稳定性问题。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"showOldLoading\">扫版对话框使用旧版加载动画</string>\n    <string name=\"versionCardsDisplaysPackageSizeText\">显示额定包大小占比历史最大包百分比</string>\n    <string name=\"timVersion\">TIM 扫版</string>\n    <string name=\"enumTIMWarning\">TIM 扫版功能为 QQ 版本列表实用工具附带的实验性功能，可能存在不可预知的稳定性问题。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"useQQ9008_14600Test\">扫版类型添加 QQ 9.0.8.14600 空格直链格式</string>\n    <string name=\"initFirebaseService\">初始化 Firebase 服务</string>\n    <string name=\"enablingFirebaseServiceWarning\">初始化 Firebase 服务后，将立即在本地由 Firebase SDK 生成注册令牌，并将标识符和配置数据上传到 Firebase 服务器。此操作一经启用即无法撤销，是否继续？</string>\n    <string name=\"rainbow_notification_channel_id\">rainbow_notification_channel_id</string>\n    <string name=\"cannotFindGooglePlayServices\">未在当前设备检测到 Google Play 服务，因此无法在当前设备中使用由 Firebase 提供的服务。</string>\n    <string name=\"rainbow_notification_channel_title\">版本列表更新</string>\n    <string name=\"rainbow_notification_channel_description\">通过 Firebase 云消息传递</string>\n    <string name=\"enablingFirebaseServiceInsights\">启用 Firebase 服务可使用以下功能：\\n- 通过 Firebase 云消息传递的版本列表更新提醒</string>\n    <string name=\"enablingFirebaseServiceWarning2\">Firebase 云消息传递绑定了 Google Analytics 分析服务，使用 Firebase 云消息传递将不可避免地上传您在此软件的活跃信息。</string>\n    <string name=\"continueKey\">继续</string>\n    <string name=\"initializedFirebaseService\">Firebase 服务已初始化，无法撤销</string>\n    <string name=\"cannotEnableFirebaseCloudMessaging\">接收版本列表更新通知提醒必须打开系统通知权限，否则无法接收版本列表更新提醒。</string>\n    <string name=\"pushSystemNotificationsWhenVersionListUpdates\">版本列表更新时推送系统通知</string>\n    <string name=\"unsubscribeTimeout\">取消订阅超时</string>\n    <string name=\"unsubscribeSuccess\">取消订阅成功</string>\n    <string name=\"unsubscribeFailed\">取消订阅失败</string>\n    <string name=\"subscribeTimeout\">订阅超时</string>\n    <string name=\"subscribeSuccess\">订阅成功</string>\n    <string name=\"subscribeFailed\">订阅失败</string>\n    <string name=\"initializedFirebaseServiceItem\">Firebase 服务已初始化</string>\n    <string name=\"toSystemSetting\">前往系统设置</string>\n    <string name=\"threePartySharedList\">个人信息第三方共享清单</string>\n    <string name=\"shiplyTargetApp\">目标应用</string>\n    <string name=\"shiplyTargetAppQQ\">QQ</string>\n    <string name=\"shiplyTargetAppTIM\">TIM</string>\n    <string name=\"shiplyTargetHelper\">指定请求 Shiply 平台的目标应用</string>\n    <string name=\"openSourceLicenseTitle\">开放源代码许可</string>\n    <string name=\"basedOnQQVer\">基于 Android QQ %s 二次开发</string>\n    <string name=\"getQidianLinkFromTencentAppStore\">获取腾讯企点下载直链</string>\n    <string name=\"getWeixinAlphaLinkFromWeixinConfigDesc\">从腾讯服务器配置拉取微信最新测试版下载直链</string>\n    <string name=\"successInGetting\">获取成功</string>\n    <string name=\"getWeixinAlphaConfig404\">似乎未成功访问腾讯服务器配置文件，可能是微信当前没有测试版或测试版已撤包。</string>\n    <string name=\"getWeixinAlphaConfigLink404\">似乎未成功访问此下载地址，可能是微信当前测试版已撤包。</string>\n    <string name=\"suspectedPackageWithdrawal\">疑似撤包</string>\n    <string name=\"colon\">：</string>\n    <string name=\"qverbowHash\">杂凑值校验</string>\n    <string name=\"verifyHashValueViaGitHubAPI\">通过 GitHub REST API 校验杂凑值</string>\n    <string name=\"hashIsTrue\">杂凑值与 GitHub Releases 一致</string>\n    <string name=\"hashIsFalse\">您所使用的版本与 GitHub Releases 杂凑值不一致，为了您的安全，请尽快卸载当前版本应用并前往官方 GitHub Releases 下载此软件。</string>\n    <string name=\"toGitHubRelease\">前往下载</string>\n    <string name=\"getWeTypeTestLinkFromWeTypeLatestChannelDesc\">从微信输入法测试通道获取微信输入法最新下载直链</string>\n    <string name=\"getWeTypeLatestChannel404\">未成功访问微信输入法服务器，请检查您的网络连接。</string>\n    <string name=\"kuiklyTag\">存在 TDS 腾讯端服务 Kuikly 开发框架</string>\n    <string name=\"showKuiklyTag\">显示 Kuikly 开发框架标识</string>\n    <string name=\"getWeTypeTestLinkFromWeTypeLatestChannel\">获取微信输入法测试版</string>\n    <string name=\"getWeixinAlphaLinkFromWeixinConfig\">获取微信测试版</string>\n    <string name=\"autoCheckForUpdatesDesc\">每次启动时将通过 GitHub REST API 检查一次更新</string>\n    <string name=\"useTheSystemDownloadManagerToTakeOverTheDownloadIntentDesc\">开启后，软件全局触发下载意图时将不再打开浏览器</string>\n    <string name=\"showKuiklyTagDesc\">Kuikly 内置情况以 QQ 正式版为判断来源</string>\n    <string name=\"versionCardsDisplaysPackageSizeDesc\">仅对 QQ 版本卡片生效</string>\n    <string name=\"aboutVersionCards\">版本列表与卡片</string>\n    <string name=\"showUnrealEngineTagDesc\">虚幻引擎内置情况以 QQ 正式版为判断来源</string>\n    <string name=\"general\">通用</string>\n    <string name=\"copyAll\">复制全部</string>\n    <string name=\"enumVerMaintenanceModeWarning\">扫版功能已进入维护模式。您仍可以继续使用现有扫版功能，但 QQ 版本列表实用工具不再对相关功能及其任何后果作出任何可靠性保证，不再对相关功能进行积极开发，也不再接受相关新功能请求。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"localDetailsQQNT\">QQNT 技术架构</string>\n    <string name=\"localDetailsBugly\">Bugly 端质量监控平台</string>\n    <string name=\"localDetailsShiply\">Shiply 容器与发布平台</string>\n    <string name=\"localDetailsHippy\">Hippy 跨端开发框架</string>\n    <string name=\"localDetailsKuikly\">Kuikly 跨端开发框架</string>\n    <string name=\"localDetailsRightly\">Rightly 应用合规解决方案</string>\n    <string name=\"localDetailsUELibrary\">Unreal Engine as a Library</string>\n    <string name=\"localDetailsUELibraryDesc\">Unreal Engine as a Library 会将虚幻引擎的功能重新打包成一个库，以便其他应用程序生成和控制它们自己的 UE 实例。UELibrary 提供了一种简单、不依赖于平台的 API 来驱动 UE。</string>\n    <string name=\"localDetailsBuglyDesc\">Bugly 是 TDS 腾讯端服务（Tencent Device-oriented Service）旗下的端质量监控平台，通过采集、监控、定位、告警等核心能力，提供专业的质量监控服务，帮助开发者及时发现并解决质量问题，打造高质量应用。</string>\n    <string name=\"localDetailsShiplyDesc\">Shiply，全称 TDS 腾讯端服务 Shiply 容器与发布，属于 TDS 腾讯端服务系列产品的子产品之一，是源于腾讯内部 App 的一站式容器与发布解决方案。Shiply 提供了一套规则灵活、发布安全、高效分发的终端基础通用发布系统，功能包括：配置与开关、资源发布、应用升级，移动端热修复、Flutter 动态化、跨端开发框架等相关能力和分发支持，帮助产品和技术团队提高研效能力和决策力。</string>\n    <string name=\"localDetailsHippyDesc\">Hippy 是 TDF 腾讯端框架（Tencent Device-oriented Framework）下的开源跨平台应用开发解决方案。Hippy 从底层做了大量工作，抹平了 iOS、Android、OpenHarmony 三端差异，提供了接近 Web 的开发体验，目前上层支持了 React 和 Vue 两套界面框架，前端开发人员可以通过它，将前端代码转换为终端的原生指令，进行原生终端 APP 的开发。同时，Hippy 从底层进行了大量优化，在启动速度、渲染性能、动画速度、内存占用、包体积等方面都提供了业内顶尖的性能表现。</string>\n    <string name=\"localDetailsRightlyDesc\">Rightly 是面向移动端的全流程合规解决方案，集「合规管控」和「合规测评」为一体，为 APP 提供运行全周期数据安全与合规保护解决方案，也为 APP 提供个人信息风险审查与合规性检测服务，覆盖多项隐私安全指标。Rightly 能够助力业务提高合规效率，降低违规风险。</string>\n    <string name=\"localDetailsKuiklyDesc\">Kuikly（Kotlin UI Kit）跨端开发框架，是 TDF 腾讯端框架（Tencent Device-oriented Framework）的一部分。Kuikly 通过自研 Kotlin Multiplatform 逻辑与终端界面原生控件渲染映射协议层，并采用声明式与响应式设计，使采用 Kuikly 的 Kotlin 开发者能拥有原生高效的 Android 开发体验并构建具有原生性能的跨平台应用。Kuikly 更可依托于 TDS 腾讯端服务 Shiply 容器与发布平台，实现按页颗粒度的完备客户端界面动态化能力。</string>\n    <string name=\"localDetailsQQNTDesc\">QQNT 技术架构是腾讯 QQ 客户端全新的跨平台技术架构体系。QQNT 技术架构将 QQ 客户端核心功能——如核心登录、消息系统、关系链、富媒体、长连接、数据库等——下沉至 QQNT 内核层，使用 C++ 抽象逻辑封装为原生库并提供多平台多语言一致性接口，以实现 QQ 客户端核心逻辑代码跨平台与程序高性能运作。</string>\n    <string name=\"localDetailsMsg\">详细信息</string>\n    <string name=\"stackInfo\">技术栈信息</string>\n    <string name=\"details\">详情</string>\n    <string name=\"thisVerContains\">此版本包含 %s</string>\n    <string name=\"packageNameIsErr\">应用包名与预设不匹配</string>\n    <string name=\"useNewLocalDetailsPage\">使用新版本机应用详情页</string>\n    <string name=\"fileErr\">文件类型错误</string>\n    <string name=\"apkAnalyze\">应用包分析</string>\n    <string name=\"unknownErr\">未知错误</string>\n    <string name=\"notEnoughSpaceOnTheDevice\">设备剩余空间不足</string>\n    <string name=\"localDetailsTencentBeacon\">腾讯灯塔</string>\n    <string name=\"localDetailsTencentBeaconDesc\">腾讯灯塔全场景大数据分析套件，是腾讯 50+ 业务自 2018 年以来使用数据中台演化而成，支持每日数十亿条数据资产的全面管理，数千业务员工深度依赖的整体化工具套件。</string>\n    <string name=\"haveNotAgreeUA\">未同意用户协议，无法使用本软件</string>\n    <string name=\"localDetailsFlutter\">Flutter</string>\n    <string name=\"localDetailsFlutterDesc\">Flutter 是 Google 的便携式 UI 工具包，帮助你在移动、web、桌面端创造高质量的绝妙原生体验的应用。 Flutter 可以和世界上的开发人员和开发组织广泛使用的那些现存代码一起使用，并且是开源的、免费的。</string>\n    <string name=\"localDetailsJetpackCompose\">Jetpack Compose</string>\n    <string name=\"localDetailsJetpackComposeDesc\"> Jetpack Compose هي مجموعة أدوات حديثة لإنشاء واجهة مستخدم Android الأصلية. يساعد Jetpack Compose في تبسيط عملية تطوير واجهة المستخدم على Android وتسريعها باستخدام رموز برمجية أقل وأدوات فعّالة وواجهات برمجة تطبيقات سهلة الاستخدام في Kotlin.</string>\n    <string name=\"localDetailsComposeMultiplatform\">Compose Multiplatform</string>\n    <string name=\"localDetailsComposeMultiplatformDesc\">Compose Multiplatform 是一个由 JetBrains 开发的现代化声明式和响应式 UI 框架，它提供了一种只需少量 Kotlin 代码即可构建用户界面的简单方法。它还允许您只需编写一次用户界面，即可在任何支持的平台——iOS、Android、桌面（Windows、macOS、Linux）和 Web——上运行。</string>\n    <string name=\"security\">安全</string>\n    <string name=\"privateTokenSettings\">私有 Token 管理</string>\n    <string name=\"privateTokenSettingsDesc\">此处内填入的 Token 将由 Android 密钥库系统安全加密后存储</string>\n    <string name=\"zhipuAIMaaSPlatformToken\">智谱 AI 开放平台 Token</string>\n    <string name=\"updateLogPrompt\">请根据用户传入的更新日志文本，以清晰简洁的 %s 语言对更新日志文本进行专业总结，要求：1) 提取核心功能优化和关键问题修复，忽略技术细节 2) 采用 Pangu 格式化文本，确保中英文/数字间自动空格 3) 完全避免产品名称及主观评价 4) 用连贯段落呈现，严格控制在 150 字内。输出需突出用户感知明显的改进点，使用规范化表述，禁止列表格式且不使用 Markdown。</string>\n    <string name=\"githubPersonalAccessToken\">GitHub 个人访问令牌</string>\n    <string name=\"TEESupported\">密钥由设备可信执行环境（TEE）安全硬件提供保护</string>\n    <string name=\"StrongBoxSupported\">密钥由设备 StrongBox 安全元件提供保护</string>\n    <string name=\"UnknownSecurityHardwareSupported\">密钥由设备安全硬件提供保护</string>\n    <string name=\"SecuritySoftwareSupported\">密钥由 Android 密钥库提供保护</string>\n    <string name=\"testGitHubToken\">保存并联网测试 GitHub 个人访问令牌可用性</string>\n    <string name=\"testZhipuToken\">保存并联网测试智谱 AI 开放平台 Token 可用性</string>\n    <string name=\"testZhipuTokenPrompt\">用户正在测试与您的连通性。如果您收到了这句话，请使用 %s 语言热情地与用户打招呼并用一段话详细介绍自己的模型名称。</string>\n    <string name=\"backFromZhipuPlatform\">智谱 AI 开放平台返回内容</string>\n    <string name=\"zhipuTokenSuccess\">智谱 Token 可用</string>\n    <string name=\"zhipuTokenIsNull\">智谱 Token 为空</string>\n    <string name=\"githubTokenIsNull\">GitHub 个人访问令牌为空</string>\n    <string name=\"githubTokenSuccess\">GitHub 个人访问令牌可用</string>\n    <string name=\"githubTokenUnavailable\">GitHub 个人访问令牌不可用，请检查您的 GitHub 个人访问令牌有效性。</string>\n    <string name=\"githubTokenUnavailableTitle\">GitHub 个人访问令牌不可用</string>\n    <string name=\"testToken\">测试 Token 可用性</string>\n    <string name=\"llmIntelligent\">LLM 智能摘要</string>\n    <string name=\"aiLLMInference\">LLM 推理</string>\n    <string name=\"qverbowUpdateLogLLMIntelligentDesc\">检查到更新时将使用 LLM 智能摘要更新日志，需要在“私有 Token 管理”填入智谱 Token</string>\n    <string name=\"qverbowUpdateLogLLMIntelligent\">更新日志智能摘要</string>\n    <string name=\"githubTokenHelperText\">GitHub 个人访问令牌将用于解除 GitHub REST API 访问速率限制，填入并保存即生效</string>\n    <string name=\"zhipuTokenHelperText\">默认仅请求智谱免费模型 GLM-4-Flash</string>\n    <string name=\"zhipuTokenIsInvalid\">填入的 Token 被智谱 AI 开放平台大模型接口 Java SDK 判定无效。</string>\n    <string name=\"clickHereToViewTheChangelog\">点击此处查看更新日志</string>\n    <string name=\"localWeixinVersion\">本机微信：</string>\n    <string name=\"weixin\">Weixin</string>\n    <string name=\"localDetailsMMKV\">MMKV</string>\n    <string name=\"localDetailsMMKVDesc\">MMKV 是微信中的一个高效、小巧、易用的移动的键值对存储框架，可在 Android、iOS/macOS、Windows、POSIX 和 HarmonyOS NEXT 上使用。</string>\n    <string name=\"localDetailsWCDB\">WCDB</string>\n    <string name=\"localDetailsWCDBDesc\">WCDB 是一个易用、高效、完整的移动数据库框架，它基于 SQLite 和 SQLCipher 开发，在微信中应用广泛，且支持在 C++、Java、Kotlin、Swift、Objc 五种语言环境中使用。</string>\n    <string name=\"localDetailsTinker\">Tinker</string>\n    <string name=\"localDetailsTinkerDesc\">Tinker 是微信官方的 Android 热补丁解决方案，它支持动态下发代码、So 库以及资源，让应用能够在不需要重新安装的情况下实现更新。</string>\n    <string name=\"localDetailsMars\">Mars</string>\n    <string name=\"localDetailsMarsDesc\">Mars 是微信官方的跨平台跨业务的终端基础组件。</string>\n    <string name=\"localDetailsMatrix\">Matrix</string>\n    <string name=\"localDetailsMatrixDesc\">Matrix 是一款微信研发并日常使用的应用性能接入框架，支持 iOS, macOS 和 Android。 Matrix 通过接入各种性能监控方案，对性能监控项的异常数据进行采集和分析，输出相应的问题分析、定位与优化建议，从而帮助开发者开发出更高质量的应用。</string>\n    <string name=\"localWeixinVersionDetails\">本机微信版本详情</string>\n    <string name=\"localDetailsReactNativeDesc\">React Native 将 React 的声明式 UI 框架引入 iOS 和 Android。使用 React Native，您可以直接使用原生 UI 控件，并拥有对原生平台的完整访问权限。</string>\n    <string name=\"localDetailsReactNative\">React Native</string>\n    <string name=\"localDetailsTBSDesc\">腾讯浏览服务（Tencent Browsing Service，简称 TBS）属于 PCG 事业群，QQ 浏览器团队。QQ 浏览器作为一个平台化的产品，不论是网页的打开还是文档能力的打开，都需要一个强大的自研引擎做支撑，而引擎研发团队，一直深耕引擎底层技术 10 余年，积累了丰富的业务经验，将引擎技术从产品独立出来为 SDK，并不断演进成一个平台化的引擎产品，成立腾讯浏览服务，为腾讯公司内外产品提供强大的引擎技术支持和技术服务支持，覆盖了近十万家产品接入，并支持数亿级的网页浏览体验。</string>\n    <string name=\"localDetailsTBS\">腾讯浏览服务</string>\n    <string name=\"biometricLoginTitle\">验证您的身份</string>\n    <string name=\"biometricLoginSubtitle\">验证您的身份以进一步操作</string>\n    <string name=\"llmInferenceLocalChanges\">应用更改推测</string>\n    <string name=\"genByAITips\">内容由 AI 生成，可能存在不准确的信息。</string>\n    <string name=\"llmInferenceLocalChangesDesc\">应用包分析外部应用时可以使用 LLM 推测外部应用与本机应用的功能变更，需要在“私有 Token 管理”填入智谱 Token</string>\n    <string name=\"llmInferenceLocalChangesPrompt\">用户本地已经安装了 %1$s %2$s，今天用户收到了一个 %1$s %3$s 安装包，用户已经得出收到的 %1$s %3$s 安装包的四大组件（activity、service、content provider、broadcast receiver）与权限和用户本地已安装的 %1$s %2$s 之间的差异。请根据用户传入的上述差异的文本，以清晰简洁的 %4$s 语言分析推测该差异可能存在的应用变更，要求：1) 提取核心功能优化和关键问题修复，忽略技术细节 2) 采用 Pangu 格式化文本，确保中英文/数字间自动空格 3) 用连贯段落呈现，严格控制在 300 字内。输出需突出用户感知明显的改进点，使用规范化表述，禁止列表格式且不使用 Markdown。</string>\n    <string name=\"timeout\">连接超时</string>\n    <string name=\"localDetailsSkylineRenderingEngine\">Skyline 渲染引擎</string>\n    <string name=\"localDetailsSkylineRenderingEngineDesc\">为了进一步优化小程序性能，提供更为接近原生的用户体验，微信团队在 WebView 渲染之外新增了一个渲染引擎 Skyline，其使用更精简高效的渲染管线，并带来诸多增强特性，让 Skyline 拥有更接近原生渲染的性能体验。</string>\n    <string name=\"versionNumberFontUseTCloudNumberDesc\">可在下方调整腾讯云数字字体字重</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-en-rUS/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<resources>\n    <string name=\"app_name\">Qverbow Util</string>\n    <string name=\"appTitle\">Qverbow Util</string>\n    <string name=\"shortcutLongLabel\">Enumerate Versions (Maintenance Mode)</string>\n    <string name=\"shortcutShortLabel\">Enum. Ver. (Maintenance)</string>\n    <string name=\"start\">Start</string>\n    <string name=\"cancel\">Cancel</string>\n    <string name=\"done\">Done</string>\n    <string name=\"save\">Save</string>\n    <string name=\"installed\">Installed</string>\n    <string name=\"copy\">Copy</string>\n    <string name=\"refresh\">Refresh</string>\n    <string name=\"agree\">Agree</string>\n    <string name=\"disagreeAndExit\">Disagree and Exit</string>\n    <string name=\"withdrawConsentUA\">Withdraw User Agreement Consent</string>\n    <string name=\"withdrawConsentAndExit\">Withdraw Consent and Exit</string>\n    <string name=\"userAgreement\">User Agreement</string>\n    <string name=\"enumerateVersionsFAB\">Enumerate Versions (Maintenance Mode)</string>\n    <string name=\"enumerateVersionsDialogTitle\">Enumerate Versions (Maintenance Mode)</string>\n    <string name=\"setting\">Setting</string>\n    <string name=\"personalization\">Personalization</string>\n    <string name=\"about\">About</string>\n    <string name=\"enumerateVersionsFormatSetting\">Enumerate Versions Format Setting</string>\n    <string name=\"getUpdateFromTDSShiplyDistributionPlatform\">Get Update From Tencent Device-oriented Service (TDS) Shiply Containing and Distributing Platform (Experimental)</string>\n    <string name=\"getUpdateFromShiplyPlatform\">Get Update From Shiply Platform (Experimental)</string>\n    <string name=\"acceptedEnumerateVersion\">Accepted Enumerate Version</string>\n    <string name=\"contentReturnedByShiplyPlatform\">Content Returned By Shiply Platform</string>\n    <string name=\"applicationError\">Application Error</string>\n    <string name=\"additionalActions\">Additional Actions</string>\n    <string name=\"shareTo\">Share To</string>\n    <string name=\"jsonDetails\">JSON Details</string>\n    <string name=\"stableVersion\">Stable</string>\n    <string name=\"previewVersion\">Preview</string>\n    <string name=\"spaceEnumerateVersion\">Space-containing Enum.</string>\n    <string name=\"weixinEnumerateVersion\">Weixin</string>\n    <string name=\"aboutAppName\">Qverbow Util</string>\n    <string name=\"aboutAuthor\">Author:&#160;</string>\n    <string name=\"aboutContributor\">Contributor:&#160;</string>\n    <string name=\"version\">Version:&#160;</string>\n    <string name=\"aboutSpecialThanksTo\">Special Thanks To:&#160;</string>\n    <string name=\"aboutOpenSourceRepo\">Open Source Repo:&#160;</string>\n    <string name=\"aboutGetUpdate\">Get Update:&#160;</string>\n    <string name=\"aboutDescription\">Offers viewing Android QQ versions and speculatively enumerates its download links.</string>\n    <string name=\"copied\">Copied:&#160;</string>\n    <string name=\"reatedFileSize\">Reated File Size:&#160;</string>\n    <string name=\"sourceJSON\">Source JSON</string>\n    <string name=\"recommendations\">Recommendations</string>\n    <string name=\"longPressTheVersionCardToViewSourceDetails\">Long press the version card to view source details</string>\n    <string name=\"useTheSystemDownloadManagerToTakeOverTheDownloadIntent\">Use system download manager</string>\n    <string name=\"removeMultiplesOf5ForQQPreviewVersions\">Remove the restriction of adhering to multiples of 5 when enumerating minor version numbers for QQ preview versions</string>\n    <string name=\"longPressToViewSourceDetailsIsDisabled\">Long press to view source details is disabled. Please go to settings to turn it on.</string>\n    <string name=\"currentSizeVsLargestHistoricalPackage\">Current Size VS Largest Historical Package(%s):&#160;</string>\n    <string name=\"extendTheSuffixForDirectDownloadLinksOfEnumeratedPreviewVersions\">Extend the suffix for direct download links of enumerated preview versions</string>\n    <string name=\"fileSize\">File Size:&#160;</string>\n    <string name=\"downloadLink\">Download Link:&#160;</string>\n    <string name=\"saved\">Saved.</string>\n    <string name=\"enumQQPreviewWarning\">Given that the QQ preview version may have unpredictable stability issues, you must clearly acknowledge and ensure that you possess adequate risk awareness and tolerance before downloading and using this beta version. According to the relevant terms, when using this software, you should be aware and agree that any direct or indirect losses, damages, and other adverse consequences resulting from the download or use of the QQ preview version shall be borne entirely by you.</string>\n    <string name=\"enumQQMajorVersionHelpText\">Format: x.y.z</string>\n    <string name=\"enumWeixinMajorVersionHelpText\">Omit the decimal point</string>\n    <string name=\"enumWeixinWarning\">The enumerating Weixin versions function is an experimental feature included in Qverbow Util, which may have unpredictable stability issues. Please clearly understand and ensure that you have sufficient capability to identify and bear the risks.</string>\n    <string name=\"enumHasBeenStopped\">Enumerating has been stopped.</string>\n    <string name=\"missingCipherWarning\">Tencent Device-oriented Service (TDS) Shiply Containing and Distributing Platform does not include the \\&quot;cipher_text\\&quot; key-value pair in the returned JSON content.</string>\n    <string name=\"missingMajorVersionWarning\">Enumerating versions requires specifying the major version number, otherwise the enumeration version cannot be executed.</string>\n    <string name=\"missingQQPreviewMinorVersionWarning\">Enumerating preview versions (including space-containing enumeration) requires specifying the minor version number, otherwise the enumeration of preview versions cannot be executed.</string>\n    <string name=\"QQPreviewMinorNot5Warning\">The minor version number must be a multiple of 5. If you need to remove this restriction, please go to the settings to lift it.</string>\n    <string name=\"missingWeixinTrueVersionWarning\">Enumerating Weixin versions requires specifying the actual version number; otherwise the enumeration of Weixin versions cannot be executed.</string>\n    <string name=\"missingWeixin16CodeWarning\">Enumerating Weixin versions requires specifying the hexadecimal code; otherwise the enumeration of Weixin versions cannot be executed.</string>\n    <string name=\"enumeratingDownloadLink\">Enumerating download link:&#160;</string>\n    <string name=\"majorVersion\">Major Version</string>\n    <string name=\"initialMinorVersion\">Initial Minor Version</string>\n    <string name=\"hexadecimalCode\">Hexadecimal Code</string>\n    <string name=\"initialMinorVersionHelpText\">Enter the initial minor version for enumeration, not needed for stable versions.</string>\n    <string name=\"hexadecimalCodeHelpText\">Enter the hexadecimal code, used only for enumerating Weixin versions.</string>\n    <string name=\"enumType\">Enum. Type</string>\n    <string name=\"enumTypeHelpText\">Specify the enumerating target type.</string>\n    <string name=\"trueVersion\">Actual Version Number</string>\n    <string name=\"trueVersionHelpText\">Enter the actual version number (versionCode), used only for enumerating Weixin versions.</string>\n    <string name=\"appidOptional\">appid (optional)</string>\n    <string name=\"shiplyGeneralOptionalHelpText\">Default:&#160;</string>\n    <string name=\"shiplyVersion\">Version</string>\n    <string name=\"shiplyVersionHelpText\">Enter the Android QQ/TIM version number, used for requesting the Shiply Platform.</string>\n    <string name=\"uinHelpText\">Enter the target QQ account number, used for requesting the Shiply Platform.</string>\n    <string name=\"shiplyWarning\">Tencent QQ/TIM utilizes the Tencent Device-oriented Service (TDS) Shiply Containing and Distributing Platform to distribute limited-scale gray testing packages based on the QQ account number (uin) and its terminal information. This feature does not guarantee successful retrieval of update data with each request; failure to obtain update data indicates that the entered parameters fall outside the recognized and distributed scope of the Shiply Platform. The Qverbow Util makes no warranty regarding the reliability of this feature or any consequences thereof. Please ensure that you have a clear understanding and sufficient capability to bear the associated risks.</string>\n    <string name=\"defaultDisplayOfFirstListItemDetails\">Default display of first version list item details</string>\n    <string name=\"versionNumberFontUseTCloudNumber\">Use TCloudNumber font</string>\n    <string name=\"versionCardsDisplaysPackageSizeIndicator\">Display the ratio of current package size to the historical maximum package size indicator</string>\n    <string name=\"customVersionEnumSuffix\">Custom Version Enum. Suffix</string>\n    <string name=\"customVersionEnumSuffixHelpText\">Please separate using \\&quot;, \\&quot; (comma + space).</string>\n    <string name=\"facilitateI18n\">Facilitate I18n:&#160;</string>\n    <string name=\"versionCardExpandButtonContentDescription\">Expand details</string>\n    <string name=\"versionCardCollapseButtonContentDescription\">Collapse details</string>\n    <string name=\"shiplyAdvancedConfigurations\">Advanced Configurations</string>\n    <string name=\"shiplyOsVersionOptional\">osVersion (optional)</string>\n    <string name=\"shiplySdkVersionOptional\">sdkVersion (optional)</string>\n    <string name=\"shiplyModelOptional\">model (optional)</string>\n    <string name=\"shiplyLanguageOptional\">language (optional)</string>\n    <string name=\"thicknessFollowSystem\">Follow System</string>\n    <string name=\"back\">Back</string>\n    <string name=\"shiplyUseAdvancedConfigurations\">Use Advanced Configurations</string>\n    <string name=\"localQQVersion\">Local QQ:&#160;</string>\n    <string name=\"bracket\">&#160;(%s)</string>\n    <string name=\"localTIMVersion\">Local TIM:&#160;</string>\n    <string name=\"localQQVersionDetails\">Local QQ Version Details</string>\n    <string name=\"localTIMVersionDetails\">Local TIM Version Details</string>\n    <string name=\"accessibilityTag\">VGVuY2VudCBRUSBoYXMgbGF1bmNoZWQgYSBkZWRpY2F0ZWQgYWNjZXNzaWJpbGl0eSBvcHRpbWl6YXRpb24gdXBkYXRlIGZvciB1c2Vycy4gV2hlbiB0aGUgc3lzdGVtJ3Mgc2NyZWVuIHJlYWRlciBzZXJ2aWNlIChzdWNoIGFzIEFuZHJvaWQgVGFsa2JhY2ssIGlPUyBWb2ljZU92ZXIpIGlzIGVuYWJsZWQgb24gdGhlIG1vYmlsZSBkZXZpY2UgYW5kIFRlbmNlbnQgUVEgbW9iaWxlIGNsaWVudCB2ZXJzaW9uIDkuMC44NSBvciBsYXRlciBpcyB1c2VkLCBUZW5jZW50IFFRIHdpbGwgcmVkdWNlIG9yIHN0b3Agc2VydmluZyBhZHMgdG8gc3VjaCBRUSBjbGllbnRzLg==</string>\n    <string name=\"imageGallery\">App Promotion Image</string>\n    <string name=\"share\">Share</string>\n    <string name=\"download\">Download</string>\n    <string name=\"stop\">Stop</string>\n    <string name=\"skip\">Skip</string>\n    <string name=\"qqntTag\">Powered by QQNT Framework</string>\n    <string name=\"releaseDateTIM\">Release Date:&#160;</string>\n    <string name=\"checkUpdateViaGitHubAPI\">Check for Updates via GitHub REST API</string>\n    <string name=\"noUpdatesDetected\">No updates detected.</string>\n    <string name=\"noAssetsDetected\">No assets detected.</string>\n    <string name=\"cannotGetGitHub\">Unable to connect to GitHub. Please ensure your network environment can access GitHub.</string>\n    <string name=\"updateQverbowAvailable\">Update Available</string>\n    <string name=\"copyLink\">Copy Link</string>\n    <string name=\"unrealEngineTag\">Unreal® Engine Inside</string>\n    <string name=\"autoCheckForUpdates\">Check for Updates on Startup</string>\n    <string name=\"useQQ8958Test\">Use QQ 8.9.58 Test Version Link Format</string>\n    <string name=\"ciVersionNoSupportUpdates\">CI Build No Support Update Check</string>\n    <string name=\"showUnrealEngineTag\">Display Unreal® Engine logo</string>\n    <string name=\"suffixSetting\">Suffix Settings</string>\n    <string name=\"others\">Others</string>\n    <string name=\"ok\">OK</string>\n    <string name=\"swipeLeftToSeeMore\">Swipe left to see more.</string>\n    <string name=\"getUpdateFromTencentAppStore\">Get Update From Tencent App Store (Experimental)</string>\n    <string name=\"experimentalFeatures\">Experimental Features</string>\n    <string name=\"getQQLinkFromTencentAppStore\">Get QQ Download Link</string>\n    <string name=\"getTIMLinkFromTencentAppStore\">Get TIM Download Link</string>\n    <string name=\"getWeixinLinkFromTencentAppStore\">Get Weixin Download Link</string>\n    <string name=\"getWeComLinkFromTencentAppStore\">Get WeCom Download Link</string>\n    <string name=\"contentReturnedByTencentAppStore\">Content Returned By Tencent App Store</string>\n    <string name=\"getWeTypeLinkFromTencentAppStore\">Get WeType Download Link</string>\n    <string name=\"tencentAppStoreWarning\">腾讯应用宝更新获取功能为 QQ 版本列表实用工具附带的实验性功能，可能存在不可预知的稳定性问题。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"showOldLoading\">扫版对话框使用旧版加载动画</string>\n    <string name=\"versionCardsDisplaysPackageSizeText\">显示额定包大小占比历史最大包百分比</string>\n    <string name=\"timVersion\">TIM</string>\n    <string name=\"enumTIMWarning\">The enumerating TIM versions function is an experimental feature included in Qverbow Util, which may have unpredictable stability issues. Please clearly understand and ensure that you have sufficient capability to identify and bear the risks.</string>\n    <string name=\"useQQ9008_14600Test\">扫版类型添加 QQ 9.0.8.14600 空格直链格式</string>\n    <string name=\"initFirebaseService\">Initialize Firebase Services</string>\n    <string name=\"enablingFirebaseServiceWarning\">After initializing Firebase services, a registration token will be generated locally by the Firebase SDK, and the identifier and configuration data will be uploaded to the Firebase server. This action cannot be reversed once enabled. Do you want to continue?</string>\n    <string name=\"rainbow_notification_channel_id\">rainbow_notification_channel_id</string>\n    <string name=\"cannotFindGooglePlayServices\">Google Play services are not detected on the current device, so Firebase services cannot be used on this device.</string>\n    <string name=\"rainbow_notification_channel_title\">Version List Updates</string>\n    <string name=\"rainbow_notification_channel_description\">Via Firebase Cloud Messaging</string>\n    <string name=\"enablingFirebaseServiceInsights\">Enabling Firebase services allows the use of the following features: \\n- Update reminders for version lists via Firebase Cloud Messaging</string>\n    <string name=\"enablingFirebaseServiceWarning2\">Firebase Cloud Messaging is integrated with Google Analytics. Using Firebase Cloud Messaging will inevitably upload your activity information from this software.</string>\n    <string name=\"continueKey\">Continue</string>\n    <string name=\"initializedFirebaseService\">Firebase services has been initialized and cannot be reversed.</string>\n    <string name=\"cannotEnableFirebaseCloudMessaging\">To receive notifications for version list updates, system notification permissions must be enabled; otherwise, you will not be able to receive version list update notifications.</string>\n    <string name=\"pushSystemNotificationsWhenVersionListUpdates\">Push system notifications when the version list is updated</string>\n    <string name=\"unsubscribeTimeout\">Unsubscribing Timeout</string>\n    <string name=\"unsubscribeSuccess\">Unsubscribing Success</string>\n    <string name=\"unsubscribeFailed\">Unsubscribing Failed</string>\n    <string name=\"subscribeTimeout\">Subscribing Timeout</string>\n    <string name=\"subscribeSuccess\">Subscribing Success</string>\n    <string name=\"subscribeFailed\">Subscribing Failed</string>\n    <string name=\"initializedFirebaseServiceItem\">Firebase services has been initialized</string>\n    <string name=\"toSystemSetting\">Go to System Settings</string>\n    <string name=\"threePartySharedList\">Personal Information Third-Party Sharing List</string>\n    <string name=\"shiplyTargetApp\">Target App</string>\n    <string name=\"shiplyTargetAppQQ\">QQ</string>\n    <string name=\"shiplyTargetAppTIM\">TIM</string>\n    <string name=\"shiplyTargetHelper\">Specify the Target App for the Shiply Platform</string>\n    <string name=\"openSourceLicenseTitle\">Open Source Licenses</string>\n    <string name=\"basedOnQQVer\">Secondary Development Based on Android QQ %s</string>\n    <string name=\"getQidianLinkFromTencentAppStore\">Get Tencent Qidian Download Link</string>\n    <string name=\"getWeixinAlphaLinkFromWeixinConfigDesc\">Get the Newest Weixin Alpha Download Link from the Tencent Server Configuration</string>\n    <string name=\"successInGetting\">Success in Getting</string>\n    <string name=\"getWeixinAlphaConfig404\">It seems that the Tencent server configuration file was not accessed successfully, possibly because there is no current alpha version of Weixin or the beta version has been removed.</string>\n    <string name=\"getWeixinAlphaConfigLink404\">It seems that the download address was not successfully accessed, possibly because the current Weixin alpha version has been removed.</string>\n    <string name=\"suspectedPackageWithdrawal\">Suspected Package Withdrawal</string>\n    <string name=\"colon\">:&#160;</string>\n    <string name=\"qverbowHash\">Hash Value Verification</string>\n    <string name=\"verifyHashValueViaGitHubAPI\">Verify Hash Value via GitHub REST API</string>\n    <string name=\"hashIsTrue\">Hash value matches GitHub Releases.</string>\n    <string name=\"hashIsFalse\">The hash value of the version you are using does not match the GitHub Releases. For your safety, please uninstall the current version of the application and download the software from the official GitHub Releases.</string>\n    <string name=\"toGitHubRelease\">Go to Download</string>\n    <string name=\"getWeTypeTestLinkFromWeTypeLatestChannelDesc\">Get the WeType Testing Download Link from the WeType Latest Channel</string>\n    <string name=\"getWeTypeLatestChannel404\">Failed to access the WeType server, please check your network connection.</string>\n    <string name=\"kuiklyTag\">Existence of Tencent Device-oriented Service (TDS) Kuikly Framework</string>\n    <string name=\"showKuiklyTag\">显示 Kuikly 开发框架标识</string>\n    <string name=\"getWeTypeTestLinkFromWeTypeLatestChannel\">Get WeType Testing Version</string>\n    <string name=\"getWeixinAlphaLinkFromWeixinConfig\">Get Weixin Alpha Version</string>\n    <string name=\"autoCheckForUpdatesDesc\">On each startup, an update check will be performed using the GitHub REST API.</string>\n    <string name=\"useTheSystemDownloadManagerToTakeOverTheDownloadIntentDesc\">When enabled, the software will no longer open the browser when a global download intent is triggered.</string>\n    <string name=\"showKuiklyTagDesc\">The built-in status of Kuikly is determined based on the official QQ release version.</string>\n    <string name=\"versionCardsDisplaysPackageSizeDesc\">Applicable only to QQ version cards.</string>\n    <string name=\"aboutVersionCards\">Version List and Cards</string>\n    <string name=\"showUnrealEngineTagDesc\">The built-in status of Unreal® Engine is determined based on the official QQ release version.</string>\n    <string name=\"general\">General</string>\n    <string name=\"copyAll\">Copy All</string>\n    <string name=\"enumVerMaintenanceModeWarning\">扫版功能已进入维护模式。您仍可以继续使用现有扫版功能，但 QQ 版本列表实用工具不再对相关功能及其任何后果作出任何可靠性保证，不再对相关功能进行积极开发，也不再接受相关新功能请求。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"localDetailsQQNT\">QQNT 技术架构</string>\n    <string name=\"localDetailsBugly\">Bugly 端质量监控平台</string>\n    <string name=\"localDetailsShiply\">Shiply 容器与发布平台</string>\n    <string name=\"localDetailsHippy\">Hippy 跨端开发框架</string>\n    <string name=\"localDetailsKuikly\">Kuikly 跨端开发框架</string>\n    <string name=\"localDetailsRightly\">Rightly 应用合规解决方案</string>\n    <string name=\"localDetailsUELibrary\">Unreal Engine as a Library</string>\n    <string name=\"localDetailsUELibraryDesc\">Unreal Engine as a Library 会将虚幻引擎的功能重新打包成一个库，以便其他应用程序生成和控制它们自己的 UE 实例。UELibrary 提供了一种简单、不依赖于平台的 API 来驱动 UE。</string>\n    <string name=\"localDetailsBuglyDesc\">Bugly 是 TDS 腾讯端服务（Tencent Device-oriented Service）旗下的端质量监控平台，通过采集、监控、定位、告警等核心能力，提供专业的质量监控服务，帮助开发者及时发现并解决质量问题，打造高质量应用。</string>\n    <string name=\"localDetailsShiplyDesc\">Shiply，全称 TDS 腾讯端服务 Shiply 容器与发布，属于 TDS 腾讯端服务系列产品的子产品之一，是源于腾讯内部 App 的一站式容器与发布解决方案。Shiply 提供了一套规则灵活、发布安全、高效分发的终端基础通用发布系统，功能包括：配置与开关、资源发布、应用升级，移动端热修复、Flutter 动态化、跨端开发框架等相关能力和分发支持，帮助产品和技术团队提高研效能力和决策力。</string>\n    <string name=\"localDetailsHippyDesc\">Hippy 是 TDF 腾讯端框架（Tencent Device-oriented Framework）下的开源跨平台应用开发解决方案。Hippy 从底层做了大量工作，抹平了 iOS、Android、OpenHarmony 三端差异，提供了接近 Web 的开发体验，目前上层支持了 React 和 Vue 两套界面框架，前端开发人员可以通过它，将前端代码转换为终端的原生指令，进行原生终端 APP 的开发。同时，Hippy 从底层进行了大量优化，在启动速度、渲染性能、动画速度、内存占用、包体积等方面都提供了业内顶尖的性能表现。</string>\n    <string name=\"localDetailsRightlyDesc\">Rightly 是面向移动端的全流程合规解决方案，集「合规管控」和「合规测评」为一体，为 APP 提供运行全周期数据安全与合规保护解决方案，也为 APP 提供个人信息风险审查与合规性检测服务，覆盖多项隐私安全指标。Rightly 能够助力业务提高合规效率，降低违规风险。</string>\n    <string name=\"localDetailsKuiklyDesc\">Kuikly（Kotlin UI Kit）跨端开发框架，是 TDF 腾讯端框架（Tencent Device-oriented Framework）的一部分。Kuikly 通过自研 Kotlin Multiplatform 逻辑与终端界面原生控件渲染映射协议层，并采用声明式与响应式设计，使采用 Kuikly 的 Kotlin 开发者能拥有原生高效的 Android 开发体验并构建具有原生性能的跨平台应用。Kuikly 更可依托于 TDS 腾讯端服务 Shiply 容器与发布平台，实现按页颗粒度的完备客户端界面动态化能力。</string>\n    <string name=\"localDetailsQQNTDesc\">QQNT 技术架构是腾讯 QQ 客户端全新的跨平台技术架构体系。QQNT 技术架构将 QQ 客户端核心功能——如核心登录、消息系统、关系链、富媒体、长连接、数据库等——下沉至 QQNT 内核层，使用 C++ 抽象逻辑封装为原生库并提供多平台多语言一致性接口，以实现 QQ 客户端核心逻辑代码跨平台与程序高性能运作。</string>\n    <string name=\"localDetailsMsg\">Detailed Info</string>\n    <string name=\"stackInfo\">Stack Info</string>\n    <string name=\"details\">Details</string>\n    <string name=\"thisVerContains\">This version contains %s</string>\n    <string name=\"packageNameIsErr\">The package name of the application does not match the preset.</string>\n    <string name=\"useNewLocalDetailsPage\">Use the new version of the local app details page</string>\n    <string name=\"fileErr\">File type error</string>\n    <string name=\"apkAnalyze\">APK Analysis</string>\n    <string name=\"unknownErr\">Unknown Error</string>\n    <string name=\"notEnoughSpaceOnTheDevice\">Not enough space on the device</string>\n    <string name=\"localDetailsTencentBeacon\">Tencent Beacon</string>\n    <string name=\"localDetailsTencentBeaconDesc\">腾讯灯塔全场景大数据分析套件，是腾讯 50+ 业务自 2018 年以来使用数据中台演化而成，支持每日数十亿条数据资产的全面管理，数千业务员工深度依赖的整体化工具套件。</string>\n    <string name=\"haveNotAgreeUA\">You have not agreed to the User Agreement, and you cannot use this software.</string>\n    <string name=\"localDetailsFlutter\">Flutter</string>\n    <string name=\"localDetailsFlutterDesc\">Flutter is Google\\'s portable UI toolkit for crafting beautiful, natively compiled applications for mobile, web, and desktop from a single codebase. Flutter works with existing code, is used by developers and organizations around the world, and is free and open source.</string>\n    <string name=\"localDetailsJetpackCompose\">Jetpack Compose</string>\n    <string name=\"localDetailsJetpackComposeDesc\">Jetpack Compose is a modern toolkit for building native Android UI. Jetpack Compose simplifies and accelerates UI development on Android with less code, powerful tools, and intuitive Kotlin APIs. </string>\n    <string name=\"localDetailsComposeMultiplatform\">Compose Multiplatform</string>\n    <string name=\"localDetailsComposeMultiplatformDesc\">Compose Multiplatform is a modern declarative and reactive UI framework developed by JetBrains that provides a simple way to build user interfaces with a small amount of Kotlin code. It also allows you to write your UI once and run it on any of the supported platforms – iOS, Android, desktop (Windows, macOS, Linux), and web.</string>\n    <string name=\"security\">Security</string>\n    <string name=\"privateTokenSettings\">Private Token Settings</string>\n    <string name=\"privateTokenSettingsDesc\">The Token entered here will be securely encrypted by the Android KeyStore System and stored.</string>\n    <string name=\"zhipuAIMaaSPlatformToken\">Zhipu AI MaaS Platform Token</string>\n    <string name=\"updateLogPrompt\">Based on the user-provided changelog text, create a professional summary in clear and concise %s language. Requirements: 1) Extract core feature optimizations and critical issue fixes, omitting technical details 2) Apply Pangu formatting to automatically space between Chinese/English characters and numbers 3) Completely avoid product names and subjective evaluations 4) Present in coherent paragraphs, strictly within 150 words. Emphasize user-perceivable improvements using standardized expressions, prohibit list formats, and avoid Markdown.</string>\n    <string name=\"githubPersonalAccessToken\">GitHub Personal Access Token</string>\n    <string name=\"TEESupported\">The key is protected by the device\\'s Trusted Execution Environment (TEE) hardware security module.</string>\n    <string name=\"StrongBoxSupported\">The key is protected by the device\\'s StrongBox SE.</string>\n    <string name=\"UnknownSecurityHardwareSupported\">The key is protected by the device\\'s hardware security module.</string>\n    <string name=\"SecuritySoftwareSupported\">The key is protected by the Android Keystore.</string>\n    <string name=\"testGitHubToken\">Save and Test GitHub PAT Validity</string>\n    <string name=\"testZhipuToken\">Save and Test Zhipu AI MaaS Platform Token Validity</string>\n    <string name=\"testZhipuTokenPrompt\">The user is testing connectivity with you. If you receive this message, please use %s language to greet the user warmly and introduce your model name in a brief paragraph.</string>\n    <string name=\"backFromZhipuPlatform\">Zhipu AI MaaS Platform Response Content</string>\n    <string name=\"zhipuTokenSuccess\">Zhipu Token Available</string>\n    <string name=\"zhipuTokenIsNull\">Zhipu Token is empty.</string>\n    <string name=\"githubTokenIsNull\">GitHub PAT is empty.</string>\n    <string name=\"githubTokenSuccess\">GitHub PAT Available</string>\n    <string name=\"githubTokenUnavailable\">GitHub Personal Access Token is unavailable. Please check the validity of your GitHub Personal Access Token.</string>\n    <string name=\"githubTokenUnavailableTitle\">GitHub PAT Unavailable</string>\n    <string name=\"testToken\">Test Token Availability</string>\n    <string name=\"llmIntelligent\">LLM Intelligence</string>\n    <string name=\"aiLLMInference\">LLM Inference</string>\n    <string name=\"qverbowUpdateLogLLMIntelligentDesc\">When an update is detected, the update log will be summarized using LLM Intelligent Summary. You need to enter the Zhipu Token in the Private Token Settings section.</string>\n    <string name=\"qverbowUpdateLogLLMIntelligent\">Update Log Intelligent Summary</string>\n    <string name=\"githubTokenHelperText\">The GitHub Personal Access Token will be used to bypass GitHub REST API rate limits. Enter and save to activate.</string>\n    <string name=\"zhipuTokenHelperText\">By default, only the free model GLM-4-Flash from Zhipu is requested.</string>\n    <string name=\"zhipuTokenIsInvalid\">The provided Token was deemed invalid by the Zhipu AI MaaS Platform Big Model API Java SDK.</string>\n    <string name=\"clickHereToViewTheChangelog\">View Changelog</string>\n    <string name=\"localWeixinVersion\">Local Weixin/WeChat:&#160;</string>\n    <string name=\"weixin\">Weixin</string>\n    <string name=\"localDetailsMMKV\">MMKV</string>\n    <string name=\"localDetailsMMKVDesc\">MMKV is an efficient, small, easy-to-use mobile key-value storage framework used in the WeChat application. It\\'s currently available on Android, iOS/macOS, Windows, POSIX and HarmonyOS NEXT.</string>\n    <string name=\"localDetailsWCDB\">WCDB</string>\n    <string name=\"localDetailsWCDBDesc\">WCDB is an efficient, complete, easy-to-use mobile database framework used in the WeChat application. It\\'s based on SQLite and SQLCipher, and supports five languages: C++, Java, Kotlin, Swift and Objective-C.</string>\n    <string name=\"localDetailsTinker\">Tinker</string>\n    <string name=\"localDetailsTinkerDesc\">Tinker is a hot-fix solution library for Android, it supports dex, library and resources update without reinstalling apk.</string>\n    <string name=\"localDetailsMars\">Mars</string>\n    <string name=\"localDetailsMarsDesc\">Mars is a cross-platform infrastructure component developed by WeChat Mobile Team.</string>\n    <string name=\"localDetailsMatrix\">Matrix</string>\n    <string name=\"localDetailsMatrixDesc\">Matrix is an APM (Application Performance Manage) used in WeChat to monitor, locate and analyse performance problems. It is a plugin style, non-invasive solution and is currently available on iOS, macOS and Android.</string>\n    <string name=\"localWeixinVersionDetails\">Local Weixin/WeChat Version Details</string>\n    <string name=\"localDetailsReactNativeDesc\">React Native brings React\\'s declarative UI framework to iOS and Android. With React Native, you use native UI controls and have full access to the native platform.</string>\n    <string name=\"localDetailsReactNative\">React Native</string>\n    <string name=\"localDetailsTBSDesc\">腾讯浏览服务（Tencent Browsing Service，简称 TBS）属于 PCG 事业群，QQ 浏览器团队。QQ 浏览器作为一个平台化的产品，不论是网页的打开还是文档能力的打开，都需要一个强大的自研引擎做支撑，而引擎研发团队，一直深耕引擎底层技术 10 余年，积累了丰富的业务经验，将引擎技术从产品独立出来为 SDK，并不断演进成一个平台化的引擎产品，成立腾讯浏览服务，为腾讯公司内外产品提供强大的引擎技术支持和技术服务支持，覆盖了近十万家产品接入，并支持数亿级的网页浏览体验。</string>\n    <string name=\"localDetailsTBS\">Tencent Browsing Service</string>\n    <string name=\"biometricLoginTitle\">Verify Your Identity</string>\n    <string name=\"biometricLoginSubtitle\">Verify your identity to proceed.</string>\n    <string name=\"llmInferenceLocalChanges\">App Changes Inference</string>\n    <string name=\"genByAITips\">The content is generated by AI and may contain inaccurate information.</string>\n    <string name=\"llmInferenceLocalChangesDesc\">应用包分析外部应用时可以使用 LLM 推测外部应用与本机应用的功能变更，需要在“私有 Token 管理”填入智谱 Token</string>\n    <string name=\"llmInferenceLocalChangesPrompt\">用户本地已经安装了 %1$s %2$s，今天用户收到了一个 %1$s %3$s 安装包，用户已经得出收到的 %1$s %3$s 安装包的四大组件（activity、service、content provider、broadcast receiver）与权限和用户本地已安装的 %1$s %2$s 之间的差异。请根据用户传入的上述差异的文本，以清晰简洁的 %4$s 语言分析推测该差异可能存在的应用变更，要求：1) 提取核心功能优化和关键问题修复，忽略技术细节 2) 采用 Pangu 格式化文本，确保中英文/数字间自动空格 3) 用连贯段落呈现，严格控制在 300 字内。输出需突出用户感知明显的改进点，使用规范化表述，禁止列表格式且不使用 Markdown。</string>\n    <string name=\"timeout\">Connection Timeout</string>\n    <string name=\"localDetailsSkylineRenderingEngine\">Skyline Rendering Engine</string>\n    <string name=\"localDetailsSkylineRenderingEngineDesc\">为了进一步优化小程序性能，提供更为接近原生的用户体验，微信团队在 WebView 渲染之外新增了一个渲染引擎 Skyline，其使用更精简高效的渲染管线，并带来诸多增强特性，让 Skyline 拥有更接近原生渲染的性能体验。</string>\n    <string name=\"versionNumberFontUseTCloudNumberDesc\">You can adjust the font weight of TCloudNumber font below.</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-es-rES/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<resources>\n    <string name=\"app_name\">QQ 版本列表实用工具</string>\n    <string name=\"appTitle\">QQ 版本列表实用工具</string>\n    <string name=\"shortcutLongLabel\">扫版（维护模式）</string>\n    <string name=\"shortcutShortLabel\">扫版（维护）</string>\n    <string name=\"start\">开始</string>\n    <string name=\"cancel\">取消</string>\n    <string name=\"done\">确定</string>\n    <string name=\"save\">保存</string>\n    <string name=\"installed\">已安装</string>\n    <string name=\"copy\">复制</string>\n    <string name=\"refresh\">刷新</string>\n    <string name=\"agree\">同意</string>\n    <string name=\"disagreeAndExit\">不同意并退出</string>\n    <string name=\"withdrawConsentUA\">撤回同意用户协议</string>\n    <string name=\"withdrawConsentAndExit\">撤回同意并退出</string>\n    <string name=\"userAgreement\">用户协议</string>\n    <string name=\"enumerateVersionsFAB\">扫版（维护模式）</string>\n    <string name=\"enumerateVersionsDialogTitle\">扫版（维护模式）</string>\n    <string name=\"setting\">设置</string>\n    <string name=\"personalization\">个性化</string>\n    <string name=\"about\">关于</string>\n    <string name=\"enumerateVersionsFormatSetting\">扫版直链格式设置</string>\n    <string name=\"getUpdateFromTDSShiplyDistributionPlatform\">TDS 腾讯端服务 Shiply 容器与发布平台更新获取（实验性）</string>\n    <string name=\"getUpdateFromShiplyPlatform\">Shiply 平台更新获取（实验性）</string>\n    <string name=\"acceptedEnumerateVersion\">扫版成功</string>\n    <string name=\"contentReturnedByShiplyPlatform\">Shiply 平台返回内容</string>\n    <string name=\"applicationError\">程序出错</string>\n    <string name=\"additionalActions\">进一步操作</string>\n    <string name=\"shareTo\">分享到</string>\n    <string name=\"jsonDetails\">JSON 详情</string>\n    <string name=\"stableVersion\">正式版</string>\n    <string name=\"previewVersion\">测试版</string>\n    <string name=\"spaceEnumerateVersion\">空格扫版</string>\n    <string name=\"weixinEnumerateVersion\">微信扫版</string>\n    <string name=\"aboutAppName\">QQ 版本列表实用工具 for Android™</string>\n    <string name=\"aboutAuthor\">作者：</string>\n    <string name=\"aboutContributor\">贡献者：</string>\n    <string name=\"version\">版本：</string>\n    <string name=\"aboutSpecialThanksTo\">特别感谢：</string>\n    <string name=\"aboutOpenSourceRepo\">开源仓库：</string>\n    <string name=\"aboutGetUpdate\">获取更新：</string>\n    <string name=\"aboutDescription\">提供 Android QQ 版本列表的查看和对 Android QQ 下载链接的枚举法扫描。</string>\n    <string name=\"copied\">已复制：</string>\n    <string name=\"reatedFileSize\">额定大小：</string>\n    <string name=\"sourceJSON\">源 JSON</string>\n    <string name=\"recommendations\">建议的内容</string>\n    <string name=\"longPressTheVersionCardToViewSourceDetails\">长按版本卡片查看源详情</string>\n    <string name=\"useTheSystemDownloadManagerToTakeOverTheDownloadIntent\">使用系统下载管理器</string>\n    <string name=\"removeMultiplesOf5ForQQPreviewVersions\">解除 QQ 测试版扫版小版本号遵循 5 的倍数限制</string>\n    <string name=\"longPressToViewSourceDetailsIsDisabled\">未开启长按查看源详情功能，请前往设置开启</string>\n    <string name=\"currentSizeVsLargestHistoricalPackage\">占比历史最大包（%s）：</string>\n    <string name=\"extendTheSuffixForDirectDownloadLinksOfEnumeratedPreviewVersions\">扩展测试版扫版直链后缀</string>\n    <string name=\"fileSize\">大小：</string>\n    <string name=\"downloadLink\">下载地址：</string>\n    <string name=\"saved\">已保存</string>\n    <string name=\"enumQQPreviewWarning\">鉴于 QQ 测试版可能存在不可预知的稳定性问题，您在下载及使用该测试版本之前，必须明确并确保自身具备足够的风险识别和承受能力。根据相关条款，您使用本软件时应当已了解并同意，因下载或使用 QQ 测试版而可能产生的任何直接或间接损失、损害以及其他不利后果，均由您自行承担全部责任。</string>\n    <string name=\"enumQQMajorVersionHelpText\">填写格式为 x.y.z</string>\n    <string name=\"enumWeixinMajorVersionHelpText\">无需填写小数点</string>\n    <string name=\"enumWeixinWarning\">微信扫版功能为 QQ 版本列表实用工具附带的实验性功能，可能存在不可预知的稳定性问题。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"enumHasBeenStopped\">已停止扫描</string>\n    <string name=\"missingCipherWarning\">TDS 腾讯端服务 Shiply 容器与发布平台返回 JSON 内容中未包含“cipher_text”键值对。</string>\n    <string name=\"missingMajorVersionWarning\">扫版需要填写主版本号，否则无法执行扫版。</string>\n    <string name=\"missingQQPreviewMinorVersionWarning\">测试版扫版（含空格扫版）需要填写小版本号，否则无法扫描测试版。</string>\n    <string name=\"QQPreviewMinorNot5Warning\">小版本号需填写 5 的倍数。如需解除此限制，请前往设置进行解除。</string>\n    <string name=\"missingWeixinTrueVersionWarning\">微信扫版需要填写真实版本号，否则无法扫描微信版本。</string>\n    <string name=\"missingWeixin16CodeWarning\">微信扫版需要填写十六进制代码，否则无法扫描微信版本。</string>\n    <string name=\"enumeratingDownloadLink\">正在扫描下载地址：</string>\n    <string name=\"majorVersion\">主版本号</string>\n    <string name=\"initialMinorVersion\">起始小版本号</string>\n    <string name=\"hexadecimalCode\">十六进制代码</string>\n    <string name=\"initialMinorVersionHelpText\">填写起始扫描小版本号，扫正式版时无需填写</string>\n    <string name=\"hexadecimalCodeHelpText\">填写十六进制代码，仅微信扫版使用</string>\n    <string name=\"enumType\">扫版类型</string>\n    <string name=\"enumTypeHelpText\">指定扫版目标类型</string>\n    <string name=\"trueVersion\">真实版本号</string>\n    <string name=\"trueVersionHelpText\">填写真实版本号（版本码），仅微信扫版使用</string>\n    <string name=\"appidOptional\">appid（非必填）</string>\n    <string name=\"shiplyGeneralOptionalHelpText\">默认值：</string>\n    <string name=\"shiplyVersion\">版本</string>\n    <string name=\"shiplyVersionHelpText\">填写用于请求 Shiply 平台的 Android QQ/TIM 版本号</string>\n    <string name=\"uinHelpText\">填写用于请求 Shiply 平台的对象 QQ 号</string>\n    <string name=\"shiplyWarning\">腾讯 QQ/TIM 使用 TDS 腾讯端服务 Shiply 容器与发布平台，根据 QQ 号（uin）及其终端信息分发小范围灰度测试安装包。此功能并非每次请求都能成功获取到更新数据，无法获取更新数据则表示填写的参数不在 Shiply 平台认可与分发范围内。QQ 版本列表实用工具不对此功能及其任何后果作出任何可靠性保证。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"defaultDisplayOfFirstListItemDetails\">首项卡片默认显示详情</string>\n    <string name=\"versionNumberFontUseTCloudNumber\">使用腾讯云数字字体</string>\n    <string name=\"versionCardsDisplaysPackageSizeIndicator\">显示额定包大小占比历史最大包指示条</string>\n    <string name=\"customVersionEnumSuffix\">自定义扫版后缀</string>\n    <string name=\"customVersionEnumSuffixHelpText\">请使用“, ”（西文逗号+空格）分割</string>\n    <string name=\"facilitateI18n\">协助翻译：</string>\n    <string name=\"versionCardExpandButtonContentDescription\">展开详情</string>\n    <string name=\"versionCardCollapseButtonContentDescription\">收起详情</string>\n    <string name=\"shiplyAdvancedConfigurations\">进阶配置</string>\n    <string name=\"shiplyOsVersionOptional\">osVersion（非必填）</string>\n    <string name=\"shiplySdkVersionOptional\">sdkVersion（非必填）</string>\n    <string name=\"shiplyModelOptional\">model（非必填）</string>\n    <string name=\"shiplyLanguageOptional\">language（非必填）</string>\n    <string name=\"thicknessFollowSystem\">跟随系统</string>\n    <string name=\"back\">返回</string>\n    <string name=\"shiplyUseAdvancedConfigurations\">使用进阶配置</string>\n    <string name=\"localQQVersion\">本机 QQ：</string>\n    <string name=\"bracket\">（%s）</string>\n    <string name=\"localTIMVersion\">本机 TIM：</string>\n    <string name=\"localQQVersionDetails\">本机 QQ 版本详情</string>\n    <string name=\"localTIMVersionDetails\">本机 TIM 版本详情</string>\n    <string name=\"accessibilityTag\">6IW+6K6vIFFRIOW3suS4iue6v+S4gOmhueaXoOmanOeijeeUqOaIt+S4k+WxnuS8mOWMluaOquaWveabtOaWsOOAguenu+WKqOe7iOerr+iuvuWkh+W8gOWQr+ezu+e7n+aXoOmanOeijeivu+Wxj+acjeWKoe+8iOWmgiBBbmRyb2lkIFRhbGtiYWNr44CBaU9TIFZvaWNlT3Zlcu+8ie+8jOW5tuWQjOaXtuS9v+eUqOiFvuiuryBRUSDnp7vliqjlrqLmiLfnq68gOS4wLjg1IOWPiuS7peS4iueJiOacrOaXtu+8jOiFvuiuryBRUSDlsIblh4/lsJHmiJblgZzmraLlkJHmraTnsbsgUVEg5a6i5oi356uv5LiL5Y+R5bm/5ZGK44CC</string>\n    <string name=\"imageGallery\">应用宣传图</string>\n    <string name=\"share\">分享</string>\n    <string name=\"download\">下载</string>\n    <string name=\"stop\">停止</string>\n    <string name=\"skip\">跳过</string>\n    <string name=\"qqntTag\">基于 QQNT 技术架构</string>\n    <string name=\"releaseDateTIM\">发布日期：</string>\n    <string name=\"checkUpdateViaGitHubAPI\">使用 GitHub REST API 检查更新</string>\n    <string name=\"noUpdatesDetected\">未检测到更新</string>\n    <string name=\"noAssetsDetected\">未检测到资产文件</string>\n    <string name=\"cannotGetGitHub\">无法连接到 GitHub，请确保您所在网络环境可以访问 GitHub。</string>\n    <string name=\"updateQverbowAvailable\">更新可用</string>\n    <string name=\"copyLink\">复制链接</string>\n    <string name=\"unrealEngineTag\">内置虚幻引擎</string>\n    <string name=\"autoCheckForUpdates\">启动时检查更新</string>\n    <string name=\"useQQ8958Test\">使用 QQ 8.9.58 测试版直链格式</string>\n    <string name=\"ciVersionNoSupportUpdates\">CI 构建版本不支持检查更新</string>\n    <string name=\"showUnrealEngineTag\">显示虚幻引擎标识</string>\n    <string name=\"suffixSetting\">后缀设置</string>\n    <string name=\"others\">其它</string>\n    <string name=\"ok\">好</string>\n    <string name=\"swipeLeftToSeeMore\">向左滑动查看更多</string>\n    <string name=\"getUpdateFromTencentAppStore\">腾讯应用宝更新获取（实验性）</string>\n    <string name=\"experimentalFeatures\">实验性功能</string>\n    <string name=\"getQQLinkFromTencentAppStore\">获取 QQ 下载直链</string>\n    <string name=\"getTIMLinkFromTencentAppStore\">获取 TIM 下载直链</string>\n    <string name=\"getWeixinLinkFromTencentAppStore\">获取微信下载直链</string>\n    <string name=\"getWeComLinkFromTencentAppStore\">获取企业微信下载直链</string>\n    <string name=\"contentReturnedByTencentAppStore\">腾讯应用宝返回内容</string>\n    <string name=\"getWeTypeLinkFromTencentAppStore\">获取微信输入法下载直链</string>\n    <string name=\"tencentAppStoreWarning\">腾讯应用宝更新获取功能为 QQ 版本列表实用工具附带的实验性功能，可能存在不可预知的稳定性问题。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"showOldLoading\">扫版对话框使用旧版加载动画</string>\n    <string name=\"versionCardsDisplaysPackageSizeText\">显示额定包大小占比历史最大包百分比</string>\n    <string name=\"timVersion\">TIM 扫版</string>\n    <string name=\"enumTIMWarning\">TIM 扫版功能为 QQ 版本列表实用工具附带的实验性功能，可能存在不可预知的稳定性问题。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"useQQ9008_14600Test\">扫版类型添加 QQ 9.0.8.14600 空格直链格式</string>\n    <string name=\"initFirebaseService\">初始化 Firebase 服务</string>\n    <string name=\"enablingFirebaseServiceWarning\">初始化 Firebase 服务后，将立即在本地由 Firebase SDK 生成注册令牌，并将标识符和配置数据上传到 Firebase 服务器。此操作一经启用即无法撤销，是否继续？</string>\n    <string name=\"rainbow_notification_channel_id\">版本列表更新</string>\n    <string name=\"cannotFindGooglePlayServices\">未在当前设备检测到 Google Play 服务，因此无法在当前设备中使用由 Firebase 提供的服务。</string>\n    <string name=\"rainbow_notification_channel_title\">版本列表更新</string>\n    <string name=\"rainbow_notification_channel_description\">通过 Firebase 云消息传递</string>\n    <string name=\"enablingFirebaseServiceInsights\">启用 Firebase 服务可使用以下功能：\\n- 通过 Firebase 云消息传递的版本列表更新提醒</string>\n    <string name=\"enablingFirebaseServiceWarning2\">Firebase 云消息传递绑定了 Google Analytics 分析服务，使用 Firebase 云消息传递将不可避免地上传您在此软件的活跃信息。</string>\n    <string name=\"continueKey\">继续</string>\n    <string name=\"initializedFirebaseService\">Firebase 服务已初始化，无法撤销</string>\n    <string name=\"cannotEnableFirebaseCloudMessaging\">接收版本列表更新通知提醒必须打开系统通知权限，否则无法接收版本列表更新提醒。</string>\n    <string name=\"pushSystemNotificationsWhenVersionListUpdates\">版本列表更新时推送系统通知</string>\n    <string name=\"unsubscribeTimeout\">取消订阅超时</string>\n    <string name=\"unsubscribeSuccess\">取消订阅成功</string>\n    <string name=\"unsubscribeFailed\">取消订阅失败</string>\n    <string name=\"subscribeTimeout\">订阅超时</string>\n    <string name=\"subscribeSuccess\">订阅成功</string>\n    <string name=\"subscribeFailed\">订阅失败</string>\n    <string name=\"initializedFirebaseServiceItem\">Firebase 服务已初始化</string>\n    <string name=\"toSystemSetting\">前往系统设置</string>\n    <string name=\"threePartySharedList\">个人信息第三方共享清单</string>\n    <string name=\"shiplyTargetApp\">目标应用</string>\n    <string name=\"shiplyTargetAppQQ\">QQ</string>\n    <string name=\"shiplyTargetAppTIM\">TIM</string>\n    <string name=\"shiplyTargetHelper\">指定请求 Shiply 平台的目标应用</string>\n    <string name=\"openSourceLicenseTitle\">开放源代码许可</string>\n    <string name=\"basedOnQQVer\">基于 Android QQ %s 二次开发</string>\n    <string name=\"getQidianLinkFromTencentAppStore\">获取腾讯企点下载直链</string>\n    <string name=\"getWeixinAlphaLinkFromWeixinConfigDesc\">从腾讯服务器配置拉取微信最新测试版下载直链</string>\n    <string name=\"successInGetting\">获取成功</string>\n    <string name=\"getWeixinAlphaConfig404\">似乎未成功访问腾讯服务器配置文件，可能是微信当前没有测试版或测试版已撤包。</string>\n    <string name=\"getWeixinAlphaConfigLink404\">似乎未成功访问此下载地址，可能是微信当前测试版已撤包。</string>\n    <string name=\"suspectedPackageWithdrawal\">疑似撤包</string>\n    <string name=\"colon\">：</string>\n    <string name=\"qverbowHash\">杂凑值校验</string>\n    <string name=\"verifyHashValueViaGitHubAPI\">通过 GitHub REST API 校验杂凑值</string>\n    <string name=\"hashIsTrue\">杂凑值与 GitHub Releases 一致</string>\n    <string name=\"hashIsFalse\">您所使用的版本与 GitHub Releases 杂凑值不一致，为了您的安全，请尽快卸载当前版本应用并前往官方 GitHub Releases 下载此软件。</string>\n    <string name=\"toGitHubRelease\">前往下载</string>\n    <string name=\"getWeTypeTestLinkFromWeTypeLatestChannelDesc\">从微信输入法测试通道获取微信输入法最新下载直链</string>\n    <string name=\"getWeTypeLatestChannel404\">未成功访问微信输入法服务器，请检查您的网络连接。</string>\n    <string name=\"kuiklyTag\">存在 TDS 腾讯端服务 Kuikly 开发框架</string>\n    <string name=\"showKuiklyTag\">显示 Kuikly 开发框架标识</string>\n    <string name=\"getWeTypeTestLinkFromWeTypeLatestChannel\">获取微信输入法测试版</string>\n    <string name=\"getWeixinAlphaLinkFromWeixinConfig\">获取微信测试版</string>\n    <string name=\"autoCheckForUpdatesDesc\">每次启动时将通过 GitHub REST API 检查一次更新</string>\n    <string name=\"useTheSystemDownloadManagerToTakeOverTheDownloadIntentDesc\">开启后，软件全局触发下载意图时将不再打开浏览器</string>\n    <string name=\"showKuiklyTagDesc\">Kuikly 内置情况以 QQ 正式版为判断来源</string>\n    <string name=\"versionCardsDisplaysPackageSizeDesc\">仅对 QQ 版本卡片生效</string>\n    <string name=\"aboutVersionCards\">版本列表与卡片</string>\n    <string name=\"showUnrealEngineTagDesc\">虚幻引擎内置情况以 QQ 正式版为判断来源</string>\n    <string name=\"general\">通用</string>\n    <string name=\"copyAll\">复制全部</string>\n    <string name=\"enumVerMaintenanceModeWarning\">扫版功能已进入维护模式。您仍可以继续使用现有扫版功能，但 QQ 版本列表实用工具不再对相关功能及其任何后果作出任何可靠性保证，不再对相关功能进行积极开发，也不再接受相关新功能请求。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"localDetailsQQNT\">QQNT 技术架构</string>\n    <string name=\"localDetailsBugly\">Bugly 端质量监控平台</string>\n    <string name=\"localDetailsShiply\">Shiply 容器与发布平台</string>\n    <string name=\"localDetailsHippy\">Hippy 跨端开发框架</string>\n    <string name=\"localDetailsKuikly\">Kuikly 跨端开发框架</string>\n    <string name=\"localDetailsRightly\">Rightly 应用合规解决方案</string>\n    <string name=\"localDetailsUELibrary\">Unreal Engine as a Library</string>\n    <string name=\"localDetailsUELibraryDesc\">Unreal Engine as a Library 会将虚幻引擎的功能重新打包成一个库，以便其他应用程序生成和控制它们自己的 UE 实例。UELibrary 提供了一种简单、不依赖于平台的 API 来驱动 UE。</string>\n    <string name=\"localDetailsBuglyDesc\">Bugly 是 TDS 腾讯端服务（Tencent Device-oriented Service）旗下的端质量监控平台，通过采集、监控、定位、告警等核心能力，提供专业的质量监控服务，帮助开发者及时发现并解决质量问题，打造高质量应用。</string>\n    <string name=\"localDetailsShiplyDesc\">Shiply，全称 TDS 腾讯端服务 Shiply 容器与发布，属于 TDS 腾讯端服务系列产品的子产品之一，是源于腾讯内部 App 的一站式容器与发布解决方案。Shiply 提供了一套规则灵活、发布安全、高效分发的终端基础通用发布系统，功能包括：配置与开关、资源发布、应用升级，移动端热修复、Flutter 动态化、跨端开发框架等相关能力和分发支持，帮助产品和技术团队提高研效能力和决策力。</string>\n    <string name=\"localDetailsHippyDesc\">Hippy 是 TDF 腾讯端框架（Tencent Device-oriented Framework）下的开源跨平台应用开发解决方案。Hippy 从底层做了大量工作，抹平了 iOS、Android、OpenHarmony 三端差异，提供了接近 Web 的开发体验，目前上层支持了 React 和 Vue 两套界面框架，前端开发人员可以通过它，将前端代码转换为终端的原生指令，进行原生终端 APP 的开发。同时，Hippy 从底层进行了大量优化，在启动速度、渲染性能、动画速度、内存占用、包体积等方面都提供了业内顶尖的性能表现。</string>\n    <string name=\"localDetailsRightlyDesc\">Rightly 是面向移动端的全流程合规解决方案，集「合规管控」和「合规测评」为一体，为 APP 提供运行全周期数据安全与合规保护解决方案，也为 APP 提供个人信息风险审查与合规性检测服务，覆盖多项隐私安全指标。Rightly 能够助力业务提高合规效率，降低违规风险。</string>\n    <string name=\"localDetailsKuiklyDesc\">Kuikly（Kotlin UI Kit）跨端开发框架，是 TDF 腾讯端框架（Tencent Device-oriented Framework）的一部分。Kuikly 通过自研 Kotlin Multiplatform 逻辑与终端界面原生控件渲染映射协议层，并采用声明式与响应式设计，使采用 Kuikly 的 Kotlin 开发者能拥有原生高效的 Android 开发体验并构建具有原生性能的跨平台应用。Kuikly 更可依托于 TDS 腾讯端服务 Shiply 容器与发布平台，实现按页颗粒度的完备客户端界面动态化能力。</string>\n    <string name=\"localDetailsQQNTDesc\">QQNT 技术架构是腾讯 QQ 客户端全新的跨平台技术架构体系。QQNT 技术架构将 QQ 客户端核心功能——如核心登录、消息系统、关系链、富媒体、长连接、数据库等——下沉至 QQNT 内核层，使用 C++ 抽象逻辑封装为原生库并提供多平台多语言一致性接口，以实现 QQ 客户端核心逻辑代码跨平台与程序高性能运作。</string>\n    <string name=\"localDetailsMsg\">详细信息</string>\n    <string name=\"stackInfo\">技术栈信息</string>\n    <string name=\"details\">详情</string>\n    <string name=\"thisVerContains\">此版本包含 %s</string>\n    <string name=\"packageNameIsErr\">应用包名与预设不匹配</string>\n    <string name=\"useNewLocalDetailsPage\">使用新版本机应用详情页</string>\n    <string name=\"fileErr\">文件类型错误</string>\n    <string name=\"apkAnalyze\">应用包分析</string>\n    <string name=\"unknownErr\">未知错误</string>\n    <string name=\"notEnoughSpaceOnTheDevice\">设备剩余空间不足</string>\n    <string name=\"localDetailsTencentBeacon\">腾讯灯塔</string>\n    <string name=\"localDetailsTencentBeaconDesc\">腾讯灯塔全场景大数据分析套件，是腾讯 50+ 业务自 2018 年以来使用数据中台演化而成，支持每日数十亿条数据资产的全面管理，数千业务员工深度依赖的整体化工具套件。</string>\n    <string name=\"haveNotAgreeUA\">未同意用户协议，无法使用本软件</string>\n    <string name=\"localDetailsFlutter\">Flutter</string>\n    <string name=\"localDetailsFlutterDesc\">Flutter 是 Google 的便携式 UI 工具包，帮助你在移动、web、桌面端创造高质量的绝妙原生体验的应用。 Flutter 可以和世界上的开发人员和开发组织广泛使用的那些现存代码一起使用，并且是开源的、免费的。</string>\n    <string name=\"localDetailsJetpackCompose\">Jetpack Compose</string>\n    <string name=\"localDetailsJetpackComposeDesc\">Jetpack Compose es un kit de herramientas moderno para crear IU nativas de Android. Jetpack Compose simplifica y acelera el desarrollo de IU en Android con menos código, herramientas potentes y API intuitivas de Kotlin. </string>\n    <string name=\"localDetailsComposeMultiplatform\">Compose Multiplatform</string>\n    <string name=\"localDetailsComposeMultiplatformDesc\">Compose Multiplatform 是一个由 JetBrains 开发的现代化声明式和响应式 UI 框架，它提供了一种只需少量 Kotlin 代码即可构建用户界面的简单方法。它还允许您只需编写一次用户界面，即可在任何支持的平台——iOS、Android、桌面（Windows、macOS、Linux）和 Web——上运行。</string>\n    <string name=\"security\">安全</string>\n    <string name=\"privateTokenSettings\">私有 Token 管理</string>\n    <string name=\"privateTokenSettingsDesc\">此处内填入的 Token 将由 Android 密钥库系统安全加密后存储</string>\n    <string name=\"zhipuAIMaaSPlatformToken\">智谱 AI 开放平台 Token</string>\n    <string name=\"updateLogPrompt\">请根据用户传入的更新日志文本，以清晰简洁的 %s 语言对更新日志文本进行专业总结，要求：1) 提取核心功能优化和关键问题修复，忽略技术细节 2) 采用 Pangu 格式化文本，确保中英文/数字间自动空格 3) 完全避免产品名称及主观评价 4) 用连贯段落呈现，严格控制在 150 字内。输出需突出用户感知明显的改进点，使用规范化表述，禁止列表格式且不使用 Markdown。</string>\n    <string name=\"githubPersonalAccessToken\">GitHub 个人访问令牌</string>\n    <string name=\"TEESupported\">密钥由设备可信执行环境（TEE）安全硬件提供保护</string>\n    <string name=\"StrongBoxSupported\">密钥由设备 StrongBox 安全元件提供保护</string>\n    <string name=\"UnknownSecurityHardwareSupported\">密钥由设备安全硬件提供保护</string>\n    <string name=\"SecuritySoftwareSupported\">密钥由 Android 密钥库提供保护</string>\n    <string name=\"testGitHubToken\">保存并联网测试 GitHub 个人访问令牌可用性</string>\n    <string name=\"testZhipuToken\">保存并联网测试智谱 AI 开放平台 Token 可用性</string>\n    <string name=\"testZhipuTokenPrompt\">用户正在测试与您的连通性。如果您收到了这句话，请使用 %s 语言热情地与用户打招呼并用一段话详细介绍自己的模型名称。</string>\n    <string name=\"backFromZhipuPlatform\">智谱 AI 开放平台返回内容</string>\n    <string name=\"zhipuTokenSuccess\">智谱 Token 可用</string>\n    <string name=\"zhipuTokenIsNull\">智谱 Token 为空</string>\n    <string name=\"githubTokenIsNull\">GitHub 个人访问令牌为空</string>\n    <string name=\"githubTokenSuccess\">GitHub 个人访问令牌可用</string>\n    <string name=\"githubTokenUnavailable\">GitHub 个人访问令牌不可用，请检查您的 GitHub 个人访问令牌有效性。</string>\n    <string name=\"githubTokenUnavailableTitle\">GitHub 个人访问令牌不可用</string>\n    <string name=\"testToken\">测试 Token 可用性</string>\n    <string name=\"llmIntelligent\">LLM 智能摘要</string>\n    <string name=\"aiLLMInference\">LLM 推理</string>\n    <string name=\"qverbowUpdateLogLLMIntelligentDesc\">检查到更新时将使用 LLM 智能摘要更新日志，需要在“私有 Token 管理”填入智谱 Token</string>\n    <string name=\"qverbowUpdateLogLLMIntelligent\">更新日志智能摘要</string>\n    <string name=\"githubTokenHelperText\">GitHub 个人访问令牌将用于解除 GitHub REST API 访问速率限制，填入并保存即生效</string>\n    <string name=\"zhipuTokenHelperText\">默认仅请求智谱免费模型 GLM-4-Flash</string>\n    <string name=\"zhipuTokenIsInvalid\">填入的 Token 被智谱 AI 开放平台大模型接口 Java SDK 判定无效。</string>\n    <string name=\"clickHereToViewTheChangelog\">点击此处查看更新日志</string>\n    <string name=\"localWeixinVersion\">本机微信：</string>\n    <string name=\"weixin\">Weixin</string>\n    <string name=\"localDetailsMMKV\">MMKV</string>\n    <string name=\"localDetailsMMKVDesc\">MMKV 是微信中的一个高效、小巧、易用的移动的键值对存储框架，可在 Android、iOS/macOS、Windows、POSIX 和 HarmonyOS NEXT 上使用。</string>\n    <string name=\"localDetailsWCDB\">WCDB</string>\n    <string name=\"localDetailsWCDBDesc\">WCDB 是一个易用、高效、完整的移动数据库框架，它基于 SQLite 和 SQLCipher 开发，在微信中应用广泛，且支持在 C++、Java、Kotlin、Swift、Objc 五种语言环境中使用。</string>\n    <string name=\"localDetailsTinker\">Tinker</string>\n    <string name=\"localDetailsTinkerDesc\">Tinker 是微信官方的 Android 热补丁解决方案，它支持动态下发代码、So 库以及资源，让应用能够在不需要重新安装的情况下实现更新。</string>\n    <string name=\"localDetailsMars\">Mars</string>\n    <string name=\"localDetailsMarsDesc\">Mars 是微信官方的跨平台跨业务的终端基础组件。</string>\n    <string name=\"localDetailsMatrix\">Matrix</string>\n    <string name=\"localDetailsMatrixDesc\">Matrix 是一款微信研发并日常使用的应用性能接入框架，支持 iOS, macOS 和 Android。 Matrix 通过接入各种性能监控方案，对性能监控项的异常数据进行采集和分析，输出相应的问题分析、定位与优化建议，从而帮助开发者开发出更高质量的应用。</string>\n    <string name=\"localWeixinVersionDetails\">本机微信版本详情</string>\n    <string name=\"localDetailsReactNativeDesc\">React Native 将 React 的声明式 UI 框架引入 iOS 和 Android。使用 React Native，您可以直接使用原生 UI 控件，并拥有对原生平台的完整访问权限。</string>\n    <string name=\"localDetailsReactNative\">React Native</string>\n    <string name=\"localDetailsTBSDesc\">腾讯浏览服务（Tencent Browsing Service，简称 TBS）属于 PCG 事业群，QQ 浏览器团队。QQ 浏览器作为一个平台化的产品，不论是网页的打开还是文档能力的打开，都需要一个强大的自研引擎做支撑，而引擎研发团队，一直深耕引擎底层技术 10 余年，积累了丰富的业务经验，将引擎技术从产品独立出来为 SDK，并不断演进成一个平台化的引擎产品，成立腾讯浏览服务，为腾讯公司内外产品提供强大的引擎技术支持和技术服务支持，覆盖了近十万家产品接入，并支持数亿级的网页浏览体验。</string>\n    <string name=\"localDetailsTBS\">腾讯浏览服务</string>\n    <string name=\"biometricLoginTitle\">验证您的身份</string>\n    <string name=\"biometricLoginSubtitle\">验证您的身份以进一步操作</string>\n    <string name=\"llmInferenceLocalChanges\">应用更改推测</string>\n    <string name=\"genByAITips\">内容由 AI 生成，可能存在不准确的信息。</string>\n    <string name=\"llmInferenceLocalChangesDesc\">应用包分析外部应用时可以使用 LLM 推测外部应用与本机应用的功能变更，需要在“私有 Token 管理”填入智谱 Token</string>\n    <string name=\"llmInferenceLocalChangesPrompt\">用户本地已经安装了 %1$s %2$s，今天用户收到了一个 %1$s %3$s 安装包，用户已经得出收到的 %1$s %3$s 安装包的四大组件（activity、service、content provider、broadcast receiver）与权限和用户本地已安装的 %1$s %2$s 之间的差异。请根据用户传入的上述差异的文本，以清晰简洁的 %4$s 语言分析推测该差异可能存在的应用变更，要求：1) 提取核心功能优化和关键问题修复，忽略技术细节 2) 采用 Pangu 格式化文本，确保中英文/数字间自动空格 3) 用连贯段落呈现，严格控制在 300 字内。输出需突出用户感知明显的改进点，使用规范化表述，禁止列表格式且不使用 Markdown。</string>\n    <string name=\"timeout\">连接超时</string>\n    <string name=\"localDetailsSkylineRenderingEngine\">Skyline 渲染引擎</string>\n    <string name=\"localDetailsSkylineRenderingEngineDesc\">为了进一步优化小程序性能，提供更为接近原生的用户体验，微信团队在 WebView 渲染之外新增了一个渲染引擎 Skyline，其使用更精简高效的渲染管线，并带来诸多增强特性，让 Skyline 拥有更接近原生渲染的性能体验。</string>\n    <string name=\"versionNumberFontUseTCloudNumberDesc\">可在下方调整腾讯云数字字体字重</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-fr-rFR/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<resources>\n    <string name=\"app_name\">QQ 版本列表实用工具</string>\n    <string name=\"appTitle\">QQ 版本列表实用工具</string>\n    <string name=\"shortcutLongLabel\">扫版（维护模式）</string>\n    <string name=\"shortcutShortLabel\">扫版（维护）</string>\n    <string name=\"start\">开始</string>\n    <string name=\"cancel\">取消</string>\n    <string name=\"done\">确定</string>\n    <string name=\"save\">保存</string>\n    <string name=\"installed\">已安装</string>\n    <string name=\"copy\">Copier</string>\n    <string name=\"refresh\">刷新</string>\n    <string name=\"agree\">同意</string>\n    <string name=\"disagreeAndExit\">不同意并退出</string>\n    <string name=\"withdrawConsentUA\">撤回同意用户协议</string>\n    <string name=\"withdrawConsentAndExit\">撤回同意并退出</string>\n    <string name=\"userAgreement\">用户协议</string>\n    <string name=\"enumerateVersionsFAB\">扫版（维护模式）</string>\n    <string name=\"enumerateVersionsDialogTitle\">扫版（维护模式）</string>\n    <string name=\"setting\">设置</string>\n    <string name=\"personalization\">个性化</string>\n    <string name=\"about\">关于</string>\n    <string name=\"enumerateVersionsFormatSetting\">扫版直链格式设置</string>\n    <string name=\"getUpdateFromTDSShiplyDistributionPlatform\">TDS 腾讯端服务 Shiply 容器与发布平台更新获取（实验性）</string>\n    <string name=\"getUpdateFromShiplyPlatform\">Shiply 平台更新获取（实验性）</string>\n    <string name=\"acceptedEnumerateVersion\">扫版成功</string>\n    <string name=\"contentReturnedByShiplyPlatform\">Shiply 平台返回内容</string>\n    <string name=\"applicationError\">程序出错</string>\n    <string name=\"additionalActions\">进一步操作</string>\n    <string name=\"shareTo\">分享到</string>\n    <string name=\"jsonDetails\">JSON 详情</string>\n    <string name=\"stableVersion\">正式版</string>\n    <string name=\"previewVersion\">测试版</string>\n    <string name=\"spaceEnumerateVersion\">空格扫版</string>\n    <string name=\"weixinEnumerateVersion\">微信扫版</string>\n    <string name=\"aboutAppName\">QQ 版本列表实用工具 for Android™</string>\n    <string name=\"aboutAuthor\">作者：</string>\n    <string name=\"aboutContributor\">贡献者：</string>\n    <string name=\"version\">版本：</string>\n    <string name=\"aboutSpecialThanksTo\">特别感谢：</string>\n    <string name=\"aboutOpenSourceRepo\">开源仓库：</string>\n    <string name=\"aboutGetUpdate\">获取更新：</string>\n    <string name=\"aboutDescription\">提供 Android QQ 版本列表的查看和对 Android QQ 下载链接的枚举法扫描。</string>\n    <string name=\"copied\">已复制：</string>\n    <string name=\"reatedFileSize\">额定大小：</string>\n    <string name=\"sourceJSON\">源 JSON</string>\n    <string name=\"recommendations\">建议的内容</string>\n    <string name=\"longPressTheVersionCardToViewSourceDetails\">长按版本卡片查看源详情</string>\n    <string name=\"useTheSystemDownloadManagerToTakeOverTheDownloadIntent\">使用系统下载管理器</string>\n    <string name=\"removeMultiplesOf5ForQQPreviewVersions\">解除 QQ 测试版扫版小版本号遵循 5 的倍数限制</string>\n    <string name=\"longPressToViewSourceDetailsIsDisabled\">未开启长按查看源详情功能，请前往设置开启</string>\n    <string name=\"currentSizeVsLargestHistoricalPackage\">占比历史最大包（%s）：</string>\n    <string name=\"extendTheSuffixForDirectDownloadLinksOfEnumeratedPreviewVersions\">扩展测试版扫版直链后缀</string>\n    <string name=\"fileSize\">大小：</string>\n    <string name=\"downloadLink\">下载地址：</string>\n    <string name=\"saved\">已保存</string>\n    <string name=\"enumQQPreviewWarning\">鉴于 QQ 测试版可能存在不可预知的稳定性问题，您在下载及使用该测试版本之前，必须明确并确保自身具备足够的风险识别和承受能力。根据相关条款，您使用本软件时应当已了解并同意，因下载或使用 QQ 测试版而可能产生的任何直接或间接损失、损害以及其他不利后果，均由您自行承担全部责任。</string>\n    <string name=\"enumQQMajorVersionHelpText\">填写格式为 x.y.z</string>\n    <string name=\"enumWeixinMajorVersionHelpText\">无需填写小数点</string>\n    <string name=\"enumWeixinWarning\">微信扫版功能为 QQ 版本列表实用工具附带的实验性功能，可能存在不可预知的稳定性问题。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"enumHasBeenStopped\">已停止扫描</string>\n    <string name=\"missingCipherWarning\">TDS 腾讯端服务 Shiply 容器与发布平台返回 JSON 内容中未包含“cipher_text”键值对。</string>\n    <string name=\"missingMajorVersionWarning\">扫版需要填写主版本号，否则无法执行扫版。</string>\n    <string name=\"missingQQPreviewMinorVersionWarning\">测试版扫版（含空格扫版）需要填写小版本号，否则无法扫描测试版。</string>\n    <string name=\"QQPreviewMinorNot5Warning\">小版本号需填写 5 的倍数。如需解除此限制，请前往设置进行解除。</string>\n    <string name=\"missingWeixinTrueVersionWarning\">微信扫版需要填写真实版本号，否则无法扫描微信版本。</string>\n    <string name=\"missingWeixin16CodeWarning\">微信扫版需要填写十六进制代码，否则无法扫描微信版本。</string>\n    <string name=\"enumeratingDownloadLink\">正在扫描下载地址：</string>\n    <string name=\"majorVersion\">主版本号</string>\n    <string name=\"initialMinorVersion\">起始小版本号</string>\n    <string name=\"hexadecimalCode\">十六进制代码</string>\n    <string name=\"initialMinorVersionHelpText\">填写起始扫描小版本号，扫正式版时无需填写</string>\n    <string name=\"hexadecimalCodeHelpText\">填写十六进制代码，仅微信扫版使用</string>\n    <string name=\"enumType\">扫版类型</string>\n    <string name=\"enumTypeHelpText\">指定扫版目标类型</string>\n    <string name=\"trueVersion\">真实版本号</string>\n    <string name=\"trueVersionHelpText\">填写真实版本号（版本码），仅微信扫版使用</string>\n    <string name=\"appidOptional\">appid（非必填）</string>\n    <string name=\"shiplyGeneralOptionalHelpText\">默认值：</string>\n    <string name=\"shiplyVersion\">版本</string>\n    <string name=\"shiplyVersionHelpText\">填写用于请求 Shiply 平台的 Android QQ/TIM 版本号</string>\n    <string name=\"uinHelpText\">填写用于请求 Shiply 平台的对象 QQ 号</string>\n    <string name=\"shiplyWarning\">腾讯 QQ/TIM 使用 TDS 腾讯端服务 Shiply 容器与发布平台，根据 QQ 号（uin）及其终端信息分发小范围灰度测试安装包。此功能并非每次请求都能成功获取到更新数据，无法获取更新数据则表示填写的参数不在 Shiply 平台认可与分发范围内。QQ 版本列表实用工具不对此功能及其任何后果作出任何可靠性保证。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"defaultDisplayOfFirstListItemDetails\">首项卡片默认显示详情</string>\n    <string name=\"versionNumberFontUseTCloudNumber\">使用腾讯云数字字体</string>\n    <string name=\"versionCardsDisplaysPackageSizeIndicator\">显示额定包大小占比历史最大包指示条</string>\n    <string name=\"customVersionEnumSuffix\">自定义扫版后缀</string>\n    <string name=\"customVersionEnumSuffixHelpText\">请使用“, ”（西文逗号+空格）分割</string>\n    <string name=\"facilitateI18n\">协助翻译：</string>\n    <string name=\"versionCardExpandButtonContentDescription\">展开详情</string>\n    <string name=\"versionCardCollapseButtonContentDescription\">收起详情</string>\n    <string name=\"shiplyAdvancedConfigurations\">进阶配置</string>\n    <string name=\"shiplyOsVersionOptional\">osVersion（非必填）</string>\n    <string name=\"shiplySdkVersionOptional\">sdkVersion（非必填）</string>\n    <string name=\"shiplyModelOptional\">model（非必填）</string>\n    <string name=\"shiplyLanguageOptional\">language（非必填）</string>\n    <string name=\"thicknessFollowSystem\">跟随系统</string>\n    <string name=\"back\">返回</string>\n    <string name=\"shiplyUseAdvancedConfigurations\">使用进阶配置</string>\n    <string name=\"localQQVersion\">本机 QQ：</string>\n    <string name=\"bracket\">（%s）</string>\n    <string name=\"localTIMVersion\">本机 TIM：</string>\n    <string name=\"localQQVersionDetails\">本机 QQ 版本详情</string>\n    <string name=\"localTIMVersionDetails\">本机 TIM 版本详情</string>\n    <string name=\"accessibilityTag\">6IW+6K6vIFFRIOW3suS4iue6v+S4gOmhueaXoOmanOeijeeUqOaIt+S4k+WxnuS8mOWMluaOquaWveabtOaWsOOAguenu+WKqOe7iOerr+iuvuWkh+W8gOWQr+ezu+e7n+aXoOmanOeijeivu+Wxj+acjeWKoe+8iOWmgiBBbmRyb2lkIFRhbGtiYWNr44CBaU9TIFZvaWNlT3Zlcu+8ie+8jOW5tuWQjOaXtuS9v+eUqOiFvuiuryBRUSDnp7vliqjlrqLmiLfnq68gOS4wLjg1IOWPiuS7peS4iueJiOacrOaXtu+8jOiFvuiuryBRUSDlsIblh4/lsJHmiJblgZzmraLlkJHmraTnsbsgUVEg5a6i5oi356uv5LiL5Y+R5bm/5ZGK44CC</string>\n    <string name=\"imageGallery\">应用宣传图</string>\n    <string name=\"share\">分享</string>\n    <string name=\"download\">下载</string>\n    <string name=\"stop\">停止</string>\n    <string name=\"skip\">跳过</string>\n    <string name=\"qqntTag\">基于 QQNT 技术架构</string>\n    <string name=\"releaseDateTIM\">发布日期：</string>\n    <string name=\"checkUpdateViaGitHubAPI\">使用 GitHub REST API 检查更新</string>\n    <string name=\"noUpdatesDetected\">未检测到更新</string>\n    <string name=\"noAssetsDetected\">未检测到资产文件</string>\n    <string name=\"cannotGetGitHub\">无法连接到 GitHub，请确保您所在网络环境可以访问 GitHub。</string>\n    <string name=\"updateQverbowAvailable\">更新可用</string>\n    <string name=\"copyLink\">复制链接</string>\n    <string name=\"unrealEngineTag\">内置虚幻引擎</string>\n    <string name=\"autoCheckForUpdates\">启动时检查更新</string>\n    <string name=\"useQQ8958Test\">使用 QQ 8.9.58 测试版直链格式</string>\n    <string name=\"ciVersionNoSupportUpdates\">CI 构建版本不支持检查更新</string>\n    <string name=\"showUnrealEngineTag\">显示虚幻引擎标识</string>\n    <string name=\"suffixSetting\">后缀设置</string>\n    <string name=\"others\">其它</string>\n    <string name=\"ok\">好</string>\n    <string name=\"swipeLeftToSeeMore\">向左滑动查看更多</string>\n    <string name=\"getUpdateFromTencentAppStore\">腾讯应用宝更新获取（实验性）</string>\n    <string name=\"experimentalFeatures\">实验性功能</string>\n    <string name=\"getQQLinkFromTencentAppStore\">获取 QQ 下载直链</string>\n    <string name=\"getTIMLinkFromTencentAppStore\">获取 TIM 下载直链</string>\n    <string name=\"getWeixinLinkFromTencentAppStore\">获取微信下载直链</string>\n    <string name=\"getWeComLinkFromTencentAppStore\">获取企业微信下载直链</string>\n    <string name=\"contentReturnedByTencentAppStore\">腾讯应用宝返回内容</string>\n    <string name=\"getWeTypeLinkFromTencentAppStore\">获取微信输入法下载直链</string>\n    <string name=\"tencentAppStoreWarning\">腾讯应用宝更新获取功能为 QQ 版本列表实用工具附带的实验性功能，可能存在不可预知的稳定性问题。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"showOldLoading\">扫版对话框使用旧版加载动画</string>\n    <string name=\"versionCardsDisplaysPackageSizeText\">显示额定包大小占比历史最大包百分比</string>\n    <string name=\"timVersion\">TIM 扫版</string>\n    <string name=\"enumTIMWarning\">TIM 扫版功能为 QQ 版本列表实用工具附带的实验性功能，可能存在不可预知的稳定性问题。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"useQQ9008_14600Test\">扫版类型添加 QQ 9.0.8.14600 空格直链格式</string>\n    <string name=\"initFirebaseService\">初始化 Firebase 服务</string>\n    <string name=\"enablingFirebaseServiceWarning\">初始化 Firebase 服务后，将立即在本地由 Firebase SDK 生成注册令牌，并将标识符和配置数据上传到 Firebase 服务器。此操作一经启用即无法撤销，是否继续？</string>\n    <string name=\"rainbow_notification_channel_id\">rainbow_notification_channel_id</string>\n    <string name=\"cannotFindGooglePlayServices\">未在当前设备检测到 Google Play 服务，因此无法在当前设备中使用由 Firebase 提供的服务。</string>\n    <string name=\"rainbow_notification_channel_title\">版本列表更新</string>\n    <string name=\"rainbow_notification_channel_description\">通过 Firebase 云消息传递</string>\n    <string name=\"enablingFirebaseServiceInsights\">启用 Firebase 服务可使用以下功能：\\n- 通过 Firebase 云消息传递的版本列表更新提醒</string>\n    <string name=\"enablingFirebaseServiceWarning2\">Firebase 云消息传递绑定了 Google Analytics 分析服务，使用 Firebase 云消息传递将不可避免地上传您在此软件的活跃信息。</string>\n    <string name=\"continueKey\">继续</string>\n    <string name=\"initializedFirebaseService\">Firebase 服务已初始化，无法撤销</string>\n    <string name=\"cannotEnableFirebaseCloudMessaging\">接收版本列表更新通知提醒必须打开系统通知权限，否则无法接收版本列表更新提醒。</string>\n    <string name=\"pushSystemNotificationsWhenVersionListUpdates\">版本列表更新时推送系统通知</string>\n    <string name=\"unsubscribeTimeout\">取消订阅超时</string>\n    <string name=\"unsubscribeSuccess\">取消订阅成功</string>\n    <string name=\"unsubscribeFailed\">取消订阅失败</string>\n    <string name=\"subscribeTimeout\">订阅超时</string>\n    <string name=\"subscribeSuccess\">订阅成功</string>\n    <string name=\"subscribeFailed\">订阅失败</string>\n    <string name=\"initializedFirebaseServiceItem\">Firebase 服务已初始化</string>\n    <string name=\"toSystemSetting\">前往系统设置</string>\n    <string name=\"threePartySharedList\">个人信息第三方共享清单</string>\n    <string name=\"shiplyTargetApp\">目标应用</string>\n    <string name=\"shiplyTargetAppQQ\">QQ</string>\n    <string name=\"shiplyTargetAppTIM\">TIM</string>\n    <string name=\"shiplyTargetHelper\">指定请求 Shiply 平台的目标应用</string>\n    <string name=\"openSourceLicenseTitle\">开放源代码许可</string>\n    <string name=\"basedOnQQVer\">基于 Android QQ %s 二次开发</string>\n    <string name=\"getQidianLinkFromTencentAppStore\">获取腾讯企点下载直链</string>\n    <string name=\"getWeixinAlphaLinkFromWeixinConfigDesc\">从腾讯服务器配置拉取微信最新测试版下载直链</string>\n    <string name=\"successInGetting\">获取成功</string>\n    <string name=\"getWeixinAlphaConfig404\">似乎未成功访问腾讯服务器配置文件，可能是微信当前没有测试版或测试版已撤包。</string>\n    <string name=\"getWeixinAlphaConfigLink404\">似乎未成功访问此下载地址，可能是微信当前测试版已撤包。</string>\n    <string name=\"suspectedPackageWithdrawal\">疑似撤包</string>\n    <string name=\"colon\">：</string>\n    <string name=\"qverbowHash\">杂凑值校验</string>\n    <string name=\"verifyHashValueViaGitHubAPI\">通过 GitHub REST API 校验杂凑值</string>\n    <string name=\"hashIsTrue\">杂凑值与 GitHub Releases 一致</string>\n    <string name=\"hashIsFalse\">您所使用的版本与 GitHub Releases 杂凑值不一致，为了您的安全，请尽快卸载当前版本应用并前往官方 GitHub Releases 下载此软件。</string>\n    <string name=\"toGitHubRelease\">前往下载</string>\n    <string name=\"getWeTypeTestLinkFromWeTypeLatestChannelDesc\">从微信输入法测试通道获取微信输入法最新下载直链</string>\n    <string name=\"getWeTypeLatestChannel404\">未成功访问微信输入法服务器，请检查您的网络连接。</string>\n    <string name=\"kuiklyTag\">存在 TDS 腾讯端服务 Kuikly 开发框架</string>\n    <string name=\"showKuiklyTag\">显示 Kuikly 开发框架标识</string>\n    <string name=\"getWeTypeTestLinkFromWeTypeLatestChannel\">获取微信输入法测试版</string>\n    <string name=\"getWeixinAlphaLinkFromWeixinConfig\">获取微信测试版</string>\n    <string name=\"autoCheckForUpdatesDesc\">每次启动时将通过 GitHub REST API 检查一次更新</string>\n    <string name=\"useTheSystemDownloadManagerToTakeOverTheDownloadIntentDesc\">开启后，软件全局触发下载意图时将不再打开浏览器</string>\n    <string name=\"showKuiklyTagDesc\">Kuikly 内置情况以 QQ 正式版为判断来源</string>\n    <string name=\"versionCardsDisplaysPackageSizeDesc\">仅对 QQ 版本卡片生效</string>\n    <string name=\"aboutVersionCards\">版本列表与卡片</string>\n    <string name=\"showUnrealEngineTagDesc\">虚幻引擎内置情况以 QQ 正式版为判断来源</string>\n    <string name=\"general\">通用</string>\n    <string name=\"copyAll\">复制全部</string>\n    <string name=\"enumVerMaintenanceModeWarning\">扫版功能已进入维护模式。您仍可以继续使用现有扫版功能，但 QQ 版本列表实用工具不再对相关功能及其任何后果作出任何可靠性保证，不再对相关功能进行积极开发，也不再接受相关新功能请求。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"localDetailsQQNT\">QQNT 技术架构</string>\n    <string name=\"localDetailsBugly\">Bugly 端质量监控平台</string>\n    <string name=\"localDetailsShiply\">Shiply 容器与发布平台</string>\n    <string name=\"localDetailsHippy\">Hippy 跨端开发框架</string>\n    <string name=\"localDetailsKuikly\">Kuikly 跨端开发框架</string>\n    <string name=\"localDetailsRightly\">Rightly 应用合规解决方案</string>\n    <string name=\"localDetailsUELibrary\">Unreal Engine as a Library</string>\n    <string name=\"localDetailsUELibraryDesc\">Unreal Engine as a Library 会将虚幻引擎的功能重新打包成一个库，以便其他应用程序生成和控制它们自己的 UE 实例。UELibrary 提供了一种简单、不依赖于平台的 API 来驱动 UE。</string>\n    <string name=\"localDetailsBuglyDesc\">Bugly 是 TDS 腾讯端服务（Tencent Device-oriented Service）旗下的端质量监控平台，通过采集、监控、定位、告警等核心能力，提供专业的质量监控服务，帮助开发者及时发现并解决质量问题，打造高质量应用。</string>\n    <string name=\"localDetailsShiplyDesc\">Shiply，全称 TDS 腾讯端服务 Shiply 容器与发布，属于 TDS 腾讯端服务系列产品的子产品之一，是源于腾讯内部 App 的一站式容器与发布解决方案。Shiply 提供了一套规则灵活、发布安全、高效分发的终端基础通用发布系统，功能包括：配置与开关、资源发布、应用升级，移动端热修复、Flutter 动态化、跨端开发框架等相关能力和分发支持，帮助产品和技术团队提高研效能力和决策力。</string>\n    <string name=\"localDetailsHippyDesc\">Hippy 是 TDF 腾讯端框架（Tencent Device-oriented Framework）下的开源跨平台应用开发解决方案。Hippy 从底层做了大量工作，抹平了 iOS、Android、OpenHarmony 三端差异，提供了接近 Web 的开发体验，目前上层支持了 React 和 Vue 两套界面框架，前端开发人员可以通过它，将前端代码转换为终端的原生指令，进行原生终端 APP 的开发。同时，Hippy 从底层进行了大量优化，在启动速度、渲染性能、动画速度、内存占用、包体积等方面都提供了业内顶尖的性能表现。</string>\n    <string name=\"localDetailsRightlyDesc\">Rightly 是面向移动端的全流程合规解决方案，集「合规管控」和「合规测评」为一体，为 APP 提供运行全周期数据安全与合规保护解决方案，也为 APP 提供个人信息风险审查与合规性检测服务，覆盖多项隐私安全指标。Rightly 能够助力业务提高合规效率，降低违规风险。</string>\n    <string name=\"localDetailsKuiklyDesc\">Kuikly（Kotlin UI Kit）跨端开发框架，是 TDF 腾讯端框架（Tencent Device-oriented Framework）的一部分。Kuikly 通过自研 Kotlin Multiplatform 逻辑与终端界面原生控件渲染映射协议层，并采用声明式与响应式设计，使采用 Kuikly 的 Kotlin 开发者能拥有原生高效的 Android 开发体验并构建具有原生性能的跨平台应用。Kuikly 更可依托于 TDS 腾讯端服务 Shiply 容器与发布平台，实现按页颗粒度的完备客户端界面动态化能力。</string>\n    <string name=\"localDetailsQQNTDesc\">QQNT 技术架构是腾讯 QQ 客户端全新的跨平台技术架构体系。QQNT 技术架构将 QQ 客户端核心功能——如核心登录、消息系统、关系链、富媒体、长连接、数据库等——下沉至 QQNT 内核层，使用 C++ 抽象逻辑封装为原生库并提供多平台多语言一致性接口，以实现 QQ 客户端核心逻辑代码跨平台与程序高性能运作。</string>\n    <string name=\"localDetailsMsg\">详细信息</string>\n    <string name=\"stackInfo\">技术栈信息</string>\n    <string name=\"details\">详情</string>\n    <string name=\"thisVerContains\">此版本包含 %s</string>\n    <string name=\"packageNameIsErr\">应用包名与预设不匹配</string>\n    <string name=\"useNewLocalDetailsPage\">使用新版本机应用详情页</string>\n    <string name=\"fileErr\">文件类型错误</string>\n    <string name=\"apkAnalyze\">应用包分析</string>\n    <string name=\"unknownErr\">未知错误</string>\n    <string name=\"notEnoughSpaceOnTheDevice\">设备剩余空间不足</string>\n    <string name=\"localDetailsTencentBeacon\">腾讯灯塔</string>\n    <string name=\"localDetailsTencentBeaconDesc\">腾讯灯塔全场景大数据分析套件，是腾讯 50+ 业务自 2018 年以来使用数据中台演化而成，支持每日数十亿条数据资产的全面管理，数千业务员工深度依赖的整体化工具套件。</string>\n    <string name=\"haveNotAgreeUA\">未同意用户协议，无法使用本软件</string>\n    <string name=\"localDetailsFlutter\">Flutter</string>\n    <string name=\"localDetailsFlutterDesc\">Flutter 是 Google 的便携式 UI 工具包，帮助你在移动、web、桌面端创造高质量的绝妙原生体验的应用。 Flutter 可以和世界上的开发人员和开发组织广泛使用的那些现存代码一起使用，并且是开源的、免费的。</string>\n    <string name=\"localDetailsJetpackCompose\">Jetpack Compose</string>\n    <string name=\"localDetailsJetpackComposeDesc\">Jetpack Compose est un kit d\\'outils moderne permettant de créer une interface utilisateur Android native. Il simplifie et accélère le développement d\\'UI pour Android en utilisant moins de code, des outils puissants et des API en Kotlin intuitives. </string>\n    <string name=\"localDetailsComposeMultiplatform\">Compose Multiplatform</string>\n    <string name=\"localDetailsComposeMultiplatformDesc\">Compose Multiplatform 是一个由 JetBrains 开发的现代化声明式和响应式 UI 框架，它提供了一种只需少量 Kotlin 代码即可构建用户界面的简单方法。它还允许您只需编写一次用户界面，即可在任何支持的平台——iOS、Android、桌面（Windows、macOS、Linux）和 Web——上运行。</string>\n    <string name=\"security\">安全</string>\n    <string name=\"privateTokenSettings\">私有 Token 管理</string>\n    <string name=\"privateTokenSettingsDesc\">此处内填入的 Token 将由 Android 密钥库系统安全加密后存储</string>\n    <string name=\"zhipuAIMaaSPlatformToken\">智谱 AI 开放平台 Token</string>\n    <string name=\"updateLogPrompt\">请根据用户传入的更新日志文本，以清晰简洁的 %s 语言对更新日志文本进行专业总结，要求：1) 提取核心功能优化和关键问题修复，忽略技术细节 2) 采用 Pangu 格式化文本，确保中英文/数字间自动空格 3) 完全避免产品名称及主观评价 4) 用连贯段落呈现，严格控制在 150 字内。输出需突出用户感知明显的改进点，使用规范化表述，禁止列表格式且不使用 Markdown。</string>\n    <string name=\"githubPersonalAccessToken\">GitHub 个人访问令牌</string>\n    <string name=\"TEESupported\">密钥由设备可信执行环境（TEE）安全硬件提供保护</string>\n    <string name=\"StrongBoxSupported\">密钥由设备 StrongBox 安全元件提供保护</string>\n    <string name=\"UnknownSecurityHardwareSupported\">密钥由设备安全硬件提供保护</string>\n    <string name=\"SecuritySoftwareSupported\">密钥由 Android 密钥库提供保护</string>\n    <string name=\"testGitHubToken\">保存并联网测试 GitHub 个人访问令牌可用性</string>\n    <string name=\"testZhipuToken\">保存并联网测试智谱 AI 开放平台 Token 可用性</string>\n    <string name=\"testZhipuTokenPrompt\">用户正在测试与您的连通性。如果您收到了这句话，请使用 %s 语言热情地与用户打招呼并用一段话详细介绍自己的模型名称。</string>\n    <string name=\"backFromZhipuPlatform\">智谱 AI 开放平台返回内容</string>\n    <string name=\"zhipuTokenSuccess\">智谱 Token 可用</string>\n    <string name=\"zhipuTokenIsNull\">智谱 Token 为空</string>\n    <string name=\"githubTokenIsNull\">GitHub 个人访问令牌为空</string>\n    <string name=\"githubTokenSuccess\">GitHub 个人访问令牌可用</string>\n    <string name=\"githubTokenUnavailable\">GitHub 个人访问令牌不可用，请检查您的 GitHub 个人访问令牌有效性。</string>\n    <string name=\"githubTokenUnavailableTitle\">GitHub 个人访问令牌不可用</string>\n    <string name=\"testToken\">测试 Token 可用性</string>\n    <string name=\"llmIntelligent\">LLM 智能摘要</string>\n    <string name=\"aiLLMInference\">LLM 推理</string>\n    <string name=\"qverbowUpdateLogLLMIntelligentDesc\">检查到更新时将使用 LLM 智能摘要更新日志，需要在“私有 Token 管理”填入智谱 Token</string>\n    <string name=\"qverbowUpdateLogLLMIntelligent\">更新日志智能摘要</string>\n    <string name=\"githubTokenHelperText\">GitHub 个人访问令牌将用于解除 GitHub REST API 访问速率限制，填入并保存即生效</string>\n    <string name=\"zhipuTokenHelperText\">默认仅请求智谱免费模型 GLM-4-Flash</string>\n    <string name=\"zhipuTokenIsInvalid\">填入的 Token 被智谱 AI 开放平台大模型接口 Java SDK 判定无效。</string>\n    <string name=\"clickHereToViewTheChangelog\">点击此处查看更新日志</string>\n    <string name=\"localWeixinVersion\">本机微信：</string>\n    <string name=\"weixin\">Weixin</string>\n    <string name=\"localDetailsMMKV\">MMKV</string>\n    <string name=\"localDetailsMMKVDesc\">MMKV 是微信中的一个高效、小巧、易用的移动的键值对存储框架，可在 Android、iOS/macOS、Windows、POSIX 和 HarmonyOS NEXT 上使用。</string>\n    <string name=\"localDetailsWCDB\">WCDB</string>\n    <string name=\"localDetailsWCDBDesc\">WCDB 是一个易用、高效、完整的移动数据库框架，它基于 SQLite 和 SQLCipher 开发，在微信中应用广泛，且支持在 C++、Java、Kotlin、Swift、Objc 五种语言环境中使用。</string>\n    <string name=\"localDetailsTinker\">Tinker</string>\n    <string name=\"localDetailsTinkerDesc\">Tinker 是微信官方的 Android 热补丁解决方案，它支持动态下发代码、So 库以及资源，让应用能够在不需要重新安装的情况下实现更新。</string>\n    <string name=\"localDetailsMars\">Mars</string>\n    <string name=\"localDetailsMarsDesc\">Mars 是微信官方的跨平台跨业务的终端基础组件。</string>\n    <string name=\"localDetailsMatrix\">Matrix</string>\n    <string name=\"localDetailsMatrixDesc\">Matrix 是一款微信研发并日常使用的应用性能接入框架，支持 iOS, macOS 和 Android。 Matrix 通过接入各种性能监控方案，对性能监控项的异常数据进行采集和分析，输出相应的问题分析、定位与优化建议，从而帮助开发者开发出更高质量的应用。</string>\n    <string name=\"localWeixinVersionDetails\">本机微信版本详情</string>\n    <string name=\"localDetailsReactNativeDesc\">React Native 将 React 的声明式 UI 框架引入 iOS 和 Android。使用 React Native，您可以直接使用原生 UI 控件，并拥有对原生平台的完整访问权限。</string>\n    <string name=\"localDetailsReactNative\">React Native</string>\n    <string name=\"localDetailsTBSDesc\">腾讯浏览服务（Tencent Browsing Service，简称 TBS）属于 PCG 事业群，QQ 浏览器团队。QQ 浏览器作为一个平台化的产品，不论是网页的打开还是文档能力的打开，都需要一个强大的自研引擎做支撑，而引擎研发团队，一直深耕引擎底层技术 10 余年，积累了丰富的业务经验，将引擎技术从产品独立出来为 SDK，并不断演进成一个平台化的引擎产品，成立腾讯浏览服务，为腾讯公司内外产品提供强大的引擎技术支持和技术服务支持，覆盖了近十万家产品接入，并支持数亿级的网页浏览体验。</string>\n    <string name=\"localDetailsTBS\">腾讯浏览服务</string>\n    <string name=\"biometricLoginTitle\">验证您的身份</string>\n    <string name=\"biometricLoginSubtitle\">验证您的身份以进一步操作</string>\n    <string name=\"llmInferenceLocalChanges\">应用更改推测</string>\n    <string name=\"genByAITips\">内容由 AI 生成，可能存在不准确的信息。</string>\n    <string name=\"llmInferenceLocalChangesDesc\">应用包分析外部应用时可以使用 LLM 推测外部应用与本机应用的功能变更，需要在“私有 Token 管理”填入智谱 Token</string>\n    <string name=\"llmInferenceLocalChangesPrompt\">用户本地已经安装了 %1$s %2$s，今天用户收到了一个 %1$s %3$s 安装包，用户已经得出收到的 %1$s %3$s 安装包的四大组件（activity、service、content provider、broadcast receiver）与权限和用户本地已安装的 %1$s %2$s 之间的差异。请根据用户传入的上述差异的文本，以清晰简洁的 %4$s 语言分析推测该差异可能存在的应用变更，要求：1) 提取核心功能优化和关键问题修复，忽略技术细节 2) 采用 Pangu 格式化文本，确保中英文/数字间自动空格 3) 用连贯段落呈现，严格控制在 300 字内。输出需突出用户感知明显的改进点，使用规范化表述，禁止列表格式且不使用 Markdown。</string>\n    <string name=\"timeout\">连接超时</string>\n    <string name=\"localDetailsSkylineRenderingEngine\">Skyline 渲染引擎</string>\n    <string name=\"localDetailsSkylineRenderingEngineDesc\">为了进一步优化小程序性能，提供更为接近原生的用户体验，微信团队在 WebView 渲染之外新增了一个渲染引擎 Skyline，其使用更精简高效的渲染管线，并带来诸多增强特性，让 Skyline 拥有更接近原生渲染的性能体验。</string>\n    <string name=\"versionNumberFontUseTCloudNumberDesc\">可在下方调整腾讯云数字字体字重</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-ja-rJP/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<resources>\n    <string name=\"app_name\">QQ 版本列表实用工具</string>\n    <string name=\"appTitle\">QQ 版本列表实用工具</string>\n    <string name=\"shortcutLongLabel\">扫版（维护模式）</string>\n    <string name=\"shortcutShortLabel\">扫版（维护）</string>\n    <string name=\"start\">开始</string>\n    <string name=\"cancel\">取消</string>\n    <string name=\"done\">确定</string>\n    <string name=\"save\">保存</string>\n    <string name=\"installed\">已安装</string>\n    <string name=\"copy\">复制</string>\n    <string name=\"refresh\">刷新</string>\n    <string name=\"agree\">同意</string>\n    <string name=\"disagreeAndExit\">不同意并退出</string>\n    <string name=\"withdrawConsentUA\">撤回同意用户协议</string>\n    <string name=\"withdrawConsentAndExit\">撤回同意并退出</string>\n    <string name=\"userAgreement\">用户协议</string>\n    <string name=\"enumerateVersionsFAB\">扫版（维护模式）</string>\n    <string name=\"enumerateVersionsDialogTitle\">扫版（维护模式）</string>\n    <string name=\"setting\">设置</string>\n    <string name=\"personalization\">个性化</string>\n    <string name=\"about\">关于</string>\n    <string name=\"enumerateVersionsFormatSetting\">扫版直链格式设置</string>\n    <string name=\"getUpdateFromTDSShiplyDistributionPlatform\">TDS 腾讯端服务 Shiply 容器与发布平台更新获取（实验性）</string>\n    <string name=\"getUpdateFromShiplyPlatform\">Shiply 平台更新获取（实验性）</string>\n    <string name=\"acceptedEnumerateVersion\">扫版成功</string>\n    <string name=\"contentReturnedByShiplyPlatform\">Shiply 平台返回内容</string>\n    <string name=\"applicationError\">程序出错</string>\n    <string name=\"additionalActions\">进一步操作</string>\n    <string name=\"shareTo\">分享到</string>\n    <string name=\"jsonDetails\">JSON 详情</string>\n    <string name=\"stableVersion\">正式版</string>\n    <string name=\"previewVersion\">测试版</string>\n    <string name=\"spaceEnumerateVersion\">空格扫版</string>\n    <string name=\"weixinEnumerateVersion\">微信扫版</string>\n    <string name=\"aboutAppName\">QQ 版本列表实用工具 for Android™</string>\n    <string name=\"aboutAuthor\">作者：</string>\n    <string name=\"aboutContributor\">贡献者：</string>\n    <string name=\"version\">版本：</string>\n    <string name=\"aboutSpecialThanksTo\">特别感谢：</string>\n    <string name=\"aboutOpenSourceRepo\">开源仓库：</string>\n    <string name=\"aboutGetUpdate\">获取更新：</string>\n    <string name=\"aboutDescription\">提供 Android QQ 版本列表的查看和对 Android QQ 下载链接的枚举法扫描。</string>\n    <string name=\"copied\">已复制：</string>\n    <string name=\"reatedFileSize\">额定大小：</string>\n    <string name=\"sourceJSON\">源 JSON</string>\n    <string name=\"recommendations\">建议的内容</string>\n    <string name=\"longPressTheVersionCardToViewSourceDetails\">长按版本卡片查看源详情</string>\n    <string name=\"useTheSystemDownloadManagerToTakeOverTheDownloadIntent\">使用系统下载管理器</string>\n    <string name=\"removeMultiplesOf5ForQQPreviewVersions\">解除 QQ 测试版扫版小版本号遵循 5 的倍数限制</string>\n    <string name=\"longPressToViewSourceDetailsIsDisabled\">未开启长按查看源详情功能，请前往设置开启</string>\n    <string name=\"currentSizeVsLargestHistoricalPackage\">占比历史最大包（%s）：</string>\n    <string name=\"extendTheSuffixForDirectDownloadLinksOfEnumeratedPreviewVersions\">扩展测试版扫版直链后缀</string>\n    <string name=\"fileSize\">大小：</string>\n    <string name=\"downloadLink\">下载地址：</string>\n    <string name=\"saved\">已保存</string>\n    <string name=\"enumQQPreviewWarning\">鉴于 QQ 测试版可能存在不可预知的稳定性问题，您在下载及使用该测试版本之前，必须明确并确保自身具备足够的风险识别和承受能力。根据相关条款，您使用本软件时应当已了解并同意，因下载或使用 QQ 测试版而可能产生的任何直接或间接损失、损害以及其他不利后果，均由您自行承担全部责任。</string>\n    <string name=\"enumQQMajorVersionHelpText\">填写格式为 x.y.z</string>\n    <string name=\"enumWeixinMajorVersionHelpText\">无需填写小数点</string>\n    <string name=\"enumWeixinWarning\">微信扫版功能为 QQ 版本列表实用工具附带的实验性功能，可能存在不可预知的稳定性问题。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"enumHasBeenStopped\">已停止扫描</string>\n    <string name=\"missingCipherWarning\">TDS 腾讯端服务 Shiply 容器与发布平台返回 JSON 内容中未包含“cipher_text”键值对。</string>\n    <string name=\"missingMajorVersionWarning\">扫版需要填写主版本号，否则无法执行扫版。</string>\n    <string name=\"missingQQPreviewMinorVersionWarning\">测试版扫版（含空格扫版）需要填写小版本号，否则无法扫描测试版。</string>\n    <string name=\"QQPreviewMinorNot5Warning\">小版本号需填写 5 的倍数。如需解除此限制，请前往设置进行解除。</string>\n    <string name=\"missingWeixinTrueVersionWarning\">微信扫版需要填写真实版本号，否则无法扫描微信版本。</string>\n    <string name=\"missingWeixin16CodeWarning\">微信扫版需要填写十六进制代码，否则无法扫描微信版本。</string>\n    <string name=\"enumeratingDownloadLink\">正在扫描下载地址：</string>\n    <string name=\"majorVersion\">主版本号</string>\n    <string name=\"initialMinorVersion\">起始小版本号</string>\n    <string name=\"hexadecimalCode\">十六进制代码</string>\n    <string name=\"initialMinorVersionHelpText\">填写起始扫描小版本号，扫正式版时无需填写</string>\n    <string name=\"hexadecimalCodeHelpText\">填写十六进制代码，仅微信扫版使用</string>\n    <string name=\"enumType\">扫版类型</string>\n    <string name=\"enumTypeHelpText\">指定扫版目标类型</string>\n    <string name=\"trueVersion\">真实版本号</string>\n    <string name=\"trueVersionHelpText\">填写真实版本号（版本码），仅微信扫版使用</string>\n    <string name=\"appidOptional\">appid（非必填）</string>\n    <string name=\"shiplyGeneralOptionalHelpText\">默认值：</string>\n    <string name=\"shiplyVersion\">版本</string>\n    <string name=\"shiplyVersionHelpText\">填写用于请求 Shiply 平台的 Android QQ/TIM 版本号</string>\n    <string name=\"uinHelpText\">填写用于请求 Shiply 平台的对象 QQ 号</string>\n    <string name=\"shiplyWarning\">腾讯 QQ/TIM 使用 TDS 腾讯端服务 Shiply 容器与发布平台，根据 QQ 号（uin）及其终端信息分发小范围灰度测试安装包。此功能并非每次请求都能成功获取到更新数据，无法获取更新数据则表示填写的参数不在 Shiply 平台认可与分发范围内。QQ 版本列表实用工具不对此功能及其任何后果作出任何可靠性保证。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"defaultDisplayOfFirstListItemDetails\">首项卡片默认显示详情</string>\n    <string name=\"versionNumberFontUseTCloudNumber\">使用腾讯云数字字体</string>\n    <string name=\"versionCardsDisplaysPackageSizeIndicator\">显示额定包大小占比历史最大包指示条</string>\n    <string name=\"customVersionEnumSuffix\">自定义扫版后缀</string>\n    <string name=\"customVersionEnumSuffixHelpText\">请使用“, ”（西文逗号+空格）分割</string>\n    <string name=\"facilitateI18n\">协助翻译：</string>\n    <string name=\"versionCardExpandButtonContentDescription\">展开详情</string>\n    <string name=\"versionCardCollapseButtonContentDescription\">收起详情</string>\n    <string name=\"shiplyAdvancedConfigurations\">进阶配置</string>\n    <string name=\"shiplyOsVersionOptional\">osVersion（非必填）</string>\n    <string name=\"shiplySdkVersionOptional\">sdkVersion（非必填）</string>\n    <string name=\"shiplyModelOptional\">model（非必填）</string>\n    <string name=\"shiplyLanguageOptional\">language（非必填）</string>\n    <string name=\"thicknessFollowSystem\">跟随系统</string>\n    <string name=\"back\">返回</string>\n    <string name=\"shiplyUseAdvancedConfigurations\">使用进阶配置</string>\n    <string name=\"localQQVersion\">本机 QQ：</string>\n    <string name=\"bracket\">（%s）</string>\n    <string name=\"localTIMVersion\">本机 TIM：</string>\n    <string name=\"localQQVersionDetails\">本机 QQ 版本详情</string>\n    <string name=\"localTIMVersionDetails\">本机 TIM 版本详情</string>\n    <string name=\"accessibilityTag\">6IW+6K6vIFFRIOW3suS4iue6v+S4gOmhueaXoOmanOeijeeUqOaIt+S4k+WxnuS8mOWMluaOquaWveabtOaWsOOAguenu+WKqOe7iOerr+iuvuWkh+W8gOWQr+ezu+e7n+aXoOmanOeijeivu+Wxj+acjeWKoe+8iOWmgiBBbmRyb2lkIFRhbGtiYWNr44CBaU9TIFZvaWNlT3Zlcu+8ie+8jOW5tuWQjOaXtuS9v+eUqOiFvuiuryBRUSDnp7vliqjlrqLmiLfnq68gOS4wLjg1IOWPiuS7peS4iueJiOacrOaXtu+8jOiFvuiuryBRUSDlsIblh4/lsJHmiJblgZzmraLlkJHmraTnsbsgUVEg5a6i5oi356uv5LiL5Y+R5bm/5ZGK44CC</string>\n    <string name=\"imageGallery\">应用宣传图</string>\n    <string name=\"share\">分享</string>\n    <string name=\"download\">下载</string>\n    <string name=\"stop\">停止</string>\n    <string name=\"skip\">跳过</string>\n    <string name=\"qqntTag\">基于 QQNT 技术架构</string>\n    <string name=\"releaseDateTIM\">发布日期：</string>\n    <string name=\"checkUpdateViaGitHubAPI\">使用 GitHub REST API 检查更新</string>\n    <string name=\"noUpdatesDetected\">未检测到更新</string>\n    <string name=\"noAssetsDetected\">未检测到资产文件</string>\n    <string name=\"cannotGetGitHub\">无法连接到 GitHub，请确保您所在网络环境可以访问 GitHub。</string>\n    <string name=\"updateQverbowAvailable\">更新可用</string>\n    <string name=\"copyLink\">复制链接</string>\n    <string name=\"unrealEngineTag\">内置虚幻引擎</string>\n    <string name=\"autoCheckForUpdates\">启动时检查更新</string>\n    <string name=\"useQQ8958Test\">使用 QQ 8.9.58 测试版直链格式</string>\n    <string name=\"ciVersionNoSupportUpdates\">CI 构建版本不支持检查更新</string>\n    <string name=\"showUnrealEngineTag\">显示虚幻引擎标识</string>\n    <string name=\"suffixSetting\">后缀设置</string>\n    <string name=\"others\">其它</string>\n    <string name=\"ok\">好</string>\n    <string name=\"swipeLeftToSeeMore\">向左滑动查看更多</string>\n    <string name=\"getUpdateFromTencentAppStore\">腾讯应用宝更新获取（实验性）</string>\n    <string name=\"experimentalFeatures\">实验性功能</string>\n    <string name=\"getQQLinkFromTencentAppStore\">获取 QQ 下载直链</string>\n    <string name=\"getTIMLinkFromTencentAppStore\">获取 TIM 下载直链</string>\n    <string name=\"getWeixinLinkFromTencentAppStore\">获取微信下载直链</string>\n    <string name=\"getWeComLinkFromTencentAppStore\">获取企业微信下载直链</string>\n    <string name=\"contentReturnedByTencentAppStore\">腾讯应用宝返回内容</string>\n    <string name=\"getWeTypeLinkFromTencentAppStore\">获取微信输入法下载直链</string>\n    <string name=\"tencentAppStoreWarning\">腾讯应用宝更新获取功能为 QQ 版本列表实用工具附带的实验性功能，可能存在不可预知的稳定性问题。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"showOldLoading\">扫版对话框使用旧版加载动画</string>\n    <string name=\"versionCardsDisplaysPackageSizeText\">显示额定包大小占比历史最大包百分比</string>\n    <string name=\"timVersion\">TIM 扫版</string>\n    <string name=\"enumTIMWarning\">TIM 扫版功能为 QQ 版本列表实用工具附带的实验性功能，可能存在不可预知的稳定性问题。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"useQQ9008_14600Test\">扫版类型添加 QQ 9.0.8.14600 空格直链格式</string>\n    <string name=\"initFirebaseService\">初始化 Firebase 服务</string>\n    <string name=\"enablingFirebaseServiceWarning\">初始化 Firebase 服务后，将立即在本地由 Firebase SDK 生成注册令牌，并将标识符和配置数据上传到 Firebase 服务器。此操作一经启用即无法撤销，是否继续？</string>\n    <string name=\"rainbow_notification_channel_id\">版本列表更新</string>\n    <string name=\"cannotFindGooglePlayServices\">未在当前设备检测到 Google Play 服务，因此无法在当前设备中使用由 Firebase 提供的服务。</string>\n    <string name=\"rainbow_notification_channel_title\">版本列表更新</string>\n    <string name=\"rainbow_notification_channel_description\">通过 Firebase 云消息传递</string>\n    <string name=\"enablingFirebaseServiceInsights\">启用 Firebase 服务可使用以下功能：\\n- 通过 Firebase 云消息传递的版本列表更新提醒</string>\n    <string name=\"enablingFirebaseServiceWarning2\">Firebase 云消息传递绑定了 Google Analytics 分析服务，使用 Firebase 云消息传递将不可避免地上传您在此软件的活跃信息。</string>\n    <string name=\"continueKey\">继续</string>\n    <string name=\"initializedFirebaseService\">Firebase 服务已初始化，无法撤销</string>\n    <string name=\"cannotEnableFirebaseCloudMessaging\">接收版本列表更新通知提醒必须打开系统通知权限，否则无法接收版本列表更新提醒。</string>\n    <string name=\"pushSystemNotificationsWhenVersionListUpdates\">版本列表更新时推送系统通知</string>\n    <string name=\"unsubscribeTimeout\">取消订阅超时</string>\n    <string name=\"unsubscribeSuccess\">取消订阅成功</string>\n    <string name=\"unsubscribeFailed\">取消订阅失败</string>\n    <string name=\"subscribeTimeout\">订阅超时</string>\n    <string name=\"subscribeSuccess\">订阅成功</string>\n    <string name=\"subscribeFailed\">订阅失败</string>\n    <string name=\"initializedFirebaseServiceItem\">Firebase 服务已初始化</string>\n    <string name=\"toSystemSetting\">前往系统设置</string>\n    <string name=\"threePartySharedList\">个人信息第三方共享清单</string>\n    <string name=\"shiplyTargetApp\">目标应用</string>\n    <string name=\"shiplyTargetAppQQ\">QQ</string>\n    <string name=\"shiplyTargetAppTIM\">TIM</string>\n    <string name=\"shiplyTargetHelper\">指定请求 Shiply 平台的目标应用</string>\n    <string name=\"openSourceLicenseTitle\">开放源代码许可</string>\n    <string name=\"basedOnQQVer\">基于 Android QQ %s 二次开发</string>\n    <string name=\"getQidianLinkFromTencentAppStore\">获取腾讯企点下载直链</string>\n    <string name=\"getWeixinAlphaLinkFromWeixinConfigDesc\">从腾讯服务器配置拉取微信最新测试版下载直链</string>\n    <string name=\"successInGetting\">获取成功</string>\n    <string name=\"getWeixinAlphaConfig404\">似乎未成功访问腾讯服务器配置文件，可能是微信当前没有测试版或测试版已撤包。</string>\n    <string name=\"getWeixinAlphaConfigLink404\">似乎未成功访问此下载地址，可能是微信当前测试版已撤包。</string>\n    <string name=\"suspectedPackageWithdrawal\">疑似撤包</string>\n    <string name=\"colon\">：</string>\n    <string name=\"qverbowHash\">杂凑值校验</string>\n    <string name=\"verifyHashValueViaGitHubAPI\">通过 GitHub REST API 校验杂凑值</string>\n    <string name=\"hashIsTrue\">杂凑值与 GitHub Releases 一致</string>\n    <string name=\"hashIsFalse\">您所使用的版本与 GitHub Releases 杂凑值不一致，为了您的安全，请尽快卸载当前版本应用并前往官方 GitHub Releases 下载此软件。</string>\n    <string name=\"toGitHubRelease\">前往下载</string>\n    <string name=\"getWeTypeTestLinkFromWeTypeLatestChannelDesc\">从微信输入法测试通道获取微信输入法最新下载直链</string>\n    <string name=\"getWeTypeLatestChannel404\">未成功访问微信输入法服务器，请检查您的网络连接。</string>\n    <string name=\"kuiklyTag\">存在 TDS 腾讯端服务 Kuikly 开发框架</string>\n    <string name=\"showKuiklyTag\">显示 Kuikly 开发框架标识</string>\n    <string name=\"getWeTypeTestLinkFromWeTypeLatestChannel\">获取微信输入法测试版</string>\n    <string name=\"getWeixinAlphaLinkFromWeixinConfig\">获取微信测试版</string>\n    <string name=\"autoCheckForUpdatesDesc\">每次启动时将通过 GitHub REST API 检查一次更新</string>\n    <string name=\"useTheSystemDownloadManagerToTakeOverTheDownloadIntentDesc\">开启后，软件全局触发下载意图时将不再打开浏览器</string>\n    <string name=\"showKuiklyTagDesc\">Kuikly 内置情况以 QQ 正式版为判断来源</string>\n    <string name=\"versionCardsDisplaysPackageSizeDesc\">仅对 QQ 版本卡片生效</string>\n    <string name=\"aboutVersionCards\">版本列表与卡片</string>\n    <string name=\"showUnrealEngineTagDesc\">虚幻引擎内置情况以 QQ 正式版为判断来源</string>\n    <string name=\"general\">通用</string>\n    <string name=\"copyAll\">复制全部</string>\n    <string name=\"enumVerMaintenanceModeWarning\">扫版功能已进入维护模式。您仍可以继续使用现有扫版功能，但 QQ 版本列表实用工具不再对相关功能及其任何后果作出任何可靠性保证，不再对相关功能进行积极开发，也不再接受相关新功能请求。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"localDetailsQQNT\">QQNT 技术架构</string>\n    <string name=\"localDetailsBugly\">Bugly 端质量监控平台</string>\n    <string name=\"localDetailsShiply\">Shiply 容器与发布平台</string>\n    <string name=\"localDetailsHippy\">Hippy 跨端开发框架</string>\n    <string name=\"localDetailsKuikly\">Kuikly 跨端开发框架</string>\n    <string name=\"localDetailsRightly\">Rightly 应用合规解决方案</string>\n    <string name=\"localDetailsUELibrary\">Unreal Engine as a Library</string>\n    <string name=\"localDetailsUELibraryDesc\">Unreal Engine as a Library 会将虚幻引擎的功能重新打包成一个库，以便其他应用程序生成和控制它们自己的 UE 实例。UELibrary 提供了一种简单、不依赖于平台的 API 来驱动 UE。</string>\n    <string name=\"localDetailsBuglyDesc\">Bugly 是 TDS 腾讯端服务（Tencent Device-oriented Service）旗下的端质量监控平台，通过采集、监控、定位、告警等核心能力，提供专业的质量监控服务，帮助开发者及时发现并解决质量问题，打造高质量应用。</string>\n    <string name=\"localDetailsShiplyDesc\">Shiply，全称 TDS 腾讯端服务 Shiply 容器与发布，属于 TDS 腾讯端服务系列产品的子产品之一，是源于腾讯内部 App 的一站式容器与发布解决方案。Shiply 提供了一套规则灵活、发布安全、高效分发的终端基础通用发布系统，功能包括：配置与开关、资源发布、应用升级，移动端热修复、Flutter 动态化、跨端开发框架等相关能力和分发支持，帮助产品和技术团队提高研效能力和决策力。</string>\n    <string name=\"localDetailsHippyDesc\">Hippy 是 TDF 腾讯端框架（Tencent Device-oriented Framework）下的开源跨平台应用开发解决方案。Hippy 从底层做了大量工作，抹平了 iOS、Android、OpenHarmony 三端差异，提供了接近 Web 的开发体验，目前上层支持了 React 和 Vue 两套界面框架，前端开发人员可以通过它，将前端代码转换为终端的原生指令，进行原生终端 APP 的开发。同时，Hippy 从底层进行了大量优化，在启动速度、渲染性能、动画速度、内存占用、包体积等方面都提供了业内顶尖的性能表现。</string>\n    <string name=\"localDetailsRightlyDesc\">Rightly 是面向移动端的全流程合规解决方案，集「合规管控」和「合规测评」为一体，为 APP 提供运行全周期数据安全与合规保护解决方案，也为 APP 提供个人信息风险审查与合规性检测服务，覆盖多项隐私安全指标。Rightly 能够助力业务提高合规效率，降低违规风险。</string>\n    <string name=\"localDetailsKuiklyDesc\">Kuikly（Kotlin UI Kit）跨端开发框架，是 TDF 腾讯端框架（Tencent Device-oriented Framework）的一部分。Kuikly 通过自研 Kotlin Multiplatform 逻辑与终端界面原生控件渲染映射协议层，并采用声明式与响应式设计，使采用 Kuikly 的 Kotlin 开发者能拥有原生高效的 Android 开发体验并构建具有原生性能的跨平台应用。Kuikly 更可依托于 TDS 腾讯端服务 Shiply 容器与发布平台，实现按页颗粒度的完备客户端界面动态化能力。</string>\n    <string name=\"localDetailsQQNTDesc\">QQNT 技术架构是腾讯 QQ 客户端全新的跨平台技术架构体系。QQNT 技术架构将 QQ 客户端核心功能——如核心登录、消息系统、关系链、富媒体、长连接、数据库等——下沉至 QQNT 内核层，使用 C++ 抽象逻辑封装为原生库并提供多平台多语言一致性接口，以实现 QQ 客户端核心逻辑代码跨平台与程序高性能运作。</string>\n    <string name=\"localDetailsMsg\">详细信息</string>\n    <string name=\"stackInfo\">技术栈信息</string>\n    <string name=\"details\">详情</string>\n    <string name=\"thisVerContains\">此版本包含 %s</string>\n    <string name=\"packageNameIsErr\">应用包名与预设不匹配</string>\n    <string name=\"useNewLocalDetailsPage\">使用新版本机应用详情页</string>\n    <string name=\"fileErr\">文件类型错误</string>\n    <string name=\"apkAnalyze\">应用包分析</string>\n    <string name=\"unknownErr\">未知错误</string>\n    <string name=\"notEnoughSpaceOnTheDevice\">设备剩余空间不足</string>\n    <string name=\"localDetailsTencentBeacon\">腾讯灯塔</string>\n    <string name=\"localDetailsTencentBeaconDesc\">腾讯灯塔全场景大数据分析套件，是腾讯 50+ 业务自 2018 年以来使用数据中台演化而成，支持每日数十亿条数据资产的全面管理，数千业务员工深度依赖的整体化工具套件。</string>\n    <string name=\"haveNotAgreeUA\">未同意用户协议，无法使用本软件</string>\n    <string name=\"localDetailsFlutter\">Flutter</string>\n    <string name=\"localDetailsFlutterDesc\">Flutter 是 Google 的便携式 UI 工具包，帮助你在移动、web、桌面端创造高质量的绝妙原生体验的应用。 Flutter 可以和世界上的开发人员和开发组织广泛使用的那些现存代码一起使用，并且是开源的、免费的。</string>\n    <string name=\"localDetailsJetpackCompose\">Jetpack Compose</string>\n    <string name=\"localDetailsJetpackComposeDesc\">Jetpack Compose は、Android のネイティブ UI を構築するための最新のツールキットです。Jetpack Compose は、簡潔なコード、パワフルなツール、直感的な Kotlin API により、Android での UI 開発を簡素化し、加速します。</string>\n    <string name=\"localDetailsComposeMultiplatform\">Compose Multiplatform</string>\n    <string name=\"localDetailsComposeMultiplatformDesc\">Compose Multiplatform 是一个由 JetBrains 开发的现代化声明式和响应式 UI 框架，它提供了一种只需少量 Kotlin 代码即可构建用户界面的简单方法。它还允许您只需编写一次用户界面，即可在任何支持的平台——iOS、Android、桌面（Windows、macOS、Linux）和 Web——上运行。</string>\n    <string name=\"security\">安全</string>\n    <string name=\"privateTokenSettings\">私有 Token 管理</string>\n    <string name=\"privateTokenSettingsDesc\">此处内填入的 Token 将由 Android 密钥库系统安全加密后存储</string>\n    <string name=\"zhipuAIMaaSPlatformToken\">智谱 AI 开放平台 Token</string>\n    <string name=\"updateLogPrompt\">请根据用户传入的更新日志文本，以清晰简洁的 %s 语言对更新日志文本进行专业总结，要求：1) 提取核心功能优化和关键问题修复，忽略技术细节 2) 采用 Pangu 格式化文本，确保中英文/数字间自动空格 3) 完全避免产品名称及主观评价 4) 用连贯段落呈现，严格控制在 150 字内。输出需突出用户感知明显的改进点，使用规范化表述，禁止列表格式且不使用 Markdown。</string>\n    <string name=\"githubPersonalAccessToken\">GitHub 个人访问令牌</string>\n    <string name=\"TEESupported\">密钥由设备可信执行环境（TEE）安全硬件提供保护</string>\n    <string name=\"StrongBoxSupported\">密钥由设备 StrongBox 安全元件提供保护</string>\n    <string name=\"UnknownSecurityHardwareSupported\">密钥由设备安全硬件提供保护</string>\n    <string name=\"SecuritySoftwareSupported\">密钥由 Android 密钥库提供保护</string>\n    <string name=\"testGitHubToken\">保存并联网测试 GitHub 个人访问令牌可用性</string>\n    <string name=\"testZhipuToken\">保存并联网测试智谱 AI 开放平台 Token 可用性</string>\n    <string name=\"testZhipuTokenPrompt\">用户正在测试与您的连通性。如果您收到了这句话，请使用 %s 语言热情地与用户打招呼并用一段话详细介绍自己的模型名称。</string>\n    <string name=\"backFromZhipuPlatform\">智谱 AI 开放平台返回内容</string>\n    <string name=\"zhipuTokenSuccess\">智谱 Token 可用</string>\n    <string name=\"zhipuTokenIsNull\">智谱 Token 为空</string>\n    <string name=\"githubTokenIsNull\">GitHub 个人访问令牌为空</string>\n    <string name=\"githubTokenSuccess\">GitHub 个人访问令牌可用</string>\n    <string name=\"githubTokenUnavailable\">GitHub 个人访问令牌不可用，请检查您的 GitHub 个人访问令牌有效性。</string>\n    <string name=\"githubTokenUnavailableTitle\">GitHub 个人访问令牌不可用</string>\n    <string name=\"testToken\">测试 Token 可用性</string>\n    <string name=\"llmIntelligent\">LLM 智能摘要</string>\n    <string name=\"aiLLMInference\">LLM 推理</string>\n    <string name=\"qverbowUpdateLogLLMIntelligentDesc\">检查到更新时将使用 LLM 智能摘要更新日志，需要在“私有 Token 管理”填入智谱 Token</string>\n    <string name=\"qverbowUpdateLogLLMIntelligent\">更新日志智能摘要</string>\n    <string name=\"githubTokenHelperText\">GitHub 个人访问令牌将用于解除 GitHub REST API 访问速率限制，填入并保存即生效</string>\n    <string name=\"zhipuTokenHelperText\">默认仅请求智谱免费模型 GLM-4-Flash</string>\n    <string name=\"zhipuTokenIsInvalid\">填入的 Token 被智谱 AI 开放平台大模型接口 Java SDK 判定无效。</string>\n    <string name=\"clickHereToViewTheChangelog\">点击此处查看更新日志</string>\n    <string name=\"localWeixinVersion\">本机微信：</string>\n    <string name=\"weixin\">Weixin</string>\n    <string name=\"localDetailsMMKV\">MMKV</string>\n    <string name=\"localDetailsMMKVDesc\">MMKV 是微信中的一个高效、小巧、易用的移动的键值对存储框架，可在 Android、iOS/macOS、Windows、POSIX 和 HarmonyOS NEXT 上使用。</string>\n    <string name=\"localDetailsWCDB\">WCDB</string>\n    <string name=\"localDetailsWCDBDesc\">WCDB 是一个易用、高效、完整的移动数据库框架，它基于 SQLite 和 SQLCipher 开发，在微信中应用广泛，且支持在 C++、Java、Kotlin、Swift、Objc 五种语言环境中使用。</string>\n    <string name=\"localDetailsTinker\">Tinker</string>\n    <string name=\"localDetailsTinkerDesc\">Tinker 是微信官方的 Android 热补丁解决方案，它支持动态下发代码、So 库以及资源，让应用能够在不需要重新安装的情况下实现更新。</string>\n    <string name=\"localDetailsMars\">Mars</string>\n    <string name=\"localDetailsMarsDesc\">Mars 是微信官方的跨平台跨业务的终端基础组件。</string>\n    <string name=\"localDetailsMatrix\">Matrix</string>\n    <string name=\"localDetailsMatrixDesc\">Matrix 是一款微信研发并日常使用的应用性能接入框架，支持 iOS, macOS 和 Android。 Matrix 通过接入各种性能监控方案，对性能监控项的异常数据进行采集和分析，输出相应的问题分析、定位与优化建议，从而帮助开发者开发出更高质量的应用。</string>\n    <string name=\"localWeixinVersionDetails\">本机微信版本详情</string>\n    <string name=\"localDetailsReactNativeDesc\">React Native 将 React 的声明式 UI 框架引入 iOS 和 Android。使用 React Native，您可以直接使用原生 UI 控件，并拥有对原生平台的完整访问权限。</string>\n    <string name=\"localDetailsReactNative\">React Native</string>\n    <string name=\"localDetailsTBSDesc\">腾讯浏览服务（Tencent Browsing Service，简称 TBS）属于 PCG 事业群，QQ 浏览器团队。QQ 浏览器作为一个平台化的产品，不论是网页的打开还是文档能力的打开，都需要一个强大的自研引擎做支撑，而引擎研发团队，一直深耕引擎底层技术 10 余年，积累了丰富的业务经验，将引擎技术从产品独立出来为 SDK，并不断演进成一个平台化的引擎产品，成立腾讯浏览服务，为腾讯公司内外产品提供强大的引擎技术支持和技术服务支持，覆盖了近十万家产品接入，并支持数亿级的网页浏览体验。</string>\n    <string name=\"localDetailsTBS\">腾讯浏览服务</string>\n    <string name=\"biometricLoginTitle\">验证您的身份</string>\n    <string name=\"biometricLoginSubtitle\">验证您的身份以进一步操作</string>\n    <string name=\"llmInferenceLocalChanges\">应用更改推测</string>\n    <string name=\"genByAITips\">内容由 AI 生成，可能存在不准确的信息。</string>\n    <string name=\"llmInferenceLocalChangesDesc\">应用包分析外部应用时可以使用 LLM 推测外部应用与本机应用的功能变更，需要在“私有 Token 管理”填入智谱 Token</string>\n    <string name=\"llmInferenceLocalChangesPrompt\">用户本地已经安装了 %1$s %2$s，今天用户收到了一个 %1$s %3$s 安装包，用户已经得出收到的 %1$s %3$s 安装包的四大组件（activity、service、content provider、broadcast receiver）与权限和用户本地已安装的 %1$s %2$s 之间的差异。请根据用户传入的上述差异的文本，以清晰简洁的 %4$s 语言分析推测该差异可能存在的应用变更，要求：1) 提取核心功能优化和关键问题修复，忽略技术细节 2) 采用 Pangu 格式化文本，确保中英文/数字间自动空格 3) 用连贯段落呈现，严格控制在 300 字内。输出需突出用户感知明显的改进点，使用规范化表述，禁止列表格式且不使用 Markdown。</string>\n    <string name=\"timeout\">连接超时</string>\n    <string name=\"localDetailsSkylineRenderingEngine\">Skyline 渲染引擎</string>\n    <string name=\"localDetailsSkylineRenderingEngineDesc\">为了进一步优化小程序性能，提供更为接近原生的用户体验，微信团队在 WebView 渲染之外新增了一个渲染引擎 Skyline，其使用更精简高效的渲染管线，并带来诸多增强特性，让 Skyline 拥有更接近原生渲染的性能体验。</string>\n    <string name=\"versionNumberFontUseTCloudNumberDesc\">可在下方调整腾讯云数字字体字重</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-ko-rKR/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<resources>\n    <string name=\"app_name\">QQ 版本列表实用工具</string>\n    <string name=\"appTitle\">QQ 版本列表实用工具</string>\n    <string name=\"shortcutLongLabel\">扫版（维护模式）</string>\n    <string name=\"shortcutShortLabel\">扫版（维护）</string>\n    <string name=\"start\">开始</string>\n    <string name=\"cancel\">取消</string>\n    <string name=\"done\">确定</string>\n    <string name=\"save\">保存</string>\n    <string name=\"installed\">已安装</string>\n    <string name=\"copy\">复制</string>\n    <string name=\"refresh\">刷新</string>\n    <string name=\"agree\">同意</string>\n    <string name=\"disagreeAndExit\">不同意并退出</string>\n    <string name=\"withdrawConsentUA\">撤回同意用户协议</string>\n    <string name=\"withdrawConsentAndExit\">撤回同意并退出</string>\n    <string name=\"userAgreement\">用户协议</string>\n    <string name=\"enumerateVersionsFAB\">扫版（维护模式）</string>\n    <string name=\"enumerateVersionsDialogTitle\">扫版（维护模式）</string>\n    <string name=\"setting\">设置</string>\n    <string name=\"personalization\">个性化</string>\n    <string name=\"about\">关于</string>\n    <string name=\"enumerateVersionsFormatSetting\">扫版直链格式设置</string>\n    <string name=\"getUpdateFromTDSShiplyDistributionPlatform\">TDS 腾讯端服务 Shiply 容器与发布平台更新获取（实验性）</string>\n    <string name=\"getUpdateFromShiplyPlatform\">Shiply 平台更新获取（实验性）</string>\n    <string name=\"acceptedEnumerateVersion\">扫版成功</string>\n    <string name=\"contentReturnedByShiplyPlatform\">Shiply 平台返回内容</string>\n    <string name=\"applicationError\">程序出错</string>\n    <string name=\"additionalActions\">进一步操作</string>\n    <string name=\"shareTo\">分享到</string>\n    <string name=\"jsonDetails\">JSON 详情</string>\n    <string name=\"stableVersion\">正式版</string>\n    <string name=\"previewVersion\">测试版</string>\n    <string name=\"spaceEnumerateVersion\">空格扫版</string>\n    <string name=\"weixinEnumerateVersion\">微信扫版</string>\n    <string name=\"aboutAppName\">QQ 版本列表实用工具 for Android™</string>\n    <string name=\"aboutAuthor\">作者：</string>\n    <string name=\"aboutContributor\">贡献者：</string>\n    <string name=\"version\">版本：</string>\n    <string name=\"aboutSpecialThanksTo\">特别感谢：</string>\n    <string name=\"aboutOpenSourceRepo\">开源仓库：</string>\n    <string name=\"aboutGetUpdate\">获取更新：</string>\n    <string name=\"aboutDescription\">提供 Android QQ 版本列表的查看和对 Android QQ 下载链接的枚举法扫描。</string>\n    <string name=\"copied\">已复制：</string>\n    <string name=\"reatedFileSize\">额定大小：</string>\n    <string name=\"sourceJSON\">源 JSON</string>\n    <string name=\"recommendations\">建议的内容</string>\n    <string name=\"longPressTheVersionCardToViewSourceDetails\">长按版本卡片查看源详情</string>\n    <string name=\"useTheSystemDownloadManagerToTakeOverTheDownloadIntent\">使用系统下载管理器</string>\n    <string name=\"removeMultiplesOf5ForQQPreviewVersions\">解除 QQ 测试版扫版小版本号遵循 5 的倍数限制</string>\n    <string name=\"longPressToViewSourceDetailsIsDisabled\">未开启长按查看源详情功能，请前往设置开启</string>\n    <string name=\"currentSizeVsLargestHistoricalPackage\">占比历史最大包（%s）：</string>\n    <string name=\"extendTheSuffixForDirectDownloadLinksOfEnumeratedPreviewVersions\">扩展测试版扫版直链后缀</string>\n    <string name=\"fileSize\">大小：</string>\n    <string name=\"downloadLink\">下载地址：</string>\n    <string name=\"saved\">已保存</string>\n    <string name=\"enumQQPreviewWarning\">鉴于 QQ 测试版可能存在不可预知的稳定性问题，您在下载及使用该测试版本之前，必须明确并确保自身具备足够的风险识别和承受能力。根据相关条款，您使用本软件时应当已了解并同意，因下载或使用 QQ 测试版而可能产生的任何直接或间接损失、损害以及其他不利后果，均由您自行承担全部责任。</string>\n    <string name=\"enumQQMajorVersionHelpText\">填写格式为 x.y.z</string>\n    <string name=\"enumWeixinMajorVersionHelpText\">无需填写小数点</string>\n    <string name=\"enumWeixinWarning\">微信扫版功能为 QQ 版本列表实用工具附带的实验性功能，可能存在不可预知的稳定性问题。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"enumHasBeenStopped\">已停止扫描</string>\n    <string name=\"missingCipherWarning\">TDS 腾讯端服务 Shiply 容器与发布平台返回 JSON 内容中未包含“cipher_text”键值对。</string>\n    <string name=\"missingMajorVersionWarning\">扫版需要填写主版本号，否则无法执行扫版。</string>\n    <string name=\"missingQQPreviewMinorVersionWarning\">测试版扫版（含空格扫版）需要填写小版本号，否则无法扫描测试版。</string>\n    <string name=\"QQPreviewMinorNot5Warning\">小版本号需填写 5 的倍数。如需解除此限制，请前往设置进行解除。</string>\n    <string name=\"missingWeixinTrueVersionWarning\">微信扫版需要填写真实版本号，否则无法扫描微信版本。</string>\n    <string name=\"missingWeixin16CodeWarning\">微信扫版需要填写十六进制代码，否则无法扫描微信版本。</string>\n    <string name=\"enumeratingDownloadLink\">正在扫描下载地址：</string>\n    <string name=\"majorVersion\">主版本号</string>\n    <string name=\"initialMinorVersion\">起始小版本号</string>\n    <string name=\"hexadecimalCode\">十六进制代码</string>\n    <string name=\"initialMinorVersionHelpText\">填写起始扫描小版本号，扫正式版时无需填写</string>\n    <string name=\"hexadecimalCodeHelpText\">填写十六进制代码，仅微信扫版使用</string>\n    <string name=\"enumType\">扫版类型</string>\n    <string name=\"enumTypeHelpText\">指定扫版目标类型</string>\n    <string name=\"trueVersion\">真实版本号</string>\n    <string name=\"trueVersionHelpText\">填写真实版本号（版本码），仅微信扫版使用</string>\n    <string name=\"appidOptional\">appid（非必填）</string>\n    <string name=\"shiplyGeneralOptionalHelpText\">默认值：</string>\n    <string name=\"shiplyVersion\">版本</string>\n    <string name=\"shiplyVersionHelpText\">填写用于请求 Shiply 平台的 Android QQ/TIM 版本号</string>\n    <string name=\"uinHelpText\">填写用于请求 Shiply 平台的对象 QQ 号</string>\n    <string name=\"shiplyWarning\">腾讯 QQ/TIM 使用 TDS 腾讯端服务 Shiply 容器与发布平台，根据 QQ 号（uin）及其终端信息分发小范围灰度测试安装包。此功能并非每次请求都能成功获取到更新数据，无法获取更新数据则表示填写的参数不在 Shiply 平台认可与分发范围内。QQ 版本列表实用工具不对此功能及其任何后果作出任何可靠性保证。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"defaultDisplayOfFirstListItemDetails\">首项卡片默认显示详情</string>\n    <string name=\"versionNumberFontUseTCloudNumber\">使用腾讯云数字字体</string>\n    <string name=\"versionCardsDisplaysPackageSizeIndicator\">显示额定包大小占比历史最大包指示条</string>\n    <string name=\"customVersionEnumSuffix\">自定义扫版后缀</string>\n    <string name=\"customVersionEnumSuffixHelpText\">请使用“, ”（西文逗号+空格）分割</string>\n    <string name=\"facilitateI18n\">协助翻译：</string>\n    <string name=\"versionCardExpandButtonContentDescription\">展开详情</string>\n    <string name=\"versionCardCollapseButtonContentDescription\">收起详情</string>\n    <string name=\"shiplyAdvancedConfigurations\">进阶配置</string>\n    <string name=\"shiplyOsVersionOptional\">osVersion（非必填）</string>\n    <string name=\"shiplySdkVersionOptional\">sdkVersion（非必填）</string>\n    <string name=\"shiplyModelOptional\">model（非必填）</string>\n    <string name=\"shiplyLanguageOptional\">language（非必填）</string>\n    <string name=\"thicknessFollowSystem\">跟随系统</string>\n    <string name=\"back\">返回</string>\n    <string name=\"shiplyUseAdvancedConfigurations\">使用进阶配置</string>\n    <string name=\"localQQVersion\">本机 QQ：</string>\n    <string name=\"bracket\">（%s）</string>\n    <string name=\"localTIMVersion\">本机 TIM：</string>\n    <string name=\"localQQVersionDetails\">本机 QQ 版本详情</string>\n    <string name=\"localTIMVersionDetails\">本机 TIM 版本详情</string>\n    <string name=\"accessibilityTag\">6IW+6K6vIFFRIOW3suS4iue6v+S4gOmhueaXoOmanOeijeeUqOaIt+S4k+WxnuS8mOWMluaOquaWveabtOaWsOOAguenu+WKqOe7iOerr+iuvuWkh+W8gOWQr+ezu+e7n+aXoOmanOeijeivu+Wxj+acjeWKoe+8iOWmgiBBbmRyb2lkIFRhbGtiYWNr44CBaU9TIFZvaWNlT3Zlcu+8ie+8jOW5tuWQjOaXtuS9v+eUqOiFvuiuryBRUSDnp7vliqjlrqLmiLfnq68gOS4wLjg1IOWPiuS7peS4iueJiOacrOaXtu+8jOiFvuiuryBRUSDlsIblh4/lsJHmiJblgZzmraLlkJHmraTnsbsgUVEg5a6i5oi356uv5LiL5Y+R5bm/5ZGK44CC</string>\n    <string name=\"imageGallery\">应用宣传图</string>\n    <string name=\"share\">分享</string>\n    <string name=\"download\">下载</string>\n    <string name=\"stop\">停止</string>\n    <string name=\"skip\">跳过</string>\n    <string name=\"qqntTag\">基于 QQNT 技术架构</string>\n    <string name=\"releaseDateTIM\">发布日期：</string>\n    <string name=\"checkUpdateViaGitHubAPI\">使用 GitHub REST API 检查更新</string>\n    <string name=\"noUpdatesDetected\">未检测到更新</string>\n    <string name=\"noAssetsDetected\">未检测到资产文件</string>\n    <string name=\"cannotGetGitHub\">无法连接到 GitHub，请确保您所在网络环境可以访问 GitHub。</string>\n    <string name=\"updateQverbowAvailable\">更新可用</string>\n    <string name=\"copyLink\">复制链接</string>\n    <string name=\"unrealEngineTag\">内置虚幻引擎</string>\n    <string name=\"autoCheckForUpdates\">启动时检查更新</string>\n    <string name=\"useQQ8958Test\">使用 QQ 8.9.58 测试版直链格式</string>\n    <string name=\"ciVersionNoSupportUpdates\">CI 构建版本不支持检查更新</string>\n    <string name=\"showUnrealEngineTag\">显示虚幻引擎标识</string>\n    <string name=\"suffixSetting\">后缀设置</string>\n    <string name=\"others\">其它</string>\n    <string name=\"ok\">好</string>\n    <string name=\"swipeLeftToSeeMore\">向左滑动查看更多</string>\n    <string name=\"getUpdateFromTencentAppStore\">腾讯应用宝更新获取（实验性）</string>\n    <string name=\"experimentalFeatures\">实验性功能</string>\n    <string name=\"getQQLinkFromTencentAppStore\">获取 QQ 下载直链</string>\n    <string name=\"getTIMLinkFromTencentAppStore\">获取 TIM 下载直链</string>\n    <string name=\"getWeixinLinkFromTencentAppStore\">获取微信下载直链</string>\n    <string name=\"getWeComLinkFromTencentAppStore\">获取企业微信下载直链</string>\n    <string name=\"contentReturnedByTencentAppStore\">腾讯应用宝返回内容</string>\n    <string name=\"getWeTypeLinkFromTencentAppStore\">获取微信输入法下载直链</string>\n    <string name=\"tencentAppStoreWarning\">腾讯应用宝更新获取功能为 QQ 版本列表实用工具附带的实验性功能，可能存在不可预知的稳定性问题。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"showOldLoading\">扫版对话框使用旧版加载动画</string>\n    <string name=\"versionCardsDisplaysPackageSizeText\">显示额定包大小占比历史最大包百分比</string>\n    <string name=\"timVersion\">TIM 扫版</string>\n    <string name=\"enumTIMWarning\">TIM 扫版功能为 QQ 版本列表实用工具附带的实验性功能，可能存在不可预知的稳定性问题。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"useQQ9008_14600Test\">扫版类型添加 QQ 9.0.8.14600 空格直链格式</string>\n    <string name=\"initFirebaseService\">初始化 Firebase 服务</string>\n    <string name=\"enablingFirebaseServiceWarning\">初始化 Firebase 服务后，将立即在本地由 Firebase SDK 生成注册令牌，并将标识符和配置数据上传到 Firebase 服务器。此操作一经启用即无法撤销，是否继续？</string>\n    <string name=\"rainbow_notification_channel_id\">版本列表更新</string>\n    <string name=\"cannotFindGooglePlayServices\">未在当前设备检测到 Google Play 服务，因此无法在当前设备中使用由 Firebase 提供的服务。</string>\n    <string name=\"rainbow_notification_channel_title\">版本列表更新</string>\n    <string name=\"rainbow_notification_channel_description\">通过 Firebase 云消息传递</string>\n    <string name=\"enablingFirebaseServiceInsights\">启用 Firebase 服务可使用以下功能：\\n- 通过 Firebase 云消息传递的版本列表更新提醒</string>\n    <string name=\"enablingFirebaseServiceWarning2\">Firebase 云消息传递绑定了 Google Analytics 分析服务，使用 Firebase 云消息传递将不可避免地上传您在此软件的活跃信息。</string>\n    <string name=\"continueKey\">继续</string>\n    <string name=\"initializedFirebaseService\">Firebase 服务已初始化，无法撤销</string>\n    <string name=\"cannotEnableFirebaseCloudMessaging\">接收版本列表更新通知提醒必须打开系统通知权限，否则无法接收版本列表更新提醒。</string>\n    <string name=\"pushSystemNotificationsWhenVersionListUpdates\">版本列表更新时推送系统通知</string>\n    <string name=\"unsubscribeTimeout\">取消订阅超时</string>\n    <string name=\"unsubscribeSuccess\">取消订阅成功</string>\n    <string name=\"unsubscribeFailed\">取消订阅失败</string>\n    <string name=\"subscribeTimeout\">订阅超时</string>\n    <string name=\"subscribeSuccess\">订阅成功</string>\n    <string name=\"subscribeFailed\">订阅失败</string>\n    <string name=\"initializedFirebaseServiceItem\">Firebase 服务已初始化</string>\n    <string name=\"toSystemSetting\">前往系统设置</string>\n    <string name=\"threePartySharedList\">个人信息第三方共享清单</string>\n    <string name=\"shiplyTargetApp\">目标应用</string>\n    <string name=\"shiplyTargetAppQQ\">QQ</string>\n    <string name=\"shiplyTargetAppTIM\">TIM</string>\n    <string name=\"shiplyTargetHelper\">指定请求 Shiply 平台的目标应用</string>\n    <string name=\"openSourceLicenseTitle\">开放源代码许可</string>\n    <string name=\"basedOnQQVer\">基于 Android QQ %s 二次开发</string>\n    <string name=\"getQidianLinkFromTencentAppStore\">获取腾讯企点下载直链</string>\n    <string name=\"getWeixinAlphaLinkFromWeixinConfigDesc\">从腾讯服务器配置拉取微信最新测试版下载直链</string>\n    <string name=\"successInGetting\">获取成功</string>\n    <string name=\"getWeixinAlphaConfig404\">似乎未成功访问腾讯服务器配置文件，可能是微信当前没有测试版或测试版已撤包。</string>\n    <string name=\"getWeixinAlphaConfigLink404\">似乎未成功访问此下载地址，可能是微信当前测试版已撤包。</string>\n    <string name=\"suspectedPackageWithdrawal\">疑似撤包</string>\n    <string name=\"colon\">：</string>\n    <string name=\"qverbowHash\">杂凑值校验</string>\n    <string name=\"verifyHashValueViaGitHubAPI\">通过 GitHub REST API 校验杂凑值</string>\n    <string name=\"hashIsTrue\">杂凑值与 GitHub Releases 一致</string>\n    <string name=\"hashIsFalse\">您所使用的版本与 GitHub Releases 杂凑值不一致，为了您的安全，请尽快卸载当前版本应用并前往官方 GitHub Releases 下载此软件。</string>\n    <string name=\"toGitHubRelease\">前往下载</string>\n    <string name=\"getWeTypeTestLinkFromWeTypeLatestChannelDesc\">从微信输入法测试通道获取微信输入法最新下载直链</string>\n    <string name=\"getWeTypeLatestChannel404\">未成功访问微信输入法服务器，请检查您的网络连接。</string>\n    <string name=\"kuiklyTag\">存在 TDS 腾讯端服务 Kuikly 开发框架</string>\n    <string name=\"showKuiklyTag\">显示 Kuikly 开发框架标识</string>\n    <string name=\"getWeTypeTestLinkFromWeTypeLatestChannel\">获取微信输入法测试版</string>\n    <string name=\"getWeixinAlphaLinkFromWeixinConfig\">获取微信测试版</string>\n    <string name=\"autoCheckForUpdatesDesc\">每次启动时将通过 GitHub REST API 检查一次更新</string>\n    <string name=\"useTheSystemDownloadManagerToTakeOverTheDownloadIntentDesc\">开启后，软件全局触发下载意图时将不再打开浏览器</string>\n    <string name=\"showKuiklyTagDesc\">Kuikly 内置情况以 QQ 正式版为判断来源</string>\n    <string name=\"versionCardsDisplaysPackageSizeDesc\">仅对 QQ 版本卡片生效</string>\n    <string name=\"aboutVersionCards\">版本列表与卡片</string>\n    <string name=\"showUnrealEngineTagDesc\">虚幻引擎内置情况以 QQ 正式版为判断来源</string>\n    <string name=\"general\">通用</string>\n    <string name=\"copyAll\">复制全部</string>\n    <string name=\"enumVerMaintenanceModeWarning\">扫版功能已进入维护模式。您仍可以继续使用现有扫版功能，但 QQ 版本列表实用工具不再对相关功能及其任何后果作出任何可靠性保证，不再对相关功能进行积极开发，也不再接受相关新功能请求。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"localDetailsQQNT\">QQNT 技术架构</string>\n    <string name=\"localDetailsBugly\">Bugly 端质量监控平台</string>\n    <string name=\"localDetailsShiply\">Shiply 容器与发布平台</string>\n    <string name=\"localDetailsHippy\">Hippy 跨端开发框架</string>\n    <string name=\"localDetailsKuikly\">Kuikly 跨端开发框架</string>\n    <string name=\"localDetailsRightly\">Rightly 应用合规解决方案</string>\n    <string name=\"localDetailsUELibrary\">Unreal Engine as a Library</string>\n    <string name=\"localDetailsUELibraryDesc\">Unreal Engine as a Library 会将虚幻引擎的功能重新打包成一个库，以便其他应用程序生成和控制它们自己的 UE 实例。UELibrary 提供了一种简单、不依赖于平台的 API 来驱动 UE。</string>\n    <string name=\"localDetailsBuglyDesc\">Bugly 是 TDS 腾讯端服务（Tencent Device-oriented Service）旗下的端质量监控平台，通过采集、监控、定位、告警等核心能力，提供专业的质量监控服务，帮助开发者及时发现并解决质量问题，打造高质量应用。</string>\n    <string name=\"localDetailsShiplyDesc\">Shiply，全称 TDS 腾讯端服务 Shiply 容器与发布，属于 TDS 腾讯端服务系列产品的子产品之一，是源于腾讯内部 App 的一站式容器与发布解决方案。Shiply 提供了一套规则灵活、发布安全、高效分发的终端基础通用发布系统，功能包括：配置与开关、资源发布、应用升级，移动端热修复、Flutter 动态化、跨端开发框架等相关能力和分发支持，帮助产品和技术团队提高研效能力和决策力。</string>\n    <string name=\"localDetailsHippyDesc\">Hippy 是 TDF 腾讯端框架（Tencent Device-oriented Framework）下的开源跨平台应用开发解决方案。Hippy 从底层做了大量工作，抹平了 iOS、Android、OpenHarmony 三端差异，提供了接近 Web 的开发体验，目前上层支持了 React 和 Vue 两套界面框架，前端开发人员可以通过它，将前端代码转换为终端的原生指令，进行原生终端 APP 的开发。同时，Hippy 从底层进行了大量优化，在启动速度、渲染性能、动画速度、内存占用、包体积等方面都提供了业内顶尖的性能表现。</string>\n    <string name=\"localDetailsRightlyDesc\">Rightly 是面向移动端的全流程合规解决方案，集「合规管控」和「合规测评」为一体，为 APP 提供运行全周期数据安全与合规保护解决方案，也为 APP 提供个人信息风险审查与合规性检测服务，覆盖多项隐私安全指标。Rightly 能够助力业务提高合规效率，降低违规风险。</string>\n    <string name=\"localDetailsKuiklyDesc\">Kuikly（Kotlin UI Kit）跨端开发框架，是 TDF 腾讯端框架（Tencent Device-oriented Framework）的一部分。Kuikly 通过自研 Kotlin Multiplatform 逻辑与终端界面原生控件渲染映射协议层，并采用声明式与响应式设计，使采用 Kuikly 的 Kotlin 开发者能拥有原生高效的 Android 开发体验并构建具有原生性能的跨平台应用。Kuikly 更可依托于 TDS 腾讯端服务 Shiply 容器与发布平台，实现按页颗粒度的完备客户端界面动态化能力。</string>\n    <string name=\"localDetailsQQNTDesc\">QQNT 技术架构是腾讯 QQ 客户端全新的跨平台技术架构体系。QQNT 技术架构将 QQ 客户端核心功能——如核心登录、消息系统、关系链、富媒体、长连接、数据库等——下沉至 QQNT 内核层，使用 C++ 抽象逻辑封装为原生库并提供多平台多语言一致性接口，以实现 QQ 客户端核心逻辑代码跨平台与程序高性能运作。</string>\n    <string name=\"localDetailsMsg\">详细信息</string>\n    <string name=\"stackInfo\">技术栈信息</string>\n    <string name=\"details\">详情</string>\n    <string name=\"thisVerContains\">此版本包含 %s</string>\n    <string name=\"packageNameIsErr\">应用包名与预设不匹配</string>\n    <string name=\"useNewLocalDetailsPage\">使用新版本机应用详情页</string>\n    <string name=\"fileErr\">文件类型错误</string>\n    <string name=\"apkAnalyze\">应用包分析</string>\n    <string name=\"unknownErr\">未知错误</string>\n    <string name=\"notEnoughSpaceOnTheDevice\">设备剩余空间不足</string>\n    <string name=\"localDetailsTencentBeacon\">腾讯灯塔</string>\n    <string name=\"localDetailsTencentBeaconDesc\">腾讯灯塔全场景大数据分析套件，是腾讯 50+ 业务自 2018 年以来使用数据中台演化而成，支持每日数十亿条数据资产的全面管理，数千业务员工深度依赖的整体化工具套件。</string>\n    <string name=\"haveNotAgreeUA\">未同意用户协议，无法使用本软件</string>\n    <string name=\"localDetailsFlutter\">Flutter</string>\n    <string name=\"localDetailsFlutterDesc\">Flutter 是 Google 的便携式 UI 工具包，帮助你在移动、web、桌面端创造高质量的绝妙原生体验的应用。 Flutter 可以和世界上的开发人员和开发组织广泛使用的那些现存代码一起使用，并且是开源的、免费的。</string>\n    <string name=\"localDetailsJetpackCompose\">Jetpack Compose</string>\n    <string name=\"localDetailsJetpackComposeDesc\">Jetpack Compose는 네이티브 Android UI를 빌드하기 위한 최신 도구 키트입니다. Jetpack Compose는 더 적은 수의 코드, 강력한 도구, 직관적인 Kotlin API로 Android에서의 UI 개발을 간소화하고 가속화합니다. </string>\n    <string name=\"localDetailsComposeMultiplatform\">Compose Multiplatform</string>\n    <string name=\"localDetailsComposeMultiplatformDesc\">Compose Multiplatform 是一个由 JetBrains 开发的现代化声明式和响应式 UI 框架，它提供了一种只需少量 Kotlin 代码即可构建用户界面的简单方法。它还允许您只需编写一次用户界面，即可在任何支持的平台——iOS、Android、桌面（Windows、macOS、Linux）和 Web——上运行。</string>\n    <string name=\"security\">安全</string>\n    <string name=\"privateTokenSettings\">私有 Token 管理</string>\n    <string name=\"privateTokenSettingsDesc\">此处内填入的 Token 将由 Android 密钥库系统安全加密后存储</string>\n    <string name=\"zhipuAIMaaSPlatformToken\">智谱 AI 开放平台 Token</string>\n    <string name=\"updateLogPrompt\">请根据用户传入的更新日志文本，以清晰简洁的 %s 语言对更新日志文本进行专业总结，要求：1) 提取核心功能优化和关键问题修复，忽略技术细节 2) 采用 Pangu 格式化文本，确保中英文/数字间自动空格 3) 完全避免产品名称及主观评价 4) 用连贯段落呈现，严格控制在 150 字内。输出需突出用户感知明显的改进点，使用规范化表述，禁止列表格式且不使用 Markdown。</string>\n    <string name=\"githubPersonalAccessToken\">GitHub 个人访问令牌</string>\n    <string name=\"TEESupported\">密钥由设备可信执行环境（TEE）安全硬件提供保护</string>\n    <string name=\"StrongBoxSupported\">密钥由设备 StrongBox 安全元件提供保护</string>\n    <string name=\"UnknownSecurityHardwareSupported\">密钥由设备安全硬件提供保护</string>\n    <string name=\"SecuritySoftwareSupported\">密钥由 Android 密钥库提供保护</string>\n    <string name=\"testGitHubToken\">保存并联网测试 GitHub 个人访问令牌可用性</string>\n    <string name=\"testZhipuToken\">保存并联网测试智谱 AI 开放平台 Token 可用性</string>\n    <string name=\"testZhipuTokenPrompt\">用户正在测试与您的连通性。如果您收到了这句话，请使用 %s 语言热情地与用户打招呼并用一段话详细介绍自己的模型名称。</string>\n    <string name=\"backFromZhipuPlatform\">智谱 AI 开放平台返回内容</string>\n    <string name=\"zhipuTokenSuccess\">智谱 Token 可用</string>\n    <string name=\"zhipuTokenIsNull\">智谱 Token 为空</string>\n    <string name=\"githubTokenIsNull\">GitHub 个人访问令牌为空</string>\n    <string name=\"githubTokenSuccess\">GitHub 个人访问令牌可用</string>\n    <string name=\"githubTokenUnavailable\">GitHub 个人访问令牌不可用，请检查您的 GitHub 个人访问令牌有效性。</string>\n    <string name=\"githubTokenUnavailableTitle\">GitHub 个人访问令牌不可用</string>\n    <string name=\"testToken\">测试 Token 可用性</string>\n    <string name=\"llmIntelligent\">LLM 智能摘要</string>\n    <string name=\"aiLLMInference\">LLM 推理</string>\n    <string name=\"qverbowUpdateLogLLMIntelligentDesc\">检查到更新时将使用 LLM 智能摘要更新日志，需要在“私有 Token 管理”填入智谱 Token</string>\n    <string name=\"qverbowUpdateLogLLMIntelligent\">更新日志智能摘要</string>\n    <string name=\"githubTokenHelperText\">GitHub 个人访问令牌将用于解除 GitHub REST API 访问速率限制，填入并保存即生效</string>\n    <string name=\"zhipuTokenHelperText\">默认仅请求智谱免费模型 GLM-4-Flash</string>\n    <string name=\"zhipuTokenIsInvalid\">填入的 Token 被智谱 AI 开放平台大模型接口 Java SDK 判定无效。</string>\n    <string name=\"clickHereToViewTheChangelog\">点击此处查看更新日志</string>\n    <string name=\"localWeixinVersion\">本机微信：</string>\n    <string name=\"weixin\">Weixin</string>\n    <string name=\"localDetailsMMKV\">MMKV</string>\n    <string name=\"localDetailsMMKVDesc\">MMKV 是微信中的一个高效、小巧、易用的移动的键值对存储框架，可在 Android、iOS/macOS、Windows、POSIX 和 HarmonyOS NEXT 上使用。</string>\n    <string name=\"localDetailsWCDB\">WCDB</string>\n    <string name=\"localDetailsWCDBDesc\">WCDB 是一个易用、高效、完整的移动数据库框架，它基于 SQLite 和 SQLCipher 开发，在微信中应用广泛，且支持在 C++、Java、Kotlin、Swift、Objc 五种语言环境中使用。</string>\n    <string name=\"localDetailsTinker\">Tinker</string>\n    <string name=\"localDetailsTinkerDesc\">Tinker 是微信官方的 Android 热补丁解决方案，它支持动态下发代码、So 库以及资源，让应用能够在不需要重新安装的情况下实现更新。</string>\n    <string name=\"localDetailsMars\">Mars</string>\n    <string name=\"localDetailsMarsDesc\">Mars 是微信官方的跨平台跨业务的终端基础组件。</string>\n    <string name=\"localDetailsMatrix\">Matrix</string>\n    <string name=\"localDetailsMatrixDesc\">Matrix 是一款微信研发并日常使用的应用性能接入框架，支持 iOS, macOS 和 Android。 Matrix 通过接入各种性能监控方案，对性能监控项的异常数据进行采集和分析，输出相应的问题分析、定位与优化建议，从而帮助开发者开发出更高质量的应用。</string>\n    <string name=\"localWeixinVersionDetails\">本机微信版本详情</string>\n    <string name=\"localDetailsReactNativeDesc\">React Native 将 React 的声明式 UI 框架引入 iOS 和 Android。使用 React Native，您可以直接使用原生 UI 控件，并拥有对原生平台的完整访问权限。</string>\n    <string name=\"localDetailsReactNative\">React Native</string>\n    <string name=\"localDetailsTBSDesc\">腾讯浏览服务（Tencent Browsing Service，简称 TBS）属于 PCG 事业群，QQ 浏览器团队。QQ 浏览器作为一个平台化的产品，不论是网页的打开还是文档能力的打开，都需要一个强大的自研引擎做支撑，而引擎研发团队，一直深耕引擎底层技术 10 余年，积累了丰富的业务经验，将引擎技术从产品独立出来为 SDK，并不断演进成一个平台化的引擎产品，成立腾讯浏览服务，为腾讯公司内外产品提供强大的引擎技术支持和技术服务支持，覆盖了近十万家产品接入，并支持数亿级的网页浏览体验。</string>\n    <string name=\"localDetailsTBS\">腾讯浏览服务</string>\n    <string name=\"biometricLoginTitle\">验证您的身份</string>\n    <string name=\"biometricLoginSubtitle\">验证您的身份以进一步操作</string>\n    <string name=\"llmInferenceLocalChanges\">应用更改推测</string>\n    <string name=\"genByAITips\">内容由 AI 生成，可能存在不准确的信息。</string>\n    <string name=\"llmInferenceLocalChangesDesc\">应用包分析外部应用时可以使用 LLM 推测外部应用与本机应用的功能变更，需要在“私有 Token 管理”填入智谱 Token</string>\n    <string name=\"llmInferenceLocalChangesPrompt\">用户本地已经安装了 %1$s %2$s，今天用户收到了一个 %1$s %3$s 安装包，用户已经得出收到的 %1$s %3$s 安装包的四大组件（activity、service、content provider、broadcast receiver）与权限和用户本地已安装的 %1$s %2$s 之间的差异。请根据用户传入的上述差异的文本，以清晰简洁的 %4$s 语言分析推测该差异可能存在的应用变更，要求：1) 提取核心功能优化和关键问题修复，忽略技术细节 2) 采用 Pangu 格式化文本，确保中英文/数字间自动空格 3) 用连贯段落呈现，严格控制在 300 字内。输出需突出用户感知明显的改进点，使用规范化表述，禁止列表格式且不使用 Markdown。</string>\n    <string name=\"timeout\">连接超时</string>\n    <string name=\"localDetailsSkylineRenderingEngine\">Skyline 渲染引擎</string>\n    <string name=\"localDetailsSkylineRenderingEngineDesc\">为了进一步优化小程序性能，提供更为接近原生的用户体验，微信团队在 WebView 渲染之外新增了一个渲染引擎 Skyline，其使用更精简高效的渲染管线，并带来诸多增强特性，让 Skyline 拥有更接近原生渲染的性能体验。</string>\n    <string name=\"versionNumberFontUseTCloudNumberDesc\">可在下方调整腾讯云数字字体字重</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-night/themes.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n\n<resources xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <style name=\"Base.Theme.QQVersionList\" parent=\"Theme.Material3.DynamicColors.DayNight.NoActionBar\">\n        <item name=\"android:windowLightStatusBar\">false</item>\n        <item name=\"android:windowSplashScreenBackground\" tools:targetApi=\"31\">\n            ?attr/colorPrimaryContainer\n        </item>\n        <item name=\"android:windowSplashScreenAnimatedIcon\" tools:targetApi=\"31\">\n            @drawable/ic_launcher_foreground_splash\n        </item>\n        <item name=\"android:windowSplashScreenIconBackgroundColor\" tools:targetApi=\"31\">\n            ?attr/colorPrimaryContainer\n        </item>\n        <item name=\"android:windowDrawsSystemBarBackgrounds\">true</item>\n        <item name=\"android:windowLayoutInDisplayCutoutMode\" tools:targetApi=\"27\">shortEdges</item>\n        <item name=\"bottomSheetDialogTheme\">@style/ThemeOverlay.App.BottomSheetDialog</item>\n        <item name=\"android:navigationBarColor\">@android:color/transparent</item>\n        <item name=\"android:statusBarColor\">@android:color/transparent</item>\n    </style>\n\n    <style name=\"ThemeOverlay.App.BottomSheetDialog\" parent=\"ThemeOverlay.Material3.BottomSheetDialog\">\n        <item name=\"android:navigationBarColor\">@android:color/transparent\n        </item>\n    </style>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-ru-rRU/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<resources>\n    <string name=\"app_name\">QQ 版本列表实用工具</string>\n    <string name=\"appTitle\">QQ 版本列表实用工具</string>\n    <string name=\"shortcutLongLabel\">扫版（维护模式）</string>\n    <string name=\"shortcutShortLabel\">扫版（维护）</string>\n    <string name=\"start\">开始</string>\n    <string name=\"cancel\">取消</string>\n    <string name=\"done\">确定</string>\n    <string name=\"save\">保存</string>\n    <string name=\"installed\">已安装</string>\n    <string name=\"copy\">复制</string>\n    <string name=\"refresh\">刷新</string>\n    <string name=\"agree\">同意</string>\n    <string name=\"disagreeAndExit\">不同意并退出</string>\n    <string name=\"withdrawConsentUA\">撤回同意用户协议</string>\n    <string name=\"withdrawConsentAndExit\">撤回同意并退出</string>\n    <string name=\"userAgreement\">用户协议</string>\n    <string name=\"enumerateVersionsFAB\">扫版（维护模式）</string>\n    <string name=\"enumerateVersionsDialogTitle\">扫版（维护模式）</string>\n    <string name=\"setting\">设置</string>\n    <string name=\"personalization\">个性化</string>\n    <string name=\"about\">关于</string>\n    <string name=\"enumerateVersionsFormatSetting\">扫版直链格式设置</string>\n    <string name=\"getUpdateFromTDSShiplyDistributionPlatform\">TDS 腾讯端服务 Shiply 容器与发布平台更新获取（实验性）</string>\n    <string name=\"getUpdateFromShiplyPlatform\">Shiply 平台更新获取（实验性）</string>\n    <string name=\"acceptedEnumerateVersion\">扫版成功</string>\n    <string name=\"contentReturnedByShiplyPlatform\">Shiply 平台返回内容</string>\n    <string name=\"applicationError\">程序出错</string>\n    <string name=\"additionalActions\">进一步操作</string>\n    <string name=\"shareTo\">分享到</string>\n    <string name=\"jsonDetails\">JSON 详情</string>\n    <string name=\"stableVersion\">正式版</string>\n    <string name=\"previewVersion\">测试版</string>\n    <string name=\"spaceEnumerateVersion\">空格扫版</string>\n    <string name=\"weixinEnumerateVersion\">微信扫版</string>\n    <string name=\"aboutAppName\">QQ 版本列表实用工具 for Android™</string>\n    <string name=\"aboutAuthor\">作者：</string>\n    <string name=\"aboutContributor\">贡献者：</string>\n    <string name=\"version\">版本：</string>\n    <string name=\"aboutSpecialThanksTo\">特别感谢：</string>\n    <string name=\"aboutOpenSourceRepo\">开源仓库：</string>\n    <string name=\"aboutGetUpdate\">获取更新：</string>\n    <string name=\"aboutDescription\">提供 Android QQ 版本列表的查看和对 Android QQ 下载链接的枚举法扫描。</string>\n    <string name=\"copied\">已复制：</string>\n    <string name=\"reatedFileSize\">额定大小：</string>\n    <string name=\"sourceJSON\">源 JSON</string>\n    <string name=\"recommendations\">建议的内容</string>\n    <string name=\"longPressTheVersionCardToViewSourceDetails\">长按版本卡片查看源详情</string>\n    <string name=\"useTheSystemDownloadManagerToTakeOverTheDownloadIntent\">使用系统下载管理器</string>\n    <string name=\"removeMultiplesOf5ForQQPreviewVersions\">解除 QQ 测试版扫版小版本号遵循 5 的倍数限制</string>\n    <string name=\"longPressToViewSourceDetailsIsDisabled\">未开启长按查看源详情功能，请前往设置开启</string>\n    <string name=\"currentSizeVsLargestHistoricalPackage\">占比历史最大包（%s）：</string>\n    <string name=\"extendTheSuffixForDirectDownloadLinksOfEnumeratedPreviewVersions\">扩展测试版扫版直链后缀</string>\n    <string name=\"fileSize\">大小：</string>\n    <string name=\"downloadLink\">下载地址：</string>\n    <string name=\"saved\">已保存</string>\n    <string name=\"enumQQPreviewWarning\">鉴于 QQ 测试版可能存在不可预知的稳定性问题，您在下载及使用该测试版本之前，必须明确并确保自身具备足够的风险识别和承受能力。根据相关条款，您使用本软件时应当已了解并同意，因下载或使用 QQ 测试版而可能产生的任何直接或间接损失、损害以及其他不利后果，均由您自行承担全部责任。</string>\n    <string name=\"enumQQMajorVersionHelpText\">填写格式为 x.y.z</string>\n    <string name=\"enumWeixinMajorVersionHelpText\">无需填写小数点</string>\n    <string name=\"enumWeixinWarning\">微信扫版功能为 QQ 版本列表实用工具附带的实验性功能，可能存在不可预知的稳定性问题。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"enumHasBeenStopped\">已停止扫描</string>\n    <string name=\"missingCipherWarning\">TDS 腾讯端服务 Shiply 容器与发布平台返回 JSON 内容中未包含“cipher_text”键值对。</string>\n    <string name=\"missingMajorVersionWarning\">扫版需要填写主版本号，否则无法执行扫版。</string>\n    <string name=\"missingQQPreviewMinorVersionWarning\">测试版扫版（含空格扫版）需要填写小版本号，否则无法扫描测试版。</string>\n    <string name=\"QQPreviewMinorNot5Warning\">小版本号需填写 5 的倍数。如需解除此限制，请前往设置进行解除。</string>\n    <string name=\"missingWeixinTrueVersionWarning\">微信扫版需要填写真实版本号，否则无法扫描微信版本。</string>\n    <string name=\"missingWeixin16CodeWarning\">微信扫版需要填写十六进制代码，否则无法扫描微信版本。</string>\n    <string name=\"enumeratingDownloadLink\">正在扫描下载地址：</string>\n    <string name=\"majorVersion\">主版本号</string>\n    <string name=\"initialMinorVersion\">起始小版本号</string>\n    <string name=\"hexadecimalCode\">十六进制代码</string>\n    <string name=\"initialMinorVersionHelpText\">填写起始扫描小版本号，扫正式版时无需填写</string>\n    <string name=\"hexadecimalCodeHelpText\">填写十六进制代码，仅微信扫版使用</string>\n    <string name=\"enumType\">扫版类型</string>\n    <string name=\"enumTypeHelpText\">指定扫版目标类型</string>\n    <string name=\"trueVersion\">真实版本号</string>\n    <string name=\"trueVersionHelpText\">填写真实版本号（版本码），仅微信扫版使用</string>\n    <string name=\"appidOptional\">appid（非必填）</string>\n    <string name=\"shiplyGeneralOptionalHelpText\">默认值：</string>\n    <string name=\"shiplyVersion\">版本</string>\n    <string name=\"shiplyVersionHelpText\">填写用于请求 Shiply 平台的 Android QQ/TIM 版本号</string>\n    <string name=\"uinHelpText\">填写用于请求 Shiply 平台的对象 QQ 号</string>\n    <string name=\"shiplyWarning\">腾讯 QQ/TIM 使用 TDS 腾讯端服务 Shiply 容器与发布平台，根据 QQ 号（uin）及其终端信息分发小范围灰度测试安装包。此功能并非每次请求都能成功获取到更新数据，无法获取更新数据则表示填写的参数不在 Shiply 平台认可与分发范围内。QQ 版本列表实用工具不对此功能及其任何后果作出任何可靠性保证。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"defaultDisplayOfFirstListItemDetails\">首项卡片默认显示详情</string>\n    <string name=\"versionNumberFontUseTCloudNumber\">使用腾讯云数字字体</string>\n    <string name=\"versionCardsDisplaysPackageSizeIndicator\">显示额定包大小占比历史最大包指示条</string>\n    <string name=\"customVersionEnumSuffix\">自定义扫版后缀</string>\n    <string name=\"customVersionEnumSuffixHelpText\">请使用“, ”（西文逗号+空格）分割</string>\n    <string name=\"facilitateI18n\">协助翻译：</string>\n    <string name=\"versionCardExpandButtonContentDescription\">展开详情</string>\n    <string name=\"versionCardCollapseButtonContentDescription\">收起详情</string>\n    <string name=\"shiplyAdvancedConfigurations\">进阶配置</string>\n    <string name=\"shiplyOsVersionOptional\">osVersion（非必填）</string>\n    <string name=\"shiplySdkVersionOptional\">sdkVersion（非必填）</string>\n    <string name=\"shiplyModelOptional\">model（非必填）</string>\n    <string name=\"shiplyLanguageOptional\">language（非必填）</string>\n    <string name=\"thicknessFollowSystem\">跟随系统</string>\n    <string name=\"back\">返回</string>\n    <string name=\"shiplyUseAdvancedConfigurations\">使用进阶配置</string>\n    <string name=\"localQQVersion\">本机 QQ：</string>\n    <string name=\"bracket\">（%s）</string>\n    <string name=\"localTIMVersion\">本机 TIM：</string>\n    <string name=\"localQQVersionDetails\">本机 QQ 版本详情</string>\n    <string name=\"localTIMVersionDetails\">本机 TIM 版本详情</string>\n    <string name=\"accessibilityTag\">6IW+6K6vIFFRIOW3suS4iue6v+S4gOmhueaXoOmanOeijeeUqOaIt+S4k+WxnuS8mOWMluaOquaWveabtOaWsOOAguenu+WKqOe7iOerr+iuvuWkh+W8gOWQr+ezu+e7n+aXoOmanOeijeivu+Wxj+acjeWKoe+8iOWmgiBBbmRyb2lkIFRhbGtiYWNr44CBaU9TIFZvaWNlT3Zlcu+8ie+8jOW5tuWQjOaXtuS9v+eUqOiFvuiuryBRUSDnp7vliqjlrqLmiLfnq68gOS4wLjg1IOWPiuS7peS4iueJiOacrOaXtu+8jOiFvuiuryBRUSDlsIblh4/lsJHmiJblgZzmraLlkJHmraTnsbsgUVEg5a6i5oi356uv5LiL5Y+R5bm/5ZGK44CC</string>\n    <string name=\"imageGallery\">应用宣传图</string>\n    <string name=\"share\">分享</string>\n    <string name=\"download\">下载</string>\n    <string name=\"stop\">停止</string>\n    <string name=\"skip\">跳过</string>\n    <string name=\"qqntTag\">基于 QQNT 技术架构</string>\n    <string name=\"releaseDateTIM\">发布日期：</string>\n    <string name=\"checkUpdateViaGitHubAPI\">使用 GitHub REST API 检查更新</string>\n    <string name=\"noUpdatesDetected\">未检测到更新</string>\n    <string name=\"noAssetsDetected\">未检测到资产文件</string>\n    <string name=\"cannotGetGitHub\">无法连接到 GitHub，请确保您所在网络环境可以访问 GitHub。</string>\n    <string name=\"updateQverbowAvailable\">更新可用</string>\n    <string name=\"copyLink\">复制链接</string>\n    <string name=\"unrealEngineTag\">内置虚幻引擎</string>\n    <string name=\"autoCheckForUpdates\">启动时检查更新</string>\n    <string name=\"useQQ8958Test\">使用 QQ 8.9.58 测试版直链格式</string>\n    <string name=\"ciVersionNoSupportUpdates\">CI 构建版本不支持检查更新</string>\n    <string name=\"showUnrealEngineTag\">显示虚幻引擎标识</string>\n    <string name=\"suffixSetting\">后缀设置</string>\n    <string name=\"others\">其它</string>\n    <string name=\"ok\">好</string>\n    <string name=\"swipeLeftToSeeMore\">向左滑动查看更多</string>\n    <string name=\"getUpdateFromTencentAppStore\">腾讯应用宝更新获取（实验性）</string>\n    <string name=\"experimentalFeatures\">实验性功能</string>\n    <string name=\"getQQLinkFromTencentAppStore\">获取 QQ 下载直链</string>\n    <string name=\"getTIMLinkFromTencentAppStore\">获取 TIM 下载直链</string>\n    <string name=\"getWeixinLinkFromTencentAppStore\">获取微信下载直链</string>\n    <string name=\"getWeComLinkFromTencentAppStore\">获取企业微信下载直链</string>\n    <string name=\"contentReturnedByTencentAppStore\">腾讯应用宝返回内容</string>\n    <string name=\"getWeTypeLinkFromTencentAppStore\">获取微信输入法下载直链</string>\n    <string name=\"tencentAppStoreWarning\">腾讯应用宝更新获取功能为 QQ 版本列表实用工具附带的实验性功能，可能存在不可预知的稳定性问题。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"showOldLoading\">扫版对话框使用旧版加载动画</string>\n    <string name=\"versionCardsDisplaysPackageSizeText\">显示额定包大小占比历史最大包百分比</string>\n    <string name=\"timVersion\">TIM 扫版</string>\n    <string name=\"enumTIMWarning\">TIM 扫版功能为 QQ 版本列表实用工具附带的实验性功能，可能存在不可预知的稳定性问题。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"useQQ9008_14600Test\">扫版类型添加 QQ 9.0.8.14600 空格直链格式</string>\n    <string name=\"initFirebaseService\">初始化 Firebase 服务</string>\n    <string name=\"enablingFirebaseServiceWarning\">初始化 Firebase 服务后，将立即在本地由 Firebase SDK 生成注册令牌，并将标识符和配置数据上传到 Firebase 服务器。此操作一经启用即无法撤销，是否继续？</string>\n    <string name=\"rainbow_notification_channel_id\">版本列表更新</string>\n    <string name=\"cannotFindGooglePlayServices\">未在当前设备检测到 Google Play 服务，因此无法在当前设备中使用由 Firebase 提供的服务。</string>\n    <string name=\"rainbow_notification_channel_title\">版本列表更新</string>\n    <string name=\"rainbow_notification_channel_description\">通过 Firebase 云消息传递</string>\n    <string name=\"enablingFirebaseServiceInsights\">启用 Firebase 服务可使用以下功能：\\n- 通过 Firebase 云消息传递的版本列表更新提醒</string>\n    <string name=\"enablingFirebaseServiceWarning2\">Firebase 云消息传递绑定了 Google Analytics 分析服务，使用 Firebase 云消息传递将不可避免地上传您在此软件的活跃信息。</string>\n    <string name=\"continueKey\">继续</string>\n    <string name=\"initializedFirebaseService\">Firebase 服务已初始化，无法撤销</string>\n    <string name=\"cannotEnableFirebaseCloudMessaging\">接收版本列表更新通知提醒必须打开系统通知权限，否则无法接收版本列表更新提醒。</string>\n    <string name=\"pushSystemNotificationsWhenVersionListUpdates\">版本列表更新时推送系统通知</string>\n    <string name=\"unsubscribeTimeout\">取消订阅超时</string>\n    <string name=\"unsubscribeSuccess\">取消订阅成功</string>\n    <string name=\"unsubscribeFailed\">取消订阅失败</string>\n    <string name=\"subscribeTimeout\">订阅超时</string>\n    <string name=\"subscribeSuccess\">订阅成功</string>\n    <string name=\"subscribeFailed\">订阅失败</string>\n    <string name=\"initializedFirebaseServiceItem\">Firebase 服务已初始化</string>\n    <string name=\"toSystemSetting\">前往系统设置</string>\n    <string name=\"threePartySharedList\">个人信息第三方共享清单</string>\n    <string name=\"shiplyTargetApp\">目标应用</string>\n    <string name=\"shiplyTargetAppQQ\">QQ</string>\n    <string name=\"shiplyTargetAppTIM\">TIM</string>\n    <string name=\"shiplyTargetHelper\">指定请求 Shiply 平台的目标应用</string>\n    <string name=\"openSourceLicenseTitle\">开放源代码许可</string>\n    <string name=\"basedOnQQVer\">基于 Android QQ %s 二次开发</string>\n    <string name=\"getQidianLinkFromTencentAppStore\">获取腾讯企点下载直链</string>\n    <string name=\"getWeixinAlphaLinkFromWeixinConfigDesc\">从腾讯服务器配置拉取微信最新测试版下载直链</string>\n    <string name=\"successInGetting\">获取成功</string>\n    <string name=\"getWeixinAlphaConfig404\">似乎未成功访问腾讯服务器配置文件，可能是微信当前没有测试版或测试版已撤包。</string>\n    <string name=\"getWeixinAlphaConfigLink404\">似乎未成功访问此下载地址，可能是微信当前测试版已撤包。</string>\n    <string name=\"suspectedPackageWithdrawal\">疑似撤包</string>\n    <string name=\"colon\">：</string>\n    <string name=\"qverbowHash\">杂凑值校验</string>\n    <string name=\"verifyHashValueViaGitHubAPI\">通过 GitHub REST API 校验杂凑值</string>\n    <string name=\"hashIsTrue\">杂凑值与 GitHub Releases 一致</string>\n    <string name=\"hashIsFalse\">您所使用的版本与 GitHub Releases 杂凑值不一致，为了您的安全，请尽快卸载当前版本应用并前往官方 GitHub Releases 下载此软件。</string>\n    <string name=\"toGitHubRelease\">前往下载</string>\n    <string name=\"getWeTypeTestLinkFromWeTypeLatestChannelDesc\">从微信输入法测试通道获取微信输入法最新下载直链</string>\n    <string name=\"getWeTypeLatestChannel404\">未成功访问微信输入法服务器，请检查您的网络连接。</string>\n    <string name=\"kuiklyTag\">存在 TDS 腾讯端服务 Kuikly 开发框架</string>\n    <string name=\"showKuiklyTag\">显示 Kuikly 开发框架标识</string>\n    <string name=\"getWeTypeTestLinkFromWeTypeLatestChannel\">获取微信输入法测试版</string>\n    <string name=\"getWeixinAlphaLinkFromWeixinConfig\">获取微信测试版</string>\n    <string name=\"autoCheckForUpdatesDesc\">每次启动时将通过 GitHub REST API 检查一次更新</string>\n    <string name=\"useTheSystemDownloadManagerToTakeOverTheDownloadIntentDesc\">开启后，软件全局触发下载意图时将不再打开浏览器</string>\n    <string name=\"showKuiklyTagDesc\">Kuikly 内置情况以 QQ 正式版为判断来源</string>\n    <string name=\"versionCardsDisplaysPackageSizeDesc\">仅对 QQ 版本卡片生效</string>\n    <string name=\"aboutVersionCards\">版本列表与卡片</string>\n    <string name=\"showUnrealEngineTagDesc\">虚幻引擎内置情况以 QQ 正式版为判断来源</string>\n    <string name=\"general\">通用</string>\n    <string name=\"copyAll\">复制全部</string>\n    <string name=\"enumVerMaintenanceModeWarning\">扫版功能已进入维护模式。您仍可以继续使用现有扫版功能，但 QQ 版本列表实用工具不再对相关功能及其任何后果作出任何可靠性保证，不再对相关功能进行积极开发，也不再接受相关新功能请求。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"localDetailsQQNT\">QQNT 技术架构</string>\n    <string name=\"localDetailsBugly\">Bugly 端质量监控平台</string>\n    <string name=\"localDetailsShiply\">Shiply 容器与发布平台</string>\n    <string name=\"localDetailsHippy\">Hippy 跨端开发框架</string>\n    <string name=\"localDetailsKuikly\">Kuikly 跨端开发框架</string>\n    <string name=\"localDetailsRightly\">Rightly 应用合规解决方案</string>\n    <string name=\"localDetailsUELibrary\">Unreal Engine as a Library</string>\n    <string name=\"localDetailsUELibraryDesc\">Unreal Engine as a Library 会将虚幻引擎的功能重新打包成一个库，以便其他应用程序生成和控制它们自己的 UE 实例。UELibrary 提供了一种简单、不依赖于平台的 API 来驱动 UE。</string>\n    <string name=\"localDetailsBuglyDesc\">Bugly 是 TDS 腾讯端服务（Tencent Device-oriented Service）旗下的端质量监控平台，通过采集、监控、定位、告警等核心能力，提供专业的质量监控服务，帮助开发者及时发现并解决质量问题，打造高质量应用。</string>\n    <string name=\"localDetailsShiplyDesc\">Shiply，全称 TDS 腾讯端服务 Shiply 容器与发布，属于 TDS 腾讯端服务系列产品的子产品之一，是源于腾讯内部 App 的一站式容器与发布解决方案。Shiply 提供了一套规则灵活、发布安全、高效分发的终端基础通用发布系统，功能包括：配置与开关、资源发布、应用升级，移动端热修复、Flutter 动态化、跨端开发框架等相关能力和分发支持，帮助产品和技术团队提高研效能力和决策力。</string>\n    <string name=\"localDetailsHippyDesc\">Hippy 是 TDF 腾讯端框架（Tencent Device-oriented Framework）下的开源跨平台应用开发解决方案。Hippy 从底层做了大量工作，抹平了 iOS、Android、OpenHarmony 三端差异，提供了接近 Web 的开发体验，目前上层支持了 React 和 Vue 两套界面框架，前端开发人员可以通过它，将前端代码转换为终端的原生指令，进行原生终端 APP 的开发。同时，Hippy 从底层进行了大量优化，在启动速度、渲染性能、动画速度、内存占用、包体积等方面都提供了业内顶尖的性能表现。</string>\n    <string name=\"localDetailsRightlyDesc\">Rightly 是面向移动端的全流程合规解决方案，集「合规管控」和「合规测评」为一体，为 APP 提供运行全周期数据安全与合规保护解决方案，也为 APP 提供个人信息风险审查与合规性检测服务，覆盖多项隐私安全指标。Rightly 能够助力业务提高合规效率，降低违规风险。</string>\n    <string name=\"localDetailsKuiklyDesc\">Kuikly（Kotlin UI Kit）跨端开发框架，是 TDF 腾讯端框架（Tencent Device-oriented Framework）的一部分。Kuikly 通过自研 Kotlin Multiplatform 逻辑与终端界面原生控件渲染映射协议层，并采用声明式与响应式设计，使采用 Kuikly 的 Kotlin 开发者能拥有原生高效的 Android 开发体验并构建具有原生性能的跨平台应用。Kuikly 更可依托于 TDS 腾讯端服务 Shiply 容器与发布平台，实现按页颗粒度的完备客户端界面动态化能力。</string>\n    <string name=\"localDetailsQQNTDesc\">QQNT 技术架构是腾讯 QQ 客户端全新的跨平台技术架构体系。QQNT 技术架构将 QQ 客户端核心功能——如核心登录、消息系统、关系链、富媒体、长连接、数据库等——下沉至 QQNT 内核层，使用 C++ 抽象逻辑封装为原生库并提供多平台多语言一致性接口，以实现 QQ 客户端核心逻辑代码跨平台与程序高性能运作。</string>\n    <string name=\"localDetailsMsg\">详细信息</string>\n    <string name=\"stackInfo\">技术栈信息</string>\n    <string name=\"details\">详情</string>\n    <string name=\"thisVerContains\">此版本包含 %s</string>\n    <string name=\"packageNameIsErr\">应用包名与预设不匹配</string>\n    <string name=\"useNewLocalDetailsPage\">使用新版本机应用详情页</string>\n    <string name=\"fileErr\">文件类型错误</string>\n    <string name=\"apkAnalyze\">应用包分析</string>\n    <string name=\"unknownErr\">未知错误</string>\n    <string name=\"notEnoughSpaceOnTheDevice\">设备剩余空间不足</string>\n    <string name=\"localDetailsTencentBeacon\">腾讯灯塔</string>\n    <string name=\"localDetailsTencentBeaconDesc\">腾讯灯塔全场景大数据分析套件，是腾讯 50+ 业务自 2018 年以来使用数据中台演化而成，支持每日数十亿条数据资产的全面管理，数千业务员工深度依赖的整体化工具套件。</string>\n    <string name=\"haveNotAgreeUA\">未同意用户协议，无法使用本软件</string>\n    <string name=\"localDetailsFlutter\">Flutter</string>\n    <string name=\"localDetailsFlutterDesc\">Flutter 是 Google 的便携式 UI 工具包，帮助你在移动、web、桌面端创造高质量的绝妙原生体验的应用。 Flutter 可以和世界上的开发人员和开发组织广泛使用的那些现存代码一起使用，并且是开源的、免费的。</string>\n    <string name=\"localDetailsJetpackCompose\">Jetpack Compose</string>\n    <string name=\"localDetailsJetpackComposeDesc\">Jetpack Compose — это современный набор инструментов для создания собственного пользовательского интерфейса Android. Jetpack Compose упрощает и ускоряет разработку пользовательского интерфейса на Android за счет меньшего количества кода, мощных инструментов и интуитивно понятных API-интерфейсов Kotlin.</string>\n    <string name=\"localDetailsComposeMultiplatform\">Compose Multiplatform</string>\n    <string name=\"localDetailsComposeMultiplatformDesc\">Compose Multiplatform 是一个由 JetBrains 开发的现代化声明式和响应式 UI 框架，它提供了一种只需少量 Kotlin 代码即可构建用户界面的简单方法。它还允许您只需编写一次用户界面，即可在任何支持的平台——iOS、Android、桌面（Windows、macOS、Linux）和 Web——上运行。</string>\n    <string name=\"security\">安全</string>\n    <string name=\"privateTokenSettings\">私有 Token 管理</string>\n    <string name=\"privateTokenSettingsDesc\">此处内填入的 Token 将由 Android 密钥库系统安全加密后存储</string>\n    <string name=\"zhipuAIMaaSPlatformToken\">智谱 AI 开放平台 Token</string>\n    <string name=\"updateLogPrompt\">请根据用户传入的更新日志文本，以清晰简洁的 %s 语言对更新日志文本进行专业总结，要求：1) 提取核心功能优化和关键问题修复，忽略技术细节 2) 采用 Pangu 格式化文本，确保中英文/数字间自动空格 3) 完全避免产品名称及主观评价 4) 用连贯段落呈现，严格控制在 150 字内。输出需突出用户感知明显的改进点，使用规范化表述，禁止列表格式且不使用 Markdown。</string>\n    <string name=\"githubPersonalAccessToken\">GitHub 个人访问令牌</string>\n    <string name=\"TEESupported\">密钥由设备可信执行环境（TEE）安全硬件提供保护</string>\n    <string name=\"StrongBoxSupported\">密钥由设备 StrongBox 安全元件提供保护</string>\n    <string name=\"UnknownSecurityHardwareSupported\">密钥由设备安全硬件提供保护</string>\n    <string name=\"SecuritySoftwareSupported\">密钥由 Android 密钥库提供保护</string>\n    <string name=\"testGitHubToken\">保存并联网测试 GitHub 个人访问令牌可用性</string>\n    <string name=\"testZhipuToken\">保存并联网测试智谱 AI 开放平台 Token 可用性</string>\n    <string name=\"testZhipuTokenPrompt\">用户正在测试与您的连通性。如果您收到了这句话，请使用 %s 语言热情地与用户打招呼并用一段话详细介绍自己的模型名称。</string>\n    <string name=\"backFromZhipuPlatform\">智谱 AI 开放平台返回内容</string>\n    <string name=\"zhipuTokenSuccess\">智谱 Token 可用</string>\n    <string name=\"zhipuTokenIsNull\">智谱 Token 为空</string>\n    <string name=\"githubTokenIsNull\">GitHub 个人访问令牌为空</string>\n    <string name=\"githubTokenSuccess\">GitHub 个人访问令牌可用</string>\n    <string name=\"githubTokenUnavailable\">GitHub 个人访问令牌不可用，请检查您的 GitHub 个人访问令牌有效性。</string>\n    <string name=\"githubTokenUnavailableTitle\">GitHub 个人访问令牌不可用</string>\n    <string name=\"testToken\">测试 Token 可用性</string>\n    <string name=\"llmIntelligent\">LLM 智能摘要</string>\n    <string name=\"aiLLMInference\">LLM 推理</string>\n    <string name=\"qverbowUpdateLogLLMIntelligentDesc\">检查到更新时将使用 LLM 智能摘要更新日志，需要在“私有 Token 管理”填入智谱 Token</string>\n    <string name=\"qverbowUpdateLogLLMIntelligent\">更新日志智能摘要</string>\n    <string name=\"githubTokenHelperText\">GitHub 个人访问令牌将用于解除 GitHub REST API 访问速率限制，填入并保存即生效</string>\n    <string name=\"zhipuTokenHelperText\">默认仅请求智谱免费模型 GLM-4-Flash</string>\n    <string name=\"zhipuTokenIsInvalid\">填入的 Token 被智谱 AI 开放平台大模型接口 Java SDK 判定无效。</string>\n    <string name=\"clickHereToViewTheChangelog\">点击此处查看更新日志</string>\n    <string name=\"localWeixinVersion\">本机微信：</string>\n    <string name=\"weixin\">Weixin</string>\n    <string name=\"localDetailsMMKV\">MMKV</string>\n    <string name=\"localDetailsMMKVDesc\">MMKV 是微信中的一个高效、小巧、易用的移动的键值对存储框架，可在 Android、iOS/macOS、Windows、POSIX 和 HarmonyOS NEXT 上使用。</string>\n    <string name=\"localDetailsWCDB\">WCDB</string>\n    <string name=\"localDetailsWCDBDesc\">WCDB 是一个易用、高效、完整的移动数据库框架，它基于 SQLite 和 SQLCipher 开发，在微信中应用广泛，且支持在 C++、Java、Kotlin、Swift、Objc 五种语言环境中使用。</string>\n    <string name=\"localDetailsTinker\">Tinker</string>\n    <string name=\"localDetailsTinkerDesc\">Tinker 是微信官方的 Android 热补丁解决方案，它支持动态下发代码、So 库以及资源，让应用能够在不需要重新安装的情况下实现更新。</string>\n    <string name=\"localDetailsMars\">Mars</string>\n    <string name=\"localDetailsMarsDesc\">Mars 是微信官方的跨平台跨业务的终端基础组件。</string>\n    <string name=\"localDetailsMatrix\">Matrix</string>\n    <string name=\"localDetailsMatrixDesc\">Matrix 是一款微信研发并日常使用的应用性能接入框架，支持 iOS, macOS 和 Android。 Matrix 通过接入各种性能监控方案，对性能监控项的异常数据进行采集和分析，输出相应的问题分析、定位与优化建议，从而帮助开发者开发出更高质量的应用。</string>\n    <string name=\"localWeixinVersionDetails\">本机微信版本详情</string>\n    <string name=\"localDetailsReactNativeDesc\">React Native 将 React 的声明式 UI 框架引入 iOS 和 Android。使用 React Native，您可以直接使用原生 UI 控件，并拥有对原生平台的完整访问权限。</string>\n    <string name=\"localDetailsReactNative\">React Native</string>\n    <string name=\"localDetailsTBSDesc\">腾讯浏览服务（Tencent Browsing Service，简称 TBS）属于 PCG 事业群，QQ 浏览器团队。QQ 浏览器作为一个平台化的产品，不论是网页的打开还是文档能力的打开，都需要一个强大的自研引擎做支撑，而引擎研发团队，一直深耕引擎底层技术 10 余年，积累了丰富的业务经验，将引擎技术从产品独立出来为 SDK，并不断演进成一个平台化的引擎产品，成立腾讯浏览服务，为腾讯公司内外产品提供强大的引擎技术支持和技术服务支持，覆盖了近十万家产品接入，并支持数亿级的网页浏览体验。</string>\n    <string name=\"localDetailsTBS\">腾讯浏览服务</string>\n    <string name=\"biometricLoginTitle\">验证您的身份</string>\n    <string name=\"biometricLoginSubtitle\">验证您的身份以进一步操作</string>\n    <string name=\"llmInferenceLocalChanges\">应用更改推测</string>\n    <string name=\"genByAITips\">内容由 AI 生成，可能存在不准确的信息。</string>\n    <string name=\"llmInferenceLocalChangesDesc\">应用包分析外部应用时可以使用 LLM 推测外部应用与本机应用的功能变更，需要在“私有 Token 管理”填入智谱 Token</string>\n    <string name=\"llmInferenceLocalChangesPrompt\">用户本地已经安装了 %1$s %2$s，今天用户收到了一个 %1$s %3$s 安装包，用户已经得出收到的 %1$s %3$s 安装包的四大组件（activity、service、content provider、broadcast receiver）与权限和用户本地已安装的 %1$s %2$s 之间的差异。请根据用户传入的上述差异的文本，以清晰简洁的 %4$s 语言分析推测该差异可能存在的应用变更，要求：1) 提取核心功能优化和关键问题修复，忽略技术细节 2) 采用 Pangu 格式化文本，确保中英文/数字间自动空格 3) 用连贯段落呈现，严格控制在 300 字内。输出需突出用户感知明显的改进点，使用规范化表述，禁止列表格式且不使用 Markdown。</string>\n    <string name=\"timeout\">连接超时</string>\n    <string name=\"localDetailsSkylineRenderingEngine\">Skyline 渲染引擎</string>\n    <string name=\"localDetailsSkylineRenderingEngineDesc\">为了进一步优化小程序性能，提供更为接近原生的用户体验，微信团队在 WebView 渲染之外新增了一个渲染引擎 Skyline，其使用更精简高效的渲染管线，并带来诸多增强特性，让 Skyline 拥有更接近原生渲染的性能体验。</string>\n    <string name=\"versionNumberFontUseTCloudNumberDesc\">可在下方调整腾讯云数字字体字重</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-zh-rCN/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<resources>\n    <string name=\"app_name\">QQ 版本列表实用工具</string>\n    <string name=\"appTitle\">QQ 版本列表实用工具</string>\n    <string name=\"shortcutLongLabel\">扫版（维护模式）</string>\n    <string name=\"shortcutShortLabel\">扫版（维护）</string>\n    <string name=\"start\">开始</string>\n    <string name=\"cancel\">取消</string>\n    <string name=\"done\">确定</string>\n    <string name=\"save\">保存</string>\n    <string name=\"installed\">已安装</string>\n    <string name=\"copy\">复制</string>\n    <string name=\"refresh\">刷新</string>\n    <string name=\"agree\">同意</string>\n    <string name=\"disagreeAndExit\">不同意并退出</string>\n    <string name=\"withdrawConsentUA\">撤回同意用户协议</string>\n    <string name=\"withdrawConsentAndExit\">撤回同意并退出</string>\n    <string name=\"userAgreement\">用户协议</string>\n    <string name=\"enumerateVersionsFAB\">扫版（维护模式）</string>\n    <string name=\"enumerateVersionsDialogTitle\">扫版（维护模式）</string>\n    <string name=\"setting\">设置</string>\n    <string name=\"personalization\">个性化</string>\n    <string name=\"about\">关于</string>\n    <string name=\"enumerateVersionsFormatSetting\">扫版直链格式设置</string>\n    <string name=\"getUpdateFromTDSShiplyDistributionPlatform\">TDS 腾讯端服务 Shiply 容器与发布平台更新获取（实验性）</string>\n    <string name=\"getUpdateFromShiplyPlatform\">Shiply 平台更新获取（实验性）</string>\n    <string name=\"acceptedEnumerateVersion\">扫版成功</string>\n    <string name=\"contentReturnedByShiplyPlatform\">Shiply 平台返回内容</string>\n    <string name=\"applicationError\">程序出错</string>\n    <string name=\"additionalActions\">进一步操作</string>\n    <string name=\"shareTo\">分享到</string>\n    <string name=\"jsonDetails\">JSON 详情</string>\n    <string name=\"stableVersion\">正式版</string>\n    <string name=\"previewVersion\">测试版</string>\n    <string name=\"spaceEnumerateVersion\">空格扫版</string>\n    <string name=\"weixinEnumerateVersion\">微信扫版</string>\n    <string name=\"aboutAppName\">QQ 版本列表实用工具 for Android™</string>\n    <string name=\"aboutAuthor\">作者：</string>\n    <string name=\"aboutContributor\">贡献者：</string>\n    <string name=\"version\">版本：</string>\n    <string name=\"aboutSpecialThanksTo\">特别感谢：</string>\n    <string name=\"aboutOpenSourceRepo\">开源仓库：</string>\n    <string name=\"aboutGetUpdate\">获取更新：</string>\n    <string name=\"aboutDescription\">提供 Android QQ 版本列表的查看和对 Android QQ 下载链接的枚举法扫描。</string>\n    <string name=\"copied\">已复制：</string>\n    <string name=\"reatedFileSize\">额定大小：</string>\n    <string name=\"sourceJSON\">源 JSON</string>\n    <string name=\"recommendations\">建议的内容</string>\n    <string name=\"longPressTheVersionCardToViewSourceDetails\">长按版本卡片查看源详情</string>\n    <string name=\"useTheSystemDownloadManagerToTakeOverTheDownloadIntent\">使用系统下载管理器</string>\n    <string name=\"removeMultiplesOf5ForQQPreviewVersions\">解除 QQ 测试版扫版小版本号遵循 5 的倍数限制</string>\n    <string name=\"longPressToViewSourceDetailsIsDisabled\">未开启长按查看源详情功能，请前往设置开启</string>\n    <string name=\"currentSizeVsLargestHistoricalPackage\">占比历史最大包（%s）：</string>\n    <string name=\"extendTheSuffixForDirectDownloadLinksOfEnumeratedPreviewVersions\">扩展测试版扫版直链后缀</string>\n    <string name=\"fileSize\">大小：</string>\n    <string name=\"downloadLink\">下载地址：</string>\n    <string name=\"saved\">已保存</string>\n    <string name=\"enumQQPreviewWarning\">鉴于 QQ 测试版可能存在不可预知的稳定性问题，您在下载及使用该测试版本之前，必须明确并确保自身具备足够的风险识别和承受能力。根据相关条款，您使用本软件时应当已了解并同意，因下载或使用 QQ 测试版而可能产生的任何直接或间接损失、损害以及其他不利后果，均由您自行承担全部责任。</string>\n    <string name=\"enumQQMajorVersionHelpText\">填写格式为 x.y.z</string>\n    <string name=\"enumWeixinMajorVersionHelpText\">无需填写小数点</string>\n    <string name=\"enumWeixinWarning\">微信扫版功能为 QQ 版本列表实用工具附带的实验性功能，可能存在不可预知的稳定性问题。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"enumHasBeenStopped\">已停止扫描</string>\n    <string name=\"missingCipherWarning\">TDS 腾讯端服务 Shiply 容器与发布平台返回 JSON 内容中未包含“cipher_text”键值对。</string>\n    <string name=\"missingMajorVersionWarning\">扫版需要填写主版本号，否则无法执行扫版。</string>\n    <string name=\"missingQQPreviewMinorVersionWarning\">测试版扫版（含空格扫版）需要填写小版本号，否则无法扫描测试版。</string>\n    <string name=\"QQPreviewMinorNot5Warning\">小版本号需填写 5 的倍数。如需解除此限制，请前往设置进行解除。</string>\n    <string name=\"missingWeixinTrueVersionWarning\">微信扫版需要填写真实版本号，否则无法扫描微信版本。</string>\n    <string name=\"missingWeixin16CodeWarning\">微信扫版需要填写十六进制代码，否则无法扫描微信版本。</string>\n    <string name=\"enumeratingDownloadLink\">正在扫描下载地址：</string>\n    <string name=\"majorVersion\">主版本号</string>\n    <string name=\"initialMinorVersion\">起始小版本号</string>\n    <string name=\"hexadecimalCode\">十六进制代码</string>\n    <string name=\"initialMinorVersionHelpText\">填写起始扫描小版本号，扫正式版时无需填写</string>\n    <string name=\"hexadecimalCodeHelpText\">填写十六进制代码，仅微信扫版使用</string>\n    <string name=\"enumType\">扫版类型</string>\n    <string name=\"enumTypeHelpText\">指定扫版目标类型</string>\n    <string name=\"trueVersion\">真实版本号</string>\n    <string name=\"trueVersionHelpText\">填写真实版本号（版本码），仅微信扫版使用</string>\n    <string name=\"appidOptional\">appid（非必填）</string>\n    <string name=\"shiplyGeneralOptionalHelpText\">默认值：</string>\n    <string name=\"shiplyVersion\">版本</string>\n    <string name=\"shiplyVersionHelpText\">填写用于请求 Shiply 平台的 Android QQ/TIM 版本号</string>\n    <string name=\"uinHelpText\">填写用于请求 Shiply 平台的对象 QQ 号</string>\n    <string name=\"shiplyWarning\">腾讯 QQ/TIM 使用 TDS 腾讯端服务 Shiply 容器与发布平台，根据 QQ 号（uin）及其终端信息分发小范围灰度测试安装包。此功能并非每次请求都能成功获取到更新数据，无法获取更新数据则表示填写的参数不在 Shiply 平台认可与分发范围内。QQ 版本列表实用工具不对此功能及其任何后果作出任何可靠性保证。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"defaultDisplayOfFirstListItemDetails\">首项卡片默认显示详情</string>\n    <string name=\"versionNumberFontUseTCloudNumber\">使用腾讯云数字字体</string>\n    <string name=\"versionCardsDisplaysPackageSizeIndicator\">显示额定包大小占比历史最大包指示条</string>\n    <string name=\"customVersionEnumSuffix\">自定义扫版后缀</string>\n    <string name=\"customVersionEnumSuffixHelpText\">请使用“, ”（西文逗号+空格）分割</string>\n    <string name=\"facilitateI18n\">协助翻译：</string>\n    <string name=\"versionCardExpandButtonContentDescription\">展开详情</string>\n    <string name=\"versionCardCollapseButtonContentDescription\">收起详情</string>\n    <string name=\"shiplyAdvancedConfigurations\">进阶配置</string>\n    <string name=\"shiplyOsVersionOptional\">osVersion（非必填）</string>\n    <string name=\"shiplySdkVersionOptional\">sdkVersion（非必填）</string>\n    <string name=\"shiplyModelOptional\">model（非必填）</string>\n    <string name=\"shiplyLanguageOptional\">language（非必填）</string>\n    <string name=\"thicknessFollowSystem\">跟随系统</string>\n    <string name=\"back\">返回</string>\n    <string name=\"shiplyUseAdvancedConfigurations\">使用进阶配置</string>\n    <string name=\"localQQVersion\">本机 QQ：</string>\n    <string name=\"bracket\">（%s）</string>\n    <string name=\"localTIMVersion\">本机 TIM：</string>\n    <string name=\"localQQVersionDetails\">本机 QQ 版本详情</string>\n    <string name=\"localTIMVersionDetails\">本机 TIM 版本详情</string>\n    <string name=\"accessibilityTag\">6IW+6K6vIFFRIOW3suS4iue6v+S4gOmhueaXoOmanOeijeeUqOaIt+S4k+WxnuS8mOWMluaOquaWveabtOaWsOOAguenu+WKqOe7iOerr+iuvuWkh+W8gOWQr+ezu+e7n+aXoOmanOeijeivu+Wxj+acjeWKoe+8iOWmgiBBbmRyb2lkIFRhbGtiYWNr44CBaU9TIFZvaWNlT3Zlcu+8ie+8jOW5tuWQjOaXtuS9v+eUqOiFvuiuryBRUSDnp7vliqjlrqLmiLfnq68gOS4wLjg1IOWPiuS7peS4iueJiOacrOaXtu+8jOiFvuiuryBRUSDlsIblh4/lsJHmiJblgZzmraLlkJHmraTnsbsgUVEg5a6i5oi356uv5LiL5Y+R5bm/5ZGK44CC</string>\n    <string name=\"imageGallery\">应用宣传图</string>\n    <string name=\"share\">分享</string>\n    <string name=\"download\">下载</string>\n    <string name=\"stop\">停止</string>\n    <string name=\"skip\">跳过</string>\n    <string name=\"qqntTag\">基于 QQNT 技术架构</string>\n    <string name=\"releaseDateTIM\">发布日期：</string>\n    <string name=\"checkUpdateViaGitHubAPI\">使用 GitHub REST API 检查更新</string>\n    <string name=\"noUpdatesDetected\">未检测到更新</string>\n    <string name=\"noAssetsDetected\">未检测到资产文件</string>\n    <string name=\"cannotGetGitHub\">无法连接到 GitHub，请确保您所在网络环境可以访问 GitHub。</string>\n    <string name=\"updateQverbowAvailable\">更新可用</string>\n    <string name=\"copyLink\">复制链接</string>\n    <string name=\"unrealEngineTag\">内置虚幻引擎</string>\n    <string name=\"autoCheckForUpdates\">启动时检查更新</string>\n    <string name=\"useQQ8958Test\">使用 QQ 8.9.58 测试版直链格式</string>\n    <string name=\"ciVersionNoSupportUpdates\">CI 构建版本不支持检查更新</string>\n    <string name=\"showUnrealEngineTag\">显示虚幻引擎标识</string>\n    <string name=\"suffixSetting\">后缀设置</string>\n    <string name=\"others\">其它</string>\n    <string name=\"ok\">好</string>\n    <string name=\"swipeLeftToSeeMore\">向左滑动查看更多</string>\n    <string name=\"getUpdateFromTencentAppStore\">腾讯应用宝更新获取（实验性）</string>\n    <string name=\"experimentalFeatures\">实验性功能</string>\n    <string name=\"getQQLinkFromTencentAppStore\">获取 QQ 下载直链</string>\n    <string name=\"getTIMLinkFromTencentAppStore\">获取 TIM 下载直链</string>\n    <string name=\"getWeixinLinkFromTencentAppStore\">获取微信下载直链</string>\n    <string name=\"getWeComLinkFromTencentAppStore\">获取企业微信下载直链</string>\n    <string name=\"contentReturnedByTencentAppStore\">腾讯应用宝返回内容</string>\n    <string name=\"getWeTypeLinkFromTencentAppStore\">获取微信输入法下载直链</string>\n    <string name=\"tencentAppStoreWarning\">腾讯应用宝更新获取功能为 QQ 版本列表实用工具附带的实验性功能，可能存在不可预知的稳定性问题。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"showOldLoading\">扫版对话框使用旧版加载动画</string>\n    <string name=\"versionCardsDisplaysPackageSizeText\">显示额定包大小占比历史最大包百分比</string>\n    <string name=\"timVersion\">TIM 扫版</string>\n    <string name=\"enumTIMWarning\">TIM 扫版功能为 QQ 版本列表实用工具附带的实验性功能，可能存在不可预知的稳定性问题。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"useQQ9008_14600Test\">扫版类型添加 QQ 9.0.8.14600 空格直链格式</string>\n    <string name=\"initFirebaseService\">初始化 Firebase 服务</string>\n    <string name=\"enablingFirebaseServiceWarning\">初始化 Firebase 服务后，将立即在本地由 Firebase SDK 生成注册令牌，并将标识符和配置数据上传到 Firebase 服务器。此操作一经启用即无法撤销，是否继续？</string>\n    <string name=\"rainbow_notification_channel_id\">rainbow_notification_channel_id</string>\n    <string name=\"cannotFindGooglePlayServices\">未在当前设备检测到 Google Play 服务，因此无法在当前设备中使用由 Firebase 提供的服务。</string>\n    <string name=\"rainbow_notification_channel_title\">版本列表更新</string>\n    <string name=\"rainbow_notification_channel_description\">通过 Firebase 云消息传递</string>\n    <string name=\"enablingFirebaseServiceInsights\">启用 Firebase 服务可使用以下功能：\\n- 通过 Firebase 云消息传递的版本列表更新提醒</string>\n    <string name=\"enablingFirebaseServiceWarning2\">Firebase 云消息传递绑定了 Google Analytics 分析服务，使用 Firebase 云消息传递将不可避免地上传您在此软件的活跃信息。</string>\n    <string name=\"continueKey\">继续</string>\n    <string name=\"initializedFirebaseService\">Firebase 服务已初始化，无法撤销</string>\n    <string name=\"cannotEnableFirebaseCloudMessaging\">接收版本列表更新通知提醒必须打开系统通知权限，否则无法接收版本列表更新提醒。</string>\n    <string name=\"pushSystemNotificationsWhenVersionListUpdates\">版本列表更新时推送系统通知</string>\n    <string name=\"unsubscribeTimeout\">取消订阅超时</string>\n    <string name=\"unsubscribeSuccess\">取消订阅成功</string>\n    <string name=\"unsubscribeFailed\">取消订阅失败</string>\n    <string name=\"subscribeTimeout\">订阅超时</string>\n    <string name=\"subscribeSuccess\">订阅成功</string>\n    <string name=\"subscribeFailed\">订阅失败</string>\n    <string name=\"initializedFirebaseServiceItem\">Firebase 服务已初始化</string>\n    <string name=\"toSystemSetting\">前往系统设置</string>\n    <string name=\"threePartySharedList\">个人信息第三方共享清单</string>\n    <string name=\"shiplyTargetApp\">目标应用</string>\n    <string name=\"shiplyTargetAppQQ\">QQ</string>\n    <string name=\"shiplyTargetAppTIM\">TIM</string>\n    <string name=\"shiplyTargetHelper\">指定请求 Shiply 平台的目标应用</string>\n    <string name=\"openSourceLicenseTitle\">开放源代码许可</string>\n    <string name=\"basedOnQQVer\">基于 Android QQ %s 二次开发</string>\n    <string name=\"getQidianLinkFromTencentAppStore\">获取腾讯企点下载直链</string>\n    <string name=\"getWeixinAlphaLinkFromWeixinConfigDesc\">从腾讯服务器配置拉取微信最新测试版下载直链</string>\n    <string name=\"successInGetting\">获取成功</string>\n    <string name=\"getWeixinAlphaConfig404\">似乎未成功访问腾讯服务器配置文件，可能是微信当前没有测试版或测试版已撤包。</string>\n    <string name=\"getWeixinAlphaConfigLink404\">似乎未成功访问此下载地址，可能是微信当前测试版已撤包。</string>\n    <string name=\"suspectedPackageWithdrawal\">疑似撤包</string>\n    <string name=\"colon\">：</string>\n    <string name=\"qverbowHash\">杂凑值校验</string>\n    <string name=\"verifyHashValueViaGitHubAPI\">通过 GitHub REST API 校验杂凑值</string>\n    <string name=\"hashIsTrue\">杂凑值与 GitHub Releases 一致</string>\n    <string name=\"hashIsFalse\">您所使用的版本与 GitHub Releases 杂凑值不一致，为了您的安全，请尽快卸载当前版本应用并前往官方 GitHub Releases 下载此软件。</string>\n    <string name=\"toGitHubRelease\">前往下载</string>\n    <string name=\"getWeTypeTestLinkFromWeTypeLatestChannelDesc\">从微信输入法测试通道获取微信输入法最新下载直链</string>\n    <string name=\"getWeTypeLatestChannel404\">未成功访问微信输入法服务器，请检查您的网络连接。</string>\n    <string name=\"kuiklyTag\">存在 TDS 腾讯端服务 Kuikly 开发框架</string>\n    <string name=\"showKuiklyTag\">显示 Kuikly 开发框架标识</string>\n    <string name=\"getWeTypeTestLinkFromWeTypeLatestChannel\">获取微信输入法测试版</string>\n    <string name=\"getWeixinAlphaLinkFromWeixinConfig\">获取微信测试版</string>\n    <string name=\"autoCheckForUpdatesDesc\">每次启动时将通过 GitHub REST API 检查一次更新</string>\n    <string name=\"useTheSystemDownloadManagerToTakeOverTheDownloadIntentDesc\">开启后，软件全局触发下载意图时将不再打开浏览器</string>\n    <string name=\"showKuiklyTagDesc\">Kuikly 内置情况以 QQ 正式版为判断来源</string>\n    <string name=\"versionCardsDisplaysPackageSizeDesc\">仅对 QQ 版本卡片生效</string>\n    <string name=\"aboutVersionCards\">版本列表与卡片</string>\n    <string name=\"showUnrealEngineTagDesc\">虚幻引擎内置情况以 QQ 正式版为判断来源</string>\n    <string name=\"general\">通用</string>\n    <string name=\"copyAll\">复制全部</string>\n    <string name=\"enumVerMaintenanceModeWarning\">扫版功能已进入维护模式。您仍可以继续使用现有扫版功能，但 QQ 版本列表实用工具不再对相关功能及其任何后果作出任何可靠性保证，不再对相关功能进行积极开发，也不再接受相关新功能请求。请明确并确保自身具备足够的风险识别和承受能力。</string>\n    <string name=\"localDetailsQQNT\">QQNT 技术架构</string>\n    <string name=\"localDetailsBugly\">Bugly 端质量监控平台</string>\n    <string name=\"localDetailsShiply\">Shiply 容器与发布平台</string>\n    <string name=\"localDetailsHippy\">Hippy 跨端开发框架</string>\n    <string name=\"localDetailsKuikly\">Kuikly 跨端开发框架</string>\n    <string name=\"localDetailsRightly\">Rightly 应用合规解决方案</string>\n    <string name=\"localDetailsUELibrary\">Unreal Engine as a Library</string>\n    <string name=\"localDetailsUELibraryDesc\">Unreal Engine as a Library 会将虚幻引擎的功能重新打包成一个库，以便其他应用程序生成和控制它们自己的 UE 实例。UELibrary 提供了一种简单、不依赖于平台的 API 来驱动 UE。</string>\n    <string name=\"localDetailsBuglyDesc\">Bugly 是 TDS 腾讯端服务（Tencent Device-oriented Service）旗下的端质量监控平台，通过采集、监控、定位、告警等核心能力，提供专业的质量监控服务，帮助开发者及时发现并解决质量问题，打造高质量应用。</string>\n    <string name=\"localDetailsShiplyDesc\">Shiply，全称 TDS 腾讯端服务 Shiply 容器与发布，属于 TDS 腾讯端服务系列产品的子产品之一，是源于腾讯内部 App 的一站式容器与发布解决方案。Shiply 提供了一套规则灵活、发布安全、高效分发的终端基础通用发布系统，功能包括：配置与开关、资源发布、应用升级，移动端热修复、Flutter 动态化、跨端开发框架等相关能力和分发支持，帮助产品和技术团队提高研效能力和决策力。</string>\n    <string name=\"localDetailsHippyDesc\">Hippy 是 TDF 腾讯端框架（Tencent Device-oriented Framework）下的开源跨平台应用开发解决方案。Hippy 从底层做了大量工作，抹平了 iOS、Android、OpenHarmony 三端差异，提供了接近 Web 的开发体验，目前上层支持了 React 和 Vue 两套界面框架，前端开发人员可以通过它，将前端代码转换为终端的原生指令，进行原生终端 APP 的开发。同时，Hippy 从底层进行了大量优化，在启动速度、渲染性能、动画速度、内存占用、包体积等方面都提供了业内顶尖的性能表现。</string>\n    <string name=\"localDetailsRightlyDesc\">Rightly 是面向移动端的全流程合规解决方案，集「合规管控」和「合规测评」为一体，为 APP 提供运行全周期数据安全与合规保护解决方案，也为 APP 提供个人信息风险审查与合规性检测服务，覆盖多项隐私安全指标。Rightly 能够助力业务提高合规效率，降低违规风险。</string>\n    <string name=\"localDetailsKuiklyDesc\">Kuikly（Kotlin UI Kit）跨端开发框架，是 TDF 腾讯端框架（Tencent Device-oriented Framework）的一部分。Kuikly 通过自研 Kotlin Multiplatform 逻辑与终端界面原生控件渲染映射协议层，并采用声明式与响应式设计，使采用 Kuikly 的 Kotlin 开发者能拥有原生高效的 Android 开发体验并构建具有原生性能的跨平台应用。Kuikly 更可依托于 TDS 腾讯端服务 Shiply 容器与发布平台，实现按页颗粒度的完备客户端界面动态化能力。</string>\n    <string name=\"localDetailsQQNTDesc\">QQNT 技术架构是腾讯 QQ 客户端全新的跨平台技术架构体系。QQNT 技术架构将 QQ 客户端核心功能——如核心登录、消息系统、关系链、富媒体、长连接、数据库等——下沉至 QQNT 内核层，使用 C++ 抽象逻辑封装为原生库并提供多平台多语言一致性接口，以实现 QQ 客户端核心逻辑代码跨平台与程序高性能运作。</string>\n    <string name=\"localDetailsMsg\">详细信息</string>\n    <string name=\"stackInfo\">技术栈信息</string>\n    <string name=\"details\">详情</string>\n    <string name=\"thisVerContains\">此版本包含 %s</string>\n    <string name=\"packageNameIsErr\">应用包名与预设不匹配</string>\n    <string name=\"useNewLocalDetailsPage\">使用新版本机应用详情页</string>\n    <string name=\"fileErr\">文件类型错误</string>\n    <string name=\"apkAnalyze\">应用包分析</string>\n    <string name=\"unknownErr\">未知错误</string>\n    <string name=\"notEnoughSpaceOnTheDevice\">设备剩余空间不足</string>\n    <string name=\"localDetailsTencentBeacon\">腾讯灯塔</string>\n    <string name=\"localDetailsTencentBeaconDesc\">腾讯灯塔全场景大数据分析套件，是腾讯 50+ 业务自 2018 年以来使用数据中台演化而成，支持每日数十亿条数据资产的全面管理，数千业务员工深度依赖的整体化工具套件。</string>\n    <string name=\"haveNotAgreeUA\">未同意用户协议，无法使用本软件</string>\n    <string name=\"localDetailsFlutter\">Flutter</string>\n    <string name=\"localDetailsFlutterDesc\">Flutter 是 Google 的便携式 UI 工具包，帮助你在移动、web、桌面端创造高质量的绝妙原生体验的应用。 Flutter 可以和世界上的开发人员和开发组织广泛使用的那些现存代码一起使用，并且是开源的、免费的。</string>\n    <string name=\"localDetailsJetpackCompose\">Jetpack Compose</string>\n    <string name=\"localDetailsJetpackComposeDesc\">Jetpack Compose 是用于构建原生 Android 界面的新工具包。它使用更少的代码、强大的工具和直观的 Kotlin API，可以帮助您简化并加快 Android 界面开发。 </string>\n    <string name=\"localDetailsComposeMultiplatform\">Compose Multiplatform</string>\n    <string name=\"localDetailsComposeMultiplatformDesc\">Compose Multiplatform 是一个由 JetBrains 开发的现代化声明式和响应式 UI 框架，它提供了一种只需少量 Kotlin 代码即可构建用户界面的简单方法。它还允许您只需编写一次用户界面，即可在任何支持的平台——iOS、Android、桌面（Windows、macOS、Linux）和 Web——上运行。</string>\n    <string name=\"security\">安全</string>\n    <string name=\"privateTokenSettings\">私有 Token 管理</string>\n    <string name=\"privateTokenSettingsDesc\">此处内填入的 Token 将由 Android 密钥库系统安全加密后存储</string>\n    <string name=\"zhipuAIMaaSPlatformToken\">智谱 AI 开放平台 Token</string>\n    <string name=\"updateLogPrompt\">请根据用户传入的更新日志文本，以清晰简洁的 %s 语言对更新日志文本进行专业总结，要求：1) 提取核心功能优化和关键问题修复，忽略技术细节 2) 采用 Pangu 格式化文本，确保中英文/数字间自动空格 3) 完全避免产品名称及主观评价 4) 用连贯段落呈现，严格控制在 150 字内。输出需突出用户感知明显的改进点，使用规范化表述，禁止列表格式且不使用 Markdown。</string>\n    <string name=\"githubPersonalAccessToken\">GitHub 个人访问令牌</string>\n    <string name=\"TEESupported\">密钥由设备可信执行环境（TEE）安全硬件提供保护</string>\n    <string name=\"StrongBoxSupported\">密钥由设备 StrongBox 安全元件提供保护</string>\n    <string name=\"UnknownSecurityHardwareSupported\">密钥由设备安全硬件提供保护</string>\n    <string name=\"SecuritySoftwareSupported\">密钥由 Android 密钥库提供保护</string>\n    <string name=\"testGitHubToken\">保存并联网测试 GitHub 个人访问令牌可用性</string>\n    <string name=\"testZhipuToken\">保存并联网测试智谱 AI 开放平台 Token 可用性</string>\n    <string name=\"testZhipuTokenPrompt\">用户正在测试与您的连通性。如果您收到了这句话，请使用 %s 语言热情地与用户打招呼并用一段话详细介绍自己的模型名称。</string>\n    <string name=\"backFromZhipuPlatform\">智谱 AI 开放平台返回内容</string>\n    <string name=\"zhipuTokenSuccess\">智谱 Token 可用</string>\n    <string name=\"zhipuTokenIsNull\">智谱 Token 为空</string>\n    <string name=\"githubTokenIsNull\">GitHub 个人访问令牌为空</string>\n    <string name=\"githubTokenSuccess\">GitHub 个人访问令牌可用</string>\n    <string name=\"githubTokenUnavailable\">GitHub 个人访问令牌不可用，请检查您的 GitHub 个人访问令牌有效性。</string>\n    <string name=\"githubTokenUnavailableTitle\">GitHub 个人访问令牌不可用</string>\n    <string name=\"testToken\">测试 Token 可用性</string>\n    <string name=\"llmIntelligent\">LLM 智能摘要</string>\n    <string name=\"aiLLMInference\">LLM 推理</string>\n    <string name=\"qverbowUpdateLogLLMIntelligentDesc\">检查到更新时将使用 LLM 智能摘要更新日志，需要在“私有 Token 管理”填入智谱 Token</string>\n    <string name=\"qverbowUpdateLogLLMIntelligent\">更新日志智能摘要</string>\n    <string name=\"githubTokenHelperText\">GitHub 个人访问令牌将用于解除 GitHub REST API 访问速率限制，填入并保存即生效</string>\n    <string name=\"zhipuTokenHelperText\">默认仅请求智谱免费模型 GLM-4-Flash</string>\n    <string name=\"zhipuTokenIsInvalid\">填入的 Token 被智谱 AI 开放平台大模型接口 Java SDK 判定无效。</string>\n    <string name=\"clickHereToViewTheChangelog\">点击此处查看更新日志</string>\n    <string name=\"localWeixinVersion\">本机微信：</string>\n    <string name=\"weixin\">微信</string>\n    <string name=\"localDetailsMMKV\">MMKV</string>\n    <string name=\"localDetailsMMKVDesc\">MMKV 是微信中的一个高效、小巧、易用的移动的键值对存储框架，可在 Android、iOS/macOS、Windows、POSIX 和 HarmonyOS NEXT 上使用。</string>\n    <string name=\"localDetailsWCDB\">WCDB</string>\n    <string name=\"localDetailsWCDBDesc\">WCDB 是一个易用、高效、完整的移动数据库框架，它基于 SQLite 和 SQLCipher 开发，在微信中应用广泛，且支持在 C++、Java、Kotlin、Swift、Objc 五种语言环境中使用。</string>\n    <string name=\"localDetailsTinker\">Tinker</string>\n    <string name=\"localDetailsTinkerDesc\">Tinker 是微信官方的 Android 热补丁解决方案，它支持动态下发代码、So 库以及资源，让应用能够在不需要重新安装的情况下实现更新。</string>\n    <string name=\"localDetailsMars\">Mars</string>\n    <string name=\"localDetailsMarsDesc\">Mars 是微信官方的跨平台跨业务的终端基础组件。</string>\n    <string name=\"localDetailsMatrix\">Matrix</string>\n    <string name=\"localDetailsMatrixDesc\">Matrix 是一款微信研发并日常使用的应用性能接入框架，支持 iOS, macOS 和 Android。 Matrix 通过接入各种性能监控方案，对性能监控项的异常数据进行采集和分析，输出相应的问题分析、定位与优化建议，从而帮助开发者开发出更高质量的应用。</string>\n    <string name=\"localWeixinVersionDetails\">本机微信版本详情</string>\n    <string name=\"localDetailsReactNativeDesc\">React Native 将 React 的声明式 UI 框架引入 iOS 和 Android。使用 React Native，您可以直接使用原生 UI 控件，并拥有对原生平台的完整访问权限。</string>\n    <string name=\"localDetailsReactNative\">React Native</string>\n    <string name=\"localDetailsTBSDesc\">腾讯浏览服务（Tencent Browsing Service，简称 TBS）属于 PCG 事业群，QQ 浏览器团队。QQ 浏览器作为一个平台化的产品，不论是网页的打开还是文档能力的打开，都需要一个强大的自研引擎做支撑，而引擎研发团队，一直深耕引擎底层技术 10 余年，积累了丰富的业务经验，将引擎技术从产品独立出来为 SDK，并不断演进成一个平台化的引擎产品，成立腾讯浏览服务，为腾讯公司内外产品提供强大的引擎技术支持和技术服务支持，覆盖了近十万家产品接入，并支持数亿级的网页浏览体验。</string>\n    <string name=\"localDetailsTBS\">腾讯浏览服务</string>\n    <string name=\"biometricLoginTitle\">验证您的身份</string>\n    <string name=\"biometricLoginSubtitle\">验证您的身份以进一步操作</string>\n    <string name=\"llmInferenceLocalChanges\">应用更改推测</string>\n    <string name=\"genByAITips\">内容由 AI 生成，可能存在不准确的信息。</string>\n    <string name=\"llmInferenceLocalChangesDesc\">应用包分析外部应用时可以使用 LLM 推测外部应用与本机应用的功能变更，需要在“私有 Token 管理”填入智谱 Token</string>\n    <string name=\"llmInferenceLocalChangesPrompt\">用户本地已经安装了 %1$s %2$s，今天用户收到了一个 %1$s %3$s 安装包，用户已经得出收到的 %1$s %3$s 安装包的四大组件（activity、service、content provider、broadcast receiver）与权限和用户本地已安装的 %1$s %2$s 之间的差异。请根据用户传入的上述差异的文本，以清晰简洁的 %4$s 语言分析推测该差异可能存在的应用变更，要求：1) 提取核心功能优化和关键问题修复，忽略技术细节 2) 采用 Pangu 格式化文本，确保中英文/数字间自动空格 3) 用连贯段落呈现，严格控制在 300 字内。输出需突出用户感知明显的改进点，使用规范化表述，禁止列表格式且不使用 Markdown。</string>\n    <string name=\"timeout\">连接超时</string>\n    <string name=\"localDetailsSkylineRenderingEngine\">Skyline 渲染引擎</string>\n    <string name=\"localDetailsSkylineRenderingEngineDesc\">为了进一步优化小程序性能，提供更为接近原生的用户体验，微信团队在 WebView 渲染之外新增了一个渲染引擎 Skyline，其使用更精简高效的渲染管线，并带来诸多增强特性，让 Skyline 拥有更接近原生渲染的性能体验。</string>\n    <string name=\"versionNumberFontUseTCloudNumberDesc\">可在下方调整腾讯云数字字体字重</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-zh-rHK/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<resources>\n    <string name=\"app_name\">QQ 版本列表實用工具</string>\n    <string name=\"appTitle\">QQ 版本列表實用工具</string>\n    <string name=\"shortcutLongLabel\">掃版（維護模式）</string>\n    <string name=\"shortcutShortLabel\">掃版（維護）</string>\n    <string name=\"start\">開始</string>\n    <string name=\"cancel\">取消</string>\n    <string name=\"done\">確定</string>\n    <string name=\"save\">儲存</string>\n    <string name=\"installed\">已安裝</string>\n    <string name=\"copy\">複製</string>\n    <string name=\"refresh\">更新</string>\n    <string name=\"agree\">同意</string>\n    <string name=\"disagreeAndExit\">不同意並退出</string>\n    <string name=\"withdrawConsentUA\">撤回同意用戶協議</string>\n    <string name=\"withdrawConsentAndExit\">撤回同意並退出</string>\n    <string name=\"userAgreement\">用戶協議</string>\n    <string name=\"enumerateVersionsFAB\">掃版（維護模式）</string>\n    <string name=\"enumerateVersionsDialogTitle\">掃版（維護模式）</string>\n    <string name=\"setting\">設定</string>\n    <string name=\"personalization\">個人化</string>\n    <string name=\"about\">關於</string>\n    <string name=\"enumerateVersionsFormatSetting\">掃版直鏈格式設定</string>\n    <string name=\"getUpdateFromTDSShiplyDistributionPlatform\">TDS 腾訊端服務 Shiply 容器與發布平台更新獲取（實驗性）</string>\n    <string name=\"getUpdateFromShiplyPlatform\">Shiply 平台更新取得（實驗性）</string>\n    <string name=\"acceptedEnumerateVersion\">掃描成功</string>\n    <string name=\"contentReturnedByShiplyPlatform\">Shiply 平台返回內容</string>\n    <string name=\"applicationError\">程式出錯</string>\n    <string name=\"additionalActions\">進一步操作</string>\n    <string name=\"shareTo\">分享至</string>\n    <string name=\"jsonDetails\">JSON 詳情</string>\n    <string name=\"stableVersion\">正式版</string>\n    <string name=\"previewVersion\">測試版</string>\n    <string name=\"spaceEnumerateVersion\">空格掃版</string>\n    <string name=\"weixinEnumerateVersion\">微信掃版</string>\n    <string name=\"aboutAppName\">QQ 版本列表實用工具 for Android™</string>\n    <string name=\"aboutAuthor\">作者：</string>\n    <string name=\"aboutContributor\">貢獻者：</string>\n    <string name=\"version\">版本：</string>\n    <string name=\"aboutSpecialThanksTo\">特別感謝：</string>\n    <string name=\"aboutOpenSourceRepo\">開源倉庫：</string>\n    <string name=\"aboutGetUpdate\">取得更新：</string>\n    <string name=\"aboutDescription\">提供 Android QQ 版本列表的檢視及對 Android QQ 下載連結的枚舉法掃描。</string>\n    <string name=\"copied\">已複製：</string>\n    <string name=\"reatedFileSize\">額定大小：</string>\n    <string name=\"sourceJSON\">源 JSON</string>\n    <string name=\"recommendations\">建議的內容</string>\n    <string name=\"longPressTheVersionCardToViewSourceDetails\">長按版本卡片查看源詳情</string>\n    <string name=\"useTheSystemDownloadManagerToTakeOverTheDownloadIntent\">使用系統下載管理器</string>\n    <string name=\"removeMultiplesOf5ForQQPreviewVersions\">解除 QQ 測試版掃版小版本號遵循 5 的倍數限制</string>\n    <string name=\"longPressToViewSourceDetailsIsDisabled\">未開啟長按查看源詳情功能，請前往設定開啟</string>\n    <string name=\"currentSizeVsLargestHistoricalPackage\">占比歷史最大包（%s）：</string>\n    <string name=\"extendTheSuffixForDirectDownloadLinksOfEnumeratedPreviewVersions\">擴展測試版掃版直鏈後綴</string>\n    <string name=\"fileSize\">大小：</string>\n    <string name=\"downloadLink\">下載連結：</string>\n    <string name=\"saved\">已儲存</string>\n    <string name=\"enumQQPreviewWarning\">鑑於 QQ 測試版可能存在無法預知的穩定性問題，您在下載及使用該測試版本之前，必須明確並確保自身具備足夠的風險辨識和承受能力。根據相關條款，您使用本軟體時應當已了解並同意，因下載或使用 QQ 測試版而可能產生的任何直接或間接損失、損害以及其他不利後果，均由您自行承擔全盤責任。</string>\n    <string name=\"enumQQMajorVersionHelpText\">填寫格式為 x.y.z</string>\n    <string name=\"enumWeixinMajorVersionHelpText\">無需填寫小數點</string>\n    <string name=\"enumWeixinWarning\">微信掃版功能為 QQ 版本列表實用工具附帶的實驗性功能，可能存在無法預知的穩定性問題。請明確並確保自身具備足夠的風險辨識和承受能力。</string>\n    <string name=\"enumHasBeenStopped\">已停止掃版</string>\n    <string name=\"missingCipherWarning\">TDS 腾訊端服務 Shiply 容器與發布平台返回 JSON 內容中未包含「cipher_text」鍵值對。</string>\n    <string name=\"missingMajorVersionWarning\">掃版需要填寫主版本號，否則無法執行掃版。</string>\n    <string name=\"missingQQPreviewMinorVersionWarning\">測試版掃版（含空格掃版）需要填寫小版本號，否則無法掃描測試版。</string>\n    <string name=\"QQPreviewMinorNot5Warning\">小版本號需填寫 5 的倍數。如需解除此限制，請前往設定進行解除。</string>\n    <string name=\"missingWeixinTrueVersionWarning\">微信掃版需要填寫真實版本號，否則無法掃描微信版本。</string>\n    <string name=\"missingWeixin16CodeWarning\">微信掃版需要填寫十六進位碼，否則無法掃描微信版本。</string>\n    <string name=\"enumeratingDownloadLink\">正在掃描下載地址：</string>\n    <string name=\"majorVersion\">主版本號</string>\n    <string name=\"initialMinorVersion\">起始小版本號</string>\n    <string name=\"hexadecimalCode\">十六進位碼</string>\n    <string name=\"initialMinorVersionHelpText\">填寫起始掃描小版本號，扫正式版時無需填寫</string>\n    <string name=\"hexadecimalCodeHelpText\">填寫十六進位碼，僅微信掃版使用</string>\n    <string name=\"enumType\">掃版類型</string>\n    <string name=\"enumTypeHelpText\">指定掃版目標類型</string>\n    <string name=\"trueVersion\">真實版本號</string>\n    <string name=\"trueVersionHelpText\">填寫真實版本號（版本碼），僅微信掃版使用</string>\n    <string name=\"appidOptional\">appid（非必填）</string>\n    <string name=\"shiplyGeneralOptionalHelpText\">預設值：</string>\n    <string name=\"shiplyVersion\">版本</string>\n    <string name=\"shiplyVersionHelpText\">填寫用於請求 Shiply 平台的 Android QQ/TIM 版本號</string>\n    <string name=\"uinHelpText\">填寫用於請求 Shiply 平台的對象 QQ 號</string>\n    <string name=\"shiplyWarning\">騰訊 QQ/TIM 使用 TDS 腾訊端服務 Shiply 容器與發布平台，根據 QQ 號（uin）及其終端資訊分發小範圍灰度測試安裝包。此功能並非每次請求都能成功獲取到更新資料，無法獲取更新資料則表示填寫的參數不在 Shiply 平台認可與分發範圍內。QQ 版本列表實用工具不對此功能及其任何後果作出任何可靠性保證。請明確並確保自身具備足夠的風險辨識和承受能力。</string>\n    <string name=\"defaultDisplayOfFirstListItemDetails\">首項卡片默認顯示詳情</string>\n    <string name=\"versionNumberFontUseTCloudNumber\">使用腾讯雲數字字體</string>\n    <string name=\"versionCardsDisplaysPackageSizeIndicator\">顯示額定包大小佔比歷史最大包指示條</string>\n    <string name=\"customVersionEnumSuffix\">自定義掃版後綴</string>\n    <string name=\"customVersionEnumSuffixHelpText\">請使用“, ”（西文逗號+空格）分割</string>\n    <string name=\"facilitateI18n\">協助翻譯：</string>\n    <string name=\"versionCardExpandButtonContentDescription\">展開詳情</string>\n    <string name=\"versionCardCollapseButtonContentDescription\">收起詳情</string>\n    <string name=\"shiplyAdvancedConfigurations\">進階配置</string>\n    <string name=\"shiplyOsVersionOptional\">osVersion（非必填）</string>\n    <string name=\"shiplySdkVersionOptional\">sdkVersion（非必填）</string>\n    <string name=\"shiplyModelOptional\">model（非必填）</string>\n    <string name=\"shiplyLanguageOptional\">language（非必填）</string>\n    <string name=\"thicknessFollowSystem\">跟隨系統</string>\n    <string name=\"back\">返回</string>\n    <string name=\"shiplyUseAdvancedConfigurations\">使用進階配置</string>\n    <string name=\"localQQVersion\">本機 QQ：</string>\n    <string name=\"bracket\">（%s）</string>\n    <string name=\"localTIMVersion\">本機 TIM：</string>\n    <string name=\"localQQVersionDetails\">本機 QQ 版本詳情</string>\n    <string name=\"localTIMVersionDetails\">本機 TIM 版本詳情</string>\n    <string name=\"accessibilityTag\">6aiw6KiKIFFRIOW3suS4iue3muS4gOmgheeEoemanOekmeeUqOaItuWwiOWxrOWEquWMluaOquaWveabtOaWsOOAgueVtuenu+WLlee1guerr+ioreWCmeWVn+eUqOezu+e1seeEoemanOekmeiugOWxj+acjeWLme+8iOWmgiBBbmRyb2lkIFRhbGtiYWNr44CBaU9TIFZvaWNlT3Zlcu+8ie+8jOS4puS4lOWQjOaZguS9v+eUqOmosOioiiBRUSDnp7vli5XlrqLmiLbnq68gOS4wLjg1IOWPiuS7peS4iueJiOacrOaZgu+8jOmosOioiiBRUSDlsIfmnIPmuJvlsJHmiJblgZzmraLlkJHmraTpoZ4gUVEg5a6i5oi256uv55m86YCB5buj5ZGK44CC</string>\n    <string name=\"imageGallery\">應用宣傳圖</string>\n    <string name=\"share\">分享</string>\n    <string name=\"download\">下載</string>\n    <string name=\"stop\">停止</string>\n    <string name=\"skip\">跳過</string>\n    <string name=\"qqntTag\">基於 QQNT 技術架構</string>\n    <string name=\"releaseDateTIM\">發佈日期：</string>\n    <string name=\"checkUpdateViaGitHubAPI\">透過 GitHub REST API 檢查更新</string>\n    <string name=\"noUpdatesDetected\">未檢測到更新</string>\n    <string name=\"noAssetsDetected\">未檢測到資產文件</string>\n    <string name=\"cannotGetGitHub\">無法連接到 GitHub，請確保您所在的網絡環境可以訪問 GitHub。</string>\n    <string name=\"updateQverbowAvailable\">更新可用</string>\n    <string name=\"copyLink\">複製連結</string>\n    <string name=\"unrealEngineTag\">內建虛幻引擎</string>\n    <string name=\"autoCheckForUpdates\">啟動時檢查更新</string>\n    <string name=\"useQQ8958Test\">使用 QQ 8.9.58 測試版直鏈格式</string>\n    <string name=\"ciVersionNoSupportUpdates\">CI 构建版本不支援檢查更新</string>\n    <string name=\"showUnrealEngineTag\">顯示虛幻引擎標誌</string>\n    <string name=\"suffixSetting\">後綴設定</string>\n    <string name=\"others\">其它</string>\n    <string name=\"ok\">好</string>\n    <string name=\"swipeLeftToSeeMore\">向左滑動查看更多</string>\n    <string name=\"getUpdateFromTencentAppStore\">騰訊應用寶更新取得（實驗性）</string>\n    <string name=\"experimentalFeatures\">實驗性功能</string>\n    <string name=\"getQQLinkFromTencentAppStore\">取得 QQ 下載直鏈</string>\n    <string name=\"getTIMLinkFromTencentAppStore\">取得 TIM 下載直鏈</string>\n    <string name=\"getWeixinLinkFromTencentAppStore\">取得微信下載直鏈</string>\n    <string name=\"getWeComLinkFromTencentAppStore\">取得企業微信下載直鏈</string>\n    <string name=\"contentReturnedByTencentAppStore\">騰訊應用寶返回內容</string>\n    <string name=\"getWeTypeLinkFromTencentAppStore\">取得微信輸入法下載直鏈</string>\n    <string name=\"tencentAppStoreWarning\">騰訊應用寶更新取得功能為 QQ 版本列表實用工具附帶的實驗性功能，可能存在不可預知的穩定性問題。請明確並確保自身具備足夠的風險識別和承受能力。</string>\n    <string name=\"showOldLoading\">掃版對話框使用舊版加載動畫</string>\n    <string name=\"versionCardsDisplaysPackageSizeText\">顯示額定包大小佔比歷史最大包百分比</string>\n    <string name=\"timVersion\">TIM 掃版</string>\n    <string name=\"enumTIMWarning\">TIM 掃版功能為 QQ 版本列表實用工具附帶的實驗性功能，可能存在無法預知的穩定性問題。請明確並確保自身具備足夠的風險辨識和承受能力。</string>\n    <string name=\"useQQ9008_14600Test\">掃版類型添加 QQ 9.0.8.14600 空格直鏈格式</string>\n    <string name=\"initFirebaseService\">初始化 Firebase 服務</string>\n    <string name=\"enablingFirebaseServiceWarning\">初始化 Firebase 服務後，將立即在本地由 Firebase SDK 生成註冊令牌，並將標識符和配置數據上傳到 Firebase 伺服器。此操作一经啟用即無法撤銷，是否繼續？</string>\n    <string name=\"rainbow_notification_channel_id\">rainbow_notification_channel_id</string>\n    <string name=\"cannotFindGooglePlayServices\">當前設備未檢測到 Google Play 服務，因此無法在當前設備中使用 Firebase 提供的服務。</string>\n    <string name=\"rainbow_notification_channel_title\">版本列表更新</string>\n    <string name=\"rainbow_notification_channel_description\">透過 Firebase 雲訊息傳遞</string>\n    <string name=\"enablingFirebaseServiceInsights\">啟用 Firebase 服務可使用以下功能：\\n- 透過 Firebase 雲訊息傳遞的版本清單更新提醒</string>\n    <string name=\"enablingFirebaseServiceWarning2\">Firebase 雲訊息傳遞綁定了 Google Analytics。使用 Firebase 雲端訊息傳遞將會不可避免地上傳您在本軟體中的活躍資訊。</string>\n    <string name=\"continueKey\">繼續</string>\n    <string name=\"initializedFirebaseService\">Firebase 服務已初始化，無法撤銷</string>\n    <string name=\"cannotEnableFirebaseCloudMessaging\">接收版本列表更新通知提醒必須打開系統通知權限，否則無法接收版本列表更新提醒。</string>\n    <string name=\"pushSystemNotificationsWhenVersionListUpdates\">版本列表更新時推送系統通知</string>\n    <string name=\"unsubscribeTimeout\">取消訂閱超時</string>\n    <string name=\"unsubscribeSuccess\">取消訂閱成功</string>\n    <string name=\"unsubscribeFailed\">取消訂閱失敗</string>\n    <string name=\"subscribeTimeout\">訂閱超時</string>\n    <string name=\"subscribeSuccess\">訂閱成功</string>\n    <string name=\"subscribeFailed\">訂閱失敗</string>\n    <string name=\"initializedFirebaseServiceItem\">Firebase 服務已初始化</string>\n    <string name=\"toSystemSetting\">前往系統設定</string>\n    <string name=\"threePartySharedList\">個人資訊第三方共用清單</string>\n    <string name=\"shiplyTargetApp\">目標應用</string>\n    <string name=\"shiplyTargetAppQQ\">QQ</string>\n    <string name=\"shiplyTargetAppTIM\">TIM</string>\n    <string name=\"shiplyTargetHelper\">指定 Shiply 平台的目標應用</string>\n    <string name=\"openSourceLicenseTitle\">開放原始碼許可</string>\n    <string name=\"basedOnQQVer\">基於 Android QQ %s 二次開發</string>\n    <string name=\"getQidianLinkFromTencentAppStore\">取得騰訊企點下載直鏈</string>\n    <string name=\"getWeixinAlphaLinkFromWeixinConfigDesc\">從騰訊伺服器配置拉取微信最新測試版下載直鏈</string>\n    <string name=\"successInGetting\">取得成功</string>\n    <string name=\"getWeixinAlphaConfig404\">似乎未能成功訪問騰訊伺服器配置文件，可能是因為微信當前沒有測試版或測試版已撤回。</string>\n    <string name=\"getWeixinAlphaConfigLink404\">似乎未能成功訪問此下載地址，可能是因為微信當前測試版已撤回。</string>\n    <string name=\"suspectedPackageWithdrawal\">疑似撤包</string>\n    <string name=\"colon\">：</string>\n    <string name=\"qverbowHash\">雜湊值校驗</string>\n    <string name=\"verifyHashValueViaGitHubAPI\">透過 GitHub REST API 校驗雜湊值</string>\n    <string name=\"hashIsTrue\">雜湊值與 GitHub Releases 一致</string>\n    <string name=\"hashIsFalse\">您所使用的版本與 GitHub Releases 雜湊值不一致，為了您的安全，請盡快卸載當前版本應用並前往官方 GitHub Releases 下載此軟件。</string>\n    <string name=\"toGitHubRelease\">前往下載</string>\n    <string name=\"getWeTypeTestLinkFromWeTypeLatestChannelDesc\">從微信輸入法測試管道獲取微信輸入法最新下載直鏈</string>\n    <string name=\"getWeTypeLatestChannel404\">未能成功訪問微信輸入法伺服器，請檢查您的網絡連接。</string>\n    <string name=\"kuiklyTag\">存在 TDS 腾訊端服務 Kuikly 開發框架</string>\n    <string name=\"showKuiklyTag\">顯示 Kuikly 開發框架標誌</string>\n    <string name=\"getWeTypeTestLinkFromWeTypeLatestChannel\">取得微信輸入法測試版</string>\n    <string name=\"getWeixinAlphaLinkFromWeixinConfig\">拉取微信測試版</string>\n    <string name=\"autoCheckForUpdatesDesc\">每次啟動時將通過 GitHub REST API 檢查一次更新</string>\n    <string name=\"useTheSystemDownloadManagerToTakeOverTheDownloadIntentDesc\">啟用後，軟件全局觸發下載意圖時將不再打開瀏覽器</string>\n    <string name=\"showKuiklyTagDesc\">Kuikly 的內置情況以 QQ 正式版為判斷依據</string>\n    <string name=\"versionCardsDisplaysPackageSizeDesc\">僅對 QQ 版本卡片生效</string>\n    <string name=\"aboutVersionCards\">版本列表與卡片</string>\n    <string name=\"showUnrealEngineTagDesc\">虚幻引擎的內置情況以 QQ 正式版為判斷依據</string>\n    <string name=\"general\">通用</string>\n    <string name=\"copyAll\">複製全部</string>\n    <string name=\"enumVerMaintenanceModeWarning\">掃版功能已進入維護模式。您仍可以繼續使用現有的掃版功能，但 QQ 版本列表實用工具將不再對相關功能及其任何後果作出任何可靠性保證，不再對相關功能進行積極開發，也不再接受相關新功能請求。請明確並確保自身具備足夠的風險識別和承受能力。</string>\n    <string name=\"localDetailsQQNT\">QQNT 技術架構</string>\n    <string name=\"localDetailsBugly\">Bugly 端品質監控平台</string>\n    <string name=\"localDetailsShiply\">Shiply 容器與發布平台</string>\n    <string name=\"localDetailsHippy\">Hippy 跨端開發框架</string>\n    <string name=\"localDetailsKuikly\">Kuikly 跨端開發框架</string>\n    <string name=\"localDetailsRightly\">Rightly 應用合規解決方案</string>\n    <string name=\"localDetailsUELibrary\">Unreal Engine as a Library</string>\n    <string name=\"localDetailsUELibraryDesc\">Unreal Engine as a Library 会将虚幻引擎的功能重新打包成一个库，以便其他应用程序生成和控制它们自己的 UE 实例。UELibrary 提供了一种简单、不依赖于平台的 API 来驱动 UE。</string>\n    <string name=\"localDetailsBuglyDesc\">Bugly 是 TDS 腾讯端服务（Tencent Device-oriented Service）旗下的端质量监控平台，通过采集、监控、定位、告警等核心能力，提供专业的质量监控服务，帮助开发者及时发现并解决质量问题，打造高质量应用。</string>\n    <string name=\"localDetailsShiplyDesc\">Shiply，全称 TDS 腾讯端服务 Shiply 容器与发布，属于 TDS 腾讯端服务系列产品的子产品之一，是源于腾讯内部 App 的一站式容器与发布解决方案。Shiply 提供了一套规则灵活、发布安全、高效分发的终端基础通用发布系统，功能包括：配置与开关、资源发布、应用升级，移动端热修复、Flutter 动态化、跨端开发框架等相关能力和分发支持，帮助产品和技术团队提高研效能力和决策力。</string>\n    <string name=\"localDetailsHippyDesc\">Hippy 是 TDF 腾讯端框架（Tencent Device-oriented Framework）下的开源跨平台应用开发解决方案。Hippy 从底层做了大量工作，抹平了 iOS、Android、OpenHarmony 三端差异，提供了接近 Web 的开发体验，目前上层支持了 React 和 Vue 两套界面框架，前端开发人员可以通过它，将前端代码转换为终端的原生指令，进行原生终端 APP 的开发。同时，Hippy 从底层进行了大量优化，在启动速度、渲染性能、动画速度、内存占用、包体积等方面都提供了业内顶尖的性能表现。</string>\n    <string name=\"localDetailsRightlyDesc\">Rightly 是面向移动端的全流程合规解决方案，集「合规管控」和「合规测评」为一体，为 APP 提供运行全周期数据安全与合规保护解决方案，也为 APP 提供个人信息风险审查与合规性检测服务，覆盖多项隐私安全指标。Rightly 能够助力业务提高合规效率，降低违规风险。</string>\n    <string name=\"localDetailsKuiklyDesc\">Kuikly（Kotlin UI Kit）跨端开发框架，是 TDF 腾讯端框架（Tencent Device-oriented Framework）的一部分。Kuikly 通过自研 Kotlin Multiplatform 逻辑与终端界面原生控件渲染映射协议层，并采用声明式与响应式设计，使采用 Kuikly 的 Kotlin 开发者能拥有原生高效的 Android 开发体验并构建具有原生性能的跨平台应用。Kuikly 更可依托于 TDS 腾讯端服务 Shiply 容器与发布平台，实现按页颗粒度的完备客户端界面动态化能力。</string>\n    <string name=\"localDetailsQQNTDesc\">QQNT 技术架构是腾讯 QQ 客户端全新的跨平台技术架构体系。QQNT 技术架构将 QQ 客户端核心功能——如核心登录、消息系统、关系链、富媒体、长连接、数据库等——下沉至 QQNT 内核层，使用 C++ 抽象逻辑封装为原生库并提供多平台多语言一致性接口，以实现 QQ 客户端核心逻辑代码跨平台与程序高性能运作。</string>\n    <string name=\"localDetailsMsg\">詳細資訊</string>\n    <string name=\"stackInfo\">技術棧資訊</string>\n    <string name=\"details\">詳細</string>\n    <string name=\"thisVerContains\">此版本包含 %s</string>\n    <string name=\"packageNameIsErr\">應用程式包名與預設不匹配</string>\n    <string name=\"useNewLocalDetailsPage\">使用新版本機應用詳細頁面</string>\n    <string name=\"fileErr\">檔案類型錯誤</string>\n    <string name=\"apkAnalyze\">應用包分析</string>\n    <string name=\"unknownErr\">未知錯誤</string>\n    <string name=\"notEnoughSpaceOnTheDevice\">設備剩餘空間不足</string>\n    <string name=\"localDetailsTencentBeacon\">腾訊燈塔</string>\n    <string name=\"localDetailsTencentBeaconDesc\">騰訊燈塔全場景大數據分析套件，是騰訊 50+ 個業務自 2018 年以來使用數據中台演變而成，支持每日數十億條數據資產的全面管理，數千業務員工深度依賴的整體化工具套件。</string>\n    <string name=\"haveNotAgreeUA\">未同意使用者協議，無法使用本軟體</string>\n    <string name=\"localDetailsFlutter\">Flutter</string>\n    <string name=\"localDetailsFlutterDesc\">Flutter 是 Google 的便携式 UI 工具包，帮助你在移动、web、桌面端创造高质量的绝妙原生体验的应用。 Flutter 可以和世界上的开发人员和开发组织广泛使用的那些现存代码一起使用，并且是开源的、免费的。</string>\n    <string name=\"localDetailsJetpackCompose\">Jetpack Compose</string>\n    <string name=\"localDetailsJetpackComposeDesc\">Jetpack Compose 是建構原生 Android UI 的新型工具包。Jetpack Compose 能以較少的程式碼、強大的工具和符合直覺的 Kotlin API，簡化並加快 Android 平台的 UI 開發作業。</string>\n    <string name=\"localDetailsComposeMultiplatform\">Compose Multiplatform</string>\n    <string name=\"localDetailsComposeMultiplatformDesc\">Compose Multiplatform 是一个由 JetBrains 开发的现代化声明式和响应式 UI 框架，它提供了一种只需少量 Kotlin 代码即可构建用户界面的简单方法。它还允许您只需编写一次用户界面，即可在任何支持的平台——iOS、Android、桌面（Windows、macOS、Linux）和 Web——上运行。</string>\n    <string name=\"security\">安全</string>\n    <string name=\"privateTokenSettings\">私人 Token 設定</string>\n    <string name=\"privateTokenSettingsDesc\">在此處填入的 Token 將由 Android 金鑰庫系統安全加密後儲存。</string>\n    <string name=\"zhipuAIMaaSPlatformToken\">智譜 AI 開放平台 Token</string>\n    <string name=\"updateLogPrompt\">請依據使用者提供的更新日誌文本，以清晰簡潔的 %s 語言進行專業總結。要求：1) 提取核心功能優化與關鍵問題修復，忽略技術細節 2) 採用 Pangu 格式化文本，確保中英文/數字間自動留空 3) 完全避免產品名稱及主觀評價 4) 以連貫段落呈現，嚴格控制在 150 字內。輸出需突出使用者感知明顯的改進點，使用規範化表述，禁止清單格式且不使用 Markdown。</string>\n    <string name=\"githubPersonalAccessToken\">GitHub 個人存取權杖</string>\n    <string name=\"TEESupported\">密鑰由設備可信執行環境（TEE）安全硬件提供保護</string>\n    <string name=\"StrongBoxSupported\">密鑰由設備 StrongBox 安全元件提供保護</string>\n    <string name=\"UnknownSecurityHardwareSupported\">密鑰由設備的安全硬件提供保護</string>\n    <string name=\"SecuritySoftwareSupported\">密鑰由 Android 密钥库提供保護</string>\n    <string name=\"testGitHubToken\">保存並透過網路測試 GitHub 個人訪問令牌可用性</string>\n    <string name=\"testZhipuToken\">保存並透過網路測試智譜 AI 開放平台 Token 可用性</string>\n    <string name=\"testZhipuTokenPrompt\">使用者正在測試與您的連通性。如果您收到這句話，請使用 %s 語言熱情地與使用者打個招呼並用一段話介紹您的模型名稱。</string>\n    <string name=\"backFromZhipuPlatform\">智譜 AI 開放平台返回內容</string>\n    <string name=\"zhipuTokenSuccess\">智譜 Token 可用</string>\n    <string name=\"zhipuTokenIsNull\">智譜 Token 為空</string>\n    <string name=\"githubTokenIsNull\">GitHub 個人訪問令牌為空</string>\n    <string name=\"githubTokenSuccess\">GitHub 個人訪問令牌可用</string>\n    <string name=\"githubTokenUnavailable\">GitHub 個人訪問令牌不可用，請檢查您的 GitHub 個人訪問令牌有效性。</string>\n    <string name=\"githubTokenUnavailableTitle\">GitHub 個人訪問令牌不可用</string>\n    <string name=\"testToken\">測試 Token 可用性</string>\n    <string name=\"llmIntelligent\">LLM 智能摘要</string>\n    <string name=\"aiLLMInference\">LLM 推理</string>\n    <string name=\"qverbowUpdateLogLLMIntelligentDesc\">檢測到更新時將使用 LLM 智能摘要更新日誌，需要在“私有 Token 管理”填入智譜 Token</string>\n    <string name=\"qverbowUpdateLogLLMIntelligent\">更新日誌智能摘要</string>\n    <string name=\"githubTokenHelperText\">GitHub 個人存取權杖將用於解除 GitHub REST API 的存取速率限制，填入並儲存即生效</string>\n    <string name=\"zhipuTokenHelperText\">預設僅請求智譜免費模型 GLM-4-Flash</string>\n    <string name=\"zhipuTokenIsInvalid\">填入的 Token 被智譜 AI 開放平台大模型接口 Java SDK 判定無效。</string>\n    <string name=\"clickHereToViewTheChangelog\">點擊此處查看更新日誌</string>\n    <string name=\"localWeixinVersion\">本機微信/WeChat：</string>\n    <string name=\"weixin\">微信</string>\n    <string name=\"localDetailsMMKV\">MMKV</string>\n    <string name=\"localDetailsMMKVDesc\">MMKV 是微信中的一個高效、小巧、易用的移動鍵值對存儲框架，可在 Android、iOS/macOS、Windows、POSIX 和 HarmonyOS NEXT 上使用。</string>\n    <string name=\"localDetailsWCDB\">WCDB</string>\n    <string name=\"localDetailsWCDBDesc\">WCDB 是一個易用、高效、完整的移動數據庫框架，它基於 SQLite 和 SQLCipher 開發，在微信中應用廣泛，且支持在 C++、Java、Kotlin、Swift、Objc 五種語言環境中使用。</string>\n    <string name=\"localDetailsTinker\">Tinker</string>\n    <string name=\"localDetailsTinkerDesc\">Tinker 是微信官方的 Android 熱補丁解決方案，它支持動態下发代碼、So 庫以及資源，讓應用能夠在不需要重新安裝的情況下實現更新。</string>\n    <string name=\"localDetailsMars\">Mars</string>\n    <string name=\"localDetailsMarsDesc\">Mars 是微信官方的跨平台跨業務的終端基礎組件。</string>\n    <string name=\"localDetailsMatrix\">Matrix</string>\n    <string name=\"localDetailsMatrixDesc\">Matrix 是一款微信研發並日常使用的應用性能接入框架，支持 iOS、macOS 和 Android。Matrix 通過接入各種性能監控方案，對性能監控項的異常數據進行采集和分析，輸出相應的問題分析、定位與優化建議，從而幫助開發者開發出更高質量的應用。</string>\n    <string name=\"localWeixinVersionDetails\">本機微信/WeChat 版本詳情</string>\n    <string name=\"localDetailsReactNativeDesc\">React Native 將 React 的宣告式 UI 框架引入 iOS 和 Android。使用 React Native，您可以直接使用原生 UI 控制項，並擁有對原生平台的完整存取權限。</string>\n    <string name=\"localDetailsReactNative\">React Native</string>\n    <string name=\"localDetailsTBSDesc\">騰訊瀏覽服務（Tencent Browsing Service，簡稱 TBS）屬於 PCG 事業群，QQ 瀏覽器團隊。QQ 瀏覽器作為一個平台化的產品，無論是網頁的打開還是文檔能力的打開，都需要一個強大的自研引擎做支撐，而引擎研發團隊一直深耕引擎底層技術十多年，積累了豐富的業務經驗，將引擎技術從產品獨立出來為 SDK，並不斷演進成一個平台化的引擎產品，成立騰訊瀏覽服務，為騰訊公司內外產品提供強大的引擎技術支持和技術服務支持，覆蓋了近十萬家產品接入，並支持數億級的網頁瀏覽體驗。</string>\n    <string name=\"localDetailsTBS\">騰訊瀏覽服務</string>\n    <string name=\"biometricLoginTitle\">驗證您的身份</string>\n    <string name=\"biometricLoginSubtitle\">驗證您的身份以進行下一步操作</string>\n    <string name=\"llmInferenceLocalChanges\">應用程式更改推測</string>\n    <string name=\"genByAITips\">內容由 AI 生成，可能包含不準確的資訊。</string>\n    <string name=\"llmInferenceLocalChangesDesc\">應用包分析外部應用時可以使用 LLM 推測外部應用與本機應用的功能變更，需要在“私有 Token 管理”填入智譜 Token。</string>\n    <string name=\"llmInferenceLocalChangesPrompt\">用戶本地已經安裝了 %1$s %2$s，今天用戶收到了一個 %1$s %3$s 安裝包。用戶已經得出收到的 %1$s %3$s 安裝包的四大組件（activity、service、content provider、broadcast receiver）與權限和用戶本地已安裝的 %1$s %2$s 之間的差異。請根據用戶傳入的上述差異的文本，以清晰簡潔的 %4$s 語言分析推測該差異可能存在應用變更，要求：1) 提取核心功能優化和關鍵問題修復，忽略技術細節 2) 采用 Pangu 格式化文本，確保中英文/數字間自動空格 3) 用連貫段落呈現，嚴格控制在 300 字內。輸出需突出用戶感知明顯的改進點，使用規範化表述，禁止列表格式且不使用 Markdown。</string>\n    <string name=\"timeout\">連接超時</string>\n    <string name=\"localDetailsSkylineRenderingEngine\">Skyline 渲染引擎</string>\n    <string name=\"localDetailsSkylineRenderingEngineDesc\">为了进一步优化小程序性能，提供更为接近原生的使用者体验，微信團隊在 WebView 渲染之外新增了一個渲染引擎 Skyline，其使用更精簡高效的渲染管線，並帶來諸多增強特性，讓 Skyline 擁有更接近原生渲染的性能體驗。</string>\n    <string name=\"versionNumberFontUseTCloudNumberDesc\">可在下方調整騰訊雲數字字體字重</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/xml/backup_rules.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\r\n   Sample backup rules file; uncomment and customize as necessary.\r\n   See https://developer.android.com/guide/topics/data/autobackup\r\n   for details.\r\n   Note: This file is ignored for devices older that API 31\r\n   See https://developer.android.com/about/versions/12/backup-restore\r\n-->\r\n<full-backup-content>\r\n    <!--\r\n   <include domain=\"sharedpref\" path=\".\"/>\r\n   <exclude domain=\"sharedpref\" path=\"device.xml\"/>\r\n-->\r\n</full-backup-content>"
  },
  {
    "path": "app/src/main/res/xml/data_extraction_rules.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\r\n   Sample data extraction rules file; uncomment and customize as necessary.\r\n   See https://developer.android.com/about/versions/12/backup-restore#xml-changes\r\n   for details.\r\n-->\r\n<data-extraction-rules>\r\n    <cloud-backup>\r\n        <!-- TODO: Use <include> and <exclude> to control what is backed up.\r\n        <include .../>\r\n        <exclude .../>\r\n        -->\r\n    </cloud-backup>\r\n    <!--\r\n    <device-transfer>\r\n        <include .../>\r\n        <exclude .../>\r\n    </device-transfer>\r\n    -->\r\n</data-extraction-rules>"
  },
  {
    "path": "app/src/main/res/xml-v25/shortcuts.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n    Qverbow Util\n    Copyright (C) 2023 klxiaoniu\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n-->\n<shortcuts xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <shortcut\n        android:enabled=\"true\"\n        android:icon=\"@mipmap/scan_shortcut_icon\"\n        android:shortcutId=\"guess_version\"\n        android:shortcutLongLabel=\"@string/shortcutLongLabel\"\n        android:shortcutShortLabel=\"@string/shortcutShortLabel\">\n        <intent\n            android:action=\"android.intent.action.VIEW\"\n            android:targetClass=\"com.xiaoniu.qqversionlist.ui.MainActivity\"\n            android:targetPackage=\"com.xiaoniu.qqversionlist\" />\n\n        <categories android:name=\"android.shortcut.guessVersion\" />\n        <capability-binding android:key=\"actions.intent.GUESS_VERSION\" />\n    </shortcut>\n</shortcuts>\n"
  },
  {
    "path": "app/src/test/java/com/xiaoniu/qqversionlist/ExampleUnitTest.kt",
    "content": "package com.xiaoniu.qqversionlist\r\n\r\nimport org.junit.Assert.*\r\nimport org.junit.Test\r\n\r\n/**\r\n * Example local unit test, which will execute on the development machine (host).\r\n *\r\n * See [testing documentation](http://d.android.com/tools/testing).\r\n */\r\nclass ExampleUnitTest {\r\n    @Test\r\n    fun addition_isCorrect() {\r\n        assertEquals(4, 2 + 2)\r\n    }\r\n}"
  },
  {
    "path": "build.gradle.kts",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\r\nplugins {\r\n    alias(libs.plugins.android.application) apply false\r\n    id(\"org.jetbrains.kotlin.android\") version \"2.2.10\" apply false\r\n    alias(libs.plugins.compose.compiler) apply false\r\n    alias(libs.plugins.aboutlibraries) apply false\r\n}\r\n\r\nbuildscript {\r\n    repositories{\r\n        google()\r\n        mavenCentral()\r\n    }\r\n    dependencies {\r\n        classpath(libs.secrets.gradle.plugin)\r\n        classpath(libs.google.services)\r\n    }\r\n}\r\n"
  },
  {
    "path": "crowdin.yml",
    "content": "\"project_id_env\": \"CROWDIN_PROJECT_ID\"\n\"api_token_env\": \"CROWDIN_API_TOKEN\"\n\"preserve_hierarchy\": \"true\"\n\nfiles: [\n  {\n    \"source\": \"/app/src/main/res/values/strings.xml\",\n    \"translation\": \"/app/src/main/res/values-%android_code%/%original_file_name%\",\n    \"type\": \"android\"\n  }\n]"
  },
  {
    "path": "gradle/libs.versions.toml",
    "content": "[versions]\naboutlibraries = \"12.2.4\"\nactivityKtxVersion = \"1.10.1\"\nactivityVersion = \"1.10.1\"\nandroidGradlePlugin = \"8.12.2\"\nappcompat = \"1.7.1\"\nbiometric = \"1.4.0-alpha04\"\nbrowserVersion = \"1.9.0\"\ncoilVersion = \"3.3.0\"\ncommonsCompressVersion = \"1.27.1\"\ncommonsIoVersion = \"2.20.0\"\ncomposeBomVersion = \"2025.08.01\"\nconstraintlayout = \"2.2.1\"\ncoreKtx = \"1.17.0\"\ncoreSplashscreen = \"1.1.0-rc01\"\ndatastorePreferences = \"1.1.7\"\nespressoCore = \"3.7.0\"\nfirebaseBom = \"34.2.0\"\nfragmentKtx = \"1.8.9\"\ngithubApiVersion = \"1.329\"\ngoogleServices = \"4.4.3\"\ngson = \"2.13.1\"\njsoupVersion = \"1.21.2\"\njunit = \"4.13.2\"\njunitVersion = \"1.3.0\"\nkonaCryptoVersion = \"1.0.18\"\nkonaProviderVersion = \"1.0.18\"\nkotlinVersion = \"2.2.10\"\nkotlinxCoroutinesAndroid = \"1.10.2\"\nkotlinxSerializationJson = \"1.9.0\"\nlibrary = \"1.3.0\"\nlifecycleRuntimeKtx = \"2.9.3\"\nmaterial = \"1.14.0-alpha04\"\nmaterial3Version = \"1.5.0-alpha03\"\nmavenArtifact = \"3.9.11\"\noapiJavaSdkVersion = \"release-V4-2.3.3\"\nokhttp = \"5.1.0\"\npanguVersion = \"1.1.0\"\nparis = \"2.0.2\"\nrecyclerview = \"1.4.0\"\nruntimeLivedataVersion = \"1.9.0\"\nsecretsGradlePlugin = \"2.0.1\"\nsmaliDexlib2Version = \"3.0.9\"\nuiGraphicsVersion = \"1.9.0\"\nuiVersion = \"1.9.0\"\nviewpager2 = \"1.1.0\"\n\n[libraries]\naboutlibraries-core = { module = \"com.mikepenz:aboutlibraries-core\", version.ref = \"aboutlibraries\" }\nandroidx-activity-compose = { module = \"androidx.activity:activity-compose\", version.ref = \"activityKtxVersion\" }\nandroidx-activity-ktx = { module = \"androidx.activity:activity-ktx\", version.ref = \"activityKtxVersion\" }\nandroidx-appcompat = { module = \"androidx.appcompat:appcompat\", version.ref = \"appcompat\" }\nandroidx-biometric = { module = \"androidx.biometric:biometric\", version.ref = \"biometric\" }\nandroidx-browser = { module = \"androidx.browser:browser\", version.ref = \"browserVersion\" }\nandroidx-compose-bom = { module = \"androidx.compose:compose-bom\", version.ref = \"composeBomVersion\" }\nandroidx-constraintlayout = { module = \"androidx.constraintlayout:constraintlayout\", version.ref = \"constraintlayout\" }\nandroidx-core-ktx = { module = \"androidx.core:core-ktx\", version.ref = \"coreKtx\" }\nandroidx-core-splashscreen = { module = \"androidx.core:core-splashscreen\", version.ref = \"coreSplashscreen\" }\nandroidx-datastore-preferences = { module = \"androidx.datastore:datastore-preferences\", version.ref = \"datastorePreferences\" }\nandroidx-espresso-core = { module = \"androidx.test.espresso:espresso-core\", version.ref = \"espressoCore\" }\nandroidx-fragment-ktx = { module = \"androidx.fragment:fragment-ktx\", version.ref = \"fragmentKtx\" }\nandroidx-junit = { module = \"androidx.test.ext:junit\", version.ref = \"junitVersion\" }\nandroidx-lifecycle-livedata-ktx = { module = \"androidx.lifecycle:lifecycle-livedata-ktx\", version.ref = \"lifecycleRuntimeKtx\" }\nandroidx-lifecycle-runtime-ktx = { module = \"androidx.lifecycle:lifecycle-runtime-ktx\", version.ref = \"lifecycleRuntimeKtx\" }\nandroidx-lifecycle-viewmodel-compose = { module = \"androidx.lifecycle:lifecycle-viewmodel-compose\", version.ref = \"lifecycleRuntimeKtx\" }\nandroidx-lifecycle-viewmodel-ktx = { module = \"androidx.lifecycle:lifecycle-viewmodel-ktx\", version.ref = \"lifecycleRuntimeKtx\" }\nandroidx-material3 = { module = \"androidx.compose.material3:material3\", version.ref = \"material3Version\" }\nandroidx-material3-window-sizeclass = { module = \"androidx.compose.material3:material3-window-size-class\", version.ref = \"material3Version\" }\nandroidx-recyclerview = { module = \"androidx.recyclerview:recyclerview\", version.ref = \"recyclerview\" }\nandroidx-runtime-livedata = { module = \"androidx.compose.runtime:runtime-livedata\", version.ref = \"runtimeLivedataVersion\" }\nandroidx-ui = { module = \"androidx.compose.ui:ui\", version.ref = \"uiVersion\" }\nandroidx-ui-graphics = { module = \"androidx.compose.ui:ui-graphics\", version.ref = \"uiGraphicsVersion\" }\nandroidx-ui-tooling = { module = \"androidx.compose.ui:ui-tooling\", version.ref = \"uiVersion\" }\nandroidx-ui-tooling-preview = { module = \"androidx.compose.ui:ui-tooling-preview\", version.ref = \"uiVersion\" }\nandroidx-viewpager2 = { module = \"androidx.viewpager2:viewpager2\", version.ref = \"viewpager2\" }\ncoil = { module = \"io.coil-kt.coil3:coil\", version.ref = \"coilVersion\" }\ncoil-network-okhttp = { module = \"io.coil-kt.coil3:coil-network-okhttp\", version.ref = \"coilVersion\" }\ncommons-compress = { module = \"org.apache.commons:commons-compress\", version.ref = \"commonsCompressVersion\" }\ncommons-io = { module = \"commons-io:commons-io\", version.ref = \"commonsIoVersion\" }\nfirebase-analytics = { module = \"com.google.firebase:firebase-analytics\" }\nfirebase-bom = { module = \"com.google.firebase:firebase-bom\", version.ref = \"firebaseBom\" }\nfirebase-messaging = { module = \"com.google.firebase:firebase-messaging\" }\ngithub-api = { module = \"org.kohsuke:github-api\", version.ref = \"githubApiVersion\" }\ngoogle-services = { module = \"com.google.gms:google-services\", version.ref = \"googleServices\" }\ngson = { module = \"com.google.code.gson:gson\", version.ref = \"gson\" }\njsoup = { module = \"org.jsoup:jsoup\", version.ref = \"jsoupVersion\" }\njunit = { module = \"junit:junit\", version.ref = \"junit\" }\nkona-crypto = { module = \"com.tencent.kona:kona-crypto\", version.ref = \"konaCryptoVersion\" }\nkona-provider = { module = \"com.tencent.kona:kona-provider\", version.ref = \"konaProviderVersion\" }\nkotlinx-coroutines-android = { module = \"org.jetbrains.kotlinx:kotlinx-coroutines-android\", version.ref = \"kotlinxCoroutinesAndroid\" }\nkotlinx-serialization-json = { module = \"org.jetbrains.kotlinx:kotlinx-serialization-json\", version.ref = \"kotlinxSerializationJson\" }\nlibrary = { module = \"me.zhanghai.android.fastscroll:library\", version.ref = \"library\" }\nmaterial = { module = \"com.google.android.material:material\", version.ref = \"material\" }\nmaven-artifact = { module = \"org.apache.maven:maven-artifact\", version.ref = \"mavenArtifact\" }\noapi-java-sdk = { module = \"cn.bigmodel.openapi:oapi-java-sdk\", version.ref = \"oapiJavaSdkVersion\" }\nokhttp = { module = \"com.squareup.okhttp3:okhttp\", version.ref = \"okhttp\" }\npangu = { module = \"ws.vinta:pangu\", version.ref = \"panguVersion\" }\nparis = { module = \"com.airbnb.android:paris\", version.ref = \"paris\" }\nsecrets-gradle-plugin = { module = \"com.google.android.libraries.mapsplatform.secrets-gradle-plugin:secrets-gradle-plugin\", version.ref = \"secretsGradlePlugin\" }\nandroidx-activity = { group = \"androidx.activity\", name = \"activity\", version.ref = \"activityVersion\" }\nsmali-dexlib2 = { module = \"com.android.tools.smali:smali-dexlib2\", version.ref = \"smaliDexlib2Version\" }\nandroidx-ui-test-manifest = { group = \"androidx.compose.ui\", name = \"ui-test-manifest\" }\nandroidx-ui-test-junit4 = { group = \"androidx.compose.ui\", name = \"ui-test-junit4\" }\n\n[plugins]\naboutlibraries = { id = \"com.mikepenz.aboutlibraries.plugin\", version.ref = \"aboutlibraries\" }\nandroid-application = { id = \"com.android.application\", version.ref = \"androidGradlePlugin\" }\nkotlin-android = { id = \"org.jetbrains.kotlin.android\", version.ref = \"kotlinVersion\" }\ncompose-compiler = { id = \"org.jetbrains.kotlin.plugin.compose\", version.ref = \"kotlinVersion\" }\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "#Tue Apr 09 19:38:08 CST 2024\r\ndistributionBase=GRADLE_USER_HOME\r\ndistributionPath=wrapper/dists\r\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-8.13-bin.zip\r\nzipStoreBase=GRADLE_USER_HOME\r\nzipStorePath=wrapper/dists\r\n"
  },
  {
    "path": "gradle.properties",
    "content": "# Project-wide Gradle settings.\r\n# IDE (e.g. Android Studio) users:\r\n# Gradle settings configured through the IDE *will override*\r\n# any settings specified in this file.\r\n# For more details on how to configure your build environment visit\r\n# http://www.gradle.org/docs/current/userguide/build_environment.html\r\n# Specifies the JVM arguments used for the daemon process.\r\n# The setting is particularly useful for tweaking memory settings.\r\norg.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8\r\n# When configured, Gradle will run in incubating parallel mode.\r\n# This option should only be used with decoupled projects. More details, visit\r\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\r\n# org.gradle.parallel=true\r\n# AndroidX package structure to make it clearer which packages are bundled with the\r\n# Android operating system, and which are packaged with your app's APK\r\n# https://developer.android.com/topic/libraries/support-library/androidx-rn\r\nandroid.useAndroidX=true\r\n# Kotlin code style for this project: \"official\" or \"obsolete\":\r\nkotlin.code.style=official\r\n# Enables namespacing of each library's R class so that its R class includes only the\r\n# resources declared in the library itself and none from the library's dependencies,\r\n# thereby reducing the size of the R class for that library\r\nandroid.nonTransitiveRClass=true\r\nandroid.enableR8.fullMode=true\r\n"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env sh\n\n#\n# Copyright 2015 the original author or authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS='\"-Xmx64m\" \"-Xms64m\"'\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn () {\n    echo \"$*\"\n}\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\n  NONSTOP* )\n    nonstop=true\n    ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" -a \"$nonstop\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin or MSYS, switch paths to Windows format before running java\nif [ \"$cygwin\" = \"true\" -o \"$msys\" = \"true\" ] ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=`expr $i + 1`\n    done\n    case $i in\n        0) set -- ;;\n        1) set -- \"$args0\" ;;\n        2) set -- \"$args0\" \"$args1\" ;;\n        3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Escape application args\nsave () {\n    for i do printf %s\\\\n \"$i\" | sed \"s/'/'\\\\\\\\''/g;1s/^/'/;\\$s/\\$/' \\\\\\\\/\" ; done\n    echo \" \"\n}\nAPP_ARGS=`save \"$@\"`\n\n# Collect all arguments for the java command, following the shell quoting and substitution rules\neval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS \"\\\"-Dorg.gradle.appname=$APP_BASE_NAME\\\"\" -classpath \"\\\"$CLASSPATH\\\"\" org.gradle.wrapper.GradleWrapperMain \"$APP_ARGS\"\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@rem\r\n@rem Copyright 2015 the original author or authors.\r\n@rem\r\n@rem Licensed under the Apache License, Version 2.0 (the \"License\");\r\n@rem you may not use this file except in compliance with the License.\r\n@rem You may obtain a copy of the License at\r\n@rem\r\n@rem      https://www.apache.org/licenses/LICENSE-2.0\r\n@rem\r\n@rem Unless required by applicable law or agreed to in writing, software\r\n@rem distributed under the License is distributed on an \"AS IS\" BASIS,\r\n@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n@rem See the License for the specific language governing permissions and\r\n@rem limitations under the License.\r\n@rem\r\n\r\n@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Resolve any \".\" and \"..\" in APP_HOME to make it shorter.\r\nfor %%i in (\"%APP_HOME%\") do set APP_HOME=%%~fi\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\"-Xmx64m\" \"-Xms64m\"\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif \"%ERRORLEVEL%\" == \"0\" goto execute\r\n\r\necho.\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto execute\r\n\r\necho.\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\r\n\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %*\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\r\nexit /b 1\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "settings.gradle.kts",
    "content": "pluginManagement {\r\n    repositories {\r\n        google()\r\n        mavenCentral()\r\n        gradlePluginPortal()\r\n    }\r\n}\r\ndependencyResolutionManagement {\r\n    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)\r\n    repositories {\r\n        google()\r\n        mavenCentral()\r\n    }\r\n}\r\n\r\nrootProject.name = \"QQVersionList\"\r\ninclude(\":app\")\r\n"
  }
]